Files
mujoco_linkerbot/docs/plans/议题3_仿真负责人行动计划.md
T

225 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 议题 3 · 仿真负责人行动计划(O6 摩擦力)
> **角色**:仿真负责人
> **目标**:用「真机三曲线 vs 仿真三曲线」把 MuJoCo 的 **摩擦 / 阻尼** 调到可 Sim2Real
> **方法原文**:议题 3《O6 手摩擦力测量方法》
> **本机仿真现状**:`linker_hand_mujoco_ros2` 已接入 O6 左右手 MJCF,ROS2 话题 `/cb_*_hand_control_cmd`(0~255)
---
## 0. 你负责什么 / 不负责什么
| 你负责(仿真侧) | 他人负责(你要盯着交) |
|------------------|-------------------------|
| MuJoCo 模型可稳定重放同一串 `command_u8` | `hand_<SN>.json` 角度映射(0~255→度)已验收 |
| 从真机 CSV 驱动仿真,导出 `q_sim,v_sim,τ/I_sim` | API 同帧 `joint_u8` + `current`(实际电流) |
| 画出真机↔仿真 **角/速/流** 三叠图 | 真机按 A/B/C 协议采数、CSV 落盘 |
| 按 §3.4 调 `friction` / `damping`(可+自动优化) | Kt、限流值、供电与工装安全 |
| 输出 `dynamics_defaults.json`(公版)与验收图归档 | 抽检 3~5 台样机、聚合策略确认 |
**红线(文档强调):**
1. 映射/终点角不对 → **不准调摩擦**
2. 电流顶满限流 → **不准加摩擦硬凑角度**
3. 只拟合角度、不管电流 → **结果作废**
---
## 1. 一周里程碑(建议排期)
### Day 0~1:入口验收(卡死点)
向算法/标定/嵌入式要齐,否则议题 3 **不得开干**:
- [ ] `hand_<SN>.json`(含 `joint_u8 → deg`,建议还有 `command → deg`)抽检报告
- [ ] 电流单位 = A(或已换算),确认为 **实测电流**
- [ ] Kt(有则更好;暂无可用归一化电流)
- [ ] 样机 SN、固件版本、限流设定
- [ ] 关节命名对照表:JSON 关节名 ↔ MuJoCo joint 名 ↔ ROS 6 维通道索引
**你要产出:**《仿真入口检查单》一页(通过/阻塞项)。
### Day 1~2:仿真「同指令重放」能力
只做软件能力,先不动参数:
| 模块 | 你做什么 | 验收标准 |
|------|----------|----------|
| 日志解析 | 读 `t_ms,command_u8,joint_u8,current_A` | 对齐时间轴、无丢帧统计 |
| Lookup | `joint_u8/command` → `q_real/q_cmd`(度→仿真内部 rad) | 与 JSON 抽检一致 |
| `mj_rollout` | 对**单关节**重放 A/B/C 的 command 轨迹 | 可得到 `q_sim,v_sim`;力矩 `ctrl/actuator force` |
| 电流代理 | `I_sim ≈ τ_sim / Kt`(或归一化到真机量级) | 能画「仿真电流」虚线 |
| `plot_three_curves` | 角/速/流三子图,真机实线+仿真虚线 | 出图可直接给人看 §3 |
**对接现有工程建议路径:**
```text
~/linker_hand_mujoco_ros2/ # ROS2 联调、话题 0~255
~/mujoco_testwork/o6/ # 已有 scene / validate 脚本,可迁辨识离线工具
新建例如:
tools/friction_id/
parse_csv.py
apply_lookup.py
mj_rollout.py # 优先离线 MjModel,不强制开 GUI
plot_three_curves.py
identify_friction.py
export_dynamics.py
```
离线辨识用「直接写 `data.ctrl` / 位置执行器目标」即可;**不必**经过 ROS 话题(话题留给联调演示)。
### Day 2~4:单关节闭环调参(先一个指,例如 index 根节)
按文档协议:
1. 真机交付该关节 `A.csv / B.csv / C.csv`
2. 画真机三曲线 → 按 §3.2 确认「像正常动作」
3. 现有摩擦/阻尼初值跑仿真叠图
4. **只用 A+B** 优化 `{friction, damping}`
5. **段 C** 只验收:三叠图肉眼大致重合 + 未限流
6. Pass → 写入该关节参数草稿
优化目标(入门):
```text
J = w1·‖q_real−q_sim‖² + w2·‖v_real−v_sim‖² + w3·‖I_real−I_sim‖²
建议起步:w1=1.0, w2=0.3~1.0, w3=0.5~2.0
```
人手否决用文档 §3.4 七行表;你要在报告里勾选「属于哪一类」。
### Day 4~6:扩到全手主动 DOF
```text
for joint in O6_主动关节:
锁其它关节 → 收 A/B/C → 拟合 → 段 C 看图 → 通过才入库
```
拇指多 DOF:**一次只扫一个 DOF**。
### Day 6~7:公版发布
- 同软件/同 URDF 版本抽 **3~5** 只手,同名关节取 **中位数或均值**
- 输出:
- `dynamics_defaults.json`
- 全关节段 C 叠图包
- 参数变更说明(改了哪些 joint 的 friction/damping)
- 回写进仓库 MJCF(本仓 `urdf/O6/...xml` 的 `joint damping` / `frictionloss` 或统一 defaults)
---
## 2. 日常调参 SOP(贴显示器)
每次看图只问三句:
1. **角度**:仿真是更快还是更慢?终点对不对?
2. **电流**:真机是否更高?有没有顶满?
3. **慢/快差**哪段更大?→ 摩擦还是阻尼?
| 现象 | 动作 |
|------|------|
| 仿真快 + 真机电流更高且未限流 | ↑ 摩擦;仍快再 ↑ 阻尼 |
| 仿真快 + 真机电流顶满 | **停**;查限流/Kt/力矩上限 |
| 仿真慢 + 真机电流更低 | ↓ 摩擦/阻尼 |
| 终点角差一截 | **停调摩擦**;查 JSON/指令 |
| 慢差大多、快还好 | 主调摩擦 |
| 快差大多、慢还好 | 主调阻尼 |
验收通过定义(仿真负责人签字):
- [ ] 段 C 角度大致重合
- [ ] 段 C 电流平台量级接近,且双方均未长期顶满
- [ ] 速度形状大体一致(允许滤波后略糊)
- [ ] 参数已写入 JSON +(可选)MJCF,带版本与日期
---
## 3. 与现有 MuJoCo/ROS2 的衔接
| 能力 | 状态 | 仿真负责人接下来 |
|------|------|------------------|
| O6 left/right MJCF | 已在包内 `urdf/O6/` | 辨识后回写 damping/friction |
| ROS 6 维 0~255 控制 | 已通 | 联调演示用;辨识用离线重放更稳 |
| Joint UI 看仿真角 | 已有 | 示教/演示;正式对比用 matplotlib 叠图 |
| mimic 比例 | O6 已实现 | 与真机联动 DOF 一致时再比远端 |
| 力矩→电流 | 未做 | `mj_rollout` 中补 Kt 换算 |
| CSV→重放流水线 | 未做 | **本周重点** |
| `dynamics_defaults.json` | 未做 | 调参出口统一格式 |
**建议两套用途拆开:**
- **辨识管线**:离线、可复现、无 GUI、出图+JSON
- **演示管线**:`./run_sim.sh` + 话题 `/cb_left_hand_control_cmd`(见 `README_启动.md`)
---
## 4. 你要推动的外部接口(写进对接群)
请对方按固定 CSV(文档 §5.3):
```text
t_ms,sn,finger,joint_name,command_u8,joint_u8,current_A
```
目录:`logs/O6/<SN>/<joint_name>/{A,B,C}.csv`
并提供:
```text
hand_<SN>.json
Kt(或声明暂用归一化)
限流阈值(A)
关节名对照表
```
对方交数后,你回:
```text
reports/O6/<SN>/<joint>/
overlay_A.png / overlay_B.png / overlay_C.png
fit_summary.json # θ、J、是否限流、是否 Pass
```
---
## 5. 风险清单(仿真负责人盯防)
| 风险 | 表现 | 对策 |
|------|------|------|
| 映射未验收就采数 | 终点角差大 | 入口 checklist 卡死 |
| 把限流当摩擦 | 电流贴顶还猛加 friction | §3.4 第 2 条一票否决 |
| 只过角度不过电流 | 「调完感觉对了」 | 验收强制看电流叠图 |
| ROS 延迟影响辨识 | 跨机丢包、时序漂 | 辨识用离线 ctrl,不跨机 |
| 一次动多关节 | 耦合辨不准 | 协议:一次一关节 |
| 左右手/镜像轴 | 左手 yaw 与右手不同 | 左右分别出参数或明确共用规则 |
---
## 6. 本周最小可交差物(答辩用)
若只能交最小包,按优先级:
1. **一个指根**(如 `index` 根节)A/B 拟合 + C 验收三叠图
2. 对应 `friction/damping` 与前后对比图(调参前 vs 后)
3. 一页结论:用了映射否、是否限流、参数值、是否建议写公版
有了最小包再铺全手,避免一周空转在工具上却没有「一张能给人看懂的叠图」。
---
## 7. 每日站会三句话(仿真侧)
1. 今天在辨哪只手、哪个关节、到第几步?
2. 当前卡在映射 / 电流 / 模型 / 优化哪一类?
3. 有没有触发红线(映射错、限流、只过角度)?
---
## 8. 一句话角色定义
> **仿真负责人** = 把对方给的「同一道 0~255 题」在 MuJoCo 里重做一遍,交出可对上的角/速/流三叠图,并负责任地拧摩擦和阻尼;尺子(角度映射)和电表(真实电流)不对时,拒绝用仿真参数充数。
---
*配套启动与多机联调见:`README_启动.md`*