{
    "componentChunkName": "component---src-components-page-template-jsx",
    "path": "/system/foundations/director",
    "result": {"data":{"mdx":{"id":"d09eeaf2-1676-5565-a387-1b5c6a5fcbf8","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\": \"Director\",\n  \"description\": \"Introduction to the Director and how to use it to build behaviours.\",\n  \"slug\": \"/system/foundations/director\",\n  \"authors\": [\"Trent Houliston (@TrentHouliston)\", \"Ysobel Sims (@ysims)\"],\n  \"references\": \"references.bib\"\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 References = makeShortcode(\"References\");\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 Director \", mdx(\"cite\", null, \"director2023\"), \" is a framework and algorithm used to control the flow of behaviour on the robots.\\nIt allows composable behaviours that can take advantage of transition rules to ensure that the robot performs the right task at the right time.\"), mdx(\"p\", null, \"The Director does this by providing a set of new DSL keywords to NUClear that describe what tasks to run, what conditions are required, and how those tasks build on other tasks.\\nIt then uses these keywords to make a graph that it will use to decide which tasks to execute in order to achieve the goals of the modules.\"), mdx(\"p\", null, \"The two DSL components that are added are Providers and Tasks.\"), mdx(\"h2\", {\n    \"id\": \"providers\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#providers\",\n    \"aria-label\": \"providers 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  }))), \"Providers\"), mdx(\"p\", null, \"Providers are implemented as NUClear reactions and live in a NUClear \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"on\"), \" statement.\\nThey are the components which \\\"provide\\\" the functionality needed to perform a task, either by doing it directly or by running a series of subtasks.\\nThey form the basis of the modules that implement behaviours.\\nEach Provider will provide for a specific message type in a specific situation.\\nFor example a Provider which executed a walk task, the code might look like:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provide<Walk>>().then(...);\\n\")), mdx(\"p\", null, \"Providers are triggered whenever a Task needs to be executed by the Director, however they can also be triggered using other NUClear keywords.\\nThe Director will ensure that any Provider which is not currently active will not run if it is not active, even if the other triggers would make it run.\\nFor example if the walk engine module wants to update at 10Hz, the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Every\"), \" keyword can be used to achieve this:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"on<Provide<Walk>, Every<10, Per<std::chrono::seconds>>().then(...);\\n\")), mdx(\"p\", null, \"This Provider would then run once every time the Walk Task was updated, as well as running at 10Hz while the Provider is active.\"), mdx(\"p\", null, \"It is possible to run an inactive Provider with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Optional\"), \" keyword.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"on<Optional<Provide<Walk>>, Trigger<Sensors>>().then(...);\\n\")), mdx(\"p\", null, \"The reaction will run regardless of if there is a Walk task if a Sensors message is emitted. The Walk Task will be empty, and the Provider cannot emit subtasks.\"), mdx(\"p\", null, \"Subtasks must be emitted from the Provider reaction to be considered a child of that Provider. If the Task is emitted from a non-Provider reaction, it will be considered a root task.\"), mdx(\"h3\", {\n    \"id\": \"provider-groups\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#provider-groups\",\n    \"aria-label\": \"provider groups 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  }))), \"Provider Groups\"), mdx(\"p\", null, \"When there are multiple Providers which provide for a single Task type they are considered a Provider group. For example, both a static walk module and a ZMP walk module could have \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Provide<Walk>\"), \" reactions. These two Providers would be considered a Provider group for the Walk task.\"), mdx(\"p\", null, \"When a Provider group is running, only one of the Providers in that group is allowed to execute at a time.\"), mdx(\"p\", null, \"When a new Task is emitted the Director will determine which of the Providers in a group to run based on the current state of the system as well as any extra DSL keywords that are on the Provider's declaration. If both Providers could run, then the one declared first will run.\"), mdx(\"p\", null, \"If the state of the Director system changes such that the currently active Provider can no longer run, then the Director will attempt to reassign that task to another Provider in the group.\"), mdx(\"p\", null, \"Provider groups operate together as a single unit. Any Task that is emitted from a Provider in a group is considered to be emitted from that group. Considering the walk example, both Providers may emit a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task. Regardless of which Provider is active, the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task will be considered as coming from the walk Provider group. If the walk Providers emit different subtasks, then the old subtasks will be considered \\\"finished\\\" and removed from the graph, and the new subtasks will start running.\"), mdx(\"h3\", {\n    \"id\": \"provider-types\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#provider-types\",\n    \"aria-label\": \"provider types 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  }))), \"Provider Types\"), mdx(\"p\", null, \"There are three different Provider types that can be used.\\nThese three provider types along with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Needs\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"When\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Causing\"), \" DSL words determine the flow of a Provider, executing code as the Director changes which Tasks it executes.\"), mdx(\"h4\", {\n    \"id\": \"start\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h4\",\n    \"href\": \"#start\",\n    \"aria-label\": \"start 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  }))), \"Start\"), mdx(\"p\", null, \"A Start Provider is used to set up the state of a Provider when it starts running. Start is executed when a Provider group has no active Tasks and then is given one, i.e. it gains control.\"), mdx(\"p\", null, \"For example, the walk may need a Start Provider to initialise the state of the walk engine before it starts running.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Start<Walk>>().then( { // this is a Start Provider type for the Walk Task\\n    // Initialise walk\\n    delta = NUClear::clock::now();\\n    walk_engine.reset();\\n    current_orders = Eigen::Vector3d::Zero();\\n});\\n\")), mdx(\"h4\", {\n    \"id\": \"provide\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h4\",\n    \"href\": \"#provide\",\n    \"aria-label\": \"provide 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  }))), \"Provide\"), mdx(\"p\", null, \"Provide is the normal Provider which executes the functionality for a Task, as described previously. It will run after Start, if a Start Provider exists.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provide<Walk>>().then( { // a Provide Provider type for the Walk Task\\n    // Run the walk\\n    auto goals = calculate_joint_goals();\\n    emit<Task>(std::make_unique<LegIK>(goals));\\n});\\n\")), mdx(\"h4\", {\n    \"id\": \"stop\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h4\",\n    \"href\": \"#stop\",\n    \"aria-label\": \"stop 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  }))), \"Stop\"), mdx(\"p\", null, \"Stop Providers run when a Provider group is losing control and will no longer run. That is, when the Provider group has no active Task. This is useful for running any cleanup code.\"), mdx(\"p\", null, \"A Stop Provider cannot run unless either a Start or Provide has run for that Provider group.\"), mdx(\"p\", null, \"Any example of a Stop Provider is:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Stop<Walk>>().then({ // a Stop Provider type for the Walk Task\\n    // Log that the walk has stopped\\n    log<NUClear::TRACE>(\\\"Walk Stopped\\\");\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"needs\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#needs\",\n    \"aria-label\": \"needs 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  }))), \"Needs\"), mdx(\"p\", null, \"The Needs DSL word is used to ensure a Provider can take control of subtasks, otherwise it cannot run.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provide<Walk>, Needs<LegIK>>().then(...);\\n\")), mdx(\"p\", null, \"In this example, the Walk Provider will only run if it can take over the LegIK Task.\"), mdx(\"p\", null, \"If a higher priority Provider has already taken over the LegIK Task, then this Provider will not run. If the LegIK is not being used by any other Provider, or if this Provider has higher priority than other Providers wanting to control the LegIK Task, then this Provider will take over the LegIK Task.\"), mdx(\"p\", null, \"Without \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Needs\"), \", the Provider will still run and can emit subtasks, but the subtasks will not do anything if another Provider has access to them.\"), mdx(\"h3\", {\n    \"id\": \"when\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#when\",\n    \"aria-label\": \"when 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  }))), \"When\"), mdx(\"p\", null, \"A When condition is used to ensure that a Provider will only execute when the specified condition is met.\\nThese conditions are provided using a global enum message along with a statement that describes what condition you want.\\nFor example, if you wanted a kick engine to only run if the robot is standing then you would write:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provide<Kick>, When<Stability, std::equal_to, Stability::STANDING>>().then(...);\\n\")), mdx(\"p\", null, \"These conditions are updated by using normal NUClear emits. For example if \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"emit(std::make_unique<Stability>(Stability::STANDING));\"), \" was emitted in another reaction, then the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"When\"), \" condition would be met and the Provider would run.\"), mdx(\"h3\", {\n    \"id\": \"causing\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#causing\",\n    \"aria-label\": \"causing 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  }))), \"Causing\"), mdx(\"p\", null, \"A Causing statement is a promise that by running this Provider, a specified desired state will be eventually reached.\\nThis is used to allow smooth transitions between modules.\\nFor example, when the walk engine stops moving it would be in a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"STANDING\"), \" Stability state.\\nThis means the walk engine could have a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Provide\"), \" reaction that causes this state:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provide<Walk>, Causing<Stability, Stability::STANDING>().then({\\n    // Make the robot stop walking\\n    set_orders = Eigen::Vector3d::Zero();\\n    // Check if we have stopped moving\\n    if (state == STOPPED) {\\n        // Emit that we are standing\\n        emit(std::make_unique<Stability>(Stability::STANDING));\\n    }\\n});\\n\")), mdx(\"p\", null, \"The implementation for the reaction should result in the desired state being eventually emitted. This would not be the primary Provider for the Walk, but would instead be active when a higher priority Provider wants this state.\"), mdx(\"p\", null, \"For example, if the kick engine only runs \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"When<Stability, std::greater_equal, Stability::STANDING>\"), \" then it would not be able to run while the walk engine is running normally. However, if the kick Task has a higher priority than the walk Task, then it will push the walk engine into the Causing Provide reaction, which will then cause the Stability state to be \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"STANDING\"), \" so that the kick engine can run.\"), mdx(\"h2\", {\n    \"id\": \"tasks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#tasks\",\n    \"aria-label\": \"tasks 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  }))), \"Tasks\"), mdx(\"p\", null, \"Tasks are the jobs that Providers execute. The are generally in the form of Protobuf messages, and may or may not contain data within them.\"), mdx(\"p\", null, \"Tasks are implemented using NUClear's \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"emit\"), \" along with a custom scope \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"emit<Task>\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"// Emit a Task requesting to walk forwards\\nemit<Task>(std::make_unique<Walk>(Eigen::Vector3d(1.0, 0.0, 0.0)));\\n\")), mdx(\"p\", null, \"This walk engine Task contains information on the speed and direction that the robot should walk in. Other Tasks, such as \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"GetUpWhenFallen\"), \" does not need any data.\"), mdx(\"p\", null, \"Tasks can take four arguments, as described in the following table in order.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Argument\"), 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  }, \"data\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A pointer to a Protobuf message, describing the Task.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"priority\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A positive integer. Higher numbers indicate higher priority. If two Tasks have the same priority, then the one emitted first will be chosen. If no priority is specified, then the default priority of 0 is used.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"optional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A boolean. If true, then the Task is considered optional. If two Tasks need the same resources and have the same priority but one is optional, then the non-optional Task will be chosen. Optional Tasks do not need to be active for other Tasks from the same Provider to run. If no optional argument is specified, then the default optional value of false is used.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"name\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A string. If provided, then this string will be used when logging messages. The default is the empty string.\")))), mdx(\"h3\", {\n    \"id\": \"root-level-tasks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#root-level-tasks\",\n    \"aria-label\": \"root level tasks 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  }))), \"Root Level Tasks\"), mdx(\"p\", null, \"When a Task is emitted from a reaction which is not itself a Provider, that Task is considered a root level task.\\nThese root level tasks are all considered siblings within the priority comparison system at the root level of the graph.\\nWhen a root level task is emitted with a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"nullptr\"), \", that root level task is removed from the Director tree and the current list of Tasks to execute.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"emit<Task>(std::unique_ptr<GetUpWhenFallen>(nullptr));\\n\")), mdx(Alert, {\n    mdxType: \"Alert\"\n  }, mdx(\"p\", null, \"Note that you must use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"std::unique_ptr\"), \" not \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"std::make_unique\"), \" when using \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"nullptr\"), \".\")), mdx(\"h3\", {\n    \"id\": \"subtasks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#subtasks\",\n    \"aria-label\": \"subtasks 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  }))), \"Subtasks\"), mdx(\"p\", null, \"A subtask is a Task that is emitted by a Provider.\\nWhen multiple Tasks are emitted by a Provider, each of these are sibling Tasks in the Director graph.\"), mdx(\"h3\", {\n    \"id\": \"priority\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#priority\",\n    \"aria-label\": \"priority 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  }))), \"Priority\"), mdx(\"p\", null, \"Priority in the Director is considered based on the closest common ancestor of the two competing Tasks.\\nFor root tasks, the closest common ancestor will be the root element.\\nOnce the closest common ancestor is determined, the priority of each Task's branch will determine which Task has higher priority.\\nThe winner takes control and becomes active, while the evicted Task will need to watch for an opportunity to take back control.\"), mdx(\"p\", null, \"When a Task's ancestor tree has an optional Task between itself and the common ancestor, then the Task is considered optional.\\nIf one Task has an optional parentage and the other does not then the optional Task will automatically lose.\\nIf both have optional Tasks in their parentage, then the Tasks will be compared as before.\\nA higher priority root Task's optional elements are more important than a lower priority Task's optional elements.\"), mdx(\"h3\", {\n    \"id\": \"done-tasks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#done-tasks\",\n    \"aria-label\": \"done tasks 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  }))), \"Done Tasks\"), mdx(\"p\", null, \"A Done Task is a special Task that can be emitted by a Provider to signal to its parent that it has completed the Task that was assigned to it.\\nThe Provider group that created this task will then be re-executed with the knowledge that it was triggered as a done event from below.\\nThe Task will not be removed from the Director tree, unless it is a root Task. If it is a root Task, it will be removed as if it was emitted with a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"nullptr\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"emit<Task>(std::make_unique<Done>());\\n\")), mdx(\"h3\", {\n    \"id\": \"continue-tasks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#continue-tasks\",\n    \"aria-label\": \"continue tasks 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  }))), \"Continue Tasks\"), mdx(\"p\", null, \"A Continue Task is a special Task that can be emitted by a Provider to signal to continue running the Tasks it previously requested. For example, if a Provider is running a walk Task, it can emit a Continue Task to continue running the walk Task.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"emit<Task>(std::make_unique<Continue>());\\n\")), mdx(\"h3\", {\n    \"id\": \"wait-tasks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#wait-tasks\",\n    \"aria-label\": \"wait tasks 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  }))), \"Wait Tasks\"), mdx(\"p\", null, \"A Wait Task is a special Task that can be emitted by a Provider to request the Provider to be rerun at a given time. If the Provider runs again for any other reason before the Wait elapses, the Wait is cancelled unless a Continue Task is emitted. For example, if a servo Provider requests the servo to move it can emit a Wait Task so that it reruns after the servo has finished moving, so that it can emit a Done Task. If another servo Task is requested with a new Wait, this cancels the original Wait.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"emit<Task>(std::make_unique<Wait>(NUClear::clock::now() + std::chrono::seconds(5)));\\n\")), mdx(\"h2\", {\n    \"id\": \"data\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#data\",\n    \"aria-label\": \"data 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  }))), \"Data\"), mdx(\"p\", null, \"Providers can access data about the local state of the Director.\"), mdx(\"h3\", {\n    \"id\": \"uses\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#uses\",\n    \"aria-label\": \"uses 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  }))), \"Uses\"), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Uses\"), \" DSL word is used to find out information about subtasks. It contains information on if the subtask is Done and what the current run state of the subtask is.\"), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"done\"), \" field is a boolean that is true if the subtask is Done, regardless of if this Provider ran it. It is useful when the user wants to know if specific or multiple subtasks are Done.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provides<Walk>, Uses<LegIK>>().then([this] (const Uses<LegIK>& leg_ik) {\\n    if (leg_ik.done) {\\n        log<INFO>(\\\"Leg IK is done\\\");\\n    }\\n});\\n\")), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"run_state\"), \" field is a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"RunState\"), \" enum that indicates the current run state of the subtask. It is useful when the user wants to know if the subtask is running, has been queued to run, or has not been emitted from this Provider.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provides<Walk>, Uses<LegIK>>().then([this] (const Uses<LegIK>& leg_ik) {\\n    if (leg_ik.run_state == GroupInfo::RunState::RUNNING) {\\n        log<INFO>(\\\"The LegIK task is running\\\");\\n    }\\n    else if (leg_ik.run_state == GroupInfo::RunState::QUEUED) {\\n        log<INFO>(\\\"The LegIK task is queued\\\");\\n    }\\n    else if (leg_ik.run_state == GroupInfo::RunState::NO_TASK) {\\n        log<INFO>(\\\"The LegIK task has not been emitted\\\");\\n    }\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"run-reason\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#run-reason\",\n    \"aria-label\": \"run reason 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  }))), \"Run Reason\"), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"RunReason\"), \" DSL word is used to find out information about why a Provider was triggered.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provides<Walk>>().then([this] (const Walk& walk, const RunReason& reason) {\\n    if (reason == RunReason::NEW_TASK) {\\n        log<INFO>(\\\"A new Walk Task triggered this reaction\\\");\\n    }\\n});\\n\")), mdx(\"p\", null, \"The following table lists possible RunReasons.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"RunReason\"), 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  }, \"NEW_TASK\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The Provider is running because a new Task of the type it provides for was emitted.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"STARTED\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The Provider is running because it has now become active.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"STOPPED\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The Provider is running because it is becoming inactive.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"SUBTASK_DONE\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The Provider is running because one of its subtasks has completed.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"PUSHED\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The Provider is running because a higher priority module wants its Causing state to be true.\")))), mdx(\"h2\", {\n    \"id\": \"the-director-graph\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#the-director-graph\",\n    \"aria-label\": \"the director graph 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  }))), \"The Director Graph\"), 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    \\\"Root\\\" -> \\\"Provide<Play>\\\" [label=\\\" Play\\\"]\\r    \\\"Provide<Play>\\\" -> \\\"Provide<Walk>\\\" [label=\\\"Walk\\\"]\\r\\r    \\\"Provide<Play>\\\" -> \\\"Provide<Kick>\\\" [label=\\\"Kick\\\"]\\r\\r    \\\"Provide<Walk>\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\", color=\\\"red\\\"]\\r    \\\"Provide<Kick>\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\", color=\\\"green\\\"]\\r\\r    \\\"Provide<LegIK>\\\" -> \\\"Provide<LeftLeg>\\\" [label=\\\"LeftLeg\\\"]\\r    \\\"Provide<LegIK>\\\" -> \\\"Provide<RightLeg>\\\" [label=\\\"RightLeg\\\"]\\r}\",\n    \"width\": \"370pt\",\n    \"height\": \"532\",\n    \"viewBox\": \"0 0 369.51 399.2\",\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    \\\"Root\\\" -> \\\"Provide<Play>\\\" [label=\\\" Play\\\"]\\n    \\\"Provide<Play>\\\" -> \\\"Provide<Walk>\\\" [label=\\\"Walk\\\"]\\n\\n    \\\"Provide<Play>\\\" -> \\\"Provide<Kick>\\\" [label=\\\"Kick\\\"]\\n\\n    \\\"Provide<Walk>\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\", color=\\\"red\\\"]\\n    \\\"Provide<Kick>\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\", color=\\\"green\\\"]\\n\\n    \\\"Provide<LegIK>\\\" -> \\\"Provide<LeftLeg>\\\" [label=\\\"LeftLeg\\\"]\\n    \\\"Provide<LegIK>\\\" -> \\\"Provide<RightLeg>\\\" [label=\\\"RightLeg\\\"]\\n}\"), mdx(\"g\", {\n    parentName: \"svg\",\n    \"className\": \"graph\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"#fff\",\n    \"stroke\": \"transparent\",\n    \"d\": \"M0 399.2V0h369.51v399.2H0z\"\n  }), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"177.07\",\n    \"cy\": \"-373.2\",\n    \"rx\": \"29.64\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"177.07\",\n    \"y\": \"-369\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Root\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"177.07\",\n    \"cy\": \"-284.4\",\n    \"rx\": \"69.27\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"177.07\",\n    \"y\": \"-280.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Play>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M177.07-355.05v42.53\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M180.57-312.51l-3.5 10-3.5-10h7z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"191.26\",\n    \"y\": \"-324.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Play\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"97.07\",\n    \"cy\": \"-195.6\",\n    \"rx\": \"72.76\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"97.07\",\n    \"y\": \"-191.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Walk>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M161.64-266.66c-11.95 12.96-28.68 31.12-42.12 45.7\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M121.79-218.27l-9.35 4.99 4.21-9.73 5.14 4.74z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"160.23\",\n    \"y\": \"-235.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Walk\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"259.07\",\n    \"cy\": \"-195.6\",\n    \"rx\": \"70.97\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"259.07\",\n    \"y\": \"-191.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Kick>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M192.88-266.66c12.36 13.08 29.72 31.46 43.55 46.1\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M238.98-222.96l4.32 9.68-9.41-4.87 5.09-4.81z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"239.67\",\n    \"y\": \"-235.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Kick\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"178.07\",\n    \"cy\": \"-106.8\",\n    \"rx\": \"77.33\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"178.07\",\n    \"y\": \"-102.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<LegIK>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"red\",\n    \"d\": \"M112.68-177.86c12.11 12.96 29.05 31.12 42.65 45.7\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"red\",\n    \"stroke\": \"red\",\n    \"d\": \"M158.23-134.18l4.27 9.7-9.39-4.93 5.12-4.77z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"163.33\",\n    \"y\": \"-147\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LegIK\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"green\",\n    \"d\": \"M243.45-177.86c-12.1 12.96-29.05 31.12-42.65 45.7\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"green\",\n    \"stroke\": \"green\",\n    \"d\": \"M203.02-129.41l-9.38 4.93 4.26-9.7 5.12 4.77z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"244.33\",\n    \"y\": \"-147\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LegIK\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"83.07\",\n    \"cy\": \"-18\",\n    \"rx\": \"83.13\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"83.07\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<LeftLeg>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M159.75-89.06c-14.46 13.2-34.8 31.79-50.9 46.51\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M111.07-39.85l-9.74 4.17 5.02-9.33 4.72 5.16z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"162.61\",\n    \"y\": \"-58.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LeftLeg\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"273.07\",\n    \"cy\": \"-18\",\n    \"rx\": \"88.39\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"273.07\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<RightLeg>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M196.38-89.06c14.46 13.2 34.8 31.79 50.91 46.51\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M249.78-45.01l5.03 9.33-9.75-4.17 4.72-5.16z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"261.51\",\n    \"y\": \"-58.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"RightLeg\"))))), mdx(\"figcaption\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-figcaption\"\n  }, \"Example of a Director graph\")), mdx(\"p\", null, \"The Root node represents a non-Provider reaction, e.g. an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"on<Startup>()\"), \" reaction. It emits a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Play\"), \" Task with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"emit<Task>(std::make_unique<Play>())\"), \".\"), mdx(\"p\", null, \"There is one Provider in this tree for the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Play\"), \" Task, which is the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Provide<Play>\"), \" node. It has two subtasks, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Walk\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Kick\"), \". These are both emitted from the Play Provider. The Kick is given a higher priority than the Walk.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"emit<Task>(std::make_unique<Walk>());    // 0 priority by default\\nemit<Task>(std::make_unique<Kick>(), 1); // higher priority number is higher priority\\n\")), mdx(\"p\", null, \"The Walk Provider has emitted a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task, but it is blocked because the Kick Provider has also emitted a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task. The Kick Provider has a higher priority, so it is the one that has an active \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task.\"), mdx(\"p\", null, \"The Walk Provider's subtask will become unblocked if the Kick Provider is stopped or the Kick Provider stops requesting the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task.\"), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LegIK\"), \" Task emits two subtasks, one for each leg. These in turn would emit subtasks for each servo, but this has been omitted in the graph for clarity.\"), mdx(\"p\", null, \"If the Kick Provider decides it no longer should Kick, such as if the ball is not in front of the robot, it might emit no Tasks. This will remove the LegIK Task from the Kick Provider, allowing the Walk Provider's LegIK Task to run.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"on<Provide<Kick>>().then([this] (const Kick& kick) {\\n    if (kick.ball_in_front) {\\n        emit<Task>(std::make_unique<LegIK>());\\n    }\\n});\\n\")), mdx(\"p\", null, \"The following graph represents the case where the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"if\"), \" statement does not run.\"), 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    \\\"Root\\\" -> \\\"Provide<Play>\\\" [label=\\\" Play\\\"]\\r    \\\"Provide<Play>\\\" -> \\\"Provide<Walk>\\\" [label=\\\"Walk\\\"]\\r\\r    \\\"Provide<Play>\\\" -> \\\"Provide<Kick>\\\" [label=\\\"Kick\\\"]\\r\\r    \\\"Provide<Walk>\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\", color=\\\"green\\\"]\\r\\r    \\\"Provide<LegIK>\\\" -> \\\"Provide<LeftLeg>\\\" [label=\\\"LeftLeg\\\"]\\r    \\\"Provide<LegIK>\\\" -> \\\"Provide<RightLeg>\\\" [label=\\\"RightLeg\\\"]\\r}\",\n    \"width\": \"419pt\",\n    \"height\": \"532\",\n    \"viewBox\": \"0 0 418.8 399.2\",\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    \\\"Root\\\" -> \\\"Provide<Play>\\\" [label=\\\" Play\\\"]\\n    \\\"Provide<Play>\\\" -> \\\"Provide<Walk>\\\" [label=\\\"Walk\\\"]\\n\\n    \\\"Provide<Play>\\\" -> \\\"Provide<Kick>\\\" [label=\\\"Kick\\\"]\\n\\n    \\\"Provide<Walk>\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\", color=\\\"green\\\"]\\n\\n    \\\"Provide<LegIK>\\\" -> \\\"Provide<LeftLeg>\\\" [label=\\\"LeftLeg\\\"]\\n    \\\"Provide<LegIK>\\\" -> \\\"Provide<RightLeg>\\\" [label=\\\"RightLeg\\\"]\\n}\"), mdx(\"g\", {\n    parentName: \"svg\",\n    \"className\": \"graph\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"#fff\",\n    \"stroke\": \"transparent\",\n    \"d\": \"M0 399.2V0h418.8v399.2H0z\"\n  }), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"259.07\",\n    \"cy\": \"-373.2\",\n    \"rx\": \"29.64\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"259.07\",\n    \"y\": \"-369\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Root\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"259.07\",\n    \"cy\": \"-284.4\",\n    \"rx\": \"69.27\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"259.07\",\n    \"y\": \"-280.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Play>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M259.07-355.05v42.53\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M262.57-312.51l-3.5 10-3.5-10h7z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"273.26\",\n    \"y\": \"-324.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Play\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"178.07\",\n    \"cy\": \"-195.6\",\n    \"rx\": \"72.76\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"178.07\",\n    \"y\": \"-191.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Walk>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M243.45-266.66c-12.1 12.96-29.05 31.12-42.65 45.7\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M203.02-218.21l-9.38 4.93 4.26-9.7 5.12 4.77z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"241.23\",\n    \"y\": \"-235.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Walk\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"340.07\",\n    \"cy\": \"-195.6\",\n    \"rx\": \"70.97\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"340.07\",\n    \"y\": \"-191.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Kick>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M274.68-266.66c12.11 12.96 29.05 31.12 42.65 45.7\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M320.23-222.98l4.27 9.7-9.39-4.93 5.12-4.77z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"320.67\",\n    \"y\": \"-235.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Kick\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"178.07\",\n    \"cy\": \"-106.8\",\n    \"rx\": \"77.33\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"178.07\",\n    \"y\": \"-102.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<LegIK>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"green\",\n    \"d\": \"M178.07-177.45v42.53\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"green\",\n    \"stroke\": \"green\",\n    \"d\": \"M181.57-134.91l-3.5 10-3.5-10h7z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"196.33\",\n    \"y\": \"-147\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LegIK\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"83.07\",\n    \"cy\": \"-18\",\n    \"rx\": \"83.13\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"83.07\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<LeftLeg>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M159.75-89.06c-14.46 13.2-34.8 31.79-50.9 46.51\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M111.07-39.85l-9.74 4.17 5.02-9.33 4.72 5.16z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"162.61\",\n    \"y\": \"-58.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LeftLeg\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"273.07\",\n    \"cy\": \"-18\",\n    \"rx\": \"88.39\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"273.07\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<RightLeg>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 395.2)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M196.38-89.06c14.46 13.2 34.8 31.79 50.91 46.51\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M249.78-45.01l5.03 9.33-9.75-4.17 4.72-5.16z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"261.51\",\n    \"y\": \"-58.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"RightLeg\"))))), mdx(\"figcaption\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-figcaption\"\n  }, \"The Kick Provider stops requesting a LegIK Task and the Walk takes over\")), mdx(\"p\", null, \"This is an instance where multiple instances of the same Task type are emitted. Another situation is where there are multiple Providers for the same Task.\"), mdx(\"p\", null, \"The following example will remove the Kick Provider, and add another Walk Provider. One Walk Provider will run when the robot needs to be precise but slow, such as when there are many obstacles nearby. The other Walk Provider will run when the robot can be less precise and faster.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-cpp\"\n  }, \"# Static walk implementation\\non<Provide<Walk>, When<Obstacles, std::greater_equal, Obstacles::MANY>>().then({});\\n\\n# ZMP walk implementation\\non<Provide<Walk>, When<Obstacles, std::less, Obstacles::MANY>>().then({});\\n\")), mdx(\"p\", null, \"In this instance, there will be a non-Provider reaction checking for the number of obstacles. If there are many obstacles, the Static Walk Provider will be active. If there are few obstacles, the ZMP Walk Provider will be active. The following graph represents the case where there are few obstacles.\"), 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    \\\"Root\\\" -> \\\"Provide<Play>\\\" [label=\\\" Play\\\"]\\r    \\\"Provide<Play>\\\" -> \\\"Provide<Walk> (ZMP)\\\" [label=\\\"Walk\\\"]\\r\\r    subgraph cluster_walk {\\r        label=\\\"Provider Group\\\"\\r        \\\"Provide<Walk> (ZMP)\\\" [color=\\\"green\\\"]\\r        \\\"Provide<Walk> (Static)\\\" [color=\\\"red\\\"]\\r    }\\r\\r    \\\"Provide<Walk> (ZMP)\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\"]\\r\\r    \\\"Provide<LegIK>\\\" -> \\\"Provide<LeftLeg>\\\" [label=\\\"LeftLeg\\\"]\\r    \\\"Provide<LegIK>\\\" -> \\\"Provide<RightLeg>\\\" [label=\\\"RightLeg\\\"]\\r}\",\n    \"width\": \"712\",\n    \"height\": \"422pt\",\n    \"viewBox\": \"0 0 534.45 422\",\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    \\\"Root\\\" -> \\\"Provide<Play>\\\" [label=\\\" Play\\\"]\\n    \\\"Provide<Play>\\\" -> \\\"Provide<Walk> (ZMP)\\\" [label=\\\"Walk\\\"]\\n\\n    subgraph cluster_walk {\\n        label=\\\"Provider Group\\\"\\n        \\\"Provide<Walk> (ZMP)\\\" [color=\\\"green\\\"]\\n        \\\"Provide<Walk> (Static)\\\" [color=\\\"red\\\"]\\n    }\\n\\n    \\\"Provide<Walk> (ZMP)\\\" -> \\\"Provide<LegIK>\\\" [label=\\\"LegIK\\\"]\\n\\n    \\\"Provide<LegIK>\\\" -> \\\"Provide<LeftLeg>\\\" [label=\\\"LeftLeg\\\"]\\n    \\\"Provide<LegIK>\\\" -> \\\"Provide<RightLeg>\\\" [label=\\\"RightLeg\\\"]\\n}\"), mdx(\"g\", {\n    parentName: \"svg\",\n    \"className\": \"graph\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"#fff\",\n    \"stroke\": \"transparent\",\n    \"d\": \"M0 422V0h534.45v422H0z\"\n  }), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"cluster\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M8-169.6v-76.8h445v76.8H8z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"230.5\",\n    \"y\": \"-229.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provider Group\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"343\",\n    \"cy\": \"-396\",\n    \"rx\": \"29.64\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"343\",\n    \"y\": \"-391.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Root\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"343\",\n    \"cy\": \"-307.2\",\n    \"rx\": \"69.27\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"343\",\n    \"y\": \"-303\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Play>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M343-377.85v42.53\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M346.5-335.31l-3.5 10-3.5-10h7z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"357.19\",\n    \"y\": \"-347.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Play\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"green\",\n    \"cx\": \"343\",\n    \"cy\": \"-195.6\",\n    \"rx\": \"101.65\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"343\",\n    \"y\": \"-191.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Walk> (ZMP)\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M343-289.07v65.22\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M346.5-223.6l-3.5 10-3.5-10h7z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"358.16\",\n    \"y\": \"-258.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Walk\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"343\",\n    \"cy\": \"-106.8\",\n    \"rx\": \"77.33\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"343\",\n    \"y\": \"-102.6\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<LegIK>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M343-177.45v42.53\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M346.5-134.91l-3.5 10-3.5-10h7z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"361.27\",\n    \"y\": \"-147\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LegIK\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"red\",\n    \"cx\": \"120\",\n    \"cy\": \"-195.6\",\n    \"rx\": \"103.93\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"120\",\n    \"y\": \"-191.4\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<Walk> (Static)\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"248\",\n    \"cy\": \"-18\",\n    \"rx\": \"83.13\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"248\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<LeftLeg>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M324.68-89.06c-14.45 13.2-34.8 31.79-50.9 46.51\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M276-39.85l-9.74 4.17 5.02-9.33 4.72 5.16z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"327.54\",\n    \"y\": \"-58.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"LeftLeg\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"node\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"ellipse\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"cx\": \"438\",\n    \"cy\": \"-18\",\n    \"rx\": \"88.39\",\n    \"ry\": \"18\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"438\",\n    \"y\": \"-13.8\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"Provide<RightLeg>\")), mdx(\"g\", {\n    parentName: \"g\",\n    \"className\": \"edge\",\n    \"transform\": \"translate(4 418)\"\n  }, mdx(\"path\", {\n    parentName: \"g\",\n    \"fill\": \"none\",\n    \"stroke\": \"#000\",\n    \"d\": \"M361.32-89.06c14.45 13.2 34.8 31.79 50.9 46.51\"\n  }), mdx(\"path\", {\n    parentName: \"g\",\n    \"stroke\": \"#000\",\n    \"d\": \"M414.72-45.01l5.02 9.33-9.74-4.17 4.72-5.16z\"\n  }), mdx(\"text\", {\n    parentName: \"g\",\n    \"textAnchor\": \"middle\",\n    \"x\": \"426.44\",\n    \"y\": \"-58.2\",\n    \"fontFamily\": \"Times,serif\",\n    \"fontSize\": \"14\"\n  }, \"RightLeg\"))))), mdx(\"figcaption\", {\n    parentName: \"figure\",\n    \"className\": \"remark-graphviz-figcaption\"\n  }, \"There are few obstacles, so the ZMP Walk Provider is active\")), mdx(\"p\", null, \"The two Walk Providers form a ProviderGroup. The Director will only allow one Provider from a ProviderGroup to be active at a time. The ZMP Provider was chosen because its When condition was true, and the Static Provider's was not.\"), mdx(\"h2\", {\n    \"id\": \"behaviours-layout\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#behaviours-layout\",\n    \"aria-label\": \"behaviours layout 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  }))), \"Behaviours Layout\"), mdx(\"p\", null, \"The Director algorithm and framework is used to implement behaviours in the NUbots codebase. These behaviours can be categorised into multiple layers. The Director does not use the concept of these layers, but they are used to help organise the codebase and make it easier for developers to conceptualise.\"), mdx(\"p\", null, \"There are many modules that exist outside of the behaviour system, such as localisation and vision. These modules are not considered behaviours, but they are used by behaviours to make decisions.\"), mdx(\"h3\", {\n    \"id\": \"purpose\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#purpose\",\n    \"aria-label\": \"purpose 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  }))), \"Purpose\"), mdx(\"p\", null, \"Purpose modules are the highest level modules and will show the \\\"big picture\\\" view of what is happening in the system.\\nThey live in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"modules/purpose\"), \" in the source code.\\nThey generally will describe the overall goals and purpose of the robot.\\nSome examples of purpose-level modules would be:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Striker: Combines strategies to walk to the ball and kick it to the opposing goal\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Defender: Combines strategies to intercept and defend incoming goals\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Goalie: Combines strategies for staying near the goal and preventing the opponent from scoring\")), mdx(\"h3\", {\n    \"id\": \"strategy\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#strategy\",\n    \"aria-label\": \"strategy 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  }))), \"Strategy\"), mdx(\"p\", null, \"Strategy modules make high level strategy decisions for the robot, to be used by the purpose modules to achieve their purpose.\\nThey live in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"modules/strategy\"), \" in the source code.\\nThese modules are the strategic elements that provide the \\\"what\\\" components rather than the \\\"how\\\" components.\\nThey will often combine information from multiple systems in order to decide what action to take.\\nSome examples of strategy level modules would be:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"WalkToBall: Tells the walk path planner to walk to the ball location\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"FallRecovery: Tells the falling relax planner and get up planner to recover from any falls\")), mdx(\"h3\", {\n    \"id\": \"planning\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#planning\",\n    \"aria-label\": \"planning 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  }))), \"Planning\"), mdx(\"p\", null, \"Planners are where the system address \\\"how\\\" the behaviour works.\\nThey live in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"modules/planning\"), \" in the source code.\\nPlanner modules are modules which use skills in order to achieve their goal.\\nThey are only interested in a single component of performing an action, such as walking a path or looking around.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"WalkPathPlanner: Determines walk velocity given a target position\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LookPlanner: Controls how the robot is looking for a specific object\")), mdx(\"h3\", {\n    \"id\": \"skill\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#skill\",\n    \"aria-label\": \"skill 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  }))), \"Skill\"), mdx(\"p\", null, \"Skills are the modules that perform the actions specified by the planners.\\nThey live in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"modules/skill\"), \" in the source code.\\nSome examples are\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Walk: Walks given a desired velocity from the walk path planner\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kick: Kicks the ball according to the desired direction from the kick planner\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Look: Moves the head to look in a particular location, decided by the look planner\")), mdx(\"h3\", {\n    \"id\": \"actuation\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#actuation\",\n    \"aria-label\": \"actuation 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  }))), \"Actuation\"), mdx(\"p\", null, \"The actuation layer is where the (real or simulated) hardware is controlled.\\nThese modules live in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"modules/actuation\"), \" in the source code.\\nThe end of the actuation layer involves emitting servo commands to be picked up by a platform module, such as HardwareIO or Webots modules.\\nModules in this layer include\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kinematics: Takes end effector positions and converts them into servo positions\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sequences: Takes a sequence of servo positions and emits them in order\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Groups: Takes a group of servos and emits them together, will only emit Done when all servos are done\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Servos: Takes a single servo and emits it, will only emit Done when the time the servo has to move is over\")), mdx(\"h2\", {\n    \"id\": \"references\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#references\",\n    \"aria-label\": \"references 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  }))), \"References\"), mdx(References, {\n    mdxType: \"References\"\n  }));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#providers","title":"Providers","items":[{"url":"#provider-groups","title":"Provider Groups"},{"url":"#provider-types","title":"Provider Types"},{"url":"#needs","title":"Needs"},{"url":"#when","title":"When"},{"url":"#causing","title":"Causing"}]},{"url":"#tasks","title":"Tasks","items":[{"url":"#root-level-tasks","title":"Root Level Tasks"},{"url":"#subtasks","title":"Subtasks"},{"url":"#priority","title":"Priority"},{"url":"#done-tasks","title":"Done Tasks"},{"url":"#continue-tasks","title":"Continue Tasks"},{"url":"#wait-tasks","title":"Wait Tasks"}]},{"url":"#data","title":"Data","items":[{"url":"#uses","title":"Uses"},{"url":"#run-reason","title":"Run Reason"}]},{"url":"#the-director-graph","title":"The Director Graph"},{"url":"#behaviours-layout","title":"Behaviours Layout","items":[{"url":"#purpose","title":"Purpose"},{"url":"#strategy","title":"Strategy"},{"url":"#planning","title":"Planning"},{"url":"#skill","title":"Skill"},{"url":"#actuation","title":"Actuation"}]},{"url":"#references","title":"References"}]},"frontmatter":{"section":"System","chapter":"Foundations","title":"Director","description":"Introduction to the Director and how to use it to build behaviours.","keywords":null,"slug":"/system/foundations/director","hidden":null},"childNUbookContributions":{"authors":[{"name":"Trent Houliston","username":"TrentHouliston"},{"name":"Ysobel Sims","username":"ysims"}],"lastCommit":{"date":"2025-01-29T03:23:24.000Z","hash":"350f57fe80e198bd3bea17c76b012ec820bf24cf"}}}},"pageContext":{"mdxPath":"src/book/02-system/01-foundations/07-director.mdx","id":"d09eeaf2-1676-5565-a387-1b5c6a5fcbf8","next":{"chapter":"Subsystems","title":"Input","description":"How inputs are handled in the NUbots codebase.","slug":"/system/subsystems/input","hidden":null},"previous":{"chapter":"Foundations","title":"Configuration and Script System","description":"The configuration and script system","slug":"/system/foundations/config-script","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":{"director2023":{"id":"director2023","title":"The Director: A Composable Behaviour System with Soft Transitions","citation":"Sims & Houliston, 2023","reference":"<span class=\"csl-right-inline\">Y. Sims and T. Houliston, <i>The Director: A Composable Behaviour System with Soft Transitions</i>. 2023.</span>"}},"hidden":null}},
    "staticQueryHashes": ["3715292327","445096115","466146812"]}