{
    "componentChunkName": "component---src-components-page-template-jsx",
    "path": "/archive/nugus/ps3-walk",
    "result": {"data":{"mdx":{"id":"b0a86904-6a17-5a75-a90d-2d3e39b9cb11","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\": \"Archive\",\n  \"chapter\": \"NUgus\",\n  \"title\": \"PS3 Walk\",\n  \"description\": \"Controlling the NUgus with a PS3 controller.\",\n  \"slug\": \"/archive/nugus/ps3-walk\",\n  \"authors\": [\"Ysobel Sims (@ysims)\"]\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: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"This page is archived. It documents the NUgus, which NUbots no longer uses as its main platform.\")), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/NUbots/NUbots/tree/763bab80c6adda85731b3d4113d77b63acf5b9c2/module/purpose/PS3Walk\"\n  }, \"PS3 walk module\"), \" is an interface for \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"testing\"), \" and \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"demonstrating\"), \" the walk and other functionalities using a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"PS3 controller\"), \".\"), mdx(\"p\", null, \"The module connects to the PS3 controller using USB or bluetooth and reacts based on joystick or button input.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Command\"), 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  }, \"Left Joystick Horizontal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Adds rotational speed to the walk command.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Left Joystick Vertical\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Adds x speed to the walk command.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Right Joystick Horizontal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Changes the head yaw.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Right Joystick Vertical\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Changes the head pitch.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"START\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Toggles walking on/off.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"SELECT\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Toggles locking of the head.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"R2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Right kick.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"L2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Left kick.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"DPAD Up\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Clap move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"DPAD Down\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform The Robot move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"DPAD Left\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Dab move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"DPAD Right\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Arm Dangle move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Triangle\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Star move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Circle\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Raise The Roof move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Cross\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Crouch move.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Square\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Perform Wave move.\")))), mdx(\"p\", null, \"To use this module, build the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/NUbots/NUbots/blob/763bab80c6adda85731b3d4113d77b63acf5b9c2/roles/ps3walk.role\"\n  }, \"PS3Walk role\"), \" and install it on the robot. Ensure the PS3 controller is paired and connected to the right robot. You can set up bluetooth on the robot and pair the controller using the steps below. Once these have been run once, the robot should automatically connect to the controller when both the robot and controller are powered. When you are ready, run \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"./ps3walk\"), \" on the robot to begin controlling it.\"), mdx(\"p\", null, \"The robot will initially not perform any action. If you want the robot to stand, pick up the robot and press the start button. It will then move to its standing position and begin looking for walk inputs.\"), mdx(\"h3\", {\n    \"id\": \"setup\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#setup\",\n    \"aria-label\": \"setup 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  }))), \"Setup\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Install \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"bluez\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"bluez-utils\"), \", and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"bluez-plugins\"), \" if they have not already been installed:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"pacman -S --needed bluez bluez-utils bluez-plugins\\n\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Restart the system:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"reboot now\\n\")), \"This is only necessary if the packages were not previously installed.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Start the bluetooth service:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"systemctl start bluetooth.service\\n\")))), mdx(\"details\", null, mdx(\"summary\", null, \" Start bluetooth automatically \"), mdx(\"p\", null, \"Bluetooth can be powered on automatically when the system starts. This enables the controllers to\\nconnect without having to run \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"systemctl start bluetooth.service\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"bluetoothctl power on\"), \". This\\nis not currently enable by default in the existing installation. Some robots might have this enabled.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Run\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"systemctl enable bluetooth.service\\n\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Set \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"AutoEnable=true\"), \" in \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/etc/bluetooth/main.conf\"), \":\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"[Policy]\\nAutoEnable=true\\n\")))), mdx(\"p\", null, \"Now, after restarting the robot, and having previously paired the PS3 controller (see below), the PS3 controller\\nwill connect to the robot automatically.\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ps3walk\"), \" still needs to be started in order to control the robot.\"))), mdx(\"h3\", {\n    \"id\": \"pairing-the-ps3-controller-via-bluetooth\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#pairing-the-ps3-controller-via-bluetooth\",\n    \"aria-label\": \"pairing the ps3 controller via bluetooth 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  }))), \"Pairing the PS3 Controller via Bluetooth\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Unplug and power off the PS3 controller.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Run the interactive program \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"bluetoothctl\"), \", and type the following commands:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"power on\\nscan on\\ndiscoverable on\\n\")), \"If bluetooth is working correctly, you might see other devices appear and disappear.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Turn on the PS3 controller by pressing the middle PS button. The four LEDS should start flashing quickly.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Plug the PS3 controller into the computer with a USB cable.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Type \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"yes\"), \" when the following prompt appears:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"Authorize service 00001124-0000-1000-8000-00805f9b34fb (yes/no)\\n\")))), mdx(\"p\", null, \"The PS3 controller is now paired. You can unplug it and it will remain connected.\"), mdx(Alert, {\n    type: \"warning\",\n    mdxType: \"Alert\"\n  }, \"The controllers are extremely finicky. Placing them on a table or shaking them can trigger multiple buttons to be pressed!\"), mdx(Alert, {\n    type: \"info\",\n    mdxType: \"Alert\"\n  }, \"The steps are based on the \", mdx(\"a\", {\n    href: \"https://wiki.archlinux.org/title/Gamepad#Pairing_via_Bluetooth\"\n  }, \"Arch Linux controller pairing guide\"), \". If you are having trouble or are connecting a different controller try using their guide as a starting point.\"), mdx(\"h3\", {\n    \"id\": \"verifying-the-ps3-controller-is-functioning-correctly\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#verifying-the-ps3-controller-is-functioning-correctly\",\n    \"aria-label\": \"verifying the ps3 controller is functioning correctly 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  }))), \"Verifying the PS3 Controller is functioning correctly.\"), mdx(\"p\", null, \"Verifying the PS3 controller is connected and sending messages is useful for debugging the range, interference, event codes, and making sure the controller is connect to the right robot.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Install \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"joyutils\"), \":\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"pacman -S --needed joyutils\\n\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"If you are connected via ssh run:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"jstest --event /dev/input/js0\\n\")), \"Otherwise, if you're connected to a virtual console:\", mdx(\"pre\", {\n    parentName: \"li\"\n  }, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"jstest /dev/input/js0\\n\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Move controller inputs, and press \", mdx(\"kbd\", null, \"Ctrl\"), \" + \", mdx(\"kbd\", null, \"C\"), \" to exit.\")), mdx(\"p\", null, \"Connecting multiple PS3 controllers is possible. The first PS3 controller that connects is located at \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/dev/input/js0\"), \". The second controller that connects is then located at \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/dev/input/js1\"), \".\\nAdditionally, the LEDs on the controllers show which number they are. This holds true regardless of whether the controller is connected over Bluetooth or USB.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#setup","title":"Setup"},{"url":"#pairing-the-ps3-controller-via-bluetooth","title":"Pairing the PS3 Controller via Bluetooth"},{"url":"#verifying-the-ps3-controller-is-functioning-correctly","title":"Verifying the PS3 Controller is functioning correctly."}]},"frontmatter":{"section":"Archive","chapter":"NUgus","title":"PS3 Walk","description":"Controlling the NUgus with a PS3 controller.","keywords":null,"slug":"/archive/nugus/ps3-walk","hidden":null},"childNUbookContributions":{"authors":[{"name":"Ysobel Sims","username":"ysims"}],"lastCommit":{"date":"2026-11-08T04:31:56.000Z","hash":"c00a8e7cc091fb8b4b96f4852a33a5718fefca99"}}}},"pageContext":{"mdxPath":"src/book/04-archive/01-nugus/05-ps3-walk.mdx","id":"b0a86904-6a17-5a75-a90d-2d3e39b9cb11","next":{"chapter":"NUgus","title":"Batteries","description":"How to safely work with batteries","slug":"/archive/nugus/batteries","hidden":null},"previous":{"chapter":"NUgus","title":"Running and Tuning Scripts","description":"How to tune and run scripts.","slug":"/archive/nugus/scripts","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}],"iconSvg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0z\"/><circle opacity=\".3\" cx=\"9\" cy=\"8\" r=\"2\"/><path opacity=\".3\" d=\"M9 15c-2.7 0-5.8 1.29-6 2.01V18h12v-1c-.2-.71-3.3-2-6-2z\"/><path d=\"M16.67 13.13C18.04 14.06 19 15.32 19 17v3h4v-3c0-2.18-3.57-3.47-6.33-3.87zM15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4c-.47 0-.91.1-1.33.24a5.98 5.98 0 010 7.52c.42.14.86.24 1.33.24zM9 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zM9 13c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4zm6 5H3v-.99C3.2 16.29 6.3 15 9 15s5.8 1.29 6 2v1z\"/></svg>","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":"Localisation","slug":"/system/subsystems/localisation","hidden":null},{"title":"Odometry","slug":"/system/subsystems/odometry","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/k1","pages":[{"title":"K1 Specification","slug":"/system/hardware/k1","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}],"iconSvg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0zm0 0h24v24H0V0z\"/><path opacity=\".3\" d=\"M4 19h14V5H4v14zm8-12h4v3h-4V7zm0 4h4v6h-4v-6zM6 7h5v5H6V7zm0 6h5v4H6v-4z\"/><path d=\"M6 13h5v4H6zm0-6h5v5H6zm6 0h4v3h-4zm0 4h4v6h-4zm10-2V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14z\"/></svg>","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":"Data Recording and Playback","slug":"/guides/main/data-recording-playback","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":"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":"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}],"iconSvg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0z\"/><path d=\"M21 5c-1.11-.35-2.33-.5-3.5-.5-1.95 0-4.05.4-5.5 1.5-1.45-1.1-3.55-1.5-5.5-1.5S2.45 4.9 1 6v14.65c0 .25.25.5.5.5.1 0 .15-.05.25-.05C3.1 20.45 5.05 20 6.5 20c1.95 0 4.05.4 5.5 1.5 1.35-.85 3.8-1.5 5.5-1.5 1.65 0 3.35.3 4.75 1.05.1.05.15.05.25.05.25 0 .5-.25.5-.5V6c-.6-.45-1.25-.75-2-1zM3 18.5V7c1.1-.35 2.3-.5 3.5-.5 1.34 0 3.13.41 4.5.99v11.5C9.63 18.41 7.84 18 6.5 18c-1.2 0-2.4.15-3.5.5zm18 0c-1.1-.35-2.3-.5-3.5-.5-1.34 0-3.13.41-4.5.99V7.49c1.37-.59 3.16-.99 4.5-.99 1.2 0 2.4.15 3.5.5v11.5z\"/><path opacity=\".3\" d=\"M11 7.49c-1.37-.58-3.16-.99-4.5-.99-1.2 0-2.4.15-3.5.5v11.5c1.1-.35 2.3-.5 3.5-.5 1.34 0 3.13.41 4.5.99V7.49z\"/><g><path d=\"M17.5 10.5c.88 0 1.73.09 2.5.26V9.24c-.79-.15-1.64-.24-2.5-.24-1.28 0-2.46.16-3.5.47v1.57c.99-.35 2.18-.54 3.5-.54zM17.5 13.16c.88 0 1.73.09 2.5.26V11.9c-.79-.15-1.64-.24-2.5-.24-1.28 0-2.46.16-3.5.47v1.57c.99-.34 2.18-.54 3.5-.54zM17.5 15.83c.88 0 1.73.09 2.5.26v-1.52c-.79-.15-1.64-.24-2.5-.24-1.28 0-2.46.16-3.5.47v1.57c.99-.35 2.18-.54 3.5-.54z\"/></g></svg>","hidden":false},{"title":"Archive","slug":"/archive/nugus/specification","chapters":[{"title":"NUgus","slug":"/archive/nugus/specification","pages":[{"title":"NUgus Specification","slug":"/archive/nugus/specification","hidden":null},{"title":"Flashing a NUgus","slug":"/archive/nugus/flashing","hidden":null},{"title":"Servo Setup and Calibration","slug":"/archive/nugus/servo-calibration","hidden":null},{"title":"Running and Tuning Scripts","slug":"/archive/nugus/scripts","hidden":null},{"title":"PS3 Walk","slug":"/archive/nugus/ps3-walk","hidden":null},{"title":"Batteries","slug":"/archive/nugus/batteries","hidden":null},{"title":"Camera Calibration","slug":"/archive/nugus/camera-calibration","hidden":null}],"hidden":false},{"title":"Visual Mesh","slug":"/archive/visual-mesh/vision","pages":[{"title":"Visual Mesh Vision","slug":"/archive/visual-mesh/vision","hidden":null},{"title":"Visual Mesh Getting Started","slug":"/archive/visual-mesh/guide","hidden":null},{"title":"Maintaining Subsystems","slug":"/archive/visual-mesh/maintaining-subsystems","hidden":null}],"hidden":false}],"iconSvg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0z\"/><path opacity=\".3\" fill-rule=\"evenodd\" d=\"M4 5h16v1H4zM5 11h14v8H5zm4 1v2h6v-2z\"/><path fill-rule=\"evenodd\" d=\"M3 3h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v1h16V5zM3 9h18v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zm2 2v8h14v-8zm4 1h6v2H9z\"/></svg>\n","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}],"iconSvg":"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><g><rect fill=\"none\" height=\"24\" width=\"24\"/></g><g><g><g opacity=\".3\"><polygon points=\"8.66,14.64 4.41,18.88 5.12,19.59 9.36,15.34 9.36,15.34 8.66,14.64\"/></g><g opacity=\".3\"><rect height=\"6\" transform=\"matrix(0.7071 -0.7071 0.7071 0.7071 -7.0983 17.0848)\" width=\"1\" x=\"16.57\" y=\"14.11\"/></g><g><path d=\"M21.67,18.17l-5.3-5.3h-0.99l-2.54,2.54v0.99l5.3,5.3c0.39,0.39,1.02,0.39,1.41,0l2.12-2.12 C22.06,19.2,22.06,18.56,21.67,18.17z M18.84,19.59l-4.24-4.24l0.71-0.71l4.24,4.24L18.84,19.59z\"/></g><g><path d=\"M17.34,10.19l1.41-1.41l2.12,2.12c1.17-1.17,1.17-3.07,0-4.24l-3.54-3.54l-1.41,1.41V1.71L15.22,1l-3.54,3.54l0.71,0.71 h2.83l-1.41,1.41l1.06,1.06l-2.89,2.89L7.85,6.48V5.06L4.83,2.04L2,4.87l3.03,3.03h1.41l4.13,4.13l-0.85,0.85H7.6l-5.3,5.3 c-0.39,0.39-0.39,1.02,0,1.41l2.12,2.12c0.39,0.39,1.02,0.39,1.41,0l5.3-5.3v-2.12l5.15-5.15L17.34,10.19z M9.36,15.34 l-4.24,4.24l-0.71-0.71l4.24-4.24l0,0L9.36,15.34L9.36,15.34z\"/></g></g></g></svg>","hidden":true}],"references":null,"hidden":null}},
    "staticQueryHashes": ["2362849146","445096115","962821121"]}