How arm-only humanoid control differs from a fixed arm
A bolted robot arm has a fixed base. Unitree G1 has a body that must stay balanced. If arm planning moves the center of mass too aggressively, the low-level locomotion controller may be forced beyond its stable region. Arm-only does not mean ignoring the whole body; it means another controller stabilizes the legs and waist while cuRobo plans safe arm targets.
1. Choose the joint subset
Split joints into groups:
locked_joints:
- left_hip_pitch_joint
- left_knee_joint
- right_hip_pitch_joint
- right_knee_joint
- waist_yaw_joint
planned_joints:
- left_shoulder_pitch_joint
- left_shoulder_roll_joint
- left_shoulder_yaw_joint
- left_elbow_joint
- left_wrist_roll_joint
- left_wrist_pitch_joint
- left_wrist_yaw_joint
Keep locked_joints at the current posture or a nominal posture. Current open issue #668 requests a per-call lock_joints override for a shared multi-arm MotionPlanner; this matters for G1 because different tasks may lock legs and waist differently. Until that exists, use explicit planner configs per mode instead of mutating one shared planner.
2. Tool frame for the wrist
G1 arm tasks usually target the wrist or palm, not the elbow. Check:
left_wrist_yaw_linkfor wrist orientation;- a custom palm/gripper frame if an end-effector is attached;
- a versioned fixed transform from wrist to TCP.
3. Safe workspace
Start with a small workspace:
| Region | Recommendation |
|---|---|
| in front of chest | safest for testing |
| shoulder height | limit roll/yaw |
| far in front | can pull COM |
| behind the back | forbid in arm-only mode |
Do not allow the planner to stretch the arm far away from the torso unless the locomotion controller is aware of the task.
4. Command gate
Before sending targets:
if max_abs_delta(q_target - q_current) > delta_limit:
reject("joint jump")
if estimated_hand_distance_from_torso > reach_limit:
reject("reach limit")
if base_state.pitch_abs > pitch_limit:
reject("base unstable")
The arm-only bridge should subscribe to base IMU/state. If the robot is leaning or stepping, slow down or reject arm targets.
5. Test sequence
- Replay in simulation with legs locked.
- Hardware gravity compensation, no object.
- Move the wrist inside a small 20 cm box.
- Add self-collision checks against the torso.
- Try a light object with low speed limits.
Conclusion
cuRobo is useful for G1 arm-only planning, but the balance controller remains an external constraint. Do not send large arm trajectories while the base is unstable. Next we extend this to whole-body retargeting with a floating base and multi-tool-frame IK/MPC.

