diff --git a/src/linkerhand_calibration/README.md b/src/linkerhand_calibration/README.md
index f51fc83..d90dbd1 100644
--- a/src/linkerhand_calibration/README.md
+++ b/src/linkerhand_calibration/README.md
@@ -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 \
diff --git a/src/linkerhand_calibration/config/g20_right_product.yaml b/src/linkerhand_calibration/config/g20_right_product.yaml
index 43d09bd..99ec4e4 100644
--- a/src/linkerhand_calibration/config/g20_right_product.yaml
+++ b/src/linkerhand_calibration/config/g20_right_product.yaml
@@ -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
diff --git a/src/linkerhand_calibration/launch/three_camera_calibration.launch.py b/src/linkerhand_calibration/launch/three_camera_calibration.launch.py
index 06c0831..3c3ef52 100644
--- a/src/linkerhand_calibration/launch/three_camera_calibration.launch.py
+++ b/src/linkerhand_calibration/launch/three_camera_calibration.launch.py
@@ -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):
diff --git a/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py b/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py
index 7e17310..375fad4 100644
--- a/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py
+++ b/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py
@@ -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():
diff --git a/src/linkerhand_calibration/setup.py b/src/linkerhand_calibration/setup.py
index 837b3ec..858656b 100644
--- a/src/linkerhand_calibration/setup.py
+++ b/src/linkerhand_calibration/setup.py
@@ -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,
diff --git a/src/linkerhand_calibration/test/test_config.py b/src/linkerhand_calibration/test/test_config.py
index f4fcd9a..cce07b2 100644
--- a/src/linkerhand_calibration/test/test_config.py
+++ b/src/linkerhand_calibration/test/test_config.py
@@ -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"
diff --git a/src/linkerhand_calibration/test/test_full_hand.py b/src/linkerhand_calibration/test/test_full_hand.py
index 0013256..c6b5b6a 100644
--- a/src/linkerhand_calibration/test/test_full_hand.py
+++ b/src/linkerhand_calibration/test/test_full_hand.py
@@ -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(
diff --git a/src/linkerhand_calibration/test/test_g20_right_product.py b/src/linkerhand_calibration/test/test_g20_right_product.py
index 63afc3f..64d5e2e 100644
--- a/src/linkerhand_calibration/test/test_g20_right_product.py
+++ b/src/linkerhand_calibration/test/test_g20_right_product.py
@@ -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
diff --git a/src/linkerhand_calibration/test/test_package_rename.py b/src/linkerhand_calibration/test/test_package_rename.py
index 1ff600f..7a3a6a4 100644
--- a/src/linkerhand_calibration/test/test_package_rename.py
+++ b/src/linkerhand_calibration/test/test_package_rename.py
@@ -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
diff --git a/src/linkerhand_calibration/test/test_urdf_zero.py b/src/linkerhand_calibration/test/test_urdf_zero.py
index d5fbbbf..a2d8835 100644
--- a/src/linkerhand_calibration/test/test_urdf_zero.py
+++ b/src/linkerhand_calibration/test/test_urdf_zero.py
@@ -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"
)
diff --git a/src/linkerhand_calibration/urdf/g20_left/linkerhand_g20_left.urdf b/src/linkerhand_calibration/urdf/g20_left/linkerhand_g20_left.urdf
new file mode 100644
index 0000000..9c0c1f1
--- /dev/null
+++ b/src/linkerhand_calibration/urdf/g20_left/linkerhand_g20_left.urdf
@@ -0,0 +1,1285 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/hand_base_link.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/hand_base_link.STL
new file mode 100644
index 0000000..706606c
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/hand_base_link.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/index_distal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/index_distal.STL
new file mode 100644
index 0000000..281a53c
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/index_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/index_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/index_metacarpals.STL
new file mode 100644
index 0000000..608b860
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/index_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/index_middle.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/index_middle.STL
new file mode 100644
index 0000000..9f00fc4
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/index_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/index_proximal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/index_proximal.STL
new file mode 100644
index 0000000..4a4473d
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/index_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/middle_distal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_distal.STL
new file mode 100644
index 0000000..37d5121
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/middle_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_metacarpals.STL
new file mode 100644
index 0000000..96674b1
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/middle_middle.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_middle.STL
new file mode 100644
index 0000000..3b17190
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/middle_proximal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_proximal.STL
new file mode 100644
index 0000000..80b553d
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/middle_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_distal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_distal.STL
new file mode 100644
index 0000000..8e2e782
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_metacarpals.STL
new file mode 100644
index 0000000..05a4d03
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_middle.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_middle.STL
new file mode 100644
index 0000000..afab601
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_proximal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_proximal.STL
new file mode 100644
index 0000000..446789a
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/pinky_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/ring_distal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_distal.STL
new file mode 100644
index 0000000..6915e85
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/ring_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_metacarpals.STL
new file mode 100644
index 0000000..f502969
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/ring_middle.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_middle.STL
new file mode 100644
index 0000000..88b6ef5
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/ring_proximal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_proximal.STL
new file mode 100644
index 0000000..5a06a97
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/ring_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_distal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_distal.STL
new file mode 100644
index 0000000..dc10991
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals.STL
new file mode 100644
index 0000000..156e9b3
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals_base1.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals_base1.STL
new file mode 100644
index 0000000..16e1059
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals_base1.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals_base2.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals_base2.STL
new file mode 100644
index 0000000..cf5fced
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_metacarpals_base2.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_proximal.STL b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_proximal.STL
new file mode 100644
index 0000000..b657d19
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_left/meshes/thumb_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/linkerhand_g20_right.urdf b/src/linkerhand_calibration/urdf/g20_right/linkerhand_g20_right.urdf
new file mode 100644
index 0000000..3d1b6cd
--- /dev/null
+++ b/src/linkerhand_calibration/urdf/g20_right/linkerhand_g20_right.urdf
@@ -0,0 +1,1285 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/hand_base_link.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/hand_base_link.STL
new file mode 100644
index 0000000..f277145
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/hand_base_link.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/index_distal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/index_distal.STL
new file mode 100644
index 0000000..b812c38
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/index_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/index_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/index_metacarpals.STL
new file mode 100644
index 0000000..a319384
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/index_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/index_middle.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/index_middle.STL
new file mode 100644
index 0000000..5ea8f9c
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/index_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/index_proximal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/index_proximal.STL
new file mode 100644
index 0000000..923012e
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/index_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/middle_distal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_distal.STL
new file mode 100644
index 0000000..cd1ee86
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/middle_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_metacarpals.STL
new file mode 100644
index 0000000..62a6b35
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/middle_middle.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_middle.STL
new file mode 100644
index 0000000..3b9861b
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/middle_proximal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_proximal.STL
new file mode 100644
index 0000000..9febd39
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/middle_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_distal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_distal.STL
new file mode 100644
index 0000000..8f25349
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_metacarpals.STL
new file mode 100644
index 0000000..64b9b7b
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_middle.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_middle.STL
new file mode 100644
index 0000000..d1a62f6
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_proximal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_proximal.STL
new file mode 100644
index 0000000..d26bc4b
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/pinky_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/ring_distal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_distal.STL
new file mode 100644
index 0000000..9b53ea5
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/ring_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_metacarpals.STL
new file mode 100644
index 0000000..095a682
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/ring_middle.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_middle.STL
new file mode 100644
index 0000000..b25525e
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_middle.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/ring_proximal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_proximal.STL
new file mode 100644
index 0000000..7b2a085
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/ring_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_distal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_distal.STL
new file mode 100644
index 0000000..2dbc10f
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals.STL
new file mode 100644
index 0000000..384fd60
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals_base1.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals_base1.STL
new file mode 100644
index 0000000..71269cb
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals_base1.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals_base2.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals_base2.STL
new file mode 100644
index 0000000..e1c0763
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_metacarpals_base2.STL differ
diff --git a/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_proximal.STL b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_proximal.STL
new file mode 100644
index 0000000..d32cf2d
Binary files /dev/null and b/src/linkerhand_calibration/urdf/g20_right/meshes/thumb_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/linkerhand_l6v3.1_right.urdf b/src/linkerhand_calibration/urdf/l6_right/linkerhand_l6v3.1_right.urdf
new file mode 100644
index 0000000..58b9f81
--- /dev/null
+++ b/src/linkerhand_calibration/urdf/l6_right/linkerhand_l6v3.1_right.urdf
@@ -0,0 +1,953 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ transmission_interface/SimpleTransmission
+
+ hardware_interface/EffortJointInterface
+
+
+ hardware_interface/EffortJointInterface
+ 0.0084
+
+
+
+ transmission_interface/SimpleTransmission
+
+ hardware_interface/EffortJointInterface
+
+
+ hardware_interface/EffortJointInterface
+ 0.0082
+
+
+
+ transmission_interface/SimpleTransmission
+
+ hardware_interface/EffortJointInterface
+
+
+ hardware_interface/EffortJointInterface
+ 0.0082
+
+
+
+ transmission_interface/SimpleTransmission
+
+ hardware_interface/EffortJointInterface
+
+
+ hardware_interface/EffortJointInterface
+ 0.0082
+
+
+
+ transmission_interface/SimpleTransmission
+
+ hardware_interface/EffortJointInterface
+
+
+ hardware_interface/EffortJointInterface
+ 0.0082
+
+
+
+ transmission_interface/SimpleTransmission
+
+ hardware_interface/EffortJointInterface
+
+
+ hardware_interface/EffortJointInterface
+ 0.0144
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.5
+ 1.5
+ true
+
+
+ 1.5
+ 1.5
+ true
+
+
+ 1.1
+ 1.1
+ true
+
+
+ 1.1
+ 1.1
+ true
+
+
+ 1.1
+ 1.1
+ true
+
+
+ 1.1
+ 1.1
+ true
+
+
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/hand_base_link.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/hand_base_link.STL
new file mode 100644
index 0000000..7e120de
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/hand_base_link.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/index_distal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/index_distal.STL
new file mode 100644
index 0000000..88498e1
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/index_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/index_proximal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/index_proximal.STL
new file mode 100644
index 0000000..8317a27
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/index_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/middle_distal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/middle_distal.STL
new file mode 100644
index 0000000..c4bad01
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/middle_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/middle_proximal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/middle_proximal.STL
new file mode 100644
index 0000000..6b1f4ed
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/middle_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/pinky_distal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/pinky_distal.STL
new file mode 100644
index 0000000..b11d56d
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/pinky_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/pinky_proximal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/pinky_proximal.STL
new file mode 100644
index 0000000..0718f2d
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/pinky_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/ring_distal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/ring_distal.STL
new file mode 100644
index 0000000..019bac7
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/ring_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/ring_proximal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/ring_proximal.STL
new file mode 100644
index 0000000..7ac57c8
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/ring_proximal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_distal.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_distal.STL
new file mode 100644
index 0000000..84c1e50
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_distal.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_metacarpals.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_metacarpals.STL
new file mode 100644
index 0000000..748d580
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_metacarpals.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_metacarpals_base1.STL b/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_metacarpals_base1.STL
new file mode 100644
index 0000000..90c93bd
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/thumb_metacarpals_base1.STL differ
diff --git a/src/linkerhand_calibration/urdf/l6_right/meshes/wrist_ft_link.stl b/src/linkerhand_calibration/urdf/l6_right/meshes/wrist_ft_link.stl
new file mode 100644
index 0000000..e377c27
Binary files /dev/null and b/src/linkerhand_calibration/urdf/l6_right/meshes/wrist_ft_link.stl differ