Skip to content

fix(follower): 左手 RS00 力位闭合失败 —— CAN ID 左 17 / 右 18;随包从爪 1.2.16 - #24

Merged
Vertax42 merged 3 commits into
mainfrom
fix/rs00-can-id
Oct 10, 2026
Merged

Vertax42 merged 3 commits into
mainfrom
fix/rs00-can-id

Conversation

@Vertax42

Copy link
Copy Markdown
Collaborator

根因

RobStride 电机把第 0 字节等于自身 CAN ID 的 MIT 运动帧当成别的命令,在 0xFD 回「前 4 字节 + 4 个 0」。运动帧第 0 字节是目标位置高字节,出厂 ID 127 = 0x7F = −0.098..0 rad,即左手 RS00 的闭合端(右手为 0x80)。从爪固件 ≤ 1.2.15 把它当状态解,包络按假位置钳位,爪子被甩开,力位闭合到 0 失败(0089s,factorytool 1.4.8 实测发现)。定位过程:诊断固件逐帧记录异常帧及其前 4 条 CAN 发送,定向实验目标 0.07/0.05/0.03 每 2 s 约 1000 帧、0.10 时 0 帧。

改动

  • detail::expected_motor_can_id(model_id, side) / Python expected_motor_can_id:RS00 左 17、右 18(< 0x60,避开 ±π 内位置字节 0x60..0x9F);EL05 不纳入。
  • FollowerGripper 打开时 CAN ID 与 SN 左右不符就告警(英文),不写设备,由产线配置工具写入。
  • Motor::on_status 丢弃温度为 0.0 的回显帧(兜底),限频告警。
  • 开合方向告警改为英文。
  • 随包从爪固件 1.2.15 → 1.2.16(固件 PR feat(follower): RS00 从爪分左右手,打开时校验开合方向并告警 #22,a7dc07f,CRC32 0x4a8cd360):固件侧同样不再把回显帧当状态。

验证

  • 0089s 改 ID 17 后,诊断固件计数闭合端回显帧 0(改前约 1000 / 目标)。
  • 不带过滤的旧 SDK 3baac3f + 新 ID:两台力位闭合各 3 次通过。
  • 正式 1.2.16 + 本分支 SDK:force_position_control.py 两台各 3 次、impedance_control.py 各 5 步全部通过。
  • C++ 471 passed(新增:回显帧过滤 pty 用例,去掉过滤即失败;CAN ID 规则与 ±π 位置字节扫描;CAN ID 告警 pty 用例);pytest 129 passed / 2 skipped;协议镜像对固件 a7dc07f 全绿。

不发 SDK 版本(仍 0.4.2)。

🤖 Generated with Claude Code

Vertax42 and others added 3 commits October 10, 2026 12:56
从爪固件(<= 1.2.15)把超时后才到的 MIT 故障应答(字节 1-4 故障字、5-7 为 0)
按普通状态帧解码:温度 0.0、力矩 -t_max、位置被钳到行程另一端。0089s(RS00
左手)闭合时每秒十几帧,ForcePositionController 按它们算出 ~8 rad 外的设定点,
爪子被甩开 4-7 rad/s,闭合到 0 永远不收敛。

Motor::on_status 在本订阅见过非零温度之后,丢掉温度恰为 0.0 的帧(真实电机
不会回到 0.0 C),按 2 的幂次限频告警。

注意:这只挡住主机侧。固件自己也用这些帧更新状态,0089s 闭合仍被甩开,
需要固件修复。

C++ 468 passed(新增 2 条,去掉过滤后 pty 用例失败)。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
根因(0089s,诊断固件 2026-10-10):MIT 运动帧第 0 字节是目标位置的高字节,电机把
第 0 字节等于自己 CAN ID 的运动帧当成别的命令,在 0xFD 上回显前 4 字节、后 4 字节
补 0。出厂 ID 127 = 0x7F,正是 -0.098..0 rad 的位置字节 —— 左手 RS00 的闭合端;右手
那里是 0x80,所以从没出过。目标 0.07/0.05/0.03 每 2 s 约 1000 帧,0.10 一帧没有。

- detail::expected_motor_can_id(model_id, side):RS00 左 17、右 18,其它 nullopt。
  ±π 内的位置字节是 0x60..0x9F,固件兜底扫描 1..0x7F,所以必须 < 0x60;单双对应
  SN 左右。EL05 不区分左右,不纳入。Python 导出 expected_motor_can_id。
- FollowerGripper 打开时 RS00 的 CAN ID 与左右不符就告警(英文),不改写设备 ——
  由产线配置工具写入。开合方向的告警同样改为英文。
- 状态帧过滤保留作兜底,注释与告警改为上述根因。

实机:0089s 写 17、0094s 写 18 并拔插 24V 后,诊断固件在 0089s 闭合端计数 0 帧
(改前约 1000/目标);不带过滤的 SDK 3baac3f 上 force_position_control.py 两台各
3 次全部通过(闭合 0.90-0.93 s,HOLDING_POSITION)。
C++ 471 passed;pytest 129 passed / 2 skipped。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
固件 tc-gu-01 PR #22(a7dc07f)。镜像 167,544 B,CRC32 0x4a8cd360。主爪 1.2.6 不变。
README / CHANGELOG 写明 RS00 电机 CAN ID 左 17 / 右 18 的规则与原因。

实机 0089s(左,ID 17)/ 0094s(右,ID 18),OTA 1.2.16 + 拔插 24V:
force_position_control.py 各 3 次、impedance_control.py 各 5 步全部通过。

C++ 471 passed;pytest 129 passed / 2 skipped;协议镜像对固件 a7dc07f 全绿。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Vertax42
Vertax42 merged commit d83f2ad into main Oct 10, 2026
3 checks passed
@Vertax42
Vertax42 deleted the fix/rs00-can-id branch October 10, 2026 08:06
@Vertax42 Vertax42 mentioned this pull request Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant