十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OOMWOO 逆向工程实战:GD32 传感器状态包协议(CMD 0x15)与 J25/J26 连接器架构深度解析

OOMWOO 逆向工程实战:GD32 传感器状态包协议(CMD 0x15)与 J25/J26 连接器架构深度解析 智能硬件机器人嵌入式物联网【免费下载链接】oomwooOpen-source vacuum robot cleaner项目地址https://gitcode.com/gh_mirrors/oo/oomwoo点击查看免费下载本文围绕 oomwoo 开源扫地机器人项目的逆向工程文档完整解析 3irobotix CRL-200S 平台 GD32 电机控制器与 A33 主控之间的 96 字节传感器状态包、27 条指令集、轮编码器偏移修正以及 J25/J26 连接器架构并与仓库中的 Roborock S5 主板 IC 分析与 OOMWOO I/O 板设计进行交叉印证。读者读完后可以掌握如何按字节偏移解析 GD32 状态包、如何构造 0x66 运动控制指令、如何理解单通道霍尔编码器的 4× 解码原理以及原厂连接器方案与 OOMWOO 自研 I/O 板方案之间的差异。1. 文档背景这份规格在讲什么gd32-sensor-packet-and-connectors.md 是 oomwoo 项目 part-specs 模块中 OsakaTX 贡献者整理的一份补充规格文档其信息源是 codetiger/VacuumTiger 开源项目在 2025 年 12 月至 2026 年 1 月间的代码更新SENSORSTATUS.md与constants.rs。它的定位是给主规格文档 vacuumtiger-verified-specs.md 做增量补充核心增量有三点修正了左右轮编码器偏移量左轮 0x10、右轮 0x18旧版本曾对调完整记录了 96 字节传感器状态包CMD 0x15的逐字节布局给出了 A33 → GD32 的 27 条完整指令集与连接器架构J25/J26的当前认知状态。理解这份文档的钥匙是项目背景oomwoo 是开源的 DIY 扫地机器人见 README.md 与 BOM.md其驱动轮组件选用Roborock S5 系件而大量底层固件协议细节来自对架构相似的3irobotix CRL-200SProscenic 系的逆向工程vacuumtiger-verified-specs.md。因此本文档描述的是协议层事实而平台差异GD32 vs STM32会在第 7 节单独澄清。2. 轮编码器偏移修正2025-12-10commit 3f56cd4VacuumTiger 提交 Fix wheel encoder assignment and lidar scan wrap detectioncommit3f56cd42025-12-10修正了左右轮编码器偏移量分配错误字段偏移旧值错误修正值左轮编码器0x10–0x110x180x10右轮编码器0x18–0x190x100x18注意当前偏移左 0x10右 0x18是修正后的正确分配。更早的 VacuumTiger 版本中两者被对调commit 3f56cd4 修复了该问题。该值与配套文档 vacuumtiger-verified-specs.md 中记录的值一致。这一修正对后续所有依赖编码器数据的模块里程计、导航至关重要——一旦左右轮偏移写反两轮速度会被互换导致机器人在导航时出现方向性漂移。3. 96 字节传感器状态包CMD 0x15逐字节解析状态包是 GD32 周期上报给 A33 的传感器快照来自 VacuumTigerSENSORSTATUS.md2025-12-15帧结构: [0xFA 0xFB] [LEN] [0x15] [PAYLOAD 96 bytes] [CRC_H] [CRC_L] 总长度: 102 字节 上报频率: ~110 Hz115200 baud 下约每 9 ms 一帧帧头0xFA 0xFB是协议魔数LEN为负载长度0x15是命令码CMD末尾为 16 位大端字和校验CRC_H/CRC_L。3.1 关键偏移表来自 constants.rs偏移大小字段类型0x011Bumper 标志u8 位域0x031Cliff 标志u8 位域0x041Dustbox 标志u8 位域0x071Charging 标志u8 位域0x081电池电压原始值 ÷10 伏特u80x10–0x112左轮编码器u16 LE0x18–0x192右轮编码器u16 LE0x28–0x292Gyro X偏航角速率原始值i16 LE0x2A–0x2B2Accel Xi16 LE0x2C–0x2D2Gyro Y俯仰角速率原始值i16 LE0x2E–0x2F2Accel Yi16 LE0x30–0x312Gyro Z横滚角速率原始值i16 LE0x32–0x332Accel Zi16 LE0x34–0x352Tilt XLP 低通滤波后的重力分量i16 LE0x36–0x372Tilt YLP 低通滤波后的重力分量i16 LE0x38–0x392Tilt ZLP 低通滤波后的重力分量i16 LE0x3A–0x3B2启动按钮u16 LE0x3E–0x3F2Dock 按钮u16 LE0x461水箱液位0-100u8几点工程注意编码器为 u16 小端回绕计数器配合 vacuumtiger-verified-specs.md 中的说明回绕处理采用 16 位wrapping_subi16强转的方式来自wheel_odometry.rs即在读取端用有符号差值而非直接比较绝对值。IMU 字段多为原始值i16Gyro 原始值到角速度的换算系数在 VacuumTiger 中为CRL200S_GYRO_SCALE 0.000179 rad/s per raw unit见 vacuumtiger-verified-specs.md 的校准参数表这类系数同样需要在 Roborock S5 平台上重新标定。3.2 标志位位域定义Bumper偏移 0x01bit 1 右保险杠bit 2 左保险杠Cliff偏移 0x03bit 0 左侧bit 1 左前bit 2 右前bit 3 右侧Charging偏移 0x07bit 0 Dock 已连接bit 1 充电中Dustbox偏移 0x04bit 2 尘盒已安装这些位域在 oomwoo 上层软件中的消费方式可参考仓库中的 ros2_mapping.md桥接节点计划将 bumper/cliff/wheel-drop 等以位域形式发布到/oomwoo/io/bumper、/oomwoo/io/cliff等 ROS2 话题并在自定义消息就绪前先用std_msgs/UInt8承载。3.3 电池电压换算状态包偏移 0x08 的原始值 ÷10 得到伏特再映射为百分比BATTERY_VOLTAGE_MIN 13.5V (0%) BATTERY_VOLTAGE_MAX 15.5V (100%) percentage (voltage - 13.5) / (15.5 - 13.5) * 100即 4S Li-ion 电池组14.4V 标称的放电窗口被线性映射为 0~100%。充电相关的标志位偏移 0x07与电池电压偏移 0x08在 README.md 第 9 节Charging Contacts中也有交叉验证充电标志位偏移 0x07、dock 连接位 bit 00x01、充电中位 bit 10x02、电池电压偏移 0x08。4. A33 → GD32 指令集27 条完整命令表0x15 状态包是 GD32 的响应方向。请求方向A33 发给 GD32是一套 27 条指令的指令集所有操作码均在 VacuumTigerconstants.rs中核对过。4.1 串口配置参数值端口/dev/ttyS3A33 UART3波特率1152008N1方向单向A33 → GD32 发命令GD32 → A33 发状态状态上报频率GD32 → A33 约 110 Hz约 9 ms看门狗GD32 要求每 20-50 ms 收到一次心跳CMD 0x06否则电机停机帧格式[0xFA 0xFB] [LEN] [CMD] [PAYLOAD] [CRC_H] [CRC_L]校验16 位大端字和校验初始化上电时约 5 秒唤醒序列4.2 完整指令表Hex命令负载包长用途0x04MCU 休眠无5 B让 GD32 进入休眠0x05唤醒确认无5 B确认 GD32 已唤醒0x06心跳无5 B保活每 20-50 ms0x07版本请求无5 B请求固件版本0x08初始化 / IMU 归零无5 B启动初始化无需 CRC0x0A复位错误码无5 B清除 GD32 错误标志0x0C协议同步1 B0x016 B开机首条命令唤醒 GD320x0D请求 STM32 数据无5 B轮询 GD32 额外数据0x65电机模式1 B6 B0x00idle0x02导航模式0x66电机速度8 B13 B主要运动控制命令0x67电机转速4 B9 B直接控制轮速0x68气泵吸尘2 B7 B风机 0-100%0x69边刷1 B6 B边刷 0-100%0x6A主刷1 B6 B滚刷 0-100%0x6B水泵1 B6 B0关100全开拖地0x71LiDAR PWM4 B9 BLiDAR 电机 0-100%0x78Cliff IR 控制1 B6 B0关1开0x79Cliff IR 方向1 B6 B可配置方向0x86Dock IR 传感器1 B6 BDock 检测传感器0x8D按钮 LED 状态1 B6 B19 种 LED 模式0-180x97LiDAR 电源1 B6 BLiDAR 开/关0x99主板电源1 B6 BA33 电源开/关0x9A主板重启无5 B复位 A330x9B充电器电源1 B6 B充电轨开/关0xA1IMU 出厂校准无5 B触发 IMU 校准0xA2IMU 校准状态无5 B查询校准状态0xA3指南针校准无5 B启动指南针校准0xA4指南针校准状态无5 B查询指南针校准状态观察要点无负载命令是 5 字节帧头 2 LEN 1 CMD 1 CRC 2带 1 字节负载为 6 字节依此类推0x6613 字节与 0x679 字节是仅有的两条运动指令其中0x66 是导航的主控制通道0x0C 协议同步是开机后第一条命令负责唤醒 GD32 并同步波特率0x9A 可由 A33 复位自己0x99 则控制 A33 电源构成完整的电源管理闭环边刷0x69、主刷0x6A、水泵0x6B的百分比控制格式u8 0-100%在 README.md 第 8 节有源码级印证packet.rs141-149 行、commands.rs75 行。4.3 运动控制核心0x66 电机速度指令0x66 是主要运动控制命令帧结构如下Packet: FA FB 0C 66 [linear_vel: 4 bytes i32 LE] [angular_vel: 4 bytes i32 LE] [CRC_H CRC_L]linear_vel 线速度m/s× 523.0强转为 i32 小端angular_vel 角速度rad/s× 523.0强转为 i32 小端示例直线前进 0.3 m/s 时linear 0.3 × 523 157 → 字节序9D 00 00 00angular 0 →00 00 00 00完整包为FA FB 0C 66 9D 00 00 00 00 00 00 00 [CRC]。这里的523.0 缩放系数正是VELOCITY_TO_DEVICE_UNITS常量——它与 vacuumtiger-verified-specs.md 中齿轮箱减速比推导用的是同一个常量该文档第 2 节通过 523.0、wheel_base 0.233 m、max_linear_speed 0.3 m/s反推出约 190:1 的减速比并与 4464 ticks/m 的校准值自洽。也就是说0x66 的数值协议与里程计校准参数是同一套推导体系改平台时必须整体重标。5. J25/J26 连接器架构原厂方案更新版连接器信息来自 codetiger/VacuumRobot 的 Component_Diagram.md2025-10。请特别注意第 5 节描述的是原厂 Roborock 主板的连接器布局且状态标记为假设HYPOTHESIS尚未经物理引脚测量验证。5.1 J25 — 左轮16-pin1.0mm SHD包含信号左轮编码器A/B 通道 2-4 pin尘盒电源2 pin左悬崖传感器IR2-3 pin左保险杠传感器1-2 pin状态❓假设——需要物理引脚分析到 STM32F103 GPIO 的逐 pin 映射仍需万用表导通性追踪5.2 J26 — 右轮16-pin1.0mm SHD包含信号右轮编码器2-4 pin边刷电机电源2 pin右悬崖传感器IR2-3 pin右保险杠传感器1-2 pin状态❓假设——需要物理引脚分析5.3 电机电源连接器已确认分离J24左电机2-pin 2.0mm PH仅电机电源J27右电机2-pin 2.0mm PH仅电机电源关键结论电机电源走独立 2-pin 连接器J24/J27不在16-pin 信号连接器J25/J26上。轮模块的 7-pin 线缆则同时承载两类信号——电机电源线黑/红路由到 J24/J27信号线灰/灰/橙/蓝/棕路由到 J25/J26。这一架构在 io-board-spec-jul18-update.md 中得到了进一步佐证上游 SPEC.md 记录的 Roborock S5 Max 轮组件侧为JST ZH 1.5mm 7-pin 公头7 个引脚按顺序为「wheel-drop 开关 on / com、橙 / 蓝 / 棕霍尔线、MOT、MOT」这与 Scowt PR #13 的物理测量灰/灰限位开关、橙5V、蓝单通道脉冲、棕GND、黑/红电机电源在连接器族与线序上一致。6. 与 OOMWOO 自研 I/O 板的对照从 16-pin SHD 到 5-pin ZH原厂连接器方案只是逆向认知而 oomwoo 项目自己的 I/O 板参考设计makerspet/oomwoo-io-board的 KiCad 原理图采用了不同的精简方案。仓库中的 io-board-wheel-connector-and-caster.md 给出了详细对照特性Roborock S5原厂OOMWOO I/O 板参考设计连接器7-pin JST轮模块侧5-pin JST ZH 1.5mm电机电源在连接器上红/黑线板载 DRV8870 H 桥驱动编码器单通道霍尔3 线单通道ENCODE-AWheel-drop限位开关2 根灰线独立 wheel-drop GPIO引脚间距2.0mmPH或 1.0mmSHD1.5mmZHOOMWOO I/O 板的 J12/J13左/右轮5-pin 连接器只承载逻辑电平信号Pin网络标签功能1WHEEL-M-LEFT/RIGHT-IN1电机驱动 IN1PWM/方向2WHEEL-M-LEFT/RIGHT-IN2电机驱动 IN2PWM/方向3WHEEL-M-LEFT/RIGHT-ENCODE-A编码器信号 A单通道4VCC-5V-WHEEL编码器 5V 供电5GND地配合 io-board-sensors-and-motors-schematic.md 可知电机驱动 IC 为TI DRV8870DDAR每轮一片HSOP-80.2Ω 电流采样电阻R83/R84接入 ADC 形成电流反馈WHEEL-M-EN-V通过 P-MOSFETAO3401控制电机电源使能。原理图上只有ENCODE-A而无ENCODE-B这再次印证了单通道编码器的结论——与 Scowt PR #13 对 Roborock S5 轮模块唯一蓝色编码器信号线的物理检查一致。这种架构差异的意义在于逆向工程出的 0x15 状态包与 0x66 指令语义编码器计数值、百分比命令等可以复用但物理接线必须按 OOMWOO 的 5-pin ZH 方案重新设计 PCB。7. 平台澄清CRL-200SGD32vs Roborock S5STM32本文档强调了一个极易踩坑的混淆点VacuumTiger/VacuumRobot 逆向的是3irobotix CRL-200S其电机控制器为GD32F103VCT6而 oomwoo BOM 指定的Roborock S5驱动轮组件使用的电机控制器是STM32F103VCT6详见 roborock-s5-mainboard-ics.md 中对 Roborock S5 主板的物理拆解记录。平台电机控制器 MCU说明3irobotix CRL-200SGD32F103VCT6VacuumTiger 逆向对象本文档协议来源Roborock S5STM32F103VCT6oomwoo BOM 驱动轮组件两颗芯片都是pin 兼容的 Cortex-M3 MCUGigaDevice/ST 分别出品这正是两者容易混淆的原因但固件协议与主板布局不同。更关键的是校准数据的可移植性问题ticks_per_meter 4464、wheel_base 0.233 m这两组里程计常数来自CRL-200S 的实测标定。Roborock S5 很可能有不同取值——必须在 Roborock 平台上独立重新标定。这一点在 vacuumtiger-verified-specs.md 的校准参数表中被反复标注为在真实硬件上经验标定意味着换平台后任何照搬都会引入系统性里程误差。8. 状态包数据在 oomwoo 软件栈中的去向从仓库现有的软件规划可以推断这批逆向数据将如何被消费。虽然 oomwoo 自研 I/O 板使用 STM32G070 而非 GD32但 ros2_mapping.md 规划的oomwoo_mcu_bridge节点设计理念与本协议高度同构桥接节点是薄层ROS2 管高层行为MCU 管硬安全与电机 IO订阅/cmd_velgeometry_msgs/msg/Twist→ 转换后输出DRIVE_SETPOINT帧对应本文的 0x66 语义FAST_TELEMETRY帧50-100 Hz 目标承载轮编码器与 IMU 数据映射为/odom与/joint_states——对应本文 0x15 状态包中 0x10/0x18 编码器与 0x28-0x39 IMU 字段心跳设计HEARTBEAT 帧与本文 GD32 看门狗CMD 0x0620-50 ms思路一致CPU 超时即停运动仓库中的 oomwoo_mcu_frame.py 提供了可运行的参考帧编解码实现CRC-16/CCITT-FALSE、帧头/长度/类型/负载结构可作为理解这类魔数帧头 长度 命令 负载 CRC协议设计的活教材。需要明确的是这是 oomwoo 项目规划中的新协议OW魔数、16 位消息类型与本文 GD32 协议0xFA 0xFB魔数、8 位 CMD是两套不同设计但底层心跳保活、帧校验、单通道编码器里程的工程思想一脉相承。9. 未决问题与下一步验证路径截至文档更新2026-07-16以下问题仍处于开放状态未决项类别需要的验证手段J25/J26 完整逐 pin 映射 物理探测万用表从连接器到 GD32/STM32 引脚做导通性追踪齿轮箱精确减速比⚙️ 拆解打开齿轮箱数齿Wheel-drop 传感器型号 物理探测轮模块内部目检编码器原始 PPR约 228❌ 推导值磁环极对数/机械检查确认Roborock S5 的里程计标定 实测在 Roborock 平台上独立标定 ticks_per_meter / wheel_base这些gap 驱动的验证路径正是 part-specs README 所鼓励的贡献方式通过安全逆向万用表 示波器、照片标注引脚、波形抓取与来源标注把假设升级为可验证的事实。10. 参考来源与仓库延伸阅读本文档的事实链如下本文主体gd32-sensor-packet-and-connectors.md其原始来源为 codetiger/VacuumTiger 的SENSORSTATUS.md、constants.rsDec 2025 – Jan 2026与编码器修复提交3f56cd4以及 codetiger/VacuumRobot 的 Component_Diagram.md配套规格vacuumtiger-verified-specs.md单通道编码器、4464 ticks/m、190:1 减速比、523.0 缩放系数、TMI8870 驱动与 roborock-s5-mainboard-ics.mdSTM32F103VCT6 主板拆解连接器与 I/O 板io-board-spec-jul18-update.mdJST ZH 1.5mm 7-pin 轮连接器、io-board-wheel-connector-and-caster.md5-pin ZH J12/J13、io-board-sensors-and-motors-schematic.mdDRV8870DDAR 驱动电路软件消费端ros2_mapping.md 与 oomwoo_mcu_frame.py桥接层规划与帧编解码参考实现汇总视图part-specs/OsakaTX/README.md全部件规格汇总与 BOM.md物料清单。对于想要复现或验证的开发者建议路线是先读懂本协议的字节布局 → 用逻辑分析仪抓取真实 0x15 帧核对偏移 → 构造 0x0C/0x06/0x66 命令验证唤醒、心跳与运动控制 → 最后在目标平台上独立重标定里程计参数。仓库为只读参考所有分析均基于现有文档与代码完成。赞分享智能硬件机器人嵌入式物联网【免费下载链接】oomwooOpen-source vacuum robot cleaner项目地址https://gitcode.com/gh_mirrors/oo/oomwoo点击查看免费下载相关推荐Keel版本策略详解SemVer、Force、Glob和Regexp全面对比Keel版本策略详解SemVer、Force、Glob和Regexp全面对比 在Kubernetes容器编排环境中Keel作为自动化Helm、DaemonSLovelyMem内存取证工具完全指南从入门到精通的终极教程LovelyMem内存取证工具完全指南从入门到精通的终极教程 LovelyMem是一款集成MemProcFS、Volatility2与Volatility3的网络安全桌面应用AI Agent人工智能OOMWOO 扫地机器人 I/O 板驱动轮连接器与万向轮规格深度解析OOMWOO 扫地机器人 I/O 板驱动轮连接器与万向轮规格深度解析 导读 本文基于 contributions/part specs/OsakaTX/io b智能硬件机器人嵌入式物联网创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表