ROS2 Interface 开发No.3 机体速度控制

ROS2 接口开发

更新于:2026年8月17日

1.1 接口概述

机体速度控制接口用于控制机器人本体的运动速度,包括前后、左右的线速度和偏航角速度。这是比关节命令更高层级的控制接口——开发者不需要关心每个关节的位置,只需指定机体期望的运动速度,机器人内部的行走控制器会自动完成关节级的运动规划。

该接口需要以固定频率持续发布速度命令才能维持运动,适用于机器人行走过程中的方向和速度控制。

1.2 消息字段与坐标系

通信接口

话题名称消息类型方向说明
/motion/body_vel_cmdBodyVelCmd.msg客户端 → 行走服务发送速度控制消息

坐标系定义(右手坐标系,原点在机体中心):

方向
X 轴机体前进方向
Y 轴机体左侧方向
Z 轴机体向上方向

消息字段

字段类型单位说明
linear_velocity[0]float64m/sX 方向速度,正值前进,负值后退
linear_velocity[1]float64m/sY 方向速度,正值左移,负值右移
yaw_velocityfloat64rad/s偏航角速度,正值逆时针,负值顺时针
headerstd_msgs/Header时间戳和帧 ID(frame_id 设为 "body"

速度限制如下表所示:

参数最小值最大值
X 轴线速度(前进/后退,单位 m/s)-11
Y 轴线速度(左右平移,单位 m/s)-11
偏航角速度(旋转,单位 rad/s)-11

1.3 控制频率与速度限制

项目要求
推荐频率100 Hz(10ms 周期)
最低频率50 Hz,频率过低可能导致运动不连续
停止方式显式发送零速度命令(所有字段设为 0)
超时保护接收端 2 秒未收到消息后自动停下

建议实现速度渐变而非突变,速度超出限制可能被自动裁剪或导致错误。

1.4 前置条件

必须进入行走类运动模式,机体速度控制接口才会生效。可通过手柄切换运动模式:

运动模式手柄按键适用机型
自然步态(rl_basic)[LB, B]PM01 / T800
机械步态(rl_amp)[LB, X]仅 PM01
地形步态(rl_terrain)[LB, Y]仅 PM01
下肢平衡步态(lower_body_balance)[LB, CROSS_X_DOWN]PM01 / T800

在某些运动模式下该接口可能被禁用,使用前确保机器人处于可接受速度命令的状态。

1.5 示例:速度控制流程

文件名body_velocity_control_example.py

本示例展示了如何通过定时发布 BodyVelCmd 消息控制机器人移动,包括前进、平移和旋转。

运行命令

Bash
python3 body_velocity_control_example.py

核心代码

Python
import rclpy
from rclpy.node import Node
from std_msgs.msg import Header
from interface_protocol.msg import BodyVelCmd

class BodyVelocityPublisher(Node):
    def __init__(self):
        super().__init__("body_velocity_publisher")
        # 创建发布者,100Hz 定时发布
        self.pub = self.create_publisher(BodyVelCmd, "/motion/body_vel_cmd", 10)
        self.create_timer(0.01, self._tick)  # 100Hz = 10ms

    def _tick(self):
        msg = BodyVelCmd()
        msg.header = Header()
        msg.header.stamp = self.get_clock().now().to_msg()
        msg.header.frame_id = "body"
        msg.linear_velocity = [0.5, 0.0]  # [x, y] m/s,正值前进/左移
        msg.yaw_velocity = 0.0            # rad/s,正值逆时针
        self.pub.publish(msg)

rclpy.init()
rclpy.spin(BodyVelocityPublisher())

修改 linear_velocityyaw_velocity 的值即可控制方向。停止时将所有值设为 0。完整脚本包含键盘交互和优雅退出,见 GitHub。

1.6 注意事项

  • 确保运动控制器节点已启动并处于适当的行走类运动状态
  • 必须持续发送速度命令以保持运动(机器人不会记忆上次的速度)
  • 停止时需要显式发送零速度命令
  • 速度超出限制可能被自动裁剪或导致错误
  • 建议实现速度渐变而非突变
  • 此示例不包含避障功能,实际使用时需要配合传感器和避障算法
  • 建议先从小速度开始测试,逐步增加到期望速度
  • 在受限空间内谨慎使用高速度
  • 使用 Ctrl+C 可以安全退出程序,机器人会停止

📎 本章涉及的开源仓库源码文件(点击文件名跳转 GitHub):BodyVelCmd.msg · body_velocity_control_example.py