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

> 原文链接：https://robotics.hellobike.com/pitfalls/agilex-piper-can-socketcan-bitrate-error
> 频道：pitfalls | 更新日期：2026-10-21 | 标签：松灵, PiPER, SocketCAN, 机械臂, LeRobot, 遥操作
> 核心摘要：PiPER 6 自由度机械臂高频控制下 gs_usb CAN 模块发送队列溢出（No buffer space available）及主从模式未切换导致电机无法使能的解决方法。

# 松灵 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)` 并轮询各关节驱动器状态字确认全部进入使能态，再启动高频控制环。

## 原始参考来源 (Sources)

- [GitHub agilexrobotics/piper_sdk](https://github.com/agilexrobotics/piper_sdk)
- [GitHub agilexrobotics/piper_ros](https://github.com/agilexrobotics/piper_ros)