Organize hand models and launchers; use linear active joint mapping

This commit is contained in:
2026-09-28 11:05:30 +08:00
parent 325dff6870
commit 01c9aa5c7a
712 changed files with 205077 additions and 6209 deletions
-224
View File
@@ -1,224 +0,0 @@
# 议题 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`*