外观
踩坑github.com7 天前
松灵 PiPER 机械臂在 Ubuntu 22.04 下 SocketCAN 1Mbps 帧溢出与使能无响应
硬件与软件环境
- 机型:松灵 AgileX PiPER 六轴轻量化机械臂(含二指夹爪)
- 软件栈:Ubuntu 22.04 LTS +
piper_sdk/piper_ros+ USB-to-CAN 模块(gs_usb内核驱动)
故障现象与报错
- 以 200Hz 以上频率连续下发 6 轴关节 + 夹爪控制指令时,终端抛出异常:
can.CanOperationError: Failed to transmit: [Errno 105] No buffer space available。 - 刚从主从遥操作(Leader-Follower)模式切回上位机 SDK 独立控制时,调用
EnableArm(7)返回成功但机械臂依然处于零力矩阻尼状态,不响应关节角度指令。
根因分析
- Linux SocketCAN 默认发送队列深度过小:Ubuntu 默认网络接口
txqueuelen仅为10,在 1Mbps CAN 总线下同时收发 6 个关节状态帧与控制帧时极易塞满内核缓冲区。 - 示教/主从模式状态锁存:PiPER 控制器若此前处于示教拖拽或硬件主从联动模式,控制权仍锁存在外部 CAN 主臂帧或示教按钮状态,未通过模式切换指令显式接管为 CAN 指令控制模式。
解决步骤
- 配置 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 upip -details -statistics link show can0确认qlen 1000且bus-off计数为 0。 - 按标准两步法切入 CAN 控制并使能: 在发送目标关节角前,先调用
MotionCtrl_2(0x01, 0x01, 50, 0x00)(将控制模式显式设为 CAN 指令控制模式、MOVE J 关节运动模式、速度百分比 50%),等待 50ms 后循环调用EnableArm(7)并轮询各关节驱动器状态字确认全部进入使能态,再启动高频控制环。
来源
本页事实对应的公开页面,以原文为准。
- GitHub agilexrobotics/piper_sdk访问 2026-10-21
- GitHub agilexrobotics/piper_ros访问 2026-10-21