速度控制
set_velocity_source()
Python
set_velocity_source(source: int) -> bool
设置速度命令来源。在调用 set_velocity() 之前必须先将来源设置为 2(Navigation)并回读确认,否则速度命令会被 AuroraCore 忽略(客户端无任何报错;机器人日志会记录 Ignore velocity command because current velocity source is not 'Navigation')。
| 值 | 来源 | 说明 |
|---|---|---|
| 0 | Joystick | 手柄控制 |
| 1 | Handheld | 手持设备(APP) |
| 2 | Navigation | 导航速度源;AuroraClient 的速度发布接口使用此来源 |
返回:True 表示服务已受理。仍须用 get_velocity_source() 确认状态已更新后才能发送非零速度。
示例
Python
import os
import time
os.environ.setdefault("FASTDDS_BUILTIN_TRANSPORTS", "UDPv4") # 机器人上运行必须设置
from fourier_aurora_client import AuroraClient
client = AuroraClient.get_instance(domain_id=123, robot_name="grw")
try:
time.sleep(1.0)
if not client.set_velocity_source(2):
raise RuntimeError("速度源切换请求未受理")
deadline = time.monotonic() + 2.0
while client.get_velocity_source() != 2:
if time.monotonic() >= deadline:
raise RuntimeError("速度源未切换到 Navigation (2)")
time.sleep(0.05)
print(f"current source: {client.get_velocity_source()} ({client.get_velocity_source_name()})")
finally:
client.set_velocity_source(0) # 交还手柄控制
client.close()
get_velocity_source()
Python
get_velocity_source() -> int
返回当前速度命令来源的数值。
get_velocity_source_name()
Python
get_velocity_source_name() -> str
返回当前速度命令来源的名称字符串,例如 "Navigation"。
set_velocity()
Python
set_velocity(vx: float, vy: float, yaw: float, duration: float = 1.0)
向 GR-W 轮式底盘发布速度命令。命令为单次发布,服务端在 duration 秒内保持其有效,到期后自动失效(例如 duration=0.5 的命令到期后约 0.3 s 内速度回落)。GR-W 的速度控制工作流使用状态 3(grw_policy_task);进入其他状态后请先重新确认状态与速度源。
| 参数 | 类型 | 说明 |
|---|---|---|
vx | float | X 方向线速度(前进为正,m/s) |
vy | float | Y 方向线速度(左移为正,m/s) |
yaw | float | Z 轴角速度(左转为正,rad/s) |
duration | float | 命令有效时长(s),默认 1.0 |
示例
Python
import os
import time
os.environ.setdefault("FASTDDS_BUILTIN_TRANSPORTS", "UDPv4") # 机器人上运行必须设置
from fourier_aurora_client import AuroraClient
client = AuroraClient.get_instance(domain_id=123, robot_name="grw")
try:
time.sleep(1.0)
if not client.set_fsm_state(3):
raise RuntimeError("状态切换请求未受理")
deadline = time.monotonic() + 4.0
while client.get_fsm_state() != 3:
if time.monotonic() >= deadline:
raise RuntimeError("状态未切换到 grw_policy_task")
time.sleep(0.05)
if not client.set_velocity_source(2):
raise RuntimeError("速度源切换请求未受理")
deadline = time.monotonic() + 2.0
while client.get_velocity_source() != 2:
if time.monotonic() >= deadline:
raise RuntimeError("速度源未切换到 Navigation (2)")
time.sleep(0.05)
client.set_velocity(0.1, 0.0, 0.0, 1.0) # 低速前进约 10 cm
time.sleep(1.0)
client.set_velocity(0.0, 0.0, 0.0, 1.0) # 停止
finally:
client.set_velocity(0.0, 0.0, 0.0, 1.0) # 兜底零速度
client.set_velocity_source(0) # 交还手柄控制
client.close()