Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

故障管理

L6 灵巧手的故障检测与清除功能。

概述

通过 hand.fault 访问故障管理功能:

  • 清除故障码
  • 读取故障状态(阻塞式、缓存)

故障码表

故障码说明
NONE0无故障
PHASE_B_OVERCURRENT1B 相过流
PHASE_C_OVERCURRENT2C 相过流
PHASE_A_OVERCURRENT4A 相过流
OVERLOAD_18过载等级 1
OVERLOAD_216过载等级 2
MOTOR_OVERTEMP32关节电机过温
MCU_OVERTEMP64MCU 过温

清除故障

hand.fault.clear_faults()

清除所有关节的故障码。

读取故障

阻塞式读取

data = hand.fault.get_blocking(timeout_ms=500)

参数

  • timeout_ms:超时时间(毫秒),默认 100

返回值FaultData 对象,包含:

  • faultsL6Fault 故障数据
  • timestamp:时间戳

异常

  • TimeoutError:超时未收到响应

缓存读取

data = hand.fault.get_snapshot()

返回最近缓存的故障数据,无数据时返回 None

流式读取

通过顶层 hand.stream() 统一接收所有传感器事件:

from linkerbot.hand.l6 import SensorSource, FaultEvent

hand.start_polling({SensorSource.FAULT: 0.2})

for event in hand.stream():
    match event:
        case FaultEvent(data=data):
            if data.faults.has_any_fault():
                for code in data.faults.to_list():
                    if code.has_fault():
                        print(code.get_fault_names())

hand.stop_polling()
hand.stop_stream()

故障数据

L6Fault 属性

属性说明
thumb_flex拇指弯曲
thumb_abd拇指侧摆
index食指
middle中指
ring无名指
pinky小指

L6Fault 方法

# 检查是否有任何故障
faults.has_any_fault()  # -> bool

# 转为列表
faults.to_list()  # -> list[FaultCode]

# 索引访问
faults[0]  # thumb_flex

FaultCode 方法

# 检查单个关节是否有故障
faults.thumb_flex.has_fault()  # -> bool

# 获取故障名称
faults.thumb_flex.get_fault_names()  # -> list[str]

示例

检查并清除故障

from linkerbot import L6

with L6(side="left", interface_name="can0") as hand:
    # 读取故障状态
    data = hand.fault.get_blocking(timeout_ms=500)

    if data.faults.has_any_fault():
        print("检测到故障:")
        if data.faults.thumb_flex.has_fault():
            print(f"  拇指弯曲:{data.faults.thumb_flex.get_fault_names()}")
        if data.faults.index.has_fault():
            print(f"  食指:{data.faults.index.get_fault_names()}")

        # 清除故障
        hand.fault.clear_faults()
    else:
        print("无故障")

持续监控

from linkerbot import L6
from linkerbot.hand.l6 import SensorSource, FaultEvent

with L6(side="left", interface_name="can0") as hand:
    hand.start_polling({SensorSource.FAULT: 0.2})

    try:
        for event in hand.stream():
            match event:
                case FaultEvent(data=data):
                    if data.faults.has_any_fault():
                        for code in data.faults.to_list():
                            if code.has_fault():
                                print(code.get_fault_names())
    except KeyboardInterrupt:
        pass
    finally:
        hand.stop_polling()
        hand.stop_stream()