跳到主要内容

多段关节运动完整示例

本示例演示使用 move_sequence() 一次提交两段关节空间运动:先做单关节小偏移、再返回起点。所有段共享同一组 groups,每段通过 seq.add_move_joint() 添加;目标由当前读取的关节位置加有限偏移生成。

涉及状态: JointStand、upper_body_tele_task

涉及接口: create_move_sequence_builder()、seq.add_move_joint()、move_sequence()

Python
import os
import time

import numpy as np

os.environ.setdefault("FASTDDS_BUILTIN_TRANSPORTS", "UDPv4") # 机器人上运行必须设置

from fourier_aurora_client import AuroraClient
from movetools_session import MoveToolsSession

ARMS = ("left_manipulator", "right_manipulator")
JOINT_OFFSET = 0.05 # 单关节偏移(rad)


def wait_fsm(client, expected, timeout_s=8.0):
deadline = time.monotonic() + timeout_s
while client.get_fsm_state() != expected:
if time.monotonic() >= deadline:
raise RuntimeError(f"state {expected} not reached")
time.sleep(0.05)


def check_result(result, name):
if not result.success:
raise RuntimeError(f"{name} failed: {result.code} {result.message}")


client = AuroraClient.get_instance(
domain_id=123, # 必须与当前 AuroraCore 的 DDS domain 一致
robot_name="grw",
)
movetools = MoveToolsSession(client, robot_name="grw")
started = False

try:
input("Press Enter to switch to JointStand...")
client.set_fsm_state(1)
wait_fsm(client, 1)
time.sleep(2.0)

input("Press Enter to switch to upper_body_tele_task...")
client.set_fsm_state(4)
wait_fsm(client, 4)
time.sleep(1.0)

movetools.start()
started = True

# 读取当前关节位置作为起点;腰部只回发当前值
start = {arm: list(client.get_group_state(arm, key="position")) for arm in ARMS}
waist_q = list(client.get_group_state("waist", key="position"))

offset_q = {arm: list(q) for arm, q in start.items()}
for arm in ARMS:
offset_q[arm][0] += JOINT_OFFSET

seq = movetools.create_move_sequence_builder(
groups=["waist", "left_manipulator", "right_manipulator"],
)

seq.add_move_joint(
{
"waist": np.array(waist_q),
"left_manipulator": np.array(offset_q["left_manipulator"]),
"right_manipulator": np.array(offset_q["right_manipulator"]),
},
expect_vel=150,
)
seq.add_move_joint(
{
"waist": np.array(waist_q),
"left_manipulator": np.array(start["left_manipulator"]),
"right_manipulator": np.array(start["right_manipulator"]),
},
expect_vel=150,
)

input("Press Enter to run move_sequence...")
result = movetools.move_sequence(seq)
check_result(result, "move_sequence")

movetools.wait_until_idle()
movetools.raise_if_error()

end = {arm: list(client.get_group_state(arm, key="position")) for arm in ARMS}
print(f"restored joint0 delta: {[round(end[a][0] - start[a][0], 4) for a in ARMS]}")
print("move_sequence complete")

finally:
if started:
movetools.stop()
if client.get_fsm_state() != 3:
client.set_fsm_state(3) # 回到策略站立状态
wait_fsm(client, 3)
client.close()