ROS2 底盘控制节点
Wheeltec Driver · C30D 控制器 · /cmd_vel 完整链路验证 + 阿克曼转向测试
ROS2 功能包
Python 节点
colcon 编译
/cmd_vel 话题
阿克曼底盘响应
转向控制验证
创建 ROS2 功能包
mkdir -p ~/ugv_ws/src
cd ~/ugv_ws/src
ros2 pkg create --build-type ament_python wheeltec_driver --dependencies rclpy geometry_msgs
通过 功能包 wheeltec_driver 已创建,目录结构生成完毕。
编写底盘控制节点
cd ~/ugv_ws/src/wheeltec_driver/wheeltec_driver
nano cmd_vel_driver.py
节点功能:订阅
/cmd_vel 话题,接收 geometry_msgs/msg/Twist 消息,将速度控制指令通过串口发送至 C30D 控制器。chmod +x cmd_vel_driver.py
配置 console_scripts 入口
nano ~/ugv_ws/src/wheeltec_driver/setup.py
entry_points={
'console_scripts': [
'cmd_vel_driver = wheeltec_driver.cmd_vel_driver:main',
],
},
其中
cmd_vel_driver 是终端执行名称,wheeltec_driver.cmd_vel_driver:main 指向 cmd_vel_driver.py 中的 main() 函数。 编译 ROS2 工作空间
cd ~/ugv_ws
colcon build
Starting >>> wheeltec_driver
Finished <<< wheeltec_driver [6.88s]
Summary: 1 package finished [8.49s]
Finished <<< wheeltec_driver [6.88s]
Summary: 1 package finished [8.49s]
加载环境变量
source ~/ugv_ws/install/setup.bash
ros2 pkg list | grep wheeltec
wheeltec_driver
通过 ROS2 已识别 wheeltec_driver 功能包。
通过 验证节点是否注册成功
ros2 pkg executables wheeltec_driver
wheeltec_driver cmd_vel_driver
通过 cmd_vel_driver 节点已成功注册到 ROS2 系统。
启动底盘控制节点
ros2 run wheeltec_driver cmd_vel_driver
节点启动后,等待接收
/cmd_vel 控制指令。 发送 /cmd_vel 控制指令测试
打开新终端,加载环境变量:
source ~/ugv_ws/install/setup.bash
前进 (0.2 m/s)
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.2}, angular: {z: 0.0}}"
通过 底盘电机正常响应,ROS2 控制链路已打通。
停止运动
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: 0.0}}"
或在运行节点的终端中按
Ctrl + C 停止节点。 阿克曼转向控制测试
ROS2 标准 Twist 消息中:
linear.x → 后轮驱动速度angular.z → 前轮转向角度
对于阿克曼底盘:后轮负责驱动,前轮负责转向,转向舵机通过连杆机构控制前轮偏转角度。
左转测试
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.2}, angular: {z: 0.5}}"
控制效果:后轮驱动电机开始旋转 → 前轮转向舵机向左偏转 → 底盘进入左转运动状态
ROS2日志输出:
vx = 200 mm/s (前进速度 0.2 m/s)
wz = 500 (转向角速度 0.5 rad/s)
ROS2日志输出:
cmd_vel: vx=200 mm/s, wz=500vx = 200 mm/s (前进速度 0.2 m/s)
wz = 500 (转向角速度 0.5 rad/s)
右转测试
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.2}, angular: {z: -0.5}}"
控制效果:后轮驱动电机开始旋转 → 前轮转向舵机向右偏转 → 底盘进入右转运动状态
ROS2日志输出:
ROS2日志输出:
cmd_vel: vx=200 mm/s, wz=-500 停止与回正测试
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: 0.0}}"
控制效果:后轮停止转动 → 转向舵机回到中位 → 底盘停止运动
ROS2日志输出:
ROS2日志输出:
cmd_vel: vx=0 mm/s, wz=0 转向控制说明
本项目采用阿克曼转向结构(Ackermann Steering):
- 前轮 → 转向
- 后轮 → 驱动
在测试过程中:
• 前轮不会主动旋转,只改变转向角度
• 后轮负责提供驱动力,旋转驱动车辆前进
该控制方式与汽车转向原理一致,也是目前移动机器人和无人车平台广泛采用的底盘结构。
• 前轮不会主动旋转,只改变转向角度
• 后轮负责提供驱动力,旋转驱动车辆前进
该控制方式与汽车转向原理一致,也是目前移动机器人和无人车平台广泛采用的底盘结构。
ROS2 Twist
↓
/cmd_vel
↓
Wheeltec Driver
↓
C30D Controller
↓
Steering Servo + Drive Motor
↓
Ackermann Chassis
测试结论
ROS2 节点验证
| 测试项目 | 测试结果 |
|---|---|
| ROS2 功能包创建 | 通过 通过 |
| Python 控制节点创建 | 通过 通过 |
| console_scripts 节点入口配置 | 通过 通过 |
| colcon 编译 | 通过 通过 |
| ROS2 功能包识别 | 通过 通过 |
| ROS2 可执行节点识别 | 通过 通过 |
阿克曼运动控制验证
| 测试项目 | 测试结果 |
|---|---|
| 前进控制 | 通过 通过 |
| 停止控制 | 通过 通过 |
| 左转控制 | 通过 已发送控制指令 |
| 右转控制 | 通过 已发送控制指令 |
| /cmd_vel 速度控制 | 通过 通过 |
| ROS2 日志输出 | 通过 通过 |
阶段结论
ROS2 系统已能够通过标准
该结果证明 ROS2 上位机与 C30D 底层控制器之间的基础控制链路已经成功打通,为后续里程计、TF、SLAM 建图、Nav2 导航和多车协同控制开发提供了坚实基础。
/cmd_vel 话题向 WHEELTEC GWR500 底盘发送运动控制指令,包括前进、后退、左转、右转和停止。底盘电机和转向舵机均能正常响应。
该结果证明 ROS2 上位机与 C30D 底层控制器之间的基础控制链路已经成功打通,为后续里程计、TF、SLAM 建图、Nav2 导航和多车协同控制开发提供了坚实基础。
平台:WHEELTEC GWR500 · C30D · Raspberry Pi 4B · ROS2 Humble
(c) 卓博泰科技 · ROS2 阿克曼底层驱动开发记录
(c) 卓博泰科技 · ROS2 阿克曼底层驱动开发记录