GIM6010-8 CAN

Canbus

The 12 GIM6010-8 motors on two CAN buses: frame protocol, node-ID mapping, datasheet, and bring-up

LOADING LIMIT

The 12 GIM6010-8 motors are driven over two CAN buses, can0 (front legs) and can1 (rear legs), at 1 Mbps. This page covers the low-level CAN bus: the GIM6010-8 frame protocol, the node-ID mapping, the motor datasheet, and hardware bring-up. For the higher-level locomotion contract, gait, safety, and operator driving, see the Locomotion page.

GIM6010-8 CAN Mapping

Source: steady-win.txt, rev 0.9.

Physical layer

ItemValue
Baud rate1 Mbps (odrv0 can.config.baud_rate)
FrameStandard, 11-bit ID, 8-byte data
CAN ID(node_id << 5) | cmd_id
Payload encodingIEEE-754 float32, little-endian (e.g. 10.0 → 00 00 20 41)
Direction bitsNone, direction implicit in cmd_id
Host socket APIRobot (L4T/Tegra kernel): socket(AF_CAN, SOCK_RAW, CAN_RAW=1), bind(("can0",)), the L4T headers number PF_CAN protocols from 1, unlike stock Linux (CAN_RAW=0, bind((ifindex, 0))). locomotion_harness/real_can.py probes both, so the same package works on the robot and on standard Linux (vcan).

Command table

CMDNameDirPayload
0x001HeartbeatM→HAxis_Error, Axis_State, Motor_Flag, Encoder_Flag, Controller_Flag (periodic, default 100 ms)
0x002StopH→MN/A (stop axis)
0x003Get_ErrorM→HError_Type
0x004RxSdoM→HN/A
0x005TxSdoM→HN/A
0x006Set_Axis_Node_IDH→MAxis_Node_ID
0x007Set_Axis_StateH→MAxis_Requested_State (8 = closed-loop control)
0x009Get_Encoder_EstimatesM→HPos_Estimate, Or_Estimate (periodic, default 10 ms)
0x00BSet_Controller_ModeH→MControl_Mode, Input_Mode
0x00CSet_Input_PosH→MInput_Pos, Well_FF (vel FF), Torque_FF
0x00DSet_Input_VelH→MInput_Vel, Torque_FF
0x00ESet_Input_TorqueH→MInput_Torque
0x00FSet_LimitsH→MVelocity_Limit, Current_Limit
0x010Start_AnticoggingH→MN/A
0x011Set_Traj_Vel_LimitH→MTraj_Vel_Limit
0x012Set_Traj_Accel_LimitsH→MAccel, Decel
0x013Set_Traj_InertiaH↔MTraj_Inertia
0x014Get_IqM→HIq_Setpoint, Iq_Measured
0x015Get_Sensorless_EstimatesM→HPos_Estimate, Or_Estimate
0x016RebootH→MN/A
0x017Get_Bus_Voltage_CurrentM→HBus_Voltage, Bus_Current
0x018Clear_ErrorsH→MN/A
0x019Set_Linear_CountH→MLinear_Count
0x01ASet_Pos_GainH→MPos_Gain
0x01BSet_Vel_GainsH→MVel_Gain, Vel_Integrator_Gain
0x01CGet_TorquesM→HTorque_Setpoint, Torque
0x01DGet_PowersM→HElectrical_Power, Mechanical_Power
0x01EDisable_CanH→MN/A
0x01FSave_ConfigurationH→MN/A

Drive sequences

Velocity control (alternative):

(node<<5|0x00B)  [mode=2, input_mode=2]     # velocity control, velocity ramp input
(node<<5|0x007)  [axis_state=8]             # enter closed-loop
(node<<5|0x00D)  [target_vel, torque_ff=0]  # per control tick

Position control (default, production path):

(node<<5|0x00B)  [mode=3, input_mode=3]     # position control, filtered position input
(node<<5|0x007)  [axis_state=8]
(node<<5|0x00C)  [target_pos, vel_ff, torque_ff]

