脚踝外骨骼机器人控制系统
项目背景
外骨骼机器人在康复医疗、工业辅助和军事领域都有广泛的应用前景。本项目实现了一套完整的脚踝外骨骼机器人控制系统,已于近期完成 ROS1 → ROS2 平台迁移与硬件架构重设计。
v2.0 重大升级:从 ROS1 Melodic (Ubuntu 18.04) 全面迁移至 ROS2 Humble (Ubuntu 22.04),CAN 架构重写,IMU 协议升级,控制器能力大幅增强。
技术架构
整个系统运行在 Ubuntu 22.04 + ROS2 Humble 环境下,采用 colcon 构建系统。
C++ Python CAN总线 Modbus ROS2can_ankle — 5 模式自适应步态控制器
核心控制包已从简单的力矩/速度控制升级为完整的5 模式状态机自适应步态控制器:
状态机流程:
1 | STAND_MODE → TORQUE_MODE → PRE_TORQUE_MODE → TORQUE_DRIVE_MODE → VELOCITY_MODE → STAND_MODE |
关键特性:
- 自适应步速估计:根据支撑相时间通过指数模型
pace = -ln((t2-c1)/a1) / b1实时计算步速 - PID 自适应调参:Kp/Ki/Kd 根据步速分 5 档动态调整(Kp 范围 20-60)
- 坡度辅助力矩:利用 IMU 四元数 z 分量估计地面坡度,计算
assist_torque = 8/π * atan(slope/2) - 浮动补偿:基于理论/实际摆动时间差动态调整
- 两种控制模式:Mode 1——余弦形力矩曲线 + 自适应上升/下降时间;Mode 2——固定 0.18s/0.21s 曲线
- 支撑相位置补偿:交替记录位置,回位校正
CAN 总线架构 — 双协议重设计
从旧版直接 VCI_USBCAN2 调用升级为 Python CAN Bridge + 内嵌 CAN 子进程 双层架构。
- 硬件:CANalyst-II (USB
04d8:0053, 1 Mbps),替代旧的 USBCAN2 - 电机:CANopen Node 83,SDO COB-ID
0x653 - Layer 1:
can_bridge.py— python-can + canalystii 接口,发布/can_rx/ 订阅/can_tx - Layer 2:C++ 内嵌 CAN 子进程,通过
posix_spawn()+ 双向管道通信,避免 DDS 中断
fdilink_ahrs — IMU 协议升级:FC → 5A 5A
IMU 驱动已完成重大协议升级:
| 对比项 | 旧版 | 新版 |
|---|---|---|
| 帧头 | FC | 0x5A 0xA5 |
| 帧长 | 不定长 | 82 字节 (2H+2L+76B+2T) |
| 波特率 | 921600 | 115200 |
| 固件 | 旧版 | v1.6.8+ (2025-07-17) |
发布 7 个 ROS2 Topic(原来 ~3 个):
/imu— sensor_msgs/Imu(Eigen 四元数坐标旋转)/euler_angles— Vector3 (roll/pitch/yaw)/mag_pose_2d— Pose2D 磁北极航向/magnetic— Vector3 磁力计/gps/fix— NavSatFix GPS/system_speed— Twist 机体速度/NED_odometry— Odometry NED 位姿估计
新增 TF 广播节点 (imu_tf.cpp):world → gyro_link 变换 + 可配置位置偏移。
力传感器 — Modbus RTU 重构
Modbus CRC16 19200bps从旧版 ASCII 文本协议彻底重构为工业 Modbus RTU 协议:
- 功能码 0x03(读保持寄存器),寄存器
0x0FA0/0x0FA1 - 从站 ID 1,CRC16 Modbus 校验
- 可配置比例系数(默认 0.01),20Hz 循环
- 支持调试模式(TX/RX hex dump)
新增节点
| 节点 | 功能 |
|---|---|
serial_sendCommand_node |
足底开关串口读取 + 步态相位时序发布(6 个 Topic:单支撑/双支撑/摆动相等) |
serial_encoder_node |
Modbus RTU 编码器读取 |
storeTopicMSG_node |
步态相位时间数据记录到文件 |
storeVelMSG_node |
编码器角度/力矩数据记录到文件 |
can_test_node |
CAN 通信正弦速度测试 |
imu_tf |
IMU 坐标系 TF 广播 |
安全保障
- 编码器限位:±45 度
- 力传感器过载:300N
- 站立超时:支撑相 > 5s 触发
- 指令序列验证:严格
0x41→0x42→0x43→0x44次序,违规自动回零 - cmd_vel 超时 500ms 自动停机
开发心得
这个项目是我深入理解机器人控制系统的入门之作。从 ROS1 到 ROS2 的迁移让我深刻体会到 DDS 中间件的优势与挑战;CAN 双协议架构的设计教会我处理实时通信的可靠性;5 模式状态机的调参过程则让我对控制理论有了切身的理解。
机器人 控制算法 ROS2本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 lizhichao!
