{
    "componentChunkName": "component---src-components-page-template-jsx",
    "path": "/system/tools/nupbr",
    "result": {"data":{"mdx":{"id":"139fdfa0-85ee-50ed-b31b-d1f5ba3d6e27","body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"section\": \"System\",\n  \"chapter\": \"Tools\",\n  \"title\": \"NUpbr\",\n  \"description\": \"A physically-based rendering pipeline for generating realistic semi-synthetic data.\",\n  \"slug\": \"/system/tools/nupbr\",\n  \"keywords\": [\"vision\", \"data\", \"synthetic-data\", \"annotation\", \"deep-learning\", \"machine-learning\", \"learning\", \"ai\"],\n  \"authors\": [\"Matthew Amos (@MattAmos)\"]\n};\n\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\n\nvar Alert = makeShortcode(\"Alert\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(Alert, {\n    type: \"warning\",\n    mdxType: \"Alert\"\n  }, \"NUpbr currently only supports Blender 2.79. Ensure this version is installed.\"), mdx(\"h2\", {\n    \"id\": \"motivation\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#motivation\",\n    \"aria-label\": \"motivation permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Motivation\"), mdx(\"p\", null, \"As the power of state-of-the-art deep learning methods increases, so does the requirement for large, fully annotated datasets. Particularly in terms of object recognition and classification computer vision tasks, annotation of this data requires considerable time and effort when performed manually by humans.\"), mdx(\"p\", null, \"The NUpbr project aims to reduce this annotation time by allowing for synthetic generation and automatic annotation of image data via the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.blender.org/\"\n  }, \"Blender\"), \" 3D rendering engine. To ensure the data is comparable to that of realistically obtained data, \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://en.wikipedia.org/wiki/Physically_based_rendering\"\n  }, \"physically-Based Rendering (PBR)\"), \" materials are used. Additionally, \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://en.wikipedia.org/wiki/Image-based_lighting\"\n  }, \"Image-Based Lighting (IBL)\"), \" is used with High-Dynamic Range (HDR) environment maps to provide semi-synthetic image support.\"), mdx(\"p\", null, \"The tool is capable of outputting raw RGB images taken from random points of view within the scene, as well as generating the corresponding segmentation image, depth map, and various metadata for the current scene.\"), mdx(\"h2\", {\n    \"id\": \"how-it-works\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#how-it-works\",\n    \"aria-label\": \"how it works permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"How it Works\"), mdx(\"p\", null, \"NUpbr constructs a soccer field scene with user-specified dimensions. By default, this includes two goals, a soccer ball and multiple NUgus robots.\"), mdx(\"details\", null, mdx(\"summary\", null, \"Environment\"), mdx(\"p\", null, \"The environment map defines how the IBL will light the scene, as well as the background\\nfor the RGB image. NUpbr will recursively perform regular expression searches to find three files per environment map:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Item\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Regex Search\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Example\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Raw HDR map\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \".*raw.*\\\\.hdr\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"001_raw.hdr\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"HDR RGB pixel image filename\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Segmentation mask\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \".*mask.*\\\\.png\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"001_mask.png\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Semantic segmentation mask of the HDR image\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Metadata file\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \".*json\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"001.json\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Metadata file for the HDR image\")))), mdx(\"p\", null, \"The \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"raw HDR map\"), \" will contain the RGB image as typically perceived. The HDR format is ideal for this image, as it allows for changing of exposure within Blender.\"), mdx(\"p\", null, \"The \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"segmentation mask\"), \" will define the desired class of each pixel within the HDR map. Colour is used to distinguish between the classes, as shown in the examples within this page.\"), mdx(\"p\", null, \"The \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"metadata file\"), \" contains positional and rotational camera parameters for when the image was taken, as well as configuration for which objects to render, including if balls, goals or the synthetic field are draw during rendering. Additionally, manual limits for where the ball can be placed in the scene can be specified in metres.\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"The configurable properties for the environment can be found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \"\\nwithin \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[\\\"environment\\\"]\"), \".\"))), mdx(\"details\", null, mdx(\"summary\", null, \"Balls\"), mdx(\"p\", null, \"The ball is either constructed using a preconstructed model (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".fbx\"), \") with corresponding\\ncolour and/or normal maps, or via a UV colour map for the ball. Again, a recursive regex search is applied to populate the ball resources:\"), mdx(\"h3\", {\n    \"id\": \"uv-map\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#uv-map\",\n    \"aria-label\": \"uv map permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"UV Map\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Item\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Regex Search\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Example\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"UV Image\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \".*colou?rs?.*\\\\.jpg\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"001_colour.jpg\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"RGB image of the UV map for the ball\")))), mdx(\"h3\", {\n    \"id\": \"fbx-file\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#fbx-file\",\n    \"aria-label\": \"fbx file permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"FBX File\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Item\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Regex Search\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Example\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Colour map\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \".*colou?rs?.*\\\\.jpg\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"001_colour.png\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"RGB pixel image filename for the colour map which can be applied to the FBX\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Normal map\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \".*norm(?:al)?s?.*\\\\.png\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"001_norm.png\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Normal map of the FBX\")))), mdx(\"p\", null, \"The normal and colour maps are then applied to the ball using a material controlled by a \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html\"\n  }, \"PBR node\"), \".\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"The configurable properties for the ball can be found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \"\\nwithin \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[\\\"ball\\\"]\"), \".\"))), mdx(\"details\", null, mdx(\"summary\", null, \"Field\"), mdx(\"p\", null, \"When the user specifies that the field is to be synthetically generated, a hair particle system is used to create grass on the field.\"), mdx(\"h3\", {\n    \"id\": \"colouring-the-field\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#colouring-the-field\",\n    \"aria-label\": \"colouring the field permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Colouring the Field\"), mdx(\"p\", null, \"A UV map of the field lines is generated based on the specified field dimensions in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"cfg[\\\"field\\\"]\"), \", which is then mixed with the grass colour to create field lines within the synthetic grass.\\nA \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html\"\n  }, \"PBR node\"), \" is used for the grass, using the grass and field line colouring for the base colour of the field.\"), mdx(\"h3\", {\n    \"id\": \"segmenting-the-field\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#segmenting-the-field\",\n    \"aria-label\": \"segmenting the field permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Segmenting the Field\"), mdx(\"p\", null, \"The segmentation of the field is performed using \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.blender.org/manual/en/latest/compositing/introduction.html\"\n  }, \"scene composites\"), \", where the UV map projection on the field (in the camera viewpoint) is recoloured based on the desired segmentation mask colour of the field lines. This scene composite is then applied over the segmentation mask from the field, to ensure that the field lines appear over the top of the field.\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"The configurable properties for the field can be found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \"\\nwithin \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[\\\"field\\\"]\"), \".\"))), mdx(\"details\", null, mdx(\"summary\", null, \"Goals\"), mdx(\"p\", null, \"The goals are constructed based on the desired goal dimensions in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"cfg[\\\"goal\\\"]\"), \". These goals can either be generated as rectangular or rounded, as defined in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \", in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"cfg[\\\"goal\\\"][\\\"shape\\\"]\"), \".\"), mdx(\"p\", null, \"Using a \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html\"\n  }, \"PBR node\"), \", the goals are given a colour, metallicity and roughness as specified in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"blend_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"goal\"), \".\"), mdx(\"p\", null, \"The segmentation colouring for the goals are \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"only applied to the front quad\"), \" (goal posts and crossbar).\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"The configurable properties for the\\ngoals can be found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[\\\"goal\\\"]\"), \".\"))), mdx(\"details\", null, mdx(\"summary\", null, \"Robots\"), mdx(Alert, {\n    type: \"warning\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"Robots within NUpbr are still a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"work in progress\"), \". Currently only a\\nspecific implementation of the NUgus robot is supported, and is likely subject to change in the future.\")), mdx(\"h3\", {\n    \"id\": \"configuration\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#configuration\",\n    \"aria-label\": \"configuration permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Configuration\"), mdx(\"p\", null, \"Configuration for the NUgus robot can be found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[\\\"robot\\\"]\"), \". This configuration is composed of four parameters:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Parameter\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Example\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"mesh_path\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"./robot/NUgus.fbx\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Path to the file which holds the NUgus FBX file\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"texture_path\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"./robot/textures/\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Path to the directory which holds the NUgus robot's materials and texture maps\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"kinematics_path\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"./robot/NUgus.json\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Path to the file which holds kinematics limits and part names to assemble robot\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"kinematics_variance\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"0.5\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Floating point value for the maximum variation from the neutral pose of each robot part\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"texture_path\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"./robot/textures/\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Path to colour and normal maps for each robot part\")))), mdx(\"p\", null, \"Additionally, the number of robots generated within the scene can be configured with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"num_robots\"), \".\"), mdx(\"h3\", {\n    \"id\": \"kinematics\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#kinematics\",\n    \"aria-label\": \"kinematics permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Kinematics\"), mdx(\"p\", null, \"The kinematics of the robot are read from the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kinematics_path\"), \", and the individual FBX files for each part are assembled as per the read kinematics configuration. Robot parts will randomly be placed according to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kinematics_variance\"), \", where \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kinematics_variance = 0.0\"), \" will place robots in their neutral pose, and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kinematics_variance = 1.0\"), \" will allow for random placement up to the kinematic limits of the robot.\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"The configurable properties for robots can be found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[\\\"robot\\\"]\"), \".\"))), mdx(\"h3\", {\n    \"id\": \"segmentation\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#segmentation\",\n    \"aria-label\": \"segmentation permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Segmentation\"), mdx(\"p\", null, \"The segmentation colouring for the field is specified through \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \" within \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[object][\\\"mask\\\"]\"), \". By default the scene segmentation is configured as:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Class\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Colour\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"unclassified\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Environment or unclassified areas\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"div\", {\n    style: {\n      \"border\": \"1px solid grey\",\n      \"backgroundColor\": \"rgba(0, 0, 0, 0.9)\",\n      \"width\": \"200px\",\n      \"height\": \"20px\"\n    }\n  }))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"balls\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Balls\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"div\", {\n    style: {\n      \"border\": \"1px solid grey\",\n      \"backgroundColor\": \"rgba(255, 0, 0, 0.9)\",\n      \"width\": \"200px\",\n      \"height\": \"20px\"\n    }\n  }))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"field\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Grass and/or field area\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"div\", {\n    style: {\n      \"border\": \"1px solid grey\",\n      \"backgroundColor\": \"rgba(0, 255, 0, 0.9)\",\n      \"width\": \"200px\",\n      \"height\": \"20px\"\n    }\n  }))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"field lines\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Field lines\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"div\", {\n    style: {\n      \"border\": \"1px solid grey\",\n      \"backgroundColor\": \"rgba(255, 255, 255, 0.9)\",\n      \"width\": \"200px\",\n      \"height\": \"20px\"\n    }\n  }))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"robot\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"General robots\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"div\", {\n    style: {\n      \"border\": \"1px solid grey\",\n      \"backgroundColor\": \"rgba(0, 0, 255, 0.9)\",\n      \"width\": \"200px\",\n      \"height\": \"20px\"\n    }\n  }))))), mdx(\"p\", null, \"However, these colours can be configured as per user requirements in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"scene_config.py\"), \", under \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"resources[<class>][\\\"mask\\\"]\"), \".\"), mdx(\"h2\", {\n    \"id\": \"examples\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#examples\",\n    \"aria-label\": \"examples permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Examples\"), mdx(\"img\", {\n    \"src\": \"/opt/build/repo/src/book/02-system/03-tools/images/ball_L.png\",\n    \"alt\": \"RGB, segmentation and depth images for a generated ball on a synthetic field\",\n    \"title\": \"RGB, segmentation and depth images for a generated ball on a synthetic field\"\n  }), mdx(\"img\", {\n    \"src\": \"/opt/build/repo/src/book/02-system/03-tools/images/robot_outside.png\",\n    \"alt\": \"RGB, segmentation and depth images with a generated robot\",\n    \"title\": \"RGB, segmentation and depth images with a generated robot\"\n  }), mdx(\"h2\", {\n    \"id\": \"usage\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#usage\",\n    \"aria-label\": \"usage permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Usage\"), mdx(\"p\", null, \"The NUpbr repository can be found \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/NUbots/NUpbr\"\n  }, \"within the NUbots organisation\"), \". To run the data generation script, ensure \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.blender.org/download/previous-versions/\"\n  }, \"Blender 2.79\"), \" is installed. Ensure that the configuration properties are established as desired, as found in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"pbr/config/output_config.py\"), \"\\nThis includes:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Config Parameter\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Example Value\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"num_images\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"int\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"10\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Number of generated image sets (where a raw image, segmentation mask and depth image will be generated for each camera)\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"output_stereo\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"bool\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"True\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Determines if stereo images will be generated, separated by \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"0.5 * camera[\\\"stereo_camera_distance\\\"]\"), \" (configured in \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"pbr/scene_config.py\"), \")\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"output_depth\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"bool\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"True\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Determines if depth images will be generated.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"output_base\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"str\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"./run_{}\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Defines the output directory format string to allow for new output directory creation on regeneration.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"filename_len\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"int\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"10\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Length of the output file, e.g. for \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"filename_len = 10\"), \", the first raw image generated will be saved as \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"0000000000.jpg\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"image_dirname\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"str\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"raw\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Directory name in which raw images are saved. e.g. \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"./run_0/raw\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"mask_dirname\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"str\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"seg\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Directory name in which segmentation are saved. e.g. \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"./run_0/seg\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"depth_dirname\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"str\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"depth\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Directory name in which depth images are saved. e.g. \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"./run_0/depth\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"meta_dirname\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"str\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"\\\"meta\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Directory name in which the metadata for each image set is saved. e.g. \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"./run_0/meta\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"max_depth\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"float\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"20\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Maximum depth for the normalised depth map (in metres).\")))), mdx(\"p\", null, \"Once the parameters are set, NUpbr can be run using\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"# Show Blender GUI\\nblender --python pbr.py\\n\\n# Headless\\nblender --python pbr.py -b\\n\")), mdx(\"h2\", {\n    \"id\": \"status\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#status\",\n    \"aria-label\": \"status permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Status\"), mdx(\"h2\", {\n    \"id\": \"ongoing-work\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#ongoing-work\",\n    \"aria-label\": \"ongoing work permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Ongoing Work\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Rigging of robot models to generate realistic poses\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Replacement of hair particle system with grass cards to reduce performance overhead\")), mdx(\"h2\", {\n    \"id\": \"future-work\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#future-work\",\n    \"aria-label\": \"future work permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Future Work\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Porting to Blender 2.8\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Porting field UV map generation to OpenCV\")));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#motivation","title":"Motivation"},{"url":"#how-it-works","title":"How it Works","items":[{"url":"#uv-map","title":"UV Map"},{"url":"#fbx-file","title":"FBX File"},{"url":"#colouring-the-field","title":"Colouring the Field"},{"url":"#segmenting-the-field","title":"Segmenting the Field"},{"url":"#configuration","title":"Configuration"},{"url":"#kinematics","title":"Kinematics"},{"url":"#segmentation","title":"Segmentation"}]},{"url":"#examples","title":"Examples"},{"url":"#usage","title":"Usage"},{"url":"#status","title":"Status"},{"url":"#ongoing-work","title":"Ongoing Work"},{"url":"#future-work","title":"Future Work"}]},"frontmatter":{"section":"System","chapter":"Tools","title":"NUpbr","description":"A physically-based rendering pipeline for generating realistic semi-synthetic data.","keywords":["vision","data","synthetic-data","annotation","deep-learning","machine-learning","learning","ai"],"slug":"/system/tools/nupbr","hidden":null},"childNUbookContributions":{"authors":[{"name":"Matthew Amos","username":"MattAmos"}],"lastCommit":{"date":"2022-09-03T22:21:19.000Z","hash":"d3470bc25a36e863a96f4b89f4e4a3b373cf574b"}}}},"pageContext":{"mdxPath":"src/book/02-system/03-tools/03-nupbr.mdx","id":"139fdfa0-85ee-50ed-b31b-d1f5ba3d6e27","next":{"chapter":"Tools","title":"NUgan","description":"A CycleGAN implementation for dataset generation.","slug":"/system/tools/nugan","hidden":null},"previous":{"chapter":"Tools","title":"NUbook","description":"The NUbots team handbook and documentation.","slug":"/system/tools/nubook","hidden":null},"menu":[{"title":"Team","slug":"/team/introduction","chapters":[{"title":"Introduction","slug":"/team/introduction","pages":[{"title":"Introduction to NUbots","slug":"/team/introduction","hidden":null},{"title":"Areas of Research","slug":"/team/areas-of-research","hidden":null},{"title":"Current Team","slug":"/team/current-members","hidden":null}],"hidden":false},{"title":"Joining the Team","slug":"/team/how-we-work","pages":[{"title":"How We Work","slug":"/team/how-we-work","hidden":null},{"title":"How to Join NUbots","slug":"/team/how-to-join","hidden":null},{"title":"Lab Induction","slug":"/team/induction","hidden":null}],"hidden":false},{"title":"Community","slug":"/team/sponsors","pages":[{"title":"Sponsors","slug":"/team/sponsors","hidden":null},{"title":"Connect","slug":"/team/connect","hidden":null}],"hidden":false},{"title":"History","slug":"/team/history","pages":[{"title":"Team History","slug":"/team/history","hidden":null},{"title":"Past Members","slug":"/team/past-members","hidden":null},{"title":"Publications","slug":"/team/publications","hidden":null}],"hidden":false},{"title":"RoboCup","slug":"/team/robocup","pages":[{"title":"RoboCup","slug":"/team/robocup","hidden":null},{"title":"Resources","slug":"/team/robocup/resources","hidden":null},{"title":"Debriefs","slug":"/team/robocup/debriefs","hidden":null}],"hidden":false}],"hidden":false},{"title":"System","slug":"/system/foundations/overview","chapters":[{"title":"Foundations","slug":"/system/foundations/overview","pages":[{"title":"Overview","slug":"/system/foundations/overview","hidden":null},{"title":"Build System","slug":"/system/foundations/build-system","hidden":null},{"title":"Continuous Integration","slug":"/system/foundations/ci-system","hidden":null},{"title":"NUClear","slug":"/system/foundations/nuclear","hidden":null},{"title":"Mathematics","slug":"/system/foundations/mathematics","hidden":null},{"title":"Configuration and Script System","slug":"/system/foundations/config-script","hidden":null},{"title":"Director","slug":"/system/foundations/director","hidden":null}],"hidden":false},{"title":"Subsystems","slug":"/system/subsystems/input","pages":[{"title":"Input","slug":"/system/subsystems/input","hidden":null},{"title":"Odometry","slug":"/system/subsystems/odometry","hidden":null},{"title":"Localisation","slug":"/system/subsystems/localisation","hidden":null},{"title":"Motion","slug":"/system/subsystems/motion","hidden":null},{"title":"Vision","slug":"/system/subsystems/vision","hidden":null},{"title":"Behaviour","slug":"/system/subsystems/behaviour","hidden":null},{"title":"Logging","slug":"/system/subsystems/logging","hidden":null}],"hidden":false},{"title":"Tools","slug":"/system/tools/nusight","pages":[{"title":"NUsight","slug":"/system/tools/nusight","hidden":null},{"title":"NUbook","slug":"/system/tools/nubook","hidden":null},{"title":"NUpbr","slug":"/system/tools/nupbr","hidden":null},{"title":"NUgan","slug":"/system/tools/nugan","hidden":null},{"title":"System Configuration","slug":"/system/tools/system_configuration","hidden":null},{"title":"NatNet SDK","slug":"/system/tools/natnet_sdk","hidden":null}],"hidden":false},{"title":"Hardware","slug":"/system/hardware/overview","pages":[{"title":"Overview and Specifications","slug":"/system/hardware/overview","hidden":null}],"hidden":false},{"title":"Modules","slug":"/system/modules/actuation/","pages":[{"title":"Actuation","slug":"/system/modules/actuation/","hidden":null},{"title":"Extension","slug":"/system/modules/extension/","hidden":null},{"title":"Input","slug":"/system/modules/input/","hidden":null},{"title":"Localisation","slug":"/system/modules/localisation/","hidden":null},{"title":"Nbs","slug":"/system/modules/nbs/","hidden":null},{"title":"Network","slug":"/system/modules/network/","hidden":null},{"title":"Output","slug":"/system/modules/output/","hidden":null},{"title":"Planning","slug":"/system/modules/planning/","hidden":null},{"title":"Platform","slug":"/system/modules/platform/","hidden":null},{"title":"Purpose","slug":"/system/modules/purpose/","hidden":null},{"title":"Skill","slug":"/system/modules/skill/","hidden":null},{"title":"Strategy","slug":"/system/modules/strategy/","hidden":null},{"title":"Support","slug":"/system/modules/support/","hidden":null},{"title":"Tools","slug":"/system/modules/tools/","hidden":null},{"title":"Vision","slug":"/system/modules/vision/","hidden":null}],"hidden":false}],"hidden":false},{"title":"Guides","slug":"/guides/main/getting-started","chapters":[{"title":"Main Codebase","slug":"/guides/main/getting-started","pages":[{"title":"Getting Started","slug":"/guides/main/getting-started","hidden":null},{"title":"NUClear","slug":"/guides/main/nuclear-tutorial","hidden":null},{"title":"Running and Tuning Scripts","slug":"/guides/main/tuning-and-running-scripts","hidden":null},{"title":"Maintaining Subsystems","slug":"/guides/main/maintaining-subsystems","hidden":null},{"title":"Data Recording and Playback","slug":"/guides/main/data-recording-playback","hidden":null},{"title":"Camera Calibration","slug":"/guides/main/camera-calibration","hidden":null},{"title":"Onboarding Workshop","slug":"/guides/main/onboarding","hidden":null}],"hidden":false},{"title":"Tools","slug":"/guides/tools/nusight-contribution","pages":[{"title":"Contributing to NUsight","slug":"/guides/tools/nusight-contribution","hidden":null},{"title":"Setting Up Webots","slug":"/guides/tools/webots-setup","hidden":null},{"title":"Visual Mesh Getting Started","slug":"/guides/tools/visualmesh","hidden":null},{"title":"Using NUpbr","slug":"/guides/tools/nupbr-guide","hidden":null},{"title":"GameController Setup","slug":"/guides/tools/gamecontroller","hidden":null}],"hidden":false},{"title":"Hardware","slug":"/guides/hardware/working-with-robots","pages":[{"title":"Working with Robots","slug":"/guides/hardware/working-with-robots","hidden":null},{"title":"Flashing a Robot","slug":"/guides/hardware/flashing","hidden":null},{"title":"Servo Setup and Calibration","slug":"/guides/hardware/servo-calibration","hidden":null},{"title":"Batteries","slug":"/guides/hardware/batteries","hidden":null},{"title":"DARwIn Op2 Robot Restoration and Calibration Guide","slug":"/guides/hardware/darwin-op2-guide","hidden":null}],"hidden":false},{"title":"General","slug":"/guides/general/learning-resources","pages":[{"title":"Learning Resources","slug":"/guides/general/learning-resources","hidden":null},{"title":"Contribution Workflow","slug":"/guides/general/contribute","hidden":null},{"title":"RoboCup Setup","slug":"/guides/general/robocup-setup","hidden":null},{"title":"Troubleshooting","slug":"/guides/general/troubleshooting","hidden":null},{"title":"Code Conventions","slug":"/guides/general/code-conventions","hidden":null},{"title":"Glossary","slug":"/guides/general/glossary","hidden":null}],"hidden":false}],"hidden":false},{"title":"Kitchen Sink","slug":"/kitchen-sink/headers","chapters":[{"title":"Markdown","slug":"/kitchen-sink/headers","pages":[{"title":"Headers","slug":"/kitchen-sink/headers","hidden":true},{"title":"Formatting and Paragraphs","slug":"/kitchen-sink/formatting-and-paragraphs","hidden":true},{"title":"Blockquotes","slug":"/kitchen-sink/blockquotes","hidden":true},{"title":"Alerts","slug":"/kitchen-sink/alerts","hidden":true},{"title":"Images","slug":"/kitchen-sink/images","hidden":true},{"title":"Lists","slug":"/kitchen-sink/lists","hidden":true},{"title":"Code","slug":"/kitchen-sink/code","hidden":true},{"title":"Math","slug":"/kitchen-sink/math","hidden":true},{"title":"Table of Contents","slug":"/kitchen-sink/table-of-contents","hidden":true},{"title":"Tables","slug":"/kitchen-sink/tables","hidden":true},{"title":"Collapsible Content","slug":"/kitchen-sink/collapsible","hidden":true},{"title":"GraphViz Diagrams","slug":"/kitchen-sink/graphviz-diagrams","hidden":true},{"title":"Referencing","slug":"/kitchen-sink/referencing","hidden":true}],"hidden":true}],"hidden":true}],"references":null,"hidden":null}},
    "staticQueryHashes": ["3715292327","445096115","466146812"]}