A 2-DOF arm on a planar base, for solving chains that contain a multi-DoF joint.
Structure:
- odom
- base (planar, Z surface normal) — three degrees of freedom
- base_link
- shoulder_joint (revolute, Z-axis)
- link1
- elbow_joint (revolute, Z-axis, 0.25m out)
- link2
- tip_joint (fixed, 0.25m offset)
- tip
- tip_joint (fixed, 0.25m offset)
- link2
- elbow_joint (revolute, Z-axis, 0.25m out)
- link1
- shoulder_joint (revolute, Z-axis)
- base_link
- base (planar, Z surface normal) — three degrees of freedom
The arm alone reaches 0.5m from the base, so a target further out is only reachable by driving the base as well — which is what makes this a test of the planar joint rather than of the arm. Two revolute joints rather than one, so the arm's own workspace is a disc rather than a circle and a chain scoped below the base is still a solvable problem.
Summary
Functions
Returns a child specification for starting this robot under a supervisor.
Returns the optimised robot representation.
Starts the robot's supervision tree.
Functions
@spec child_spec(Keyword.t()) :: Supervisor.child_spec()
Returns a child specification for starting this robot under a supervisor.
@spec robot() :: BB.Robot.t()
Returns the optimised robot representation.
This struct is built at compile-time from the DSL definition and contains:
- All physical values converted to SI base units (floats)
- Flat maps for O(1) lookup of links, joints, sensors, and actuators
- Pre-computed topology metadata for efficient traversal
Examples
robot = Elixir.BB.IK.TestRobots.PlanarBaseArm.robot()
{:ok, link} = BB.Robot.get_link(robot, :base_link)
{:ok, joint} = BB.Robot.get_joint(robot, :shoulder)
@spec start_link(Keyword.t()) :: Supervisor.on_start()
Starts the robot's supervision tree.
Options
All options are passed through to sensor and actuator child processes.