动作编排实践
该文档以一个完整的运控-操作一体化场景为例,演示如何使用GR-Controller运动控制与 MoveTools 上肢操作编排为一个完整流程。
其中运动控制场景涵盖状态机切换、速度指令设置、机器人姿态控制等。 上肢操作场景涵盖关节空间运动、笛卡尔到点、笛卡尔直线和多段连续运动四种运动接口,以及 base frame 与 world frame 两种参考系的切换。
涉及接口: set_fsm_state()、set_upper_fsm_state()、set_velocity_source()、set_velocity()、set_stand_pose()、move_joint()、move_point()、move_line()、move_sequence()、convert_target_poses()
涉及状态: PD Stand → WBC Policy→ RemoteState
前置条件
- GR-Controller(AuroraCore)已在机器人侧运行。
AuroraClient已成功连接机器人,可读写状态。- 机器人处于安全的初始站立姿态,周围无障碍物。
场景概览
整个流程分为以下阶段:
| 阶段 | 操作 | 说明 |
|---|---|---|
| 1 | 连接机器人 | 创建 AuroraClient 和 MoveToolsSession |
| 2 | 切换状态机 | PD Stand → WBC policy,上肢切到 act state |
| 3 | 下肢运动 | 设置速度源,向前行走 |
| 4 | move_joint | 启动 MoveTools,双臂移动到预备位姿,腰部归零 |
| 5 | move_point | 双臂运动到抓取目标(base frame) |
| 6 | move_line | 双臂沿 world frame z 轴直线抬升 10 cm |
| 7 | 姿态控制 + 下肢运动 | 降低站姿高度,后退,恢复站姿 |
| 8 | move_sequence | 双臂矩形路径(move_point + 多段 move_line) |
| 9 | 退出 | 停止 MoveTools,关闭连接 |
常量定义
import numpy as np
LEFT_ARM_PRE_Q = np.array([ 0.7, 0.6, 0.1, -1.5, 0.0, 0.0, 0.0], dtype=np.float64)
RIGHT_ARM_PRE_Q = np.array([ 0.7, -0.6, -0.1, -1.5, 0.0, 0.0, 0.0], dtype=np.float64)
LEFT_ARM_START_Q = np.array([-0.7, 0.6, 0.4, -1.2, 0.0, 0.0, 0.0], dtype=np.float64)
RIGHT_ARM_START_Q = np.array([-0.7, -0.6, -0.4, -1.2, 0.0, 0.0, 0.0], dtype=np.float64)
WAIST_ZERO_Q = np.array([0.0, 0.0, 0.0], dtype=np.float64)
LEFT_GRASP_POSE = [0.42372, 0.3, 0.186122, -0.05, -0.74, -0.04, 0.67]
RIGHT_GRASP_POSE = [0.42372, -0.3, 0.186122, 0.05, -0.74, 0.04, 0.67]
笛卡尔位姿格式为 [x, y, z, qx, qy, qz, qw],位置单位为 m,四元数顺序为 xyzw。
辅助函数
def check_move_result(result, name):
if not result.success:
detail = ""
if result.failed_segment_index >= 0:
detail += f", segment={result.failed_segment_index}"
if result.failed_sample_index >= 0:
detail += f", sample={result.failed_sample_index}, t={result.failed_sample_time_s:.4f}s"
raise RuntimeError(f"[{name}] planning failed: {result.code} {result.message}{detail}")
def wait_and_check(movetools, name):
movetools.wait_until_idle()
movetools.raise_if_error()
print(f"[{name}] done.")
check_move_result() 在规划失败时立即抛出异常,并附带失败段和采样点信息,便于排查具体问题。wait_and_check() 等待已入队轨迹执行完成并检查后台线程异常。
阶段 1:连接机器人
import time
from fourier_aurora_client import AuroraClient
from movetools_session import MoveToolsSession
client = AuroraClient.get_instance(
domain_id=123,
robot_name="gr3",
namespace=None,
is_ros_compatible=None,
)
time.sleep(1.0)
print("AuroraClient connected successfully.")
movetools = MoveToolsSession(client, robot_name="gr3")
AuroraClient.get_instance() 后等待 1 秒,确保 DDS 发现完成后再进行后续状态切换。
阶段 2:切换状态机
MoveTools 不直接管理机器人状态机。启动 MoveTools 前,需要通过 AuroraClient 将机器人切换到可接管状态。
# 切换到 PD Stand
client.set_fsm_state(2)
time.sleep(1.0)
# 切换到 WBC
client.set_fsm_state(3)
time.sleep(0.2)
| 状态 | fsm_state 值 | 说明 |
|---|---|---|
| PD Stand | 2 | 直立稳定,准备进入 WBC |
| WBC | 3 | 全身控制,允许上肢接管 |
阶段 3:下肢运动
在将上肢控制权交给 MoveTools 之前,先完成下肢行走。
# 设置速度源为导航模式
client.set_velocity_source(2)
time.sleep(0.2)
# 上肢切到 act state,使上肢随动
client.set_upper_fsm_state(1)
time.sleep(2.0)
# 向前行走 2 秒
client.set_velocity(1.0, 0.0, 0.0, duration=2.0)
time.sleep(2.5)
set_velocity_source(2) 将速度控制权交给外部导航命令。set_upper_fsm_state(1) 将上肢切到随动状态,使行走过程中上肢自然协同摆动。