Skip to main content

PdStand State

The PdStand State runs a WBC standing controller that keeps the robot standing on a flat surface for further control. The pdstand controller has two phases: the hanging phase and the standing phase. Phase transitions are determined by the internal stability estimator and can be read via the client.

If the stability level is below 100 (below 10 in simulation), the controller switches to the hanging phase. In this phase, all joints slowly return to their default positions and pose or joint control is unavailable.

If the stability level is above 100 (above 10 in simulation), the controller switches to the standing phase. In this phase, stand pose and upper-body joint control are available.

State Details​

State NameTask NameJoystick MappingDDS MappingFrequency
PdStandPdStandTaskLB+B2400Hz
Available for HangingAvailable for StandingAuto Protection Switch
YesYesNo

Joystick Control​

Enter PdStand State​

After starting AuroraCore, press shoulder button LB and button B simultaneously to enter the PdStand State.

Stand Pose Control​

Once the robot enters the standing phase, use the D-pad to control the robot's stand pose.

  • Press Up or Down to control the robot's height.
  • Press Left or Right to control the robot's pitch angle.
  • Move the right stick Left or Right to control the robot's yaw angle.

Reset Button​

PdStand provides a shortcut to reset the robot's state. Hold button A and the robot will:

  1. Reset the stand pose to the default position.
  2. Gradually move the arms to the default position.

Client Control​

Velocity ControlPose ControlJoint ControlMotor Config
NoYesUpper bodyNo

Enter PdStand State​

After starting AuroraCore, use the set_fsm_state function to enter the PdStand State.

Python
client = AuroraClient.get_instance(domain_id=123, robot_name="gr3")
time.sleep(1)

client.set_fsm_state(2) # switch to PdStand State

Stand Pose Control​

Once the robot enters the standing phase, use set_stand_pose for pose control.

Pose range: delta_z: [0.01, -0.20], delta_pitch: [-0.3, 0.6], delta_yaw: [-0.3, 0.3]

Python
client.set_stand_pose(-0.1, 0.0, 0.0) # crouch 0.1 m
time.sleep(2.0)

client.set_stand_pose(0.0, 0.2, 0.0) # lean forward 0.2 rad
time.sleep(2.0)

client.set_stand_pose(0.0, 0.0, 0.2) # turn left 0.2 rad
time.sleep(2.0)

client.set_stand_pose(0.0, 0.0, 0.0) # return to default
time.sleep(2.0)

Joint Control​

Once the robot enters the standing phase, use set_group_cmd for joint control. Since position commands take effect immediately, interpolation is recommended to avoid sudden changes.

Available control groups: waist, head, left_manipulator, right_manipulator, left_endeffector, right_endeffector

Python
left_manipulator_init_pose = client.get_group_state("left_manipulator", key="position")
left_manipulator_target_pose = [0.0, 0.0, 0.0, -1.2, 0.0, 0.0, 0.0]
total_steps = 200

for i in range(total_steps):
left_manipulator_pose = [s + (e - s) * i / total_steps for s, e in zip(left_manipulator_init_pose, left_manipulator_target_pose)]
client.set_group_cmd({"left_manipulator": left_manipulator_pose})
time.sleep(0.01)