Hi,
I'm trying to implement a simple manipulation scenario on a Unitree G1 29DoF.
The goal is very simple:
Robot is already in Regular Motion Mode (R1+Y).
Move both arms into a fixed pre-grasp pose.
Hold the pose.
Walk using the standard remote controller.
Legs remain under the locomotion controller while the arms are controlled through rt/arm_sdk.
However, I have not been able to obtain stable behavior.
Running Mode experiments
Originally I implemented everything in Running.
Using rt/lowcmd I controlled:
both arms,
and later the waist joints.
Initial problem
When raising both arms into a forward pre-grasp pose (weight = 1.0), the robot consistently leaned forward, even while standing.
Reducing the arm weight (for example to 0.7–0.8) reduced the problem but did not eliminate it.
Waist compensation
I then added a small negative WaistPitch command.
This immediately improved stability.
Later I also initialized WaistYaw and WaistRoll to their neutral offsets.
Results:
dual-arm motions became stable,
forward leaning disappeared,
one-arm manipulation also became significantly more stable.
Unfortunately, Running Mode disables the standard locomotion controller, so this is not suitable for walking.
Motion Mode experiments
I then switched to the officially recommended workflow.
Robot startup:
Power on
Motion Mode (R1+Y)
Walking performed only with the standard remote controller
Arm control through rt/arm_sdk
I tried the workflow recommended in the documentation:
read current joint positions,
gradually ramp motor_cmd[29].q (weight),
move only upper-body joints,
never publish leg commands,
release weight back to zero on exit.
Tested configurations
Configuration 1
Arms only
weight = 0.8
Result:
The arms moved correctly into the desired pose.
When I started walking with the remote controller, the robot became unstable.
Typical behavior:
side stepping,
torso oscillations,
balance corrections,
arms not remaining stable.
Configuration 2
Same setup but
weight = 1.0
Result:
Even worse.
The locomotion controller appeared to fight against the arm controller.
Configuration 3
Official recommendation
Only joints:
15..28
Weight:
29
No waist control.
Result:
No improvement.
Configuration 4
Based on my previous Running Mode experience
I also tried including
WaistYaw
WaistRoll
WaistPitch
through rt/arm_sdk.
WaistPitch used a small negative offset while Yaw/Roll remained at their measured home values.
Standing stability improved.
Walking behavior is currently still under evaluation.
Questions
Is there an officially supported example of a G1 walking in Motion Mode while continuously holding a custom arm pose?
Should waist joints (12–14) be commanded together with the arms on the 29DoF G1, or should they always remain under the locomotion controller?
Does the locomotion controller internally compensate for the change in center of mass when motor_cmd[29].q = 1.0, or is the application expected to provide waist compensation?
Are there recommended stiffness (kp/kd) values specifically intended for walking while holding a fixed manipulation pose?
Is there any internal synchronization mechanism between Motion Mode and rt/arm_sdk that is not exposed through the public SDK?
Additional information
Robot:
Unitree G1
29 DoF
Control:
Motion Mode (R1+Y)
Walking with the standard remote controller
Arms controlled through rt/arm_sdk
The desired application is simply to keep both arms in a fixed carrying/pre-grasp pose while walking.
Any guidance or an official example would be greatly appreciated.
Hi,
I'm trying to implement a simple manipulation scenario on a Unitree G1 29DoF.
The goal is very simple:
Robot is already in Regular Motion Mode (R1+Y).
Move both arms into a fixed pre-grasp pose.
Hold the pose.
Walk using the standard remote controller.
Legs remain under the locomotion controller while the arms are controlled through rt/arm_sdk.
However, I have not been able to obtain stable behavior.
Running Mode experiments
Originally I implemented everything in Running.
Using rt/lowcmd I controlled:
both arms,
and later the waist joints.
Initial problem
When raising both arms into a forward pre-grasp pose (weight = 1.0), the robot consistently leaned forward, even while standing.
Reducing the arm weight (for example to 0.7–0.8) reduced the problem but did not eliminate it.
Waist compensation
I then added a small negative WaistPitch command.
This immediately improved stability.
Later I also initialized WaistYaw and WaistRoll to their neutral offsets.
Results:
dual-arm motions became stable,
forward leaning disappeared,
one-arm manipulation also became significantly more stable.
Unfortunately, Running Mode disables the standard locomotion controller, so this is not suitable for walking.
Motion Mode experiments
I then switched to the officially recommended workflow.
Robot startup:
Power on
Motion Mode (R1+Y)
Walking performed only with the standard remote controller
Arm control through rt/arm_sdk
I tried the workflow recommended in the documentation:
read current joint positions,
gradually ramp motor_cmd[29].q (weight),
move only upper-body joints,
never publish leg commands,
release weight back to zero on exit.
Tested configurations
Configuration 1
Arms only
weight = 0.8
Result:
The arms moved correctly into the desired pose.
When I started walking with the remote controller, the robot became unstable.
Typical behavior:
side stepping,
torso oscillations,
balance corrections,
arms not remaining stable.
Configuration 2
Same setup but
weight = 1.0
Result:
Even worse.
The locomotion controller appeared to fight against the arm controller.
Configuration 3
Official recommendation
Only joints:
15..28
Weight:
29
No waist control.
Result:
No improvement.
Configuration 4
Based on my previous Running Mode experience
I also tried including
WaistYaw
WaistRoll
WaistPitch
through rt/arm_sdk.
WaistPitch used a small negative offset while Yaw/Roll remained at their measured home values.
Standing stability improved.
Walking behavior is currently still under evaluation.
Questions
Is there an officially supported example of a G1 walking in Motion Mode while continuously holding a custom arm pose?
Should waist joints (12–14) be commanded together with the arms on the 29DoF G1, or should they always remain under the locomotion controller?
Does the locomotion controller internally compensate for the change in center of mass when motor_cmd[29].q = 1.0, or is the application expected to provide waist compensation?
Are there recommended stiffness (kp/kd) values specifically intended for walking while holding a fixed manipulation pose?
Is there any internal synchronization mechanism between Motion Mode and rt/arm_sdk that is not exposed through the public SDK?
Additional information
Robot:
Unitree G1
29 DoF
Control:
Motion Mode (R1+Y)
Walking with the standard remote controller
Arms controlled through rt/arm_sdk
The desired application is simply to keep both arms in a fixed carrying/pre-grasp pose while walking.
Any guidance or an official example would be greatly appreciated.