{
    "componentChunkName": "component---src-components-page-template-jsx",
    "path": "/system/foundations/overview",
    "result": {"data":{"mdx":{"id":"83f5faa0-a718-52f8-a126-e2cd1d807883","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\": \"Foundations\",\n  \"title\": \"Overview\",\n  \"description\": \"Introduction to the NUbots codebase and high-level architecture.\",\n  \"slug\": \"/system/foundations/overview\",\n  \"authors\": [\"Ysobel Sims (@ysims)\", \"Cameron Murtagh (@CMurtagh-LGTM)\", \"Thomas O'Brien (@Tom0Brien)\"]\n};\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(\"p\", null, \"The NUbots repository is the main codebase that runs on the robots. Its purpose is to control the robot during RoboCup matches. The NUbots codebase, along with all other NUbots code, is open source and can be \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/NUbots/NUbots/\"\n  }, \"found on GitHub\"), \". The primary language in the NUbots codebase is C++.\"), mdx(\"p\", null, \"The main parts of the NUbots codebase are behaviour, motion, vision, and localisation. Behaviours include strategy, planning and skills. Motion includes kicking, getting up, and walking. Vision includes ball, goal and field detectors. Localisation determines where the robot, ball and the field are in the world through odometry.\"), mdx(\"p\", null, \"At the top level, the robot will use strategy to decide what to do based on the game state. This includes unique behaviour for penalty shoot-outs.\"), mdx(\"p\", null, \"The next level down is planning. This includes planning the path to walk along to get to the ball facing the right goal.\\nBelow planning is skills. Skills include kicking, walking, getting up, and looking at objects.\"), mdx(\"p\", null, \"Next is motions. Motions include how the robot moves its feet to walk, and what movements it does to kick or get up.\"), mdx(\"p\", null, \"After motions is hardware input and output. The hardware will output the commands and input the information from the world. This will then go through a sensor filter so that the robot can interpret the information. This information then influences strategy.\"), mdx(\"p\", null, \"All these modules are connected using NUClear, a message passing software architecture. More can be found on NUClear \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://nuclear.readthedocs.io/en/latest/\"\n  }, \"here\"), \".\"), mdx(\"figure\", {\n    \"className\": \"remark-graphviz-figure\"\n  }, mdx(\"div\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-graph\"\n  }, mdx(\"svg\", {\n    parentName: \"div\",\n    \"role\": \"img\",\n    \"aria-label\": \"SVG diagram of a graph generated from DOT notation: digraph {\\r    \\\"Strategy\\\" -> \\\"Planning\\\" -> \\\"Skills\\\" -> \\\"Motions\\\" -> \\\"Hardware IO\\\" -> \\\"Strategy\\\"\\r}\",\n    \"width\": \"152pt\",\n    \"height\": \"332pt\",\n    \"viewBox\": \"0 0 152.07 332\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }, mdx(\"title\", {\n    parentName: \"svg\"\n  }, \"SVG diagram of a graph generated from DOT notation\"), mdx(\"desc\", {\n    parentName: \"svg\"\n  }, \"digraph {\\n    \\\"Strategy\\\" -> \\\"Planning\\\" -> \\\"Skills\\\" -> \\\"Motions\\\" -> \\\"Hardware IO\\\" -> \\\"Strategy\\\"\\n}\"), mdx(\"g\", {\n    parentName: \"svg\",\n    \"className\": \"graph\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"#fff\",\n    \"stroke\": \"transparent\",\n    \"d\": \"M0 332V0h152.07v332H0z\"\n  }), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"81.37\",\n    \"cy\": \"-306\",\n    \"rx\": \"43.44\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"81.37\",\n    \"y\": \"-301.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Strategy\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"45.37\",\n    \"cy\": \"-234\",\n    \"rx\": \"45.25\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"45.37\",\n    \"y\": \"-229.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Planning\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M72.66-288.05c-4.2 8.16-9.33 18.14-14.01 27.23\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M61.69-259.08l-7.68 7.29 1.46-10.49 6.22 3.2z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"46.37\",\n    \"cy\": \"-162\",\n    \"rx\": \"33.08\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"46.37\",\n    \"y\": \"-157.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Skills\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M45.62-215.7c.11 7.72.24 16.99.37 25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M49.49-190.15l-3.36 10.05-3.64-9.95 7-.1z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"47.37\",\n    \"cy\": \"-90\",\n    \"rx\": \"43.46\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"47.37\",\n    \"y\": \"-85.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Motions\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M46.62-143.7c.11 7.72.24 16.99.37 25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M50.49-118.15l-3.36 10.05-3.64-9.95 7-.1z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"82.37\",\n    \"cy\": \"-18\",\n    \"rx\": \"61.9\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"82.37\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Hardware IO\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M55.85-72.05c4.02 8.04 8.92 17.85 13.41 26.82\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M72.39-46.78l1.35 10.5-7.61-7.37 6.26-3.13z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 328)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M89.44-36.33c3.77-10.2 8.02-23.45 9.93-35.67 12.37-79.04 13.04-101.07 0-180-1.46-8.86-4.21-18.23-7.13-26.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M88.87-277.59l-.2-10.59 6.76 8.15-6.56 2.44z\"\n  }))))), mdx(\"figcaption\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-figcaption\"\n  }, \"An overview of the system\")), mdx(\"h2\", {\n    \"id\": \"roles\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#roles\",\n    \"aria-label\": \"roles 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  }))), \"Roles\"), mdx(\"p\", null, \"The robot codebase contains roles, which are recipes for creating a binary to run on a robot. A role file lists all the modules to be used in that binary. Only modules included in the role file will run, provided the code is \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/system/foundations/nuclear#nuclear-dsl\"\n  }, \"triggered\"), \". All roles can be found in the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/NUbots/NUbots/tree/main/roles\"\n  }, \"roles folder\"), \" in the first level of the repository and have the extension \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".role\"), \". For specifics about the NUClear roles system, see the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/system/foundations/nuclear#nuclear-roles\"\n  }, \"NUClear page\"), \".\"), mdx(\"p\", null, \"When adding modules to the list in a role, use the syntax \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"path::to::module\"), \". For example, if you want to include the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/NUbots/NUbots/tree/main/module/support/logging/DataLogging\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"DataLogging\"), \" module\"), \", check the path to that module relative to the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"module\"), \" folder. The path is \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"support/logging/DataLogging\"), \", so we include the line \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"support::logging::DataLogging\"), \".\"), mdx(\"p\", null, \"The following is a table of roles that exist in the NUbots codebase and possible use cases for them.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Role Name\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Usage\"))), 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  }, \"fake/keyboardwalk\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test parts of the code without a real robot. Demonstrate basic functionality of the robot. Part of the \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/guides/main/getting-started\"\n  }, \"Getting Started\"), \" example since it does not require a real robot.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"fake/visualmesh\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test the vision system, such as detection of balls and goals, in a simulated environment.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"firmwareinstaller\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Install subcontroller firmware to the robot.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"keyboardwalk\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Demonstrate the robot manually with a keyboard, particularly in a setting without a field.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"natnet\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get motion capture data from a \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://optitrack.com/software/motive/\"\n  }, \"Motive\"), \" motion capture system.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"playback\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Play back data to view in NUsight without triggering any other processes in the system.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"ps3walk\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Demonstrate the robot manually with a PS3 controller, particularly in a setting without a field.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"robocup\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Play RoboCup games on the real robot.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"scriptrunner\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Run scripts such as the \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"Stand.yaml\"), \" script, which is useful to run before doing anything with the robot.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"scripttuner\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tune/modify/create \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/system/subsystems/motion#script-engine\"\n  }, \"scripts\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"systemconfiguration\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Ensures the robot is set up with required packages, networking and more.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/behaviour\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test individual behaviours in isolation.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/camera\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test if the cameras are working and \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/guides/main/camera-calibration\"\n  }, \"calibrate the cameras\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/director\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tests the Director system.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/gamecontroller\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test the connection between the robot and \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/RoboCup-Humanoid-TC/GameController\"\n  }, \"GameController\"), \".\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/localisation\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test localisation using an interface similar to keyboard walk.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/nusight\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test the connection with NUsight. This role only sends dummy chart data through the NUsightHarness module.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/plotjuggler\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test the connection with PlotJuggler.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/sensor\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test odometry (needs NUsight). Test the subcontroller and servo data without the robot moving.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/visualmesh\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test the vision system on a real robot.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"webots/behaviour\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test behaviours in isolation within Webots.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"webots/keyboardwalk\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test motions in Webots with manual control.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"test/localisation\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test localisation using an interface similar to keyboard walk within Webots.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"webots/robocup\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Play RoboCup games in the Webots simulator.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"webots/scripttuner\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tune/modify/create \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/system/subsystems/motion#script-engine\"\n  }, \"scripts\"), \" in the Webots simulator.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"webots/webots\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Test the connection between the robot code and Webots.\")))), mdx(\"p\", null, \"In a role, you should have only one platform. Possible platforms are \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"platform::${SUBCONTROLLER}::HardwareIO\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"platform::HardwareSimulator\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"platform::Webots\"), \".\"), mdx(\"p\", null, \"Any code should run with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"platform::HardwareSimulator\"), \", but this is a very basic simulated robot and does not consider gravity - this may be useful if you want to see a motion run on the robot without the robot falling down, or if you want to test if the code runs without setting up the real robot or a simulator.\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"platform::${SUBCONTROLLER}::HardwareIO\"), \" is used for the real robot. You will get a runtime error if you do not run this on a robot, as it will be unable to find the hardware needed.\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"platform::Webots\"), \" is used with the Webots simulator. The code will only run if an \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/guides/tools/webots-setup\"\n  }, \"appropriate Webots controller is running\"), \".\"), mdx(\"h2\", {\n    \"id\": \"system-diagram\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#system-diagram\",\n    \"aria-label\": \"system diagram 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  }))), \"System Diagram\"), mdx(\"p\", null, \"This is a general system diagram for the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"robocup\"), \" role. \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Hardware Input\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Camera\"), \" can be replaced with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Webots\"), \" when considering the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"webots/robocup\"), \" role. These roles are used in the main RoboCup competition and the Virtual Season competition. Transitive edges have been removed to make the graph easier to view.\"), mdx(\"figure\", {\n    \"className\": \"remark-graphviz-figure\"\n  }, mdx(\"div\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-graph\"\n  }, mdx(\"svg\", {\n    parentName: \"div\",\n    \"role\": \"img\",\n    \"aria-label\": \"SVG diagram of a graph generated from DOT notation: digraph {\\r\\r  {\\\"Servo State\\\", \\\"IMU State\\\"} -> \\\"Hardware Input\\\" -> \\\"Forward Kinematics\\\" -> \\\"Odometry\\\" -> \\\"Visual Mesh\\\"\\r  \\\"Camera\\\" -> \\\"Visual Mesh\\\" -> \\\"Green Horizon\\\" -> {\\\"Ball Detector\\\", \\\"Field Line Detector\\\"}\\r  \\\"Field Line Detector\\\" -> \\\"Field Localisation\\\" -> \\\"Strategy\\\"\\r  \\\"Ball Detector\\\" -> \\\"Ball Localisation\\\" -> \\\"Strategy\\\"\\r  \\\"Game Controller\\\" -> \\\"Purpose\\\"\\r\\r  subgraph cluster_director {\\r    label=\\\"Director\\\"\\r    \\\"Purpose\\\" -> \\\"Strategy\\\" -> \\\"Planning\\\" -> \\\"Skill\\\" -> \\\"Actuation\\\"\\r  }\\r\\r  \\\"Actuation\\\" -> \\\"Servo Command\\\" -> \\\"Hardware Output\\\"\\r\\r}\",\n    \"width\": \"520pt\",\n    \"height\": \"985pt\",\n    \"viewBox\": \"0 0 520.49 984.8\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }, mdx(\"title\", {\n    parentName: \"svg\"\n  }, \"SVG diagram of a graph generated from DOT notation\"), mdx(\"desc\", {\n    parentName: \"svg\"\n  }, \"digraph {\\n\\n  {\\\"Servo State\\\", \\\"IMU State\\\"} -> \\\"Hardware Input\\\" -> \\\"Forward Kinematics\\\" -> \\\"Odometry\\\" -> \\\"Visual Mesh\\\"\\n  \\\"Camera\\\" -> \\\"Visual Mesh\\\" -> \\\"Green Horizon\\\" -> {\\\"Ball Detector\\\", \\\"Field Line Detector\\\"}\\n  \\\"Field Line Detector\\\" -> \\\"Field Localisation\\\" -> \\\"Strategy\\\"\\n  \\\"Ball Detector\\\" -> \\\"Ball Localisation\\\" -> \\\"Strategy\\\"\\n  \\\"Game Controller\\\" -> \\\"Purpose\\\"\\n\\n  subgraph cluster_director {\\n    label=\\\"Director\\\"\\n    \\\"Purpose\\\" -> \\\"Strategy\\\" -> \\\"Planning\\\" -> \\\"Skill\\\" -> \\\"Actuation\\\"\\n  }\\n\\n  \\\"Actuation\\\" -> \\\"Servo Command\\\" -> \\\"Hardware Output\\\"\\n\\n}\"), mdx(\"g\", {\n    parentName: \"svg\",\n    \"className\": \"graph\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"#fff\",\n    \"stroke\": \"transparent\",\n    \"d\": \"M0 984.8V0h520.49v984.8H0z\"\n  }), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M353.29-136v-364.8h114V-136h-114z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"410.29\",\n    \"y\": \"-484.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Director\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"55.29\",\n    \"cy\": \"-958.8\",\n    \"rx\": \"55.07\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"55.29\",\n    \"y\": \"-954.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Servo State\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"117.29\",\n    \"cy\": \"-886.8\",\n    \"rx\": \"71.79\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"117.29\",\n    \"y\": \"-882.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Hardware Input\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M69.98-941.21c7.61 8.59 17.05 19.25 25.49 28.78\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M98.26-914.56l4.01 9.8-9.25-5.16 5.24-4.64z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"180.29\",\n    \"cy\": \"-958.8\",\n    \"rx\": \"51.56\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"180.29\",\n    \"y\": \"-954.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"IMU State\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M165.36-941.21c-7.74 8.59-17.33 19.25-25.91 28.78\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M141.84-909.85l-9.29 5.09 4.09-9.77 5.2 4.68z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"117.29\",\n    \"cy\": \"-814.8\",\n    \"rx\": \"90.28\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"117.29\",\n    \"y\": \"-810.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Forward Kinematics\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M117.29-868.5v25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M120.79-842.9l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"117.29\",\n    \"cy\": \"-742.8\",\n    \"rx\": \"50.38\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"117.29\",\n    \"y\": \"-738.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Odometry\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M117.29-796.5v25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M120.79-770.9l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"171.29\",\n    \"cy\": \"-670.8\",\n    \"rx\": \"60.23\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"171.29\",\n    \"y\": \"-666.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Visual Mesh\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M130.08-725.21c6.57 8.5 14.69 19.04 21.99 28.5\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M154.87-698.81l3.34 10.05-8.88-5.78 5.54-4.27z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"171.29\",\n    \"cy\": \"-598.8\",\n    \"rx\": \"68.86\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"171.29\",\n    \"y\": \"-594.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Green Horizon\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M171.29-652.5v25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M174.79-626.9l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"226.29\",\n    \"cy\": \"-742.8\",\n    \"rx\": \"41.13\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"226.29\",\n    \"y\": \"-738.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Camera\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M213.53-725.56c-6.77 8.62-15.24 19.4-22.82 29.03\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M193.29-694.13l-8.93 5.7 3.42-10.03 5.51 4.33z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"88.29\",\n    \"cy\": \"-526.8\",\n    \"rx\": \"62.57\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"88.29\",\n    \"y\": \"-522.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Ball Detector\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M151.62-581.21c-10.83 9.13-24.43 20.6-36.25 30.57\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M117.43-547.8l-9.9 3.77 5.39-9.12 4.51 5.35z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"255.29\",\n    \"cy\": \"-526.8\",\n    \"rx\": \"86.81\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"255.29\",\n    \"y\": \"-522.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Field Line Detector\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M191.19-581.21c10.8 9 24.33 20.27 36.17 30.14\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M229.79-553.6l5.44 9.09-9.92-3.72 4.48-5.37z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"88.29\",\n    \"cy\": \"-450\",\n    \"rx\": \"77.06\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"88.29\",\n    \"y\": \"-445.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Ball Localisation\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M88.29-508.45v29.89\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M91.79-478.25l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"264.29\",\n    \"cy\": \"-450\",\n    \"rx\": \"81.07\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"264.29\",\n    \"y\": \"-445.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Field Localisation\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M257.37-508.45c1.09 9.03 2.44 20.28 3.66 30.42\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M264.52-478.34L262.24-468l-4.67-9.51 6.95-.83z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"405.29\",\n    \"cy\": \"-378\",\n    \"rx\": \"43.44\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"405.29\",\n    \"y\": \"-373.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Strategy\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M295.93-433.29c21.84 10.84 50.91 25.27 73.59 36.53\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M371.09-399.89l7.4 7.59-10.51-1.32 3.11-6.27z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"408.29\",\n    \"cy\": \"-306\",\n    \"rx\": \"45.25\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"408.29\",\n    \"y\": \"-301.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Planning\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M406.03-359.7c.33 7.72.73 16.99 1.09 25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M410.62-334.25l-3.07 10.15-3.92-9.85 6.99-.3z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M142.42-437.05c60.56 13.38 157.7 34.83 215.4 47.57\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M358.76-392.86l9.01 5.57-10.52 1.27 1.51-6.84z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"436.29\",\n    \"cy\": \"-526.8\",\n    \"rx\": \"76.4\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"436.29\",\n    \"y\": \"-522.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Game Controller\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"411.29\",\n    \"cy\": \"-450\",\n    \"rx\": \"42.3\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"411.29\",\n    \"y\": \"-445.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Purpose\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M430.61-508.83c-3.1 9.28-7.01 20.98-10.5 31.42\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M423.43-476.28l-6.49 8.37-.15-10.59 6.64 2.22z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M409.8-431.7c-.66 7.72-1.45 16.99-2.19 25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M411.09-405.77l-4.34 9.67-2.63-10.27 6.97.6z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"409.29\",\n    \"cy\": \"-234\",\n    \"rx\": \"29.07\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"409.29\",\n    \"y\": \"-229.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Skill\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M408.53-287.7c.11 7.72.25 16.99.37 25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M412.4-262.15l-3.36 10.05-3.64-9.95 7-.1z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"410.29\",\n    \"cy\": \"-162\",\n    \"rx\": \"49.24\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"410.29\",\n    \"y\": \"-157.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Actuation\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M409.53-215.7c.11 7.72.25 16.99.37 25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M413.4-190.15l-3.36 10.05-3.64-9.95 7-.1z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"410.29\",\n    \"cy\": \"-90\",\n    \"rx\": \"76.43\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"410.29\",\n    \"y\": \"-85.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Servo Command\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M410.29-143.7v25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M413.79-118.1l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"410.29\",\n    \"cy\": \"-18\",\n    \"rx\": \"78.17\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"410.29\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Hardware Output\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 980.8)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M410.29-71.7v25.59\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M413.79-46.1l-3.5 10-3.5-10h7z\"\n  }))))), mdx(\"figcaption\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-figcaption\"\n  }, \"The system diagram for the robocup role\")), mdx(\"figure\", {\n    \"className\": \"remark-graphviz-figure\"\n  }, mdx(\"div\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-graph\"\n  }, mdx(\"svg\", {\n    parentName: \"div\",\n    \"role\": \"img\",\n    \"aria-label\": \"SVG diagram of a graph generated from DOT notation: digraph {\\r  compound=true\\r\\r  subgraph cluster_purpose {\\r    label = \\\"Purpose\\\"\\r    \\\"Striker\\\"\\r    \\\"Defender\\\"\\r    \\\"Goalie\\\"\\r  }\\r\\r  subgraph cluster_strategy {\\r    label = \\\"Strategy\\\"\\r    \\\"KickToGoal\\\"\\r    \\\"WalkToBall\\\"\\r    \\\"FallManagement\\\"\\r  }\\r\\r  subgraph cluster_planning {\\r    label = \\\"Planning\\\"\\r    \\\"KickTo\\\"\\r    \\\"WalkTo\\\"\\r    \\\"LookAround\\\"\\r    \\\"Plan Getup\\\"\\r    \\\"Plan Fall\\\"\\r  }\\r\\r  subgraph cluster_skill {\\r    label = \\\"Skill\\\"\\r    \\\"Kick\\\"\\r    \\\"Walk\\\"\\r    \\\"Look\\\"\\r    \\\"Getup\\\"\\r    \\\"Relax\\\"\\r  }\\r\\r  subgraph cluster_actuation {\\r    label = \\\"Actuation\\\"\\r    \\\"LegIK\\\"\\r    \\\"Arms\\\"\\r    \\\"Head\\\"\\r  }\\r\\r  \\\"Defender\\\" -> \\\"WalkToBall\\\" [ltail=cluster_purpose,lhead=cluster_strategy]\\r  \\\"WalkToBall\\\" -> \\\"LookAround\\\" [ltail=cluster_strategy,lhead=cluster_planning]\\r  \\\"LookAround\\\" -> \\\"Look\\\" [ltail=cluster_planning,lhead=cluster_skill]\\r  \\\"Look\\\" -> \\\"Arms\\\" [ltail=cluster_skill,lhead=cluster_actuation]\\r\\r}\",\n    \"width\": \"601pt\",\n    \"height\": \"440pt\",\n    \"viewBox\": \"0 0 601 440\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }, mdx(\"title\", {\n    parentName: \"svg\"\n  }, \"SVG diagram of a graph generated from DOT notation\"), mdx(\"desc\", {\n    parentName: \"svg\"\n  }, \"digraph {\\n  compound=true\\n\\n  subgraph cluster_purpose {\\n    label = \\\"Purpose\\\"\\n    \\\"Striker\\\"\\n    \\\"Defender\\\"\\n    \\\"Goalie\\\"\\n  }\\n\\n  subgraph cluster_strategy {\\n    label = \\\"Strategy\\\"\\n    \\\"KickToGoal\\\"\\n    \\\"WalkToBall\\\"\\n    \\\"FallManagement\\\"\\n  }\\n\\n  subgraph cluster_planning {\\n    label = \\\"Planning\\\"\\n    \\\"KickTo\\\"\\n    \\\"WalkTo\\\"\\n    \\\"LookAround\\\"\\n    \\\"Plan Getup\\\"\\n    \\\"Plan Fall\\\"\\n  }\\n\\n  subgraph cluster_skill {\\n    label = \\\"Skill\\\"\\n    \\\"Kick\\\"\\n    \\\"Walk\\\"\\n    \\\"Look\\\"\\n    \\\"Getup\\\"\\n    \\\"Relax\\\"\\n  }\\n\\n  subgraph cluster_actuation {\\n    label = \\\"Actuation\\\"\\n    \\\"LegIK\\\"\\n    \\\"Arms\\\"\\n    \\\"Head\\\"\\n  }\\n\\n  \\\"Defender\\\" -> \\\"WalkToBall\\\" [ltail=cluster_purpose,lhead=cluster_strategy]\\n  \\\"WalkToBall\\\" -> \\\"LookAround\\\" [ltail=cluster_strategy,lhead=cluster_planning]\\n  \\\"LookAround\\\" -> \\\"Look\\\" [ltail=cluster_planning,lhead=cluster_skill]\\n  \\\"Look\\\" -> \\\"Arms\\\" [ltail=cluster_skill,lhead=cluster_actuation]\\n\\n}\"), mdx(\"g\", {\n    parentName: \"svg\",\n    \"className\": \"graph\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"#fff\",\n    \"stroke\": \"transparent\",\n    \"d\": \"M0 440V0h601v440H0z\"\n  }), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M166-347.2V-424h294v76.8H166z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"313\",\n    \"y\": \"-407.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Purpose\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M76-262.4v-76.8h440v76.8H76z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"296\",\n    \"y\": \"-322.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Strategy\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M8-177.6v-76.8h577v76.8H8z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"296.5\",\n    \"y\": \"-237.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Planning\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M101-92.8v-76.8h411v76.8H101z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"306.5\",\n    \"y\": \"-153\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Skill\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M192-8v-76.8h252V-8H192z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"318\",\n    \"y\": \"-68.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Actuation\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"415\",\n    \"cy\": \"-373.2\",\n    \"rx\": \"37.13\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"415\",\n    \"y\": \"-369\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Striker\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"313\",\n    \"cy\": \"-373.2\",\n    \"rx\": \"46.91\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"313\",\n    \"y\": \"-369\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Defender\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"313\",\n    \"cy\": \"-288.4\",\n    \"rx\": \"58.55\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"313\",\n    \"y\": \"-284.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"WalkToBall\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M313-347.2v6\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M316.5-349.2l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"211\",\n    \"cy\": \"-373.2\",\n    \"rx\": \"36.56\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"211\",\n    \"y\": \"-369\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Goalie\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"449\",\n    \"cy\": \"-288.4\",\n    \"rx\": \"59.11\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"449\",\n    \"y\": \"-284.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"KickToGoal\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"313\",\n    \"cy\": \"-203.6\",\n    \"rx\": \"60.84\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"313\",\n    \"y\": \"-199.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LookAround\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M313-262.4v6\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M316.5-264.4l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"160\",\n    \"cy\": \"-288.4\",\n    \"rx\": \"76.44\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"160\",\n    \"y\": \"-284.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"FallManagement\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"536\",\n    \"cy\": \"-203.6\",\n    \"rx\": \"40.57\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"536\",\n    \"y\": \"-199.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"KickTo\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"435\",\n    \"cy\": \"-203.6\",\n    \"rx\": \"42.86\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"435\",\n    \"y\": \"-199.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"WalkTo\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"313\",\n    \"cy\": \"-118.8\",\n    \"rx\": \"31.34\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"313\",\n    \"y\": \"-114.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Look\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M313-177.6v6\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M316.5-179.6l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"180\",\n    \"cy\": \"-203.6\",\n    \"rx\": \"54.43\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"180\",\n    \"y\": \"-199.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Plan Getup\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"62\",\n    \"cy\": \"-203.6\",\n    \"rx\": \"45.78\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"62\",\n    \"y\": \"-199.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Plan Fall\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"474\",\n    \"cy\": \"-118.8\",\n    \"rx\": \"29.61\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"474\",\n    \"y\": \"-114.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Kick\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"394\",\n    \"cy\": \"-118.8\",\n    \"rx\": \"31.9\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"394\",\n    \"y\": \"-114.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Walk\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"313\",\n    \"cy\": \"-34\",\n    \"rx\": \"32.48\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"313\",\n    \"y\": \"-29.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Arms\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M313-92.8v6\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M316.5-94.8l-3.5 10-3.5-10h7z\"\n  })), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"229\",\n    \"cy\": \"-118.8\",\n    \"rx\": \"34.77\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"229\",\n    \"y\": \"-114.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Getup\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"143\",\n    \"cy\": \"-118.8\",\n    \"rx\": \"33.62\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"143\",\n    \"y\": \"-114.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Relax\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"400\",\n    \"cy\": \"-34\",\n    \"rx\": \"36.48\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"400\",\n    \"y\": \"-29.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LegIK\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 436)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"231\",\n    \"cy\": \"-34\",\n    \"rx\": \"31.32\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"231\",\n    \"y\": \"-29.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Head\"))))), mdx(\"figcaption\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-figcaption\"\n  }, \"The behaviour subgraph driven by the Director system\")), mdx(\"p\", null, \"All modules may send information to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Data Logging\"), \" to generate NBS files, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Console Log Handler\"), \" for command line output, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NUsight\"), \" to show data in NUsight, and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"PlotJuggler\"), \" to show graphs in PlotJuggler.\"), mdx(\"p\", null, \"Other roles may only have a subset of the above diagram, for testing purposes. Some roles, such as \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ps3walk\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"keyboardwalk\"), \" are also for demonstration purposes and bypass the autonomous planning sections of the system with user input.\"), mdx(\"h2\", {\n    \"id\": \"codedocs\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#codedocs\",\n    \"aria-label\": \"codedocs 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  }))), \"Codedocs\"), mdx(\"p\", null, \"We have documentation automatically generated from the main codebase \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://codedocs.nubots.net/\"\n  }, \"here\"), \".\"), mdx(\"h2\", {\n    \"id\": \"log-level\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#log-level\",\n    \"aria-label\": \"log level 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  }))), \"Log Level\"), mdx(\"p\", null, \"When printing to the terminal, the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"log\"), \" function is used.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"log<NUClear::INFO>(\\\"Hello World!\\\");\\n\")), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NUClear::INFO\"), \" is the log level. The log will only print if the module's log level is set to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"INFO\"), \" or higher in the configuration file. The following table describes the log levels.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Level\"), 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  }, \"TRACE\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used to debug code.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"DEBUG\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used to debug behaviour.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"INFO\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used to inform the user of what the module is doing.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WARN\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used to warn the user that something has gone wrong, but the system can still perform its functions.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"ERROR\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used to inform the user that something has gone wrong, and the module cannot perform its intended function at this time.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"FATAL\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Used to inform the user that something has gone wrong, and the module will never be able to perform its intended function again.\")))));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#roles","title":"Roles"},{"url":"#system-diagram","title":"System Diagram"},{"url":"#codedocs","title":"Codedocs"},{"url":"#log-level","title":"Log Level"}]},"frontmatter":{"section":"System","chapter":"Foundations","title":"Overview","description":"Introduction to the NUbots codebase and high-level architecture.","keywords":null,"slug":"/system/foundations/overview","hidden":null},"childNUbookContributions":{"authors":[{"name":"Ysobel Sims","username":"ysims"},{"name":"Cameron Murtagh","username":"CMurtagh-LGTM"},{"name":"Thomas O'Brien","username":"Tom0Brien"}],"lastCommit":{"date":"2023-10-05T05:41:52.000Z","hash":"71c414b39839529052f8dfa16031625a16f3aa83"}}}},"pageContext":{"mdxPath":"src/book/02-system/01-foundations/01-overview.mdx","id":"83f5faa0-a718-52f8-a126-e2cd1d807883","next":{"chapter":"Foundations","title":"Build System","description":"The NUbots build system.","slug":"/system/foundations/build-system","hidden":null},"previous":{"chapter":"RoboCup","title":"Debriefs","description":"Debriefs and takeaways from our performances at RoboCup.","slug":"/team/robocup/debriefs","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"]}