1. 项目概述
最近在折腾宇树Go2机器狗,发现用ROS2自带的键盘控制节点teleop_twist_keyboard可以直接发送Twist消息来控制机器狗运动,这比之前自己写键盘控制程序方便多了。不过Go2机器狗需要的是unitree_api/msg/Request消息,所以需要做个消息桥接,把Twist消息转换成Request消息。
这个项目本质上就是一个消息转换器,订阅/cmd_vel话题的Twist消息,转换成Go2机器狗能理解的Request消息发布出去。这样就能用ROS2生态中现成的工具来控制机器狗,不用重复造轮子。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实现思路解析
2.1 核心需求
我们需要实现的功能很简单:
- 订阅geometry_msgs/msg/Twist消息(来自teleop_twist_keyboard)
- 解析Twist消息中的线速度和角速度
- 生成unitree_api/msg/Request消息
- 发布Request消息到/api/sport/request话题
2.2 技术选型
这个桥接可以用C++或Python实现,两种语言在ROS2中都有完善的API支持。选择依据主要是:
- C++性能更好,适合对实时性要求高的场景
- Python开发效率高,代码更简洁
考虑到机器狗控制对实时性有一定要求,但又不是特别苛刻,两种语言都可以。本文会分别展示两种实现。
3. C++实现详解
3.1 准备工作
首先创建功能包:
bash复制cd unitree_go2_ws/src/base/
ros2 pkg create go2_twist_bridge --build-type ament_cmake --dependencies rclcpp geometry_msgs unitree_api --node-name twist_bridge
需要从unitree_ros2包中复制nlohmann/json头文件,因为Request消息的parameter字段是JSON字符串格式。
3.2 运动模式定义
在include/sport_model.hpp中定义了机器狗的各种运动模式:
cpp复制//1001:阻尼控制
const int32_t ROBOT_SPOR
