原始urdf位置修改

This commit is contained in:
lxp
2026-09-01 13:57:37 +08:00
parent 1ed36ecdd8
commit 2b7c1f92e7
70 changed files with 3637 additions and 29 deletions
+3 -3
View File
@@ -353,7 +353,6 @@ ros2 launch linkerhand_calibration \
hand_type:=left \
serial_number:=G20_LEFT_001 \
camera_extrinsics_file:=/home/lxp/projects/linkerhand_retarget_ros2/config/g20_three_camera_extrinsics.yaml \
source_urdf_path:=/home/lxp/projects/linkerhand_retarget_ros2/src/linkerhand_retarget/linkerhand_retarget/assets/robots/hands/linker_hand/g20_left/linkerhand_g20_left.urdf \
commands_enabled:=false
```
@@ -376,11 +375,12 @@ ros2 launch linkerhand_calibration \
hand_type:=left \
serial_number:=G20_LEFT_001 \
camera_extrinsics_file:=/home/lxp/projects/linkerhand_retarget_ros2/config/g20_three_camera_extrinsics.yaml \
source_urdf_path:=/home/lxp/projects/linkerhand_retarget_ros2/src/linkerhand_retarget/linkerhand_retarget/assets/robots/hands/linker_hand/g20_left/linkerhand_g20_left.urdf \
can_interface:=can0
```
右手使用同一入口;默认自动选择右手SDK话题和原始URDF:
原始URDF及其mesh随`linkerhand_calibration`安装,默认根据`hand_type`自动选择。
如需调试其他CAD版本,仍可通过`source_urdf_path:=<绝对路径>`显式覆盖。
右手使用同一入口,并自动选择右手SDK话题和原始URDF:
```bash
ros2 launch linkerhand_calibration \
@@ -21,7 +21,7 @@ cameras:
camera_info: ~/.ros/camera_info/hikrobot_DB2163739.yaml
artifacts:
source_urdf: src/linkerhand_retarget/linkerhand_retarget/assets/robots/hands/linker_hand/g20_right/linkerhand_g20_right.urdf
source_urdf: package://linkerhand_calibration/urdf/g20_right/linkerhand_g20_right.urdf
source_urdf_sha256: eeb6ffb0e95d2a6acd4c26331ae68062e0d74160de4b552b4f6d395cce5ca4e8
camera_extrinsics: config/g20_three_camera_extrinsics.yaml
camera_extrinsics_sha256: dd623572df3cb83fdefcbe92204dab54a60f2c68eb3a8c9bdb08407e8f0e5d80
@@ -27,15 +27,20 @@ VIEWS = ("front", "side", "top")
def _default_source_urdf(hand_type: str) -> Path:
relative = Path(
"assets/robots/hands/linker_hand"
) / f"g20_{hand_type}" / f"linkerhand_g20_{hand_type}.urdf"
workspace = Path.cwd() / "src/linkerhand_retarget/linkerhand_retarget" / relative
relative = (
Path("urdf")
/ f"g20_{hand_type}"
/ f"linkerhand_g20_{hand_type}.urdf"
)
package_source_or_share = Path(__file__).resolve().parents[1] / relative
try:
installed = Path(get_package_share_directory("linkerhand_retarget")) / relative
installed = (
Path(get_package_share_directory("linkerhand_calibration"))
/ relative
)
except Exception:
installed = workspace
return workspace if workspace.is_file() else installed
installed = package_source_or_share
return installed if installed.is_file() else package_source_or_share
def _launch_stack(context):
@@ -9,15 +9,38 @@ _LEGACY_SOURCE_PREFIX = Path("src/g20_thumb_apriltag_calibration")
_CURRENT_SOURCE_PREFIX = Path("src/linkerhand_calibration")
def _resolve_package_uri(value: str, workspace: Path) -> Path | None:
prefix = "package://"
if not value.startswith(prefix):
return None
package_name, separator, relative = value[len(prefix) :].partition("/")
if not separator or not package_name or not relative:
raise ValueError(f"invalid ROS package resource path: {value}")
workspace_candidate = (workspace / "src" / package_name / relative).resolve()
if workspace_candidate.exists():
return workspace_candidate
try:
from ament_index_python.packages import get_package_share_directory
package_share = Path(get_package_share_directory(package_name))
except Exception:
return workspace_candidate
return (package_share / relative).resolve()
def resolve_renamed_package_path(value: str | Path, workspace: Path) -> Path:
"""Resolve a path and remap only the former source-package prefix.
"""Resolve workspace paths, ROS package resources and the former prefix.
Deployed v1 product YAML files are kept byte-for-byte stable because the
artifact paths participate in operational review. Existing paths always
win; the rename mapping is used only when the literal legacy path no
longer exists.
win; package URIs prefer a source-workspace copy, and the rename mapping
is used only when the literal legacy path no longer exists.
"""
raw = Path(value).expanduser()
text = str(value).strip()
package_resource = _resolve_package_uri(text, workspace)
if package_resource is not None:
return package_resource
raw = Path(text).expanduser()
candidate = raw if raw.is_absolute() else workspace / raw
candidate = candidate.resolve()
if candidate.exists() or raw.is_absolute():
+22 -1
View File
@@ -1,10 +1,31 @@
from glob import glob
from pathlib import Path
from setuptools import find_packages, setup
package_name = "linkerhand_calibration"
def package_data_tree(root: str) -> list[tuple[str, list[str]]]:
"""Install a resource tree without flattening relative mesh paths."""
root_path = Path(root)
directories = [
root_path,
*sorted(path for path in root_path.rglob("*") if path.is_dir()),
]
result = []
for directory in directories:
files = sorted(
str(path) for path in directory.iterdir() if path.is_file()
)
if files:
result.append(
(str(Path("share") / package_name / directory), files)
)
return result
setup(
name=package_name,
version="0.1.0",
@@ -20,7 +41,7 @@ setup(
glob("config/*.yaml") + glob("config/*.xml"),
),
("share/" + package_name + "/launch", glob("launch/*.launch.py")),
],
] + package_data_tree("urdf"),
install_requires=["setuptools", "numpy", "scipy", "PyYAML"],
tests_require=["pytest"],
zip_safe=True,
@@ -7,6 +7,24 @@ import yaml
PACKAGE_ROOT = Path(__file__).resolve().parents[1]
def test_package_owns_both_g20_source_urdfs_and_their_meshes() -> None:
for side in ("left", "right"):
urdf = (
PACKAGE_ROOT
/ "urdf"
/ f"g20_{side}"
/ f"linkerhand_g20_{side}.urdf"
)
assert urdf.is_file()
root = ElementTree.parse(urdf).getroot()
mesh_paths = {
mesh.attrib["filename"] for mesh in root.findall(".//mesh")
}
assert mesh_paths
assert all(not Path(path).is_absolute() for path in mesh_paths)
assert all((urdf.parent / path).is_file() for path in mesh_paths)
def test_fastdds_profile_has_capacity_for_full_resolution_images() -> None:
root = ElementTree.parse(
PACKAGE_ROOT / "config" / "fastdds_large_images.xml"
@@ -53,9 +53,8 @@ def test_runtime_fit_saturates_at_source_urdf_limit() -> None:
)
bounded = clamp_runtime_fits_to_urdf_limits(
Path(__file__).resolve().parents[3]
/ "src/linkerhand_retarget/linkerhand_retarget/assets/robots/"
"hands/linker_hand/g20_right/linkerhand_g20_right.urdf",
Path(__file__).resolve().parents[1]
/ "urdf/g20_right/linkerhand_g20_right.urdf",
{"thumb_cmc_yaw": fit},
)["thumb_cmc_yaw"]
@@ -154,9 +153,8 @@ def test_right_19_keeps_four_visual_dip_curves_independent() -> None:
{"visual_measurement": 1.0},
)
source_urdf = (
Path(__file__).resolve().parents[3]
/ "src/linkerhand_retarget/linkerhand_retarget/assets/robots/hands/"
"linker_hand/g20_right/linkerhand_g20_right.urdf"
Path(__file__).resolve().parents[1]
/ "urdf/g20_right/linkerhand_g20_right.urdf"
)
runtime = derive_mimic_passive_fits(
@@ -213,6 +213,10 @@ def test_product_config_locks_three_cameras_tags_and_artifact_hashes() -> None:
assert set(config.cameras) == {"front", "side", "top"}
assert len({camera["serial_number"] for camera in config.cameras.values()}) == 3
assert config.source_urdf.is_file()
assert config.source_urdf == (
REPO
/ "src/linkerhand_calibration/urdf/g20_right/linkerhand_g20_right.urdf"
)
assert config.camera_extrinsics.is_file()
assert config.calibration_config == (
REPO
@@ -5,6 +5,8 @@ import sys
import pytest
from linkerhand_calibration.compat import resolve_renamed_package_path
def test_legacy_python_package_forwards_only_public_config_api() -> None:
with pytest.warns(DeprecationWarning, match="linkerhand_calibration"):
@@ -36,3 +38,19 @@ def test_new_and_legacy_executable_names_share_one_implementation() -> None:
"linkerhand_calibration.runtime.nodes.calibration:main"
in setup_text
)
def test_package_resource_uri_resolves_to_the_workspace_copy() -> None:
repository = Path(__file__).resolve().parents[3]
expected = (
repository
/ "src/linkerhand_calibration/urdf/g20_right/linkerhand_g20_right.urdf"
)
resolved = resolve_renamed_package_path(
"package://linkerhand_calibration/urdf/g20_right/"
"linkerhand_g20_right.urdf",
repository,
)
assert resolved == expected
@@ -46,14 +46,12 @@ from linkerhand_calibration.full_hand import (
)
REPOSITORY = Path(__file__).resolve().parents[3]
SOURCE_URDF = REPOSITORY / (
"src/linkerhand_retarget/linkerhand_retarget/assets/robots/hands/"
"linker_hand/g20_left/linkerhand_g20_left.urdf"
PACKAGE_ROOT = Path(__file__).resolve().parents[1]
SOURCE_URDF = PACKAGE_ROOT / (
"urdf/g20_left/linkerhand_g20_left.urdf"
)
RIGHT_SOURCE_URDF = REPOSITORY / (
"src/linkerhand_retarget/linkerhand_retarget/assets/robots/hands/"
"linker_hand/g20_right/linkerhand_g20_right.urdf"
RIGHT_SOURCE_URDF = PACKAGE_ROOT / (
"urdf/g20_right/linkerhand_g20_right.urdf"
)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,953 @@
<?xml version="1.0" encoding="utf-8"?>
<robot
name="linkerhand_l6v3.1_right">
<!-- 手掌基座,作为整只手的根链接 -->
<link
name="rh_hand_base_link">
<inertial>
<origin
xyz="0.0019900000 0.0009100000 0.0583810000"
rpy="0 0 0" />
<mass
value="0.4185" />
<inertia
ixx="0.0004998"
ixy="-1.2853e-05"
ixz="-8.317e-06"
iyy="0.0003567"
iyz="-1.0354e-05"
izz="0.0002301" />
</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.796078431372549 0.823529411764706 0.937254901960784 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="rh_thumb_metacarpals_base1">
<inertial>
<origin
xyz="0.0018663000 0.0066406000 0.0015330000"
rpy="0 0 0" />
<mass
value="0.01" />
<inertia
ixx="3.3724e-07"
ixy="-1.11e-07"
ixz="-3.6039e-08"
iyy="2.9457e-07"
iyz="-5.7181e-08"
izz="4.903e-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.796078431372549 0.823529411764706 0.937254901960784 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="rh_thumb_cmc_roll"
type="revolute">
<origin
xyz="0.0078133 0.030812 0.025678"
rpy="-0.034907 0 0" />
<parent
link="rh_hand_base_link" />
<child
link="rh_thumb_metacarpals_base1" />
<axis
xyz="0 0.034899 -0.99939" />
<limit
lower="-0.087266"
upper="1.256637"
effort="0.588"
velocity="5.95" />
<dynamics damping="0.02" friction="0.05416667"/>
</joint>
<link
name="rh_thumb_metacarpals">
<inertial>
<origin
xyz="0.0076927091 -0.0859662185 0.0235283087"
rpy="0 0 0" />
<mass
value="0.065" />
<inertia
ixx="8.407e-06"
ixy="1.1338e-09"
ixz="1.1136e-08"
iyy="8.3899e-06"
iyz="-3.1171e-07"
izz="2.0091e-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/thumb_metacarpals.STL" />
</geometry>
<material
name="">
<color
rgba="0.796078431372549 0.823529411764706 0.937254901960784 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/thumb_metacarpals.STL" />
</geometry>
</collision>
</link>
<joint
name="rh_thumb_cmc_pitch"
type="revolute">
<origin
xyz="0.0054997 0.013314 0.0032166"
rpy="-1.0762 0.013637 -0.40121" />
<parent
link="rh_thumb_metacarpals_base1" />
<child
link="rh_thumb_metacarpals" />
<axis
xyz="1 0 0" />
<limit
lower="0"
upper="0.837758"
effort="1.008"
velocity="3.47" />
<dynamics damping="0.02" friction="0.0375"/>
</joint>
<link
name="rh_thumb_distal">
<inertial>
<origin
xyz="0.0076927091 -0.0798662185 -0.0591716913"
rpy="0 0 0" />
<mass
value="0.018" />
<inertia
ixx="1.5546e-06"
ixy="-2.4423e-09"
ixz="2.8147e-09"
iyy="1.7108e-06"
iyz="7.2756e-08"
izz="9.1709e-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.796078431372549 0.823529411764706 0.937254901960784 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/thumb_distal.STL" />
</geometry>
</collision>
</link>
<link
name="rh_thumb_tip">
<inertial>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<mass
value="1e-06" />
<inertia
ixx="1e-09"
ixy="0"
ixz="0"
iyy="1e-09"
iyz="0"
izz="1e-09" />
</inertial>
</link>
<joint
name="rh_thumb_tip_fixed"
type="fixed">
<origin
xyz="0 -0.0035 0.026"
rpy="0 0 -1.5708" />
<parent
link="rh_thumb_distal" />
<child
link="rh_thumb_tip" />
</joint>
<joint
name="rh_thumb_dip"
type="revolute">
<origin
xyz="0 -0.0061 0.0827"
rpy="0 0 0" />
<parent
link="rh_thumb_metacarpals" />
<child
link="rh_thumb_distal" />
<axis
xyz="1 0 0" />
<limit
lower="0"
upper="0.963287"
effort="0"
velocity="1.7" />
<mimic
joint="rh_thumb_cmc_pitch"
multiplier="1.226495"
offset="0" />
</joint>
<link
name="rh_index_proximal">
<inertial>
<origin
xyz="0.0017760000 0.0001100000 0.0125560000"
rpy="0 0 0" />
<mass
value="0.008553" />
<inertia
ixx="7.97543e-07"
ixy="1.275e-09"
ixz="1.38601e-07"
iyy="8.00499e-07"
iyz="-9.39e-10"
izz="3.57001e-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.796078431372549 0.823529411764706 0.937254901960784 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="rh_index_mcp_pitch"
type="revolute">
<origin
xyz="-0.00066821 0.033467 0.11622"
rpy="-0.087266 0 0" />
<parent
link="rh_hand_base_link" />
<child
link="rh_index_proximal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.134464"
effort="0.574"
velocity="6.10" />
<dynamics damping="0.01" friction="0.04"/>
</joint>
<link
name="rh_index_distal">
<inertial>
<origin
xyz="0.0134000000 -0.0022620000 0.0169920000"
rpy="0 0 0" />
<mass
value="0.018408" />
<inertia
ixx="2.488712e-06"
ixy="-8.249e-09"
ixz="-1.523059e-06"
iyy="3.723754e-06"
iyz="-1.4019e-08"
izz="1.813582e-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/index_distal.STL" />
</geometry>
<material
name="">
<color
rgba="0.796078431372549 0.823529411764706 0.937254901960784 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/index_distal.STL" />
</geometry>
</collision>
</link>
<link
name="rh_index_tip">
<inertial>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<mass
value="1e-06" />
<inertia
ixx="1e-09"
ixy="0"
ixz="0"
iyy="1e-09"
iyz="0"
izz="1e-09" />
</inertial>
</link>
<joint
name="rh_index_tip_fixed"
type="fixed">
<origin
xyz="0.0341 0 0.034"
rpy="0 0 0" />
<parent
link="rh_index_distal" />
<child
link="rh_index_tip" />
</joint>
<joint
name="rh_index_dip"
type="revolute">
<origin
xyz="0.0009359 0 0.028002"
rpy="0 0 0" />
<parent
link="rh_index_proximal" />
<child
link="rh_index_distal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.277039"
effort="0"
velocity="3.1" />
<mimic
joint="rh_index_mcp_pitch"
multiplier="1.125676"
offset="0" />
</joint>
<link
name="rh_middle_proximal">
<inertial>
<origin
xyz="0.0017760000 0.0001100000 0.0125560000"
rpy="0 0 0" />
<mass
value="0.008553" />
<inertia
ixx="7.97543e-07"
ixy="1.275e-09"
ixz="1.38601e-07"
iyy="8.00499e-07"
iyz="-9.39e-10"
izz="3.57001e-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.796078431372549 0.823529411764706 0.937254901960784 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="rh_middle_mcp_pitch"
type="revolute">
<origin
xyz="-0.00066821 0.0134013 0.12272"
rpy="-0.034907 0 0" />
<parent
link="rh_hand_base_link" />
<child
link="rh_middle_proximal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.134464"
effort="0.574"
velocity="6.10" />
<dynamics damping="0.01" friction="0.02708333"/>
</joint>
<link
name="rh_middle_distal">
<inertial>
<origin
xyz="0.0134000000 -0.0022620000 0.0169920000"
rpy="0 0 0" />
<mass
value="0.018408" />
<inertia
ixx="2.488712e-06"
ixy="-8.249e-09"
ixz="-1.523059e-06"
iyy="3.723754e-06"
iyz="-1.4019e-08"
izz="1.813582e-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/middle_distal.STL" />
</geometry>
<material
name="">
<color
rgba="0.796078431372549 0.823529411764706 0.937254901960784 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/middle_distal.STL" />
</geometry>
</collision>
</link>
<link
name="rh_middle_tip">
<inertial>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<mass
value="1e-06" />
<inertia
ixx="1e-09"
ixy="0"
ixz="0"
iyy="1e-09"
iyz="0"
izz="1e-09" />
</inertial>
</link>
<joint
name="rh_middle_tip_fixed"
type="fixed">
<origin
xyz="0.0341 0 0.034"
rpy="0 0 0" />
<parent
link="rh_middle_distal" />
<child
link="rh_middle_tip" />
</joint>
<joint
name="rh_middle_dip"
type="revolute">
<origin
xyz="0.0009359 0 0.028002"
rpy="0 0 0" />
<parent
link="rh_middle_proximal" />
<child
link="rh_middle_distal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.277039"
effort="0"
velocity="3.1" />
<mimic
joint="rh_middle_mcp_pitch"
multiplier="1.125676"
offset="0" />
</joint>
<link
name="rh_ring_proximal">
<inertial>
<origin
xyz="0.0017760000 0.0001100000 0.0125560000"
rpy="0 0 0" />
<mass
value="0.008553" />
<inertia
ixx="7.97543e-07"
ixy="1.275e-09"
ixz="1.38601e-07"
iyy="8.00499e-07"
iyz="-9.39e-10"
izz="3.57001e-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.796078431372549 0.823529411764706 0.937254901960784 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="rh_ring_mcp_pitch"
type="revolute">
<origin
xyz="-0.00067368 -0.006217 0.11872"
rpy="0.017453 0 0" />
<parent
link="rh_hand_base_link" />
<child
link="rh_ring_proximal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.134464"
effort="0.574"
velocity="6.10" />
<dynamics damping="0.01" friction="0.02291667"/>
</joint>
<link
name="rh_ring_distal">
<inertial>
<origin
xyz="0.0134000000 -0.0022620000 0.0169920000"
rpy="0 0 0" />
<mass
value="0.018408" />
<inertia
ixx="2.488712e-06"
ixy="-8.249e-09"
ixz="-1.523059e-06"
iyy="3.723754e-06"
iyz="-1.4019e-08"
izz="1.813582e-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/ring_distal.STL" />
</geometry>
<material
name="">
<color
rgba="0.796078431372549 0.823529411764706 0.937254901960784 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/ring_distal.STL" />
</geometry>
</collision>
</link>
<link
name="rh_ring_tip">
<inertial>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<mass
value="1e-06" />
<inertia
ixx="1e-09"
ixy="0"
ixz="0"
iyy="1e-09"
iyz="0"
izz="1e-09" />
</inertial>
</link>
<joint
name="rh_ring_tip_fixed"
type="fixed">
<origin
xyz="0.0341 0 0.034"
rpy="0 0 0" />
<parent
link="rh_ring_distal" />
<child
link="rh_ring_tip" />
</joint>
<joint
name="rh_ring_dip"
type="revolute">
<origin
xyz="0.0009359 0 0.028002"
rpy="0 0 0" />
<parent
link="rh_ring_proximal" />
<child
link="rh_ring_distal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.277039"
effort="0"
velocity="3.1" />
<mimic
joint="rh_ring_mcp_pitch"
multiplier="1.125676"
offset="0" />
</joint>
<link
name="rh_pinky_proximal">
<inertial>
<origin
xyz="0.0017760000 0.0001100000 0.0125560000"
rpy="0 0 0" />
<mass
value="0.008553" />
<inertia
ixx="7.97543e-07"
ixy="1.275e-09"
ixz="1.38601e-07"
iyy="8.00499e-07"
iyz="-9.39e-10"
izz="3.57001e-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.796078431372549 0.823529411764706 0.937254901960784 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="rh_pinky_mcp_pitch"
type="revolute">
<origin
xyz="-0.00067852 -0.025314 0.11474"
rpy="0.05236 0 0" />
<parent
link="rh_hand_base_link" />
<child
link="rh_pinky_proximal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.134464"
effort="0.574"
velocity="6.10" />
<dynamics damping="0.01" friction="0.01"/>
</joint>
<link
name="rh_pinky_distal">
<inertial>
<origin
xyz="0.0134000000 -0.0022620000 0.0169920000"
rpy="0 0 0" />
<mass
value="0.018408" />
<inertia
ixx="2.488712e-06"
ixy="-8.249e-09"
ixz="-1.523059e-06"
iyy="3.723754e-06"
iyz="-1.4019e-08"
izz="1.813582e-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/pinky_distal.STL" />
</geometry>
<material
name="">
<color
rgba="0.796078431372549 0.823529411764706 0.937254901960784 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="meshes/pinky_distal.STL" />
</geometry>
</collision>
</link>
<link
name="rh_pinky_tip">
<inertial>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<mass
value="1e-06" />
<inertia
ixx="1e-09"
ixy="0"
ixz="0"
iyy="1e-09"
iyz="0"
izz="1e-09" />
</inertial>
</link>
<joint
name="rh_pinky_tip_fixed"
type="fixed">
<origin
xyz="0.0341 0 0.034"
rpy="0 0 0" />
<parent
link="rh_pinky_distal" />
<child
link="rh_pinky_tip" />
</joint>
<joint
name="rh_pinky_dip"
type="revolute">
<origin
xyz="0.0009359 0 0.028002"
rpy="0 0 0" />
<parent
link="rh_pinky_proximal" />
<child
link="rh_pinky_distal" />
<axis
xyz="0 1 0" />
<limit
lower="0"
upper="1.277039"
effort="0"
velocity="3.1" />
<mimic
joint="rh_pinky_mcp_pitch"
multiplier="1.125676"
offset="0" />
</joint>
<transmission name="trans_thumb_cmc_roll">
<type>transmission_interface/SimpleTransmission</type>
<joint name="rh_thumb_cmc_roll">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor_thumb_cmc_roll">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>0.0084</mechanicalReduction>
</actuator>
</transmission>
<transmission name="trans_index_mcp_pitch">
<type>transmission_interface/SimpleTransmission</type>
<joint name="rh_index_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor_index_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>0.0082</mechanicalReduction>
</actuator>
</transmission>
<transmission name="trans_middle_mcp_pitch">
<type>transmission_interface/SimpleTransmission</type>
<joint name="rh_middle_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor_middle_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>0.0082</mechanicalReduction>
</actuator>
</transmission>
<transmission name="trans_ring_mcp_pitch">
<type>transmission_interface/SimpleTransmission</type>
<joint name="rh_ring_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor_ring_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>0.0082</mechanicalReduction>
</actuator>
</transmission>
<transmission name="trans_pinky_mcp_pitch">
<type>transmission_interface/SimpleTransmission</type>
<joint name="rh_pinky_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor_pinky_mcp_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>0.0082</mechanicalReduction>
</actuator>
</transmission>
<transmission name="trans_thumb_cmc_pitch">
<type>transmission_interface/SimpleTransmission</type>
<joint name="rh_thumb_cmc_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor_thumb_cmc_pitch">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>0.0144</mechanicalReduction>
</actuator>
</transmission>
<mujoco>
<compiler meshdir="meshes/" balanceinertia="true" discardvisual="false"/>
<default>
<joint armature="3.4707e-08" damping="5.0" frictionloss="0.5"/>
</default>
<equality>
<joint name="rh_couple_index" joint1="rh_index_dip" joint2="rh_index_mcp_pitch" polycoef="0 1.125676 0 0 0 0"/>
<joint name="rh_couple_middle" joint1="rh_middle_dip" joint2="rh_middle_mcp_pitch" polycoef="0 1.125676 0 0 0 0"/>
<joint name="rh_couple_ring" joint1="rh_ring_dip" joint2="rh_ring_mcp_pitch" polycoef="0 1.125676 0 0 0 0"/>
<joint name="rh_couple_pinky" joint1="rh_pinky_dip" joint2="rh_pinky_mcp_pitch" polycoef="0 1.125676 0 0 0 0"/>
<joint name="rh_couple_thumb" joint1="rh_thumb_dip" joint2="rh_thumb_cmc_pitch" polycoef="0 1.226495 0 0 0 0"/>
</equality>
</mujoco>
<gazebo reference="rh_hand_base_link">
<mu1>1.5</mu1>
<mu2>1.5</mu2>
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="rh_thumb_distal">
<mu1>1.5</mu1>
<mu2>1.5</mu2>
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="rh_index_distal">
<mu1>1.1</mu1>
<mu2>1.1</mu2>
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="rh_middle_distal">
<mu1>1.1</mu1>
<mu2>1.1</mu2>
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="rh_ring_distal">
<mu1>1.1</mu1>
<mu2>1.1</mu2>
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="rh_pinky_distal">
<mu1>1.1</mu1>
<mu2>1.1</mu2>
<selfCollide>true</selfCollide>
</gazebo>
</robot>