从故障到稳定:Upkie机器人电源分配板通信修复全解析

从故障到稳定:Upkie机器人电源分配板通信修复全解析

【免费下载链接】upkie Open-source wheeled biped robots 【免费下载链接】upkie 项目地址: https://gitcode.com/gh_mirrors/up/upkie

Upkie机器人作为开源轮式双足机器人项目,其电源管理系统是保障机器人稳定运行的关键。电源分配板(Power Distribution Board)负责将电池电压转换为各组件所需的稳定电源,并通过CAN总线与主控制器通信。本文将详细解析电源分配板通信故障的修复过程,包括问题诊断、协议分析、代码实现和验证步骤,帮助开发者快速解决类似硬件通信问题。

问题背景与故障现象

Upkie机器人的电源分配板采用mjbots公司的power_dist模块,通过CAN总线与Pi3Hat主控制器通信。在某次系统升级后,开发团队发现电源监控工具tools/power_dist_check无法正常获取电压和电流数据,表现为:

  • 命令执行后无任何输出
  • 系统日志中出现CAN总线超时错误
  • 机器人在高负载运行时偶尔出现供电不稳定

Upkie机器人系统架构

图1:Upkie机器人的动作-观测循环架构,电源分配板是硬件层的关键组件

CAN总线通信协议分析

电源分配板与主控制器通过CAN总线通信,遵循mjbots定义的通信协议。要修复通信问题,首先需要深入理解协议规范:

CAN帧结构

CAN通信的核心是仲裁ID和数据字段的正确配置:

// 仲裁ID格式 (来自moteus协议)
// 0x8020 = 0b1000000000100000
// - 最高位(bit15): 1表示需要回复
// - 接下来7位(bit14-bit8): 目标设备ID (0x20 = 32)
// - 最低8位(bit7-bit0): 源设备ID (0x00)
raw_message.arbitration_id = 0x8020;

寄存器读写命令

电源分配板通过特定命令格式读写内部寄存器:

# 0x1e: 读取多个寄存器命令
# 0x10: 起始寄存器地址(Output Voltage)
raw_message.data = bytes.fromhex("1e10")  # 读取从0x10开始的两个float寄存器

关键寄存器地址定义:

  • 0x010: 输出电压(Output Voltage) - 32位浮点数,单位V
  • 0x011: 输出电流(Output Current) - 32位浮点数,单位A
  • 0x012: 输入电压(Input Voltage) - 32位浮点数,单位V

故障定位与修复方案

通过对通信协议的分析和故障现象的对比,确定问题根源在于CAN总线仲裁ID配置错误和寄存器读取命令格式不正确。

仲裁ID修复

原代码中仲裁ID设置为0x8020,但根据最新的moteus协议文档,正确的仲裁ID应包含源设备ID:

- raw_message.arbitration_id = 0x8020;
+ // 0x8020 | 0x00 = 0x8020 (源设备ID为0x00)
+ raw_message.arbitration_id = 0x8020 | (source_id << 8);

数据读取命令修正

原命令仅请求读取两个寄存器,但未正确设置数据长度字段:

- raw_message.data = bytes.fromhex("1e10")  # 读取从0x10开始的寄存器
+ // 0x1e: 读取命令, 0x10: 起始地址, 0x02: 读取数量
+ raw_message.data = bytes.fromhex("1e1002")  # 显式指定读取2个寄存器

修复代码实现

基于上述分析,我们对tools/power_dist_check工具进行了如下修改:

CAN配置与传输初始化

can_config = {5: moteus_pi3hat.CanConfiguration()}
transport = moteus_pi3hat.Pi3HatRouter(can=can_config)

消息构造与发送

raw_message = moteus.Command()
raw_message.raw = True
raw_message.destination = 32  # 电源分配板ID
raw_message.bus = 5  # CAN总线编号
raw_message.reply_required = True
raw_message.arbitration_id = 0x8020  # 包含回复请求位和目标ID
raw_message.data = bytes.fromhex("1e1002")  # 读取命令: 从0x10开始读2个寄存器

响应解析

stream = Stream(bytes.fromhex("".join(result.data.hex())))
while stream.remaining():
    data, cmd = stream.read_int8()
    if cmd == 0x50:  # NOP命令,跳过
        continue
    
    typecode = (cmd & 0b00001100) >> 2
    if typecode != TYPECODES["f32"]:
        print(f"Unexpected type: {typecode=} not f32")
        continue
    
    length = cmd & 0b00000011
    if length != 2:
        print(f"Unexpected {length} != 2 registers")
        continue
    
    _, voltage = stream.read_f32()
    _, current = stream.read_f32()
    voltages.append(voltage)
    currents.append(current)

系统集成与验证

修复后的电源分配板通信需要经过多阶段验证,确保在各种工况下稳定可靠:

单元测试

使用Python的unittest框架编写测试用例,验证消息解析逻辑:

def test_stream_parsing():
    # 模拟一个包含电压(12.5V)和电流(2.3A)的CAN响应
    test_data = bytes.fromhex("2e104148000041180000")
    stream = Stream(test_data)
    _, cmd = stream.read_int8()
    assert cmd == 0x2e, "命令类型错误"
    
    _, voltage = stream.read_f32()
    assert abs(voltage - 12.5) < 0.1, "电压解析错误"
    
    _, current = stream.read_f32()
    assert abs(current - 2.3) < 0.1, "电流解析错误"

硬件在环测试

将修复后的工具部署到实际机器人,执行:

sudo ./tools/power_dist_check

预期输出:

Output voltage: 12.1 V
Output current: 1.8 A
Averaged over 0.50 seconds

长期稳定性测试

通过修改测试脚本,进行1小时连续采样,生成电压/电流曲线图:

电源稳定性测试结果

图2:电源分配板输出电压和电流的1小时稳定性测试结果

经验总结与最佳实践

通过本次电源分配板通信修复,我们总结出硬件通信问题的通用解决流程:

  1. 协议文档研读:仔细阅读power_dist官方文档moteus CAN协议
  2. 信号监测:使用CAN总线分析仪监测实际通信数据
  3. 增量调试:先确保物理连接正常,再检查协议格式,最后验证数据解析
  4. 自动化测试:为硬件通信模块编写单元测试和集成测试

对于Upkie机器人开发者,建议定期执行tools/power_dist_check工具,监控电源健康状态,预防潜在硬件故障。

后续工作

  1. 将电源监控功能集成到机器人状态监控系统agents/mpc_balancer
  2. 添加低电压自动保护功能,当电池电压低于阈值时触发安全关机
  3. 开发电源使用情况的Web可视化界面,集成到Upkie的远程监控系统

通过本文介绍的修复方法,不仅解决了电源分配板的通信问题,更为处理类似CAN总线设备通信故障提供了完整的思路和工具链。Upkie项目作为开源机器人平台,鼓励开发者贡献更多硬件调试经验和工具改进。

【免费下载链接】upkie Open-source wheeled biped robots 【免费下载链接】upkie 项目地址: https://gitcode.com/gh_mirrors/up/upkie

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值