HumansXDocumentation Center 日本語Website ↗

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.

BusInterfaceBody partMotors
0CANFD_0Waist & neck5
1CANFD_1Left leg6
2CANFD_2Right leg6
3CANFD_3Left arm7
4CANFD_4Right arm7

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 indexJoint nameCAN busCAN ID
0waist_y_joint01
1waist_x_joint02
2waist_z_joint03
3l_hip_y_joint11
4l_hip_x_joint12
5l_hip_z_joint13
6l_knee_y_joint14
7l_ankle_y_joint15
8l_ankle_x_joint16
9r_hip_y_joint21
10r_hip_x_joint22
11r_hip_z_joint23
12r_knee_y_joint24
13r_ankle_y_joint25
14r_ankle_x_joint26
15l_shoulder_y_joint31
16l_shoulder_x_joint32
17l_shoulder_z_joint33
18l_elbow_y_joint34
19l_wrist_x_joint35
20l_wrist_y_joint36
21l_wrist_z_joint37
22r_shoulder_y_joint41
23r_shoulder_x_joint42
24r_shoulder_z_joint43
25r_elbow_y_joint44
26r_wrist_x_joint45
27r_wrist_y_joint46
28r_wrist_z_joint47
29neck_z_joint04
30neck_y_joint05

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 ~/.bashrc to 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.