# Piper SDK CAN总线Bus-Off后无自动恢复致机械臂失联

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-08-30-piper-sdk-109
> 频道：pitfalls | 更新日期：2026-08-30 | 标签：auto, github-issue, piper_sdk
> 核心摘要：Piper SDK在CAN总线异常时仅记录日志且读线程永久退出，需通过isOk检测状态并手动重连恢复。

# Piper SDK CAN总线Bus-Off后无自动恢复致机械臂失联

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[No CAN bus recovery / failure state feedback — silent failure](https://github.com/agilexrobotics/piper_sdk/issues/109)（GitHub agilexrobotics/piper_sdk #109）

**状态**：有绕过办法

## 问题

Piper机械臂因电源不稳导致Linux SocketCAN进入bus-off或error-passive状态后，SDK仅记录错误日志而不尝试重置总线。SendCanMessage返回失败状态但调用方未处理恢复逻辑，ReadCan线程捕获异常后永久break退出，导致机械臂完全无响应，必须物理断电重连CAN接口才能恢复。

## 环境

机型：agilex-piper；SDK：piper_sdk（piper_interface_v2.py, can_encapsulation.py）；系统：Linux SocketCAN

## 解决办法

1. 在上层控制循环中周期性调用SDK的`isOk`函数检测总线健康状态，若返回`False`则判定为总线无数据或异常。
2. 当检测到`isOk`为`False`时，主动执行CAN接口关闭与重新初始化操作，替代等待内部自动恢复。
3. 避免依赖已注释掉的内部重连逻辑，在应用层实现外部看门狗机制监控`isOk`返回值并触发复位流程。
4. 针对`ReadCan`线程异常退出问题，在应用层封装独立监控线程，一旦发现读取停止即重建CAN连接实例。

讨论原作者：@rphly 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub agilexrobotics/piper_sdk #109：No CAN bus recovery / failure state feedback — silent failure](https://github.com/agilexrobotics/piper_sdk/issues/109)