Repository navigation
SerialArm-Core v0.3.0
SerialArm-Core v0.3.0
v0.3.0 重点修复机械臂与末端扩展电机 / CAN 外设共享同一物理总线时的通信正确性问题,并补齐多 CanChannel 并发、Damiao targeted receive、运行时硬件参数覆盖及 ROS 2 / MoveIt 参数链验证
核心修复:末端扩展外设共享 CAN
本版本的主要修复目标是让机械臂本体与独立末端执行器、附加轴或其他 CAN 外设能够在同一进程中稳定共享同一条物理 CAN / USB2CAN 总线
典型结构:
Robot / DamiaoMotorBus
↓
ARM MotorControl
↓
ARM CanChannel ──────────┐
│
External actuator ├── BusPool ── DamiaoUsbCanBus ── physical CAN
↓ │
MotorControl │
↓ │
Tool CanChannel ─────────┘
主要修复包括:
- 修复多个逻辑
CanChannel共享同一物理总线时,一条通道接收后导致另一条通道丢失对应 CAN frame 的问题 - 物理 CAN frame 由
CanBus读取一次后 fan-out 到所有匹配 filter 的CanChannel CanChannel::flush()只清理本通道 pending queue,不再影响同一物理总线上的其他逻辑通道- TX 与 RX 使用独立同步机制,长时间 receive 不再阻塞其他通道发送
- 修复末端外设长时间等待响应时可能占用接收路径、影响机械臂通道正常接收的问题
BusPool::get_or_create()改为原子获取或创建,避免同进程并发初始化同名 bus 时产生重复物理 BusCanChannel增加有界 pending queue,队列达到上限时丢弃最旧帧并累计 diagnostics,避免共享高流量 CAN 时低频外设队列无限增长- 未知或不匹配的 CAN frame 不会进入其他无关 Channel
Damiao 多设备事务修复
针对机械臂电机和末端扩展达妙电机可能共享 master_id = 0 的场景,完善 MotorControl 的设备级匹配逻辑
- 支持多个设备共享
master_id = 0 - 普通 motor feedback 根据 payload 中的完整
slave ID匹配目标电机 - 参数读写响应根据
slave ID + RID + response type精确匹配 - 参数事务期间会跳过其他电机、其他 RID 和管理帧,不将其误解析为目标响应
- 参数事务只清理当前
MotorControl所属CanChannel的 pending queue,不清空 physical bus - 独立末端电机无需加入 Robot joint 列表,也不需要向
Robot/MotorBus增加 raw CAN 接口
这使机械臂本体和独立末端执行器可以各自持有 MotorControl + CanChannel,同时复用同一个 BusPool 中的 physical bus
Transport 测试补强
新增并完善共享 CAN Transport 测试,覆盖:
- 单 Channel 正常接收
- 一个 Channel 不会消费掉另一个 Channel 的匹配 frame
- 一个 Channel 的
flush()不会清除另一个 Channel 的 pending frame - 未知 frame 不进入无关 Channel
- 多 Channel 并发 TX / RX 不串扰
BusPool::get_or_create()并发原子性- 长 receive 不阻塞 send
- 末端外设长 receive 不独占机械臂接收路径
- 有界 Channel pending queue 与 dropped frame diagnostics
其他改进:Runtime Override
运行时硬件连接参数覆盖作为本版本的辅助改进加入
- 新增统一的
HardwareConfigOverrides - 支持覆盖:
serial_portbaudratebus
- 未显式覆盖的字段继续使用
hardware.yaml中的配置 - Native C++ Terminal 支持:
--serial-port--baudrate--bus
- Python
RobotSession同步支持 Runtime Override - ROS 2
hardware.launch.py与moveit.launch.py支持参数透传 - DM-Arm gray / white ros2_control xacro 完成参数声明与透传
- Runtime Override 只影响本次运行,不写回原始 YAML
robot_profile在 Robot Profile 启动模式下仍需显式指定
示例:
serial_arm_terminal \
--robot-profile dm_arm_gray \
--serial-port /dev/ttyACM1ros2 launch serial_arm_ros2_control moveit.launch.py \
robot_profile:=dm_arm_gray \
serial_port:=/dev/ttyACM1不提供 serial_port / baudrate / bus 时继续使用 Robot Profile 对应 hardware.yaml 中的连接配置
测试与真机验证
本版本已完成:
serial_arm_core- Core contract tests
- Hardware Runtime Override tests
- SerialPort tests
- Transport tests
serial_arm_ros2_control- Robot Profile tests
- Runtime Override xacro tests
- gray / white 两套 DM-Arm Profile 的 Runtime Override xacro 测试
colcon test-result --verbose- 17 tests
- 0 errors
- 0 failures
- 0 skipped
- DM-Arm 真机 MoveIt 2 + ros2_control 规划与轨迹执行验证通过
文档
- README 增加共享 CAN / 独立外设接入模型说明
- Tutorial 增加机械臂与独立 CAN 外设共享 physical bus 的示例
- API 补充
CanBus、CanChannel、BusPool、Damiao targeted receive 及独立外设接入说明 - 补充 Runtime Override 的使用方法与参数优先级
当前设计约束
BusPool / CanChannel提供同进程共享,不提供跨进程 CAN broker- 同名 bus 必须对应一致的物理串口与波特率
- 每个独立驱动应持有自己的
CanChannel - Damiao payload 级设备识别由
MotorControl负责,不放入通用 Transport 层 - Runtime Override 当前覆盖
serial_port、baudrate和bus - 串口设备继续使用
/dev/ttyACM* - EEF 目前作为独立 CAN 外设接入路径使用,尚未提供统一的 SerialArm EEF Backend 抽象
- Gripper 与 SocketCAN Backend 尚未实现
Full Changelog: v0.2.0...v0.3.0