Skip to content

踩坑github.com7 天前

松灵 PiPER 机械臂在 Ubuntu 22.04 下 SocketCAN 1Mbps 帧溢出与使能无响应 ​

硬件与软件环境 ​

  • 机型:松灵 AgileX PiPER 六轴轻量化机械臂(含二指夹爪)
  • 软件栈:Ubuntu 22.04 LTS + piper_sdk / piper_ros + USB-to-CAN 模块(gs_usb 内核驱动)

故障现象与报错 ​

  1. 以 200Hz 以上频率连续下发 6 轴关节 + 夹爪控制指令时,终端抛出异常:can.CanOperationError: Failed to transmit: [Errno 105] No buffer space available。
  2. 刚从主从遥操作(Leader-Follower)模式切回上位机 SDK 独立控制时,调用 EnableArm(7) 返回成功但机械臂依然处于零力矩阻尼状态,不响应关节角度指令。

根因分析 ​

  1. Linux SocketCAN 默认发送队列深度过小:Ubuntu 默认网络接口 txqueuelen 仅为 10,在 1Mbps CAN 总线下同时收发 6 个关节状态帧与控制帧时极易塞满内核缓冲区。
  2. 示教/主从模式状态锁存:PiPER 控制器若此前处于示教拖拽或硬件主从联动模式,控制权仍锁存在外部 CAN 主臂帧或示教按钮状态,未通过模式切换指令显式接管为 CAN 指令控制模式。

解决步骤 ​

  1. 配置 CAN 波特率时同步增大 txqueuelen:
    bash
    sudo ip link set can0 down
    sudo ip link set can0 type can bitrate 1000000 restart-ms 100
    sudo ip link set can0 txqueuelen 1000
    sudo ip link set can0 up
    可通过 ip -details -statistics link show can0 确认 qlen 1000 且 bus-off 计数为 0。
  2. 按标准两步法切入 CAN 控制并使能: 在发送目标关节角前,先调用 MotionCtrl_2(0x01, 0x01, 50, 0x00)(将控制模式显式设为 CAN 指令控制模式、MOVE J 关节运动模式、速度百分比 50%),等待 50ms 后循环调用 EnableArm(7) 并轮询各关节驱动器状态字确认全部进入使能态,再启动高频控制环。

来源

本页事实对应的公开页面,以原文为准。

  1. GitHub agilexrobotics/piper_sdk访问 2026-10-21
  2. GitHub agilexrobotics/piper_ros访问 2026-10-21