项目说明
这是一个 ROS 2 Humble 差速驱动演示。`ros2_control` 通过 SocketCAN 管两只虚拟电机,能查看命令、编码器反馈、ACK、watchdog、故障注入和安全停止。

目标环境Ubuntu 22.04 · ROS 2 Humble · C++17
控制链cmd_vel · ros2_control · SocketCAN · vcan
安全动作ACK / feedback timeout · disabled zero command
命令怎么到虚拟电机
速度指令
cmd_vel→diff_drive_controller→CanMotorHardware
SystemInterface→SocketCAN
vcan0→双虚拟电机
ACK + encoder
cmd_vel→diff_drive_controller→CanMotorHardware
SystemInterface→SocketCAN
vcan0→双虚拟电机
ACK + encoder
两端直接使用 ros2_socketcan 的 C++ 收发 API。命令带 sequence、enable 位和 watchdog 时间;虚拟电机会检查 ACK 和反馈是否超时,异常时发送零速度并停用。
代码里做的检查
SystemInterface把 ros2_control 的命令和状态映射成 CAN 命令与编码器反馈。ACK 检查只接受 sequence 对得上的 ACK;缺失或异常 ACK 会报错。双电机任一侧反馈丢失,两侧都会进入安全停止。watchdog命令失联时,虚拟电机会自己停下。故障注入可以复现丢帧、延迟、畸形帧和 CAN error frame。诊断总线状态、ACK 队列、反馈年龄和停止原因会发到 diagnostics。
先跑一次
1 | source /opt/ros/humble/setup.bash |
另开终端发布速度命令,同时看控制器、/joint_states、/diagnostics 和 candump -L vcan0。故障时,两侧都应变成 disabled zero command。
这能说明什么
- virtual motor、vcan、ACK、反馈、watchdog、bus-off、取消和 safe-stop 的软件路径可以复现。
- 可以改用
can0并关闭 virtual motor,但真实控制器必须实现同一套 ID 与字节布局。 - vcan 不能说明电气总线、真实电机负载、执行器惯性、供电问题或硬件急停。
接真实 CAN 前,先分别检查线缆、终端电阻、bitrate、控制器协议和无负载安全动作,再谈运动能力。
链接: GitHub 源码与演示