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
+8
View File
@@ -38,3 +38,11 @@ MUJOCO_LOG.TXT
**/*.urdf.bak*
**/*.xml.bak*
**/*.json.bak*
# Organized generated outputs and rollback snapshots
outputs/
archive/backups/
archive/exports/
# Machine-local workspace links
external_ws/
+52 -196
View File
@@ -1,215 +1,71 @@
# Mujoco LinkerBot(ROS 2)
# LinkerHand MuJoCo 工程
Linker Hand 的 MuJoCo + ROS 2 仿真工作区。支持:
日常只需使用根目录 `run.sh` 和 `hands/`。根目录旧启动脚本已移入归档,不再重复摆放。
- **O6**:经典 6 通道 0~255 控制(launch)
- **G20 左手**:PLAN 桥接、标定查表、MJCF/URDF 零位同步
- **L20 V10.1 左手**:与 G20 双窗对比
- 关节弧度监视 GUI、曲线录制与实验脚本
远程仓库:<https://gitea.robotquan.com/sunxianghui/mujoco_linkerbot.git>
---
## 环境要求
- Ubuntu + ROS 2 **Jazzy**
- 工作区路径示例:`~/linker_hand_mujoco_ros2`
- Python 依赖在本地 `venv`(含 `mujoco` 等;**不要**把 `venv` 提交进仓库)
- `ros2 launch` 使用系统 Python,仅 `source venv` 不够,请用仓库里的启动脚本(会把 `venv/site-packages` 加入 `PYTHONPATH`)
---
## 一、编译(首次或改代码后)
## 启动仿真
```bash
cd ~/linker_hand_mujoco_ros2
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install --packages-select linker_hand_mujoco_ros2
source install/setup.bash
./run.sh O30 right
./run.sh O30 left
./run.sh G20 left
./run.sh O6 right
./run.sh L6 left
./run.sh O12 right
```
`venv/` 已放 `COLCON_IGNORE`,不会被 colcon 误扫。
支持 G20、O6、L6、O30 左右手,以及 O12 右手。参数继续向驱动传递,例如 `./run.sh O30 right --pd-drive`。
---
## 二、O6 仿真(原有流程)
双窗对比在对应手型目录,例如:
```bash
./run_sim.sh
./hands/G20/compare_left.sh
./hands/O6/compare_right.sh
```
- 控制话题:`/cb_left_hand_control_cmd`
- 类型:`sensor_msgs/msg/JointState`
- `position`:6 个数,约 **0~255**(**255≈张开,0≈握紧**)
主动关节使用线性映射;G20 可使用被动 JSON 联动。O12 输入为弧度,其余上述手型为 SDK 0~255。详见 [驱动与映射说明](hands/README.md)。
| 索引 | 含义 |
|------|------|
| 0 | 拇指弯曲 |
| 1 | 拇指横摆 |
| 2 | 食指弯曲 |
| 3 | 中指弯曲 |
| 4 | 无名指弯曲 |
| 5 | 小指弯曲 |
## 目录职责
更多 O6 / 多机 DDS / 曲线录制说明见下文「附录:O6 与多机」。
---
## 三、G20 左手仿真(推荐)
### 3.1 一键启动
```bash
./run_g20_mujoco_plan.sh
```text
run.sh 统一仿真启动入口
hands/ 按手型使用
G20/ O6/ L6/ O12/ O30/
run_left.sh / run_right.sh 单手启动(按支持情况提供)
compare_left.sh / ... 双窗比较(按支持情况提供)
scripts/ 内部启动实现、监视工具
assets/ 包内模型的相对链接
O30/release/ 当前干净的 V10 左右手导出包链接
assets/
exports/ 当前导出包,仅保留干净 V10 包及压缩包
vendor/Linkerbot_URDF/ 原始供应方资产,按手型保存
src/ ROS2 仿真源码、实际运行模型
outputs/
reports/O6/ O6 实验结果
reports/O30/ O30 标定与诊断结果
logs/ 独立运行日志
archive/
backups/ 修改前备份
exports/ 旧版导出、历史副本
launchers/ 原根目录兼容脚本
layout_migration.json 文件搬迁对照清单
tools/ 标定、记录、镜像等开发工具
hardware/ 真机启动/记录脚本(不会被 run.sh 调用)
experiments/ 实验启动脚本
tests/ 回归测试
docs/ 技术文档、计划及历史说明
```
默认行为:
`hands/*/assets` 等链接指向工程内的原文件,不维护重复的运行模型。移动整个工程时保留相对符号链接即可;单独取某个手型时仍需携带其实际资产和共享驱动。
| 项 | 值 |
|----|-----|
| 模型 | `urdf/G20/linker_hand_g20_left/linker_hand_g20_left.xml` |
| 控制话题 | `/g20/cb_left_hand_control_cmd` |
| 状态话题 | `/sim/mujoco/g20/left/joint_state` |
| 指令 | 20 维 0~255(与真机 SDK 通道对齐) |
| 映射 | 标定 JSON 查表 + URDF 被动 mimic |
| 速度 | 约 1.35× 墙钟,可用 `--speed` / `--slew-rad-s` 调整 |
`venv/`、`build/`、`install/`、`log/`、`external_ws/`、`linker_hand_ros2_sdk_ws/` 是环境或 ROS 工作空间。保留原位置,避免破坏虚拟环境及已生成的 ROS 安装路径;平时无需进入这些目录。
常用参数示例:
## 旧文件去哪了
```bash
./run_g20_mujoco_plan.sh --speed 1.0
./run_g20_mujoco_plan.sh --cmd-topic /g20/cb_left_hand_control_cmd
./run_g20_mujoco_plan.sh --mapping g20_calibrated
```
- 原根目录 `run_*.sh`:`archive/launchers/`;真机与实验脚本分别进入 `tools/hardware/`、`tools/experiments/`。
- 原 `exports/`:干净当前包进入 `assets/exports/`,旧版及副本进入 `archive/exports/`。
- 原 `backups/`:`archive/backups/`。
- 原 `reports/`:`outputs/reports/`,按 O6/O30 分类。
- 原 `Linkerbot_URDF/`:`assets/vendor/Linkerbot_URDF/`。
- 原 README、启动说明、行动计划:`docs/legacy/` 和 `docs/plans/`。
### 3.2 关节弧度 GUI
```bash
./run_g20_joint_gui.sh
```
默认订阅 `/sim/mujoco/g20/left/joint_state`,按手指分组显示 hinge 弧度(默认 6 位小数)。
### 3.3 G20 + L20 双窗对比
```bash
./run_dual_mujoco_compare.sh
```
- 左窗:当前标定 **G20**(`g20_calibrated`)
- 右窗:**L20 V10.1** 原版 URDF 映射(`l20_urdf`,默认关 collision project,避免自碰卡住)
- 共用同一条 0~255 控制话题(默认 `/g20/cb_left_hand_control_cmd`)
---
## 四、标定与模型文件(G20)
目录:
`src/linkerhand-sim/linker_hand_mujoco_ros2/linker_hand_mujoco_ros2/urdf/G20/linker_hand_g20_left/`
| 文件 | 说明 |
|------|------|
| `linkerhand_g20_left.urdf` | 当前使用的 URDF(含投影零位修正) |
| `linker_hand_g20_left.xml` | 当前使用的 MJCF(与 URDF 原点/限位同步) |
| `g20_left_G20_LEFT_001_calibration.json` | 运行时 0~255→弧度查表(schema 3) |
| `meshes/` | 网格 |
映射实现:`utils/g20_joints.py`
要点:
1. **主动关节**:用标定 JSON 的 `angle_rad[0..255]` 查表。
2. **零位**:用 `zero_angles.table_projected_zero_rad` 相对夹具参考修正 URDF/MJCF `origin`(相机投影零位,非完整外参优化)。
3. **被动关节**:`thumb_ip`、四指 DIP 走 URDF mimic;JSON 里 `thumb_ip` 是累计投影角,**不能**直接当相对关节角。
4. **四指侧摆**:运行时符号与真机约定见 `G20_FLIP_JOINT_SIGN`。
当前已知:张开大姿态已基本对齐;拇指 CMC 零位仍可能有小量前探/拧向残差。更稳妥的做法是解耦重测三个 CMC 投影零位,或导出 TAG 全位姿后做原点优化,而不是肉眼加减角度。
---
## 五、主要源码入口
| 路径 | 说明 |
|------|------|
| `linker_hand_mujoco_ros2/g20_plan_bridge.py` | G20/L20 MuJoCo PLAN 桥 |
| `linker_hand_mujoco_ros2/g20_joint_monitor_gui.py` | 关节弧度监视 GUI |
| `linker_hand_mujoco_ros2/utils/g20_joints.py` | G20 标定查表与映射 |
| `launch/linker_hand_mujoco_ros2.launch.py` | O6 launch |
| `urdf/O6/` | O6 MJCF |
| `urdf/G20/` | G20 URDF/MJCF + 标定 |
| `urdf/L20_V10.1/` | L20 V10.1 URDF/MJCF |
| `tools/` | 曲线录制、实验脚本 |
Console 入口(`setup.py`):`g20_plan_bridge`、`g20_joint_monitor_gui` 等。
---
## 六、克隆与推送
```bash
git clone https://gitea.robotquan.com/sunxianghui/mujoco_linkerbot.git
cd mujoco_linkerbot
# 自建 venv 并安装 mujoco 等依赖后,再 colcon build
```
本仓库 `origin` 指向上述 Gitea 地址。提交后:
```bash
git push -u origin main
```
---
## 附录:O6 与多机
### 本机发一帧(O6 握拳示例)
```bash
source /opt/ros/jazzy/setup.bash
export ROS_DOMAIN_ID=30
export ROS_LOCALHOST_ONLY=0
ros2 topic pub --once /cb_left_hand_control_cmd sensor_msgs/msg/JointState "{
header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''},
name: [],
position: [0.0, 100.0, 0.0, 0.0, 0.0, 0.0],
velocity: [],
effort: []
}"
```
### 两台电脑共用 ROS 2
两边约定同一 Domain:
```bash
export ROS_DOMAIN_ID=30
export ROS_LOCALHOST_ONLY=0
```
仿真机跑 `./run_sim.sh` 或 `./run_g20_mujoco_plan.sh`;控制机 `ros2 topic list` / `hz` / `echo` 检查。
### 通用曲线录制
```bash
source /opt/ros/jazzy/setup.bash
export ROS_DOMAIN_ID=30
export ROS_LOCALHOST_ONLY=0
python3 tools/hand_curve_recorder_standalone.py --hand left --channel 3 --label sim
```
### 常见问题
**`ModuleNotFoundError: No module named 'mujoco'`**
用 `./run_sim.sh` / `./run_g20_mujoco_plan.sh`,或手动把 `venv/lib/python3.12/site-packages` 加入 `PYTHONPATH`。
**L20 双窗对比时手不动**
自碰投影会把目标打回;`run_dual_mujoco_compare.sh` 已对 L20 默认 `--no-collision-project`。
---
## 许可与归属
包内模型与标定数据来自 Linker Hand / 本机标定流程;请按公司内部仓库规范使用与分发。
本轮仅整理目录和路径引用,不改关节参数、网格或控制话题。O30 左手入口从旧 V9 文件名切换到干净 V10 文件名,已核对两个 URDF 的 SHA256 完全一致。
+6
View File
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# 兼容入口:左手双开(G20 标定 vs L20 V10.1 未标定)
# 实际逻辑见 run_g20_left_dual_compare.sh(与右手 run_g20_right_dual_compare.sh 对称)
set -eo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_left_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_joint_gui.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_left_desktop_urdf.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_left_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_left_mcp_roll_check.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_right_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_right_joint_gui.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/G20/scripts/run_g20_right_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/L6/scripts/run_l6_left_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/L6/scripts/run_l6_left_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/L6/scripts/run_l6_right_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/L6/scripts/run_l6_right_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O12/scripts/run_o12_right_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O12/scripts/run_o12_right_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/scripts/run_o30_left_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/scripts/run_o30_right_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/legacy/run_o30_right_v5_piecewise.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/legacy/run_o30_right_v6_linear.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/legacy/run_o30_right_v7_linear.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/legacy/run_o30_right_v8_linear.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O30/legacy/run_o30_right_v9_linear.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O6/scripts/run_o6_left_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O6/scripts/run_o6_left_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O6/scripts/run_o6_right_dual_compare.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Compatibility entry; implementation is grouped by hand model.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/O6/scripts/run_o6_right_mujoco_plan.sh" "$@"
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Legacy ROS launch interface; prefer hands/<MODEL>/run_<SIDE>.sh.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$ROOT/hands/legacy/run_sim.sh" "$@"
+167
View File
@@ -0,0 +1,167 @@
{
"date": "20260928_104430",
"moves": {
"run_o6_right_dual_compare.sh": "archive/launchers/run_o6_right_dual_compare.sh",
"run_g20_joint_gui.sh": "archive/launchers/run_g20_joint_gui.sh",
"run_o6_right_mujoco_plan.sh": "archive/launchers/run_o6_right_mujoco_plan.sh",
"run_o30_right_v9_linear.sh": "archive/launchers/run_o30_right_v9_linear.sh",
"run_o30_left_mujoco_plan.sh": "archive/launchers/run_o30_left_mujoco_plan.sh",
"run_dual_mujoco_compare.sh": "archive/launchers/run_dual_mujoco_compare.sh",
"run_o6_left_dual_compare.sh": "archive/launchers/run_o6_left_dual_compare.sh",
"run_l6_right_mujoco_plan.sh": "archive/launchers/run_l6_right_mujoco_plan.sh",
"run_g20_mujoco_plan.sh": "archive/launchers/run_g20_mujoco_plan.sh",
"run_g20_right_dual_compare.sh": "archive/launchers/run_g20_right_dual_compare.sh",
"run_g20_left_dual_compare.sh": "archive/launchers/run_g20_left_dual_compare.sh",
"run_o30_right_mujoco_plan.sh": "archive/launchers/run_o30_right_mujoco_plan.sh",
"run_o12_right_dual_compare.sh": "archive/launchers/run_o12_right_dual_compare.sh",
"run_sim.sh": "archive/launchers/run_sim.sh",
"run_o30_right_v7_linear.sh": "archive/launchers/run_o30_right_v7_linear.sh",
"run_l6_left_dual_compare.sh": "archive/launchers/run_l6_left_dual_compare.sh",
"run_g20_left_mcp_roll_check.sh": "archive/launchers/run_g20_left_mcp_roll_check.sh",
"run_l6_right_dual_compare.sh": "archive/launchers/run_l6_right_dual_compare.sh",
"run_l6_left_mujoco_plan.sh": "archive/launchers/run_l6_left_mujoco_plan.sh",
"run_o30_right_v6_linear.sh": "archive/launchers/run_o30_right_v6_linear.sh",
"run_o12_right_mujoco_plan.sh": "archive/launchers/run_o12_right_mujoco_plan.sh",
"run_g20_left_desktop_urdf.sh": "archive/launchers/run_g20_left_desktop_urdf.sh",
"run_o30_right_v8_linear.sh": "archive/launchers/run_o30_right_v8_linear.sh",
"run_g20_right_joint_gui.sh": "archive/launchers/run_g20_right_joint_gui.sh",
"run_o6_left_mujoco_plan.sh": "archive/launchers/run_o6_left_mujoco_plan.sh",
"run_o30_right_v5_piecewise.sh": "archive/launchers/run_o30_right_v5_piecewise.sh",
"run_g20_right_mujoco_plan.sh": "archive/launchers/run_g20_right_mujoco_plan.sh",
"run_real_middle_record.sh": "tools/hardware/run_real_middle_record.sh",
"run_real_hand.sh": "tools/hardware/run_real_hand.sh",
"run_middle_step_experiment.sh": "tools/experiments/run_middle_step_experiment.sh",
"hands/L6/run_l6_right_mujoco_plan.sh": "hands/L6/scripts/run_l6_right_mujoco_plan.sh",
"hands/L6/run_l6_left_dual_compare.sh": "hands/L6/scripts/run_l6_left_dual_compare.sh",
"hands/L6/run_l6_right_dual_compare.sh": "hands/L6/scripts/run_l6_right_dual_compare.sh",
"hands/L6/run_l6_left_mujoco_plan.sh": "hands/L6/scripts/run_l6_left_mujoco_plan.sh",
"hands/O30/run_o30_left_mujoco_plan.sh": "hands/O30/scripts/run_o30_left_mujoco_plan.sh",
"hands/O30/run_o30_right_mujoco_plan.sh": "hands/O30/scripts/run_o30_right_mujoco_plan.sh",
"hands/O12/run_o12_right_dual_compare.sh": "hands/O12/scripts/run_o12_right_dual_compare.sh",
"hands/O12/run_o12_right_mujoco_plan.sh": "hands/O12/scripts/run_o12_right_mujoco_plan.sh",
"hands/G20/run_g20_joint_gui.sh": "hands/G20/scripts/run_g20_joint_gui.sh",
"hands/G20/run_g20_mujoco_plan.sh": "hands/G20/scripts/run_g20_mujoco_plan.sh",
"hands/G20/run_g20_right_dual_compare.sh": "hands/G20/scripts/run_g20_right_dual_compare.sh",
"hands/G20/run_g20_left_dual_compare.sh": "hands/G20/scripts/run_g20_left_dual_compare.sh",
"hands/G20/run_g20_left_mcp_roll_check.sh": "hands/G20/scripts/run_g20_left_mcp_roll_check.sh",
"hands/G20/run_g20_left_desktop_urdf.sh": "hands/G20/scripts/run_g20_left_desktop_urdf.sh",
"hands/G20/run_g20_right_joint_gui.sh": "hands/G20/scripts/run_g20_right_joint_gui.sh",
"hands/G20/run_g20_right_mujoco_plan.sh": "hands/G20/scripts/run_g20_right_mujoco_plan.sh",
"hands/O6/run_o6_right_dual_compare.sh": "hands/O6/scripts/run_o6_right_dual_compare.sh",
"hands/O6/run_o6_right_mujoco_plan.sh": "hands/O6/scripts/run_o6_right_mujoco_plan.sh",
"hands/O6/run_o6_left_dual_compare.sh": "hands/O6/scripts/run_o6_left_dual_compare.sh",
"hands/O6/run_o6_left_mujoco_plan.sh": "hands/O6/scripts/run_o6_left_mujoco_plan.sh",
"backups": "archive/backups",
"exports": "assets/exports",
"Linkerbot_URDF": "assets/vendor/Linkerbot_URDF",
"reports": "outputs/reports",
"MUJOCO_LOG.TXT": "outputs/logs/MUJOCO_LOG.TXT",
"README.md": "docs/legacy/README_before_directory_cleanup.md",
"README_启动.md": "docs/legacy/README_启动.md",
"议题3_仿真负责人行动计划.md": "docs/plans/议题3_仿真负责人行动计划.md",
"assets/exports/O30_right_V7_linear": "archive/exports/O30_right_V7_linear",
"assets/exports/O30_right_V9_linear": "archive/exports/O30_right_V9_linear",
"assets/exports/O30_V9_left_right": "archive/exports/O30_V9_left_right",
"assets/exports/O30_right_V6_linear.zip": "archive/exports/O30_right_V6_linear.zip",
"assets/exports/O30_right_V7_linear.zip": "archive/exports/O30_right_V7_linear.zip",
"assets/exports/O30_V10_left_right (副本)": "archive/exports/O30_V10_left_right (副本)",
"assets/exports/O30_V9_left_right.zip": "archive/exports/O30_V9_left_right.zip",
"assets/exports/O30_right_V10_linear.zip": "archive/exports/O30_right_V10_linear.zip",
"assets/exports/O30_right_V8_linear.zip": "archive/exports/O30_right_V8_linear.zip",
"assets/exports/O30_right_V6_linear": "archive/exports/O30_right_V6_linear",
"assets/exports/O30_left_right (副本)": "archive/exports/O30_left_right (副本)",
"assets/exports/O30_right_V10_linear": "archive/exports/O30_right_V10_linear",
"assets/exports/O30_left_right (副本).zip": "archive/exports/O30_left_right (副本).zip",
"assets/exports/O30_right_V8_linear": "archive/exports/O30_right_V8_linear",
"assets/exports/O30_right_V9_linear.zip": "archive/exports/O30_right_V9_linear.zip",
"outputs/reports/o30_right_middle_review": "outputs/reports/O30/o30_right_middle_review",
"outputs/reports/o30_right_multiview_calibration": "outputs/reports/O30/o30_right_multiview_calibration",
"outputs/reports/o30_right_two_joint_calibration": "outputs/reports/O30/o30_right_two_joint_calibration",
"outputs/reports/O6_index_sweep": "outputs/reports/O6/O6_index_sweep",
"outputs/reports/o30_right_tip_review": "outputs/reports/O30/o30_right_tip_review",
"outputs/reports/o30_right_zero_v10_calibration": "outputs/reports/O30/o30_right_zero_v10_calibration",
"outputs/reports/o30_right_pinch_calibration": "outputs/reports/O30/o30_right_pinch_calibration",
"outputs/reports/o30_right_middle_calibration": "outputs/reports/O30/o30_right_middle_calibration",
"outputs/reports/o30_right_zero_review": "outputs/reports/O30/o30_right_zero_review",
"outputs/reports/o30_right_pinky_refinement": "outputs/reports/O30/o30_right_pinky_refinement",
"outputs/reports/o30_right_pinky_root_calibration": "outputs/reports/O30/o30_right_pinky_root_calibration",
"outputs/reports/o30_right_photo_calibration": "outputs/reports/O30/o30_right_photo_calibration",
"outputs/reports/o30_right_two_joint_review": "outputs/reports/O30/o30_right_two_joint_review",
"outputs/reports/o30_right_endpoint_calibration": "outputs/reports/O30/o30_right_endpoint_calibration",
"outputs/reports/O6_middle_sweep": "outputs/reports/O6/O6_middle_sweep",
"outputs/reports/O6_middle_ros": "outputs/reports/O6/O6_middle_ros",
"outputs/reports/o30_right_linear_calibration": "outputs/reports/O30/o30_right_linear_calibration"
},
"updated_text_files": [
"hands/L6/run_left.sh",
"hands/L6/run_right.sh",
"hands/O30/run_left.sh",
"hands/O30/run_right.sh",
"hands/O12/run_right.sh",
"hands/G20/run_left.sh",
"hands/G20/run_right.sh",
"hands/O6/run_left.sh",
"hands/O6/run_right.sh",
"hands/L6/scripts/run_l6_right_mujoco_plan.sh",
"hands/L6/scripts/run_l6_left_dual_compare.sh",
"hands/L6/scripts/run_l6_right_dual_compare.sh",
"hands/L6/scripts/run_l6_left_mujoco_plan.sh",
"hands/O30/legacy/run_o30_right_v9_linear.sh",
"hands/O30/legacy/run_o30_right_v7_linear.sh",
"hands/O30/legacy/run_o30_right_v6_linear.sh",
"hands/O30/legacy/run_o30_right_v8_linear.sh",
"hands/O30/legacy/run_o30_right_v5_piecewise.sh",
"hands/O30/scripts/run_o30_left_mujoco_plan.sh",
"hands/O30/scripts/run_o30_right_mujoco_plan.sh",
"hands/O12/scripts/run_o12_right_dual_compare.sh",
"hands/O12/scripts/run_o12_right_mujoco_plan.sh",
"hands/G20/scripts/run_g20_right_dual_compare.sh",
"hands/G20/scripts/run_g20_left_dual_compare.sh",
"hands/G20/scripts/run_g20_left_mcp_roll_check.sh",
"hands/G20/scripts/run_g20_left_desktop_urdf.sh",
"hands/G20/scripts/run_g20_right_mujoco_plan.sh",
"hands/O6/scripts/run_o6_right_dual_compare.sh",
"hands/O6/scripts/run_o6_right_mujoco_plan.sh",
"hands/O6/scripts/run_o6_left_dual_compare.sh",
"hands/O6/scripts/run_o6_left_mujoco_plan.sh",
"tools/run_middle_step_experiment.py",
"tools/hand_curve_recorder_standalone.py",
"tools/ros_real_record_qvt.py",
"tools/ros_mujoco_record_qvt.py",
"tools/friction_id/sweep_index_plot.py",
"tools/experiments/run_middle_step_experiment.sh",
"tools/o30_mirror/build.py",
"tools/o30_right_calibration/two_joint_review.py",
"tools/o30_right_calibration/fit_two_joints.py",
"tools/o30_right_calibration/README_v7.md",
"tools/o30_right_calibration/fit_photos.py",
"tools/o30_right_calibration/fit_middle.py",
"tools/o30_right_calibration/README_v3.md",
"tools/o30_right_calibration/fit_linear.py",
"tools/o30_right_calibration/README.md",
"tools/o30_right_calibration/fit_pinky.py",
"tools/o30_right_calibration/README_v1.md",
"tools/o30_right_calibration/README_v8.md",
"tools/o30_right_calibration/calibrate.py",
"tools/o30_right_calibration/fit_multiview.py",
"tools/o30_right_calibration/README_v9.md",
"tools/o30_right_calibration/fit_pinky_root.py",
"tools/o30_right_calibration/README_v2.md",
"tools/o30_right_calibration/fit_zero_v10.py",
"tools/o30_right_calibration/README_v5.md",
"tools/o30_right_calibration/README_v4.md",
"tools/o30_right_calibration/fit_endpoints.py",
"tools/o30_right_calibration/README_v6.md",
"src/linkerhand-sim/linker_hand_mujoco_ros2/linker_hand_mujoco_ros2/hand_curve_recorder.py",
"src/linkerhand-sim/linker_hand_mujoco_ros2/launch/hand_curve_recorder.launch.py",
"src/linkerhand-sim/linker_hand_mujoco_ros2/launch/g20_plan_bridge.launch.py",
"outputs/reports/o30_right_tip_review/render_rejected_candidate.py",
"outputs/reports/o30_right_tip_review/search_restricted.py",
"outputs/reports/o30_right_tip_review/search_relaxed_diagnostic.py",
"outputs/reports/o30_right_tip_review/strict_geometry/pivot_probe.py",
"outputs/reports/o30_right_tip_review/strict_geometry/check_axes.py",
"outputs/reports/o30_right_tip_review/strict_geometry/isolated_mcp_review.py",
"archive/launchers/run_dual_mujoco_compare.sh"
],
"backup": "archive/backups/before_directory_cleanup_20260928_104430"
}
Binary file not shown.
@@ -0,0 +1,28 @@
# O30 V10 左右手(最新零位校准版)
此目录为最新 V10 的独立副本,文件名已统一为 v10。旧目录和启动脚本未更改。
- 左手:`left/linkerhand_o30_left_v10.urdf`
- 右手:`right/linkerhand_o30_right_v10.urdf`
- 两侧各附带自己的 `meshes/`,移动时需与对应 URDF 一起复制。
右手是最新 V10 零位校准版,左手为其完整镜像。保持 SDK 0~255 按关节限位纯线性换算,没有分段映射。相同 SDK 顺序见 `sdk_joint_order.txt`;四组对指及零位见 `commands.json` 的 `sdk_command`。
零位指令:
```
[0,0,255,197,110,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
```
`left_ros_radians` 只是内部弧度参考,不能当作 SDK 指令发送。左手话题为 `/cb_left_hand_control_cmd`,右手为 `/cb_right_hand_control_cmd`,均接收 JointState.position 的 20 个 SDK 值。
从本目录显式启动(在项目根目录执行):
```bash
O30_LEFT_URDF="$PWD/exports/O30_V10_left_right/left/linkerhand_o30_left_v10.urdf" ./run_o30_left_mujoco_plan.sh
O30_RIGHT_URDF="$PWD/exports/O30_V10_left_right/right/linkerhand_o30_right_v10.urdf" ./run_o30_right_mujoco_plan.sh
```
复制来源已通过原始 SHA256 检查;新左右手 URDF 和网格与来源一致,仅 URDF 文件名更新。`validation.json` 与 `comparison.png` 为这些相同资产的既有验证记录和预览,复制本身不表示重新拟合。
左手仍是右手的对称仿真资产,未对左手真机单独标定。V10 基于伸直/并行几何先验调整零位,保留四组捏合及已校准弯曲端点,不代表照片精确测角或真机全行程验证。
@@ -0,0 +1,52 @@
{
"README.md": "a147289beed7c19242d3d21b6a7ad030c0ab1072e2957ca99214d99f83adcf23",
"commands.json": "69879230c754d5b36a59962b9a46f858f7a928adbf0aa7f06aa5408ce0e99b0e",
"comparison.png": "3c2e88a55788dfef722401006b0313ba82ee6ea31f3a6e9c0ba8729b79d6bdce",
"left/linkerhand_o30_left_v10.urdf": "44c8fdb411a712cac1f6be83b31c97344684e850ea1fbdb784ee93f2b515fe7a",
"left/meshes/hand_base_link.STL": "0a2d3b5716441a937b4983f544d5f7e9cf48efa406834bd99088c260a9fe161d",
"left/meshes/index_distal.STL": "dc58601a997bb95b70bf304cca6162942c0156aca17790adb94f5856235c9916",
"left/meshes/index_metacarpals.STL": "43fe41dee08b286c9c74d028518e6039a60fa875fa9786f19e8b0fa84bc2e2c2",
"left/meshes/index_middle.STL": "9b921b66922da9ccefd37b363728931747278200c50b566c79a1240afc8b3627",
"left/meshes/index_proximal.STL": "e8f06b5aaee297b71818bb60f338fa795d546061d1db00b056d99af1817644a3",
"left/meshes/middle_distal.STL": "dc58601a997bb95b70bf304cca6162942c0156aca17790adb94f5856235c9916",
"left/meshes/middle_metacarpals.STL": "43fe41dee08b286c9c74d028518e6039a60fa875fa9786f19e8b0fa84bc2e2c2",
"left/meshes/middle_middle.STL": "9b921b66922da9ccefd37b363728931747278200c50b566c79a1240afc8b3627",
"left/meshes/middle_proximal.STL": "e8f06b5aaee297b71818bb60f338fa795d546061d1db00b056d99af1817644a3",
"left/meshes/pinky_distal.STL": "dc58601a997bb95b70bf304cca6162942c0156aca17790adb94f5856235c9916",
"left/meshes/pinky_metacarpals.STL": "43fe41dee08b286c9c74d028518e6039a60fa875fa9786f19e8b0fa84bc2e2c2",
"left/meshes/pinky_middle.STL": "9b921b66922da9ccefd37b363728931747278200c50b566c79a1240afc8b3627",
"left/meshes/pinky_proximal.STL": "e8f06b5aaee297b71818bb60f338fa795d546061d1db00b056d99af1817644a3",
"left/meshes/ring_distal.STL": "dc58601a997bb95b70bf304cca6162942c0156aca17790adb94f5856235c9916",
"left/meshes/ring_metacarpals.STL": "43fe41dee08b286c9c74d028518e6039a60fa875fa9786f19e8b0fa84bc2e2c2",
"left/meshes/ring_middle.STL": "9b921b66922da9ccefd37b363728931747278200c50b566c79a1240afc8b3627",
"left/meshes/ring_proximal.STL": "e8f06b5aaee297b71818bb60f338fa795d546061d1db00b056d99af1817644a3",
"left/meshes/thumb_distal.STL": "096be98ed92fa14e975bd0564ec0ae80c3d785bac2a067f95120c20384b0e648",
"left/meshes/thumb_metacarpals_base1.STL": "f13ee3f0f9c3a63738badd186897b5e6ed06a3e470dc860d632ebd39afe13bcf",
"left/meshes/thumb_metacarpals_base2.STL": "ee4b38c013c1ac058fbc8acc2a80ab6da2bf6488a923c0bb1c17d241727941e6",
"left/meshes/thumb_proximal.STL": "58b7ee4495f9a9a08986569495bc2e95b1c637285e8704b1ad2091eb5a328260",
"right/linkerhand_o30_right_v10.urdf": "f233c5eff38ba46d1a2826c2624fc8a13e86ed0c74c6b914bf0fcc021b43e439",
"right/meshes/hand_base_link.STL": "716e9d422aa39f8d55f86e6d39edde411464fc8a5efeb5c1704d94769dc255ae",
"right/meshes/index_distal.STL": "1d99204e33765680dccc175c99144e7694069fa1a5bdf3f4207abe4471ec2dd9",
"right/meshes/index_metacarpals.STL": "e20eec3a9178a3b2d49f42e73dc7beebe36a7d54d4bc1956c84012c1d57cdff7",
"right/meshes/index_middle.STL": "8c659e3ad85a73f0e2da7e54dc83ecfd1abfa453f87c72f2feb30cbdda8937f5",
"right/meshes/index_proximal.STL": "4537368931f8b361d89f80263d408fb8a1d8c1457d01dc45988dfb129c6a91ca",
"right/meshes/middle_distal.STL": "1d99204e33765680dccc175c99144e7694069fa1a5bdf3f4207abe4471ec2dd9",
"right/meshes/middle_metacarpals.STL": "e20eec3a9178a3b2d49f42e73dc7beebe36a7d54d4bc1956c84012c1d57cdff7",
"right/meshes/middle_middle.STL": "8c659e3ad85a73f0e2da7e54dc83ecfd1abfa453f87c72f2feb30cbdda8937f5",
"right/meshes/middle_proximal.STL": "4537368931f8b361d89f80263d408fb8a1d8c1457d01dc45988dfb129c6a91ca",
"right/meshes/pinky_distal.STL": "1d99204e33765680dccc175c99144e7694069fa1a5bdf3f4207abe4471ec2dd9",
"right/meshes/pinky_metacarpals.STL": "e20eec3a9178a3b2d49f42e73dc7beebe36a7d54d4bc1956c84012c1d57cdff7",
"right/meshes/pinky_middle.STL": "8c659e3ad85a73f0e2da7e54dc83ecfd1abfa453f87c72f2feb30cbdda8937f5",
"right/meshes/pinky_proximal.STL": "4537368931f8b361d89f80263d408fb8a1d8c1457d01dc45988dfb129c6a91ca",
"right/meshes/ring_distal.STL": "1d99204e33765680dccc175c99144e7694069fa1a5bdf3f4207abe4471ec2dd9",
"right/meshes/ring_metacarpals.STL": "e20eec3a9178a3b2d49f42e73dc7beebe36a7d54d4bc1956c84012c1d57cdff7",
"right/meshes/ring_middle.STL": "8c659e3ad85a73f0e2da7e54dc83ecfd1abfa453f87c72f2feb30cbdda8937f5",
"right/meshes/ring_proximal.STL": "4537368931f8b361d89f80263d408fb8a1d8c1457d01dc45988dfb129c6a91ca",
"right/meshes/thumb_distal.STL": "2787c34dbc977938bd3975241870a6c43861bc06a4d7af995b7ff81e183106bd",
"right/meshes/thumb_metacarpals_base1.STL": "c9f36d66bc9d71c19baf3b33efa3cdcfe3a08bda9553ad09a8b65dcd1500f9b3",
"right/meshes/thumb_metacarpals_base2.STL": "0c8a4fe61141aaadda809cb5d03a51ec1e07fb4799e941aaa4eff1dc8e4ed260",
"right/meshes/thumb_proximal.STL": "2f2d5d1295e613a9545dac8f31834e1de93583d85786c59f5be269f1049b9a3e",
"sdk_joint_order.txt": "748b195c245f3567d22e3f71dd41585c32518906e36096ffe4fb8d70a2d9b5c8",
"validation.json": "a82168d0f719d54ddbbc5003fce1b45816cafad09a1a6d2fbaadfacda234cab1",
"version.json": "f2f92c82292faab7b2586350da189488824b09dd326e96d5a30f8b8dc391c64e"
}
@@ -0,0 +1,281 @@
{
"asset_version": "V10",
"command_topic": "/cb_left_hand_control_cmd",
"command_units": "SDK 0..255; send sdk_command, not left_ros_radians",
"sdk_joint_order": [
"thumb_cmc_roll",
"thumb_cmc_yaw",
"index_mcp_roll",
"middle_mcp_roll",
"ring_mcp_roll",
"pinky_mcp_roll",
"thumb_mcp",
"index_mcp_pitch",
"middle_mcp_pitch",
"ring_mcp_pitch",
"pinky_mcp_pitch",
"index_pip",
"middle_pip",
"ring_pip",
"pinky_pip",
"thumb_ip",
"index_dip",
"middle_dip",
"ring_dip",
"pinky_dip"
],
"left_ros_order": [
"thumb_cmc_roll",
"thumb_cmc_yaw",
"thumb_mcp",
"thumb_ip",
"index_mcp_roll",
"index_mcp_pitch",
"index_pip",
"index_dip",
"middle_mcp_roll",
"middle_mcp_pitch",
"middle_pip",
"middle_dip",
"ring_mcp_roll",
"ring_mcp_pitch",
"ring_pip",
"ring_dip",
"pinky_mcp_roll",
"pinky_mcp_pitch",
"pinky_pip",
"pinky_dip"
],
"pinches": {
"index": {
"sdk_command": [
55,
181,
225,
176,
212,
162,
135,
164,
0,
0,
0,
139,
0,
0,
0,
0,
0,
0,
0,
0
],
"left_ros_radians": [
0.18813577840372547,
1.4396582597857257,
1.0277351056058823,
0.0,
-0.09370641027822224,
1.11587286439394,
0.8020369133142686,
0.0,
-0.056923250644910384,
0.0,
0.0,
0.0,
0.20105220210793762,
0.0,
0.0,
0.0,
0.17710860883550222,
0.0,
0.0,
0.0
]
},
"middle": {
"sdk_command": [
137,
166,
225,
176,
212,
162,
174,
0,
78,
0,
0,
139,
216,
0,
0,
0,
0,
79,
0,
0
],
"left_ros_radians": [
0.468629120751098,
1.3203495642233727,
1.3246363583364706,
0.0,
-0.09370641027822224,
0.0,
0.8020369133142686,
0.0,
-0.056923250644910384,
0.4851377064829213,
1.3475198126296868,
0.49499464386611763,
0.20105220210793762,
0.0,
0.0,
0.0,
0.17710860883550222,
0.0,
0.0,
0.0
]
},
"ring": {
"sdk_command": [
255,
172,
169,
169,
162,
170,
143,
0,
0,
140,
0,
0,
0,
172,
0,
0,
0,
0,
61,
0
],
"left_ros_radians": [
0.87226588169,
1.3680730424483138,
1.0886379266788235,
0.0,
-0.16919281483119805,
0.0,
0.0,
0.0,
-0.07162232590335149,
0.0,
0.0,
0.0,
0.09967196576172593,
0.8531488605184314,
1.07031189749349,
0.3765771849929412,
0.18856088581503322,
0.0,
0.0,
0.0
]
},
"pinky": {
"sdk_command": [
101,
255,
169,
169,
162,
170,
98,
0,
0,
0,
166,
0,
0,
0,
150,
52,
0,
0,
0,
107
],
"left_ros_radians": [
0.3454857021595686,
2.02824782456,
0.7460595581435294,
0.32699495581089144,
-0.16919281483119805,
0.0,
0.0,
0.0,
-0.07162232590335149,
0.0,
0.0,
0.0,
0.09967196576172593,
0.0,
0.0,
0.0,
0.18856088581503322,
1.136714936245495,
0.9274665849352941,
0.6655254905272548
]
}
},
"zero": {
"sdk_command": [
0,
0,
255,
197,
110,
28,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"left_ros_radians": [
0.0,
0.0,
0.0,
0.0,
-0.053267264981985196,
0.0,
0.0,
0.0,
-0.012826024869587227,
0.0,
0.0,
0.0,
-0.00576348003833424,
0.0,
0.0,
0.0,
-0.014717030571641594,
0.0,
0.0,
0.0
]
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

@@ -0,0 +1,605 @@
<?xml version='1.0' encoding='utf-8'?>
<robot name="linkerhand_o30_left_v10_mirrored">
<link name="hand_base_link">
<inertial>
<origin xyz="0.043952 -0.014169 0.022868" rpy="-0 0 -0" />
<mass value="0.046494" />
<inertia ixx="2.6054E-05" ixy="4.7068e-07" ixz="2.1277E-06" iyy="5.2487E-05" iyz="-2.7986e-06" izz="3.1143E-05" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/hand_base_link.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/hand_base_link.STL" />
</geometry>
</collision>
</link>
<link name="thumb_metacarpals_base1">
<inertial>
<origin xyz="-0.010316 -0.0066586 -0.0024476" rpy="-0 0 -0" />
<mass value="0.0024826" />
<inertia ixx="1.6045E-07" ixy="2.6684e-08" ixz="-1.7024E-08" iyy="1.7121E-07" iyz="2.6748e-08" izz="2.3246E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base1.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base1.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_cmc_roll" type="revolute">
<origin xyz="0.018257 -0.012998 0.024272" rpy="0.07680614007600001 0 -0" />
<parent link="hand_base_link" />
<child link="thumb_metacarpals_base1" />
<axis xyz="-1 0 -0" />
<limit lower="0" upper="0.87226588169" effort="1" velocity="1" />
</joint>
<link name="thumb_metacarpals_base2">
<inertial>
<origin xyz="0.00038148 -0.0076809 0.0021853" rpy="-0 0 -0" />
<mass value="0.0011821" />
<inertia ixx="3.9644E-08" ixy="-2.1365e-10" ixz="7.766E-11" iyy="1.569E-08" iyz="7.709600000000001e-09" izz="3.6362E-08" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base2.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base2.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_cmc_yaw" type="revolute">
<origin xyz="-0.00215 -0.015238 0" rpy="-0 0 0.0283606787672" />
<parent link="thumb_metacarpals_base1" />
<child link="thumb_metacarpals_base2" />
<axis xyz="-0 0 1" />
<limit lower="0" upper="2.02824782456" effort="1" velocity="1" />
</joint>
<link name="thumb_proximal">
<inertial>
<origin xyz="3.6654e-06 -0.023946 -0.0037436" rpy="-0 0 -0" />
<mass value="0.0073969" />
<inertia ixx="1.1793E-06" ixy="-1.3736e-10" ixz="-9.6655E-11" iyy="6.5357E-07" iyz="5.8031e-08" izz="1.0764E-06" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_mcp" type="revolute">
<origin xyz="0.00045 -0.015539 0.0029937" rpy="0.384266722602 0 -0" />
<parent link="thumb_metacarpals_base2" />
<child link="thumb_proximal" />
<axis xyz="-1 0 -0" />
<limit lower="0" upper="1.9412774217" effort="1" velocity="1" />
</joint>
<link name="thumb_distal">
<inertial>
<origin xyz="2.0498e-05 -0.02017 -0.00424" rpy="-0 0 -0" />
<mass value="0.0079712" />
<inertia ixx="8.2871E-07" ixy="4.2596e-11" ixz="-2.569E-11" iyy="3.2681E-07" iyz="-2.6339e-08" izz="8.3897E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/thumb_distal.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_ip" type="revolute">
<origin xyz="0 -0.048532 0.00155" rpy="0.0327366295854 0 -0" />
<parent link="thumb_proximal" />
<child link="thumb_distal" />
<axis xyz="-1 0 -0" />
<limit lower="0" upper="1.603532956380333" effort="1" velocity="1" />
</joint>
<link name="index_metacarpals">
<inertial>
<origin xyz="-0.0106040258094052 5.13953894481882e-05 -0.00136151819442749" rpy="-0 0 -0" />
<mass value="0.00661261244742178" />
<inertia ixx="4.53652866123246E-07" ixy="-1.66679020586885e-08" ixz="-1.26712149811549E-08" iyy="5.30500427518365E-07" iyz="-4.56960905410225e-10" izz="2.56538210441828E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="index_mcp_roll" type="revolute">
<origin xyz="0.018722 -0.029679 0.075158" rpy="-0.05326726498196427 0 -0" />
<parent link="hand_base_link" />
<child link="index_metacarpals" />
<axis xyz="-1 0 -0" />
<limit lower="-0.3970" upper="-0.0532672649819852" effort="1.0" velocity="1.0" />
</joint>
<link name="index_proximal">
<inertial>
<origin xyz="-0.0043709621275504 -2.16385333159826e-05 0.0216063163265681" rpy="-0 0 -0" />
<mass value="0.00727256326100808" />
<inertia ixx="6.59424988535241E-07" ixy="-1.15369816881374e-10" ixz="-2.43455022025729E-08" iyy="7.06690330759988E-07" iyz="1.75709839767273e-10" izz="3.18019337389962E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="index_mcp_pitch" type="revolute">
<origin xyz="-0.00475 -0.00059587 0.016238" rpy="-0 1.221245327087672e-14 -0" />
<parent link="index_metacarpals" />
<child link="index_proximal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.735046222075943" effort="1.0" velocity="1.0" />
</joint>
<link name="index_middle">
<inertial>
<origin xyz="-0.00412829489374895 -4.33935129848899e-05 0.0217078554898162" rpy="-0 0 -0" />
<mass value="0.00678023137976301" />
<inertia ixx="6.77930682969668E-07" ixy="-1.0022443161073e-10" ixz="-7.34914379088131E-09" iyy="7.24200285246171E-07" iyz="-6.8455968172179e-11" izz="2.95854297824364E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_middle.STL" />
</geometry>
</collision>
</link>
<joint name="index_pip" type="revolute">
<origin xyz="0 -0 0.039681" rpy="-0 -3.019806626980426e-14 -0" />
<parent link="index_proximal" />
<child link="index_middle" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.471362682698838" effort="1.0" velocity="1.0" />
</joint>
<link name="index_distal">
<inertial>
<origin xyz="-0.00405260592933677 -2.92010642392003e-05 0.0113571507781909" rpy="-0 0 -0" />
<mass value="0.0033098791304967" />
<inertia ixx="1.64002168413707E-07" ixy="3.45038659319342e-12" ixz="-9.24432368435003E-09" iyy="1.74779055176355E-07" iyz="-3.79661625368079e-12" izz="1.1460476210935E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/index_distal.STL" />
</geometry>
</collision>
</link>
<joint name="index_dip" type="revolute">
<origin xyz="0 -0 0.040244" rpy="-0 0.0402952773826 -0" />
<parent link="index_middle" />
<child link="index_distal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.59669999534" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_metacarpals">
<inertial>
<origin xyz="-0.0106040258093801 5.13953895135309e-05 -0.00136151819462214" rpy="-0 0 -0" />
<mass value="0.00661261244742176" />
<inertia ixx="4.53652866122421E-07" ixy="-1.6667902059155e-08" ixz="-1.26712149847738E-08" iyy="5.30500427517202E-07" iyz="-4.5696090563867e-10" izz="2.56538210441734E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="middle_mcp_roll" type="revolute">
<origin xyz="0.018722 -0.0086937 0.08158600000000001" rpy="-0.0128260248695901 0 -0" />
<parent link="hand_base_link" />
<child link="middle_metacarpals" />
<axis xyz="-1 0 -0" />
<limit lower="-0.4265" upper="0.1089663129860673" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_proximal">
<inertial>
<origin xyz="-0.00437096211453991 -2.16385377681651e-05 0.021606316263903" rpy="-0 0 -0" />
<mass value="0.00727256322379252" />
<inertia ixx="6.59424984533755E-07" ixy="-1.15369786907248e-10" ixz="-2.43455017911397E-08" iyy="7.06690325324724E-07" iyz="1.75709424177874e-10" izz="3.18019338775399E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="middle_mcp_pitch" type="revolute">
<origin xyz="-0.00475 -0.00059587 0.016238" rpy="-0 -0.01523079055311838 -0" />
<parent link="middle_metacarpals" />
<child link="middle_proximal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.586027117348012" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_middle">
<inertial>
<origin xyz="-0.00416491190892752 -4.53802720945468e-05 0.0183968023027694" rpy="-0 0 -0" />
<mass value="0.00558395826725584" />
<inertia ixx="6.23566979572116E-07" ixy="-1.48661311147268e-12" ixz="9.71608105955063E-09" iyy="6.62874748143871E-07" iyz="1.95417713888735e-11" izz="2.52254263414512E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_middle.STL" />
</geometry>
</collision>
</link>
<joint name="middle_pip" type="revolute">
<origin xyz="0 -0 0.039681" rpy="-0 0.0138711925804 -0" />
<parent link="middle_proximal" />
<child link="middle_middle" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.590822001021158" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_distal">
<inertial>
<origin xyz="-0.0040526080066767 -2.92015397774141e-05 0.0113571741521581" rpy="-0 0 -0" />
<mass value="0.00330988759550385" />
<inertia ixx="1.64003148791956E-07" ixy="3.39806839680505e-12" ixz="-9.24426389673421E-09" iyy="1.74779889123667E-07" iyz="-3.85472238306036e-12" izz="1.1460470796913E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/middle_distal.STL" />
</geometry>
</collision>
</link>
<joint name="middle_dip" type="revolute">
<origin xyz="0 -0 0.040244" rpy="-0 -0.0308518454734 -0" />
<parent link="middle_middle" />
<child link="middle_distal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.59776752134" effort="1.0" velocity="1.0" />
</joint>
<link name="ring_metacarpals">
<inertial>
<origin xyz="-0.0106040258039409 5.13953875669396e-05 -0.00136151819474453" rpy="-0 0 -0" />
<mass value="0.00661261244414956" />
<inertia ixx="4.53652866086209E-07" ixy="-1.66679020186835e-08" ixz="-1.26712150849033E-08" iyy="5.30500427139748E-07" iyz="-4.56960893200256e-10" izz="2.56538210088551E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="ring_mcp_roll" type="revolute">
<origin xyz="0.018722 0.012188 0.079218" rpy="-0.005763480038315312 0 -0" />
<parent link="hand_base_link" />
<child link="ring_metacarpals" />
<axis xyz="-1 0 -0" />
<limit lower="-0.2288" upper="0.2882392053656797" effort="0.0" velocity="0.0" />
</joint>
<link name="ring_proximal">
<inertial>
<origin xyz="-0.00437096212848108 -2.16385332126728e-05 0.0216063163327438" rpy="-0 0 -0" />
<mass value="0.00727256326396366" />
<inertia ixx="6.5942498771819E-07" ixy="-1.15369820837761e-10" ixz="-2.43455022245408E-08" iyy="7.06690331454756E-07" iyz="1.75709860575411e-10" izz="3.18019335895501E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="ring_mcp_pitch" type="revolute">
<origin xyz="-0.00475 -0.00059587 0.016238" rpy="-0 0.0255589602002 -0" />
<parent link="ring_metacarpals" />
<child link="ring_proximal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.55394971023" effort="1.0" velocity="1.0" />
</joint>
<link name="ring_middle">
<inertial>
<origin xyz="-0.00416491192838481 -4.53802663086568e-05 0.0183968024169422" rpy="-0 0 -0" />
<mass value="0.00558395830757745" />
<inertia ixx="6.23566985916703E-07" ixy="-1.48664397100439e-12" ixz="9.71608067536211E-09" iyy="6.62874753776221E-07" iyz="1.95421758625405e-11" izz="2.52254264189611E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_middle.STL" />
</geometry>
</collision>
</link>
<joint name="ring_pip" type="revolute">
<origin xyz="0 -0 0.039681" rpy="-0 0.0220509528547 -0" />
<parent link="ring_proximal" />
<child link="ring_middle" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.58679961547" effort="1.0" velocity="1.0" />
</joint>
<link name="ring_distal">
<inertial>
<origin xyz="-0.00405260742568393 -2.91984265882485e-05 0.0113571618103905" rpy="-0 0 -0" />
<mass value="0.00330988375961977" />
<inertia ixx="1.64002482967217E-07" ixy="3.51093191735502e-12" ixz="-9.24429621268036E-09" iyy="1.74779331899762E-07" iyz="-3.79763524146384e-12" izz="1.14604618112137E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/ring_distal.STL" />
</geometry>
</collision>
</link>
<joint name="ring_dip" type="revolute">
<origin xyz="0 -0 0.040244" rpy="-0 -0.00428430308889 -0" />
<parent link="ring_middle" />
<child link="ring_distal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.5742161012" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_metacarpals">
<inertial>
<origin xyz="-0.0106040258039376 5.13953875944106e-05 -0.00136151819476814" rpy="-0 0 -0" />
<mass value="0.00661261244414956" />
<inertia ixx="4.53652866086213E-07" ixy="-1.66679020188784e-08" ixz="-1.26712150853475E-08" iyy="5.30500427140437E-07" iyz="-4.56960893204398e-10" izz="2.56538210089087E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_mcp_roll" type="revolute">
<origin xyz="0.018722 0.030927 0.067761" rpy="-0.01471703057163711 0 -0" />
<parent link="hand_base_link" />
<child link="pinky_metacarpals" />
<axis xyz="-1 0 -0" />
<limit lower="-0.0548" upper="0.3102413287225498" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_proximal">
<inertial>
<origin xyz="-0.00437096211497169 -2.16385374772129e-05 0.0216063162659534" rpy="-0 0 -0" />
<mass value="0.00727256322451616" />
<inertia ixx="6.59424984467403E-07" ixy="-1.15369789522493e-10" ixz="-2.43455018407703E-08" iyy="7.06690325599736E-07" iyz="1.75709453609034e-10" izz="3.1801933843565E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_mcp_pitch" type="revolute">
<origin xyz="-0.00475 -0.00059587 0.016238" rpy="-0 -0.0220425694976 -0" />
<parent link="pinky_metacarpals" />
<child link="pinky_proximal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.746158486401212" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_middle">
<inertial>
<origin xyz="-0.00412829488912096 -4.33935004629793e-05 0.0217078554135159" rpy="-0 0 -0" />
<mass value="0.00678023141445045" />
<inertia ixx="6.77930689052883E-07" ixy="-1.00224317995394e-10" ixz="-7.34914443754626E-09" iyy="7.24200290521759E-07" iyz="-6.84568635307055e-11" izz="2.9585429874662E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_middle.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_pip" type="revolute">
<origin xyz="0 -0 0.039681" rpy="-0 0.0153062751135 -0" />
<parent link="pinky_proximal" />
<child link="pinky_middle" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.57669319439" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_distal">
<inertial>
<origin xyz="-0.00405259886775996 -2.91983586506936e-05 0.0113571520424041" rpy="-0 0 -0" />
<mass value="0.00330987874289192" />
<inertia ixx="1.64002282686245E-07" ixy="3.40616709379705e-12" ixz="-9.24408880780151E-09" iyy="1.74779075536322E-07" iyz="-3.76063308216828e-12" izz="1.14604555086707E-07" />
</inertial>
<visual>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 -0 0" rpy="-0 0 -0" />
<geometry>
<mesh filename="meshes/pinky_distal.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_dip" type="revolute">
<origin xyz="0 -0 0.040244" rpy="-0 -0.0155350252509 -0" />
<parent link="pinky_middle" />
<child link="pinky_distal" />
<axis xyz="-0 1 -0" />
<limit lower="0.0" upper="1.58606542135" effort="1.0" velocity="1.0" />
</joint>
</robot>
@@ -0,0 +1,605 @@
<?xml version='1.0' encoding='utf-8'?>
<robot name="linkerhand_O30i_right.urdf">
<link name="hand_base_link">
<inertial>
<origin xyz="0.043952 0.014169 0.022868" rpy="0 0 0" />
<mass value="0.046494" />
<inertia ixx="2.6054E-05" ixy="-4.7068E-07" ixz="2.1277E-06" iyy="5.2487E-05" iyz="2.7986E-06" izz="3.1143E-05" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/hand_base_link.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/hand_base_link.STL" />
</geometry>
</collision>
</link>
<link name="thumb_metacarpals_base1">
<inertial>
<origin xyz="-0.010316 0.0066586 -0.0024476" rpy="0 0 0" />
<mass value="0.0024826" />
<inertia ixx="1.6045E-07" ixy="-2.6684E-08" ixz="-1.7024E-08" iyy="1.7121E-07" iyz="-2.6748E-08" izz="2.3246E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base1.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base1.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_cmc_roll" type="revolute">
<origin xyz="0.018257 0.012998 0.024272" rpy="-0.076806140076 0 0" />
<parent link="hand_base_link" />
<child link="thumb_metacarpals_base1" />
<axis xyz="1 0 0" />
<limit lower="0" upper="0.87226588169" effort="1" velocity="1" />
</joint>
<link name="thumb_metacarpals_base2">
<inertial>
<origin xyz="0.00038148 0.0076809 0.0021853" rpy="0 0 0" />
<mass value="0.0011821" />
<inertia ixx="3.9644E-08" ixy="2.1365E-10" ixz="7.766E-11" iyy="1.569E-08" iyz="-7.7096E-09" izz="3.6362E-08" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base2.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_metacarpals_base2.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_cmc_yaw" type="revolute">
<origin xyz="-0.00215 0.015238 0" rpy="0 0 -0.0283606787672" />
<parent link="thumb_metacarpals_base1" />
<child link="thumb_metacarpals_base2" />
<axis xyz="0 0 -1" />
<limit lower="0" upper="2.02824782456" effort="1" velocity="1" />
</joint>
<link name="thumb_proximal">
<inertial>
<origin xyz="3.6654E-06 0.023946 -0.0037436" rpy="0 0 0" />
<mass value="0.0073969" />
<inertia ixx="1.1793E-06" ixy="1.3736E-10" ixz="-9.6655E-11" iyy="6.5357E-07" iyz="-5.8031E-08" izz="1.0764E-06" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_mcp" type="revolute">
<origin xyz="0.00045 0.015539 0.0029937" rpy="-0.384266722602 0 0" />
<parent link="thumb_metacarpals_base2" />
<child link="thumb_proximal" />
<axis xyz="1 0 0" />
<limit lower="0" upper="1.9412774217" effort="1" velocity="1" />
</joint>
<link name="thumb_distal">
<inertial>
<origin xyz="2.0498E-05 0.02017 -0.00424" rpy="0 0 0" />
<mass value="0.0079712" />
<inertia ixx="8.2871E-07" ixy="-4.2596E-11" ixz="-2.569E-11" iyy="3.2681E-07" iyz="2.6339E-08" izz="8.3897E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/thumb_distal.STL" />
</geometry>
</collision>
</link>
<joint name="thumb_ip" type="revolute">
<origin xyz="0 0.048532 0.00155" rpy="-0.0327366295854 0 0" />
<parent link="thumb_proximal" />
<child link="thumb_distal" />
<axis xyz="1 0 0" />
<limit lower="0" upper="1.603532956380333" effort="1" velocity="1" />
</joint>
<link name="index_metacarpals">
<inertial>
<origin xyz="-0.0106040258094052 -5.13953894481882E-05 -0.00136151819442749" rpy="0 0 0" />
<mass value="0.00661261244742178" />
<inertia ixx="4.53652866123246E-07" ixy="1.66679020586885E-08" ixz="-1.26712149811549E-08" iyy="5.30500427518365E-07" iyz="4.56960905410225E-10" izz="2.56538210441828E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="index_mcp_roll" type="revolute">
<origin xyz="0.018722 0.029679 0.075158" rpy="0.05326726498196427 0 0" />
<parent link="hand_base_link" />
<child link="index_metacarpals" />
<axis xyz="1 0 0" />
<limit lower="-0.3970" upper="-0.0532672649819852" effort="1.0" velocity="1.0" />
</joint>
<link name="index_proximal">
<inertial>
<origin xyz="-0.0043709621275504 2.16385333159826E-05 0.0216063163265681" rpy="0 0 0" />
<mass value="0.00727256326100808" />
<inertia ixx="6.59424988535241E-07" ixy="1.15369816881374E-10" ixz="-2.43455022025729E-08" iyy="7.06690330759988E-07" iyz="-1.75709839767273E-10" izz="3.18019337389962E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="index_mcp_pitch" type="revolute">
<origin xyz="-0.00475 0.00059587 0.016238" rpy="0 1.221245327087672e-14 0" />
<parent link="index_metacarpals" />
<child link="index_proximal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.735046222075943" effort="1.0" velocity="1.0" />
</joint>
<link name="index_middle">
<inertial>
<origin xyz="-0.00412829489374895 4.33935129848899E-05 0.0217078554898162" rpy="0 0 0" />
<mass value="0.00678023137976301" />
<inertia ixx="6.77930682969668E-07" ixy="1.0022443161073E-10" ixz="-7.34914379088131E-09" iyy="7.24200285246171E-07" iyz="6.8455968172179E-11" izz="2.95854297824364E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_middle.STL" />
</geometry>
</collision>
</link>
<joint name="index_pip" type="revolute">
<origin xyz="0 0 0.039681" rpy="0 -3.019806626980426e-14 0" />
<parent link="index_proximal" />
<child link="index_middle" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.471362682698838" effort="1.0" velocity="1.0" />
</joint>
<link name="index_distal">
<inertial>
<origin xyz="-0.00405260592933677 2.92010642392003E-05 0.0113571507781909" rpy="0 0 0" />
<mass value="0.0033098791304967" />
<inertia ixx="1.64002168413707E-07" ixy="-3.45038659319342E-12" ixz="-9.24432368435003E-09" iyy="1.74779055176355E-07" iyz="3.79661625368079E-12" izz="1.1460476210935E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/index_distal.STL" />
</geometry>
</collision>
</link>
<joint name="index_dip" type="revolute">
<origin xyz="0 0 0.040244" rpy="0 0.0402952773826 0" />
<parent link="index_middle" />
<child link="index_distal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.59669999534" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_metacarpals">
<inertial>
<origin xyz="-0.0106040258093801 -5.13953895135309E-05 -0.00136151819462214" rpy="0 0 0" />
<mass value="0.00661261244742176" />
<inertia ixx="4.53652866122421E-07" ixy="1.6667902059155E-08" ixz="-1.26712149847738E-08" iyy="5.30500427517202E-07" iyz="4.5696090563867E-10" izz="2.56538210441734E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="middle_mcp_roll" type="revolute">
<origin xyz="0.018722 0.0086937 0.081586" rpy="0.0128260248695901 0 0" />
<parent link="hand_base_link" />
<child link="middle_metacarpals" />
<axis xyz="1 0 0" />
<limit lower="-0.4265" upper="0.1089663129860673" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_proximal">
<inertial>
<origin xyz="-0.00437096211453991 2.16385377681651E-05 0.021606316263903" rpy="0 0 0" />
<mass value="0.00727256322379252" />
<inertia ixx="6.59424984533755E-07" ixy="1.15369786907248E-10" ixz="-2.43455017911397E-08" iyy="7.06690325324724E-07" iyz="-1.75709424177874E-10" izz="3.18019338775399E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="middle_mcp_pitch" type="revolute">
<origin xyz="-0.00475 0.00059587 0.016238" rpy="0 -0.01523079055311838 0" />
<parent link="middle_metacarpals" />
<child link="middle_proximal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.586027117348012" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_middle">
<inertial>
<origin xyz="-0.00416491190892752 4.53802720945468E-05 0.0183968023027694" rpy="0 0 0" />
<mass value="0.00558395826725584" />
<inertia ixx="6.23566979572116E-07" ixy="1.48661311147268E-12" ixz="9.71608105955063E-09" iyy="6.62874748143871E-07" iyz="-1.95417713888735E-11" izz="2.52254263414512E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_middle.STL" />
</geometry>
</collision>
</link>
<joint name="middle_pip" type="revolute">
<origin xyz="0 0 0.039681" rpy="0 0.0138711925804 0" />
<parent link="middle_proximal" />
<child link="middle_middle" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.590822001021158" effort="1.0" velocity="1.0" />
</joint>
<link name="middle_distal">
<inertial>
<origin xyz="-0.0040526080066767 2.92015397774141E-05 0.0113571741521581" rpy="0 0 0" />
<mass value="0.00330988759550385" />
<inertia ixx="1.64003148791956E-07" ixy="-3.39806839680505E-12" ixz="-9.24426389673421E-09" iyy="1.74779889123667E-07" iyz="3.85472238306036E-12" izz="1.1460470796913E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/middle_distal.STL" />
</geometry>
</collision>
</link>
<joint name="middle_dip" type="revolute">
<origin xyz="0 0 0.040244" rpy="0 -0.0308518454734 0" />
<parent link="middle_middle" />
<child link="middle_distal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.59776752134" effort="1.0" velocity="1.0" />
</joint>
<link name="ring_metacarpals">
<inertial>
<origin xyz="-0.0106040258039409 -5.13953875669396E-05 -0.00136151819474453" rpy="0 0 0" />
<mass value="0.00661261244414956" />
<inertia ixx="4.53652866086209E-07" ixy="1.66679020186835E-08" ixz="-1.26712150849033E-08" iyy="5.30500427139748E-07" iyz="4.56960893200256E-10" izz="2.56538210088551E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="ring_mcp_roll" type="revolute">
<origin xyz="0.018722 -0.012188 0.079218" rpy="0.005763480038315312 0 0" />
<parent link="hand_base_link" />
<child link="ring_metacarpals" />
<axis xyz="1 0 0" />
<limit lower="-0.2288" upper="0.2882392053656797" effort="0.0" velocity="0.0" />
</joint>
<link name="ring_proximal">
<inertial>
<origin xyz="-0.00437096212848108 2.16385332126728E-05 0.0216063163327438" rpy="0 0 0" />
<mass value="0.00727256326396366" />
<inertia ixx="6.5942498771819E-07" ixy="1.15369820837761E-10" ixz="-2.43455022245408E-08" iyy="7.06690331454756E-07" iyz="-1.75709860575411E-10" izz="3.18019335895501E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="ring_mcp_pitch" type="revolute">
<origin xyz="-0.00475 0.00059587 0.016238" rpy="0 0.0255589602002 0" />
<parent link="ring_metacarpals" />
<child link="ring_proximal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.55394971023" effort="1.0" velocity="1.0" />
</joint>
<link name="ring_middle">
<inertial>
<origin xyz="-0.00416491192838481 4.53802663086568E-05 0.0183968024169422" rpy="0 0 0" />
<mass value="0.00558395830757745" />
<inertia ixx="6.23566985916703E-07" ixy="1.48664397100439E-12" ixz="9.71608067536211E-09" iyy="6.62874753776221E-07" iyz="-1.95421758625405E-11" izz="2.52254264189611E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_middle.STL" />
</geometry>
</collision>
</link>
<joint name="ring_pip" type="revolute">
<origin xyz="0 0 0.039681" rpy="0 0.0220509528547 0" />
<parent link="ring_proximal" />
<child link="ring_middle" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.58679961547" effort="1.0" velocity="1.0" />
</joint>
<link name="ring_distal">
<inertial>
<origin xyz="-0.00405260742568393 2.91984265882485E-05 0.0113571618103905" rpy="0 0 0" />
<mass value="0.00330988375961977" />
<inertia ixx="1.64002482967217E-07" ixy="-3.51093191735502E-12" ixz="-9.24429621268036E-09" iyy="1.74779331899762E-07" iyz="3.79763524146384E-12" izz="1.14604618112137E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/ring_distal.STL" />
</geometry>
</collision>
</link>
<joint name="ring_dip" type="revolute">
<origin xyz="0 0 0.040244" rpy="0 -0.00428430308889 0" />
<parent link="ring_middle" />
<child link="ring_distal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.5742161012" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_metacarpals">
<inertial>
<origin xyz="-0.0106040258039376 -5.13953875944106E-05 -0.00136151819476814" rpy="0 0 0" />
<mass value="0.00661261244414956" />
<inertia ixx="4.53652866086213E-07" ixy="1.66679020188784E-08" ixz="-1.26712150853475E-08" iyy="5.30500427140437E-07" iyz="4.56960893204398E-10" izz="2.56538210089087E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_metacarpals.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_mcp_roll" type="revolute">
<origin xyz="0.018722 -0.030927 0.067761" rpy="0.01471703057163711 0 0" />
<parent link="hand_base_link" />
<child link="pinky_metacarpals" />
<axis xyz="1 0 0" />
<limit lower="-0.0548" upper="0.3102413287225498" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_proximal">
<inertial>
<origin xyz="-0.00437096211497169 2.16385374772129E-05 0.0216063162659534" rpy="0 0 0" />
<mass value="0.00727256322451616" />
<inertia ixx="6.59424984467403E-07" ixy="1.15369789522493E-10" ixz="-2.43455018407703E-08" iyy="7.06690325599736E-07" iyz="-1.75709453609034E-10" izz="3.1801933843565E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_proximal.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_proximal.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_mcp_pitch" type="revolute">
<origin xyz="-0.00475 0.00059587 0.016238" rpy="0 -0.0220425694976 0" />
<parent link="pinky_metacarpals" />
<child link="pinky_proximal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.746158486401212" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_middle">
<inertial>
<origin xyz="-0.00412829488912096 4.33935004629793E-05 0.0217078554135159" rpy="0 0 0" />
<mass value="0.00678023141445045" />
<inertia ixx="6.77930689052883E-07" ixy="1.00224317995394E-10" ixz="-7.34914443754626E-09" iyy="7.24200290521759E-07" iyz="6.84568635307055E-11" izz="2.9585429874662E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_middle.STL" />
</geometry>
<material name="">
<color rgba="0.68 0.70 0.72 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_middle.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_pip" type="revolute">
<origin xyz="0 0 0.039681" rpy="0 0.0153062751135 0" />
<parent link="pinky_proximal" />
<child link="pinky_middle" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.57669319439" effort="1.0" velocity="1.0" />
</joint>
<link name="pinky_distal">
<inertial>
<origin xyz="-0.00405259886775996 2.91983586506936E-05 0.0113571520424041" rpy="0 0 0" />
<mass value="0.00330987874289192" />
<inertia ixx="1.64002282686245E-07" ixy="-3.40616709379705E-12" ixz="-9.24408880780151E-09" iyy="1.74779075536322E-07" iyz="3.76063308216828E-12" izz="1.14604555086707E-07" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_distal.STL" />
</geometry>
<material name="">
<color rgba="0.48 0.50 0.52 1" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="meshes/pinky_distal.STL" />
</geometry>
</collision>
</link>
<joint name="pinky_dip" type="revolute">
<origin xyz="0 0 0.040244" rpy="0 -0.0155350252509 0" />
<parent link="pinky_middle" />
<child link="pinky_distal" />
<axis xyz="0 1 0" />
<limit lower="0.0" upper="1.58606542135" effort="1.0" velocity="1.0" />
</joint>
</robot>
@@ -0,0 +1,20 @@
0: thumb_cmc_roll
1: thumb_cmc_yaw
2: index_mcp_roll
3: middle_mcp_roll
4: ring_mcp_roll
5: pinky_mcp_roll
6: thumb_mcp
7: index_mcp_pitch
8: middle_mcp_pitch
9: ring_mcp_pitch
10: pinky_mcp_pitch
11: index_pip
12: middle_pip
13: ring_pip
14: pinky_pip
15: thumb_ip
16: index_dip
17: middle_dip
18: ring_dip
19: pinky_dip
@@ -0,0 +1,33 @@
{
"commands": 37,
"max_mirror_position_error_m": 0.0,
"max_mirror_rotation_error": 0.0,
"max_runtime_pose_error": 1.833602714107485e-14,
"contacts": [
{
"finger": "index",
"right_gap_mm": -0.000126303898665965,
"left_gap_mm": -0.00012630389866754953,
"runtime_left_gap_mm": -0.00012630389910024724
},
{
"finger": "middle",
"right_gap_mm": 0.020000402670061167,
"left_gap_mm": 0.020000402670061167,
"runtime_left_gap_mm": 0.020000402670048555
},
{
"finger": "ring",
"right_gap_mm": 0.0,
"left_gap_mm": 0.0,
"runtime_left_gap_mm": 0.0
},
{
"finger": "pinky",
"right_gap_mm": 0.020000643267029144,
"left_gap_mm": 0.020000643267029144,
"runtime_left_gap_mm": 0.020000643267029144
}
],
"mirrored_inertia": true
}
@@ -0,0 +1,7 @@
{
"asset_version": "V10",
"source": "src/linkerhand-sim/linker_hand_mujoco_ros2/linker_hand_mujoco_ros2/urdf/O30/linker_hand_o30_right/linkerhand_o30_right_zero_v10_calibrated.urdf",
"source_sha256": "f233c5eff38ba46d1a2826c2624fc8a13e86ed0c74c6b914bf0fcc021b43e439",
"note": "Both URDF filenames and directory explicitly labeled V10; copied without changing asset contents.",
"copied_from": "exports/O30_V9_left_right"
}
@@ -0,0 +1,8 @@
// settings.json
{
// other settings
"urdf-visualizer.packages": {
"linkerhand_o12_t3_left": "src/linkerhand_o12_t3_left"
},
// other settings
}
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More