- Upstream hardware + C++ reference: enactic/openarm_can
- Robot model: enactic/openarm_description
- How to integrate any new arm: adding_a_custom_arm.md
Architecture
left (default can1) and bus right
(default can0) are commanded together in one synchronized tick per control
cycle. The command vector order is left_arm/joint1..7, right_arm/joint1..7,
left_arm/gripper, right_arm/gripper; gripper joints are normalized
(0.0 closed, 1.0 open).
Per arm, shoulder to wrist (send ids 0x01..0x07, feedback send | 0x10):
2x DM8009, 2x DM4340, 3x DM4310, plus a DM4310 gripper at 0x08.
Gravity compensation and planning use the official bimanual OpenArm v2.0
Xacro. dimOS pins the description repository to an immutable commit and checks
it out lazily through the robot asset cache. Gravity compensation locks the
finger joints and preflights the remaining 14 joints against the declared arm
order before enabling the motors.
Planning treats the two arms as one robot with left_manipulator and
right_manipulator planning groups because collision exclusions cannot span
robots.
Bring-up
can0/can1 in USB enumeration order. If the arms come up
swapped, exchange the two explicit CLI values. Supplying only one interface is
rejected so physical operation can never depend on USB/CAN enumeration defaults.
Blueprints
Both blueprints use the in-memory whole-body adapter by default. Passing
both
--left-can-port and --right-can-port selects the physical adapter.
