Skip to content

SerialArm-Core v0.3.0

Choose a tag to compare

@Kaede-Rei Kaede-Rei released this 11 Aug 06:44
· 117 commits to main since this release

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 时产生重复物理 Bus
  • CanChannel 增加有界 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_port
    • baudrate
    • bus
  • 未显式覆盖的字段继续使用 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/ttyACM1
ros2 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