Torque control (e-stop / limp): 0x00E with 0.0, or plain 0x002 Stop.

Periodic messages

Enable/disable and set rates via ODrive config. Out-of-box defaults: heartbeat 100 ms, encoder 10 ms. Contract requirements: heartbeat 100 ms (keep), encoder 10 ms (keep), iq_rate_ms=50 ms (enable, for current monitoring), bus_vi_rate_ms=100 ms (enable, for battery voltage monitoring).

What CHAMP does per control tick (200 Hz)

  1. Take the current velocity command and compute the 12 joint position targets.
  2. TX Set_Input_Pos (0x00C) per motor: position target from the gait + IK loop, vel_ff / torque_ff optional.
  3. RX periodic Heartbeat / Encoder / Get_Iq / Bus_VI frames, update motor states.
  4. Publish /joint_states (positions from encoder feedback, velocities setpoints, effort = Iq_measured).
  5. Publish /foot_contacts (see Foot-Contact Inference).
  6. Run the safety checks (see the Safety Contract) on every tick (do not wait for timer).
  7. Log all TX/RX frames to the CAN capture file (see CAN capture).

12-Motor Node-ID Table

Joint naming (verified in limitx_limit_description/urdf/leg.xacro + limitx_limit_sim/config/joints/joints.yaml): {leg}_{hip,upper_leg,lower_leg}_joint with legs lf, rf, lh, rh. Node IDs follow the wiring spec (limitx-wiring.drawio): joint_id = 1 + 3×leg + joint(0–2), legs FL=0, FR=1, RL=2, RR=3. CAN channel is the configured default split (front legs → can0, rear legs → can1), verify against the physical wiring on first power-up; the bridge node takes the split as parameters (front_nodes/rear_nodes) and broadcasts any unmapped node on both buses.

#LegJoint (ROS name)node_idCAN channelPolarity
1Left Frontlf_hip_joint1can0N/A
2Left Frontlf_upper_leg_joint2can0N/A
3Left Frontlf_lower_leg_joint3can0N/A
4Right Frontrf_hip_joint4can0N/A
5Right Frontrf_upper_leg_joint5can0N/A
6Right Frontrf_lower_leg_joint6can0N/A
7Left Rearlh_hip_joint7can1N/A
8Left Rearlh_upper_leg_joint8can1N/A
9Left Rearlh_lower_leg_joint9can1N/A
10Right Rearrh_hip_joint10can1N/A
11Right Rearrh_upper_leg_joint11can1N/A
12Right Rearrh_lower_leg_joint12can1N/A

Polarity is assigned and verified on first power-up (a commanded step must move the joint the expected way); the bridge records it in the CAN capture for reference.

GIM6010-8 Datasheet

ParamValue
Rated current10.5 A
Locked-rotor current25 A
Rated torque5 Nm
Max speed120 rpm
InterfaceCAN bus (1 Mbps, see CAN Mapping)
Control modesposition / velocity / torque (see Drive sequences)
Config methodUSB + ODrive per motor (no over-CAN method found)

Implication: At 120 rpm on the lower-leg joint, peak foot-tip speed is modest. Sustained 1.0 m/s body speed is likely beyond comfortable joint speeds (see Speed Cap). The 25 A locked-rotor current is well above the 10.5 A rated current, so stall protection (see Motor-level fault handling) is required.

Hardware Bring-up

  1. Read live node IDs off the bus (preferred): parse GIM6010-8 heartbeat frame 0x001 to extract the node ID. Do this for both can0 and can1 to confirm which CAN bus is front and which is rear.
  2. For any motor with no readable ID: configure it via USB + ODrive (see Datasheet). Hip joints are hard to reach, plan physical access before scheduling.
  3. Confirm CAN split (can0 = front / can1 = rear) and record the final Node-ID table.
  4. Verify CAN-bus mode is enabled on all 12 motors (not USB/ODrive mode) before CHAMP goes live.
  5. Only then: CHAMP live test with CAN capture logging (see CAN capture).