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 Name | Task Name | Joystick Mapping | DDS Mapping | Frequency |
|---|---|---|---|---|
| PdStand | PdStandTask | LB+B | 2 | 400Hz |
| Available for Hanging | Available for Standing | Auto Protection Switch |
|---|---|---|
| Yes | Yes | No |
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
UporDownto control the robot's height. - Press
LeftorRightto control the robot's pitch angle. - Move the right stick
LeftorRightto 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:
- Reset the stand pose to the default position.
- Gradually move the arms to the default position.
Client Control
| Velocity Control | Pose Control | Joint Control | Motor Config |
|---|---|---|---|
| No | Yes | Upper body | No |
Enter PdStand State
After starting AuroraCore, use the set_fsm_state function to enter the PdStand State.
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]
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
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)