diff --git a/src/g20_thumb_apriltag_calibration/setup.cfg b/src/g20_thumb_apriltag_calibration/setup.cfg deleted file mode 100644 index bae3e00..0000000 --- a/src/g20_thumb_apriltag_calibration/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[develop] -script_dir=$base/lib/g20_thumb_apriltag_calibration -[install] -install_scripts=$base/lib/g20_thumb_apriltag_calibration diff --git a/src/g20_thumb_apriltag_calibration/README.md b/src/linkerhand_calibration/README.md similarity index 98% rename from src/g20_thumb_apriltag_calibration/README.md rename to src/linkerhand_calibration/README.md index 28262dd..34eb5e0 100644 --- a/src/g20_thumb_apriltag_calibration/README.md +++ b/src/linkerhand_calibration/README.md @@ -1,17 +1,20 @@ -# G20 左右手 AprilTag 标定 +# LinkerHand 专业标定包 ## G20右手正式一键标定 固定三相机和19张Tag安装完成后,用户只运行: ```bash -ros2 run g20_thumb_apriltag_calibration calibrate_g20_right +ros2 run linkerhand_calibration calibrate_hand ``` +旧 executable `calibrate_g20_right` 在本发行版内保留为同一入口的别名; +旧 ROS 包名前缀不再提供。新脚本和部署配置统一使用 `calibrate_hand`。 + 完全独立地只标定大拇指4项任务时,使用: ```bash -ros2 run g20_thumb_apriltag_calibration calibrate_g20_right \ +ros2 run linkerhand_calibration calibrate_hand \ --scope thumb ``` @@ -23,7 +26,7 @@ ros2 run g20_thumb_apriltag_calibration calibrate_g20_right \ 如果确实需要把新的拇指结果合并到一份已经通过的完整整手标定,才额外使用: ```bash -ros2 run g20_thumb_apriltag_calibration calibrate_g20_right \ +ros2 run linkerhand_calibration calibrate_hand \ --scope thumb \ --base-session calibration_output/G20_RIGHT_001/latest_passed ``` @@ -35,7 +38,7 @@ ros2 run g20_thumb_apriltag_calibration calibrate_g20_right \ 只重新采集12项四指任务并合成完整整手URDF: ```bash -ros2 run g20_thumb_apriltag_calibration calibrate_g20_right \ +ros2 run linkerhand_calibration calibrate_hand \ --scope fingers \ --base-session calibration_output/G20_RIGHT_001/<已通过的拇指会话时间戳> ``` @@ -114,7 +117,7 @@ schema v4 JSON,不再生成schema v5运行文件。 `tag_layout:=legacy_11`,两套配置和结果schema互不覆盖: ```bash -ros2 launch g20_thumb_apriltag_calibration three_camera_calibration.launch.py \ +ros2 launch linkerhand_calibration three_camera_calibration.launch.py \ hand_type:=right \ tag_layout:=g20_right_19 \ serial_number:=G20_RIGHT_001 \ @@ -271,7 +274,7 @@ ID 9 必须在拇指横摆的完整行程中持续可见。 ```bash mkdir -p /home/lxp/projects/linkerhand_retarget_ros2/config -ros2 launch g20_thumb_apriltag_calibration \ +ros2 launch linkerhand_calibration \ three_camera_extrinsics.launch.py \ output_file:=/home/lxp/projects/linkerhand_retarget_ros2/config/g20_three_camera_extrinsics.yaml \ checkerboard_columns:=8 checkerboard_rows:=5 square_size_m:=0.027 @@ -312,7 +315,7 @@ ros2 service call /g20_camera_extrinsics/save std_srvs/srv/Trigger {} 先使用禁止运动模式检查三个机位、外参、内参和标签: ```bash -ros2 launch g20_thumb_apriltag_calibration \ +ros2 launch linkerhand_calibration \ three_camera_calibration.launch.py \ hand_type:=left \ serial_number:=G20_LEFT_001 \ @@ -335,7 +338,7 @@ ros2 run image_view image_view --ros-args \ 确认全行程安全、MVS客户端已关闭且没有其他命令发布者后,重启正式流程: ```bash -ros2 launch g20_thumb_apriltag_calibration \ +ros2 launch linkerhand_calibration \ three_camera_calibration.launch.py \ hand_type:=left \ serial_number:=G20_LEFT_001 \ @@ -347,7 +350,7 @@ ros2 launch g20_thumb_apriltag_calibration \ 右手使用同一入口;默认自动选择右手SDK话题和原始URDF: ```bash -ros2 launch g20_thumb_apriltag_calibration \ +ros2 launch linkerhand_calibration \ three_camera_calibration.launch.py \ hand_type:=right \ serial_number:=G20_RIGHT_001 \ @@ -526,7 +529,7 @@ calibration_output/G20_RIGHT_001/<时间戳>/ 命令。`--output-tag` 为新产物增加安全后缀,已有JSON、URDF和验证报告不会被覆盖: ```bash -python3 -m g20_thumb_apriltag_calibration.offline_replay \ +python3 -m linkerhand_calibration.offline_replay \ calibration_output/G20_RIGHT_001/20260811_120146 \ --output-tag AXIS_FRAME_V3 \ --write @@ -543,7 +546,7 @@ python3 -m g20_thumb_apriltag_calibration.offline_replay \ `JointState`(包括5个被动关节): ```bash -ros2 launch g20_thumb_apriltag_calibration calibrated_joint_state_bridge.launch.py \ +ros2 launch linkerhand_calibration calibrated_joint_state_bridge.launch.py \ hand_type:=right \ calibration_file:=$PWD/calibration_output/G20_RIGHT_001/20260811_120146/g20_right_G20_RIGHT_001_calibration.json ``` @@ -615,7 +618,7 @@ sudo apt-get install -y \ cd /home/lxp/projects/linkerhand_retarget_ros2 source /opt/ros/jazzy/setup.bash colcon build --symlink-install \ - --packages-select linker_hand_ros2_sdk g20_thumb_apriltag_calibration + --packages-select linker_hand_ros2_sdk linkerhand_calibration source install/setup.bash ``` @@ -642,7 +645,7 @@ source install/setup.bash 先单独启动相机(不会连接机械手,也不会发送关节命令): ```bash -ros2 run g20_thumb_apriltag_calibration hikrobot_camera_node --ros-args \ +ros2 run linkerhand_calibration hikrobot_camera_node --ros-args \ --remap __ns:=/camera/camera/color \ -p serial_number:=DB2163742 \ -p camera_info_url:=$HOME/.ros/camera_info/hikrobot_DB2163742.yaml @@ -680,7 +683,7 @@ ros2 run camera_calibration cameracalibrator \ 但标定节点不会发送位置运动命令,也不会允许解锁全行程扫描: ```bash -ros2 launch g20_thumb_apriltag_calibration front_thumb_calibration.launch.py \ +ros2 launch linkerhand_calibration front_thumb_calibration.launch.py \ serial_number:=G20_LEFT_001 \ camera_serial_number:=DB2163742 \ commands_enabled:=false @@ -691,7 +694,7 @@ ros2 launch g20_thumb_apriltag_calibration front_thumb_calibration.launch.py \ 速度,并使用单终点连续运动: ```bash -ros2 launch g20_thumb_apriltag_calibration front_thumb_calibration.launch.py \ +ros2 launch linkerhand_calibration front_thumb_calibration.launch.py \ serial_number:=G20_LEFT_001 \ camera_serial_number:=DB2163742 \ can_interface:=can0 \ @@ -804,7 +807,7 @@ calibration_output/<序列号>/<时间戳>/ 恢复时必须显式复用原目录,否则会创建新会话: ```bash -ros2 launch g20_thumb_apriltag_calibration front_thumb_calibration.launch.py \ +ros2 launch linkerhand_calibration front_thumb_calibration.launch.py \ serial_number:=G20_LEFT_001 \ session_dir:=/绝对路径/calibration_output/G20_LEFT_001/20260727_120000 ``` @@ -884,7 +887,7 @@ for name, joint in data["joints"].items(): URDF: ```bash -ros2 launch g20_thumb_apriltag_calibration \ +ros2 launch linkerhand_calibration \ front_cmc_pitch_zero.launch.py \ serial_number:=G20_LEFT_001 ``` @@ -961,7 +964,7 @@ zero_angles.table_projected_zero_rad Roll同样固定使用“T3中心→拟合圆心”的内向径向矢量,不读取T3标签朝向。 ```bash -ros2 launch g20_thumb_apriltag_calibration \ +ros2 launch linkerhand_calibration \ front_cmc_roll_calibration.launch.py \ serial_number:=G20_LEFT_001 ``` diff --git a/src/g20_thumb_apriltag_calibration/config/calibration.yaml b/src/linkerhand_calibration/config/calibration.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/calibration.yaml rename to src/linkerhand_calibration/config/calibration.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/cmc_pitch_zero.yaml b/src/linkerhand_calibration/config/cmc_pitch_zero.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/cmc_pitch_zero.yaml rename to src/linkerhand_calibration/config/cmc_pitch_zero.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/cmc_roll_zero_travel.yaml b/src/linkerhand_calibration/config/cmc_roll_zero_travel.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/cmc_roll_zero_travel.yaml rename to src/linkerhand_calibration/config/cmc_roll_zero_travel.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/fastdds_large_images.xml b/src/linkerhand_calibration/config/fastdds_large_images.xml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/fastdds_large_images.xml rename to src/linkerhand_calibration/config/fastdds_large_images.xml diff --git a/src/g20_thumb_apriltag_calibration/config/front_tags.yaml b/src/linkerhand_calibration/config/front_tags.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/front_tags.yaml rename to src/linkerhand_calibration/config/front_tags.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/g20_right_product.yaml b/src/linkerhand_calibration/config/g20_right_product.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/g20_right_product.yaml rename to src/linkerhand_calibration/config/g20_right_product.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/three_camera_calibration.yaml b/src/linkerhand_calibration/config/three_camera_calibration.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/three_camera_calibration.yaml rename to src/linkerhand_calibration/config/three_camera_calibration.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/three_camera_tags.yaml b/src/linkerhand_calibration/config/three_camera_tags.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/three_camera_tags.yaml rename to src/linkerhand_calibration/config/three_camera_tags.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/three_camera_tags_g20_right_15.yaml b/src/linkerhand_calibration/config/three_camera_tags_g20_right_15.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/three_camera_tags_g20_right_15.yaml rename to src/linkerhand_calibration/config/three_camera_tags_g20_right_15.yaml diff --git a/src/g20_thumb_apriltag_calibration/config/three_camera_tags_g20_right_19.yaml b/src/linkerhand_calibration/config/three_camera_tags_g20_right_19.yaml similarity index 100% rename from src/g20_thumb_apriltag_calibration/config/three_camera_tags_g20_right_19.yaml rename to src/linkerhand_calibration/config/three_camera_tags_g20_right_19.yaml diff --git a/src/linkerhand_calibration/g20_thumb_apriltag_calibration/__init__.py b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/__init__.py new file mode 100644 index 0000000..5b1272d --- /dev/null +++ b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/__init__.py @@ -0,0 +1,21 @@ +"""One-release compatibility surface for the former Python package name. + +New code must import :mod:`linkerhand_calibration`. Only the documented +configuration loader is re-exported here; calibration algorithms continue to +have a single implementation in the renamed package. +""" + +from __future__ import annotations + +import warnings + +warnings.warn( + "g20_thumb_apriltag_calibration is deprecated; " + "import linkerhand_calibration instead", + DeprecationWarning, + stacklevel=2, +) + +from linkerhand_calibration.product import ProductConfig, load_product_config + +__all__ = ["ProductConfig", "load_product_config"] diff --git a/src/linkerhand_calibration/g20_thumb_apriltag_calibration/calibrated_joint_state_bridge.py b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/calibrated_joint_state_bridge.py new file mode 100644 index 0000000..9b82642 --- /dev/null +++ b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/calibrated_joint_state_bridge.py @@ -0,0 +1,9 @@ +"""Deprecated forwarding entry point for the runtime joint-state bridge.""" + +from linkerhand_calibration.calibrated_joint_state_bridge import main + +__all__ = ["main"] + + +if __name__ == "__main__": + main() diff --git a/src/linkerhand_calibration/g20_thumb_apriltag_calibration/offline_replay.py b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/offline_replay.py new file mode 100644 index 0000000..06f640a --- /dev/null +++ b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/offline_replay.py @@ -0,0 +1,9 @@ +"""Deprecated forwarding entry point for offline replay.""" + +from linkerhand_calibration.offline_replay import main + +__all__ = ["main"] + + +if __name__ == "__main__": + main() diff --git a/src/linkerhand_calibration/g20_thumb_apriltag_calibration/one_command.py b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/one_command.py new file mode 100644 index 0000000..b2b93a5 --- /dev/null +++ b/src/linkerhand_calibration/g20_thumb_apriltag_calibration/one_command.py @@ -0,0 +1,9 @@ +"""Deprecated forwarding entry point for the former Python package.""" + +from linkerhand_calibration.one_command import main + +__all__ = ["main"] + + +if __name__ == "__main__": + main() diff --git a/src/g20_thumb_apriltag_calibration/launch/calibrated_joint_state_bridge.launch.py b/src/linkerhand_calibration/launch/calibrated_joint_state_bridge.launch.py similarity index 96% rename from src/g20_thumb_apriltag_calibration/launch/calibrated_joint_state_bridge.launch.py rename to src/linkerhand_calibration/launch/calibrated_joint_state_bridge.launch.py index 810b1c5..c6a19d6 100644 --- a/src/g20_thumb_apriltag_calibration/launch/calibrated_joint_state_bridge.launch.py +++ b/src/linkerhand_calibration/launch/calibrated_joint_state_bridge.launch.py @@ -14,7 +14,7 @@ def generate_launch_description() -> LaunchDescription: DeclareLaunchArgument("input_topic", default_value=""), DeclareLaunchArgument("output_topic", default_value=""), Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="calibrated_joint_state_bridge", name=[ "g20_calibrated_joint_state_bridge_", diff --git a/src/g20_thumb_apriltag_calibration/launch/front_cmc_pitch_zero.launch.py b/src/linkerhand_calibration/launch/front_cmc_pitch_zero.launch.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/launch/front_cmc_pitch_zero.launch.py rename to src/linkerhand_calibration/launch/front_cmc_pitch_zero.launch.py index 4cb6d93..3e6f19c 100644 --- a/src/g20_thumb_apriltag_calibration/launch/front_cmc_pitch_zero.launch.py +++ b/src/linkerhand_calibration/launch/front_cmc_pitch_zero.launch.py @@ -48,7 +48,7 @@ def _launch_stack(context): tag_config = LaunchConfiguration("tag_config").perform(context) zero_config = LaunchConfiguration("zero_config").perform(context) camera = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="hikrobot_camera_node", name="hikrobot_camera", namespace="/camera/camera/color", @@ -158,7 +158,7 @@ def _launch_stack(context): ) zero_node = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="cmc_pitch_zero_node", name="g20_thumb_cmc_pitch_zero", output="screen", @@ -203,7 +203,7 @@ def _launch_stack(context): def generate_launch_description() -> LaunchDescription: package_share = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) return LaunchDescription( [ diff --git a/src/g20_thumb_apriltag_calibration/launch/front_cmc_roll_calibration.launch.py b/src/linkerhand_calibration/launch/front_cmc_roll_calibration.launch.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/launch/front_cmc_roll_calibration.launch.py rename to src/linkerhand_calibration/launch/front_cmc_roll_calibration.launch.py index 0ce1548..4c8c10b 100644 --- a/src/g20_thumb_apriltag_calibration/launch/front_cmc_roll_calibration.launch.py +++ b/src/linkerhand_calibration/launch/front_cmc_roll_calibration.launch.py @@ -50,7 +50,7 @@ def _launch_stack(context): "calibration_config" ).perform(context) camera = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="hikrobot_camera_node", name="hikrobot_camera", namespace="/camera/camera/color", @@ -160,7 +160,7 @@ def _launch_stack(context): ) calibration_node = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="cmc_roll_calibration_node", name="g20_thumb_cmc_roll_calibration", output="screen", @@ -205,7 +205,7 @@ def _launch_stack(context): def generate_launch_description() -> LaunchDescription: package_share = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) return LaunchDescription( [ diff --git a/src/g20_thumb_apriltag_calibration/launch/front_thumb_calibration.launch.py b/src/linkerhand_calibration/launch/front_thumb_calibration.launch.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/launch/front_thumb_calibration.launch.py rename to src/linkerhand_calibration/launch/front_thumb_calibration.launch.py index f8cd2d9..3c3284d 100644 --- a/src/g20_thumb_apriltag_calibration/launch/front_thumb_calibration.launch.py +++ b/src/linkerhand_calibration/launch/front_thumb_calibration.launch.py @@ -82,7 +82,7 @@ def _launch_stack(context): ) camera = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="hikrobot_camera_node", name="hikrobot_camera", namespace="/camera/camera/color", @@ -234,7 +234,7 @@ def _launch_stack(context): ) calibration = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="calibration_node", name="g20_thumb_calibration", output="screen", @@ -315,7 +315,7 @@ def _launch_stack(context): def generate_launch_description() -> LaunchDescription: package_share = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) default_output = str(Path.cwd() / "calibration_output") return LaunchDescription( diff --git a/src/g20_thumb_apriltag_calibration/launch/three_camera_calibration.launch.py b/src/linkerhand_calibration/launch/three_camera_calibration.launch.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/launch/three_camera_calibration.launch.py rename to src/linkerhand_calibration/launch/three_camera_calibration.launch.py index 4187281..3d53e8a 100644 --- a/src/g20_thumb_apriltag_calibration/launch/three_camera_calibration.launch.py +++ b/src/linkerhand_calibration/launch/three_camera_calibration.launch.py @@ -39,7 +39,7 @@ def _default_source_urdf(hand_type: str) -> Path: def _launch_stack(context): - from g20_thumb_apriltag_calibration.product import ( + from linkerhand_calibration.product import ( get_product_calibration_contract, ) @@ -56,7 +56,7 @@ def _launch_stack(context): raise RuntimeError(str(error)) from error requested_tag_config = LaunchConfiguration("tag_config").perform(context) package_share = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) tag_config = ( Path(requested_tag_config).expanduser().resolve() @@ -149,7 +149,7 @@ def _launch_stack(context): detection_topics.append(detection_topic) cameras.append( Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="hikrobot_camera_node", name="hikrobot_camera", namespace=namespace, @@ -271,7 +271,7 @@ def _launch_stack(context): ], ) calibration = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="three_camera_calibration_node", name="g20_calibration", output="screen", @@ -386,7 +386,7 @@ def _launch_stack(context): def generate_launch_description() -> LaunchDescription: package_share = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) info_root = Path.home() / ".ros" / "camera_info" return LaunchDescription( diff --git a/src/g20_thumb_apriltag_calibration/launch/three_camera_extrinsics.launch.py b/src/linkerhand_calibration/launch/three_camera_extrinsics.launch.py similarity index 97% rename from src/g20_thumb_apriltag_calibration/launch/three_camera_extrinsics.launch.py rename to src/linkerhand_calibration/launch/three_camera_extrinsics.launch.py index 29429d3..4371795 100644 --- a/src/g20_thumb_apriltag_calibration/launch/three_camera_extrinsics.launch.py +++ b/src/linkerhand_calibration/launch/three_camera_extrinsics.launch.py @@ -26,7 +26,7 @@ def _launch(context): namespace = f"/g20_extrinsics/{view}/camera" cameras.append( Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="hikrobot_camera_node", name="hikrobot_camera", namespace=namespace, @@ -85,7 +85,7 @@ def _launch(context): output="screen", ) solver = Node( - package="g20_thumb_apriltag_calibration", + package="linkerhand_calibration", executable="three_camera_extrinsics_node", name="g20_camera_extrinsics", output="screen", @@ -138,7 +138,7 @@ def _launch(context): def generate_launch_description() -> LaunchDescription: package_share = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) camera_info = Path.home() / ".ros" / "camera_info" return LaunchDescription( diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/__init__.py b/src/linkerhand_calibration/linkerhand_calibration/__init__.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/__init__.py rename to src/linkerhand_calibration/linkerhand_calibration/__init__.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/acquisition.py b/src/linkerhand_calibration/linkerhand_calibration/acquisition.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/acquisition.py rename to src/linkerhand_calibration/linkerhand_calibration/acquisition.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/alignment_view.py b/src/linkerhand_calibration/linkerhand_calibration/alignment_view.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/alignment_view.py rename to src/linkerhand_calibration/linkerhand_calibration/alignment_view.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/calibrated_joint_state_bridge.py b/src/linkerhand_calibration/linkerhand_calibration/calibrated_joint_state_bridge.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/calibrated_joint_state_bridge.py rename to src/linkerhand_calibration/linkerhand_calibration/calibrated_joint_state_bridge.py diff --git a/src/linkerhand_calibration/linkerhand_calibration/compat/__init__.py b/src/linkerhand_calibration/linkerhand_calibration/compat/__init__.py new file mode 100644 index 0000000..e4dd3a9 --- /dev/null +++ b/src/linkerhand_calibration/linkerhand_calibration/compat/__init__.py @@ -0,0 +1,5 @@ +"""Compatibility adapters for one-release calibration migrations.""" + +from .paths import resolve_renamed_package_path + +__all__ = ["resolve_renamed_package_path"] diff --git a/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py b/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py new file mode 100644 index 0000000..7e17310 --- /dev/null +++ b/src/linkerhand_calibration/linkerhand_calibration/compat/paths.py @@ -0,0 +1,29 @@ +"""Path compatibility for immutable v1 product configurations.""" + +from __future__ import annotations + +from pathlib import Path + + +_LEGACY_SOURCE_PREFIX = Path("src/g20_thumb_apriltag_calibration") +_CURRENT_SOURCE_PREFIX = Path("src/linkerhand_calibration") + + +def resolve_renamed_package_path(value: str | Path, workspace: Path) -> Path: + """Resolve a path and remap only the former source-package 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. + """ + raw = Path(value).expanduser() + candidate = raw if raw.is_absolute() else workspace / raw + candidate = candidate.resolve() + if candidate.exists() or raw.is_absolute(): + return candidate + try: + suffix = raw.relative_to(_LEGACY_SOURCE_PREFIX) + except ValueError: + return candidate + return (workspace / _CURRENT_SOURCE_PREFIX / suffix).resolve() diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/core.py b/src/linkerhand_calibration/linkerhand_calibration/core.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/core.py rename to src/linkerhand_calibration/linkerhand_calibration/core.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/diagnostics.py b/src/linkerhand_calibration/linkerhand_calibration/diagnostics.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/diagnostics.py rename to src/linkerhand_calibration/linkerhand_calibration/diagnostics.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/extrinsics.py b/src/linkerhand_calibration/linkerhand_calibration/extrinsics.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/extrinsics.py rename to src/linkerhand_calibration/linkerhand_calibration/extrinsics.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/extrinsics_node.py b/src/linkerhand_calibration/linkerhand_calibration/extrinsics_node.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/extrinsics_node.py rename to src/linkerhand_calibration/linkerhand_calibration/extrinsics_node.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/full_hand.py b/src/linkerhand_calibration/linkerhand_calibration/full_hand.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/full_hand.py rename to src/linkerhand_calibration/linkerhand_calibration/full_hand.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/hikrobot_camera.py b/src/linkerhand_calibration/linkerhand_calibration/hikrobot_camera.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/hikrobot_camera.py rename to src/linkerhand_calibration/linkerhand_calibration/hikrobot_camera.py index f2a6694..225b523 100644 --- a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/hikrobot_camera.py +++ b/src/linkerhand_calibration/linkerhand_calibration/hikrobot_camera.py @@ -203,7 +203,7 @@ def configure_fastdds_large_image_transport() -> Path: from ament_index_python.packages import get_package_share_directory profile = ( - Path(get_package_share_directory("g20_thumb_apriltag_calibration")) + Path(get_package_share_directory("linkerhand_calibration")) / "config" / "fastdds_large_images.xml" ) diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/node.py b/src/linkerhand_calibration/linkerhand_calibration/node.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/node.py rename to src/linkerhand_calibration/linkerhand_calibration/node.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/offline_replay.py b/src/linkerhand_calibration/linkerhand_calibration/offline_replay.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/offline_replay.py rename to src/linkerhand_calibration/linkerhand_calibration/offline_replay.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/one_command.py b/src/linkerhand_calibration/linkerhand_calibration/one_command.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/one_command.py rename to src/linkerhand_calibration/linkerhand_calibration/one_command.py index c441fe1..edd2bc4 100644 --- a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/one_command.py +++ b/src/linkerhand_calibration/linkerhand_calibration/one_command.py @@ -137,7 +137,7 @@ class ProgressConsole: def _default_product_config() -> Path: try: installed = Path( - get_package_share_directory("g20_thumb_apriltag_calibration") + get_package_share_directory("linkerhand_calibration") ) / "config" / "g20_right_product.yaml" if installed.is_file(): return installed @@ -145,7 +145,7 @@ def _default_product_config() -> Path: pass return ( Path.cwd() - / "src/g20_thumb_apriltag_calibration/config/g20_right_product.yaml" + / "src/linkerhand_calibration/config/g20_right_product.yaml" ).resolve() @@ -188,7 +188,7 @@ def _launch_command( return [ "ros2", "launch", - "g20_thumb_apriltag_calibration", + "linkerhand_calibration", "three_camera_calibration.launch.py", *(f"{name}:={value}" for name, value in values.items()), ] diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/operator_report.py b/src/linkerhand_calibration/linkerhand_calibration/operator_report.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/operator_report.py rename to src/linkerhand_calibration/linkerhand_calibration/operator_report.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/pnp.py b/src/linkerhand_calibration/linkerhand_calibration/pnp.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/pnp.py rename to src/linkerhand_calibration/linkerhand_calibration/pnp.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/product.py b/src/linkerhand_calibration/linkerhand_calibration/product.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/product.py rename to src/linkerhand_calibration/linkerhand_calibration/product.py index cf5d591..3b4b057 100644 --- a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/product.py +++ b/src/linkerhand_calibration/linkerhand_calibration/product.py @@ -16,6 +16,7 @@ from typing import Any, Mapping import yaml +from .compat import resolve_renamed_package_path from .extrinsics import camera_info_fingerprint, load_three_camera_extrinsics from .full_hand import ( G20_RIGHT_19_LAYOUT, @@ -142,10 +143,7 @@ def _resolve_path(value: Any, *, workspace: Path, name: str) -> Path: text = str(value).strip() if not text: raise ValueError(f"{name} is required") - candidate = Path(text).expanduser() - if not candidate.is_absolute(): - candidate = workspace / candidate - return candidate.resolve() + return resolve_renamed_package_path(text, workspace) def _camera_info_fingerprint(path: Path) -> str: diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/publication.py b/src/linkerhand_calibration/linkerhand_calibration/publication.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/publication.py rename to src/linkerhand_calibration/linkerhand_calibration/publication.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/sample_schema.py b/src/linkerhand_calibration/linkerhand_calibration/sample_schema.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/sample_schema.py rename to src/linkerhand_calibration/linkerhand_calibration/sample_schema.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/storage.py b/src/linkerhand_calibration/linkerhand_calibration/storage.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/storage.py rename to src/linkerhand_calibration/linkerhand_calibration/storage.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/three_camera_diagnostics.py b/src/linkerhand_calibration/linkerhand_calibration/three_camera_diagnostics.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/three_camera_diagnostics.py rename to src/linkerhand_calibration/linkerhand_calibration/three_camera_diagnostics.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/three_camera_node.py b/src/linkerhand_calibration/linkerhand_calibration/three_camera_node.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/three_camera_node.py rename to src/linkerhand_calibration/linkerhand_calibration/three_camera_node.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/trajectory.py b/src/linkerhand_calibration/linkerhand_calibration/trajectory.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/trajectory.py rename to src/linkerhand_calibration/linkerhand_calibration/trajectory.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/urdf_zero.py b/src/linkerhand_calibration/linkerhand_calibration/urdf_zero.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/urdf_zero.py rename to src/linkerhand_calibration/linkerhand_calibration/urdf_zero.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/zero_calibration.py b/src/linkerhand_calibration/linkerhand_calibration/zero_calibration.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/zero_calibration.py rename to src/linkerhand_calibration/linkerhand_calibration/zero_calibration.py diff --git a/src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/zero_node.py b/src/linkerhand_calibration/linkerhand_calibration/zero_node.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/g20_thumb_apriltag_calibration/zero_node.py rename to src/linkerhand_calibration/linkerhand_calibration/zero_node.py diff --git a/src/g20_thumb_apriltag_calibration/package.xml b/src/linkerhand_calibration/package.xml similarity index 87% rename from src/g20_thumb_apriltag_calibration/package.xml rename to src/linkerhand_calibration/package.xml index d3eac51..4b922d9 100644 --- a/src/g20_thumb_apriltag_calibration/package.xml +++ b/src/linkerhand_calibration/package.xml @@ -1,9 +1,9 @@ - g20_thumb_apriltag_calibration + linkerhand_calibration 0.1.0 - One-command three-camera AprilTag calibration and zero-URDF correction for the G20 right hand. + Profile-driven hand calibration and validated URDF correction. lxp MIT diff --git a/src/g20_thumb_apriltag_calibration/pyproject.toml b/src/linkerhand_calibration/pyproject.toml similarity index 100% rename from src/g20_thumb_apriltag_calibration/pyproject.toml rename to src/linkerhand_calibration/pyproject.toml diff --git a/src/g20_thumb_apriltag_calibration/resource/g20_thumb_apriltag_calibration b/src/linkerhand_calibration/resource/linkerhand_calibration similarity index 100% rename from src/g20_thumb_apriltag_calibration/resource/g20_thumb_apriltag_calibration rename to src/linkerhand_calibration/resource/linkerhand_calibration diff --git a/src/linkerhand_calibration/setup.cfg b/src/linkerhand_calibration/setup.cfg new file mode 100644 index 0000000..ac60943 --- /dev/null +++ b/src/linkerhand_calibration/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/linkerhand_calibration +[install] +install_scripts=$base/lib/linkerhand_calibration diff --git a/src/g20_thumb_apriltag_calibration/setup.py b/src/linkerhand_calibration/setup.py similarity index 68% rename from src/g20_thumb_apriltag_calibration/setup.py rename to src/linkerhand_calibration/setup.py index c5a1fb1..55ffd34 100644 --- a/src/g20_thumb_apriltag_calibration/setup.py +++ b/src/linkerhand_calibration/setup.py @@ -3,7 +3,7 @@ from glob import glob from setuptools import find_packages, setup -package_name = "g20_thumb_apriltag_calibration" +package_name = "linkerhand_calibration" setup( name=package_name, @@ -32,45 +32,45 @@ setup( "console_scripts": [ ( "hikrobot_camera_node = " - "g20_thumb_apriltag_calibration.hikrobot_camera:main" + "linkerhand_calibration.hikrobot_camera:main" ), - "calibration_node = g20_thumb_apriltag_calibration.node:main", + "calibration_node = linkerhand_calibration.node:main", ( "cmc_pitch_zero_node = " - "g20_thumb_apriltag_calibration.zero_node:main" + "linkerhand_calibration.zero_node:main" ), ( "cmc_roll_calibration_node = " - "g20_thumb_apriltag_calibration.zero_node:main" + "linkerhand_calibration.zero_node:main" ), ( "three_camera_calibration_node = " - "g20_thumb_apriltag_calibration.three_camera_node:main" + "linkerhand_calibration.three_camera_node:main" ), ( "three_camera_extrinsics_node = " - "g20_thumb_apriltag_calibration.extrinsics_node:main" + "linkerhand_calibration.extrinsics_node:main" ), ( "offline_replay = " - "g20_thumb_apriltag_calibration.offline_replay:main" + "linkerhand_calibration.offline_replay:main" ), ( "camera_alignment_view = " - "g20_thumb_apriltag_calibration.alignment_view:main" + "linkerhand_calibration.alignment_view:main" ), ( "calibrated_joint_state_bridge = " - "g20_thumb_apriltag_calibration." + "linkerhand_calibration." "calibrated_joint_state_bridge:main" ), ( "calibrate_g20_right = " - "g20_thumb_apriltag_calibration.one_command:main" + "linkerhand_calibration.one_command:main" ), ( "calibrate_hand = " - "g20_thumb_apriltag_calibration.one_command:main" + "linkerhand_calibration.one_command:main" ), ], }, diff --git a/src/g20_thumb_apriltag_calibration/test/test_acquisition.py b/src/linkerhand_calibration/test/test_acquisition.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_acquisition.py rename to src/linkerhand_calibration/test/test_acquisition.py index c32738f..c76b8b3 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_acquisition.py +++ b/src/linkerhand_calibration/test/test_acquisition.py @@ -6,7 +6,7 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -from g20_thumb_apriltag_calibration.acquisition import ( +from linkerhand_calibration.acquisition import ( ContinuousSweepCollector, Observation, PointCollector, @@ -19,7 +19,7 @@ from g20_thumb_apriltag_calibration.acquisition import ( tag_quality_is_valid, update_pnp_reset_watchdog, ) -from g20_thumb_apriltag_calibration.core import PAIR_NAMES +from linkerhand_calibration.core import PAIR_NAMES def test_pnp_watchdog_resets_after_one_continuous_invalid_second() -> None: diff --git a/src/g20_thumb_apriltag_calibration/test/test_alignment_view.py b/src/linkerhand_calibration/test/test_alignment_view.py similarity index 95% rename from src/g20_thumb_apriltag_calibration/test/test_alignment_view.py rename to src/linkerhand_calibration/test/test_alignment_view.py index 095fecf..0fa8e82 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_alignment_view.py +++ b/src/linkerhand_calibration/test/test_alignment_view.py @@ -2,7 +2,7 @@ import pytest -from g20_thumb_apriltag_calibration.alignment_view import ( +from linkerhand_calibration.alignment_view import ( summarize_alignment_measurements, ) diff --git a/src/g20_thumb_apriltag_calibration/test/test_calibrated_joint_state_bridge.py b/src/linkerhand_calibration/test/test_calibrated_joint_state_bridge.py similarity index 97% rename from src/g20_thumb_apriltag_calibration/test/test_calibrated_joint_state_bridge.py rename to src/linkerhand_calibration/test/test_calibrated_joint_state_bridge.py index 5afd475..5ca160b 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_calibrated_joint_state_bridge.py +++ b/src/linkerhand_calibration/test/test_calibrated_joint_state_bridge.py @@ -2,18 +2,18 @@ import copy import pytest -from g20_thumb_apriltag_calibration.calibrated_joint_state_bridge import ( +from linkerhand_calibration.calibrated_joint_state_bridge import ( G20_COMMAND_NAMES, G20_URDF_JOINT_NAMES, CalibratedCommandMapper, default_input_topic, ) -from g20_thumb_apriltag_calibration.full_hand import ( +from linkerhand_calibration.full_hand import ( JointCurveFit, build_compact_payload, get_hand_calibration_profile, ) -from g20_thumb_apriltag_calibration.urdf_zero import ( +from linkerhand_calibration.urdf_zero import ( get_zero_calibration_profile, ) diff --git a/src/g20_thumb_apriltag_calibration/test/test_config.py b/src/linkerhand_calibration/test/test_config.py similarity index 100% rename from src/g20_thumb_apriltag_calibration/test/test_config.py rename to src/linkerhand_calibration/test/test_config.py diff --git a/src/g20_thumb_apriltag_calibration/test/test_core.py b/src/linkerhand_calibration/test/test_core.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_core.py rename to src/linkerhand_calibration/test/test_core.py index a134640..0eedd42 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_core.py +++ b/src/linkerhand_calibration/test/test_core.py @@ -6,7 +6,7 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -from g20_thumb_apriltag_calibration.core import ( +from linkerhand_calibration.core import ( BASELINE_COMMAND, DIRECTION_DECREASING, DIRECTION_INCREASING, diff --git a/src/g20_thumb_apriltag_calibration/test/test_diagnostics.py b/src/linkerhand_calibration/test/test_diagnostics.py similarity index 96% rename from src/g20_thumb_apriltag_calibration/test/test_diagnostics.py rename to src/linkerhand_calibration/test/test_diagnostics.py index 666566e..8f46766 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_diagnostics.py +++ b/src/linkerhand_calibration/test/test_diagnostics.py @@ -1,5 +1,5 @@ -from g20_thumb_apriltag_calibration.acquisition import TagQuality -from g20_thumb_apriltag_calibration.diagnostics import ( +from linkerhand_calibration.acquisition import TagQuality +from linkerhand_calibration.diagnostics import ( build_tag_quality_diagnostics, render_status_text_zh, status_guidance_zh, diff --git a/src/g20_thumb_apriltag_calibration/test/test_extrinsics_node.py b/src/linkerhand_calibration/test/test_extrinsics_node.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/test/test_extrinsics_node.py rename to src/linkerhand_calibration/test/test_extrinsics_node.py index 998b2e8..ef7eae8 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_extrinsics_node.py +++ b/src/linkerhand_calibration/test/test_extrinsics_node.py @@ -4,8 +4,8 @@ import cv2 import numpy as np from scipy.spatial.transform import Rotation -import g20_thumb_apriltag_calibration.extrinsics_node as extrinsics_node -from g20_thumb_apriltag_calibration.extrinsics_node import ( +import linkerhand_calibration.extrinsics_node as extrinsics_node +from linkerhand_calibration.extrinsics_node import ( BoardPose, StereoCapture, _fit_stereo_robust, diff --git a/src/g20_thumb_apriltag_calibration/test/test_full_hand.py b/src/linkerhand_calibration/test/test_full_hand.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_full_hand.py rename to src/linkerhand_calibration/test/test_full_hand.py index 14c0fba..0013256 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_full_hand.py +++ b/src/linkerhand_calibration/test/test_full_hand.py @@ -5,7 +5,7 @@ from pathlib import Path import numpy as np import pytest -from g20_thumb_apriltag_calibration.full_hand import ( +from linkerhand_calibration.full_hand import ( ACTIVE_JOINTS, IMAGE_TRAJECTORY_JOINTS, JOINT_SPECS, @@ -1005,7 +1005,7 @@ def test_right_compact_payload_keeps_v4_shape_and_uses_pinky_sources() -> None: def test_right_19_schema_v4_records_visual_dips_and_16_static_zeros() -> None: - from g20_thumb_apriltag_calibration.urdf_zero import ( + from linkerhand_calibration.urdf_zero import ( get_zero_calibration_profile, ) diff --git a/src/g20_thumb_apriltag_calibration/test/test_g20_right_product.py b/src/linkerhand_calibration/test/test_g20_right_product.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/test/test_g20_right_product.py rename to src/linkerhand_calibration/test/test_g20_right_product.py index cab315b..1c8ec6b 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_g20_right_product.py +++ b/src/linkerhand_calibration/test/test_g20_right_product.py @@ -10,11 +10,11 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -from g20_thumb_apriltag_calibration.core import ( +from linkerhand_calibration.core import ( DIRECTION_DECREASING, DIRECTION_INCREASING, ) -from g20_thumb_apriltag_calibration.full_hand import ( +from linkerhand_calibration.full_hand import ( G20_COMBINATION_REQUIRED_TARGET_KEYS, G20_REFERENCE_THUMB_CMC_JOINTS, G20_RIGHT_19_LAYOUT, @@ -22,21 +22,21 @@ from g20_thumb_apriltag_calibration.full_hand import ( build_compact_payload, get_hand_calibration_profile, ) -from g20_thumb_apriltag_calibration.operator_report import ( +from linkerhand_calibration.operator_report import ( ProgressEstimator, build_failure_report, classify_error, render_progress_zh, ) -from g20_thumb_apriltag_calibration.one_command import ( +from linkerhand_calibration.one_command import ( _automatic_resume_candidate, _calibration_node_exited_before_status, _launch_command, _resolve_partial_base_session, _status_timeout_seconds, ) -from g20_thumb_apriltag_calibration.product import load_product_config -from g20_thumb_apriltag_calibration.publication import ( +from linkerhand_calibration.product import load_product_config +from linkerhand_calibration.publication import ( ACTIVE_ZERO_JOINTS, PASSIVE_JOINTS, atomic_session_pointer, @@ -49,8 +49,8 @@ from g20_thumb_apriltag_calibration.publication import ( verify_partial_scope_preserves_certified_zeros, verify_urdf_mesh_resources, ) -from g20_thumb_apriltag_calibration.storage import atomic_write_json -from g20_thumb_apriltag_calibration.three_camera_node import ( +from linkerhand_calibration.storage import atomic_write_json +from linkerhand_calibration.three_camera_node import ( G20ThreeCameraCalibrationNode, STEADY_COMMAND_CHECKPOINTS, SweepItem, @@ -70,7 +70,7 @@ from g20_thumb_apriltag_calibration.three_camera_node import ( resume_tasks_invalidated_by_tag_size_changes, resumable_completed_task_prefix, ) -from g20_thumb_apriltag_calibration.urdf_zero import ( +from linkerhand_calibration.urdf_zero import ( RIGHT_19_MECHANICAL_ENDPOINT_JOINTS, UrdfKinematicModel, get_zero_calibration_profile, @@ -79,7 +79,7 @@ from g20_thumb_apriltag_calibration.urdf_zero import ( REPO = Path(__file__).resolve().parents[3] -PRODUCT = REPO / "src/g20_thumb_apriltag_calibration/config/g20_right_product.yaml" +PRODUCT = REPO / "src/linkerhand_calibration/config/g20_right_product.yaml" def _config(tmp_path: Path, *, passes: int = 2): @@ -202,6 +202,16 @@ def test_product_config_locks_three_cameras_tags_and_artifact_hashes() -> None: assert len({camera["serial_number"] for camera in config.cameras.values()}) == 3 assert config.source_urdf.is_file() assert config.camera_extrinsics.is_file() + assert config.calibration_config == ( + REPO + / "src/linkerhand_calibration/config/three_camera_calibration.yaml" + ) + assert config.tag_config == ( + REPO + / "src/linkerhand_calibration/config/three_camera_tags_g20_right_19.yaml" + ) + product_text = PRODUCT.read_text(encoding="utf-8") + assert "src/g20_thumb_apriltag_calibration/config/" in product_text def test_first_round_uses_nine_bidirectional_steady_commands() -> None: diff --git a/src/g20_thumb_apriltag_calibration/test/test_hikrobot_camera.py b/src/linkerhand_calibration/test/test_hikrobot_camera.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/test/test_hikrobot_camera.py rename to src/linkerhand_calibration/test/test_hikrobot_camera.py index e7d91c9..e66c210 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_hikrobot_camera.py +++ b/src/linkerhand_calibration/test/test_hikrobot_camera.py @@ -3,7 +3,7 @@ from pathlib import Path import pytest import yaml -from g20_thumb_apriltag_calibration.hikrobot_camera import ( +from linkerhand_calibration.hikrobot_camera import ( DeviceDescriptor, decode_c_string, load_camera_calibration, diff --git a/src/g20_thumb_apriltag_calibration/test/test_offline_replay.py b/src/linkerhand_calibration/test/test_offline_replay.py similarity index 97% rename from src/g20_thumb_apriltag_calibration/test/test_offline_replay.py rename to src/linkerhand_calibration/test/test_offline_replay.py index 5837d58..8bc0f98 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_offline_replay.py +++ b/src/linkerhand_calibration/test/test_offline_replay.py @@ -1,6 +1,6 @@ import pytest -from g20_thumb_apriltag_calibration.offline_replay import ( +from linkerhand_calibration.offline_replay import ( _latest_attempt_records, _latest_palm_axis_records, _output_suffix, diff --git a/src/linkerhand_calibration/test/test_package_rename.py b/src/linkerhand_calibration/test/test_package_rename.py new file mode 100644 index 0000000..8d39fbf --- /dev/null +++ b/src/linkerhand_calibration/test/test_package_rename.py @@ -0,0 +1,26 @@ +import importlib +from pathlib import Path +import re + +import pytest + + +def test_legacy_python_package_forwards_only_public_config_api() -> None: + with pytest.warns(DeprecationWarning, match="linkerhand_calibration"): + legacy = importlib.import_module("g20_thumb_apriltag_calibration") + + current = importlib.import_module("linkerhand_calibration.product") + assert legacy.ProductConfig is current.ProductConfig + assert legacy.load_product_config is current.load_product_config + + +def test_new_and_legacy_executable_names_share_one_implementation() -> None: + setup_text = (Path(__file__).resolve().parents[1] / "setup.py").read_text( + encoding="utf-8" + ) + for executable in ("calibrate_hand", "calibrate_g20_right"): + assert re.search( + rf'"{executable} = "\s*' + r'"linkerhand_calibration\.one_command:main"', + setup_text, + ) diff --git a/src/g20_thumb_apriltag_calibration/test/test_pnp.py b/src/linkerhand_calibration/test/test_pnp.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_pnp.py rename to src/linkerhand_calibration/test/test_pnp.py index 2f358d4..f66923e 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_pnp.py +++ b/src/linkerhand_calibration/test/test_pnp.py @@ -5,7 +5,7 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -from g20_thumb_apriltag_calibration.pnp import ( +from linkerhand_calibration.pnp import ( SquareTagGroupPoseTracker, SquareTagPose, SquareTagPoseTracker, diff --git a/src/g20_thumb_apriltag_calibration/test/test_sample_schema.py b/src/linkerhand_calibration/test/test_sample_schema.py similarity index 97% rename from src/g20_thumb_apriltag_calibration/test/test_sample_schema.py rename to src/linkerhand_calibration/test/test_sample_schema.py index 8267b70..fd26fb0 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_sample_schema.py +++ b/src/linkerhand_calibration/test/test_sample_schema.py @@ -1,6 +1,6 @@ """Tests for the explicit calibration sample command domains.""" -from g20_thumb_apriltag_calibration.sample_schema import ( +from linkerhand_calibration.sample_schema import ( SampleDataContractError, canonical_sample_record, fitting_sample_record, diff --git a/src/g20_thumb_apriltag_calibration/test/test_storage.py b/src/linkerhand_calibration/test/test_storage.py similarity index 95% rename from src/g20_thumb_apriltag_calibration/test/test_storage.py rename to src/linkerhand_calibration/test/test_storage.py index 896523a..c17c298 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_storage.py +++ b/src/linkerhand_calibration/test/test_storage.py @@ -1,4 +1,4 @@ -from g20_thumb_apriltag_calibration.storage import ( +from linkerhand_calibration.storage import ( append_jsonl, atomic_write_json, completed_scan_keys, diff --git a/src/g20_thumb_apriltag_calibration/test/test_three_camera_diagnostics.py b/src/linkerhand_calibration/test/test_three_camera_diagnostics.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_three_camera_diagnostics.py rename to src/linkerhand_calibration/test/test_three_camera_diagnostics.py index e3a19a0..c72ef46 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_three_camera_diagnostics.py +++ b/src/linkerhand_calibration/test/test_three_camera_diagnostics.py @@ -2,7 +2,7 @@ import json import numpy as np -from g20_thumb_apriltag_calibration.three_camera_diagnostics import ( +from linkerhand_calibration.three_camera_diagnostics import ( _task_text, render_three_camera_status_text_zh, three_camera_reason_zh, diff --git a/src/g20_thumb_apriltag_calibration/test/test_three_camera_retry.py b/src/linkerhand_calibration/test/test_three_camera_retry.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_three_camera_retry.py rename to src/linkerhand_calibration/test/test_three_camera_retry.py index ad809f5..306b7e1 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_three_camera_retry.py +++ b/src/linkerhand_calibration/test/test_three_camera_retry.py @@ -8,13 +8,13 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -import g20_thumb_apriltag_calibration.three_camera_node as three_camera_node -from g20_thumb_apriltag_calibration.core import ( +import linkerhand_calibration.three_camera_node as three_camera_node +from linkerhand_calibration.core import ( DIRECTION_DECREASING, DIRECTION_INCREASING, ) -from g20_thumb_apriltag_calibration.acquisition import TagQuality -from g20_thumb_apriltag_calibration.full_hand import ( +from linkerhand_calibration.acquisition import TagQuality +from linkerhand_calibration.full_hand import ( JointCurveFit, PalmAxisObserver, RIGHT_19_END_ON_IMAGE_CURVE_JOINTS, @@ -27,7 +27,7 @@ from g20_thumb_apriltag_calibration.full_hand import ( build_calibration_preparation_waypoints, build_calibration_return_waypoints, ) -from g20_thumb_apriltag_calibration.three_camera_node import ( +from linkerhand_calibration.three_camera_node import ( FrameObservation, G20ThreeCameraCalibrationNode, STATE_COMPLETE, @@ -56,8 +56,8 @@ from g20_thumb_apriltag_calibration.three_camera_node import ( _sweep_views, _thumb_yaw_zero_repeatability_failures, ) -from g20_thumb_apriltag_calibration.pnp import SquareTagPose -from g20_thumb_apriltag_calibration.urdf_zero import ( +from linkerhand_calibration.pnp import SquareTagPose +from linkerhand_calibration.urdf_zero import ( RIGHT_19_MECHANICAL_ENDPOINT_JOINTS, JointAxisMeasurement, axis_line_uses_depth_free_interpretation_plane, @@ -4450,7 +4450,7 @@ def test_side_alias_branch_gap_range_is_diagnostic_only( records = _image_cycle_records([math.radians(47.0)] * 3) gaps_deg = [0.10, 0.81, 0.10] # range 0.71 deg, maximum below 2 deg monkeypatch.setattr( - "g20_thumb_apriltag_calibration.three_camera_node" + "linkerhand_calibration.three_camera_node" ".baseline_hysteresis_by_cycle_rad", lambda records, zero_command_u8, axis_xyz: [ math.radians(value) for value in gaps_deg diff --git a/src/g20_thumb_apriltag_calibration/test/test_trajectory.py b/src/linkerhand_calibration/test/test_trajectory.py similarity index 98% rename from src/g20_thumb_apriltag_calibration/test/test_trajectory.py rename to src/linkerhand_calibration/test/test_trajectory.py index aa99677..702e54c 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_trajectory.py +++ b/src/linkerhand_calibration/test/test_trajectory.py @@ -4,7 +4,7 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -from g20_thumb_apriltag_calibration.core import ( +from linkerhand_calibration.core import ( DIRECTION_DECREASING, DIRECTION_INCREASING, PAIR_IP, @@ -14,7 +14,7 @@ from g20_thumb_apriltag_calibration.core import ( PHASE_TIP, create_final_payload, ) -from g20_thumb_apriltag_calibration.trajectory import ( +from linkerhand_calibration.trajectory import ( _regularize_coupled_zero_tail, fit_center_trajectory_curves, maximum_center_non_target_drift_rad, diff --git a/src/g20_thumb_apriltag_calibration/test/test_urdf_zero.py b/src/linkerhand_calibration/test/test_urdf_zero.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_urdf_zero.py rename to src/linkerhand_calibration/test/test_urdf_zero.py index 0b045ee..d5fbbbf 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_urdf_zero.py +++ b/src/linkerhand_calibration/test/test_urdf_zero.py @@ -6,12 +6,12 @@ import numpy as np import pytest from scipy.spatial.transform import Rotation -from g20_thumb_apriltag_calibration.extrinsics import ( +from linkerhand_calibration.extrinsics import ( camera_info_fingerprint, dump_three_camera_extrinsics, load_three_camera_extrinsics, ) -from g20_thumb_apriltag_calibration.urdf_zero import ( +from linkerhand_calibration.urdf_zero import ( AXIS_JOINTS, DIRECT_ZERO_JOINTS, INHERITED_ZERO_JOINTS, @@ -35,7 +35,7 @@ from g20_thumb_apriltag_calibration.urdf_zero import ( merge_right_19_thumb_zero_result, write_zero_corrected_urdf, ) -from g20_thumb_apriltag_calibration.full_hand import ( +from linkerhand_calibration.full_hand import ( ACTIVE_JOINTS, JOINT_SPECS, MEASURED_JOINTS, diff --git a/src/g20_thumb_apriltag_calibration/test/test_zero_calibration.py b/src/linkerhand_calibration/test/test_zero_calibration.py similarity index 99% rename from src/g20_thumb_apriltag_calibration/test/test_zero_calibration.py rename to src/linkerhand_calibration/test/test_zero_calibration.py index 0a6496b..e457ec2 100644 --- a/src/g20_thumb_apriltag_calibration/test/test_zero_calibration.py +++ b/src/linkerhand_calibration/test/test_zero_calibration.py @@ -3,7 +3,7 @@ from __future__ import annotations import math import cv2 -from g20_thumb_apriltag_calibration.zero_calibration import ( +from linkerhand_calibration.zero_calibration import ( build_trajectory_zero_angle_payload, build_trajectory_zero_travel_payload, circular_median_rad,