Control System Architecture
The robot uses a full-stack open architecture:
- CAN FD-based motor control and debugging interfaces
- MuJoCo simulation environments and robot resources such as URDF / XML
- ROS 2 hardware management nodes that deploy control policies to simulation and hardware alike
- Example code for reinforcement-learning motion-control training
Software structure
Control policy (e.g. reinforcement learning)
ROS 2 nodes (hardware management: motors / PCIe)
User-defined middleware (optional)
Simulator (MuJoCo)
Robot hardware
Motors: CAN FD / MIT control, sensors
CAN bus layout
The 31 joint motors are split across five CAN FD buses, one per body part.
| Bus | Interface | Body part | Motors |
|---|---|---|---|
| 0 | CANFD_0 | Waist & neck | 5 |
| 1 | CANFD_1 | Left leg | 6 |
| 2 | CANFD_2 | Right leg | 6 |
| 3 | CANFD_3 | Left arm | 7 |
| 4 | CANFD_4 | Right arm | 7 |
Joint index and CAN ID
- The joint index is the position in the control program's joint / motor array, numbered across the whole body from 0.
- The CAN ID is the motor's address on its bus, numbered from 1 within each bus.
| Joint index | Joint name | CAN bus | CAN ID |
|---|---|---|---|
| 0 | waist_y_joint | 0 | 1 |
| 1 | waist_x_joint | 0 | 2 |
| 2 | waist_z_joint | 0 | 3 |
| 3 | l_hip_y_joint | 1 | 1 |
| 4 | l_hip_x_joint | 1 | 2 |
| 5 | l_hip_z_joint | 1 | 3 |
| 6 | l_knee_y_joint | 1 | 4 |
| 7 | l_ankle_y_joint | 1 | 5 |
| 8 | l_ankle_x_joint | 1 | 6 |
| 9 | r_hip_y_joint | 2 | 1 |
| 10 | r_hip_x_joint | 2 | 2 |
| 11 | r_hip_z_joint | 2 | 3 |
| 12 | r_knee_y_joint | 2 | 4 |
| 13 | r_ankle_y_joint | 2 | 5 |
| 14 | r_ankle_x_joint | 2 | 6 |
| 15 | l_shoulder_y_joint | 3 | 1 |
| 16 | l_shoulder_x_joint | 3 | 2 |
| 17 | l_shoulder_z_joint | 3 | 3 |
| 18 | l_elbow_y_joint | 3 | 4 |
| 19 | l_wrist_x_joint | 3 | 5 |
| 20 | l_wrist_y_joint | 3 | 6 |
| 21 | l_wrist_z_joint | 3 | 7 |
| 22 | r_shoulder_y_joint | 4 | 1 |
| 23 | r_shoulder_x_joint | 4 | 2 |
| 24 | r_shoulder_z_joint | 4 | 3 |
| 25 | r_elbow_y_joint | 4 | 4 |
| 26 | r_wrist_x_joint | 4 | 5 |
| 27 | r_wrist_y_joint | 4 | 6 |
| 28 | r_wrist_z_joint | 4 | 7 |
| 29 | neck_z_joint | 0 | 4 |
| 30 | neck_y_joint | 0 | 5 |
ROS 2 Domain ID
The control system runs on ROS 2 (DDS). Nodes with the same Domain ID can communicate; different Domain IDs are isolated. With several robots or debugging PCs on one network, give each robot a unique Domain ID.
- Gamepad start: ROS_DOMAIN_ID = generation × 10 + serial number. Elf3 is generation 3, so 30 + serial (e.g. elf3-15 → 45).
- App start: ROS_DOMAIN_ID is fixed at 22.
- Set it with
export ROS_DOMAIN_ID=<value>; add it to~/.bashrcto apply at every boot. - Recommended range is 0–101. Set the development PC to the same value and restart the relevant ROS 2 nodes after a change.
Documentation