原始urdf位置修改
This commit is contained in:
@@ -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():
|
||||
|
||||
@@ -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
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.
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.
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.
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.
@@ -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>
|
||||
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.
Reference in New Issue
Block a user