<!--
This file was generated by Spark. Do not edit it by hand.
-->
# BB

The DSL extension for describing robot properties and topologies.


## topology
Robot topology

### Nested DSLs
 * [link](#topology-link)
   * inertial
     * origin
     * inertia
   * visual
     * box
     * cylinder
     * sphere
     * capsule
     * mesh
     * material
       * color
       * texture
     * origin
   * collision
     * origin
     * box
     * cylinder
     * sphere
     * capsule
     * mesh
   * sensor
 * [joint](#topology-joint)
   * origin
   * axis
   * dynamics
   * limit
   * sensor
   * actuator





### topology.link
```elixir
link name
```


A kinematic link (ie solid body).


### Nested DSLs
 * [inertial](#topology-link-inertial)
   * origin
   * inertia
 * [visual](#topology-link-visual)
   * box
   * cylinder
   * sphere
   * capsule
   * mesh
   * material
     * color
     * texture
   * origin
 * [collision](#topology-link-collision)
   * origin
   * box
   * cylinder
   * sphere
   * capsule
   * mesh
 * [sensor](#topology-link-sensor)




### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-link-name){: #topology-link-name } | `atom` |  | The name of the link |



### topology.link.inertial


A link's mass, position of it's center of mass and it's central inertia properties


### Nested DSLs
 * [origin](#topology-link-inertial-origin)
 * [inertia](#topology-link-inertial-inertia)





### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`mass`](#topology-link-inertial-mass){: #topology-link-inertial-mass .spark-required} | `any` |  | The mass of the link |


### topology.link.inertial.origin


Specifies where the link's center of mass is located, relative to the link's reference frame






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`roll`](#topology-link-inertial-origin-roll){: #topology-link-inertial-origin-roll } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `x` axis |
| [`pitch`](#topology-link-inertial-origin-pitch){: #topology-link-inertial-origin-pitch } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `y` axis |
| [`yaw`](#topology-link-inertial-origin-yaw){: #topology-link-inertial-origin-yaw } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `z` axis |
| [`x`](#topology-link-inertial-origin-x){: #topology-link-inertial-origin-x } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `x` axis |
| [`y`](#topology-link-inertial-origin-y){: #topology-link-inertial-origin-y } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `y` axis |
| [`z`](#topology-link-inertial-origin-z){: #topology-link-inertial-origin-z } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `z` axis |





### Introspection

Target: `BB.Dsl.Origin`

### topology.link.inertial.inertia


How the link resists rotational motion.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`ixx`](#topology-link-inertial-inertia-ixx){: #topology-link-inertial-inertia-ixx .spark-required} | `any` |  | Resistance to rotation around the x-axis |
| [`iyy`](#topology-link-inertial-inertia-iyy){: #topology-link-inertial-inertia-iyy .spark-required} | `any` |  | Resistance to rotation around the y-axis |
| [`izz`](#topology-link-inertial-inertia-izz){: #topology-link-inertial-inertia-izz .spark-required} | `any` |  | Resistance to rotation around the z-axis |
| [`ixy`](#topology-link-inertial-inertia-ixy){: #topology-link-inertial-inertia-ixy .spark-required} | `any` |  | Coupling between the x and y axes |
| [`ixz`](#topology-link-inertial-inertia-ixz){: #topology-link-inertial-inertia-ixz .spark-required} | `any` |  | Coupling between the x and z axes |
| [`iyz`](#topology-link-inertial-inertia-iyz){: #topology-link-inertial-inertia-iyz .spark-required} | `any` |  | Coupling between the y and z axes |





### Introspection

Target: `BB.Dsl.Inertia`




### Introspection

Target: `BB.Dsl.Inertial`

### topology.link.visual


Visual attributes for a link.


### Nested DSLs
 * [box](#topology-link-visual-box)
 * [cylinder](#topology-link-visual-cylinder)
 * [sphere](#topology-link-visual-sphere)
 * [capsule](#topology-link-visual-capsule)
 * [mesh](#topology-link-visual-mesh)
 * [material](#topology-link-visual-material)
   * color
   * texture
 * [origin](#topology-link-visual-origin)






### topology.link.visual.box


Box geometry






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`x`](#topology-link-visual-box-x){: #topology-link-visual-box-x .spark-required} | `any` |  | The length of the X axis side |
| [`y`](#topology-link-visual-box-y){: #topology-link-visual-box-y .spark-required} | `any` |  | The length of the Y axis side |
| [`z`](#topology-link-visual-box-z){: #topology-link-visual-box-z .spark-required} | `any` |  | The length of the Z axis side |





### Introspection

Target: `BB.Dsl.Box`

### topology.link.visual.cylinder


A cylindrical geometry

The origin of the cylinder is the center.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`radius`](#topology-link-visual-cylinder-radius){: #topology-link-visual-cylinder-radius .spark-required} | `any` |  | The distance from the center to the circumference |
| [`height`](#topology-link-visual-cylinder-height){: #topology-link-visual-cylinder-height .spark-required} | `any` |  | The height of the cylinder |





### Introspection

Target: `BB.Dsl.Cylinder`

### topology.link.visual.sphere


A spherical geometry

The origin of the sphere is its center.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`radius`](#topology-link-visual-sphere-radius){: #topology-link-visual-sphere-radius .spark-required} | `any` |  | The distance from the center of the sphere to your edge |





### Introspection

Target: `BB.Dsl.Sphere`

### topology.link.visual.capsule


A capsule geometry (cylinder with hemispherical caps).

The origin of the capsule is the centre of the cylindrical portion.
The height is the distance between the centres of the hemispherical caps.
Total extent is height + 2 * radius.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`radius`](#topology-link-visual-capsule-radius){: #topology-link-visual-capsule-radius .spark-required} | `any` |  | The radius of the capsule (cylinder and hemispherical caps) |
| [`height`](#topology-link-visual-capsule-height){: #topology-link-visual-capsule-height .spark-required} | `any` |  | The height of the cylindrical portion (between cap centres) |





### Introspection

Target: `BB.Dsl.Capsule`

### topology.link.visual.mesh


A mesh object specified by a filename







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`filename`](#topology-link-visual-mesh-filename){: #topology-link-visual-mesh-filename .spark-required} | `String.t` |  | The path to the 3D model |
| [`scale`](#topology-link-visual-mesh-scale){: #topology-link-visual-mesh-scale } | `number` | `1` | A scale factor for the mest |





### Introspection

Target: `BB.Dsl.Mesh`

### topology.link.visual.material


The material of the visual element


### Nested DSLs
 * [color](#topology-link-visual-material-color)
 * [texture](#topology-link-visual-material-texture)





### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-link-visual-material-name){: #topology-link-visual-material-name } | `atom` |  | The name of the material |


### topology.link.visual.material.color


The color of the meterial







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`red`](#topology-link-visual-material-color-red){: #topology-link-visual-material-color-red .spark-required} | `any` |  | The red element of the color |
| [`green`](#topology-link-visual-material-color-green){: #topology-link-visual-material-color-green .spark-required} | `any` |  | The green element of the color |
| [`blue`](#topology-link-visual-material-color-blue){: #topology-link-visual-material-color-blue .spark-required} | `any` |  | The blue element of the color |
| [`alpha`](#topology-link-visual-material-color-alpha){: #topology-link-visual-material-color-alpha } | `any` | `1` | The alpha element of the color |





### Introspection

Target: `BB.Dsl.Color`

### topology.link.visual.material.texture


A texture to apply to the material







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`filename`](#topology-link-visual-material-texture-filename){: #topology-link-visual-material-texture-filename .spark-required} | `String.t` |  | The image file to use |





### Introspection

Target: `BB.Dsl.Texture`




### Introspection

Target: `BB.Dsl.Material`

### topology.link.visual.origin


The refrence frame of the visual element with respect to the reference frame of the link






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`roll`](#topology-link-visual-origin-roll){: #topology-link-visual-origin-roll } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `x` axis |
| [`pitch`](#topology-link-visual-origin-pitch){: #topology-link-visual-origin-pitch } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `y` axis |
| [`yaw`](#topology-link-visual-origin-yaw){: #topology-link-visual-origin-yaw } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `z` axis |
| [`x`](#topology-link-visual-origin-x){: #topology-link-visual-origin-x } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `x` axis |
| [`y`](#topology-link-visual-origin-y){: #topology-link-visual-origin-y } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `y` axis |
| [`z`](#topology-link-visual-origin-z){: #topology-link-visual-origin-z } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `z` axis |





### Introspection

Target: `BB.Dsl.Origin`




### Introspection

Target: `BB.Dsl.Visual`

### topology.link.collision


The collision properties of a link.


### Nested DSLs
 * [origin](#topology-link-collision-origin)
 * [box](#topology-link-collision-box)
 * [cylinder](#topology-link-collision-cylinder)
 * [sphere](#topology-link-collision-sphere)
 * [capsule](#topology-link-collision-capsule)
 * [mesh](#topology-link-collision-mesh)





### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-link-collision-name){: #topology-link-collision-name } | `atom` |  | An optional name of the link geometry |


### topology.link.collision.origin


The refrence frame of the collision element, relative to the reference frame of the link






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`roll`](#topology-link-collision-origin-roll){: #topology-link-collision-origin-roll } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `x` axis |
| [`pitch`](#topology-link-collision-origin-pitch){: #topology-link-collision-origin-pitch } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `y` axis |
| [`yaw`](#topology-link-collision-origin-yaw){: #topology-link-collision-origin-yaw } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `z` axis |
| [`x`](#topology-link-collision-origin-x){: #topology-link-collision-origin-x } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `x` axis |
| [`y`](#topology-link-collision-origin-y){: #topology-link-collision-origin-y } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `y` axis |
| [`z`](#topology-link-collision-origin-z){: #topology-link-collision-origin-z } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `z` axis |





### Introspection

Target: `BB.Dsl.Origin`

### topology.link.collision.box


Box geometry






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`x`](#topology-link-collision-box-x){: #topology-link-collision-box-x .spark-required} | `any` |  | The length of the X axis side |
| [`y`](#topology-link-collision-box-y){: #topology-link-collision-box-y .spark-required} | `any` |  | The length of the Y axis side |
| [`z`](#topology-link-collision-box-z){: #topology-link-collision-box-z .spark-required} | `any` |  | The length of the Z axis side |





### Introspection

Target: `BB.Dsl.Box`

### topology.link.collision.cylinder


A cylindrical geometry

The origin of the cylinder is the center.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`radius`](#topology-link-collision-cylinder-radius){: #topology-link-collision-cylinder-radius .spark-required} | `any` |  | The distance from the center to the circumference |
| [`height`](#topology-link-collision-cylinder-height){: #topology-link-collision-cylinder-height .spark-required} | `any` |  | The height of the cylinder |





### Introspection

Target: `BB.Dsl.Cylinder`

### topology.link.collision.sphere


A spherical geometry

The origin of the sphere is its center.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`radius`](#topology-link-collision-sphere-radius){: #topology-link-collision-sphere-radius .spark-required} | `any` |  | The distance from the center of the sphere to your edge |





### Introspection

Target: `BB.Dsl.Sphere`

### topology.link.collision.capsule


A capsule geometry (cylinder with hemispherical caps).

The origin of the capsule is the centre of the cylindrical portion.
The height is the distance between the centres of the hemispherical caps.
Total extent is height + 2 * radius.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`radius`](#topology-link-collision-capsule-radius){: #topology-link-collision-capsule-radius .spark-required} | `any` |  | The radius of the capsule (cylinder and hemispherical caps) |
| [`height`](#topology-link-collision-capsule-height){: #topology-link-collision-capsule-height .spark-required} | `any` |  | The height of the cylindrical portion (between cap centres) |





### Introspection

Target: `BB.Dsl.Capsule`

### topology.link.collision.mesh


A mesh object specified by a filename







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`filename`](#topology-link-collision-mesh-filename){: #topology-link-collision-mesh-filename .spark-required} | `String.t` |  | The path to the 3D model |
| [`scale`](#topology-link-collision-mesh-scale){: #topology-link-collision-mesh-scale } | `number` | `1` | A scale factor for the mest |





### Introspection

Target: `BB.Dsl.Mesh`




### Introspection

Target: `BB.Dsl.Collision`

### topology.link.sensor
```elixir
sensor name, child_spec
```


A sensor attached to the robot, a link, or a joint.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-link-sensor-name){: #topology-link-sensor-name .spark-required} | `atom` |  | A unique name for the sensor |
| [`child_spec`](#topology-link-sensor-child_spec){: #topology-link-sensor-child_spec .spark-required} | `module \| {module, keyword}` |  | The child specification for the sensor process. Either a module or `{module, keyword_list}` |






### Introspection

Target: `BB.Dsl.Sensor`




### Introspection

Target: `BB.Dsl.Link`

### topology.joint
```elixir
joint name
```


A kinematic joint between a parent link and a child link.


### Nested DSLs
 * [origin](#topology-joint-origin)
 * [axis](#topology-joint-axis)
 * [dynamics](#topology-joint-dynamics)
 * [limit](#topology-joint-limit)
 * [sensor](#topology-joint-sensor)
 * [actuator](#topology-joint-actuator)




### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-joint-name){: #topology-joint-name } | `atom` |  | A unique name for the joint |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`type`](#topology-joint-type){: #topology-joint-type } | `:revolute \| :continuous \| :prismatic \| :fixed \| :floating \| :planar` |  | Specifies the type of joint |


### topology.joint.origin


This is the transform from the parent link to the child link. The joint is located at the origin of the child link, as shown in the figure above







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`roll`](#topology-joint-origin-roll){: #topology-joint-origin-roll } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `x` axis |
| [`pitch`](#topology-joint-origin-pitch){: #topology-joint-origin-pitch } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `y` axis |
| [`yaw`](#topology-joint-origin-yaw){: #topology-joint-origin-yaw } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the `z` axis |
| [`x`](#topology-joint-origin-x){: #topology-joint-origin-x } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `x` axis |
| [`y`](#topology-joint-origin-y){: #topology-joint-origin-y } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `y` axis |
| [`z`](#topology-joint-origin-z){: #topology-joint-origin-z } | `any` | `Localize.Unit.new!(0, "meter")` | translation along the `z` axis |





### Introspection

Target: `BB.Dsl.Origin`

### topology.joint.axis


The joint axis specified in the joint frame. This is the axis of rotation for revolute joints, the axis of translation for prismatic joints, and the surface normal for planar joints. The axis is specified in the joint frame of reference. Fixed and floating joints do not use the axis field







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`roll`](#topology-joint-axis-roll){: #topology-joint-axis-roll } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the X axis |
| [`pitch`](#topology-joint-axis-pitch){: #topology-joint-axis-pitch } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the Y axis |
| [`yaw`](#topology-joint-axis-yaw){: #topology-joint-axis-yaw } | `any` | `Localize.Unit.new!(0, "degree")` | rotation around the Z axis |





### Introspection

Target: `BB.Dsl.Axis`

### topology.joint.dynamics


An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.







### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`damping`](#topology-joint-dynamics-damping){: #topology-joint-dynamics-damping } | `any` |  | The physical damping value of the joint |
| [`friction`](#topology-joint-dynamics-friction){: #topology-joint-dynamics-friction } | `any` |  | The physical static friction value of the joint |





### Introspection

Target: `BB.Dsl.Dynamics`

### topology.joint.limit


Limits applied to joint movement






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`effort`](#topology-joint-limit-effort){: #topology-joint-limit-effort .spark-required} | `any` |  | The maximum effort - both positive and negative - that can be commanded to the joint |
| [`velocity`](#topology-joint-limit-velocity){: #topology-joint-limit-velocity .spark-required} | `any` |  | Maximum velocity - both positive and negative - that can be commanded to the joint |
| [`lower`](#topology-joint-limit-lower){: #topology-joint-limit-lower } | `any` |  | The lower joint limit |
| [`upper`](#topology-joint-limit-upper){: #topology-joint-limit-upper } | `any` |  | The upper joint limit |
| [`acceleration`](#topology-joint-limit-acceleration){: #topology-joint-limit-acceleration } | `any` |  | Maximum acceleration - both positive and negative - that can be commanded to the joint. Optional; when omitted, motion timing assumes a rectangular velocity profile. |





### Introspection

Target: `BB.Dsl.Limit`

### topology.joint.sensor
```elixir
sensor name, child_spec
```


A sensor attached to the robot, a link, or a joint.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-joint-sensor-name){: #topology-joint-sensor-name .spark-required} | `atom` |  | A unique name for the sensor |
| [`child_spec`](#topology-joint-sensor-child_spec){: #topology-joint-sensor-child_spec .spark-required} | `module \| {module, keyword}` |  | The child specification for the sensor process. Either a module or `{module, keyword_list}` |






### Introspection

Target: `BB.Dsl.Sensor`

### topology.joint.actuator
```elixir
actuator name, child_spec
```


An actuator attached to a joint.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#topology-joint-actuator-name){: #topology-joint-actuator-name .spark-required} | `atom` |  | A unique name for the actuator |
| [`child_spec`](#topology-joint-actuator-child_spec){: #topology-joint-actuator-child_spec .spark-required} | `module \| {module, keyword}` |  | The child specification for the actuator process. Either a module or `{module, keyword_list}` |






### Introspection

Target: `BB.Dsl.Actuator`




### Introspection

Target: `BB.Dsl.Joint`




## settings
System-wide settings






### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#settings-name){: #settings-name } | `atom` |  | The name of the robot, defaults to the name of the defining module |
| [`registry_module`](#settings-registry_module){: #settings-registry_module } | `module` | `Registry` | The registry module to use |
| [`registry_options`](#settings-registry_options){: #settings-registry_options } | `keyword` |  | Options passed to Registry.start_link/1. Defaults to `[partitions: System.schedulers_online()]` at runtime. |
| [`supervisor_module`](#settings-supervisor_module){: #settings-supervisor_module } | `module` | `Supervisor` | The supervisor module to use |
| [`parameter_store`](#settings-parameter_store){: #settings-parameter_store } | `module \| {module, keyword}` |  | Optional parameter persistence backend. Use a module or `{Module, opts}` tuple. |
| [`topology_max_restarts`](#settings-topology_max_restarts){: #settings-topology_max_restarts } | `non_neg_integer` | `3` | Maximum restarts allowed in the topology supervisor before it gives up and the robot force-disarms. |
| [`topology_max_seconds`](#settings-topology_max_seconds){: #settings-topology_max_seconds } | `pos_integer` | `5` | Time window (in seconds) over which `topology_max_restarts` is counted. |






## sensors
Robot-level sensors

### Nested DSLs
 * [sensor](#sensors-sensor)





### sensors.sensor
```elixir
sensor name, child_spec
```


A sensor attached to the robot, a link, or a joint.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#sensors-sensor-name){: #sensors-sensor-name .spark-required} | `atom` |  | A unique name for the sensor |
| [`child_spec`](#sensors-sensor-child_spec){: #sensors-sensor-child_spec .spark-required} | `module \| {module, keyword}` |  | The child specification for the sensor process. Either a module or `{module, keyword_list}` |






### Introspection

Target: `BB.Dsl.Sensor`




## controllers
Robot-level controllers

### Nested DSLs
 * [controller](#controllers-controller)





### controllers.controller
```elixir
controller name, child_spec
```


A controller process at the robot level.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#controllers-controller-name){: #controllers-controller-name .spark-required} | `atom` |  | A unique name for the controller |
| [`child_spec`](#controllers-controller-child_spec){: #controllers-controller-child_spec .spark-required} | `module \| {module, keyword}` |  | The child specification for the controller process. Either a module or `{module, keyword_list}` |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`simulation`](#controllers-controller-simulation){: #controllers-controller-simulation } | `:omit \| :mock \| :start` | `:omit` | Behaviour in simulation mode: :omit (don't start), :mock (start no-op mock), :start (start real controller) |





### Introspection

Target: `BB.Dsl.Controller`




## commands
Robot commands with Goal → Feedback → Result semantics

### Nested DSLs
 * [category](#commands-category)
 * [command](#commands-command)
   * argument





### commands.category
```elixir
category name
```


A command category for grouping commands with concurrent execution limits.

Categories define logical groups of commands (e.g., `:motion`, `:sensing`,
`:auxiliary`) with configurable concurrency limits. Commands in different
categories can run concurrently, while commands in the same category are
limited to the category's `concurrency_limit`.






### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#commands-category-name){: #commands-category-name .spark-required} | `atom` |  | A unique name for the category |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`doc`](#commands-category-doc){: #commands-category-doc } | `String.t` |  | Documentation describing this category |
| [`concurrency_limit`](#commands-category-concurrency_limit){: #commands-category-concurrency_limit } | `pos_integer` | `1` | Maximum number of commands in this category that can run concurrently |





### Introspection

Target: `BB.Dsl.Category`

### commands.command
```elixir
command name
```


A command that can be executed on the robot.

Commands follow the Goal → Feedback → Result pattern and integrate with
the robot's state machine to control when they can run.


### Nested DSLs
 * [argument](#commands-command-argument)




### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#commands-command-name){: #commands-command-name .spark-required} | `atom` |  | A unique name for the command |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`handler`](#commands-command-handler){: #commands-command-handler .spark-required} | `module \| {module, keyword}` |  | The handler module implementing the `BB.Command` behaviour. Either a module or `{module, keyword_list}` for parameterised options |
| [`timeout`](#commands-command-timeout){: #commands-command-timeout } | `pos_integer \| :infinity` | `:infinity` | Timeout for command execution in milliseconds |
| [`allowed_states`](#commands-command-allowed_states){: #commands-command-allowed_states } | `atom \| list(atom)` | `[:idle]` | Robot states in which this command can run. Use `:*` for all states (except `:disarmed`). Use `:disarmed` explicitly if the command should run when disarmed. |
| [`category`](#commands-command-category){: #commands-command-category } | `atom` | `:default` | The command category for concurrency control. Commands in the same category are limited by that category's concurrency_limit. |
| [`cancel`](#commands-command-cancel){: #commands-command-cancel } | `atom \| list(atom)` | `[]` | Categories of commands this command can cancel when starting. Use `:*` to cancel all running commands, or a list of specific categories. Empty list (default) means the command will error if its category is at capacity. |


### commands.command.argument
```elixir
argument name, type
```


An argument for the command.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#commands-command-argument-name){: #commands-command-argument-name .spark-required} | `atom` |  | A unique name for the argument |
| [`type`](#commands-command-argument-type){: #commands-command-argument-type .spark-required} | `any` |  | The type of the argument |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`required`](#commands-command-argument-required){: #commands-command-argument-required } | `boolean` | `false` | Whether this argument is required |
| [`default`](#commands-command-argument-default){: #commands-command-argument-default } | `any` |  | Default value if not provided |
| [`doc`](#commands-command-argument-doc){: #commands-command-argument-doc } | `String.t` |  | Documentation for the argument |





### Introspection

Target: `BB.Dsl.Command.Argument`




### Introspection

Target: `BB.Dsl.Command`




## parameters
Runtime-adjustable parameters for the robot.

Parameters provide a way to configure robot behaviour at runtime without
recompilation. They support validation, change notifications via PubSub,
and optional persistence.

#### Example

parameters do
group :motion do
param :max_linear_speed, type: :float, default: 1.0,
min: 0.0, max: 10.0, doc: "Max velocity in m/s"
param :max_angular_speed, type: :float, default: 0.5
end

group :safety do
param :collision_distance, type: :float, default: 0.3
end
end


### Nested DSLs
 * [group](#parameters-group)
   * param
 * [param](#parameters-param)
 * [bridge](#parameters-bridge)





### parameters.group
```elixir
group name
```


A group of runtime-adjustable parameters.

### Nested DSLs
 * [param](#parameters-group-param)




### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#parameters-group-name){: #parameters-group-name .spark-required} | `atom` |  | A unique name for the parameter group |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`doc`](#parameters-group-doc){: #parameters-group-doc } | `String.t` |  | Documentation for the parameter group |


### parameters.group.param
```elixir
param name
```


A runtime-adjustable parameter.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#parameters-group-param-name){: #parameters-group-param-name .spark-required} | `atom` |  | A unique name for the parameter |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`type`](#parameters-group-param-type){: #parameters-group-param-type .spark-required} | `any` |  | The parameter value type (:float, :integer, :boolean, :string, :atom, or {:unit, unit_type}) |
| [`default`](#parameters-group-param-default){: #parameters-group-param-default } | `any` |  | Default value for the parameter |
| [`min`](#parameters-group-param-min){: #parameters-group-param-min } | `number` |  | Minimum value for numeric parameters |
| [`max`](#parameters-group-param-max){: #parameters-group-param-max } | `number` |  | Maximum value for numeric parameters |
| [`doc`](#parameters-group-param-doc){: #parameters-group-param-doc } | `String.t` |  | Documentation for the parameter |





### Introspection

Target: `BB.Dsl.Param`




### Introspection

Target: `BB.Dsl.ParamGroup`

### parameters.param
```elixir
param name
```


A runtime-adjustable parameter.





### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#parameters-param-name){: #parameters-param-name .spark-required} | `atom` |  | A unique name for the parameter |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`type`](#parameters-param-type){: #parameters-param-type .spark-required} | `any` |  | The parameter value type (:float, :integer, :boolean, :string, :atom, or {:unit, unit_type}) |
| [`default`](#parameters-param-default){: #parameters-param-default } | `any` |  | Default value for the parameter |
| [`min`](#parameters-param-min){: #parameters-param-min } | `number` |  | Minimum value for numeric parameters |
| [`max`](#parameters-param-max){: #parameters-param-max } | `number` |  | Maximum value for numeric parameters |
| [`doc`](#parameters-param-doc){: #parameters-param-doc } | `String.t` |  | Documentation for the parameter |





### Introspection

Target: `BB.Dsl.Param`

### parameters.bridge
```elixir
bridge name, child_spec
```


A parameter protocol bridge for remote access.

Bridges expose robot parameters to remote clients (GCS, web UI, etc.)
and receive parameter updates from them. They implement `BB.Bridge`.

#### Example

parameters do
bridge :mavlink, {BBMavLink.ParameterBridge, conn: "/dev/ttyACM0"}
bridge :phoenix, {BBPhoenix.ParameterBridge, url: "ws://gcs.local/socket"}
end






### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#parameters-bridge-name){: #parameters-bridge-name .spark-required} | `atom` |  | A unique name for the bridge |
| [`child_spec`](#parameters-bridge-child_spec){: #parameters-bridge-child_spec .spark-required} | `module \| {module, keyword}` |  | The child specification for the bridge process. Either a module or `{module, keyword_list}` |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`simulation`](#parameters-bridge-simulation){: #parameters-bridge-simulation } | `:omit \| :mock \| :start` | `:omit` | Behaviour in simulation mode: :omit (don't start), :mock (start no-op mock), :start (start real bridge) |





### Introspection

Target: `BB.Dsl.Bridge`




## states
Custom operational states for the robot.

The built-in `:idle` state is always available. Define additional states
here and use commands to transition between them. Commands can specify
which states they're allowed to run in via `allowed_states`.


### Nested DSLs
 * [state](#states-state)





### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`initial_state`](#states-initial_state){: #states-initial_state } | `atom` | `:idle` | The initial operational state when the robot starts |



### states.state
```elixir
state name
```


A custom operational state for the robot.

States define the operational context the robot can be in. Commands specify
which states they can run in via `allowed_states`, and can transition to new
states via `next_state:` in their result.






### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`name`](#states-state-name){: #states-state-name .spark-required} | `atom` |  | A unique name for the state |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`doc`](#states-state-doc){: #states-state-doc } | `String.t` |  | Documentation describing this state |





### Introspection

Target: `BB.Dsl.State`





<style type="text/css">.spark-required::after { content: "*"; color: red !important; }</style>
