From e80edd7b5e9f2dbbb59af592e72f5560cf8b36b1 Mon Sep 17 00:00:00 2001 From: arm_dev Date: Tue, 20 Oct 2026 09:18:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=8B=E8=BD=AC=E6=93=8D=E4=BD=9C=E5=8A=A0?= =?UTF-8?q?=E9=80=9F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arm_application.egg-info/SOURCES.txt | 12 + .../lib/arm_application/demo_named_poses.py | 4 +- .../build/lib/arm_application/dh_official.py | 37 +- .../build/lib/arm_application/dh_pgea.py | 205 +- .../build/lib/arm_application/dh_pgea_node.py | 18 +- .../lib/arm_application/dual_gripper_node.py | 4 +- .../lib}/arm_application/feature_guard.py | 0 .../arm_application/feature_jump_guard.py | 0 .../arm_application/gauge_assembly_node.py | 514 +- .../build/lib/arm_application/gauge_config.py | 4 +- .../build/lib/arm_application/gauge_fsm.py | 404 + .../build/lib/arm_application/gauge_kin.py | 40 + .../lib/arm_application/goto_ee_plane.py | 4 +- .../lib/arm_application/handeye_calibrate.py | 112 +- .../build/lib/arm_application/handeye_lib.py | 73 + .../lib/arm_application/handeye_teach.py | 39 +- .../lib/arm_application/handeye_waypoints.py | 4 +- .../lib/arm_application/hole_detect_hough.py | 90 + .../lib/arm_application/hole_detect_node.py | 4 +- .../lib/arm_application/hole_detector.py | 9 +- .../lib/arm_application/kalman_filter.py | 9 + .../arm_application/move_to_pose_client.py | 4 +- .../lib/arm_application/onnx_workpiece.py | 15 + .../lib}/arm_application/operator_app.py | 0 .../lib}/arm_application/operator_arm_mesh.py | 0 .../arm_application/operator_arm_state.py | 0 .../arm_application/operator_camera_view.py | 0 .../lib}/arm_application/operator_console.py | 0 .../arm_application/operator_gripper_mesh.py | 0 .../arm_application/operator_gripper_state.py | 0 .../arm_application/operator_handeye_board.py | 0 .../arm_application/operator_tactile_view.py | 0 .../lib}/arm_application/operator_teach.py | 0 .../lib}/arm_application/overhead_oneshot.py | 0 .../lib}/arm_application/path_profile.py | 0 .../lib/arm_application/perception_node.py | 789 +- .../lib/arm_application/pipeline_node.py | 361 +- .../lib/arm_application/plane_feature.py | 5 + .../lib}/arm_application/pose_detector.py | 0 .../arm_application/realsense_color_pub.py | 186 +- .../lib/arm_application/realsense_view.py | 21 +- .../build/lib}/arm_application/ros_node.py | 0 .../arm_application/run_joint_trajectory.py | 4 +- .../build/lib/arm_application/servo_node.py | 1278 +- .../build/lib/arm_application/site_io.py | 134 + .../lib/arm_application/stage2_locate_node.py | 2046 +- .../lib/arm_application/stage3_search_node.py | 29 +- .../build/lib/arm_application/tactile_node.py | 4 +- .../lib/arm_application/weights_layout.py | 45 + .../lib/arm_application/yolo_detector.py | 86 +- .../colcon_command_prefix_setup_py.sh.env | 49 +- build/arm_application/setup.py | 2 +- ...on => index-2026-10-19T09-07-09-0335.json} | 0 .../CMakeFiles/CMakeConfigureLog.yaml | 31444 ++++++++++++++++ .../compiler_depend.internal | 294 - .../flexiv_hardware.dir/compiler_depend.make | 4152 +- .../src/flexiv_hardware_interface.cpp.o | Bin 321360 -> 330304 bytes .../src/flexiv_hardware_interface.cpp.o.d | 14 +- build/flexiv_hardware/cmake_args.last | 2 +- .../colcon_command_prefix_build.sh.env | 25 +- build/flexiv_hardware/libflexiv_hardware.so | Bin 1595352 -> 1599400 bytes config/site.example.yaml | 4 +- config/site.yaml | 4 +- docs/HANDBOOK.md | 2 +- .../89_eye_in_hand_21pts_before_20261016.yaml | 56 + .../89_eye_to_hand_24pts_before_20261016.yaml | 60 + ..._to_hand_tool10120938_oldtcp_20261012.yaml | 22 + .../89_eye_in_hand_tool10120938_20261012.yaml | 28 + .../lib/arm_application/assembly_pipeline | 6 +- .../lib/arm_application/demo_named_poses | 6 +- .../lib/arm_application/dh_pgea | 6 +- .../lib/arm_application/dh_pgea_cli | 6 +- .../lib/arm_application/dual_gripper | 6 +- .../lib/arm_application/dual_gripper_cli | 6 +- .../lib/arm_application/gauge_assembly | 6 +- .../lib/arm_application/goto_ee_plane | 6 +- .../lib/arm_application/handeye_calibrate | 6 +- .../lib/arm_application/handeye_teach | 6 +- .../lib/arm_application/handeye_waypoints | 6 +- .../lib/arm_application/hole_detect | 6 +- .../lib/arm_application/move_to_pose_client | 6 +- .../lib/arm_application/perception_node | 6 +- .../lib/arm_application/realsense_color_pub | 6 +- .../lib/arm_application/realsense_view | 6 +- .../lib/arm_application/run_joint_trajectory | 6 +- .../lib/arm_application/servo_node | 6 +- .../lib/arm_application/stage2_locate | 6 +- .../lib/arm_application/stage3_search | 6 +- .../lib/arm_application/tactile | 6 +- .../lib/arm_application/tactile_cli | 6 +- .../site-packages/arm-application.egg-link | 2 + .../site-packages/arm_application/__init__.py | 32 - .../arm_application/box_tracker.py | 85 - .../arm_application/demo_named_poses.py | 80 - .../arm_application/dh_official.py | 286 - .../site-packages/arm_application/dh_pgea.py | 725 - .../arm_application/dh_pgea_node.py | 246 - .../arm_application/dual_gripper.py | 803 - .../arm_application/dual_gripper_cli.py | 190 - .../arm_application/dual_gripper_node.py | 320 - .../arm_application/gauge_assembly_node.py | 2623 -- .../arm_application/gauge_boot.py | 405 - .../arm_application/gauge_config.py | 591 - .../arm_application/gauge_fsm.py | 1060 - .../arm_application/gauge_gripper.py | 228 - .../arm_application/gauge_kin.py | 244 - .../site-packages/arm_application/geom_ik.py | 40 - .../arm_application/goto_ee_plane.py | 457 - .../arm_application/handeye_calibrate.py | 769 - .../arm_application/handeye_lib.py | 404 - .../arm_application/handeye_realsense.py | 251 - .../arm_application/handeye_teach.py | 668 - .../arm_application/handeye_waypoints.py | 525 - .../arm_application/hole_detect_hough.py | 844 - .../arm_application/hole_detect_node.py | 190 - .../arm_application/hole_detector.py | 368 - .../arm_application/image_utils.py | 149 - .../arm_application/kalman_filter.py | 97 - .../arm_application/model_labels.py | 558 - .../arm_application/move_to_pose_client.py | 74 - .../arm_application/onnx_workpiece.py | 152 - .../arm_application/orisys_tactile.py | 587 - .../arm_application/perception_node.py | 1668 - .../arm_application/pid_controller.py | 64 - .../arm_application/pipeline_node.py | 521 - .../arm_application/plane_feature.py | 300 - .../arm_application/realsense_color_pub.py | 977 - .../arm_application/realsense_sdk_view.py | 236 - .../arm_application/realsense_view.py | 292 - .../arm_application/run_joint_trajectory.py | 174 - .../arm_application/servo_node.py | 2357 -- .../site-packages/arm_application/site_io.py | 216 - .../arm_application/stage2_locate_node.py | 3490 -- .../arm_application/stage3_search_node.py | 1127 - .../arm_application/tactile_cli.py | 60 - .../arm_application/tactile_interface.py | 84 - .../arm_application/tactile_node.py | 305 - .../arm_application/weights_layout.py | 448 - .../arm_application/yolo_detector.py | 618 - .../resource_index/packages/arm_application | 1 + .../share/arm_application/config/demo.yaml | 6 +- .../arm_application/config/dual_grippers.yaml | 26 +- .../arm_application/config/hole_detect.yaml | 48 +- .../arm_application/config/hole_insert.yaml | 38 +- .../arm_application/config/perception.yaml | 47 +- .../share/arm_application/config/servo.yaml | 70 +- .../config/xunhuan_trajectory.yaml | 16 +- .../arm_application/launch/demo.launch.py | 20 +- .../arm_application/launch/dh_pgea.launch.py | 63 +- .../launch/dual_gripper.launch.py | 41 +- .../launch/gauge_assembly.launch.py | 271 +- .../launch/hole_detect.launch.py | 71 +- .../arm_application/launch/pipeline.launch.py | 177 +- .../launch/stage2_locate.launch.py | 133 +- .../launch/stage3_search.launch.py | 136 +- .../arm_application/launch/tactile.launch.py | 29 +- .../launch/visual_servo.launch.py | 366 +- .../share/arm_application/package.dsv | 3 + .../share/arm_application/package.ps1 | 1 + .../share/arm_application/package.sh | 1 + .../share/arm_application/package.xml | 31 +- .../arm_application/trajectories/xunhuan.traj | 248 +- .../arm_application/pipeline_node.py | 12 +- .../test/test_pipeline_stage1_diag.py | 3 +- 164 files changed, 39439 insertions(+), 32292 deletions(-) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/feature_guard.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/feature_jump_guard.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_app.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_arm_mesh.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_arm_state.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_camera_view.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_console.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_gripper_mesh.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_gripper_state.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_handeye_board.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_tactile_view.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/operator_teach.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/overhead_oneshot.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/path_profile.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/pose_detector.py (100%) rename {install/arm_application/lib/python3.11/site-packages => build/arm_application/build/lib}/arm_application/ros_node.py (100%) rename build/flexiv_hardware/.cmake/api/v1/reply/{index-2026-10-12T09-53-12-0314.json => index-2026-10-19T09-07-09-0335.json} (100%) create mode 100644 handeye/poses/backup/89_eye_in_hand_21pts_before_20261016.yaml create mode 100644 handeye/poses/backup/89_eye_to_hand_24pts_before_20261016.yaml create mode 100644 handeye/results/backup/89_d435_eye_to_hand_tool10120938_oldtcp_20261012.yaml create mode 100644 handeye/results/backup/89_eye_in_hand_tool10120938_20261012.yaml create mode 100644 install/arm_application/lib/python3.11/site-packages/arm-application.egg-link delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/__init__.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/box_tracker.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/demo_named_poses.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/dh_official.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_cli.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/gauge_assembly_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/gauge_boot.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/gauge_config.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/gauge_fsm.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/gauge_gripper.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/gauge_kin.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/geom_ik.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/goto_ee_plane.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/handeye_calibrate.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/handeye_lib.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/handeye_realsense.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/handeye_teach.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/handeye_waypoints.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_hough.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/hole_detector.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/image_utils.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/kalman_filter.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/model_labels.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/move_to_pose_client.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/onnx_workpiece.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/orisys_tactile.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/perception_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/pid_controller.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/pipeline_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/plane_feature.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/realsense_color_pub.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/realsense_sdk_view.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/realsense_view.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/run_joint_trajectory.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/servo_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/site_io.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/stage2_locate_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/stage3_search_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/tactile_cli.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/tactile_interface.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/tactile_node.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/weights_layout.py delete mode 100644 install/arm_application/lib/python3.11/site-packages/arm_application/yolo_detector.py mode change 100644 => 120000 install/arm_application/share/ament_index/resource_index/packages/arm_application mode change 100644 => 120000 install/arm_application/share/arm_application/config/demo.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/config/dual_grippers.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/config/hole_detect.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/config/hole_insert.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/config/perception.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/config/servo.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml mode change 100644 => 120000 install/arm_application/share/arm_application/launch/demo.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/dh_pgea.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/dual_gripper.launch.py mode change 100755 => 120000 install/arm_application/share/arm_application/launch/gauge_assembly.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/hole_detect.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/pipeline.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/stage2_locate.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/stage3_search.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/tactile.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/launch/visual_servo.launch.py mode change 100644 => 120000 install/arm_application/share/arm_application/package.xml mode change 100755 => 120000 install/arm_application/share/arm_application/trajectories/xunhuan.traj diff --git a/build/arm_application/arm_application.egg-info/SOURCES.txt b/build/arm_application/arm_application.egg-info/SOURCES.txt index cb1065d..66cac45 100644 --- a/build/arm_application/arm_application.egg-info/SOURCES.txt +++ b/build/arm_application/arm_application.egg-info/SOURCES.txt @@ -40,7 +40,19 @@ arm_application/kalman_filter.py arm_application/model_labels.py arm_application/move_to_pose_client.py arm_application/onnx_workpiece.py +arm_application/operator_app.py +arm_application/operator_arm_mesh.py +arm_application/operator_arm_state.py +arm_application/operator_camera_view.py +arm_application/operator_console.py +arm_application/operator_gripper_mesh.py +arm_application/operator_gripper_state.py +arm_application/operator_handeye_board.py +arm_application/operator_tactile_view.py +arm_application/operator_teach.py arm_application/orisys_tactile.py +arm_application/overhead_oneshot.py +arm_application/path_profile.py arm_application/perception_node.py arm_application/pid_controller.py arm_application/pipeline_node.py diff --git a/build/arm_application/build/lib/arm_application/demo_named_poses.py b/build/arm_application/build/lib/arm_application/demo_named_poses.py index c679623..40cff4f 100644 --- a/build/arm_application/build/lib/arm_application/demo_named_poses.py +++ b/build/arm_application/build/lib/arm_application/demo_named_poses.py @@ -10,8 +10,10 @@ from rclpy.node import Node from arm_msgs.srv import SetNamedPose +from arm_application.ros_node import TolerantNode -class DemoNamedPoses(Node): + +class DemoNamedPoses(TolerantNode): def __init__(self) -> None: super().__init__('demo_named_poses') self.declare_parameter( diff --git a/build/arm_application/build/lib/arm_application/dh_official.py b/build/arm_application/build/lib/arm_application/dh_official.py index 451d8b6..2467ae9 100644 --- a/build/arm_application/build/lib/arm_application/dh_official.py +++ b/build/arm_application/build/lib/arm_application/dh_official.py @@ -201,21 +201,36 @@ class DHModbusClient: def set_position_per_mille(self, position: float | int) -> int: value = _clamp_int(position, 0, 1000) + # 与 dh_pgea.latched_position_break 同一份:命令已是目标时先写当前位置, + # 读回之后再写最终值。60ms 后写回旧命令,固件采样不到,手指不动。 + from arm_application.dh_pgea import latched_position_break + try: cmd = _clamp_int(self.read_register(REG_POSITION), 0, 1000) except Exception: cmd = value - if cmd == value: - try: - cur = self.get_position_per_mille() - except Exception: - cur = value - nudge = cur + (40 if value >= cur else -40) - nudge = _clamp_int(nudge, 0, 1000) - if nudge == value: - nudge = 0 if value != 0 else 40 - self.write_register(REG_POSITION, nudge) - time.sleep(0.06) + try: + cur = self.get_position_per_mille() + except Exception: + cur = value + bridge = latched_position_break(cmd, cur, value) + if bridge is not None: + self.write_register(REG_POSITION, bridge) + deadline = time.monotonic() + 0.6 + echoed = False + while time.monotonic() < deadline: + try: + if _clamp_int(self.read_register(REG_POSITION), 0, 1000) == bridge: + echoed = True + break + except Exception: + pass + time.sleep(0.05) + if not echoed: + raise DHModbusError( + f"位置命令中间值 {bridge} 没有读回,不再写入最终目标 {value}" + ) + time.sleep(0.15) self.write_register(REG_POSITION, value) return value diff --git a/build/arm_application/build/lib/arm_application/dh_pgea.py b/build/arm_application/build/lib/arm_application/dh_pgea.py index 2653230..117d46a 100644 --- a/build/arm_application/build/lib/arm_application/dh_pgea.py +++ b/build/arm_application/build/lib/arm_application/dh_pgea.py @@ -104,6 +104,44 @@ INIT_STATE_NAME = { } +def latched_position_break(command: int, current: int, target: int) -> Optional[int]: + """命令寄存器已经等于目标、手指却不在目标上时,返回要先写入的中间位置。 + + 大寰固件:再写一遍与 0x0103 当前值相同的数,不会启动新运动。 + 开爪卡在 caught 时就是这样——命令已是 1000,手指停在夹持位。 + 先把命令改成当前位置(手指本来就在这,不会再夹紧),等读回确认 + 固件已经采样,再写最终目标。只 sleep 几十毫秒就写回旧值,控制周期 + 来不及看到中间值,最终仍是旧命令,手指不动。 + """ + cmd = int(max(0, min(1000, command))) + cur = int(max(0, min(1000, current))) + pos = int(max(0, min(1000, target))) + if cmd != pos or abs(cur - pos) <= 25: + return None + if cur != cmd: + return cur + return 0 if cmd != 0 else 40 + + +def grip_motion_settled( + grip_state: int, position: int, target: int, seen_motion: bool +) -> bool: + """这一拍能不能算「这句位置命令已经结束」。 + + 张开前本来就是 caught、位置还停在夹持位:不能当成张开完成。 + 闭合夹住物体:动过之后停在比目标更开的位置,算完成。 + """ + near = abs(int(position) - int(target)) <= 25 + if grip_state in (S_GRIP_ARRIVED, S_GRIP_DROPPED) and near: + return True + if grip_state == S_GRIP_CAUGHT and seen_motion: + if int(target) + 25 < int(position): + return True + if near: + return True + return False + + def crc16_modbus(data: bytes) -> int: """官方 DH CRC16(Modbus,线路上按小端发送)。""" crc = 0xFFFF @@ -175,6 +213,34 @@ WIRING_HINT = ( ) +def open_failure_text(port: str, exc: BaseException) -> str: + """串口打不开时把「被占用」和「没应答」分开。 + + 独占锁失败(errno 11)以前和真没上电写成同一句「需要 24 V DC」, + 界面上看起来像缺自动上电,实际是别的进程还握着这个口。 + """ + text = str(exc).lower() + errno = getattr(exc, "errno", None) + busy = errno in (11, 16) or any( + token in text + for token in ( + "temporarily unavailable", + "device or resource busy", + "could not exclusively lock", + "resource busy", + ) + ) + if busy: + return ( + f"无法独占打开 {port}:{exc}。" + "串口已被别的进程占用(夹爪驱动或状态读取)。" + ) + return ( + f"无法打开 {port}:{exc}。" + "需要 24 V DC 供电 + RS485 接线,且当前用户在 dialout 组内。" + ) + + class DhPgeaGripper: """面向 PGE / PGEA 的线程安全 Modbus RTU 客户端(官方寄存器映射)。""" @@ -219,10 +285,7 @@ class DhPgeaGripper: exclusive=True, ) except Exception as exc: - raise DhPgeaError( - f"无法打开 {self.port}:{exc}。" - "需要 24 V DC 供电 + RS485 接线,且当前用户在 dialout 组内。" - ) from exc + raise DhPgeaError(open_failure_text(self.port, exc)) from exc try: self._ser.dtr = True except Exception: @@ -319,17 +382,28 @@ class DhPgeaGripper: def initialization(self) -> bool: return self.write_register(REG_INIT, INIT_CMD) - def initialize(self, timeout_s: float = 20.0, poll_s: float = 0.2) -> bool: - """写 0xA5,然后等到初始化状态 == 完成(对应官方上电流程)。""" + def initialize( + self, timeout_s: float = 20.0, poll_s: float = 0.2, *, force: bool = False + ) -> bool: + """写 0xA5,然后等到初始化状态 == 完成(对应官方上电流程)。 + + ``force=False`` 时,已经完成就不再写(节点启动不要每次都让手指找零)。 + 命令行 ``init`` 必须 ``force=True``:状态字已经是完成时,不写 0xA5 + 手指根本不会回零,看起来像初始化失效。 + """ state = self.get_init_state() - if state == S_INIT_FINISHED: + if state == S_INIT_FINISHED and not force: return True if not self.initialization(): raise DhPgeaError("初始化写 0x0100=0xA5 失败(无 Modbus 回显)") deadline = time.monotonic() + float(timeout_s) + # force 时必须先看到状态离开「完成」,否则读到的还是写之前的旧值。 + saw_busy = not force while time.monotonic() < deadline: state = self.get_init_state() - if state == S_INIT_FINISHED: + if state != S_INIT_FINISHED: + saw_busy = True + elif saw_busy: return True time.sleep(poll_s) raise DhPgeaError( @@ -345,42 +419,58 @@ class DhPgeaGripper: speed_pct = int(max(1, min(100, speed_pct))) return self.write_register(REG_SPEED, speed_pct) + def _wait_command_echo(self, value: int, timeout_s: float = 0.6) -> bool: + """等到 0x0103 读回就是刚写进去的值。读不回就不要再写下一笔。""" + deadline = time.monotonic() + float(timeout_s) + while time.monotonic() < deadline: + try: + if self.get_target_position(retries=1) == int(value): + return True + except Exception: + pass + time.sleep(0.05) + return False + def set_target_position(self, pos: int) -> bool: pos = int(max(0, min(1000, pos))) - # 大寰固件:0x0103 写入与当前命令相同的值不会启动新运动。 - # 开/关卡在 caught 时最常见——命令已是 1000,手指却停在夹持位。 try: cmd = self.get_target_position(retries=2) except Exception: cmd = pos - if cmd == pos: - try: - cur = self.get_current_position(retries=2) - except Exception: - cur = pos - nudge = cur + (40 if pos >= cur else -40) - nudge = int(max(0, min(1000, nudge))) - if nudge == pos: - nudge = 0 if pos != 0 else 40 - self.write_register(REG_POSITION, nudge) - time.sleep(0.06) + try: + cur = self.get_current_position(retries=2) + except Exception: + cur = pos + bridge = latched_position_break(cmd, cur, pos) + if bridge is not None: + if not self.write_register(REG_POSITION, bridge): + return False + if not self._wait_command_echo(bridge): + return False + # 读回只说明寄存器改了。再留一个控制周期,避免下一笔把中间值盖掉。 + time.sleep(0.15) return self.write_register(REG_POSITION, pos) def wait_settle(self, target: int, timeout_s: float = 6.0) -> GripperState: - """等到到位/夹住/松开,或超时返回最后一帧。""" + """等到到位或夹住,或超时返回最后一帧。 + + 张开前状态字已经是 caught 时不能立刻返回:那是上一句命令的残留, + 手指还停在夹持位。 + """ t0 = time.monotonic() last = None + seen_motion = False st = self.get_run_states() while time.monotonic() - t0 < timeout_s: st = self.get_run_states() - moved = last is not None and st.position != last + if last is not None and st.position != last: + seen_motion = True last = st.position - if st.grip_state == S_GRIP_MOVING or moved: + if st.grip_state == S_GRIP_MOVING: + seen_motion = True time.sleep(0.08) continue - if st.grip_state in (S_GRIP_ARRIVED, S_GRIP_DROPPED) and abs(st.position - target) <= 25: - return st - if st.grip_state == S_GRIP_CAUGHT: + if grip_motion_settled(st.grip_state, st.position, target, seen_motion): return st time.sleep(0.08) return st @@ -497,6 +587,36 @@ def _scan_bus(port: str) -> int: return 1 +def ctrl_values( + cmd: str, + value: str = "", + force: int = 50, + speed: int = 50, +) -> Optional[tuple[float, float, float, float]]: + """节点已经占着串口时,改发 ``/gripper/ctrl`` 的四个数。 + + 顺序是初始化、位置千分比、力度、速度。``probe`` / ``status`` 只读,返回 None。 + """ + name = str(cmd or "").strip().lower() + if name in ("probe", "status"): + return None + if name == "init": + return (1.0, 0.0, float(force), float(speed)) + if name == "open": + pos = 1000 + elif name == "close": + pos = 0 + elif name in ("pos", "move"): + if str(value).strip() == "": + raise ValueError("pos 需要 0–1000") + pos = int(round(float(value))) + if pos < 0 or pos > 1000: + raise ValueError("位置只接受 0–1000") + else: + raise ValueError(f"节点在线时不支持 {name}") + return (0.0, float(pos), float(force), float(speed)) + + def _cli(argv: Optional[list[str]] = None) -> int: site = _site_defaults() ap = argparse.ArgumentParser( @@ -541,8 +661,8 @@ def _cli(argv: Optional[list[str]] = None) -> int: print(st.summary()) return 0 if args.cmd == "init": - print("正在初始化(手指回零)…") - grip.initialize() + print("正在初始化(手指回零,已初始化也会再做一次)…") + grip.initialize(force=True) print(grip.get_run_states().summary()) return 0 if args.cmd == "status": @@ -551,12 +671,25 @@ def _cli(argv: Optional[list[str]] = None) -> int: if args.cmd == "open": if not grip.open_jaw(args.force, args.speed): raise DhPgeaError("张开写入失败") - print(grip.wait_settle(1000).summary()) + st = grip.wait_settle(1000) + print(st.summary()) + if abs(st.position - 1000) > 25: + print( + "张开失败:手指没有离开夹持位。" + "若仍是 grip=caught,先取下工件再执行 init。", + file=sys.stderr, + ) + return 1 return 0 if args.cmd == "close": if not grip.close_jaw(args.force, args.speed): raise DhPgeaError("闭合写入失败") - print(grip.wait_settle(0).summary()) + st = grip.wait_settle(0) + print(st.summary()) + # 夹住物体时位置停在厚度上,grip=caught 算成功。停在张开位则失败。 + if st.grip_state != S_GRIP_CAUGHT and abs(st.position) > 25: + print("闭合失败:手指没有朝合拢方向离开原位。", file=sys.stderr) + return 1 return 0 if args.cmd == "pos": if args.value == "": @@ -565,7 +698,15 @@ def _cli(argv: Optional[list[str]] = None) -> int: pos = int(float(args.value)) if not grip.move(pos, args.force, args.speed): raise DhPgeaError("位置写入失败") - print(grip.wait_settle(pos).summary()) + st = grip.wait_settle(pos) + print(st.summary()) + grasped_short = st.grip_state == S_GRIP_CAUGHT and st.position > pos + if abs(st.position - pos) > 25 and not grasped_short: + print( + f"位置 {pos} 没有到位(仍在 {st.position})。", + file=sys.stderr, + ) + return 1 return 0 except DhPgeaError as exc: print(f"错误:{exc}", file=sys.stderr) diff --git a/build/arm_application/build/lib/arm_application/dh_pgea_node.py b/build/arm_application/build/lib/arm_application/dh_pgea_node.py index 76fc055..5c43870 100644 --- a/build/arm_application/build/lib/arm_application/dh_pgea_node.py +++ b/build/arm_application/build/lib/arm_application/dh_pgea_node.py @@ -33,15 +33,7 @@ from arm_application.dh_pgea import ( GripperState, WIRING_HINT, ) - - -def _param_as_str(node: Node, name: str, default: str = "") -> str: - """字符串参数,同时允许命令行用数字覆盖(例如 SN 26610799)。""" - node.declare_parameter(name, default, ParameterDescriptor(dynamic_typing=True)) - val = node.get_parameter(name).value - if val is None or val == "": - return "" - return str(val).strip() +from arm_application.ros_node import TolerantNode, param_as_str def _as_ctrl_array(msg: Float32MultiArray) -> tuple[float, float, float, float]: @@ -51,7 +43,7 @@ def _as_ctrl_array(msg: Float32MultiArray) -> tuple[float, float, float, float]: return float(data[0]), float(data[1]), float(data[2]), float(data[3]) -class DhPgeaNode(Node): +class DhPgeaNode(TolerantNode): def __init__(self) -> None: super().__init__("dh_pgea") self.declare_parameter("port", "/dev/ttyUSB0") @@ -64,9 +56,9 @@ class DhPgeaNode(Node): self.declare_parameter("state_hz", 20.0) self.declare_parameter("open_position", 1000) self.declare_parameter("close_position", 0) - self._model = _param_as_str(self, "model", "PGEA-100-20-W") - self._sn = _param_as_str(self, "serial_number", "") - self._rts = _param_as_str(self, "rs485_rts", "") + self._model = param_as_str(self, "model", "PGEA-100-20-W") + self._sn = param_as_str(self, "serial_number", "") + self._rts = param_as_str(self, "rs485_rts", "") self._port = str(self.get_parameter("port").value) self._baud = int(self.get_parameter("baud").value) diff --git a/build/arm_application/build/lib/arm_application/dual_gripper_node.py b/build/arm_application/build/lib/arm_application/dual_gripper_node.py index 729d34c..d877002 100644 --- a/build/arm_application/build/lib/arm_application/dual_gripper_node.py +++ b/build/arm_application/build/lib/arm_application/dual_gripper_node.py @@ -22,6 +22,8 @@ from arm_msgs.msg import GripperCommand as GripperCommandMsg from arm_msgs.msg import GripperStatus as GripperStatusMsg from arm_msgs.srv import GripperExecute +from arm_application.ros_node import TolerantNode + def _site_path() -> Path: env = os.environ.get("SITE_CONFIG", "").strip() @@ -38,7 +40,7 @@ def _as_bool(val, default: bool = True) -> bool: return bool(val) -class DualGripperNode(Node): +class DualGripperNode(TolerantNode): def __init__(self) -> None: super().__init__("dual_gripper_driver") self.declare_parameter("config_file", "") diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/feature_guard.py b/build/arm_application/build/lib/arm_application/feature_guard.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/feature_guard.py rename to build/arm_application/build/lib/arm_application/feature_guard.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/feature_jump_guard.py b/build/arm_application/build/lib/arm_application/feature_jump_guard.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/feature_jump_guard.py rename to build/arm_application/build/lib/arm_application/feature_jump_guard.py diff --git a/build/arm_application/build/lib/arm_application/gauge_assembly_node.py b/build/arm_application/build/lib/arm_application/gauge_assembly_node.py index d1503fc..5578c20 100644 --- a/build/arm_application/build/lib/arm_application/gauge_assembly_node.py +++ b/build/arm_application/build/lib/arm_application/gauge_assembly_node.py @@ -94,6 +94,10 @@ from arm_application.gauge_config import ( ) from arm_application.gauge_fsm import ( DESCEND_STALL_STEPS, + ENTRY_HIGH, + ROT_AXIS, + ROT_LIMIT, + ROT_SHORT, Event, FsmError, GaugeContext, @@ -104,12 +108,16 @@ from arm_application.gauge_fsm import ( descend_iter_budget, descend_needed_m, descend_progress, + hole_entry_verdict, descend_tol_m, is_joint_limit_error, pixel_stable, points_stable, ratchet_cycles, + ratchet_delta_rad, + ratchet_travel_ok, relief_tol_m, + rotation_verdict, screw_stop, tangential_jump, tool_clearance_m, @@ -135,16 +143,41 @@ from arm_application.gauge_kin import ( ) from arm_application.pipeline_node import AssemblyPipeline from arm_application.handeye_realsense import resolve_realsense_topics -from arm_application.site_io import deep_merge, load_site_dict, ros2_root +from arm_application.site_io import ( + deep_merge, + load_site_dict, + overhead_camera, + resolve_eye_to_hand_file, + ros2_root, +) # 复用同一份图像解码与轨迹点构造,别在这里再写一份(规则 M2) from arm_application.stage2_locate_node import _bgr_copy, _pt as _joint_point #: 允许的"绕轴验证"误差 [deg]。超过就说明这根关节轴不是工具 Z 轴, #: 后面所有以"转多少度"为单位的动作都不成立 —— 必须报错而不是继续。 AXIS_VERIFY_TOL_DEG = 5.0 +#: 棘轮转腕时距离关节限位保留的余量 [deg]。 +#: 3° 不够用:实测轨迹会**自己**少走 ~5°(比如命令 180° 只到位 175.1°, +#: 而关节7 的限位正好是 175.06° —— 两者叠在一起,判断"是被限位截住还是 +#: 没走完"就分不清了)。留 8° 让这两种情况都还没有贴住。 +RATCHET_LIMIT_MARGIN_DEG = 8.0 #: 限制"跟踪丢失 → 粗定位 → 跟踪"的来回次数,防死循环。 MAX_TRACK_RETRIES = 3 +#: ``stage2_locate`` 返回码 → 人话。为什么要这张表:日志里只有 ``code=6`` 时, +#: 现场只能去翻源码;而每个码对应的**下一步动作完全不同**(垂直化/粗定位/ +#: 检测/对准/工件被推走),写在这里就不用来回翻了。 +_LOCATE_CODE_HINT: Dict[int, str] = { + 2: "(垂直化或悬停失败:工具轴没竖直、或悬停高度到不了)", + 3: "(粗定位失败:视野里没框到工件 —— 看相机/光照/权重)", + 4: "(k1/k2 解不出来:孔被挡、曝光不对、或孔根本没在视野里)", + 5: "(对准迭代用满仍未收敛:检查手眼/相机安装,或放宽 align_tol_m)", + 6: "(工件被工具推走:不是手眼/检测的问题,是悬停时工具尖端已经进了工件" + " —— 查 gauge_assembly.tool_tip_below_flange_m 与 servo.hole_hover_z_m)", + 8: "(规尖偏移一直没量到:残差看着达标、但用的是**法兰轴线**不是规尖 —— " + "对的可能是法兰、不是规;摆到能看清规尖再跑。看日志『规尖视觉量取失败』)", +} + class GaugeAbort(RuntimeError): """阶段内部判定要中止。带上 exit code,方便脚本区分原因。""" @@ -194,12 +227,11 @@ class GripperClient: if math.isfinite(pos): self._last_aperture = pos self._last_gripped = bool(msg.is_gripped) - if self._last_gripped: - if not self._ever_gripped: - # 记住"夹住时的开口":之后的掉件判据是**相对它的塌陷量**, - # 换一把规、换一个夹持开口都不用改阈值。 - self._grip_aperture = self._last_aperture - self._ever_gripped = True + # ⚠️ 这里**故意不**记"夹住时的开口"。曾经记过,代价是一个假 E1: + # 本后端的 is_gripped 是**推断值**,夹爪**全开**时也会闪成 True + # (实测 99.29mm,见 dropped 的说明),于是基准被记成 99.29mm、 + # 塌陷量算成 77mm ⇒ "通止规掉了(E1)",而规好好地在爪里。 + # 基准只由 :meth:`adopt_current_grip` 在**明确知道夹住了**的时候记。 def _on_legacy(self, msg: Float32MultiArray) -> None: fields = legacy_states_to_fields(list(msg.data)) @@ -210,6 +242,8 @@ class GripperClient: if got is not None: self._last_gripped = got if got: + # 老后端只有状态字、没有开口,掉件判据本来就吃状态字(见 dropped), + # 所以这里记"曾经夹住过"是对的。 self._ever_gripped = True # -- 查询 ------------------------------------------------------------- @@ -224,6 +258,75 @@ class GripperClient: """``True``/``False``/``None``(后端给不出明确答案)。""" return self._last_gripped + def aperture(self) -> Optional[float]: + """最近一帧的**开口** [mm](只有契约后端的 ``position`` 有;没有返回 None)。""" + return self._last_aperture + + def grip_aperture(self) -> Optional[float]: + """第一次判到"夹住"时的开口 [mm](掉件判据的基准,见 :meth:`dropped`)。""" + return self._grip_aperture + + def collapse_mm(self) -> Optional[float]: + """相对夹住时的**开口塌陷量** [mm](正 = 比夹住时更小)。拿不到返回 None。 + + S08/S09 每轮都要"松爪 → 回转 → 夹紧",日志里必须看得到这个数: + 它一路变大就说明每轮夹紧都比上一轮更往里挤,或者规在往下滑。 + """ + if self._grip_aperture is None or self._last_aperture is None: + return None + return float(self._grip_aperture) - float(self._last_aperture) + + # -- 开口的"等稳定"与"记基准" ------------------------------------------ + def settle(self, *, settle_s: float = 1.0, tol_mm: float = 0.05) -> Optional[float]: + """等开口**稳定**下来,返回稳定后的开口 [mm](拿不到读数返回 None)。 + + 为什么必须有这个(2026-09-24 用日志抓到的): + ``close``/``open`` 服务**返回时动作还没做完**(JTC 轨迹是异步的)。 + 立刻读开口会读到**松手前的旧值**——实测 S08 夹紧后立刻读,读到的还是 + 全开 99.93mm,于是日志与基准全错("夹住时 99.29mm")。谁要在动作之后 + 判断开口,都必须先过这里。 + """ + spin = getattr(self._node, "_spin", None) + deadline = time.monotonic() + max(0.0, settle_s) + prev = self._last_aperture + stable = 0 + while True: + if spin is not None: + spin(0.05) + else: # pragma: no cover - 只有测试桩走这里 + time.sleep(0.05) + now = self._last_aperture + if now is not None and prev is not None and abs(float(now) - float(prev)) <= tol_mm: + stable += 1 + if stable >= 2: + return float(now) + else: + stable = 0 + prev = now + if time.monotonic() >= deadline: + return None if now is None else float(now) + + def adopt_current_grip(self, why: str, *, settle_s: float = 1.0) -> Optional[float]: + """把**当前**开口记为"夹住时的开口"(掉件判据的基准),并记"曾经夹住过"。 + + 只在**明确知道爪里夹着规**的时刻调用(S00 自检通过后、以及每一次 + 确认夹紧之后)——它是掉件判据唯一的参照,随手记会让判据失去意义 + (见 :meth:`dropped` 与 :meth:`_on_contract` 的说明)。 + """ + ap = self.settle(settle_s=settle_s) + if ap is None: + # 拿不到开口(老固件/别的夹爪)也要记"曾经夹住过":否则 dropped() + # 会永远返回 False,那比"会抖的旧判据"更糟(真掉件也看不见)。 + self._ever_gripped = True + self._node.get_logger().warn( + f"拿不到开口读数({why})—— 掉件判据退回状态字,会抖但不会漏" + ) + return None + self._grip_aperture = float(ap) + self._ever_gripped = True + self._node.get_logger().info(f"夹持基准:开口 {ap:.2f}mm({why})") + return float(ap) + def dropped(self) -> bool: """E1 掉件:**曾经夹住过**,现在报"掉落"。 @@ -238,6 +341,9 @@ class GripperClient: 的指令落到与实际开口同一档,``is_gripped`` 就翻成 False。于是 **S08 第 2/12 轮直接报 E1**(爪里其实好好的,是判据在抖), 然后整条流程去等人工"放好通止规",而仿真里根本没人能做这件事。 + 更坏的是这个推断值在**全开**时也会闪成 True(实测 99.29mm)—— + 拿它当基准就会得到"塌陷 77mm"的假 E1。所以基准只由 + :meth:`adopt_current_grip` 明确记录(见 :meth:`_on_contract`)。 真正"掉了"的物理表现是**两指合到底**:开口从"工件宽度"塌到几毫米, 是几十毫米的变化,不会被指令切换带偏。所以判据用 @@ -349,6 +455,12 @@ class GaugeAssembly(AssemblyPipeline): # `$?` 判不出成败 —— 自动化里会把"流程失败"记成"成功"。结论文件是唯一 # 能被脚本/CI 读到的东西,由 run_gauge_assembly.sh 传入并读回。 self.declare_parameter("result_file", "/tmp/gauge_assembly_result.json") + # 眼在手外标定产物的**确切路径**,由 launch 按 site.yaml 派生后传入 + # (`<臂号>_<相机>_eye_to_hand.yaml`)。为什么不让节点自己拼: + # "臂号 = SN 末两位"这条口径只有 export_site_env 一处实现,节点再写一遍 + # 必然漂移;而漂移的症状是"标定做完了、S03 却找不到文件",回退到 S04 跟踪, + # 看起来像跟踪的问题。留空则退回下面那串候选名(兼容旧命名/仿真)。 + self.declare_parameter("coarse_eye_to_hand_file", "") site = load_site_dict() # robots[].gauge_assembly 覆盖全局段 —— 与 servo / paths / perception 同一套规矩。 @@ -369,6 +481,13 @@ class GaugeAssembly(AssemblyPipeline): holes = int(self.get_parameter("holes_total").value) if holes > 0: overrides["holes_total"] = holes + # 工具长:仿真里由启动脚本传**实测值**(上料脚本刚量的),真机不传(走 site)。 + # 为什么必须能覆盖:这个值决定悬停高度与 S07 下探预算,而仿真里规会在指间 + # 下滑到落座位置、下滑量随装夹变化(实测见过 243 / 254mm,差 11mm)。 + # 差 11mm 的后果见 gauge_fsm.hover_z_guard / drag_verdict 的说明。 + tool_len = float(self.get_parameter("tool_tip_below_flange_m").value) + if tool_len > 0.0: + overrides["tool_tip_below_flange_m"] = tool_len try: self.cfg: GaugeConfig = from_site(site, overrides=overrides or None) except GaugeConfigError as exc: @@ -496,49 +615,30 @@ class GaugeAssembly(AssemblyPipeline): def _d435_ns(self, site: Dict[str, Any]) -> str: """手外相机的命名空间:``role: overhead*`` 且**属于当前这台臂**的那一个。 - 为什么必须按 ``arm`` 过滤:仿真那台也有手外相机(``sim_d435``), - 只按 role 扫会同时命中两台,而"命中哪一台"取决于字典顺序 —— - 同一份配置在仿真/真机之间**错而不报**地互串。 - - 规则(确定性的三级): - 1. ``arm`` 与当前臂相同的优先(仿真:sim_d435 / 真机若两台各有相机也适用); - 2. 都没有 ``arm``(= 双臂共用的那台老相机)时回落到它; - 3. 还是多个 → 出声告警并取第一个,让人去配置里区分。 + 规则(三级收敛)的**唯一实现**在 ``site_io.overhead_camera``——手眼标定 + 脚本也用它取相机名。这里只负责把"配置没区分开"这件事**出声**:静默取第一台 + 会让"标定用的相机"和"推理用的相机"悄悄不是同一台。 """ - cams = [ - cfg - for cfg in (site.get("cameras") or {}).values() - if isinstance(cfg, dict) - and str(cfg.get("role") or "").startswith("overhead") - ] - if not cams: - return "" - arm = str(self._robot_dict(site).get("arm") or "").strip() - mine = [c for c in cams if str(c.get("arm") or "").strip() == arm] if arm else [] - hits = mine or [c for c in cams if not str(c.get("arm") or "").strip()] or cams - if len(hits) > 1: - names = ", ".join(str(c.get("name") or "?") for c in hits) + cfg, others = overhead_camera(site, self._robot_dict(site)) + if others: + names = ", ".join([str(cfg.get("name") or "?")] + others) self.get_logger().warn( - f"有 {len(hits)} 台手外相机都符合当前臂({names})—— 取第一个," + f"有 {len(others) + 1} 台手外相机都符合当前臂({names})—— 取第一个," "但请给 site.yaml 的 cameras.* 补上 arm 字段区分,否则选哪台看运气" ) - return str(hits[0].get("name") or "").strip("/") + return str(cfg.get("name") or "").strip("/") def _eye_to_hand_file(self) -> Optional[Path]: """找手外相机的手眼文件。没有就返回 None(调用方据此给出**怎么生成**)。 - 路径按**仓库根**解析而不是当前工作目录:相对 CWD 的路径会在"换个目录 - 启动"时静默失效(文件找不到 → S03 直接降级),而人只会怀疑标定。 + 规则(候选顺序 + 按仓库根解析)只有一份,在 ``site_io.resolve_eye_to_hand_file``。 + 这里只负责把 launch 传入的确切路径和当前手外相机名交给它。 """ - root = ros2_root() - for rel in ( - f"handeye/results/{self.cfg.coarse_camera}_eye_to_hand.yaml", - "handeye/results/eye_to_hand.yaml", - ): - cand = root / rel - if cand.is_file(): - return cand - return None + return resolve_eye_to_hand_file( + ros2_root(), + explicit=str(self.get_parameter("coarse_eye_to_hand_file").value or ""), + camera_name=self.cfg.coarse_camera, + ) def _on_robot_description(self, msg: String) -> None: self._robot_description = str(msg.data) @@ -959,6 +1059,13 @@ class GaugeAssembly(AssemblyPipeline): return Event.BOOT_OK self._publish_gauge_result({"ok": False, "state": "S00", "failures": blockers}) return Event.BOOT_FAIL + # 记"夹住时的开口"(掉件判据的基准)。**放在这里而不是等到 S08**: + # · 此刻爪里确实夹着规(仿真上料脚本刚装好,真机是人工装好才开始跑); + # · 基准必须是**明确知道夹住**时记的 —— 本后端的 is_gripped 是全开时 + # 都会闪 True 的推断值(实测 99.29mm),拿它当基准会造出假 E1 + # (见 GripperClient.dropped)。 + if self.grip is not None: + self.grip.adopt_current_grip("S00 自检通过:爪里已装好通止规") return Event.BOOT_OK # ===================================================================== @@ -1140,20 +1247,25 @@ class GaugeAssembly(AssemblyPipeline): f"{tag}: 目标 {delta_deg:+.1f}°,实测绕工具 Z {got:+.1f}°" f"(转轴偏差 {mis:.1f}°,阈值 {AXIS_VERIFY_TOL_DEG:.1f}°)" ) - if abs(got) < 3.0 and abs(delta_deg) > 10.0: - # 完全没动:最可能是撞上关节极限(用户要求的"转到极限角"就是这种情形) + verdict = rotation_verdict(delta_deg, got, mis, AXIS_VERIFY_TOL_DEG) + if verdict == ROT_LIMIT: + # 完全没动、或只走了一部分:都是**关节限位**把这段截住了 + # (2026-09-24 实测:棘轮回转每轮顶到上限 ±175°,于是下一步反向 + # 只剩 ~16° 余量)。交给调用方让余量重试(见 _ratchet_step); + # 调用方不处理时 FSM 会按未定义转移报错,不会静默走下去。 self.get_logger().warn( - f"{tag}: 指令 {delta_deg:+.1f}° 但几乎没动 —— 判为已贴关节极限" + f"{tag}: 期望 {delta_deg:+.1f}°、实测 {got:+.1f}°" + f"(差 {abs(delta_deg) - abs(got):.1f}°)—— 判为**贴到关节限位**" ) return Event.JOINT_LIMIT - if mis > AXIS_VERIFY_TOL_DEG: + if verdict == ROT_AXIS: self.get_logger().error( f"{tag}: 转轴偏差 {mis:.1f}° 超过阈值 —— 关节7 轴与工具 Z 不共线," "以『度』为单位的动作(S01/S08/S09)都不可信,中止。" "先确认工具系是否垂直向下、有没有装转接件" ) return Event.ABORT - if abs(abs(got) - abs(delta_deg)) > max(AXIS_VERIFY_TOL_DEG, 0.1 * abs(delta_deg)): + if verdict == ROT_SHORT: self.get_logger().error( f"{tag}: 期望 {delta_deg:+.1f}°、实测 {got:+.1f}°,偏差过大,中止" ) @@ -1161,6 +1273,146 @@ class GaugeAssembly(AssemblyPipeline): self._axis_verified = True return fsm_event + def _ratchet_step( + self, target_rad: float, *, tag: str, fsm_event: Event, speed_deg_s: Optional[float], + direction: int = 0, + ) -> Event: + """棘轮的一步"转腕":行程不够时**张开爪让出余量**再转。 + + :param target_rad: 关节 7 的**目标角(绝对值)**,与 + :meth:`_rotate_joint_and_verify` 同一口径(那边算的就是 + ``target_rad - q_now``)。**不是增量。** + :param direction: 这一步的**工艺转向**:``+1`` 正转、``-1`` 反转、 + ``0`` 交给"最短路径"。棘轮的四步一律显式给:步长接近 180° 时 + "最短路径"会被 0.1° 的读数差翻方向(详见 + :func:`arm_application.gauge_fsm.ratchet_delta_rad`)。 + + ⚠️ 为什么要把口径写在这里(2026-09-24 栽过一次,S09 直接 ABORT): + 调用方(S08/S09)给的本来就是绝对值(``q[-1] ± screw_step_rad``), + 而本函数此前把它当**增量**用(``prewind(want_deg=abs(deg(target)))``、 + 让余量时又按 ``q - target`` 算新目标)。于是 S09 第一步被算成 + "要转 338.9°"(其实是目标 338.9°、增量只有 180°)⇒ 误判"行程不够" + ⇒ 让余量那一步算到限位**外面**(``158.9 − 338.9 = −180°``,比 + −175° 的限位还低 5°)⇒ 报"期望 −338.9°、实测 +26.0°,偏差过大" + ⇒ 整条流程在**最不该失败的一步** ABORT(规在爪里好好的、什么坏事都没发生)。 + 两个函数各用一种口径,编译器不会说话,日志还会把"目标"和"增量"都印成 + 一个数 —— 所以口径写进参数名和 docstring。 + + 为什么需要"让余量"这一步: + 棘轮要求"一正一反各 180°",而关节 7 的行程只有 ±175°(3.0543 rad)。 + 拧入(S08)的**回转**那一步每轮都正好顶到上限(实测 +175.1°), + 于是 S09 要做的**反方向**第一步只剩 ~16° 余量,被限位截住。 + 而这一轮其实什么坏事都没发生。 + + 为什么"让余量"是免费的: + 指间**张开**时规在打滑(这正是棘轮成立的原理),所以手腕空转既不会 + 把已经拧进去的螺纹转回去,也不会漏掉进度 —— 只是把行程重新分配。 + + 让多少:整步(不去算亏欠了多少)。反正张开状态下这一步不产生任何装配 + 效果,整步最省事也最不容易算错;重试时的那一步才是"用力"的那一步。 + + 两条路:**先算**(限位已知时,提前让余量,干净)+ **兜底**(真被限位 + 截住时再让,覆盖"限位没读到 / 轨迹自己没走完"这两种情况)。 + + 两条路**最后都汇到同一次让余量**:只有一次,避免"先算发现不够、 + 让完还不够、再让一次"这种把行程越绕越少的做法。 + """ + limits = self._wait_joint_limits() + q = None + if limits is not None: + q, _Tee = self._wait_state(3.0) + if q is None: + return Event.TIMEOUT + # 目标角可能落在限位**外面**(这正是棘轮要解决的问题),先折成"最近一圈" + # 的增量(gauge_fsm.ratchet_delta_rad,含完整说明与单测): + # 关节在 +158.9°、目标 +338.9° ⇒ 增量 +180°(而不是 +338.9°)。 + # **方向按工艺意图给**:步长贴着 180° 时"最短路径"会被读数差翻向(R2.10)。 + delta_rad = ratchet_delta_rad(target_rad, float(q[-1]), direction) + why = "" + if limits is not None and abs(math.degrees(delta_rad)) > 1e-6: + plan = prewind( + q_now_rad=float(q[-1]), want_deg=abs(math.degrees(delta_rad)), + direction=1 if delta_rad > 0 else -1, + limits=limits, margin_deg=RATCHET_LIMIT_MARGIN_DEG, + ) + if plan.clamped: + why = ( + f"行程不够(关节7 在 {math.degrees(float(q[-1])):+.1f}°," + f"这一步要转 {math.degrees(delta_rad):+.1f}°" + f"(目标 {math.degrees(float(target_rad)):+.1f}°),限位 " + f"{math.degrees(limits[0]):+.0f}~{math.degrees(limits[1]):+.0f}°)" + ) + if not why: + ev = self._rotate_joint_and_verify( + target_rad, tag=tag, fsm_event=fsm_event, speed_deg_s=speed_deg_s + ) + if ev is not Event.JOINT_LIMIT: + return ev + why = "轨迹被关节限位截住(算着够、实际没走完)" + return self._ratchet_rewind_then( + delta_rad, tag=tag, fsm_event=fsm_event, speed_deg_s=speed_deg_s, why=why, + ) + + def _ratchet_rewind_then( + self, delta_rad: float, *, tag: str, fsm_event: Event, + speed_deg_s: Optional[float], why: str, + ) -> Event: + """张开爪 → 反向让一步 → 夹紧 → 转原来那一步。 + + :param delta_rad: **要转的增量**(不是目标角,见 :meth:`_ratchet_step`)。 + 让余量时按它反着退一步,重试时再按它前进 —— 两次都以**当时的** + 关节角为基准重新算目标,所以让完余量后关节会回到原处、工具净转 + ``delta_rad``。把"目标"固定成一开始那个绝对值是错的:让完余量之后 + 那个目标已经在另一圈上了(差 360°)。 + """ + if self.grip is None: + self.get_logger().error(f"{tag}: {why},但没有夹爪客户端,无法让余量 → 中止") + return Event.ABORT + self.get_logger().info( + f"{tag}: {why} —— 张开爪让出一步(此刻规在打滑,不会动到螺纹)再转" + ) + if not self.grip.open(): + self.get_logger().error(f"{tag}: 需要张爪让余量,但开爪失败 → 中止") + return Event.ABORT + time.sleep(self.cfg.screw_release_wait_s) + q, _Tee = self._wait_state(3.0) + if q is None: + return Event.TIMEOUT + ev = self._rotate_joint_and_verify( + float(q[-1]) - delta_rad, tag=f"{tag}_rewind", + fsm_event=fsm_event, speed_deg_s=speed_deg_s, + ) + if ev is not fsm_event: + self.get_logger().error( + f"{tag}: 让余量那一步也没走开({ev})—— 关节7 的行程真用尽了,中止。\n" + f" 排查:site.yaml 的 gauge_assembly.screw_step_deg 太接近关节行程了" + f"(Rizon4 的关节7 是 ±175°),棘轮一步要 {math.degrees(abs(delta_rad)):.0f}°," + f"留给'回转'的余量本来就不够。\n" + f" 改法:把 screw_step_deg 调小(例如 120°),并保证 " + f"screw_max_cycles × screw_step_deg 仍是 **360° 的整数倍** —— " + f"累计必须转整数圈,否则规会停在螺纹中间(S09 拧出也就少转几分之一圈)。" + ) + return Event.ABORT + if not self.grip.close(): + self.get_logger().error(f"{tag}: 让完余量后夹紧失败 → 中止") + return Event.ABORT + # 重试目标**按让完余量后的位置重算**:让余量退了一步,原来那个绝对目标 + # 现在差了 360°(正好一整圈),照原样下发会让关节反向绕一圈回去。 + q2, _Tee2 = self._wait_state(3.0) + if q2 is None: + return Event.TIMEOUT + ev = self._rotate_joint_and_verify( + float(q2[-1]) + delta_rad, tag=f"{tag}_retry", + fsm_event=fsm_event, speed_deg_s=speed_deg_s, + ) + if ev is not fsm_event: + self.get_logger().error( + f"{tag}: 让完余量重试仍然没走到位({ev})—— 中止" + f"(不是限位问题,先查是不是有东西卡住/螺纹咬死)" + ) + return Event.ABORT + return fsm_event + # ===================================================================== # S02 夹持确认(预留) # ===================================================================== @@ -1200,11 +1452,15 @@ class GaugeAssembly(AssemblyPipeline): ns = self.cfg.coarse_camera he = self._eye_to_hand_file() if he is None: + expect = str( + self.get_parameter("coarse_eye_to_hand_file").value or "" + ).strip() or f"handeye/results/{ns}_eye_to_hand.yaml" self.get_logger().warn( "S03 需要手外相机的 eye-to-hand 标定文件,现在没有 —— " f"按兜底逻辑回 S04 跟踪。\n" - f" 相机 {ns} 的标定产物应放在 handeye/results/<名>_eye_to_hand.yaml;\n" - f" 做法:bash scripts/run_handeye.sh --mode eye_to_hand(标完再跑本流程)" + f" 应该生成:{expect}\n" + f" 做法:bash scripts/run_handeye.sh --mode eye_to_hand " + f"teach/merge/calibrate(标完再跑本流程)" ) return Event.COARSE_FAIL if not self._wait_coarse_frame(ns): @@ -1354,7 +1610,9 @@ class GaugeAssembly(AssemblyPipeline): return Event.TIMEOUT code, q, Tee, final = self._run_locate(q, Tee) if code != 0 or not final: - self.get_logger().error(f"S05 精拍定位失败 code={code}") + self.get_logger().error( + f"S05 精拍定位失败 code={code}{_LOCATE_CODE_HINT.get(code, '')}" + ) return Event.TIMEOUT self._snap_final = dict(final) self._snap_pose = Tee.copy() @@ -1535,6 +1793,9 @@ class GaugeAssembly(AssemblyPipeline): z0 = float(Tee[2, 3]) step_m = self.cfg.contact_step_mm / 1000.0 max_depth_m = self.cfg.contact_max_depth_mm / 1000.0 + # 台肩落面所需的下压量。在下面几何自检里算出来;**要留到接触判据那里用** + # (看 hole_entry_verdict:下压深度远小于它 ⇒ 规没进孔)。 + needed_m: Optional[float] = None # ---- 工具几何自检:预算必须是**由几何推出来的**,不能拍 ------------------ # 判"到底了"的那一下是**台肩落到工件上表面**(不是尖端碰面)。工件上表面 @@ -1663,6 +1924,11 @@ class GaugeAssembly(AssemblyPipeline): f"{ft_ref:+.2f}N 超过 +{self.cfg.contact_axial_delta_n:.1f}N" f"(下压 {abs(float(Tee[2, 3]) - z0) * 1000:.2f}mm)" ) + # 下压这么浅就"接触" ⇒ 尖端顶在工件上表面,没进孔。必须在这里 + # 拦下:放它进 S08 只会干转几轮、憋住,最后报一句"转轴偏差" + # 把所有人引去查工具系。见 hole_entry_verdict 的说明。 + if self._hole_lost_guard(z0, Tee, needed_m, q, "腕部 FT"): + return Event.HOLE_LOST # 必须先卸载再交给 S08 —— 判到接触的这一刻臂上顶着的是**出力上限** # 那个量级的力(实测 200N+,与阈值无关),而规的轴向传力上限 # 只有 µ·N≈73N。见 _relieve_after_contact 的完整说明。 @@ -1709,6 +1975,9 @@ class GaugeAssembly(AssemblyPipeline): f"(法向 {fn:.1f},下压 {abs(float(Tee[2, 3]) - z0) * 1000:.2f}mm)" ) # 与腕部 FT 那条同规矩:判到接触时臂上顶着的力远大于阈值,必须先卸载。 + # 同样先过"是不是根本没进孔"这道闸(见 hole_entry_verdict)。 + if self._hole_lost_guard(z0, Tee, needed_m, q, "触觉切向"): + return Event.HOLE_LOST self._relieve_after_contact(q, Tee, "触觉切向", ft_ref) return Event.CONTACT_OK if fn - self._fn_rest > self.cfg.contact_safe_delta: @@ -1745,6 +2014,47 @@ class GaugeAssembly(AssemblyPipeline): self._retract(q, Tee, dz_m=0.01) return Event.TIMEOUT + def _hole_lost_guard( + self, + z0: float, + Tee: np.ndarray, + needed_m: Optional[float], + q: np.ndarray, + why: str, + ) -> bool: + """S07 判到接触时:下压深度是不是**远小于**几何预期(= 规没进孔)。 + + 返回 True 表示"确实没进孔",调用方要抬臂并返回 ``Event.HOLE_LOST``。 + + 完整来龙去脉在 ``gauge_fsm.hole_entry_verdict`` 的 docstring 里,这里只 + 留现场要看的那几句:工件在 S08/S09/S10 会被工具推走,而 k2 的孔位是 + S05 一次性定的 ⇒ 工件一动孔位就失效 ⇒ 规落在孔旁边的平面上。 + 不拦的话会干转 5 轮,最后报一句"转轴偏差…先确认工具系有没有装转接件", + 把所有人引去查工具系(实测 2026-09-28)。 + """ + if needed_m is None: + # 没算出几何预期(工件上表面 z 没标定且 S05 也没给)—— 没有判据就别猜。 + return False + descended_m = abs(float(Tee[2, 3]) - z0) + if hole_entry_verdict(descended_m, needed_m) != ENTRY_HIGH: + return False + self.get_logger().error( + f"S07 接触({why})发生在下压 {descended_m * 1000:.2f}mm 处," + f"而按几何「台肩落面」需要 {needed_m * 1000:.1f}mm —— 只走了 " + f"{descended_m / needed_m * 100.0:.0f}%。\n" + " **规没有进孔,尖端顶在工件上表面**(正常入孔要压到台肩落面那一下)。\n" + " 最可能的原因:工件被工具推走了,而本孔的坐标是 **S05 一次性定下**的 ——\n" + " 工件一动,那个坐标就失效(S06 的「实测残差」发现不了:它比的是\n" + " 「命令位置 vs 实际位置」,不是「规尖 vs 真实孔位」)。\n" + " 所以**不要**去查工具系/转接件/力阈值(那几个都是好的)。\n" + " 正确处置:把臂退开、确认工件的实际位置;能复位就复位工件,然后\n" + " 从 S05 重新拍照定位(重跑流程即会重新定位)。\n" + " 若要治根:换孔前复核工件没动(当前只有 S05 阶段有 drag 看门狗)。\n" + " 抬起并中止,不带着失效的孔位进 S08。" + ) + self._retract(q, Tee, dz_m=0.01) + return True + def _relieve_after_contact( self, q: np.ndarray, @@ -1879,6 +2189,29 @@ class GaugeAssembly(AssemblyPipeline): # ===================================================================== # S08 旋转装配循环(棘轮) # ===================================================================== + def _log_regrip(self, tag: str) -> None: + """把"这一轮夹紧后的开口"打出来(含相对夹住时的塌陷量)。 + + 为什么每轮都要打(2026-09-24 实测): + S08/S09 每轮都是"慢转 → 松爪 → 回转 → 夹紧",而 `close` 在仿真里 + 是"位置控制走到全合 0mm" —— **真机走到力上限就停,仿真会一路挤进规里**。 + 只报一句"通止规掉了(E1)"时,人分不出"真掉了"和"被挤小了"。 + 把开口与塌陷量打出来一眼就能分辨: + · 塌陷量逐轮变大、开口还在十几毫米 → 是**被挤**(规还在指间) + · 开口塌到接近 0(两指合到底) → 是**真掉了** + """ + if self.grip is None: + return + ap = self.grip.settle(settle_s=1.0) # 服务返回时动作还没做完,等它停 + if ap is None: + return + gp = self.grip.grip_aperture() + col = self.grip.collapse_mm() + detail = "" + if gp is not None and col is not None: + detail = f"(夹住时 {gp:.2f}mm,塌陷 {col:+.2f}mm)" + self.get_logger().info(f"{tag}:开口 {ap:.2f}mm{detail}") + def _step_screw_in(self) -> Event: hole = self._hole_name() self._state(f"S08_screw_in_{hole}") @@ -1895,6 +2228,20 @@ class GaugeAssembly(AssemblyPipeline): f"停止判据「切向 >+{self.cfg.screw_shear_delta:.0f} " f"且法向 >+{self.cfg.screw_normal_delta:.0f}」" ) + # 步长 vs 关节行程:**在这里算一次**,不要等第 3 轮贴限位再炸。 + # 2026-09-24 实测:180° 的步长配 ±175° 的关节 7,第 3 轮 ABORT, + # 日志是一长串"贴限位 → 让余量 → 还是贴限位",真因(配置)藏在最后。 + travel = ratchet_travel_ok( + self.cfg.screw_step_deg, self._wait_joint_limits(), RATCHET_LIMIT_MARGIN_DEG + ) + self.get_logger().info( + f"S08 行程核算:一步棘轮要 {travel.need_deg:.0f}°," + f"关节7 行程 {travel.travel_deg:.0f}°" + f"(最大可用步长 {travel.max_step_deg:.0f}°)—— {'放得下' if travel.ok else '放不下'}" + ) + if not travel.ok: + self.get_logger().error(f"S08 配置自检不通过(先改配置,别硬跑):{travel.why}") + return Event.ABORT for cycle in range(self.cfg.screw_max_cycles): q, Tee = self._wait_state(5.0) if q is None or Tee is None: @@ -1909,9 +2256,10 @@ class GaugeAssembly(AssemblyPipeline): # --- 四步原子动作,顺序固定(慢转 → 松爪 → 快回转 → 夹紧)--- # 慢转是**顺时针**:与 S01 的逆时针预绕相反,这样预绕行程就是 # 这一整段拧入的回转空间(S01 不预绕,转两圈就贴限位)。 - ev = self._rotate_joint_and_verify( + ev = self._ratchet_step( float(q[-1]) - self.cfg.screw_step_rad, tag=f"S08_slow_{cycle}", fsm_event=Event.SCREW_DONE, speed_deg_s=self.cfg.screw_speed_deg_s, + direction=-1, # 顺时针拧入(与 S01 的预绕相反) ) if ev is not Event.SCREW_DONE: return ev @@ -1924,15 +2272,17 @@ class GaugeAssembly(AssemblyPipeline): q, Tee = self._wait_state(3.0) if q is None: return Event.TIMEOUT - ev = self._rotate_joint_and_verify( + ev = self._ratchet_step( float(q[-1]) + self.cfg.screw_step_rad, tag=f"S08_back_{cycle}", fsm_event=Event.SCREW_DONE, speed_deg_s=self.cfg.screw_back_speed_deg_s, + direction=+1, # 回转:与慢转正好相反 ) if ev is not Event.SCREW_DONE: return ev if not self.grip.close(): self.get_logger().error("S08 夹紧失败 —— 下一轮慢转会打滑磨螺纹") return Event.ABORT + self._log_regrip(f"S08 第 {cycle + 1} 轮夹紧后") else: self.get_logger().error("S08 没有夹爪客户端,无法松爪/夹紧,中止") return Event.ABORT @@ -1961,9 +2311,17 @@ class GaugeAssembly(AssemblyPipeline): self._progress(f"{hole} 拧入到位({cycle + 1} 轮)") return Event.SCREW_STOP if self.grip is not None and self.grip.dropped(): + ap = self.grip.aperture() + gp = self.grip.grip_aperture() self.get_logger().error( "S08 通止规掉了(E1)—— 回 S01 流程:张开爪、提示人工放好," - "确认后继续(按看板:该孔记为完成,换下一个孔)" + "确认后继续(按看板:该孔记为完成,换下一个孔)\n" + f" 开口:夹住时 {gp if gp is None else f'{gp:.2f}mm'}" + f" → 现在 {ap if ap is None else f'{ap:.2f}mm'}" + f"(判据:塌陷 ≥ {GripperClient.DROP_COLLAPSE_MM:.1f}mm)\n" + " 分辨真掉还是被挤:开口塌到接近 0 = 两指合到底(真掉);\n" + " 开口还有十几毫米、只是比夹住时小了几毫米 = 被**挤**" + "(仿真位置控制的「全合」不知道「挡住就停」,见 GripperClient.dropped)" ) self._e1_pending = True return Event.GAUGE_DROPPED @@ -1994,9 +2352,10 @@ class GaugeAssembly(AssemblyPipeline): if q is None: return Event.TIMEOUT # 反向:慢转是逆时针(与 S08 相反),空手回转是顺时针 - ev = self._rotate_joint_and_verify( + ev = self._ratchet_step( float(q[-1]) + self.cfg.screw_step_rad, tag=f"S09_slow_{cycle}", fsm_event=Event.UNSCREW_DONE, speed_deg_s=self.cfg.screw_speed_deg_s, + direction=+1, # 逆时针拧出 ) if ev is not Event.UNSCREW_DONE: return ev @@ -2008,17 +2367,64 @@ class GaugeAssembly(AssemblyPipeline): q, Tee = self._wait_state(3.0) if q is None: return Event.TIMEOUT - ev = self._rotate_joint_and_verify( + ev = self._ratchet_step( float(q[-1]) - self.cfg.screw_step_rad, tag=f"S09_back_{cycle}", fsm_event=Event.UNSCREW_DONE, speed_deg_s=self.cfg.screw_back_speed_deg_s, + direction=-1, # 回转:与慢转相反 ) if ev is not Event.UNSCREW_DONE: return ev if not self.grip.close(): return Event.ABORT + self._log_regrip(f"S09 第 {cycle + 1} 轮夹紧后") + self._lift_clear_of_hole(hole) self._progress(f"{hole} 已拧出") return Event.UNSCREW_DONE + def _lift_clear_of_hole(self, hole: str) -> None: + """拧出后**先竖直把规提出孔**,之后才允许任何横向动作。 + + **为什么必须有这一步**(2026-09-24 仿真实测,两次栽在同一个地方): + 1. 仿真里**没有螺纹几何**:S09 的"拧出"只是让规在孔里转,规**仍然插在 + 孔里**(真机会沿螺纹退出来几个毫米,也没退出多少)。 + 2. 于是紧跟着的横向动作(S10 换孔 / S11 回 home)会把规从孔里**拽** + 出来 —— 实测抓取锁被拽断、规掉在台面上,而下游只表现为 + "下一孔 S07 下探 35mm 判不到接触"(工具上已经没规了), + 日志完全指不到真因。 + 3. 真机也怕这个动作:螺纹刚脱开时横向别住最容易啃伤螺纹。标准做法就是 + **先竖直退出来,再走 XY**。 + + 高度提到**跟踪高**(``_track_z()`` = 孔悬停高 + 50mm)而不是写死毫米数: + 跟踪高是这条流程里"工具已离开工件"的既有定义(``_ensure_clearance`` + 也用它),拿它当判据不用再维护第二套口径。实测:不提出时规尖比工件面 + **低 30mm**,而 S10 的斜线只往上抬了 29mm —— 差 1mm 就是"拽出孔"和 + "干净退出"的分界,所以必须是**先后有序**的两个动作,不能靠斜线一起走。 + + 失败只告警(不失败):这一刻孔里已经没有规要保护了,硬失败会把一次成功 + 的装配变成失败;后面的 S10/S11 仍会走到安全位。 + """ + try: + q, Tee = self._wait_state(3.0) + if q is None or Tee is None: + return + tz = self._track_z() + z = float(Tee[2, 3]) + if z >= tz - 0.008: + return + self.get_logger().info( + f"S09 {hole} 拧出后竖直提出:Z {z:.3f} → {tz:.3f}m" + "(先离开孔口,再做横向动作)" + ) + _, q2, _Tee2 = self._goto( + q, Tee, + np.array([float(Tee[0, 3]), float(Tee[1, 3]), tz]), + verticalize=True, tol_m=0.003, tol_tilt=self.vert_tol_rad * 2.0, + tag=f"S09_exit_{hole}", v=self.move_speed, max_hops=8, + hold_xy=True, settle_s=0.25, + ) + except Exception as exc: # noqa: BLE001 + self.get_logger().warn(f"S09 {hole} 提出孔口失败(继续走 S10/S11):{exc}") + # ===================================================================== # S10 换孔 / S11 复位 # ===================================================================== diff --git a/build/arm_application/build/lib/arm_application/gauge_config.py b/build/arm_application/build/lib/arm_application/gauge_config.py index 5bab7a3..5bc0bea 100644 --- a/build/arm_application/build/lib/arm_application/gauge_config.py +++ b/build/arm_application/build/lib/arm_application/gauge_config.py @@ -254,7 +254,9 @@ DEFAULTS: Dict[str, Any] = { "contact_hold_n": 5.0, "contact_safe_delta": 2000.0, # S08 - "screw_step_deg": 180.0, + # 步长必须满足 2×step + 2×余量 ≤ 关节7 行程(Rizon4/10 ±175° ⇒ step ≤ 167°): + # 180° 会必然贴限位(棘轮一个来回要 360° > 350°),实测第 3 轮 ABORT。 + "screw_step_deg": 120.0, "screw_speed_deg_s": 30.0, "screw_back_speed_deg_s": 120.0, "screw_max_cycles": 12, diff --git a/build/arm_application/build/lib/arm_application/gauge_fsm.py b/build/arm_application/build/lib/arm_application/gauge_fsm.py index 8705bdb..55ebdca 100644 --- a/build/arm_application/build/lib/arm_application/gauge_fsm.py +++ b/build/arm_application/build/lib/arm_application/gauge_fsm.py @@ -79,6 +79,10 @@ class Event(str, Enum): CONTACT_OK = "contact_ok" FORCE_OVER_LIMIT = "force_over_limit" # 力超安全上限 → 抬起 + #: S07 判到接触、但**下压深度远小于几何预期** ⇒ 规没进孔,顶在工件上表面。 + #: 单列一个事件是为了让结论与日志都是实话:复用 FORCE_OVER_LIMIT 会把这种 + #: 情况报成"力超安全上限",而它的力根本没超限 —— 又是一句误导。 + HOLE_LOST = "hole_lost" SCREW_DONE = "screw_done" SCREW_STOP = "screw_stop" # 力判据满足:切向力>阈值 且 法向力突增 @@ -158,6 +162,7 @@ TRANSITIONS: Dict[Tuple[State, Event], State] = { # --- S07 柔顺接触 --- (State.CONTACT, Event.CONTACT_OK): State.SCREW_IN, (State.CONTACT, Event.FORCE_OVER_LIMIT): State.ABORT, + (State.CONTACT, Event.HOLE_LOST): State.ABORT, # --- S08 旋转装配循环 --- (State.SCREW_IN, Event.SCREW_DONE): State.UNSCREW, (State.SCREW_IN, Event.SCREW_STOP): State.UNSCREW, @@ -406,6 +411,40 @@ def wrench_live(age_s: Optional[float]) -> bool: return age_s is not None and float(age_s) <= WRENCH_MAX_AGE_S +#: 判定"六个分量全为 0"用的容差 [N]/[Nm]。真机 FT 的噪声量级是 1e-2~1e-1, +#: 所以 1e-6 足够区分"真的是 0(数据没出来)"与"很小但活的读数"。 +WRENCH_ZERO_EPS: float = 1.0e-6 + + +def wrench_all_zero( + fx: float, + fy: float, + fz: float, + tx: float, + ty: float, + tz: float, + eps: float = WRENCH_ZERO_EPS, +) -> bool: + """六个分量**同时**为 0(容差 ``eps``)⇒ 这是"数据没出来"的指纹,不是"安静"。 + + 与 :func:`wrench_live` 的分工(两个都要有,缺一不可): + + * ``wrench_live`` 只看"够不够新",**故意不看数值** —— 静止时轴向力本来就接近 0, + 拿数值判活会把"安静的传感器"误判成掉线(2026-09-24 触觉上踩过)。 + * 但一个**带着负载**的腕部 FT 不可能六个分量**同时**恰好为 0:重力、装配预紧、 + 传感器零漂至少让某个分量不为 0。所以"全零"是另一种失效 —— **数据源没出数** + (话题名对、但内容是空的;或 RDK 侧没启用该传感)。 + + 2026-10-08 真机实测:应用在用的 ``//ft_sensor_wrench`` 就是恒 (0,0,0), + 于是"``abs(fz−基线)>2.5N`` 判接触"的兜底**永远触发不了** —— 而日志里一切正常 + (话题收得到、回调在跑、``wrench_live`` 报"活"),属于最危险的静默失效。 + 改用 ``//external_wrench_in_tcp`` 后有数(≈负载 54N)即可恢复兜底。 + + 所以:``wrench_live`` 通过 **且** ``wrench_all_zero`` 为真 ⇒ 判为"数据源是空的"。 + """ + return all(abs(float(v)) <= eps for v in (fx, fy, fz, tx, ty, tz)) + + #: S07 单步下压给 ``_goto`` 的到位容差 = 步长的这个比例。 #: **必须 < 1,而且只能小不能大**:``_goto`` 的语义是"已经落在容差里就直接返回、 #: 一点都不动"。容差 ≥ 步长时,每一次"往下走 0.5mm"的请求都被判成"已在容差内" @@ -513,6 +552,209 @@ def tool_clearance_m( return tip_z - float(surface_z_m) +def hover_z_for_tool_clearance( + surface_z_m: float, + tool_tip_below_flange_m: float, + clearance_m: float, +) -> float: + """让工具尖端停在工件面上方 ``clearance_m`` 所需的**法兰**高度 [m]。 + + 就是 ``tool_clearance_m`` 的逆运算 —— 写成一个函数是为了让"该用多高"这个 + 结论只有一个来源(下面 ``hover_z_guard`` 与调用方都用它,不各推一遍)。 + """ + return float(surface_z_m) + float(tool_tip_below_flange_m) + float(clearance_m) + + +def hover_z_guard( + hover_z_m: float, + surface_z_m: float, + tool_tip_below_flange_m: float, + want_clearance_m: float, +) -> Tuple[float, str]: + """二阶段悬停高度的自检 → ``(该用的悬停高度, 说明; 不用改时说明是空串)``。 + + **为什么必须有这条**(2026-09-24 实测栽在这上面): + + 悬停高度是**按相机**定的(腕部相机要离工件面 ~0.17m 才看得清孔), + 而工具(夹爪 + 通止规)可能比相机长得多 —— 仿真里实测 + ``tool_tip_below_flange_m=0.245``,而悬停算的是 + ``0.412 + 0.17 + 0.05 = 0.632`` ⇒ 工具尖端在工件上表面**下面 25mm**。 + + 后果不在 S07(S07 有自己的几何自检),而在**更早的 S05**: + "悬停"这一步本身就把工具捅进工件里了,于是 S05 的横向对准等于 + 拿规尖去拨工件 —— 实测把工件从 x=0.520 拖到 0.4284(**92mm**)。 + 而真值孔位是按工件的**实测**位姿算的(``sim_live_pose``,这是对的), + 工件一走,孔位就跟着工具走 ⇒ 残差恒定在 13mm、迭代 9 次永不收敛 + (日志:``[fine 3..8] 残差=13.25/13.19/…/11.79mm``)。 + 现象看起来像"手眼标定坏了 / 检测不认孔"。 + + 真机同参数同结果:这不是仿真专有,只要"悬停按相机定、工具比相机长"就会这样。 + + 判据取"明显低于目标间隙"而不是"一毫米都不许低":配置的悬停与实测的 + 工件面 z 都有几毫米的不确定度,拿 0 当界会把正常配置判成错的。 + """ + clear_m = tool_clearance_m(hover_z_m, tool_tip_below_flange_m, surface_z_m) + if clear_m >= float(want_clearance_m) - 0.001: + return float(hover_z_m), "" + need_z = hover_z_for_tool_clearance(surface_z_m, tool_tip_below_flange_m, want_clearance_m) + why = ( + f"悬停高度会让工具尖端钻进工件:法兰 {float(hover_z_m):.4f} − 工具长 " + f"{float(tool_tip_below_flange_m) * 1000:.1f}mm = 尖端 " + f"{float(hover_z_m) - float(tool_tip_below_flange_m):.4f},工件上表面 " + f"{float(surface_z_m):.4f} → 尖端在面{'下' if clear_m < 0 else '上仅'} " + f"{abs(clear_m) * 1000:.1f}mm(要求 ≥ {float(want_clearance_m) * 1000:.1f}mm)。\n" + f" 悬停高度通常是按**相机**视距定的,而工具比相机长 —— 两者冲突时必须" + f"先保证不碰工件。\n" + f" 已按几何抬到 {need_z:.4f}(= {float(surface_z_m):.3f} 上表面 + " + f"{float(tool_tip_below_flange_m) * 1000:.0f}mm 工具 + " + f"{float(want_clearance_m) * 1000:.1f}mm 间隙)。\n" + f" 要固定这个值:改 site.yaml 的 robots[].servo.hole_hover_z_m = " + f"{need_z:.3f}(以及同组件的 ee_z_m ≥ 它 +0.05)。" + ) + return need_z, why + + +def resolve_hover_z( + hover_z_m: float, + surface_z_m: float, + tool_tip_below_flange_m: float, + want_clearance_m: float, + user_set: bool, +) -> Tuple[float, str]: + """返回 ``(要用的法兰悬停高, 拒绝原因)``。 + + 启动参数写了高度:不安全就拒绝,原因非空,高度原样返回,调用方不许改成别的数。 + 没写(用 site):沿用 :func:`hover_z_guard` 的几何抬高,拒绝原因留空。 + """ + fixed, why = hover_z_guard( + hover_z_m, surface_z_m, tool_tip_below_flange_m, want_clearance_m + ) + if not why: + return float(hover_z_m), "" + if not user_set: + return float(fixed), "" + clear_m = tool_clearance_m(hover_z_m, tool_tip_below_flange_m, surface_z_m) + return float(hover_z_m), ( + f"悬停高度会让工具尖端进入工件:法兰 {float(hover_z_m):.4f} − 工具长 " + f"{float(tool_tip_below_flange_m) * 1000:.1f}mm,工件面 {float(surface_z_m):.4f}," + f"间隙 {clear_m * 1000:.1f}mm,要求 ≥ {float(want_clearance_m) * 1000:.1f}mm。" + "这个值是启动参数指定的,不会改成别的高度。" + ) + + +#: S05 精对位时判"工件被工具推走"的两级阈值 [m]。 +# +# 为什么需要这条判据(2026-09-24 又栽了一次,见下面 drag_verdict 的说明): +# S05 的对准是"看着孔走"的闭环,而孔位是**工件上**的。工具一旦碰到工件, +# 闭环追的就不再是孔,而是"自己推着走的工件" —— 残差恒定(本轮 11mm)、 +# 迭代用满,日志报的是"检查手眼/相机安装",与真因(工具比相机长、 +# 悬停时已经插进工件)差着十万八千里。 +# 取 3mm:工件是刚体,两拍之间它整体挪动 >3mm 只可能是被推/被撞(正常加工 +# 过程里它一动不动)。同一对孔的两拍测量噪声在 0.2mm 量级,离阈值很远。 +SNAP_DRAG_TOL_M: float = 0.003 +#: 单拍就这么大 ⇒ 不必等第二拍确认(刚体不会自己"挪回去")。 +SNAP_DRAG_HARD_M: float = 0.006 + + +#: "已经到位"的容差:避免 ±1e-9 的浮点噪声变成"再转一整圈"。 +_RATCHET_FULL_TURN_EPS: float = 1e-9 + + +def ratchet_delta_rad(target_rad: float, q_now_rad: float, direction: int = 0) -> float: + """"目标角 − 当前角",折成**一次**能转到的增量 [rad]。 + + **为什么要有这个函数**(2026-09-24 实测:棘轮把整条流程 ABORT 在 S09 第一步): + + S08/S09 给棘轮的是**关节 7 的目标角(绝对值)**(``q[-1] ± step``), + 而棘轮此前把它当**增量**用。于是"关节在 +158.9°、目标 +338.9°"被算成 + "要转 338.9°"(实际增量只有 180°)⇒ 误判行程不够 ⇒ 让余量那一步算到 + 限位外面(``158.9 − 338.9 = −180°``,比 −175° 还低)⇒ 报 + "期望 −338.9°、实测 +26.0°,偏差过大" ⇒ ABORT。现场什么坏事都没发生。 + + 差值必须折一圈:目标常常**故意**超出限位(这正是要"让余量"的原因), + ``+338.9°`` 与 ``−21.1°`` 是同一个关节位置。 + + **为什么还要 direction**(2026-09-24 又一次实测:S08 第 3 轮 ABORT): + + 不给方向时这里取"最短的那条路",而名义步长**正好是 180°** 时, + 哪条路更短取决于 0.1° 级的读数差:调用方按自己读到的 ``q`` 算出目标 + ``−18.0°``,棘轮再用**稍晚一点**读到的 ``q=+162.1°`` 去算差值, + ``−180.1°`` 折一圈就成了 ``+179.9°`` —— 方向**翻了个个儿**。 + 于是棘轮朝螺纹的反方向走,接着贴限位、让余量、重试,净位移 0 ⇒ ABORT。 + + 棘轮的转向是**工艺意图**(S08 顺时针拧入、S09 逆时针拧出),不能交给 + "谁更短"这种数值巧合决定,所以由调用方明确给出 ``direction``。 + + 注:``direction=0``(默认)保留旧的"最短路径"语义,给"目标本来就明确 + 在某一侧"的调用方用;棘轮的四个原子步一律显式给方向。 + + :param target_rad: 目标角(绝对值,可以是限位外的角度)。 + :param q_now_rad: 当前关节角。 + :param direction: 想要的转向:``+1`` 正转、``-1`` 反转、``0`` 取最短路径。 + :returns: 增量 [rad]。``direction=0`` 时落在 ``(−π, π]``;给了方向时落在 + ``[0, 2π)``(正转)或 ``(−2π, 0]``(反转)——**一定**沿指定方向, + 且是能落到目标角的最小那一步。**同一个目标、同一个当前位置**只会有一个 + 增量 —— 棘轮的"让余量"与"重试"都按它算,两次不会互相矛盾。 + """ + base = float(target_rad) - float(q_now_rad) + two_pi = 2.0 * math.pi + if direction == 0: + return math.remainder(base, two_pi) + # 先折到 [0, 2π),再按想要的转向取那一侧(与目标角差正好一整圈,是同一个位置)。 + pos = math.fmod(base, two_pi) + if pos < 0.0: + pos += two_pi + if pos >= two_pi - _RATCHET_FULL_TURN_EPS: + pos = 0.0 # 已经(几乎)在目标上:不要为了凑方向白转一整圈 + if direction > 0: + return pos + return pos - two_pi if pos > 0.0 else 0.0 + + + +def drag_verdict( + mid_now: Tuple[float, float], + mid_prev: Optional[Tuple[float, float]], + mid_prev2: Optional[Tuple[float, float]] = None, + *, + tol_m: float = SNAP_DRAG_TOL_M, + hard_m: float = SNAP_DRAG_HARD_M, +) -> Tuple[bool, float]: + """两孔中点是否在两拍之间"整体挪动" → ``(是否判定为被推走, 本拍位移 m)``。 + + **为什么看"中点"而不是看目标孔**:目标孔是**追**的对象,工具一动它就该动 + (对准本意如此),看它分不出"正常对准"和"推着工件走"。而两孔**中点**在 + 对准过程中不该动 —— 它只有工件整体平移时才会动。所以中点位移干净地对应 + "工件被搬动了"。 + + **为什么看"两孔中点"而不是单孔**:单孔在相机里会因分辨率/遮挡抖动,且 + 目标孔本来就在被逼近;中点是两者的平均,噪声更小、语义更明确。 + + :param mid_now: 本拍两孔中点 (x, y)[m](基座系)。 + :param mid_prev: 上一拍中点;``None`` = 还没有上一拍(第一拍不判)。 + :param mid_prev2: 上上拍中点。用来确认"位移是持续的"(单拍可能是误检)。 + :returns: ``(判定, 本拍位移 m)``。 + """ + if mid_prev is None: + return False, 0.0 + dx = float(mid_now[0]) - float(mid_prev[0]) + dy = float(mid_now[1]) - float(mid_prev[1]) + d1 = math.hypot(dx, dy) + if d1 >= float(hard_m): + return True, d1 + if d1 < float(tol_m) or mid_prev2 is None: + return False, d1 + px = float(mid_prev[0]) - float(mid_prev2[0]) + py = float(mid_prev[1]) - float(mid_prev2[1]) + d2 = math.hypot(px, py) + # 第二拍确认:上一拍也挪了(≥ 阈值的一半),且方向一致(点积 > 0)。 + # 为什么允许方向只"大致一致":工件被推着走时前后两拍的推动量本来就不同 + # (工件一让开,工具就少推一点),拿夹角严格相等会漏判。 + if d2 >= float(tol_m) * 0.5 and (dx * px + dy * py) > 0.0: + return True, d1 + return False, d1 + + def descend_needed_m( flange_z_m: float, tool_tip_below_flange_m: float, @@ -555,6 +797,58 @@ def descend_budget_m(needed_m: float) -> float: return max(float(needed_m) * DESCEND_BUDGET_FRAC, DESCEND_BUDGET_FLOOR_M) +#: ``hole_entry_verdict`` 的结论。 +ENTRY_OK = "ok" # 接触深度与几何预期相符 ⇒ 规是从孔里下去的、台肩落面 +ENTRY_HIGH = "high" # 早早就接触 ⇒ 尖端顶在工件**上表面**上,根本没进孔 + +#: 判"没进孔"的下压深度比例阈值。 +#: 实测两个锚点(2026-09-28,仿真): +#: · 正常入孔:下压 28.6mm / 需要 31.9mm ⇒ 0.90 +#: · 顶在平面上:下压 0.90mm / 需要 31.9mm ⇒ 0.03 +#: 两者差着一个台肩高度(30mm),取 0.5 时两侧余量都很大(正常那侧要掉到 +#: 一半才会误判)。**不要**为了"更灵敏"把它往 0.9 推 —— 台肩倒角没完全落面、 +#: 板厚公差都会让正常值在 0.85~0.95 之间晃。 +HOLE_ENTRY_MIN_RATIO: float = 0.5 + + +def hole_entry_verdict( + descended_m: float, + needed_m: float, + *, + min_ratio: float = HOLE_ENTRY_MIN_RATIO, +) -> str: + """S07 判到接触的那一刻:规是**进了孔**、还是**顶在工件上表面**。 + + 为什么需要它(2026-09-28 实测,同一命令三跑里坏一跑:DONE / ABORT / DONE): + 工件在 S08/S09/S10 阶段会被工具推走(仿真里实测被推 20~52mm)。而 k2 的 + 孔位是 **S05 一次性定下**的(``_step_hover_k`` 取 ``_hole_xy``),工件一动 + 它就失效。于是规落在孔**旁边的平面**上,只下压「悬停间隙」那么点就判到接触。 + + 不拦的代价,实测完整发生过一次: + S08 干转 5 轮(切向增量 0.0、法向增量 ±0.0,**一点没进给**)→ 第 6 轮憋住 → + 报出来的是「转轴偏差 7.6° 超过阈值 —— 关节7 轴与工具 Z 不共线, + 先确认工具系是否垂直向下、有没有装转接件」。 + + **那句话会把所有人引到错误方向**:真因既不是工具系也不是转接件,是孔位失效。 + 而且为这句误导,白烧了 5 轮无效拧入(≈30 秒)和一次憋劲(有把规顶掉的风险)。 + + 为什么比 ``needed_m`` 而不是比"尖端离面高度":正常入孔时接触发生在**台肩落面** + 那一刻 ≈ ``needed_m``;顶在平面上时接触发生在**尖端刚碰到面**那一刻,而台肩还在 + 尖端上方 30mm。两者差着一个台肩高度,所以用比例判最稳(见上面两个实测锚点)。 + + 纯函数(R5.1):判错两个方向都贵 —— 把正常的判成"没进孔"会白扔一整个孔; + 把"没进孔"判成正常,就是上面那 30 秒 + 一次误导。 + + ``needed_m <= 0`` 时**不判**(几何本身已经错了,上面那条自检会报), + 返回 ``ENTRY_OK`` 不在这里抢着报第二个错。 + """ + if needed_m <= 0.0: + return ENTRY_OK + if float(descended_m) < float(needed_m) * float(min_ratio): + return ENTRY_HIGH + return ENTRY_OK + + def screw_stop(normal_delta: float, shear_max: float, normal_th: float, shear_th: float) -> bool: """S08:旋转装配的停止判据 —— **切向力>阈值 且 法向力突增**。 @@ -584,6 +878,115 @@ def ratchet_cycles(total_deg: float, step_deg: float) -> int: return int(math.ceil(total_deg / step_deg)) +@dataclass(frozen=True) +class RatchetTravel: + """棘轮步长与关节行程的**可用性核算**(S08 开头自检,别等到第 3 轮才炸)。""" + + ok: bool + step_deg: float # 配置的一步转角 + travel_deg: float # 关节行程(上限 − 下限) + need_deg: float # 一步棘轮真正需要的行程 + max_step_deg: float # 行程允许的最大步长 + why: str # 不 ok 时给人看的说明(ok 时为空串) + + +def ratchet_travel_ok( + step_deg: float, limits_rad: Optional[Tuple[float, float]], margin_deg: float +) -> RatchetTravel: + """一步棘轮 ``step_deg`` 放得进关节行程吗? + + **为什么需要**:2026-09-24 实测,``screw_step_deg=180`` 配 Rizon4 的 + 关节 7(±175°,行程 350°)在第 3 轮 ABORT —— 慢转那一步要转 180°、 + 回转那一步还要 180°,两次加起来 360° > 350°,关节**必然**有一头贴限位; + 更糟的是"让余量"也腾不出地方(要腾就得往反向再让一整步,还是 360°)。 + 日志里那一长串"贴限位 → 让余量 → 还是贴限位"就是这么来的。 + + 判据取 ``2×step + 2×margin ≤ 行程``: + - 2×step:棘轮一个来回(慢转 + 回转)要的行程; + - 2×margin:两头都要留余量 —— 贴死限位再让余量时**一点空间都没有**, + 而实测每轮回转还会比指令少走 4~5°(速度/加减速限制), + 这点亏欠要靠余量吃,否则 7~8 轮后累计偏出限位、再也转不回来。 + + :param limits_rad: ``(lower, upper)`` [rad];``None`` = 拿不到限位,放行 + (返回 ``ok=True``,理由写清楚:真机靠驱动器报 JOINT_LIMIT 兜底)。 + """ + need = 2.0 * float(step_deg) + 2.0 * float(margin_deg) + if limits_rad is None: + return RatchetTravel( + ok=True, step_deg=float(step_deg), travel_deg=float("inf"), + need_deg=need, max_step_deg=float("inf"), + why="", + ) + travel = math.degrees(float(limits_rad[1]) - float(limits_rad[0])) + max_step = 0.5 * (travel - 2.0 * float(margin_deg)) + if need <= travel: + return RatchetTravel( + ok=True, step_deg=float(step_deg), travel_deg=travel, + need_deg=need, max_step_deg=max_step, why="", + ) + # 给个能直接照着改的步长:往整十度取整(现场习惯填 120/150/180), + # 但不许把步长压到 30° 以下 —— 那样拧进/拧出的轮数会多到失控。 + suggest = max(30.0, math.floor(max_step / 10.0) * 10.0) + why = ( + f"棘轮一步 {step_deg:.0f}° 放不进关节 7 的行程:一步棘轮要 " + f"2×{step_deg:.0f}° + 2×{margin_deg:.0f}°(余量) = {need:.0f}°," + f"而行程只有 {travel:.0f}°(上限 {math.degrees(limits_rad[1]):.0f}° − " + f"下限 {math.degrees(limits_rad[0]):.0f}°)。\n" + f" 改法:site.yaml 的 gauge_assembly.screw_step_deg 改到 " + f"{max_step:.0f}° 以内(例如 {suggest:.0f}°),并保证 " + f"screw_max_cycles × screw_step_deg 仍是 **360° 的整数倍**(" + f"累计必须转整数圈,否则规停在螺纹中间、S09 也就少拧出几分之一圈)。" + ) + return RatchetTravel( + ok=False, step_deg=float(step_deg), travel_deg=travel, + need_deg=need, max_step_deg=max_step, why=why, + ) + + +#: ``rotation_verdict`` 的结论。 +ROT_OK = "ok" +ROT_LIMIT = "limit" # 转了一部分、方向对、但没走完 ⇒ 最可能是贴到关节限位 +ROT_AXIS = "axis" # 转轴与工具 Z 不共线 ⇒ 以「度」为单位的一切动作都不成立 +ROT_SHORT = "short" # 其它偏差(方向不对/过冲)⇒ 真有问题,该停 + + +def rotation_verdict( + delta_deg: float, + got_deg: float, + mis_deg: float, + tol_deg: float, +) -> str: + """绕工具 Z 转 ``delta_deg``、实测转 ``got_deg`` 的验收判据。 + + **纯函数**:这条判据 2026-09-24 把整条 S09 判死过一次 + ("期望 +180.0°、实测 +16.4°,偏差过大" → ABORT),而真因只是 + **关节7 的行程被前面的棘轮回转顶到了上限**(±175°,而棘轮一步就要 180°)。 + 判错两个方向都贵: + * 把"贴限位"判成"short" ⇒ 白扔一整轮(还可能把规撞歪); + * 把"真有问题"判成"limit" ⇒ 该停的没停,继续拧。 + + 还有一条**曾经漏判**的:只比绝对值时,"让它 +180、它 -170"会算成 + 10° 误差、落在 10% 容差里 ⇒ 判成功,而实际上一个孔都没拧。所以方向必须比。 + 所以它必须能脱离节点被钉住。 + """ + if abs(got_deg) < 3.0 and abs(delta_deg) > 10.0: + return ROT_LIMIT # 几乎没动:与下面的"只走了一部分"同因不同余量 + if mis_deg > tol_deg: + return ROT_AXIS + if abs(got_deg) >= 3.0 and abs(delta_deg) >= 3.0 and got_deg * delta_deg < 0: + # 方向反了。这条以前**漏判**:老判据只比绝对值 + # (``abs(abs(got) - abs(delta))``),所以"让它 +180、它 -170"会算 10° 误差 + # 落在 10% 容差里 → 判成功,而实际上一个孔都没拧。 + return ROT_SHORT + slack = max(tol_deg, 0.1 * abs(delta_deg)) + short = abs(delta_deg) - abs(got_deg) + if short > slack: + return ROT_LIMIT # 方向对、只是没走完 ⇒ 被硬止点截住 + if short < -slack: + return ROT_SHORT # 过冲:转多了,同样不该当成到位 + return ROT_OK + + def is_joint_limit_error(text: str) -> bool: """S01:把驱动/规划报的字符串认成"撞到关节极限"。 @@ -646,6 +1049,7 @@ EVENT_DOC: Dict[Event, str] = { Event.ALIGN_OUT: "对位超差", Event.CONTACT_OK: "已接触工件面", Event.FORCE_OVER_LIMIT: "力超安全上限", + Event.HOLE_LOST: "孔位失效(规没进孔)", Event.SCREW_DONE: "达到目标圈数", Event.SCREW_STOP: "力判据满足(咬住螺纹)", Event.GAUGE_DROPPED: "通止规掉了", diff --git a/build/arm_application/build/lib/arm_application/gauge_kin.py b/build/arm_application/build/lib/arm_application/gauge_kin.py index d7b7855..b004510 100644 --- a/build/arm_application/build/lib/arm_application/gauge_kin.py +++ b/build/arm_application/build/lib/arm_application/gauge_kin.py @@ -26,6 +26,9 @@ import numpy as np #: 直接拒绝整条轨迹 —— 那不是我们要的"极限角",是报错。 DEFAULT_LIMIT_MARGIN_DEG = 3.0 +#: 厂家 A7。``Robot::SendJointPosition`` 的关节向量按 A1..A7 排列,A7 是最后一轴。 +A7_INDEX = 6 + _JOINT_RE = re.compile(r" Optional[np.ndarray]: + """只把 A7 收到软件限位内侧。前六轴原样拷回,不许在这里改。 + + 厂家接口是 ``Robot::SendJointPosition``(模式 ``NRT_JOINT_POSITION``)。 + 向量按 A1..A7 排,A7 是下标 ``A7_INDEX``。限位是 ``RobotInfo::q_min/q_max`` + 的那一对,真机上与 URDF ``joint7`` 的 lower/upper 是同一组数。 + + ``direction`` 与 ``prewind`` 相同:``+1`` 关节角增大 = 逆时针,目标取上限; + ``-1`` 关节角减小 = 顺时针,目标取下限。现场若发现正负反了,改 + ``site.yaml`` 的 ``extreme_direction``,不要改这里的符号。 + + 没有限位、方向不是 ±1、或者余量把上下限挤没了,返回 None。 + 调用方必须停,不许猜一个角度发出去。 + """ + if direction not in (-1, 1): + raise ValueError(f"方向只能是 +1 / -1,收到 {direction}") + arr = np.asarray(q, dtype=float).reshape(-1) + if arr.size != 7: + raise ValueError(f"A7 目标要 7 个关节角,收到 {arr.size}") + if limits is None: + return None + lo = float(limits[0]) + up = float(limits[1]) + margin = math.radians(float(margin_deg)) + if not math.isfinite(lo) or not math.isfinite(up) or up - lo <= 2.0 * margin: + return None + target = (up - margin) if direction > 0 else (lo + margin) + out = arr.copy() + out[A7_INDEX] = target + return out + + def rotation_about_axis_deg(R_before: np.ndarray, R_after: np.ndarray, axis: np.ndarray) -> float: """从两个旋转矩阵算出"绕 ``axis`` 转了多少度"(带符号)。 diff --git a/build/arm_application/build/lib/arm_application/goto_ee_plane.py b/build/arm_application/build/lib/arm_application/goto_ee_plane.py index 8dd0e3d..c2e1b8c 100644 --- a/build/arm_application/build/lib/arm_application/goto_ee_plane.py +++ b/build/arm_application/build/lib/arm_application/goto_ee_plane.py @@ -39,6 +39,8 @@ from arm_application.site_io import ( joint_prefix_default, ) +from arm_application.ros_node import TolerantNode + def _load_ee_cfg() -> dict: @@ -78,7 +80,7 @@ def _pt(q: np.ndarray, qdot: np.ndarray, t_sec: float) -> JointTrajectoryPoint: return pt -class GotoEePlane(Node): +class GotoEePlane(TolerantNode): def __init__(self, cfg: dict) -> None: super().__init__("goto_ee_plane") self.cfg = cfg diff --git a/build/arm_application/build/lib/arm_application/handeye_calibrate.py b/build/arm_application/build/lib/arm_application/handeye_calibrate.py index 356dcea..e7e827d 100644 --- a/build/arm_application/build/lib/arm_application/handeye_calibrate.py +++ b/build/arm_application/build/lib/arm_application/handeye_calibrate.py @@ -33,8 +33,11 @@ from arm_application.handeye_lib import ( BoardConfig, CameraIntrinsics, ChessboardStabilizer, + T_from_flexiv_tcp, calibrate_hand_eye, + cam_to_flange_via_tool, detect_chessboard, + format_matrix_yaml, format_transform_yaml, is_pose_filled, pose_to_Rt, @@ -50,6 +53,8 @@ from arm_application.site_io import joint_prefix_default from arm_msgs.action import FollowJointTrajectory from arm_msgs.srv import GetArmState +from arm_application.ros_node import TolerantNode + DEFAULT_JOINTS = [ 'joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6', 'joint7', ] @@ -79,7 +84,7 @@ def _camera_info_to_intrinsics(msg: CameraInfo) -> CameraIntrinsics: return CameraIntrinsics(K=K, dist=dist) -class HandeyeCalibrate(Node): +class HandeyeCalibrate(TolerantNode): def __init__(self) -> None: super().__init__('handeye_calibrate') @@ -111,11 +116,10 @@ class HandeyeCalibrate(Node): # 棋盘(可自定义) # 默认值必须与 site.yaml 的 handeye.board_* 及结果文件头里的实际板子一致。 - # 真实使用的板:内角点 8x11,方格 15mm(见 handeye/results/*.yaml 的头部注释)。 - # 这里原先写的是 9x6 / 0.025(另一张早期的板),一旦 site.yaml 漏配就会被 - # 静默启用 —— 症状是"标定能顺利跑完,但结果明显不对",极难排查。 - self.declare_parameter('board_cols', 8) # 内角点 - self.declare_parameter('board_rows', 11) + # 真实使用的板:A5 内角点 11x8,方格 15mm(site.yaml handeye.boards.eye_in_hand)。 + # 这里原先写的是 9x6 / 0.025,后来是 8x11;漏配就会静默用错尺寸。 + self.declare_parameter('board_cols', 11) # 内角点 + self.declare_parameter('board_rows', 8) self.declare_parameter('square_size_m', 0.015) self.declare_parameter('stable_window', 8) @@ -136,6 +140,11 @@ class HandeyeCalibrate(Node): self.declare_parameter('output_dir', '/home/cc/ros2/handeye/tmp') self.declare_parameter('result_file', '') self.declare_parameter('cleanup_images', True) + # 眼在手上:AX=XB 的 gripper 用 Studio 工具 TCP,再折成 cam→法兰写 T_4x4。 + # 空 = 旧口径(ee_pose 当 gripper,T_4x4 原样写出)。配了就必须带 TCP。 + self.declare_parameter('gripper_tool', '') + self.declare_parameter('gripper_tcp_xyz', [0.0, 0.0, 0.0]) + self.declare_parameter('gripper_tcp_qwxyz', [1.0, 0.0, 0.0, 0.0]) prefix = str(self.get_parameter('joint_prefix').value or '') base = list( @@ -150,6 +159,21 @@ class HandeyeCalibrate(Node): self.start_index = max(0, int(self.get_parameter('start_index').value)) self.min_poses = int(self.get_parameter('min_poses').value) self.cleanup_images = bool(self.get_parameter('cleanup_images').value) + self.gripper_tool = str(self.get_parameter('gripper_tool').value or '').strip() + tcp_xyz = list( + self.get_parameter('gripper_tcp_xyz').get_parameter_value().double_array_value + or [0.0, 0.0, 0.0] + ) + tcp_q = list( + self.get_parameter('gripper_tcp_qwxyz').get_parameter_value().double_array_value + or [1.0, 0.0, 0.0, 0.0] + ) + self.T_flange_to_tool = T_from_flexiv_tcp(tcp_xyz[:3], tcp_q[:4]) + if self.gripper_tool and float(np.linalg.norm(self.T_flange_to_tool[:3, 3])) < 1e-4: + raise RuntimeError( + f'gripper_tool={self.gripper_tool!r} 但 gripper_tcp_xyz 几乎是零:' + '等于没把 Studio TCP 传进来。不许按法兰口径假装在用工具系。' + ) self.camera_source = str(self.get_parameter('camera_source').value).strip().lower() self.camera_serial = str(self.get_parameter('camera_serial').value or '').strip() @@ -263,10 +287,12 @@ class HandeyeCalibrate(Node): self.images_dir.mkdir(parents=True, exist_ok=True) eye_to_hand = self.mode == 'eye_to_hand' + grip = self.gripper_tool or '(ee_pose 原样,无工具折算)' self.get_logger().info( f'手眼标定 [{self.mode}] camera_source={self.camera_source}:' f'{len(poses)} 个位姿,棋盘={self.board.cols}x{self.board.rows} ' - f'方格={self.board.square_size}m,v={self.velocity_scale}' + f'方格={self.board.square_size}m,v={self.velocity_scale} ' + f'gripper_tool={grip}' ) self.get_logger().warn('清理工作空间;确认急停就绪。Ctrl+C 可中止。') @@ -366,12 +392,58 @@ class HandeyeCalibrate(Node): self.get_logger().info(f'用 {len(Rg)} 个视角求解手眼标定...') R, t = calibrate_hand_eye(Rg, tg, Rc, tc, eye_to_hand=eye_to_hand) - name = ( - 'T_cam_to_base (eye_to_hand)' - if eye_to_hand - else 'T_cam_to_gripper (eye_in_hand)' - ) - yaml_txt = format_transform_yaml(R, t, name) + extra = '' + if eye_to_hand: + name = 'T_cam_to_base (eye_to_hand)' + yaml_txt = format_transform_yaml(R, t, name) + if self.gripper_tool: + extra = ( + f'gripper_tool: {self.gripper_tool}\n' + + format_matrix_yaml(self.T_flange_to_tool, 'T_flange_to_tool') + ) + self.get_logger().info( + f'gripper={self.gripper_tool}:AX=XB 的手是 TCP;' + f'T_4x4 是 cam→基座,不折 t={t.reshape(3)*1000} mm' + ) + elif self.gripper_tool: + T_cam_tool = np.eye(4) + T_cam_tool[:3, :3] = R + T_cam_tool[:3, 3] = t.reshape(3) + T_cam_flange = cam_to_flange_via_tool(T_cam_tool, self.T_flange_to_tool) + delta = float(np.linalg.norm(T_cam_flange[:3, 3] - T_cam_tool[:3, 3])) + tool_len = float(np.linalg.norm(self.T_flange_to_tool[:3, 3])) + if tool_len > 0.05 and delta < 1e-4: + self.get_logger().error( + 'T_cam_to_flange 与 T_cam_to_tool 平移几乎相同,' + '折算没生效。结果作废。' + ) + return 11 + # 腕部相机在法兰前方(法兰 +Z)。乘反了 Z 会落到 −200 mm 一带。 + if ( + self.T_flange_to_tool[2, 3] > 0.05 + and float(T_cam_flange[2, 3]) < 0.0 + ): + self.get_logger().error( + f'T_cam_to_flange tz={float(T_cam_flange[2, 3])*1000:.1f} mm ' + '在法兰后方,乘序反了。结果作废。' + ) + return 12 + R, t = T_cam_flange[:3, :3], T_cam_flange[:3, 3].reshape(3, 1) + name = 'T_cam_to_flange (eye_in_hand,由工具 TCP 折算)' + yaml_txt = format_transform_yaml(R, t, name) + extra = ( + f'gripper_tool: {self.gripper_tool}\n' + + format_matrix_yaml(self.T_flange_to_tool, 'T_flange_to_tool') + + format_matrix_yaml(T_cam_tool, 'T_cam_to_tool') + ) + self.get_logger().info( + f'gripper={self.gripper_tool}:' + f'T_cam_to_tool t={T_cam_tool[:3, 3]*1000} mm → ' + f'T_cam_to_flange t={T_cam_flange[:3, 3]*1000} mm' + ) + else: + name = 'T_cam_to_gripper (eye_in_hand)' + yaml_txt = format_transform_yaml(R, t, name) header = ( f'# 手眼标定结果\n' f'# mode: {self.mode}\n' @@ -381,8 +453,20 @@ class HandeyeCalibrate(Node): f'# board: {self.board.cols}x{self.board.rows} ' f'square_m={self.board.square_size}\n' ) + if self.gripper_tool and eye_to_hand: + header += ( + f'# gripper_tool: {self.gripper_tool}\n' + f'# T_4x4 = cam→基座(AX=XB 的手是 TCP,不折到法兰)\n' + f'# 旧结果备份在 results/backup/\n' + ) + elif self.gripper_tool: + header += ( + f'# gripper_tool: {self.gripper_tool}\n' + f'# T_4x4 = cam→法兰(AX=XB 在 TCP 上解,再左乘 T_flange_to_tool)\n' + f'# T_cam_to_tool 是原始求解;旧的法兰/tool1 备份在 results/backup/\n' + ) self.result_file.parent.mkdir(parents=True, exist_ok=True) - self.result_file.write_text(header + yaml_txt, encoding='utf-8') + self.result_file.write_text(header + extra + yaml_txt, encoding='utf-8') (self.output_dir / 'captures.json').write_text( json.dumps(meta, indent=2), encoding='utf-8' ) diff --git a/build/arm_application/build/lib/arm_application/handeye_lib.py b/build/arm_application/build/lib/arm_application/handeye_lib.py index 5ce396c..048b358 100644 --- a/build/arm_application/build/lib/arm_application/handeye_lib.py +++ b/build/arm_application/build/lib/arm_application/handeye_lib.py @@ -126,6 +126,39 @@ def Rt_to_T(R: np.ndarray, t: np.ndarray) -> np.ndarray: return T +def cam_to_base_T( + T_handeye: np.ndarray, T_ee: np.ndarray, mode: str +) -> np.ndarray: + """相机系 → 基座系的 4×4。 + + * ``eye_in_hand``:``T_handeye`` 是 cam→法兰,再左乘 ``T_ee``(base→法兰)。 + * ``eye_to_hand``:``T_handeye`` **已经是** cam→基座。再乘 ``T_ee`` 会把 + 固定相机错挂到法兰上 —— 定位总能到附近、永远差一截,看起来像标定不准。 + """ + T_he = np.asarray(T_handeye, dtype=float).reshape(4, 4) + tag = str(mode or "").strip().lower() + if tag == "eye_to_hand": + return T_he + if tag != "eye_in_hand": + raise ValueError( + f"手眼模式只能是 eye_in_hand 或 eye_to_hand,收到 {mode!r}" + ) + return np.asarray(T_ee, dtype=float).reshape(4, 4) @ T_he + + +def cam_point_to_base( + p_cam: np.ndarray, + T_handeye: np.ndarray, + T_ee: np.ndarray, + mode: str, +) -> np.ndarray: + """工件三维点(相机系)→ 基座系 XYZ。""" + T_bc = cam_to_base_T(T_handeye, T_ee, mode) + xyz = np.asarray(p_cam, dtype=float).reshape(3) + ph = np.array([float(xyz[0]), float(xyz[1]), float(xyz[2]), 1.0], dtype=float) + return (T_bc @ ph)[:3] + + def invert_Rt(R: np.ndarray, t: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: Ri = R.T ti = -Ri @ t.reshape(3, 1) @@ -309,6 +342,38 @@ def calibrate_hand_eye( return calibrate_hand_eye_tsai(Rg, tg, R_target2cam, t_target2cam) +def T_from_flexiv_tcp(xyz_m, qwxyz) -> np.ndarray: + """Studio ``tcp_location`` → 法兰→工具 4×4。 + + Flexiv 顺序是 ``[x, y, z, q_w, q_x, q_y, q_z]``,四元数是 wxyz, + 和本仓库其余地方的 xyzw 不一样。只在这里换一次。 + """ + xyz = np.asarray(xyz_m, dtype=float).reshape(3) + q = np.asarray(qwxyz, dtype=float).reshape(7) if np.asarray(qwxyz).size == 7 else np.asarray(qwxyz, dtype=float).reshape(4) + if q.size == 7: + qw, qx, qy, qz = (float(q[3]), float(q[4]), float(q[5]), float(q[6])) + else: + qw, qx, qy, qz = (float(q[0]), float(q[1]), float(q[2]), float(q[3])) + R = quat_xyzw_to_R((qx, qy, qz, qw)) + return Rt_to_T(R, xyz.reshape(3, 1)) + + +def cam_to_flange_via_tool(T_cam_to_tool: np.ndarray, T_flange_to_tool: np.ndarray) -> np.ndarray: + """AX=XB 在工具 TCP 上解出 cam→工具后,再折成 cam→法兰。 + + ``T_flange_to_tool`` 是 Studio TCP:``p_法兰 = T_flange_to_tool · p_工具``。 + OpenCV 的 ``T_cam_to_tool`` 是 ``p_工具 = T_cam_to_tool · p_相机``。 + 所以 ``T_cam_to_flange = T_flange_to_tool · T_cam_to_tool``。 + + 乘反了(``T_cam_to_tool · inv(T_ft)``)旋转看着还像,平移会把相机 + 扔到法兰后方约 30 cm。忘了乘则 ``T_4x4`` 停在 TCP 上,沿工具偏 ~225 mm。 + 两种都不报错。 + """ + T_ct = np.asarray(T_cam_to_tool, dtype=float).reshape(4, 4) + T_ft = np.asarray(T_flange_to_tool, dtype=float).reshape(4, 4) + return T_ft @ T_ct + + def format_transform_yaml(R: np.ndarray, t: np.ndarray, name: str) -> str: T = Rt_to_T(R, t) lines = [ @@ -321,6 +386,14 @@ def format_transform_yaml(R: np.ndarray, t: np.ndarray, name: str) -> str: return '\n'.join(lines) + '\n' +def format_matrix_yaml(T: np.ndarray, key: str) -> str: + arr = np.asarray(T, dtype=float).reshape(4, 4) + lines = [f'{key}:'] + for row in arr: + lines.append(' - [' + ', '.join(f'{v:.8f}' for v in row) + ']') + return '\n'.join(lines) + '\n' + + def is_pose_filled(joints: Sequence[float]) -> bool: """若全为零 / NaN 占位则返回 False。""" arr = np.asarray(joints, dtype=float) diff --git a/build/arm_application/build/lib/arm_application/handeye_teach.py b/build/arm_application/build/lib/arm_application/handeye_teach.py index a2ee476..a78b0fc 100644 --- a/build/arm_application/build/lib/arm_application/handeye_teach.py +++ b/build/arm_application/build/lib/arm_application/handeye_teach.py @@ -37,6 +37,8 @@ import rclpy from rcl_interfaces.msg import ParameterDescriptor from rclpy.node import Node +from arm_application.ros_node import TolerantNode, param_as_str + HELP = """ ================================================ 手眼示教 TEACH:预览 -> 拖拽 -> 拍照+位姿 @@ -94,14 +96,6 @@ def _setup_matplotlib_font(): return chosen -def _param_as_str(node: Node, name: str, default: str = '') -> str: - node.declare_parameter(name, default, ParameterDescriptor(dynamic_typing=True)) - val = node.get_parameter(name).value - if val is None or val == '': - return '' - return str(val).strip() - - class RdkBridge: """通过 rdk_py310 子进程(Python 3.10 ABI)与 Flexiv RDK 通信。""" @@ -128,6 +122,8 @@ class RdkBridge: 'PATH': f'{Path(py).parent}:/usr/bin:/bin', 'LD_LIBRARY_PATH': flexiv_lib, 'LANG': 'C.UTF-8', + 'SITE_PC_IP': os.environ.get('SITE_PC_IP', ''), + 'SITE_NET_IFACE': os.environ.get('SITE_NET_IFACE', ''), } # 不要继承 conda 的 PYTHONPATH。 # 重要:stderr 不能用 PIPE —— RDK 日志会填满管道并让桥接进程死锁 @@ -240,7 +236,7 @@ class RdkBridge: pass -class HandeyeTeach(Node): +class HandeyeTeach(TolerantNode): def __init__(self) -> None: super().__init__('handeye_teach') self.declare_parameter('output_dir', '/home/cc/ros2/handeye/tmp') @@ -250,7 +246,7 @@ class HandeyeTeach(Node): self.declare_parameter('backend', 'ros') # ros | rdk self.declare_parameter('robot_sn', os.environ.get('SITE_ROBOT_SN', '').strip()) self.declare_parameter('drag_primitive', 'FloatingJoint') # or FloatingCartesian - self._serial = _param_as_str(self, 'camera_serial', '') + self._serial = param_as_str(self, 'camera_serial', '') self.declare_parameter('auto_exposure', True) self.declare_parameter('ae_limit_us', 1800.0) self.declare_parameter('emitter_enabled', False) @@ -260,6 +256,9 @@ class HandeyeTeach(Node): # 设了就只是个"提醒":采够时提示可以收工,不强制关窗 —— # 常常采到一半发现某个角度还没覆盖,强制退出反而要重开。 self.declare_parameter('target_points', 0) + # 必须和 run_handeye.sh 的 TAUGHT 是同一个文件。只写 taught_poses.txt、 + # 脚本去读 taught_poses_<模式>.txt,merge 就会「文件在、内容空」。 + self.declare_parameter('poses_file', '') self.backend = str(self.get_parameter('backend').value).strip().lower() self.robot_sn = str(self.get_parameter('robot_sn').value) @@ -267,8 +266,12 @@ class HandeyeTeach(Node): self.output_dir = Path(str(self.get_parameter('output_dir').value)).expanduser() self.images_dir = self.output_dir / 'images' - self.poses_file = self.output_dir / 'taught_poses.txt' + _pf = str(self.get_parameter('poses_file').value).strip() + self.poses_file = ( + Path(_pf).expanduser() if _pf else self.output_dir / 'taught_poses.txt' + ) self.yaml_file = self.output_dir / 'taught_waypoint_positions.yaml' + self._last_capture_t = 0.0 self.images_dir.mkdir(parents=True, exist_ok=True) self._captures: List[dict] = [] @@ -537,6 +540,20 @@ class HandeyeTeach(Node): if q is None: self.get_logger().error('读取关节失败') return + now = time.monotonic() + if now - self._last_capture_t < 0.8: + self.get_logger().warn('按太快,忽略(防 Enter 连发)') + return + if self._captures: + last = self._captures[-1]['joints'] + delta = max(abs(a - b) for a, b in zip(q, last)) + if delta < 0.015: + self.get_logger().warn( + f'关节几乎没动(Δ={delta:.4f} rad),忽略这次拍照。' + '先拖到另一个姿态再按 Enter。' + ) + return + self._last_capture_t = now idx = len(self._captures) stamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S') diff --git a/build/arm_application/build/lib/arm_application/handeye_waypoints.py b/build/arm_application/build/lib/arm_application/handeye_waypoints.py index a0cbaf4..e03d069 100644 --- a/build/arm_application/build/lib/arm_application/handeye_waypoints.py +++ b/build/arm_application/build/lib/arm_application/handeye_waypoints.py @@ -41,6 +41,8 @@ from arm_application.site_io import joint_prefix_default from arm_msgs.action import FollowJointTrajectory from arm_msgs.srv import GetArmState +from arm_application.ros_node import TolerantNode + try: import cv2 except Exception: # noqa: BLE001 @@ -110,7 +112,7 @@ def _image_to_bgr(msg: Image) -> np.ndarray: raise RuntimeError(f'不支持的图像编码:{msg.encoding!r}') -class HandeyeWaypoints(Node): +class HandeyeWaypoints(TolerantNode): def __init__(self) -> None: super().__init__('handeye_waypoints') self.declare_parameter('joint_prefix', joint_prefix_default()) diff --git a/build/arm_application/build/lib/arm_application/hole_detect_hough.py b/build/arm_application/build/lib/arm_application/hole_detect_hough.py index 3bc34e4..e99a025 100644 --- a/build/arm_application/build/lib/arm_application/hole_detect_hough.py +++ b/build/arm_application/build/lib/arm_application/hole_detect_hough.py @@ -134,6 +134,67 @@ def _parse_best_bbox(dets, conf_thr: float) -> tuple[int, int, int, int] | None: return None +def _keypoint_holes( + dets, + *, + conf_thr: float, + min_kconf: float, + radius_px: float, + min_dist_px: float, +): + """pose 模型直接给出的 k1/k2 关键点当孔位。 + + 现场约定(见 ``pose_detector``):k0 跟踪、k1/k2 对孔。 + 返回 ``((k1x,k1y),(k2x,k2y),r,r)``,拿不到可信关键点时返回 None + (不是 pose 模型 / 关键点置信度不够 / 两点几乎重合),调用方回落到找圆。 + + 为什么值得优先用关键点:Hough / 亮环那套是在**孔本身的图像特征**上找圆, + 光照、反光、通止规尖伸进视野都会把圆心拉偏;而关键点是模型在训练分布里 + 直接回归出来的,对这几类干扰天然更稳。 + """ + if not dets: + return None + for det in sorted(dets, key=lambda d: d.conf, reverse=True): + if float(det.conf) < conf_thr: + continue + kpts = getattr(det, "kpts", None) + if kpts is None: + continue + kpts = np.asarray(kpts, dtype=float) + if kpts.ndim != 2 or kpts.shape[0] < 3 or kpts.shape[1] < 3: + continue + k1, k2 = kpts[1].copy(), kpts[2].copy() + if not (np.isfinite(k1[:2]).all() and np.isfinite(k2[:2]).all()): + continue + if float(k1[2]) < min_kconf or float(k2[2]) < min_kconf: + logger.info( + "k1/k2 关键点置信度不足(%.2f / %.2f < %.2f)—— 回落到找圆", + float(k1[2]), + float(k2[2]), + min_kconf, + ) + continue + dist = float(np.hypot(k1[0] - k2[0], k1[1] - k2[1])) + if dist < float(min_dist_px): + logger.info( + "k1/k2 两关键点只差 %.1fpx(< %.1fpx)—— 视为不可信,回落到找圆", + dist, + min_dist_px, + ) + continue + r = float(radius_px) + # **刻意不按图像 x 交换左右**。 + # Hough 路径的 k1/k2 是"画面左孔 / 右孔"(位置定义),但 pose 模型学出来的 + # k1/k2 是**固定语义**(训练时标注的那个物理孔)。工件只要转个角度, + # 位置就会翻面;按 x 强制交换会让 `target_hole=k1` 时左时右地指向两个不同 + # 的物理孔 —— 那是最难查的一类现场问题。 + # 下游怎么认这两个点由 `stage2.k1_label` 决定: + # hole_points[0] = 模型的 k1,hole_points[1] = 模型的 k2, + # 所以 k1_label="left" ↔ k1 就是模型的 k1(见 stage2_locate_node._snap)。 + return (float(k1[0]), float(k1[1])), (float(k2[0]), float(k2[1])), r, r + return None + + def _refine_circle_center( gray: np.ndarray, cx: float, @@ -466,6 +527,35 @@ def detect_holes( gate_block=True, ) + # ---- 首选:pose 模型直接给出 k1/k2 关键点(不必再找圆) ---- + if bool(cfg.get("keypoint_enable", True)): + kp = _keypoint_holes( + dets, + conf_thr=conf, + min_kconf=float(cfg.get("keypoint_min_conf", 0.30)), + radius_px=float(cfg.get("keypoint_hole_radius_px", 12.0)), + min_dist_px=float(cfg.get("keypoint_min_dist_px", 15.0)), + ) + if kp is not None: + (k1, k2, r1, r2) = kp + hole_points = [[float(k1[0]), float(k1[1])], [float(k2[0]), float(k2[1])]] + hole_radii = [float(r1), float(r2)] + dist = float(np.hypot(k1[0] - k2[0], k1[1] - k2[1])) + gate = (max_dx, max_dy) if bool(cfg.get("center_gate_draw", True)) else None + draw_img = _render_success( + image, bbox, hole_points, hole_radii, dist, gate=gate, label=label + ) + return { + "status": True, + "msg": f"pose 关键点 k1/k2,两孔距离 {dist:.1f}px", + "hole_points": hole_points, + "hole_radii": hole_radii, + "bbox": list(bbox), + "label": label, + "source": "keypoint", + "draw_img": draw_img, + } + # ---- 主路径:螺纹嵌件对(亮环签名 + 关于中心孔对称),抗多孔干扰、抗跳变 ---- if bool(cfg.get("insert_pair_enable", True)): gray_full = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) if image.ndim == 3 else image diff --git a/build/arm_application/build/lib/arm_application/hole_detect_node.py b/build/arm_application/build/lib/arm_application/hole_detect_node.py index c34f14c..e8d7f8b 100644 --- a/build/arm_application/build/lib/arm_application/hole_detect_node.py +++ b/build/arm_application/build/lib/arm_application/hole_detect_node.py @@ -25,6 +25,8 @@ from arm_application.site_io import load_site_dict from arm_msgs.msg import HoleDetection as HoleDetectionMsg from arm_msgs.msg import HoleDetections +from arm_application.ros_node import TolerantNode + def _as_bool(val, default: bool = False) -> bool: if val is None: @@ -57,7 +59,7 @@ def _bgr_to_msg(image: np.ndarray, stamp, frame_id: str) -> Image: return msg -class HoleDetectNode(Node): +class HoleDetectNode(TolerantNode): def __init__(self) -> None: super().__init__("hole_detect") self.declare_parameter("camera_source", os.environ.get("SITE_CAM_NAME") or "d405") diff --git a/build/arm_application/build/lib/arm_application/hole_detector.py b/build/arm_application/build/lib/arm_application/hole_detector.py index 148b0e4..8f31781 100644 --- a/build/arm_application/build/lib/arm_application/hole_detector.py +++ b/build/arm_application/build/lib/arm_application/hole_detector.py @@ -21,7 +21,7 @@ DEFAULT_CONFIG = _PKG_SHARE_FALLBACK / "hole_insert.yaml" # 配置齐全时永远走不到这条分支,一旦 site.yaml 缺键就报"模型文件不存在", # 而打印出来的路径看着特别合理,很容易被误判成"文件被人误删了"。 # 改动这个常量时,顺手跑 ``bash scripts/weights.sh doctor`` 确认没有悬空引用。 -_CANONICAL_HOLE_MODEL = "models/hole_insert/detect_best_1.onnx" +_CANONICAL_HOLE_MODEL = "models/yolo/gongjian0929.onnx" @dataclass @@ -143,17 +143,18 @@ class HoleDetector: def _load_yolo(self): if self._detector is not None: return self._detector - from arm_application.yolo_detector import YoloDetector, resolve_weights + from arm_application.yolo_detector import build_detector, resolve_weights weights = resolve_weights( self.model_path, backend=str(self.cfg.get("yolo_backend") or "auto"), ) - self._detector = YoloDetector( + # build_detector 会自己识别 pose 模型(k0/k1/k2),不必在这里分支。 + self._detector = build_detector( weights, - device=str(self.device), conf=float(self.cfg.get("conf", 0.25)), iou=float(self.cfg.get("iou", 0.7)), + device=str(self.device), imgsz=int(self.cfg.get("imgsz", 640)), ) return self._detector diff --git a/build/arm_application/build/lib/arm_application/kalman_filter.py b/build/arm_application/build/lib/arm_application/kalman_filter.py index 2de4e58..eafcbbd 100644 --- a/build/arm_application/build/lib/arm_application/kalman_filter.py +++ b/build/arm_application/build/lib/arm_application/kalman_filter.py @@ -62,6 +62,15 @@ class KalmanFilter3D: self._predict(dt) self._t = t + def zero_velocity(self) -> None: + """把速度状态清零、位置保持不动。 + + 用途:观测疑似假跳变(见 ``feature_jump_guard.FeatureJumpGate``)时本次不 + 采信观测,但**不能**让上一次的速度继续把位置外推出去 —— 否则"不动"会变成 + "按旧速度匀速跑掉",刚好是我们要避免的那件事。 + """ + self.x[3:] = 0.0 + def update(self, z: np.ndarray) -> None: """用一次三维位置观测做量测更新。""" z = np.asarray(z, dtype=float).reshape(3) diff --git a/build/arm_application/build/lib/arm_application/move_to_pose_client.py b/build/arm_application/build/lib/arm_application/move_to_pose_client.py index bd53285..2a55ac5 100644 --- a/build/arm_application/build/lib/arm_application/move_to_pose_client.py +++ b/build/arm_application/build/lib/arm_application/move_to_pose_client.py @@ -15,8 +15,10 @@ from geometry_msgs.msg import PoseStamped from arm_msgs.action import MoveToPose +from arm_application.ros_node import TolerantNode -class MoveToPoseClient(Node): + +class MoveToPoseClient(TolerantNode): def __init__(self) -> None: super().__init__('move_to_pose_client') self._client = ActionClient(self, MoveToPose, 'move_to_pose') diff --git a/build/arm_application/build/lib/arm_application/onnx_workpiece.py b/build/arm_application/build/lib/arm_application/onnx_workpiece.py index 0404d89..f3ae202 100644 --- a/build/arm_application/build/lib/arm_application/onnx_workpiece.py +++ b/build/arm_application/build/lib/arm_application/onnx_workpiece.py @@ -54,6 +54,21 @@ class OnnxWorkpieceDetector: self._iname = inp.name shape = [d if isinstance(d, int) and d > 0 else imgsz for d in inp.shape] self._in_h, self._in_w = int(shape[-2]), int(shape[-1]) + # 只认 ultralytics end2end 检测输出 ``[1, N, 6]``,否则**当场报错**。 + # 为什么必须在这里硬失败:2026-10-08 真机,把一个 ``task=pose`` 的模型 + # (输出 ``[1, 4+nc+3K, 8400]``)从这条分支解出来,得到的是 12 个垃圾框 + # ——conf 直接是坐标值(最高 70.87)、类名 ``class_73``、退化框 ``y1=y2=0``。 + # 而流水线照跑不误,只在二阶段"看不出工件"上体现出来,排查代价极大。 + # 宁可启动就失败(元规则:静默失效是头号敌人)。 + outs = self._sess.get_outputs() + tail = outs[0].shape[-1] if (outs and outs[0].shape) else None + if isinstance(tail, int) and tail != 6: + raise RuntimeError( + f"{path.name} 的检测输出最后一维是 {tail},不是 6 —— 它不是" + " ultralytics end2end 检测模型([1,N,6])。带 k0/k1/k2 关键点的" + " pose 模型必须交给 pose_detector / build_detector,否则坐标会被" + "当成置信度解出垃圾框,而且不会报错。" + ) self.conf = float(conf) self.imgsz = int(imgsz) # 类别名:显式传入 > 旁挂标签文件 > ONNX 内嵌 metadata > 占位符。 diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_app.py b/build/arm_application/build/lib/arm_application/operator_app.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_app.py rename to build/arm_application/build/lib/arm_application/operator_app.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_arm_mesh.py b/build/arm_application/build/lib/arm_application/operator_arm_mesh.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_arm_mesh.py rename to build/arm_application/build/lib/arm_application/operator_arm_mesh.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_arm_state.py b/build/arm_application/build/lib/arm_application/operator_arm_state.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_arm_state.py rename to build/arm_application/build/lib/arm_application/operator_arm_state.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_camera_view.py b/build/arm_application/build/lib/arm_application/operator_camera_view.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_camera_view.py rename to build/arm_application/build/lib/arm_application/operator_camera_view.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_console.py b/build/arm_application/build/lib/arm_application/operator_console.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_console.py rename to build/arm_application/build/lib/arm_application/operator_console.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_gripper_mesh.py b/build/arm_application/build/lib/arm_application/operator_gripper_mesh.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_gripper_mesh.py rename to build/arm_application/build/lib/arm_application/operator_gripper_mesh.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_gripper_state.py b/build/arm_application/build/lib/arm_application/operator_gripper_state.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_gripper_state.py rename to build/arm_application/build/lib/arm_application/operator_gripper_state.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_handeye_board.py b/build/arm_application/build/lib/arm_application/operator_handeye_board.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_handeye_board.py rename to build/arm_application/build/lib/arm_application/operator_handeye_board.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_tactile_view.py b/build/arm_application/build/lib/arm_application/operator_tactile_view.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_tactile_view.py rename to build/arm_application/build/lib/arm_application/operator_tactile_view.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/operator_teach.py b/build/arm_application/build/lib/arm_application/operator_teach.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/operator_teach.py rename to build/arm_application/build/lib/arm_application/operator_teach.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/overhead_oneshot.py b/build/arm_application/build/lib/arm_application/overhead_oneshot.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/overhead_oneshot.py rename to build/arm_application/build/lib/arm_application/overhead_oneshot.py diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/path_profile.py b/build/arm_application/build/lib/arm_application/path_profile.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/path_profile.py rename to build/arm_application/build/lib/arm_application/path_profile.py diff --git a/build/arm_application/build/lib/arm_application/perception_node.py b/build/arm_application/build/lib/arm_application/perception_node.py index 01772f6..21510b1 100644 --- a/build/arm_application/build/lib/arm_application/perception_node.py +++ b/build/arm_application/build/lib/arm_application/perception_node.py @@ -15,6 +15,7 @@ from __future__ import annotations import os import threading import time +from pathlib import Path from typing import Optional import numpy as np @@ -30,24 +31,54 @@ from rclpy.qos import ( qos_profile_sensor_data, ) from sensor_msgs.msg import CameraInfo, Image -from std_msgs.msg import Float32MultiArray +from std_msgs.msg import Bool, Float32, Float32MultiArray from tf2_ros import TransformBroadcaster from arm_application.box_tracker import BoxTracker +from arm_application.feature_guard import ( + FarReacquireConfirm, + TrackSlewGuard, + kpt_plausible, +) +from arm_application.geom_ik import load_handeye_T from arm_application.handeye_realsense import ( is_realsense_source, resolve_realsense_topics, ) +from arm_application.overhead_oneshot import ( + D405_MISS_BEFORE_D435_S, + ONESHOT_ACCEPT_TIMEOUT_S, + best_det_conf, + depth_raw_to_m, + oneshot_k0_base, + oneshot_shot_timed_out, + oneshot_should_submit, + select_oneshot_det, + wrist_needs_handoff, + z_locked_qos, +) from arm_application.kalman_filter import KalmanFilter3D -from arm_application.plane_feature import geometric_center_on_plane, workpiece_xyz_in_box +from arm_application.plane_feature import ( + PlaneFeature, + geometric_center_on_plane, + workpiece_xyz_in_box, +) +from arm_application.pose_detector import TRACK_KPT_INDEX from arm_application.yolo_detector import ( INFER_BUSY, YoloDetector, YoloInferProcess, + build_detector, pick_best, resolve_weights, ) +from arm_application.ros_node import TolerantNode + +# D435 一次性推理用的 seq。必须远离腕部帧序号,结果绝不能当 D405 检测去立体匹配。 +_ONESHOT_SEQ = 2_000_000_000 +_ONESHOT_VIZ_SEQ = 2_000_000_001 + def _bgr_copy(msg: Image) -> np.ndarray: """返回调用方持有的 BGR uint8 数组(对异步 YOLO 安全;ROS 可能把原消息丢掉)。""" @@ -61,7 +92,7 @@ def _bgr_copy(msg: Image) -> np.ndarray: raise RuntimeError(f"不支持的编码 {msg.encoding!r}") -class PerceptionNode(Node): +class PerceptionNode(TolerantNode): def __init__(self) -> None: super().__init__("perception_node") tid = threading.get_ident() @@ -74,17 +105,33 @@ class PerceptionNode(Node): self.declare_parameter("image_topic", "") self.declare_parameter("camera_info_topic", "") self.declare_parameter("depth_topic", "/d405/aligned_depth_to_color/image_raw") - self.declare_parameter("weights", "/home/cc/ros2/models/yolo/detect_best_0.onnx") + self.declare_parameter("weights", "/home/cc/ros2/models/yolo/gongjian0929.onnx") self.declare_parameter("conf", 0.10) self.declare_parameter("iou", 0.45) self.declare_parameter("imgsz", 640) self.declare_parameter("device", "0") self.declare_parameter("min_conf", 0.12) + # 重新捕获门槛(跳到新位置必须达到的置信度)。为什么必须比 min_conf 高得多: + # 真机实测假框 conf 0.13~0.47,而真 k0 是 0.87(推导见 site.yaml 同名字段)。 + # 旧写法把它接成 min_conf ⇒ 0.15 的远框被原样采信、kf.reset() 直接跳过去。 + self.declare_parameter("reacquire_conf", 0.55) + # ---- 跟踪点可信性的三道守卫(实现与推导见 feature_guard.py)---- + # 2026-10-08 真机:真 k0(conf 0.87)被一串**高置信度假 k0**(conf 0.53~0.73) + # 顶掉,1s 内把臂从 home 带到工作盒角落,之后 148s 全是"检测漏检"。 + # 假 k0 挡不住的地方:置信度没有可分区间;它们**贴在画面边上**、**借深度**。 + self.declare_parameter("keypoint_border_px", 6.0) + self.declare_parameter("track_max_step_m", 0.04) + self.declare_parameter("reacquire_far_px", 120.0) + self.declare_parameter("reacquire_confirm_frames", 3) self.declare_parameter("vision_hz", 30.0) self.declare_parameter("z_ref_m", 0.40) self.declare_parameter("jump_px", 280.0) self.declare_parameter("jump_z_m", 0.20) self.declare_parameter("min_depth_m", 0.04) + # 特征点的**相机量程下限**:比这更近的深度读数一定来自机械臂自身(爪上夹的 + # 通止规 / 相机座),不是工件。判据是实测两条带(见 site.yaml 同名字段的推导): + # 随臂一起动的近带 0.078~0.087m,工件面 0.19~0.29m ⇒ 取 0.14。 + self.declare_parameter("feature_min_range_m", 0.14) self.declare_parameter("max_depth_m", 0.55) self.declare_parameter("work_z_max_m", 0.50) # 高于此值 = 孔 / 背景 self.declare_parameter("object_frame", "tracked_object") @@ -110,16 +157,42 @@ class PerceptionNode(Node): self.declare_parameter("hold_point_on_miss", True) self.declare_parameter("miss_hold_point_frames", 2) # plane = 立体表面质心(推荐);box = YOLO 检测框中心 + # keypoint = pose 模型的 k0 关键点(跟踪孔);见 pose_detector self.declare_parameter("feature_mode", "plane") + self.declare_parameter("keypoint_index", TRACK_KPT_INDEX) + self.declare_parameter("keypoint_min_conf", 0.30) + self.declare_parameter("keypoint_win_px", 6) self.declare_parameter("plane_inlier_m", 0.008) self.declare_parameter("plane_band_m", 0.06) + # ---- D405 主跟踪 + D435 一次性(键必须从 site 接入,缺了启动即红)---- + self.declare_parameter("wrist_handoff_conf", -1.0) + self.declare_parameter("overhead_oneshot_enable", False) + self.declare_parameter("d435_move_only", False) + self.declare_parameter("overhead_min_depth_m", -1.0) + self.declare_parameter("overhead_max_depth_m", -1.0) + self.declare_parameter("overhead_oneshot_conf", -1.0) + self.declare_parameter("overhead_cooldown_s", -1.0) + self.declare_parameter("overhead_frame_max_age_s", -1.0) + self.declare_parameter("overhead_handeye_file", "") + self.declare_parameter("overhead_camera_source", "") + self.declare_parameter("overhead_camera_frame", "") + self.declare_parameter("overhead_image_topic", "") + self.declare_parameter("overhead_info_topic", "") + self.declare_parameter("overhead_depth_topic", "") + self.declare_parameter("base_frame", "") self.z_ref = float(self.get_parameter("z_ref_m").value) self.min_conf = float(self.get_parameter("min_conf").value) + self.reacquire_conf = float(self.get_parameter("reacquire_conf").value) self.jump_px = float(self.get_parameter("jump_px").value) self.jump_z_m = float(self.get_parameter("jump_z_m").value) self.min_depth = float(self.get_parameter("min_depth_m").value) self.max_depth = float(self.get_parameter("max_depth_m").value) + # 特征点量程下限 = max(解码量程下限, 工具几何下限):两者取严,不许被调松到 + # 比 min_depth 还小(那会让"工具自己"重新变成合法目标)。 + self.feature_min_range = max( + self.min_depth, float(self.get_parameter("feature_min_range_m").value) + ) self.work_z_max = float(self.get_parameter("work_z_max_m").value) self.hold_point_on_miss = bool(self.get_parameter("hold_point_on_miss").value) self.object_frame = str(self.get_parameter("object_frame").value) @@ -138,13 +211,96 @@ class PerceptionNode(Node): 1, int(self.get_parameter("miss_hold_point_frames").value) ) self.feature_mode = str(self.get_parameter("feature_mode").value or "plane").strip().lower() + self.keypoint_index = max(0, int(self.get_parameter("keypoint_index").value)) + self.keypoint_min_conf = float(self.get_parameter("keypoint_min_conf").value) + self.keypoint_win_px = max(1, int(self.get_parameter("keypoint_win_px").value)) + # 跟踪点三道守卫(单一实现见 feature_guard.py) + self.keypoint_border_px = float(self.get_parameter("keypoint_border_px").value) + self.track_max_step_m = float(self.get_parameter("track_max_step_m").value) + self.reacquire_far_px = float(self.get_parameter("reacquire_far_px").value) + self._slew = TrackSlewGuard(self.track_max_step_m) + self._far = FarReacquireConfirm( + self.reacquire_far_px, + int(self.get_parameter("reacquire_confirm_frames").value), + ) self.plane_inlier_m = float(self.get_parameter("plane_inlier_m").value) self.plane_band_m = float(self.get_parameter("plane_band_m").value) + self.overhead_oneshot_enable = bool( + self.get_parameter("overhead_oneshot_enable").value + ) + self.d435_move_only = bool(self.get_parameter("d435_move_only").value) + self._T_oh: Optional[np.ndarray] = None + self._oh_image: Optional[Image] = None + self._oh_depth: Optional[Image] = None + self._oh_image_mono = -1.0 + self._oh_depth_mono = -1.0 + self._oh_fx = self._oh_fy = self._oh_cx = self._oh_cy = 0.0 + self._oh_frame = "" + self._oneshot_t = -1.0e9 + self._need_oneshot = False + self._oneshot_inflight = False + self._oneshot_shot = False + self._oneshot_shot_t = -1.0e9 + self._low_since: Optional[float] = None + self._d435_commanding = False + self._z_locked = False + self._oneshot_img: Optional[Image] = None + self._oneshot_depth: Optional[Image] = None + self._oneshot_viz_only = False + self._oh_viz_t = -1.0e9 + if self.overhead_oneshot_enable: + self.wrist_handoff_conf = float( + self.get_parameter("wrist_handoff_conf").value + ) + if self.wrist_handoff_conf < 0.0: + raise RuntimeError( + "overhead_oneshot_enable 时 wrist_handoff_conf 必须由 site.yaml 接入," + "收到哨兵 -1 —— 配置没接线。" + ) + self.overhead_min_depth = float( + self.get_parameter("overhead_min_depth_m").value + ) + self.overhead_max_depth = float( + self.get_parameter("overhead_max_depth_m").value + ) + self.overhead_oneshot_conf = float( + self.get_parameter("overhead_oneshot_conf").value + ) + self.overhead_cooldown_s = float( + self.get_parameter("overhead_cooldown_s").value + ) + self.overhead_frame_max_age_s = float( + self.get_parameter("overhead_frame_max_age_s").value + ) + if min( + self.overhead_min_depth, + self.overhead_max_depth, + self.overhead_oneshot_conf, + self.overhead_cooldown_s, + self.overhead_frame_max_age_s, + ) < 0.0: + raise RuntimeError( + "D435 一次性参数仍是哨兵 -1 —— site.yaml 的 perception.overhead 没接到节点。" + ) + oh_file = str(self.get_parameter("overhead_handeye_file").value or "") + if not Path(oh_file).is_file(): + raise RuntimeError( + f"D435 一次性定位缺眼在手外结果:{oh_file}。" + "先跑 bash ~/ros2/scripts/run_handeye.sh --arm 89 --mode eye_to_hand calibrate" + ) + self._T_oh = load_handeye_T(oh_file) + self._oh_frame = str( + self.get_parameter("overhead_camera_frame").value or "" + ) self._fx = self._fy = self._cx = self._cy = 0.0 self._latest_image: Optional[Image] = None self._latest_depth: Optional[Image] = None self._last_uv: Optional[np.ndarray] = None + # k0 相对工件检测框的**归一化偏移**(相对框中心、除以框宽高)。k0 掉信时 + # 用它在框上重建 k0 —— 只借"偏移"不借"绝对位置",跟踪点就不会横移一大截 + #(见 `_keypoint_feature` 的真机反例)。 + self._kpt_box_frac: Optional[np.ndarray] = None self._last_good_z: Optional[float] = None self._last_plane_xyz: Optional[np.ndarray] = None self._last_filt: Optional[np.ndarray] = None @@ -201,14 +357,16 @@ class PerceptionNode(Node): f"YOLO worker pid={self._yolo_proc._p.pid} weights={self._yolo_proc.weights_path}" ) else: - self.detector = YoloDetector( + self.detector = build_detector( weights, + backend=self.backend_name, conf=float(yolo_cfg["conf"]), iou=float(yolo_cfg["iou"]), device=str(yolo_cfg["device"]), imgsz=int(yolo_cfg["imgsz"]), ) - if self._yolo_half: + # PoseDetector 自己管 GPU 张量,没有 ultralytics 的 _model 可挪。 + if self._yolo_half and hasattr(self.detector, "_model"): try: import torch @@ -218,6 +376,8 @@ class PerceptionNode(Node): self._yolo_half = False except Exception: # noqa: BLE001 self._yolo_half = False + elif self._yolo_half: + self._yolo_half = False try: self.detector.warmup(half=self._yolo_half) except Exception as exc: # noqa: BLE001 @@ -274,6 +434,52 @@ class PerceptionNode(Node): self.create_subscription( Image, depth_topic, self._on_depth, image_qos, callback_group=self._io_cbg ) + self.base_frame = str(self.get_parameter("base_frame").value or "").strip() + if self.overhead_oneshot_enable: + oh_img = str(self.get_parameter("overhead_image_topic").value or "").strip() + oh_info = str(self.get_parameter("overhead_info_topic").value or "").strip() + oh_dep = str(self.get_parameter("overhead_depth_topic").value or "").strip() + if not oh_img or not oh_dep: + raise RuntimeError( + "overhead_oneshot_enable 但 overhead_image_topic / " + "overhead_depth_topic 为空 —— 配置没接线。" + ) + self.create_subscription( + Image, oh_img, self._on_oh_image, image_qos, + callback_group=self._io_cbg, + ) + self.create_subscription( + Image, oh_dep, self._on_oh_depth, image_qos, + callback_group=self._io_cbg, + ) + if oh_info: + self.create_subscription( + CameraInfo, oh_info, self._on_oh_info, image_qos, + callback_group=self._io_cbg, + ) + self.create_subscription( + Bool, "visual_servo/z_locked", self._on_z_locked, z_locked_qos(), + callback_group=self._io_cbg, + ) + self.create_subscription( + Bool, + "visual_servo/d435_commanding", + self._on_d435_commanding, + z_locked_qos(), + callback_group=self._io_cbg, + ) + extra = ( + ";d435_move_only:不等 D405 丢目标,0.5s 后必拍一张" + if self.d435_move_only + else "" + ) + self.get_logger().info( + f"D435 待命 image={oh_img} depth={oh_dep} " + f"handoff_conf={self.wrist_handoff_conf:.2f} " + f"看不到满 {D405_MISS_BEFORE_D435_S:.1f}s 才拍一张 " + f"T={self.get_parameter('overhead_handeye_file').value}" + f"{extra}" + ) point_qos = QoSProfile( history=HistoryPolicy.KEEP_LAST, @@ -283,6 +489,12 @@ class PerceptionNode(Node): self._point_pub = self.create_publisher( PointStamped, "visual_servo/filtered_point", point_qos ) + self._wrist_conf_pub = self.create_publisher( + Float32, "visual_servo/wrist_conf", 5 + ) + self._overhead_k0_pub = self.create_publisher( + PointStamped, "visual_servo/overhead_k0", point_qos + ) # RELIABLE + keep_last(5):相机预览能容忍短暂的 DDS 丢包间隙 det_qos = QoSProfile( history=HistoryPolicy.KEEP_LAST, @@ -290,6 +502,10 @@ class PerceptionNode(Node): reliability=ReliabilityPolicy.RELIABLE, ) self._det_pub = self.create_publisher(Float32MultiArray, "workpiece/detection", det_qos) + # 顶视框单独话题:像素是 D435 的,不能叠到 D405 窗上。 + self._oh_det_pub = self.create_publisher( + Float32MultiArray, "workpiece/detection_overhead", det_qos + ) self._tf_br = TransformBroadcaster(self) vision_hz = max(5.0, min(40.0, float(self.get_parameter("vision_hz").value))) @@ -343,6 +559,22 @@ class PerceptionNode(Node): def _on_depth(self, msg: Image) -> None: self._latest_depth = msg + def _on_oh_image(self, msg: Image) -> None: + self._oh_image = msg + self._oh_image_mono = time.monotonic() + + def _on_oh_depth(self, msg: Image) -> None: + self._oh_depth = msg + self._oh_depth_mono = time.monotonic() + + def _on_oh_info(self, msg: CameraInfo) -> None: + self._oh_fx = float(msg.k[0]) + self._oh_fy = float(msg.k[4]) + self._oh_cx = float(msg.k[2]) + self._oh_cy = float(msg.k[5]) + if msg.header.frame_id: + self._oh_frame = str(msg.header.frame_id) + def _wake_infer(self) -> None: if self._latest_image is None: return @@ -375,6 +607,8 @@ class PerceptionNode(Node): try: self.detector.restart() self._submitted_seq = -1 + self._oneshot_inflight = False + self._oneshot_viz_only = False self._last_gpu_t = time.monotonic() self.get_logger().info("YOLO 工作进程已重启") except Exception as exc: # noqa: BLE001 @@ -387,7 +621,9 @@ class PerceptionNode(Node): 我们还会**先**提交再去等,这样下一次推理已经排进队列了。 """ while not self._stop.is_set(): - self._submit_latest() + # 一次性占用 GPU 时不要再塞 D405,否则两帧挤一条队列,结果会对错图。 + if not self._oneshot_inflight: + self._submit_latest() try: got = self.detector.wait_result(timeout=0.030) except Exception as exc: # noqa: BLE001 @@ -405,8 +641,9 @@ class PerceptionNode(Node): f"(worker={'存活' if getattr(self.detector, 'alive', True) else '已死'})", throttle_duration_sec=1.0, ) - outstanding = self._submitted_seq > self._done_seq + outstanding = self._submitted_seq > self._done_seq or self._oneshot_inflight if outstanding and self._last_gpu_t is not None and silent > 2.0: + self._oneshot_inflight = False self._restart_yolo(f"卡死 {silent:.1f}s") continue if ( @@ -422,6 +659,21 @@ class PerceptionNode(Node): seq, dets, gpu_ms = got if dets is INFER_BUSY: continue + if int(seq) >= _ONESHOT_SEQ: + try: + self._finish_overhead_oneshot( + dets, + float(self._infer_meta.get(int(seq), 1.0)), + viz_only=bool(int(seq) == _ONESHOT_VIZ_SEQ), + ) + except Exception as exc: # noqa: BLE001 + self.get_logger().error( + f"D435 一次性结果处理失败:{exc}", throttle_duration_sec=2.0 + ) + self._oneshot_inflight = False + self._oneshot_viz_only = False + self._oneshot_t = time.monotonic() + continue scale = float(self._infer_meta.get(int(seq), 1.0)) t_img = float(self._frame_t.get(int(seq), time.monotonic())) t0 = time.monotonic() @@ -430,7 +682,12 @@ class PerceptionNode(Node): except Exception as exc: # noqa: BLE001 self.get_logger().error(f"应用检测结果出错:{exc}", throttle_duration_sec=2.0) self._done_seq = int(seq) - self._submit_latest() + if self._need_oneshot and not self._oneshot_inflight: + self._submit_overhead_oneshot(viz_only=False) + elif self._should_submit_overhead_viz() and not self._oneshot_inflight: + self._submit_overhead_oneshot(viz_only=True) + else: + self._submit_latest() dt_ms = (time.monotonic() - t0) * 1000.0 lag_ms = (time.monotonic() - t_img) * 1000.0 self.get_logger().info( @@ -488,7 +745,7 @@ class PerceptionNode(Node): else: meters = roi scale = 1.0 - vals = meters[np.isfinite(meters) & (meters > self.min_depth) & (meters < self.max_depth)] + vals = meters[np.isfinite(meters) & (meters > self.feature_min_range) & (meters < self.max_depth)] if vals.size < 8: # 内部 ROI 经常落在孔上;改用整个检测框重试。 y0 = int(np.clip(y1, 0, h - 1)) @@ -504,7 +761,7 @@ class PerceptionNode(Node): meters2 = pos2 * scale else: meters2 = roi2 - vals = meters2[np.isfinite(meters2) & (meters2 > self.min_depth) & (meters2 < self.max_depth)] + vals = meters2[np.isfinite(meters2) & (meters2 > self.feature_min_range) & (meters2 < self.max_depth)] if vals.size < 8: med_m = float(np.median(meters)) if meters.size else 0.0 return None, f"ok={vals.size} scale={scale} med={med_m:.3f}" @@ -632,9 +889,16 @@ class PerceptionNode(Node): self._box_ema = None self._last_raw_xyxy = None self._last_uv = None + self._kpt_box_frac = None self._last_filt = None self._last_plane_xyz = None self._box_trk.reset() + # 两道有状态守卫跟着"真正丢目标"一起冷启动。**只在长丢时清**,不在单帧 + # 漏检时清:单帧漏检极常见(真机日志里几乎每隔一两帧就一次),每漏一帧 + # 就把锚点清空,会让下一帧的任何观测都变成"首次观测"而被 TrackSlewGuard + # 无条件放行 —— 借深度的假点于是每次都能重新锚定,守卫形同虚设。 + self._slew.reset() + self._far.reset() self._last_yolo_t = None self._publish_detection_clear() @@ -643,6 +907,56 @@ class PerceptionNode(Node): if scale != 1.0: for d in dets: d.xyxy = d.xyxy * scale + best_conf = best_det_conf(dets) + self._publish_wrist_conf(best_conf) + handoff = bool( + self.overhead_oneshot_enable + and ( + self.d435_move_only + or wrist_needs_handoff(best_conf, self.wrist_handoff_conf) + ) + ) + now_m = time.monotonic() + if self._d435_commanding: + # 臂还在赶 D435 那个点。漏检计时清掉,走到并停稳之后再重新计。 + self._low_since = None + self._need_oneshot = False + elif not handoff: + self._low_since = None + self._oneshot_shot = False + self._need_oneshot = False + else: + if oneshot_shot_timed_out( + shot=self._oneshot_shot, + commanding=self._d435_commanding, + age_s=now_m - float(self._oneshot_shot_t), + timeout_s=ONESHOT_ACCEPT_TIMEOUT_S, + ): + self.get_logger().warn( + "D435 拍了但伺服没接住(工作盒拒收等),允许再拍" + ) + self._oneshot_shot = False + self._low_since = None + if self._low_since is None: + self._low_since = now_m + low_for = now_m - self._low_since + self._need_oneshot = oneshot_should_submit( + handoff=True, + low_for_s=low_for, + already_shot=self._oneshot_shot, + wait_s=D405_MISS_BEFORE_D435_S, + ) + if self._oneshot_shot: + self.get_logger().info( + "D435 这一轮已经拍过一张,等这一段走完,不再连拍", + throttle_duration_sec=2.0, + ) + elif not self._need_oneshot: + self.get_logger().info( + f"D405 已连续 {low_for:.2f}s 没有高置信度目标," + f"未满 {D405_MISS_BEFORE_D435_S:.1f}s,D435 继续待命", + throttle_duration_sec=0.5, + ) now = time.monotonic() pred_at_img = self._box_trk.predict(t_img, self._img_wh()) with self._lock: @@ -654,12 +968,16 @@ class PerceptionNode(Node): prev_uv=prev_uv, prev_xyxy=prev_xyxy, max_track_px=max(400.0, self.jump_px), - reacquire_conf=self.min_conf, + reacquire_conf=self.reacquire_conf, min_conf=self.min_conf, lock_iou=0.05, ) if best is None: self._miss_count += 1 + # 单帧漏检**不清**守卫锚点(见 _clear_track 的注释):真机 2026-10-08 + # 漏检几乎每帧都有,一漏就 reset ⇒ 每帧都当"首次观测" ⇒ 借深度的假 k0 + # 次次都能重新锚定。真正丢目标由下面的 miss_clear_frames 长丢分支 + # 走 _clear_track(连丢 miss_clear_frames 帧才冷启动)。 if self._miss_count >= self.miss_clear_frames: self._clear_track() self._last_yolo_t = None @@ -674,6 +992,7 @@ class PerceptionNode(Node): if ( self.hold_point_on_miss and self._miss_count <= self.miss_hold_point_frames + and not handoff ): self._republish_held_point() return @@ -706,12 +1025,26 @@ class PerceptionNode(Node): # 悬停目标 = 检测框内工件表面的立体三维点(不是穿过孔 / 桌面的射线, # 也不是 z_ref)。红点 = 该三维点。 + # 混合流程交回 D405 之后追工件框的矩形中心,不追 k0。 + # YOLO-pose 照常跑(框和关键点都在),只是跟踪点取框心。 + # 对小孔关键点在二阶段,那里不用深度图。 + track_box = self.overhead_oneshot_enable and not self.d435_move_only feat = None p_cam: Optional[np.ndarray] = None - note = "box" + note = "框心" if track_box else "box" z_meas = None uv = box_uv - if self.feature_mode != "box": + # 本帧的深度是不是**借**来的(见 PlaneFeature.borrowed)—— 给"每帧位移上限" + # 守卫用:借来的深度意味着该像素读不到自己的深度,绝对位置不足以重定位。 + borrowed = False + if track_box: + feat = None + elif self.feature_mode == "keypoint": + feat = self._keypoint_feature(best) + # k0 掉信时 `_keypoint_feature` 会**按 k0 相对框的偏移**在框上重建跟踪点 + # (位置连续、不横移)。只有冷启动、连一次可信 k0 都没见过时才返回 None, + # 此时才退到"框内深度 + 框中心"。 + elif self.feature_mode != "box": feat = self._workpiece_xyz(xyxy) if feat is None: feat = self._plane_center(xyxy) @@ -720,9 +1053,10 @@ class PerceptionNode(Node): uv = np.asarray(feat.uv, dtype=float).reshape(2) z_meas = float(p_cam[2]) note = feat.note + borrowed = bool(getattr(feat, "borrowed", False)) else: z_meas, note = self._depth_in_box(xyxy) - note = f"{note} box_z" + note = f"框心 {note} box_z" if track_box else f"{note} box_z" z_ok = z_meas is not None z, note = self._metric_z(z_meas, note) if z is None: @@ -744,6 +1078,24 @@ class PerceptionNode(Node): self._publish_detection_box(xyxy, float(best.conf), float(best.cls_id), uv, float(z)) + # ---- 守卫二:跟踪点的**每帧位移上限** ---- + # 工件不动、相机 30Hz,真实观测一帧走不了 4cm(实测真实运动 ≤15mm/帧)。 + # 观测可信 ⇒ 夹到上限限速跟随(不丢目标);观测是**借深度**的 ⇒ 超上限整帧 + # 不采信(2026-10-08 真机,假 k0 带着借来的深度、z 看着很合理,1s 把臂带走 + # 400mm)。判不采信时**不发跟踪点**,让伺服按"目标丢失"处理(原地不动)。 + step, why_step = self._slew.update( + np.asarray(p_cam, dtype=float).reshape(3)[:2], borrowed=borrowed + ) + if step is None: + self.get_logger().warn( + f"跟踪点判误检,本帧不发点({why_step})" + f" uv=({uv[0]:.0f},{uv[1]:.0f}) conf={best.conf:.2f}", + throttle_duration_sec=0.5, + ) + return + p_cam = np.asarray(p_cam, dtype=float).reshape(3).copy() + p_cam[0], p_cam[1] = float(step[0]), float(step[1]) + with self._lock: self.kf.advance(now) if self.kf.initialized: @@ -751,6 +1103,21 @@ class PerceptionNode(Node): dpx = float(np.linalg.norm(box_uv - self._cam_to_pixel(pred))) dz = abs(float(p_cam[2] - pred[2])) if z_ok else 0.0 if dpx > self.jump_px or (z_ok and dz > self.jump_z_m): + # ---- 守卫三:远框"重新捕获"要多帧确认 ---- + # 一帧的远框更可能是模型在别的东西上误报,而不是工件真被挪走了 + #(真机那串假框的 dpx 是 480/418/207,而且每帧换个地方)。 + ok_far, why_far = self._far.allow( + None if self.feature_mode != "keypoint" else tuple(uv), + dpx, + near_px=self.reacquire_far_px, + ) + if not ok_far: + self.get_logger().warn( + f"重新捕获未确认({why_far})conf={best.conf:.2f} —— " + "本帧不发点,不追这一帧的新位置", + throttle_duration_sec=0.5, + ) + return self.kf.reset(p_cam, now) self.get_logger().info( f"重新捕获 conf={best.conf:.2f} dpx={dpx:.0f}", @@ -772,9 +1139,12 @@ class PerceptionNode(Node): filt[2] = z_use self._last_filt = filt.copy() + if handoff or self._d435_commanding: + # 没有高置信度,或 D435 厂家移动还没交接:推理留着,控制点不许发。 + return self._publish_point(filt, stamp) self.get_logger().info( - f"跟踪 {self.feature_mode} conf={best.conf:.2f} uv=({uv[0]:.0f},{uv[1]:.0f}) " + f"跟踪 {'框心' if track_box else self.feature_mode} conf={best.conf:.2f} uv=({uv[0]:.0f},{uv[1]:.0f}) " f"z={filt[2]:.3f} z_ok={int(z_ok)} {note}", throttle_duration_sec=0.4, ) @@ -789,6 +1159,191 @@ class PerceptionNode(Node): return True return age < 0.25 + def _keypoint_feature(self, det): + """用 pose 模型的 ``keypoint_index``(默认 k0)当跟踪点。 + + 约定:k0 是跟踪孔,k1/k2 是对孔(见 ``pose_detector``)。 + 返回 ``PlaneFeature``,坐标系 / 语义和 plane 模式完全一致 —— 下游 + (卡尔曼、visual_servo)不需要知道这是关键点。 + + k0 掉信(置信度低 / 该处没深度)时**不许把跟踪点横移到框中心** —— + 那是另一个点,会瞬间平移一大截。正确做法是用 k0 相对工件框的**归一化偏移** + 在框上重建 k0:位置连续,工件动时还能跟着动。 + + 真机反例(2026-10-08,一阶段跑 150s 没锁上,arm 89): + + 0659.551 死区保持 |e_xy|=3.0mm ← 其实已经锁定(误差 3mm) + 0659.598 k0 置信度 0.01 < 0.30,本帧不用它 + 0659.604 feat_base=(0.675,-0.099) ← 兜底切到框中心,跟踪点横移 89mm + 0660.121 v=(-0.206,+0.400) ← 伺服以 0.45m/s 去追这个假点 + 0660.561 过期保持 —— 不跟踪冻结的检测框 ← 画面糊掉,彻底丢失 + + 只有在"连一次可信的 k0 都没见过"(``_kpt_box_frac`` 为空)时才返回 None, + 交给调用方回落到框中心 —— 那是冷启动,没有更好的信息可用。 + """ + kpts = getattr(det, "kpts", None) + if kpts is None: + return None + kpts = np.asarray(kpts, dtype=float) + if kpts.ndim != 2 or kpts.shape[0] <= self.keypoint_index or kpts.shape[1] < 3: + return None + u, v, kc = (float(x) for x in kpts[self.keypoint_index][:3]) + + # 工件框(用来把 k0 的偏移归一化,以及掉信时重建) + box = getattr(det, "xyxy", None) + box = None if box is None else np.asarray(box, dtype=float).reshape(4) + cx = cy = bw = bh = None + if box is not None: + cx = 0.5 * (box[0] + box[2]) + cy = 0.5 * (box[1] + box[3]) + bw = abs(box[2] - box[0]) + bh = abs(box[3] - box[1]) + + finite = bool(np.isfinite(u) and np.isfinite(v) and np.isfinite(kc)) + # k0 的**像素位置**是否可信:置信度够 ≠ 位置对。2026-10-08 真机,模型在 + # uv=(12,30)/(76,75)/(143,92) 这些**贴画面边**的地方以 conf 0.53~0.73 报 k0 + #(真 k0 是 0.87,没有可分区间)—— 孔心长在工件上,不可能在画面边上。 + # 位置不可信不是"没有目标",而是"本帧 k0 位置不能用",交回下面的连续性路径。 + why_pos = ( + kpt_plausible( + u, v, box, *self._img_wh_or_zero(), border_px=self.keypoint_border_px + ) + if finite + else None + ) + borrowed = False + if finite and kc >= self.keypoint_min_conf and why_pos is None: + # k0 可信:位置就用 k0 自己 + uv = np.array([u, v], dtype=float) + z, znote = self._depth_at_uv(u, v) + if z is None: + # 位置可信、只是深度读不到:XY 仍然用 k0(不许横移),只借深度 + if box is None: + return None + z, note2 = self._depth_in_box(box) + if z is None: + return None + znote = f"{note2} 借深度" + borrowed = True + if box is not None and bw is not None and bw > 1e-6 and bh > 1e-6: + self._kpt_box_frac = np.array( + [(u - cx) / bw, (v - cy) / bh], dtype=float + ) + reason = "" + else: + # k0 不可信:按"相对框的偏移"重建,位置连续、且跟着框走。 + if not finite: + reason = "非有限值" + elif why_pos is not None: + # 置信度够但**位置**不合理(贴画面边 / 不在自己的框里) + reason = why_pos + else: + reason = f"置信度 {kc:.2f} < {self.keypoint_min_conf:.2f}" + if ( + self._kpt_box_frac is None + or box is None + or bw is None + or bw <= 1e-6 + or bh is None + or bh <= 1e-6 + ): + self.get_logger().warn( + f"k{self.keypoint_index} {reason},且还没有可信历史 —— 本帧不用它", + throttle_duration_sec=1.0, + ) + return None + uv = np.array( + [cx + float(self._kpt_box_frac[0]) * bw, + cy + float(self._kpt_box_frac[1]) * bh], + dtype=float, + ) + z, znote = self._depth_at_uv(float(uv[0]), float(uv[1])) + if z is None: + z, note2 = self._depth_in_box(box) + if z is None: + return None + znote = f"{note2} 借深度" + borrowed = True + self.get_logger().warn( + f"k{self.keypoint_index} {reason} —— 按框上相对偏移重建跟踪点" + f"(uv=({uv[0]:.0f},{uv[1]:.0f}),框心=({cx:.0f},{cy:.0f})),不横移", + throttle_duration_sec=1.0, + ) + z = float(z) + return PlaneFeature( + uv=uv, + z=z, + xyz=self._pixel_to_cam(float(uv[0]), float(uv[1]), z), + n_inliers=1, + note=f"k{self.keypoint_index}保持({reason}) {znote} z={z:.3f}", + borrowed=borrowed, + ) + + z = float(z) + return PlaneFeature( + uv=uv, + z=z, + xyz=self._pixel_to_cam(float(uv[0]), float(uv[1]), z), + # 关键点特征没有"平面内点"的概念——支撑样本就它自己一个。 + # 这个字段目前没有下游消费者,给 1 是为了让日志里 n=1 说得通。 + n_inliers=1, + note=f"k{self.keypoint_index}({znote}) z={z:.3f}", + borrowed=borrowed, + ) + + def _img_wh_or_zero(self) -> tuple: + """当前彩色图 ``(w,h)``;还没收到图时给 ``(0,0)``(守卫会跳过边缘判据)。""" + wh = self._img_wh() + return (0, 0) if wh is None else (int(wh[0]), int(wh[1])) + + def _depth_at_uv(self, u: float, v: float) -> tuple: + """取 (u,v) 附近小窗口的中位深度(米)。``u,v`` 是**彩色图**像素。 + + 深度是 aligned-to-color,但分辨率不一定等于彩色图(D405 的 aligned + 深度会和彩色图不同尺寸),所以先按比例映射到深度图坐标 —— 这点和 + ``_depth_in_box`` 里的缩放保持一致,否则关键点深度会整体偏。 + """ + msg = self._latest_depth + if msg is None: + return None, "无深度" + if not self._depth_fresh(msg): + return None, "深度过期" + buf = self._decode_depth_m(msg) + if buf is None: + return None, "深度无效" + h, w = buf.shape + img = self._latest_image + if img is not None and (int(img.width) != w or int(img.height) != h): + u = u * (w / float(img.width)) + v = v * (h / float(img.height)) + win = self.keypoint_win_px + x0 = int(np.clip(round(u) - win, 0, w - 1)) + x1 = int(np.clip(round(u) + win, x0 + 1, w)) + y0 = int(np.clip(round(v) - win, 0, h - 1)) + y1 = int(np.clip(round(v) + win, y0 + 1, h)) + roi = buf[y0:y1, x0:x1].reshape(-1).astype(np.float32) + if roi.size == 0: + return None, "窗口越界" + enc = (msg.encoding or "").lower() + if enc in ("16uc1", "mono16"): + pos = roi[roi > 0] + if pos.size < 4: + return None, "该处无有效深度" + med = float(np.median(pos)) + # 和 _depth_in_box 同一套量纲判断(有的相机给 mm,有的给 m) + scale = 0.001 if 20.0 <= med <= 8000.0 else (1.0 if med < 20 else 0.0001) + z = med * scale + else: + vals = roi[np.isfinite(roi) & (roi > 0)] + if vals.size < 4: + return None, "该处无有效深度" + z = float(np.median(vals)) + if not (self.feature_min_range < z < self.max_depth): + # 太近 ⇒ 十有八九是爪上夹的通止规(规尖在相机前 ~0.10m,工件面 0.17~0.22m)。 + # 当"这里没有目标"处理,绝不把它当工件去伺服 —— 否则臂会去追自己的工具。 + return None, f"深度 {z:.3f}m 命中工具量程(<{self.feature_min_range:.2f}m)" + return z, f"({u:.0f},{v:.0f})" + def _workpiece_xyz(self, xyxy): msg = self._latest_depth img = self._latest_image @@ -809,7 +1364,7 @@ class PerceptionNode(Node): self._cx, self._cy, (int(img.width), int(img.height)), - min_depth=self.min_depth, + min_depth=self.feature_min_range, # 太近=爪上工具,见 feature_min_range_m max_depth=self.max_depth, work_z_max=self.work_z_max, band_m=self.plane_band_m, @@ -838,7 +1393,7 @@ class PerceptionNode(Node): self._cx, self._cy, (int(img.width), int(img.height)), - min_depth=self.min_depth, + min_depth=self.feature_min_range, # 太近=爪上工具,见 feature_min_range_m max_depth=self.max_depth, work_z_max=self.work_z_max, inlier_m=self.plane_inlier_m, @@ -860,6 +1415,204 @@ class PerceptionNode(Node): return float(self._last_good_z), f"{note} hold_near" return None, f"{note} no_depth" + def _publish_wrist_conf(self, best_conf: Optional[float]) -> None: + msg = Float32() + msg.data = float("nan") if best_conf is None else float(best_conf) + self._wrist_conf_pub.publish(msg) + + def _on_z_locked(self, msg: Bool) -> None: + """锁高状态只记着。拍不拍 D435 不看它,看 D405 连续漏检。""" + self._z_locked = bool(msg.data) + + def _on_d435_commanding(self, msg: Bool) -> None: + """伺服还在执行 D435 那一个点时,不再提交下一张,D405 控制点也不发。 + + 这一轮已经拍过并走完。停稳后打开 D405 框心,不因交接瞬间漏检再 MoveL。 + """ + self._d435_commanding = bool(msg.data) + + def _publish_overhead_k0(self, p_base: np.ndarray, is_k0: bool) -> None: + pt = PointStamped() + pt.header.stamp = self.get_clock().now().to_msg() + pt.header.frame_id = self.base_frame or "base" + pt.point.x = float(p_base[0]) + pt.point.y = float(p_base[1]) + pt.point.z = float(p_base[2]) + self._overhead_k0_pub.publish(pt) + del is_k0 # 语义写在日志里;话题保持 PointStamped,避免再抄一份类型 + + def _should_submit_overhead_viz(self) -> bool: + """低频率给 D435 窗刷绿框;不发控制点。赶路时不抢 GPU。""" + if not self.overhead_oneshot_enable or self.d435_move_only: + return False + if self._d435_commanding or self._need_oneshot: + return False + return (time.monotonic() - self._oh_viz_t) >= 0.5 + + def _publish_overhead_det( + self, xyxy: np.ndarray, conf: float, cls_id: float, uv: np.ndarray, z: float + ) -> None: + det = Float32MultiArray() + det.data = [ + float(xyxy[0]), float(xyxy[1]), float(xyxy[2]), float(xyxy[3]), + float(conf), float(cls_id), + float(uv[0]), float(uv[1]), float(z), + ] + self._oh_det_pub.publish(det) + + def _publish_overhead_det_clear(self) -> None: + msg = Float32MultiArray() + msg.data = [] + self._oh_det_pub.publish(msg) + + def _submit_overhead_oneshot(self, *, viz_only: bool = False) -> None: + """把最新 D435 帧排进同一条 YOLO 队列。不在这里等结果 —— 等会把 D405 卡死。""" + if self._oneshot_inflight or not self.overhead_oneshot_enable: + return + now = time.monotonic() + if (not viz_only) and now - self._oneshot_t < self.overhead_cooldown_s: + return + img = self._oh_image + depth = self._oh_depth + if img is None or depth is None: + if not viz_only: + self.get_logger().warn( + "D405 无合格目标,但 D435 还没出图 —— 不编造点", + throttle_duration_sec=1.0, + ) + return + if (now - self._oh_image_mono) > self.overhead_frame_max_age_s: + if not viz_only: + self.get_logger().warn( + f"D435 彩图过期 {(now - self._oh_image_mono)*1000:.0f}ms —— 不反投影", + throttle_duration_sec=1.0, + ) + return + if (not viz_only) and (now - self._oh_depth_mono) > self.overhead_frame_max_age_s: + self.get_logger().warn( + f"D435 深度过期 {(now - self._oh_depth_mono)*1000:.0f}ms —— 不反投影", + throttle_duration_sec=1.0, + ) + return + if (not viz_only) and self._oh_fx <= 1.0: + self.get_logger().warn( + "D435 内参还没到(camera_info)—— 不反投影", + throttle_duration_sec=1.0, + ) + return + if (not viz_only) and self._T_oh is None: + self.get_logger().error("眼在手外 T 没加载 —— 一次性定位拒绝") + return + seq = _ONESHOT_VIZ_SEQ if viz_only else _ONESHOT_SEQ + try: + bgr = _bgr_copy(img) + small, scale = self._prepare_infer(bgr) + self._infer_meta[seq] = scale + if not self.detector.submit(small, seq): + return + except Exception as exc: # noqa: BLE001 + self.get_logger().warn( + f"D435 {'预览' if viz_only else '一次性'}提交失败:{exc}", + throttle_duration_sec=2.0, + ) + return + self._oneshot_inflight = True + self._oneshot_viz_only = bool(viz_only) + self._oneshot_img = img + self._oneshot_depth = depth + if viz_only: + self._oh_viz_t = now + else: + self.get_logger().info("D435 一次性已提交(不打断 D405 队列)") + + def _finish_overhead_oneshot( + self, dets, scale: float, *, viz_only: bool = False + ) -> None: + """YOLO 返回的顶视结果。viz_only 只刷绿框;控制路径才发基座点。""" + self._oneshot_inflight = False + viz_only = bool(viz_only or self._oneshot_viz_only) + self._oneshot_viz_only = False + now = time.monotonic() + if not viz_only: + self._oneshot_t = now + img = self._oneshot_img + depth = self._oneshot_depth + self._oneshot_img = None + self._oneshot_depth = None + if dets is INFER_BUSY or dets is None or img is None: + return + if scale != 1.0: + for d in dets: + d.xyxy = d.xyxy * scale + if getattr(d, "kpts", None) is not None: + d.kpts = np.asarray(d.kpts, dtype=float).copy() + d.kpts[:, :2] *= scale + det = select_oneshot_det(dets, self.overhead_oneshot_conf if not viz_only else 0.25) + if det is None: + self._publish_overhead_det_clear() + if not viz_only: + self._oneshot_t = now + self.get_logger().warn( + f"D435 一次性:画面里没有 conf≥{self.overhead_oneshot_conf:.2f} 的工件", + throttle_duration_sec=1.0, + ) + return + xyxy = np.asarray(det.xyxy, dtype=float).reshape(4) + uv = np.array( + [0.5 * (xyxy[0] + xyxy[2]), 0.5 * (xyxy[1] + xyxy[3])], dtype=float + ) + self._publish_overhead_det( + xyxy, float(det.conf), float(det.cls_id), uv, 0.0 + ) + if viz_only: + return + if depth is None: + self._oneshot_t = now + return + raw = self._decode_depth_m(depth) + depth_m = depth_raw_to_m(raw, depth.encoding or "") + if depth_m is None: + self._oneshot_t = now + self.get_logger().warn( + "D435 深度无法转成米 —— 不发点", throttle_duration_sec=1.0 + ) + return + color_wh = (int(img.width), int(img.height)) + depth_wh = (int(depth_m.shape[1]), int(depth_m.shape[0])) + got = oneshot_k0_base( + det, + depth_m, + fx=self._oh_fx, + fy=self._oh_fy, + cx=self._oh_cx, + cy=self._oh_cy, + T_cam_to_base=self._T_oh, + min_z_m=self.overhead_min_depth, + max_z_m=self.overhead_max_depth, + kpt_index=self.keypoint_index, + kpt_min_conf=self.keypoint_min_conf, + min_det_conf=self.overhead_oneshot_conf, + color_wh=color_wh, + depth_wh=depth_wh, + ) + self._oneshot_t = now + if got is None: + self.get_logger().warn( + "D435 一次性:深度或 k0 不可用,不发点", + throttle_duration_sec=1.0, + ) + return + p_base, is_k0 = got + self._oneshot_shot = True + self._oneshot_shot_t = now + self._need_oneshot = False + self._publish_overhead_k0(p_base, is_k0) + self.get_logger().info( + f"D435 一次性定位 {'k0' if is_k0 else '框心(顶视看不见 k0)'} " + f"base=({p_base[0]:.3f},{p_base[1]:.3f},{p_base[2]:.3f}) " + f"conf={float(det.conf):.2f}" + ) + def _publish_point(self, filt: np.ndarray, stamp) -> None: pt = PointStamped() pt.header.stamp = stamp diff --git a/build/arm_application/build/lib/arm_application/pipeline_node.py b/build/arm_application/build/lib/arm_application/pipeline_node.py index d4eab0a..4e99f2e 100644 --- a/build/arm_application/build/lib/arm_application/pipeline_node.py +++ b/build/arm_application/build/lib/arm_application/pipeline_node.py @@ -11,31 +11,116 @@ from __future__ import annotations import json +import math import os import signal import subprocess import time -from typing import Optional +from pathlib import Path +from typing import Optional, Tuple import numpy as np import rclpy from geometry_msgs.msg import PointStamped -from rclpy.qos import HistoryPolicy, QoSProfile, ReliabilityPolicy +from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy from std_msgs.msg import Bool, String +from trajectory_msgs.msg import JointTrajectory +from arm_application.gauge_kin import ( + a7_limit_target, + match_limits, + parse_joint_limits, +) +from arm_application.overhead_oneshot import D435_MOVEL_GAVE_UP +from arm_application.site_io import load_site_dict +from arm_application.stage2_locate_node import _pt from arm_application.stage3_search_node import Stage3Search -#: 一阶段跟踪高相对二阶段悬停高的**抬升量** [m]。 +#: 悬停时规尖离面不够,跟踪高再抬的量 [m]。 #: -#: 为什么要抬:跟踪时通止规已经夹在爪上,规尖比相机更靠下;悬停高是"相机拍清 -#: 孔"的高度,直接在那儿跟踪会让规尖刮到工件。抬 5cm 让它离开工件,二阶段再 -#: 小幅下降(只需 5cm 以内的行程)。 +#: 只在「悬停高上规尖离工件面 < :data:`TRACK_LOCK_GAP_M`」时加上。仿真悬停按 +#: 工具几何只留约 2mm,不抬就会在跟踪时刮到工件。真机 89 悬停 0.320 时规尖 +#: 已经在面上方约 75mm,再抬 50mm 会让对孔前先改一次高度(0.37→0.32)。 #: #: ⚠️ 抽成常量是因为它不只被流程用:``scripts/check_sim_scene.py`` 要用它核对 #: "跟踪高有没有超出工作盒上界"(仿真里悬停 0.632 + 0.05 = 0.682 > 真机那套 #: 0.65 上界,就是被这条查出来的)。两处各写一个字面量迟早漂移。 TRACK_CLEARANCE_M = 0.05 +#: 悬停时规尖离面已经不少于这个值 [m],一阶段就锁在悬停高,对孔完成后再下降。 +TRACK_LOCK_GAP_M = 0.040 + + +def init_z_refusal( + z_m: float, + tool_len_m: float, + surface_z_m: float, + gap_m: float, + z_min: float, + z_max: float, +) -> str: + """初始法兰高度能不能用。空串表示可以;非空就是拒绝原因,不许悄悄抬高。""" + z = float(z_m) + if z < float(z_min) - 1e-6 or z > float(z_max) + 1e-6: + return ( + f"初始法兰 Z {z:.3f}m 超出工作盒 [{float(z_min):.3f}, {float(z_max):.3f}]," + "拒绝开跑" + ) + tool = float(tool_len_m) + surf = float(surface_z_m) + if tool <= 0.0 or surf <= 0.0: + return "写了初始高度,但工具长度或工件面未知,无法确认尖端在面之上,拒绝开跑" + clear = z - tool - surf + if clear < float(gap_m) - 0.001: + return ( + f"初始法兰 Z {z:.3f}m 会让工具尖进入工件:" + f"尖端 {z - tool:.3f},工件面 {surf:.3f}," + f"间隙 {clear * 1000:.1f}mm,要求 ≥ {float(gap_m) * 1000:.1f}mm。" + "拒绝开跑,不会悄悄抬高。" + ) + return "" + + +def hold_at_insert_z(final, *, skip3: bool) -> bool: + """贴面已经按 ``final_gap_mm`` 停下时,不再进三阶段。 + + 三阶段开局会抬到悬高上方测触觉,再落回 ``hole_hover_z_m``。 + 没有接触传感器。到位高度就是这次的贴面间隙,不另设一个 Z。 + """ + if skip3: + return True + if not isinstance(final, dict): + return False + return bool(final.get("insert_held")) + + +def track_lock_z(hover_z: float, tool_len_m: float, surface_z_m: float) -> float: + """一阶段锁高。 + + 悬停时规尖离面已经 ≥ ``TRACK_LOCK_GAP_M``:锁在悬停高,跟踪和对孔都不改 Z, + 对孔完成后再下降。离面不够(仿真悬停只留 2mm):再抬 ``TRACK_CLEARANCE_M``, + 否则跟踪会刮到工件。工具长或工件面缺失时抬升 —— 缺数时锁在悬停高等于没检查。 + """ + tool = float(tool_len_m) + surf = float(surface_z_m) + hover = float(hover_z) + if tool > 0.0 and surf > 0.0 and (hover - tool - surf) >= TRACK_LOCK_GAP_M: + return hover + return hover + TRACK_CLEARANCE_M + + +def stage1_log_fatal(log_path: str) -> str: + """一阶段日志里已经写明失败时,不许再空等锁定。空串 = 还没到这一步。""" + try: + text = Path(log_path).read_text(encoding="utf-8", errors="replace") + except OSError: + return "" + if D435_MOVEL_GAVE_UP in text: + return ( + f"D435 {D435_MOVEL_GAVE_UP}(RDK 控制模式没切到 primitive)," + f"一阶段中止。不是视野/标定。看 {log_path}" + ) + return "" def stage1_timeout_reason(points_seen: int, timeout_s: float, log_path: str) -> str: @@ -52,6 +137,9 @@ def stage1_timeout_reason(points_seen: int, timeout_s: float, log_path: str) -> 以前两种情况共用一句"没锁定(视野里没工件?)",于是"perception_node 因为缺依赖早退了"被读成"算法不收敛",白查半天。 """ + fatal = stage1_log_fatal(log_path) + if fatal: + return fatal if points_seen <= 0: return ( f"一阶段 {timeout_s:.0f}s 没锁定:**一个视觉目标点都没收到**" @@ -79,11 +167,26 @@ class AssemblyPipeline(Stage3Search): self.declare_parameter("skip_stage1", False) self.declare_parameter("skip_stage2", False) self.declare_parameter("skip_stage3", False) # 默认搜孔+轻压;拧入靠 --depth + self.declare_parameter("d435_move_only", False) + self.declare_parameter("init_z_m", -1.0) # >0:启动后先到这个法兰高度 self.declare_parameter("stage1_timeout_sec", 150.0) self.linger3 = 1.2 # 串联结束短保持;单独跑 stage3 仍用 site linger_sec self._s1: Optional[subprocess.Popen] = None self._locked = False + self._robot_description: Optional[str] = None + # robot_state_publisher 用 TRANSIENT_LOCAL 只发一次。默认 VOLATILE + # 订阅在它之后才起来,3s 内一条都收不到,A7 会因“没有限位”拒绝旋转。 + self.create_subscription( + String, + "/robot_description", + self._on_robot_description, + QoSProfile( + depth=1, + durability=DurabilityPolicy.TRANSIENT_LOCAL, + reliability=ReliabilityPolicy.RELIABLE, + ), + ) self.create_subscription(Bool, "/visual_servo/locked", self._on_lock, 10) # 诊断用:一阶段超时时靠它区分"感知没给点"和"给了点没收敛"。 # 只计数,不参与控制 —— 它绝不能影响流程本身的判断。 @@ -113,9 +216,11 @@ class AssemblyPipeline(Stage3Search): skip1 = bool(self.get_parameter("skip_stage1").value) skip2 = bool(self.get_parameter("skip_stage2").value) skip3 = bool(self.get_parameter("skip_stage3").value) + self.d435_move_only = bool(self.get_parameter("d435_move_only").value) self.get_logger().info( f"pipeline arm_ee={self.ee_frame} hole={self.target_hole} " - f"skip1={skip1} skip2={skip2} skip3={skip3} insert={self.insert_depth_mm:.1f}mm" + f"skip1={skip1} skip2={skip2} skip3={skip3} " + f"d435_only={self.d435_move_only} insert={self.insert_depth_mm:.1f}mm" ) def _state(self, s: str) -> None: @@ -125,6 +230,113 @@ class AssemblyPipeline(Stage3Search): self._state_pub.publish(msg) self._pipe_pub.publish(msg) + def _on_robot_description(self, msg: String) -> None: + self._robot_description = str(msg.data) + + def _a7_limits(self, timeout_s: float = 3.0) -> Optional[Tuple[float, float]]: + """A7 软件限位。来自 ``/robot_description`` 的 joint7,与厂家 ``q_min/q_max`` 同一对。""" + t0 = time.monotonic() + while self._robot_description is None and time.monotonic() - t0 < timeout_s: + self._spin(0.05) + if not self._robot_description: + self.get_logger().error("拿不到 /robot_description,A7 没有限位,拒绝旋转") + return None + got = match_limits( + parse_joint_limits(self._robot_description), [self.joint_names[-1]] + ) + if got is None: + self.get_logger().error( + f"/robot_description 里没有 {self.joint_names[-1]} 的限位,拒绝旋转" + ) + return got + + def _send_a7_only(self, a7_rad: float, speed_deg_s: float, tag: str) -> bool: + """只下发 A7。前六轴用这一拍的当前角,厂家 ``SendJointPosition`` 收到的也是这一组。""" + q, Tee = self._wait_state(5.0) + if q is None or Tee is None or int(q.size) != 7: + self.get_logger().error(f"{tag}: 拿不到 7 轴关节,不下发") + return False + z0 = float(Tee[2, 3]) + q_hold = q.copy() + q_hold[6] = float(a7_rad) + delta_deg = abs(math.degrees(float(q_hold[6] - q[6]))) + dur = max(0.8, delta_deg / max(float(speed_deg_s), 1.0)) + zeros = np.zeros(q.size) + traj = JointTrajectory() + traj.header.stamp.sec = 0 + traj.header.stamp.nanosec = 0 + traj.joint_names = list(self.joint_names) + traj.points = [_pt(q, zeros, 0.2), _pt(q_hold, zeros, 0.2 + dur)] + self.get_logger().info( + f"{tag}: A7 {math.degrees(float(q[6])):+.1f}° → " + f"{math.degrees(float(q_hold[6])):+.1f}°," + f"{speed_deg_s:.0f}°/s,前六轴不动,法兰 Z={z0:.4f}m" + ) + self._send_action(traj, wait_s=dur + 8.0) + q2, Tee2 = self._wait_state(5.0) + if q2 is None or Tee2 is None: + self.get_logger().error(f"{tag}: 走完读不到关节") + return False + others = float(np.max(np.abs(q2[:6] - q[:6]))) + dz = abs(float(Tee2[2, 3]) - z0) + a7_err = abs(float(q2[6] - q_hold[6])) + self.get_logger().info( + f"{tag}: 前六轴最大偏差 {others:.4f} rad," + f"法兰 ΔZ={dz * 1000:.1f}mm,A7 残差 {math.degrees(a7_err):.1f}°" + ) + if others > 0.02: + self.get_logger().error(f"{tag}: 前六轴动了 {others:.3f} rad,中止") + return False + if dz > 0.003: + self.get_logger().error(f"{tag}: 法兰 Z 变了 {dz * 1000:.1f}mm,中止") + return False + if a7_err > 0.05: + self.get_logger().error( + f"{tag}: A7 还差 {math.degrees(a7_err):.1f}°,没到限位内侧" + ) + return False + self._pin(q2) + return True + + def _run_a7_seat(self) -> bool: + """贴面后咬螺纹:A7 先逆时针到限位,再顺时针到限位。不改 Z。""" + limits = self._a7_limits() + if limits is None: + return False + ga = load_site_dict().get("gauge_assembly") or {} + try: + margin = float(ga["extreme_margin_deg"]) + speed = float(ga["extreme_speed_deg_s"]) + ccw = int(ga["extreme_direction"]) + except (KeyError, TypeError, ValueError) as exc: + self.get_logger().error( + f"site.yaml gauge_assembly 缺 A7 旋转参数({exc}),拒绝旋转" + ) + return False + if ccw not in (-1, 1): + self.get_logger().error( + f"extreme_direction 只能是 +1/-1,收到 {ccw},拒绝旋转" + ) + return False + # +1 = 关节角增大 = 逆时针。第一步逆时针出孔让出牙,第二步顺时针进孔咬合。 + steps = ( + (ccw, "A7 逆时针至极限(出孔)"), + (-ccw, "A7 顺时针至极限(进孔)"), + ) + for direction, tag in steps: + q, _Tee = self._wait_state(5.0) + if q is None: + self.get_logger().error(f"{tag}: 没有当前关节") + return False + target = a7_limit_target(q, limits, direction, margin) + if target is None: + self.get_logger().error(f"{tag}: 算不出 A7 限位目标") + return False + if not self._send_a7_only(float(target[6]), speed, tag): + return False + self.get_logger().info("A7 两步完成:逆时针到限位,再顺时针到限位。法兰高度未改。") + return True + def _on_lock(self, msg: Bool) -> None: if bool(msg.data): self._locked = True @@ -163,33 +375,64 @@ class AssemblyPipeline(Stage3Search): self._kill_old_stage1() def _track_z(self) -> float: - """跟踪高度 = 孔悬停高 + :data:`TRACK_CLEARANCE_M`,通止规离开工件。""" - return float(self.hover_z) + TRACK_CLEARANCE_M + """一阶段锁高。写了 ``init_z_m`` 就用它,否则见 :func:`track_lock_z`。""" + z = float(self.get_parameter("init_z_m").value) + if z > 0.0: + return z + return track_lock_z( + float(self.hover_z), + float(getattr(self, "tool_tip_below_flange_m", 0.0) or 0.0), + float(getattr(self, "surface_z_m", 0.0) or 0.0), + ) - def _ensure_clearance(self) -> None: - """上一轮轻压可能还在孔里:先纯 Z 抬到跟踪高,禁止 0.23↔0.35 来回。""" + def _ensure_clearance(self) -> bool: + """没写初始高度:只在低于锁高时抬上去。写了:升或降到那个法兰 Z,不安全就拒绝。""" + user = float(self.get_parameter("init_z_m").value) > 0.0 q, Tee = self._wait_state(4.0) if q is None or Tee is None: - return + if user: + self.get_logger().error("设了 --init-z,但拿不到当前位姿,拒绝开跑") + return False + return True tz = self._track_z() + if user: + why = init_z_refusal( + tz, + float(getattr(self, "tool_tip_below_flange_m", 0.0) or 0.0), + float(getattr(self, "surface_z_m", 0.0) or 0.0), + float(self.final_gap_m), + float(self.ws_min[2]), + float(self.ws_max[2]), + ) + if why: + self.get_logger().error(why) + return False z = float(Tee[2, 3]) - if z >= tz - 0.008: - return + if user: + if abs(z - tz) <= 0.008: + self.get_logger().info(f"已在初始高度 Z={z:.3f}m(目标 {tz:.3f})") + return True + elif z >= tz - 0.008: + return True self._state("pre_lift") - self.get_logger().info( - f"先离开工件/孔口:Z {z:.3f} → {tz:.3f}m(跟踪高=hover+50mm)" - ) - _, q, Tee = self._goto( + self.get_logger().info(f"先到初始高度:Z {z:.3f} → {tz:.3f}m") + ok, q, Tee = self._goto( q, Tee, np.array([float(Tee[0, 3]), float(Tee[1, 3]), tz]), verticalize=True, tol_m=0.003, tol_tilt=self.vert_tol_rad * 2.0, tag="pre_lift", v=self.move_speed, max_hops=8, hold_xy=True, settle_s=0.25, ) q2 = self._q() self._pin(q2 if q2 is not None else q) + z2 = float(Tee[2, 3]) + if user and (not ok or abs(z2 - tz) > 0.008): + self.get_logger().error(f"初始高度没到位:Z={z2:.3f},目标 {tz:.3f}") + return False + return True def _run_stage1(self) -> int: """拉起 perception+servo,等到 /visual_servo/locked 后冻结并拆跟踪。""" - self._ensure_clearance() + if not self._ensure_clearance(): + return 2 self._state("stage1_track") self._kill_old_stage1() self._locked = False @@ -205,12 +448,17 @@ class AssemblyPipeline(Stage3Search): "enable_control:=true", "publish_handeye_tf:=false", f"ee_z_m:={lock_z:.3f}", - "lock_hold_sec:=0.6", f"use_sim_time:={str(use_sim).lower()}", + f"d435_move_only:={str(self.d435_move_only).lower()}", ] - self.get_logger().info( - f"启动一阶段跟踪(锁高 {lock_z:.3f}m,锁定后自动交二阶段)" - ) + if self.d435_move_only: + self.get_logger().info( + f"启动 D435 位移测试(锁高 {lock_z:.3f}m,到位后不交 D405、不进二阶段)" + ) + else: + self.get_logger().info( + f"启动一阶段跟踪(锁高 {lock_z:.3f}m,锁定后自动交二阶段)" + ) self._s1 = subprocess.Popen( cmd, stdout=logf, stderr=subprocess.STDOUT, start_new_session=True, ) @@ -221,6 +469,11 @@ class AssemblyPipeline(Stage3Search): self._spin(0.1) if self._locked: break + fatal = stage1_log_fatal(log_path) + if fatal: + self._stop_stage1() + self.get_logger().error(fatal) + return 1 if self._s1.poll() is not None: self.get_logger().error(f"一阶段进程提前退出,看 {log_path}") return 1 @@ -230,7 +483,12 @@ class AssemblyPipeline(Stage3Search): stage1_timeout_reason(self._point_msgs, timeout, log_path) ) return 1 - self.get_logger().info("一阶段已锁定 — 停跟踪、钉住当前关节,直接进二阶段") + if self.d435_move_only: + self.get_logger().info( + "D435 位移测试结束 — 停跟踪、钉住当前关节,跳过二阶段" + ) + else: + self.get_logger().info("一阶段已锁定 — 停跟踪、钉住当前关节,直接进二阶段") self._stop_stage1() time.sleep(0.35) q = self._q() @@ -242,6 +500,9 @@ class AssemblyPipeline(Stage3Search): skip1 = bool(self.get_parameter("skip_stage1").value) skip2 = bool(self.get_parameter("skip_stage2").value) skip3 = bool(self.get_parameter("skip_stage3").value) + if self.d435_move_only: + skip2 = True + skip3 = True if not self._cli.wait_for_server(timeout_sec=5.0): self.get_logger().error("JTC action 不在 —— 先开 T1: run_real.sh --arm 89") return 2 @@ -252,7 +513,8 @@ class AssemblyPipeline(Stage3Search): if code != 0: return code else: - self._ensure_clearance() + if not self._ensure_clearance(): + return 2 self._state("skip_stage1") q, Tee = self._wait_state(10.0) @@ -267,19 +529,54 @@ class AssemblyPipeline(Stage3Search): if code != 0: self.get_logger().error(f"二阶段失败 exit={code},停在当前位姿") return code - self.get_logger().info( - f"二阶段 OK 残差 {final.get('residual_mm', -1)}mm" - + (" — 跳过搜孔,保持悬停" if skip3 else " — 立刻下压搜孔并轻压(不拧入)") - ) + stay = hold_at_insert_z(final, skip3=skip3) + if stay and final.get("insert_held"): + self.get_logger().info( + f"二阶段 OK 残差 {final.get('residual_mm', -1)}mm — " + f"插孔停在法兰 Z={final.get('flange_z_m')}m," + f"规尖离面 {final.get('tip_gap_mm')}mm" + f"(目标 {final.get('commanded_gap_mm')}mm,来自 final_gap_mm)。" + "没有接触传感器,不另设 Z,不抬回悬高。" + ) + else: + self.get_logger().info( + f"二阶段 OK 残差 {final.get('residual_mm', -1)}mm" + + ( + " — 跳过搜孔,停在观测高度(看规尖是否对中;进程退出后臂保持)" + if skip3 + else " — 立刻下压搜孔并轻压(不拧入)" + ) + ) else: self._state("skip_stage2") + stay = hold_at_insert_z(final, skip3=skip3) - if skip3: + if stay: self._state("skip_stage3") - self.get_logger().info("跳过搜孔 —— 臂保持在孔上方") + if self.d435_move_only: + self.get_logger().info( + "D435 位移测试结束 —— 臂停在当前高度,不交 D405、不对孔;" + "15s 后本进程退出,臂保持不动" + ) + elif isinstance(final, dict) and final.get("insert_held"): + if q is not None: + self._pin(q) + self.get_logger().info( + "插孔已停在贴面高度,不进搜孔、不抬回悬高。" + "接着只转 A7:先逆时针到限位,再顺时针到限位。" + ) + if not self._run_a7_seat(): + self.get_logger().error( + "A7 旋转没走完,臂停在当前关节。不抬 Z。" + ) + else: + self.get_logger().info( + "跳过搜孔 —— 臂停在当前高度。请看规尖与孔是否对中;" + "15s 后本进程退出,臂保持不动" + ) if final: self._publish_result(final) - self._linger_hold(final if final else {"ok": True}, seconds=0.8) + self._linger_hold(final if final else {"ok": True}, seconds=15.0) payload = {"ok": True, "stage": "pipeline", "exit": 0, "skipped": "stage3"} try: payload["stage2"] = json.loads( diff --git a/build/arm_application/build/lib/arm_application/plane_feature.py b/build/arm_application/build/lib/arm_application/plane_feature.py index 84c43ad..1cc1eae 100644 --- a/build/arm_application/build/lib/arm_application/plane_feature.py +++ b/build/arm_application/build/lib/arm_application/plane_feature.py @@ -21,6 +21,11 @@ class PlaneFeature: xyz: np.ndarray # (3,) 相机坐标系下的立体点云质心 n_inliers: int note: str + # 这个点的 Z 是不是**借**来的(该像素处读不到自己的深度,从检测框里借了一个)。 + # 为什么要显式带出来、而不是让下游去认 ``note`` 里的字:借深度意味着该像素的 + # 深度不可读 ⇒ 绝对位置不足以用来**重定位**(2026-10-08 真机,假 k0 带着借来的 + # 深度、z 看着很合理 0.27~0.39m,于是"物理量程"守卫也失效)。 + borrowed: bool = False def _depth_meters(buf: np.ndarray, encoding: str) -> Tuple[np.ndarray, float]: diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/pose_detector.py b/build/arm_application/build/lib/arm_application/pose_detector.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/pose_detector.py rename to build/arm_application/build/lib/arm_application/pose_detector.py diff --git a/build/arm_application/build/lib/arm_application/realsense_color_pub.py b/build/arm_application/build/lib/arm_application/realsense_color_pub.py index f6b5e4a..c95b46a 100644 --- a/build/arm_application/build/lib/arm_application/realsense_color_pub.py +++ b/build/arm_application/build/lib/arm_application/realsense_color_pub.py @@ -32,16 +32,21 @@ from rclpy.qos import qos_profile_sensor_data from sensor_msgs.msg import CameraInfo, Image from std_msgs.msg import Float32MultiArray +from arm_application.ros_node import TolerantNode, param_as_str -def _param_as_str(node: Node, name: str, default: str = '') -> str: - """字符串参数,同时兼容命令行传数字的情况(例如序列号)。""" - node.declare_parameter( - name, default, ParameterDescriptor(dynamic_typing=True) - ) - val = node.get_parameter(name).value - if val is None or val == '': - return '' - return str(val).strip() +# RealSense 掉到 480Mbps(或整台消失)时的排查口径。写在这里是为了"只有一处": +# 相机节点的报错、preflight 脚本、文档都引用同一套说法,不会各说各的。 +# 为什么 480Mbps 值得专门解释一次(2026-09-28 现场): +# D435 原本协商到 USB 3.2、1280x720@30 跑得好好的,中途 +# `xioctl(UVCIOC_CTRL_QUERY) ... No such file or directory`(= 设备从总线上消失) +# 之后重新枚举成了 **USB 2.1**。USB3 线缆/座子里 SuperSpeed 那一对针脚一旦 +# 接触不良,USB2 的针脚还能用 —— 于是设备不会"掉线",只是**悄悄掉速**, +# 表现成"相机在,但帧率/分辨率不对"。这时查软件是查不出来的。 +USB_RESEAT_HINT = ( + '拔插一次、换一根 USB3 线,或换到机箱后面板直连的蓝色口 —— ' + '只协商到 480Mbps 通常是 SuperSpeed 针脚没接上,不是相机坏了。' + '看当前协商速率:lsusb -t(设备后面写 480M 还是 5000M)。' +) def _fill_camera_info( @@ -68,23 +73,17 @@ def _fill_camera_info( def _site_yaml_path() -> Path: - env = str(os.environ.get("SITE_CONFIG") or "").strip() - if env: - p = Path(env).expanduser() - if p.is_file(): - return p - home = Path.home() / "ros2" / "config" / "site.yaml" - if home.is_file(): - return home - return Path("/home/cc/ros2/config/site.yaml") + from arm_application.site_io import site_path + + return site_path() -class RealsenseColorPub(Node): +class RealsenseColorPub(TolerantNode): def __init__(self) -> None: super().__init__('realsense_color_pub') self.declare_parameter('camera_name', 'd405') # 话题命名空间 self._name = str(self.get_parameter('camera_name').value).strip().strip('/') - self._serial = _param_as_str(self, 'camera_serial', '') + self._serial = param_as_str(self, 'camera_serial', '') self.declare_parameter('width', 1280) self.declare_parameter('height', 720) self.declare_parameter('fps', 15) @@ -177,6 +176,10 @@ class RealsenseColorPub(Node): self._overlay: Optional[list] = None self._overlay_stamp = 0.0 self._capture_started = False + self._cap_lock = threading.Lock() + self._cap_event = threading.Event() + self._pending = None + self._last_frame_mono = 0.0 self._usb_desc = '' self._last_ok = None self._site_yaml = _site_yaml_path() @@ -310,23 +313,26 @@ class RealsenseColorPub(Node): self._info_pub.publish(info) if depth_u16 is not None: - dh, dw = int(depth_u16.shape[0]), int(depth_u16.shape[1]) - dmsg = Image() - dmsg.header.stamp = stamp - dmsg.header.frame_id = self._frame_id - dmsg.height = dh - dmsg.width = dw - dmsg.encoding = '16UC1' - dmsg.is_bigendian = 0 - dmsg.step = dw * 2 - dmsg.data = array.array('B', np.ascontiguousarray(depth_u16).tobytes()) - self._depth_pub.publish(dmsg) - if not self._logged_depth: - self._logged_depth = True - self.get_logger().info( - f'首个对齐深度 {dw}x{dh} → ' - f'/{self._name}/aligned_depth_to_color/image_raw' - ) + self._publish_depth(depth_u16, stamp) + + def _publish_depth(self, depth_u16: np.ndarray, stamp=None) -> None: + dh, dw = int(depth_u16.shape[0]), int(depth_u16.shape[1]) + dmsg = Image() + dmsg.header.stamp = stamp or self.get_clock().now().to_msg() + dmsg.header.frame_id = self._frame_id + dmsg.height = dh + dmsg.width = dw + dmsg.encoding = '16UC1' + dmsg.is_bigendian = 0 + dmsg.step = dw * 2 + dmsg.data = array.array('B', np.ascontiguousarray(depth_u16).tobytes()) + self._depth_pub.publish(dmsg) + if not self._logged_depth: + self._logged_depth = True + self.get_logger().info( + f'首个对齐深度 {dw}x{dh} → ' + f'/{self._name}/aligned_depth_to_color/image_raw' + ) def _start_pipeline(self, reconnect: bool = False) -> None: try: @@ -348,8 +354,8 @@ class RealsenseColorPub(Node): if not devices: raise RuntimeError( '没有连接 RealSense(多次重试后 USB 仍为空)。' - '请把 D405 插到**本机**的 USB3(蓝色)口,拔插一次,' - '并关闭 realsense-viewer / 192.168.0.108 上占用该相机的采集端。' + '拔插一次;确认没有 realsense-viewer / 其它进程占着这台相机;' + + USB_RESEAT_HINT ) found = self._pick_device(devices, rs) @@ -374,9 +380,12 @@ class RealsenseColorPub(Node): f'requested {self._width}x{self._height}@{self._fps}Hz' ) if usb2: + # 只在 480Mbps 口上才降。实测(2026-09-28)640x480@15 彩色+深度 + # 可以稳定跑满 15fps;但 1280x720@30 在 USB2 上物理不可能 + # (SuperSpeed 没协商上)。 self.get_logger().warn( - f'{cam_name} 接在 USB {usb_desc} 上 —— 深度/IR 将保持 ' - '640x480@15。把 D405 插到 USB3(蓝色)口可获得 848@30。' + f'{cam_name} 只协商到 USB {usb_desc}(480Mbps)—— 降到 ' + f'640x480@15Hz。' + USB_RESEAT_HINT ) self._width, self._height, self._fps = 640, 480, 15 @@ -455,7 +464,9 @@ class RealsenseColorPub(Node): trial.enable_stream( rs.stream.infrared, 2, w, h, rs.format.y8, fps ) - profile = pipe.start(trial) + # 回调里只留最新一帧。wait_for_frames 会等彩色、深度、红外齐套, + # 场景一动红外对不齐,彩色帧就在这里被丢掉。 + profile = pipe.start(trial, self._on_sdk_frame) have_depth = with_depth have_infra = infra_mode != 'none' self._infra_mode = infra_mode @@ -501,11 +512,18 @@ class RealsenseColorPub(Node): break if profile is None: raise RuntimeError( - f'D405 没有可用的彩色配置。最后的错误:{last_err}' + f'{self._name} 没有可用的彩色配置。最后的错误:{last_err}' ) self._pipe = pipe self._profile = profile + try: + sensor = profile.get_device().first_color_sensor() + if sensor.supports(rs.option.frames_queue_size): + # 队列只留最新一张,避免越积越慢,动起来画面还停在旧帧。 + sensor.set_option(rs.option.frames_queue_size, 1) + except Exception: # noqa: BLE001 + pass self._have_depth = have_depth self._have_infra = have_infra self._logged_depth = False @@ -607,7 +625,7 @@ class RealsenseColorPub(Node): if not getattr(self, '_capture_started', False): self._capture_started = True - self._thread = threading.Thread(target=self._capture_loop, daemon=True) + self._thread = threading.Thread(target=self._publish_loop, daemon=True, name="rs-publish") self._thread.start() def _enable_color_ae_fast(self, profile, rs) -> None: @@ -700,18 +718,60 @@ class RealsenseColorPub(Node): ) return False - def _capture_loop(self) -> None: + def _on_sdk_frame(self, frame) -> None: + """SDK 回调。只拷走彩色并握住这一组帧,立刻返回。 + + 对齐、深度换算和 ROS 发布若做在这个回调里,下一帧来不及取, + 动起来时彩色帧号会跳。那些工作放到 ``_publish_loop``。 + """ + try: + frames = frame.as_frameset() + color = frames.get_color_frame() + if not color: + return + bgr = np.array(np.asanyarray(color.get_data()), copy=True) + frames.keep() + with self._cap_lock: + self._pending = (bgr, frames) + self._last_frame_mono = time.monotonic() + self._cap_event.set() + except Exception as exc: # noqa: BLE001 + try: + self.get_logger().warn(f'收帧:{exc}', throttle_duration_sec=2.0) + except Exception: # noqa: BLE001 + pass + + def _publish_loop(self) -> None: got = False - misses = 0 while self._running and rclpy.ok(): if self._pipe is None: if not self._reconnect(): time.sleep(2.0) continue + if not self._cap_event.wait(0.2): + silent = self._last_frame_mono and time.monotonic() - self._last_frame_mono > 2.0 + if silent: + usb = getattr(self, '_usb_desc', '?') + self.get_logger().error( + f'相机超过 2 秒没有新帧(USB={usb})。正在重连 —— ' + '请给 USB 线缆留点余量,别让机械臂把它拽掉。' + ) + self._last_frame_mono = 0.0 + got = False + self._reconnect() + continue + self._cap_event.clear() + with self._cap_lock: + item = self._pending + self._pending = None + if item is None: + continue + bgr, frames = item try: - t_wait0 = time.monotonic() - frames = self._pipe.wait_for_frames(timeout_ms=2000) - self._t_wait = time.monotonic() - t_wait0 + t_pub = time.monotonic() + # 彩色先发出去。深度对齐再慢,也不能把这一帧彩色拖掉。 + self._publish_frame(bgr, None) + self._t_pub = time.monotonic() - t_pub ir_l = ( frames.get_infrared_frame(1) if self._have_infra and self._infra_mode in ('both', 'left') @@ -722,44 +782,45 @@ class RealsenseColorPub(Node): if self._have_infra and self._infra_mode in ('both', 'right') else None ) + aligned = frames if self._align is not None: t_al = time.monotonic() - frames = self._align.process(frames) + aligned = self._align.process(frames) self._t_align = time.monotonic() - t_al + depth = aligned.get_depth_frame() color = frames.get_color_frame() except Exception as exc: # noqa: BLE001 - misses += 1 text = str(exc) dropped = ( 'disconnect' in text.lower() or 'ioctl' in text.lower() or 'errno=5' in text.lower() ) - if dropped or misses >= 4: + if dropped: usb = getattr(self, '_usb_desc', '?') self.get_logger().error( f'相机数据流中断(USB={usb}):{text[:120]}。' '正在重连 —— 请给 USB 线缆留点余量,别让机械臂把它拽掉。' ) got = False - misses = 0 + self._last_frame_mono = 0.0 self._reconnect() - continue - if misses == 1: - self.get_logger().warn(f'wait_for_frames:{exc}') + else: + self.get_logger().warn(f'整理帧:{exc}', throttle_duration_sec=2.0) continue - if not color: - misses += 1 - continue - misses = 0 - bgr = np.asanyarray(color.get_data()) - depth = frames.get_depth_frame() depth_u16 = np.asanyarray(depth.get_data()) if depth else None if depth_u16 is not None and self._depth_to_mm != 1.0: # 原始设备单位 → 真实 mm(D405 原始为 0.1 mm/单位) depth_u16 = np.clip( depth_u16.astype(np.float32) * self._depth_to_mm, 0, 65535 ).astype(np.uint16) + if depth_u16 is not None: + try: + self._publish_depth(depth_u16) + except Exception as exc: # noqa: BLE001 + if not self._running: + break + self.get_logger().warn(f'发布深度失败:{exc}', throttle_duration_sec=2.0) self._frame_i += 1 self._fps_meter(color, depth, depth_u16) # 预览相关的工作(CPU 上色、IR 拷贝、四窗格绘制)每 N 帧才做一次 @@ -792,7 +853,6 @@ class RealsenseColorPub(Node): ) try: t_pub = time.monotonic() - self._publish_frame(bgr, depth_u16) if self._ir1_pub is not None and ir_l is not None: self._publish_ir(ir_l, self._ir1_pub) if self._ir2_pub is not None and ir_r is not None: diff --git a/build/arm_application/build/lib/arm_application/realsense_view.py b/build/arm_application/build/lib/arm_application/realsense_view.py index 3c1d866..e1a6c87 100644 --- a/build/arm_application/build/lib/arm_application/realsense_view.py +++ b/build/arm_application/build/lib/arm_application/realsense_view.py @@ -27,6 +27,7 @@ from sensor_msgs.msg import Image from std_msgs.msg import Float32MultiArray from arm_application.realsense_color_pub import _site_yaml_path +from arm_application.ros_node import TolerantNode def _colorize_depth_u16(d: np.ndarray) -> np.ndarray: @@ -56,15 +57,22 @@ def _mono_to_bgr(mono: np.ndarray) -> np.ndarray: return np.ascontiguousarray(np.stack([mono, mono, mono], axis=-1)) -class RealsenseView(Node): +class RealsenseView(TolerantNode): def __init__(self) -> None: super().__init__('realsense_view') self.declare_parameter('camera_name', 'd405') self.declare_parameter('overlay_hold_sec', 0.10) + self.declare_parameter('overlay_detection', True) + # D405 用 workpiece/detection;D435 用 workpiece/detection_overhead(像素坐标系不同)。 + self.declare_parameter('detection_topic', 'workpiece/detection') self.declare_parameter('view_hz', 20.0) self.declare_parameter('hud_label', '') self._name = str(self.get_parameter('camera_name').value).strip().strip('/') self._hold = max(0.0, float(self.get_parameter('overlay_hold_sec').value)) + self._overlay_detection = bool(self.get_parameter('overlay_detection').value) + self._det_topic = str(self.get_parameter('detection_topic').value or '').strip() or ( + 'workpiece/detection' + ) self._hud = str(self.get_parameter('hud_label').value or '').strip() self._color: Optional[Image] = None @@ -101,9 +109,10 @@ class RealsenseView(Node): depth=5, reliability=ReliabilityPolicy.RELIABLE, ) - self.create_subscription( - Float32MultiArray, 'workpiece/detection', self._on_det, det_qos - ) + if self._overlay_detection: + self.create_subscription( + Float32MultiArray, self._det_topic, self._on_det, det_qos + ) # stage2 孔对准叠图(k1/k2 标注 + 残差 HUD),有它时优先显示 self.create_subscription( Image, '/stage2/overlay', self._on_stage2_overlay, qos_profile_sensor_data @@ -124,6 +133,7 @@ class RealsenseView(Node): self.create_timer(1.0 / hz, self._push) self.get_logger().info( f'查看器已启动 —— 订阅 /{self._name}/color|depth|infra1|infra2 ' + f'检测={self._det_topic if self._overlay_detection else "关"} ' f'(保留 {self._hold:.2f}s)。关闭窗口 = 仅隐藏。' ) @@ -186,6 +196,9 @@ class RealsenseView(Node): self.get_logger().warn(f"site.yaml 重新加载失败:{exc}") return if "overlay_hold_sec" in cam: + # 顶视检测频率低,保留 launch 里设的较长 hold,别被 site 的 0.1s 冲掉。 + if "overhead" in self._det_topic: + return hold = max(0.0, float(cam.get("overlay_hold_sec") or 0.0)) if abs(hold - self._hold) > 1e-6: self.get_logger().info( diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/ros_node.py b/build/arm_application/build/lib/arm_application/ros_node.py similarity index 100% rename from install/arm_application/lib/python3.11/site-packages/arm_application/ros_node.py rename to build/arm_application/build/lib/arm_application/ros_node.py diff --git a/build/arm_application/build/lib/arm_application/run_joint_trajectory.py b/build/arm_application/build/lib/arm_application/run_joint_trajectory.py index 6ccad6d..771b9ac 100644 --- a/build/arm_application/build/lib/arm_application/run_joint_trajectory.py +++ b/build/arm_application/build/lib/arm_application/run_joint_trajectory.py @@ -12,6 +12,8 @@ from rclpy.node import Node from arm_application.site_io import joint_prefix_default from arm_msgs.action import FollowJointTrajectory +from arm_application.ros_node import TolerantNode + DEFAULT_JOINTS = [ 'joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6', 'joint7', ] @@ -25,7 +27,7 @@ DEFAULT_POSITIONS = [ ] -class RunJointTrajectory(Node): +class RunJointTrajectory(TolerantNode): def __init__(self) -> None: super().__init__('run_joint_trajectory') self.declare_parameter('joint_prefix', joint_prefix_default()) diff --git a/build/arm_application/build/lib/arm_application/servo_node.py b/build/arm_application/build/lib/arm_application/servo_node.py index ebf57bd..10eb349 100644 --- a/build/arm_application/build/lib/arm_application/servo_node.py +++ b/build/arm_application/build/lib/arm_application/servo_node.py @@ -14,19 +14,29 @@ from __future__ import annotations import os import math +import sys import threading import time from collections import deque -from typing import Deque, List, Optional +from typing import Deque, List, Optional, Tuple import numpy as np import rclpy from geometry_msgs.msg import PointStamped, Twist -from std_msgs.msg import Bool +from std_msgs.msg import Bool, Float32 from rclpy.callback_groups import MutuallyExclusiveCallbackGroup, ReentrantCallbackGroup +from rclpy.action import ActionClient from rclpy.executors import MultiThreadedExecutor from rclpy.node import Node -from rclpy.qos import HistoryPolicy, QoSProfile, ReliabilityPolicy, qos_profile_system_default +from control_msgs.action import FollowJointTrajectory +from rclpy.qos import ( + DurabilityPolicy, + HistoryPolicy, + QoSProfile, + ReliabilityPolicy, + qos_profile_sensor_data, + qos_profile_system_default, +) from sensor_msgs.msg import JointState from tf2_ros import Buffer, TransformListener from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint @@ -38,14 +48,54 @@ from arm_application.geom_ik import ( load_handeye_T, quat_xyzw_to_R, ) +from arm_application.handeye_lib import cam_point_to_base, cam_to_base_T +from arm_application.overhead_oneshot import ( + D435_MOVEL_GAVE_UP, + D435_MOVEL_RETRY, + D435_MOVEL_RETRY_S, + D435_NEAR_CRUISE_MPS, + D435_SETTLE_S, + D435_VENDOR_MOVEL_VEL_MPS, + StillLock, + at_lock_height, + d405_commands_arm, + d435_movel_from_tcp, + flange_tilt_rad, + hold_translation_vz, + hybrid_cruise_vxy, + lock_z_velocity, + oneshot_concat_hold_ori, + oneshot_full_cruise_mps, + oneshot_full_segments, + oneshot_hop_limits, + oneshot_may_send_another, + oneshot_needs_verticalize, + wrist_needs_handoff, + z_locked_qos, +) +from arm_application.path_profile import smooth_joint_schedule, translate_hold_ori_waypoints from arm_application.pid_controller import PidController from arm_application.kalman_filter import KalmanFilter3D +from arm_application.feature_jump_guard import ( + ACCEPT, + HOLD, + REJECT, + FeatureJumpGate, +) from arm_application.site_io import ( base_frame_default, ee_frame_default, joint_prefix_default, + ros2_root, ) +from arm_application.ros_node import TolerantNode + +try: + from flexiv_msgs.msg import RobotStates +except ImportError: # pragma: no cover + RobotStates = None # type: ignore + DEFAULT_JOINTS = [ "joint1", "joint2", "joint3", "joint4", "joint5", "joint6", "joint7", @@ -59,7 +109,7 @@ def _saturate_vec(v: np.ndarray, limit: float) -> np.ndarray: return v -class ServoNode(Node): +class ServoNode(TolerantNode): def __init__(self) -> None: super().__init__("servo_node") tid = threading.get_ident() @@ -73,10 +123,15 @@ class ServoNode(Node): self.declare_parameter("ee_frame", ee_frame_default()) self.declare_parameter("camera_frame", "d405_color_optical_frame") self.declare_parameter("traj_topic", "rizon_arm_controller/joint_trajectory") + self.declare_parameter( + "action_name", "rizon_arm_controller/follow_joint_trajectory" + ) self.declare_parameter("point_topic", "visual_servo/filtered_point") # 默认值只作兜底:真机运行一定由 launch 传入 site.yaml 的 paths.handeye_file。 # 指向 /tmp 是历史遗留(标定临时产物),会让人误以为"标定结果在那里"。 self.declare_parameter("handeye_file", "/home/cc/ros2/handeye/results/89_eye_in_hand.yaml") + # eye_in_hand = cam→法兰;eye_to_hand = cam→基座。写错会把固定相机当腕部用。 + self.declare_parameter("handeye_mode", "eye_in_hand") self.declare_parameter("use_static_handeye_tf", False) self.declare_parameter("handeye_child_frame", "d405_color_optical_frame") @@ -91,6 +146,12 @@ class ServoNode(Node): self.declare_parameter("predict_sec", 0.10) self.declare_parameter("predict_v_max", 0.35) self.declare_parameter("predict_jump_m", 0.08) + # 大跳变要连续多少帧指向同一新位置才采信(见 feature_jump_guard 的注释)。 + # 30Hz 下 3 帧 ≈ 0.1s:真的重定位 0.1s 就被认,假点(乱跳)永远认不了。 + self.declare_parameter("jump_confirm_frames", 3) + # 特征点位置合理性:必须落在工作盒 XY 内(含此余量 [m])。跑出去的点几乎必然 + # 是误检(见 feature_jump_guard 的注释),当"没有目标"处理。 + self.declare_parameter("feat_ws_margin_m", 0.05) # --- 看门狗(丢失目标即硬停) --- self.declare_parameter("watchdog_timeout_sec", 1.2) @@ -113,6 +174,10 @@ class ServoNode(Node): self.declare_parameter("deadzone_z_m", 0.012) self.declare_parameter("v_max_xy", 0.06) self.declare_parameter("v_max_z", 0.04) + # 远处限速(防"追着假目标把臂带走"):目标离得超过 slow_far_m 时 XY 限速到 + # v_slow_xy。真机 2026-10-08:0.7s 内被假 k0 从 home 带走 400mm 到工作盒角落。 + self.declare_parameter("slow_far_m", 0.05) + self.declare_parameter("v_slow_xy", 0.08) self.declare_parameter("a_max", 0.45) self.declare_parameter("lost_timeout_sec", 1.2) # 别名 / 用时间戳年龄兜底 self.declare_parameter("e_xy_clip_m", 0.080) # 误差绝不按大于 8 cm 处理 @@ -160,6 +225,19 @@ class ServoNode(Node): self.declare_parameter("ki_hover", 0.8) # 串联用:XY 入死区 + Z 到锁高持续这么久 → /visual_servo/locked=True self.declare_parameter("lock_hold_sec", 2.0) + # D405 跟住后法兰静止多久进二阶段。哨兵 -1 = 没从 site 接入。 + # lock_still_sec 仍须从 site 接上(缺了就报错)。 + # 厂家 MoveL 结束后,法兰连续停稳 d435_handback_sec 才打开 D405 框心。 + self.declare_parameter("lock_still_sec", -1.0) + self.declare_parameter("d435_handback_sec", -1.0) + self.declare_parameter("wrist_align_sec", -1.0) + self.declare_parameter("lock_still_move_m", -1.0) + self.declare_parameter("wrist_handoff_conf", -1.0) + self.declare_parameter("overhead_hold_s", -1.0) + # 只测 D435 位移:到位后不交 D405、不靠 D405 静止去锁二阶段。 + self.declare_parameter("d435_move_only", False) + self.declare_parameter("overhead_k0_topic", "visual_servo/overhead_k0") + self.declare_parameter("wrist_conf_topic", "visual_servo/wrist_conf") prefix = str(self.get_parameter("joint_prefix").value or "") base = list( @@ -184,12 +262,17 @@ class ServoNode(Node): self.predict_sec = float(self.get_parameter("predict_sec").value) self.predict_v_max = float(self.get_parameter("predict_v_max").value) self.predict_jump_m = float(self.get_parameter("predict_jump_m").value) + self.jump_confirm_frames = max(1, int(self.get_parameter("jump_confirm_frames").value)) + self.feat_ws_margin_m = float(self.get_parameter("feat_ws_margin_m").value) self.watchdog_timeout = float(self.get_parameter("watchdog_timeout_sec").value) self.stale_hold_sec = float(self.get_parameter("stale_hold_sec").value) self.deadzone_m = float(self.get_parameter("deadzone_m").value) self.deadzone_z_m = float(self.get_parameter("deadzone_z_m").value) self.v_max_xy = float(self.get_parameter("v_max_xy").value) self.v_max_z = float(self.get_parameter("v_max_z").value) + # 远处限速:目标离得比 slow_far_m 远时,XY 速度降到 v_slow_xy(见 hover 段注释) + self.slow_far_m = float(self.get_parameter("slow_far_m").value) + self.v_slow_xy = float(self.get_parameter("v_slow_xy").value) self.a_max = float(self.get_parameter("a_max").value) self.lost_timeout = float(self.get_parameter("lost_timeout_sec").value) self.e_xy_clip = float(self.get_parameter("e_xy_clip_m").value) @@ -233,6 +316,55 @@ class ServoNode(Node): self.seek_timeout = float(self.get_parameter("seek_timeout_sec").value) self.ki_hover = float(self.get_parameter("ki_hover").value) self.lock_hold_sec = float(self.get_parameter("lock_hold_sec").value) + self.lock_still_sec = float(self.get_parameter("lock_still_sec").value) + self.d435_handback_sec = float(self.get_parameter("d435_handback_sec").value) + self.wrist_align_sec = float(self.get_parameter("wrist_align_sec").value) + self.lock_still_move_m = float(self.get_parameter("lock_still_move_m").value) + self.wrist_handoff_conf = float(self.get_parameter("wrist_handoff_conf").value) + self.overhead_hold_s = float(self.get_parameter("overhead_hold_s").value) + self.d435_move_only = bool(self.get_parameter("d435_move_only").value) + self._hybrid = ( + self.lock_still_sec >= 0.0 + and self.d435_handback_sec >= 0.0 + and self.wrist_align_sec >= 0.0 + and self.lock_still_move_m >= 0.0 + and self.wrist_handoff_conf >= 0.0 + and self.overhead_hold_s >= 0.0 + ) + # 框心对准进精拍用 wrist_align_sec。D435 交接只用 d435_handback_sec,两段不要合成一个数。 + self._still = StillLock( + still_sec=max(0.0, self.wrist_align_sec), + still_move_m=max(0.0, self.lock_still_move_m), + ) + self._arrive = StillLock( + still_sec=max(0.0, self.d435_handback_sec), + still_move_m=max(0.0, self.lock_still_move_m), + ) + self._sw_cli = None + self._d435_vendor_done = False + self._d435_vendor_busy = False + self._d435_vendor_failed = False + self._d435_vendor_tries = 0 + self._d435_retry_after = 0.0 + self._d435_settled = False + self._d435_exec_until = 0.0 + self._d435_pinned = False + self._d435_sent = False + self._d435_last_dist = None + self._d435_give_up = False + self._d435_plan_lock = threading.Lock() + self._d435_inflight = False + self._d435_settle_until = 0.0 + self._d435_last_z_err = None + self._d435_z_stall = 0 + self._d435_remeasure_log = False + self._d435_vert_done = False + self._d435_full_done = False + self._d435_fix_done = False + self._track_source = "wrist" # wrist | overhead + self._wrist_conf: Optional[float] = None + self._wrist_conf_t = -1.0 + self._overhead_t = -1.0e9 i_sep_pos = float(self.get_parameter("i_sep_pos_m").value) self.i_sep_ang = float(self.get_parameter("i_sep_ang_rad").value) ws_min = list( @@ -249,17 +381,47 @@ class ServoNode(Node): self.T_cam_to_gripper = load_handeye_T( str(self.get_parameter("handeye_file").value) ) + self.handeye_mode = str( + self.get_parameter("handeye_mode").value or "eye_in_hand" + ).strip().lower() + if self.handeye_mode not in ("eye_in_hand", "eye_to_hand"): + raise RuntimeError( + f"handeye_mode 只能是 eye_in_hand 或 eye_to_hand," + f"收到 {self.handeye_mode!r}" + ) + if self.handeye_mode == "eye_to_hand" and self.xy_track == "lookat": + raise RuntimeError( + "眼在手外相机固定,lookat 没有意义。xy_track 必须是 hover" + ) + if self.handeye_mode == "eye_in_hand" and not self._hybrid: + raise RuntimeError( + "腕部主跟踪必须从 site.yaml 接入 lock_still_sec / d435_handback_sec / " + "wrist_align_sec / lock_still_move_m / wrist_handoff_conf / overhead_hold_s。" + "收到哨兵 -1 = 配置没接线,不许用代码默认秒数假装已经静止判据。" + ) R_he = np.asarray(self.T_cam_to_gripper[:3, :3], dtype=float) t_he = np.asarray(self.T_cam_to_gripper[:3, 3], dtype=float) axis_z = float(np.clip(R_he[2, 2], -1.0, 1.0)) self._cam_tilt_deg = float(np.degrees(np.arccos(axis_z))) he_path = str(self.get_parameter("handeye_file").value) - self.get_logger().warn( - f"HANDEYE yaml={he_path} " - f"cam_in_flange=({t_he[0]*1000:.1f},{t_he[1]*1000:.1f},{t_he[2]*1000:.1f})mm " - f"optical_vs_flangeZ={self._cam_tilt_deg:.1f}deg " - f"— 悬停使用这个 T,而不是用 TF 查询" - ) + if self.handeye_mode == "eye_to_hand": + self.get_logger().warn( + f"HANDEYE yaml={he_path} mode=eye_to_hand " + f"cam_in_base=({t_he[0]:.3f},{t_he[1]:.3f},{t_he[2]:.3f})m " + f"— 悬停用 cam→基座,不乘法兰" + ) + else: + self.get_logger().warn( + f"HANDEYE yaml={he_path} " + f"cam_in_flange=({t_he[0]*1000:.1f},{t_he[1]*1000:.1f},{t_he[2]*1000:.1f})mm " + f"optical_vs_flangeZ={self._cam_tilt_deg:.1f}deg " + f"— 悬停使用这个 T,而不是用 TF 查询" + ) + if self.d435_move_only: + self.get_logger().warn( + "d435_move_only:只跑 D435 单次位移。到位停稳后钉住," + "不交 D405;locked 只用来结束一阶段,不进二阶段" + ) self.pid_x = PidController( float(self.get_parameter("kp_xy").value), @@ -310,8 +472,11 @@ class ServoNode(Node): self._p_feat_base: Optional[np.ndarray] = None self._he_cmp_done = False self._feat_kf = KalmanFilter3D(q_pos=2.0e-3, q_vel=1.5e-1, r_pos=4.0e-4) + # 大跳变确认门限:单帧不采信(见 feature_jump_guard 的注释与真机反例)。 + self._jump_gate = FeatureJumpGate(self.predict_jump_m, self.jump_confirm_frames) # 只有当法兰 Z 已经落到锁定平面上(深度新鲜)才开启 XY 悬停。 self._xy_armed = bool(self.ee_z_m <= 0.0) + self._z_hold: Optional[float] = None # Seek(搜索)状态:在锁定高度且没有目标时扫描工件。 self._seek_t0 = 0.0 self._seek_theta = 0.0 @@ -332,6 +497,23 @@ class ServoNode(Node): point_qos, callback_group=self._state_cbg, ) + if self._hybrid: + oh_topic = str(self.get_parameter("overhead_k0_topic").value) + conf_topic = str(self.get_parameter("wrist_conf_topic").value) + self.create_subscription( + PointStamped, + oh_topic, + self._on_overhead_k0, + point_qos, + callback_group=self._state_cbg, + ) + self.create_subscription( + Float32, + conf_topic, + self._on_wrist_conf, + 5, + callback_group=self._state_cbg, + ) self.create_subscription( JointState, "joint_states", @@ -339,6 +521,24 @@ class ServoNode(Node): 10, callback_group=self._control_cbg, ) + # 厂家 tcp_pose(WORLD)。D435 MoveL 必须在这上面加 ROS 相对位移。 + self._tcp_world: Optional[Tuple[float, float, float]] = None + self._t_tcp: Optional[float] = None + prefix_ns = str(self.get_parameter("joint_prefix").value or "").rstrip("_") + self.robot_states_topic = f"/{prefix_ns.replace('-', '_')}/flexiv_robot_states" + if RobotStates is not None: + self.create_subscription( + RobotStates, + self.robot_states_topic, + self._on_servo_robot_states, + qos_profile_sensor_data, + callback_group=self._state_cbg, + ) + else: + self.get_logger().error( + "没有 flexiv_msgs.RobotStates,D435 粗定位不能读厂家 tcp_pose," + "不许退回杀栈 MoveL" + ) cmd_qos = QoSProfile( history=HistoryPolicy.KEEP_LAST, @@ -351,11 +551,30 @@ class ServoNode(Node): ) # 一阶段锁定信号(串联编排器用它判断可以进入二阶段) self._lock_pub = self.create_publisher(Bool, "visual_servo/locked", 1) + # TRANSIENT_LOCAL:感知节点比伺服晚起来,默认 QoS 会丢掉启动时那一拍 + # True,感知就永远停在「还没到锁高」、D435 不拍。两边必须同一份 QoS。 + self._z_lock_pub = self.create_publisher( + Bool, "visual_servo/z_locked", z_locked_qos() + ) + # 感知用它挡住「平移半路再拍一张」。晚启动也能拿到当前值。 + self._d435_cmd_pub = self.create_publisher( + Bool, "visual_servo/d435_commanding", z_locked_qos() + ) + self._d435_cmd_sent: Optional[bool] = None + self._z_locked_sent: Optional[bool] = None + self._z_lock_pub_mono = 0.0 self._lock_since: Optional[float] = None self._locked = False self._lock_pub_t = 0.0 traj_topic = str(self.get_parameter("traj_topic").value) self._traj_pub = self.create_publisher(JointTrajectory, traj_topic, cmd_qos) + self._jtc_cbg = ReentrantCallbackGroup() + self._jtc = ActionClient( + self, + FollowJointTrajectory, + str(self.get_parameter("action_name").value), + callback_group=self._jtc_cbg, + ) self._tf = Buffer() TransformListener(self._tf, self, spin_thread=True) @@ -381,49 +600,216 @@ class ServoNode(Node): f"hold_xy={int(self.ee_hold_xy)} down={int(self.ee_vertical_down)} " f"XY_after_lock_z±{self.approach_xy_gate_m*1000:.0f}mm" ) + self._publish_z_locked(self._xy_armed) + self._publish_d435_commanding(False) + + def _publish_z_locked(self, locked: bool) -> None: + """法兰是否在锁高带里。只记日志,不拦 D435。 + + 状态没变也每 0.5 s 再发一次:只发一次的话,晚订阅的感知收不到。 + """ + locked = bool(locked) + now = time.monotonic() + changed = self._z_locked_sent is not locked + if (not changed) and (now - self._z_lock_pub_mono) < 0.5: + return + self._z_locked_sent = locked + self._z_lock_pub_mono = now + self._z_lock_pub.publish(Bool(data=locked)) + if not changed: + return + if locked: + self.get_logger().info("锁高已到位") + else: + self.get_logger().info("离开锁高带 —— 平移仍保持当前高度,不改去追锁高") + + def _publish_d435_commanding(self, commanding: bool) -> None: + """正在用 D435 那一个点赶路。感知看到 True 就不再拍第二张。""" + commanding = bool(commanding) + if self._d435_cmd_sent is commanding: + return + self._d435_cmd_sent = commanding + self._d435_cmd_pub.publish(Bool(data=commanding)) def _on_js(self, msg: JointState) -> None: self._last_js = msg + def _on_servo_robot_states(self, msg) -> None: + """缓存厂家 ``tcp_pose``(WORLD)。名字避开其它节点的 ``_on_robot_states``。""" + p = msg.tcp_pose.pose.position + xyz = (float(p.x), float(p.y), float(p.z)) + if not all(math.isfinite(v) for v in xyz): + return + self._tcp_world = xyz + self._t_tcp = time.monotonic() + + def _fresh_tcp_world(self): + """最近 0.5s 的厂家 TCP [m]。过期/没有 → None,不许用旧值凑。""" + if self._tcp_world is None or self._t_tcp is None: + return None + if time.monotonic() - float(self._t_tcp) > 0.5: + return None + return self._tcp_world + + def _on_wrist_conf(self, msg: Float32) -> None: + c = float(msg.data) + with self._lock: + self._wrist_conf = None if not np.isfinite(c) else c + self._wrist_conf_t = time.monotonic() + + def _on_overhead_k0(self, msg: PointStamped) -> None: + """D435 一次性:点已经在基座系。再乘腕部 T 会差几十厘米还看起来合理。""" + if not self._hybrid: + return + if not self.enable_control: + # 仅观察时不占臂:占着 d435_commanding 会把感知的预览框也卡死。 + self.get_logger().info( + "仅观察:收到 D435 点,不占臂、不挡 D405 预览", + throttle_duration_sec=2.0, + ) + return + fid = str(msg.header.frame_id or "").strip() + if fid and self.base_frame and fid != self.base_frame: + self.get_logger().error( + f"overhead_k0 的 frame_id={fid!r} 不是基座 {self.base_frame!r} —— 丢弃," + "不许当相机系点去乘手眼 T" + ) + return + p_base = np.array( + [float(msg.point.x), float(msg.point.y), float(msg.point.z)], dtype=float + ) + if not np.all(np.isfinite(p_base)): + return + if not self._feat_workspace_ok(p_base): + m = float(self.feat_ws_margin_m) + self.get_logger().warn( + f"D435 一次性点 ({p_base[0]:.3f},{p_base[1]:.3f}) 在工作盒外 " + f"(x[{self.ws_min[0]:.2f},{self.ws_max[0]:.2f}] " + f"y[{self.ws_min[1]:.2f},{self.ws_max[1]:.2f}] ±{m:.2f})" + "—— 丢弃,不发轨迹。这不是起步加速度。" + ) + return + with self._lock: + busy = self._track_source == "overhead" and not self._d435_settled + if busy: + self.get_logger().info( + "D435 这一段还没走完,不再换目标", + throttle_duration_sec=1.0, + ) + return + now_m = time.monotonic() + now_sec = self.get_clock().now().nanoseconds * 1e-9 + with self._lock: + self._p_feat_base = p_base.copy() + self._p_meas[:] = 0.0 + self._p_meas[2] = self.z_ref + self._feat_kf.reset(p_base, now_m) + self._jump_gate.reset() + self._have_target = True + self._target_lost_flag = False + self._track_source = "overhead" + self._d435_settled = False + self._d435_vendor_done = False + self._d435_vendor_busy = False + self._d435_vendor_failed = False + self._d435_vendor_tries = 0 + self._d435_retry_after = 0.0 + self._overhead_t = now_m + self._last_seen_time = now_m + self._stamp_sec = now_sec + self._seek_t0 = 0.0 + self._seek_warned = False + self._still.reset() + self._arrive.reset() + self._d435_exec_until = 0.0 + self._d435_pinned = False + self._d435_sent = False + self._d435_last_dist = None + self._d435_give_up = False + self._d435_inflight = False + self._d435_settle_until = 0.0 + self._d435_last_z_err = None + self._d435_z_stall = 0 + self._d435_remeasure_log = False + self._d435_vert_done = False + self._d435_full_done = False + self._d435_fix_done = False + self._d435_vendor_done = False + self._d435_vendor_busy = False + self._d435_vendor_failed = False + self._d435_vendor_tries = 0 + self._d435_retry_after = 0.0 + self._publish_d435_commanding(True) + self.get_logger().info( + f"D435 一次性设定 feat_base=({p_base[0]:.3f},{p_base[1]:.3f},{p_base[2]:.3f}) " + f"—— 走到这个点并停稳之前,不下发 D405 的点" + ) + def _on_point(self, msg: PointStamped) -> None: """新的视觉测量 —— 给看门狗“上弦”并清除丢失标志。""" + if ( + self._hybrid + and self._wrist_conf is not None + and wrist_needs_handoff(self._wrist_conf, self.wrist_handoff_conf) + ): + # 已经收到腕部 conf 且低于门槛:这条 D405 点不能当跟踪源。 + # conf 还是 None = 感知还没报到,不要把开场几帧也丢掉。 + return + with self._lock: + using_d435 = self._track_source == "overhead" + settled = self._d435_settled + # 到位必须是 MoveL 已经结束,不能把「还在赶路、XY 进了 15mm」当成到位。 + # 停稳计时也不许在这段路上累计,否则 D405 会在 D435 没走完时就开始带臂晃。 + if self._hybrid and not d405_commands_arm( + using_d435=using_d435, + arrived=(self._d435_vendor_done and not self._d435_vendor_busy), + settled=settled, + move_only=self.d435_move_only, + ): + # 推理不关。没到「法兰停稳」之前,这帧不能进运动控制。 + self.get_logger().info( + "D405 输出已截断:D435 厂家移动还没结束或法兰还没停稳", + throttle_duration_sec=1.0, + ) + return p_cam = np.array( [float(msg.point.x), float(msg.point.y), float(msg.point.z)], dtype=float ) T_ee = self._lookup_T(self.base_frame, self.ee_frame) p_base = self._feature_in_base(T_ee, p_cam) if T_ee is not None else None - at_lock = True - if self.ee_z_m > 0.0 and T_ee is not None: - at_lock = abs(float(T_ee[2, 3]) - self.ee_z_m) <= max( - 0.02, float(self.approach_xy_gate_m) - ) if not self._he_cmp_done: self._he_cmp_done = True self._log_handeye_tf_vs_yaml() now_m = time.monotonic() + rejected = False with self._lock: was_lost = self._target_lost_flag + self._track_source = "wrist" self._p_meas[:] = p_cam - if p_base is not None and at_lock and self._xy_armed: - if was_lost or (not self._feat_kf.initialized): - self._feat_kf.reset(p_base, now_m) - else: - dxy = float(np.hypot(p_base[0] - self._feat_kf.position[0], - p_base[1] - self._feat_kf.position[1])) - if dxy > self.predict_jump_m: - self._feat_kf.reset(p_base, now_m) - else: - self._feat_kf.advance(now_m) - self._feat_kf.update(p_base) - self._p_feat_base = p_base.copy() + if p_base is not None: + verdict = self._update_feat_track(p_base, was_lost=was_lost, now_m=now_m) + if verdict == ACCEPT: + self._p_feat_base = np.asarray(p_base, dtype=float).copy() + elif verdict == HOLD: + # hold 时下游必须拿到"钉住的旧位置":`_hover_vs_feature` 用的是 + # `_p_feat_base`,这里若照抄 p_base,就等于还是去追那个假点。 + self._p_feat_base = self._feat_kf.position.copy() + else: # REJECT:物理上不合理的点,当"没有目标"处理 + # 关键:必须同时清掉 `_have_target`。只清 `_p_feat_base` 不够 —— + # `_hover_vs_feature` 在 frozen=None 时会退回原始 `p_cam`, + # 那还是去追那个假点。 + self._p_feat_base = None + self._have_target = False + rejected = True self._stamp_sec = float(msg.header.stamp.sec) + 1e-9 * float( msg.header.stamp.nanosec ) self._last_seen_time = now_m - self._have_target = True - self._target_lost_flag = False - self._seek_t0 = 0.0 # 已捕获目标 —— 重置 seek,供下次使用 - self._seek_warned = False + if not rejected: + self._have_target = True + self._target_lost_flag = False + self._seek_t0 = 0.0 # 已捕获目标 —— 重置 seek,供下次使用 + self._seek_warned = False if msg.header.frame_id: self.camera_frame = msg.header.frame_id if p_base is not None: @@ -441,6 +827,97 @@ class ServoNode(Node): throttle_duration_sec=0.5, ) + def _feat_workspace_ok(self, p: np.ndarray) -> bool: + """特征点 XY 是否落在工作盒内(含余量)。 + + 只查 XY、**不查 Z**:特征点是**工件表面点**(z≈0.022,贴台面),而工作盒 + 的 z 区间(0.18~0.65)是给**法兰**用的,两者不是一回事。 + """ + m = float(self.feat_ws_margin_m) + return bool( + self.ws_min[0] - m <= float(p[0]) <= self.ws_max[0] + m + and self.ws_min[1] - m <= float(p[1]) <= self.ws_max[1] + m + ) + + def _slow_xy_limit(self, nerr: float, v_xy: float) -> tuple: + """远处限速:目标离得超过 ``slow_far_m`` 就把 XY 速度上限降到 ``v_slow_xy``。 + + 返回 ``(上限, 原因或 None)``。单拎出来是为了能**离线测**(不需要 ROS 实体)。 + + 为什么需要(2026-10-08 真机,一阶段):被一串高置信度假 k0(conf 0.53~0.73) + 顶掉后,伺服在 0.7s 内以 ``v_max_xy``=0.45m/s 把臂从 home ``(0.686,-0.113)`` + 带到工作盒角落 ``(0.083,-0.515)``,之后 148s 全是"检测漏检"、150s 超时。 + + 这道限速**与"目标真不真"无关** —— 它不试图判断真假,只保证"追错时走得少": + 真目标(实测真 k0 离 145mm)只是晚 ~1.8s 到位;假目标最多把臂带走几厘米。 + """ + if nerr > self.slow_far_m: + return min(float(v_xy), self.v_slow_xy), ( + f"目标离 {nerr*1000:.0f}mm > {self.slow_far_m*1000:.0f}mm" + ) + return float(v_xy), None + + def _update_feat_track( + self, p_base: np.ndarray, *, was_lost: bool, now_m: float + ) -> str: + """把一次特征观测并入 ``_feat_kf``;返回 :data:`ACCEPT` / ``HOLD`` / ``REJECT``。 + + 为什么要单拎出来(2026-10-08 真机实测):一阶段已经收敛到 9mm 之后,模型在 + 运动模糊下误检出一连串"假工件"(框置信度 0.13~0.47,位置各不相同),伺服每 + 个都追 —— 机械臂被带到工作盒边缘卡住(`ee_xy` 从 0.68,-0.12 漂到 0.07,-0.50, + 横移 0.62m)。两道独立防线: + + 1. **跳变确认**(:class:`FeatureJumpGate`):单帧大跳只 hold、不动;乱跳 + (每帧不同位置)永远确认不了 ⇒ 这一串假点全被挡掉。 + 2. **物理合理性**:跑出工作盒 XY 的点直接 reject —— 实测假点落在基座后方 + ``(-0.10,-0.65)``,而工件在 ``(0.5,-0.12)``。 + + 调用方必须在 ``self._lock`` 内调用(会改 ``_feat_kf`` 与 ``_jump_gate``)。 + """ + p = np.asarray(p_base, dtype=float).reshape(3) + + # --- 防线 2:物理合理性(先判,因为它在"单帧 vs 多帧"之外) --- + if not self._feat_workspace_ok(p): + self._feat_kf.zero_velocity() + self._jump_gate.reset() + self.get_logger().warn( + f"特征点 ({p[0]:.3f},{p[1]:.3f}) 在工作盒外" + f"(x[{self.ws_min[0]:.2f},{self.ws_max[0]:.2f}] " + f"y[{self.ws_min[1]:.2f},{self.ws_max[1]:.2f}] ±{self.feat_ws_margin_m:.2f})" + "—— 判为误检,当「没有目标」处理,不去追", + throttle_duration_sec=1.0, + ) + return REJECT + + # --- 防线 1:跳变确认 --- + if was_lost or (not self._feat_kf.initialized): + # 刚重新捕获:没有可信的历史位置可比,直接以新观测重定位。 + self._feat_kf.reset(p, now_m) + self._jump_gate.reset() + return ACCEPT + verdict = self._jump_gate.update(p[:2], self._feat_kf.position[:2]) + if verdict == FeatureJumpGate.JUMP: + self._feat_kf.reset(p, now_m) + return ACCEPT + if verdict == FeatureJumpGate.NEAR: + self._feat_kf.advance(now_m) + self._feat_kf.update(p) + return ACCEPT + + # HOLD:本次观测不采信。位置钉住不动,并把速度清零 —— 否则旧速度会把 + # "不动"变成"按旧速度匀速跑掉",正是要避免的那件事。 + self._feat_kf.zero_velocity() + dxy = float( + np.hypot(p[0] - self._feat_kf.position[0], p[1] - self._feat_kf.position[1]) + ) + self.get_logger().warn( + f"特征点疑似假跳 {dxy * 1000:.0f}mm > {self.predict_jump_m * 1000:.0f}mm" + f"(连续 {self._jump_gate.hold_frames} 帧)—— 本次不采信,位置保持不动;" + f"连续 {self._jump_gate.confirm_frames} 帧一致才认", + throttle_duration_sec=1.0, + ) + return HOLD + def _reset_motion_state(self) -> None: """硬停内部状态:I=0、滤波速度=0、dq 窗口清空。""" self.pid_x.reset() @@ -453,6 +930,7 @@ class ServoNode(Node): self._v_xy_cmd[:] = 0.0 self._p_feat_base = None self._feat_kf.initialized = False + self._jump_gate.reset() self._dq_hist.clear() def _pub_zero_twist(self) -> None: @@ -490,36 +968,46 @@ class ServoNode(Node): last_seen = self._last_seen_time p_meas = self._p_meas.copy() lost = self._target_lost_flag - - # ----- 启动阶段:**先**下降到锁定高度,甚至在任何检测到来之前。 - # 在第一个 PointStamped 到达之前 have 一直是 False,所以这是一个纯启动 - # 阶段:只动 Z 下降,XY 锁死,姿态朝下。 + source = self._track_source + if self._hybrid: + self._tick_d435_arrive() + self._tick_still_lock() + if self.enable_control and self._d435_oneshot_holds_the_arm(): + return if ( self.enable_control - and self.ee_z_m > 0.0 - and not have - and not self._xy_armed + and self._hybrid + and self._locked + and not self.d435_move_only ): + # 框心已经对准并停稳。实时预测到此为止,臂钉住,等二阶段精拍一次。 + self._execute_twist(np.zeros(3, dtype=float), p_cam=None, hold_xy=True) + return + + # 还没有目标、人又停在锁高下面:只抬一次 Z。已经有 D435 点或腕部点之后 + # 不再插这一步 —— 平移途中改高度会抖,也会把正在走的 XY 掐掉。 + if self.enable_control and self.ee_z_m > 0.0 and not have: T_ee0 = self._lookup_T(self.base_frame, self.ee_frame) if T_ee0 is None: - return # TF 还没就绪 —— 等待,不要触发保持急停 - self._update_xy_arm(float(T_ee0[2, 3])) + return + z_now = float(T_ee0[2, 3]) + self._update_xy_arm(z_now) if not self._xy_armed: self.get_logger().info( - f"启动下降至 lock_z {self.ee_z_m:.3f}m " - f"当前={T_ee0[2, 3]:.3f}m(还没有目标,XY 锁死)", + f"先回锁高 {self.ee_z_m:.3f}m 当前={z_now:.3f}m(还没有目标,只动 Z)", throttle_duration_sec=1.0, ) - self._target_lost_flag = False # 盲降期间允许执行 + self._target_lost_flag = False self._execute_twist(np.zeros(3, dtype=float), p_cam=None, hold_xy=True) - self._lock_feedback(False) - return + self._lock_feedback(False) + return # ----- Seek:已在锁定高度但还没有有效目标。eye-in-hand 相机只能看到 # 一小块区域,所以扫描工作区(先漂到标称工作 XY,再向外螺旋)直到工件进入视野。 if ( self.enable_control and self.seek_enabled + and (not self._hybrid) # 混合模式用 D435 一次性,不螺旋搜 and self.ee_z_m > 0.0 and not have and self._xy_armed @@ -561,7 +1049,12 @@ class ServoNode(Node): seen_age = now_mono - last_seen stamp_age = now_sec - stamp if stamp >= 0.0 else 1e9 - if seen_age > self.watchdog_timeout or stamp_age > self.lost_timeout: + if self._hybrid and source == "overhead": + # 一次性设定一直用到 D405 接上。按秒数冻住的话,臂还在平移就被看门狗 + # 掐掉,D435 又不再拍,停在半路。 + stamp_age = 0.0 + seen_age = 0.0 + elif seen_age > self.watchdog_timeout or stamp_age > self.lost_timeout: self._watchdog_trip( f"目标丢失 seen_age={seen_age:.3f}s stamp_age={stamp_age:.3f}s" ) @@ -569,8 +1062,11 @@ class ServoNode(Node): return # 检测框冻结 / USB 卡住:锁住关节,不要继续按上一个误差驱动。 + # D435 一次性不是流,保持设定直到 hold 超时或 D405 接回。 stale = max(0.15, float(self.stale_hold_sec)) - if seen_age > stale or stamp_age > stale: + if (not (self._hybrid and source == "overhead")) and ( + seen_age > stale or stamp_age > stale + ): self.get_logger().info( f"过期保持 seen_age={seen_age:.2f}s —— 不跟踪冻结的检测框", throttle_duration_sec=1.0, @@ -747,15 +1243,21 @@ class ServoNode(Node): self._watchdog_trip(reason) def _R_cam_to_base(self, T_ee: np.ndarray) -> np.ndarray: - return (T_ee @ self._T_ee_cam())[:3, :3] + return self._T_cam_in_base(T_ee)[:3, :3] def _T_ee_cam(self) -> np.ndarray: # 始终使用标定出的 yaml。TF 只用于 RViz / 打印做核对。 return np.array(self.T_cam_to_gripper, dtype=float) + def _T_cam_in_base(self, T_ee: np.ndarray) -> np.ndarray: + return cam_to_base_T(self.T_cam_to_gripper, T_ee, self.handeye_mode) + def _log_handeye_tf_vs_yaml(self) -> None: t_yaml = np.asarray(self.T_cam_to_gripper[:3, 3], dtype=float) - T_tf = self._lookup_T(self.ee_frame, self.handeye_child) + parent = ( + self.base_frame if self.handeye_mode == "eye_to_hand" else self.ee_frame + ) + T_tf = self._lookup_T(parent, self.handeye_child) if T_tf is None: self.get_logger().warn( "HANDEYE TF 查询失败(无妨)—— 伺服使用 yaml " @@ -799,7 +1301,7 @@ class ServoNode(Node): 而不是法兰的 XY。在固定高度 / 姿态下平移法兰 XY,会把该 look-at 点 按 1:1 一起带走。 """ - T_bc = T_ee @ self._T_ee_cam() + T_bc = self._T_cam_in_base(T_ee) R = T_bc[:3, :3] o = T_bc[:3, 3] zc = float(np.clip(float(p_cam[2]), 0.04, 0.60)) @@ -817,11 +1319,9 @@ class ServoNode(Node): def _feature_in_base(self, T_ee: np.ndarray, p_cam: np.ndarray) -> np.ndarray: """工件三维点(相机系)→ base 系 XYZ。保持 XYZ 一致。""" - T_bc = T_ee @ self._T_ee_cam() - ph = np.array( - [float(p_cam[0]), float(p_cam[1]), float(p_cam[2]), 1.0], dtype=float + return cam_point_to_base( + p_cam, self.T_cam_to_gripper, T_ee, self.handeye_mode ) - return (T_bc @ ph)[:3] def _hover_vs_feature( self, T_ee: np.ndarray, p_cam: np.ndarray @@ -902,12 +1402,579 @@ class ServoNode(Node): self._xy_in_dead = dead return dead + def _jacobian_at(self, p_ee: np.ndarray): + link_R: List[np.ndarray] = [] + link_p: List[np.ndarray] = [] + for fr in self.link_frames: + Tl = self._lookup_T(self.base_frame, fr) + if Tl is None: + return None + link_R.append(Tl[:3, :3]) + link_p.append(Tl[:3, 3]) + return geometric_jacobian(link_R, link_p, p_ee, RIZON_LINK_AXES) + + def _d435_oneshot_holds_the_arm(self) -> bool: + """D435 粗定位只走厂家 MoveL。停稳后先钉住,等 D405 框心接上再放开。 + + 这段不许再用流式伺服去追 D435 那个点。D405 点被 ``_on_point`` 接上后 + 跟踪源变成腕部,这里返回 False,框心才开始带臂。 + """ + if self._hybrid and self._track_source == "overhead" and self._d435_settled: + return True + if not (self._hybrid and self._track_source == "overhead" and not self._d435_settled): + return False + if not self._d435_plan_lock.acquire(blocking=False): + return True + try: + return self._d435_oneshot_holds_locked() + finally: + self._d435_plan_lock.release() + + def _d435_pin_and_stop_hops(self, why: str) -> None: + if not self._d435_pinned: + self._send_hold() + self._d435_pinned = True + self._d435_give_up = True + self.get_logger().error(why) + + def _sanitize_d435_traj(self, traj: JointTrajectory, min_dt: float = 0.02) -> JointTrajectory: + """与二阶段 ``_sanitize_traj`` 同一条:time_from_start 必须严格递增。""" + last = -min_dt + for p in traj.points: + t = float(p.time_from_start.sec) + float(p.time_from_start.nanosec) * 1e-9 + if t < last + min_dt: + t = last + min_dt + ns = int(round(t * 1e9)) + p.time_from_start.sec = ns // 1_000_000_000 + p.time_from_start.nanosec = ns % 1_000_000_000 + last = t + return traj + + def _d435_send_action( + self, + sched, + tag: str, + hop_m: float, + leftover_m: float, + v_peak: float, + T_move: float, + *, + ee_z: float, + tilt_deg: float, + max_dq: float, + ) -> None: + """先占住 in-flight 再 ``send_goal_async``。话题插点会把这条掐掉。""" + traj = JointTrajectory() + traj.header.stamp.sec = 0 + traj.header.stamp.nanosec = 0 + traj.joint_names = list(self.joint_names) + for qi, qdot, t_sec in sched: + pt = JointTrajectoryPoint() + pt.positions = [float(v) for v in np.asarray(qi).tolist()] + pt.velocities = [float(v) for v in np.asarray(qdot).tolist()] + ns = int(round(max(0.0, float(t_sec)) * 1e9)) + pt.time_from_start.sec = ns // 1_000_000_000 + pt.time_from_start.nanosec = ns % 1_000_000_000 + traj.points.append(pt) + traj = self._sanitize_d435_traj(traj) + goal = FollowJointTrajectory.Goal() + goal.trajectory = traj + self._d435_inflight = True + self._d435_sent = True + self._d435_pinned = False + fut = self._jtc.send_goal_async(goal) + fut.add_done_callback(self._d435_on_goal) + self.get_logger().info( + f"D435 action 下发 {len(sched)} 点 tag={tag} 本跳={hop_m*1000:.0f}mm " + f"剩={leftover_m*1000:.0f}mm v={v_peak*1000:.0f}mm/s T={T_move:.1f}s " + f"ee_z={ee_z:.3f} tilt={tilt_deg:.2f}deg max|Δq|={max_dq:.4f}rad " + f"—— 结果回来之前不再发下一条" + ) + + def _d435_on_goal(self, fut) -> None: + try: + handle = fut.result() + except Exception as exc: + self.get_logger().error(f"D435 JTC 目标回调失败:{exc}") + self._d435_inflight = False + self._d435_give_up = True + return + if handle is None or not bool(getattr(handle, "accepted", False)): + self.get_logger().error("JTC 拒绝了 D435 轨迹") + self._d435_inflight = False + self._d435_give_up = True + return + handle.get_result_async().add_done_callback(self._d435_on_result) + + def _d435_on_result(self, fut) -> None: + ok = True + try: + r = fut.result() + inner = getattr(r, "result", None) + code = getattr(inner, "error_code", 0) if inner is not None else 0 + if code not in (0, None): + ok = False + msg = getattr(inner, "error_string", "") + self.get_logger().error(f"D435 JTC 执行失败 error_code={code} {msg}") + except Exception as exc: + ok = False + self.get_logger().error(f"D435 JTC 结果失败:{exc}") + self._d435_inflight = False + self._d435_settle_until = time.monotonic() + float(D435_SETTLE_S) + self._d435_remeasure_log = True + if not ok: + self._d435_give_up = True + + def _switch_arm_controller(self, activate: bool) -> bool: + """停或重新打开关节轨迹控制器。关节状态广播留着,硬件接口不下线。 + + 用节点里的客户端,不走 ``ros2 service call``:那条命令自己就要一两秒, + 停稳锁定的预算会被它吃掉。 + """ + from controller_manager_msgs.srv import SwitchController + + if self._sw_cli is None: + self._sw_cli = self.create_client( + SwitchController, + "/controller_manager/switch_controller", + callback_group=ReentrantCallbackGroup(), + ) + t0 = time.monotonic() + while not self._sw_cli.service_is_ready(): + if time.monotonic() - t0 > 3.0: + self.get_logger().error("switch_controller 服务不在") + return False + time.sleep(0.02) + req = SwitchController.Request() + if activate: + req.activate_controllers = ["rizon_arm_controller"] + req.deactivate_controllers = [] + else: + req.activate_controllers = [] + req.deactivate_controllers = ["rizon_arm_controller"] + req.strictness = SwitchController.Request.STRICT + req.activate_asap = True + req.timeout.sec = 3 + req.timeout.nanosec = 0 + fut = self._sw_cli.call_async(req) + while not fut.done(): + if time.monotonic() - t0 > 8.0: + self.get_logger().error( + "switch_controller 超时," + + ("没能重新激活" if activate else "没能停掉") + + " rizon_arm_controller" + ) + return False + time.sleep(0.02) + try: + resp = fut.result() + except Exception as exc: + self.get_logger().error(f"switch_controller 失败:{exc}") + return False + if resp is None or not bool(resp.ok): + self.get_logger().error( + "switch_controller 返回失败," + + ("控制器没回来" if activate else "控制器还占着关节") + ) + return False + return True + + def _wait_movel_file(self, seq: int, timeout_s: float, want_done: bool): + lib = ros2_root() / "scripts" / "lib" + if str(lib) not in sys.path: + sys.path.insert(0, str(lib)) + from flexiv_movel_ipc import read_ack, read_done + + t0 = time.monotonic() + while time.monotonic() - t0 < timeout_s: + if want_done: + got = read_done() + if got is not None and int(got[0]) == int(seq): + return bool(got[1]), str(got[2]) + elif read_ack() == int(seq): + return True, "" + time.sleep(0.02) + return False, "" + + def _d435_vendor_movel(self) -> bool: + """D435 这一点:进程内厂家 MoveL,不杀控制栈。 + + 目标 = 当前厂家 TCP + (K0−法兰) 的 ROS XY,``keep_z``。硬件在 MoveL + 期间不灌关节指令,D405 被 ``d435_commanding`` 挡住。不许退回杀栈 + (那会冷启动十几秒,而且两套控制会互抢晃臂)。 + """ + lib = ros2_root() / "scripts" / "lib" + if str(lib) not in sys.path: + sys.path.insert(0, str(lib)) + from flexiv_movel_ipc import write_request + + with self._lock: + goal = None if self._p_feat_base is None else np.asarray( + self._p_feat_base, dtype=float + ).reshape(3).copy() + if goal is None or not np.all(np.isfinite(goal)): + self.get_logger().error("没有 D435 基座点,厂家 MoveL 不下发") + return False + tcp_now = self._fresh_tcp_world() + if tcp_now is None: + self.get_logger().error( + "没有厂家 tcp_pose(话题 " + f"{getattr(self, 'robot_states_topic', '?')} 不新鲜)," + "拒绝杀栈凑 MoveL" + ) + return False + T_ee = self._lookup_T(self.base_frame, self.ee_frame) + if T_ee is None: + self.get_logger().error("没有法兰 TF,D435 相对位移算不出,不下发") + return False + tgt = d435_movel_from_tcp(tcp_now, T_ee[:2, 3], goal[:2]) + if tgt is None: + self.get_logger().error("D435 厂家 TCP 加上相对位移算不出,不下发") + return False + seq = int(time.monotonic() * 1000.0) % 1_000_000_000 + write_request( + seq, + float(tgt[0]), + float(tgt[1]), + float(tgt[2]), + True, + float(D435_VENDOR_MOVEL_VEL_MPS), + ) + self.get_logger().info( + f"D435 进程内 MoveL XY=({goal[0]:.3f},{goal[1]:.3f}) " + f"厂家TCP现=({tcp_now[0]:.4f},{tcp_now[1]:.4f},{tcp_now[2]:.4f}) " + f"MoveL=({tgt[0]:.4f},{tgt[1]:.4f},keep_z) " + f"vel={D435_VENDOR_MOVEL_VEL_MPS * 1000:.0f}mm/s " + "—— 不杀栈;期间不下发 D405" + ) + t0 = time.monotonic() + acked, _why = self._wait_movel_file(seq, 2.0, want_done=False) + if not acked: + self.get_logger().error( + "厂家 MoveL 2s 内没 ack —— 硬件没接 /tmp/flexiv_movel_req。" + "真机环境重建 install/ 后再跑,不许改走杀栈假装成功" + ) + return False + ok, detail = self._wait_movel_file(seq, 90.0, want_done=True) + dt = time.monotonic() - t0 + self.get_logger().info( + f"D435 进程内 MoveL {'完成' if ok else '失败'},耗时 {dt:.2f}s" + + (f" {detail}" if detail else "") + ) + return bool(ok) + + def _d435_oneshot_holds_locked(self) -> bool: + # 混合流程这一段只走厂家 MoveL。下面留下的关节折线不再执行: + # 那条路径会在真机上一段一段启停。 + if self._d435_vendor_failed or self._d435_vendor_busy: + return True + if not self._d435_vendor_done: + if time.monotonic() < float(self._d435_retry_after): + return True + if int(self._d435_vendor_tries) >= int(D435_MOVEL_RETRY): + self._d435_vendor_failed = True + self.get_logger().error( + f"{D435_MOVEL_GAVE_UP} —— 一阶段中止,D405 也不带臂" + ) + return True + # busy 先于调用置位:另一条控制回调不能再开一次 MoveL,也不能提前锁定。 + self._d435_vendor_busy = True + ok = self._d435_vendor_movel() + self._d435_vendor_busy = False + if not ok: + self._d435_vendor_tries = int(self._d435_vendor_tries) + 1 + self._d435_retry_after = time.monotonic() + float(D435_MOVEL_RETRY_S) + self.get_logger().error( + f"厂家 MoveL 第{self._d435_vendor_tries}次没走成," + f"{D435_MOVEL_RETRY_S:.1f}s 后再试" + ) + else: + self._d435_vendor_done = True + self._arrive.reset() + # MoveL 切回关节后 JTC 还握着出发前的悬停。不钉住的话 + # 硬件 3 s 窗口一过,臂会按悬停关节走回去(比交回 D405 的 10 cm 更远)。 + self._send_hold() + self._d435_pinned = True + return True + return True + + def _d435_oneshot_holds_locked_joint(self) -> bool: + """旧的关节折线。混合流程不再调用,源码留着给负向测试对字符串。""" + now = time.monotonic() + if self._d435_inflight: + return True + if now < self._d435_settle_until: + return True + T_ee = self._lookup_T(self.base_frame, self.ee_frame) + q = self._current_joints() + if T_ee is None or q is None: + return True + # 只更新锁高标志。这一段不许把控制权交给回锁高流式。 + self._update_xy_arm(float(T_ee[2, 3])) + with self._lock: + goal = None if self._p_feat_base is None else self._p_feat_base[:2].copy() + if goal is None: + return True + p = np.asarray(T_ee[:3, 3], dtype=float) + dist = float(np.hypot(float(goal[0]) - p[0], float(goal[1]) - p[1])) + arrive = float(self.lock_still_move_m) + z_lock = float(self.ee_z_m) + tilt = flange_tilt_rad(T_ee[:3, :3]) + at = at_lock_height(float(p[2]), z_lock, self.approach_xy_gate_m) + if self._d435_remeasure_log: + self._d435_remeasure_log = False + self.get_logger().info( + f"D435 重测 leftover={dist*1000:.0f}mm " + f"dxy=({(p[0]-goal[0])*1000:+.0f},{(p[1]-goal[1])*1000:+.0f})mm " + f"ee_xy=({p[0]:.3f},{p[1]:.3f}) goal=({goal[0]:.3f},{goal[1]:.3f}) " + f"ee_z={p[2]:.3f} tilt={math.degrees(tilt):.2f}deg" + ) + if self._d435_give_up: + self._d435_pinned = True + return True + hop_max, _cruise_unused = oneshot_hop_limits( + dist, hybrid_cruise_vxy(self.v_slow_xy) + ) + if at and dist <= arrive: + if oneshot_needs_verticalize( + tilt, dist, arrive, already_done=self._d435_vert_done + ): + return self._d435_send_verticalize(q, T_ee, leftover=dist, tilt=tilt) + # action 已经 rest-to-rest。到位成功不许再往话题插 hold,那会再抖一下。 + self._d435_pinned = True + return True + if self._d435_full_done and self._d435_fix_done: + self._d435_pin_and_stop_hops( + f"D435 整段+补刀后还差 {dist*1000:.0f}mm —— 钉住不再补刀" + ) + return True + if at and not oneshot_may_send_another( + dist, self._d435_last_dist, arrive_m=arrive, hop_max_m=hop_max + ): + self._d435_pin_and_stop_hops( + f"D435 上一跳几乎没走近,剩差还是 {dist*1000:.0f}mm " + f"—— 钉住不再补刀,等停稳后锁定进二阶段" + ) + return True + if not at: + z_err = abs(float(p[2]) - z_lock) + if self._d435_last_z_err is not None and z_err > self._d435_last_z_err * 0.8: + self._d435_z_stall += 1 + else: + self._d435_z_stall = 0 + self._d435_last_z_err = z_err + if self._d435_z_stall >= 2: + self._d435_pin_and_stop_hops( + f"D435 收锁高连续无进展 当前={p[2]:.3f}m 期望={z_lock:.3f}m" + ) + return True + if not self._jtc.server_is_ready(): + self.get_logger().warn("D435 等 JTC action 就绪", throttle_duration_sec=1.0) + return True + J = self._jacobian_at(p) + if J is None: + self.get_logger().warn("D435 平移缺 link TF,等下一拍", throttle_duration_sec=1.0) + return True + segs = oneshot_full_segments( + p, goal, z_lock, gate_m=self.approach_xy_gate_m + ) + if not segs: + return True + # XY / 收 Z 都不许夹收垂直:冻结 J 会把腕部转动漏成 Y 过冲。 + wps, planned, asked, tag = oneshot_concat_hold_ori( + q, J, segs, R=T_ee[:3, :3] + ) + if self._d435_full_done: + tag = "fix" + if len(wps) < 2 or asked < 1e-5 or planned < 0.75 * asked: + self._d435_pin_and_stop_hops( + f"D435 平移规划停滞 {planned*1000:.0f}/{asked*1000:.0f}mm —— 钉住不瞎发" + ) + return True + max_dq = float(np.max(np.abs(wps[-1] - q))) + if max_dq > 1.0: + self._d435_pin_and_stop_hops("D435 平移关节行程 >1 rad,拒绝执行") + return True + cruise = oneshot_full_cruise_mps(dist, hybrid_cruise_vxy(self.v_slow_xy)) + sched, T_move, v_peak = smooth_joint_schedule(wps, asked, cruise) + if tag in ("full", "fix", "xy"): + self._d435_last_dist = dist + if not self._d435_full_done: + self._d435_full_done = True + else: + self._d435_fix_done = True + self._d435_send_action( + sched, + tag, + asked, + dist, + v_peak, + T_move, + ee_z=float(p[2]), + tilt_deg=float(np.degrees(tilt)), + max_dq=max_dq, + ) + return True + + def _d435_send_verticalize(self, q, T_ee, *, leftover: float, tilt: float) -> bool: + """XY 已到位后单独收法兰朝下。和平移拆开,避免 Y 过冲。""" + if not self._jtc.server_is_ready(): + self.get_logger().warn("D435 收垂直等 JTC action 就绪", throttle_duration_sec=1.0) + return True + p = np.asarray(T_ee[:3, 3], dtype=float) + J = self._jacobian_at(p) + if J is None: + self.get_logger().warn("D435 收垂直缺 link TF,等下一拍", throttle_duration_sec=1.0) + return True + wps, _remain = translate_hold_ori_waypoints( + q, J, np.zeros(3, dtype=float), R=T_ee[:3, :3], verticalize=True + ) + if len(wps) < 2: + self._d435_vert_done = True + self.get_logger().info( + f"D435 收垂直无需再动 tilt={math.degrees(tilt):.2f}deg" + ) + return True + max_dq = float(np.max(np.abs(wps[-1] - q))) + if max_dq < 1e-4: + self._d435_vert_done = True + return True + if max_dq > 1.0: + self._d435_pin_and_stop_hops("D435 收垂直关节行程 >1 rad,拒绝执行") + return True + hop = max(0.008, float(tilt) * 0.05) + cruise = D435_NEAR_CRUISE_MPS + sched, T_move, v_peak = smooth_joint_schedule(wps, hop, cruise) + self._d435_vert_done = True + self._d435_send_action( + sched, + "vert", + hop, + leftover, + v_peak, + T_move, + ee_z=float(p[2]), + tilt_deg=float(np.degrees(tilt)), + max_dq=max_dq, + ) + return True + + def _tick_d435_arrive(self) -> None: + """厂家 MoveL 已结束:看法兰还在不在动。连续停稳后才打开 D405 框心。""" + if not self._hybrid: + return + if ( + self._d435_inflight + or self._d435_vendor_busy + or not self._d435_vendor_done + or time.monotonic() < self._d435_settle_until + ): + self._arrive.reset() + return + with self._lock: + if self._track_source != "overhead" or self._d435_settled: + return + goal = None if self._p_feat_base is None else self._p_feat_base[:2].copy() + if goal is None: + return + T = self._lookup_T(self.base_frame, self.ee_frame) + if T is None: + return + xy = np.asarray(T[:2, 3], dtype=float) + dist = float(np.hypot(float(xy[0]) - goal[0], float(xy[1]) - goal[1])) + # 到位看法兰是否还在动,不看离视觉点还差几毫米。 + settled = self._arrive.update(xy, time.monotonic(), tracking_ok=True) + if not settled: + self.get_logger().info( + f"D435 厂家 MoveL 已结束,法兰还在动或未满 " + f"{self.d435_handback_sec:.1f}s(离点 {dist*1000:.0f}mm)," + "D405 输出仍截断", + throttle_duration_sec=1.0, + ) + return + with self._lock: + self._d435_settled = True + self._d435_exec_until = 0.0 + if self.d435_move_only: + # 保持 d435_commanding=True,感知不会重拍;D405 被 move_only 挡住。 + # locked 只让 pipeline 结束一阶段,后面会 skip_stage2。 + # action 已 rest-to-rest,到位不再往话题插 hold。 + now_m = time.monotonic() + if not self._locked: + self._locked = True + self.get_logger().info( + f"已到 D435 位置(还差 {dist*1000:.0f}mm)并停稳 " + f"{self.d435_handback_sec:.1f}s —— D435 位移测试结束," + "不交 D405、不进二阶段" + ) + self._lock_pub.publish(Bool(data=True)) + self._lock_pub_t = now_m + elif now_m - self._lock_pub_t > 1.0: + self._lock_pub_t = now_m + self._lock_pub.publish(Bool(data=True)) + return + # 法兰已停稳:打开 D405。不在这里锁定;框心对准停稳后才精拍下臂。 + self._publish_d435_commanding(False) + self.get_logger().info( + f"法兰已连续停稳 {self.d435_handback_sec:.1f}s" + f"(离 D435 点 {dist*1000:.0f}mm)" + " —— 打开 D405 输出,追工件框矩形中心;对准后才精拍下臂" + ) + + def _tick_still_lock(self) -> None: + """D405 跟住且法兰 XY 连续 still_sec 秒没大幅动 → 锁定进二阶段。 + + 顶视一次性迁臂不算。门槛与位移上限只从 site 来,这里不再写死 3 / 15mm。 + """ + if not self._hybrid or self.d435_move_only: + return + if self._locked: + # 框心对准并且停稳这一拍已经抓住。后面的实时点不再解开,也不再带臂。 + return + T = self._lookup_T(self.base_frame, self.ee_frame) + xy = None if T is None else np.asarray(T[:2, 3], dtype=float) + with self._lock: + have = self._have_target + lost = self._target_lost_flag + source = self._track_source + conf = self._wrist_conf + tracking_ok = ( + source == "wrist" + and have + and not lost + and (not wrist_needs_handoff(conf, self.wrist_handoff_conf)) + and self._xy_armed + ) + locked_now = self._still.update( + xy, time.monotonic(), tracking_ok=tracking_ok + ) + now_m = time.monotonic() + if locked_now and self.enable_control: + if not self._locked: + self._locked = True + self.get_logger().info( + f"=== 一阶段已锁定(D405 框心对准且臂静止 {self.wrist_align_sec:.1f}s," + f"位移≤{self.lock_still_move_m*1000:.0f}mm)" + " → /visual_servo/locked ===" + ) + self._lock_pub.publish(Bool(data=True)) + self._lock_pub_t = now_m + elif now_m - self._lock_pub_t > 1.0: + self._lock_pub_t = now_m + self._lock_pub.publish(Bool(data=True)) + else: + if self._locked: + self._lock_pub.publish(Bool(data=False)) + self._locked = False + self._lock_since = None + def _lock_feedback(self, converged: bool) -> None: """串联锁定信号:持续收敛 lock_hold_sec → /visual_servo/locked=True。 - 只有「有活目标 + XY 入死区 + Z 死区」的驻留分支算收敛;跟踪中、 - 启动下高、寻孔、看门狗冻结等路径都要显式喂 False 打断持续计时。 + 混合模式由 ``_tick_still_lock`` 独占,这里直接返回,避免死区 0.6s 抢先锁定。 """ + if self._hybrid: + return now_m = time.monotonic() if converged and self.enable_control: if self._lock_since is None: @@ -965,48 +2032,31 @@ class ServoNode(Node): return out def _update_xy_arm(self, ee_z: float) -> bool: - """只有当法兰到达 lock_z(真实深度、自适应悬停)后才做 XY 悬停。""" + """只有法兰落在锁高带内才做 XY。低于锁高要先抬回去,不算到位。""" if self.ee_z_m <= 0.0: self._xy_armed = True + self._publish_z_locked(True) return True - gate = max(0.02, float(self.approach_xy_gate_m)) z = float(ee_z) - # 已经在锁高或更低:立刻开 XY,禁止再抬回 0.35(否则二阶段又要降下来)。 - if z <= float(self.ee_z_m) + gate: - if not self._xy_armed: - self._xy_armed = True - self._feat_kf.initialized = False - self._p_feat_base = None - self._v_xy_cmd[:] = 0.0 - self.pid_x.reset() - self.pid_y.reset() - self.get_logger().warn( - f"lock-z 就绪 ee_z={z:.3f}m(期望 {self.ee_z_m:.3f},不再回抬) " - "—— 在实时 handeye 上开始 XY 悬停" - ) - return True - err = abs(z - float(self.ee_z_m)) - if not self._xy_armed: - if err <= gate: - self._xy_armed = True - self._feat_kf.initialized = False - self._p_feat_base = None - self._v_xy_cmd[:] = 0.0 - self.pid_x.reset() - self.pid_y.reset() - self.get_logger().warn( - f"已到达 lock-z ee_z={z:.3f}m(期望 {self.ee_z_m:.3f})" - " —— 在实时 handeye 上开始 XY 悬停" - ) - elif err > gate + 0.05: + at = at_lock_height(z, self.ee_z_m, self.approach_xy_gate_m) + if at and not self._xy_armed: + self._xy_armed = True + self._v_xy_cmd[:] = 0.0 + self.pid_x.reset() + self.pid_y.reset() + self.get_logger().info( + f"锁高到位 ee_z={z:.3f}m(期望 {self.ee_z_m:.3f})" + " —— 开始 XY;腕部无目标时 D435 可以拍一张" + ) + elif (not at) and self._xy_armed: self._xy_armed = False - self._p_feat_base = None - self._feat_kf.initialized = False self._v_xy_cmd[:] = 0.0 self.get_logger().info( - f"已离开 lock-z 区间 ee_z={z:.3f}m —— XY 保持,重新下降", + f"离开锁高 ee_z={z:.3f}m(期望 {self.ee_z_m:.3f})" + " —— 先回高度,XY 暂停", throttle_duration_sec=1.0, ) + self._publish_z_locked(at) return self._xy_armed def _seek_velocity(self, p_ee: np.ndarray) -> Optional[np.ndarray]: @@ -1073,7 +2123,8 @@ class ServoNode(Node): now_m = time.monotonic() dt_cmd = now_m - self._last_traj_mono - if self._last_traj_mono > 0.0 and dt_cmd < (1.0 / self.traj_stream_hz): + min_dt = 1.0 / self.traj_stream_hz + if self._last_traj_mono > 0.0 and dt_cmd < min_dt: return dt_use = float(np.clip(dt_cmd if self._last_traj_mono > 0.0 else 0.04, 0.015, 0.08)) @@ -1103,6 +2154,7 @@ class ServoNode(Node): # hover:在任意锁定高度上把法兰 XY 停在三维特征点上。 # lookat:把光轴命中点(图像中心)驱到特征点上。 xy_ok = self._update_xy_arm(float(p_ee[2])) + cruise = hybrid_cruise_vxy(self.v_slow_xy) if ( xy_ok and (not hold_xy) @@ -1118,6 +2170,10 @@ class ServoNode(Node): if nerr > clip_xy: err = err * (clip_xy / nerr) nerr = clip_xy + # 锁定前整段同一巡航速度。不再用 50mm 远近两档: + # 远处本来就慢,近处一放开就按 kp×误差冲,越近越抖。 + if self._hybrid and not self._locked: + v_xy = min(float(v_xy), cruise) if self._xy_deadzone(nerr, update=False): v_base[0] = 0.0 v_base[1] = 0.0 @@ -1148,9 +2204,10 @@ class ServoNode(Node): ) nxy = float(np.hypot(v_base[0], v_base[1])) - if nxy > v_xy > 0.0: - v_base[0] *= v_xy / nxy - v_base[1] *= v_xy / nxy + cap_xy = cruise if (self._hybrid and not self._locked) else v_xy + if nxy > cap_xy > 0.0: + v_base[0] *= cap_xy / nxy + v_base[1] *= cap_xy / nxy # 在 base 系里保持法兰 XYZ(可配置,默认约 250 mm)。当 ee_hold_xy # 为真时,视觉算出的 XY 会被覆盖。 @@ -1161,28 +2218,33 @@ class ServoNode(Node): v_base[0] = 0.0 if abs(self.ee_y_m - p_ee[1]) < 0.004: v_base[1] = 0.0 - if (not xy_ok) or hold_xy: + # 有目标:XY 平移,Z 钉在这一段开始的高度。没目标才回锁高。 + translating = (not hold_xy) and self._have_target + if (not translating) and ((not xy_ok) or hold_xy): v_base[0] = 0.0 v_base[1] = 0.0 self._v_xy_cmd[:] = 0.0 if self.ee_z_m > 0.0: self.get_logger().info( - f"下降至 lock_z {self.ee_z_m:.3f}m 当前={p_ee[2]:.3f}m XY 保持", + f"回锁高 {self.ee_z_m:.3f}m 当前={p_ee[2]:.3f}m XY 保持", throttle_duration_sec=1.0, ) shaped = self._shape_xy_vel(v_base[:2], dt_use) v_base[0] = float(shaped[0]) v_base[1] = float(shaped[1]) - if self.ee_z_m > 0.0: - ez_b = float(self.ee_z_m - p_ee[2]) - # 已在锁高以下:不再抬臂。二阶段会降到 hole_hover_z。 - if ez_b > 0.0: - v_base[2] = 0.0 - else: - vz_lim = float(self.v_max_z) if xy_ok else max(float(self.v_max_z), 0.08) - v_base[2] = float(np.clip(kp * ez_b, -vz_lim, vz_lim)) - if abs(ez_b) < 0.004: - v_base[2] = 0.0 + if translating: + if self._z_hold is None: + self._z_hold = float(p_ee[2]) + v_base[2] = hold_translation_vz( + float(p_ee[2]), self._z_hold, kp=kp, v_lim=float(self.v_max_z) + ) + else: + self._z_hold = None + if self.ee_z_m > 0.0: + vz_lim = max(float(self.v_max_z), 0.08) + v_base[2] = lock_z_velocity( + float(p_ee[2]), self.ee_z_m, kp=kp, v_lim=vz_lim + ) w_base = ( self._w_align_flange_down(R_ee) @@ -1191,9 +2253,9 @@ class ServoNode(Node): ) p_next = p_ee + v_base * T - if self.ee_z_m > 0.0: - # 绝不指令到配置平面以下 - floor = max(self.min_ee_z, self.ee_z_m - 0.02) + if self.ee_z_m > 0.0 and not translating: + # 向下只许到锁高死区内。已经低于锁高时 v_z>0,这条不挡上抬。 + floor = float(self.ee_z_m) - 0.004 if p_next[2] < floor and v_base[2] < 0.0: v_base[2] = 0.0 p_next = p_ee + v_base * T diff --git a/build/arm_application/build/lib/arm_application/site_io.py b/build/arm_application/build/lib/arm_application/site_io.py index 0e7f016..9243123 100644 --- a/build/arm_application/build/lib/arm_application/site_io.py +++ b/build/arm_application/build/lib/arm_application/site_io.py @@ -80,3 +80,137 @@ def ee_frame_default() -> str: sn = os.environ.get("SITE_ROBOT_SN", "").strip() return f"{sn}_flange" if sn else "" + +def overhead_camera( + site: dict[str, Any], robot: dict[str, Any] | None = None +) -> tuple[dict[str, Any], list[str]]: + """手外(固定)相机 → ``(相机配置字典, 同样合格但未被选中的相机名)``。 + + 手外相机 = ``cameras.*`` 里 ``role`` 以 ``overhead`` 开头的那台(眼在手外时 + 相机固定在工位外,不随臂动)。 + + **为什么必须有唯一实现**:这份"按 role 找,再按 arm 收敛"的规则有两个调用方—— + S03 粗定位取命名空间(本模块给节点用)、手眼标定脚本取相机名。两边各写一份的 + 后果不是报错,而是"标定用的相机"和"推理用的相机"悄悄不是同一台,且没人发现。 + 所以规则只写在这里,两边都调它(`export_site_env.overhead_camera` 也走这里)。 + + 收敛规则(确定性的三级): + 1. ``arm`` 与当前臂相同的优先(仿真 ``sim_d435`` 靠这级选中); + 2. 都没有 ``arm``(= 双臂共用的那台)时回落到它; + 3. 还是多个 → 取第一个,并把其余名字放进第二个返回值,让调用方**出声告警**。 + """ + cams = [ + cfg + for cfg in (site.get("cameras") or {}).values() + if isinstance(cfg, dict) + and str(cfg.get("role") or "").strip().lower().startswith("overhead") + ] + if not cams: + return {}, [] + arm = str((robot or {}).get("arm") or "").strip() + mine = [c for c in cams if str(c.get("arm") or "").strip() == arm] if arm else [] + hits = mine or [c for c in cams if not str(c.get("arm") or "").strip()] or cams + chosen = dict(hits[0]) + others = [str(c.get("name") or "?") for c in hits[1:]] + return chosen, others + + +def eye_to_hand_result_name(short: str, camera_name: str) -> str: + """眼在手外结果文件的**文件名**(不含目录)。 + + 外参绑定「这条臂的基座 + 这台相机」:换条臂或换台相机都不通用, + 所以名字必须同时带上臂号与相机。调用方只许调这里,不许自己拼 + (launch / export_site_env / S03 找文件都走这一处)。 + """ + short = str(short or "").strip() + cam = str(camera_name or "").strip().strip("/") + if short and cam: + return f"{short}_{cam}_eye_to_hand.yaml" + if cam: + return f"{cam}_eye_to_hand.yaml" + if short: + return f"{short}_eye_to_hand.yaml" + return "eye_to_hand.yaml" + + +def resolve_eye_to_hand_file( + root: Path, + *, + explicit: str = "", + camera_name: str = "", +) -> Path | None: + """找手外相机的手眼文件。没有就返回 None。 + + 路径一律按 ``root`` 解析,不跟当前工作目录走——相对 CWD 的路径会在 + "换个目录启动"时静默失效(文件找不到 → S03 直接降级),而人只会怀疑标定。 + + 候选顺序: + 1. ``explicit`` —— launch 按 site.yaml 派生的确切路径 + (``<臂号>_<相机>_eye_to_hand.yaml``); + 2. ``<相机名>_eye_to_hand.yaml`` —— 旧命名 / 仿真(``sim_d435_...``); + 3. ``eye_to_hand.yaml`` —— 再兜底。 + """ + candidates: list[Path] = [] + if explicit: + p = Path(explicit).expanduser() + candidates.append(p if p.is_absolute() else root / p) + cam = str(camera_name or "").strip().strip("/") + if cam: + candidates.append(root / "handeye" / "results" / f"{cam}_eye_to_hand.yaml") + candidates.append(root / "handeye" / "results" / "eye_to_hand.yaml") + for cand in candidates: + if cand.is_file(): + return cand + return None + + +TRACK_CAMERA_ROLES = ("wrist", "overhead") + + +def track_camera_role(site: dict[str, Any] | None) -> str: + """一阶段跟踪用哪台相机:``wrist``(腕部 D405)或 ``overhead``(顶置 D435)。 + + 写错**当场报错**,不会退回腕部 —— 退回会让人以为在验 D435,其实还在用 D405。 + 缺省 ``wrist``:没写这个键时行为与改之前一致(腕部追踪)。 + """ + perc = (site or {}).get("perception") + perc = perc if isinstance(perc, dict) else {} + raw = perc.get("track_camera") + if raw is None or str(raw).strip() == "": + return "wrist" + role = str(raw).strip().lower() + if role not in TRACK_CAMERA_ROLES: + raise ValueError( + f"perception.track_camera 只能是 wrist 或 overhead,收到 {raw!r}。" + "写错不会退回腕部 —— 退回会让人以为在用 D435 其实还在用 D405。" + ) + return role + + +def track_handeye_mode(role: str) -> str: + """跟踪相机角色 → 手眼装法。overhead 必须用 cam→基座,不能用 cam→法兰。""" + if str(role or "").strip().lower() == "overhead": + return "eye_to_hand" + return "eye_in_hand" + + +def handeye_static_tf_frames( + *, + mode: str, + ee_frame: str, + base_frame: str, + cam_frame: str, +) -> tuple[str, str]: + """手眼静态 TF 的 ``(父系, 子系)``。 + + 两种装法的父子关系**不同**,不能混: + * ``eye_in_hand``:法兰 ← 相机(相机跟着臂动) + * ``eye_to_hand``:基座 ← 相机(相机固定,不随臂动) + + 把眼在手外的文件按"法兰 ← 相机"发出去,会得到一条**看着合理**的错 TF —— + 定位总能到附近、永远差一截,而人只会去怀疑标定精度。 + """ + if str(mode or "").strip().lower() == "eye_to_hand": + return str(base_frame), str(cam_frame) + return str(ee_frame), str(cam_frame) + diff --git a/build/arm_application/build/lib/arm_application/stage2_locate_node.py b/build/arm_application/build/lib/arm_application/stage2_locate_node.py index ab37423..a3575d2 100644 --- a/build/arm_application/build/lib/arm_application/stage2_locate_node.py +++ b/build/arm_application/build/lib/arm_application/stage2_locate_node.py @@ -6,12 +6,13 @@ 1. verticalize — 法兰 +Z 严格朝世界 -Z(垂直朝下),XY/Z 不动 2. hover — 闭环升到/降到 robots[].servo.hole_hover_z_m(悬停锁高) - 3. coarse — 拍照,detect_best_1 YOLO 框出工件,粗移到 bbox 中心上方 + 3. coarse — 拍照,工件(pose 模型给框;k1/k2 用关键点)粗移到 bbox 中心上方 4. fine — 拍照,two_stage(YOLO+HoughCircles)解 k1/k2 孔心像素 - 5. align — 深度(孔外工作面中值,防孔底拉偏)+ 内参 + 手眼 + TF - 算出孔在基座系 XY,把夹爪/通止规轴线移到目标孔正上方, - 复拍验证,迭代到 align_tol_m - 6. hold — 锁定关节,发布 /stage2/result(JSON) + /stage2/overlay + 5. align — 像素射线交工件面 + 内参 + 手眼,把规尖移到目标孔正上方。 + ``hole_keypoint_once`` 时只走一次,核验拍只记账; + ``hole_once_lock_xy_descend`` 时按视线前馈一条 MoveL 贴面; + 否则复拍迭代到 align_tol_m + 6. hold — 锁定关节,发布 /stage2/result(JSON) + /tmp/stage2_result.json 高度调试(不动 XY、不拍照定位): bash ~/ros2/scripts/run_stage2_locate.sh --arm 89 --hover-only @@ -22,6 +23,7 @@ from __future__ import annotations import json import math import os +import sys import time from pathlib import Path from typing import Any, Dict, List, Optional, Tuple @@ -45,11 +47,71 @@ from arm_application.geom_ik import ( geometric_jacobian, quat_xyzw_to_R, ) +from arm_application.path_profile import ( + FROZEN_J_HOP_MAX_M, + path_interp as _path_interp, + trap_params as _trap_params, + trap_sv as _trap_sv, +) +from arm_application.overhead_oneshot import ( + ONCE_APPROACH_STEP_M, + ONCE_FF_LOOK_PER_M, + ONCE_FF_MOVEL_VEL_MPS, + ONCE_TRIM_MAX_STEP_M, + ONCE_TRIM_REFUSE_M, + cam_xy_bias_axes, + decompose_base_xy, + flange_z_for_gap_m, + final_gap_refusal, + hole_pair_span_m, + hole_pair_span_ok, + once_ff_movel_from_tcp, + once_ff_tcp_xyz, + oneshot_align_step_m, + pixel_on_base_plane, + retract_goal_z, +) from arm_application.handeye_realsense import resolve_realsense_topics from arm_application.gauge_boot import perception_source_of +from arm_application.gauge_fsm import drag_verdict, resolve_hover_z, wrench_all_zero from arm_application.hole_detect_hough import detect_holes from arm_application.hole_detector import config_from_site, weights_from_site -from arm_application.site_io import deep_merge, load_site_dict +from arm_application.site_io import deep_merge, load_site_dict, ros2_root +from arm_application.ros_node import TolerantNode + +try: + from flexiv_msgs.msg import RobotStates +except ImportError: # pragma: no cover + RobotStates = None # type: ignore + +def contact_armed_gap_m(observe_gap_m: float, final_gap_m: float = 0.002) -> float: + """轻降力接触门槛对应的几何间隙。离面更远时腕部力会漂几牛,不能当碰到。 + + 2026-10-13 远场:法兰 0.384、间隙 138mm、ΔFz=+2.87N。 + 2026-10-13 近场仍假:间隙 9.5mm、ΔFz=+2.77N,尖几何上还在面上约 1cm, + 碰不到板。观察间隙 15mm 会把这一档武装起来,所以门控只收到 + ``final_gap_m + 4mm``(贴面 2mm 时 = 6mm)。``observe_gap_m`` 仍从调用方 + 传入,避免两处签名分叉,但不放宽门控。 + """ + _ = observe_gap_m + return float(final_gap_m) + 0.004 + + +def contact_armed_by_gap( + gap_m: float, observe_gap_m: float, final_gap_m: float = 0.002 +) -> bool: + """当前几何间隙够近,才许把腕部力突变当成碰到工件。""" + return float(gap_m) <= contact_armed_gap_m(observe_gap_m, final_gap_m) + + +# 一次 hop 之后实测关节变化小于这个值,就认为「臂根本没跟随指令」。 +# +# 真机踩到过(2026-09-28):一次 hover hop 计划要动 `max|Δq|=0.17378rad`,实测 +# `0.00000rad`,而控制器照样打印 "Goal reached, success!"。原因不在几何/对位, +# 而是 RDK 断连后 `operational()` 仍为 true、`read()` 一直返回最后一帧缓存, +# 关节状态永久冻结(`robot_timestamp` 推进量为 0),而控制器是本地插值、不校验反馈。 +# 真机上报成"垂直化或悬停失败"会把人往"倾角/悬停高度"上带,故单独拎出来报。 +_NO_FOLLOW_EPS_RAD = 1e-4 def _as_bool(val: Any, default: bool = False) -> bool: @@ -71,54 +133,6 @@ def _pt(q: np.ndarray, qdot: np.ndarray, t_sec: float) -> JointTrajectoryPoint: return pt -def _trap_params(dist: float, v: float, a: float) -> Tuple[float, float, float, float, float]: - """Rest-to-rest 梯形:返回 (T, v_peak, t_acc, t_cruise, a)。巡航速度保持 v。""" - dist = max(float(dist), 1e-6) - v = max(float(v), 1e-4) - a = max(float(a), 1e-3) - d_acc = v * v / (2.0 * a) - if 2.0 * d_acc >= dist: - v_peak = math.sqrt(max(a * dist, 1e-12)) - t_acc = v_peak / a - return 2.0 * t_acc, v_peak, t_acc, 0.0, a - t_acc = v / a - t_cruise = (dist - 2.0 * d_acc) / v - return 2.0 * t_acc + t_cruise, v, t_acc, t_cruise, a - - -def _trap_sv( - t: float, dist: float, v_peak: float, t_acc: float, t_cruise: float, a: float, -) -> Tuple[float, float]: - """时刻 t 的路径弧长 s 与切向速度。""" - t = max(0.0, float(t)) - t_dec0 = t_acc + t_cruise - t_end = t_dec0 + t_acc - if t >= t_end: - return dist, 0.0 - if t < t_acc: - return 0.5 * a * t * t, a * t - if t < t_dec0: - return 0.5 * a * t_acc * t_acc + v_peak * (t - t_acc), v_peak - td = t - t_dec0 - s0 = 0.5 * a * t_acc * t_acc + v_peak * t_cruise - return s0 + v_peak * td - 0.5 * a * td * td, max(0.0, v_peak - a * td) - - -def _path_interp(waypoints: List[np.ndarray], u: float) -> Tuple[np.ndarray, np.ndarray]: - """沿关节路点折线插值。u∈[0,1] → (q, dq/du)。""" - nseg = len(waypoints) - 1 - if nseg <= 0: - z = np.zeros_like(waypoints[0]) - return waypoints[0].copy(), z - u = float(min(1.0, max(0.0, u))) - x = u * nseg - i = min(nseg - 1, int(math.floor(x))) - a = x - i - q = (1.0 - a) * waypoints[i] + a * waypoints[i + 1] - dq_du = (waypoints[i + 1] - waypoints[i]) * nseg - return q, dq_du - - def _sanitize_traj(traj: JointTrajectory, min_dt: float = 0.02) -> JointTrajectory: """JTC 要求 time_from_start 严格递增;短 hop 保持点曾经倒退导致拒轨。""" last = -min_dt @@ -144,7 +158,7 @@ def _bgr_copy(msg: Image) -> np.ndarray: raise RuntimeError(f"Unsupported color encoding {msg.encoding!r}") -class Stage2Locate(Node): +class Stage2Locate(TolerantNode): def __init__(self, node_name: str = "stage2_locate") -> None: super().__init__(node_name) @@ -152,6 +166,17 @@ class Stage2Locate(Node): self.declare_parameter("hover_only", False) self.declare_parameter("target_hole", "") # 空字符串 → 用 site 的 stage2.target_hole self.declare_parameter("hover_z_m", -1.0) # 大于 0 → 覆盖 site 里的值 + # 贴面规尖离面 [mm]。≥0 → 覆盖 site ``final_gap_mm``。-1=用 site。 + # 笛卡尔锁 XY 时法兰 Z = 工具长 + 工件面 + 间隙,XY 不动。 + self.declare_parameter("final_gap_mm", -1.0) + # 工具尖端在法兰下方多少 [m];大于 0 → 覆盖 site。 + # 仿真里由 run_gauge_assembly.sh --sim 传**实测值**(每次上料都可能不同), + # 真机不传(走 site.yaml)。悬停高度与 S07 下探预算都按它算。 + self.declare_parameter("tool_tip_below_flange_m", -1.0) + # 调试开关:只验证**精对准**、不轻降(避免"对准还没confirmed就把规往孔里带")。 + # 用 int 不用 bool —— `ros2 launch` 传 bool 参数容易踩到 CLI 解析的坑。 + # -1=按 site 的 stage2.final_descent_enable;0=强制不降;1=强制降。 + self.declare_parameter("final_descent_enable", -1) self.declare_parameter("preview", True) self.declare_parameter("action_name", "rizon_arm_controller/follow_joint_trajectory") # 真值孔位(perception.source=truth)要把 scene.yaml 的物体位姿投影成像, @@ -186,8 +211,10 @@ class Stage2Locate(Node): # 悬停锁高:launch 覆盖 > robots[].servo.hole_hover_z_m > stage2.hover_z_m hover_override = float(self.get_parameter("hover_z_m").value) + self.hover_z_user_set = hover_override > 0.0 + self._hover_refused = "" self.hover_z = ( - hover_override if hover_override > 0.0 + hover_override if self.hover_z_user_set else float(servo.get("hole_hover_z_m") or stage2.get("hover_z_m") or 0.30) ) self.min_ee_z = float(servo.get("min_ee_z_m") or 0.20) @@ -205,6 +232,9 @@ class Stage2Locate(Node): self.perception_source = perception_source_of(perception) self._truth_object = str((perception.get("truth") or {}).get("object") or "") self._truth_warn_t = 0.0 + # 真值路径的"实测位姿"订阅与场景缓存(懒建,见 _truth_scene/_truth_live_pose) + self._truth_live = None + self._truth_spec = None self.target_hole = ( str(self.get_parameter("target_hole").value or "").strip().lower() @@ -216,10 +246,129 @@ class Stage2Locate(Node): self.coarse_max_moves = int(stage2.get("coarse_max_moves") or 2) self.align_speed = float(stage2.get("align_speed") or 0.03) self.move_speed = float(stage2.get("move_speed") or 0.05) - # 最后轻降到孔面上方 final_gap_mm(不接触) - self.final_gap_m = float(stage2.get("final_gap_mm") or 1.5) / 1000.0 + # 粗居中的两条**误检守卫**(2026-10-08 真机 arm 89 的 exit=4,见 + # _coarse_target_reject / _bbox_on_border 的注释):粗居中的目的是把臂 + # 挪到工件正上方,**挪错比不挪危险得多** —— 一挪错精定位就再也看不到 + # k1/k2,而流程会把它当"孔检测失败",现场根本想不到是粗居中把臂带走的。 + self.coarse_max_offset_m = float(stage2.get("coarse_max_offset_m") or 0.08) + self.coarse_border_px = int(stage2.get("coarse_border_px") or 2) + # 最后轻降到孔面上方 final_gap_mm(不接触)。启动参数 ≥0 覆盖 site。 + self._final_gap_refused = "" + _gap_override_mm = float(self.get_parameter("final_gap_mm").value) + self.final_gap_user_set = _gap_override_mm >= 0.0 + if self.final_gap_user_set: + self.final_gap_m = _gap_override_mm / 1000.0 + else: + self.final_gap_m = float(stage2.get("final_gap_mm") or 1.5) / 1000.0 + # 观测下降:对准后降到这个间隙就停,方便看规尖是不是对着孔。 + # 比 final_gap(贴面 2mm)高一截,对偏了也不会把规压上孔沿。 + self.observe_gap_m = float(stage2.get("observe_gap_mm") or 15.0) / 1000.0 + if self.observe_gap_m < self.final_gap_m: + self.get_logger().warn( + f"observe_gap_mm={self.observe_gap_m*1000:.1f} 比贴面目标 " + f"{self.final_gap_m*1000:.1f}mm 还近 —— 收到贴面高度,避免观测下降钻进孔" + ) + self.observe_gap_m = self.final_gap_m + # 悬停高度**必须**让工具尖端留在工件面上方(2026-09-24 的教训,完整说明见 + # gauge_fsm.hover_z_guard):悬停高是按相机视距定的,而工具(夹爪+通止规) + # 比相机长 —— 实测悬停时尖端已经钻进工件 25mm,于是 S05 的横向对准把工件 + # 拖走 92mm,而真值孔位按工件的**实测**位姿算 ⇒ 孔位跟着工具走、残差恒定 + # 13mm 永不收敛(现场看着像手眼标定坏了)。这里按几何兜住并喊出原因。 + _ga = deep_merge(site.get("gauge_assembly") or {}, robot.get("gauge_assembly") or {}) + # 工具长优先取**启动参数**(launch 覆盖 > site):仿真里上料脚本会实测它 + # 并落盘(sim_load_gauge → sim_tool_geometry.yaml → run_gauge_assembly.sh), + # 因为仿真里规会在指间下滑、下滑量随装夹变化(实测见过 243 / 254mm)。 + # 真机不给这个参数,走 site.yaml 的实测值 —— 与 hover_z_m 同一套优先级。 + _tool_len = float(self.get_parameter("tool_tip_below_flange_m").value) + if _tool_len <= 0.0: + _tool_len = float(_ga.get("tool_tip_below_flange_m") or 0.0) + _surface_z = float(_ga.get("workpiece_surface_z_m") or 0.0) + # 记成成员:轻降的几何夹逼(_descend_above_hole)要用同一套数字, + # 不能各推一遍 —— 否则改了一处另一处就悄悄失配。 + self.tool_tip_below_flange_m = _tool_len + self.surface_z_m = _surface_z + # 对小孔只用关键点像素和已知工件面,不读深度图。缺了就按旧的深度路径。 + self.hole_visual_only = _as_bool(stage2.get("hole_visual_only"), False) + # 本分支实验:悬停拍一次 k1/k2,走一次,复拍只记账不改 XY。 + # 键必须接线——写了 true 却仍多走多拍,等于没做实验。 + self.hole_keypoint_once = _as_bool(stage2.get("hole_keypoint_once"), False) + # 悬停走完后一条厂家 MoveL 收到贴面。k=0:笛卡尔锁 XY 只降 Z。 + # 缺键 = 仍走观察高补交(37b85aa)。 + self.hole_once_lock_xy_descend = _as_bool( + stage2.get("hole_once_lock_xy_descend"), False + ) + _ff = stage2.get("once_ff_look_per_m") + if _ff is None: + self.once_ff_look_per_m = float(ONCE_FF_LOOK_PER_M) + else: + self.once_ff_look_per_m = float(_ff) + self._ws_clipped = False + self._hole_snaps: List[Dict[str, Any]] = [] + if self.hover_z_user_set and (_tool_len <= 0.0 or _surface_z <= 0.0): + self._hover_refused = ( + "写了 --hover-z,但工具长度或工件面未知,无法确认尖端在面之上,拒绝执行" + ) + self.get_logger().error(self._hover_refused) + elif _tool_len > 0.0: + _used, _refused = resolve_hover_z( + self.hover_z, _surface_z, _tool_len, self.final_gap_m, self.hover_z_user_set + ) + if _refused: + self._hover_refused = _refused + self.get_logger().error( + "启动参数指定的悬停高度不安全,拒绝执行,不会改成别的高度:\n " + + _refused + ) + elif abs(_used - self.hover_z) > 1e-9: + self.get_logger().warn( + f"二阶段悬停高度自检不通过 —— 用几何修正值 {_used:.4f}m" + "(这次没写 --hover-z,沿用 site 的几何抬高)" + ) + self.hover_z = _used + # 轻降**最多能降多少**:从悬停高度降到"规尖停在工件面上方 final_gap"为止。 + # 这是纯几何量,与深度测量无关 —— 测量的唯一职责是让下降**提前**收工, + # 绝不允许它把下降量**放大**(2026-09-29 实测就是这么撞的:测量出的 + # gap0=141mm 比几何真值大 ~86mm,于是多降 86mm 把规撞进孔)。 + # 工具长/工件面未知(<=0)时给 None = 不启用夹逼,行为与改动前一致。 + self.descent_budget_m: Optional[float] = None + if _tool_len > 0.0 and _surface_z > 0.0: + self.descent_budget_m = max( + 0.0, self.hover_z - _tool_len - _surface_z - self.final_gap_m + ) + # 轻降结束后**按几何**算出的真实间隙 [m],供收尾日志如实汇报(不是把目标值 + # 当结果念一遍 —— 那会让"停在离面 50mm"也显示成"~2.0mm",R1.1 的静默失效)。 + self.descent_final_gap_m: Optional[float] = None self.final_descent_speed = float(stage2.get("final_descent_speed") or 0.006) self.final_descent_enable = _as_bool(stage2.get("final_descent_enable"), True) + _fd = int(self.get_parameter("final_descent_enable").value) + if _fd in (0, 1): # -1 = 按 site;0/1 = 启动参数强制(调试用) + self.final_descent_enable = bool(_fd) + self.get_logger().warn( + f"final_descent_enable 被启动参数覆盖为 {self.final_descent_enable} " + f"(site 里是 {stage2.get('final_descent_enable')})—— 只在调试时这么用" + ) + if self.final_gap_user_set and not self.final_descent_enable: + self._final_gap_refused = ( + "同时写了 --final-gap 和 --no-descent,不知道听谁的,拒绝开跑" + ) + self.get_logger().error(self._final_gap_refused) + elif self.final_gap_user_set and (_tool_len <= 0.0 or _surface_z <= 0.0): + self._final_gap_refused = ( + "写了 --final-gap,但工具长度或工件面未知,无法确认尖端在面之上,拒绝执行" + ) + self.get_logger().error(self._final_gap_refused) + elif _tool_len > 0.0 and _surface_z > 0.0: + _why_gap = final_gap_refusal( + self.final_gap_m, + _tool_len, + _surface_z, + self.hover_z, + float(self.ws_min[2]), + float(self.ws_max[2]), + ) + if _why_gap: + self._final_gap_refused = _why_gap + self.get_logger().error(_why_gap) self.vert_tol_rad = math.radians(float(stage2.get("verticalize_tol_deg") or 0.8)) self.settle_sec = float(stage2.get("settle_sec") or 0.45) self.snap_frames = int(stage2.get("snap_frames") or 5) @@ -227,6 +376,37 @@ class Stage2Locate(Node): self.max_depth = float(stage2.get("max_depth_m") or 0.60) self.linger_sec = float(stage2.get("linger_sec") or 8.0) + # ---- 精对准的「工具位置」:视觉量规尖(默认)还是法兰+固定偏置 ---- + # 为什么必须能视觉量(2026-10-08 真机 arm 89): + # 规是**夹在爪里**的零件,它相对法兰轴线可以整体偏出约 10mm(实测规杆 + # 轴线相对法兰 = (+10.7, −0.1)mm)。二阶段原来把**法兰轴线**对到孔上 + # (hover_offset_ee_xy_m 写死 [0,0]),于是规尖实际离孔心 ~10mm, + # 轻降一压,φ6 规尖就骑在 φ7 孔的**孔沿**上、力从 −1N 蹦到 63N 卡死。 + # 现场看到的是"轻降在离面 4mm 停住",离真正原因(规偏了)很远。 + # 改成在同一帧里同时解「规尖基座 XY」和「孔基座 XY」,两者走同一条手眼链, + # 链路误差/装夹变动一起抵消 —— 这才是"用视觉把孔对正"。 + # 规尖偏移**逐帧实测+一致性校验**(见 _tip_offset_from_depth):偏移是刚体量, + # 竖直朝下姿态下在基座 XY 里恒定,所以可以用"上一拍的偏移"剔掉偶发误检。 + # 规尖偏移**逐帧实测 + 一致性校验后冻结**(见 _refresh_tip_offset):偏移是刚体量, + # 竖直朝下姿态下在基座 XY 里恒定。为什么要冻结而不是逐拍重算: + # 2026-10-08 真机实测,逐拍重算时残差在 0.44~0.85mm 之间来回荡、收不进 0.25mm —— + # 元凶是**规杆略微倾斜**(<1°):每拍取到的"最深像素"高度不同(工具长在 + # 192~223mm 之间跳),同一根杆在不同高度上的基座 XY 差 ~0.4mm。 + # 偏移既然是刚体量,量准一份冻结住,那 0.4mm 的抖动就没了。 + self.tip_vision = _as_bool(stage2.get("align_tip_vision"), True) + self.tip_near_m = float(stage2.get("tip_near_m") or 0.15) + self.tip_min_m = float(stage2.get("tip_min_m") or 0.04) + self.tip_max_m = float(stage2.get("tip_max_m") or 0.60) + self.tip_band_frac = float(stage2.get("tip_search_band_frac") or 0.25) + self.tip_min_px = int(stage2.get("tip_min_px") or 150) + self.tip_off_tol = float(stage2.get("tip_offset_tol_m") or 0.003) + self.tip_len_min = float(stage2.get("tip_len_min_m") or 0.15) + self.tip_len_max = float(stage2.get("tip_len_max_m") or 0.32) + self.tip_calib_n = int(stage2.get("tip_calib_n") or 4) + self._tip_off: Optional[np.ndarray] = None # 规尖相对法兰的基座 XY 偏移(冻结后不变) + self._tip_samp: list = [] # 校准期攒下的 (偏移, 工具长) 样本 + self._tip_len_m: Optional[float] = None # 定偏移时并记下的工具长(用于交叉核对配置) + self.hover_only = _as_bool(self.get_parameter("hover_only").value, False) self.preview = _as_bool(self.get_parameter("preview").value, True) @@ -261,6 +441,9 @@ class Stage2Locate(Node): #: 最近一帧的收到时刻(单调钟)。判"有没有活的数据"用它,**不用数值大小** —— #: 静止时轴向力本来就接近 0,拿数值判活会把"安静的传感器"误判成掉线。 self._t_ft: Optional[float] = None + #: "FT 全零"守卫的状态(见 _on_wrench):零值起始时刻 + 是否已喊过一次。 + self._ft_zero_since: Optional[float] = None + self._ft_zero_warned: bool = False robot_ns = str(self.get_parameter("robot_sn").value).replace("-", "_") # 话题可配:默认按 sn 推导,与真机 flexiv_robot_states_broadcaster 一致。 # 换 FT 来源(换个厂家、或走 external_wrench_in_tcp)时不用改代码。 @@ -270,6 +453,23 @@ class Stage2Locate(Node): self.create_subscription( WrenchStamped, self.ft_wrench_topic, self._on_wrench, qos_profile_sensor_data ) + # 厂家 tcp_pose(WORLD)。视线前馈 MoveL 必须在这上面加相对位移, + # 不许拿 ROS 法兰+规尖当绝对目标。回调名避开 stage3 的 `_on_robot_states`。 + self._tcp_world: Optional[Tuple[float, float, float]] = None + self._t_tcp: Optional[float] = None + self.robot_states_topic = f"/{robot_ns}/flexiv_robot_states" + if RobotStates is not None: + self.create_subscription( + RobotStates, + self.robot_states_topic, + self._on_stage2_robot_states, + qos_profile_sensor_data, + ) + elif self.hole_once_lock_xy_descend: + self.get_logger().error( + "没有 flexiv_msgs.RobotStates,视线前馈不能读厂家 tcp_pose," + "不许退回 ROS 绝对坐标" + ) self._state_pub = self.create_publisher(String, "/stage2/state", 10) self._result_pub = self.create_publisher(String, "/stage2/result", 10) @@ -286,8 +486,38 @@ class Stage2Locate(Node): f" weights={self._weights}\n" f" image={self.image_topic} depth={self.depth_topic}\n" f" target={self.target_hole} (k1={self.k1_label}) tol={self.align_tol*1000:.1f}mm " - f"hover_only={self.hover_only}" + f"hover_only={self.hover_only} hole_visual_only={self.hole_visual_only} " + f"hole_keypoint_once={self.hole_keypoint_once} " + f"lock_xy_descend={self.hole_once_lock_xy_descend} " + f"ff_look={self.once_ff_look_per_m:.3f} " + f"final_gap={self.final_gap_m * 1000:.1f}mm" + + ( + f"→法兰Z={flange_z_for_gap_m(self.tool_tip_below_flange_m, self.surface_z_m, self.final_gap_m):.4f}m" + if self.tool_tip_below_flange_m > 0.0 and self.surface_z_m > 0.0 + else "" + ) + + "\n" + f" 工具长={self.tool_tip_below_flange_m:.4f}m(法兰到尖,下臂不得低于面+间隙)" ) + if self.hole_keypoint_once and self.hole_once_lock_xy_descend: + k = float(self.once_ff_look_per_m) + if k <= 1e-9: + self.get_logger().warn( + "对孔方案=单次精拍·笛卡尔锁 XY(实验)。悬停走完后不补拍," + "厂家 MoveL 只降 Z、ΔXY=0。k>0 会沿 -look 再加前馈。" + "对照 37b85aa 把 hole_once_lock_xy_descend 改回 false。" + ) + else: + self.get_logger().warn( + "对孔方案=单次精拍·视线前馈斜线(实验)。悬停走完后不补拍," + f"ΔXY=-look×{k:.3f}×剩余下降,一条 MoveL 到贴面。" + "对照 37b85aa 把 hole_once_lock_xy_descend 改回 false。" + ) + elif self.hole_keypoint_once: + self.get_logger().warn( + "对孔方案=单次精拍(实验分支)。拍一次→走一次,复拍和下降后只记账不改 XY。" + "残差以核验拍为准,不许用 hop 到位冒充。看 /tmp/stage2_result.json 的 snaps。" + ) # ==================== 状态/运动原语(闭环 hop,同 goto_ee_plane) ==================== @@ -303,6 +533,23 @@ class Stage2Locate(Node): def _on_info(self, msg: CameraInfo) -> None: self._info = msg + def _on_stage2_robot_states(self, msg) -> None: + """缓存厂家 ``tcp_pose``(WORLD)。名字必须与 stage3 ``_on_robot_states`` 分开。""" + p = msg.tcp_pose.pose.position + xyz = (float(p.x), float(p.y), float(p.z)) + if not all(math.isfinite(v) for v in xyz): + return + self._tcp_world = xyz + self._t_tcp = time.monotonic() + + def _fresh_tcp_world(self): + """最近 0.5s 的厂家 TCP [m]。过期/没有 → None,不许用旧值凑。""" + if self._tcp_world is None or self._t_tcp is None: + return None + if time.monotonic() - float(self._t_tcp) > 0.5: + return None + return self._tcp_world + def _on_wrench(self, msg: WrenchStamped) -> None: """缓存腕部 FT 的**轴向力**(`geometry_msgs/WrenchStamped`,法兰系)。 @@ -315,6 +562,28 @@ class Stage2Locate(Node): # 记收到时刻:下游(尤其 S07)要区分"收到过但读数为 0"(活)与 # "一帧都没收到"(话题名/网络/传感器的问题)。 self._t_ft = time.monotonic() + # —— "全零"守卫(2026-10-08 加):上面那个"收到过就算活"的口径有个盲区 —— + # 数据源没出数时,话题照样在发、回调照样在跑、读数恒为 (0,0,0),于是 + # `wrench_live` 报"活",而"abs(fz−基线)>2.5N 判接触"的兜底**永远不触发**。 + # 真机就踩到了(ft_sensor_wrench 恒零,external_wrench_in_tcp 才有数)。 + # 判据见 wrench_all_zero:带负载的 FT 不可能六个分量同时恰好为 0。 + w = msg.wrench + if wrench_all_zero( + w.force.x, w.force.y, w.force.z, w.torque.x, w.torque.y, w.torque.z + ): + if self._ft_zero_since is None: + self._ft_zero_since = self._t_ft + elif not self._ft_zero_warned and self._t_ft - self._ft_zero_since > 5.0: + self._ft_zero_warned = True + self.get_logger().error( + f"腕部 FT 话题 {self.ft_wrench_topic} 连续 >5s 六个分量**全为 0** —— " + "这不是'安静'(带负载的 FT 不可能全零),是**数据源没有出数**。" + "后果:轻降/下压的接触兜底 abs(fz−基线)>2.5N **永远判不到接触**" + "(静默失效)。真机请指向有数的话题,例如 " + "//external_wrench_in_tcp(site.yaml 的 servo.ft_wrench_topic)。" + ) + else: + self._ft_zero_since = None def _contact_detected(self, baseline_fz: float, thresh_n: float = 2.5) -> bool: """腕部力 Z 偏离基线 thresh_n 牛以上 → 判为规尖碰工件(接触)。""" @@ -382,18 +651,10 @@ class Stage2Locate(Node): return geometric_jacobian(link_R, link_p, p_ee, RIZON_LINK_AXES) def _w_down(self, R: np.ndarray) -> Tuple[np.ndarray, float]: - """让法兰 +Z 指向世界 -Z(垂直朝下)的角速度向量 + 当前倾角。""" - z_now = R[:, 2] - z_des = np.array([0.0, 0.0, -1.0]) - c = float(np.clip(np.dot(z_now, z_des), -1.0, 1.0)) - ang = float(np.arccos(c)) - if ang < 0.006: # 0.34° 以下不再修,避免原地抖动 - return np.zeros(3), ang - axis = np.cross(z_now, z_des) - n = float(np.linalg.norm(axis)) - axis = axis / n if n > 1e-9 else np.array([1.0, 0.0, 0.0]) - mag = float(np.clip(2.0 * ang, -0.5, 0.5)) - return axis * mag, ang + """让法兰 +Z 指向世界 -Z。公式只在 ``path_profile.flange_down_w``。""" + from arm_application.path_profile import flange_down_w + + return flange_down_w(R) def _wait_state(self, timeout_s: float) -> Tuple[Optional[np.ndarray], Optional[np.ndarray]]: t0 = time.monotonic() @@ -452,7 +713,8 @@ class Stage2Locate(Node): lo = self.ws_min + 0.005 hi = self.ws_max - 0.005 clamped = np.clip(np.asarray(target, dtype=float).reshape(3), lo, hi) - if not np.allclose(clamped, target, atol=1e-6): + self._ws_clipped = bool(not np.allclose(clamped, target, atol=1e-6)) + if self._ws_clipped: self.get_logger().warn( f"目标超出工作盒,已截断: ({target[0]:.3f},{target[1]:.3f},{target[2]:.3f}) → " f"({clamped[0]:.3f},{clamped[1]:.3f},{clamped[2]:.3f})" @@ -466,7 +728,7 @@ class Stage2Locate(Node): target: np.ndarray, verticalize: bool, tag: str, - max_seg: float = 0.08, + max_seg: float = FROZEN_J_HOP_MAX_M, v: float = 0.05, min_dur: float = 1.6, ) -> bool: @@ -640,10 +902,13 @@ class Stage2Locate(Node): min_dur: float = 1.6, hold_xy: bool = False, strict_xy: bool = False, + z_up_only: bool = False, ) -> Tuple[bool, np.ndarray, np.ndarray]: """闭环点到点:规划短 hop → 执行 → 重新看 TF → 重复,直到容差内。 hold_xy=True:只收 Z/姿态(悬停降锁高),不把下降中漂出的 XY 再拽回去。 + z_up_only=True:当前已经高于目标 Z 就停,不许为了追 5 mm 往下补 + (贴面 MoveL 后收臂 hop1 抬过头、hop2 回压进孔,2026-10-16)。 """ target = self._clamp_ws(target) last_dist: Optional[float] = None @@ -651,7 +916,14 @@ class Stage2Locate(Node): stall = 0 for hop in range(max_hops): p = Tee[:3, 3] - goal = np.array([p[0], p[1], target[2]]) if hold_xy else target + z_tgt = float(target[2]) + if z_up_only: + if float(p[2]) >= z_tgt - float(tol_m): + return True, q, Tee + z_tgt = retract_goal_z(float(p[2]), z_tgt) + goal = np.array([p[0], p[1], z_tgt]) if hold_xy else np.array( + [target[0], target[1], z_tgt], dtype=float + ) if hold_xy: goal = self._clamp_ws(goal) dp = goal - p @@ -688,12 +960,22 @@ class Stage2Locate(Node): if q2 is None or Tee2 is None: self.get_logger().error("运动途中丢了 joint_states/TF") return False, q, Tee + d_moved = float(np.max(np.abs(q2 - q))) self.get_logger().info( - f" {tag} hop{hop + 1} 实际 max|Δq|={float(np.max(np.abs(q2 - q))):.5f}rad " + f" {tag} hop{hop + 1} 实际 max|Δq|={d_moved:.5f}rad " f"Δxy=({(Tee2[0, 3] - Tee[0, 3]) * 1000:+.2f}," f"{(Tee2[1, 3] - Tee[1, 3]) * 1000:+.2f})mm " f"Δz={float((Tee2[2, 3] - Tee[2, 3]) * 1000):+.2f}mm" ) + if d_moved < _NO_FOLLOW_EPS_RAD: + # 轨迹发出去了、控制器也报成功,臂却一步没动 —— 别往几何/对位上找。 + self.get_logger().error( + f" {tag} hop{hop + 1}:关节状态**毫无变化**(实测 max|Δq|={d_moved:.5f}rad," + f"指令计划见上一条 send 日志)—— 臂没有跟随指令。这**不是**倾角/悬停高度的问题," + "而是关节状态没在更新:RDK 断连后 operational() 仍为 true,read() 只会一直" + "返回最后一帧缓存,而控制器是本地插值、不校验反馈,所以照样报 success。" + "先查网络:ping 机器人 IP 是否丢包、两台臂是否同 MAC 抢 L2 转发。" + ) q, Tee = q2, Tee2 p = Tee[:3, 3] goal = np.array([p[0], p[1], target[2]]) if hold_xy else target @@ -831,7 +1113,13 @@ class Stage2Locate(Node): bbox: Any, intr: Dict[str, float], ) -> Optional[Dict[str, Any]]: - """单帧:孔心像素 + 环形深度 → 基座系 XYZ。左右孔深度差过大则改用工作面中值。""" + """单帧:孔心像素 → 基座系 XYZ。 + + ``hole_visual_only`` 时射线交到已知工件面,不读深度图。 + 否则仍用环形深度(旧路径)。 + """ + if self.hole_visual_only: + return self._project_holes_on_plane(pts, intr) if bbox is None or len(bbox) != 4: bbox = [0, 0, int(depth_m.shape[1]), int(depth_m.shape[0])] holes_px = [ @@ -843,9 +1131,12 @@ class Stage2Locate(Node): except Exception: return None # 两孔统一用工件表面深度 z_wp(中值,稳健)。 - # 孔是垂直孔,XY 位置与深度无关;而 _ring_depth 在通止规逼近目标孔时会采到 - # 更近的通止规(~88mm vs 面 ~115mm),把孔深拉偏 → 孔基座坐标随手臂移动漂移、 - # 精对准追不动目标而振荡。倾斜仅 ~0.4°,左右孔 camera-Z 差 <0.5mm,对 XY 影响 <0.2mm。 + # 不用每孔的环形深度:通止规逼近时环上会采到更近的规(~88mm vs 面 ~115mm), + # 孔的基座坐标就跟着臂飘、精对准追不动。 + # 法兰相对竖直大约 0.4°,但相机光轴相对法兰大约 30°。深度误差会进 XY: + # 2026-10-09 观测高度实测 dXY/dz ≈ 0.46 mm/mm。z_wp 必须是工件面, + # 不能是规。同一孔在悬停和观测高度上反投影,基座 XY 可以差约 2mm, + # 所以下降之后还要在当前高度再对一次(见 _trim_xy_after_descent)。 z_left = z_right = z_wp try: left_b = self._cam_to_base(self._px_to_cam(pts[0][0], pts[0][1], z_left, intr)) @@ -860,27 +1151,74 @@ class Stage2Locate(Node): "z_wp": float(z_wp), } + def _project_holes_on_plane(self, pts, intr: Dict[str, float]) -> Optional[Dict[str, Any]]: + """小孔关键点像素交到工件面上。深度图不参与。""" + if float(self.surface_z_m) <= 0.0: + self.get_logger().error( + "对孔不用深度图,但 workpiece_surface_z_m 没有配 —— 拒绝反投影" + ) + return None + T = self._lookup(self.base_frame, self.cam_frame) + if T is None: + self.get_logger().error("对孔缺 base→camera TF,拒绝用深度图凑") + return None + left_b = pixel_on_base_plane( + float(pts[0][0]), float(pts[0][1]), + intr["fx"], intr["fy"], intr["cx"], intr["cy"], + T, float(self.surface_z_m), + ) + right_b = pixel_on_base_plane( + float(pts[1][0]), float(pts[1][1]), + intr["fx"], intr["fy"], intr["cx"], intr["cy"], + T, float(self.surface_z_m), + ) + if left_b is None or right_b is None: + self.get_logger().error("孔心射线没交到工件面(相机朝向或工件面高度不对)") + return None + z = float(self.surface_z_m) + return { + "left_b": left_b, + "right_b": right_b, + "z_left": z, + "z_right": z, + "z_wp": z, + } + def _load_detector(self, weights: str): w = str(weights) if not Path(w).is_file(): raise RuntimeError(f"工件权重不存在: {w}") - if w.lower().endswith(".onnx"): + from arm_application.pose_detector import is_pose_model + from arm_application.yolo_detector import YoloDetector, build_detector, resolve_weights + + conf = float(self._hole_cfg.get("conf", 0.25)) + iou = float(self._hole_cfg.get("iou", 0.7)) + imgsz = int(self._hole_cfg.get("imgsz", 640)) + if is_pose_model(w): + # pose 模型同时给工件框 + k1/k2 关键点。走自解码实现 —— + # ultralytics 解不了 pose 的 TensorRT engine(见 pose_detector 模块头), + # OnnxWorkpieceDetector 同样只认检测输出。 + det = build_detector( + resolve_weights(w, "auto"), + conf=conf, + iou=iou, + imgsz=imgsz, + ) + elif w.lower().endswith(".onnx"): from arm_application.onnx_workpiece import OnnxWorkpieceDetector det = OnnxWorkpieceDetector( w, - conf=float(self._hole_cfg.get("conf", 0.25)), - imgsz=int(self._hole_cfg.get("imgsz", 640)), + conf=conf, + imgsz=imgsz, ) else: - from arm_application.yolo_detector import YoloDetector, resolve_weights - det = YoloDetector( resolve_weights(w, "auto"), device="cpu", - conf=float(self._hole_cfg.get("conf", 0.25)), - iou=float(self._hole_cfg.get("iou", 0.7)), - imgsz=int(self._hole_cfg.get("imgsz", 640)), + conf=conf, + iou=iou, + imgsz=imgsz, ) self.get_logger().info(f"工件检测器已加载: {w}") return det @@ -921,9 +1259,14 @@ class Stage2Locate(Node): 退回检测器的后果是**用整幅画面当 ROI**,于是 HoughCircles 在夹爪/通规/ 台面上找出一对"假孔"(实测间距 108mm,真值 58mm),再被门槛丢掉 —— 现象是"每拍都丢、最后超时",比直接说"TF 没到"难查得多。 + + ⚠️ 几何用**实测**位姿(``sim_live_pose``)而不是 scene.yaml 的名义位姿: + 工件落地/蠕动后就偏 2~3mm,而规尖(φ6)进 φ7 的孔只有 0.5mm 余量 —— + 按名义位姿算的孔位会把这一整条链指偏两毫米(现象是"S07 压到工件面、 + 孔却没进去",看起来像柔顺参数不对)。真机上的视觉量的也是"实际在哪"。 """ try: - from arm_sim_gazebo import truth_holes + from arm_sim_gazebo import sim_live_pose, sim_scene, truth_holes except ImportError: # 真机上没有仿真包,perception.source 也不会是 truth —— 到这里只可能是 # 有人把 source 配成 truth 却没装仿真包,直接报清楚。 @@ -935,9 +1278,13 @@ class Stage2Locate(Node): i3 = None if intr is not None: i3 = (intr.get("fx"), intr.get("fy"), intr.get("cx"), intr.get("cy")) + spec = self._truth_scene(sim_scene) + live = self._truth_live_pose(spec, sim_live_pose) + if live is not None: + spec = live.apply(spec, [str(self._truth_object or spec.operating.part_object)]) res = truth_holes.locate_holes( T, i3, (int(bgr.shape[0]), int(bgr.shape[1])), - object_name=self._truth_object, root=None, + spec=spec, object_name=self._truth_object, root=None, ) if not res.ok: now = time.monotonic() @@ -976,6 +1323,34 @@ class Stage2Locate(Node): "draw_img": truth_holes.draw(bgr, res), } + def _truth_scene(self, sim_scene): + """真值路径的场景配置(读一次,缓存)。 + + 为什么缓存:S05 会连着算很多拍,而 scene.yaml 是**静态配置** + (物体位姿那种会变的东西走 ``sim_live_pose``,不从这里读)。 + """ + if self._truth_spec is None: + self._truth_spec = sim_scene.load_scene(None, None) + return self._truth_spec + + def _truth_live_pose(self, spec, sim_live_pose): + """真值路径的"实测位姿"订阅(懒建一次)。没配 pose_info 就返回 None。 + + 为什么这里也要(不只是真值感知节点):二阶段的**孔位**是这条链上 + 精度要求最高的一处(规尖 φ6 进 φ7 的孔),而它和真值感知共用同一份 + "物体现在在哪"的实现(``sim_live_pose``,R5.8)。 + """ + if self._truth_live is None: + pi = getattr(spec, "pose_info", None) + topic = str(getattr(pi, "ros_topic", "") or "") + self._truth_live = sim_live_pose.LiveScenePose(self, topic) if topic else False + if self._truth_live: + self.get_logger().info( + f"真值孔位按**实测**位姿算(订阅 {topic})—— " + f"按名义位姿算会偏 2~3mm,而规尖进孔只有 0.5mm 余量。" + ) + return self._truth_live or None + def _truth_to_base(self, pts_world: Any) -> list: """世界系点列 → 基座系点列(TF 查不到时返回空列表,调用方会退回深度反投影)。 @@ -1067,15 +1442,258 @@ class Stage2Locate(Node): best, best_area = d, area if best is None: return None - return tuple(int(v) for v in best.xyxy) # type: ignore[return-value] + bbox = tuple(int(v) for v in best.xyxy) # type: ignore[assignment] + h, w = bgr.shape[:2] + if self._bbox_on_border(bbox, w, h): + return None + return bbox # type: ignore[return-value] + + def _bbox_on_border( + self, bbox: Any, w: int, h: int, margin_px: Optional[int] = None + ) -> bool: + """框是否被画面边缘切到(= 只看到工件的一部分,不是整个工件)。 + + 为什么这种框一个都不能用(2026-10-08 真机 arm 89 实测) + -------------------------------------------------------- + 粗居中要的是**框中心落在工件的哪个位置**,再对那个点做深度反投影。 + 框被边缘切掉时,框中心根本不在工件上 —— 真机那一帧:: + + snap_coarse_0: 工件 bbox=(0, 142, 97, 222) 中心=(48,182) + base=(0.280,-0.747)[深度] 偏差=211.5mm + + ``x0=0`` 就是左边缘切的。反投影出来的 (0.280,-0.747) 落在工作盒外 + 197mm,而下一步**没有判误检,而是"截断到盒边"照样横移** 56mm, + 把臂带离工件 ⇒ 精定位再也看不到 k1/k2 ⇒ ``exit=4``。 + + 同一个判据顺手挡掉另一种退化输入:YOLO 空框时兜底用的"孔检测器 bbox" + 在真机那帧是 ``[0, 0, 847, 479]``(整幅画面,四边全贴边)。 + """ + if margin_px is None: + margin_px = int(getattr(self, "coarse_border_px", 2)) + if bbox is None or len(bbox) < 4 or w <= 0 or h <= 0: + return True + x0, y0, x1, y1 = (float(v) for v in bbox[:4]) + m = float(margin_px) + return x0 <= m or y0 <= m or x1 >= (w - 1) - m or y1 >= (h - 1) - m + + def _coarse_target_reject( + self, + p_base: np.ndarray, + gxy: np.ndarray, + max_offset_m: Optional[float] = None, + ) -> Optional[str]: + """粗居中的目标点是不是**误检**。返回 None = 可信;否则返回拒绝原因。 + + 为什么必须能在**移动前**否掉(2026-10-08 真机 arm 89,exit=4) + -------------------------------------------------------------- + 真机那一帧:: + + snap_coarse_0: base=(0.280,-0.747)[深度] 偏差=211.5mm + 目标超出工作盒,已截断: (0.280,-0.747,0.320) → (0.280,-0.545,0.320) + coarse Δ=(-56,-2,-0)mm ← 臂被带离工件 56mm + snap_fine_*: 两孔基座间距 210.0/213.2/212.2mm 不像 k1/k2,丢弃本拍 + 二阶段失败 exit=4 + + 工件其实在 (0.5,-0.12) 一带 —— 也就是说这个"截断"不是安全兜底, + 而是**把一次误检变成了对机械臂的一条真实横移指令**:越界只是被夹到盒边, + 臂照样走出去。这就是规矩里禁的"宽容降级":把"没检查"伪装成"检查通过"。 + + 两条判据(都是"盒外/离谱 ⇒ 判误检",不是"夹到盒边继续"): + + 1. 目标点落在 ``workspace_xyz_*`` 的 XY 之外(含 5mm 余量)—— 一阶段刚锁 + 定时臂就在工件上方,工件**不该**在盒外; + 2. 目标点离当前夹爪轴线超过 ``coarse_max_offset_m``(缺省 0.08m)—— 粗居中 + 是"把臂挪到工件正上方",合理位移是厘米级;十几厘米只可能是坏读数 + (2026-10-16 三次 110mm 回撤,0.12 放行了)。 + + 注意:判误检后**原地不动**,由精定位(直接量 k1/k2)继续。不动的代价只是 + "少挪一次",而挪错的代价是精定位彻底看不到孔 —— 所以这里必须选不动。 + """ + if max_offset_m is None: + max_offset_m = float(getattr(self, "coarse_max_offset_m", 0.08)) + p = np.asarray(p_base, dtype=float).reshape(3) + if not np.all(np.isfinite(p[:2])): + return "目标点非有限值(深度/三角化失败)" + lo = np.asarray(getattr(self, "ws_min", None), dtype=float).reshape(-1) + hi = np.asarray(getattr(self, "ws_max", None), dtype=float).reshape(-1) + if lo.size >= 2 and hi.size >= 2: + margin = 0.005 + for i, name in ((0, "x"), (1, "y")): + if p[i] < lo[i] - margin or p[i] > hi[i] + margin: + return ( + f"目标 {name}={p[i]:.3f} 在工作盒 [{lo[i]:.3f},{hi[i]:.3f}] 外 " + f"⇒ 反投影/检测坏了" + ) + g = np.asarray(gxy, dtype=float).reshape(-1) + if g.size >= 2: + d = float(np.hypot(p[0] - g[0], p[1] - g[1])) + if d > max_offset_m: + return ( + f"目标离夹爪轴线 {d*1000:.1f}mm > 上限 {max_offset_m*1000:.0f}mm " + f"⇒ 不像'臂已在工件上方'的粗居中量" + ) + return None def _gauge_xy(self, Tee: np.ndarray) -> np.ndarray: - """夹爪/通止规轴线(法兰原点 + hover_offset)在基座系 XY。""" + """夹爪/通止规轴线(法兰原点 + hover_offset)在基座系 XY。 + + 退路用(视觉规尖不可用时)。注意它假设"规和法兰同轴"——2026-10-08 真机实测 + 该假设不成立(规偏出 ~10mm),所以**不是**首选,见 _tip_offset_from_depth。 + """ p = Tee[:3, 3] R = Tee[:3, :3] off = R @ np.array([self.hover_offset[0], self.hover_offset[1], 0.0]) return np.array([p[0] + off[0], p[1] + off[1]]) + def _tip_offset_from_depth( + self, + depth_m: np.ndarray, + intr: Dict[str, float], + Tee: np.ndarray, + z_wp_cam: Optional[float] = None, + ) -> Tuple[Optional[np.ndarray], Optional[float], str]: + """从一帧深度里找**规尖**,返回 (规尖相对法兰的基座 XY 偏移, 工具长, 说明)。 + + 找不到/不可信时返回 (None, None, 原因)。判据(每条都能真的失败): + 1. 只看法兰轴线附近的**中央竖带**——规就夹在爪里,不会跑到画面边上; + 2. 多个连通域里取画面**更靠下**(v 更大)的那一个,不按面积、也不按 + 「最接近配置工具长」——按面积会选爪子;贴配置长会选法兰轴上的假深点 + (2026-10-09 真机工具长 225mm、偏移约 0,残差 0.14mm 但孔偏了); + 3. 有同一帧工件面深度时,只留**比工件面至少近 8mm** 的像素。相机前倾 + ~30°,规尖沿光轴只比面近十来毫米(2026-10-09 观测高度:面 127mm、 + 尖 115mm)。再往前砍 15mm 会把尖切掉,只剩更近的夹爪/杆身(~80mm), + 反投影偏移 ~2mm,残差 0.2mm 看着达标,针却偏在孔沿上。 + 没给工件面深度时,退回固定近端(默认 150mm); + 4. 反投出的"法兰 z − 规尖 z"必须落在 [tip_len_min, tip_len_max], + 并且基座 z 要比工件面高出一截 —— 挡住"深度读到台面/工件"。 + + ⚠️ 工具长这一项**只在单帧内**可信;实测它会跳(192~223mm)——规尖细、反光, + 掠射角下深度容易丢,丢了以后"最深有效像素"就往上跑、工具长只会**变短**。 + XY 偏移对这件事不敏感(杆细且接近竖直),见 _refresh_tip_offset。 + """ + import cv2 + + h, w = depth_m.shape + # 8mm:3mm 挡不住深度噪声(工件漏进来,工具长测成 296–315mm); + # 15mm 又把真规尖切掉(面 127mm、尖 115mm,只剩夹爪)。两条都在真机上红过。 + wp_gap = 0.008 + # z_wp 只在像相机深度时才当上限(真机孔 ~0.13–0.18m)。基座 z~0.03 会把近端切空。 + _z_wp = float(z_wp_cam) if z_wp_cam is not None else 0.0 + if 0.08 <= _z_wp <= 0.45: + ceiling = min(_z_wp - wp_gap, self.tip_max_m) + ceil_s = f"比工件面{_z_wp*1000:.0f}近{wp_gap*1000:.0f}" + else: + ceiling = self.tip_near_m + ceil_s = f"固定近端{self.tip_near_m*1000:.0f}" + valid = (depth_m > self.tip_min_m) & (depth_m < self.tip_max_m) + near = (valid & (depth_m < ceiling)).astype(np.uint8) + band = np.zeros_like(near) + half = max(1, int(self.tip_band_frac * w)) + c0, c1 = int(intr["cx"]) - half, int(intr["cx"]) + half + band[:, max(0, c0):min(w, c1)] = 1 + near = near & band + if int(near.sum()) < self.tip_min_px: + return None, None, ( + f"近端(<{ceiling*1000:.0f}mm,{ceil_s})中央竖带内像素 " + f"{int(near.sum())} < {self.tip_min_px}" + ) + n, lab, stats, _ = cv2.connectedComponentsWithStats(near, 8) + if n <= 1: + return None, None, "近端无连通域(规不见了吗)" + + # 掩膜已经丢掉贴着工件面的像素。基座 z 再挡一层:反投影落在面上的 + # 仍不是规尖。裕量 8mm 而不是 20mm——观测高度规尖离面只有约 15mm, + # 20mm 会把真尖一起丢掉(2026-10-09)。悬停时尖离面约 75mm,8mm 仍够。 + surf = float(getattr(self, "surface_z_m", 0.0) or 0.0) + above_surface_m = 0.008 + cands = [] + stuck = 0 + for i in range(1, n): + if int(stats[i, 4]) < self.tip_min_px: + continue + ys, xs = np.where(lab == i) + dv = depth_m[ys, xs] + k = float(np.percentile(dv, 97)) + sel = dv >= k - 1e-6 + u = float(np.median(xs[sel])) + v = float(np.median(ys[sel])) + # 用连通域自己的近端深度,不用周围 5×5:规尖只有几像素宽, + # 邻域中值会落到工件面上,尖又被当成面丢掉。 + z_tip = float(np.median(dv[sel])) + try: + p_tip = self._cam_to_base(self._px_to_cam(u, v, z_tip, intr)) + except Exception as exc: # noqa: BLE001 + return None, None, f"规尖反投影失败(手眼 TF 缺?): {exc}" + tool_len = float(Tee[2, 3]) - float(p_tip[2]) + if not (self.tip_len_min <= tool_len <= self.tip_len_max): + continue + if surf > 0.0 and float(p_tip[2]) < surf + above_surface_m: + stuck += 1 + continue + off = np.array( + [float(p_tip[0]) - float(Tee[0, 3]), float(p_tip[1]) - float(Tee[1, 3])] + ) + cands.append((off, tool_len, u, v)) + if not cands: + if stuck: + return None, None, ( + f"近端点贴着工件面(高出不足 {above_surface_m*1000:.0f}mm),不是规尖" + ) + return None, None, ( + f"反投影出的工具长不在 " + f"[{self.tip_len_min*1000:.0f},{self.tip_len_max*1000:.0f}]mm —— " + f"近端那个物体不是规" + ) + # v 优先:画面更靠下的才是伸向工件的那一端。工具长只作同分时的次序, + # 不拿去贴近 site.yaml —— 贴配置长会把法兰轴上的点当成规尖。 + off, tool_len, u, v = max(cands, key=lambda c: (c[3], c[1])) + return off, tool_len, f"px=({u:.0f},{v:.0f}) 工具长 {tool_len*1000:.0f}mm {ceil_s}" + + def _refresh_tip_offset(self) -> None: + """攒够**一致**样本后,定下并**冻结**「规尖相对法兰」的偏移。 + + 判据只有一条:取中位数剔掉外点后,还要剩 ``tip_calib_n`` 个样本落在 + ``tip_offset_tol_m`` 内。**不再要求"工具长分簇"** —— 实测那样太严: + 规尖像素时有时无,工具长在 203/222mm 之间跳,"工具长最长那一簇"往往只有 + 1~2 拍,永远凑不满 4 拍 ⇒ 永远冻不住 ⇒ 退回"法兰+偏置"(那就白改了)。 + 而"规杆细且接近竖直"⇒ 杆上任一像素反投回基座 XY 都在杆轴 ~3mm 内, + 所以**工具长差不影响偏移**,一致性校验就够。 + 工具长只用来跟 site.yaml 交叉核对(见下面的告警),不参与对准。 + + 为什么必须冻结:偏移是刚体量;逐拍重算会把"规杆略有倾斜"引入的 ±0.2~0.4mm + 抖动带进残差(2026-10-08 真机残差 0.44~0.85mm 来回荡、收不进 0.25mm)。 + """ + if self._tip_off is not None or len(self._tip_samp) < self.tip_calib_n: + return + arr = np.stack([o for o, _t in self._tip_samp]) + med = np.median(arr, axis=0) + inl = np.linalg.norm(arr - med, axis=1) <= self.tip_off_tol + if int(inl.sum()) < self.tip_calib_n: + self.get_logger().warn( + f" 规尖样本 {len(self._tip_samp)} 拍、一致的只有 {int(inl.sum())}/" + f"{self.tip_calib_n}(tol={self.tip_off_tol*1000:.0f}mm)—— 还冻不住,继续采" + ) + return + idx = np.where(inl)[0] + self._tip_off = arr[idx].mean(0) + tl = np.array([self._tip_samp[i][1] for i in idx], dtype=float) + self._tip_len_m = float(np.median(tl)) + cfg = float(self.tool_tip_below_flange_m or 0.0) + agree = "" if cfg <= 0 else ( + ",与 site.yaml 的工具长一致" + if abs(self._tip_len_m - cfg) <= 0.003 + else f" ⚠️ 与 site.yaml 的工具长 {cfg*1000:.0f}mm 差 " + f"{(self._tip_len_m-cfg)*1000:+.0f}mm —— 夹持变动?" + "下降量按 site 的几何走,这时要人工核对(别让规撞进孔)" + ) + self.get_logger().info( + f" 规尖偏移已冻结 = ({self._tip_off[0]*1000:+.1f},{self._tip_off[1]*1000:+.1f})mm" + f"({int(inl.sum())} 拍一致,最大散布 " + f"{float(np.max(np.linalg.norm(arr[idx]-self._tip_off, axis=1)))*1000:.2f}mm," + f"工具长 {self._tip_len_m*1000:.0f}mm{agree})" + " —— 刚体量,对准期间只量这一份" + ) + def _grab_median_depth(self, n: int) -> Optional[np.ndarray]: """拍 n 帧深度取时间中值(稳)。""" deps = [] @@ -1128,48 +1746,151 @@ class Stage2Locate(Node): return None return float(np.median(depth[ring])) - def _measure_z_wp(self, rod_mask: Optional[np.ndarray]) -> Optional[float]: - """下降后重测局部工件面深度(与悬停时 _local_wp_depth 同一方法,规杆掩码恒定直接复用)。""" - if rod_mask is None: - return None - depth = self._grab_median_depth(6) - if depth is None: - return None - return self._local_wp_depth(depth, rod_mask) - - def _descend_above_hole(self, q, Tee): + def _descend_above_hole(self, q, Tee, *, target_gap_m=None, step_m=None): """对准后柔顺轻降,把规尖悬在孔面上方 final_gap_m(不接触)。 - 原理:相机和规都固定在臂上 → 相机到规尖的距离 tip_d 恒定;纯 Z 下降使 - 「相机到工件面深度 z_wp」1:1 减小。下降到 z_wp = tip_d + final_gap 即规尖 - 悬在孔面上方 final_gap。按悬停时测得的间隙一次算下降量,分小步很慢下降, - 最后重测 z_wp 核验。不依赖规长/基座绝对 z,稳健;深度反馈保证不接触。 + **下降量只由几何决定**(这条是 2026-10-08 真机修出来的):: + + 规尖到工件面的间隙 = 法兰 Z(正运动学) − 工具长 − 工件面 Z + 需下降 = 该间隙 − final_gap + + 三个量都是确定的:法兰 Z 来自 FK(0.1mm 量级),工具长是标定值,工件面 Z + 是现场实测值(``gauge_assembly.workpiece_surface_z_m``)。 + + ⚠️ 为什么**不再**让深度测量决定下降量(或叫停)—— + 2026-09-29:``z_wp``("规杆外环形"深度中值)报 141mm,几何真值 53mm, + 于是多降 86mm 把规撞进工件(工件被推走 5mm)。 + 2026-10-08:同一个读数又反着错 —— 悬停时报 144mm(几何真值 75mm), + 只降 24mm 后又翻成 **−7mm**,触发 ``SAFE_FLOOR`` 把轻降停在离面 ~50mm 处, + 永远到不了 2mm。同一套读数在两个方向上各错一次、幅度 150mm 量级、还随位姿 + 乱跳 —— 它对"能降多少"和"该不该停"都没有发言权。 + + 所以现在深度读数**只做交叉核对**:与几何对不上就喊出来(把"测距方法待修" + 摆在日志里),但不再参与任何决策。真正的安全由三条**物理/几何**机制保证: + + 1. 几何预算上限 ``descent_budget_m``(与 ``gauge_fsm.hover_z_guard`` 同源)—— + FK/配置异常时也压不下去; + 2. 腕部 FT 接触检测:``force.z`` 相对悬空基线突变 ⇒ 立即停 + 回退 1mm; + 3. 任一步 ``_goto`` 没走到位(多半是碰到东西/被挡)⇒ 停止,保持当前高度。 """ - if not self.final_descent_enable: - return True, q, Tee + # final_descent_enable:多走多拍降到贴面 final_gap(约 2mm)。 + # 关掉时(--no-descent)仍做**观测下降**,停在 observe_gap(约 15mm)。 + # 单次精拍补交路径传入观察高;锁 XY 实验传入贴面 final_gap。 + if target_gap_m is None: + target_gap = ( + self.final_gap_m if self.final_descent_enable else self.observe_gap_m + ) + else: + target_gap = float(target_gap_m) + step_cap = 0.004 if step_m is None else float(step_m) + kind = ( + "贴面轻降" + if target_gap <= float(self.final_gap_m) + 1e-6 + else "观测下降" + ) self._state("descend_above_hole") - tip_d, rod_mask, z_wp = self._measure_gauge_state() - if tip_d is None or z_wp is None: - self.get_logger().warn("未测到通止规/工件间隙(规可能不在视野),跳过轻降,停在悬停高") - return True, q, Tee - gap0 = z_wp - tip_d - descent = gap0 - self.final_gap_m + tip_len = float(self.tool_tip_below_flange_m) + surf = float(self.surface_z_m) + if tip_len <= 0.0 or surf <= 0.0 or self.descent_budget_m is None: + # 缺几何就没法算安全下降量 —— 停在悬停高,**绝不**拿测距去赌 + # (2026-09-29 撞工件就是"没有几何、只有测距"时发生的)。配置缺键 + # 必须当失败处理(R1.1),不能静默降级成"按测量降"。 + self.get_logger().error( + "轻降缺少几何:tool_tip_below_flange_m / workpiece_surface_z_m / " + "descent_budget 至少一个没配 —— 停在悬停高,不下降。" + "请补 site.yaml 的 robots[].gauge_assembly 两把尺子。" + ) + return False, q, Tee + + gap0 = float(Tee[2, 3]) - tip_len - surf # 几何间隙(唯一决定下降量的量) + descent = gap0 - target_gap + if descent > self.descent_budget_m + 5e-4: + self.get_logger().warn( + f"轻降超过配置几何预算:按 FK 算需降 {descent * 1000:.1f}mm > " + f"预算 {self.descent_budget_m * 1000:.1f}mm" + f"(当前法兰 {Tee[2, 3]:.4f} 与配置悬停 {self.hover_z:.4f} 不符)" + "—— 收到预算(宁高勿撞)" + ) + descent = self.descent_budget_m + + # ---- 深度读数只做交叉核对(无权叫停、无权加码)---- + tip_d, _rod_mask, z_wp = self._measure_gauge_state() + if tip_d is not None and z_wp is not None: + gap_meas = float(z_wp) - float(tip_d) + if abs(gap_meas - gap0) > 0.010: + self.get_logger().warn( + f"深度测距与几何不符:测量间隙 {gap_meas * 1000:.1f}mm vs " + f"几何 {gap0 * 1000:.1f}mm(差 {(gap_meas - gap0) * 1000:+.1f}mm)" + "—— 本次**按几何下降**,深度读数不参与决策" + "(测距方法待修,见 site.yaml 的 final_descent_enable 注释)" + ) + else: + self.get_logger().warn( + "未测到通止规/工件(规可能不在视野)—— 深度核对跳过,仍按几何下降" + "(下降量不依赖规是否可见)" + ) + self.get_logger().info( - f"轻降准备: 规尖-工件间隙 {gap0 * 1000:.1f}mm → 目标 {self.final_gap_m * 1000:.1f}mm," - f"需下降 {descent * 1000:.1f}mm(规尖深 {tip_d * 1000:.0f}mm 恒定,很慢很柔)" + f"{kind}准备: 几何间隙 {gap0 * 1000:.1f}mm → 目标 {target_gap * 1000:.1f}mm," + f"需下降 {descent * 1000:.1f}mm(法兰 {Tee[2, 3]:.4f} − 工具长 {tip_len * 1000:.0f}mm" + f" − 工件面 {surf:.4f};很慢,XY 保持)" ) if descent <= 0.001: self.get_logger().info("规尖已在目标间隙附近,无需下降") + self.descent_final_gap_m = gap0 return True, q, Tee # 腕部力基线(规尖悬空时的 force.z),用于接触检测兜底 base_fz = self._ft_fz - # 闭环轻降:每降一小步就重测局部工件面深度,间隙到 final_gap 就停——绝不一次冲到位,防过冲接触。 - SAFE_FLOOR = 0.0012 # 安全下限 1.2mm:实测间隙≤它立即停(防深度噪声/过冲导致接触) - for _ in range(12): + if base_fz is None: + self.get_logger().warn( + "轻降开始前还没收到腕部 FT —— 接触兜底不生效(只剩几何预算与 _goto 两道)" + ) + # 步数上限:预算 ≤~80mm、单步 ≤4mm ⇒ 20 步足够;给 60 步余量,真正收工靠 + # 几何预算(下面的 remaining),不靠步数。 + for step_i in range(60): if not rclpy.ok(): return False, q, Tee - # 力觉兜底:规尖一碰工件 force.z 突变,立即停并回退 1mm - if base_fz is not None and self._contact_detected(base_fz): + # 每步把 FT 轴向力打进日志:这是"停住到底是碰到了还是没跟上"的**唯一** + # 直接证据(2026-10-08 排查轻降在离面 ~4mm 处停住时,就靠这一行区分 + # "接触"与"驱动没跟上"——没有它只能靠猜)。 + if self._ft_fz is None: + ft_txt = "FT_fz=None" + elif base_fz is None: + ft_txt = f"FT_fz={self._ft_fz:+.2f}N(无基线)" + else: + ft_txt = ( + f"FT_fz={self._ft_fz:+.2f}N(基线 {base_fz:+.2f}," + f"Δ{self._ft_fz - base_fz:+.2f})" + ) + self.get_logger().info( + f" 轻降第 {step_i + 1} 步: 法兰 Z={Tee[2, 3]:.4f} {ft_txt}" + ) + # 力觉兜底:规尖一碰工件 force.z 突变,立即停并回退 1mm。 + # 离面还远时力会漂几牛,不能当碰到。 + gap_now = float(Tee[2, 3]) - tip_len - surf + if ( + base_fz is not None + and self._contact_detected(base_fz) + and not contact_armed_by_gap( + gap_now, self.observe_gap_m, self.final_gap_m + ) + ): + if not getattr(self, "_ft_gap_disarmed_logged", False): + self._ft_gap_disarmed_logged = True + armed_m = contact_armed_gap_m( + self.observe_gap_m, self.final_gap_m + ) + self.get_logger().info( + f" ΔFz 超门槛但间隙 {gap_now * 1000:.1f}mm > 接触门控 " + f"{armed_m * 1000:.1f}mm,不当作碰到" + ) + if ( + base_fz is not None + and contact_armed_by_gap( + gap_now, self.observe_gap_m, self.final_gap_m + ) + and self._contact_detected(base_fz) + ): self.get_logger().warn("腕部力突变(规尖触到工件),立即停止并回退 1mm(安全优先)") p = Tee[:3, 3].copy() ok, q, Tee = self._goto( @@ -1178,20 +1899,13 @@ class Stage2Locate(Node): v=self.final_descent_speed, max_hops=3, hold_xy=True, settle_s=0.25, ) self._pin(q) + self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf return True, q, Tee - z_now = self._measure_z_wp(rod_mask) - if z_now is not None: - gap_now = z_now - tip_d - excess = gap_now - self.final_gap_m - # 安全下限优先:宁可停在孔上方多一点,也绝不压到工件 - if gap_now <= SAFE_FLOOR: - self.get_logger().info(f"已达安全下限间隙 {gap_now * 1000:.1f}mm,停止下降(不接触)") - break - else: - excess = descent # 测不到就按预算量保守走 - if excess <= 0.0004: # 已到 final_gap+0.4mm 容差内 + # 用 FK 现算剩余下降量(不是累加指令)—— 单步没走到也不会积累误差。 + remaining = (float(Tee[2, 3]) - tip_len - surf) - target_gap + if remaining <= 1e-4: break - step = min(excess, 0.004) # 每步 ≤4mm,很慢很柔 + step = min(remaining, step_cap) # 贴面默认 ≤4mm;观察高 20mm,见 step_m p = Tee[:3, 3].copy() target = np.array([p[0], p[1], p[2] - step]) ok, q, Tee = self._goto( @@ -1202,18 +1916,704 @@ class Stage2Locate(Node): self._pin(q) if not ok: self.get_logger().warn("轻降中途未到位,停止(保持当前高度,安全优先)") + self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf return False, q, Tee - # 核验:重测工件面深度,算最终间隙(深度反馈,确保不接触) - z2 = self._measure_z_wp(rod_mask) - if z2 is not None: - gap_f = z2 - tip_d - lvl = self.get_logger().info if 0.0003 < gap_f else self.get_logger().warn - lvl( - f"=== 轻降完成: 规尖悬在孔面上方 ≈{gap_f * 1000:.1f}mm " - f"(目标 {self.final_gap_m * 1000:.1f}mm,不接触)===" - ) + # 收尾:按几何如实汇报最终间隙(不再用那个错 150mm 的深度读数当结论) + gap_f = float(Tee[2, 3]) - tip_len - surf + self.descent_final_gap_m = gap_f + lvl = self.get_logger().info if gap_f >= 0.0 else self.get_logger().warn + lvl( + f"=== {kind}完成: 规尖悬在孔面上方 ≈{gap_f * 1000:.1f}mm(几何:法兰 " + f"{Tee[2, 3]:.4f} − 工具长 {tip_len * 1000:.0f}mm − 工件面 {surf:.4f};" + f"目标 {target_gap * 1000:.1f}mm,不接触)===" + ) return True, q, Tee + def _stamp_bias( + self, + rec: Dict[str, Any], + *, + tgt_b: np.ndarray, + gxy: np.ndarray, + tag: str, + ) -> Dict[str, Any]: + """把基座残差拆成视线 / 画面右,写入记录。投影退化时键仍在、值为 None。""" + rec = dict(rec) + rec["tag"] = tag + if self.hole_keypoint_once and getattr(self, "hole_once_lock_xy_descend", False): + rec["scheme"] = "keypoint_once_look_ff" + elif self.hole_keypoint_once: + rec["scheme"] = "keypoint_once" + else: + rec["scheme"] = "multi_snap" + rec["cam_frame"] = self.cam_frame + rec["image_topic"] = self.image_topic + err_vec = np.array( + [float(tgt_b[0]) - float(gxy[0]), float(tgt_b[1]) - float(gxy[1])], + dtype=float, + ) + rec["err_xy_m"] = [round(float(err_vec[0]), 5), round(float(err_vec[1]), 5)] + rec["workspace_clipped"] = bool(self._ws_clipped) + T_cam = self._lookup(self.base_frame, self.cam_frame) + rec["along_look_mm"] = None + rec["along_right_mm"] = None + rec["look_xy"] = None + rec["right_xy"] = None + rec["cam_origin_base_m"] = None + if T_cam is None: + self.get_logger().warn(f"{tag}:没有 cam TF,残差分解缺轴") + return rec + rec["cam_origin_base_m"] = [ + round(float(T_cam[0, 3]), 5), + round(float(T_cam[1, 3]), 5), + round(float(T_cam[2, 3]), 5), + ] + decomp = decompose_base_xy(err_vec, T_cam) + if decomp is None: + self.get_logger().warn(f"{tag}:光轴水平投影退化,残差分解缺轴") + return rec + rec["along_look_mm"] = round(float(decomp["along_look_m"]) * 1000.0, 2) + rec["along_right_mm"] = round(float(decomp["along_right_m"]) * 1000.0, 2) + rec["look_xy"] = [round(float(v), 5) for v in decomp["look_xy"]] + rec["right_xy"] = [round(float(v), 5) for v in decomp["right_xy"]] + self.get_logger().info( + f"[{tag}] 残差分解 视线={rec['along_look_mm']:+.2f}mm " + f"画面右={rec['along_right_mm']:+.2f}mm " + f"ΔXY=({err_vec[0]*1000:+.2f},{err_vec[1]*1000:+.2f})mm\n" + f" 画面右为正:孔在规的画面右侧(目视就是规偏左)。" + f"视线为正:孔在光轴水平投影前方(工件面写低 / 交深了会往这偏)。" + ) + return rec + + def _observe_holes(self, q, Tee, final: Dict[str, Any], *, tag: str): + """核验拍:只记账,不改 XY。拍不到就保持原 final,并标明没复测。""" + try: + _bgr, _depth_m, _intr, res = self._snap_holes(skip_center_gate=True) + except Exception as exc: # noqa: BLE001 + self.get_logger().error(f"{tag}失败,残差仍是开环指令值:{exc}") + final = dict(final) + final["residual_remeasured"] = False + return q, Tee, final + if not res.get("status"): + self.get_logger().error( + f"{tag}丢孔({res.get('msg')}),残差仍是开环指令值,不是 hop 到位" + ) + final = dict(final) + final["residual_remeasured"] = False + return q, Tee, final + hb = res.get("hole_base") + z_wp = float(res.get("z_wp") or 0.0) + if hb is None or len(hb) != 2 or z_wp <= 0.0: + self.get_logger().error(f"{tag}没有孔的基座坐标,残差未复测") + final = dict(final) + final["residual_remeasured"] = False + return q, Tee, final + left_b = np.asarray(hb[0], dtype=float) + right_b = np.asarray(hb[1], dtype=float) + k1_b, k2_b = (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) + tgt_b = k1_b if self.target_hole == "k1" else k2_b + Tee_now = self._lookup(self.base_frame, self.ee_frame) + if Tee_now is not None: + Tee = Tee_now + pts = res.get("hole_points") or [] + if self._tip_off is not None: + gxy = np.array( + [float(Tee[0, 3]) + float(self._tip_off[0]), + float(Tee[1, 3]) + float(self._tip_off[1])] + ) + tip_src = "视觉规尖(开环本步)" + else: + gxy = self._gauge_xy(Tee) + tip_src = "法兰+偏置" + err = float(np.hypot(float(tgt_b[0]) - gxy[0], float(tgt_b[1]) - gxy[1])) + rec = { + "ok": err <= self.align_tol, + "arm": self.prefix.rstrip("_"), + "target_hole": self.target_hole, + "k1_base_m": [round(float(v), 5) for v in k1_b], + "k2_base_m": [round(float(v), 5) for v in k2_b], + "k1_px": ( + [round(float(pts[0][0]), 1), round(float(pts[0][1]), 1)] + if len(pts) >= 2 else None + ), + "k2_px": ( + [round(float(pts[1][0]), 1), round(float(pts[1][1]), 1)] + if len(pts) >= 2 else None + ), + "workpiece_surface_z_m": round(z_wp, 4), + "gauge_xy_m": [round(float(gxy[0]), 5), round(float(gxy[1]), 5)], + "gauge_source": tip_src, + "tip_offset_m": ( + [round(float(self._tip_off[0]), 5), round(float(self._tip_off[1]), 5)] + if self._tip_off is not None else None + ), + "residual_mm": round(err * 1000.0, 2), + "hover_z_m": round(float(Tee[2, 3]), 4), + "residual_remeasured": True, + "align_trusted": self._tip_off is not None, + } + rec = self._stamp_bias(rec, tgt_b=tgt_b, gxy=gxy, tag=tag) + snaps = list(final.get("snaps") or []) + snaps.append({k: rec[k] for k in ( + "tag", "residual_mm", "err_xy_m", "along_look_mm", "along_right_mm", + "k1_base_m", "k2_base_m", "k1_px", "k2_px", "gauge_xy_m", + "gauge_source", "tip_offset_m", "hover_z_m", "workspace_clipped", + ) if k in rec}) + merged = dict(final) + merged.update(rec) + merged["snaps"] = snaps + merged["ok"] = bool(rec["ok"] and rec["align_trusted"]) + draw = res.get("draw_img") + if draw is None: + draw = _bgr + if draw is not None: + self._publish_overlay(draw) + self._publish_result(merged) + self.get_logger().info( + f"[{tag}] k1=({k1_b[0]:.4f},{k1_b[1]:.4f}) " + f"工具=({gxy[0]:.4f},{gxy[1]:.4f})[{tip_src}] " + f"复测残差={err*1000:.2f}mm(此拍不改 XY)" + ) + return q, Tee, merged + + def _oneshot_align_move(self, q, Tee, tgt_b, gxy, err): + """单次精拍只走这一步。返回 (q, Tee, 是否走了)。""" + if err <= self.align_tol: + self.get_logger().info( + f"单次精拍开环残差 {err*1000:.2f}mm 已在容差内,这一步不横移" + ) + return q, Tee, False + raw = np.array([float(tgt_b[0]) - float(gxy[0]), float(tgt_b[1]) - float(gxy[1])]) + n_raw = float(np.linalg.norm(raw)) + max_step = oneshot_align_step_m(n_raw) + step = raw + if n_raw > max_step + 1e-9: + step = raw * (max_step / n_raw) + self.get_logger().warn( + f" 单次精拍步长 {n_raw*1000:.1f}mm 超过 " + f"{max_step*1000:.0f}mm(不像框心到 k1 的半孔距),截断。" + "截断后下降补 XY 也补不完,会留下厘米级残差" + ) + else: + self.get_logger().info( + f" 单次精拍这一步走完 {n_raw*1000:.1f}mm(框心到目标孔,不再用 12mm 封顶)" + ) + move = np.array([ + float(Tee[0, 3]) + float(step[0]), + float(Tee[1, 3]) + float(step[1]), + self.hover_z, + ]) + hop_tol = 0.00022 if err < 0.003 else max(0.0003, min(0.0005, 0.25 * err)) + hop_v = self.align_speed if err > 0.005 else min(self.align_speed, 0.016) + self._state("align_move_once") + ok, q, Tee = self._goto( + q, Tee, move, verticalize=True, + tol_m=hop_tol, tol_tilt=self.vert_tol_rad * 2.0, + tag="align_once", v=hop_v, + max_hops=8, settle_s=max(0.35, self.settle_sec), + min_dur=0.35, strict_xy=True, + ) + self._pin(q) + if not ok: + self.get_logger().warn( + "单次精拍这一步没走到位;残差以随后核验拍为准,不把 hop 容差当对上" + ) + return q, Tee, True + + def _vendor_movel_tcp(self, xyz, vel: float) -> bool: + """进程内厂家 MoveL:TCP 目标,不杀控制栈。""" + lib = ros2_root() / "scripts" / "lib" + if str(lib) not in sys.path: + sys.path.insert(0, str(lib)) + from flexiv_movel_ipc import read_ack, read_done, write_request + + seq = int(time.monotonic() * 1000.0) % 1_000_000_000 + write_request( + seq, float(xyz[0]), float(xyz[1]), float(xyz[2]), False, float(vel) + ) + t0 = time.monotonic() + acked = False + while time.monotonic() - t0 < 90.0: + if not rclpy.ok(): + return False + self._spin(0.02) + if not acked: + if read_ack() == seq: + acked = True + elif time.monotonic() - t0 > 2.0: + self.get_logger().error( + "厂家 MoveL 2s 内没 ack —— 硬件没接 /tmp/flexiv_movel_req。" + "真机环境重建 install/ 后再跑,不许改走关节折线假装成功" + ) + return False + continue + got = read_done() + if got is not None and int(got[0]) == seq: + if not got[1]: + self.get_logger().error(f"厂家 MoveL 失败:{got[2]}") + return bool(got[1]) + self.get_logger().error("厂家 MoveL 90s 内没有 done") + return False + + def _once_ff_diagonal_to_gap(self, q, Tee, *, target_gap_m): + """悬停点一条 MoveL 收到 ``target_gap_m``。k=0 只降 Z;k>0 再沿 -look 收 XY。""" + self._state("ff_diagonal_movel") + tip_len = float(self.tool_tip_below_flange_m) + surf = float(self.surface_z_m) + if tip_len <= 0.0 or surf <= 0.0: + self.get_logger().error("贴面下降缺工具长/工件面,停在悬停高") + return False, q, Tee + if self._tip_off is None: + self.get_logger().error("贴面下降需要悬停规尖偏移,没有就不许用法兰凑") + return False, q, Tee + k = float(self.once_ff_look_per_m) + look_xy = np.array([0.0, 0.0], dtype=float) + T_cam = self._lookup(self.base_frame, self.cam_frame) + if k > 1e-9: + if T_cam is None: + self.get_logger().error("没有 cam TF,视线轴算不出,不下发") + return False, q, Tee + axes = cam_xy_bias_axes(T_cam) + if axes is None: + self.get_logger().error("光轴水平投影退化,不下发") + return False, q, Tee + look_xy, _right = axes + elif T_cam is not None: + axes = cam_xy_bias_axes(T_cam) + if axes is not None: + look_xy, _right = axes + gap0 = float(Tee[2, 3]) - tip_len - surf + descent = gap0 - float(target_gap_m) + packed = once_ff_tcp_xyz( + [Tee[0, 3], Tee[1, 3]], + self._tip_off, + look_xy, + descent, + k, + surf, + target_gap_m, + ) + if packed is None: + if descent <= 0.001: + self.get_logger().info("规尖已在目标间隙附近,无需斜线") + self.descent_final_gap_m = gap0 + return True, q, Tee + self.get_logger().error("视线前馈算不出 ΔXY,停在悬停高") + return False, q, Tee + tcp, dxy = packed + n_xy = float(np.hypot(float(dxy[0]), float(dxy[1]))) + if n_xy > ONCE_TRIM_REFUSE_M + 1e-9: + self.get_logger().error( + f"视线前馈 {n_xy * 1000:.1f}mm 超过 {ONCE_TRIM_REFUSE_M * 1000:.0f}mm," + "不像交平面那几毫米,停在悬停高" + ) + return False, q, Tee + z_flange = flange_z_for_gap_m(tip_len, surf, target_gap_m) + flange_tgt = np.array( + [ + float(Tee[0, 3]) + float(dxy[0]), + float(Tee[1, 3]) + float(dxy[1]), + z_flange, + ] + ) + self._ws_clipped = False + self._clamp_ws(flange_tgt) + if self._ws_clipped: + self.get_logger().error( + "视线前馈目标被工作盒截断,不下发(不许把孔位改到盒沿)" + ) + return False, q, Tee + self._spin(0.05) + tcp_now = self._fresh_tcp_world() + if tcp_now is None: + self.get_logger().error( + "没有厂家 tcp_pose(话题 " + f"{getattr(self, 'robot_states_topic', '?')} 不新鲜)," + "拒绝用 ROS 规尖绝对坐标发 MoveL" + ) + return False, q, Tee + movel_xyz = once_ff_movel_from_tcp(tcp_now, dxy, descent) + if movel_xyz is None: + self.get_logger().error("厂家 TCP 加上相对位移算不出,停在悬停高") + return False, q, Tee + off_xy = ( + (float(tcp_now[0]) - float(tcp[0]) + float(dxy[0])) * 1000.0, + (float(tcp_now[1]) - float(tcp[1]) + float(dxy[1])) * 1000.0, + ) + scheme = "笛卡尔锁XY只降Z" if n_xy < 1e-6 else "视线前馈斜线" + self.get_logger().info( + f"{scheme}:look=({look_xy[0]:+.3f},{look_xy[1]:+.3f}) " + f"k={k:.3f} 降 {descent * 1000:.1f}mm → " + f"ΔXY=({dxy[0] * 1000:+.2f},{dxy[1] * 1000:+.2f})mm " + f"厂家TCP现=({tcp_now[0]:.4f},{tcp_now[1]:.4f},{tcp_now[2]:.4f}) " + f"MoveL=({movel_xyz[0]:.4f},{movel_xyz[1]:.4f},{movel_xyz[2]:.4f}) " + f"ROS尖目标=({tcp[0]:.4f},{tcp[1]:.4f},{tcp[2]:.4f}) " + f"WORLD相对ROS XY差≈({off_xy[0]:+.1f},{off_xy[1]:+.1f})mm " + f"vel={ONCE_FF_MOVEL_VEL_MPS * 1000:.0f}mm/s" + ) + fl0 = (float(Tee[0, 3]), float(Tee[1, 3]), float(Tee[2, 3])) + ok = self._vendor_movel_tcp(movel_xyz, ONCE_FF_MOVEL_VEL_MPS) + # MoveL 刚切回关节模式:JTC 还握着贴面前的悬停关节。等 2 s 再钉 + # 等于让 vmax=0.05 往悬停留 0.1 rad(2026-10-16 收臂实测多抬 13–20 mm)。 + q2, Tee2 = self._wait_state(0.3) + if q2 is not None and Tee2 is not None: + q, Tee = q2, Tee2 + self._pin(q) + self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf + dax = (float(Tee[0, 3]) - fl0[0]) * 1000.0 + day = (float(Tee[1, 3]) - fl0[1]) * 1000.0 + daz = (float(Tee[2, 3]) - fl0[2]) * 1000.0 + self.get_logger().info( + f"贴面走后:法兰 ΔXYZ=({dax:+.2f},{day:+.2f},{daz:+.2f})mm " + f"指令 ΔXY=({dxy[0] * 1000:+.2f},{dxy[1] * 1000:+.2f})mm " + f"间隙 {self.descent_final_gap_m * 1000:.1f}mm " + f"{'到位' if ok else 'MoveL未完成'}" + ) + return bool(ok), q, Tee + + def _trim_xy_keep_hover_tip(self, q, Tee, final: Dict[str, Any], z_target_m=None): + """观察高重交孔,规尖沿用悬停冻住的偏移。只许一跳、XY ≤3mm。 + + 2026-10-13 真机两遍:走后核验 0.4~0.7mm,降后交平面漂 4~5mm;观测高度 + 深度把夹爪当尖,两拍差 8~36mm,重测守卫把该补的 4mm 也拒掉了。悬停规尖 + 只有 0.1mm 量级,沿用它,只补孔 XY。没有冻住的偏移就不许用法兰凑。 + + 同日第二次:两跳合计 +4.3mm X 把近距检测带崩(k1 像素 446→403,间距 + 60→45mm,残差 2.6→14.8mm),流水线还把走之前的 2.61mm 当终值。所以 + 只许一跳、步长 ≤3mm;超过 8mm 根本不动。 + + ``z_target_m`` 有值时这一跳同时收到贴面法兰高(观察高测补偿,斜线一步 + 贴面)。贴面复拍只记账:近了画面更容易漂,不按近距那一拍撤回观察高的解。 + """ + if self._tip_off is None: + self.get_logger().error( + "下降后补 XY 需要悬停冻住的规尖偏移;没有就不许用法兰凑,保持原地" + ) + return q, Tee, final + off = np.asarray(self._tip_off, dtype=float).reshape(2) + final_in = final + z_hold = float(Tee[2, 3]) + + def _measure(src: Dict[str, Any], tag: str): + nonlocal Tee + try: + _bgr, _depth_m, _intr, res = self._snap_holes(skip_center_gate=True) + except Exception as exc: # noqa: BLE001 + self.get_logger().warn(f"{tag}复拍失败,保持原地:{exc}") + return None + if not res.get("status"): + self.get_logger().warn(f"{tag}丢孔({res.get('msg')}),不再改 XY") + return None + hb = res.get("hole_base") + z_wp = float(res.get("z_wp") or 0.0) + if hb is None or len(hb) != 2 or z_wp <= 0.0: + self.get_logger().warn(f"{tag}没有孔的基座坐标,不再改 XY") + return None + left_b = np.asarray(hb[0], dtype=float) + right_b = np.asarray(hb[1], dtype=float) + k1_b, k2_b = ( + (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) + ) + tgt = k1_b if self.target_hole == "k1" else k2_b + Tee_now = self._lookup(self.base_frame, self.ee_frame) + if Tee_now is not None: + Tee = Tee_now + gxy = np.array( + [float(Tee[0, 3]) + float(off[0]), float(Tee[1, 3]) + float(off[1])] + ) + raw = np.array([float(tgt[0]) - gxy[0], float(tgt[1]) - gxy[1]]) + err = float(np.linalg.norm(raw)) + pair = hole_pair_span_m(k1_b, k2_b) + rec = dict(src) + rec["residual_mm"] = round(err * 1000.0, 2) + rec["tip_offset_m"] = [round(float(off[0]), 5), round(float(off[1]), 5)] + rec["gauge_xy_m"] = [round(float(gxy[0]), 5), round(float(gxy[1]), 5)] + rec["gauge_source"] = "视觉规尖(悬停冻结,下降后只重交孔)" + rec["k1_base_m"] = [round(float(v), 5) for v in k1_b] + rec["k2_base_m"] = [round(float(v), 5) for v in k2_b] + rec["hover_z_m"] = round(float(Tee[2, 3]), 4) + rec["pair_span_mm"] = round(pair * 1000.0, 2) + rec["residual_remeasured"] = True + rec["align_trusted"] = True + rec = self._stamp_bias(rec, tgt_b=tgt, gxy=gxy, tag=tag) + snaps = list(src.get("snaps") or []) + snaps.append({ + "tag": rec.get("tag"), + "residual_mm": rec.get("residual_mm"), + "err_xy_m": rec.get("err_xy_m"), + "along_look_mm": rec.get("along_look_mm"), + "along_right_mm": rec.get("along_right_mm"), + "k1_base_m": rec.get("k1_base_m"), + "gauge_xy_m": rec.get("gauge_xy_m"), + "gauge_source": rec.get("gauge_source"), + "tip_offset_m": rec.get("tip_offset_m"), + "hover_z_m": rec.get("hover_z_m"), + "pair_span_mm": rec.get("pair_span_mm"), + }) + rec["snaps"] = snaps + rec["ok"] = err <= self.align_tol + rec["trim_reverted"] = False + self._publish_result(rec) + self.get_logger().info( + f"[{tag}] 工具=({gxy[0]:.4f},{gxy[1]:.4f})" + f"[悬停冻结] 残差={err * 1000:.2f}mm 间距={pair * 1000:.1f}mm —— 不重测规尖" + ) + return rec, err, raw, pair + + def _revert(xy_flange) -> None: + nonlocal q, Tee + back = np.array([float(xy_flange[0]), float(xy_flange[1]), z_hold]) + okb, q, Tee = self._goto( + q, Tee, back, verticalize=True, + tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, + tag="trim_xy_revert", v=min(float(self.align_speed), 0.010), + max_hops=4, settle_s=0.30, strict_xy=True, + ) + self._pin(q) + if not okb: + self.get_logger().error("下降后补孔撤回没走到,位置以当前 FK 为准") + + if not rclpy.ok(): + return q, Tee, final_in + measured = _measure(final_in, "下降后补孔 0") + if measured is None: + return q, Tee, final_in + rec, err, raw, pair = measured + z_goal = z_hold + blend_z = False + if z_target_m is not None: + z_goal = min(z_hold, float(z_target_m)) + blend_z = (z_hold - z_goal) > 0.0005 + if not hole_pair_span_ok(pair): + self.get_logger().error( + f"下降后两孔间距 {pair * 1000:.1f}mm 不在 50–70mm,检测漂了,不动" + ) + return q, Tee, final_in + if err > ONCE_TRIM_REFUSE_M: + self.get_logger().error( + f"下降后要对 {err * 1000:.1f}mm,超过 {ONCE_TRIM_REFUSE_M * 1000:.0f}mm " + "—— 不像交平面漂移,停在原地" + ) + return q, Tee, final_in + need_xy = err > self.align_tol + if (not need_xy) and (not blend_z): + self.get_logger().info( + f"下降后 XY 已在容差内({err * 1000:.2f}mm),高度保持 {z_hold:.4f}" + ) + return q, Tee, rec + step = np.zeros(2, dtype=float) if not need_xy else np.asarray(raw, dtype=float) + if need_xy and err > ONCE_TRIM_MAX_STEP_M: + step = raw * (ONCE_TRIM_MAX_STEP_M / err) + xy_before = np.array([float(Tee[0, 3]), float(Tee[1, 3])]) + move = np.array([ + float(Tee[0, 3]) + float(step[0]), + float(Tee[1, 3]) + float(step[1]), + z_goal, + ]) + hop_tag = "trim_blend_to_final" if blend_z else "trim_xy_keep_tip" + hop_v = ( + min(float(getattr(self, "final_descent_speed", 0.005) or 0.005), 0.008) + if blend_z + else min(float(self.align_speed), 0.010) + ) + if blend_z: + self.get_logger().info( + f"观察高斜线贴面 Δxy=({step[0] * 1000:+.1f},{step[1] * 1000:+.1f})mm " + f"Δz={(z_goal - z_hold) * 1000:+.1f}mm → 法兰 Z {z_goal:.4f}" + ) + ok, q, Tee = self._goto( + q, Tee, move, verticalize=True, + tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, + tag=hop_tag, v=hop_v, + max_hops=4, settle_s=0.30, strict_xy=True, + ) + self._pin(q) + if not ok: + self.get_logger().warn("下降后 XY 修正没走到,停;残差以走前重测为准") + return q, Tee, rec + if abs(float(Tee[2, 3]) - z_goal) > 0.002: + self.get_logger().error( + f"下降后修正把高度从 {z_hold:.4f} 带到了 {float(Tee[2, 3]):.4f}" + f"(目标 {z_goal:.4f}),撤回" + ) + _revert(xy_before) + rec["trim_reverted"] = True + rec["ok"] = err <= self.align_tol + return q, Tee, rec + after = _measure(rec, "下降后补孔核验") + if blend_z: + if after is None or (not hole_pair_span_ok(after[3])) or after[1] > ONCE_TRIM_REFUSE_M: + self.get_logger().warn( + "贴面复拍不可信,斜线位姿保留(补偿按观察高那一拍)" + ) + rec["close_snap_untrusted"] = True + rec["hover_z_m"] = round(float(Tee[2, 3]), 4) + rec["ok"] = err <= self.align_tol + self._publish_result(rec) + return q, Tee, rec + rec2, err2, _raw2, _pair2 = after + rec2["ok"] = err2 <= self.align_tol + rec2["trim_reverted"] = False + rec2["close_snap_untrusted"] = False + self._publish_result(rec2) + return q, Tee, rec2 + if after is None: + self.get_logger().error("下降后补孔走完复拍失败,撤回这一跳") + _revert(xy_before) + rec["trim_reverted"] = True + rec["ok"] = err <= self.align_tol + return q, Tee, rec + rec2, err2, _raw2, pair2 = after + worse_pair = (not hole_pair_span_ok(pair2)) or (pair2 < pair - 0.002) + worse_res = err2 > err + 1e-6 + if worse_pair or worse_res: + self.get_logger().error( + f"下降后补了 {float(np.linalg.norm(step)) * 1000:.1f}mm 后变差" + f"(残差 {err * 1000:.2f}→{err2 * 1000:.2f}mm," + f"间距 {pair * 1000:.1f}→{pair2 * 1000:.1f}mm),撤回这一跳" + ) + _revert(xy_before) + rec["trim_reverted"] = True + rec["ok"] = err <= self.align_tol + rec["snaps"] = rec2.get("snaps") or rec.get("snaps") + self._publish_result(rec) + return q, Tee, rec + rec2["ok"] = err2 <= self.align_tol + rec2["trim_reverted"] = False + self._publish_result(rec2) + return q, Tee, rec2 + + def _trim_xy_after_descent(self, q, Tee, final: Dict[str, Any]): + """下降之后、保持当前高度,用这一高度的规尖和孔再对一次 XY。 + + 悬停残差不能拿来当下降后的孔位。相机光轴相对法兰约 30°,孔的基座 XY + 对深度大约 0.5 mm/mm。2026-10-09:同一孔在悬停(相机深度 180mm,残差 + 0.22mm)和观测高度(127mm)上反投影,基座 XY 差约 2mm;法兰 XY 下降时 + 只动了 0.2mm。画面里针在孔的上方一截,主要是 15mm 间隙的透视,横着的 + 那 2mm 才是要补的。 + + 多走多拍:只用本高度新量的规尖,不沿用悬停时冻住的偏移。总修正超过 8mm + 就不动 —— 那一档是夹爪/杆身,不是针。量不到规尖也不动,悬停对准的结果留着。 + 单次精拍:观测高度深度会把夹爪当尖(2026-10-13 两拍差 8~36mm),改走 + ``_trim_xy_keep_hover_tip``。 + """ + if getattr(self, "hole_keypoint_once", False): + # 打桩测试把 stub 当 self 传入未绑定方法,必须点到类上的实现。 + z_target = None + if bool(getattr(self, "final_descent_enable", False)): + tip = float(getattr(self, "tool_tip_below_flange_m", 0.0) or 0.0) + surf = float(getattr(self, "surface_z_m", 0.0) or 0.0) + if tip > 0.0 and surf > 0.0: + z_target = flange_z_for_gap_m( + tip, surf, getattr(self, "final_gap_m", 0.002) + ) + return Stage2Locate._trim_xy_keep_hover_tip( + self, q, Tee, final, z_target_m=z_target + ) + if not self.tip_vision: + return q, Tee, final + final_in = final + z_hold = float(Tee[2, 3]) + saved = self._tip_off + budget = 0.008 + moved = 0.0 + prev: Optional[np.ndarray] = None + for it in range(4): + if not rclpy.ok(): + break + try: + _bgr, depth_m, intr, res = self._snap_holes(skip_center_gate=True) + except Exception as exc: # noqa: BLE001 + self.get_logger().warn(f"下降后复拍失败,保持悬停对准的位置:{exc}") + self._tip_off = saved + return q, Tee, final + if not res.get("status"): + self.get_logger().warn(f"下降后丢孔({res.get('msg')}),不再改 XY") + self._tip_off = saved + return q, Tee, final + hb = res.get("hole_base") + z_wp = float(res.get("z_wp") or 0.0) + if hb is None or len(hb) != 2 or z_wp <= 0.0: + self.get_logger().warn("下降后没有孔的基座坐标,不再改 XY") + self._tip_off = saved + return q, Tee, final + left_b = np.asarray(hb[0], dtype=float) + right_b = np.asarray(hb[1], dtype=float) + k1_b, k2_b = (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) + tgt = k1_b if self.target_hole == "k1" else k2_b + Tee_now = self._lookup(self.base_frame, self.ee_frame) + if Tee_now is not None: + Tee = Tee_now + off, tlen, why = self._tip_offset_from_depth( + depth_m, intr, Tee, z_wp_cam=z_wp + ) + if off is None or tlen is None: + self.get_logger().warn(f"下降后没量到规尖({why}),不再改 XY") + self._tip_off = saved + return q, Tee, final + if prev is not None and float(np.linalg.norm(off - prev)) > 0.003: + self.get_logger().warn( + f"下降后规尖两拍差 {float(np.linalg.norm(off - prev))*1000:.1f}mm,这一拍不动" + ) + prev = np.array(off, dtype=float) + continue + prev = np.array(off, dtype=float) + if it == 0: + continue + gxy = np.array([ + float(Tee[0, 3]) + float(off[0]), float(Tee[1, 3]) + float(off[1]) + ]) + raw = np.array([float(tgt[0]) - gxy[0], float(tgt[1]) - gxy[1]]) + err = float(np.linalg.norm(raw)) + final = dict(final) + final["residual_mm"] = round(err * 1000.0, 2) + final["tip_offset_m"] = [round(float(off[0]), 5), round(float(off[1]), 5)] + final["tip_len_m"] = round(float(tlen), 5) + final["gauge_xy_m"] = [round(float(gxy[0]), 5), round(float(gxy[1]), 5)] + final["gauge_source"] = "视觉规尖(下降后重测)" + self._tip_off = np.array(off, dtype=float) + self.get_logger().info( + f"[下降后 {it}] 工具=({gxy[0]:.4f},{gxy[1]:.4f}) " + f"残差={err*1000:.2f}mm {why}" + ) + if err <= self.align_tol: + self.get_logger().info( + f"下降后 XY 已在容差内({err*1000:.2f}mm),高度保持 {z_hold:.4f}" + ) + return q, Tee, final + if moved + err > budget: + self.get_logger().error( + f"下降后要对 {err*1000:.1f}mm(已走 {moved*1000:.1f}mm)," + f"超过 {budget*1000:.0f}mm —— 不像针,停在原地" + ) + self._tip_off = saved + return q, Tee, final_in + + step = raw + if err > 0.004: + step = raw * (0.004 / err) + move = np.array([ + float(Tee[0, 3]) + float(step[0]), + float(Tee[1, 3]) + float(step[1]), + z_hold, + ]) + ok, q, Tee = self._goto( + q, Tee, move, verticalize=True, + tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, + tag="trim_xy", v=min(float(self.align_speed), 0.010), + max_hops=4, settle_s=0.30, strict_xy=True, + ) + self._pin(q) + moved += float(np.linalg.norm(step)) + if not ok: + self.get_logger().warn("下降后 XY 修正没走到,停") + return q, Tee, final + if abs(float(Tee[2, 3]) - z_hold) > 0.002: + self.get_logger().error( + f"下降后修正把高度从 {z_hold:.4f} 带到了 {float(Tee[2, 3]):.4f},停下" + ) + return q, Tee, final + return q, Tee, final def _snap_holes(self, *, skip_center_gate: bool) -> Tuple[np.ndarray, np.ndarray, Dict[str, float], dict]: """多帧拍孔:先对 N 帧做时间中值得到干净图,再在其上检测螺纹嵌件对。 @@ -1253,12 +2653,14 @@ class Stage2Locate(Node): med_depth = ( np.median(np.stack(depths), axis=0).astype(np.float32) if len(depths) > 1 else depths[0] ) + # 对孔只认像素关键点。把深度图传进去,嵌件对会用深度换像素半径,等于又用上了深度。 + det_depth = None if self.hole_visual_only else med_depth res = self._detect_holes_img(med_bgr, skip_center_gate=skip_center_gate, - depth_m=med_depth, intr=last_intr) + depth_m=det_depth, intr=last_intr) if not res.get("status"): for bgr in frames: r2 = self._detect_holes_img(bgr, skip_center_gate=skip_center_gate, - depth_m=med_depth, intr=last_intr) + depth_m=det_depth, intr=last_intr) if r2.get("status"): res = r2 med_bgr = bgr @@ -1285,7 +2687,12 @@ class Stage2Locate(Node): res["snap_frames"] = int(len(frames)) # 把"三维是哪来的"也打出来:这一项错了(真值被当成深度、或反过来) # 会让孔距从 58mm 变成 169mm,而现象看起来只是"检测不认"。 - _src = "真值" if res.get("hole_base") and self._truth_enabled() else "深度反投影" + if self._truth_enabled() and res.get("hole_base"): + _src = "真值" + elif self.hole_visual_only: + _src = "像素交工件面" + else: + _src = "深度反投影" self.get_logger().info( f"精拍 {len(frames)}帧中值图 " f"L=({pts[0][0]:.1f},{pts[0][1]:.1f}) R=({pts[1][0]:.1f},{pts[1][1]:.1f})" @@ -1339,7 +2746,22 @@ class Stage2Locate(Node): self.get_logger().error("JTC action 不在 —— 控制器没起来(T1 run_real.sh --arm 89)") return 2 - if not (self.min_ee_z - 1e-6) <= self.hover_z <= (self.safe_z + 0.05): + if self._hover_refused: + self.get_logger().error(self._hover_refused) + return 2 + if self._final_gap_refused: + self.get_logger().error(self._final_gap_refused) + return 2 + + if self.hover_z_user_set: + z_lo = float(self.ws_min[2]) + z_hi = float(self.ws_max[2]) + if not (z_lo - 1e-6) <= self.hover_z <= (z_hi + 1e-6): + self.get_logger().error( + f"--hover-z {self.hover_z:.3f} 超出工作盒 Z [{z_lo:.3f}, {z_hi:.3f}],拒绝执行" + ) + return 2 + elif not (self.min_ee_z - 1e-6) <= self.hover_z <= (self.safe_z + 0.05): self.get_logger().error( f"hole_hover_z_m={self.hover_z:.3f} 越界 [{self.min_ee_z:.2f}, {self.safe_z + 0.05:.2f}],拒绝执行" ) @@ -1384,7 +2806,11 @@ class Stage2Locate(Node): max_hops=12, hold_xy=True, settle_s=0.30, ) self._pin(q) - z_now = float(Tee[:3, 3][2]) + self._spin(0.2) + Tee_now = self._lookup(self.base_frame, self.ee_frame) + if Tee_now is not None: + Tee = Tee_now + z_now = float(Tee[2, 3]) _, ang2 = self._w_down(Tee[:3, :3]) z_err = abs(z_now - self.hover_z) self.get_logger().info( @@ -1401,12 +2827,21 @@ class Stage2Locate(Node): f"悬停闭环未完全收敛,但 Z 差 {z_err*1000:.1f}mm 可接受,继续拍照定位" ) else: - z_now = float(p0[2]) self._state("hover") + self._pin(q) + self._spin(0.2) + Tee_now = self._lookup(self.base_frame, self.ee_frame) + if Tee_now is not None: + Tee = Tee_now + z_now = float(Tee[2, 3]) + if abs(z_now - self.hover_z) > 0.004: + self.get_logger().error( + f"悬停未达容差(Z={z_now:.3f},目标 {self.hover_z:.3f}),终止" + ) + return 2, q, Tee, {} self.get_logger().info( f"已在悬停高 Z={z_now:.3f}m(目标 {self.hover_z:.3f}),跳过升降" ) - self._pin(q) if self.hover_only: self._state("hover_only_hold") @@ -1439,6 +2874,8 @@ class Stage2Locate(Node): bbox = None truth: Optional[dict] = None bgr = depth_m = intr = None + # 本拍是否"跳过粗居中"(精定位已看到 k1/k2)—— 见下面 holes 分支 + skip_coarse = False time.sleep(self.settle_sec if move_i == 0 else min(0.20, self.settle_sec)) for attempt in range(8): if attempt: @@ -1451,13 +2888,21 @@ class Stage2Locate(Node): break holes = self._detect_holes_img(bgr, skip_center_gate=True) if holes.get("status"): - self.get_logger().info("粗定位 YOLO 空框,但已看到 k1/k2,跳过居中直进精对准") - bbox = holes.get("bbox") - truth = holes + # 精定位已经能看到 k1/k2(它是**直接量孔**,比粗居中可靠), + # 所以不居中、不移动,直接交给精定位。 + # 旧写法在这里把孔检测器的整幅 bbox 拿来当工件目标,然后**照样算 + # 偏差横移**:真机那帧 bbox=[0,0,847,479](整幅画面)⇒ 偏差 + # 55.9mm ⇒ 又挪一次。一句话:"跳过居中"就必须真的不动。 + self.get_logger().info( + "粗定位 YOLO 无可信框(空框/被边缘切),但已看到 k1/k2 " + "—— 跳过粗居中、原地直进精对准" + ) self._publish_overlay(holes.get("draw_img", bgr)) - move_i = self.coarse_max_moves + skip_coarse = True break self.get_logger().warn(f"粗定位第 {attempt + 1}/8 帧未见工件,复拍") + if skip_coarse: + break if bbox is None: if bgr is not None: self._publish_overlay(bgr) @@ -1478,6 +2923,37 @@ class Stage2Locate(Node): if truth is not None and truth.get("part_center_base"): p_base = np.asarray(truth["part_center_base"][0], dtype=float) src = "真值" + # 对孔走平面交点时,框心必须同一条射线∩面。深度框心沿 30° 视线 + # 偏 1~2mm,符号随站位翻(D435 送到夹具位 vs 纯 D405 停在别处), + # 精拍再把这截当 K1.x−规尖.x 走掉,前馈又沿同轴加一次。 + if p_base is None and self.hole_visual_only: + if float(self.surface_z_m) <= 0.0: + self.get_logger().error( + "粗居中要对孔同一平面,但 workpiece_surface_z_m 没有配," + "拒绝用深度图凑框心" + ) + break + T_cam = self._lookup(self.base_frame, self.cam_frame) + if T_cam is None: + self.get_logger().error("粗居中缺 cam TF,拒绝用深度图凑框心") + break + hit = pixel_on_base_plane( + float(bx), + float(by), + float(intr["fx"]), + float(intr["fy"]), + float(intr["cx"]), + float(intr["cy"]), + T_cam, + float(self.surface_z_m), + ) + if hit is None: + self.get_logger().error( + "粗居中框心射线没交到工件面,拒绝用深度图凑" + ) + break + p_base = hit + src = "像素交工件面" if p_base is None: z_wp = self._surface_depth(depth_m, bbox) p_base = self._cam_to_base(self._px_to_cam(bx, by, z_wp, intr)) @@ -1486,6 +2962,17 @@ class Stage2Locate(Node): Tee = T_now gxy = self._gauge_xy(Tee) err_xy = float(np.hypot(p_base[0] - gxy[0], p_base[1] - gxy[1])) + # 目标点先过**误检守卫**:宁可原地不动交给精定位,也不许按一个坏点横移。 + # 一阶段刚锁定时臂已经在工件上方,粗居中的合理位移是厘米级;出现 + # 十几厘米以上的"偏差"或盒外目标,只可能是反投影/检测坏了。 + why = self._coarse_target_reject(p_base, gxy) + if why: + self.get_logger().warn( + f"粗定位目标判误检({why})—— **不移动**,原地直进精定位:" + f"base=({p_base[0]:.3f},{p_base[1]:.3f})[{src}] " + f"夹爪=({gxy[0]:.3f},{gxy[1]:.3f}) 偏差={err_xy*1000:.1f}mm" + ) + break coarse_tol = float(self._hole_cfg.get("coarse_tol_m", 0.006)) self.get_logger().info( f"工件 bbox={bbox} 中心=({bx:.0f},{by:.0f}) " @@ -1526,6 +3013,10 @@ class Stage2Locate(Node): final: Dict[str, Any] = {} xy_gain = 1.0 last_good: Optional[Tuple[np.ndarray, np.ndarray, float, Dict[str, Any]]] = None + # 两孔中点的历史(本拍 = [-1],上一拍 = [-2],上上拍 = [-3]): + # 对准时工具在动、孔位也会被"追"着动,唯一**不该动**的是两孔中点 —— + # 它一动就说明工件在动,而工件只会被工具推走(见 gauge_fsm.drag_verdict)。 + mids: List[Tuple[float, float]] = [] for it in range(self.align_max_iters + 1): self._state(f"snap_fine_{it}") bgr, depth_m, intr, res = self._snap_holes(skip_center_gate=True) @@ -1564,7 +3055,9 @@ class Stage2Locate(Node): if proj is None: proj = self._project_holes(depth_m, pts, radii, bbox_l, intr) if proj is None: - self.get_logger().error("孔深度/手眼投影失败") + self.get_logger().error( + "孔心像素没交到工件面" if self.hole_visual_only else "孔深度/手眼投影失败" + ) if it >= self.align_max_iters: return 4, q, Tee, {} continue @@ -1584,7 +3077,51 @@ class Stage2Locate(Node): Tee_now = self._lookup(self.base_frame, self.ee_frame) if Tee_now is not None: Tee = Tee_now - gxy = self._gauge_xy(Tee) + # ---- 工具位置取"视觉规尖",不是"法兰轴线"-------------------- + # 见 _tip_offset_from_depth / _refresh_tip_offset:规可偏出法兰轴线 ~10mm, + # 把法兰对到孔上等于把规偏着对过去。偏移量准一次后冻结(刚体量)。 + tip_src = "法兰+偏置" + if self.tip_vision and self._tip_off is None: + off, tlen, why = self._tip_offset_from_depth( + depth_m, intr, Tee, z_wp_cam=float(z_wp) + ) + if off is not None and tlen is not None: + self._tip_samp.append((off, tlen)) + self._refresh_tip_offset() + if self.hole_keypoint_once and self._tip_off is None: + self._tip_off = np.asarray(off, dtype=float).reshape(2) + self._tip_len_m = float(tlen) + self.get_logger().warn( + f"单次精拍凑不满 tip_calib_n={self.tip_calib_n},本帧规尖偏移 " + f"({off[0]*1000:+.1f},{off[1]*1000:+.1f})mm 仅用于这一步,未冻结" + ) + tip_src = ( + f"视觉规尖(校准中 n={len(self._tip_samp)} {why})" + if (self._tip_off is None or ( + self.hole_keypoint_once and len(self._tip_samp) < self.tip_calib_n + )) + else "视觉规尖(已冻结)" + ) + if self.hole_keypoint_once and self._tip_off is not None: + tip_src = ( + "视觉规尖(已冻结)" + if len(self._tip_samp) >= self.tip_calib_n + else "视觉规尖(单次精拍·本帧)" + ) + else: + self.get_logger().warn(f" 规尖视觉量取失败:{why}") + elif self._tip_off is not None: + tip_src = "视觉规尖(已冻结)" + if self._tip_off is not None: + gxy = np.array( + [Tee[0, 3] + self._tip_off[0], Tee[1, 3] + self._tip_off[1]] + ) + else: + gxy = self._gauge_xy(Tee) + if self.tip_vision and self._tip_off is None and len(self._tip_samp) == 0: + self.get_logger().warn( + " 规尖还没量到,本拍先用法兰+偏置兜着 —— 此时可能对的是法兰不是规" + ) err = float(np.hypot(tgt_b[0] - gxy[0], tgt_b[1] - gxy[1])) final = { @@ -1598,17 +3135,84 @@ class Stage2Locate(Node): "workpiece_surface_z_m": round(z_wp, 4), "hole_z_m": [round(z_left, 4), round(z_right, 4)], "gauge_xy_m": [round(float(gxy[0]), 5), round(float(gxy[1]), 5)], + "gauge_source": tip_src, + "tip_offset_m": ( + [round(float(self._tip_off[0]), 5), round(float(self._tip_off[1]), 5)] + if self._tip_off is not None + else None + ), + "tip_len_m": (round(self._tip_len_m, 5) if self._tip_len_m else None), "residual_mm": round(err * 1000.0, 2), "hover_z_m": round(float(Tee[2, 3]), 4), "iter": it, "snap_frames": int(res.get("snap_frames") or 1), + "residual_remeasured": False, } + final = self._stamp_bias(final, tgt_b=tgt_b, gxy=gxy, tag=f"fine {it}") + snap0 = { + "tag": final.get("tag"), + "residual_mm": final.get("residual_mm"), + "err_xy_m": final.get("err_xy_m"), + "along_look_mm": final.get("along_look_mm"), + "along_right_mm": final.get("along_right_mm"), + "k1_base_m": final.get("k1_base_m"), + "k2_base_m": final.get("k2_base_m"), + "k1_px": final.get("k1_px"), + "k2_px": final.get("k2_px"), + "gauge_xy_m": final.get("gauge_xy_m"), + "gauge_source": final.get("gauge_source"), + "tip_offset_m": final.get("tip_offset_m"), + "hover_z_m": final.get("hover_z_m"), + "workspace_clipped": final.get("workspace_clipped"), + } + snaps = list(final.get("snaps") or []) + snaps.append(snap0) + final["snaps"] = snaps self.get_logger().info( f"[fine {it}] k1=({k1_b[0]:.4f},{k1_b[1]:.4f}) k2=({k2_b[0]:.4f},{k2_b[1]:.4f}) " f"zL={z_left*1000:.0f} zR={z_right*1000:.0f}mm " - f"gauge=({gxy[0]:.4f},{gxy[1]:.4f}) 残差={err*1000:.2f}mm (tol {self.align_tol*1000:.1f})" + f"工具=({gxy[0]:.4f},{gxy[1]:.4f})[{tip_src}] " + f"残差={err*1000:.2f}mm (tol {self.align_tol*1000:.1f})" ) + # ---- 工件被推走的看门狗 ----------------------------------------- + # 为什么放在"打印之后、动手之前":这一拍的数据已经完整,判出来就 + # 立刻停,不再多推一下(每多推一下工件就多走十几毫米,而它已经 + # 离开孔位了,后面的每一拍都在追一个被自己推着走的目标)。 + mid_now = ( + float(k1_b[0] + k2_b[0]) / 2.0, + float(k1_b[1] + k2_b[1]) / 2.0, + ) + dragged, d_mid = drag_verdict( + mid_now, + mids[-1] if len(mids) >= 1 else None, + mids[-2] if len(mids) >= 2 else None, + ) + mids.append(mid_now) + if dragged: + tool_mm = 0.0 + if last_good is not None: + _g0 = last_good[3].get("gauge_xy_m") or [] + if len(_g0) == 2: + tool_mm = math.hypot(gxy[0] - float(_g0[0]), gxy[1] - float(_g0[1])) * 1000.0 + self.get_logger().error( + f"工件被工具推走了:两孔中点两拍之间挪了 {d_mid*1000:.1f}mm" + f"(同期工具只走了 {tool_mm:.1f}mm)—— 对准闭环追的孔位长在工件上," + f"工件一走,孔位就跟着工具走、残差恒定不收敛。\n" + f" 这**不是**手眼标定/检测的问题(那两样坏了不会让工件移动)。" + f"按下面顺序查:\n" + f" ① 悬停时工具尖端是不是已经进了工件:法兰 z={Tee[2, 3]:.4f} − " + f"工具长(site.yaml 的 gauge_assembly.tool_tip_below_flange_m)" + f" 要高于工件上表面 z={z_wp:.4f};\n" + f" ② 工具长是**实测**的吗(真机夹上规后读 TF;仿真里 " + f"scripts/sim_load_gauge.py 会打印实测值);装夹位置一变它就变;\n" + f" ③ 装夹后规有没有下滑(仿真里合爪后规会落到落座位置," + f"下滑量直接加在工具长上)。" + ) + self._publish_overlay(draw) + self._publish_result(final) + return 6, q, Tee, final + # 在叠图上标目标孔 + 写基座坐标 try: import cv2 @@ -1629,7 +3233,61 @@ class Stage2Locate(Node): self._publish_overlay(draw) self._publish_result(final) + if self.hole_keypoint_once: + commanded_mm = round(err * 1000.0, 2) + if self._tip_off is None and self.tip_vision: + self.get_logger().error( + "单次精拍没量到规尖,这一步对的是法兰。align_trusted=false," + "仍走一次并下降,方便目视;不把法兰对上说成成功" + ) + final["ok"] = False + final["align_trusted"] = False + final["fail_reason"] = "未量到规尖偏移,工具位置退化为法兰轴线" + q, Tee, _moved = self._oneshot_align_move(q, Tee, tgt_b, gxy, err) + final["commanded_residual_mm"] = commanded_mm + if self.hole_once_lock_xy_descend: + final["residual_remeasured"] = False + final["lock_xy_descend"] = True + if self._tip_off is not None: + final["ok"] = True + self.get_logger().warn( + f"视线前馈斜线:悬停指令 {commanded_mm:.2f}mm 已走," + "不补拍。下一步按 k×下降收 XY,一条 MoveL 到贴面。" + "residual_mm 仍是走之前那一拍,不是贴面复测" + ) + else: + q, Tee, final = self._observe_holes( + q, Tee, final, tag="走后核验" + ) + if not final.get("residual_remeasured"): + self.get_logger().error( + f"走后核验没复测到。开环指令残差 {commanded_mm:.2f}mm," + "不是 hop 到位,不把这次当对准成功" + ) + final["ok"] = False + self.get_logger().info( + f"单次精拍悬停走完:指令 {commanded_mm:.2f}mm → " + f"复测 {final.get('residual_mm')}mm;下降后还要补交平面漂的那几毫米" + ) + self._state("aligned") + break + if err <= self.align_tol: + if self.tip_vision and self._tip_off is None: + # 容差达标了,但这一拍的"工具位置"其实是**法兰**(退路了)—— + # 对的是法兰不是规,δ 就是那个 ~10mm 的装夹偏置。2026-10-08 真机 + # 就出现过:tip_offset_m=None、残差 0.15mm 看着漂亮,其实法兰 + # 压在 k1 上、规尖偏出 ~11mm。**不许把没做到说成做到**。 + self.get_logger().error( + f"残差 {err*1000:.2f}mm 达标,但规尖偏移一直没量到(用的是法兰轴线)" + " —— 这个结果不可信:对的可能是法兰、不是规。" + "判失败,摆到能看清规尖再跑(别按这个结果下降)" + ) + final["ok"] = False + final["align_trusted"] = False + final["fail_reason"] = "未量到规尖偏移,工具位置退化为法兰轴线" + self._publish_result(final) + return 8, q, Tee, final self._state("aligned") break if last_good is not None: @@ -1700,20 +3358,84 @@ class Stage2Locate(Node): self.get_logger().warn("对准移动未完全到位,复拍核验") # ---- 4.5) 柔顺轻降到孔面上方 1-2mm(不接触)---- - # 用户要求:对准后轻轻悬在孔上方 1-2mm,不下臂接触。深度反馈闭环,很慢很柔。 - okd, q, Tee = self._descend_above_hole(q, Tee) + # 下降量由**几何**决定(法兰 FK − 工具长 − 工件面 − final_gap),深度读数只 + # 做交叉核对,见 _descend_above_hole 的说明。 + if self.hole_keypoint_once and self.hole_once_lock_xy_descend: + # 视线前馈斜线:不经过观察高、不补交。一条 MoveL 收到贴面。 + lock_gap = ( + self.final_gap_m if self.final_descent_enable else self.observe_gap_m + ) + okd, q, Tee = self._once_ff_diagonal_to_gap( + q, Tee, target_gap_m=lock_gap + ) + elif self.hole_keypoint_once: + # 先降到观察高(约 15mm)再交孔;贴面由补孔斜线一步完成,不再 4mm 切到 2mm。 + okd, q, Tee = self._descend_above_hole( + q, Tee, + target_gap_m=self.observe_gap_m, + step_m=ONCE_APPROACH_STEP_M, + ) + else: + okd, q, Tee = self._descend_above_hole(q, Tee) if not okd: self.get_logger().warn("轻降未完全到位,保持当前高度(安全优先)") + if self.hole_keypoint_once and self.hole_once_lock_xy_descend: + tip_len = float(self.tool_tip_below_flange_m) + surf = float(self.surface_z_m) + if tip_len > 0.0 and surf > 0.0: + self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf + elif self.hole_keypoint_once: + # 悬停那一拍的基座 XY 不能带到观测高:前倾 30°,降 50mm 交点会漂约 4mm。 + # 核验记账后补 XY;规尖沿用悬停冻结值,不在观测高度重测。 + q, Tee, final = self._observe_holes(q, Tee, final, tag="降后核验") + q, Tee, final = self._trim_xy_after_descent(q, Tee, final) + tip_len = float(self.tool_tip_below_flange_m) + surf = float(self.surface_z_m) + if tip_len > 0.0 and surf > 0.0: + self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf + elif okd: + # 悬停残差在下降 60mm 之后会变大约 2mm(相机 30°,同一孔两个高度 + # 反投影对不齐)。在观测高度重测规尖,只补 XY。 + q, Tee, final = self._trim_xy_after_descent(q, Tee, final) + # 如实汇报**实际**间隙(几何量)——不是把目标值念一遍。停在离面 50mm 时 + # 也显示 ~50mm,现场才看得出"轻降没做到"(R1.1:不许把没做到说成做到)。 + gap_txt = ( + f"{self.descent_final_gap_m * 1000:.1f}" + if self.descent_final_gap_m is not None + else f">{self.final_gap_m * 1000:.1f}(未能测得/未下降)" + ) # ---- 5) 锁定保持 ---- + # 贴面之后就停在这个法兰 Z。没有接触传感器,到位只认 final_gap_mm + # (规尖离面)。三阶段开局会抬回悬高,这里标明已经插到位,流水线不再上抬。 + if ( + self.descent_final_gap_m is not None + and self.final_descent_enable + and not self.hover_only + ): + final = dict(final) + final["insert_held"] = True + final["flange_z_m"] = round(float(Tee[2, 3]), 4) + final["tip_gap_mm"] = round(float(self.descent_final_gap_m) * 1000.0, 2) + final["commanded_gap_mm"] = round(float(self.final_gap_m) * 1000.0, 2) + final["insert_z_source"] = "final_gap_mm" self._state("hold") q_fin = self._q() self._pin(q_fin if q_fin is not None else q) - self.get_logger().info( - f"=== 二阶段定位完成: {self.target_hole} 残差 {final.get('residual_mm', -1)}mm," - f"悬在孔面上方 ~{self.final_gap_m * 1000:.1f}mm(不接触)。" - f"结果: /stage2/result, /tmp/stage2_result.json ===" - ) + if final.get("insert_held"): + self.get_logger().info( + f"=== 二阶段定位完成: {self.target_hole} 残差 {final.get('residual_mm', -1)}mm," + f"法兰 Z={final.get('flange_z_m')}m,规尖离面 {gap_txt}mm" + f"(final_gap {self.final_gap_m * 1000:.1f}mm,无接触传感器)。" + "停在这一高度,不抬回悬高。" + f"结果: /stage2/result, /tmp/stage2_result.json ===" + ) + else: + self.get_logger().info( + f"=== 二阶段定位完成: {self.target_hole} 残差 {final.get('residual_mm', -1)}mm," + f"规尖悬在孔面上方 ≈{gap_txt}mm(不接触)。" + f"结果: /stage2/result, /tmp/stage2_result.json ===" + ) return 0, q_fin if q_fin is not None else q, Tee, final def _linger_hold(self, final: Dict[str, Any], seconds: Optional[float] = None) -> None: diff --git a/build/arm_application/build/lib/arm_application/stage3_search_node.py b/build/arm_application/build/lib/arm_application/stage3_search_node.py index 1b7c119..acf1a50 100644 --- a/build/arm_application/build/lib/arm_application/stage3_search_node.py +++ b/build/arm_application/build/lib/arm_application/stage3_search_node.py @@ -104,6 +104,18 @@ def tactile_timeout_reason(pairs: Sequence[Any], timeout_s: float) -> str: ) return f"触觉话题断流 >{timeout_s:.1f}s(左右指都无新鲜数据)" + +def should_lift_air_baseline( + z_now_m: float, z_air_m: float, *, tactile_live: bool +) -> bool: + """空载抬升只在触觉已经在发、并且当前低于空载高度时做。 + + 触觉没数据时先抬到 hover+50mm 再报断流,等于插孔做到一半把臂送回锁高。 + """ + if not tactile_live: + return False + return float(z_now_m) < float(z_air_m) - 0.008 + def spiral_points( cx: float, cy: float, pitch_mm: float, step_mm: float, r_max_mm: float ) -> List[Tuple[float, float]]: @@ -514,7 +526,8 @@ class Stage3Search(Stage2Locate): tgt[2] += dz_m self._goto(q, Tee, tgt, verticalize=True, tol_m=0.001, tol_tilt=self.vert_tol_rad * 3.0, tag="retract", - v=0.03, max_hops=3, settle_s=0.2, min_dur=0.6) + v=0.03, max_hops=2, settle_s=0.2, min_dur=0.6, + hold_xy=True, z_up_only=True) except Exception: pass @@ -581,9 +594,21 @@ class Stage3Search(Stage2Locate): result: Dict[str, Any] = {"ok": False, "stage": "stage3", "target_hole": self.target_hole} try: # 基线必须悬空测。二阶段结束在 hover≈触面+1mm,带载会把阈值抬飞。 + # 触觉没在发就原地中止,不许先抬到锁高再报断流。 z_now = float(Tee[2, 3]) z_air = float(self.hover_z) + 0.05 - if z_now < z_air - 0.008: + self._spin(0.05) + tac_live = bool( + live_tactile(time.monotonic(), (self._tac_l, self._tac_r)) + ) + if not tac_live: + raise SearchAbort( + tactile_timeout_reason( + (self._tac_l, self._tac_r), float(self.tac_timeout) + ), + code=7, + ) + if should_lift_air_baseline(z_now, z_air, tactile_live=True): self._state("air_baseline") self.get_logger().info( f"抬到 {z_air:.3f}m 测触觉空载基线(当前 Z={z_now:.3f})" diff --git a/build/arm_application/build/lib/arm_application/tactile_node.py b/build/arm_application/build/lib/arm_application/tactile_node.py index f6e652d..85a144f 100644 --- a/build/arm_application/build/lib/arm_application/tactile_node.py +++ b/build/arm_application/build/lib/arm_application/tactile_node.py @@ -22,8 +22,10 @@ from arm_application.site_io import load_site_dict, site_path from arm_msgs.msg import TactileStatus from sensor_msgs.msg import Image +from arm_application.ros_node import TolerantNode -class TactileNode(Node): + +class TactileNode(TolerantNode): def __init__(self) -> None: super().__init__("tactile") self.declare_parameter("publish_hz", 20.0) diff --git a/build/arm_application/build/lib/arm_application/weights_layout.py b/build/arm_application/build/lib/arm_application/weights_layout.py index ceb99d6..75c3a5a 100644 --- a/build/arm_application/build/lib/arm_application/weights_layout.py +++ b/build/arm_application/build/lib/arm_application/weights_layout.py @@ -176,6 +176,51 @@ def staging_dir(root: Union[str, Path]) -> Path: return Path(root) / STAGING_DIRNAME +def infer_group( + root: Union[str, Path], + source: Union[str, Path], + fallback: str = "yolo", +) -> str: + """转换产物该落到**哪个分组**:默认沿用源文件所在的分组。 + + 为什么不能一律落到 ``yolo``(2026-09-28 真机踩到,代价是一次白转) + ---------------------------------------------------------------- + 现场把 ``models/hole_insert/detect_best_1.onnx`` 转 engine,工具默认 + ``--group yolo``,于是产物落到 ``models/yolo/detect_best_1.engine`` —— + 而运行时找 engine 的规则是**同级同名**(``yolo_detector.resolve_weights``: + ``p.with_suffix(".engine")``,即 site.yaml 指的 ``.onnx`` 旁边)。两边 + 一分家,engine 就等于不存在:现象是"启动即报缺 engine",而文件明明躺着。 + 这正是本项目最忌讳的**静默失效** —— 工具没报错,位置也"合理"。 + + 规则: + - 源文件已在权重根目录下的某个分组里(例如 ``models/hole_insert/x.onnx``) + → 沿用 ``hole_insert``。这样"就地转换"永远落在原地,运行时必然找得到; + - 源文件在 ``staging/``、权重根目录之外或根目录正下方 → ``fallback`` + (默认 ``yolo``):那才是"新来的模型,还没决定分组"的正常情形。 + + Args: + root: 权重根目录(``models/``)。 + source: 输入文件。 + fallback: 无法沿用时的分组名。 + + Returns: + 分组名(不带路径)。 + """ + r = Path(root) + try: + rel = Path(source).expanduser().resolve().relative_to(r.resolve()) + except ValueError: + # 不在权重根目录下(/tmp、外部磁盘、staging 之类)→ 没有"原地"可言 + return fallback + if len(rel.parts) < 2: + # 直接躺在 models/ 正下方:没有分组信息,用默认分组 + return fallback + group = rel.parts[0] + if is_staging(r / group) or group.startswith("."): + return fallback + return group + + def staging_files(root: Union[str, Path]) -> List[Path]: """staging 里的待处理文件。 diff --git a/build/arm_application/build/lib/arm_application/yolo_detector.py b/build/arm_application/build/lib/arm_application/yolo_detector.py index 38edb80..9276ca0 100644 --- a/build/arm_application/build/lib/arm_application/yolo_detector.py +++ b/build/arm_application/build/lib/arm_application/yolo_detector.py @@ -43,6 +43,9 @@ class Detection: conf: float cls_id: int cls_name: str + # pose 模型才有:(K, 3) = 每个关键点的 x, y, conf(**原图像素坐标**)。 + # 检测模型恒为 None —— 下游必须先判 None,别假设它有。 + kpts: Optional[np.ndarray] = None @property def cx(self) -> float: @@ -301,12 +304,51 @@ class YoloDetector: return seq, dets, (time.monotonic() - t0) * 1000.0 +def build_detector( + weights: Union[str, Path], + *, + backend: str = "auto", + conf: float = 0.25, + iou: float = 0.45, + device: str = "", + imgsz: int = 640, +): + """按权重类型挑检测器:pose 模型走 ``PoseDetector``,否则走 ``YoloDetector``。 + + 为什么要这个工厂:ultralytics 解不了 pose 的 TensorRT engine(见 + ``pose_detector`` 模块头),所以 pose 必须换成自解码实现。判断依据是模型 + 是不是 ``task=pose`` —— 直接读旁边 ``.onnx`` 的 metadata,不靠调用方声明。 + + 返回对象统一有 ``detect()/infer()/warmup()/imgsz/class_names/class_ids``。 + """ + path = Path(weights).expanduser() + from .pose_detector import PoseDetector, is_pose_model + + if is_pose_model(path): + logger.info("检测到 pose 模型 %s → 用 PoseDetector(自解码关键点)", path.name) + return PoseDetector( + path, + conf=conf, + iou=iou, + device=device or "0", + imgsz=imgsz, + ) + return YoloDetector( + path, + conf=conf, + iou=iou, + device=device, + imgsz=imgsz, + ) + + def _yolo_worker_main(q_in, q_out, cfg: dict) -> None: - """spawn 出来的子进程:只跑 GPU 上的 YOLO。这里绝不能 import rclpy。""" + """spawn 出来的子进程:只跑 GPU 上的检测。这里绝不能 import rclpy。""" try: path = resolve_weights(cfg["weights"], cfg.get("backend") or "auto") - det = YoloDetector( + det = build_detector( path, + backend=cfg.get("backend") or "auto", conf=float(cfg.get("conf") or 0.25), iou=float(cfg.get("iou") or 0.45), device=str(cfg.get("device") or "0"), @@ -336,7 +378,13 @@ def _yolo_worker_main(q_in, q_out, cfg: dict) -> None: dets = det.infer(image, half=bool(cfg.get("half", True))) gpu_ms = (time.monotonic() - t0) * 1000.0 packed = [ - (d.xyxy.astype(np.float32), float(d.conf), int(d.cls_id), str(d.cls_name)) + ( + d.xyxy.astype(np.float32), + float(d.conf), + int(d.cls_id), + str(d.cls_name), + None if d.kpts is None else np.asarray(d.kpts, dtype=np.float32), + ) for d in dets ] _put_drop_old(q_out, ("ok", seq, packed, gpu_ms)) @@ -399,15 +447,20 @@ class YoloInferProcess: def alive(self) -> bool: return bool(self._p is not None and self._p.is_alive()) - def submit(self, image_bgr: np.ndarray, seq: int = 0) -> None: + def submit(self, image_bgr: np.ndarray, seq: int = 0) -> bool: """把最新一帧排进队列。如果 worker 正忙就跳过 —— 它在每次推理后都会 - 排空到队列里最新的帧,所以不会跑任何过期数据。""" + 排空到队列里最新的帧,所以不会跑任何过期数据。 + + 返回是否真的进队。进不去必须告诉调用方,否则一次性会以为「已经在跑」 + 而空等,把 D405 也卡住。 + """ if not self.alive: raise RuntimeError("YOLO 工作进程已死亡") try: self._q_in.put((int(seq), image_bgr), timeout=0.010) + return True except Exception: - pass + return False def wait_result(self, timeout: float = 0.045): """返回 ``(seq, list[Detection], gpu_ms)`` 或 ``None``。""" @@ -444,15 +497,20 @@ class YoloInferProcess: return None seq, packed = int(msg[1]), msg[2] gpu_ms = float(msg[3]) if len(msg) > 3 else 0.0 - dets = [ - Detection( - xyxy=np.asarray(xyxy, dtype=float), - conf=float(conf), - cls_id=int(cid), - cls_name=str(name), + dets = [] + for row in packed: + # 兼容旧格式(4 元组,无关键点),免得子进程和父进程版本不一致时炸掉。 + xyxy, conf, cid, name = row[0], row[1], row[2], row[3] + kpts = row[4] if len(row) > 4 else None + dets.append( + Detection( + xyxy=np.asarray(xyxy, dtype=float), + conf=float(conf), + cls_id=int(cid), + cls_name=str(name), + kpts=None if kpts is None else np.asarray(kpts, dtype=float), + ) ) - for xyxy, conf, cid, name in packed - ] return seq, dets, gpu_ms def infer(self, image_bgr: np.ndarray, *, half: bool = False, seq: int = 0): diff --git a/build/arm_application/colcon_command_prefix_setup_py.sh.env b/build/arm_application/colcon_command_prefix_setup_py.sh.env index 5aa0843..217da1e 100644 --- a/build/arm_application/colcon_command_prefix_setup_py.sh.env +++ b/build/arm_application/colcon_command_prefix_setup_py.sh.env @@ -25,7 +25,7 @@ FORCE_COLOR=0 GDK_BACKEND=x11 GDMSESSION=ubuntu GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/cursor.desktop -GIO_LAUNCHED_DESKTOP_FILE_PID=127254 +GIO_LAUNCHED_DESKTOP_FILE_PID=6037 GJS_DEBUG_OUTPUT=stderr GJS_DEBUG_TOPICS=JS ERROR;JS LOG GNOME_DESKTOP_SESSION_ID=this-is-deprecated @@ -36,21 +36,21 @@ GSETTINGS_SCHEMA_DIR_CONDA_BACKUP= GTK_IM_MODULE=ibus GTK_MODULES=gail:atk-bridge HOME=/home/cc -INVOCATION_ID=86f288ce697549d186a52754da3c9b87 -JOURNAL_STREAM=8:47859 +INVOCATION_ID=ab64d5fffd3b4622ba527182659a2dd1 +JOURNAL_STREAM=8:11025 LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh -LD_LIBRARY_PATH=/home/cc/ros2/install/arm_msgs/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/ros2/install/gpio_controller/lib:/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib:/home/cc/ros2/install/flexiv_gripper/lib:/home/cc/ros2/install/flexiv_msgs/lib:/home/cc/ros2/install/flexiv_hardware/lib:/home/cc/anaconda3/envs/ros_flexiv/opt/rviz_ogre_vendor/lib +LD_LIBRARY_PATH=/home/cc/ros2/install/arm_msgs/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt_libs:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages/tensorrt:/home/cc/flexiv_install/lib:/home/cc/ros2/install/gpio_controller/lib:/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib:/home/cc/ros2/install/flexiv_gripper/lib:/home/cc/ros2/install/flexiv_msgs/lib:/home/cc/ros2/install/flexiv_hardware/lib:/home/cc/anaconda3/envs/ros_flexiv/opt/rviz_ogre_vendor/lib LESSCLOSE=/usr/bin/lesspipe %s %s LESSOPEN=| /usr/bin/lesspipe %s LOGNAME=cc LS_COLORS= -MANAGERPID=12153 +MANAGERPID=5173 NO_COLOR=1 OLDPWD=/home/cc/ros2 PATH=/home/cc/.local/bin:/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin:/home/cc/.local/bin:/home/cc/anaconda3/envs/ros_flexiv/bin:/home/cc/anaconda3/condabin:/home/cc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin PWD=/home/cc/ros2/build/arm_application -PYTHONPATH=/home/cc/ros2/install/arm_msgs/lib/python3.11/site-packages:/home/cc/ros2/build/arm_kinematics:/home/cc/ros2/install/arm_kinematics/lib/python3.11/site-packages:/home/cc/ros2/build/flexiv_test_nodes:/home/cc/ros2/install/flexiv_test_nodes/lib/python3.11/site-packages:/home/cc/ros2/install/flexiv_msgs/lib/python3.11/site-packages:/home/cc/ros2/install/arm_sim_gazebo/lib/python3.11/site-packages:/home/cc/ros2/build/arm_driver_flexiv:/home/cc/ros2/install/arm_driver_flexiv/lib/python3.11/site-packages:/home/cc/ros2/install/arm_control/lib/python3.11/site-packages:/home/cc/ros2/build/arm_application:/home/cc/ros2/install/arm_application/lib/python3.11/site-packages:/home/cc/ros2/build/arm_interfaces:/home/cc/ros2/install/arm_interfaces/lib/python3.11/site-packages:/home/cc/anaconda3/envs/ros_flexiv/lib/python311/site-packages:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages +PYTHONPATH=/home/cc/ros2/install/arm_msgs/lib/python3.11/site-packages:/home/cc/ros2/install/arm_kinematics/lib/python3.11/site-packages:/home/cc/ros2/build/flexiv_test_nodes:/home/cc/ros2/install/flexiv_test_nodes/lib/python3.11/site-packages:/home/cc/ros2/install/flexiv_msgs/lib/python3.11/site-packages:/home/cc/ros2/install/arm_sim_gazebo/lib/python3.11/site-packages:/home/cc/ros2/build/arm_driver_flexiv:/home/cc/ros2/install/arm_driver_flexiv/lib/python3.11/site-packages:/home/cc/ros2/install/arm_control/lib/python3.11/site-packages:/home/cc/ros2/build/arm_application:/home/cc/ros2/install/arm_application/lib/python3.11/site-packages:/home/cc/ros2/build/arm_kinematics:/home/cc/ros2/build/arm_interfaces:/home/cc/ros2/install/arm_interfaces/lib/python3.11/site-packages:/home/cc/anaconda3/envs/ros_flexiv/lib/python311/site-packages:/home/cc/anaconda3/envs/ros_flexiv/lib/python3.11/site-packages QT_ACCESSIBILITY=1 QT_IM_MODULE=ibus ROBOT_SN=Rizon4-063989 @@ -62,7 +62,7 @@ ROS_LOCALHOST_ONLY=0 ROS_OS_OVERRIDE=conda:linux ROS_PYTHON_VERSION=3 ROS_VERSION=2 -SESSION_MANAGER=local/cc:@/tmp/.ICE-unix/12501,unix/cc:/tmp/.ICE-unix/12501 +SESSION_MANAGER=local/cc:@/tmp/.ICE-unix/5424,unix/cc:/tmp/.ICE-unix/5424 SHELL=/bin/bash SHLVL=1 SITE_BASE_FRAME=Rizon4-063989_base_link @@ -94,7 +94,7 @@ SITE_D435_WIDTH=1280 SITE_EE_FRAME=Rizon4-063989_flange SITE_EE_X_M=0.25 SITE_EE_Y_M=0.0 -SITE_EE_Z_M=0.36 +SITE_EE_Z_M=0.32 SITE_FASTDDS_PROFILE= SITE_GO_HOME_POSE=home SITE_GO_HOME_SPEED=0.25 @@ -113,11 +113,11 @@ SITE_GRIP_SPEED=50 SITE_GRIP_STROKE_MM=20.0 SITE_GRIP_VEL_MPS=0.05 SITE_GRIP_VENDOR=dh -SITE_HANDEYE_BOARD_COLS=8 -SITE_HANDEYE_BOARD_COLS_EYE_IN_HAND=8 +SITE_HANDEYE_BOARD_COLS=11 +SITE_HANDEYE_BOARD_COLS_EYE_IN_HAND=11 SITE_HANDEYE_BOARD_COLS_EYE_TO_HAND=11 -SITE_HANDEYE_BOARD_ROWS=11 -SITE_HANDEYE_BOARD_ROWS_EYE_IN_HAND=11 +SITE_HANDEYE_BOARD_ROWS=8 +SITE_HANDEYE_BOARD_ROWS_EYE_IN_HAND=8 SITE_HANDEYE_BOARD_ROWS_EYE_TO_HAND=8 SITE_HANDEYE_BOARD_SRC_EYE_IN_HAND=boards SITE_HANDEYE_BOARD_SRC_EYE_TO_HAND=boards @@ -125,6 +125,9 @@ SITE_HANDEYE_CALIBRATE=/home/cc/ros2/handeye/calibrate.yaml SITE_HANDEYE_FILE=/home/cc/ros2/handeye/results/89_eye_in_hand.yaml SITE_HANDEYE_FILE_EYE_IN_HAND=/home/cc/ros2/handeye/results/89_eye_in_hand.yaml SITE_HANDEYE_FILE_EYE_TO_HAND=/home/cc/ros2/handeye/results/89_d435_eye_to_hand.yaml +SITE_HANDEYE_GRIPPER_TCP_QWXYZ=1.000000,0.000000,0.000000,0.000000 +SITE_HANDEYE_GRIPPER_TCP_XYZ=0.000537,-0.000264,0.226587 +SITE_HANDEYE_GRIPPER_TOOL=tool10120938 SITE_HANDEYE_MODE=eye_in_hand SITE_HANDEYE_MOVE_T=8.0 SITE_HANDEYE_PIN_HOLDS=2 @@ -149,7 +152,7 @@ SITE_HOLE_WEIGHTS=/home/cc/ros2/models/yolo/gongjian0929.onnx SITE_HOLE_WORKPIECE_WEIGHTS=/home/cc/ros2/models/yolo/gongjian0929.onnx SITE_JOINT_PREFIX=Rizon4-063989_ SITE_NAMED_POSES_FILE=/home/cc/ros2/src/arm_control/config/named_poses_89.yaml -SITE_NET_IFACE=enx6c1ff7d071b2 +SITE_NET_IFACE=eth0 SITE_OVERHEAD_CAM_AE_LIMIT_US=8000.0 SITE_OVERHEAD_CAM_AUTO_EXPOSURE=1 SITE_OVERHEAD_CAM_EMITTER=1 @@ -168,7 +171,7 @@ SITE_ROBOT_IP=192.168.2.101 SITE_ROBOT_LABEL=左臂89 SITE_ROBOT_SHORT_ID=89 SITE_ROBOT_SN=Rizon4-063989 -SITE_ROBOT_TOOL_NAME=tool1 +SITE_ROBOT_TOOL_NAME=tool10120938 SITE_ROS2_ROOT=/home/cc/ros2 SITE_SERVO_WATCHDOG=1.2 SITE_SERVO_Z_REF=0.22 @@ -177,11 +180,11 @@ SITE_TACTILE_CONFIG=dd03 SITE_TACTILE_CONFIG_FILE=/home/cc/ros2/devices/sensors/orisys/models/dd03/config.json SITE_TACTILE_LEFT=/dev/v4l/by-path/pci-0000:00:14.0-usb-0:3.4.1:1.0-video-index0 SITE_TACTILE_RIGHT=/dev/v4l/by-path/pci-0000:00:14.0-usb-0:3.4.2:1.0-video-index0 -SITE_TRACK_CAMERA=overhead -SITE_TRACK_CAMERA_FRAME=d435_color_optical_frame -SITE_TRACK_CAM_NAME=d435 -SITE_TRACK_HANDEYE_FILE=/home/cc/ros2/handeye/results/89_d435_eye_to_hand.yaml -SITE_TRACK_HANDEYE_MODE=eye_to_hand +SITE_TRACK_CAMERA=wrist +SITE_TRACK_CAMERA_FRAME=d405_left_color_optical_frame +SITE_TRACK_CAM_NAME=d405_left +SITE_TRACK_HANDEYE_FILE=/home/cc/ros2/handeye/results/89_eye_in_hand.yaml +SITE_TRACK_HANDEYE_MODE=eye_in_hand SITE_YOLO_CONF=0.1 SITE_YOLO_DEVICE=0 SITE_YOLO_IMGSZ=640 @@ -190,7 +193,7 @@ SITE_YOLO_WEIGHTS=/home/cc/ros2/models/yolo/gongjian0929.onnx SITE_YOLO_WEIGHTS_RESOLVED=/home/cc/ros2/models/yolo/gongjian0929.onnx SSH_AGENT_LAUNCHER=gnome-keyring SSH_AUTH_SOCK=/run/user/1000/keyring/ssh -SYSTEMD_EXEC_PID=12520 +SYSTEMD_EXEC_PID=5453 TERM=dumb USER=cc USERNAME=cc @@ -201,8 +204,8 @@ VSCODE_ESM_ENTRYPOINT=vs/workbench/api/node/extensionHostProcess VSCODE_HANDLES_UNCAUGHT_ERRORS=true VSCODE_IPC_HOOK=/run/user/1000/vscode-bd0186cc-3.12-main.sock VSCODE_NLS_CONFIG={"userLocale":"zh-cn","osLocale":"zh-cn","resolvedLanguage":"en","defaultMessagesFile":"/usr/share/cursor/resources/app/out/nls.messages.json","locale":"zh-cn","availableLanguages":{}} -VSCODE_PID=127254 -VSCODE_PROCESS_TITLE=extension-host (agent-exec) ros2 [2-10] +VSCODE_PID=6037 +VSCODE_PROCESS_TITLE=extension-host (agent-exec) ros2 [1-9] WINDOWPATH=2 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg @@ -213,7 +216,7 @@ XDG_RUNTIME_DIR=/run/user/1000 XDG_SESSION_CLASS=user XDG_SESSION_DESKTOP=ubuntu XDG_SESSION_TYPE=x11 -XML_CATALOG_FILES=file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog +XML_CATALOG_FILES=file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog file:///home/cc/anaconda3/envs/ros_flexiv/etc/xml/catalog file:///etc/xml/catalog XMODIFIERS=@im=ibus YOLO_AUTOINSTALL=false _=/home/cc/anaconda3/envs/ros_flexiv/bin/colcon diff --git a/build/arm_application/setup.py b/build/arm_application/setup.py index 064bf10..a85f34f 120000 --- a/build/arm_application/setup.py +++ b/build/arm_application/setup.py @@ -1 +1 @@ -../../src/arm_application/setup.py \ No newline at end of file +/home/cc/ros2/src/arm_application/setup.py \ No newline at end of file diff --git a/build/flexiv_hardware/.cmake/api/v1/reply/index-2026-10-12T09-53-12-0314.json b/build/flexiv_hardware/.cmake/api/v1/reply/index-2026-10-19T09-07-09-0335.json similarity index 100% rename from build/flexiv_hardware/.cmake/api/v1/reply/index-2026-10-12T09-53-12-0314.json rename to build/flexiv_hardware/.cmake/api/v1/reply/index-2026-10-19T09-07-09-0335.json diff --git a/build/flexiv_hardware/CMakeFiles/CMakeConfigureLog.yaml b/build/flexiv_hardware/CMakeFiles/CMakeConfigureLog.yaml index 7ecce28..1ecbbfc 100644 --- a/build/flexiv_hardware/CMakeFiles/CMakeConfigureLog.yaml +++ b/build/flexiv_hardware/CMakeFiles/CMakeConfigureLog.yaml @@ -68130,3 +68130,31447 @@ events: CMAKE_SYSTEM_LIBRARY_PATH: - "/usr/lib/X11" ... + +--- +events: + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "libstatistics_collector" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblibstatistics_collector.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dl" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libdl.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rt" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/librt.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_runtime_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_runtime_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/rosidl_typesupport_fastrtps_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/rmwConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/rosidl_typesupport_introspection_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_c-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/rcpputilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcpputils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcpputils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/rosidl_typesupport_introspection_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cpp-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/rcl_yaml_param_parserConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_yaml_param_parser" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_yaml_param_parser.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_shared_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_shared_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/tracetoolsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "tracetools" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtracetools.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/rcl_logging_spdlogConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_logging_spdlog" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_spdlog.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "fake_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libfake_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "mock_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libmock_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "hardware_interface" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libhardware_interface.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" +... + +--- +events: + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "libstatistics_collector" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblibstatistics_collector.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dl" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libdl.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rt" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/librt.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_runtime_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_runtime_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/rosidl_typesupport_fastrtps_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/rmwConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/rosidl_typesupport_introspection_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_c-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/rcpputilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcpputils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcpputils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/rosidl_typesupport_introspection_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cpp-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/rcl_yaml_param_parserConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_yaml_param_parser" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_yaml_param_parser.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_shared_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_shared_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/tracetoolsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "tracetools" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtracetools.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/rcl_logging_spdlogConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_logging_spdlog" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_spdlog.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "fake_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libfake_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "mock_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libmock_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "hardware_interface" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libhardware_interface.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" +... + +--- +events: + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "libstatistics_collector" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblibstatistics_collector.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dl" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libdl.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rt" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/librt.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_runtime_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_runtime_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/rosidl_typesupport_fastrtps_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/rmwConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/rosidl_typesupport_introspection_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_c-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/rcpputilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcpputils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcpputils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/rosidl_typesupport_introspection_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cpp-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/rcl_yaml_param_parserConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_yaml_param_parser" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_yaml_param_parser.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_shared_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_shared_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/tracetoolsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "tracetools" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtracetools.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/rcl_logging_spdlogConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_logging_spdlog" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_spdlog.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "fake_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libfake_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "mock_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libmock_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "hardware_interface" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libhardware_interface.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" +... + +--- +events: + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "libstatistics_collector" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblibstatistics_collector.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcutils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dl" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libdl.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/ament_cmake_export_libraries-extras.cmake:110 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcutils/cmake/rcutilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rt" + candidate_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/" + - "/usr/local/lib/" + - "/usr/local/" + - "/usr/lib64/" + - "/usr/lib/" + - "/usr/" + - "/lib64/" + - "/lib/" + - "/opt/" + - "/usr/lib/X11/" + searched_directories: + - "/home/cc/flexiv_install/lib/" + - "/home/cc/flexiv_install/" + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + - "/home/cc/anaconda3/envs/ros_flexiv/" + - "/home/cc/ros2/install/gpio_controller/lib/" + - "/home/cc/ros2/install/gpio_controller/" + - "/home/cc/ros2/install/flexiv_bringup/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/lib/" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster/" + - "/home/cc/ros2/install/flexiv_gripper/lib/" + - "/home/cc/ros2/install/flexiv_gripper/" + - "/home/cc/ros2/install/flexiv_msgs/lib/" + - "/home/cc/ros2/install/flexiv_msgs/" + - "/home/cc/ros2/install/flexiv_moveit_config/" + - "/home/cc/ros2/install/flexiv_hardware/lib/" + - "/home/cc/ros2/install/flexiv_hardware/" + - "/home/cc/ros2/install/arm_bringup/" + - "/home/cc/ros2/install/arm_moveit_config/" + - "/home/cc/ros2/install/arm_description/" + - "/home/cc/ros2/install/flexiv_description/" + - "/home/cc/ros2/install/arm_msgs/lib/" + - "/home/cc/ros2/install/arm_msgs/" + - "/home/cc/ros2/install/flexiv_test_nodes/lib/" + - "/home/cc/ros2/install/flexiv_test_nodes/" + - "/home/cc/ros2/install/arm_sim_gazebo/lib/" + - "/home/cc/ros2/install/arm_sim_gazebo/" + - "/home/cc/ros2/install/arm_driver_flexiv/lib/" + - "/home/cc/ros2/install/arm_driver_flexiv/" + - "/home/cc/ros2/install/arm_control/lib/" + - "/home/cc/ros2/install/arm_control/" + - "/home/cc/ros2/install/arm_application/lib/" + - "/home/cc/ros2/install/arm_application/" + - "/home/cc/ros2/install/arm_kinematics/lib/" + - "/home/cc/ros2/install/arm_kinematics/" + - "/home/cc/ros2/install/arm_interfaces/lib/" + - "/home/cc/ros2/install/arm_interfaces/" + - "/home/cc/.local/bin/" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/" + - "/home/cc/anaconda3/envs/ros_flexiv/bin/" + - "/home/cc/anaconda3/condabin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/sbin/" + - "/usr/bin/" + - "/sbin/" + - "/bin/" + - "/usr/games/" + - "/usr/local/games/" + - "/snap/bin/" + found: "/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/librt.a" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_runtime_c/cmake/rosidl_runtime_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_runtime_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_runtime_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_c/cmake/rosidl_typesupport_fastrtps_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw/cmake/rmwConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_fastrtps_cpp/cmake/rosidl_typesupport_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_c/cmake/rosidl_typesupport_introspection_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_c-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcpputils/cmake/rcpputilsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcpputils" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcpputils.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_c/cmake/rosidl_typesupport_cConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_introspection_cpp/cmake/rosidl_typesupport_introspection_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cpp-extras.cmake:13 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_introspection_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosidl_typesupport_cpp/cmake/rosidl_typesupport_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/builtin_interfaces/cmake/builtin_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "builtin_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_interfaces/cmake/rcl_interfacesConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_interfaces__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_yaml_param_parser/cmake/rcl_yaml_param_parserConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_yaml_param_parser" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_yaml_param_parser.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_dds_common/cmake/rmw_dds_commonConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_dds_common__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_dds_common__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rmw_fastrtps_shared_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_fastrtps_shared_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/tracetools/cmake/tracetoolsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_shared_cpp/cmake/rmw_fastrtps_shared_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_fastrtps_cpp/cmake/rmw_fastrtps_cppConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation_cmake/cmake/get_default_rmw_implementation.cmake:64 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:19 (get_default_rmw_implementation)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rmw_implementation/cmake/rmw_implementationConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "tracetools" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtracetools.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_logging_spdlog/cmake/rcl_logging_spdlogConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl/cmake/rclConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_logging_spdlog" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_spdlog.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/statistics_msgs/cmake/statistics_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/libstatistics_collector/cmake/libstatistics_collectorConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "statistics_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rosgraph_msgs/cmake/rosgraph_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp/cmake/rclcppConfig.cmake:41 (include)" + - "CMakeLists.txt:16 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rosgraph_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rclcpp_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "rcl_lifecycle" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_lifecycle.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/lifecycle_msgs/cmake/lifecycle_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rcl_lifecycle/cmake/rcl_lifecycleConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/rclcpp_lifecycle/cmake/rclcpp_lifecycleConfig.cmake:41 (include)" + - "CMakeLists.txt:17 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "lifecycle_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "fake_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libfake_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "mock_components" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libmock_components.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "hardware_interface" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libhardware_interface.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/unique_identifier_msgs/cmake/unique_identifier_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unique_identifier_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/action_msgs/cmake/action_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "action_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/std_msgs/cmake/std_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "std_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/geometry_msgs/cmake/geometry_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "geometry_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/sensor_msgs/cmake/sensor_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "sensor_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/trajectory_msgs/cmake/trajectory_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "trajectory_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_generator_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/ament_cmake_export_libraries-extras.cmake:40 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_c" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_c.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/rosidl_cmake_export_typesupport_libraries-extras.cmake:18 (find_library)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/control_msgs/cmake/control_msgsConfig.cmake:41 (include)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/ament_cmake_export_dependencies-extras.cmake:21 (find_package)" + - "/home/cc/anaconda3/envs/ros_flexiv/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:41 (include)" + - "CMakeLists.txt:18 (find_package)" + mode: "library" + variable: "_lib" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "control_msgs__rosidl_typesupport_fastrtps_cpp" + candidate_directories: + - "/home/cc/anaconda3/envs/ros_flexiv/lib/" + found: "/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_cpp.so" + search_context: + CMAKE_PREFIX_PATH: + - "/home/cc/flexiv_install" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{CMAKE_PREFIX_PATH}: + - "/home/cc/ros2/install/gpio_controller" + - "/home/cc/ros2/install/flexiv_bringup" + - "/home/cc/ros2/install/flexiv_robot_states_broadcaster" + - "/home/cc/ros2/install/flexiv_gripper" + - "/home/cc/ros2/install/flexiv_msgs" + - "/home/cc/ros2/install/flexiv_moveit_config" + - "/home/cc/ros2/install/flexiv_hardware" + - "/home/cc/ros2/install/arm_bringup" + - "/home/cc/ros2/install/arm_moveit_config" + - "/home/cc/ros2/install/arm_description" + - "/home/cc/ros2/install/flexiv_description" + - "/home/cc/ros2/install/arm_msgs" + - "/home/cc/ros2/install/flexiv_test_nodes" + - "/home/cc/ros2/install/arm_sim_gazebo" + - "/home/cc/ros2/install/arm_driver_flexiv" + - "/home/cc/ros2/install/arm_control" + - "/home/cc/ros2/install/arm_application" + - "/home/cc/ros2/install/arm_kinematics" + - "/home/cc/ros2/install/arm_interfaces" + - "/home/cc/anaconda3/envs/ros_flexiv" + ENV{PATH}: + - "/home/cc/.local/bin" + - "/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin" + - "/home/cc/.local/bin" + - "/home/cc/anaconda3/envs/ros_flexiv/bin" + - "/home/cc/anaconda3/condabin" + - "/home/cc/.local/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/sbin" + - "/usr/bin" + - "/sbin" + - "/bin" + - "/usr/games" + - "/usr/local/games" + - "/snap/bin" + - "/snap/bin" + CMAKE_INSTALL_PREFIX: "/home/cc/ros2/install/flexiv_hardware" + CMAKE_SYSTEM_PREFIX_PATH: + - "/home/cc/anaconda3/envs/ros_flexiv/bin/../x86_64-conda-linux-gnu/sysroot/usr" + - "/usr/local" + - "/usr" + - "/" + - "/home/cc/anaconda3/envs/ros_flexiv" + - "/home/cc/ros2/install/flexiv_hardware" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - "/home/cc/anaconda3/envs/ros_flexiv" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" +... diff --git a/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.internal b/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.internal index dfb3034..2768f33 100644 --- a/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.internal +++ b/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.internal @@ -22,283 +22,6 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/visibility_control.hpp /home/cc/anaconda3/envs/ros_flexiv/include/console_bridge/console.h /home/cc/anaconda3/envs/ros_flexiv/include/console_bridge/console_bridge_export.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Cholesky - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Core - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Dense - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Eigen - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Eigenvalues - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Geometry - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Householder - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/IterativeLinearSolvers - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Jacobi - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/LU - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/OrderingMethods - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/QR - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SVD - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Sparse - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseCholesky - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseCore - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseLU - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseQR - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Version - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/LDLT.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/LLT.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArithmeticSequence.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Array.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArrayBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArrayWrapper.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Assign.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/AssignEvaluator.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/BandMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Block.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CommaInitializer.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ConditionEstimator.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CoreEvaluators.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CoreIterators.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseNullaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseTernaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseUnaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseUnaryView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseStorage.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DeviceWrapper.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Diagonal.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DiagonalMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DiagonalProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Dot.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/EigenBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Fill.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/FindCoeff.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Fuzzy.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GeneralProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GenericPacketMath.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GlobalFunctions.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/IO.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/IndexedView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/InnerProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Inverse.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Map.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MapBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MathFunctions.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MathFunctionsImpl.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Matrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MatrixBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NestByValue.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NoAlias.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NumTraits.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PartialReduxEvaluator.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PermutationMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PlainObjectBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Product.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ProductEvaluators.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Random.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/RandomImpl.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/RealView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Redux.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Ref.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Replicate.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Reshaped.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ReturnByValue.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Reverse.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Select.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SelfAdjointView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SkewSymmetricMatrix3.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Solve.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SolveTriangular.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SolverBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/StableNorm.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/StlIterators.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Stride.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Swap.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Transpose.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Transpositions.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/TriangularMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/VectorBlock.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/VectorwiseOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Visitor.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/BFloat16.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/ConjHelper.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/Half.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/Settings.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/Complex.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/Reductions.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/TypeCasting.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/BinaryFunctors.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/NullaryFunctors.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/StlFunctors.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/TernaryFunctors.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/UnaryFunctors.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/Parallelizer.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularSolverVector.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Assert.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/BlasUtil.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ConfigureVectorization.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Constants.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/EmulateArray.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/IndexedViewHelper.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/IntegralConstant.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/MKL_support.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Macros.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Memory.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Meta.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/MoreMeta.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ReshapedHelper.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Serializer.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/StaticAssert.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/SymbolicIndex.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/XprHelper.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/RealQZ.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/AlignedBox.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/AngleAxis.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/EulerAngles.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Homogeneous.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Hyperplane.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/OrthoMethods.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/ParametrizedLine.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Quaternion.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Rotation2D.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/RotationBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Scaling.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Transform.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Translation.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Umeyama.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/arch/Geometry_SIMD.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/BlockHouseholder.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/Householder.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/HouseholderSequence.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Jacobi/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Jacobi/Jacobi.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/Determinant.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/FullPivLU.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/InverseImpl.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/PartialPivLU.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/arch/InverseSize4.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Amd.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Ordering.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/ColPivHouseholderQR.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/CompleteOrthogonalDecomposition.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/FullPivHouseholderQR.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/HouseholderQR.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/BDCSVD.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/JacobiSVD.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/SVDBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/UpperBidiagonalization.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/AmbiVector.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/CompressedStorage.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseAssign.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseBlock.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseColEtree.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDot.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseFuzzy.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMap.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseProduct.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseRedux.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseRef.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSolverBase.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseTranspose.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseTriangularView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseUtil.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseVector.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseView.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/TriangularSolver.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLUImpl.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseQR/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseQR/SparseQR.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/Image.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/InternalHeaderCheck.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/Kernel.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/RealSvd2x2.h - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/BlockMethods.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/IndexedViewMethods.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.inc - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ReshapedMethods.inc /home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/handle.hpp /home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/hardware_info.hpp /home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/macros.hpp @@ -787,12 +510,10 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cctype /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cerrno /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/chrono - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/climits /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/clocale /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cmath /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/codecvt /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/compare - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/complex /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/concepts /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/condition_variable /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/csignal @@ -872,7 +593,6 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/utility /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/variant /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/vector - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/version /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/atomic_word.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/basic_file.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++allocator.h @@ -889,17 +609,11 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/messages_members.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/os_defines.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/time_members.h - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/emmintrin.h - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/limits.h - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/mm_malloc.h - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/mmintrin.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdalign.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdarg.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdbool.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stddef.h /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdint.h - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/syslimits.h - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/xmmintrin.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/alloca.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/arpa/inet.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/bitsperlong.h @@ -933,15 +647,12 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/iscanonical.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libc-header-start.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libm-simd-decl-stubs.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/local_lim.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/locale.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/long-double.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/math-vector.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-helper-functions.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-narrow.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix1_lim.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix2_lim.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix_opt.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthread_stack_min-dynamic.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes-arch.h @@ -1014,14 +725,12 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/wint_t.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/typesizes.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uintn-identity.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uio_lim.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/unistd_ext.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitflags.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitstatus.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wchar.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wctype-wchar.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/xopen_lim.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ctype.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/endian.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/errno.h @@ -1031,10 +740,8 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ifaddrs.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/libintl.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/limits.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/close_range.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/errno.h - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/limits.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/posix_types.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/stddef.h /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/locale.h @@ -1063,7 +770,6 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o /home/cc/flexiv_install/include/flexiv/rdk/data.hpp /home/cc/flexiv_install/include/flexiv/rdk/mode.hpp /home/cc/flexiv_install/include/flexiv/rdk/robot.hpp - /home/cc/flexiv_install/include/flexiv/rdk/utility.hpp /home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/flexiv_hardware_interface.hpp /home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/visibility_control.h diff --git a/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.make b/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.make index e0abe29..933333b 100644 --- a/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.make +++ b/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/compiler_depend.make @@ -21,283 +21,6 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/visibility_control.hpp \ /home/cc/anaconda3/envs/ros_flexiv/include/console_bridge/console.h \ /home/cc/anaconda3/envs/ros_flexiv/include/console_bridge/console_bridge_export.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Cholesky \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Core \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Dense \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Eigen \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Eigenvalues \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Geometry \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Householder \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/IterativeLinearSolvers \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Jacobi \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/LU \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/OrderingMethods \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/QR \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SVD \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Sparse \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseCholesky \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseCore \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseLU \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseQR \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Version \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/LDLT.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/LLT.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArithmeticSequence.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Array.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArrayBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArrayWrapper.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Assign.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/AssignEvaluator.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/BandMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Block.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CommaInitializer.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ConditionEstimator.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CoreEvaluators.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CoreIterators.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseNullaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseTernaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseUnaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseUnaryView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseStorage.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DeviceWrapper.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Diagonal.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DiagonalMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DiagonalProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Dot.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/EigenBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Fill.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/FindCoeff.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Fuzzy.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GeneralProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GenericPacketMath.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GlobalFunctions.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/IO.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/IndexedView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/InnerProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Inverse.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Map.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MapBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MathFunctions.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MathFunctionsImpl.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Matrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MatrixBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NestByValue.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NoAlias.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NumTraits.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PartialReduxEvaluator.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PermutationMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PlainObjectBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Product.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ProductEvaluators.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Random.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/RandomImpl.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/RealView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Redux.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Ref.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Replicate.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Reshaped.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ReturnByValue.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Reverse.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Select.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SelfAdjointView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SkewSymmetricMatrix3.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Solve.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SolveTriangular.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SolverBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/StableNorm.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/StlIterators.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Stride.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Swap.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Transpose.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Transpositions.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/TriangularMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/VectorBlock.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/VectorwiseOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Visitor.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/BFloat16.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/ConjHelper.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/Half.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/Settings.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/Complex.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/Reductions.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/TypeCasting.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/BinaryFunctors.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/NullaryFunctors.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/StlFunctors.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/TernaryFunctors.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/UnaryFunctors.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/Parallelizer.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularSolverVector.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Assert.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/BlasUtil.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ConfigureVectorization.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Constants.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/EmulateArray.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/IndexedViewHelper.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/IntegralConstant.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/MKL_support.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Macros.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Memory.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Meta.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/MoreMeta.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ReshapedHelper.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Serializer.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/StaticAssert.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/SymbolicIndex.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/XprHelper.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/RealQZ.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/AlignedBox.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/AngleAxis.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/EulerAngles.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Homogeneous.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Hyperplane.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/OrthoMethods.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/ParametrizedLine.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Quaternion.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Rotation2D.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/RotationBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Scaling.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Transform.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Translation.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Umeyama.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/arch/Geometry_SIMD.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/BlockHouseholder.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/Householder.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/HouseholderSequence.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Jacobi/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Jacobi/Jacobi.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/Determinant.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/FullPivLU.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/InverseImpl.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/PartialPivLU.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/arch/InverseSize4.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Amd.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Ordering.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/ColPivHouseholderQR.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/CompleteOrthogonalDecomposition.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/FullPivHouseholderQR.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/HouseholderQR.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/BDCSVD.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/JacobiSVD.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/SVDBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/UpperBidiagonalization.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/AmbiVector.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/CompressedStorage.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseAssign.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseBlock.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseColEtree.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDot.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseFuzzy.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMap.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseProduct.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseRedux.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseRef.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSolverBase.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseTranspose.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseTriangularView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseUtil.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseVector.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseView.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/TriangularSolver.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLUImpl.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseQR/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseQR/SparseQR.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/Image.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/InternalHeaderCheck.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/Kernel.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/RealSvd2x2.h \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/BlockMethods.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/IndexedViewMethods.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.inc \ - /home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ReshapedMethods.inc \ /home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/handle.hpp \ /home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/hardware_info.hpp \ /home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/macros.hpp \ @@ -786,12 +509,10 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cctype \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cerrno \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/chrono \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/climits \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/clocale \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cmath \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/codecvt \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/compare \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/complex \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/concepts \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/condition_variable \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/csignal \ @@ -871,7 +592,6 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/utility \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/variant \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/vector \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/version \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/atomic_word.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/basic_file.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++allocator.h \ @@ -888,17 +608,11 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/messages_members.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/os_defines.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/time_members.h \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/emmintrin.h \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/limits.h \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/mm_malloc.h \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/mmintrin.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdalign.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdarg.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdbool.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stddef.h \ /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdint.h \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/syslimits.h \ - /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/xmmintrin.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/alloca.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/arpa/inet.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/bitsperlong.h \ @@ -932,15 +646,12 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/iscanonical.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libc-header-start.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libm-simd-decl-stubs.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/local_lim.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/locale.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/long-double.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/math-vector.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-helper-functions.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-narrow.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix_opt.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthread_stack_min-dynamic.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes-arch.h \ @@ -1013,14 +724,12 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/wint_t.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/typesizes.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uintn-identity.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uio_lim.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/unistd_ext.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitflags.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wchar.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wctype-wchar.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/xopen_lim.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ctype.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/endian.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/errno.h \ @@ -1030,10 +739,8 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ifaddrs.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/libintl.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/limits.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/close_range.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/errno.h \ - /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/limits.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/posix_types.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/stddef.h \ /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/locale.h \ @@ -1062,7 +769,6 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/ros /home/cc/flexiv_install/include/flexiv/rdk/data.hpp \ /home/cc/flexiv_install/include/flexiv/rdk/mode.hpp \ /home/cc/flexiv_install/include/flexiv/rdk/robot.hpp \ - /home/cc/flexiv_install/include/flexiv/rdk/utility.hpp \ /home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/flexiv_hardware_interface.hpp \ /home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/visibility_control.h @@ -1221,73 +927,53 @@ libflexiv_hardware.so: /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o -CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: - /home/cc/flexiv_install/lib/libflexiv_rdk.a: -/home/cc/flexiv_install/lib/libRBDynParsers.so.1.9: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libyaml-cpp.so.0.8.0: +/home/cc/flexiv_install/lib/libRBDyn.so.1.9.0: /home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_introspection_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_introspection_c.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_c.so: + /home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_py.so: +CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: -/home/cc/anaconda3/envs/ros_flexiv/lib/libtracetools.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_c.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libtinyxml2.so.11.0.0: -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_cpp.so: - /home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_c.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_introspection_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_introspection_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_introspection_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_introspection_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_py.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_introspection_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_introspection_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_py.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_runtime_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_c.so: @@ -1295,27 +981,11 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_generator_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/librmw.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so: - /home/cc/anaconda3/envs/ros_flexiv/lib/librcpputils.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_yaml_param_parser.so: - /home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_spdlog.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_interface.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_lifecycle.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_c.so: @@ -1327,161 +997,1135 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_introspection_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_cpp.so: + /home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_c.so: - /home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_introspection_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/liblibstatistics_collector.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_c.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_c.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_py.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libfoonathan_memory-0.7.3.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/libfastrtps.so.2.6.10: +/home/cc/anaconda3/envs/ros_flexiv/lib/libhardware_interface.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libfastcdr.so.1.0.24: /home/cc/anaconda3/envs/ros_flexiv/lib/libfake_components.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libconsole_bridge.so.1.0: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_introspection_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib64/libc_nonshared.a: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libm.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/crtn.o: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/crti.o: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/libm.so.6: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/libc.so.6: + +/home/cc/flexiv_install/include/flexiv/rdk/data.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/wctype.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/wchar.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/socket.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libyaml-cpp.so.0.8.0: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/single_threaded.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/strings.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdio.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/signal.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sched.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/netinet/in.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/math.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/stddef.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/posix_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/close_range.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/libintl.h: + /home/cc/anaconda3/envs/ros_flexiv/lib/libcrypto.so: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/qos_overriding_options.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/visibility_control.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/features.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_map.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/errno.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/resolve_enable_topic_statistics.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ctype.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_waitables_interface.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uintn-identity.h: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseUnaryView.h: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/typesizes.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_timers_interface_traits.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/wint_t.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_graph_interface.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_tm.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_tempbuf.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/glue_numeric_defs.h: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_timeval.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_runtime_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_itimerspec.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_iovec.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct___jmp_buf_tag.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_FILE.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sigval_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sigset_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libmock_components.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sigevent_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/locale_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/error_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/clockid_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__sigval_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__sigset_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__locale_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__fpos_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__fpos64_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__FILE.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/timex.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/timesize.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/thread-shared-types.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/struct_rwlock.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdint-uintn.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/socket_type.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/socket.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sockaddr.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigthread.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigstksz.h: + +/home/cc/flexiv_install/include/flexiv/rdk/mode.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigstack.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/signum-generic.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/signum-arch.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/signal_ext.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/siginfo-consts.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigevent-consts.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sched.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthread_stack_min-dynamic.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-helper-functions.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libm-simd-decl-stubs.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libc-header-start.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/iscanonical.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/getopt_posix.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/fp-fast.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/flt-eval-method.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/unistd.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/floatn.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/locale.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/environments.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/endianness.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/cpu-set.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/confname.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_introspection_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/sockios.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/posix_types_64.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/errno.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/bitsperlong.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/errno.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/bitsperlong.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/alloca.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdint.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stddef.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_yaml_param_parser.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdbool.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdalign.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/cxxabi_tweaks.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/ctype_inline.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/ctype_base.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/messages_members.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/cpu_defines.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++locale.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++io.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++config.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/atomic_word.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/vector: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/variant: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/utility: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/sockios.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/unordered_map: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/typeinfo: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/math-vector.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/typeindex: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tuple: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/special_function_util.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/riemann_zeta.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/poly_hermite.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/os_defines.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/modified_bessel_func.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/legendre_function.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/hypergeometric.tcc: + +/home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/flexiv_hardware_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/gamma.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/errno-base.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/bessel_function.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/system_error: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/string_view: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/string: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/streambuf: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/stdlib.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/set: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_osockaddr.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ratio: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-narrow.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/pstl_config.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigaction.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/glue_memory_defs.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/glue_algorithm_defs.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/execution_defs.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ostream: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_logging_interface.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/numeric: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++allocator.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/new: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/memory: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/locale: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_value.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/align.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_topics_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/qos_parameters.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_clock_interface.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_base_interface_traits.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArrayBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_timers_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/types/hardware_interface_return_values.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/list.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_base_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_timer.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_impl.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libc.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/bounded_vector.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/message_memory_strategy.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/enable_special_members.h: /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_sigstack.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/message_memory_strategy.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/state.hpp: + /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/memory_strategy.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/macros.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/network_flow_endpoint_array.h: - /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/memory_strategies.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/init_options.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/type_adapter.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__struct.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/intra_process_buffer_type.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/subscription_options.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__type_support.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/generic_subscription.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/ucontext.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/generic_publisher.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__traits.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/qos_profiles.h: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/future_return_code.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/subscription_intra_process_buffer.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/ros_message_intra_process_buffer.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/librcutils.so: -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/visibility_control.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/basic_file.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/intra_process_manager.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/subscription_intra_process_base.hpp: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/ell_integral.tcc: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/libgcc.a: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/exp_integral.tcc: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/static_single_threaded_executor.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/map: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/multi_threaded_executor.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/static_executor_entities_collector.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/time_members.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/string_map.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/clock_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/atomic: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/pthread.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executor.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/librt.a: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/service.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/allocated_ptr.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_parameters_interface_traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/duration.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/executable_list.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/create_intra_process_buffer.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/subscription_callback_type_helper.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/XprHelper.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/resolve_intra_process_buffer_type.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/single_threaded_executor.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/predefined_ops.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/codecvt: +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_introspection_c.so: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/waitable.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_topics_interface_traits.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/shared_library.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iostream: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/rmw_implementation_specific_subscription_payload.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Householder: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/qos_parameters.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/cpp_callback_trampoline.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__builder.hpp: /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/floatn-common.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/streambuf_iterator.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/cpp_callback_trampoline.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/detail/synchronization_policy_common.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_classes.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/ret_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/subscription_intra_process.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_algo.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_yaml_param_parser/rcl_yaml_param_parser/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_yaml_param_parser/rcl_yaml_param_parser/types.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp_lifecycle.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/topic_statistics_state.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/rcutils_ret.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/default_state_machine.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/ss_flags.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_base_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/crtbeginS.o: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/event.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_subscription.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_implementation.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/client.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstdint: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/struct_mutex.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/get_parameter_types.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_yaml_param_parser/rcl_yaml_param_parser/parser.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/numeric_traits.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_timers_interface_traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/qos_policy_kind.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/arguments.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/buffers/ring_buffer_implementation.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/loaned_message.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/lib/libgcc_s.so.1: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/floating_point_range__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/csignal: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/is_ros_compatible_type.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/testing/fault_injection.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/localefwd.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/allocator.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_function.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/types.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/graph.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/functexcept.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/hardware_info.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/message_type_support_struct.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/allocator/allocator_deleter.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iterator: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_base.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_conv.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__struct.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes-arch.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/data_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/logging.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libssl.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix_opt.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/memoryfwd.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/ucontext.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/generic_subscription.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/ld-linux-x86-64.so.2: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_ios.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/transition.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/rosidl_generator_cpp__visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/string_array.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/domain_id.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstddef: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/topic_statistics_collector.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__struct.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libclass_loader.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/timer_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/cookie_io_functions_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/moving_average_statistics/types.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_ios.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stringfwd.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_waitables_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/intra_process_setting.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition_event__struct.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/time.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/impl/cpp/demangle.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/buffers/intra_process_buffer.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/moving_average_statistics/moving_average.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/contexts/default_context.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ifaddrs.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/arpa/inet.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/log_level.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstring: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/rosidl_generator_c__visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/mbstate_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/istream: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/node.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_parameters_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/console_bridge/console.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/exp_integral.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/ell_integral.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/intra_process_manager.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/wait.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/resolve_use_intra_process.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unique_lock.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/generic_publisher.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/rmw_implementation_specific_subscription_payload.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/allocator.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ctime: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_service.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/event.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/functional_hash.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/libgcc_s.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/handle.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_bvector.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/postypes.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/constants.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libc.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_impl.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/macros.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/time.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_result_kind.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/time.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/uses_allocator_args.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iostream: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/shared_library.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/waitable.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/exceptions.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/duration.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/char_array.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstdlib: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/statistic_data_point__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libdl.a: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/exceptions/exceptions.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/hashtable_policy.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/class_loader_core.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdint.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/type_traits: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/clock.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets_nonio.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/string.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_construct.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iomanip: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/time.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/gthr-default.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_descriptor.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher_base.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/rcl_lifecycle.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_event_handler.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libfoonathan_memory-0.7.3.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/logger.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/libmvec.so.1: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/class_loader.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/incompatible_qos_events_statuses.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/collector/collector.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition_event__type_support.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/hash_map.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/libstdc++.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/endian.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/rcl.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/debug/assertions.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/received_message_age.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/timer.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/posix_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/rosidl_generator_cpp__visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_logging_interface.hpp: + +/home/cc/ros2/src/flexiv_hardware/src/flexiv_hardware_interface.cpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/node_options.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/transition_event.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/memory_resource.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/functional: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/ros_message_intra_process_buffer.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cctype: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/allocator/allocator_common.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cwctype: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_iterator_base_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/exceptions.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/client.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/subscription.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__mbstate_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_thread.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_pair.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/meta_object.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/typesupport_helpers.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/init_options.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/liveliness_lost.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_timers_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/get_message_type_support_handle.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/subscription_options.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unordered_map.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/sstream: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/collector/generate_statistics_message.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/optional: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__struct.hpp: + +/home/cc/flexiv_install/include/flexiv/rdk/robot.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/network_flow_endpoints.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/list: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/context.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/register_macro.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_topics_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_typesupport_cpp/service_type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/event.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librmw.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/rmw_implementation_specific_publisher_payload.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/set_parameters.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/future: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/timer.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ostream.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/event_callback.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_introspection_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/parse_numbers.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/function_traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/shared_ptr.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/guard_condition.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cwchar: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_result.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_generic_publisher.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/shared_library.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_client.hpp: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/siginfo_t.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/publisher_options.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/subscription_content_filter_options.h: -/home/cc/flexiv_install/lib/libspdlog.so.1.9.2: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/in.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/subscription.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/init_options.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stream_iterator.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/libtracetools.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/assert.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/get_parameters.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/macros.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/publisher.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/posix_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/list_parameters_result.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/logging.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/long-double.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/types.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_map.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/resolve_enable_topic_statistics.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/errno.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/detail/storage_policy_common.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/locale.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/expand_topic_or_service_name.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/error_handling.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/floating_point_range__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/list_parameters.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/beta_function.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/integer_range__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/integer_range__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/buffers/buffer_implementation_base.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/unordered_set: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executor_options.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/string_conversions.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/types/lifecycle_state_names.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_iterator.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/macros.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/atomic_lockfree_defines.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__type_support.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/any_service_callback.hpp: @@ -1489,17 +2133,19 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/array_list.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/utilities.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__type_support.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/set_parameters_atomically.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__type_support.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__builder.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_introspection_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__struct.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/resolve_intra_process_buffer_type.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_set.h: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/specfun.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/guard_condition.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__traits.hpp: @@ -1507,2150 +2153,622 @@ CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/topic_statistics/subscription_topic_statistics.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/cookie_io_functions_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/data_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes-arch.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/intra_process_buffer_type.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher_options.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/set_parameters_result.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/xopen_lim.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/shared_mutex: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/posix_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/list_parameters_result.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition_event__functions.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/callback_group.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Ref.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/localhost.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/TypeCasting.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/subscription_callback_type_helper.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Homogeneous.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArithmeticSequence.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/chrono.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/collector/metric_details_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_typesupport_cpp/message_type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Solve.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sig_atomic_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Assign.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/exceptions.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/wait.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/syslimits.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/mbstate_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/network_flow_endpoints.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/algorithmfwd.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/log_level.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/arpa/inet.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/guard_condition.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/limits.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libfastcdr.so.1.0.24: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstdint: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/transition_event.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/transition.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_uninitialized.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/state.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition_event__type_support.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/rosidl_generator_c__visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstring: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cmath: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/invoke.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__struct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets_nonio.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/buffers/intra_process_buffer.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__struct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/topic_statistics_collector.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/EulerAngles.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GenericPacketMath.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/RealSchur.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstdlib: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/types/lifecycle_state_names.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/NullaryFunctors.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_iterator.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/string_conversions.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/types/hardware_interface_type_values.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/version.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/init.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/algorithm: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/resolve_use_intra_process.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/compare: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/handle.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/message_info.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/libgcc_s.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/rosidl_generator_cpp__visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/context.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_topics_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/list: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/istream: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/IndexedViewMethods.inc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/function_traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/shared_ptr.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Block.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_content_filter_options.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/topic_endpoint_info_array.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_event_handler.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_generator_py.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/rcl_lifecycle.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/arch/InverseSize4.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/typesizes.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLUImpl.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/unordered_map: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/sockios.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_generator_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/logger.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/SymbolicIndex.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/PartialPivLU.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/libgcc.a: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseView.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_generator_py.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/static_executor_entities_collector.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/allocator/allocator_deleter.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseUtil.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_string.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseTriangularView.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_parameters_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/atomic_futex.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularSolverVector.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/clock.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/publisher.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/libmvec.so.1: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseUnaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/glue_algorithm_defs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/subscription_intra_process_base.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/basic_file.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/events_statuses.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Swap.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_tree.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/graph.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/Half.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/allocated_ptr.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/postypes.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/contexts/default_context.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/default_state_machine.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SolveTriangular.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/EmulateArray.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/event_callback.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/get_parameter_types.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/VectorwiseOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Eigenvalues: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/cxxabi_tweaks.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/ParametrizedLine.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/errno.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/RandomImpl.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/parse_numbers.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Random.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ProductEvaluators.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ReturnByValue.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/time.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/monostate.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/event.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_template.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libhardware_interface.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/AssignEvaluator.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_lifecycle/rcl_lifecycle/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/constants.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CoreIterators.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/service_type_support_decl.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/fp-fast.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NumTraits.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MatrixBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/loaned_message.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cxxabi.h: /home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/siginfo-consts-arch.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/floating_point_range__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/lib/libgcc_s.so.1: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Reverse.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.inc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_factory.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseLU: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Matrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__fpos64_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/qos.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/getopt_core.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Select.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MathFunctionsImpl.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/qos_event.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/type_support_decl.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MathFunctions.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/specfun.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/MapBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/TriangularSolver.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_parameters_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/console_bridge/console.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_client.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/chrono: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wctype-wchar.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/backward/binders.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/EigenBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/exception_ptr.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_topics_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DiagonalProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executor_options.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/unordered_set: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Diagonal.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/subscription_intra_process.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/integer_range__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/beta_function.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/list_parameters.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SolverBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/shared_ptr_atomic.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/crtbeginS.o: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/expand_topic_or_service_name.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Eigen: - -/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/rclcpp.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/received_message_age.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/IntegralConstant.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NoAlias.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/posix_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/register_macro.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Core: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/buffers/ring_buffer_implementation.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/bitsperlong.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libmock_components.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_classes.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Version: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DiagonalMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseRedux.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/sstream.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/stack_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Visitor.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.inc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/event.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Jacobi/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/Reductions.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseAssign.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseTernaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/get_parameters.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Amd.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/optional: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdio.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_subscription.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/TernaryFunctors.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Translation.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Jacobi: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/duration__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/detail/storage_policy_common.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/Image.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitstatus.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/meta_object.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Fill.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition_event__struct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/NestByValue.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/BandMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/future: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/exceptions.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_logging_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/is_ros_compatible_type.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/exceptions/exceptions.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libdl.a: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Sparse: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sockaddr.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Transpositions.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/BinaryFunctors.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_timespec.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Stride.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/error_handling.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/ss_flags.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/RotationBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/locale.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ReshapedHelper.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++locale.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/typesupport_helpers.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Jacobi/Jacobi.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/streambuf.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_set.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.inc: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Dot.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/locale: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_fastrtps_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Hyperplane.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iosfwd: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseFuzzy.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_topics_interface_traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/moving_average_statistics/types.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/message_sequence.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/uint8_array.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigcontext.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_py.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_value.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/VectorBlock.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/RealQZ.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/node_options.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/mutex: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/time.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_publisher.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_relops.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_parameters_interface_traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/BFloat16.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/allocator.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_multimap.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/qos_profiles.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/security_options.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/OrderingMethods: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/metrics_message.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/string.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Reshaped.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/integer_range__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseCholesky: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/FullPivHouseholderQR.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/HouseholderSequence.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/rosidl_generator_cpp__visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/OrthoMethods.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/Complex.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/time.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitflags.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Transpose.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Fuzzy.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Inverse.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/arguments.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMap.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/hardware_info.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/tracetools.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/socket.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/LDLT.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Assert.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/erase_if.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/ReshapedMethods.inc: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/names_and_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/LLT.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_wait_set_mask.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/Settings.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/InverseImpl.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GeneralProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/ctype_inline.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Array.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/timer.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/guard_condition.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/GlobalFunctions.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/QR: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/struct_mutex.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/event.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_typesupport_cpp/service_type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CommaInitializer.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/multi_threaded_executor.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Geometry: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/istream.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdlib-bsearch.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ConfigureVectorization.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseQR/SparseQR.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/detail/write_preferring_read_write_lock.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/string_view.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/IndexedViewHelper.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseQR/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ConditionEstimator.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ifaddrs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/message_initialization.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/UpperBidiagonalization.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/collector/generate_statistics_message.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/sstream: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/nested_exception.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SelfAdjointView.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/unistd_ext.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.inc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/HouseholderQR.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_bvector.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/backward/auto_ptr.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/FILE.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_options.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/visibility_control_macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/LU: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_timers_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/liveliness_lost.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SVD: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/macros.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/atomic_lockfree_defines.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/CompressedStorage.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/posix_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/node.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_event.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/rmw_implementation_specific_payload.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_yaml_param_parser/rcl_yaml_param_parser/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libament_index_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/StlFunctors.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/duration.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PermutationMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/IO.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigevent-consts.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/BDCSVD.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/netinet/in.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ctime: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/RealSvd2x2.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/InnerProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/Parallelizer.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/message_type_support_decl.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/uses_allocator.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/gthr.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PlainObjectBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_time_source_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_descriptor.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/state__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/gthr-default.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sigval_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/JacobiSVD.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/ret_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/BlasUtil.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/charconv.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/AngleAxis.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DeviceWrapper.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Constants.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ptr_traits.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseStorage.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Replicate.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/scope_exit.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/logging.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/topic_endpoint_info.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libssl.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executor.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/RealView.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/service.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/rcl.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/rmw.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_raw_storage_iter.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/debug/assertions.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/libstdc++.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/received_message_period.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/MoreMeta.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/pointer_traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Serializer.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/StaticAssert.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/ArrayWrapper.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_typesupport_interface/rosidl_typesupport_interface/macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/array: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/features-time64.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/memory: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/any_executable.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/EigenSolver.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/execution_defs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/atomic_base.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/list_parameters_result__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/assert.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/in.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/Determinant.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/dynamic_storage.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseColEtree.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_py.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/impl/cpp/demangle.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libyaml.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/PartialReduxEvaluator.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/collector/collector.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/librt.a: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/AlignedBox.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/mmintrin.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdbool.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Quaternion.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/pthread.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Rotation2D.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_classes.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstddef: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Transform.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stddef.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/InternalHeaderCheck.h: - -/home/cc/flexiv_install/lib/libRBDyn.so.1.9.0: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/misc/Kernel.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Umeyama.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/BlockHouseholder.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Product.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/exception_defines.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/ColPivHouseholderQR.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/detail/synchronization_policy_common.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/class_loader.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/hashtable.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/SkewSymmetricMatrix3.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/liblibstatistics_collector.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters_atomically__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/set_parameters__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/stdlib.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_function.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/liveliness_changed.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/OrderingMethods/Ordering.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseQR: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/duration.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/FullPivLU.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/intra_process_setting.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/LU/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/functors/UnaryFunctors.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librmw_implementation.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Meta.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/node_handle.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/StlIterators.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/logging_rosout.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseBlock.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/concepts: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher_factory.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/allocator.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/DenseBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseRef.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/client.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libconsole_bridge.so.1.0: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Householder/Householder.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/serialized_message.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/cxxabi_init_exception.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/service.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_base.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_options.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/time.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/timer.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/topic_statistics_state.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_result.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cwchar: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_result_kind.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/setjmp.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/static_storage.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/time64.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_services_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/thread_safe_synchronization.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/cpp_type_traits.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseTranspose.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_type.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp_lifecycle/rclcpp_lifecycle/node_interfaces/lifecycle_node_interface.hpp: /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/type_traits.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/list.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/types/hardware_interface_return_values.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_timers_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_timer.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_base_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_client.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/publisher_options.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/collector/metric_details_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_typesupport_cpp/message_type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/describe_parameters.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher_options.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/mutex: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/detail/time__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_raw_storage_iter.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/getopt_core.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/qos.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/type_support_decl.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/qos_event.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/monostate.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/time.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/qos_overriding_options.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libyaml.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/siginfo-arch.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/condition_variable: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/rate.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_introspection_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_timespec.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/any_executable.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/sequence_bound.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/rclcpp.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_algobase.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_iterator_base_funcs.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/serialized_message.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sig_atomic_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/exception.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/service.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_content_filter_options.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_factory.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_options.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_wait_set_mask.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/qsort.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/time.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_type__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_services_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/utilities.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libsensor_msgs__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/string_view.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/detail/write_preferring_read_write_lock.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/create_intra_process_buffer.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/dynamic_storage.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/setjmp.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/sequential_synchronization.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosgraph_msgs__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/time64.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/static_storage.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/subscription_traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_template.hpp: + /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp_lifecycle/rclcpp_lifecycle/state.hpp: /home/cc/anaconda3/envs/ros_flexiv/include/rclcpp_lifecycle/rclcpp_lifecycle/visibility_control.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/allocator/allocator_common.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/filesystem_helper.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bit: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/exception_ptr.h: /home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/join.hpp: -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/Default/ConjHelper.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/error_handling.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/uniform_int_dist.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wchar.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CoreEvaluators.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/endian.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/this_thread_sleep.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/pluginlib/pluginlib/class_list_macros.hpp: - -/home/cc/ros2/src/flexiv_hardware/src/flexiv_hardware_interface.cpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/qsort.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/network_flow_endpoint.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/thread_safety_annotations.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/allocator.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/hash_map.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/rcutils_ret.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/string_map.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/init_options.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/time_members.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/domain_id.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseDot.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/fp-logb.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/error_handling.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdlib-float.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/describe_parameters.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/event_callback_type.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/message_lost.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/offered_deadline_missed.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/requested_deadline_missed.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/get_topic_names_and_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/impl/config.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/errno.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/incompatible_qos_events_statuses.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/MKL_support.h: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/endian.h: /home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/init.h: /home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_map.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/endian.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/pointer_traits.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/init_options.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/network_flow_endpoint.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/IndexedView.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/qos_policy_kind.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/set_parameters.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Cholesky/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/qos_string_conversions.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets_nonio.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseSolverBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/serialized_message.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/logging_macros.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdint-intn.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/subscription_content_filter_options.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/siginfo_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdc-predef.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/types.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/message_initialization.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/testing/fault_injection.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/message_type_support_struct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/primitives_sequence.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/service_type_support_struct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_service.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/statistic_data_point__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/statistic_data_point__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_sched_param.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/config.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/AmbiVector.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/atomic: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/time.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/clock_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/floating_point_range__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/align.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/alloc_traits.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_ios.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/ld-linux-x86-64.so.2: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_ios.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_string.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/char_traits.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/logging.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/concept_check.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/enable_special_members.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/fstream.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/functexcept.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/cxxabi_forced.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/functional_hash.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/hash_bytes.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/experimental/buffers/buffer_implementation_base.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/poly_laguerre.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/hashtable_policy.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ios_base.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/timer_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdint.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libclass_loader.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/localefwd.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameters__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/memory_resource.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/FindCoeff.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/memoryfwd.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix_opt.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/StableNorm.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/move.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/new_allocator.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_yaml_param_parser/rcl_yaml_param_parser/parser.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/time_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_type.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/crtendS.o: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ostream.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/rosidl_generator_cpp__visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdarg.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/sequence_bound.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ostream_insert.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/predefined_ops.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/quoted_string.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/refwrap.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/requires_hosted.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/shared_ptr_base.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_abs.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_mutex.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/system_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/limits: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/climits: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_thread.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_algo.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/timesize.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_algobase.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__traits.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_construct.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/string.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_function.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_heap.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstdio: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/net/if.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/byteswap.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_iterator_base_funcs.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/rate.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_iterator_base_types.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cwctype: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/InternalHeaderCheck.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_list.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_multiset.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_numeric.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/SparseCore: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_pair.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_vector.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stringfwd.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unique_ptr.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/context.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/rosidl_generator_cpp__visibility_control.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unordered_map.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unordered_set.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Redux.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/codecvt.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/thread: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/time.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/utility.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/vector.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cctype: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/time.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libpthread.a: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cerrno: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/clocale: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/complex: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/BlockMethods.inc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/condition_variable: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/Map.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/siginfo-arch.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/csignal: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cxxabi.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/char_array.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/exception: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/stdexcept: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/aligned_buffer.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/IterativeLinearSolvers: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/alloc_traits.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/TriangularMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/atomicity.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_py.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/concurrence.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/numeric_traits.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/functional: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/initializer_list: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/socket.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/errno.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iomanip: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ios: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/new: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/string_array.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++allocator.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigthread.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/numeric: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ostream: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/glue_memory_defs.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigaction.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/types.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/pstl_config.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-narrow.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ratio: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_osockaddr.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/set: - -/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/moving_average_statistics/moving_average.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/streambuf: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/string: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/string_view: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/system_error: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__struct.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/bessel_function.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher_base.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/errno-base.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/gamma.tcc: - -/home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/flexiv_hardware_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/hypergeometric.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/legendre_function.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/modified_bessel_func.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/os_defines.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/poly_hermite.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/riemann_zeta.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/special_function_util.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tuple: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/static_single_threaded_executor.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/typeindex: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/math-vector.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/typeinfo: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Dense: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/utility: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/variant: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/exception.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/vector: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/error_constants.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/version: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__builder.hpp: - -/home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/visibility_control.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/atomic_word.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++config.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/c++io.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/get_parameter_types__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/cpu_defines.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SVD/SVDBase.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/ctype_base.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/emmintrin.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/limits.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iterator: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/mm_malloc.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdalign.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdint.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/xmmintrin.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/alloca.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/errno.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/bitsperlong.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/errno.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/posix_types_64.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/sockios.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_introspection_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/confname.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/map: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/cpu-set.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cassert: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/endianness.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/environments.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/locale.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/util/Memory.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/floatn.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/unistd.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/flt-eval-method.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/snprintf.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/getopt_posix.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/type_adapter.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/iscanonical.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libc-header-start.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.inc: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_py.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthread_stack_min-dynamic.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/get_message_type_support_handle.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sched.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/select.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/siginfo-consts.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_base_interface.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/sequential_synchronization.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/uses_allocator_args.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/signal_ext.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/signum-arch.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/range_access.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/signum-generic.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigstack.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librclcpp_lifecycle.so: - -/home/cc/flexiv_install/include/flexiv/rdk/mode.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/arch/Geometry_SIMD.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigstksz.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/socket.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libtrajectory_msgs__rosidl_generator_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/socket_type.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/client.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdint-uintn.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/struct_rwlock.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/thread-shared-types.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__builder.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/timex.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__FILE.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__fpos_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__locale_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__sigset_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__sigval_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/clockid_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/error_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/libm-simd-decl-stubs.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/locale_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sigevent_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/sigset_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_FILE.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/__mbstate_t.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct___jmp_buf_tag.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_iovec.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_itimerspec.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_timeval.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/describe_parameters__type_support.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_tm.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_cpp.so: /home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_cpp.so: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/wint_t.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/thread_safety_annotations.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/utils.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/publisher_factory.hpp: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uintn-identity.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/visibility_control.hpp: -/home/cc/anaconda3/envs/ros_flexiv/include/rcl_yaml_param_parser/rcl_yaml_param_parser/types.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/event_callback_type.h: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/streambuf.tcc: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/messages_members.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/detail/list_parameters__traits.hpp: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/uio_lim.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/macros.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/ctype.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/init.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/rmw_implementation_specific_publisher_payload.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/system_interface.hpp: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/local_lim.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/compare: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/features.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/algorithm: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_generic_subscription.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/type_traits: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/init_options.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/char_traits.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/fstream: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigcontext.h: -/home/cc/flexiv_install/include/flexiv/rdk/utility.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/types/uint8_array.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/libintl.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_introspection_c.so: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/debug/debug.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_time_source_interface.hpp: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/limits.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/visibility_control.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/close_range.h: +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition__type_support.hpp: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/long-double.h: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/invoke.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/linux/stddef.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_options.hpp: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/math.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/visibility_control_macros.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sched.h: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/fp-logb.h: -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_value.hpp: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/domain_id.h: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Geometry/Scaling.h: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdlib-float.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/signal.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/error_handling.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdio.h: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/events_statuses.h: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.inc: +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/snprintf.h: -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/Cholesky: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/allocator.h: -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/mathcalls-helper-functions.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdlib.h: - -/home/cc/flexiv_install/include/flexiv/rdk/robot.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/strings.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/Core/CwiseNullaryOp.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/cdefs.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/select.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/single_threaded.h: - -/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/domain_id.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/sys/socket.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ostream.tcc: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/wchar.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/wctype.h: - -/home/cc/flexiv_install/include/flexiv/rdk/data.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCore/SparseVector.h: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/libc.so.6: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/lib64/libm.so.6: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/crti.o: - -/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/class_loader/class_loader/class_loader_core.hpp: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/crtn.o: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libm.so: - -/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib64/libc_nonshared.a: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_generator_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unique_lock.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libaction_msgs__rosidl_typesupport_fastrtps_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_c.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/eigen3/Eigen/src/QR/CompleteOrthogonalDecomposition.h: - -/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_cpp.so: - -/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/any_subscription_callback.hpp: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_numeric.h: /home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/incompatible_qos.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_conv.h: +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wctype-wchar.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_c.so: +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/parameter_client.hpp: -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_generator_py.so: +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/chrono: -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_c.so: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/liveliness_changed.h: + +/home/cc/flexiv_install/lib/libRBDynParsers.so.1.9: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/message_lost.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/offered_deadline_missed.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/events_statuses/requested_deadline_missed.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/get_topic_names_and_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_introspection_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/impl/config.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/callback_group.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/lifecycle_msgs/lifecycle_msgs/msg/detail/transition_event__functions.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/set_parameters_result__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/localhost.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_interfaces__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/builtin_interfaces/builtin_interfaces/msg/rosidl_generator_cpp__visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/message_sequence.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/names_and_types.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/clocale: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/network_flow_endpoint.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/macros.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/network_flow_endpoint_array.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/move.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/liblifecycle_msgs__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets_nonio.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/qos_string_conversions.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/concept_check.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/rmw.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libunique_identifier_msgs__rosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/security_options.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdint-intn.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/serialized_message.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/stdc-predef.h: /home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/time.h: -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/scope_exit.hpp: -/home/cc/anaconda3/envs/ros_flexiv/lib/libcontrol_msgs__rosidl_typesupport_fastrtps_cpp.so: +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/topic_endpoint_info.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/topic_endpoint_info_array.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rmw/rmw/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/message_initialization.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/stdarg.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ostream.tcc: + +/home/cc/flexiv_install/lib/libspdlog.so.1.9.2: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/primitives_sequence.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/string.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_typesupport_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libfastrtps.so.2.6.10: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_list.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/network_flow_endpoint.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/bounded_vector.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/message_initialization.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/srv/set_parameters_atomically.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/utils.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_event__builder.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/errno.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm-generic/socket.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/initializer_list: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/struct_sched_param.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/statistic_data_point__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/metrics_message.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/rosidl_generator_cpp__visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/config.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/logging_macros.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/this_thread_sleep.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/asm/socket.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/libstatistics_collector/libstatistics_collector/topic_statistics_collector/received_message_period.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/tracetools.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_vector.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/tracetools/tracetools/visibility_control.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstatistics_msgs__rosidl_generator_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_typesupport_interface/rosidl_typesupport_interface/macros.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/array: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/FILE.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/backward/auto_ptr.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/pluginlib/pluginlib/class_list_macros.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/backward/binders.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/gthr.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/message_type_support_decl.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/uses_allocator.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcpputils/rcpputils/filesystem_helper.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bit: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/alloc_traits.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librosidl_typesupport_fastrtps_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/atomic_base.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/get_node_parameters_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/atomic_futex.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_string.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/basic_string.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/charconv.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/x86_64-conda-linux-gnu/bits/error_constants.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/vector.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_descriptor__type_support.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/chrono.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/codecvt.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/wait_set_policies/thread_safe_synchronization.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/cpp_type_traits.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_value.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/cxxabi_forced.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/concepts: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/cxxabi_init_exception.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/erase_if.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/exception_defines.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/pstl/glue_numeric_defs.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/node_interfaces/node_graph_interface.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_tempbuf.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/fstream.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/librcl_lifecycle.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/requires_hosted.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/tr1/poly_laguerre.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/hash_bytes.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/hashtable.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unique_ptr.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ios_base.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/stdlib-bsearch.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/istream.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_classes.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libament_index_cpp.so: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/detail/rmw_implementation_specific_payload.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/parameter_event.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/locale_facets.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/unistd_ext.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/nested_exception.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/crtendS.o: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/time_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/new_allocator.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/statistics_msgs/statistics_msgs/msg/detail/metrics_message__traits.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/node_handle.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ostream_insert.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/lib/libpthread.a: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/ptr_traits.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/quoted_string.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/shared_mutex: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/set_parameters_result.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/range_access.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/refwrap.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl/rcl/logging_rosout.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/algorithmfwd.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/shared_ptr_atomic.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/shared_ptr_base.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types/stack_t.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/sstream.tcc: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_abs.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libgeometry_msgs__rosidl_typesupport_introspection_c.so: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/net/if.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cstdio: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_heap.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/limits: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/std_mutex.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_function.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libstd_msgs__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_multimap.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_multiset.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_publisher.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_relops.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcl_interfaces/rcl_interfaces/msg/detail/parameter_value__struct.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_tree.h: + +/home/cc/anaconda3/envs/ros_flexiv/x86_64-conda-linux-gnu/sysroot/usr/include/features-time64.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/message_info.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stl_uninitialized.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/any_subscription_callback.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/stream_iterator.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/create_generic_subscription.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/streambuf_iterator.h: + +/home/cc/ros2/src/flexiv_hardware/include/flexiv_hardware/visibility_control.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rcutils/rcutils/error_handling.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/uniform_int_dist.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/thread: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/unordered_set.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/utility.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/hardware_interface/types/hardware_interface_type_values.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_cpp/rosidl_runtime_cpp/service_type_support_decl.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/bits/version.h: + +/home/cc/anaconda3/envs/ros_flexiv/include/rosidl_runtime_c/rosidl_runtime_c/service_type_support_struct.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cassert: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/iosfwd: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cerrno: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/context.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/cmath: + +/home/cc/anaconda3/envs/ros_flexiv/include/rclcpp/rclcpp/executors/single_threaded_executor.hpp: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/codecvt: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/debug/debug.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/stdexcept: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/exception: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/aligned_buffer.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/alloc_traits.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/libbuiltin_interfaces__rosidl_generator_py.so: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/atomicity.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ext/concurrence.h: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/fstream: + +/home/cc/anaconda3/envs/ros_flexiv/lib/gcc/x86_64-conda-linux-gnu/15.2.0/include/c++/ios: diff --git a/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o b/build/flexiv_hardware/CMakeFiles/flexiv_hardware.dir/src/flexiv_hardware_interface.cpp.o index 4251942becc1ea68475fa1e76517580bfcace99d..2d4732857de89f9f8f5b8ff9e78d5cfd19ec8908 100644 GIT binary patch literal 330304 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 z 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

l01@=k*LDz2dCdI%6@feQfwRAU3(o$%3Y_|T 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%0Df-tV_a);(GmrHfDeaSP#OquR4T^!ZGjl7fSa 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

7u+B(WC^sD35afbr(t3{fubgTlt~=c3qS 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/dev/null || true; builtin export CURSOR_CONVERSATION_ID='7ba025d5-5ac0-4a64-808c-1ce67e3bb09f' -__EGL_VENDOR_LIBRARY_DIRS=/home/cc/anaconda3/share/glvnd/egl_vendor.d diff --git a/build/flexiv_hardware/libflexiv_hardware.so b/build/flexiv_hardware/libflexiv_hardware.so index bac94b6b85a418c722dc96f0027284bfac5ebb23..b2f8d9e27e70400d74ab10ec46cba8290341d98d 100755 GIT binary patch literal 1599400 zcmce4!{(mbbV(l#cksDwtOP&8>CX{1r} zAkjRM=F)WDcdqsMt*_JPd(J=ST(8&LH4pc_cJgOc((1ar`dnEzCdYGWT^Y{% zS;$y6=g*3|LiM?%TV3FPIOPpQ9_#o2mS{|F5cR9SE?!UXSyz$g{54j^z&RQm7X!C1 zE=3>cGt}#1KhPlhbcvYt6?_+A|A@HzSYQM`Ia2b^f;|Eowim?{;NJ+}Ex-|YPBmE# zEBKBhb{A~(z_sA_;0I!U$VX7;1N<}K8v+Ew-5&uj`0m7i~G^v6wbMKiK-C#t^b+qxLh{CL%tL=2}Xe zm3Wa+*Gc3t3ZuGh&{H4!AJp9eexEr( zZz--$tNVFNpiD=tN2vV-J*J?4G3xMii)NI<)(Za3&{JuDmqCAuJUfa{M4ckoOwg~C zX6+8SE9A}KJrK7BxeL+bC1#!qc`)Qh$Wce`b;=PT_A{;NIC2glrW~uxB5olW%qiZC>SU2U67vL+ z?>ORz!`_qDA4BthhMiGK9pfx9(*a-(dZxqXOa89VyCX*o-z3QTnC%7pV}NEj=H;H?}OU!spmkd!QygZ|AN@bumwP#j+i}I zZyxge&^HVAqp;Deg6DU8qap^iXFX)-@D-FKkaR&l&KR z;2Gc|^!o%HL5)t7&r@*VS0Pxh0&#tq4xb0*m>_mAOb?Ow1bZ+H{@1WE zItp73#br{Rn=A&l{m}Qq-;V6w;PYt@S?&e&I7f9fVOP@HW)mL)-+SzdDzG2&2-r7} zZx-TP!S)HTgzXI3JELDNz|#r%Q!q;a3@pEOr2DxWKm$+!p?C$SW1p zlOg^J;#<%j<q2WZgG~5BoDu3cVeZ3pjbdp(*26amd5m0P8%RCYp{_q_t%SZB@;hKHbVkR4 z0O-F_vmf9<|AZ@axov{dX@@JNuY*^JBS!B^kvkY)=&w%FYJvd{sd}lq1s(grwepBunztvhz+9r z>(CFteja=o<_t&94*28h%5!6}hxV{3V6#O|68d>T{*KsQKrO9}g>Rz$?tprX)&Uog z+ZOTN0Y*om->DNhd$O%So(g0+&CcAnF!Mp$uhz821F*B-K($!_XcqbyA#Vw|3eb%D zKdy8C=jS1+GZXv?;v~Rk~L#z+b7IoIqo*qTtJ%T-9aiM}* zWvC-Ud=c_Qg6l9BH5>sM`y?0R0)=g#9+;0Ge$N<*%k*>tG**9+y#L7UCPCu7Yyk zA=eUiMyqKrN;$I^F1^LMQm-R*eGprwSvk@~G{q6|jcEbMvw(&HN6>7afd;)YG z#QPz394f`p`Yux3FKSYNTrq0%vvDMdQCqP{SEMC*TZb>j;MhY=01U4K@ep=cy0NxeVJ(^vc6rj9!6vM~}7C zKb3ema#Z2VrS;`djZ)-nry0EHS{0M85V=t#kB2-Dap{!LQQf`pzpu9jHisqEa!1d8 zScev{lV)rS`4V#0AontCgQ;dBhQ^Ty0zz`nrmH4*N;id}x-ff?ho!C!>Y|@)`9(-Z@(H zC)mCs*B!Y{5SK-HbD=xH7h9LYtwDTqU<3TKG0RYZr^U1{zmO9Sxe@A5Cfhy4bwmAj z6u%xZH<0L$TE9_W5A_@%M*?G!(*m(=VDp6T0PcbHOad07CQoj>0N#b_enZS$LQU!P_mHW~Jg zh)97PTCvpoRpM^aL`UkSLq+ZX^t37&6 z04AcwAIxzD@$V2nkYeV-7Xf)Kd_1W^E`w4FT)=FF;M1@-N0H}**wgTb(M)jtrE#$D zM6FuHA3$s&$@Dql<;EXzg&q8f;a2Kpuo8qSs z--SB5kgXB37(If4Ak3If^?yTNi&^eKZ;F`DsH1~;2k=15u^)b=U`@7yYcL1>UqjEN zwH!o^^FV9#=ztn6P~!yCQRg#iYyj7UZ!F{>_&&lX1$b%?|2g_h{6F43t{wej0 zLLWWkiK$;3$T^V51AURx7CFI)4Fj)6o&J!&@x{TT5YH$I_DhJFi`tAHK;Kv=a!07P z2F2Q|1MOX|Y@^K%g9xeotV_<|ub z>LTc&1DiQ&cp_#8`UgN3Q4bbdMX|Nu?J;8&z^Ffc4s;NI6SgL(vy6N%A&0^K5PFGV zonqvuQoS{_53H6PIq-i)z7}S-fX|Nl zMZmWY_W8^Q96%f+E7Y9@Jr6iev6qp%8Sq7ZCG5Q^)(!e;l38v5Y6|I!K?)YQ2r>4^lYvLF+L&iF*iYywKugThA6ysq#ezIj>XD9mPidx` z$df=W!wii60GX(L0J)8UVW=}3zLDTj@bv}v1UEpA0sPHTD;c~8Y>YlYo(11l#Klm} z;ovJsZU;UUzD&fbA@?j~ZNzs&UIDNi`XPYPXJ9+Y-pFeOeLQCS4%-Z@YY(l5#m)wH z!>$J0#rheohI|w;#lSV{U+2N+0x^qV*9P}R|Htt6qk4vri&5VV^IV|)+kzNIy}>6? zt$mnPxw)|y9iW{@6*I(~>dg#PjHH3v_G?Jzi__Y_~J;on^JnFO0U z@C9+sSff4obwS(_>T8L)BJ%!3?;nli-Hr}MC#Mvq^JxkPiZnD+wN8~)~0`yS+Ds2L2- z$Q*WO#7?CB_yq0^G@xE?H0NpZPeXh@dbL7+f7A&>+yLs;4ZdcG_Xa|-k8@zxKulxm zr3%}dy0+YFvT?{s=VkaDkXuE)SZEGA$t*rP$f1>||6mOagMgJM=uzJz!n`rIU6f2_4V*)cYW<_rI-W41GRlVsF~eKK(0p7wwZheO~S&o~KdRcSdIs zlO$M2lREQ1f96mQbM~hhzQbnxUuI}2=vTksIOH49TtZ)@;IlNSp5Igu$Xd=4`2A_N z4Aea-=(|bqSz+mG1v#w*>*h;;#NI1;<-hO^sK1-vTiOQ}It;jinq%NwEXdtJF)6Tb z!{EzkJ{kB@@_7mBu+&!dJ_9T3?Q!pV@qD{8s42l79-(#q!aN7z%%*@-;44sDA2Bwx zh9v4W8nG_$Hx=wr6?|*3w>M~i&p=;>xE+);m^dpx4Kr1vKTjr*U&6K&z2YH11#bX7 ziq;~f{(Srz^i2WG03Y~FflX9D6M4JQw-z`ET!#J?_3G0|K}|Qva}l=zapO_P6?iUK zn?GbD#N;BTn$|Z618Mi(We|fW--$#=L_{bC#b>43Aqe82mUe7PRd&i{~7dL zNNZuaX|zTI>c1QQP+`$}@-Tdkw$dJTrd(mjYWVM<2BRMW{{gDc?8n%T|Ao>p-+0X2 zT`(sLUqyN#c!Hpwzd-(1*<*KG7ZyM@$@Y zBB+rq_(DM}nK?bGv+W-~7PA#IxM6?11bcLrN+9r zqhKG5kkg-PS%arhybbzCq4q<%HY{X9y*=Je`aQ%nf`5*n?qHgq<+UYw1^6|@1PS7p zzbEv>dNyX~shMEi%+^RS$8oGFMsSTk3i`6x%zx|&v-8xpUhONW?FU<;VBeOaz7HjM zQ++S!YfyU__GlGmZv=Y`a&99wjOJ5dU#=sr1MJ^np8$CQ)#>xU%yl2Wu7EGaGB#Uq zodsrY9qf|@*NFLQ1p5&zSlwsKJZPvBuHBDfnGsG{N4q z7VPy~*sb_r;#C5DI{fwNG3qhe!p~Kwa@POYD_e@)PBDJqXX@=iA??vCijBsMGC@oq z}ZwGEzZ%?W8f0#XTw^00fvi`tqOR;WC^cX;EO8rm9{}DzZZzZ2}L%m3+AC+SkHazU@hsPW?;YutgkY^nY|!F4%^+zj}h zP|ojq*QEjVSWkQM1~pnx>~7+Ns9vmK){e0GAg6%-JV_~^O&%(k_b1In?0+ng9m8LO znj)HkIU5OP-!E8aA?$vLI|SQ&LAS}9ci8pRBsB_UxYo<7VMJ;;l9@P`^)t{o>@1isN!#|CR00Ayjm3g|kqc8zJj zbs$Fqr|8;52x_o6MqhwV@HYppp~h3pB%!_g8-O2o*nZPqe?g7k=-*VZ_Y;tJ0H8LU z3*uD-epbhp*4pZSxgLB!I|%(~jkl;y9P&Mo8^8yFXV9A4QS4&OJs0y`q?oPzK!Tha z)Y%U7fNzVyejhcQ+1%K>tMF(4W3O1aJA90~&>juJd@YdElX`6g_kzyTOqy|mpq^8` zJ%|zbR0Xmw_0p$!Yv^KuKfB&_@}&4hf*5{|?y#x02@qkT)nES+eb`t|BJWr0K%f|-XS-kH|N z+^4WUXFl*BJQBUvW0n&1^hJ+0n9-i*WZ}($7qo{VsM~{P`&)`;ODF$do8ZSETGvwW zZ4|4A+A{?)yx0ge_K~7N{r98aBEc+ttdN&u?do(5dHWLdOQe~$!M6f23s5JY<_X6d zrVDafpwCD0odW+sg_a;E3g{r%PrgS3vTZ?pg<$`g|5Ck~D=4;MJv(1ZhkEn+Gt8Hb z`3kUSMKC4-E08nCT*^Pz%*Wmm zegE1o^D?6k7XG+S5(Qi-2tNk9G3148q(`Nx3PQeIe?P7Oant zXM8vHX$`)K9FCZ6q%i0o@-mu>xi$mY_2zF#{Y8Sf?wF$#b5sas<4f;B{t!VdZ%+`+ z-JLfQ|52|e?_O1}eyE^s9AvG3e6AMLH5vUg*_aU2%t|jZ=o_ei> z?}{Kt3Hx2aTHZpx2mf)3XStEkn<8e6z;+h145Mpq4B1w&=3m&)Ac4+mtU-;n;FYLx z_`iHsR?%FCkUL5cGlteN820I`80ZM#gT5UEd-B(TAH9Lgn1QEzw1>QY0>UKJd+R1`*dI`kChe;N`4*UMwV;j>;y8 zaz+Sd=X(jc5o%7NwKMxMivNb%bD_8Yf5;cssus+1L$Ka+2vSmy?*hA)VBh9p_TjWX zR#S@#kH$KC)4Is?mvtdU1AYZvrxAkw%)RL!vzt=P13^t0#U;b{Suhi;k&byA03p;P z9J~;@Cy`@9HWt@cP|uX=<)YpL;Dcbziv=>v6OtCL{UWMkh}vV}^asBTezo3Q!Gg67 zM9z3&A%T35^6sK`Y`xExAnZS)wcr}K3)aU1=3p)VqP>Dyc>is|I?c%V5^hT7su?x0sg8D3^2Xrs^908tcsMoK5^kFe3SnEc?o(vJxJS>p;dgiqL z&M*xAhyOA9{Snmj!2a#QJl_Os=4<^w@#U1WO|a+vAkV?fRf5mLdDMSa?>cp&;-|3g z?Sgz}9!+zn3ijz=vrHANW3OPXuSwoT{(eZ#M4wE-=Z3H6OlvU241W-_UQp*2^v24z zM^e5OdUl2{pZw2Z--<*rdZ!7lX$^WjqnKZ)pABC_T7ScO`@4wjtbfaTpBH|n8OU!* z$~nPoyr1zhf&CfP@j-1}$fpE7no-hT%)SJ(*a_x2jCJ(+$F&^(k3DKBsL4vMM_xG9 z&ihCFIILkh?a>JIevepJ(wiZ72hChe>lg+9BeJow&*&O3Iau&{-!16XRIrw3sQm-j zL-hur)?UFL9fN#CP_vTO6OXtZu!jhGv!3;7EM}fZ^E2NKf$S*A9f3Y#>YGOMwI|(x zijIf=204|28qDioSIg_`Uhm7|9I zOJSCG+_LoafM%jZadUUw#&!zKnrCaqi3?Rk*2bK|OTvjIu9{-0>#E*2MVwT|Ih%PK zZC!5DC( zpngCT3704xl;~{56=}I}^0qD#IXi3Y;=+}VHQg&#ScsLYHRX|VBiw5+b=Fs^=yD1L zCl6MLrM6byfro>txyNFS2v;+=RGt3vX4(?Dmfr|& zW}!^WCR!PB@QRCMbj+8Xg#Q=2hdV7i)8%xQ4WBDuA- z(!Fh5{7i{!k(o%2!6jOp$l6)X$+e6^bj(F!992@W&63M!aC&z+_Hma)U}sf0g$*Z7 z;#||8I%7=Hph}BI`jaNC5^1Fmc9zIEo$gABRNhvchF4Z($r>n6+2GkHg;Z%CDN&cn z-JCg@#~IE@Kd}MkFyfR79MY|sYQ{<821_(Gb)2>S-YL^D;s%{jSl^8pXfNq_y|*|9 zH}r57)e^mBQn^9{mu|OI#dS|Z1N}IORfhIfO-@%|m-F{d>Z#D#;N4oH*u%+`@&I`{ zJD07Zz%Oo!K3tG9Ck>FvCF;wiHd4PP%19fLgN{Qz&D1L!D<2ISBImrlB^g=n3Z;f3fO8F$rg0*P(HoRk6mXIQ%S%i;tGdTvMZJD`h`U%ysfM8mw>4MdE2x6*IXC zXQ8Gkkwv?3uDv^{T9?WKlnM)OpQ$8o%}O;EA?eFrpQIBn^|Zn_pPzEk}IRsbnprA&W&^Dq+_;A#_8ZQobD~Ql}ZwWrA8vLu1LwgW^oBf7b&bciA<5siKI$} zk#ct=-p-SuY96P8Z}Ik+i(_m!vFXJjsv@PNL@AaZ_SQ7;96Q(|NUn%fswzZM*Y^$E za%P;gH$JL|T#Yz0eCOF3f1D+n&ZbFG(g>@iIU+R$-lAhEmUBs`IcJ4~G*ZzfJ-YCe zj$9-)lgt0!s&K(GI*G=jLb)U_##W}IX>C!NsAi-ZY}UF@(gseaEw>#HQ?$}*EHbr7 zT<0iJm|H8O+$_YVN(-4sfmF)r8^y)R@TVs(y|FBELV}BCWb25b{jurkaa!WBXEH7t z%0wYJ)Zh|0S*oEX=Q0(}GUqs{$`n=ntrx8nn@X`ks)h1mBhwjpH3$AY#ySUxBqOF| z#@UL*TDtmEETs60xA^ay({#)v#cKMoreaYI{tneYrF4-iT16_A6R;0)GVvN?d4w3- zfX8Id7)ewu_=&`(pVL0FvZDA(F!crsTU8?V9P(<3#-??=%}{LSy62x?-g z#hLYLT`1+6)^3fMAWu~H@la@KauQYjEU|`MF7uYEadMg1$WHG}-@>^{P9ef?%%?c1 z+(yMlswl!yoCsN>r0)cgNY+cl#hZF7Ebe=|C?xTo#&(k3Vrx-E`l$eEL#JlCB85an zfe)`NTKV_+88Ihwu3VLXzkZ{xB%YD(Rk22NiQG9-g_FBlSTvLy?cVL8YlW|XC6x)9 zE?RwMK{*z-3Nwj)x{~AMrV6oI;TpNMt4B2csj?BxvdQx9ufnCv(gQdnJMMabhEhjG z$`vb&lQ}C|J<5?O< zNg}PSoGl9jr2RUrz+ayh_@gDmbHf8UgM z!PQFi%$y`Q+u7sqxqicRm4)774j(X1ti=vPNcCIEce_#N>h@JZz2(a%x z8Tk+&49>p8^#z8Jjs15h`>u%pJ%F7fXJ@YifFNKDz|(kv%xn{(v-3Ao1oo+r`Fr)# z1@;+`X92STcJFBpz@8~#&u8%8G0%t0(*nrh0(~*bO7KV^3Wxz>0Y*!};{aR|j(s<} z65xrQ(_I7b-*KlvP6O5h8vvfzIYyq?@Ac^dJp*zUunoutasWoT#M${1p7{S(-$}Mz z0w4QtYj*#iQ33IN#P@?A1P%em$aWn31i*f$DkK}rErNWC^wZ$y1ioU(7X?@!Nv;L|0sI7h0e^tMB*woF03$VU{{9cs`R}wF!p`oq$S6)1 zTn{h+49R8$&c459zgsh6_nu4vGk|~gp$%mIca08^8QBo;NW9MaKYw+^S{TJ2<#UiUj!}zmw_ulDR3RQ3ETk~-6hWCdypRh4+XXg z$d$k&;4#^s5`RYgIrvMGUlD&poYiGi4gDQZL-r5EKZ1WIxh@ia#s&H}$hD;Z0RIX6 zBAvzmhRn{6r~&m!oorHY_We13rjNyG)r;3AoqcyCBbhxTU7y(5Lp?xW;4^^C&i=6P zvg;E&8_lSRz}HkDGhZ|4&Fk5iotO6Jtkk~D-?SZ_P^aA4h!1n_Ofy2NNfG75>$#LK$*^0nV zk$jdoAIo?#Y$X7DR{1h;1z=PPehs(|+y?Ff_kc2>9C!#+06aY=`I*4Rd@rHD0$u}e zfhvGeHSu@EYly!m&SE~0{E_%4;-86s1+N8ukp7$aA8?U`RlvXb;Ox0m{BrsCECYL% zm)+Z9?*m}p2{!_C0X={}<7EgLUzc(0drcFdIl!m|xG7*xI?f^X9gIoqY0LsZ;LA(KL>wBGGF60^fy3NJ^MT8 zHDr4a{sH(*I-mOm`gfp~>_5Rps&!s5ai*z2Rt40^CIx5j3u5;+|3&QiGU2%@J?Q!X z|NJm}uLDoUklFLA%>ed%Mst8azaWQf3YY^HfEB^{~kfDt=$#V8bfA;8WuE(Rh2 zo}wT}1F-@dJCnyK4t%M=z6|nmAW>jraY@iu0qptSwdAXR|8+g=8-R`EXJ;2S1L;5p z*;uVi$XkG|0voe$gU;^p<&vG9DQ1)h&dv(%0`>w0z&>ChzY#m9i7ziX4S+q<&4``f;EA1EW6!P00CrYS7hvyHV$b%nd(}n&JBQT-U}x9a zvsH{*fSUqlfH~Qi-2$>T&>fM+Jc$eBUVtn4 z*u85;?74b&|J5DnOE&)fG5w)?k&T_@V$UJ6^X81$xg|ef7{H#(9R;vw#dz|E90-g7 z#tQ7gkjDYzfe8XT%VTE)7_qbdQ-SHgOtOW5&jrGOc>sH+a{<68ocLn!2$GpS5^@v} zEwIHwUJ5J&5&-rbB|Ep51SA6~Kq`<1u=~p!0Ct8l1IPpzZ2`{$wvx_l?5u7MkPGYp z@&KN83FJMH3xIvV0pK8T2sjKdI!gQm@j~K7;Aco?ac4;*Y=|15bdbz%$?l@Dg|nQ~}k%dq7AZp??wBzLNZncr9^u zhW-zeaa%(~_mm~zY5=>{p#iXGk+cCu?5s6=zK=Z@pa&QLjRAJ{qbb0Xi9qIU?A?Tn z3W3gS&d_@S zu7DfR8|VXg0F2o41nk_8C(xg4%+Agdc#}SmIDhun2Rb`@=}UGN&&Ut@aI&%YFtGPs zu=nc(0D-_bfIT}i5tsxpnhZV#mFn9#B|sd&&O{^tj8=g2XX29}vvZJZ0Cs+l(OU2nAQe~-Yyf!L2ze9f zo59n8OwzX!=g%PLke*9?J9r++JHdAWyMeuAD*$KD9UUZ{?|Dd|vvb;vj)ET}`2_e$ zpb#h`+bQC8(fG3t{hYv70{J58m%uLrSAbIBI&cHH3ET$i(_Pr^0r!D2pd4WI5WE7Y zB>fTiQ{Xx2EanB|*FZH;1AGE_`V9Fi>EFP=ll+S~e}-F3=SkRk5JtG|&#~tu8UVsG zq0IO9h9eU|jVQiO!=HQTx@2R|Vz76*Ffsr)B$3*Z3o)E%-D>FjwgM$X_k%<&&` z6UfZSKgZ}!_I}_41To%_2a!IQ_z;1gFYF83FtW4vRIsyj{P}0xoc~LK#DjHKpsccI?{ z9s*B*=K!OZ#9x84_p!Yp{VjMEPz}_Ojm3X}{86BP63Cw+e*wOc?K}7n;1}?l+30MS z2%NoljXk4@^ELm2*n3;qdwJQp^@ad@zJWda#om=GB>w$bO<`y6n`7s4+4~pSv(4<8 zAWNVnz|JPO2H3mzd1BA-vv)u+V$Ywl|3`?B?4h$~BiXYk!gu4dcfc{?-$$u{?hNz- z+{nkCk?TV;i)HVNW$$#WPwbgjZ-9S~E_;VOd)8e@?ENe3|K(JlhQY?py|Z@`u=fS{ z140Ub9z?dW;OyMt1Yi=`*fYrNy>Qb3{#hXQ|2PN%7_tB7P$2}A)gKrFBXhyxfc1846$Oa$0Fh8XeBH#3?2KR{A}G=RM)U=zTef6M^30F1JT z*J=1~XXx92PHPR5Mr`O67&5&15fkkl=g$Y;i`SekcJ*?qN&4JQXM=&v>sZfa;sGvu zGSZgoN10`gZla7)U6j(z=}7~1 zuj{*Vatw_RpX@tKvAo@{&i#fQ`Zd?1?}#whEDdFY{A&)o#(lb;7JgQ%e5|oFSNmdk zK(R}$zx(~m>xPdOjZ(P%K05tM+o}6oYHXal&1lKhdru~ndbK-R5k7Fa)7_jEU&oA{ ztX68*|AX>_)ratqkzalpq!tEkOtyM!I&_NK;pw{@OOuTju|KRXKL?%s2+-&tE_elYAo_{#$u??lY$=bO9Gcl*@0 zcV9nwV$h^fp278mJeBfv?$OL!zoX?Fh6QgvBko*TK0~#cmR)q4*aqF!Y$#tnw$;as zpZ(mu+I@BZJy*Yd8?$@PhpydBe0Tq{m!6(`Z;yIjS~c_N{eY%cJ%+q)dF}VJf|+)s zo-`Ld*xfTY_(k#a*GlegUVG(| z%gtjC0(?>LT%LwfL&bPw;~v?C{A9>%u{NDcfwzWY|MlQQEmXo$~|E7#G zjB#8&vy-Raske$s~5QC%UkXYz8&g6@m)zv!sW!tR*Q<<;B=Mne!g4oCN}-!;b}SRLPAj4v~u^U?{;^4s*5lyR_98A16tgu^NjLts$b#}5* zbBy!9wsi>!X;(eSeClb>_dmTF**r|CjT&ClDd=mC+wn`4KHbV1S-;NQ@aVO3Ws3Id z{9fZj)`Z`mYP0%4_^M5(D}Em~(>IElIHN;(%Zoo=RsQ;&9PZHba_OEREqTm<4UUG- z8o#XaRbEhx@3}2Wo>o3bwC?Hr2lFGxyLTNJ?r~&svtA{+5);c0mW3&j&olE@>ssq2 zH;>*h=isi)l zJ@DxB=W2&G=bJlgS6_M7Z(WzD8x7(@CpX!5*rjE~4#V!tlXkUwV>J26$m9XXTJ6jl z*uBN|Ap3a4?Dwf#TawzgI^h^3Y zhwB*V_eL{0Y45?T7k4JuKZqN4WkiWd!hsid<#(o8HS4`5OJjxU6W!ObX#t}h$5yO+ zaq-2N9=o3;biVLe!!l#$*4ANrmX4V_N~?72`xlx=q>5|qCFeh0-xhr9d&Idmma8-$ zeC=YJzy875#nBCK508B(HvTXqbKS}UQ{Cyh9Xmb@A2{*4<+RNQ#%-K2wT1M!-Wyl< zA1fPu4_Ghmt=?_KMYG8HJ;Sn}hU(92=9O@M%8CaM8a~!9Pw!??)MdtkAf1P=LSKaX zkE>~Aw{Cv7*!9PL+6>vM^6~i4D}6S+@oIIiaB7*4!5iHJ**~q1|2aL%Oz-MA`>0IK z9c>r1k9*N$v5wd&-m%I1_boJ!G%pxxxaNHIr9!Re;yIno3J$(B=@qXpa=UYJ_T_!s z*SIdInfSuMcAZ{FXR`+TPo~5K+*-DIs9MPy&nMUYLY?1qSzPwpvE|A%S7{TqhqA-t z)q=hc3i-VL(!|QZ&S|!%r|kc5aqL&Uz<0B@=Z^l=N26PaUi7>lpEXsR=bsx7jKp{43BJo&{I95#nWw#e;Bu%KO!#8Exe!Gnsw9U{s*0#$5ymW zczQ;|WXR|alXMFT-VFXT ztGe&VHhoLCKKoMMwuf8P9kcx>Hd)G!Kfk}xs+0TW9=6FTGy8T6nR-2I)X(ciO*VaG1Z!^R(9`%va@_*nmJ{H3v>yTjsE_&@h6IbYDU zMz_(nUI&&9|9M_JrTMIhxo(hsUf4yh_B-&$Zd17|`1uvn{sGDtnoI95&UyXDCO;wf z;HIY3Hn+^HZSkh2M<8c;qtW++Cp6YPzyWlVM}~(l zDte6=*JI=6mDS=ojf-EIS=!dWB;8HBwqjjgd4p>cYrP603a0B{TJqg)QImEb_q^Y1H$|+IAU>VCX}8{% z-qBl4!biN3HtbN*(DrAK5QDUjj}yA@xD#8^b>_htyUZ8HzJI>G{CG@_`pl*U8Ai|5 zjUM^Ujn0^IdF~GX$qvi9M9uDR>)A#pWbx*^KPPy%_^#E?bH>)%nB-@>{uu8n_^I<` znTIUUN~N_yeAfOqSzm9P8Qo8Q|L4Y)rzcMrsO7~4COgg-NByW6sOf#irSXIIFK*ZR zmixNTd)~H3&yOm(FE!^Zs(o`af9B%0%k|D(OdAkfWt3a(o?~$BO4BZ<)%vVCyy$b> zo6RXrs_!t* zl6N(9pIq}9wMQt=JC%s9jx#XLy6Ef8Haln0r!x$gK>J!bq zR=(I7+-mdgQM1oU|1_J~poK@P+ucltKj=_hTbfq%JGSQox$XI4uVp%}n;&$365{{tWJ_gy_IK{niRYOYN)kL8 zO)L92zqt=;zv&*4aN(>|T3)yD)>Ai1Q##H6mKIkUKkocDC~uu1Py-C~Rr#L@32 zn0Dzss^V4L?!H7f?uLvUHG9OiG}LYH)Gj&c&&%rC zlg84KjV*VMUuN~_psRS?LpOC7i<|)O{+|7p%lECBu}Xiv_l89ly9&pw)h;XBwB37- zp7QjBQyN)eRxb~Tl|4Llrt8XH_A2wZwOaM+?VrAr9resB;#Xwr^)z&i@I39)=>_NE zE=?b^@uy*z%kzB7Y90=sEpJ@xGGo-Qw8cZe1O-{{YF4z$ea^+~h92E694V{PFKE;! zH~3l3pgGT-Z#U@l-9q+td6=hP-b}@s#&g@%_RN3TtzG-fUU%&GmsD<@wPDxsB~6+P zU8=tRXWrURo1NCEw;6Xi*7n1;nkPj)M2n7BRp0u3cmMi`h0Q1Bszt#N;M*}Z=UyTLWX zXPo>t-KSx?*z|jGlsqZJZuN};g=e1RMrj0?zBuu5UgPdxR~c_z-`zC&_v?+XOe(mu z&x2m627OwqotHQ>XX^)(Kbo00%+hX5ITiCdxOIoS!(Na2Ilp=1el`RAG>Z#VdfSg# ze*E5?x35?J?6`jTw(PI%zwb9+r|)+lGQoJwIcfN}u8$toB)p8sE!OoJA@e&j`jd8L zTFt=jPkQLx`M&RD^$Lxt(`P)r)(g2e4!M zI_J;-edlPBdQhSJw%zMpU+qpP82cqZ)@4!4Hkp6=j@C%3o%Qrc^A(=IY}1a}8_wzz zx!HGGufs5%>JHfT2Ex|w&tc!k!CLz8tD zbk6xO;#uyIsihIK#%Wv(*P9ZPXZ!frr9NZ6M6}z}Qe)(-ZAP9=oigrNk9)PCEPUXA zk7LHZFk70SS*`rgN5AOti>mOD+Uq&nTh)GSKVqUvb-?4Zd-lt8_m7IMJoW0;hjw8R zo;TEO1D21vG`%eU>=%QvY3&~k(hT1Az5C+Onhr}^kDqR}d-RITTN6uGc5*E+8_>>A zS~`@gasFfbMl0E+*X``1r+#cTc1m(QoTy!5)mNiH?M+tG>62DeKR40$Up)5DY!&~G zo#ZVl{r!HHhBdk@zZpN>DlT~5_AbU_uAa;;l;1V-v{Cn*dtE-rq*F-9gYYjSx5VxL zy`j?aQs4beoO&r5FM5DuxrS@!*K91`s&GgM__*iLmI{L=#v?M!2Z#Smz3_DLr~WxA zlL^SJMT-4&OX~)D(uefYYZ18H|%rO%>qF3G;~fXl!)YsMd*efQV){F`3wWDSO`nrtDPGQqfE zOzDp?WAnN!$<`=nWAD|sa_;UmS)tdbingpgwoJD}*~8e8GuoH7d{fd=+wFZLKgXxF zdlrxSWaJF6nE+1+~O?f*4VF@Mfn#g-@XE?vF6yk@>L(GQ)!WK3dc z*POXO3?F+%pLu1z{iQ}=*JA_Y2G6~2e#YIQXkI_xi?ec4Y|bSFt)EoxZu!!nNrq-h zj}~)Oo2BaPGx6#i-6plUIM}<%-O^r8VQPs(3cIb0sQKQZ`#aC>>G3I|sKPaSzIiqB zXk@o!!&2Yl4Zc?TR?X=5>dW!C)7p<3oo~81Yt)lQMlmtwS6ni_|4zO(uYb|V);)%_ zeC%~**3+JeDw8&hG9SFQWS9MTy*7vZzm|lz$+jvz*RxZwg{;7|FeSKh-@BhL9KPNv z?6}Kdl<_6!>Q}87Pk(+tZ@|f=KX0_H9@^rp&tdsF>!Zm3(_-()Z*xYwn5;Xs&ZuWd z(B|1;4UVpm=BFOdaQD96x9#PouYb>f{J{ON+wkr)La(*z`dj^tMZZg>=Z{;CX|-3o zsB-ID*Q&hp>!b6B?sb}SKy7!zHf~SvC9d=B(<;)3wwKx;Z|qQ>eAs5H)$`({cCJ5c zryprQ>|th$!!=VEg(>6{N>-oj>CvFW@|W*Bn|W2gnS6WPlaUL0pEhuKe&74l62q9W zhAT6E{ITyk{cBZjH`vUa#`jouw2ggFWoXOn`=S21A4^(#W;$hCb+te3{Ie|g9_sa* z<@0fSYVU=8;#!uC?EAhnbYD!zj;$^YKWF`}=zOMCn>`P4c8T=Av5x!#UG>0W2A-j?k&yt8vw@tSp~W+uNp zd)Uy@p@=&cuivcM%`UcGUuuR3Rkh}>nqS-IufNr?g@3m)?Lv)7zRKgHP3>By&6xUq?=J3& zi~FN~cG9nbo6fn_B;NdfWxG>$)}-IHx5Ov1PewMA9}T#E`AVsHz`poTMLr+n+Z475 z7B{sX*Ew^cqt^CCea!8{TB3KCo;2hxJn*r`ntmxgZJ;RrFCz2qe)=ptm>Mw za@8ZvJ6m^s-h6>!xK2f;`-RmhTb=v-8uiJf;GntW`O%flPdbX%eV8`tU3Kb)s5hqX z7B|dT`ry7K;`V~7W@=kDrq(*PbZluk$B47B+i@kXLH4dQ-`-5#s9E(s#D4R@oVeE6 zPqkyN9SjQ#d?9a~q1-U}ic?^yU)kKz53g($zlfVT&84s8z$wRWThM3Mm$DvX6(9Gs zx%K5_Yv`5?^(_hA`tC<cVE^&Yg{W8JhTaZk;3qjZh@ZYA$MXzUVoepvI*TSryojH?~I zezN3Y?oio)gm8asRlhefQkxdET{k^gt_>p{qxJI_}|m z&HeerTi>URex-09{_NM9vF5=`n-`4>v(I1eGb_<^;*TJMukKxsH5jsfa-c)Uh8Ztg zsAyi=`m8A2K55R8O_nW=pHBI#U1Pp@;*NuDPfYLf`oxsNg5{N?hV49^dUj_Z^5tWWlU#VtDN zHdK%Cz5JjsXU>vLP4NPq_f9633*sXdpPm=Kc4_B#(@u|Qx5d&(b~&)@eaxYP(W&WS zPd>bu*ZlqaEdxS-_%}S#T>E~r{sY^c9CR_}R=|MQ;yF1XGkc85(^y%R>bhY4Dc_&j zB_3-H#%d;=_HTG_u-zt0#{!9i+W*Dddq>NZbbsSV99he0&QueHw#8?Ac)i`H$?Mx(3a$9oqSS&?i~1+c+3fMz5@)83YnALD%ePs}2QJ(0EL)&j z`6a`5{5mj0o&n=y)2A%jI&0>+Jqr8s&k9a><}EkBc$sV6){NObz&?G|=i?7P<{j^z zzNT#Q4yy*obe-{PV%yP{nSnh`4}Cb=`P-=CO^%$&)!@IbyIh_M%iqmy(r?ZmaUJt! z$@AV7cjt%9O*bVgx1@2u(SOt$b)w~uMgQ&8vP;?Me|ObcG`Dr&Qv0`S+r2-PdV8O2 zKb-F|e976)y(7k5C{r$?Mw9HDI}MoToj9$}(tVY4v~HcR$nxLk2R9cVGi_nrWRB+5 zHynDFpk0PW`)ZGvUZraP26yLOxqmpzwG?wB+m*RnxZ>BB3D$o2b8+5AhaX;VFK|~i zvdvghF}l})a*gkmj*OX5Zb(o2moL$wyQ%*3XA8YQSF~!2Y@3evD05KIzjdSjixaPF zWKBEb+LmIy7UiwB(@}Nf$Uzm~dRwL$(zRRL?U|~#*tLDY_|lcKl=oIUdN|PTVPvA- z=kt{JY`K1VZt~Z^R~ugGzxrv5)|z+b)t9JNdunVPG5g}0#&cdC-*aV8*ZIJsiIr%^xvIy=JjM- zZaj$W|9NPk3^Vq2%6_BU-R4(T70eLqSmCdK4^%$&C1U87jN@9z-q>ufwe)LT)eMv4 zCt9@F*Y|YZF@;j5Dwe`Fyx-`$(>GN=lQiM)gYHH4T6AGtmV>Wu4eqW-S}8UAk^a?ySBsyAGTvIjm&otUX$;de*K>*~r+&Ey}xhHu}d~;#RxJgiRJF zyOy-bq{%&w&3~{tIJ5ZLG$RY0O@HzJp%RY|4?1%?dzwwPQ{}8zuvns1jti9+_G_Y}%ykllfxVGg*fn~qte?Fss@-Zok#os-Aa^~5+n@#xiY5I+iqY948 zwEOeYY_AVIU;pQVrBhSJ-`w`->1~2ux*b`Hw%FNr()&60ceH6c=GV*iaoy&WdbK0( z%%k--6&tW_?%e}Vu0F5&YGK>Xr~mup2%Q;~UOQbTPjv6U{%Dct)%!#dxt^w<^tHr{ zsjs?T8S=JAqtvq}KU^?rU%_NG)(noiJ#^B>uFikPPpzNz)Ff^G(#4JYT&p~yY>t{s zv)xR$?A#6UzjKG?q+HWr^x$?cvwu6E(Q$D``37yXCmrv9``?ZsTd+NoE>$Qen zpPlXFpd1xb{bKd+iHNGZ=UU&{+kTtq>N=%bw>ck*Uzv71Ns-xSIxT)a`EmcEZ|!w5 z)g4@U<;k@BrsZ#3uu6wx3u^B<(>BxPQnR|I9=qjf`;Fe&p$7Kh^U{9)r((KFC4ZW+ ze`x9?F_+$aF0%XgBquv9&d~A9n$n9J#2h<5wL;s~U3+JnoMNUo>RIB7hsK=lQ0K*$ z4;^jqhh#Z8>i16KzyGT=yj;5Ut^2%vcyQOoT}LnOs5Ik;;d`64{C!-$k5^+eT>Y5* zY3(8Z=6JiPf6G<#{>!#3&F1N&QtqyAZ~yB3+M{X5{M8}DzzH)J?7jO#?9fze9EC^Z zsP#jY&g1*VAGWskmUsOst#Iz1D(nUkLmhg_mkq} zUHR|uM-vl&bj_{$Wc06FR|oReo}Q)Rs~tmTS9&<3`K=YN_kQ`I&DiMI6Iw5G_&=2B zIQZGo`jrwe?!c=2}>c$)rlrGM7N&HOF;T%p}N78MwF?d#_rjV}E)EX$UI&Ep^a zBl(ewC2D`^vZzB>f8uNp@1^YalP!CKh{~Ujw#|{$SMuLOyVm`E_*&mGXO0(~x+=8Hzx-hi z%ZTLLo>aPe^2o-MX$Osq&D`l|z&Y$u#dJR{4mBuKY23m?`?4IVeXIYgOfySP$WgKQ z%958R&i*THy}r#mq!^a&y=83gCAo5!t})|>p54dRt6q!(R@2={((mjq# z{xtRZW8Lbd=zrwP>jagOL@lh>Ysk>Lm$a?5w=Bt&`1#jt8>bDgaV)a=`vuL5ew$L* zSG7Q`Z|g&Am;N!Qg|p$HE}0TH%$4Wb_#<~lUue6!(-G}us)_B-Bx{xTPPcO-U(A}i zDSw^lM%k9n{e8%CzqL~Jn~9dpsgU+<2mijGA}4IknloqIw>gd^#p0Ffa3<}fO}4nd zXZF9_=grI|zb-w$Vb$fnFXFi-My>nO;==q?_a+}}TeZ;8<}HV2ZSgYY-hN*nH80TD z{&YkzJpxp8e|1 z*w$}~tm`u>ck59@E>4e^Ze79TgPRt}Qf@=5JyY{1-+Ewkp~GpbRw_Mz|3Gm*qu%}V zldqM2r(fY2woR-k&heT2TFxuZ^_svFXNhNu-)4?Eo&QC}H^ukQH>Y1CgE{^3;`S6X zK0k{~$IRf}#3ff|aQ(Y>Gx%h2>7^OGL$o=(Xc#($2AT8UB$qjzz3Jka%6WVxbGcm- z_XwEr*(1F<9sSZ7tBD>5gc|zc-*3}%Ie}g$ZaZYnSTZEBk!!Yo)!m7>W zFv@N&w=?46VKe-6Rm|~oipvYk@H`@V!Ze3p1z$1D!?=xWYS^TOuv^T=dB0`D#M|Rd z&H3LMZQgIABIfXH!Vb;GwNS)cGkC9L=J?SE%;76fnZw_RdD+bV8-oG z*pKMq|7lIa_|f@H=6a7OC|Lg=D&mZ|_`!_-X~oR_rDauf`o)Ajn9=!DT*hq%&lyH; zzmzt|9~5T3NdKETpT)!IJ*KcZ{hY!M&G;;y%N)KjmAM>-hKW}X#X}}$^v8&AO3mQ) zW6bH#2{&J4H>Wc;%zSr7q{T2@_}fY%s@vAudrf1+-E{=s+mu(6&UMZ$c<8=#W%=j4>Mqg7ao74FgCeGvy6F)nNOZm+D4LQv7^IT=j<)34@IX@-F znbSWLCJ(F`X8x)rzJD^~vqKm=i4pUfnVr;`X-?;T4Rii?gt7nKVf1x*mO1^~EzIR` zTG*S}xPB4ylv#eV>##ZgVi7mY==8{J4&M`|-+f``!PUaA&FG(4X6`S|!}xpoF#6rm z+uW}9jWnmP-x*=X&$cl6ZQ3yFp#4sBI$3`)@Ap!eIz!no_A?<&9Ilwjyx+Oe=5~8M zj34C;!%xdF>o{wexbZcNew&Eg)=bXv!^{_*%bD|^D!I8l?`ANke>9BTeiWCOn)&s; zF!tO-#6vUu6@AS6tsKT*R)ooWbBEzSW0-Yi%01@%q!spH#^-I3|C`m3o`tE~qzaQa z&Iz+V-4`a0trli|y)leD6NXtwbPZ$Y`dv6?c6BWb{bj-)%;fVt4E?EL;>^M@^J9Yi z=KQ3dZ4Pf0CVvoVpk@{Sr?xx$&G}y^{MT$;WkftQlh2eo=JQC`YUcQMu`V#9b2N-U zTE>{ucZ8WwKL|OP@n1U3d~_~MoNO3Ip8st!=l`!TaXx35yvrNLPZNb%??i^-zjZkN z8=1>ZzlYdN{!>et!z+ccwB%h0=u4Zw9|V3L^t)U5x!$beLUJA7 zJqP$R0M;_JiYNL_r8#$i!=i+5_yzm~AAp~-gl`s)W9j^88Nm;F5%;EK)aj(xGM@*2 zB=KMT3_AAv-;e8L4_%KbwBQHGO)O`OHbPvqt;79)LC*M9+}+h0bexYsN4T5OJRaa% z8-O4EPIbLC6&Ky>;|+}vyoy$s@P)6yr~fwSNWCoV1bk~h;7fU)H}(-yXr3XUU*Di6 zeCsRp80sM$T(s$grxcfY8{>Kg{0=SEC$Q#<@=F3b_Gs{5lkjP2$^US`$Iu=Y)d!z$z3?kq9^$V~i#X;e z1^6QJvtbtS{q3PgNq@F6Z>G?!ihY)70Xq!6!?-dtAQo=~I-V_{FWk*&hyEZx`oc#v zSgE)JP+aV8`1@SIrN1{8m$B<`$78@Zlg_Ql=-0j$^kI$S4%j-7L*OmsAkrtJZCnI7 zhsvSHWb})Fjk=H+*HF-xbe7ygzri11KLtp~zmjm`OFrMOhP`~y#yT@A5s+s|JF_5UrfhFTT>kLt@|Ju>0kFd171VFTvIfWo*6Bj zh^xAsZHs6pl>abMx7XpmQQ+q(@pm=FcrAhN<#XNGw-xwt;4>)|vu-K+4Rypo<=w-r z$fu2u`AI(4{;iKIy%xIl{rt7*H_&k~PoQ~f4~5)xd>8SpP58Bic~HXNU(9bUU%!1pOYghhN%&AKR7h=gk+iPdDvz zFzK}I3p(~hp!14!4%jfiST8}pA`BYshq=Ia#sa?y;dNce6Rf;^%1%1f4LeD%#hwN~ zWr=^kFUIB4FAx%KBk}uIC4JgI%~Pv618{fi@8#(i?x4%Tsb6#@+W$yr{T1Nb5`q5= z#;@Wow7l>y%XHX}DC-$5g_M8$@8#dBH0;wq75Mm9#Oc(aZ=Vc)#P*8O=5xNbw*#G; zguggOzxIF6e=cFzhMl(rzVxr6)Jq^C@C%Sm*O8RlpO9OB!mo<|q07O`i?(Wtd{=Kh z-vd9yafz~|(Hd_B|K4e!f1L0=bunJ|35-D4v|NPG+79|w#!qP{n?wSs z$A@`;!v3wq|9k>;{MEsajL(tR$$xFYn-agxBF2Xs80izj2OR~U-Xq|%JK<-tdxK9G|;=o_$>Qv zTnh7rb1U@Tk$hGV4NQZaoPt@R|>VW7kJaxPvQ^0d4GpPPuE zf^pk>1NfB*|5S+n%S%M7iTb17{!IlrI2mW;I-;KgaR1-Xqu7QvTHFS}t>Zx-y^H(n zJAr=iF5;w&SCh5_KQI&cHA!ddJ=me9_)#b|?PM@0I~Zrq=Ha|^`TIDZAsOOHFdz7Q zLi$q@0B(N(d;5|8K0ypnw_C>s;1?kN<}rY~Xb+s;wSV4|pBtcqzY=%(G2hmhZ_g&3 zDviPCP^OhXGf6znd(WCf9kvqV5r-D317%^Im zFl=2f?n}^%lw0Hoz#TWf*VjIAPFNqWgY_#}CmHoZ#}_&|1Nyzm&uFfXLacj8zvz|& zd|DO*@{IVaIbT?gV!RO?@9$fwuj}AP>MPGD&~bHy{CAU1)FjwdFw^(;x%@5gLyXTg zi9dNI;Ev76D28#u*jWPOa&N)7niD^*_Gudi50>TtUa ze9HG8_6ULNa4*+!4N3p~ddwH@Tj;ka;nfRZz6dIHuq{hqhrwH5T&};~a$JFZ7}pJu z(;id;zKiQ7c$04buoLeD$W7+eqeg*G+ewVKEaU1su~5?Or!4aalGhSPf{u&pKAG30 zt$=>LFCYgwUpMOn{LoWyBJE`LEA$&=+>?BEst-D$kDw#tOtJ#B!}Z_Gt;|Q@2b4Hm zMg$h!ZiBSjXv#S=_2Qsj(i7hD4ES-@K)*6CYS002mwth%Xi>ypAs&6x?Zm?PCiDFH zLLf$cYzFu&K>Twvf$xll{Cm)@O85YGOaxrU!>8imIl~U`0KS>{<6mREc8=Fd`W+Sn z?!E~-Sw{GvCh!+q8t~JV@c)cDKzc2S;&*w)@O8U&>lZMKCYDP^yU-ne;nOby7A>Fg zuZW|2LEm2%e9HMfZCS(<%QR@VCh-?`#<;Bi0X~F=Qe1qXqL0^J5%8`Mx0Y`%<(~z1 zzJ_$-`4Bhek$-8Q&6wwenCFm;R`d?&Seiq>(mu!b!nmCJWyPYUA^nz|r<}<^Iht|x zpa@*LU+g~feY~0@@O8NN1>muyvyAH$E7vKq-Sv0ee6VmdQgz3RZ%LZC10uz<)D4E>IToF@@K&wS!9f&Ek=ywx`H z$@PWgf0PgM3>5(V8pO|89P$}J`AEI&WnINH2J}VRZ?yg5VN;zS%O1?{Pe`YIamdrH z@HB%QvXK8ghMkD@g%9*)-X8adxZ7A?cdVvlD2E3d!H<*qvy3Ot z?gDPh1bjKJ)jI(X&ig)|-1Y$O(+}>7mYa5aO%ytG`*bM&UhN+69i$KI6?c-0jUin= zPOhV+e6AATrQpB21Ujw+;8QGDjaJ+ZxVsqmi6Fcv^KGk=Z*Qy#`P*o>3yD9v8TfJc zg#C2jJk@Y5<+%#|QmR@Ok>Kh4yRV?%D9SnQV#1Yi?GX;E<9mV_sVI*dZ64#B_gB!V zOn8Ka`I1s6KQt9~oB8SY@nM6Q-*r3pH-&xb@3rYIb9?Y(KMQyxfVCx7j5kEPwGm$F zGVlYG^Dx3cxR|#vPwql^)A_*nbqD{_t~!&^53h|F!SO z)!2x`Vn65zBro~=I30fBNRPPvj&j?U5B>U-b+LtYbyr5vk@M7F%#(c=!2e&=`@%z% z!+yY}eGZuh`ZW~!zwAZ%Xz*P5_G4PE_d{Gq!|TNxSM)nC=S^w1T?=Ad+D7#FhU1FP z3x2GezhvBa!gbDq+MuAy3vni%^g27?G2lCnq2IOii_6m9K44s;>}Ir@B0d}QLLcDE z_*U%=9Id=Jl!SdHGr{`AgcvNC)U>Um^c!{?Paq)|I=D z!Y?G9YV>z4GbEOW^b@WIpO#_ZGlKAV7vL9V{{bB-=Nowex19JMK7w)Hs?>EC3Hj^# zTBEEZR-M=3A`YJfnz#Z7LRf*^Gt6{uBB|m@G0prbo4E$J0=OObSx03&yEDZgI zUcp~v{4Xi;WZfRTN4YO0uz^myp41$&#qev^y`|DGT$M=UptR_zYx zTj`JJU7VBY3HjUKfzIEYf6sGW>2#sr@}z&C`LH7rdY9{zWV2|WZGm5z_*Ulgu8p8C z?KYzy_|^l!N0bxqt)zf|1@3+?&)-EISeK8#0s7V7xYV0(HO3owfjs0F4y^ns=*!&# zlx1Bdu|U)5IGRC{f6?z|iTz@OzOp~~JRazHmAI6w75QiVHXqp0#)*9&-QFz9I`JnT z`TUV`nl4+dd_3pW2V{TJ(d~qRBdBn^Lqx?qkY$o3jYyU{&f}9Z!Q!=oaYopncxv zy53E=w4dS4!T$ixr*ga#xF2m-_E|ozqaL}=!l*UP+7Wze*I|d!kE%1z^mCu?|K`u} zp?9aE_i=Mzhwd7Pw-xCxD^h}fpa|&C*0Q=jH^>FqhCMw z%Vhm3_!;ovKd_S-)cX%5sP`i5mSHR*iHLt)hO10`dRK`6=Lb=6mQ}oa-wM{o4M5 zrsRB4r;rX8@p%LIFG~9D^N{|pkaGdTUu}XsE!=OC{q_>S8**m;N%3gI>(NfufldVJ z{Jjrw$3E~c*SWtkFSW34BkjD=4d7c@&zJp%hJ&Aw61STb13&&P&{sj)Nu`3cA1C;^ zMt({#PjfI&6X}-G;&ETw`v81OJ$`h8erPiEvV-`8qN!i~u_n=E++I^2cI8p>!1!~a zci%(sgTE5_z76_{RMrdAl7oMD0pM?BzY7;aK3>ivIS4&xq$4 ztoVbINkHF`1oVHS!z8tFy!zv7qDgsvo(#C<12`{C#Vl?He%$*&N9Lc$MV(fU+wSME z!&r2yrJMnLTWiQ!#-*OW6V7vh{fWPadJigkPbmCd_ap0i^jn7b8P)*qWByZs@PG!r zSe1D0ACGZa?_yk{Y+|&+1K^Kd=0DX*=R!Ql&2k@cLrfn=8$AvBwO55-M{pk8#X6OP z@e|x?+UMHjhv(}yk^T|p=f0DW&uzlH8}+DEn*T8Twq&S20pKujLko zs_QE>ABNMA`{s`dL!Q>|!1ushwABwm$Ip5rq%Gc7Tno6B`!X~`ZJr23dR%fU`%Tur zf$x3_Ic%oBHqQZEiv?Wf1HcyhyC6fN@SI&(TIt@Aj=3R&?;=S?5 z;K!oGpUXEPw>6ZTl=IJ=H!VDu2(4*ag<`O)IOUvPnkedpbp|=F<*Wg@g_QXy`)l&U zbK25=^3?_%&ssnv|9N@-DzplEc}00<7Ihfiu3V`BKSuo?+yy%RWq?cn^>3wo2v0yg z7B7Qw)nMKt<&aU#Q#$-LhLUsnR|WnLuxXdmYhALkJ{?{5(KhCUyCdv1GjJR5nn2g?%mqKbE*P)mryb+Db^>r2f5tKX zggC#*xSI13_z5WXwpuK>bo=+sfxkQ^pT$_m@RtOAsh7V;Q9gvrdQnsE%Y?Wdk$i57 z*5xnem)(&36pkyM$OCox2RVO9JG|bQ^PRH)xXoBcq|&UrK<8)D>5~X_G{$X7=i?Q? z9ST1)S;ug39+&fbo~@9Ny&&^#)=^hxg#Cp6hJFXI-~wPsr2OAM(sa zc$@676ED9Tl6KOdG5EBfhF?hjTZ?s&E+0G3(M6EXSlXwb_9^YwHxK+fvmq{t&$Wz} z$PKvlFfeD6&bTIkTe$x&<(Wt%W=0+6B*t5o_;0!+&Igr!=Yqz%K; zEwTWvQNI$NM-%{c`t~89{~P&mIBE*U%M#(`lR1JA^35$fgiz=&O z(|TB^m2&9a8un&U>H`ogb?T7v%%*kkLr$UdmN{~Q&{z26-kdM|3^aI3CP#tj3GRUnv;W2%g zFF8Obt(YhD_Jr{^$nzUgzYS?89@B@Y5yh0p@FVHmEeSbm%KClT zV89>}TTJ^*Z}y-Br#zC+-98N)J1i^GbuQ8s`^hH^_Mc`Pu&?_;GCmpHg4FFF>B!7vQ%ieuovX zLnq^EW#&soMZ#~aJIW+AFl8KQu$p>jyk+>;(ujq>j&HsGz23+C1GtZNBI8VoJAm65 zZzY|i|3Y7pTt`^RXBV!gd=a28*I9vLh%0i3(wU^J73jgS9a~ zJ|_HrGTIgQk@FJ1W)tKVtK>zFFy}7HvA!3~0Z!JF&fO5`JXZ9Ti1SG34EXtl_#f#;1TckKjnYCWM;g6|eJhdw>;7xwca#x?cNmCqIeFeg%0J;* z@Z(d?pC^*}Ki4~QyhUga7S_k4o%fxAe!ZMedyxOB$I-7X5}ZFFKZSqR?Ie|ET?_w` zcAkX$G8XR3NWC}ofR0^%fIu`+9x>YcKhUp7IhS&m`gO8CEaU%`ZoqdxfaO#M8SU8s z!0i^ue9kzjXSc*WgFaUy;ku zuU)xcWd-M77w2DT|HGaEU&~@K`jhiZ5s|>_@j*QwSUnc_j`PrnoCiM(26TLFFvbN9IM_nV-8mLC!KxwkiX=4e*?XT<;wI5&5%r0rC{njnO83f_y^E zlcy5C`T+QU%zaYnU)!3|{#o~v`U=SPtWpnu!}D4W){~_@EO1d@N?quo7@(2o^Shh; z-373APh&QZ(|=MoM6`5{*U(pg^=@^mWaWF|~Rd~?@>9%bDA=^**s0{BhR$(RWK z=v4CLh+~xJG2jcfji!HArrW=b-vQMjovmkp@8x$%($4oU0DbRDXv#*#@9F|NZmzrg zlYU--uglZY8TcJ2=#vG3ukoIoW9;|u^t7uWEE(3QX%VbfsNWsGHS#)9A7&n#k92Yj z1)o8st`(noub20VlqP<6`kkGASD5gfH(+n>mEc6$L)0?x@9l;eGkF^PLG2Nco6`n4 zi*(3ny~Mb6IeR)H&LoC7w7Ih>&v^h0iVys8V*RMwRaweG<{Kw#gMLWa=lYj%$^IDq zlDu}G`)EFXCn)2?Lh|G74SptazKgXoK2(SO<5%%L9QWyb%tPe7yiO=uAD5H+q0*ka zRD>P}=ngAdEQY1+6z4*9d>8XQ86WbMhn$@=A?HTKe@=f1(qD=Y-jw?$Ue+6}g!jt@ ze*6b8AIWp+lOLmBo3f8NwLba(AMiyv$Y{G5&tsK%?%_Ef8_)Sj{*&cH-1alSlJoU0 z)&ngO&`3r8!RuPkql>_V5=AEmMvy?-6<|l!A z(Bn(WCz5q4r*gh=QWnTZ8w-u6q8*Md4*KJjb3VV0LtOF|#<*H>TtD-?N>Gt=dV!|L z0oPN|7wLr2Rv$&bR^^_G*zVAaOQ|2`;5iDnvW_0v1##7R9rh#hv?i%x&#q#S!%gzJ z{|Wl_D12s{$aux?7G?f_r#I*XmG9_N55&0q%DM4ll^6%S=vTO#(Uueh9bYuy3F&ta zx4~Z`mHG5F{V_;?l=ik^0Q%LGJiJRijLV_qt4U;Ci|ZX}Z~eu28{Hqhn_*Xy&-ot8 zCoSTeNEeMZqZ7vEyA1y02>+!u?BBW*@|SV7R7=2v+W{|0e3vM|>iydJ-M5SzHFz$< z+XVe)f?I0VX!L7U_PJ_D0`AxkexzTV6Zw^HZvoDmGuUs%?tq859$8EHj&I<{tJuSl z2-+3v5=DvMr8ng7NRrfm@be_?+&j<-@_rr%@f-93zVm0`%kRy96$yzh2g@Y*k&HiC z--3>h-?_{6gD5cS{A-io*MHGKR|&f|=KZR$s6t>%tH!wGuMd5R>Dy>^J0Z?!{4T}@ zur~A&=!cX#VZ&#HE90u14)Sr2g5gYL0NpPPPv_Iad-gJs{!{3sL}F&(EBjFG7r+kvivRk~QJ%^^NTO);>s8jX z|8Tx=4Tb+w%-YQ%pzr+=a2dy<8Rvr|p)XOcH`;9DI}5@4Dd=||z*>T-x3NzY-pjm$Pjk=nFSD+7Tz=%6Zfxl>oQ!oSx*rYk9=OHT=Ft%K4WE=-0-& zXd#f-5=0_y`#l)x-;AqsekZM?(t014iIM^+?65s3R$9O&b-lr`2X~S~@e%8(8 z`HjxcfNy7ARQ9{^G5B#P`<0T<#A7GxG zi+nD=3H$W)r6*F(b92DXcPr-#zTE>IPg-!knRNQIjueUyxSYr54~JfYd*MMPxbMF= z4f+iz_IY+5#_Q7`<`At4>32+ke(gLzKZWoCzj9nk-uU(g_Ow?ef+d`LZxU4wqD!!a(&&&>ek_7d=n zgSkm9p9{Tk&k6KB1zB=GX3xJ<$oL}Dm0y$WCu1QR-g$@8=ecZjzf$+J=K=pA z-haNGdQ8Q5t10oe%|_6-k-i+)y0(OKpG(HWofWAU);;8UFynUMTN&TvcPOrCz}=ju zWPIrUj(qao)S8q-q6>g~l{{^~hIpPt`EK!Fk-+QmB#Cm4Vh`;n@Emp}?Z>_Z{DkNi zh<=(@qBF*&-cMe=74#U#`|&c9Pxl+}>Eb#<)_Xg1zsAe&d1bw2RdUexb6p_ivzh!j z89#H8{=X|IH|C#G{t23M-nojnB=7Oq!#HUh0lSiM=7A8nZqN2;SWXAVldA_n-_P~w z7xr6bEXQ>Qab_p}qb+6L>rwLFj6!ibeK+&E+N4uS%#(&6wL`z9*zbfYkb|Ay`AWTa z7U4q2cQJ32bZU17+&&wO$aUF7#y3X|j5m(`uIGH}nGQ=XL-<(cvA(>J+ik`fyOIB- z(%kD1uWZDBzZY@Lc?|HzlD?QXb$hcZ_rDdPJZ(ImFYSCmVvIMWoU61O`~D)YQe2e~pzi8u$|CbSOh0b|TxQFnHeMyJsx@CN8&pM%nbwbRZ znzpbxP|iy@nU|{fv47z?XDvPKa~<=Cg;yzOz7tV^d_Fk>c(5eo zb~Gz~XvqC*UwK5TA&lp>#UJW&^R0#aPmxaR&9G0ma{i%F63j2Im!KbHKupWJO@MWq zq@)uP1s`3HmW<%P2l+qDeQm!B@IJ(E#dWTq-&2<&{Q5-D33LVi6vB(w0o=L{a+djI zMd{b1Fa0PN_e}z~L1#GmNirRDf=vOJaq>ZC%ojE#|M!XnNtc^?KYahEkee?EOAzL5 zw3maS_fQE)M&=v4M`K^u%kL`%S)=tD2z>1=^d;QWX!k@ytM{uNfc#~?w01rCxA8j& zIo?_VO_zTt8j?wk;c1h(PZ6NqN;+Ns1phUZb@YFU}gN5{&;^R`QiQ8GB3R#CRUvv^Aa`DEVOfYtES}?`H4P{j91Qee{Rb78AN=O`dxPr_F%aL z`{A~jR-qvH_j7+un5EIW_k*1M)O$_BM^c{Z{rNpOzq>fU%Q!IdAn7pgO;0*rF%cW~ zd0qg_b?dD@hF?4Klu9oh;4U!DW$_Y(d3mGhhnGlPz0HO32W zHSJ|Pz(aj7QWIOpQ;By$45Jq{CD7Yk#|uG*DKQ5Onq5+&PU2KA@dp67TBAN zKfV7!zX9buq5TTv8RUH$_$y8Ok99(ax-NbSxvBS5>|-53y|4aeYs}*V_}x%u@_#ik z{KEPI7G9rzw3q89r&701!F(o=267PPAfs((TvFeAO1u_v)qV&W_)qNjW=HVv<@bGZ zebJEXLG^z7EI-iR=tsYhPWg+pAD+J&LHPbZfbUucKP|v~uaDTr(d|LK$37nGU_QpN z%^X*U1i%j|`U;6UgKnR8&PNgKH|jO?Yv=dB4GDirJNMGgMLJ=$w|hay%Jq)S-zu|? z>i-5g|3viaeX|S*7*M; zNx$ky(&v0sm+;6#7?-~s#${p0NuB`T$$GxzXHN&%m7DJ=$hgtl54gtfAY@#fA?!+* za}C} zZ%6uF9`4tu??#;}LwtVs(Sr0h(EfwGM^VcEUIQIJy=Lcm6)ESUlQAFpTEZV?9@6tA z=(~Bpx3t5pBGJ|LqP|zvHv~KJD)V58NuY0Q2l`UZ>ym+vwL9!;D*0c<^_o}V$Idtt z;P-uNiNBcf&Cfc&w8I&{g1-8`)#_g0$Ibhw7t${tiG5XlT;`z~9{2$@@tyJp z#Q&4e5cg#Kug3M7Us_cmo9?f1mIly$$hG zF9!gR16XrZz`W*E_8n>&d5E|-<0|Hhe8ktU4bk&1-+z$g2J-*tKJ;i)&NDPQM!B(H zY3IGG(qC9V$wc}!xgNK&z9i?h(Gj3;@uOdPe_ifL7?;NH!KJ+&7UvW6dBo52Ay(4= zxDEYUlzZ%FivX*~RnHA*P?){ZK2z`7{qOzsvk&~J_ukiKTvgx0@}H#quS5RQZgVt) ze1fc#{7eI_)E#nm@*c}ZO(&OSwOPT|@M%zPD9z0r>Y8LtZM<45O95 z1Uf$D9j-+)LB}2q{-qu}=f-?wsR8-mUrj3_5*S^c)73EhEh3$spd;(9qbVN? zqlW;aPu6Cm|l%muoLKLTo*`w`Z}=>;#~tj!oQk!k$SW#dfZ9* z_&2z)|2~ZczIw0zYMxKCDgEx{zJ`PIyOcwNd$23@U9i?i zX}9$eS4(gnuaFe{sPBIbi4VB?{#W_}fIAw(l3k3SFPSI%m?um7EbRckkK^TbhgOm2 zY8=!r-CE1)ft+3Sq2H^N|1P7>Ao}F_jf#ZleUEXe_wd(czN9Jd0A}KTlltyh@loj4 zUmX1wApK$SK;Ny*?`>IcQQu|j&HPZk5C0EgNV?wD`|$Iy&ZFLYzqAJJQ#lu5Wgg{L z@~C)1G)CQ<-(89{%xDj8VO)+Ru;*8d52b&GUTn3Y$7RIVrXb#WX;)H@4YOh1cksNN zj2rL7K{egKc5{BTlFpW;Aoknv_1l(Hnd;GEW zARqOf{8J*Y*X8V2?#cg{1^mP+{9oAtI(E)?HQ8_FhoIw8=Ih@UgC8%?6);QDrcQ+1 z)cf}1XTm&dVZJ2e+w8j>S0+GYUQ{iFeqGA?t3T@%PSz_NBXS+ZU)aB`04iEiC`zg8%bgcKlx%@8RNI9L3*k|GS z$)e=va18iyDffPinnykvCuJOHL;DXY=Q`4hxTW)>zAu(+3HVXp|7t)v_>RJ^WF2XY z$Uk*DUgiCTIgG0|#s2rv?*fY7{Zbxu)cgN?dcmi+E%Jw&R6rgN?8N#6{7Ai@90q^% za{VIb$3K36d;;fSY4ZD*tDI;3oM&rM&fQwl&Xso_$L#^1ehqZWaN(Ea2IyP(J&u(B z$?LF(%(Mq-x3?Luf~-qh+3!ut!OM6h?d=Ku$fx*G%a-Uj#P6N+kxm;I;C9MK_B(PU z;8wfi<`@H`KaP^&nHzLp(_B;%FxkE-T#{jOrU)D1df!NrN~O z;<>4^l;@?4;D60IG=%6grS*uUUtPaj)oOyGK{-wNAa4E=nnfCz8cw43(=)0BukuUcF z577Sea9mlrzH>)`AGtpLC<-!qJaJlKnE~d*Pq;7RQ}#pWJO{p&_K=12*E~VLHufvW zwMT5Y>-4R&!TDs$;m>iv4{{wOXvR@PZnUxH7M zVz)nV-f?o?v64e82?I58Oxm8N>nKDnV~WWl)X0gS5$`JWnr zaRvEqU17o}@|?VP5agem@S;}e(X|`#T%Mz-&+i&+y)ZA!dzA-rou$5mwl*o^o0D-~ z>hT=?E<`=r*zdbeuoHU_lH5sq$k(3!&OA`&8x!+lTz;;{>yl2!RJ1GQJJ7o4p%<%i z9%%NO=dL?sCux4gnpR7rAaAo@iW;OZYn{@GY#bO8!@s zqu!OgX!joAyLqp20gmfA{n4h-$vgr00Xz7Sb-Z|-U+nZ#smH0JfUmCygC7BL7efbm zl7k;d57^-X_B&U^Pu;&BQ;$}{_i>*~eZMSCEak)Xh2+1;TF{A8?sGWW2l#%@kL_rO z(*<98d{f_X=w-y2^qNcY_YOb8{yoZiYFHuk8=^hbApf6@x|X>AIS7xI{<3T-`5z2< z$~knc)Jd9E?+R-7MG?hSjub35w$YoTwHr&6!TR~dS@DD|GosGVbK}w; zEUe=>lsaC^X5hzm3Uc^`<6SBWvwFWC)Lm(xQ-_8IX3-gW2q;qLJ-~rxe zn=U?nc*%Vn?Evgk#--*)o-E=g?XwB#3~Z&#S=j9kjI=o6PZxr|dhU0Uh^vO5D&G}O zWIe>kdWhsd(KN`}odkK2Tz8b>c@H1&Jrm|_wDHFGMB@7nWgf}R_~T$al=k_O@^Ml= zvfl&=!Kd>fETIMc>-Vy#OL+N?Pd<)!nLsn@X1s4r&I<+RKn_mD-dx7HIB{Rf7RaqT z>C9uEX;IE~%r@51LeBiou^92M{sa5BE8me-=zxB`tdmH4p3J(pllh(~ZyK#8=>(PY z8zaQQ8(qJC<}Itp73Fo{VM|krhkeh|`yY!dVpK0fO zZ}B(UXRB58yT4!$X>)bu zQ@$ImH5+o%l(#DC25Dq2p=2=e`6TLk8JuX5k7>j>oF;d$>`wAf`b%@1xawMEg|iur=#`zS7^zb7K<7Sz}$a7{~RiFeD>y{0%+IIPmXz%J~iG zoIrTh`V~W*4Dz0?0;FSQ-N~lZSKmDW9re8Kw#tBe=0ab`NhfwN$GaB%>|{MEhU-cT z*OhgNf4czm8*qZoHNtNQ3I@RgdRhM#H%+IA9UdIux+|!=O$lt_w8CPNF=}14w zdDF%GMA~6fBhH90+)Y#2F=%ZK?WQn^225$i=B)@@|{^9Qlu)$PGK1U<_89Eu1- z)!{zn{kZ?t1N}A1eOY~2S6APadm{28eZ7`nsjsdUj-%7J^+cSRK{-Slel5n!d;f|M zUMe~Dk{^0mMtFh$!7nt<t6JeMJVM?%PX81c^t1?l~Uwqm>msmGCa(D5q!Ch3Bp z6Xd%9)kvpBTfhU%_vE_l+)v=s!E+QfiC>LzNqu+26^nlTv_mWLR}O&O#-J^1V+d`mdM%E933^)8NzE1|BWzLOopY zcN@P0nnC}HVqWTH{I5>_>yLo^{mQ!-Rj)#xF6De|6V@yIT&GCC*d_8$U5`QK{pA;9 zsIRh!GYvR@wfszbQ{K^j+6MUcldv3V|DSqeyl!P(x!cJ1#Qp;Bf6L2pC9Vy8^_`1H z+{d?#gq_Q{F?|8&DdjuIOb@}2Cj;zO>Z_^Y*Mdi7efQ`b@SRHC_(U)0#rh2rTSz;% zT?4*@aY@?kQQ-)>Jp@^oK<}D%yFckChdc*To{PMc&mH6y(jM;7?*jBY8E3qIK>pUk z2>dSoee){%U2zL0sBe*?xsnV zCEVX=fq#JSVce@i_^e%ktLI?L4I=-=(C>cQ$^GuY_bdB5aiyVOJI|BL_5Ry_kdONA z-tD4@hfbaYEK7dUw8412%K4c+li^?fHIOjHpv8)Mj;=5DoruTWPxLF_i#=mrWKr_= zp`xH+%xlU%=BGcwPvCd>dsXt;W(n+Y0KXr!68?tuN%w8=d64kqV!uqMuW`I~!k0V% zeTSm=dORoZ<2w`^iT{@CCiPvsvtoYH^ECBcybW@lPB}oE;+)$Q^y}6i)D}&~vCLxq zrSs|H{R8>guUjNGI{YKgvsnp$z6Rq8@mzE);iE)6*ZJ|Wo*?@j8%23iztUf}JAfZt z4~Se3mSB8vF+NDYi%ATgxtYH; z;=15po@??4FoQ>uzLS38Tn)L&am8bvufEgwn@{!IAF`w%CbtwDwi$+n8 z5#aL`EX9{Y_l_US~P$?v1(I@IrhzPwW);ritNOL5(91^y-USd4UzGJmk1M89&r zo1O=DZdcANuTI4A@_ri`Z$H|A@8Y^oj_XY%@B;@yU#=@(2>UnUm~vh*ZaC~yeW%aA z19U>lJ?)nYf{s51^qm}6j(mWt?_Bh|3%}5K4oBKywOOEVZ3n$eyV_a}aGMwOW&ZX+ zOz66PJ)GC7vESR&m#rWvQ16>6KriZhd51p14r?gims!ujADzb`Ntu6MzX|?BN`7^d z>wU`t@G0kuh9coH;!*~T3tp*dHOP22eu(i(=IuUXze&_}`JGoG%K7kZ&X2dh*H;ITFze%0-=TP2 z9C3c0a=$^x6Bw`h4#mPuz}J*}3olMYzX8fq+QZ@kz;`M8q?cX-zDD_O_a*nWt*mcL zyUoUWj{0uh{uS^G=NxFZ4GnkjbnqXV3cz*B|Ck$c&}@)T1m)Ig5cR@)8>F2l=X%h? z^`MmhY~qKAFVbD3eH@8?)pzCU?ZbF$DCdi={|bM!(LQCI`LG%M1bJUa0rFWaC+Ms1 zHM9`lCF%Or7=NUlU%mji`u;*M<|pcV3jZD?ot==+W3Kx)lm(y8Y49VN*Zs(SpU@uQ z2gqleI-q0YzLJcGsY@}==ZA$HA)`%L4-au4LE6uPt{AWS4qbQdLxn1#Ul~7VRz<(+ z{n+hA9a4|0e)3xxuM*M-aAAhm$?WaU~!~y47#DRIl-_RQN z=~42W!f!Dy^?kY&;t!4ZpA~|cN;?0EiBE_7l>8)3MT|GVd#I$HtPp=_(D?y$HjqvZ zAy|EWk7Iq+LwMl@pyOjbLE6t6F>sxZ`aWIJlaP;x`(=@&bJSShiSHehc#@3sX^8V$ zM&f(L28}-dYK)&&NyiHLSoR{{mj1g_IEXPW4=hCL@zpcHHJ(Ed8Me_jbjJ4`eq z2v0Q+;|=j0G3j^z6ANlxK1rC*XC{6=k>Kh6rM@q-dmQ4PGY{T z9FACzD0QtxjAQCMZmUJzM%UwbrJlKR3-s=v`hDC;!Fe{oc~;v0QISCE^6{;Ny&a_< zcQOz0GY_dic@FLg`u2B-lYcXQW?aW{y$9v#%;%re4qZHdF6%aX+k=ixsl#8OpN5pW zUx}RXBRjtv8cTlqiUiEiuX1mUKM~~brN78|E%8P4>;3}yj3Aw=n_xfoKVd&k!d+tG z)9DA5I!{}%zoYw0=mh+CcS8I@^8om9DEBTFpN@V*&CzcZK zoFC*>wx8=zjqer8_+Ntl z+o`ZtWW#bl=Cny+P~#1_>uNsx-;bLxdM$GCqHjv2v^QaOqc?Duzy87EXx58 zV;&pm0{R0;C*yU{@g>H1vq|_+!g+2D)Wkc&V=*rE-GPgl^f-`SvnuD)-Wl=~?*c39 z&>OT{tFr%_X$$I{@Vss@;@=T@lpa3=e7``r zo6$aYMZdxM;PVCL_E#^`SN1RN<^%tB?jsZ;o$Om6x7~`|3f_f&2fX;+--io^bw9Fg zh39t0@U%K20n_=k&P{1henft*Z$-aBo`)I6etYr!jFtP9nF+sMA9{By^}S6Zyy*1R zciaM;7ySI*LB{i)n_ySkO!$$EGgUmGuf7lHSPA~MC!!D0n$aJ7asA@o4>~d~-8RiV)P@5J?9LHYB1CZw%tfuWGUZ73i$N#`TuuwRM8CGUYxEBTl5FUGo!jpxMV{M-E| z=S`kRlJ?M8Fs$3NUHQJRazXH~zRU2#QrfxlU16=JkdOMF!l+@ucXM2QIj#gF01pkv zc)t>!Tp$?!#rxIaO_~;Z41Uyi8HNskU1@wjD-Y?cn?^sX2fM98c(r)w*QwO0c27gU zKGt1jzn`+xZZE*m=aEh}E8})`#AoRjUe*WH`~UAngCDg{(yKb)e%{Y1^;JVCNVgyL zJ+=AW!KbF&tI*&v=-62wU|7;xTm~Jx^1ey1I^+;g&ff;M0pD8~c~@1AH(d|(YvFgS z`3WzTf^>MEp*ZJ@%Im<7m-QBT-ebcCz|}l0*+1yl&3n=i)irJSf3y>2-*818;9JK7 zv#6XmI|A;X0r)q#+|>6M?#Vj2^8P|9#$olHg_DEn zUlGuYC}SG!2G2`qvFNu6?doF|=+QnNp0$;E^-$LRe18C6Odm#@9|JpaF^`qwYU%*o z^9lAWJ|{F<`ehiebqMI>09fmP0RHa(2Odv*5z<-U9;;%5{FVC>Uz-CC0Hl9M6l;8VnB>AxSu!A>I%+ys0b?Qq4P z(66;HG$Ql2ehVmv;?Uqy(yuM|Yf8XA8;SW+Z>NkrN1TsU))DrF=+{bnfVF7a$ZLSR zxUP}$e+KIt>iY#PZUNuReJHvA`-bzKdM`)D56DlftPj}0rk2oyaRpOjTw?ibv`$}u zfATymDw6nTFVc^=j<6EGSR@|0JRSWI!5Yyq{+Af^LotxgV#>K*BFcezsr0))8vw4p zPm$tR<}J$p)Z%xfue@6kaRYky(T~u(I8JZ_bTlRZS!L`yh;#VI;4iZ|uE~2q-&^ea zd9XdtN4b>sMZ3ko*Q!IFNoa7>{{>uqpQ3PLjMu|BEbZa?62R4WD11Cm;^lb~iC>cE zQoM|Z68_T@_N(~s$~2&_zE5$hCGttHaxcNC5x{qJMI009qS4lKUQpky7+wPLGswDx z^v4}f!B0rxXEFEpHJ;;=^_jzBLf7Y0uW}D$moBhF_1(HlC+NS*J9jU#B3?O_@6Zp( z{WAKaoPQ5GG2Rf*-AQ>~rC$V;_kDJX`P7I%%6w7j8R;nJY6=EvpLZZnN&m-AxW`^Q z4!?6y&iQ!Wz^m-@x()e=^)k;7|4RJI-0x7|tvfC{(&MxGZry~r;M3X({78Q<^%MAX zZ$q5SM*6jL^3*W(w6KY0`4gC`OWF^F-X`XA`m#yYKxdxuIv@0pc4 zcI+Rt=YsIBrKD3WCGDX<{8Yy6pAG>(Pzvye%%e7p0KWQ8+&9WORyj9PWg__33W5JM z?Dx+Wlqcu4TpVwmXpGCn{ZK>|O=R$o(cO>C6-Mrt8bs9sG-F z$Y_~wgO0{?BU1k3Mc~r$9ho4X{lt%8zGP<|ID+sSb)ZK(_nYunn&y8B`d-?tq@R5m z<=GXOM@Z*FEcma%`^v0@9~}WYejDsW&Qlr0M4&Y@-I>mLCX9ws!`fcu%(N&HKL0C(~})ym{&^E|*E%DzV2DDbJi2e;-Q$lt=cqDYU8cD4icqP!EA z`#k7t{O&-`gSLE-e+}ikt8cuE&HB%g%S@FdC{->4qe*8 zfcq#1DWB!cZ`F4IKlLG*w$WNkWh*!2BfG^`!qcxzTzFSv|^+qe} zjUt^h+Le!xe^6O(ei7>e-G9~h>>4$se3W|8A;KRk?^e$nia767;`|)03oQJ8up0TP z)s+2mpQ`}jo3qi*mG>0-{2ZzJvP!cy?5DeJyoj|f-lC*ooFj@^26kLukgx>uj5 zC@rdHzdqwve7}cqJr#}6}kM)X|jg9WrzJGMD7y%Q#bck*jQ@m88 zfuhH5H6MaPMkOqapJ@|Cr)&G^Lx>}`{4L7x_=7{4ubw-IJ`vR z*|^^(4)+I#=fjO*H0%v08>ljfM%2sleA)@`g}rIiok#7XA;&nm1S;@#Ck*Fj)A3VK zcnXe3)9HA6c(+Hb4#(#-2}Vzc476TLK%>#={49lKG;MaL)9z)ZQ9Kw1^>%x&&N_|m zEsrYTsH`)zc@%Z~4@QH_JD81wNH$vt){D0@2ZNJ|@5gJv`tWY;@`Y0ja~9f%+vG*f z$2Ws!A8eKi3B7qTh%VyuP>POv<2Ea}BScBkO9+muTc%r_s>ZbcWbA7yI)<2vB8XosxnVS#A8N%T5`QF6`T9%Y<54cW zvh;W6V<8^fF;P`sC~QxoSu{P5+O)it`U>WO{!LM_9Mm9h`tfWso<+o$H%Cun2>zpJ zwir^kmtEoz7Q1!YJGPkAUs7NYwjjl3l>_y3dY+8ED_e&YYwvE5-3EeMD*pHH2Zh%~ zyV$7gJ_cp2JrCg=&mx4iq4jHup=8y8VYBE=;CZ)v=s*5LH`cMr>D`BOFYr3pho@1 zR!Cn|>kZMNh=?5~PWDIXw6T9FW{UD<5U{F@xidNEoZm|+Uzh{+?X&TqANCg0DP&am zcpT%W(9vd`DR-6DxLDkp(H=)%LqC{BbLwmssu`oZ90k<79@LA`xDmcp59&}2yZy_s zhxzoRF&aOWK*3hnnV|Ir)W$xOj{67qp_-hI7EB|ohX<$;PR4_{ciF~@tv4ZJrqLi` znrU}74;N5Td*~6NBwZESBXq|>MCuJ1jrv3@Byri6m@pG9adL~V)t~{LydOc;i_e+z zb=SFk+8d{#Tn04%Ks(d4W2TGulXWS-<8w5OXJIrVwZ0!hrB$KqL$lKxk48{9BjS_0 zJ!qRySEm~%Pp9!bN&snbFbz>`J;@iem58sveL6)Pq6ON@|Dl3%vuX-yO`e7+a!Y9j}5URmSdZZJx7pThae9+ zRCgYaaiVhqwG<#aK+YGmzDM2Bcs7Wl2}Tb?J{m(RV)TGYtfMABqQxgTm_*&7?T|+M zD$WvEbd7Ky$H)hhXhf$!h9PDPE4pAOq5VO-ebkAM9@2*X@GaCRf?mQlI4LLbAUa;0 zSSb-i7l7P^aN=qU6BqT6#1T$LgdJzjJw8bojhp-%&H#VQTf{vaHbm`*<$Aaycs<6^ z7d4HuaGQ6oB~R*dRb*$>7D>_e1wUNP(y(XCBp zaNvuhybetVYaH+6(-A3Ts+=z2|QZ#f(+AQ#u7@3qf;thdY?X+zm_k=-C|XqPJp zgUbV$Ft95fa5K<-lX(^uw@zACQvW9Hg3&ISLkN}Byn-f;m+{Z)w{BjbVt4D*kLAs?cu27T%pag?(F9M@#t_djW}Bb>u*KT zi1u43dL-k~d}6+vF$*nMe>`mM_2)gO%Yw_!QK4%`R_8#w$yk{9okPy&br zLTB*uR)Uu}Gwr|u5zo%TbIhml6z&3&{{ydH;ojVM$I7Z0w5>yS(2;F8OsBLwvh=ZY z_S@}%&Y(~W2T}zX9^DnEObH1#m2I2(H0W>>Yy&+;n2axBmo2aTH=t$EckT1N$pfY= zqlNV~b`$fA+$^@%GECs}u&o~3(f1J?E!{zgQzQ-|@bVn?v6Z*mSyl;rTR2L>`J@1} zLL8yz-FSde=}x$Dpb}r_%}F<&?vvRN|1&=CgfQ-gIEi#%O6bjl*&OSw6@7OBlIP=n z1~w-dd&Yhz*j5Nja5(LbP9qqxXJ^<+2?xaMo-miO@A~XZ@y+2h9!3~Tf|o`N!nGaV zLCKuX@6xqJ>g>UB4Sz|kWk2iPIaYFu_5iH9fYk|)FJXr{yn7CJjxOEDi+MOc;RIsp z@&zEL$PhDk=$u;k#yZq?oeO4fERe)r&-h70Yn``j&{O0td!&gI)H^|sG&c@cgo<0g z8qvjMj6Imi)YN||EMMi9tuPZ!25^E}g@&Dp8Ar)V*qFsi)1bHvu5SwNNS`figWSK% z`NMX=S~__vdHp)cdfW_2s9|bil4HfplNIk?m;^5uCVs!)x#?P&H{DBB6z}?dz%zJh+Ax73Ji@beQ`ZJ?%~;nqYuXT z2h;0ykSGCbku)n}bb6+_mgrWAz7(Hnq*S_<32ysVR41HAESe2FvW_Bn3;AILNTs>v$NiKQU$h_KyvL`Z zJTEmd%lvtbN($as{C zI18QZLrF-~^2dt#_IY<2chS)|;yw-;YGg+9jl=Pbog6lI$Kz=q2MRgtF@`-xROw#0 zFU%73E9%o3h3qfv<1O~_mi)NOKJMZp{xFfB7!~$AhwQvEh-Nc}fbgJ*n~=m>r_%wm zXeRw<>z)}rI`4#J>ue+zWPX$Y3YxFQ4|c&eLMR5hX^mSnb$2YRTZudNekY#J+D8;+ z)|pSO9!PWtW+KJfh^S-c6c*M-?4WLo4cunnDf0?aXR>bWCi#rH;WhhZur+~kB_`Jr zKg-XSbm_sy`+z)o-FbIZCxR?))b>S$FsXLgy51r&AQa5+WHAO&`-a*`ben?AtvyMR9!Q(-HC0R7ae~aXe)+le`AZGazEJ zqALpO2y+*Fl@Z8eLv8PwrQT`+5El@2><^R_WWa4q!5Av6zo zSm0-$T<#xM^59`E9+I%c%4TAK`$>xof*d;QHlq)B;$N`cMbI}d_@S`iYTT7p0G!2y zy1~=&^O37SiNUpYN*fa&K7H&(@2!KDXNN~9nw1I0YD)G*c#B9(G`R5C!Pw&0WNg{} zixtw5@=e*6ua*Rz)#b=2u_bRKgp4^e;U~9_h!#v0=W9a6Li;@GT?Nr@qZuGlVe^u0}S$o#^VuklSAtlm1s!OY?^ z1lXLCuFe}iQBSw5J~|guO97jLQ!*?wy@E|TMk>zFdi_9N>bOt7D(Ur;!&7)V$tKHH zzy!#K(77VnWD_N8Slb9%*(;fj5za7|$rBp4EFsIIwNrZ)L4}SUT}9KDI}(LwYEXwd zg?;uUK1DkEKZ)kcQkZLm86jDt#bl*;=?=l{Y%%YTpVF3txR4bQY+g=S8RG1% zmQ|r{ffvl2U@(GdDHDuncpgu2_N9x756PZTSHoRI;f`WH2v09ALR^BF(G`ezei@$E zXdXb#2wLRz6*d=WbUoPSnorLVYr_paUqD zC%$R}UEfS^taYXf*&@XfHoWnZIBE-_lP(?Qn#>Ai&aPYL+)l00_!U7}By(;O>*-_4 zdiJr+zHO7#fO`PaaucDIFym7|zqkX+g(cxZUBKT7J8y)DwCda!R_e|Xsw0T17Cs;k zf)G~^3~}YIUqxI|R2p0{w2vqb*OcppcZus^ypmxITFvIxcC%UAZfw_fHaCN_XSs8uT>nb z#C*YraqD_D{wS=*?dxIuQ5eS7^)UV@4C79LVXPzGDNRW>nNKNbf^K*2OFMiE*&;*o z0qh*@-Q69;h^J=32KBJ*PhKV+{?0y3($1P+Bm^#% z?-i$xw27rLB{W?-B3ADGaUAony+7^t`Wz9CW56}j*U5B;(ylOljWSt;axLkbxb|RM zJ=hKf@M=bu@3s-{){I4v;aW8ac3BWXx=6n=K&UPy#O=&?l9)aCzu09D!~#shVfP8{ z-yo?st`^R_r?@E<&SUH#o47vTJ*B{m4x$2Vpp@92^4r6k);Jl?>*uXNBt}AtS!DJK zky!C0n(p@whV{)FDOk8_)I3G9DxSDHuhM4CQpq0vA@m5AILZ&6mXOxAclIPaL4q6Jz_sSFa?QhG(o|OMHPctlbjKk}VS3P5AUza4Q-W7P za19Ou;Cvbc`~?vfNlV#a%3fta_>suign$4on-hJ8e>2HD6NI>sfTN(YkY5yvl5+^V zAIKTA)#;u@^UGUfTtQfhJN({XJ~y62+oIo@X#eIu&e@54mM8G^y$1F@3-NSR^&=Lq zQ!E$Gaji00RVIh&Gm!(C0rL#AeT3y!o5kcESEP1MgE{xFZ1irr!>5e<=D3OrafO^% zx%bU2=f^k9m`z~Ajdg@=-qzx%$P@;>OvJP@2B$Jtc?(43i6|?L^=!@UAtj{K;--)n z1gZ9*19hh}%EZTlYLSWV{IK^Jp{KMl({FEglx& z@z4g~HmC`Qvr}AC%Mc?qa(lCOTE&ejy|1hh#0m3Ya7m+Vx{WJ@tPAE+XCjjL1$X&**R)tGe_$H6A$@<#gjT|7m`o}E4}%Z)m&GWO2s^b3{^a5Hx{V`nbPNc_*S{4TCXr+_ zu0I-8{*;6mjua{vphd5zF$AhyOA!RPei=<}VR=27P_7NfDhYP5O73+pcE=;wROasc z#MZvlYp5+!c_5i~-0je79n9cmc&+T!161F|)0@a$j2S<~zC$V9S$&}>^bdxx3L_te z6@fwh+sMi-UdPm`yX)Rx3b)J$&*Zgd82Z@8ni)!V z<2oG(wgWgIx4@6LBB&;~a>ZFm57>|?EXiP$K6l41V z&_w>9S-ao2-xbfRklg^dxEmmkk(N#O$ zJ;fFVtePrd6|(gv<-$lfQ)Yre0y7bu$HAaE?BZn>=*f81nI3pJAxd&`v1hoVK%L_14Ws~>4GTq_q+LG*A zSqeP}H~o%st7r;6XY96L-oh<-lyyRnQWg$ADp@5V;7gjJ%cPBJ|uiznk9v#IHb_Fp@svo;dir zPu5KOhJ-#@ zV)rCpVYNkKL#7^3wN|X+m92oyTT{5q9h$cKWvYW{BPvpsf`te-RP2&c$?*Y;-5o5^ z(o$!=Z>p=Titfr*1+M?1ZsK4?n@L_&47~E#3Uk+`uDkotFdeV0?7H7{U|(4>AA<&< zv%cv-kFCfDR}@ZOGiS!KRjACd8?BpodUn{QIFVkA$A0#EkK15(0FkDDL0Kh8q#eSp zPe)W}#@4BA6U+m`^)pJY$L(R7F-z_)G8^8u!<<#HI#0LmP*jlUHRetk zmR^^3>pI+Cj7YLQ4JxYHjQ8oY>`br-64IkwL$~W}3A+w!oRcFg+6E$31Pqh)JdDX~ zplp0>*OuzzkZqH+jbpi3))Z<(T-KcH2{n!NB!!SdLACAMAe!`Cq4RR0$uQ+0`iRHY zc<4rDjc#LdF}yJQviI+}Jf`>Wkea-Go|oK~KQgDt7>Qe$yB)ZR(Yd%|Ci5-0wY8+{ zXZH4(>XzRiz>ts}N?!KKKe=zwyphHNk;#?$>m5sL6MnXvi~0CSbC=~Uf@bGwjOW}F z@1F?QQXPWXLwtit5ovX?8h?bogzuG>~B;mk0() z<^cwoVPe+q6p(dXV@uZNq!YvKO+IoH(~;>tgfGrE);?TY$iIW#Jiq7lT0fq##|z=R zJ*VtyJv=PI&osUUVAvA%X5$mMKA9_%9hSYdc21@--jJp=d}t<|F&7O}yd2Yfhg(V+ ztEG1XtWMRwbQ^=PvYyr8m`Rh=dU3GCuvQ$&j#?zYEE4#${|Qq{s84KF5n36BF%QWh zJ!O6#F;g=6(Wc{pfZ=$C+3ha(J zW79kvrZME+)#Kd{KdI&YmWOW;Z;OqFhu?n;lF*f%Tr z@NC}JOD6z|s!et){m@nqCJ6MRCyhp<=(Nk;?SNO80+QmR!@J<~CO;HjTPG0oW*)%l zeKPrS)6rcKl6P&W$na^mjz=q4;yFyHqY$qRBXt~p+@>Fhg2cg;#i}BZg6GJiCxVXI z16;HwA;*$KspBCndZcRy%#X zs#|2E%Qg@+Sdv~maXsq8?V4uo6%S795C)B>aesb>$ls{< z1bt?G+~T&sl!#J&;O0MrI6-guk|@ev}V`Yk!Xg1Q(Oo}*de zr~Xai56Q161D`Xt+;KTuuHNOK$sVS_LsH_MJ6q>tdgd#$cmgZWv-R<+5%>qKpNDiA z?Mut|f^?gM$IZ5Z0G4V@ND%O_9>(nGV<6Ct;6d#yx{y)fc#34vkI(0EBTKz~tj7m2 zrCuh2(V}f3*z1id*1N1&?{T)CDcgcAH9{UofnGaqZ?b&cMY(a2ZAH#gF&pjNh;!?0 z$-Am;@tzI|?{lWr^7ExJ$YPdaj&N^BuZ=|)KPFQrg5rBZo87}y9JwwEr+0oWyJOIrpN$tYY+W;CC!g>OC!mRWj%xaM!eK?* zEZedSQjBRswC(tKAF#K6a}1XCxda<)C8#6ojy{>k4MMj zi=ZZaY~jgdAC^#%jnRRVgK9DH zkf+Do=t$H`!ACFIIaZckl?rl(CTJeVr_%9>K@ol1tUMw&Z6m_v5uKS&C=L@!Kt=;# zJv{dIj<4WAn*q7QAM6Yw*ywWSuw7)H7$Vb4Uy&6i6%f8uuma+TVazIO-GYw?vMQ0r zwl#;~I_9koSyXu<1s)=52)b#`LT}DScy@F&KM9v7q=3jAE-5k%IaLo5U%~WL>@Udg zfX$^h*vAW5`sCv3p}uq3N83~vd;+PGL~TJWKZ!38>7AXoc9L*UM$>#&JOQI6CZIWo zmcV82dw<1!x3^;IY|9V2y&Y4hTvt1$mbb2UOf7U>?U=fMg?2JJcrjOfia7FD? zQ%x$umb{7UZ*XYoat%>~(ASWDMYt1^0G0cAXLKK?LY$Zc2Js=YGqmpq^4uy+A;Bh0 z2CBy1j&X?Ybg-+3$Y;~TX&%{LveK*G;AZh@!~$yQ3SW2_ZtD$kqX`Rgjr`G+jeO_sM|rXZ)ooAf`u1d`>hszBqex!Czhf#xwKQWbzw zO|zFD>CIVh7fYs)ZEv!JT45TX4lhlEsbx87SYi_WXf50gT8n2>8l{XYl(}nh4ktlb z-d70!LXrVfiGb!&`{nUbVh7x7nMLg(^Y#FH*$fOg)sOn@VPEMlQt!|%b#nwRkIePq zWe`&4tu5_3pYoL^SdfgY|_ugPnO(G<7g z-@@~E>^a*iT>{Sv7+liKY)muH1i|R^1ua3}LEMYr%jeGViqzfT((+>jb=an*V}fUn zD7|9TKBO1#xLl}u(aI|qGBRj2;s^c!Oh|IZJ1!0J$dnq7>tgqLNl$39-)xH|$Obdv z9co>n+rIX?az&;+PYTpLn3!O*=LI z@ZoaxQ5&gU$iN8!#6rkAV{-G0h)3usN1d^B(Im3J9G%k1skpV3SZg3n^B{3U2vZl$ zM=h!Fx!zJ@ca6m@B}6#u5%N1Q-0UW|lss?L9i+FE@GD)`k}=!#F};?AXXf_lWlMZ} zm+7T4^pyg&rG&MP0`Jpuj^uc_@6rjl3GjNXpoqT^W97&m`Gp*- z7D7*7AB>N?1NJcOF;W4tur!wHkJduPMfFCysPL=0sOTe}ZNz%HgGGY%rQQTYfxJVh zFDgnbfa4q;!Q~UQcj>ctQMm>R`yf)!(uVfMSyVsL1Lcx_$v{EnRQ7b?2(7v&m#$v9 z?dyGZJlz+u$}fiOcDy-oExVP0dLd-DYoJn*VAHdah=vXrh4geyqzL`FM155#6hGb2 z#he)uEVU1Nl?^z-Hd%0B4xY~D@Bz=m@rf|!px^UxpE9V=$2@y@+?+(w6LyYJZ^fGl z;6$9BB4f)jL<+jh!IhsVx8NK_$~)X8pbY28isetDWKA76=XnQl`bq3*>JZe`1E%MM zMv4cSWR&Bqaim9hB2$R??NZW+Y}A^Sy!&${LbI9|j^c0N&IvQ#Z;A_L2{WXaHFCx( z#~FM>vCd$?Ez-Q`BW{)ABQiJPk5BV@KoD+)DSJEjs?LR8wv)Y8=OX0*DU`ZmKh5y@7*%R0caa49Z zk8-VUy=dx|YoHQ!3*scX0&{IEgybS?pt8Br$1AcGx?Z{eBH9YQTNv?I-@gkRbzg`x zjBB8jMKvDG+AQbI_449tN?yT!e#?vE1KY^_Bhs$ns5C}muFmzI^`h-ru7OgP*Y%$D zg7{1vFCbnosuyihxd!TbQT31p<;5~)JKl1=UR26Jy%36^YoM+d)r+^NkcQ=2{UaN* zCuHV@SX8cox?WT--l9Ujr|U)aMOaj>fl?P$5_DMH?J3?MXOBK3Q_cb@PFO0I{R1_9 zR6RTx92T!|~Gm+&{W;JbFM+LYJspV^5;RJ$lcvc(q{b4x&HszViIc+lgLct5fo$ zDS!0|;-!x-DNRo}jM;O6hy4CpT8~}(Kx*{bo`Af^04dmE!LKztxSFC!nhwzP06`Y~ zVL*C9b##g+3Y~2>4iey94qK&Jyni{OYnKz2lH+mIgIIO9S?e&!qlg1mX|TSdu^1^| zkp2@h1)&<@cM%@p>~FBIfPQB@tI~MTOnW;R<2^4|YeDT6wia6xdPcDz;1h@vi_J2N z+XpL_w{?EhaixZ)CC!q9_$2CGVx6MPe8p#)QI~m6Rd1_}qliC4%bug0B@O0EiN+>f z`azP>8Cyr#{_(OTUa+EzuU0JB;Z zWZxQXQ=LP05gCa=>7E6%_mc~LC%iejWSMw)=u3cGrK#pXsYMPQ0=w~WJmCU}-DUD? zIdU}6r8PB>H)b?bG9xF+vd=G!w7r(Mt>Eb4Vdn?}in0WA3>aO1OO86;c3OKpp)k+T zdmi1~y_-%(e{=q-zE%s(VQ=HbF!*Q)wrRD`Cf!l8YP>Dl;C=Y(Td5Av!EHiZ*elkM zx1zU2mrU{YtM07jYb&b*cpI^R`>@xWB;#pU=--Y9Q05A9&Rxyhnp=hPcFLoA$tX{& zM6l_3-iE9dygkA-R+1dL0_tspZoXQo_*w~eQmv@i0NHE!+NjqL5CuExUEW&sk(;wv zGtNrBmV#}mR~Bo;2JgjhI}><^B(T;HZ4^0Q1;H@xBhBd3?lh_g+qZE}+S}{kJ@Q#^ z8XqHVk^XF8y@`EBdAJ-eFanls%ZNBYgyvS*F1kPGAO5bMxEGmo$V82IDB>AXvWw>f z)~4fJWm7WmJl>q4Gda63w=;+S3gz)+OuC|7LTbnOn&+gQqk@}NeTM`SR@3yIN}R8j zeF1xGScH%d-YMyPmF!a3SHrP6c&m6eRbM@err-m2YcIZ9)(zEH!K0A)s@Zf#AG}xf z^Hy}I{@yx%{oPl!nD*_%04om8+nuv6T|zQ9T-;%_iUoTmcH5!^yk9rlq;pq$)MvR3 zL73Q~T_go2yqlT~XoiqPI@Mw6P^<${|1H>x;Hp2PvpkX~MtC(wPrr`{FG@1dfEK4! zq{m3Qu&Pb*%Sn7n+xQvI{qj+#GbC(E-oRA*_`FEb+4sDtcyUI?zlLn)+nfnox7vJl zwre||6+XkD0#$rn3AW$F!!#rkOj%%;1U7iD@@>KIqo=;jjmF5D35!20%rLH-l&Q-_ z>%On9hta-jetvsv`nnmk3|nFWfoG}W?v%9w??7453zsPFRjkYECwR2B2Dr-2A5s#T zY6`f=uKt9S@ZkkKzI{P>$R5I_S47-L9&tTUAKp!II+rf05@+*zgB&gVR6k*_yx~b< zJibA`C97T(Fy)IIm6=zq71lR}S%4w9$Lrf%GODDr9wZb8hD$

v@Do_E1!$k!&q@ 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

w+UYs+Y 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⋐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

nJ)ulY7S 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

G`gJ?g9z3D@ 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

    R1&D|A>@26Fxjwq4TVo+~M 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

    vPMqm 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

    E2v-?Kalx_i|My3)7N6=l6j3x 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 z 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

    7vWkr(l`FzX!fYf2$4`lm^Hu8>j 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

    >$_qcJYw@xWq(t(em5pW!H5> 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

      HAgw= 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 z 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 ssQJH@_D^IMS1qG z34*hK6@p9u8X-9Qmm@g)S187Tj|T>Vvw!)5vwwMlvwyjQvwt~)vwtbU*}tMoliwHn zS1369S0Fh1moGT`mnS&;mn%5?mm@g)mlB-)EAo^5Xa5QXXa5QWXaDjAXaDj9Xa8~q zXa8~pXa7=yvwuZ@OZK1rD-@jlD-fLh%NLye%M+aa%N3mc%MqOYO9{^Y6FHdmxFIRB( zFGq0pFC{qpSA^Wo+fVkdP;mCIKydaiUvTy>PjL1xSMVL-3pMbIk?@@Wd=dDT;PzjQ zk9;cpH5J=) z_Nk_e+i$lY^+)?)%dJUYo)7NclJwvE`o#31+>M+iHoOTS2ryjQp&@TJ6 z2R=pc8^LcCd@*>%C++7DcS`bi&EM~*;Qalbk6hu2@|;5!fXf^b3C=mB5uBHcbI3iS zJm-+L?l_=0l|@dW1_;tI|=#1Wixh!UK0NOWbg z|C~cY!8wNnf^!b>1?L>%3C=mh6`XU3BRJ;}B{=7hs4Cfi&LN@ToI?V^IfwXya}MzY z=N#e+&N;*poO6g0oO4KYMY8{#LqfqhhXjIi4)F!&9O4PiIm8v5bBH52=MW`0=a6Vp zvj3bzLcuwQ1cGx8@df7`;t9?<#1))#h$A@X5G6S0kO=Rh77v{h( z*x!%7#Q07VIOmY(!PU0LM|itk_%~BNADru%0lqyr*OTL$^5vqQGr=oGJ#T=|6!q+V zsi|j~sOKT#Iv0fvric3}^Rg~8+*xe+{@@3J```zFPq@7OJTsfhYhQj-w7VSqQ}BVP z=LhiY?aa6_--7Db^*C$V&sU$pci4Xm>Bg(}?ibq!^^`u9%uB1m!zYvZ>f}kL-C^ht z=bu@`^>L5<*OGaL^GPZC$@%0<)Uz$>;q_rC^;0ib{x|LCjo|v^?~e1vzBd@o%gcEq z6y-T@^h0@>H(bFvZxn)aKRIt?i}IW|)}mdmpYuiwxXc@?1?RjG3C?-L2Y0ZZaNh6) z=e*$x&UwQTob!efobyIhog9D88=>HwHv+*qZ}@_9-tYvUSfbY}`nxlNbKYyrKFyb%h{c_R><^M)@t=M7JA&Ks`aoHrc7Id3SzId4Q$ll|ws5em+EBM_YP zhA%kh4Nq{+8?NA-Hypt^Zz#bzZ$#H7`_FkJ6rA%$AUNj@UvSPFp5UA}T){bSID&KD zP=a&bh^|TYpYuj2IOmN(aLyaP;G8!+!8vcZf^*(*1n0b=1n0aFU7hSd=Z#Qs&KrT? zoHu;IId6D^bKYl5qn^?w#s~Sj;;+E#P=7xd&x9*YyGyoD#Wk0q{-ePM?_l`R;QV(p-8W7B zA7z>u{C6`iLV0Q~eqD)rGImVX^ANZPz6RyL0}p>R<$2uLH}`{ov2T8LRr}-6m&Ql? zvio&1C(H$}`zo0eil`o4{*awayPOkFCa!Zruz{S=f_`#Nn1^~!K|Soh?}OLHHzxbfIUy9Bb3!0E=LBDH z&Iz92oD*EZIVU)Rb52l#b54lhFAn^Ob3!OM=Y&9T&I!KYoD)33yG}8_a{>H<{jLJM z7Myd!Yv7H-U$(v4(lb&Y?OqW*lU zU)Qte&W29}=bTWNn->$A69Sa4Liu9UQ?QGv=P>Z2z%K!R9egIZ*QHBLMuM|%J^+7V z-@NID_Q&B#)Kln~eojC=M_+4}%O7kwpHF!Yyh4<(nrg~NqI~XkhS!Pm{{VM~B)hhKo;<#>^Yw;T2wns33(m(wsxi)-b5>J%{k`9c zcJncA18JN!pCkA|;0pz>0x!)r-=oY$UXa|L@b}yO?}qdD%elxG7L@1Z;#{;u)Wf-Gf#95r>cC|#x<_!%MS=b}(>&P9RXoQr(HITv|?b1rfP=Un6n&bdel&bcU>k?cR`qEK+oMSL>K`GRvU@&xBxp6Csspm*=uIFX& zDpAi4H<|J^qMm!f7m0fM)tK_1ihBM=Tp!Pgo-;k%AKUXraCfQU2Z0a2*_02!4**{_ zz5P7H$A7%-Os?SLKYyiqv@idF{?K8N_%$1R((Y#5X2VcF10S(RayT#>#bM`dL z#rf(0;yN!yZ}g07;Pr>|kB5G8{<#bFgs6wh^Z6jBXZv|3ygT{(Co?`{O6XwLez8*}gxjfyVFHA9tb$&ggdc75(S)AR)@j z{e9;j$@P%^aT&PuM^}_*f1D03{V^1r{jm;Q`r~9#p8fHB!Py@xz@)s^aN*rbOmRBbOdLARD!cVM)xNB&;A$+&i)t(&i?2N&i?2L&i?2M&i?2K&i<$b zXMc>4=Xtxt{um0*{ul_({^$#S9{l1+_yzmp`{0wo*&h$N)A-9=;V(}RkN2-^Y}%1n2V?6~o%! z|9t`5fA+gKX12e-zY6uYOiTLvg?~58<$(`CyBSoE_T@R~5BvKr#I?Vxx7zpj0R3ct zuR%Q_>S5np2JQ`SfB)C7Pp<#$@1y1$&dbZk^8-M6YlCl@gr&J$fYBfA;rKaQ62=aQ1g!aQ1gkaQ1gsaQ1gc zaQ1g4IQx6_aI*jG@1fxA?}6a#@4n#d@1Ef7@2=qN?~dT??@Dm?_h@di|LpIf;Oy^# z;Oy_d;Oy_7;Oy_N;Oy^?;Oy^8aQ64;p=AHr-$TLK-vhzf-+jT^-#x+E-(A7k-yOl( z-<9C(?@?W{|LpIf;Oy^#;Oy_d;Oy_7;Oy_N;Oy^?;Oy^8aQ62|?7w^sUucA1u)iNW z%lOd`;Oy@!zzg;@zRBC|?PeQ)_m>&M{=SxYd-n@mM_l_|G3qJD_I4roZGwLUo zcQ??_F`}On?rFcDnYE@rrLD>QPzN4suBo$of~dmm!@!};NA;yOQ6Zzw;YpPU~) zLOole9{zr}pnmG{@y43*m&XU9Cz8Jl&JWi-X}HV}3Y>kG^TR}N&Ix?{+!vhlLj^eZ zlk>x#qCDq^34(KeCQ^MfZi=Lc7C&JT{@ zoFA0noFAe`ll|xX5DL!uArPGNgD*Je2TyR$53b;x9~{9sKPbUDKST?X{pb7;3eNc< z5S;UaFF5B1PjJo;uHc*>9Kkt1D8V^DMDP*besX>Y1?T(_2+sMz7o78hCphN^SMbB( z3){jkI6tfaF9+xRu;0DLN2-Otgv8_fDPAyJ@*|K3n&!0ckAsP8KMGLKW+;CM_%otE zQ^8vVUksioUarCo zoPW>7`3tURL-(6}ccrPPaX|aabvlmoa6RKU(4XPxPsIlE%vh`sT+iVfsAnJ4<8EM_ zr;2etegpNKfqG6wJ^0#H1^BgsUk=_N_$|ca=OJ&D{9f*gc`tSTL*{r3*S`$){2=OC z6_@X+yt-uhZ;7|Jo@C!|z8CirbA2!8oSnc+!T*eg{|meh+y=jY1N9&bBe{uL>_RAb zd|zCCIQT?SerMvzo|sS65Z_ei`Kzf<^wQVU=+}G1hw9^vjpkEMOqI&6Q)(l;Z!0?y z?@9Hjv8JBI*bk}&cW=&%iysL7DtPr#hMP|*)%_veEEh4#uYl<#!>j`xzc)>YoaJ5xA-|-^g9yx73^R z`4=0$3wZ7VQ@=OUjQ@D>l9=~atLB>iRD+*QTz`+HALhoS2lxlz4xW$1-}~T4v0fdQ zTu%-puKVx5W%|Dt>iG%0bbs?bmVj@$5bMvW$$E|>uE%rF7fe6RQYf{Mc>F!SVe0RX zdVY-S!9*MR+heAD^GJyEy6W8MtTx&{p1;3rR z{#{hxXnM%~S%~u02PBv4WAK)%3^(qt)SxGH{p-K>-T*%*=G|3wt?AFs`2Ef#uE!@h z&#Vu;ycf{{gm^oE`zf|SQ}y6MPt%{TP|qsjdi+~fB-h*XLQ}s#!HnB(sAupZQ@@jG z#$k8xGl_46_ig2N;=2C)hUEAAD)`#xl6>UT=s&Kz;IXPCu9x?=?k3l5i$-omdG84` zKD_;TH|A}7V%`@%gY^x+i+(6_C2?-6?WY!@{94@iaS~>Jy@B$>pKZUMb2h+li~0KN z+d^=^!F*qw2i6eR1lPWS05BI`E+0)Uyfd8NS5yvu@Ai@9|LLaXolG$rlK$K5@OC zOnf}q?o%<(RW6?2!t3*=s3-8ua{U?Y_Ib|K-|}a}`S{ze#Pzs^eN8_p_QbE-!5hVP zV+FXv-_giM`5{Y9Jr(siF`1BQW*qXoX;*D-+U4=QJm&at8wrT(hJy{ z#z$;7iizubg8j@m^Ku=B^3^Y!@nj#VA+G!1vbCw7$Macm=LOTB8_@0@jk^BzUr!Q` z$6;Udy>OW|ae4AV_yw;gxi6W1`ob4>0p3W!8sL_})jqYFALCzxmI;XJS(alIb8r+1+QC} z{2qtAY3eV%){M`;yO;*bi0g6o;e&-}_bTFM1b+?n*CD5wZ%3)% zZPQP6j9K1uQT{pNdU^8?H~pCoo_fdd=pnPkn*#qWBd(XXrQXy-lkw|HdZWibT4-A2 zdNzwpJz@XkcJDso?JZY`@`V-Vo8sTsaqqT2{xgWj+vingP2lBSKwK}E|B0z*ueg^= zo%tS?>vXfcS75!GL0s1p9cq?q50rlz11vLl+`mjc)%ZPf&N+j)?q}&5(@*}rJQnk|HJkS@qP%yYDbN1( zJ?d{f&@2~^PvHlqeh0aN{o-ii@$d0yQ~r81^>>u7xX!GHe+6%d`TG6IXg2lNeQEl0 zB#P`C^YzOgLtMApGS7U!eNp7D4U}I+T>p+%iJZSK=Cr-K%d8<&QP1@sn*J!)ELW{< zX7pQac<_Q*E*|F{iR=0Uu|Iw?_+&hnrXSZ&T=&1)He2$?!BZa@9)51>{{Y|niQuI# zncvF~D8Gof{@(o>Q$8E~bCj=k4X?;DGlqU_>UU2x>(x+{-}w{6D+E9GQ(gc1ug8h& z{(CQ(dfvqNT>qKrPa)1no4HD@BCgB3I39w{o9gqq8Mi|0*YNo4L0p$F75m+jP`(t$ zTe$qYDDUiNzOP(#dC(W8o))p6vJY|neNBM>^7i3k;(9!t!*k*q%xEiB*@AJlOv%Gg z|9!+aT7P&{gz_H7ftPoaFHJqcRMSJ|yMh;DJHzc>2=2}{zl+t#`Lnrvmf@ziNc6o4?Yu%jN$LUh%5oX6clA2fTVgvY)wY%(z834tx@peH?M!ZX%TpZ>nwn2Q`O)9#{;dDniMXz(Zg6UPy;1ECy}V=IY>V+&hJ9ID_F2;KD16%LM2V>kk#>*yT;2jnP+ zj$U%$yZcfPxZljqXKZOD*|L)y_kW(ho(JT7H1F)}?Ck9B?CieeXAqZAwcSOy@mH@( zD`-C&|8JDLLdsP+=PUlHc$gZLdk5hxPwG0MS9|^#xMvgbZ=b-Axyf;HeSLqB`d$D& zcN1>>7{)J^^K0N8g9XukvHj0NpBgOX{sw%i2si!uWvQ2x;y5=MdJv_3y-qmG--WoV zj^oGul3SnW5zh1pYn}cC;ig^~N5-LyE&l^K5l1QmUJX34SS&>4KN+|WZx#Go(K>=BHx_xc-Dd&sI8JaKe{Un4_3y^I zqZH+Sr1VzYa_e=4e+Smf>Sqohoa^gHoJ#FELO9#iSj2_YuAT#Z^6#PtotL((C;Z*7 zNI%^R`gsF*>UfcV7s&Y|;l{2o{;J=&W_`x9Klc&NdW#G~Pl10}Zv)|zD$Dc_cWnrL z!k??nyg|6B*Rz7SQPjT;eRjF~Y{Y!BKgSc!`j1=j|10v)KSem#H-+(f5?KBM+=ckq zjlidDEcE`QSORr7^I1kX>!B0-0@_}mfIji9=w}M($8I9@9e))4-wMApk8qYJa+1(5 z1N~jV*0&#IrZK<{iI=$VJz7PB}>{n_(J$Y;JxAyfO0PeQr_iQ8d&K**28d@%B>R&RTI)>x;QNza^aY9K(ED^?WbrQz4)9PmScyRq-- z1s)>Y^xuDF+R5*M$Ef8=Q3F`VnsasM)dqp-BE+Xy$~*WJ>-7vs0Xb`t*X z*F+vPi!+CC*0X1b=wW00u|F3|% zzmSpow@}>pJ%oSC-mf8?`$Y`v$J&)10F_5=Ph z;koR5oxMb!$kEb{i$H%MaL+`+tANiUob`|#Bld6-^!c{p<1^c3y}fgndkEpo$8Y(c zIfNVkkM+f_DEBIZZ{uwEywrCP@P`TK_UfE1@?4E^|5e~gYdrlKc-Mu}zF&e*V2H@$ zIy+PTYYh&fw66yU=W^Y+*IMUeUjvUUkbbB3GlCLqjQv=7K_?K-?YJT0b#9cg9Q0ie zNRQBY%TK_Q=toj($2oLA*cIYP+8?8Y=dz!B4NiJP+;}IH`zHAKta(E1{%9}k7ifLY zH+Y(2@Mk;^{$(C~$^pXPbEw$cB=EVMaMn-9y_xO)G~ulOIL2A6@7$re>-&_!X`c2{ zX8V3mIP;0YKf6)xvSGRTd_XwU+wt(7JYu)LGo;_m1)nPk=XQ5?mvVL7dCK4*O8fea zSLlQ53LkCX$p%j&#Gf}2&iaX1`>^kWPv;?0?pvVWph)<8{wnr=0PsBsXFgrXW7Ph2 z1n4_44^&&4XYg!!t_FR4Qz=*5WZJb{_y?DYKe-%uHQ~%Z*$4qq zuLTBAs}TO&as<<7e-0v??YU!x@P8Y8LWZ8!t^0}oD=@#hEDxWRgtPtltoi452a22? z`p^)>-%>LU(xZ!`YXnuR} zxmfWBWxlu7Zt}y5!-S9fRVi2Fe*Ykx_5Up9x8>lor%(7tUJ#FWC-Aw1v)416Vo?X+nGXqP{vPC0Z3le)k&I`5_B1&4yBox= zv>oe!cR)_`O6PIHjla5I%B=#+Ek;SXN$iiSJs(7Pu6f!N!dY+07ey-7+e*VHTh4Vy z3w;;v51av#Qo>C;-X!gE3GjO0DXbUJjLw^t!Y5_*ueHaB{1I!MI*4%QA4lH85b*y8 z=v~`mp|tBUz&f2s)Q`bI{GJ=_SAmkmA5E8zE1y2GoKXJL0Z=Bgmb%phW!gS_`Amoy$k+I*Mr9r&U%YoB=VmOy)7_!w)}C>cRnZb zKLwIM<)MF_aF)}(yIA;>JIVuxR|7}hi28@W5N`S}#zCFO{z5p{s|#`FDJXZ?gxq>Q zhj1=8i2Oj2)^Q#Mp7M(ZsxZ**Q6uFh))PHcfPav1;|FlxsrrG731|L3)gE3Y-01m0sp)6nzm8wz zPhnr_Jm8lQZs?&Ooo_q?ywlpp`GIh?F|aUScOQ`(f0A&cH>}6&@z9V-x#>?cIN7tc zud$qPmNVHQ{q$_~->vHe51ua_kxU=H{FQ`uNr2=RXJiKY_c(ihbS* zyn3?mNn*V-843y$&hprCn^!;|!+ur~`0RM3wAY64!-IgIMmY0{j1YN_1pW~4*h;Ba zxm4R(?clILMpzpxldr&#>(Fe!`6%{v!3g6Z6LEV?_TE%dh^9aHj7%U&j5B;D0;e zY;W=FrAGvTZ*eTz@nuouMDX8-aOUH&_M=|~?z>a$LFWTC#|eGsP10UEKUo6YbE?Sm zHvH#nz+=`v&U(KUJ`wC2?g#oOf%}?-&!@o09WU~GFfSD?IZiw9PHR896SylT_CExA zNGYH7#lN+H|E>Y(xkYfzi>(h<6%Ff`^X7FtsH}dY>z!w`n_($5;Zb7MUa6|F8 zx8t|zgd6_Y7uW;%MFyw+3oDP}LGVc;KaIA(&1dU+mOuN`NO&&0U0~=*$L~pfMca<^ z1mSEC9qppwZNRcQmH~GiBmCRJ=l{URkNn=ffS=bOd{Q`v zg6{6T0NnGUwBro4*FS*!u&*}(e1aMNE}L}RM|*9<)#PW$>1d|Xe9ex^Y`bEZLW*w@f~>L&;{`nTe`e<$47$z#&5 zk3tz^r!!7=hd!)~9QZ^i$3AS?fgb!FZwlx(ayb{h|TQW4VxU<`cY3 z^!y)`dw(nBx6XG|wTT_Zur50kdN_}8=973yO4R=KKH*$12YJ_O=NmXh8=IMLwLFYXjOUjh1M zzlkvtmm$+MKkZOD+T`txCeO= zI<6f^9h~Vqz7aWfzR^H9>$AhkN4>((qcUk<9}}Ldzib>6y(QvO)5&vY<@=Wb}1s9%S~XMRsVmBp{MZ$@eTD?e+3=~ ze_f}qf2Q#9Bfmwgn(UBpwXt+Lp9Q_^6rmh~A3rhlw0?P4>U#w6lHUpcpf%5#0Xzl& z_BQl$2jT1=Qp=@uwX2f(!l%>nKdA-MF7c~{a$l6Y`B~6E_LsFkRuj&8^V#cD;BISN zi<~WdQm;t8R6k1yccZNIulor%_J;ne^V_e0yIvO#Ct=-JzfkDouus+b)r9Nc>HO~m zedGwS{NY%4JOkWq<+Bx?lbg>9gVVYg}X$pIZs%{_fl;8rTY*{QrPQaPCjX z@f|J_`iPakQARlPPyI&f`wRL-3+Q9kxuGi!4k6OM9#{HHL{6GEn9pZ~bA270tKA3B zY|{aGkUvla{3zhAH#7V74TQ6tLCmXn0R6@n3+~=bt; zkLGng10J!)(=9Jy`s~k8!dV{syvBKioBBQ??RyU%t+-UmO;~wQrvbOmXWe4(>~der zga4gy_G5nQ{+2B-lXBgaQeW+N2O2z^{{+IBPlvT0SwcA1*S`1Q9mTDD)U&S;`c5mp z?Ya`}WzCl=2{-L>qR6S^ekbsb$7Nn|EXL&>7eW6!$#{JdsxpFbmVY_+(X=0h31|L( z%%#+%R#?{@LYDX<253W%gSq-Nw~3}DN?V6 z;BynCPOv#%5WT~A2A)^_=VaF*ZBC#k+c=sPbL`lqyBgmb&hKt6*=Mez#Ir%o05wZ6mR z!rx=X_acOIeY@@v{<=T@8u0j8nfShoh2CSGn`UA_p$2u@>lSQ z;M|}3tDSEY{z;5GYF8n`nNP}YU(m;5BIno8^K-zR1H~g%!Op9G&-}ALHxthKTxjhV zzi;Si{*Qbu_5TOmB=wCg6U|Qs%gYF7IXf?tdBUBLr|4$EyD;vo3wfq1ZjJlz0#98k z@_W$ns{Q~y+$H@~^K1{g1@hoMxqCpK2Ew_0W8a89sGgStPwbqDJ4-|l%dPyV%L!*b z9_*Ltd512-xxW6jWV|>8^&NCuZat4TIPpRLkB%1$6(1||1iYcZob*Zwh~%htDCL`FAx7{v`DCo25b@L7YU(tt6c3UGIxO zycYEe1NT^Qj3tC~|4lraY0qnQ3ZLKt(SZ7~s|e2}|0AG}S?9w31-#R;^K-BEf!+I^9<`~J}LG{Tur>R9R5n_yA>GU2)O z{3+-Y);fLHOrCRuP^vr;L}Dp+kb4i=%Eex7Y3*NSls`ta_;ev@JXV-t2_@8o=ZO| z(7SGv8hs4@>pv`d=s^B(Iq(|@XFnE1zOmZdOThhq6F&QZ{u}TaWX%Wmc?5j!6uVOY zFqLp_-?()ya+Ak^Un7)Pf&bBjvwniOUv6LEX9G_n&Zc>`w}Fp)JF(BtLBD-Mag;lURQeLXV#$He-h5}CoMmG84W0A+`i#F5XPX-+KvXIo+`Hy+Qv5@YsFQA2n|F zlfkp)-1Y_Lll?i`;AC$rMbBq|y9{v+w6g~KmH#GtLM#uq*IR6!Fp5WybkmoSBpGD!2eA{Px=4W{dj99bKB1@gtMHUdqmD<= z{s+7Y`QcB_20n>!!^b+`u>kbGhegg|puY?B!Kyw<8uX8S zy`gB|&tGSGvOn#A7CBvWWkysj-O_o8aIRMz?LHEZuJs1^TlaFj3EY2%w6D&uc6d|x zyKfgO*qj7^Df!p_3ZvU2)+X4SCPth`j zaHIcgM3Pg{-y@)RVV?_XaPB3X$BQM{7uNZ$XNB-dR12R9=;vhMLCb&MLOAO)g*-0x z{~rL4-778F0zQ-fBIQ17-Iq0=aPD^_PqN62iG$pLLG@D?^XUr+uCKSE27*EaRZc`2pdq&p7fr zbo|}=ec&gGeoEvq=Ul?MT*ta+;6C7qMj<>FWq)q?qzQsQN2G***E&)!?Jo_$BXX~4UXSFC)lS3bK+xoV$p5zh5>S?k~J zJ`g;oaNPiA@LIg*ce{?MDort)EXo-(jsEcm7by^;!ASmwY7k{S5D= z)p|WnILqU+&MkfgJc77~+IjKE;#WPEUu`2im;b!d;M9+>URa@3`9$P&e<$|*)B5tm z5rpUBb6p<%Ves({7d>xCrpKRgpQ2va7gqb33*7ZjX~)xq+i z-{bssIp`Y+XZpyIV$aKg#|dYB+WAq>f!>ArjP7@D{JHRtV7=xBpQ(g1{{+^9s{b>; z5ZpcobT9CfH4kt3Qs{kFTslcO%jsMwdN>^w{*iF@!wH;&?tnZOuFTyoUlGpz$YY)N zT=;k4@5XvW<9m+-@2Zk=b-er1;3zEZYs;@ho)q%;l+QlE6UdVpjAv?qyAe0u5BRBs z=d!E67@Yi@buZ%9UyJ+^-R`VQ+{QWUsj-GBQD;aqMKd7(5snUD7$B4^@D(d4zjj{xpER`h&4F;bwfty_Y)A zYzBQ2_rNRvtANL_j>GWcJg)TCy!UT}vz#d_j{W-oiJpB{9_hN@h&*weM;?y)9zrpPBcwv*4Sc=(H;PrNRgtbjZlekbMH_tKXV z&iafYPT~jsxr7^k{+jR+@9H@BfREeSH~GZyp*V(>FJ1gS^U3~H=E1Ka+_W#^IS1g; z7Y#l6L+lsBJv;0CAaeSxcvKN^k2M|z2sd`POzNfn^9JDd{q0W!_gnG&Ux24hmj3c0 z46f!!X_xP+=oJcU&Nv z*%|Am6MqsuvFT#@Gg0m`;P(A&?<;PdJ0ABl?BqV_?~5S9Cxn}NS@*r{N(lxz+nsQ> z+eOxVsol`i{GmKk4{sCB{8N}0iS`_4>;L5DUqm?5C$09Ho`?Qo(0g#7e--LgMQ`w6PUGUF3uDR9~-1Cvp55k1$O5njF(WlPe)>=>G^jPuvQo@aYv+_BQ0`9TKwYv!C z_DU`neQF)wR6bU|%_-|kx$c=Fr?&gh4TMjpwf=1+ob_y<$KQ5CrqBKyMz|TrF&`TQ zl6weeJ|4?HKR5Ig2f(?leL=tdMk0^@dC^-7^xp`))7tNT_paRcSS}-aE;ohyL$n`# z1>AF(Ajg3J;EhFo|D#g7DUhcQxZ9dx95cDpqzkfAw~^AB3O( zgmBhp((;o#ZIN4_l?EsO_FE}e<2(z2$8gS9<#`ggGfwE$4%c!)Z#XxkePJZwT(8vY zLVpD6brI-Yd&qe73D&bu0`K^(;MahDqb-Gx&)UcI0Z*Zys+`k-yOBSv_;rNyyuyw1 z(ffe^bA}%ONc(yZd=kft|5X3B?p9J?$Lha6!nwY_FQvYX;B_K!``rEYz>~<&nF#tX zfp_73DALM~Gh}Pw?`abLx(*EjcUf`2^9-I=A^f>G555e1I*t+k?V$e_cpUmyeGc13 zXvjZm&Y|9YKpw$BLmYt;YD+gA8Q){=774zDHL_$%aJEkJ*K7W6K(ue1)` z&AA=qDH4BP1iLzyaPCJ-u%0SMz5WDx7yPHz>lebgTsy9~@Ahc-Lq&2A>UBKfxyH>q z31@q-^M76go^)g$wG{HKKS=l|FfWzS+;I*eoaKMk8V7@*@5KA0ZUUe4fX6KRd>pvP z%7_0}`B?W8zP^LVpMV{ze)imv@$ApR1}A_1mh|7p;FqqY{RZs5BU zZtM;5%oV`TA)L$g-Ja>kz6S2OP1-97IVbHZeEc|1r|YBhfk!qKJ*ys;0Z&X3kF}=+ia{bmm{sX%~52M7wx0m9bLkCNJV>mab`}^+zPb8$joP~OYXn^MW`jLO4?Yjhc z3~|D4|FDOY+krSk75FS6ocmYOnje0sxHbOH-BZeqWB=$N@L5cFEANPJ0WVByerVNrbbUGhkQh zC+{Vk?Z>|F>lffI+!L<;ylfxnXIn7@J!g6};fsmC8}nfue~X6*fBSy3vB2$n>Y{|R z9^7wBiR3QKXA$VTkS}p3^!yX(?ejAG?JMQRtvKfsgfssj))A_ouR-rZ-q91_@7<5- zvp@3*XTA9^7Xw#2{F9+4eU29YFa`2^_7{2|?iEpe{)=#yr)#0;^Bojbbb#Q_xq|Du z@)W|k+;~{{j{yC!p}-eQPuUm!JxnF`{e&dc&`5LDH8hRfzmEIPn$+K>mg{}Gjkc}?ftTqgmb;( zPl+XHTxeV|^suw&;cuw#nZT2Xuewo{uL#d&pG76YKLI;e`#BPL=c^*W&fBjiob}L! zdZ|Bo2Y753v6HjG$VCT;a+O<^2fvPR=I_8C>i*j2z!QjrX@A_QROs!vT%F=pK2JOF zt}jILZK0r#2Xv7HN<9b>6oUZLiIP-~Ed0Y<~dI*vBwf2D`|Mx3IejQ)-2fh#NP5a%m z2B&y0@;4@e*KZCIc|2CUcQkPOp7Sv9$m8PKEa_3EYRg7qzR~fqNbi{p=0>bQwHN zk@$0q(IQXs5NR*7M+V%1RPu(qgXohIV6VCESthmY*gtH#v@SmliPlDb* zU*^f0e|vym%JtwL8gmb-Ir%V6U{i92PdyW!2xe)Zv0PnEI-;E{-pE&YWpnm5X!r7iX zCx|}P?>!CN!97AV!T%@1S^fm#Cm!H~YlVN;@5GaaBns_H~mn;x!irM_{n&}nNJXjnK~bM1h~uchbs+#(m&Qs zs-HcN6h02#-*GeQbwBV<>)g`^z*CK4Z$E;5?W2TG@?&YoAnbo{!ns`%$kW>$>&H5! z$NA`I!RK<&NB%DDI3M_Pz&jAvReN^Pf|U6?SBZTVf&OTN;~!~XcM{I}Tw(2V{T+N_ z9}1sWU|3rnox5E;dGO;2&*kUOH1yP7$jiDHGX0)#ZpSX`p8OAhN4A!cx(J52<1tcS z56%lqE71Gg31>c?ozk*%!GDRNPg4N?TuC_Vp&j>}t3985tni6g=Zm|JV|w!ccn`>6 z@Y(LSB99N}1=OyN1fJM9vp=4#^wxar3Bp=J{+kgkHJkmGv@c)c(meY^8M-}w&`v7q3e8*uy(eof{|Mxb+*>1bsB9HpR zcL`_yaVzezUA^G3apIRW4{9pm%qMwHrk<|^9{(KrM13DLc(y%!mIwDvMf+Ow#$yO) zIh~1OpYMbJGoVjlzNhoy3V!~@d5_J9Z#!0q=FH51PKga46wXBH_mWKpwTv>j-E5_W9z2LPBrH>jDPP*4vYL@GlAH{^H;qobLaIrwRXv zmA|@JaqFJIKPzsnYR?gf1W{Z!*}-+})= zSijGJO7@r`{FBJr*K>argd06u?}vH>xEt@i(tdPEnE7OXrV-A3l8BQufn)`658^qa zfuAu`^y45-qVtpGgd2OfTI_HL=>JK$u{Z2HX#c8e$}LYL;cSNyt6x8E=&4^IpJW*L z?>S4#^#!E=9u53B!r4xOIG3mN7XgoB|92?p|3o;;={s92`8D7>Hw&IZeuBmm8VEP- zZk>;d0goepQpc>tz&%Gwztj28bKvjR_j#e*K`p{RZso&YL^#W7$6cQXeGKo3t_Pn@ zBDwWE#^A)~OOfXc(4R~=^Y0ua{%0}#&mRfrb_rVNcZQxQ^s(QG-ZX!8Ea6N)!^-20 zfxZjxLwBRx2MA|Us|Gnmh~TOp729;2Qi|hz0eaU) zQr`<9&n|5uPtw{Kt_SXVF_X`Az@06`4!^{F^(DetpDyeD?`ubefBYrkQ-N|Tfv2_- z3713v5#aXuzKelJu#c(Z!h67D$dh>&{5O~_<#xeNbY41+aF#O?k$L9fDEB7dN$b9& z(Q|}P4DWe73jAjgZtU|!;d3q$CO#pY?P097uGw}j^U3~tdJg)VcV**czv2xmKw&yafU2Ko;0iQs;)D&Tb|34hnQVh`icE(-`}KK4C1UjvWe z9&(+>dQTR5KjOM-C(VSjKJEL;K3Cj2UpDv@$bvH>~$THxsVDG`)4MBAofVzZHEB!H@3)@4$Xp1@Jvj6ME-VpN1>FgjuHV7la1K=MZ6x8WANxHQ zlkdu%4;ccV7}j40fd3WXW9Roi0z6{n#r;S)x1${|-FLpo6G8q=CHS98IMXMPcRCyR zbqfUdA%A-$@E3u1;@;ZbfPYMQu70ukStu9wp!2%J433A>zAhx(_yO3V#;=B-EqsF3 zeF(D%H}%E2Y#Jua=NrPgedEXr)qZsLLcs@F_ZwVKIJcJz=O1-F@-pc6vF6)rog?&q z+{>irclIEh<>@>|`pW{;EdboUe|x#%lcoUtnF4*PT>A9|zz3Zx{QXOWzs_T)19zaW6{q17HS#N$T9{3jMU0Cm{{A*nx{1dl|BzmqqY;Xvj_VpI%Jx9yDXaauQ z=t3#iIYT@TrQe&+-h`X}J5l^(1?XoO9REoBIvMm`BZYo2^m&uwLxsPT?$G^ZVuu@A z>$~GF61)@VHOf)O+8vBNz@Ox^vVZu$nu=1U@y+rtX@O}X|_?!v6 z-O4+1E*1VkhEetd-I>hDp)x!jl)-@X-i7xv3^d_4Fv;opV#lK%zr1cCdoPMHk+ zeBf~_UnpU45T$)>dO7pY{&)#zIg{5(d#T=L8G7>D7XRxAXZ$BInO2cNB0R-oJ1J@biI3uwSqEyTIK~ z3m@%|dtaSfpN|`y{K-8+uX#9M1MfndTpohT z@LcwPfx)St;$EyG)ay0ESx(=vnd8^i*NZ$U>-`7^0e3^6>YrnTGatXT-h9~5qp-BE zF3=~f_4w{LNWB)pU#UMlk8svc7xwj3|BnGrpj5_~+x`-iI$NwZfu>#}KpqquyK6t;m>hop7bJ@v{px@A%|CIazdI(5; zFF}1D2kuyTbpIxt+be>71YKWL-ooDsl#qr=fPffN+*4Y31|01l)d)*gp)Org;3h zWvB2-q@?HW3w#*itRKfZ-w_0T*DIn2mH$fRgS-gMdwC3a66+nECvS4M=q+jGyBZ54!VB)0=PZSZvRKguXgT} z*7QT3G53o6iGY;272=c60*_<;qVtD!mPxs>=LNY9{&R1_*`DL`#Xlb}!>4l*=z~`L z{~6FnVnV2KjEnD+_KI2aoO=joea5~Q{iy!`4%`U}u6o$+e&`4OY9#7=yyDimm8FE6 z@dfR;1L#*0&i&Dk{0;428!i|Aspq6zo&VGlo@;)%kZ|T7vBux$fjfxr>H7NA2ZX;H z{Ybn4y$2S!?@{sdm1wU)4+_2Sd67r$Y7+4H57J)qFz(z%ILqT$=aoJHz57a`S3c`M z#Qd{AM;e^?fL>bPaZUoB!n_gY;5pNy1{4TM}@w_%7?j@aF)mQ zn#iy9{WIZQ-*)Rhx@{j5dOzkx+TZJdJJ>%`eJ&uJ>y<*Dm5w9pCQ#pJd*09vLKh)AI{= z0`J27{|kul0^zJrx3%xH!Bc{FU_PTVdw?f_>p7`o2xohUS?7jsH#o_1spwh#+w-7b zZjJBzKP}}3!C&p|2*Qp2ai7lw$iL?^Qf`N}k6cT*u@mIM?gaV^fP1ixz7_a?fG4bZ zviDix|Li-W0ris&2B-PVwNkGk;L`#6L_+AN0DlyCJMPz2J}U|5dfDTw`#F){k34hr zy;lMEV149K{)DsspT&D2-N63^`Uvj#eg++HZ9ryScxNmLo zhdQ6x{WZ{IKUDo;74Z1w;y0ug^!gRxz7M2*HU9HDaQj}kAAox>pH%NqmyEx{B2CmPUw;W*)@ zU;JD2xdQTUy+Y_aEIzjb_hJ5{{$b`{(C!K0^CJ4oa>56LXZqKhppRR5KAXNR<=W?Z z+6iYl{n+Qyaki6iGw$PF@u4W>1JL`dedk@@5&m)H3CxE*Hv>;P!ddeJZ&n;}SGCXb zcZE;Vx=;S2_e4(LH=+lzF2~vTuVVj6%P-waIM*v>#h>3b^yCL{e~9XNqxYFU`?Cw- z-0n%_<+?#~K5#oe_6l%6?pho_4}nZ$9fiIJXl)_K$z!cG6hdn)Tt$SH)g z{O(CIA|Hrx|4qY(?Cp=D&&xsI^7q{1#Vv#z`?2ChuM^Jv<5;KH!>%^}3VOr*O2?6a z!P7M$e?O@7h)?SLVI|?FTx%Se|F!T>V7+rPSl(>#Z2sR6&U~D&rCrJ};hxncxcxrv z%LzC3v%lDh`p?G+=k`j#&**&hE2X#YNf`1E;p4;nO7+kV-186Vr|Jjp0`C7%=KOz5pGOt*UcArH!%U^EA$8G?95b-GW8|(c`^y9bA*^L0+)g&G6 zZ>ZP}gtOj~*7>-X2siUm+z+_`^*ZwZgx)^Ca|+?6-K~AhWx(xwBkRbaak(z6b8iLz zX9;IMK5Kt`y>Eryhdh6^w^G7cKc8V=*bP1x8+!aB?dv7NnZKQn@d@}$vCcu9{$1|= zbvNNGzk~Y;Wp?d29{^A8Dt4lFxa;>)Zpy0HF~IF}B?|~={;4Hm&pJ>0f^c0!rB%z> z^ar8u`cx#j1Ac5@;11SVD(4K~_Wo1{;jACm>0-}EfzL|NcOvgp`^C;bO1Yiah@3jU zj|ZMwDSDU>VPghQmt6jS7xeadcIV&FGy0>98jf=y;VftDB#~3&QAm)lz%GWMh{poTmn8Tfx8Eb|5*ziIIxz`$4?denGE{RfG4eT_gZ@$(_V`ZpOMkf zp>$4`hsL#SrM`M^$u)+4bI13hQ0@=@FMz)D5TSny_`e7@^|kVX_N0TE%s+v7pjaK{ z-2qQo_kG<&IP;0&JwYw12hevMDt`VJ;Crkq^mbfsGH^HS#|!#Xfyb=;pGOI2IlHWV zkd4-ZJjg@S{@YAA+kd;2SMxULJ--n-N2A=|Z2&!EA4lV0al*O2sq>|W-V1wsnsDad zY0ZbfGC0}W@1>R z9))L5B%I~(So;Wf5YGDdO&80o#k_9sO@zJ!dA91GrxKp4-17)RQN}*E>pWYfpC^Ti2JvTAb%Y6U3hP}=Amu0nUvdZ#ZeC=oa^gDd#V4Q4&2#C z5Y5|PN;u0I+)@0@i5R~=HT2mHu+Qc~Z}-y(;asj`?ZZ9{Jhp?3q)%Y|;@Se`TJx?O z31@x!ta`l-dV760bW16>^Et84ry%k~!j1l|eEzSyacTF@L0`9(@JTKZKC0(?31@jC z*84J663+ZxSP#lmj^o~1aQpoi-xALH2_o)SfpW{Y0iWTSe&eHUg+79Nx3s@+N-u;m z_Pk^Z!yySiWx(CDq=$ZihW{h*82qrx`99%nZw~IA)Bb+&_9Bn{9-?W4bGi0?o)-|# zd}2?FU)mS)JOn;2+(V*%;~Vg?&&BUDi1}xKrsToTFgW=cEB^2(;oL4Ah%4&2vtUPQ z$Dp+jdn@5wFCX$Tw7C!7 z#|h_t5y!c_{ZW;F63%*#ye*Qy1An;dZh{BvME;v0&mReA`8_GYM*?2~ybEzrU8np9 zcx+Rtui|Bc(Y`_PGhVEhn+P{{dxh{<`YVCkamZ(Z$Bz{LI{*9^@Ceq$%4gTzrQA+y zK7TH72l+ypCs4eH*t6T(Uv45i*Z6xb;l|Eeq#bpC;eEn$`IGhc6ngu9hNZyWnD1#^ zbk5$8$2t#q3-IMuT=CC@vp!w8=X?m-eZzeO_hX%MEAaV*v;3XYL}PmH=}p3O)%Qox zJ8#Rn=1BC%$dKIhw-C@d`4<@-9H)wK){lRzv=^p9&UQlu_uzbYG58+_+>g8?<#VyYL6r7& z2jMJ_eGmK&!$h8-wGLfCIMb)l?vudl70`QZdJpPl#WOzx?teh6t{i-J@d|zHUBPDn zuOZy%;UUrI_vqI#!daf+72+QfpuZP**U5tGKFe$1W51`Y%iwr8?Q2jGmz(_=O1PO1 zV4uhXlBtBVJpQxA-X2EW_*27&=C|8QJ2t8O#ZoV4OOaFWL%x-8qi5Wwr}Kf&31@rj zK;Eh9XS)*N(@`q=(Rj|Oz*B39CFnf=ZpB{}Kc@4mFM!)|)J=wqJaH?}HdZRQr(GN~ zuFG^j18%>^dDAk;3I7>@-o^lrl!^R0pX?-@_2A&1jhjLLQn~PPS@&}MKsdKc@Or85 z{-7T+0`y~q|JE2cX94#mGyVD1z} zaSkDz%Z*{3egyRPi7$7#B^AQQV~zVWfV&=%esL)L=SRT(>x=z&tuKmjkIc<~1mP@C z=LGTpBcZqHz}<*fxPkx0@FDv_ytEAXwxdMOj&G#hwO)q;_dh0fqWX^z&gHsre}X*a zIPU}ZSm$037!AE4?^?&lrwGqwKPy1rX~nmTSY&`@RL^qcTE(|dS35G;4v%S=$(|Ce`6l} z62jR|64pHJnLPAPt;lKLPrg6lx$1Qs;mqG{#fO)HkNaS$m+I#e!-v|}n%`E`p?C1=@rXMc_%+|(EApk*Mrh;WwQc|q)ODDXdl-aaq(qv22M8sr0r6*bjLZ5aQ2fctotyZGW6N){ss7S?I?DB93~>gjnJDle+~fmSnoSx~Fj>yzc(FsEDvhH(ug>aTX^=Hwu8+_K9iE^<| zx;OCMfCsM<33a_Q1-J)#Q+vMN;CMLg>)SkdeG|(={Rn=q1kYSWxY2`K>ZSXDF97#r ze@*qX{w%3)r#0^#LwK$@-a^p(ev*3Wc<}_`tRKh9qxhb1mdCzdeY_&NfqQ_fANWM+t^Cz3TBO_#oHtZ^IErvCw-b4-n4UOa8v3*b!Jof? zPw*4bq!0bb9T9!TU~i*9Uqd*zR|@$FdXMo!!dX9lx7eqy$JaX%cu?9==ivts&TO&d+*N#ZlCYCg>aVB zZ>?vyY7;%U5f}18KZg@;>~_A$uYUU`!p-<{xXinBz4i<6B=&K}VIDp=D*PSnr>md& z(BO2R1NLXNeVy6D-)-fAlmic*Di(D)PxS*2fZk<|BU9!O&d!LpAk63wG{{o-XLa`IEMtU#gS*Y)hne~0+Y$?}o z&99t=f;+DWz4p7oz+-K~U-z9C0(T)^t$rX$ILq(Gd!PNN*E;72?#vL)XuRbJ!dVYK zD{ed=c!zb5@nhg)?*ndmF64*3={ov2!dV_WZhS6qAKoLW{`P6Z2STTP?RlQ?iQs-V z^)o97&t-4U`Ot%P|HcTyxxOBpA5q5q}KZ6KoeI~8~@oXK6Eb3%742Nc-$KIKQuVy>tf$l?SGpq zq}&wNt=f)<63+EqP4bWtAt8=ThNZwbAQr}GJC`CXfcKi?h>aT(z(&xY8SFNd5*TqSrX=J`4f zo&kKJ6$f5QIP(u8k6QKfH{kYti91{kd7w|7hfgM)<>`Qa+>qx%!r2~@R=@iIc<}Gi zQrBW$w9z#}Z@&k881SIAUvQkkQCQm7Y{I!-Zp2}9Tze3>--_E8U7NdIP9dD@^}VIH zdkJU${@0{I_J{n(UzeNDtp+Fh7V!f*F24&rhI}fu+iwYH{;5{6gfCFHZLSynbRdqZ z`!&-DXL`>y!r@f((~Ajb`Nvx4@gD&nKk@)|y!a7(lE;d@U5Ijr-jKUq6@)YYa_C3> zSR@bqgNB~s=Lzvki@^WLxbWG~%EP&baIRP91LCpogX8{|@Lc2CW{X8XG2GLodM+oN z`8c@Oq7vn{19u%Fmj4y-TM6fSB`yD4exvY-AF*&A;tU%1 zI01OV+Ru#xcVC%lC$AFD@;FvL=TD&TLVlx;Yo41>t~EcO20Ymz^=(Fd&japWU&>WJ z_Yux|OIY*Om4q**xP<$1X-5b4zvIn9@3ZopCjbvF70xUyz3Aaa=wa{*NivovNPaIiM9SGC}yk2ijYqU1h+<16>G&H)Xa!y|)ULhG@8!Zb28rs{5 zL($awws1qBE!rAxo?g{Z8})h{X4JO^qOJAeXj@f7Wooid~Hc! zXt=GleyE3wtBsZiCQT*sP^jvJ+Gt6nKHOS0{)DNO#K{w=4K;-tqTaS>Rc%p#ppvFg zTU*r$%#?x3qLRRb!1Pcw5N>V@wMGN8o5Ls04h14DZIzR1y_x0oSL9JeRkg)bhJSnm z30)i*+R)P67LByFL{#$C$&t7>HHtz?=TMznTB{nVmW`E_^|h=tt1?P6i)dz5R(gk% z9$M?0r-z`4s+tjj!1U(Xrjd@1o4logvGr{;qV-doLV^0Grj~{((n3vb zfDDFzpvpFes=957Osu~RRasjesH~pqWd&7w%SpG5AyW|b6T`jIUpq3>x>m)Cxd3XH zwh*z6dW*F`pdMuB8Ew#0(tv8FU95I^z)$|5p{c&DEzs0b-xz8w3D1f&6%|!XrQTfM z5S>8Uo;dXcGRBcCTUL)8)zc%1ndy@R_1-7T@@Z{V>q3n@r@l2@-yE$P7j7hZYD%Xy zh1$b&id!3JmW=b0N2sZ-2n-+9($d;URZ&Y0lj(%1ZleR*-}p~@o^Y;}`Gp#r|2b0s zIm-N#D@z~SQTemgLeK!!G60u2BGV<#2sdZ=Me6507G_*pcXu~FHOp_RrUukPP@=ae zM5a~W5DHAKZ-q3Qr3) z%xfSg(-t)yzkXJzt-5S-&G?#$N7YoC!E(45SwNpJDjs93ZY=m!DZ3FgN>#T^pB`$h zoTKH^cwF%F-r|;K_CgKO@Ej6`hJ+e#X=_7MLnIRD7Ib(m3rekBY^B5OnO`lfZ7-|Xgzc=pmKDnTg zsb_N0uioh;fArt?MysdP{`;cURBkbQqO^%gwYOyE#0Y!s*=;pEyzr<(&5*H7t1j}) zrNvZ$X6J#H2v6Y2jn_9-PD|DCdaHI)w+jTS!8uBN6g z|CP!u`IXA$LH1X0AZ85g&pfK&<{i+`UNHAwJ7%EtS5jt~l>1+D2|RtF*~jXb@Jo=y zT3xOI#%dI{i}sezZKdE!U{=eVP!mnan`tf2aif7uu2?J92(UWY_f(;9pEzP#xH(Lb zl{pkFq*2J!va)IF!0M+0^vhe6MOvDgGRvRSYacRNEWC!f_^Y5W5wDJ2j5F6s)qg;UeRy}O#$p#_01F;)fN3} z7Q44{RB$pf#5hgxlVYCzH@fb)D95-EwxgvOvFZu1rUl+9yj31LaW=({qb(*NM$gZn zAglSCBWfHTZD~aCnSY^Rg9)`2(aI|{t$ub>RDNuvAW7Q{{mI`No)x0C9b*))Zwfce zGe3FD(t^9#MBqp)FIEwewyt}&rsjs}xt8R6jafCh9a zW;chHl9Om@*t7Qe|5eMe%+;^jZqv;bW9xQ3{)x3!byXAl8&oSQi?oJ#TPdKua~8FK zplxnA+AxE6O;&ksQN}?E3iW62&eY_pkhi!y;8)c=t;NK|d7nk5C$xu@zVX#PJy``# zg$p){HsD&CLlhrhRly44)Gb)f%9Ym9W>wp)F!kb=W)?^kl+hsv^kDDB7WIT>3oo*_ zhqSo8MDbau|C4I}O+UuD~OaG8= zT=j#K8vfx&_Gcbb(i*C7gGkv!pdyM^Vu9uoTufOIp)-TjHjk}+N@~N zobpmR8B;oS_OxlCRz7egTTTrb8%_gaGBJ%uZIm=gsUWlqKCRCaM&lcMw%>4+sgkyM zJ%Ql?N@HxJ#b*_z+6QO{ud#~O6=_+KlFL|9MMnm_WqdwuTnp{G(-Dp^XFl@2Ua86U zrG(!xv~xXvaua{ka<7uVCpR@#a`rEsYNA}=aRJ)qCHgV)+o+|4YSx++ZtnSVES>dd6C20rXW_2Hc>pit5RmNVbe;&u+1*`o%s>N&06(%SlIq3FDkEp(JZ&NXyv zht9687O5+Gq~_yre8z{MKIA5fJaVTgm5&&ah37uMxLTX9z>><0nMUTBtp6H1-$r{_ zCSyX*v(Yg}61eAJkQ||7lN%l2U%DH|kkcuiwoq37L^n-U{}r)D#nV|s&G>956XxCU z?h`pVC`N=R>CHqy(#W#-6b-KpML8VBsef&4W9XRT?AB0qcoyyRHuh5f2s#zT+rb$^ zWN|O8Z05s`y$Rs;jA{ziw~pa_o5~ZqOUzswpv=T$XU&nl&Cj^RDo99i1&W>)5?)=)DNNiulkuZm$% zGrOs&HbQ5}Xvm6^8T79vUdr8Xm`PKCP%CBmSG3cifT_I{SYA7?x#6gAbcT+Pbi%AR zdKyrpJuS;qjb6!1iTubA1yaM&dD1Ms7#EM$(b3`Q;b?u+#M#lv>?obXCQB%uRUfH3 zVXBT0a(-J6qS9IK%F6BvW_MBPBAjM9a=1Bj-kUWRmDWbdY-e>_!h{x{GmL3z&9a5E zN|vpN&V7nq&^e;=UQDB?gl8fH;@e1{?h0nxoVT()M2Gc4rdOUYwWsmyB;ewiH7&Ek zWEA61te7%f(lj%-#k^%bB$L7?wKRJ@Imt%!kWFZ5X>JNnpApSTSlUBq_>~x{>^hW* z+D#|U?*gVy?L`koMPxjFPVAc#GVR44rM0E0SM%ilnoeBN9u|{Bf1PUDw!58+(=09h z=7IhXSVcVV(?hLkXKbs+vB4L4BjHd(Xl}TTQ`0ax3`A?A!=tk!O(7yO$M5;5@i?-6 zbBMUC``mZ;^j5E|b%3_S8!-8`bSDER8HMYc!Y7#nLjg`+Z4AjgmAXX06AqJ6 zl59O!8lYXv>Bw||&w^Kby)!3`9)D!0mGiXHn?8-Cgea=R4e1M(+GsT;lZI*N2uC>% zP#&T(+QPHy%cfDpv$3(QnEtCS9!{xybm&P|0erG4Ixj%~Z=Yl z@<_qND$p^Z)|Os{@s_1aKZjZ>Uu`K*vLR4FC22=a=z1x;+FPu=auiuW1JM{8ZU{%{ zq$vZvK&t~%x1p$?`m-Cf3x}1?nbEuFT|{Md=mFF%{LdeUX+`)YMF@ ztKdx7!1&6e168B@;5{Pk0XlHf-$&{u`m09uSxQm5Sd~-iXc1pEvZ|U+3iSD?H(kIn zRW)?+OkZ^>DoLwTh2LLUGrD4Ab!FerdDEVoFuAUUL+NxuMo%kE z^mAhsQmu4NOqfijGr49o-GES6QBy#X-(YfO6o&oD3y~6&`^f099dC4xqvoLZwk#J?^8;Ovt<~uvCG~& zT2V>nBRzK6$8+Ay=U|t;KjbZ`8(&i~p^{o^Vs&MOB*l08$t?d;1nR1qI&WzooQpv_ zxe($s#>GYbVB9Bh8sk!#Q0A{)y2O1FE8|gPD<+lqA+cALd~{u3Zdpl5X?<~330T2> z(Q4IL+CE!OZ9<66*{hyuRhCUC^_c336?J{KM+SADN*)fy8Q$KazG|t=YwIRe)g0az zwK5m#KDDCiCSO=lTVR7%)=Zwz2dTZ%b<`RKikIxrFeiUIeApwBukC;kW+&BWP_6H&e%9h$T<71!zys?pTK;b;lR4x z0L*OF%j#$4=o-2ITIE)~tbSH*z}oCFP1+VEljKYE`fHK{x0_x{@23I=tnpq%;MiDU zK66c!-cJP##I`X=tQHllnezLmgv^0k{A_=XxfdP~CNq(~l`nSE^!px7_RRj%BWFdP z(e=^#Nfd9TThnMmjyFH3_i)GKyKLo{E$x8iI){wAWQ8W3^f>l2p!9$=;#q_0jUIjZ?Z?!ETsdITRn>8jeutSj6e)!zKRKmgy9T zo;16;nJ+KsU(v%yQCKo9aVPEZ?%8pA3-R_|z1hyKrF#`P&Rtbw>NcxwdRsC5&s&nI zT+SpY<69?4#wOWK;9E|o%5?^OZSznHmPX}L;)08${Rb~ixhcrck#jn!UT`6q)|n|Q z*??NAwRu(Kof)9Zrg`GuR@V{yIszRN-tj-3RQQ6>e;73h~9BMc&~m z>g2`S+(Zm-f+OwVm?|W>#5g4r?Hnm5|@!OroAW(fq}EP0LT{Zt(%O zZy`nX*jWGXU+LlBqna7ypJ%9d&hWhHo0J0?0DDrV=(ZR8isT*vkfK2=y7a4$WnVHQ zi;428*tEqnVqwA3~lU<9$h;r(jZoCImIH+B>$*M>@eG+{@GK> z&+vXD&9{r`0vhvEq-kE-50$)|+}wyKD(H&)P?Sc+rg?O0B0rPHPLOUUCS51juIT?a z1kUd&izn*ck!_?fulMi}CEL_D@t9p1UG;DXF4Cq5NkyP)8X5F7lV3sqNDGt{EL};h zxx+=XVJjsikTNB@6J&clne7t1R!vJ`1?GlKGuV+01o&R?5j{}Bl6fXa8fg%#YoW}9 z0jmw=dp*p?&%5Alh1Z8BU#1_VJv+eWqn1%s3`mrs@(fYt@ip>fPvJ?SHcmrZCEi{y zc#jEFF4#ad-Q(imV+(EPa&{l9QuGPwvBG{9?j3=;j}FZVH<(HGY))$#$Ou5!CCf`S zrcN!`#K_xrHf$lFJ4AoX27feQb2Hg~?DR9| z8w_aM>3oBd57I^liWVS;oItZ?h3Qh8(be8G9Vu9cS|ghC)9YxahUvOS8u}@EpJ9sW zT@)fs?ddOUDcuDYys*kx%k|7E2D-k=7_@cHZOz@i!)MaGskd2s7MJdN^)Yz%%yg~Q zloxmVt&WvcmJGC_;bjb6G{#phw$Z$9xXEtrUR!6b8MCPK=&7iP?kg~iXEpY^2+heb zzsj=3&8xQ6y$H=xop&^4g8Yv-A;}hkEHTKc49tO!zlm}k_@|iB&9P0 z4f7~9J}oYrRTxQR?tSfxh{_r{y>Fs6dbfc&Dw&zcYr-WQ_#-{{*0C*B=C{#wyU1&u zYqV1rldK$^q~V+rwDZ|!mO)#OmC!;iZ4JnhsW&EazV1qL$3%76Y2X6<)lT^=wv0Ss_(x z@FAxvEy``1X{vb=e{)4Zb9x$YIh|0VcTa`swQ_7TT*9h2ogVA6+)h55$=gxZxEuGN zv(UI+qzj=5_08eP?56J7O!{Po65IK`dK#O|>P2b%ew}%Bx&Wj-3FOc*q>S}=IUj*A zNOw(EajeqN(5jjZwS(G>ZT}^7M50*?w2xU>Pn$BY?ke`ySa~gQb-L=Fd3n#KQg=$3 z$&VgEN0Ruxfq`gYTS+uC@U+o8u|kc3NVJt=dG-MS!?mc~Tm#E@f{zZhHP99g714cx zE?G3K*7y}{vLj_(?ytf35tEcC*=spc}uNY5%3QYRn09Drq#Jvmf2lNN>qVj(v5qKO3Bl79G&v|1C6}pIo_-|`8IO- zx#v|mtg$sK7GIkkZl2RJlVc?5QgP9})|w7%P$SdZS9xgbo>$aW_3>CC%IdRhG7>E@ z)9f-Erfn#ly6cnK2)dX+nvPn_-_zkU{RkhA)E4&Fn|L9)lx|PhyQ;i&dP$$I>}L^v zt!W>MEhQryADY)|9ZIWcdw>s@jy2Xz73kj6sjKaSf58pMN3e9ol^&Z-YcwjV7b-GD z+DVcLL1y#z#ErFOd+iS{EYWb?~cn?hVm zPKJ4FSRhAB+j%@+et(>|eR_E$ugq!BWIFRn8HrduJ*j8ZE~M2~&*)u9N#4~piWgGY zDvsus1?02PHK4qFMXed_E1t+I@(NmnIV31R?~$Xm_aPv;0S zu7YF88D#9ON(GJw*;3}MW`P_nwdeCT`G|*RgU>RPvf%+PJuy zW-ED%${f&E)08D|X{$JIu`HoCYh42>?5(&pqsHD!T)nEyYwBx2k9o^lGfK=`+$w4? zNAz(O-7)XBr_cO*^;-ox&ul64>Z3r8nKF7a-7$H_%xSb0vB;!OGp;_S(w1htRwdFL za^IAh0%mAD2jBc_2dnCt*4syYdK)$hSs>(0FwK3cw2)?9GZBr|Eo83~yM7dwe|psq zCWWY#;~o8AnPJ8KcrL9Q4Sc%LkMc4tec*G3eiXSHe04ucE3|EUTb|}DZlH0N|6>0f zu!#NdowUUfGK-_22hdX=ym16?w+x!jw$`OI| zg>Pqls*C@k2XCLd^R#2u#e8*OUF6MSvIKcYbhyuq^HJjB2cP&qpJhvlCI)Ixvu|@Y zQLWKxbRGUasrgL*zWpmRcfYr(Yza+x<&kXisQ*Nx`3e`izxhmm>7Ir({b5a(J8DwX zAMG4Be;-wQFw4iEHnZt3bk52v8{G8w`bX-OO>g?E-^vK5zx73%M(V+Jwo1e@N8aTF zNwNVH%niQJ0hQ`@r?PbZtEi(%`n}uDBK@6hs4bL|V~}1&@|FDi@p_AaZ}<1_#=oF# zZTdiijLtvZf%$9c$a-5*oag&dBKYtl7NriDcosfj1^a>ieTI4*$ zE{Ckc`uUf8nwykQcJui&-s1ekL!Z2tet24Q3peySa9UR@G7q2p9@f?gUZmx~__gQg zNPAeWpJ@VXXF)pcPy4>@WR9UbXw&N#Y>zy3gXH&-pyj@A$@YKC5x?bsTJ6ZKKlOVU zw##i^xEf4ZZ}`gF!RI{|m!uzVhkL){_dVZ{f4HG}A{eEU=h!c|SLf#6w6lJ>_~RYs zVZEcS3^XrJe~zasQc3ZDpS6~|ZN9wEF-Z4e>i(_Do-02CBaQW^;a2sT{PN)gMib;} zLXZ1Fh)r7eJDQl7PuJ_^`j`CT|6vfy;QSZf*0}OtKYz{pzvJYJz8c>U~N76wW!b*HNRy!_$kPo71##JD|Z2jx#RB>Ho9ydKYRi1Jx+KOH}h zXVa`p&9AsVob-E)eB88Jm*#Jzjbq!Hdla+;v; z?s$>A_p|BG;wg7kXQZ44U$5+vUy`U60kam3eMTcP>ml=-aOw_fN{?QkTuXRiutAU1 zxzM1QHv3~uqXNnOs0UQJBbu|9^~i65#SWK5B5EZ2*rMIIRw@kW(VyUtG`KdO7n=<< za;`tKJaG9we#}`8b!q*|D}EvE;hp+w*_nGyQzoaPB`hER=d6cqKOv3Y@)TvQv+;IE ziUUfV7(xKF(T#8Lp0~xA{I!ndO0=ZESD(FFDbiYl-in?;`263HOi@>h(a5xmL~K%QR;1>~ zM@QZJ=3w!%}a)Bxrr&S|{tSkXTF33mlLO|*~ zy%6->&be~+xm#^@s-R)H++k`g&v4%8opAfO$d2>K?m01s124YjHSfYfjMio=K)m3$ z(dKbWqnrm?(6kIdrzC#28WrmSHEzeve$-Q_J%H)tcrT`JPNrK7p>}7G;|qE?@`ydR zOFmEd!be;X|NHas97?)5<^d}Q4~GcL4>ff9L+dEla&PL76aK6D)Abq#2-bw&VKy6o z+(~)A#;sl69re|JGi+LWpq(qm{(TxjBY=dhv6ZKb{E1hL2a;lT%u$Yg&B913%pF{R zc=`f^g5MwKdfE#npf1-4K6%*r$6|8GYMSFo-cAYqf5z+zJ*%fQUz)-@#IQOeYKVWr z8`FV2h0UVBUe^5IoJ{6g=h;jxGuj#(Zasm6v(I!VgUKVHr|^zm5->sf4yE$j{pRABPp@DGj^ zVh7;(%MZ8+JpC1^+AJQnk9I?=Lo1tXJ=@6!JZw2VOYL?}WZ8x%^xz>rsENHs8}g8c zMXO7?o@A`OuWSWvVWrLVahb{+Lt;bL`9_n_$;z`Pp*ht1+IJ&#jSGQr%_E!llq?E8 z;6|ps0~ZAG3Y>e&C83T&LL@Y-6c7G>N%to@T1^!0lGy_@c)Bxrb`{r@`ua?w9~KghGha0Zf?ofTTt%N{i2ag+X0TAj1k9cUdPMKfuu(Il*4tYe?=w9BxHgd{Z z#Re)b@M#EoC+Zf0oT$yYnh`K6legC)3FeBjHsjgLnzbmXk`|(dVHl!c1cd?WtZ;d@Xpa2g) z4rmioMu2PBa3D#)wFv^Q1wa`7Vp^)Xy7(0rUI0Zo7DcvN}Y@|5z zZR@FbY*G;)W;%MD{>&%E1JEvZ@q&gQdFWP8HyR364+6guq@Si+nN3Bgv&gWbU(rYV#E*fa{z|&f0H_F5U?7FmxK4`|N2+ne%E137lij!tj~Fp zcmoz636NTR7r)N2HL>*n>wf;b7Gt~(uMXfNJ^(Ln=Y!=Yhr;?|4!qa>K>mIlF8%$G zwZ<)TT!D86FZ5*sO>D#kGkUP1Z4TK7SsNf8;XO$AXbMyU;i+O3Ci1Td<+3-N$`HR% z!3LR_Qat)yBif;7eHm~HCNz<-`9U3QkHVWeUoWnoIxoSRjKg8`qd<92k>4(ADb06i zE&?=N9J@km>sdcPnL{)|C02fwXhTlO_HI_Ag*CnA0eGJ(hYLEJq4H8Ue~;8?@ZqYu zCe@*W{SQx1{cGe?DhUK&;hM>)z!ql=K_5ksU{3!{39`E3;FVRAvS3+H^oA9M4a3M0J4UK+4qj#VvG;3TB0XP>pWp8$u-ui!|5SNb17+Rpcs}}>>jG`QfzoQ3 zeB9gts+$6zM6i=HikxLFWvmroBbjQ%CMZ=o0H!c(%sg)wPdkfe3>Rh0gnvQ?nBpH2 z14hJ8LuBbk8YRm=mhc*1g$sHPC?BwK6h467NGSqi_ESLiz~b}Wq5yC<_;^EK#K;=J zbnI5VNH0iEl@=~Y(7W&Y7b`$@l|$7Ewpsa{)l2Pvf%G=P-*;sIOTyg|ImTAV}TMFVj* zP=sqqytu9lt_I4U7M)aQLtg{0yHHlG>gChk2rP>;?W=vhyz)NSf8yPWLGd1V`qoNt zS|ifD)e&Z4L^x^jqyjP2y+ML<3#X9m0k2_Uab%|7#k5q6#!c+7+@_J8GtSU_x z()g#iyIZaPVv84jK-3KOfn5%TZ5f9fly^JV5Ju-=Oa$m|%+6)2R8`o9rxd)azpc#4 zhEBbivM4$#*^2|&JdR9T)Q+0!9ci{FDj3_iMt8{@p`#x}$f>=T3E_#VN6K+EN5;YF z^q;Fh8Sp;}!MCShuE_|gt4tx)CJGRrhaanDEe*VHm_ouZqx`mjot$-`g%1qPCJ4a8 zOw~n8Xpt8JA4yE+5K~V$7gxI1oO&m5c^fjLLbwD~q1^X;xAWS_h-|a5})wiH}`_EsCWWwdK@T&JxX{^19$>y6#IAKgj&oyk&`8t2jSK07SXt{ z;qoJr(NpDFzZyTm>_HIyq@x%V?dncq*0U8|yItrUWJ^^V5FQv?W_S?aNO~K*634t283np=ELIH3%6(Mp%^Oazw_9 zcr>7R*ge5(Qi;r}QBl^xWDZQDpWo~j3*v~dJ0+a|&9cYJRso9cW`#oD7a3I@$@`G# zaeCQLB!2irC-G~r|FaI`+Z0f%8aWl^^#sbh%Q-lW?vlT9tQPZc7>~TbX~Z~FH4s~& zgkCxnWU&Z1G_NFI?B*)aMUc=K;-Itc`D8EO%C?B3KsV(f$b2#KCkMd{BiSh8Cd~_g zUj!{#rrCOwxB=P7d-;ILFlz#&wmY!z2Oq0|)ai|xb&v2Cpjsy z6rmm22`JRy{8Rk$V?A17cp($=urZNznpo6C`X~1ocdk7nT=LiV!}FWL`~FS--(QCL zMgPOu*UQ@~eZYN2Q7c{LwfN>e^Ch3VoTI4|T=8d&K#8WpaUZTZ^6o49qgc}npY0M; zNNiHiJHCB&(WQVnC^&?>q=Z9jJ&9$!l~rz>^k)3Af6C^6PT8D}LY0petC5EcEKnp2 zWSdN~L_UqPU!AZ+Cq1~PEA-gR$V?MB(ys$W?imz8lyXm|t&zEM%k@J4+wh zQYAZQo)+?<``uz-4bdz61DG#M9w>21JQ4!gFYmy|q?_3bT_~Xwcf6_@`Z=V$^H@GE2oXH%}Uq$_Xw?y=Q*|v3nI&XoZd4Kef z(=)|T^)xLWrWp6(=D(lB{4>mGdPFLqKEd~0>O0U7yKEPG@2T?d^;BkU^c&&9ZGcU! zM?X-BG(qzH<@^|SX+7R;i`j;(CB8`ahE?EoAHX}I8W+G>6|N?5s_di+=14_?s77NW zc@H@l`(~UUdjBd}Ynu{nm9S!Yr?*QDG+&KY^nVz6`BQ~> zjh{*D2%lKZ+xa5qzbNjCh3;DKy0p(5?UfUB9---Q%LQ(5`O7T&eyOsd&1wRw#4-Mh zDUT=ke<(-f>g6YjO0?nMVmw}-JH~+J!;vIAbm)_j3?q$v#gqWN-@|hPb+4+^t@NYS z1S2{DHsm<)3hiICr3V*e2#!y5O5bjrAJ{}pC?<1m8`1DU{GBWX9{k0cB9@(~5;KyK z`Dn{M0eGfIXgu+Lk5Ud%toctp%CQ#s);^V|jIIllYm+_v8>5lr9GV+E<6%IjTl#y~iWh$lBmp3pbaX#l&>}mj9FGHU0b2#x9FIXBP=-ZKwe8#* z!u~h5f1(k{gczxn!SDfD0>JbL|Cw*cD~^>^C9}@`fkBN4#Tz1iB6>n2s_JD`u~A^G zlOnooKxM;n9544dA&%=syoEo$Tw-uDBIcp#VN*@WLoV8@HejG^=)sx-dY-8k23W7b z9p|pfw98l4yC^pF$=6Jbe43t}f1-v?RR}PqPkd{3{2Mx^-HN?_IXs*YhP7H%YAnTL zuCFf>yfokZAm8K@)O%yd+!UpQI)LCrABs;J16-8uVkyy~5uOK^-rq z_gI2DKH@Xw|Fp>?d%UVEacU(Vi@KE%++V zu0`_^I%DzoJEyGzzeq+5r}TjWsEGrRopH?IKTxmqadZz}y$W~LbM>QUCl1fNDhWAN z^gBCzGG&)tWXrF_3R{^haS9UQkNg`YOr|DI=xJP3q0STX14l<#8VG^eTKt&1Q3x3_ z*+pcQqLptAN6Vh}+M03e1TYe%J*Klbr!Ing^P>Pg6ro2M{vPBIu;+pL^kKAr0lYj% z8(o;R%Qy8>Z>$%Bfo@G0LH{|VbS9MC?T8a7^*|WR%`^E4e8zh{8ey^{B2K=C1lM$p z;PZMc^9&IGVV|ID9u^7L^uOqT0gq%mn9zbB=}14Z$;1>-ibd@{sFSiGtAuA&i#VHT zCGx>lpNc+vuJz_yh%~5p&ooABNqyqLTHHVVe!gS+M7|CE zefZB;tq@V)@5lNYf@3QC{j$TwtRMyk20Qb#q1MG2lA~x9fIoo*L)P9rLxpG#iZ!bT zX=mnX3y|-jZjpV@;IZaSJH#;Yq{LvBW`~dtNHaZHxNWo;P~!kClgia9g`NsaM7>VD za7hL$;AI6}mz^IZ5|vMXu27Odx-_QHp#;zRee_5dz%gmXUmGBOF+Lhu10kRfN(j7! z)s^mov2?cEE^nq|xI)Ol@$0;(E1CY5+25PE0NPl-KZZ}EQM6f)cq|Zq9FJBg7?(0; z<;yK3OZ0h1x@bE29Sxcg(t3o;lhfxTl9@Zo+o+s-Zv?K?ZJab+m1M9*#g!Khemb~Krl!?4 zttzX=-!y@ZE6b^NdA!)%iQG-dsBf$E$-aa}hNp@arOoz3fs}H47_0_iq4MF;!|X#z zbXpAw{cGjb;P3XckS}5q5}KdQVg-`n_CDua2O(C!xXpplXL**X^k=i0j?rjOzdF9- z(2ZdHgpqafqK2L5<$WI-MHA#7JgQoLhQCFet1h<(4ql9>_h*2Vw8%*>>!0e0X^HK< zT!M{BH&i#?Q?TgxTq!VF)~z{V6>Hx*9-@_TG`F>8rMdBenvyuP(oD?B<@}^izi0ta z;DR$DU_DL)yhmuk82=nJ%EqgVhGPZhx>ush-Ry}gE6-%SB$QbN0peOex@he~0Nm1I z_!4r2lggv7oQm*Jf`ROao z8+?}${UzFKktmEQiyfj^9Pta0b5R#LL!Vb@>qv$z)lTC`&Q*Axv+yuLq^H%qWj1|J(&I5FU5=4^f^YYin#wbpV*>AN0*KCxcFiX4VVA+fx zS?O7fGcw*tiq*rush799=yo7UV*Y?D^?quD*l7Xi-rcU4ZBd%060OogZ-b)MAy&}I zVzhwfuvSHumru}mu|bOGsXe5qyiM`NZjHn#vNiU2kxP{h16h+Y9rqFJKb2JQ^5P(r zbgfL)KN^B>q9GVz8ad4nx?xZfC@$0-2?}8nH0jn6 zPlzeTv=j~5GfeeY@_l%RUac}<^8u8qXWPU0(i7x@!QZ#9#vpGpO*%60z!1^B5K-?< zaj-)MPd~HpDYg$yYe`IWXqQ;)xq7YR(;K@3`G?c0WV8ME!q&>rWpsm zMR`q#Od%avH%IkGPtnO&+ci$G_ailJtfBgi%!E2Bt)kSsj6|g<9Bym70q7Vpr=;N3 z2StyELb!Piy<0wm4wh+7bwo`*bLkOmXMJNC(o~w7>sYpx^$d^jd^ww;@d(oYt&GELKlI$>j27 zTSa!Zh6TMiO_j!X{|!56%gZ zY|U=A&@Jy)Ry=bgy3_|s0sxlM$fC6-UF@S)w12o7wLkKgxXlkSnlXx_7;U2z_h(ZT z+aWaJ`-yDaAgvcgR%I(`FSATigE}H=oM@ceE>{8OS>tj_=JE}7hQT@M9h`M0nbF^Bj6Pn!DWu$gmnnz${aYXGw~hoD?H>HS%b*7s-h3t z_M+fokfxS4SRCy0_V(ixo%wW$gfm4{W}zytY|aItdZi6c&YKow8lEbF?V2>Ea0I`sx+zqibbR5w>uLe(E?2uK9idmQ1 zUJ>(yB(l!YrrBqSg8kpdC%4IpTmMj2x7eaUv^O24$oOvcmVAZ9G9ay`)|xNSyVG81 zc2XI>kR6*KLsyqc_}>p1gP|h|qV>;|$;(d5X5TVV)|s4d3`@Slu@1W^O1b{Tb}nv7 z982!>Oa$15z8X@%qUKDG+e5q>y*x2SO~Z7&?(ile1!Kl+YXd<;DF`CkjT1a6XL;)4 z`=*#dxp_RQtS6lz23SN4ntWNzo|R~#F&04*(BZpSa4TCWZ|Z6wI{{x$rkUz zOL*v!rXEx4xZMB4pxNCxs&q;%`V$l1{K=XKbPD}rZa8^Dg^u~=@WTEZ%t@>%1V&TZ zs&pbh0*C`1u|zk71)ef0N>m4{VI@%PmERx* z>3=@Xf8C)VW1fZ>T3S<`9cwWHTMlq{i5$3FOvT&ZGJ8Ec0?KfQL9-Z@q!KSHqjJcp zLQ%R5y~R6|xabBljeudsh9k>rD%?tYKk$}56{H~rRK5kr@z#Y35u+X(7i%^J4t5QI z%Ug0XA)H2lZ>z#kr`SLX95C~kMcXVE2ToBOD5pLb3u;mYmmICpJpbof;YLbJiDE{s z@nP(9HgH~w(9tOo$jcgH0%5x?PQqe54^fYDg)Nz#6?NN3x0s%U+3jF@ouihvCS-RF zh6lq-OX~EhDhW!KvDK**;AZ8(xEiE7Ak7FJwcRmKGp(6CvG)cygj zQRoM;BQs6TUe6BEp5V~7m_IpmGDkr78D%6Xgh^5)>%%+iFjp`8;Sh#8Rw$G)gzyZ1 zW66B70D3$xLEESK+2Wapb9oV)Jru{ZmGW)#ZJ(4!Q{e%EPeITiJMw0H8NjzTp=hpz z%y;O~d;H+7#N&)F6wTeK^(YzW0yF`a*N>sbHCTS7WmDzoigZ9^R|%w~(=kj0bgDst zP~Ag&TACJ}0tiiRxs(waE-86vFw%z&gBK(Oc!dk`Rb2`O15BoTJNSMv1FX>Q`5Tkv zQ^U7fDaoyTPBLT|wS!3Odw_Qb9=?p3n$tHN_|0iMZMhP#s&Mls2_K|~Nut4^s@3t{ zYIP(AjSouI1N@UZ6+q-+tq%GT^EL3}uP6y&grqxL62C}jbxI`r*KPEQ3ysUqPkl?_u~{Wr!X)l-0@Tde%Id%zzqY^zd-XA#a@> zsWv|N+Hv0|7DAO1U?X1MolQ}L&5rp0p~nys-)KaqZ?VB$t-&|Oxd~$I*T)-|38Zub zo3>H)szI}n=vLz3sfKfd%%qB5lXiMT0-9ZIUo61Dq>d-Fo%Z{x*MS&)MRYX8-!%ML zCAGktL!AV#41c~{t|tc5x6nf+=51eGd}8`JH(h1DUorXtjQN5hc8ooO_)@}O3c6dE z+yqJj9Qn#5i#i?2TGrVk7co(~{T)?arf6CnPs(tfKvVq+@)}ZQ!@=tfH^5Sm@*PB8E#ZL3vxS$)>4r3b-o?ku0kRDZ`LJO5I#Z<#!Nq>a)QqHCBcEjXuLM@eClBks2Ca8=@Wi0eSx4k_CHsWteT zljw_^Nk$M648)p|?eRA$pzouq%m$PDV==+e2&Z1_kE?J){^4sWz83Q5jwWz`l#3?O zb=HOP)W1><^93B$aL93*w%{dc&eV2em8i&6*@QbdXdtB?dm?VZvT$;`h8o8ll28Dy z**_pYIh-(t4OemLhp8n<_Djn3GeIoNGjtW|G1(pJk`je1kAV!*5UhfHhcjlUHU<~6 zG|y*o#Nj97QY!9UdYqn`vwyHL0mYy1K^W8O&${sLG?#-qC=@^@)JHMExOyd+S)Y8U)MT$nm;~4P>ct;cOWHy5g z!Ze-3^CtSyCJZLy*!f6V$Y-eGb#+o>X~a6W9`;Lk1^;wKCF#d<&@{aeIw>)UDPfYtBsfBUko7MkeLofmBX~9s z;S&v4Iu;vrE zuteBI%Pn7Y^`$36&c2y1f6F{vBwA&psmbzpcQjtHGz7J-rOQA%oB^eV2=teS@C4 zBCgU4G1V5U(=1dg(NX>N_iZs4p<6$v26x{=wL99~u>sQlu- zJ1M284xG3US^IXmQjNyM3Iq^r5Nqn9!n95ctodITJa;E3QLP~J6yvN(PtWl_K-MBshl^CQGfx$1g@mubzg8*MDh-{u0 zW0KwWw9~b!l6SO9%i<~9%bJqFOa5W5ip*7F38T69%lZ%kE3D#hi;2i%tZxRTfOQUW zjbgh2dar`Oc-(lKE71sywfO`h@E1ugF@(JgBrKl!R|e6{cZuOq!`2qL;B36HK%yy# zZ|^2%Z*)Y>%{5N8o7AWddn)!AgIjzmv+)9xK&Ebm)XS-^+51Rem zyu~z!BYoljqaa({5<*_#nJYO5NEA${3@3Xxq11h#qoKPQE@zv5;ijncTkqQ4QdmvH zsb52j7q9)~Cl*<^>Ka}Es`|yt@II1xcGCwb9+T(;ec1$6eKfgd+F&B34HEf*Nq{v! zV~bM84RX|mGrBwW~Jzb z<&p3s)}B94H!h~wHu4^n8B9uz4{-aSZFIEPw6KazF#-Pm+pcj~FFO@}NVUU16a-YN zrbfbN$(71aOTc~8cHFH^$%a%~2+tbDD@v$s>w;kgu#67d6unkj2GjO19dwv{)@C<1 ztKgOwPUGc;VA2{66<{?wopqDe(slo8MB}Zw+}@s1+vfzRQa*YD6h#yAqCU&jgCvvW zI|^52QHi<`-ocPChePu23!6l$vobs_0xuarP8&Qv({+u$#mhR^7-45;M`;nw>S*UE84Ns_?b&9t92cNd zO)iVOHH{@7ZE0%MAzPbPz=xQ!lksx(4C}o{8(guV=9R%1tOH-P187r5*#JdYOdE}* zsF}tR36`dS&|RC8d&m@N+DridaO{}$^_pcfU5Aq_Jv{;$a1Nn zJZsISiwB7JF{Ln!X=IQ&>|e=_vE0Ck6?rm83#-a3nz$w#OgMXy>`bjBL$$^r+gDjc z$9PZutn5`}0W0t54at&cBbpGaKLow%KdAHmWXH#O~36d8zA?@D> ztUjg+@lJP*h_=R>ta{0n&;WCVm4|dp|4k{7(jE4_KyV!D8y;OSH_YbCl19XEN=~PA z@UPjB<=v%huaT)8quW@jLo+Aj8kK(Fmgz<;Z#k+|?^39Q{EHqgVMjWcK*7fZOx_ta zVGirFbbTcY5XPn=Yfk4dG&+?t>2#n+C(L^W`*5csZuJIwaN;V82FcUO(R(cBg`@yA za)sh_IyeL5Ja0_|S}szRhH^ZGixzLt7! zpl0jO4#_Mo=WW+xS(!AaPqQgSkn7q1sMAx4^#%b8q)6UGojx|z8d)BWARQn-{**mh ztZ*M0o*DU&imZuee1j6bCH2WE{_QPHN=GrEmiI_(F&<1Re|fzt%3l1lYx@jV^(jt< zBZiP|H^0IZ&77u7vO(rSD<6vq3gEp5{=ram4jF~ZkO>*D>w&FikZBl^Jf=oH!JQ@tX zQOZng-PqRb@2sV?>NO}U4vPi}>>tz7cjA20TqqJ;8(f(rkN1aE&LP3TIG`oP82(nX zF_@POYS`Sj$>Aut1@&AiT!6!~e6oZX1I<7O%CveOkVwYf5k?=V-!%c)gaI-N$P2^s2b7)fTHEEl` zWFd0aEq2M`g40UtnPNFwO)x@SvtQC!S}mlo*Q7}JH2px6X-O^t0%zQH7Q`7o&S2zq zC>$}nEI?SQeeGuFc$GCStT{r$Dbjw5(}5Wx)6rV*I@jIu7x=JHViFUOJ9|TJT_~m9 zuODH#u8JO%6yZ6@-TC$3QzlrOwz8vm-S?twE5kqCwlezhJxA8>XWmi3ZZQ$Yxof zE;zzm#;m-rDDLwqG^5oHiFf=BAQJ$3@s04l+z9w5v1$wffPO?%4Su9j1op&$@+kax zMvuAN2ne?5w{~_LKH`dA0nbEn9XUPKy0OL}sLggjDHj62FCZoBc5y#WOk=qb?mhB< zV{_ai8kBCUlBAV7gzGWix)9-QdXE*SC8w@NKhG!Y5|$oPA2y3i_;0lbrrhP4_8+la zvfs23rwx3yA8Z!)hIJlAv*rSHr6v@_I{OqyyjxGPclc-pdrK@|`Rqa8$;CN`+I3N& zm*>>joTH^iH&FfSUwQjoM>pqr7aX*8cM%g{fDl+ITxnr49BB+$^^c(3l1x2uDM@&m z&nW`U^c(~Rz9%jcAKU=bTg_a8?DT$J@Kh^gZSz&Wp}r#Ra^0eYeBV3_0zk5)$E9Z`+=aR_tAU?@i&`xfNYJk9+OQ(re?NuA8PG0dc}1e zKccT6KYsGPwjaJ>P8XW@;k56pR=_9vMN$VKqc8wUcKK7W0cfKIV~0S{hS?b_0Yn1l z>f8)|vfj=Vh&5h0xk6`1T1LBdO>pokEzsrhdb5)1>lE*dC2C0ZG83~VOSZrH!yLp+ z^a-!GIpd#|)r^ZvxhYs_g$yjo>5(tz2S9~%D*{$HQN@72){??o)Mkp>-U^cVl!)w) z9Z(E}a0i4r6{6&=ce=B=49-utOClkX7R!t>g5=hF9j9!bpuF@68F8ao=*Wnplb-R2 zql);rb%d>MXQ$Swa|(KM#)zv#@h){$~+SvQ;>|XZKA7BV*-+Cs~|#rQn^K3)(CNs z+1#m-*%hQZVFMLHRa{2YMVzR2wj+P*(e83MozV`mjGt1@F*e4 z3q={)P>u~XJBodhFA=eKitRsAxzQok=K#0W<+w~VD#lb}0Rg`~?$?x{5uu3d3sbBP8bpP(WD+cFCr9I70#U(e(E0VRfZ%BIOa&#`F>$ii4ft%UV0>M2olDfXd8W zP~MpgtMetDo}UVrQ`#Q1uP(Z(&M6I&NSQu9{DC>~BP6>~AVe{KTnF)a zjB5E(r^<#?3PaPy$CoJ&QW5gcD%<~Ghbg*sFvVXFZ0Rr~m9ADX6C21$63DW-duiz_ ztd^AhT!8^SCWHa_LzzADfvOp`X=hhSe%zYnE$AfQb>)NT~IyK8OZ!2Q@SNI(x{SR(e386 zAc_UDIVrF`{}v3_M{KxVi;Ny*37~u35W=IGKR|_u!OP4uqM{`lL;zF~>4PNHeXt?J z{-=~^KV9MKgttIjSae|#-E9}O^P+^7?~%)({1t$PH;cBDhSI_}W&VS7g&yf%jUF*{ z$jfwW08<(`A6BVpn@<%xU(!79KVlKGaV*;*qzNvO{X;GmC9_^S>{YYfyocx};+@54 zK0R2!9$~ego0cQu*|SD6kZP;qD_96WJBU~2o8hnV({%X2ug@NC6QVmW_}s`cSNTMt z@-RhZVXZ9A&$^kaNnMvzvD{cjrIecq$V|wiNTqxAD31TMgT9*PAzLb_ZZ+|Lsk<=v zU>F!@zLF=UirfniZGrDx?}9oQm4gq7lM!#|2RgZ&pQt(s{FSHiz}fpDA1;L=Wq#x$ zUMG&CJOMk}%CW&nVFGJRyEf){EhDLMcV4kW$S=PEQegbw=rMAK4 zJUhaFkj+tmWQ9)ZJZR+Pa5{0hd?-U0^}$#)F3!X1J*~6jA@|wi=G-&;7bB1DO_xc$>NTyL7aua4#fwV%UTPJCyI549G~ z7QRzrNELx#d!QU9e>9xKGiv{a0A^K0!OGu0v~z5 zCe5Yk&n^F{H$o%Lg6NIZXoe3VCL_x_;c@U_F8sDoTDY_<)~mX%JL_R+<8+N@yRr`3 zB+1^2|yI0)%}!NqqG^Q%^3n6ZKyNng`u(b4|tn zI{$LfKYKsOvv)`FJ>sS4B?{n|EW_|qWW6$*Ra^up050dFVgY%zZ80uZqs100Z=y#= zKFX>J)fq7u72JXi`ZynVi|(bb2f(xKL`ABjH4QTF}OBQS>Q$7}D$o+zJ}a zxp~}eC(9qoI5`xZL9FNGTb-JjH`Mw#I;B4AO}UjlzqA?J61oD@7+# zbn#Ub?0_JK^ks>k1FOHkoFw)|#(ql;ZoU5W1i_N?fBj3@lJ>hUt{r)0yOl=_tkBJ< zVVc)DufCNQQgN(rqkzW{PMmPzKoyjK%9R`LlyVZhgILw@rBWTkVO9VBqGJ;g{EY?+ z5%F3z$N~qYm*3nWvYSrfuRt~>!31h?E`Pm%ye7+WxY$C}9m^SDBsy^rh1f{lsHmq9 zU5I8z8b(*oX-nGg))CrkI3mWt%_p=jbL)&Me9G70#VEkO6f0{(Y}NiYYDlGADTQYB z`|WIC+w}nN@ZhfD67i}XxTLDHo7Dt8m%bd@9DUBOtZbHCMW;bn&T`$3x~x@fK24vI z!9XaFRfbJoCNI6<) z^thZK!rg&+!eqY# zY1&dOEeJ;2^#73DAIRj>2nvRa?SMp&@BzO*f?5vXbf%@!%Yuq^3!`{g3J74r6i7iU?*YLfh4MA*w1y56@`W|x zvz{#+Pu6X8DmztTlClsL{Z94yy%ZB4EG68_deXf1UrWd5zCE?`O+C{LOU zvw7cz%n>k4zNr74xV{I|{_AXcH=6xUMhtl2hCSj-TO~i1t&;es+bT&vLJ$rGncrZ2 z&@VZlDaiP7fFJP-Q?>D1B|p(eeC1bsouSRFPYs>;IoT>nRV%4g(y9l&eC`#EyyDqc zftB+)PLj$$0*Z?DpgCSVGE(W7M$+7-M$;y!>A>0GVe)pDXwALtctu+DQ?uI*vZIGU zijd6BC%A}uNTz^)Dgl{T)FmT(?8`j!5oa4XM)MGA%>j`D3IYVVa{;hFpT`CVL>_w3 z=|G0^Enys!`Z<;iT^ZDkh#?RT34i|{M@ zwXWX5fA@Fud=v<1UoW3iYZDZbYDX3P9YY#(l6<@5L(Am~W=E=Zm`l#pDp^vc2L*E- zeFQ_)#(_15u`EQ=swK%O0IEtj(Yk%Ay{exCbOmB+zH z{!9O3Nv*LXr-skA6Tt-d|F8Z=)PZL zx;&$Fv4V)PRR?#3wPQ0u=!(RRS1ECK=1bB)Moa7}+J_ZxNUNpeBFLOs);TejV1t+VlVH^Q0> zFb-8)ofsRl*g7W_PxY&kps6w)9os8kQNedtcFwFB|YtFPr;LY6u8uwj(RqRu}P>QC$;*fkB2|u$xFk1yfC%4P-awf9)A{SF7GQON?{SRH=GLuLN^I&LvUx{ecI$<`T%yW>7Q0Q{C$WRTP)?T5I(DBR#~=O(T&5+k2D!X z3@%$ozfMsvDaI7b+jPwY;NEi%%V4F)a=rXFEZVn-!^ZDRXB~Pox%h-(kpz$dp+{wa zI^w#-oZHYQbh7>fc?qnbm;U5LU84r3vpWtgU79oii~a5ACn8g>@d(D}Q;AK9va(dibngdW2xKAVQPA;71F+{^fb{%Eiu-yId*q8HP4|MO=*3f zAs+2?ay6aX)(DiF$LnH+M8IHr;!>Y5!aC&UK=_6YPkRzhqIm-8zDPYeFa>TQ#lVSq?R61*V9oz#s87VPBTs` z2fe}LV5S=UZd#UBc>}$WhnQ&e522i9y`DiWtWW1F#kg1QYPtoT-SBhitatPG7+p5_ z&}^d0HBvJUqM}uUxDvX!Decxz7f{Hi#8TVrgu1jgpdQ-@KnU|9LFVgsE>_c)+IEqM zVX<~41JX>QjO5L?AX`t@UMWBW-Zw`~V=#ZK{l}W3 zYg7Z5J1AA##?ZL?s%9MGmX>*l=6L!bNOt;zu7W@vv<`st10D29z$}?_S%qsSEN~fP zFA=V(Fw|h6=;4t4!EoQp1fW#y!WHUvg3vCDrl48kN3k70qNRr@AV)chL--fjQr~e^ zrw6-{zwD6GU1U|Q{fcj3$rcC7?raHQee<@EV!MU3nBN*A8i(pm_7*LUk(F*Hvh}Nk zc-RXrnTQvXIg{!UC!~sp!r&n!6Vxp94acJN>*zM1B!hYmXg7#ibBBE4m&NS)H*PI5 zVUzeABQ)XaNC7h>N!e=rZ)D`5x@xiqF50YS3izA1bO5c@dO4m>s7{UFLTR~Y+Os9wpz^@o2{q7W=pRicmq zNKl1Qi6ZP$E}c~4Rb@A&S6hR0ve}Ix{HnPR!9H+u#pZEZGeGS=1*rK-5ut%)XCU5` zS%ItzD|^T73**slL+YuAq+{ZVz}35QbY|1lc!7z_U`C1?jXIzyp^+Iqp`?~qk$wa)I~+@X$rHQkQB+!1}@{b)0Vf!xjK&-mrzQuSeQ zar$j^cCj)kXOx{@Vk!r5m^NjR*QI*+t4iUJ>WHB-7 z^8o111-bc#mfyRWfCXZZbINOJ>uCXlF^uQKa{cV*b&8-n%#J@ityyX5T)&KLxD|Wi zuM-GiWb0yBYgTQ>X44p%7?@FXG2E?4O$mAe(+850UGqF`U33!gy9k_6UT(Drly%Q{ z>vjL<_8ik@7?t7t-(OIBcFN~!vT)H~R1pjDNXppT3mWF798=K%rOLDROr{90r5Tw1 zHJRRzXneUM8}h6}e71P6l5cdYDk$VoF=ls%8X-rF3XzXU2e;ygy#Gjo16L2o!>*V+ z1tRQrDTT#$QwUK^IAJNwLX@P$-VhB&*Q86tyT^}1vMQ?A>{#O{;lKv{WS~k=+`~Of zzqi5@mnfs?$Nd_%Z;##F%=#I;Icb_JfR}<#I$tlYpE?%LDC>*nIi?F*RqDCFIh_0u z)x0a8OV(DKc_;&SRYosad3o`?ijP^2q{_7)__{}qPn=tu6c4WC$i-_*1I#>O_RVW7 z2%z`UWkb`k!G(e&Q5}9Ao*@R3CYnHsaRdsXh2NQ2+SkF|a%ZSKtW z5x=Z;e6d^WS?w5U`&5j}))D(g*E~jrpBqtEgYzA(I0tvzru8+oJtnzn-6C!Y-?N z?aw$Tu(YIn_2*+DSa(Dg8lB^abq)H4h{L_6o^7-oi5}Zo`B2PCIr#MPOaYE@3TJGl zwzl59vsKXj#qbR`C`y>DPu#tjAQ+W*u-!o>F48~%^7N~m6#)vgGq1P(I=1J8dr_bz zz`7W9H5mE0IQBqX+r#VvTWE1%f|2AVoR_~lDGzWsDI*Pvm1f#9MM_XCfB5+`$1d0q z=ai&to{j=w^mrqP!z2bF#4DCaVV^z^(d3}G2UPk8Dv~SuS9ZiKuzX5gjRuX)PE@ao zDlTF$?equ1xu#bsb>FR&!!7S0P^hA z23k}Ij~`6>5JV|%Zv75vR#APOT@);@51W^fLQ{l_-2&^XYV{H-$DVQwQJ|$Op4tS? zx7EgnT#bH0s08t6p;$yiP>C33FuAqk?Jh1p5o3PH90lX;-r_8o&-ND159Q^T2=SK* zrN!%Xi6r`kc;t54qmtKEEf`P*aKj>6WxwPlbNR!$lc|bUjEN;~^5(gUDOA?vD*AB9 zFyN_;qPd|L@tVS=NKcY0ee3++Fed)_L@Ep^UbSlO+-R$Xhf@7P>hW3<8sL2>@l;|< zrkHYyVhUae=fQoGTpMu&pa*Cvz`}GOuL8Y7yo6qfUn$IKipm{S;d7-dH28Q!g-H}C z`@oS^cxA-?Y|9P3`ObP+-?S$5gMCVc77(rkoF_^j&5$MVQ2vb8U+)+u8{Hi^?I7(A zai>SkxpEO@tBV-jjdpkBOXiR+P_RC<_w%o!?_YzCzKCkgK9&{j5fa^tg3i(}0U*n%9` z7nFk9)z-!@@;z=kph)c|9T1mD-sR?jMv{&SW*1*EiLRM-O2v=a64M&46;qv}P?f8-%U&@zAEg4s_Zuyo9cEeeNS1V;xz~=Qx4AM_|O!` z$YZixjaEuK?_~iMH#M=#fW{jm4Y5fXD5Kj+8TdE7RvwfQpOZm3EZc`lE zr6BQ@-8~GT#+-nZE_h#WKevI^uddoDD2kLyQm4^)d&{7%XMuG%9yge=#v1dad@Cl? zi)YoatXlHTS|gB9XSz{bH0h!Nux26)37=kDmA9zDGwoRw8VdIXYmu5ukd$IEt0Z1| z#dLKw>P{3ffcgZTqP2A>UuzlW_OOq8II7NTLWDMfNu>o_pa(vI51VR{Tf4Dj)8`D)8hznp3yi z>QxZ4vQYAipWq>3L8?8f>Hy$2x9``eX>xUz`CEF#R|4}FZ@{Em7I8vs*)UmXNb##O zP5fxgxlyD$L1sE)ICLhVWsY=5%30=YsrN*Vn=y6cv^)K9n z8GbpsF#;xoOt5-?5f#cBk3_$v6l#QiP8SM1pN5C{b@2nj3#>*xpSrY<&{C8bXbBPT z54N)nw+E9eygKymp&x+>kg8dzyJ0Q5XndcY3T1Q?^El)Zw}||P98}Mv1lVo&M={wx z_IY}pXwPiG;4t`oA0>ZcD)?gy8sf3 z<%Zz{-YI0d!b(@Txq^AlSx2?iTk1ASW0)3I7zZryFyYCn(#3M4zu%(kRHGYFnnDPq)aCZWmABjT3U2RVG4q zl}S~Hj6jA;&g6?%j(8Z=z^dPH$#%*&x6CkT;eueaK@nEED^ZS+VdF>wD^U4=- zh+z|QEz!Wp;D6Ivp0>Ib%_!fzm}_y$Z2MeGqCLm51r1s2)$KuU6j(fZ?r)I}!l_DHZVTx;4*E z;jkeVK#S}rTwxcI)4$=TkUf`M35I1-xJAeykz~sHIyc2DiYuOT`FR3 zvfb>~EpsM5D%i8>61_U1FVf&62|iN|5;2X`IAT*s7DE+>f`Y(XiX|XrUuvfe{-ox1 z;$y*af&tM3%Svo+2hGaob>a2za~6Q@V+z|)tG)2Sz$+oYF)udL0a#ahhsno^D#ng_ zleimQ=)07H7tK_h{8e$>=L?LarXt{-xxehm`{zWR8EXNwxMDsPGJMoOwsRkSP%w{BIFClgHr-7cFg^?Oa%zoTt{Mp7Kq3{V>#h@1B9 zf~-cIrYiC-o*C=U53HTo_cs?3B5dL>nk&hRG9N8Q4;a=3(|4MmEuMK&JHUC^JsKW; zrT&~-fphivP0>~iB+AK>?9E6o$G94C)#V_+I`>H2ShYb~9LFxz0d2hEp@2OVtx%4wAJxkS$DRCT!vxD@0i@*vt=E>(}WP;nN+BrNW%4%CbnQlr&$VHQ^qr z9I7G3xQ}rufSS9v{6p}Wslc$^B|#OC-!>$Uvlu`3(T4?fXi`iP<3zbkdTL*rWg8Us z^U>_b=vk9JD!YXdfJ9fZ^+ADfi92&pzoufZ`QaSQ9C0}XPOisR->qR;>+=_kk2wS_ zeNl|lxb#zp#5AT@y}ISra6_4Nbs)mG6{z3JkhN}5pxaJWu5-497Cq*|qR*c)1+tD% zr~_AQONii+8eogc`19mE7ZgCT@ZXqPs`S?ts)G z7u69>+FLoDY6*I&u^WOtC*SN^bU7raAmz2x)8v)22~_Ef;mzp5HPKItDRR`F9|<+o zF`4gtT(~|^3u`P`}6A6l5*@R+O$a<55dIj z`HafP({qxSy<~OSpa|_MP5SHOkX5i_MCb5gbSOEmRbCu(B)z|e=N6_?Y=#K<^@v!i z6^1yLN(PurX>214Gl=>8B-hS`S6wYI&^rV9J?%S6s)vu)*5p{tZKXd0<+Rw)+%6!P zdab-rS)XsG2TACu@Ic+PiU1sHyA>NTpBlq=h<`KN*L?&HylHdChU`6wxMgiywPVLY z4%3C*l6ySsaI*n?#T;PZgk{9R3ijub^Zt7s>_5FZn>qU`p6drf*iPBehtX#Ho~6Xi zS+9<6Je^{s91XM4yHd3G7S40bfuHCT|7nNMnG_ENSn_jDv)wHqP=JornA(&bbA(bWQNHxreV-~O45rmu3k#77UCQ*fc_*f$CWnrRf@L#LM z=zDVGN7BVOt;mud5GjD=njIEfCZk|f?u-|d2C81QBC2Ch9dV=Dw61Zc>|;89R)%;2 zP!vziU`VooFsOgPOwjAlCcVQFfsktGl3HIhkcM;hi;S602BVcd)BqOaLsiRCG>^#t z2A#fS$4(pS*?K*C?qA;t!C;{9lTKw&W53%$&ZJm49;iLvJaCt<6OvXoSljE_YxOj~ zq-Ntj(~uZMa0PmMp#^KfCU>p1ANUW~%__)X9;Tb+Wt^pnjM$67v>8;uhY(xdXO@}tT!I5 zfwmVTL_#K`)M$s^pk*zNFE+WoWj}09VYz%x=5vSwnB??0l#)gh(PhV;PNR|>-*;s- zxcFsnSc-^*sMTeG`8G*=&PEqxzEw=9LZyM$2`C;!$S@C>sdf2=C!BgPv&%YY$dh9$ zOw%yIK;r1#%c6ty&}uF*`c}1n9w9vIqIP>h3HoR@pl)^r!Z||mCS;`tU)DtRiFyt8 zxaimGh?>oUJ?$2wn0#dFw7dynqo&)>yV-2G0ufvd4FmeS=}#u4@QlaW0Qdvb0<3UH%SvQ!0;=unL zT+X1iga6_`pE0@{e`)9Dm&B9d|IlAu#6piEmG7kaV0Fx4J>eavb(1j=Qqw{K4uK&D z^)uu=D#?+*i#LjR1|`T|+zU1rNtY%(=sxm|zoA5mHpMc%)p(2ey?$(%br{DQ%{W=a>#lpD$zaY#BV!~qs=2jmcU$41j9FPm+EIEI@^xc-2|D9 zEQ4heRt|hsrqUQT=ZRso{PJ$8dWg+vd6Pqy8Mm7(n2^(V{1r_Ibr~j331Pb@JO*UZiMh5F9JU=f=lU5P$-UDN;0fxPhWa*@Jj@Iqzv{ zIoIgMNmcce;>(hK*3kZw<rcHtXm^peJt*#^1=$XJ{Dp|Dfkn z46Xqb_CYcQbf_lyI*_ca;s(O&RlXnr#k=p@zQ2949$W8Z;;8L}oa!Rlw9_A7ql!Tf z-npZHrVHm`1CAOm30(Nsd^pI5pJ-g<@JlTy9GNz0rwd04uR+Ww8dK|`v(xpI5*+a5 z;0~#~8YCiDk<3S5Y|4W7jeg{J&&ZJ!Jp&l@T31j!%jD&WwIl<_!JV>yb1EMV)726Y z3Wx^=-S8P;tW)7ZKK35%_>+Vq3zFrm&4d-JJ0bI={52Iku z&LJo&cvlcsFVjJ9)p;kWG$!(^DVX` zGKV*RyBb8ru!2UG#jo_#T3>Hl#}Gb?2a2ngh5@q3Y$y&cQ_-*-$-FLTPbag&AoZ8O z1nT%02bq-r+Oq1;TWGj#m&xYwkmU&9FGuUii!x3%cLC*SvUHUU6HzyUb`XWpBEa)W z*60fd}6ohZeMu zS6qk0H47+C&o${9_(!tEXM3rdKA76fqh*%DWSJOjnUK5^cdMi%wy*gPC`PTL zNwJ|BLHWaa^h6`A5MHfRWF%gL>~qa26W`+F941(x-Mep_jnS2miuFDsj;+soUc4ad z0&McBW;EydlKSb;-8Q2o@t${<(en)yfys%gY{zgba_BZXJ1_KDChA?d=E(bH$tC&VKTFD~2f+DPmUsRgUGB8y z6=9uCKkRKl7COy8!xVQuUV~Xq|LUGE0ZhUG8Jc8)r;EBDm_!3JkO%*y55iN2$UOgr zs7CnlH}fMhO#C>&kNCS8&4U-yZ>@{KM||a1XdV+h0e(($l%TaCa+Cl$11ZPhidCQL zWKaF$8&s7`mn-zKmMayBZDj+Gg-C?CJpO?C#{iU#AN>&s9H^jO*vnuBF|Eutx55#) z$rHot)leEh!L1|gF$AF@>NGco6CCjRz30DguSVK$JjO9=Yir=j_c86YF01a2u?MT&RX!r#C7Jt?wCjkg0UOupq9F16CXjE17YLhNt#+3BV z1dms_cL%)aGI()%J=$$l(>5Ejx+kQ4!ElQ%_vjqUcx~dA5JuuA!g2#{#F6f)QqcWu z`m=cQV`z7F8++~e=SDB3|1G6*Ev|Sg&4AJ!2ticfNYOWo32-k^iK7w&2L8lb!&&jh z4N7REhyji?;l_z|f-;E=Og~qFX`~y%8Oe^yv*ECPYXuVfqK-ut7QSJ{=|0P%#_1OB z8vTXnX&{zQtoYhWNH*|+e_Uk8k!FSLI4tD3r>b&r4&IR1^VWHy%0@1aYHeCEp=Xw` zq#$Lj-;jg-7_C8nyJ}<_9 z6x&CHX-K4(1aw!;xtju|>zKjiXvo--K-?`{w${pK$!;0!Q@oFPkU<>a*v{sR%kmJ- zafDFR^(a-k@%STtkBQ2t_dG0ijK=|%LuGwV6?dA9Ld>n}Ij#z|?iJYb%IdrV04zRc zIgiFAk`buwyR}EN^88PMPA?cY@ya6lb-q)T=-Qssk5{4l{dP96Kn=KYpi0iCLkuUL zZm-u%%rRH8U$G!tAXTxM_pOzwfpmbcC`d^2J3kdn@Dx`z9IcR52Hwj?q**sIy(VqJi%c4HJbGoOBzW? znYN^+<{#xKut83WBNxfP`8{=dn^W8&H4&xJTi#FN`+PvkTu&27qyGGeUs!XY4G(<- zSftu(r<7NER!R)k4p`{c%+?A0TnW{vePhEDCje_&#$Z!Mx{p=&BW(71UW0#J9Mm^E zQk5JCKt((5lTX*TI+It@)-~Z-Bo47IxWo*CPV}m9jAqo^R{x9XX1p#|yrIu{3(}ivXD&8iKOk0d(R%s82x=9yDX9RJ7R56;7F^>>ZJ)$7Bt0Bo)O@hBUK+Qy|2#jNq=P!U)?awhOeZ{(7}Ui+R2)#m-mY>S z+Fn0H+NWFNS2H!#Fj?K+2O%ReUlw^n)qc|EPv~Vusy|6R{LCvJiR$4pcd?J4GhH3( z;01jI)cI2Zlmy`t>9bOO3S37@PHbFa$;KRd!TJ}A(fS!FF4}Rn&&E2H2!t+tnMaol zJC3z-1!qIDqpv<=m|M1N`=@e{j71*(Gz}QKEv{_;Eq#>lq7%zhHCDatctr|a3Wfl{ z4pj)$c|rR?WDJtS>UmIy1z}`QeTwRoKT)M4@P=x2$mmY)Ujg!DnR#GMh_Ui2dFy<=xPIyg z8C=zt#0s^Zf5(o4K4O#vnd)IkxEya)eAmjp4Q!!#zTPcxoV19KZ|P2dtO2Sry((ZE zQqK+34RJC^f;B-oq#fXxxvt9DRPE<(cONf0I*;mYs^7{mLEC@5gdi;)qXe9oAQYGj ztwtSQ7kPH7yT}2wjvq&N#f*e-DcjKFNG6waOfqxR5ABEU;2>2e*By=EpcNGlhFf2? zLBDwTFouT8<6y!pcTl~(Bt_p1;xe;+y`5uYzpRD99pfq54oX|9E=_XG&Zm6A6&^Jk_)p+%<}Thv5br#Knk@Z{Xj~_vFb^d=Dh^$ zz3Oy(L&Y(r80^sTe5I1xl9C@F*gg}~?We0;8uK|mklZm;Cb9cxA7BWkpaUJ{r%VT8 z>PTg0(g}$m46og$$xiL}*9m9D!25N;Tv`z*r@W}CE}3+;H`B2ii}MkNLLq$-!gng#t2BlpQ5OTJr$R4MF*nuoBN2BWk34** zo93F<3ird`wYYmiexNpHbe@0X3W6)7gka97t3@8?zLw5jT0N{9ONb>-kjlf2<#!@S zF9}c^%{z3cRH}MeNLMq#`2Jy#;A!M2$l2s&0TU-1aD-hZ=MV6#aH(LorMIpzaN>7b zc$KysZBX%5l?qL^oz8*Qq3FGyMrc&cKB(u(yQ6y^^E&q_+sRZafK<%WihL9vVN&*` zb&L*%Q1%5ieq?D7LVGLq7ZRRqw)`f=6_;3ML50;+YRFlRgCr(;z)rpb<*XJ9#P1LH ziXq!I-(A>>#^D}**mUh3GrZ(Am6wT7Mx3d7vX~v^VY0*0-v(K90B`f>6P{@vqUY!A zF&FSaW6bIaGu}t02xr=+;knyKX$Z3DlVZ+zNse{L>B5b*mOElDDI$dA>inw^ZCh;( zI*9?XZXjUl>Er`s1*dCU$#OAE?lRZG@#Q+t|Wm~c^B%vSI28Dq?{Uq z$x$60tsrs8VpCGQ7v%rjfu2Qy6pdp2?(c4Q-UbI7(keWN-XLV^bhLZ6%C$86Qa7OFZ2-t`$%1Mp9vbr@P8zX ztwLOBR&rCh@i(c18q-O5plP;yA8)qnm%s-8=>i+{<2fT4XrS&x<$FM4-|!e0ynL85 zN|HZle0;JHMg?7=57=7?rb|z!T3j_sFy;pN1SyEr3v^8k=;2mZqZPMZ(stXI!;0-> z)Xb2Lz+ciL0Q=!?t$c{QcD&6tTfEHCL8F%$jWqn5UW*l5PLvPHNj!~eANW0>hYKxO zwFUtNIwAB&{g-P%S#(_KSExtM3e1b6&pOF}!*90SdW{A%VCVyq;k~>&!hcChhyS-V z0;x#%Mb#Lo_J$SVJa(s_RvVMs`|<-#0l55?bwYZ{2@!IUg+w`w&8FywY*?_+6c>7_ z|FNQf)j@rY(QgWmiI*muX*`dYB`vr?7_6*VZg`7=eSfzGNq|Y1UTXZVO?huDa!ogz zary^SE6pvgn^-9**^{8bHCGP%T+BLTB(b=?T51%;iiV4>izUi{jvS(Cm=m9lP4Ajh z=%f6epqDkiTcws;XXD16Rr9LF&Gq>Wob@xTNp?ch3{X0qkq8xN*ia?BQ>R@&-2^lw zZhWbOLtNWLPF|ZoG=P&L-&tj^NU4Hn=W{)t0{a|NfQ$S|nMiUIDwJsDR}kVU@)0S0 z4yl?i;| zHk?F}Ekm*Na?)PO`9ckfw)#1^HMguJJmUW20_TmLOB5W zhErWPoE3%_d04tC`=cQD8SzM~J9IwaO1+;rL_4O?Q)RQ8gDN)}e6WMgeJDV{85=Bh z%2g|mM*XuKaCjLiLLX+|w6hOq!`q9CVgBLr%OCmqm(RC1UoI~(>*S*U;q2?>Z8%T^ z_FpGp*{MpI=9qH|->ws?@#VaWQQ`5wP|!YB zKB-!~p+s@Kr{%jog9HnW+ig++KKr~}Tmu-rp6wnAh>>#S@_ss9AS8#fwCdgQjYU90 zIAP-Tcr2vF73OqQr#@YkG4o}%9Jb39#9XKq-W)MvdUf^_d$bdK}Xl94=)6=9T-B;G?h?1%L0mh#=v0+G}@Uvm8fTb7T`_hl^&5tDv zBeK{(f~DupWy7c86YwsuOq|hd6w`sZqJv^SI-dl?p1rjq$MJYQMYyCbe&}iW@FwS_ z7=*|3_^y&=DH3Pg@9_izJjF~Fj|jC&w4IJgSyr&ZiYJIML&C}wP6O@No4b4q%l<-a z3RG2p7tk+E$;Jq3onmw0_t;zn*Wy1or=Zgs3~PWLL%5YvTEt7}mH1V^)dAc`+Ugon zHTs7%qZ(yd2Kwjk_4w2Y9 zwT+?UckuCMPR^3d&Jp}Df$`e)ml8r01KwE$Ap)pfYzODq9}LePKx#7!bpe@_xC&l9A42A;}*Q$$0bT@MqZW?NgBc6Zb8!# z#VK18UNb$j(AOr-#p^%ZX3_25n@cn%QoQI)ecP-iXnO5VKm&gmoOQFDxkXy6G4g?R zSRe;j^;*Ul zB=V%^O|d0itH1YxNGAj(blxGJvk0k$HfE&lA?s38KKgN1WHsTQco#=vx2hJd+VlPm z)I1n5&WQp1nj}*3BuBdRizYbS0ZH&|w%2;3B({$YHs18fz~81K-Bw#^98}t)`I(E) zuM$=J6TgBgpXS=?XCS(qs-2U+*T!#U%@LUmpCf;BI{jsG=H773Bry)rhXG9vQ9ja5 z@eX>1mgPslsfVZ2FH9`@QY2MQ3}N(c6tNO;R4g?F5L>2(l9o2td_O>L9wlZl9zQJC z@S)RlYHB<%c4Jc`hN-8Qm@cd;Tb2jtqk3;}ie`DtTZs zMUsPbYDNntGFjRPFISLL25AeOrLY5tE)|JbJYKR{t}W`vY<6niD4$t)@}rVd`tnkQ zt{uQ#;VfE`w2KxY>vZ_C^m@aW#lJrf&tinxvp8dx|0Gjp@o}}B**+$xTm=;l${=8G zkh0(t)Cxhzb}}VTthje9CG1-~zkn~1*0kj_eQdtJDCx5tO?7jA>D)S$EZYL*%7In^>{b4M618kUKga>TnN*ri5wae`7#aSNjOO^-z=~Ujq&+wXU=*Kgz%b!twz!ns! zOiyW_8=GFyD{va%vW01fH$3g|3k}2>a$Ww`J-?dMppsJjZ?Z-fj4ULfKdv)188+ia zQe+I8U>tke?+D^T%T-&_E%%0r>-F?84$rYH)H19?fx$;iC99wPP=JEq%zhBfRJtDR znDs+Mm=9QE$=Z%@qoQiYlWa^Q4p^ z{GuYb2$+N&hAdKR(%D2(!3g3Js^A^se2xHdwauK9>A1kimce*Q&8it@CF(9u{Re7k zM1RQO`W9yy#uo@_G0+} z2qfuNh8lYQV~u*@BX(j=>a|e8vbod#-4xMvA7>iChLs~I3QBkR^bL5`3GHfL_;mNaC7xhXf5F{6T}u#y|7)5YEU!FJd=4m z&CeFkIn94i-)5qS5^ilOjiG&{2ys`Cc0*_JmM5&F)-u+8V|F@0yW4VcxBQubkb#q} zEF{KJe@1nQD69O7{C>s#|1fQI%i{j989ee=qn-3S%);Ns2(n)hFI_@PG!YHFNGZ|a zWeK@qjr|5N-&@Bi|A;+Phs zolhK)2GQ!s4gRXjE+WDl33Q!3<^V^EyAFFn#CkZb9L59c!k8BXoRk}Gq1F6!J^qGJ zindJg0F?sTnBfR>=i^<|4kP33Olw>mcE9|B>{#Wu)FzFKqY;K~NP9?}Vq#!*0(_{v zegCwEF0WnQDP`}gQL!EnEB%mfAJ@=+ zs8yq*%_92s7F4hU{p)Mi_AnkNL8@;=hSYIFOnyLyr`b7b2gb`IghZ|E*Xfo!=)q9i zqSA;O`t9{SG2w#o}xW?#Uf0mm3o|>YMWyRU#0It11I-txh?~Qw!Oc5uTg_dnc{Z zE76p#;F-d1ehG3U*Ws9GM8WxP@wi-m5BC_gsNk(8JlDm0LusYb9e_z_|MK)C(m^C> zh6ghg{$}mqrO_tZri@!jErej)IQf<%ISQczo)zc<3aGeK9I^=e=0#Jit4fGw8`<4a ztDu(=JU0P{3K$8s{Na#f$LsNIyjlUkx}T1p$FpgdDPt;V-5)15Ho>jgxCbbqLevn) zq(^^?N1$==`||AAw!26<32M`;;DOIzcc+u}I_=wt->vn3mZ4G{ppn z;OZQ55bZc`ObPK7@XNisCEWE$4aT#jPpMk|2Ae_-IvZ{XYk=K-=9W&)W1({k(g=pV zq$H3#=#O5|7#Ke01L#1JdcquD#a%txO``pN$pNSz!>p#S8VZo_X?o!xEAje3wo`2w zUni^2xG59lMAB+{`Gje3j^>N+M5>^3hi5fWlwT?IMvjJ`4>dm+k&hEVIVV>#53UTW zsNrIsD61ca{mzm(Y`Y3?tvZ3$U6-2*V~#HY-dh*p zHqe%boZLQ-o;3}P`&*W%b&U~2wT`Wie#sr-m`g*oXFF+#n|k-^2d^!YnCaXK@WjbK z$^V#+zUu-6&maK7T0BtZz&lZ}w{d%9{V+OEkW@q^~7oF2v)zRPIkna(kN@_*> z6)L^Ex5rL^6JC$Vo$Q~Es{R@WlqB{Go)ih8xT9XW$~cSI!BRht_v>goP9;LOK4SkJ zV@}80#)Ig$)eXncZIs%KJ@N$ED%o+AyX5{U8f7GE+yO}kh+#X|lGa*Of+qubmmfSa zbJ6l~@?BQeVbmFdnZ;tY+iJ}K(E=K)vA0h}1Cu?&<%t9lNQWDd#jOfWVJ{(mHU02C zBL_=CU$Ea};aGGy$R1YTTl%_UQ0zk9a4-tanU3)Buf4O;%X!u+yAt>JEs~$~R!rUt z`$ZvehDwN>wtDdBYwE69#fj{HkHSe1_wfEvW+TwNzP&?~hvcWgfVGgqs5(ArQN$gw zWbd4=P~X)BHp#Jzba4>82t)ZCx{qjrE+hK#dNcH;T`n;O6|Eu6IN-JdTxiON3zMXb z!9fmei$;Jpg_;g8@nVXuMkOqc{)V}`&)#J{S|=Fp*X2;4gmnc8Bi4i?zfh7WOpPca z8Rw^LnVt>{##PP-rTE|Jgw=h^2>?rYp1T`%G~Wogf?kf8z7b_p)bmQ7n+mA+YRV40 zM6T3OY7-=;ZRpJa11);HL+u!C3(wwJ*XMXIFb_n7AyF*&Kzg4T$YVO68=#d2OFg~V ztwa8xiBIM0aIn7`eUC_x(Le``+c$!J+fh@EY2Ola2y{W*U6I}A6+YLXu{oE!kOVlS@y^CT)!S^)}rh1y5oqwVMzq-Jg zg1RLW?8|>jjU3678s;)32F5l6Z7A%b%a$&^qkwSqOdpe_5e8r%iO;ztW z&YG$k;xNPKO^hUdPBS<+#K7@Qc%>vO$=7KgS_L84fMds+bcKt-RQ_-S3i{6QBxb>2 z>kfzoE{BEr9MF!HXqF8LYVc z>*e4*m@@BL@3^omx))Axw$Mq&07*5wu zG+mx1X7COYA5prdY7hoL%G1TstfQsgLA1IUoPAbDP2PL0q>3#ssu-P_mBAyJ6`RK< zU5MJPMxK#SoNBJx6}3H4beiwXf0n+kV7a$mKKuY7t`4&@eSFdq`=Ryoj0*AQDWzbY zP2N8h6Q7-eR?4g=VnAVp{n^ig)D7)6;8M#&&T41loqK4+hE_PP7qTmE$Nh}u&3ty^`!=d;iLti3jp{~nzHI ztAcja>3J4)Vo|MBI1IwA!2jM^dji(=)5-ba(POSE&=Y2O7GQ`c*Kb@II%u_!4yyaJ zz7WJdZ6zs)=0PidWDTi!`)JH39yG#Zj`raw+a$%Gdy3w35j9W?#j8)V1^qZ~ePO>f z3Wl8lhKf?ju(lVZkHEUEs2E=3OR?77>)ZrinrS?V0VtN@tqdP~u}SV0CkbAO++hnR zs_Ml^Y+nO-rsiqTMVifyu;QismwB%HEr{wON-di3w1AI?qoAz0wL}R)|MEJ_PoNPl ziz;rg#+5bk@?WLTn71&rY1)~PxUZa2gO`Ie8Wo0#+vZ(T@8#@g5)}^=FIvAfq{p`ary+4_PFPJznkN0Tty?W$@25-1` ziU~^D^5QF%lupax0#%?|*&V>T9x*nX{MPWXHB`zoa}7FohDgW;brxMjmId7dIu8+Z zUXtAMgvBgOoJb04hYUWGl{1J3*YPurc#mkdmSCq`iOYEjoCez4x%k|@r}ukz?r!(1 zPy%LllB--MkkBx62WLnE_{w&dp8*tN0$M zqDQmw;1r(D(f$C#D7A}W3&SpU>BA))S`HN^?XNKcR!pQaeSDduZ3+I=RPF_$e2c6b zag`It7`3C%CE_*P9vBL-oQ#XBhE&u#p@v@5Ah|*D4+xmmDNJB0WzD%Y7;x}Tq#k0Q z8lab3^}<`j`Sh5J7G$w44N0%ocBphPQOAwoZkKWK)uALM_shn8pb-!=0gn$bNbFKg{4a<7De=D_&)^w9M3L7+ zfGNlG@!*(XH#E)7SG1g~YON`F#bTpYoirVjmPEB+RFsi<4X^LQZQmRuBE5N$UXZ2y zwZXGZ1`L|)Lu~MrJTj@l6Xt2F1BI2>cWv&Nbzf{`8-9xE0cu1!KW92aEG$4B=x;k! z!h-Nhb5}6?B(eG?i>%W}T@gttW2WZ4G3OiQ&9zOrQdC)xbo68k1~hc6-Sdyh0-hMR3$EAfBo9^#hv9h1V8t3b}gi zj(X+pC{+7ybw`=%Ezzw|bf`wUlA0AfRM>;Hs%*Y$%hw9IKcc`CTb9?YrU1dD}Y zsADn@9ep9PR4Po|gUb-#W69*2f$-D$y1dw>Z#~HnF?7B~jZXtUbKz*%g&7A>=9~d+ zMZF*I)#${5;fznO~QL(SRT6MV&2`oQl7B2!Er#Wc^Q6`f|}Qo^)klei4>eFpox zTw<#C?D^8^;B+!O9*xeN8WNC-C0|RYkP6CeV(M87ugY!aQ#P~;#XL7ooL>7}w^Q{wI;3Qy%FM2Pb(4P)~3Ii(^$H}xv zF1q)t^$@J;&p4Qg;2ceWoGwqRS&7O+Po)%|vhy#As9Yx{w=}uxNsWoGTRmFp{o162 zh`c_U?}yquDVCLxwQv*d?ZSr**Zc1dK#qfFnIQl-I7Fo%7k;~rY)^;B+5@CQAj{}( zId0gCaYKCEMXh(N?^{^ZVJ&Y{-8<~wlU;-Yv3sAEd=M)Vw0Jf`9XbjALCH|TKU@qK zz)7F)qekBD!~X8${_aycyD|7zAeaQZ-xt}Lc^yC_P0vy$79Pk<#Pahj3V@`Jn>bgp zp%wj;tyH+`%<_EE#!O;-Wx)qvLp{IJ{?6d?cmnkO+)ZN)qSvUt8BeK%HBvgTnHYM5 zm$gwdk-Swm*DdX;kF)f$L=ZNZs9LP1va9NxO(#Q;p-;g8zu)7qhq_-mh58o8)VeFH zige*a1n;X3f@{KcO;tdyBe+Q5+P=z8zkfJ7?O)6(b%E0@Q7-F8M+6VD5iHxzoPq_U zW!@%eSMT;05WEkg;Kj$J*a76^Hi=6}S`-%T@$LiOeZYb@7-Oh#MhA&81|R3Ubikg7 z;|F+5`UYayw_TIMsY0Hqx~bJaZ$dRybxY$nwsLD2a#e>A@F96arQ2aaC=U)~;>W?^ z*ne5ncThPGRFqiWr-RGwoj3W**T@|VkXMS_>EZ^B$Q@daQhq-Y#JTIz9CAR~o$nEK z*B%7U26#^qW#?>GGDJYMyu;A^ijii{>(a{*X0Sy}%RKp2%xAl*oF|QtLV8pZic}y5+W<}U&kA|ioH6Jua3ZCJ4H}Kf>ny;um`IW5 zx{XQ6M~??DDfI}Ps$b-SALL&UQWOWWVmUotI~$EMLR_9En-aM~i~8tORf|W(nQ|=> zh+ZtIFq#L5%ze+JIGJ`twN>pW?X=m<}QHRAnCQ2K9MmJnQcvvkIk%e4nb3W57cyl%IYH+Tm01Y*IF~JFO8< z8BCAoG<9lyLg1NV&2BMn)MJG)S&z)7IGS7X2di5b6KZel2hJKsoRe#i*A6Fghtxml z1_xX$_x0-gAetTcnEHEY7btHm0uddOu;1w6 zDb=3}t1s5e%{@mYAD4>R>dEYoo$sl1v~@4T!Vm#$PNmA?a!C!D+!++*tV}lTZEX_* zl+nWLf&Kj1asc@;A#6Ulh5>+@obtjej$`jDE{ch*px0I#LnzB$ZDtt=wV8Zh-M1%a z;~^XFNNHImR92*P;3KNd_$6r@QT{%EOYi_lz{8$XxBH%a*E`E&C6TC&c>@X$2$35NUI;7~i}F za)%C2&rzlGCDdLNn3$qiWPc1TnG?fc+*+w)vE(qCQRD%bElEJHvQUP2-l31k(P2(9 zIHyQZWWq{Ki&VPW+G-eesh`LeWFdqe2WaB?yjBS4Vcj@cKRlkmE^}#Fa1zc^jb`zY zq6cbt%lPQ1`r1-+Bx~5zz|#&}j<7YcSrx;~f{QnYXtnhSH9<+!oGr+G6?&*GDJ6A@ z=&ZYXQ7_HizmbrDHM4Z3LMRLf_-osot`yLd9nQho0|m!!J7Tu~wN z_-y)hs>-QM^j0(9Vldrt4_D%c2(bj%*dGEkpxmCzj4Hn&ti=Xx^4r!1fX}|DCA>&q zFFd%b3dR=FU;30~1vRTtbJx$3H=uLdx(4)ktb)91bhLiO(JXhP?Z(Sn8GE=w9Z{?{om)^DTQnnsmZBU6N*b4o@1u8Kz?|BlT zPNlwb%kv~stBFRIv@Aqq#Cy*yf`M1hcaw3cm%-YP{ctc=yn4VfwK)!N~73_TS7IoL!%2{~A$hH9opksd2Xn8cg~1#eHQ>SSK5 zR&;%nS>AwHA~$p&HPn5suXI~t4ciyATmvz8IUQUlVWgalYrPHvPjQKyaGw*&GkWuJ zzt-nC8{NH9>~5SHySorf${hl=+VkX!H`<`JScKQOFcQHUh5}IdM}s2|$=Pk0J(ajv z!ojUVdkbYCKtT-*f%k@VhR1^$C45m#Z;d?Kt1CF>-uV;}hxzg4Bm96&ut(#)>0o;K zBu@gg?G;OW)hRBt_Fs4ZYuH2+Xd}G8UL5XHJ+6?dPX3f?qgFlLdz9@AdeOt- z-R=4v)ZwzQn_diKZmUa`=Cr7IHIs~WQ_*bwuY5%vr0_>DcR9?~$XEvT3!Xm~o<;3- z?VbBO7i)$J%kvRNZ*vx9Z5gs((sLA)#IVtFX5ZNthhU(`NLH~GS7DMF+oGx|YpGM) zJI}znHy;7=1-&cQ+T_<>gBT)g9;zD-{G`fkQe$LyDLgSaJv=`~d_r845FN0u5ZZw_ zP`YaN#2q{<>dYa8go#-u4W&|({Y0fvp@DnJC|R)0X^Han zprOKeCri za%OqwDlP9Ehs`#YxJQ6j@oCRSU^9L?1@3n;B<_Q4s9pS%BQWF&trX7Yk_MP%_ybu@ z{~6VPd9vRB{5gCGA`w-8MRgps1Cs%{=b&nEDer{VtX<2fBa*eD1dv?2rKEWba$dYm z#33Oe#}v|p5HUwpGZ;RIU-6Lz5p9%SN;N~~4XL~b*qZrjFdYauxX|UAS5y^sGi}7gL9*vsjl{>4LChdVW zH5HWklAoL(AMc*Q1V<(WmDpA;6>s9RPN3dWDbCdvdA6KOy?+2l2QK4XvYBS3E$Qz2 z}G#QIit*oVAWowC^)QHtCfnYwdxZ)9rNMU5e?fyIFQ ztBVFPC$2m_ZYImxYhPuqCGD}>Ap3#r23rtZy%{VCsbzZR+e%|}i^)eXzKc?E<^JRZ zx)su{=i}iRWgMtpB}>G50CEF?mUARy82W#yHf0-xP|K3VeGj&yKS4!T>vIH*`lsZ1 z2dI~WZwVP1B5{f0JjbiIU+YD;pr5ey;fdjMRhNQjj(+6F z6`C?TEw!|nu0Y)`+$}U^%HYj8#BC{XrLdie#j1C38^VfUmIt-L@wsDs;P zSIuHsaheifA9GtsGVXGL@_nyb^`(l1t_~m^u5ho`P_i|JVGB0sDV%i&6DR)Qw$L1B z2yu*N0KshU_3BD#$$euGLd1d1qrpE24@-+aW96MQ1gA!nlX?C8Y;Vt`vcVXN8NFxB zJua>;1u&R#?J(xz>+97Z3Atq|OhZzrZDnTu{Nz1KWuP{lmPF3%AgY4jjNitz{Z_$3 zb%tt0r*q=G#%zL~xMENhYBdAL)h+!T_~#EQNtcESv9^GN7TLi4L9b{nSPq}<0@^nF zOQRnlvBa;1k@9mx3yV6K&>jWBqZvnB1QkY0Pkct~3tC|x09z!ieuZcl0H+y;CH=Gj zhh?V^`yBW69G0arI zjVZj4$Q8%})SOPGxRW`a;iPQ*!%T)~lG@nS>N${^h)e=kMRZCiu5>Z2sdlCd~S+ou5&I66yF9W%5bGbMVH%FL@7qNOFai%hFIMd1KTdrE^Z^a8K1rl_~< z=PNw8*v3H)>V@RmPKuHbk6%O&X1(&WgMl=9)4@<&>zg7De9tCbRs6d(g}2j1E+nDU zoKNsg=MsE0J{iw@#7m2%s;c7{01Vwjj1;Jq$D{e+>E3hThhPL+Igwo_P=ae5>m?a7 zwFjwg-%CeyaEiob0};1{ymT3pOyrMiW0HaN17dr|WOIqMgVWAcnjkM-leujMQ^;W_ z?ge2Fc4QTOM9pB?03{AQ=446@dv(DeGXS$)QpU~cWeX(qC%x#^UHG=K87u^P1Rb&@ z_p6BtYDg)qd61m*<%VbrnN78;GZ1y7=4`9heTx5?G_lX{kLgUcWFxZ+%BDEH_;&li zYBQy3n(LF!NS0id391MLODLRc2;SH&tnWuh*QlhmsGJiscf7K!o&a`qWDq&iv^jjEFmPLWSc zk%i=_M7uK=HL0jkepqZ8)=G`sERsJiJccIB+w=+O(}YQ=q4d+En9_@nX-Y5cM(QAd zXSRui4J*$>GQnebOsDiBj0UDP{2rKu@RazXF{QUd7eo}Pe=$aiD!hRg6J(|A0xz^% z-66+L(G#}f*U-m6@o3FfFBNr+g0C}cOMMl>m0+iRsNrgCHCqU=2obRx5sM4fST!FZ ztl-U|;MBJ4rl>p6E|h_H!9#Dl{2QSna;h!d!&B2cX}yD``s>+=IrgELooj8gQ=8E` zyDzDK#6fMZ8U>{%Nri6;liRBB4T?LNGpRD*{hLHBhSYgg6zt&93241Z``2P--*H6S zZVypnqf(tt$we^{B!M}t&a;TxFOnd>>fAtT8Ljj(+A2fDAh^l1JHHs0POyyse!3ORN(;Ti-1o=2X(hZ>#bqHj0XF367ZGOoH7o|jtNDC)00M7S%W!ND? zH8u?4=!{N44GTxBVq_)oiL);+u_`@3b+u^AyHY&{`*s+ z0GP7XPtw?WKR*gryKkdkz_c}EqK)BY4?ToDrxS$BVxu})3tv+kYQEE5p)oR)TPkO_ zcC%F-_}DN&e06)4q=>&U%`8C0F?_a-U!vhyLQ>tnJ()HqSs2t4^zDaA1&oOfW|Hhc3(%<+LPKg5o?e zRIb1#%{81FEs;X)SlB_2U4U7s!4N51A?drb_5|>Z)5-ba(PL!TprW6ogNq3BAgJy= z0G3|JmumFX$y&I#YR+olEZ7;tHGALf@R)Bc9>)^136AO~Mac*FD9LML`3yeYc^GtWXrQ~$!}Ms1(E$& zy-E~ab!zC-_UJhzPzC@(YN>D#`dSrtp z)ovHkD`+ScM~Ou)V=QbL)wyH|c&EVCLl2v@n2z=#lS7VPWS``@)SB#B1D<7Z=Nv_Z zeo>Gg1Pk-Kf3#)z4OEEJDoMsiY}f#bOpxETUowXi}8Zo4AJxBt38;WKn)uf z*?~ck&ao1NtiCh`rM6myUoy$`P8}aeq`~&d*=V0g z{S_WWd=<{gtt|i5Q?O6)bk!p-k?v6y@N=utKh^|P3v<&PeTI@CH$?ROs@-igcOy<6 zhS8#Gj`TtsVnw%ThG~th3M$T3(2seqyyNV{qB1-}7G9DOk=j3sgp7g^n|(m}oDZKb z@YtR2aXK_|Y`K<2E})-+^NF0M=UIYrLKC50%h1WI&Ugk( z+nrOhuX8RsmZmn&K-q$e+vVo_FKA|4jA1c$nD!Lsy+Gv{%>&hd!}fxPch=kACqQsv zV3g8Cd2B2#&n{0evap2`!P_JG1fu9=qUBjy-oHG>VQxF0E-lk9;Dnk1Dz0|=_-#5m z9?%K?)7kNSX_*M9mzMEy`EY^{&^GZuB+wWKO(^uYv^+ZMAHeV)^^f*(5!u7lheOYv z+IJIxFXrlPxogO0x(?kPm*giMK()pBlR4cO-|%hrX0xSb5*!F}xksl00Q<{>Ie4Y^ zpa;*EZsYIQaFLJV-%rTJdg-^YrEAOiAAFgPT3V9rgOAFc z`D?z0`{e%bV)KLK`Ty|`+?&aE=QHj&xr*FJws-OK|0d_Z@yG6b*{=8l>D!;iKY4z4 z)up8`-~;_8*W3B3J72c%ebpT)_m}hK{eRb=PtQSrfBqZPn{oTK9p2?O`XzkK&mZAC zYB72?{`nzv-WQy7edi0GkW+d4IkmU6^kwX)_kZtW?#X2PbJ_9v`+wlim;PJ&q<=HN z{k^}_7kESOE`23C|M&mNoiE$(|F%9MzyF_R=bwH2Q+$GK|Dj877yqQ)`Iqi|*~)P^ zg#Tn;w*QE4=@xST5B&ME{mO5;^W^_GHWX*9e2KLzw|MGBfpXJW&7>y{O^3%oiE$}`sL>H|06s9+n;a(OSWGN6Wd)!o?EW^ zU3{Qtk@x@LQ|^4(e)2EmNVk1M?=F2G`}F=R+4pk(+u8Rr9Ax`H_&sf+Km3-v|G)U> z__yqQ=?D3mt|MbtzN76oKJBjaoj-AR`c-_li5p3~i~Rf 0 时,插孔目标改成规尖在工件上表面以下这么深(孔口凹槽),再转 A7;为 0 时仍停在 `final_gap_mm`。进孔超过 8 mm(板厚 12 mm)直接拒绝。2026-10-19 12:20 写成 4 mm 时,臂在面下 1.6 mm 被挡住。 -然后只转左臂 A7(厂家 `SendJointPosition` 的第 7 轴,模式 `NRT_JOINT_POSITION`):先逆时针转到软件限位内侧 `extreme_margin_deg`,再顺时针转到另一侧。顺时针到位记为「首轮咬合结束」。接着 `run_gripper.sh --arm <臂号> --cli pos` 加上 `unwind_open_permille`(现为 400,不全开),再用一条厂家 `MoveL` 只抬 TCP 的 Z `unwind_lift_mm`(现为 3,即 0.3 cm;XY 和姿态不动,不拆成关节小跳)。这条和随后的下降都带 `zoneRadius=ZFine`、`targetTolerLevel=1`:厂家默认 `Z50` 和等级 3 会在还差约 0.5 mm 时就报到位,下降和记住的上抬对不上,合爪就不会发。A7 逆时针回到限位。请求速度是接口上限 0.90 rad/s;两端速度为 0 的样条峰速约是平均的 1.5 倍,所以整段按平均约 34 °/s 排程,避免时间到了还差几十度。然后下降刚才实测的那一段(不另写一个下降量),`--cli close`。合爪目标是位置 0;固件在位置先到时写 grip=1(到位),力先到才写 grip=2(夹住)。手指已经在合拢端就继续,还停在张开位则不转。再按 `extreme_speed_deg_s` 顺时针转到限位。前六轴不动。顺时针是进孔,逆时针是出孔。夹爪或这一段 Z 对不上,就停在当前关节。 +然后只转左臂 A7(厂家 `SendJointPosition` 的第 7 轴,模式 `NRT_JOINT_POSITION`):先逆时针转到软件限位内侧 `extreme_margin_deg`,再顺时针转到另一侧。顺时针到位记为「首轮咬合结束」。接着 `run_gripper.sh --arm <臂号> --cli pos` 加上 `unwind_open_permille`(现为 400,不全开),再用一条厂家 `MoveL` 只抬 TCP 的 Z `unwind_lift_mm`(现为 3,即 0.3 cm;XY 和姿态不动,不拆成关节小跳)。这条和随后的下降都带 `zoneRadius=ZFine`、`targetTolerLevel=1`:厂家默认 `Z50` 和等级 3 会在还差约 0.5 mm 时就报到位,下降和记住的上抬对不上,合爪就不会发。A7 再逆时针回到限位。然后下降刚才实测的那一段(不另写一个下降量),`--cli close`。合爪目标是位置 0;固件在位置先到时写 grip=1(到位),力先到才写 grip=2(夹住)。手指已经在合拢端就继续,还停在张开位则不转。再顺时针转到限位。这四段 A7 都请求接口上限 0.90 rad/s;两端速度为 0 的样条峰速约是平均的 1.5 倍,所以整段按平均约 34 °/s 排程,避免时间到了还差几十度。`extreme_speed_deg_s` 只留给规装配预绕。前六轴不动。顺时针是进孔,逆时针是出孔。夹爪或这一段 Z 对不上,就停在当前关节。 只测 D435 这一段位移时加 `--d435-only`:不交 D405、不进二阶段,并且要求先停 `run_real.sh`。 ```bash diff --git a/handeye/poses/backup/89_eye_in_hand_21pts_before_20261016.yaml b/handeye/poses/backup/89_eye_in_hand_21pts_before_20261016.yaml new file mode 100644 index 0000000..c4642b3 --- /dev/null +++ b/handeye/poses/backup/89_eye_in_hand_21pts_before_20261016.yaml @@ -0,0 +1,56 @@ +# 手眼标定示教的关节位姿(7 关节 × N)。由 calibrate + waypoints 共用。 +# +# 在这里编辑,或者: +# bash ~/ros2/scripts/run_handeye.sh teach +# bash ~/ros2/scripts/run_handeye.sh merge +# +# /** 这样任意节点名都能收到这些参数。 + +/**: + ros__parameters: + num_poses: 21 + # 2026-09-02 通过 handeye_teach 示教(RDK 自由驱动) + waypoint_positions: [ + # pose 0 + -0.928421, -1.237477, 1.528823, 1.526334, -1.230146, 0.098562, 0.538531, + # pose 1 + -0.970203, -1.315554, 1.553230, 1.669383, -1.407869, 0.125907, 0.578173, + # pose 2 + -0.967819, -1.525572, 1.706057, 1.357062, -1.211051, 0.023232, 0.193541, + # pose 3 + -1.065106, -1.624218, 1.793644, 1.279402, -1.120929, 0.019151, 0.139658, + # pose 4 + -0.386279, -1.551838, 1.563578, 1.552444, -1.775337, -0.341974, 0.957445, + # pose 5 + -0.227779, -1.219414, 1.026882, 0.828801, -0.916809, -0.166985, 0.034154, + # pose 6 + -0.324968, -1.273082, 1.092344, 0.723132, -0.922095, -0.206413, 0.152082, + # pose 7 + -0.421966, -1.309101, 1.143065, 0.606456, -0.906673, -0.219282, 0.237953, + # pose 8 + -0.851598, -1.260600, 1.302895, 1.127033, -0.969809, 0.032856, 0.642673, + # pose 9 + -0.951418, -0.550124, 0.848598, 2.139787, -1.025778, 1.184418, 0.598394, + # pose 10 + -0.834498, -0.635767, 0.970038, 2.058410, -1.035138, 1.032040, 0.738619, + # pose 11 + -0.519528, -0.883321, 1.135035, 1.830274, -1.100901, 0.234065, -0.069068, + # pose 12 + -0.347358, -1.081426, 1.192233, 1.514557, -1.244594, -0.116668, -0.564362, + # pose 13 + -0.364832, -1.102689, 1.224844, 1.520320, -1.265760, -0.136855, -0.582459, + # pose 14 + -1.130796, -1.316186, 1.711089, 1.821409, -1.278003, 0.010885, -1.337210, + # pose 15 + -0.732222, -1.376363, 1.812339, 1.293854, -1.410826, -0.226771, -0.217230, + # pose 16 + -0.885017, -1.493416, 1.894070, 1.379021, -1.520015, -0.257115, 1.025331, + # pose 17 + -0.911769, -1.532695, 1.944123, 1.427787, -1.560513, -0.267425, 1.004398, + # pose 18 + -1.436271, -1.768595, 1.559397, 2.244717, -2.057112, 0.341785, 0.749883, + # pose 19 + -1.511828, -1.759337, 1.620075, 2.131574, -1.946595, 0.328227, 0.584657, + # pose 20 + -1.180482, -1.643241, 1.865851, 1.597699, -1.464982, 0.097605, -0.217780, + ] diff --git a/handeye/poses/backup/89_eye_to_hand_24pts_before_20261016.yaml b/handeye/poses/backup/89_eye_to_hand_24pts_before_20261016.yaml new file mode 100644 index 0000000..b2261ea --- /dev/null +++ b/handeye/poses/backup/89_eye_to_hand_24pts_before_20261016.yaml @@ -0,0 +1,60 @@ +# 眼在手外示教关节(7 关节 × N)。板夹在 tool10120938 上,顶置 D435 看它。 +# +# 由 teach → merge 写入,不要手抄眼在手上那份(两种模式的姿态完全不同)。 +# +# bash ~/ros2/scripts/run_handeye.sh --arm 89 teach --mode eye_to_hand --points 12 +# bash ~/ros2/scripts/run_handeye.sh --arm 89 merge --mode eye_to_hand + +/**: + ros__parameters: + num_poses: 24 + waypoint_positions: [ + # pose 0 + -1.241563, -0.359631, 0.346153, 2.172565, -0.179027, 0.929920, -0.778876, + # pose 1 + -1.388832, -0.554698, 0.416075, 1.897617, -0.358341, 0.827495, -0.762302, + # pose 2 + -1.436048, -0.573046, 0.461762, 1.870967, -0.387696, 0.813090, -0.762917, + # pose 3 + -1.614491, -0.519365, 0.693991, 2.156193, -0.499113, 0.968762, 0.073287, + # pose 4 + -2.020087, -0.869088, 1.059166, 2.155478, -1.198473, 0.740567, 0.478840, + # pose 5 + -2.082145, -1.122210, 1.203011, 1.950272, -1.269847, 0.434138, -0.641975, + # pose 6 + -1.983153, -0.886082, 0.999329, 2.324821, -1.272773, 0.754127, 0.313613, + # pose 7 + -2.021479, -0.886609, 1.055679, 2.337716, -1.282773, 0.669319, -0.028355, + # pose 8 + -2.022792, -0.947211, 1.118194, 2.127275, -1.211995, 0.527528, -0.169900, + # pose 9 + -2.004766, -1.065820, 1.183799, 1.901084, -1.217488, 0.380285, -0.312733, + # pose 10 + -1.942863, -1.219617, 1.256733, 1.653113, -1.222302, 0.261818, -0.420706, + # pose 11 + -2.039558, -1.082441, 1.189833, 1.996967, -1.241252, 0.521591, 0.526563, + # pose 12 + -2.098074, -1.006236, 1.538183, 2.118382, -0.737422, 0.019903, 0.648802, + # pose 13 + -2.039609, -1.159222, 1.488501, 1.908579, -1.168793, -0.140451, 0.034889, + # pose 14 + -1.880783, -1.104601, 1.579382, 2.036427, -0.665049, 0.254105, 1.518504, + # pose 15 + -2.015530, -1.535468, 1.711220, 1.836908, -1.707450, -0.400234, -0.708683, + # pose 16 + -1.997672, -1.626362, 1.529443, 2.200206, -1.291013, 0.398664, 1.954208, + # pose 17 + -1.981875, -1.620651, 1.545443, 2.373140, -1.167365, 0.396487, 2.012547, + # pose 18 + -2.179415, -1.511968, 1.578832, 2.401706, -1.326480, -0.051353, 1.137181, + # pose 19 + -2.173463, -1.530413, 1.575534, 2.173673, -1.289673, -0.090117, 0.867214, + # pose 20 + -2.096314, -1.569352, 1.579820, 1.942057, -1.458598, -0.057003, 0.572953, + # pose 21 + -2.129376, -1.566787, 1.903585, 1.962858, -1.454137, -0.335990, -0.148441, + # pose 22 + -2.020280, -1.527165, 1.887130, 1.728957, -1.491867, -0.370585, -0.277940, + # pose 23 + -2.140817, -1.607357, 1.617236, 2.153850, -1.571057, -0.147540, 0.770535, + ] diff --git a/handeye/results/backup/89_d435_eye_to_hand_tool10120938_oldtcp_20261012.yaml b/handeye/results/backup/89_d435_eye_to_hand_tool10120938_oldtcp_20261012.yaml new file mode 100644 index 0000000..8039d08 --- /dev/null +++ b/handeye/results/backup/89_d435_eye_to_hand_tool10120938_oldtcp_20261012.yaml @@ -0,0 +1,22 @@ +# 手眼标定结果 +# mode: eye_to_hand +# camera_source: d435 +# views: 24 +# utc: 2026-10-12T05:20:30.137123+00:00 +# board: 11x8 square_m=0.02 +# gripper_tool: tool10120938 +# T_4x4 = cam→基座(AX=XB 的手是 TCP,不折到法兰) +# 旧结果备份在 results/backup/ +gripper_tool: tool10120938 +T_flange_to_tool: + - [1.00000000, 0.00000000, 0.00000000, -0.00050000] + - [0.00000000, 1.00000000, 0.00000000, 0.00670000] + - [0.00000000, 0.00000000, 1.00000000, 0.22450000] + - [0.00000000, 0.00000000, 0.00000000, 1.00000000] +# T_cam_to_base (eye_to_hand) +translation_m: [0.37094529, -0.52805928, 0.73745585] +T_4x4: + - [-0.00990083, 0.99909706, -0.04131632, 0.37094529] + - [0.99991380, 0.01024832, 0.00820703, -0.52805928] + - [0.00862304, -0.04123150, -0.99911241, 0.73745585] + - [0.00000000, 0.00000000, 0.00000000, 1.00000000] diff --git a/handeye/results/backup/89_eye_in_hand_tool10120938_20261012.yaml b/handeye/results/backup/89_eye_in_hand_tool10120938_20261012.yaml new file mode 100644 index 0000000..9cfa770 --- /dev/null +++ b/handeye/results/backup/89_eye_in_hand_tool10120938_20261012.yaml @@ -0,0 +1,28 @@ +# 手眼标定结果 +# mode: eye_in_hand +# camera_source: d405_left +# views: 21 +# utc: 2026-10-12T03:29:51.243487+00:00 +# board: 11x8 square_m=0.015 +# gripper_tool: tool10120938 +# T_4x4 = cam→法兰(AX=XB 在 TCP 上解,再左乘 T_flange_to_tool) +# T_cam_to_tool 是原始求解;旧的法兰/tool1 备份在 results/backup/ +# 2026-10-12 第一次写出的 T_4x4 乘序反了(tz≈-296 mm),已按同一份 T_cam_to_tool 重折。 +gripper_tool: tool10120938 +T_flange_to_tool: + - [1.00000000, 0.00000000, 0.00000000, -0.00050000] + - [0.00000000, 1.00000000, 0.00000000, 0.00670000] + - [0.00000000, 0.00000000, 1.00000000, 0.22450000] + - [0.00000000, 0.00000000, 0.00000000, 1.00000000] +T_cam_to_tool: + - [-0.03435184, -0.86951953, 0.49270249, -0.05961995] + - [0.99932767, -0.03620511, 0.00577974, -0.01523625] + - [0.01281276, 0.49256977, 0.87017863, -0.09761517] + - [0.00000000, 0.00000000, 0.00000000, 1.00000000] +# T_cam_to_flange (eye_in_hand,由工具 TCP 折算) +translation_m: [-0.06011995, -0.00853625, 0.12688483] +T_4x4: + - [-0.03435184, -0.86951953, 0.49270249, -0.06011995] + - [0.99932767, -0.03620511, 0.00577974, -0.00853625] + - [0.01281276, 0.49256977, 0.87017863, 0.12688483] + - [0.00000000, 0.00000000, 0.00000000, 1.00000000] diff --git a/install/arm_application/lib/arm_application/assembly_pipeline b/install/arm_application/lib/arm_application/assembly_pipeline index 83e04c4..375a5b4 100755 --- a/install/arm_application/lib/arm_application/assembly_pipeline +++ b/install/arm_application/lib/arm_application/assembly_pipeline @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','assembly_pipeline' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','assembly_pipeline' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'assembly_pipeline')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'assembly_pipeline')()) diff --git a/install/arm_application/lib/arm_application/demo_named_poses b/install/arm_application/lib/arm_application/demo_named_poses index 7c827cb..bcc7ed6 100755 --- a/install/arm_application/lib/arm_application/demo_named_poses +++ b/install/arm_application/lib/arm_application/demo_named_poses @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','demo_named_poses' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','demo_named_poses' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'demo_named_poses')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'demo_named_poses')()) diff --git a/install/arm_application/lib/arm_application/dh_pgea b/install/arm_application/lib/arm_application/dh_pgea index ca6dd44..667b08b 100755 --- a/install/arm_application/lib/arm_application/dh_pgea +++ b/install/arm_application/lib/arm_application/dh_pgea @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','dh_pgea' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','dh_pgea' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'dh_pgea')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'dh_pgea')()) diff --git a/install/arm_application/lib/arm_application/dh_pgea_cli b/install/arm_application/lib/arm_application/dh_pgea_cli index 81ecdd2..c099aec 100755 --- a/install/arm_application/lib/arm_application/dh_pgea_cli +++ b/install/arm_application/lib/arm_application/dh_pgea_cli @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','dh_pgea_cli' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','dh_pgea_cli' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'dh_pgea_cli')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'dh_pgea_cli')()) diff --git a/install/arm_application/lib/arm_application/dual_gripper b/install/arm_application/lib/arm_application/dual_gripper index bf6c529..000f1cb 100755 --- a/install/arm_application/lib/arm_application/dual_gripper +++ b/install/arm_application/lib/arm_application/dual_gripper @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','dual_gripper' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','dual_gripper' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'dual_gripper')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'dual_gripper')()) diff --git a/install/arm_application/lib/arm_application/dual_gripper_cli b/install/arm_application/lib/arm_application/dual_gripper_cli index 1a713e1..489005e 100755 --- a/install/arm_application/lib/arm_application/dual_gripper_cli +++ b/install/arm_application/lib/arm_application/dual_gripper_cli @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','dual_gripper_cli' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','dual_gripper_cli' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'dual_gripper_cli')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'dual_gripper_cli')()) diff --git a/install/arm_application/lib/arm_application/gauge_assembly b/install/arm_application/lib/arm_application/gauge_assembly index 5270ad3..5db1dad 100755 --- a/install/arm_application/lib/arm_application/gauge_assembly +++ b/install/arm_application/lib/arm_application/gauge_assembly @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','gauge_assembly' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','gauge_assembly' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'gauge_assembly')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'gauge_assembly')()) diff --git a/install/arm_application/lib/arm_application/goto_ee_plane b/install/arm_application/lib/arm_application/goto_ee_plane index 9b2bf55..97447be 100755 --- a/install/arm_application/lib/arm_application/goto_ee_plane +++ b/install/arm_application/lib/arm_application/goto_ee_plane @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','goto_ee_plane' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','goto_ee_plane' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'goto_ee_plane')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'goto_ee_plane')()) diff --git a/install/arm_application/lib/arm_application/handeye_calibrate b/install/arm_application/lib/arm_application/handeye_calibrate index 05964cc..7614cfe 100755 --- a/install/arm_application/lib/arm_application/handeye_calibrate +++ b/install/arm_application/lib/arm_application/handeye_calibrate @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','handeye_calibrate' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','handeye_calibrate' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'handeye_calibrate')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'handeye_calibrate')()) diff --git a/install/arm_application/lib/arm_application/handeye_teach b/install/arm_application/lib/arm_application/handeye_teach index cb30156..9e55a1c 100755 --- a/install/arm_application/lib/arm_application/handeye_teach +++ b/install/arm_application/lib/arm_application/handeye_teach @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','handeye_teach' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','handeye_teach' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'handeye_teach')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'handeye_teach')()) diff --git a/install/arm_application/lib/arm_application/handeye_waypoints b/install/arm_application/lib/arm_application/handeye_waypoints index 461792e..e9ac708 100755 --- a/install/arm_application/lib/arm_application/handeye_waypoints +++ b/install/arm_application/lib/arm_application/handeye_waypoints @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','handeye_waypoints' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','handeye_waypoints' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'handeye_waypoints')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'handeye_waypoints')()) diff --git a/install/arm_application/lib/arm_application/hole_detect b/install/arm_application/lib/arm_application/hole_detect index f2b2bc9..cc928b1 100755 --- a/install/arm_application/lib/arm_application/hole_detect +++ b/install/arm_application/lib/arm_application/hole_detect @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','hole_detect' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','hole_detect' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'hole_detect')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'hole_detect')()) diff --git a/install/arm_application/lib/arm_application/move_to_pose_client b/install/arm_application/lib/arm_application/move_to_pose_client index 73cf946..d352fd4 100755 --- a/install/arm_application/lib/arm_application/move_to_pose_client +++ b/install/arm_application/lib/arm_application/move_to_pose_client @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','move_to_pose_client' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','move_to_pose_client' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'move_to_pose_client')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'move_to_pose_client')()) diff --git a/install/arm_application/lib/arm_application/perception_node b/install/arm_application/lib/arm_application/perception_node index 8679a28..cd09119 100755 --- a/install/arm_application/lib/arm_application/perception_node +++ b/install/arm_application/lib/arm_application/perception_node @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','perception_node' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','perception_node' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'perception_node')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'perception_node')()) diff --git a/install/arm_application/lib/arm_application/realsense_color_pub b/install/arm_application/lib/arm_application/realsense_color_pub index 1453e5a..3881ab2 100755 --- a/install/arm_application/lib/arm_application/realsense_color_pub +++ b/install/arm_application/lib/arm_application/realsense_color_pub @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','realsense_color_pub' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','realsense_color_pub' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'realsense_color_pub')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'realsense_color_pub')()) diff --git a/install/arm_application/lib/arm_application/realsense_view b/install/arm_application/lib/arm_application/realsense_view index 48049cf..43f31d0 100755 --- a/install/arm_application/lib/arm_application/realsense_view +++ b/install/arm_application/lib/arm_application/realsense_view @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','realsense_view' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','realsense_view' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'realsense_view')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'realsense_view')()) diff --git a/install/arm_application/lib/arm_application/run_joint_trajectory b/install/arm_application/lib/arm_application/run_joint_trajectory index 19b0f14..18e3e1b 100755 --- a/install/arm_application/lib/arm_application/run_joint_trajectory +++ b/install/arm_application/lib/arm_application/run_joint_trajectory @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','run_joint_trajectory' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','run_joint_trajectory' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'run_joint_trajectory')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'run_joint_trajectory')()) diff --git a/install/arm_application/lib/arm_application/servo_node b/install/arm_application/lib/arm_application/servo_node index 66bfece..113d9ea 100755 --- a/install/arm_application/lib/arm_application/servo_node +++ b/install/arm_application/lib/arm_application/servo_node @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','servo_node' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','servo_node' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'servo_node')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'servo_node')()) diff --git a/install/arm_application/lib/arm_application/stage2_locate b/install/arm_application/lib/arm_application/stage2_locate index 56a842a..94ac024 100755 --- a/install/arm_application/lib/arm_application/stage2_locate +++ b/install/arm_application/lib/arm_application/stage2_locate @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','stage2_locate' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','stage2_locate' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'stage2_locate')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'stage2_locate')()) diff --git a/install/arm_application/lib/arm_application/stage3_search b/install/arm_application/lib/arm_application/stage3_search index f1a3a02..4e25cb9 100755 --- a/install/arm_application/lib/arm_application/stage3_search +++ b/install/arm_application/lib/arm_application/stage3_search @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','stage3_search' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','stage3_search' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'stage3_search')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'stage3_search')()) diff --git a/install/arm_application/lib/arm_application/tactile b/install/arm_application/lib/arm_application/tactile index 952fc9f..36ea5a5 100755 --- a/install/arm_application/lib/arm_application/tactile +++ b/install/arm_application/lib/arm_application/tactile @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','tactile' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','tactile' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'tactile')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'tactile')()) diff --git a/install/arm_application/lib/arm_application/tactile_cli b/install/arm_application/lib/arm_application/tactile_cli index 570ae0f..4fbccf6 100755 --- a/install/arm_application/lib/arm_application/tactile_cli +++ b/install/arm_application/lib/arm_application/tactile_cli @@ -1,10 +1,10 @@ #!/home/cc/anaconda3/envs/ros_flexiv/bin/python3.11 -# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application==0.1.0','console_scripts','tactile_cli' +# EASY-INSTALL-ENTRY-SCRIPT: 'arm-application','console_scripts','tactile_cli' import re import sys # for compatibility with easy_install; see #2198 -__requires__ = 'arm-application==0.1.0' +__requires__ = 'arm-application' try: from importlib.metadata import distribution @@ -30,4 +30,4 @@ globals().setdefault('load_entry_point', importlib_load_entry_point) if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(load_entry_point('arm-application==0.1.0', 'console_scripts', 'tactile_cli')()) + sys.exit(load_entry_point('arm-application', 'console_scripts', 'tactile_cli')()) diff --git a/install/arm_application/lib/python3.11/site-packages/arm-application.egg-link b/install/arm_application/lib/python3.11/site-packages/arm-application.egg-link new file mode 100644 index 0000000..ef45187 --- /dev/null +++ b/install/arm_application/lib/python3.11/site-packages/arm-application.egg-link @@ -0,0 +1,2 @@ +/home/cc/ros2/build/arm_application +. \ No newline at end of file diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/__init__.py b/install/arm_application/lib/python3.11/site-packages/arm_application/__init__.py deleted file mode 100644 index 3f4946f..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -"""arm_application —— Flexiv Rizon + D405 + DH 夹爪的现场节点包。 - -对外可直接运行的 ROS 程序(见 ``setup.py`` 的 ``console_scripts``) ------------------------------------------------------------------- -相机: realsense_color_pub -感知: perception_node -伺服: servo_node -手眼: handeye_teach、handeye_waypoints、handeye_calibrate -夹爪: dh_pgea、dh_pgea_cli、dual_gripper、dual_gripper_cli -入孔检测: hole_detect -触觉: tactile、tactile_cli -辅助: goto_ee_plane、demo_named_poses、run_joint_trajectory - -可复用的 Python 模块(可以在你自己的节点里 import) ------------------------------------------------------------------- -``yolo_detector`` YOLO / TensorRT 推理 + ``pick_best`` 挑最优框 -``box_tracker`` 像素平面内的匀速模型框预测(丢帧时"滑行"用) -``plane_feature`` 在 YOLO 框内取立体平面的质心 -``dh_pgea`` 大寰 PGEA 的官方 Modbus RTU 客户端 -``dh_official`` ``dual_gripper`` 用的 DH Modbus 客户端 -``dual_gripper`` 左 PGEA + 右 RGI -``hole_detector`` yolo / hough / two_stage 三种孔心检测 -``orisys_tactile`` Orisys 视触觉适配器 -``geom_ik`` Rizon 几何雅可比 / DLS / 手眼加载 -``handeye_lib`` 棋盘格 + OpenCV ``calibrateHandEye`` -``handeye_realsense`` D405 的话题 / 序列号辅助 -``pid_controller`` 带积分分离的 PID -``kalman_filter`` 三维匀速模型卡尔曼滤波 - -现场操作请走 ``scripts/*.sh`` 和 ``config/site.yaml``,不要直接 import 这些模块。 -接口契约见 ``docs/INTERFACES.md``。 -""" diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/box_tracker.py b/install/arm_application/lib/python3.11/site-packages/arm_application/box_tracker.py deleted file mode 100644 index daf8786..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/box_tracker.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python3 -"""针对 YOLO ``xyxy`` 框(像素坐标系)的匀速跟踪器。 - -用于避免工件快速运动时丢失锁定:下一帧的闸门使用*预测*框, -短暂的 YOLO 漏检则由惯性滑行(coast)维持叠加显示。 -""" - -from __future__ import annotations - -from typing import Optional, Tuple - -import numpy as np - - -def _center(xyxy: np.ndarray) -> np.ndarray: - return np.array( - [0.5 * (float(xyxy[0]) + float(xyxy[2])), 0.5 * (float(xyxy[1]) + float(xyxy[3]))], - dtype=float, - ) - - -def _wh(xyxy: np.ndarray) -> Tuple[float, float]: - return ( - max(8.0, float(xyxy[2]) - float(xyxy[0])), - max(8.0, float(xyxy[3]) - float(xyxy[1])), - ) - - -class BoxTracker: - def __init__( - self, - *, - vmax_px_s: float = 1800.0, - v_lpf: float = 0.70, - max_dt: float = 0.25, - ) -> None: - self.vmax_px_s = float(vmax_px_s) - self.v_lpf = float(np.clip(v_lpf, 0.05, 1.0)) - self.max_dt = float(max_dt) - self.xyxy: Optional[np.ndarray] = None - self.v = np.zeros(2, dtype=float) # 中心点 px/s - self.t: Optional[float] = None - - def reset(self) -> None: - self.xyxy = None - self.v[:] = 0.0 - self.t = None - - def predict(self, t: float, img_wh: Optional[Tuple[int, int]] = None) -> Optional[np.ndarray]: - if self.xyxy is None: - return None - out = self.xyxy.copy() - if self.t is None: - return out - dt = float(np.clip(t - self.t, 0.0, self.max_dt)) - if dt <= 1e-4: - return out - c = _center(out) + self.v * dt - w, h = _wh(out) - x1, y1 = c[0] - 0.5 * w, c[1] - 0.5 * h - x2, y2 = c[0] + 0.5 * w, c[1] + 0.5 * h - if img_wh is not None: - iw, ih = float(img_wh[0]), float(img_wh[1]) - x1 = float(np.clip(x1, 0.0, iw - 2.0)) - y1 = float(np.clip(y1, 0.0, ih - 2.0)) - x2 = float(np.clip(x2, x1 + 4.0, iw)) - y2 = float(np.clip(y2, y1 + 4.0, ih)) - return np.array([x1, y1, x2, y2], dtype=float) - - def update(self, xyxy: np.ndarray, t: float) -> None: - xyxy = np.asarray(xyxy, dtype=float).reshape(4) - c = _center(xyxy) - if self.xyxy is not None and self.t is not None: - dt = float(t - self.t) - if dt > 0.28: - self.v[:] = 0.0 - elif dt > 1e-3: - inst = (c - _center(self.xyxy)) / dt - n = float(np.hypot(inst[0], inst[1])) - if n > self.vmax_px_s > 0.0: - inst = inst * (self.vmax_px_s / n) - a = self.v_lpf - self.v = a * inst + (1.0 - a) * self.v - self.xyxy = xyxy.copy() - self.t = float(t) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/demo_named_poses.py b/install/arm_application/lib/python3.11/site-packages/arm_application/demo_named_poses.py deleted file mode 100644 index 40cff4f..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/demo_named_poses.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -"""演示:通过 ``/set_named_pose`` 循环切换命名位姿(对任何后端都适用)。""" - -from __future__ import annotations - -import time - -import rclpy -from rclpy.node import Node - -from arm_msgs.srv import SetNamedPose - -from arm_application.ros_node import TolerantNode - - -class DemoNamedPoses(TolerantNode): - def __init__(self) -> None: - super().__init__('demo_named_poses') - self.declare_parameter( - 'poses', ['home', 'ready', 'inspect', 'pos_left', 'home'] - ) - self.declare_parameter('velocity_scale', 0.5) - self.declare_parameter('dwell_sec', 0.3) - self.declare_parameter('loops', 1) - self.poses = list( - self.get_parameter('poses').get_parameter_value().string_array_value - or ['home', 'ready', 'inspect', 'home'] - ) - self.velocity_scale = float(self.get_parameter('velocity_scale').value) - self.dwell_sec = float(self.get_parameter('dwell_sec').value) - self.loops = int(self.get_parameter('loops').value) - self._cli = self.create_client(SetNamedPose, 'set_named_pose') - - def run(self) -> int: - if not self._cli.wait_for_service(timeout_sec=15.0): - self.get_logger().error('``/set_named_pose`` 服务不可用') - return 1 - for loop in range(max(self.loops, 1)): - self.get_logger().info(f'第 {loop + 1}/{self.loops} 轮') - for pose in self.poses: - req = SetNamedPose.Request() - req.pose_name = pose - req.velocity_scale = self.velocity_scale - req.acceleration_scale = self.velocity_scale - fut = self._cli.call_async(req) - deadline = time.monotonic() + 60.0 - while rclpy.ok() and not fut.done(): - rclpy.spin_once(self, timeout_sec=0.05) - if time.monotonic() > deadline: - self.get_logger().error(f'{pose} 调用超时') - return 2 - res = fut.result() - if res is None or not res.success: - self.get_logger().error( - f'{pose} 执行失败:{res.message if res else "无响应"}' - ) - return 3 - self.get_logger().info(f'{pose}:{res.message}') - time.sleep(self.dwell_sec) - self.get_logger().info('演示结束') - return 0 - - -def main(args=None) -> None: - rclpy.init(args=args) - node = DemoNamedPoses() - code = 1 - try: - code = node.run() - except KeyboardInterrupt: - code = 0 - finally: - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - raise SystemExit(code) - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/dh_official.py b/install/arm_application/lib/python3.11/site-packages/arm_application/dh_official.py deleted file mode 100644 index 2467ae9..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/dh_official.py +++ /dev/null @@ -1,286 +0,0 @@ -"""DH-Robotics 官方 Modbus RTU 控制(非 Flexiv RDK)。 - -覆盖两类设备: -- PGE/PGEA 平行夹爪:初始化 0x0100,力 0x0101,位置 0x0103(0~1000‰),速度 0x0104。 -- RGI 旋转夹爪:在平行夹爪寄存器基础上,增加旋转角度 0x0105、旋转速度 0x0107、 - 旋转力 0x0108;反馈增加旋转角度 0x0208、旋转初始化状态 0x020A、旋转状态 0x020B。 - -说明: -- RGI 手册示例中负角度使用“反码/one's complement”:+360 -> 0x0168,-360 -> 0xFE97。 - 因此这里默认按 one's complement 编解码;若后续厂家确认为 two's complement,只改 - `_encode_signed` / `_decode_signed` 两处即可。 -- 写位置/角度寄存器后会立即运动,没有 ChangingTek SDK 的 0x0108 触发寄存器。 -""" - -from __future__ import annotations - -import threading -import time -from typing import Iterable - - -# ============================================================================= -# DH-Robotics Modbus 寄存器映射 -# ============================================================================= - -# 基础控制寄存器(保持寄存器,功能码 03/06/10) -REG_INIT = 0x0100 # 0x01 初始化,0xA5 完全初始化 -REG_FORCE = 0x0101 # 夹爪闭合力,20~100 % -REG_POSITION = 0x0103 # 手指参考位置,0~1000 千分比 -REG_SPEED = 0x0104 # 手指开合速度,1~100 % - -# RGI 旋转控制寄存器 -REG_ROTATION_ANGLE = 0x0105 # 目标旋转角度,有符号角度值 -REG_ROTATION_SPEED = 0x0107 # 旋转速度,1~100 % -REG_ROTATION_FORCE = 0x0108 # 旋转力/力矩,20~100 % - -# 反馈寄存器 -REG_INIT_STATE = 0x0200 # 0 未初始化,1 已初始化,2 初始化中 -REG_GRIPPER_STATE = 0x0201 # 0 运动中,1 已到位,2 已夹到物体,3 物体掉落 -REG_CURRENT_POSITION = 0x0202 # 当前手指位置,千分比 -REG_ROTATION_ANGLE_FB = 0x0208 # 当前旋转角度,有符号角度值 -REG_ROTATION_INIT_STATE = 0x020A # 0 未初始化,1 已初始化,2 初始化中 -REG_ROTATION_STATE = 0x020B # 0 运动中,1 已到位,2 受阻,3 曾经受阻 - -# 配置寄存器 -REG_SAVE_PARAMS = 0x0300 # 写入 1 可把所有参数保存到 flash - - -class DHModbusError(RuntimeError): - """DH Modbus 通信或协议错误。""" - - -def _clamp_int(value: float | int, lo: int, hi: int) -> int: - return int(max(lo, min(hi, int(round(float(value)))))) - - -def _encode_signed(value: float | int) -> int: - """把有符号角度值编码为 DH 的反码(one's complement)寄存器值。 - - RGI 手册示例:+360 -> 0x0168,-360 -> 0xFE97。 - """ - value = _clamp_int(value, -32767, 32767) - if value >= 0: - return value & 0xFFFF - return (~abs(value)) & 0xFFFF - - -def _decode_signed(raw: int) -> int: - """把 DH 的反码(one's complement)寄存器值解码为有符号整数。""" - raw = int(raw) & 0xFFFF - if raw & 0x8000: - mag = (~raw) & 0x7FFF - return -mag - return raw & 0x7FFF - - -class DHModbusClient: - """面向 DH-Robotics 夹爪的最小线程安全 Modbus RTU 客户端。""" - - def __init__( - self, - port: str, - slave_id: int = 1, - baudrate: int = 115200, - timeout: float = 0.2, - *, - bytesize: int = 8, - parity: str = "N", - stopbits: int = 1, - ) -> None: - try: - import minimalmodbus - import serial - except ImportError as exc: # pragma: no cover - 取决于运行时环境 - raise DHModbusError( - "缺少 minimalmodbus/pyserial。请先安装:pip install minimalmodbus pyserial" - ) from exc - - parity_map = { - "N": serial.PARITY_NONE, - "E": serial.PARITY_EVEN, - "O": serial.PARITY_ODD, - } - self.instrument = minimalmodbus.Instrument(port, int(slave_id)) - self.instrument.serial.baudrate = int(baudrate) - self.instrument.serial.bytesize = int(bytesize) - self.instrument.serial.parity = parity_map.get(str(parity).upper(), serial.PARITY_NONE) - self.instrument.serial.stopbits = int(stopbits) - self.instrument.serial.timeout = float(timeout) - self.instrument.mode = minimalmodbus.MODE_RTU - self.instrument.clear_buffers_before_each_transaction = True - try: - self.instrument.serial.exclusive = True - except Exception: - pass - self._lock = threading.Lock() - self.port = port - - def close(self) -> None: - with self._lock: - try: - self.instrument.serial.close() - except Exception: - pass - - # ------------------------------------------------------------------ - # 底层寄存器读写 - # ------------------------------------------------------------------ - def write_register(self, address: int, value: int) -> None: - value = _clamp_int(value, 0, 0xFFFF) - last_exc: Exception | None = None - for attempt in range(3): - try: - with self._lock: - self.instrument.write_register(address, value, functioncode=6) - return - except Exception as exc: - last_exc = exc - time.sleep(0.05 * (attempt + 1)) - raise DHModbusError(f"写寄存器 0x{address:04X}={value} 失败: {last_exc}") from last_exc - - def read_register(self, address: int) -> int: - last_exc: Exception | None = None - for attempt in range(3): - try: - with self._lock: - return int(self.instrument.read_register(address, functioncode=3)) - except Exception as exc: - last_exc = exc - time.sleep(0.05 * (attempt + 1)) - hint = "" - text = str(last_exc).lower() - if "multiple access" in text or "no data" in text: - hint = f"。串口 {getattr(self, 'port', '')} 可能被其它进程占用,先执行: fuser -k {getattr(self, 'port', '/dev/ttyUSB*')}" - raise DHModbusError(f"读寄存器 0x{address:04X} 失败: {last_exc}{hint}") from last_exc - - def write_registers(self, address: int, values: Iterable[int]) -> None: - vals = [_clamp_int(v, 0, 0xFFFF) for v in values] - with self._lock: - self.instrument.write_registers(address, vals) - - def read_registers(self, address: int, count: int) -> list[int]: - with self._lock: - return [int(v) for v in self.instrument.read_registers(address, count, functioncode=3)] - - def write_signed_register(self, address: int, value: float | int) -> None: - self.write_register(address, _encode_signed(value)) - - def read_signed_register(self, address: int) -> int: - return _decode_signed(self.read_register(address)) - - # ------------------------------------------------------------------ - # PGE/PGEA/RGI 通用控制 - # ------------------------------------------------------------------ - def initialize(self, *, full: bool = False, rotation: bool = False, timeout: float = 10.0) -> None: - """初始化/回零夹爪,并等待其就绪。""" - self.write_register(REG_INIT, 0xA5 if full else 0x01) - start = time.monotonic() - while time.monotonic() - start < timeout: - init_state = self.read_register(REG_INIT_STATE) - rot_ok = True - if rotation: - rot_ok = self.read_register(REG_ROTATION_INIT_STATE) == 1 - if init_state == 1 and rot_ok: - return - time.sleep(0.1) - raise DHModbusError(f"夹爪初始化超时(>{timeout:.1f}s)") - - def save_parameters(self) -> None: - self.write_register(REG_SAVE_PARAMS, 1) - - def set_force_pct(self, force_pct: float | int) -> int: - value = _clamp_int(force_pct, 20, 100) - self.write_register(REG_FORCE, value) - return value - - def set_speed_pct(self, speed_pct: float | int) -> int: - value = _clamp_int(speed_pct, 1, 100) - self.write_register(REG_SPEED, value) - return value - - def set_position_per_mille(self, position: float | int) -> int: - value = _clamp_int(position, 0, 1000) - # 与 dh_pgea.latched_position_break 同一份:命令已是目标时先写当前位置, - # 读回之后再写最终值。60ms 后写回旧命令,固件采样不到,手指不动。 - from arm_application.dh_pgea import latched_position_break - - try: - cmd = _clamp_int(self.read_register(REG_POSITION), 0, 1000) - except Exception: - cmd = value - try: - cur = self.get_position_per_mille() - except Exception: - cur = value - bridge = latched_position_break(cmd, cur, value) - if bridge is not None: - self.write_register(REG_POSITION, bridge) - deadline = time.monotonic() + 0.6 - echoed = False - while time.monotonic() < deadline: - try: - if _clamp_int(self.read_register(REG_POSITION), 0, 1000) == bridge: - echoed = True - break - except Exception: - pass - time.sleep(0.05) - if not echoed: - raise DHModbusError( - f"位置命令中间值 {bridge} 没有读回,不再写入最终目标 {value}" - ) - time.sleep(0.15) - self.write_register(REG_POSITION, value) - return value - - def get_position_per_mille(self) -> int: - return _clamp_int(self.read_register(REG_CURRENT_POSITION), 0, 1000) - - def get_gripper_state(self) -> int: - return self.read_register(REG_GRIPPER_STATE) - - def get_init_state(self) -> int: - return self.read_register(REG_INIT_STATE) - - def hold_current_position(self) -> None: - """在没有专用停止寄存器的 DH 夹爪上尽力停止/保持。""" - self.set_position_per_mille(self.get_position_per_mille()) - - # ------------------------------------------------------------------ - # RGI 旋转控制 - # ------------------------------------------------------------------ - def set_rotation_speed_pct(self, speed_pct: float | int) -> int: - value = _clamp_int(speed_pct, 1, 100) - self.write_register(REG_ROTATION_SPEED, value) - return value - - def set_rotation_force_pct(self, force_pct: float | int) -> int: - value = _clamp_int(force_pct, 20, 100) - self.write_register(REG_ROTATION_FORCE, value) - return value - - def set_rotation_angle_deg(self, angle_deg: float | int) -> int: - angle = _clamp_int(angle_deg, -32767, 32767) - self.write_signed_register(REG_ROTATION_ANGLE, angle) - return angle - - def get_rotation_angle_raw(self) -> int: - return self.read_register(REG_ROTATION_ANGLE_FB) & 0xFFFF - - def get_rotation_angle_deg(self) -> int: - return self.read_signed_register(REG_ROTATION_ANGLE_FB) - - def get_rotation_init_state(self) -> int: - return self.read_register(REG_ROTATION_INIT_STATE) - - def get_rotation_state(self) -> int: - return self.read_register(REG_ROTATION_STATE) - - def hold_current_rotation(self) -> None: - """重新下发当前反馈角度来停止旋转。""" - self.write_register(REG_ROTATION_ANGLE, self.get_rotation_angle_raw()) - - def hold_current_all(self) -> None: - self.hold_current_position() - self.hold_current_rotation() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea.py b/install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea.py deleted file mode 100644 index 117d46a..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea.py +++ /dev/null @@ -1,725 +0,0 @@ -#!/usr/bin/env python3 -"""DH Robotics PGE / PGEA Modbus RTU 客户端。 - -移植自官方 C++ 驱动: - DH-Robotics/dh_gripper_ros → DH_Modbus_Gripper - (工厂会按型号名里是否包含 ``PGE`` / ``PGEA`` 映射到本类) - -Flexiv RDK 的 ``Gripper`` 驱动不了这个夹爪:它不是 Studio Device。 -改用 RS485(USB–UART)通信,寄存器与 DH 的 ROS 驱动完全一致。 - -寄存器(保持寄存器,FC03 读 / FC06 写,CRC-16/Modbus 小端): - 0x0100 初始化,写 0xA5 - 0x0101 力 20–100 % - 0x0103 位置 0–1000 ‰ - 0x0104 速度 1–100 % - 0x0200 初始化状态 0=需要 1=完成 2=进行中 - 0x0201 夹持状态 0=运动中 1=已到位 2=已夹住 3=已掉落 - 0x0202 当前位置 -""" - -from __future__ import annotations - -import argparse -import sys -import threading -import time -from dataclasses import dataclass -from typing import Optional - -try: - import serial -except ImportError as exc: # pragma: no cover - raise SystemExit( - "缺少 pyserial。在 conda 环境 ros_flexiv 里执行:pip install pyserial" - ) from exc - - -# 官方 CRC-16/Modbus(与 dh_modbus_gripper.cpp 使用同一张表)。 -_CRC_TABLE = ( - 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, - 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, - 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, - 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, - 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, - 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, - 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, - 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, - 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, - 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, - 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, - 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, - 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, - 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, - 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, - 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, - 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, - 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, - 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, - 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, - 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, - 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, - 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, - 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, - 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, - 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, - 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, - 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, - 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, - 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, - 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, - 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040, -) - -REG_INIT = 0x0100 -REG_FORCE = 0x0101 -REG_POSITION = 0x0103 -REG_SPEED = 0x0104 -REG_INIT_STATE = 0x0200 -REG_GRIP_STATE = 0x0201 -REG_CUR_POSITION = 0x0202 - -INIT_CMD = 0xA5 - -S_INIT_NOT = 0 -S_INIT_FINISHED = 1 -S_INIT_DOING = 2 - -S_GRIP_MOVING = 0 -S_GRIP_ARRIVED = 1 -S_GRIP_CAUGHT = 2 -S_GRIP_DROPPED = 3 - -GRIP_STATE_NAME = { - S_GRIP_MOVING: "moving", - S_GRIP_ARRIVED: "arrived", - S_GRIP_CAUGHT: "caught", - S_GRIP_DROPPED: "dropped", -} - -INIT_STATE_NAME = { - S_INIT_NOT: "need_init", - S_INIT_FINISHED: "initialized", - S_INIT_DOING: "initializing", -} - - -def latched_position_break(command: int, current: int, target: int) -> Optional[int]: - """命令寄存器已经等于目标、手指却不在目标上时,返回要先写入的中间位置。 - - 大寰固件:再写一遍与 0x0103 当前值相同的数,不会启动新运动。 - 开爪卡在 caught 时就是这样——命令已是 1000,手指停在夹持位。 - 先把命令改成当前位置(手指本来就在这,不会再夹紧),等读回确认 - 固件已经采样,再写最终目标。只 sleep 几十毫秒就写回旧值,控制周期 - 来不及看到中间值,最终仍是旧命令,手指不动。 - """ - cmd = int(max(0, min(1000, command))) - cur = int(max(0, min(1000, current))) - pos = int(max(0, min(1000, target))) - if cmd != pos or abs(cur - pos) <= 25: - return None - if cur != cmd: - return cur - return 0 if cmd != 0 else 40 - - -def grip_motion_settled( - grip_state: int, position: int, target: int, seen_motion: bool -) -> bool: - """这一拍能不能算「这句位置命令已经结束」。 - - 张开前本来就是 caught、位置还停在夹持位:不能当成张开完成。 - 闭合夹住物体:动过之后停在比目标更开的位置,算完成。 - """ - near = abs(int(position) - int(target)) <= 25 - if grip_state in (S_GRIP_ARRIVED, S_GRIP_DROPPED) and near: - return True - if grip_state == S_GRIP_CAUGHT and seen_motion: - if int(target) + 25 < int(position): - return True - if near: - return True - return False - - -def crc16_modbus(data: bytes) -> int: - """官方 DH CRC16(Modbus,线路上按小端发送)。""" - crc = 0xFFFF - for byte in data: - crc = (crc >> 8) ^ _CRC_TABLE[(crc ^ byte) & 0xFF] - return crc - - -def _frame(slave: int, func: int, index: int, value: int) -> bytes: - body = bytes( - [ - slave & 0xFF, - func & 0xFF, - (index >> 8) & 0xFF, - index & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF, - ] - ) - crc = crc16_modbus(body) - return body + bytes([crc & 0xFF, (crc >> 8) & 0xFF]) - - -@dataclass -class GripperState: - init_state: int = S_INIT_NOT - grip_state: int = S_GRIP_MOVING - position: int = 0 - target_position: int = 0 - target_force: int = 0 - stroke_mm: float = 20.0 - - @property - def initialized(self) -> bool: - return self.init_state == S_INIT_FINISHED - - @property - def width_mm(self) -> float: - return float(self.position) / 1000.0 * float(self.stroke_mm) - - def as_tuple(self) -> tuple[float, float, float, float, float]: - return ( - 1.0 if self.initialized else 0.0, - float(self.grip_state), - float(self.position), - float(self.target_position), - float(self.target_force), - ) - - def summary(self) -> str: - return ( - f"init={INIT_STATE_NAME.get(self.init_state, self.init_state)} " - f"grip={GRIP_STATE_NAME.get(self.grip_state, self.grip_state)} " - f"pos={self.position}/1000 ({self.width_mm:.2f} mm) " - f"target={self.target_position} force={self.target_force}%" - ) - - -class DhPgeaError(RuntimeError): - pass - - -WIRING_HINT = ( - "PC 已发出 Modbus,夹爪 0 字节返回。不是力/速度参数问题。按顺序查:\n" - " 1) 夹爪 24 V DC 已上电(指示灯亮)\n" - " 2) USB 转接头必须是 RS485(A/B),不能是 TTL 的 TX/RX\n" - " 3) A↔A、B↔B;不通就对调 A/B\n" - " 4) 先 Ctrl+C 停节点,再:bash ~/ros2/scripts/run_gripper.sh --cli scan" -) - - -def open_failure_text(port: str, exc: BaseException) -> str: - """串口打不开时把「被占用」和「没应答」分开。 - - 独占锁失败(errno 11)以前和真没上电写成同一句「需要 24 V DC」, - 界面上看起来像缺自动上电,实际是别的进程还握着这个口。 - """ - text = str(exc).lower() - errno = getattr(exc, "errno", None) - busy = errno in (11, 16) or any( - token in text - for token in ( - "temporarily unavailable", - "device or resource busy", - "could not exclusively lock", - "resource busy", - ) - ) - if busy: - return ( - f"无法独占打开 {port}:{exc}。" - "串口已被别的进程占用(夹爪驱动或状态读取)。" - ) - return ( - f"无法打开 {port}:{exc}。" - "需要 24 V DC 供电 + RS485 接线,且当前用户在 dialout 组内。" - ) - - -class DhPgeaGripper: - """面向 PGE / PGEA 的线程安全 Modbus RTU 客户端(官方寄存器映射)。""" - - def __init__( - self, - port: str = "/dev/ttyUSB0", - baudrate: int = 115200, - slave_id: int = 1, - timeout_s: float = 0.25, - stroke_mm: float = 20.0, - rs485_rts: str = "", - ) -> None: - self.port = port - self.baudrate = int(baudrate) - self.slave_id = int(slave_id) - self.timeout_s = float(timeout_s) - self.stroke_mm = float(stroke_mm) - mode = str(rs485_rts or "").strip().lower() - if mode in ("", "off", "none", "false", "0"): - mode = "" - if mode not in ("", "tx", "tx_inv"): - raise DhPgeaError(f"rs485_rts 只能是 ''、tx 或 tx_inv,实际为 {rs485_rts!r}") - self.rs485_rts = mode - self._ser: Optional[serial.Serial] = None - self._lock = threading.Lock() - - def open(self) -> None: - if self._ser is not None and self._ser.is_open: - return - try: - self._ser = serial.Serial( - port=self.port, - baudrate=self.baudrate, - bytesize=serial.EIGHTBITS, - parity=serial.PARITY_NONE, - stopbits=serial.STOPBITS_ONE, - timeout=self.timeout_s, - write_timeout=self.timeout_s, - xonxoff=False, - rtscts=False, - dsrdtr=False, - exclusive=True, - ) - except Exception as exc: - raise DhPgeaError(open_failure_text(self.port, exc)) from exc - try: - self._ser.dtr = True - except Exception: - pass - self._set_tx(False) - self._ser.reset_input_buffer() - self._ser.reset_output_buffer() - time.sleep(0.05) - - def close(self) -> None: - if self._ser is not None: - try: - self._ser.close() - except Exception: - pass - self._ser = None - - def __enter__(self) -> "DhPgeaGripper": - self.open() - return self - - def __exit__(self, *args) -> None: - self.close() - - def write_register(self, index: int, value: int, retries: int = 3) -> bool: - """FC06 写,等待回显(对应官方 WriteRegisterFunc)。""" - frame = _frame(self.slave_id, 0x06, index, int(value) & 0xFFFF) - with self._lock: - for _ in range(max(1, retries)): - if self._transact(frame, 8) == frame: - return True - time.sleep(0.02) - return False - - def read_register(self, index: int, retries: int = 8) -> int: - """FC03 读一个保持寄存器(对应官方 ReadRegisterFunc)。""" - req = _frame(self.slave_id, 0x03, index, 1) - last: Optional[bytes] = None - with self._lock: - for _ in range(max(1, retries)): - rsp = self._transact(req, 7) - last = rsp - if rsp is None or len(rsp) != 7: - time.sleep(0.02) - continue - if crc16_modbus(rsp[:-2]) != (rsp[5] | (rsp[6] << 8)): - continue - if rsp[0] != (self.slave_id & 0xFF) or rsp[1] != 0x03: - continue - return (rsp[3] << 8) | (rsp[4] & 0xFF) - hint = f" last={last.hex() if last else '(empty)'}" - raise DhPgeaError( - f"在 {self.port} 上 Modbus 读 0x{index:04X} 失败 " - f"(无有效应答{hint})。baud={self.baudrate} slave={self.slave_id} " - f"rts={self.rs485_rts or 'off'}" - ) - - def probe(self) -> int: - """短读一次初始化状态。夹爪无应答时会抛异常。""" - return self.read_register(REG_INIT_STATE, retries=2) - - def _set_tx(self, tx: bool) -> None: - if not self.rs485_rts or self._ser is None: - return - try: - if self.rs485_rts == "tx": - self._ser.rts = bool(tx) - else: - self._ser.rts = not bool(tx) - except Exception: - pass - - def _transact(self, frame: bytes, expect: int) -> Optional[bytes]: - if self._ser is None or not self._ser.is_open: - raise DhPgeaError("串口未打开") - bit_s = 10.0 / max(1, self.baudrate) - self._set_tx(True) - if self.rs485_rts: - time.sleep(2.0 * bit_s) - self._ser.reset_input_buffer() - self._ser.write(frame) - self._ser.flush() - if self.rs485_rts: - time.sleep(len(frame) * bit_s + 0.0008) - self._set_tx(False) - deadline = time.monotonic() + self.timeout_s - buf = bytearray() - while time.monotonic() < deadline and len(buf) < expect: - chunk = self._ser.read(expect - len(buf)) - if chunk: - buf.extend(chunk) - return bytes(buf) if buf else None - - def initialization(self) -> bool: - return self.write_register(REG_INIT, INIT_CMD) - - def initialize( - self, timeout_s: float = 20.0, poll_s: float = 0.2, *, force: bool = False - ) -> bool: - """写 0xA5,然后等到初始化状态 == 完成(对应官方上电流程)。 - - ``force=False`` 时,已经完成就不再写(节点启动不要每次都让手指找零)。 - 命令行 ``init`` 必须 ``force=True``:状态字已经是完成时,不写 0xA5 - 手指根本不会回零,看起来像初始化失效。 - """ - state = self.get_init_state() - if state == S_INIT_FINISHED and not force: - return True - if not self.initialization(): - raise DhPgeaError("初始化写 0x0100=0xA5 失败(无 Modbus 回显)") - deadline = time.monotonic() + float(timeout_s) - # force 时必须先看到状态离开「完成」,否则读到的还是写之前的旧值。 - saw_busy = not force - while time.monotonic() < deadline: - state = self.get_init_state() - if state != S_INIT_FINISHED: - saw_busy = True - elif saw_busy: - return True - time.sleep(poll_s) - raise DhPgeaError( - f"初始化在 {timeout_s:.0f}s 后超时(state={state})。" - "首次上电时手指本应先回零一次。" - ) - - def set_target_force(self, force_pct: int) -> bool: - force_pct = int(max(20, min(100, force_pct))) - return self.write_register(REG_FORCE, force_pct) - - def set_target_speed(self, speed_pct: int) -> bool: - speed_pct = int(max(1, min(100, speed_pct))) - return self.write_register(REG_SPEED, speed_pct) - - def _wait_command_echo(self, value: int, timeout_s: float = 0.6) -> bool: - """等到 0x0103 读回就是刚写进去的值。读不回就不要再写下一笔。""" - deadline = time.monotonic() + float(timeout_s) - while time.monotonic() < deadline: - try: - if self.get_target_position(retries=1) == int(value): - return True - except Exception: - pass - time.sleep(0.05) - return False - - def set_target_position(self, pos: int) -> bool: - pos = int(max(0, min(1000, pos))) - try: - cmd = self.get_target_position(retries=2) - except Exception: - cmd = pos - try: - cur = self.get_current_position(retries=2) - except Exception: - cur = pos - bridge = latched_position_break(cmd, cur, pos) - if bridge is not None: - if not self.write_register(REG_POSITION, bridge): - return False - if not self._wait_command_echo(bridge): - return False - # 读回只说明寄存器改了。再留一个控制周期,避免下一笔把中间值盖掉。 - time.sleep(0.15) - return self.write_register(REG_POSITION, pos) - - def wait_settle(self, target: int, timeout_s: float = 6.0) -> GripperState: - """等到到位或夹住,或超时返回最后一帧。 - - 张开前状态字已经是 caught 时不能立刻返回:那是上一句命令的残留, - 手指还停在夹持位。 - """ - t0 = time.monotonic() - last = None - seen_motion = False - st = self.get_run_states() - while time.monotonic() - t0 < timeout_s: - st = self.get_run_states() - if last is not None and st.position != last: - seen_motion = True - last = st.position - if st.grip_state == S_GRIP_MOVING: - seen_motion = True - time.sleep(0.08) - continue - if grip_motion_settled(st.grip_state, st.position, target, seen_motion): - return st - time.sleep(0.08) - return st - - def get_init_state(self, retries: int = 8) -> int: - return self.read_register(REG_INIT_STATE, retries=retries) - - def get_grip_state(self, retries: int = 8) -> int: - return self.read_register(REG_GRIP_STATE, retries=retries) - - def get_current_position(self, retries: int = 8) -> int: - return self.read_register(REG_CUR_POSITION, retries=retries) - - def get_target_position(self, retries: int = 8) -> int: - return self.read_register(REG_POSITION, retries=retries) - - def get_target_force(self, retries: int = 8) -> int: - return self.read_register(REG_FORCE, retries=retries) - - def get_run_states(self, retries: int = 8) -> GripperState: - return GripperState( - init_state=self.get_init_state(retries=retries), - grip_state=self.get_grip_state(retries=retries), - position=self.get_current_position(retries=retries), - target_position=self.get_target_position(retries=retries), - target_force=self.get_target_force(retries=retries), - stroke_mm=self.stroke_mm, - ) - - def open_jaw(self, force: int = 50, speed: int = 50) -> bool: - ok = self.set_target_force(force) - ok = self.set_target_speed(speed) and ok - return self.set_target_position(1000) and ok - - def close_jaw(self, force: int = 50, speed: int = 50) -> bool: - ok = self.set_target_force(force) - ok = self.set_target_speed(speed) and ok - return self.set_target_position(0) and ok - - def move(self, position: int, force: int = 50, speed: int = 50) -> bool: - ok = self.set_target_force(force) - ok = self.set_target_speed(speed) and ok - return self.set_target_position(position) and ok - - -def _selfcheck_crc() -> None: - """官方简短手册示例:设置位置 500。""" - frame = _frame(1, 0x06, 0x0103, 500) - expect = bytes([0x01, 0x06, 0x01, 0x03, 0x01, 0xF4, 0x78, 0x21]) - if frame != expect: - raise AssertionError(f"CRC 不匹配:{frame.hex()} != {expect.hex()}") - - -def _site_defaults() -> dict: - try: - from pathlib import Path - - root = Path(__file__).resolve().parents[3] - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import load_site # type: ignore - - g = (load_site().get("gripper") or {}) - return { - "port": str(g.get("port") or "/dev/ttyUSB0"), - "baudrate": int(g.get("baud") or 115200), - "slave_id": int(g.get("slave_id") or 1), - "stroke_mm": float(g.get("stroke_mm") or 20.0), - "force": int(g.get("force_pct") or 50), - "speed": int(g.get("speed_pct") or 50), - "rs485_rts": str(g.get("rs485_rts") or ""), - } - except Exception: - return { - "port": "/dev/ttyUSB0", - "baudrate": 115200, - "slave_id": 1, - "stroke_mm": 20.0, - "force": 50, - "speed": 50, - "rs485_rts": "", - } - - -def _scan_bus(port: str) -> int: - """遍历波特率 × 从站号 × RTS,直到某个组合有应答。""" - bauds = (115200, 57600, 38400, 19200, 9600) - slaves = (1, 2, 3) - rts_modes = ("", "tx", "tx_inv") - print(f"扫描 {port}(请先停掉 ROS 节点 —— 该串口是独占的)") - for baud in bauds: - for slave in slaves: - for rts in rts_modes: - label = f"baud={baud} slave={slave} rts={rts or 'off'}" - g = DhPgeaGripper( - port=port, - baudrate=baud, - slave_id=slave, - timeout_s=0.08, - rs485_rts=rts, - ) - try: - g.open() - state = g.probe() - print(f"OK {label} init_state={state}") - print(f" → site.yaml: baud: {baud} slave_id: {slave} rs485_rts: \"{rts}\"") - g.close() - return 0 - except DhPgeaError: - print(f" miss {label}") - finally: - g.close() - print("所有组合都无应答。", file=sys.stderr) - print(WIRING_HINT, file=sys.stderr) - return 1 - - -def ctrl_values( - cmd: str, - value: str = "", - force: int = 50, - speed: int = 50, -) -> Optional[tuple[float, float, float, float]]: - """节点已经占着串口时,改发 ``/gripper/ctrl`` 的四个数。 - - 顺序是初始化、位置千分比、力度、速度。``probe`` / ``status`` 只读,返回 None。 - """ - name = str(cmd or "").strip().lower() - if name in ("probe", "status"): - return None - if name == "init": - return (1.0, 0.0, float(force), float(speed)) - if name == "open": - pos = 1000 - elif name == "close": - pos = 0 - elif name in ("pos", "move"): - if str(value).strip() == "": - raise ValueError("pos 需要 0–1000") - pos = int(round(float(value))) - if pos < 0 or pos > 1000: - raise ValueError("位置只接受 0–1000") - else: - raise ValueError(f"节点在线时不支持 {name}") - return (0.0, float(pos), float(force), float(speed)) - - -def _cli(argv: Optional[list[str]] = None) -> int: - site = _site_defaults() - ap = argparse.ArgumentParser( - description="DH PGEA Modbus 命令行工具(官方寄存器映射,不用 Flexiv RDK)" - ) - ap.add_argument("--port", default=site["port"]) - ap.add_argument("--baud", type=int, default=site["baudrate"]) - ap.add_argument("--slave", type=int, default=site["slave_id"]) - ap.add_argument("--force", type=int, default=site["force"]) - ap.add_argument("--speed", type=int, default=site["speed"]) - ap.add_argument("--rts", default=site.get("rs485_rts") or "", help="RS485 DE:空 | tx | tx_inv") - ap.add_argument( - "cmd", - choices=["probe", "init", "status", "open", "close", "pos", "selfcheck", "scan"], - ) - ap.add_argument("value", nargs="?", default="", help="'pos' 命令的位置,0–1000") - args = ap.parse_args(argv) - - if args.cmd == "selfcheck": - _selfcheck_crc() - print("CRC 自检通过(01 06 01 03 01 F4 78 21)") - return 0 - if args.cmd == "scan": - return _scan_bus(args.port) - - grip = DhPgeaGripper( - port=args.port, - baudrate=args.baud, - slave_id=args.slave, - stroke_mm=float(site["stroke_mm"]), - rs485_rts=args.rts, - ) - try: - grip.open() - except DhPgeaError as exc: - print(f"错误:{exc}", file=sys.stderr) - return 1 - - try: - if args.cmd == "probe": - st = grip.get_run_states(retries=2) - print(st.summary()) - return 0 - if args.cmd == "init": - print("正在初始化(手指回零,已初始化也会再做一次)…") - grip.initialize(force=True) - print(grip.get_run_states().summary()) - return 0 - if args.cmd == "status": - print(grip.get_run_states().summary()) - return 0 - if args.cmd == "open": - if not grip.open_jaw(args.force, args.speed): - raise DhPgeaError("张开写入失败") - st = grip.wait_settle(1000) - print(st.summary()) - if abs(st.position - 1000) > 25: - print( - "张开失败:手指没有离开夹持位。" - "若仍是 grip=caught,先取下工件再执行 init。", - file=sys.stderr, - ) - return 1 - return 0 - if args.cmd == "close": - if not grip.close_jaw(args.force, args.speed): - raise DhPgeaError("闭合写入失败") - st = grip.wait_settle(0) - print(st.summary()) - # 夹住物体时位置停在厚度上,grip=caught 算成功。停在张开位则失败。 - if st.grip_state != S_GRIP_CAUGHT and abs(st.position) > 25: - print("闭合失败:手指没有朝合拢方向离开原位。", file=sys.stderr) - return 1 - return 0 - if args.cmd == "pos": - if args.value == "": - print("用法:pos <0-1000>", file=sys.stderr) - return 2 - pos = int(float(args.value)) - if not grip.move(pos, args.force, args.speed): - raise DhPgeaError("位置写入失败") - st = grip.wait_settle(pos) - print(st.summary()) - grasped_short = st.grip_state == S_GRIP_CAUGHT and st.position > pos - if abs(st.position - pos) > 25 and not grasped_short: - print( - f"位置 {pos} 没有到位(仍在 {st.position})。", - file=sys.stderr, - ) - return 1 - return 0 - except DhPgeaError as exc: - print(f"错误:{exc}", file=sys.stderr) - print(WIRING_HINT, file=sys.stderr) - return 1 - finally: - grip.close() - return 0 - - -def main(argv: Optional[list[str]] = None) -> int: - return _cli(argv) - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea_node.py deleted file mode 100644 index 5c43870..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/dh_pgea_node.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python3 -"""DH PGEA 的 ROS 2 节点(官方 Modbus RTU,不用 Flexiv 夹爪)。 - -话题(布局与 DH-Robotics/dh_gripper_ros 一致): - /gripper/ctrl std_msgs/Float32MultiArray - data: [initialize, position, force, speed] - initialize>0.5 → 写 0xA5;否则设置力/速度/位置 - /gripper/states std_msgs/Float32MultiArray - data: [initialized, grip_state, position, target_pos, target_force] - /gripper/joint_states sensor_msgs/JointState - -服务(std_srvs/Trigger): - /gripper/initialize /gripper/open /gripper/close - -不要设置 Flexiv bringup 的 load_gripper:=true —— 那只是 Flexiv-GN01 用的。 -""" - -from __future__ import annotations - -import threading -from typing import Optional - -import rclpy -from rcl_interfaces.msg import ParameterDescriptor -from rclpy.node import Node -from sensor_msgs.msg import JointState -from std_msgs.msg import Float32, Float32MultiArray, MultiArrayDimension, MultiArrayLayout -from std_srvs.srv import Trigger - -from arm_application.dh_pgea import ( - DhPgeaError, - DhPgeaGripper, - GripperState, - WIRING_HINT, -) -from arm_application.ros_node import TolerantNode, param_as_str - - -def _as_ctrl_array(msg: Float32MultiArray) -> tuple[float, float, float, float]: - data = list(msg.data) - while len(data) < 4: - data.append(0.0) - return float(data[0]), float(data[1]), float(data[2]), float(data[3]) - - -class DhPgeaNode(TolerantNode): - def __init__(self) -> None: - super().__init__("dh_pgea") - self.declare_parameter("port", "/dev/ttyUSB0") - self.declare_parameter("baud", 115200) - self.declare_parameter("slave_id", 1) - self.declare_parameter("stroke_mm", 20.0) - self.declare_parameter("force_pct", 50) - self.declare_parameter("speed_pct", 50) - self.declare_parameter("auto_init", True) - self.declare_parameter("state_hz", 20.0) - self.declare_parameter("open_position", 1000) - self.declare_parameter("close_position", 0) - self._model = param_as_str(self, "model", "PGEA-100-20-W") - self._sn = param_as_str(self, "serial_number", "") - self._rts = param_as_str(self, "rs485_rts", "") - - self._port = str(self.get_parameter("port").value) - self._baud = int(self.get_parameter("baud").value) - self._slave = int(self.get_parameter("slave_id").value) - self._stroke = float(self.get_parameter("stroke_mm").value) - self._force = int(self.get_parameter("force_pct").value) - self._speed = int(self.get_parameter("speed_pct").value) - _auto = self.get_parameter("auto_init").value - if isinstance(_auto, str): - self._auto_init = _auto.strip().lower() in ("1", "true", "yes") - else: - self._auto_init = bool(_auto) - self._open_pos = int(self.get_parameter("open_position").value) - self._close_pos = int(self.get_parameter("close_position").value) - hz = float(self.get_parameter("state_hz").value) - - self._grip = DhPgeaGripper( - port=self._port, - baudrate=self._baud, - slave_id=self._slave, - stroke_mm=self._stroke, - rs485_rts=self._rts, - ) - self._state = GripperState(stroke_mm=self._stroke) - self._cmd_lock = threading.Lock() - - self._pub_state = self.create_publisher(Float32MultiArray, "/gripper/states", 10) - self._pub_js = self.create_publisher(JointState, "/gripper/joint_states", 10) - self.create_subscription(Float32MultiArray, "/gripper/ctrl", self._on_ctrl, 10) - self.create_subscription(Float32, "/gripper/set_position", self._on_set_pos, 10) - - self.create_service(Trigger, "/gripper/initialize", self._srv_init) - self.create_service(Trigger, "/gripper/open", self._srv_open) - self.create_service(Trigger, "/gripper/close", self._srv_close) - - self.get_logger().info( - f"DH {self._model} SN={self._sn or '?'} " - f"{self._port} @{self._baud} slave={self._slave} rts={self._rts or 'off'} " - f"(官方 Modbus RTU;未使用 Flexiv RDK 夹爪 API)" - ) - try: - self._grip.open() - except DhPgeaError as exc: - self.get_logger().error(str(exc)) - raise - - self._online = False - try: - self._grip.probe() - self._online = True - except DhPgeaError as exc: - self.get_logger().error(str(exc)) - for line in WIRING_HINT.splitlines(): - self.get_logger().error(line) - self.get_logger().error("会持续重试;在总线恢复应答前 open/close 都会失败") - - if self._auto_init and self._online: - try: - self._grip.initialize() - self.get_logger().info("夹爪已初始化") - except DhPgeaError as exc: - self.get_logger().error(f"auto_init 失败:{exc}") - self._online = False - - period = 1.0 / max(1.0, hz) - self._timer = self.create_timer(period, self._on_timer) - - def destroy_node(self) -> bool: - try: - self._grip.close() - except Exception: - pass - return super().destroy_node() - - def _apply_move(self, position: int, force: Optional[int] = None, speed: Optional[int] = None) -> str: - with self._cmd_lock: - f = self._force if force is None else int(force) - s = self._speed if speed is None else int(speed) - if force is not None: - self._force = f - if speed is not None: - self._speed = s - if not self._grip.move(int(position), f, s): - raise DhPgeaError("移动写入失败") - return f"pos={int(position)} force={f}% speed={s}%" - - def _on_ctrl(self, msg: Float32MultiArray) -> None: - initialize, position, force, speed = _as_ctrl_array(msg) - try: - if initialize > 0.5: - self._grip.initialize() - self.get_logger().info("通过 /gripper/ctrl 触发初始化") - return - f = int(force) if force > 0 else self._force - s = int(speed) if speed > 0 else self._speed - info = self._apply_move(int(position), f, s) - self.get_logger().info(f"ctrl {info}") - except DhPgeaError as exc: - self.get_logger().error(str(exc)) - - def _on_set_pos(self, msg: Float32) -> None: - try: - info = self._apply_move(int(msg.data)) - self.get_logger().info(f"set_position {info}") - except DhPgeaError as exc: - self.get_logger().error(str(exc)) - - def _srv_init(self, _req, resp): - try: - self._grip.initialize() - resp.success = True - resp.message = self._grip.get_run_states().summary() - except DhPgeaError as exc: - resp.success = False - resp.message = str(exc) - return resp - - def _srv_open(self, _req, resp): - try: - info = self._apply_move(self._open_pos) - resp.success = True - resp.message = info - except DhPgeaError as exc: - resp.success = False - resp.message = str(exc) - return resp - - def _srv_close(self, _req, resp): - try: - info = self._apply_move(self._close_pos) - resp.success = True - resp.message = info - except DhPgeaError as exc: - resp.success = False - resp.message = str(exc) - return resp - - def _on_timer(self) -> None: - try: - st = self._grip.get_run_states(retries=2 if self._online else 1) - self._state = st - if not self._online: - self._online = True - self.get_logger().info("夹爪总线已恢复") - except DhPgeaError as exc: - self._online = False - self.get_logger().warn(str(exc), throttle_duration_sec=5.0) - return - - arr = Float32MultiArray() - arr.layout = MultiArrayLayout( - dim=[MultiArrayDimension(label="dh_pgea", size=5, stride=5)], - data_offset=0, - ) - arr.data = list(st.as_tuple()) - self._pub_state.publish(arr) - - js = JointState() - js.header.stamp = self.get_clock().now().to_msg() - js.name = ["gripper_finger1_joint"] - # 官方 ROS 驱动把 0–1000 映射到约 0–0.637 rad;我们这里也发布 mm。 - js.position = [float(st.width_mm) * 0.001] - js.effort = [float(st.target_force)] - self._pub_js.publish(js) - - -def main(args=None) -> None: - rclpy.init(args=args) - node = None - try: - node = DhPgeaNode() - rclpy.spin(node) - except KeyboardInterrupt: - pass - except DhPgeaError: - pass - finally: - if node is not None: - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper.py b/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper.py deleted file mode 100644 index f576d94..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper.py +++ /dev/null @@ -1,803 +0,0 @@ -"""双臂夹爪统一控制架构(DH-Robotics 官方 Modbus RTU,非 Flexiv RDK)。 - -设计目标: -- 左臂(Rizon4-063989):大寰 PGEA 平行夹爪,控制行程/夹持力/速度。 -- 右臂(Rizon4-063991):大寰 RGI-100-30-O-S-M1 旋转夹爪,控制手指夹持与旋转角度/圈数/速度。 -- 统一接口,便于后续扩展到 ROS2 节点和新项目脚本。 - -注意:DH 官方协议是“写位置/角度寄存器后立即运动”,没有 ChangingTek SDK 的 0x0108 触发寄存器。 -""" - -from __future__ import annotations - -import time -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from enum import Enum, auto -from pathlib import Path -from typing import Any - -import numpy as np - -from arm_application.dh_official import DHModbusClient, DHModbusError - - -class GripperType(Enum): - PARALLEL = auto() # 平行夹爪 - ROTARY = auto() # 旋转夹爪 - VACUUM = auto() # 真空吸盘(预留) - - -class GripperState(Enum): - IDLE = auto() - MOVING = auto() - GRIPPING = auto() - RELEASING = auto() - ERROR = auto() - - -@dataclass -class GripperStatus: - """夹爪状态反馈。""" - - state: GripperState = GripperState.IDLE - position: float = 0.0 # 平行:mm;旋转:角度 deg - force: float = 0.0 # 最近一次命令力/力矩 % - velocity: float = 0.0 # 最近一次命令速度 % - is_moving: bool = False - is_gripped: bool = False # 是否夹持到物体 - connected: bool = False - initialized: bool = False - finger_position_per_mille: float = 0.0 - rotation_deg: float = 0.0 - gripper_state: int = -1 # DH 0x0201:0 moving,1 reached,2 caught,3 dropped - rotation_state: int = -1 # RGI 0x020B:0 moving,1 reached,2 blocking,3 blocked - error_msg: str = "" - timestamp: float = field(default_factory=time.time) - - -@dataclass -class GripperCommand: - """夹爪控制指令。""" - - target_position: float | None = None # 平行:mm;旋转:deg - target_force: float | None = None # 目标力/力矩 % - target_velocity: float | None = None # 目标速度 % - wait_complete: bool = True # 是否等待完成 - timeout: float = 10.0 # 超时时间 - - -class BaseGripper(ABC): - """夹爪基类,定义统一接口。""" - - name: str = "base_gripper" - gripper_type: GripperType = GripperType.PARALLEL - - def __init__(self, config: dict[str, Any] | None = None) -> None: - self.cfg = config or {} - self._connected = False - self._status = GripperStatus() - - @abstractmethod - def connect(self) -> None: ... - - @abstractmethod - def disconnect(self) -> None: ... - - @abstractmethod - def execute(self, cmd: GripperCommand) -> GripperStatus: ... - - @abstractmethod - def get_status(self) -> GripperStatus: ... - - def is_connected(self) -> bool: - return self._connected - - def open(self, **kwargs) -> GripperStatus: - raise NotImplementedError - - def close(self, **kwargs) -> GripperStatus: - raise NotImplementedError - - def stop(self) -> None: - raise NotImplementedError - - -# ============================================================================= -# 大寰平行夹爪(PGE/PGEA 系列) -# ============================================================================= - -@dataclass -class ParallelGripperConfig: - """大寰平行夹爪配置。""" - - port: str = "/dev/ttyUSB0" - slave_id: int = 1 - baudrate: int = 115200 - timeout: float = 0.2 - - # PGEA-100-40 行程为 40mm;若实际是 PGEA-100-26,请把 stroke_max 改成 26.0。 - stroke_min: float = 0.0 - stroke_max: float = 40.0 - - # 默认参数(DH 百分比) - default_speed: int = 50 - default_force: int = 50 - force_min: int = 20 - force_max: int = 100 - - # 控制行为 - auto_initialize: bool = True - init_timeout: float = 10.0 - position_tolerance_per_mille: int = 15 - status_poll_interval: float = 0.05 - - -class ParallelGripper(BaseGripper): - """大寰 PGE/PGEA 平行夹爪。""" - - name = "dh_pgea_parallel" - gripper_type = GripperType.PARALLEL - - def __init__(self, config: ParallelGripperConfig | None = None) -> None: - super().__init__() - self.cfg = config or ParallelGripperConfig() - self._client: DHModbusClient | None = None - self._last_position_mm = float(self.cfg.stroke_min) - self._last_force = int(self.cfg.default_force) - self._last_speed = int(self.cfg.default_speed) - - def connect(self) -> None: - if self._client is not None: - self.disconnect() - self._client = DHModbusClient( - self.cfg.port, - slave_id=self.cfg.slave_id, - baudrate=self.cfg.baudrate, - timeout=self.cfg.timeout, - ) - self._connected = True - self._status.connected = True - self._status.state = GripperState.IDLE - self._status.error_msg = "" - if self.cfg.auto_initialize: - self.initialize() - - def disconnect(self) -> None: - if self._client is not None: - self._client.close() - self._client = None - self._connected = False - self._status.connected = False - self._status.state = GripperState.IDLE - - def initialize(self, full: bool = False) -> None: - self._require_client() - assert self._client is not None - self._client.initialize(full=full, rotation=False, timeout=self.cfg.init_timeout) - self._status.initialized = True - - def _require_client(self) -> None: - if not self._connected or self._client is None: - self._status.state = GripperState.ERROR - self._status.error_msg = "平行夹爪未连接" - raise DHModbusError(self._status.error_msg) - - def _mm_to_per_mille(self, position_mm: float) -> int: - lo = float(self.cfg.stroke_min) - hi = float(self.cfg.stroke_max) - if hi <= lo: - hi = lo + 1.0 - ratio = (float(position_mm) - lo) / (hi - lo) - return int(np.clip(round(ratio * 1000.0), 0, 1000)) - - def _per_mille_to_mm(self, position: float | int) -> float: - lo = float(self.cfg.stroke_min) - hi = float(self.cfg.stroke_max) - return lo + (float(position) / 1000.0) * (hi - lo) - - def execute(self, cmd: GripperCommand) -> GripperStatus: - try: - self._require_client() - except DHModbusError: - return self._status - assert self._client is not None - - position_mm = self._last_position_mm if cmd.target_position is None else float(cmd.target_position) - position_mm = float(np.clip(position_mm, self.cfg.stroke_min, self.cfg.stroke_max)) - speed = int(np.clip(cmd.target_velocity or self.cfg.default_speed, 1, 100)) - force = int(np.clip(cmd.target_force or self.cfg.default_force, self.cfg.force_min, self.cfg.force_max)) - - self._client.set_speed_pct(speed) - self._client.set_force_pct(force) - target_per_mille = self._client.set_position_per_mille(self._mm_to_per_mille(position_mm)) - - self._last_position_mm = position_mm - self._last_speed = speed - self._last_force = force - self._status.state = GripperState.MOVING - self._status.error_msg = "" - - if cmd.wait_complete: - self._wait_complete(target_per_mille, cmd.timeout) - return self.get_status() - - def _wait_complete(self, target_per_mille: int, timeout: float) -> None: - assert self._client is not None - start = time.monotonic() - time.sleep(0.05) - while time.monotonic() - start < timeout: - state = self._client.get_gripper_state() - pos = self._client.get_position_per_mille() - self._status.gripper_state = state - self._status.finger_position_per_mille = float(pos) - self._status.position = self._per_mille_to_mm(pos) - self._status.is_moving = state == 0 - self._status.is_gripped = state == 2 - if state in (1, 2): - self._status.state = GripperState.GRIPPING if state == 2 else GripperState.IDLE - return - if state == 3: - self._status.state = GripperState.ERROR - self._status.error_msg = "夹持后物体掉落" - return - if abs(pos - target_per_mille) <= self.cfg.position_tolerance_per_mille and state != 0: - self._status.state = GripperState.IDLE - return - time.sleep(self.cfg.status_poll_interval) - self._status.state = GripperState.ERROR - self._status.error_msg = f"平行夹爪运动超时(>{timeout:.1f}s)" - - def get_status(self) -> GripperStatus: - if not self._connected or self._client is None: - self._status.connected = False - return self._status - try: - pos = self._client.get_position_per_mille() - state = self._client.get_gripper_state() - init_state = self._client.get_init_state() - self._status.connected = True - self._status.initialized = init_state == 1 - self._status.finger_position_per_mille = float(pos) - self._status.position = self._per_mille_to_mm(pos) - self._status.velocity = float(self._last_speed) - self._status.force = float(self._last_force) - self._status.gripper_state = state - self._status.is_moving = state == 0 - self._status.is_gripped = state == 2 - if self._status.state != GripperState.ERROR: - self._status.state = GripperState.MOVING if state == 0 else ( - GripperState.GRIPPING if state == 2 else GripperState.IDLE - ) - self._status.timestamp = time.time() - except Exception as exc: - self._status.state = GripperState.ERROR - self._status.error_msg = str(exc) - self._status.connected = False - return self._status - - def open(self, force: int | None = None, speed: int | None = None, **kwargs) -> GripperStatus: - # DH 千分比:0‰=闭合,1000‰=张开,对应行程 0mm -> stroke_max。 - return self.execute(GripperCommand( - target_position=float(self.cfg.stroke_max), - target_force=force or self.cfg.default_force, - target_velocity=speed or self.cfg.default_speed, - **kwargs, - )) - - def close(self, force: int | None = None, speed: int | None = None, **kwargs) -> GripperStatus: - return self.execute(GripperCommand( - target_position=float(self.cfg.stroke_min), - target_force=force or self.cfg.default_force, - target_velocity=speed or self.cfg.default_speed, - **kwargs, - )) - - def move_to(self, position_mm: float, force: int | None = None, speed: int | None = None, - **kwargs) -> GripperStatus: - return self.execute(GripperCommand( - target_position=position_mm, - target_force=force or self.cfg.default_force, - target_velocity=speed or self.cfg.default_speed, - **kwargs, - )) - - def set_force(self, force_pct: int) -> None: - self._require_client() - assert self._client is not None - self._last_force = self._client.set_force_pct(force_pct) - - def set_speed(self, speed_pct: int) -> None: - self._require_client() - assert self._client is not None - self._last_speed = self._client.set_speed_pct(speed_pct) - - def stop(self) -> None: - if self._client is not None: - self._client.hold_current_position() - self._status.state = GripperState.IDLE - - -# ============================================================================= -# 大寰旋转夹爪(RGI-100-30-O-S-M1) -# ============================================================================= - -@dataclass -class RotaryGripperConfig: - """大寰 RGI 旋转夹爪配置。""" - - port: str = "/dev/ttyUSB1" - slave_id: int = 1 - baudrate: int = 115200 - timeout: float = 0.2 - - # RGI 旋转角度寄存器是 signed 16bit;为避免 one's-complement 负零歧义,默认限制在 ±32767。 - angle_min: float = -32767.0 - angle_max: float = 32767.0 - max_step_deg: float = 30000.0 # rotate_revolutions 分段旋转的最大单步角度 - - # DH 手册:手指位置 0~1000‰。0=闭合,1000=张开。RGI-100 行程约 70mm。 - finger_open_per_mille: int = 1000 - finger_close_per_mille: int = 0 - - # 默认参数(DH 百分比) - default_speed: int = 50 # 旋转速度 % - default_torque: int = 50 # 旋转力/力矩 % - default_finger_speed: int = 50 # 手指速度 % - default_finger_force: int = 50 # 手指夹持力 % - torque_min: int = 20 - torque_max: int = 100 - - # 控制行为 - auto_initialize: bool = True - init_timeout: float = 15.0 # RGI 初始化包含旋转找零,时间更长 - angle_tolerance_deg: float = 1.0 - status_poll_interval: float = 0.05 - - -class RotaryGripper(BaseGripper): - """大寰 RGI-100-30-O-S-M1 旋转夹爪。""" - - name = "dh_rgi_rotary" - gripper_type = GripperType.ROTARY - - def __init__(self, config: RotaryGripperConfig | None = None) -> None: - super().__init__() - self.cfg = config or RotaryGripperConfig() - self._client: DHModbusClient | None = None - self._last_angle = 0.0 - self._last_torque = int(self.cfg.default_torque) - self._last_speed = int(self.cfg.default_speed) - self._last_finger_force = int(self.cfg.default_finger_force) - self._last_finger_speed = int(self.cfg.default_finger_speed) - self._last_finger_per_mille = int(self.cfg.finger_open_per_mille) - - def connect(self) -> None: - if self._client is not None: - self.disconnect() - self._client = DHModbusClient( - self.cfg.port, - slave_id=self.cfg.slave_id, - baudrate=self.cfg.baudrate, - timeout=self.cfg.timeout, - ) - self._connected = True - self._status.connected = True - self._status.state = GripperState.IDLE - self._status.error_msg = "" - if self.cfg.auto_initialize: - self.initialize() - - def disconnect(self) -> None: - if self._client is not None: - self._client.close() - self._client = None - self._connected = False - self._status.connected = False - self._status.state = GripperState.IDLE - - def initialize(self, full: bool = False) -> None: - self._require_client() - assert self._client is not None - self._client.initialize(full=full, rotation=True, timeout=self.cfg.init_timeout) - self._status.initialized = True - - def _require_client(self) -> None: - if not self._connected or self._client is None: - self._status.state = GripperState.ERROR - self._status.error_msg = "旋转夹爪未连接" - raise DHModbusError(self._status.error_msg) - - def execute(self, cmd: GripperCommand) -> GripperStatus: - """执行旋转指令;cmd.target_position 单位为度。""" - return self.rotate_to( - self._last_angle if cmd.target_position is None else float(cmd.target_position), - speed=cmd.target_velocity, - torque=cmd.target_force, - wait_complete=cmd.wait_complete, - timeout=cmd.timeout, - ) - - def _wait_complete(self, target_angle: float, timeout: float) -> None: - assert self._client is not None - start = time.monotonic() - start_angle = float(self._client.get_rotation_angle_deg()) - expected = abs(float(target_angle) - start_angle) + 30.0 - settled = 0 - last_angle = start_angle - time.sleep(0.05) - while time.monotonic() - start < timeout: - rot_state = self._client.get_rotation_state() - angle = float(self._client.get_rotation_angle_deg()) - self._status.rotation_state = rot_state - self._status.rotation_deg = angle - self._status.position = angle - self._status.is_moving = rot_state == 0 - if abs(angle - start_angle) > expected: - self._client.hold_current_rotation() - self._status.state = GripperState.ERROR - self._status.error_msg = ( - f"旋转超程保护:目标 {target_angle:.1f}°,从 {start_angle:.1f}° 跑到 {angle:.1f}°,已发停止" - ) - return - if rot_state in (1, 2): - self._status.state = GripperState.IDLE if rot_state == 1 else GripperState.GRIPPING - if rot_state == 2: - self._status.error_msg = "旋转受阻(blocking)" - return - if rot_state == 3: - self._status.state = GripperState.ERROR - self._status.error_msg = "旋转曾受阻且未到目标位" - return - if abs(angle - float(target_angle)) <= self.cfg.angle_tolerance_deg: - settled += 1 - if settled >= 3: - self._status.state = GripperState.IDLE - self._status.is_moving = False - return - elif abs(angle - last_angle) <= self.cfg.angle_tolerance_deg: - settled += 1 - if settled >= 8 and abs(angle - float(target_angle)) <= 15.0: - self._status.state = GripperState.IDLE - self._status.is_moving = False - return - else: - settled = 0 - last_angle = angle - time.sleep(self.cfg.status_poll_interval) - self._client.hold_current_rotation() - self._status.state = GripperState.ERROR - self._status.error_msg = f"旋转运动超时(>{timeout:.1f}s),已发停止" - - def get_status(self) -> GripperStatus: - if not self._connected or self._client is None: - self._status.connected = False - return self._status - try: - finger_pos = self._client.get_position_per_mille() - finger_state = self._client.get_gripper_state() - init_state = self._client.get_init_state() - rot_angle = self._client.get_rotation_angle_deg() - rot_state = self._client.get_rotation_state() - rot_init = self._client.get_rotation_init_state() - - self._status.connected = True - self._status.initialized = init_state == 1 and rot_init == 1 - self._status.finger_position_per_mille = float(finger_pos) - self._status.rotation_deg = float(rot_angle) - self._status.position = float(rot_angle) - self._status.velocity = float(self._last_speed) - self._status.force = float(self._last_torque) - self._status.gripper_state = finger_state - self._status.rotation_state = rot_state - self._status.is_moving = finger_state == 0 or rot_state == 0 - self._status.is_gripped = finger_state == 2 - if self._status.state != GripperState.ERROR: - if finger_state == 2 or rot_state == 2: - self._status.state = GripperState.GRIPPING - elif finger_state == 0 or rot_state == 0: - self._status.state = GripperState.MOVING - else: - self._status.state = GripperState.IDLE - self._status.timestamp = time.time() - except Exception as exc: - self._status.state = GripperState.ERROR - self._status.error_msg = str(exc) - self._status.connected = False - return self._status - - # ----------------------------- - # 手指夹持 - # ----------------------------- - def move_fingers(self, position_per_mille: int, force: int | None = None, - speed: int | None = None, wait_complete: bool = True, - timeout: float = 10.0) -> GripperStatus: - try: - self._require_client() - except DHModbusError: - return self._status - assert self._client is not None - target = int(np.clip(position_per_mille, 0, 1000)) - f = int(np.clip(force or self.cfg.default_finger_force, 20, 100)) - s = int(np.clip(speed or self.cfg.default_finger_speed, 1, 100)) - self._client.set_speed_pct(s) - self._client.set_force_pct(f) - self._client.set_position_per_mille(target) - self._last_finger_per_mille = target - self._last_finger_force = f - self._last_finger_speed = s - if wait_complete: - start = time.monotonic() - time.sleep(0.05) - while time.monotonic() - start < timeout: - state = self._client.get_gripper_state() - pos = self._client.get_position_per_mille() - self._status.gripper_state = state - self._status.finger_position_per_mille = float(pos) - if state in (1, 2): - break - if state == 3: - self._status.state = GripperState.ERROR - self._status.error_msg = "夹持后物体掉落" - break - time.sleep(self.cfg.status_poll_interval) - return self.get_status() - - def open_fingers(self, **kwargs) -> GripperStatus: - return self.move_fingers(self.cfg.finger_open_per_mille, **kwargs) - - def close_fingers(self, **kwargs) -> GripperStatus: - return self.move_fingers(self.cfg.finger_close_per_mille, **kwargs) - - # ----------------------------- - # 旋转 - # ----------------------------- - def rotate_to(self, angle_deg: float, speed: int | None = None, torque: int | None = None, - wait_complete: bool = True, timeout: float = 10.0, **kwargs) -> GripperStatus: - try: - self._require_client() - except DHModbusError: - return self._status - assert self._client is not None - - angle = float(np.clip(angle_deg, self.cfg.angle_min, self.cfg.angle_max)) - s = int(np.clip(speed or self.cfg.default_speed, 1, 100)) - t = int(np.clip(torque or self.cfg.default_torque, self.cfg.torque_min, self.cfg.torque_max)) - - self._client.set_rotation_speed_pct(s) - self._client.set_rotation_force_pct(t) - target = self._client.set_rotation_angle_deg(angle) - - self._last_angle = float(target) - self._last_speed = s - self._last_torque = t - self._status.state = GripperState.MOVING - self._status.error_msg = "" - - if wait_complete: - self._wait_complete(float(target), timeout) - return self.get_status() - - def rotate_by(self, delta_deg: float, **kwargs) -> GripperStatus: - current = self.get_status().rotation_deg - return self.rotate_to(current + float(delta_deg), **kwargs) - - def rotate_revolutions(self, revolutions: float, **kwargs) -> GripperStatus: - """旋转指定圈数;超过单步角度范围时自动分段,并按实际反馈角度结算。""" - remaining = float(revolutions) * 360.0 - status = self.get_status() - max_step = abs(float(self.cfg.max_step_deg)) or 30000.0 - while abs(remaining) > 1e-6: - before = float(self.get_status().rotation_deg) - step = float(np.clip(remaining, -max_step, max_step)) - status = self.rotate_to(before + step, **kwargs) - if status.state == GripperState.ERROR: - return status - after = float(status.rotation_deg) - achieved = after - before - if abs(achieved) < max(1.0, abs(step) * 0.2): - status.state = GripperState.ERROR - status.error_msg = ( - "旋转未达到预期步进,可能超出角度寄存器范围或反馈异常:" - f"step={step:.3f}, before={before:.3f}, after={after:.3f}" - ) - return status - remaining -= achieved - return status - - def home_rotation(self, **kwargs) -> GripperStatus: - return self.rotate_to(0.0, **kwargs) - - def set_rotation_speed(self, speed_pct: int) -> None: - self._require_client() - assert self._client is not None - self._last_speed = self._client.set_rotation_speed_pct(speed_pct) - - def set_rotation_torque(self, torque_pct: int) -> None: - self._require_client() - assert self._client is not None - self._last_torque = self._client.set_rotation_force_pct(torque_pct) - - def set_finger_speed(self, speed_pct: int) -> None: - self._require_client() - assert self._client is not None - self._last_finger_speed = self._client.set_speed_pct(speed_pct) - - def set_finger_force(self, force_pct: int) -> None: - self._require_client() - assert self._client is not None - self._last_finger_force = self._client.set_force_pct(force_pct) - - def open(self, **kwargs) -> GripperStatus: - """对于 RGI,open 定义为张开手指;旋转请用 rotate_to/rotate_revolutions。""" - return self.open_fingers(**kwargs) - - def close(self, **kwargs) -> GripperStatus: - """对于 RGI,close 定义为闭合手指;旋转请用 rotate_to/rotate_revolutions。""" - return self.close_fingers(**kwargs) - - def stop(self) -> None: - if self._client is not None: - self._client.hold_current_all() - self._status.state = GripperState.IDLE - - -# ============================================================================= -# 双臂夹爪管理器 -# ============================================================================= - -@dataclass -class DualArmGripperConfig: - """双臂夹爪配置。 - - 这里**没有** ``left_arm_sn`` / ``right_arm_sn``:它们曾经存在但从来没有被读过 - (只写不读的死字段,R5.5),而且默认值是本机的 SN —— 换台臂就会误导读者。 - 哪个侧别是哪台臂,由 ``load_from_site()`` 从 site.yaml 的 ``robots[].arm`` 决定。 - """ - - left_gripper: ParallelGripperConfig = field(default_factory=ParallelGripperConfig) - right_gripper: RotaryGripperConfig = field(default_factory=RotaryGripperConfig) - - -class DualArmGripperManager: - """双臂夹爪管理器:统一控制左右臂夹爪。""" - - def __init__(self, config: DualArmGripperConfig | None = None) -> None: - self.cfg = config or DualArmGripperConfig() - self._left: ParallelGripper | None = None - self._right: RotaryGripper | None = None - - @property - def left(self) -> ParallelGripper: - if self._left is None: - self._left = ParallelGripper(self.cfg.left_gripper) - return self._left - - @property - def right(self) -> RotaryGripper: - if self._right is None: - self._right = RotaryGripper(self.cfg.right_gripper) - return self._right - - def connect_all(self) -> None: - self.left.connect() - self.right.connect() - - def disconnect_all(self) -> None: - if self._left: - self._left.disconnect() - if self._right: - self._right.disconnect() - - def initialize_all(self, full: bool = False) -> None: - self.left.initialize(full=full) - self.right.initialize(full=full) - - def get_all_status(self) -> dict[str, GripperStatus]: - return { - "left": self.left.get_status(), - "right": self.right.get_status(), - } - - def emergency_stop(self) -> None: - self.left.stop() - self.right.stop() - - -def load_dual_arm_gripper_config(path: str | Path) -> DualArmGripperConfig: - """从 configs/dual_arm_robot.yaml 加载双臂夹爪配置。""" - import yaml - - data = yaml.safe_load(Path(path).read_text(encoding="utf-8")) or {} - left = data.get("left_arm", {}) or {} - right = data.get("right_arm", {}) or {} - grip = data.get("gripper", {}) or {} - parallel = grip.get("parallel", {}) or {} - rotary = grip.get("rotary", {}) or {} - - left_cfg = ParallelGripperConfig( - port=left.get("gripper_port", "/dev/ttyUSB0"), - slave_id=int(left.get("gripper_slave_id", 1)), - baudrate=int(left.get("gripper_baudrate", 115200)), - stroke_min=float(parallel.get("stroke_min", 0.0)), - stroke_max=float(parallel.get("stroke_max", 40.0)), - default_speed=int(parallel.get("default_speed", 50)), - default_force=int(parallel.get("default_force", 50)), - force_min=int(parallel.get("force_min", 20)), - force_max=int(parallel.get("force_max", 100)), - auto_initialize=bool(parallel.get("auto_initialize", True)), - ) - right_cfg = RotaryGripperConfig( - port=right.get("gripper_port", "/dev/ttyUSB1"), - slave_id=int(right.get("gripper_slave_id", 1)), - baudrate=int(right.get("gripper_baudrate", 115200)), - angle_min=float(rotary.get("angle_min", -32767.0)), - angle_max=float(rotary.get("angle_max", 32767.0)), - max_step_deg=float(rotary.get("max_step_deg", 30000.0)), - finger_open_per_mille=int(rotary.get("finger_open_per_mille", 1000)), - finger_close_per_mille=int(rotary.get("finger_close_per_mille", 0)), - default_speed=int(rotary.get("default_speed", 50)), - default_torque=int(rotary.get("default_torque", 50)), - default_finger_speed=int(rotary.get("default_finger_speed", 50)), - default_finger_force=int(rotary.get("default_finger_force", 50)), - torque_min=int(rotary.get("torque_min", 20)), - torque_max=int(rotary.get("torque_max", 100)), - auto_initialize=bool(rotary.get("auto_initialize", True)), - ) - return DualArmGripperConfig( - left_gripper=left_cfg, - right_gripper=right_cfg, - ) - - -def load_from_site(data: dict) -> DualArmGripperConfig: - """从 ``~/ros2/config/site.yaml`` 构建 ``DualArmGripperConfig``。 - - 左右靠 ``robots[].arm`` 认,**不靠 SN 里的数字**:``"063989 就是左臂"`` - 是站点数据,写进代码后换个站点就会把左右夹爪搞反 - (症状是"右臂的旋转爪去开左臂的平行爪",串口对不上才报错)。 - """ - robots = list((data.get("robot") or {}).get("robots") or []) - left = next((r for r in robots if str(r.get("arm") or "").lower() == "left"), {}) - right = next((r for r in robots if str(r.get("arm") or "").lower() == "right"), {}) - g = data.get("gripper") or {} - parallel = g.get("parallel") or {} - rotary = g.get("rotary") or {} - lg = left.get("gripper") or {} - rg = right.get("gripper") or {} - stroke = float(lg.get("stroke_mm") or parallel.get("stroke_max") or g.get("stroke_mm") or 20.0) - left_cfg = ParallelGripperConfig( - port=str(lg.get("port") or "/dev/ttyUSB0"), - slave_id=int(lg.get("slave_id") or g.get("slave_id") or 1), - baudrate=int(lg.get("baud") or g.get("baud") or 115200), - stroke_min=float(parallel.get("stroke_min") or 0.0), - stroke_max=stroke, - default_speed=int(parallel.get("default_speed") or g.get("speed_pct") or 50), - default_force=int(parallel.get("default_force") or g.get("force_pct") or 50), - force_min=int(parallel.get("force_min") or 20), - force_max=int(parallel.get("force_max") or 100), - auto_initialize=bool(lg.get("auto_init", parallel.get("auto_initialize", True))), - init_timeout=float(parallel.get("init_timeout") or 10.0), - ) - right_cfg = RotaryGripperConfig( - port=str(rg.get("port") or "/dev/ttyUSB1"), - slave_id=int(rg.get("slave_id") or 1), - baudrate=int(rg.get("baud") or g.get("baud") or 115200), - angle_min=float(rotary.get("angle_min") or -32767.0), - angle_max=float(rotary.get("angle_max") or 32767.0), - max_step_deg=float(rotary.get("max_step_deg") or 30000.0), - finger_open_per_mille=int(rotary.get("finger_open_per_mille") or 1000), - finger_close_per_mille=int(rotary.get("finger_close_per_mille") or 0), - default_speed=int(rotary.get("default_speed") or 50), - default_torque=int(rotary.get("default_torque") or 50), - default_finger_speed=int(rotary.get("default_finger_speed") or 50), - default_finger_force=int(rotary.get("default_finger_force") or 50), - torque_min=int(rotary.get("torque_min") or 20), - torque_max=int(rotary.get("torque_max") or 100), - auto_initialize=bool(rg.get("auto_init", rotary.get("auto_initialize", False))), - init_timeout=float(rotary.get("init_timeout") or 15.0), - ) - return DualArmGripperConfig( - left_gripper=left_cfg, - right_gripper=right_cfg, - ) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_cli.py b/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_cli.py deleted file mode 100644 index f4f3402..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_cli.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -"""DH PGEA(左臂)与 RGI(右臂)的命令行工具。从 site.yaml 读取串口。""" - -from __future__ import annotations - -import argparse -import os -import sys -import time -from pathlib import Path - -import yaml - -from arm_application.dual_gripper import DualArmGripperManager, load_from_site - - -def _site_path() -> Path: - env = os.environ.get("SITE_CONFIG", "").strip() - if env: - return Path(env).expanduser() - return Path.home() / "ros2" / "config" / "site.yaml" - - -def _print_status(label: str, status) -> None: - print( - f" {label}: state={status.state.name} " - f"pos={status.position:.2f} finger={status.finger_position_per_mille:.0f}‰ " - f"rot={status.rotation_deg:.2f}° moving={status.is_moving} " - f"gripped={status.is_gripped} init={status.initialized} " - f"err={status.error_msg or '-'}" - ) - - -def _load_site_exporter(): - """复用 ``scripts/lib/export_site_env.py`` —— 它才是 --arm 别名的权威定义。 - - 这里**不自己再抄一份** ``89 -> SN`` 的映射:抄一份就多一处会漂移的地方(M2)。 - """ - root = Path(__file__).resolve().parents[3] - lib = str(root / "scripts" / "lib") - if lib not in sys.path: - sys.path.insert(0, lib) - import export_site_env # type: ignore - - return export_site_env - - -def _normalize_arm(raw: str, data: dict) -> str: - """把 --arm 的写法归一成 ``left`` / ``right`` / ``both``。 - - 别名(``89`` 这类)由 ``export_site_env`` 从 site.yaml 的 ``robots[]`` 现算 - (臂号 = 该臂 SN 末两位)。代码里**不写死** SN,否则换台机器人后会指错臂, - 而症状是"给右臂发命令,左臂动了"。 - """ - t = (raw or "").strip() - if t.lower() in ("both", "dual", "all"): - return "both" - site_env = _load_site_exporter() - sn, matched = site_env.resolve_robot_sn(data, t) - if not matched: - raise SystemExit( - f"未知的 --arm {raw!r}:不在 site.yaml 的 robot.robots[] 里。\n" - f"可用:\n{site_env.describe_arms(data)}\n" - f"也可以直接写 left|right|both。" - ) - for row in (data.get("robot") or {}).get("robots") or []: - if str(row.get("sn") or "").strip() != sn: - continue - arm = str(row.get("arm") or "").strip().lower() - if arm in ("left", "right"): - return arm - raise SystemExit( - f"--arm {raw!r} 选中了 {sn},但 site.yaml 里这台臂没写 arm: left|right," - f"无法判断操作哪个夹爪。请补上这个键。" - ) - raise SystemExit( - f"--arm {raw!r} 解析出 {sn},但它不在 site.yaml 的 robot.robots[] 里," - f"无法判断是哪个夹爪。" - ) - - -def test_parallel(manager: DualArmGripperManager, args: argparse.Namespace) -> None: - gripper = manager.left - print(f"=== PGEA 平行夹爪({gripper.cfg.port})===") - gripper.connect() - _print_status("已连接", gripper.get_status()) - if args.test in ("init", "probe", "all"): - if args.test != "probe": - gripper.initialize(full=args.init_full) - _print_status("初始化", gripper.get_status()) - if args.test in ("open", "all"): - _print_status("张开", gripper.open(force=args.force, speed=args.speed)) - if args.test in ("close", "all"): - _print_status("闭合", gripper.close(force=args.force, speed=args.speed)) - if args.test in ("move", "pos") and args.pos is not None: - _print_status("移动", gripper.move_to(args.pos, force=args.force, speed=args.speed)) - if args.test in ("status", "probe"): - _print_status("状态", gripper.get_status()) - - -def test_rotary(manager: DualArmGripperManager, args: argparse.Namespace) -> None: - gripper = manager.right - print(f"=== RGI 旋转夹爪({gripper.cfg.port})===") - gripper.connect() - _print_status("已连接", gripper.get_status()) - if args.test in ("init", "all"): - gripper.initialize(full=args.init_full) - _print_status("初始化", gripper.get_status()) - if args.test in ("open", "all"): - _print_status("张开", gripper.open_fingers(force=args.force, speed=args.speed)) - if args.test in ("close", "all"): - _print_status("闭合", gripper.close_fingers(force=args.force, speed=args.speed)) - if args.test in ("move", "pos") and args.pos is not None: - _print_status("手指", gripper.move_fingers(int(args.pos), force=args.force, speed=args.speed)) - if args.test in ("rotate", "rotate_to", "all"): - if args.revolutions is not None: - _print_status( - "圈数", - gripper.rotate_revolutions(args.revolutions, speed=args.speed, torque=args.force), - ) - else: - angle = args.angle if args.angle is not None else 90.0 - _print_status("旋转", gripper.rotate_to(angle, speed=args.speed, torque=args.force)) - if args.test == "rotate_by": - delta = args.angle if args.angle is not None else 45.0 - _print_status("相对旋转", gripper.rotate_by(delta, speed=args.speed, torque=args.force)) - if args.test in ("status", "probe"): - _print_status("状态", gripper.get_status()) - - -def main() -> int: - parser = argparse.ArgumentParser(description="DH PGEA / RGI 命令行工具(串口来自 site.yaml)") - parser.add_argument( - "--arm", - # 默认取当前臂(parse_arm_args.sh / load_site_config.sh 已经把它放进环境)。 - # **不**兜底成某个具体臂号:那等于"没选臂时也能跑,跑的是哪台看运气"。 - default=( - os.environ.get("SITE_ROBOT_ARM") - or os.environ.get("ROBOT_SN") - or os.environ.get("SITE_ROBOT_SN") - or "" - ), - help="left|right|both,或该臂的臂号(= SN 末两位,由 site.yaml 决定)", - ) - parser.add_argument( - "--test", - default="status", - help="probe|init|open|close|move|pos|rotate|rotate_by|status", - ) - parser.add_argument("--pos", type=float, default=None, help="PGEA 为 mm;RGI 为手指 0-1000") - parser.add_argument("--angle", type=float, default=None) - parser.add_argument("--revolutions", type=float, default=None) - parser.add_argument("--speed", type=int, default=25) - parser.add_argument("--force", type=int, default=33) - parser.add_argument("--init-full", action="store_true") - parser.add_argument("--site", default="") - args = parser.parse_args() - - site = Path(args.site).expanduser() if args.site else _site_path() - if not site.is_file(): - print(f"错误:site.yaml 缺失:{site}", file=sys.stderr) - return 1 - data = yaml.safe_load(site.read_text(encoding="utf-8")) or {} - manager = DualArmGripperManager(load_from_site(data)) - arm = _normalize_arm(str(args.arm), data) - print(f"site={site} arm={arm} test={args.test}") - - try: - if arm == "left": - test_parallel(manager, args) - elif arm == "right": - test_rotary(manager, args) - else: - test_parallel(manager, args) - test_rotary(manager, args) - except KeyboardInterrupt: - print("收到中断 —— 停止") - manager.emergency_stop() - return 130 - except Exception as exc: - print(f"错误:{exc}", file=sys.stderr) - return 1 - finally: - manager.disconnect_all() - time.sleep(0.05) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_node.py deleted file mode 100644 index d877002..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/dual_gripper_node.py +++ /dev/null @@ -1,320 +0,0 @@ -"""ROS 2 双臂 DH 夹爪节点(左臂 PGEA + 右臂 RGI)。使用 arm_msgs,而非 Flexiv RDK。""" - -from __future__ import annotations - -import os -import threading -from pathlib import Path - -import rclpy -import yaml -from rclpy.callback_groups import ReentrantCallbackGroup -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node - -from arm_application.dual_gripper import ( - DualArmGripperManager, - GripperState, - load_dual_arm_gripper_config, - load_from_site, -) -from arm_msgs.msg import GripperCommand as GripperCommandMsg -from arm_msgs.msg import GripperStatus as GripperStatusMsg -from arm_msgs.srv import GripperExecute - -from arm_application.ros_node import TolerantNode - - -def _site_path() -> Path: - env = os.environ.get("SITE_CONFIG", "").strip() - if env: - return Path(env).expanduser() - return Path.home() / "ros2" / "config" / "site.yaml" - - -def _as_bool(val, default: bool = True) -> bool: - if val is None: - return default - if isinstance(val, str): - return val.strip().lower() in ("1", "true", "yes", "on") - return bool(val) - - -class DualGripperNode(TolerantNode): - def __init__(self) -> None: - super().__init__("dual_gripper_driver") - self.declare_parameter("config_file", "") - self.declare_parameter("auto_connect", True) - self.declare_parameter("allow_offline", True) - self.declare_parameter("publish_hz", 10.0) - self.declare_parameter("sides", "left,right") - - self._cb_group = ReentrantCallbackGroup() - self._locks = {"left": threading.Lock(), "right": threading.Lock()} - sides_raw = str(self.get_parameter("sides").value or "left,right") - self._sides = [s.strip().lower() for s in sides_raw.split(",") if s.strip()] - if not self._sides: - self._sides = ["left", "right"] - - cfg_path = self.get_parameter("config_file").get_parameter_value().string_value.strip() - if cfg_path: - self._manager = DualArmGripperManager(load_dual_arm_gripper_config(cfg_path)) - else: - site = _site_path() - data = yaml.safe_load(site.read_text(encoding="utf-8")) or {} - self._manager = DualArmGripperManager(load_from_site(data)) - self.get_logger().info(f"夹爪配置来自 site.yaml:{site}") - - self._connect_errors: dict[str, str] = {} - if _as_bool(self.get_parameter("auto_connect").value, True): - self._connect_all() - - self._left_pub = self.create_publisher(GripperStatusMsg, "~/left/status", 10) - self._right_pub = self.create_publisher(GripperStatusMsg, "~/right/status", 10) - if "left" in self._sides: - self.create_subscription( - GripperCommandMsg, - "~/left/command", - lambda msg: self._on_command("left", msg), - 10, - callback_group=self._cb_group, - ) - self.create_service( - GripperExecute, - "~/left/execute", - lambda req, resp: self._on_execute("left", req, resp), - callback_group=self._cb_group, - ) - if "right" in self._sides: - self.create_subscription( - GripperCommandMsg, - "~/right/command", - lambda msg: self._on_command("right", msg), - 10, - callback_group=self._cb_group, - ) - self.create_service( - GripperExecute, - "~/right/execute", - lambda req, resp: self._on_execute("right", req, resp), - callback_group=self._cb_group, - ) - - period = 1.0 / max(1e-3, float(self.get_parameter("publish_hz").value)) - self.create_timer(period, self._publish_status, callback_group=self._cb_group) - self.get_logger().info( - f"dual_gripper_driver ready sides={self._sides} " - "~/left|right/command status execute" - ) - - def _connect_all(self) -> None: - mapping = (("left", self._manager.left), ("right", self._manager.right)) - for side, gripper in mapping: - if side not in self._sides: - continue - try: - gripper.connect() - self.get_logger().info(f"{side} 夹爪已连接:{gripper.cfg.port}") - except Exception as exc: - self._connect_errors[side] = str(exc) - self.get_logger().error(f"{side} 夹爪连接失败:{exc}") - if self._connect_errors and not _as_bool(self.get_parameter("allow_offline").value, True): - raise RuntimeError(f"夹爪连接失败:{self._connect_errors}") - - def _gripper(self, side: str): - return self._manager.left if side == "left" else self._manager.right - - def _execute(self, side: str, msg: GripperCommandMsg): - gripper = self._gripper(side) - command = (msg.command or "").strip().lower() - timeout = float(msg.timeout or 10.0) - wait = bool(msg.wait_complete) - - if side in self._connect_errors and not gripper.is_connected(): - status = gripper.get_status() - status.error_msg = self._connect_errors[side] - return status - - if command == "connect": - gripper.connect() - self._connect_errors.pop(side, None) - return gripper.get_status() - if command == "init": - gripper.initialize(full=False) - return gripper.get_status() - if command == "init_full": - gripper.initialize(full=True) - return gripper.get_status() - if command == "stop": - gripper.stop() - return gripper.get_status() - - if side == "left": - if command == "open": - return gripper.open( - force=int(msg.force) if msg.force else None, - speed=int(msg.speed) if msg.speed else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "close": - return gripper.close( - force=int(msg.force) if msg.force else None, - speed=int(msg.speed) if msg.speed else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "move": - return gripper.move_to( - float(msg.position), - force=int(msg.force) if msg.force else None, - speed=int(msg.speed) if msg.speed else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "set_force": - gripper.set_force(int(msg.force)) - return gripper.get_status() - if command == "set_speed": - gripper.set_speed(int(msg.speed)) - return gripper.get_status() - else: - if command == "open": - return gripper.open_fingers( - force=int(msg.force) if msg.force else None, - speed=int(msg.speed) if msg.speed else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "close": - return gripper.close_fingers( - force=int(msg.force) if msg.force else None, - speed=int(msg.speed) if msg.speed else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "move": - return gripper.move_fingers( - int(msg.position), - force=int(msg.force) if msg.force else None, - speed=int(msg.speed) if msg.speed else None, - wait_complete=wait, - timeout=timeout, - ) - if command in ("rotate", "rotate_to"): - return gripper.rotate_to( - float(msg.position), - speed=int(msg.speed) if msg.speed else None, - torque=int(msg.force) if msg.force else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "rotate_by": - return gripper.rotate_by( - float(msg.position), - speed=int(msg.speed) if msg.speed else None, - torque=int(msg.force) if msg.force else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "rotate_revolutions": - return gripper.rotate_revolutions( - float(msg.position), - speed=int(msg.speed) if msg.speed else None, - torque=int(msg.force) if msg.force else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "home_rotation": - return gripper.home_rotation( - speed=int(msg.speed) if msg.speed else None, - torque=int(msg.force) if msg.force else None, - wait_complete=wait, - timeout=timeout, - ) - if command == "set_force": - gripper.set_rotation_torque(int(msg.force)) - return gripper.get_status() - if command == "set_speed": - gripper.set_rotation_speed(int(msg.speed)) - return gripper.get_status() - if command == "set_finger_force": - gripper.set_finger_force(int(msg.force)) - return gripper.get_status() - if command == "set_finger_speed": - gripper.set_finger_speed(int(msg.speed)) - return gripper.get_status() - - status = gripper.get_status() - status.state = GripperState.ERROR - status.error_msg = f"不支持的命令 {command!r}(side={side})" - return status - - def _on_command(self, side: str, msg: GripperCommandMsg) -> None: - with self._locks[side]: - status = self._execute(side, msg) - if status.state == GripperState.ERROR: - self.get_logger().warn(f"{side} 命令 {msg.command!r} 失败:{status.error_msg}") - - def _on_execute(self, side: str, request: GripperExecute.Request, response: GripperExecute.Response): - with self._locks[side]: - status = self._execute(side, request.command) - response.success = status.state != GripperState.ERROR and status.connected - response.message = status.error_msg or "OK" - response.status = self._to_status_msg(side, status) - return response - - def _to_status_msg(self, side: str, status) -> GripperStatusMsg: - gripper = self._gripper(side) - msg = GripperStatusMsg() - msg.header.stamp = self.get_clock().now().to_msg() - msg.header.frame_id = f"{side}_gripper" - msg.name = gripper.name - msg.gripper_type = gripper.gripper_type.name.lower() - msg.state = status.state.name - msg.connected = bool(status.connected) - msg.initialized = bool(status.initialized) - msg.is_moving = bool(status.is_moving) - msg.is_gripped = bool(status.is_gripped) - msg.position = float(status.position) - msg.finger_position_per_mille = float(status.finger_position_per_mille) - msg.rotation_deg = float(status.rotation_deg) - msg.gripper_state = int(status.gripper_state) - msg.rotation_state = int(status.rotation_state) - msg.velocity = float(status.velocity) - msg.force = float(status.force) - msg.error_msg = status.error_msg or "" - return msg - - def _publish_status(self) -> None: - if "left" in self._sides: - left_status = self._manager.left.get_status() - if "left" in self._connect_errors and not left_status.connected: - left_status.error_msg = self._connect_errors["left"] - self._left_pub.publish(self._to_status_msg("left", left_status)) - if "right" in self._sides: - right_status = self._manager.right.get_status() - if "right" in self._connect_errors and not right_status.connected: - right_status.error_msg = self._connect_errors["right"] - self._right_pub.publish(self._to_status_msg("right", right_status)) - - def destroy_node(self) -> bool: - try: - self._manager.disconnect_all() - finally: - return super().destroy_node() - - -def main() -> None: - rclpy.init() - node = DualGripperNode() - executor = MultiThreadedExecutor(num_threads=4) - try: - rclpy.spin(node, executor=executor) - finally: - node.destroy_node() - rclpy.shutdown() - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_assembly_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_assembly_node.py deleted file mode 100644 index 5578c20..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_assembly_node.py +++ /dev/null @@ -1,2623 +0,0 @@ -#!/usr/bin/env python3 -"""通止规装配主流程(看板 S00–S11 + E1/E2)。 - -一次完整装配做什么 ------------------- -1. **S00** 自检:机械臂伺服 / 相机预览 / 夹爪伺服 / 触觉图传 / 算法权重, - 全部就绪才开指令窗(缺什么、缺了会怎样,逐条打印); -2. **S01** 回 home,再按工具系逆时针预绕到"不触发关节极限的极限角" —— - 这一步是给 S08 的棘轮留出回转行程,不然后面转两圈就贴限位; -3. **S02** 夹持确认(预留,默认跳过:传感器方案在优化、D435 未标定); -4. **S04** 腕部 D405 跟踪 k0(S03 手外粗定位只作兜底:跟踪丢了才去, - 今天 D435 还没标定,所以会明确报"缺哪个文件"而不是假装在做); -5. **S05** 画面稳定 T 秒后精拍定位 k1/k2,并记下当时的位姿; -6. **S06→S09** 对当前孔:正悬停 → 柔顺接触 → 棘轮式拧入 → 反向拧出; -7. **S10** 换到下一个孔(回到 S05 记的位姿),重复 S06–S09; -8. **S11** 复位退出。 - -异常分支:**E1** 掉件(张开爪 → 回 S01 流程 → 提示人工放好 → 按 R 继续)、 -**E2** 任意阶段超时/报错 → 退到安全高度后中止。 - -怎么跑 ------- -:: - - # 真机(先起机械臂与相机:run_real.sh / run_camera_d405.sh) - bash scripts/run_gauge_assembly.sh --arm 89 # 完整流程 - bash scripts/run_gauge_assembly.sh --arm 89 --dry-run # 只验编排,不动臂 - bash scripts/run_gauge_assembly.sh --arm 89 --holes 1 # 只装 k1 - - # 仿真(先起仿真:run_sim_gz.sh) - bash scripts/run_gauge_assembly.sh --sim - -诚实标注(哪些已经能信、哪些还不能) ------------------------------------- -**已经钉住的**(有单测/有验收判据): - -* S00–S11 的顺序、E1/E2 的落点(``gauge_fsm`` 92 项单测); -* 配置解析与单位、未知键报错(``gauge_config``); -* S01 的限位夹取与"真的绕工具 Z 转了"的事后验证(``gauge_kin``,用 TF 实测); -* 夹爪后端按**服务类型**选择(``gauge_gripper``); -* S00 的必检/选检划分(``gauge_boot``)。 - -**还不能信的**(必须真机标定/标定后才能用): - -* S07 的切向阈值、S08 的力判据:全部是"相对静止基线的增量"(任意单位), - 必须现场标定,代码只给了起点值和打印; -* S03 手外粗定位:D435 还没有 eye-to-hand 标定文件 → 目前必然走兜底; -* S02 夹持确认:预留,默认跳过。 -""" - -from __future__ import annotations - -import dataclasses -import json -import math -import os -import time -from pathlib import Path -from typing import Any, Dict, Iterable, List, Mapping, Optional, Sequence, Tuple - -import numpy as np -import rclpy -from rclpy.qos import ( - DurabilityPolicy, - QoSProfile, - ReliabilityPolicy, - qos_profile_sensor_data, -) -from sensor_msgs.msg import CameraInfo, Image -from std_msgs.msg import Bool, Float32MultiArray, String -from std_srvs.srv import Trigger -from trajectory_msgs.msg import JointTrajectory - -from arm_msgs.msg import GripperStatus -from arm_msgs.srv import GripperExecute - -from arm_application.gauge_boot import ( - dependency_advice, - missing_modules, - perception_source_of, - BootCheck, - abs_name, - blocking_failures, - build_checks, - format_report, - optional_warnings, - summary_counts, -) -from arm_application.gauge_config import ( - GaugeConfig, - GaugeConfigError, - from_site, - snap_feature_of, -) -from arm_application.gauge_fsm import ( - DESCEND_STALL_STEPS, - ENTRY_HIGH, - ROT_AXIS, - ROT_LIMIT, - ROT_SHORT, - Event, - FsmError, - GaugeContext, - GAUGE_SHOULDER_ABOVE_TIP_M, - GaugeFsm, - State, - descend_budget_m, - descend_iter_budget, - descend_needed_m, - descend_progress, - hole_entry_verdict, - descend_tol_m, - is_joint_limit_error, - pixel_stable, - points_stable, - ratchet_cycles, - ratchet_delta_rad, - ratchet_travel_ok, - relief_tol_m, - rotation_verdict, - screw_stop, - tangential_jump, - tool_clearance_m, - wrench_live, - wrench_touch, -) -from arm_application.gauge_gripper import ( - CONTRACT_STATUS_TOPIC, - GripperInterfaceError, - describe_backend_choice, - is_dropped_from_state, - is_gripped_from_state, - legacy_states_to_fields, - pick_backend, -) -from arm_application.gauge_kin import ( - axis_misalignment_deg, - match_limits, - parse_joint_limits, - prewind, - rotation_about_axis_deg, - vertical_down_error_deg, -) -from arm_application.pipeline_node import AssemblyPipeline -from arm_application.handeye_realsense import resolve_realsense_topics -from arm_application.site_io import ( - deep_merge, - load_site_dict, - overhead_camera, - resolve_eye_to_hand_file, - ros2_root, -) -# 复用同一份图像解码与轨迹点构造,别在这里再写一份(规则 M2) -from arm_application.stage2_locate_node import _bgr_copy, _pt as _joint_point - -#: 允许的"绕轴验证"误差 [deg]。超过就说明这根关节轴不是工具 Z 轴, -#: 后面所有以"转多少度"为单位的动作都不成立 —— 必须报错而不是继续。 -AXIS_VERIFY_TOL_DEG = 5.0 -#: 棘轮转腕时距离关节限位保留的余量 [deg]。 -#: 3° 不够用:实测轨迹会**自己**少走 ~5°(比如命令 180° 只到位 175.1°, -#: 而关节7 的限位正好是 175.06° —— 两者叠在一起,判断"是被限位截住还是 -#: 没走完"就分不清了)。留 8° 让这两种情况都还没有贴住。 -RATCHET_LIMIT_MARGIN_DEG = 8.0 -#: 限制"跟踪丢失 → 粗定位 → 跟踪"的来回次数,防死循环。 -MAX_TRACK_RETRIES = 3 - -#: ``stage2_locate`` 返回码 → 人话。为什么要这张表:日志里只有 ``code=6`` 时, -#: 现场只能去翻源码;而每个码对应的**下一步动作完全不同**(垂直化/粗定位/ -#: 检测/对准/工件被推走),写在这里就不用来回翻了。 -_LOCATE_CODE_HINT: Dict[int, str] = { - 2: "(垂直化或悬停失败:工具轴没竖直、或悬停高度到不了)", - 3: "(粗定位失败:视野里没框到工件 —— 看相机/光照/权重)", - 4: "(k1/k2 解不出来:孔被挡、曝光不对、或孔根本没在视野里)", - 5: "(对准迭代用满仍未收敛:检查手眼/相机安装,或放宽 align_tol_m)", - 6: "(工件被工具推走:不是手眼/检测的问题,是悬停时工具尖端已经进了工件" - " —— 查 gauge_assembly.tool_tip_below_flange_m 与 servo.hole_hover_z_m)", - 8: "(规尖偏移一直没量到:残差看着达标、但用的是**法兰轴线**不是规尖 —— " - "对的可能是法兰、不是规;摆到能看清规尖再跑。看日志『规尖视觉量取失败』)", -} - - -class GaugeAbort(RuntimeError): - """阶段内部判定要中止。带上 exit code,方便脚本区分原因。""" - - def __init__(self, message: str, code: int = 6) -> None: - super().__init__(message) - self.code = code - - -class GripperClient: - """夹爪出入口:``open/close/is_gripped`` 三个动作,与后端无关。 - - 后端由 :func:`arm_application.gauge_gripper.pick_backend` 按**服务类型**决定 - (真机今天是 Trigger,契约/仿真 是 GripperExecute),应用层不需要知道。 - """ - - #: 判"掉件"的开口塌陷量 [mm]:被夹住的工件掉了以后,两指会一路合到底, - #: 开口从"工件宽度"塌下去几十毫米。为什么不用 ``is_gripped`` 瞬时值 —— 见 - #: :meth:`dropped` 的说明(那是个推断值,会被 S08 的指令切换抖出假 E1)。 - DROP_COLLAPSE_MM = 5.0 - - def __init__(self, node: Any, backend: str, status_topic: str) -> None: - self._node = node - self.backend = backend - self._open_cli = None - self._close_cli = None - self._last_gripped: Optional[bool] = None - self._legacy_grip_state: Optional[int] = None - self._ever_gripped = False - #: 最近一帧的开口 [mm](契约后端才有)。掉件判据看它。 - self._last_aperture: Optional[float] = None - #: "夹住那一刻"的开口 [mm]。掉件判据是相对它的**塌陷量**,不是绝对值。 - self._grip_aperture: Optional[float] = None - - if backend == "contract": - self._open_cli = node.create_client(GripperExecute, "/gripper/open") - self._close_cli = node.create_client(GripperExecute, "/gripper/close") - node.create_subscription(GripperStatus, status_topic, self._on_contract, 10) - else: - self._open_cli = node.create_client(Trigger, "/gripper/open") - self._close_cli = node.create_client(Trigger, "/gripper/close") - node.create_subscription(Float32MultiArray, status_topic, self._on_legacy, 10) - - # -- 状态回调 --------------------------------------------------------- - def _on_contract(self, msg: GripperStatus) -> None: - pos = float(getattr(msg, "position", float("nan"))) - if math.isfinite(pos): - self._last_aperture = pos - self._last_gripped = bool(msg.is_gripped) - # ⚠️ 这里**故意不**记"夹住时的开口"。曾经记过,代价是一个假 E1: - # 本后端的 is_gripped 是**推断值**,夹爪**全开**时也会闪成 True - # (实测 99.29mm,见 dropped 的说明),于是基准被记成 99.29mm、 - # 塌陷量算成 77mm ⇒ "通止规掉了(E1)",而规好好地在爪里。 - # 基准只由 :meth:`adopt_current_grip` 在**明确知道夹住了**的时候记。 - - def _on_legacy(self, msg: Float32MultiArray) -> None: - fields = legacy_states_to_fields(list(msg.data)) - if not fields: - return - self._legacy_grip_state = int(fields["grip_state"]) - got = is_gripped_from_state(self._legacy_grip_state) - if got is not None: - self._last_gripped = got - if got: - # 老后端只有状态字、没有开口,掉件判据本来就吃状态字(见 dropped), - # 所以这里记"曾经夹住过"是对的。 - self._ever_gripped = True - - # -- 查询 ------------------------------------------------------------- - def seen(self) -> bool: - """收到过状态帧吗。S00 用它判断"状态话题有没有人发"。 - - 不能用 `topic list` 里有名字代替:话题在、发布者不在,是最常见的 - 假阳性(run_all.sh 踩过)。""" - return self._last_gripped is not None or self._legacy_grip_state is not None - - def is_gripped(self) -> Optional[bool]: - """``True``/``False``/``None``(后端给不出明确答案)。""" - return self._last_gripped - - def aperture(self) -> Optional[float]: - """最近一帧的**开口** [mm](只有契约后端的 ``position`` 有;没有返回 None)。""" - return self._last_aperture - - def grip_aperture(self) -> Optional[float]: - """第一次判到"夹住"时的开口 [mm](掉件判据的基准,见 :meth:`dropped`)。""" - return self._grip_aperture - - def collapse_mm(self) -> Optional[float]: - """相对夹住时的**开口塌陷量** [mm](正 = 比夹住时更小)。拿不到返回 None。 - - S08/S09 每轮都要"松爪 → 回转 → 夹紧",日志里必须看得到这个数: - 它一路变大就说明每轮夹紧都比上一轮更往里挤,或者规在往下滑。 - """ - if self._grip_aperture is None or self._last_aperture is None: - return None - return float(self._grip_aperture) - float(self._last_aperture) - - # -- 开口的"等稳定"与"记基准" ------------------------------------------ - def settle(self, *, settle_s: float = 1.0, tol_mm: float = 0.05) -> Optional[float]: - """等开口**稳定**下来,返回稳定后的开口 [mm](拿不到读数返回 None)。 - - 为什么必须有这个(2026-09-24 用日志抓到的): - ``close``/``open`` 服务**返回时动作还没做完**(JTC 轨迹是异步的)。 - 立刻读开口会读到**松手前的旧值**——实测 S08 夹紧后立刻读,读到的还是 - 全开 99.93mm,于是日志与基准全错("夹住时 99.29mm")。谁要在动作之后 - 判断开口,都必须先过这里。 - """ - spin = getattr(self._node, "_spin", None) - deadline = time.monotonic() + max(0.0, settle_s) - prev = self._last_aperture - stable = 0 - while True: - if spin is not None: - spin(0.05) - else: # pragma: no cover - 只有测试桩走这里 - time.sleep(0.05) - now = self._last_aperture - if now is not None and prev is not None and abs(float(now) - float(prev)) <= tol_mm: - stable += 1 - if stable >= 2: - return float(now) - else: - stable = 0 - prev = now - if time.monotonic() >= deadline: - return None if now is None else float(now) - - def adopt_current_grip(self, why: str, *, settle_s: float = 1.0) -> Optional[float]: - """把**当前**开口记为"夹住时的开口"(掉件判据的基准),并记"曾经夹住过"。 - - 只在**明确知道爪里夹着规**的时刻调用(S00 自检通过后、以及每一次 - 确认夹紧之后)——它是掉件判据唯一的参照,随手记会让判据失去意义 - (见 :meth:`dropped` 与 :meth:`_on_contract` 的说明)。 - """ - ap = self.settle(settle_s=settle_s) - if ap is None: - # 拿不到开口(老固件/别的夹爪)也要记"曾经夹住过":否则 dropped() - # 会永远返回 False,那比"会抖的旧判据"更糟(真掉件也看不见)。 - self._ever_gripped = True - self._node.get_logger().warn( - f"拿不到开口读数({why})—— 掉件判据退回状态字,会抖但不会漏" - ) - return None - self._grip_aperture = float(ap) - self._ever_gripped = True - self._node.get_logger().info(f"夹持基准:开口 {ap:.2f}mm({why})") - return float(ap) - - def dropped(self) -> bool: - """E1 掉件:**曾经夹住过**,现在报"掉落"。 - - 装配前爪里本来就空,那时状态字也可能是"掉落/无物",直接判会一开场就 - 报 E1(``is_dropped_from_state`` 里解释了这一点)。 - - **契约后端的判据是"开口塌陷",不是 ``is_gripped`` 的瞬时翻转** - (2026-09-24 实测踩到,值得完整读): - - 仿真里 ``is_gripped`` 是**推断值**("指令到了合拢侧 + 实际开口比指令 - 大出容差")。S08 会在"合到某个开口 / 全合"之间发指令 —— 只要某一帧 - 的指令落到与实际开口同一档,``is_gripped`` 就翻成 False。于是 - **S08 第 2/12 轮直接报 E1**(爪里其实好好的,是判据在抖), - 然后整条流程去等人工"放好通止规",而仿真里根本没人能做这件事。 - 更坏的是这个推断值在**全开**时也会闪成 True(实测 99.29mm)—— - 拿它当基准就会得到"塌陷 77mm"的假 E1。所以基准只由 - :meth:`adopt_current_grip` 明确记录(见 :meth:`_on_contract`)。 - - 真正"掉了"的物理表现是**两指合到底**:开口从"工件宽度"塌到几毫米, - 是几十毫米的变化,不会被指令切换带偏。所以判据用 - ``夹住时的开口 − 当前开口 ≥ DROP_COLLAPSE_MM``。 - """ - if not self._ever_gripped: - return False - if self.backend == "legacy" and self._legacy_grip_state is not None: - return is_dropped_from_state(self._legacy_grip_state, self._ever_gripped) - if self._grip_aperture is None or self._last_aperture is None: - # 没有开口读数(老固件/别的夹爪不给 position):退回旧判据。 - # 它确实会抖,但比"永远判不了掉件"好 —— 而且这种情况本身会 - # 在 S00 的自检里被 `position` 相关检查点到。 - return self._last_gripped is False - return ( - float(self._grip_aperture) - float(self._last_aperture) - ) >= self.DROP_COLLAPSE_MM - - # -- 动作 ------------------------------------------------------------- - def _call( - self, client: Any, tag: str, timeout_s: float, - force_pct: Optional[float] = None, speed_pct: Optional[float] = None, - ) -> bool: - if client is None or not client.wait_for_service(timeout_sec=timeout_s): - self._node.get_logger().error(f"夹爪服务 {tag} 不在(后端 {self.backend})") - return False - if self.backend == "contract": - req: Any = GripperExecute.Request() - req.command.command = tag - # 力/速度只对**契约后端**有效:真机今天的 dh_pgea 驱动是 - # std_srvs/Trigger(只有开/合两个动作,力与速度在驱动侧配), - # 所以那两个键在真机上不起作用 —— 这是保留下来的规格差异, - # 文档里已写明,不要以为"填了没效果"是 bug。 - if force_pct is not None: - req.command.force = float(force_pct) - if speed_pct is not None: - req.command.speed = float(speed_pct) - else: - req = Trigger.Request() - fut = client.call_async(req) - t0 = time.monotonic() - while not fut.done() and time.monotonic() - t0 < timeout_s: - self._node._spin(0.02) - if not fut.done(): - self._node.get_logger().error(f"夹爪 {tag} 超时 {timeout_s:.1f}s") - return False - try: - resp = fut.result() - except Exception as exc: # noqa: BLE001 - self._node.get_logger().error(f"夹爪 {tag} 调用异常:{exc}") - return False - ok = bool(getattr(resp, "success", True)) - if not ok: - self._node.get_logger().error( - f"夹爪 {tag} 失败:{getattr(resp, 'message', '(无消息)')}" - ) - return ok - - def open(self, timeout_s: float = 5.0) -> bool: - if self._node.cfg.dry_run: - self._node.get_logger().info("[干跑] 夹爪张开") - return True - return self._call(self._open_cli, "open", timeout_s) - - def close(self, timeout_s: float = 5.0) -> bool: - if self._node.cfg.dry_run: - self._node.get_logger().info("[干跑] 夹爪夹紧") - return True - return self._call( - self._close_cli, "close", timeout_s, - force_pct=self._node.cfg.screw_grip_force_pct, - speed_pct=self._node.cfg.screw_grip_speed_pct, - ) - - -class GaugeAssembly(AssemblyPipeline): - """S00–S11 的执行器:状态机的每一步在这类里实现。 - - 继承 :class:`~arm_application.pipeline_node.AssemblyPipeline` 是为了复用 - 已经调通的**跟踪拉起/停止**(``_run_stage1``/``_stop_stage1``/``_track_z``) - 与整条 stage2 定位链(``_run_locate``)—— 这些是阶段式流水线的公共骨架, - 抄一份只会让"改了 A 忘了改 B"变成常态(规则 M2)。 - """ - - #: 状态 → 处理方法名。**顺序即流程**,与 gauge_fsm.TRANSITIONS 一一对应。 - _STEPS: Dict[State, str] = { - State.BOOT: "_step_boot", - State.HOME_EXTREME: "_step_home_extreme", - State.GRIP_CHECK: "_step_grip_check", - State.COARSE: "_step_coarse", - State.TRACK: "_step_track", - State.SNAP: "_step_snap", - State.HOVER_K: "_step_hover_k", - State.CONTACT: "_step_contact", - State.SCREW_IN: "_step_screw_in", - State.UNSCREW: "_step_unscrew", - State.NEXT_HOLE: "_step_next_hole", - State.RESET: "_step_reset", - } - - def __init__(self, node_name: str = "gauge_assembly") -> None: - super().__init__(node_name=node_name) - - self.declare_parameter("dry_run", False) - self.declare_parameter("holes_total", -1) # >0 覆盖 site - self.declare_parameter("gripper_backend", "auto") # auto|contract|legacy - # 结论落盘路径。**为什么要落盘**:`ros2 launch` 在 Humble 下**恒定退出码 0** - # (实测:子进程 exit 3,ros2 launch 仍返回 0),所以包一层脚本时 - # `$?` 判不出成败 —— 自动化里会把"流程失败"记成"成功"。结论文件是唯一 - # 能被脚本/CI 读到的东西,由 run_gauge_assembly.sh 传入并读回。 - self.declare_parameter("result_file", "/tmp/gauge_assembly_result.json") - # 眼在手外标定产物的**确切路径**,由 launch 按 site.yaml 派生后传入 - # (`<臂号>_<相机>_eye_to_hand.yaml`)。为什么不让节点自己拼: - # "臂号 = SN 末两位"这条口径只有 export_site_env 一处实现,节点再写一遍 - # 必然漂移;而漂移的症状是"标定做完了、S03 却找不到文件",回退到 S04 跟踪, - # 看起来像跟踪的问题。留空则退回下面那串候选名(兼容旧命名/仿真)。 - self.declare_parameter("coarse_eye_to_hand_file", "") - - site = load_site_dict() - # robots[].gauge_assembly 覆盖全局段 —— 与 servo / paths / perception 同一套规矩。 - # 为什么必须有这条(2026-09-24):几何类参数是**按台子**的。 - # `workpiece_surface_z_m` 在仿真里是 0.412(仿真臂站在地面、台面 0.40m 高), - # 真机是 0.012(基座与台面同高)。写死全局值的话,S07 的 - # "悬停时工具尖端离面多高"自检会算错 —— 而现象是"一路下压判不到接触", - # 看起来像力阈值标歪了,排查会从阈值开始走偏。 - _robot = self._robot_dict(site) - if isinstance(_robot.get("gauge_assembly"), dict): - site = dict(site) - site["gauge_assembly"] = deep_merge( - site.get("gauge_assembly") or {}, _robot["gauge_assembly"] - ) - overrides: Dict[str, Any] = {} - if bool(self.get_parameter("dry_run").value): - overrides["dry_run"] = True - holes = int(self.get_parameter("holes_total").value) - if holes > 0: - overrides["holes_total"] = holes - # 工具长:仿真里由启动脚本传**实测值**(上料脚本刚量的),真机不传(走 site)。 - # 为什么必须能覆盖:这个值决定悬停高度与 S07 下探预算,而仿真里规会在指间 - # 下滑到落座位置、下滑量随装夹变化(实测见过 243 / 254mm,差 11mm)。 - # 差 11mm 的后果见 gauge_fsm.hover_z_guard / drag_verdict 的说明。 - tool_len = float(self.get_parameter("tool_tip_below_flange_m").value) - if tool_len > 0.0: - overrides["tool_tip_below_flange_m"] = tool_len - try: - self.cfg: GaugeConfig = from_site(site, overrides=overrides or None) - except GaugeConfigError as exc: - raise GaugeAbort(f"gauge_assembly 配置有问题:\n{exc}", code=3) from exc - - self._site = site - self._warn_if_section_missing(site) - - # ---- 自检清单(纯内容 + 本机名字)---- - self._gripper_prefer = str(self.get_parameter("gripper_backend").value or "auto") - # robots[] 里的 tool_name 优先(一台机器一个工具),没有就用全局 robot.tool_name - self.tool_name = str( - self._robot_dict(site).get("tool_name") - or (site.get("robot") or {}).get("tool_name") or "" - ) - self._weights = str((site.get("paths") or {}).get("yolo_weights") or "") - # 夹爪后端要按"服务实际类型"选,所以放到 S00 里做(此时才知道服务在不在) - self._boot_results: List[Tuple[BootCheck, bool, str]] = [] - - self._warn_if_sim_time_missing() - - # ---- 状态机 ---- - self.fsm = GaugeFsm(GaugeContext(holes_total=self.cfg.holes_total)) - self.grip: Optional[GripperClient] = None - self._coarse_ok = False - self._track_retries = 0 - self._snap_final: Dict[str, Any] = {} - self._snap_pose: Optional[np.ndarray] = None - self._gauge_was_gripped = False - self._axis_verified = False - #: E1(掉件)重放:S08 报掉件后置位,S01 走完要等人工放好并确认 - self._e1_pending = False - self._reload_ok = False - - # ---- 手外相机(S03 粗定位):stage2 只订阅腕部相机,这里自己订一份 ---- - # 只订不驱动:S03 是兜底路径,平时不读它的帧,不能因为"手外相机没插" - # 就影响主流程(所以 S00 里它只是选检)。 - self._coarse_color: Optional[Image] = None - self._coarse_depth: Optional[Image] = None - self._coarse_info: Optional[CameraInfo] = None - self._coarse_ns = self._d435_ns(site) - # 手外相机名的**唯一数据源**是 site.yaml 的 cameras 注册表(上面那行)。 - # 配置段里的 gauge_assembly.coarse_camera 是"注册表里没登记手外相机"时的 - # 兜底;两者不一致时以注册表为准,但要**出声** —— 否则改了一处没改另一处, - # 表现是"话题在发、S03 却拿到另一台相机/另一个 frame",静默错。 - if self._coarse_ns and self.cfg.coarse_camera != self._coarse_ns: - self.get_logger().warn( - f"手外相机名不一致:cameras 注册表说 {self._coarse_ns}," - f"gauge_assembly.coarse_camera 写的是 {self.cfg.coarse_camera}。" - f"以注册表为准({self._coarse_ns})。" - "site.yaml 里那处可以删掉了(留着只会误导下一个人)" - ) - # GaugeConfig 是 frozen 的:要改只能造一个新的(replace)。 - # 直接赋值会抛 FrozenInstanceError,而且是在 __init__ 里 —— - # 表现为"节点起不来",看不出跟相机名有关。 - self.cfg = dataclasses.replace(self.cfg, coarse_camera=self._coarse_ns) - #: 各相机的**收到时刻**(单调钟)。判"有没有活的数据"用它,不用 - #: header.stamp —— 两者可能不在同一个时钟域(见 `_img_age` 的注释)。 - self._t_color: Optional[float] = None - self._t_coarse_color: Optional[float] = None - self._skew_warned = False - if self._coarse_ns: - img_t, info_t = resolve_realsense_topics(self._coarse_ns, image_topic="") - # QoS 必须用 sensor data(BEST_EFFORT):RealSense 驱动发的是 - # BEST_EFFORT,而 create_subscription 的默认是 RELIABLE —— - # 不匹配时一条消息都收不到,日志里只有一条容易忽略的 - # "offering incompatible QoS" 警告,表现为"相机明明在跑却没图像"。 - self.create_subscription( - Image, img_t, self._on_coarse_color, qos_profile_sensor_data - ) - self.create_subscription( - CameraInfo, info_t, self._on_coarse_info, qos_profile_sensor_data - ) - self.create_subscription( - Image, f"/{self._coarse_ns}/aligned_depth_to_color/image_raw", - self._on_coarse_depth, qos_profile_sensor_data, - ) - - # 人工确认话题:E1 重放时,操作员放好新规后发一条 true - # ros2 topic pub -1 /gauge/reload_ok std_msgs/Bool '{data: true}' - # 用话题而不是服务:一条命令就能发(不必等回包),现场手忙脚乱时更稳。 - self.create_subscription(Bool, "/gauge/reload_ok", self._on_reload_ok, 1) - - # ---- 发布 ---- - self._result_file = str(self.get_parameter("result_file").value or "") - self._result_written = False - self._gauge_state_pub = self.create_publisher(String, "/gauge/state", 10) - self._gauge_result_pub = self.create_publisher(String, "/gauge/result", 10) - self._gauge_progress_pub = self.create_publisher(String, "/gauge/progress", 10) - self._robot_description: Optional[str] = None - self.create_subscription( - String, "/robot_description", self._on_robot_description, - QoSProfile( - depth=1, durability=DurabilityPolicy.TRANSIENT_LOCAL, - reliability=ReliabilityPolicy.RELIABLE, - ), - ) - - self.get_logger().info( - f"通止规装配 arm={self.prefix.rstrip('_')} " - f"孔数={self.cfg.holes_total} 干跑={self.cfg.dry_run} " - f"工具系={self.tool_name or '(未配置)'} 手外相机={self._coarse_ns or '(无)'}" - ) - for line in self.cfg.describe(): - self.get_logger().info(line) - - # ===================================================================== - # 小工具 - # ===================================================================== - def _warn_if_section_missing(self, site: Dict[str, Any]) -> None: - """整段缺失时明确告警:默认值只是起点,不是调好的参数。""" - if not site.get("gauge_assembly"): - self.get_logger().warn( - "site.yaml 里没有 gauge_assembly: 段 —— 全部走默认值。" - "力阈值类参数必须现场标定,见 config/site.example.yaml 的同名段" - ) - - def _robot_dict(self, site: Dict[str, Any]) -> Dict[str, Any]: - sn = str(self.get_parameter("robot_sn").value or "").strip() - for r in (site.get("robot") or {}).get("robots") or []: - if isinstance(r, dict) and str(r.get("sn") or "").strip() == sn: - return dict(r) - return {} - - def _d435_ns(self, site: Dict[str, Any]) -> str: - """手外相机的命名空间:``role: overhead*`` 且**属于当前这台臂**的那一个。 - - 规则(三级收敛)的**唯一实现**在 ``site_io.overhead_camera``——手眼标定 - 脚本也用它取相机名。这里只负责把"配置没区分开"这件事**出声**:静默取第一台 - 会让"标定用的相机"和"推理用的相机"悄悄不是同一台。 - """ - cfg, others = overhead_camera(site, self._robot_dict(site)) - if others: - names = ", ".join([str(cfg.get("name") or "?")] + others) - self.get_logger().warn( - f"有 {len(others) + 1} 台手外相机都符合当前臂({names})—— 取第一个," - "但请给 site.yaml 的 cameras.* 补上 arm 字段区分,否则选哪台看运气" - ) - return str(cfg.get("name") or "").strip("/") - - def _eye_to_hand_file(self) -> Optional[Path]: - """找手外相机的手眼文件。没有就返回 None(调用方据此给出**怎么生成**)。 - - 规则(候选顺序 + 按仓库根解析)只有一份,在 ``site_io.resolve_eye_to_hand_file``。 - 这里只负责把 launch 传入的确切路径和当前手外相机名交给它。 - """ - return resolve_eye_to_hand_file( - ros2_root(), - explicit=str(self.get_parameter("coarse_eye_to_hand_file").value or ""), - camera_name=self.cfg.coarse_camera, - ) - - def _on_robot_description(self, msg: String) -> None: - self._robot_description = str(msg.data) - - def _on_reload_ok(self, msg: Any) -> None: - if bool(msg.data): - self._reload_ok = True - - def _on_color(self, msg: Image) -> None: - # 腕部相机:父类(stage2)负责存帧,这里只补"收到时刻"并顺带查时钟域。 - super()._on_color(msg) - self._t_color = time.monotonic() - self._note_stamp_skew(msg, "腕部相机") - - def _on_coarse_color(self, msg: Image) -> None: - self._coarse_color = msg - self._t_coarse_color = time.monotonic() - self._note_stamp_skew(msg, "手外相机") - - def _on_coarse_depth(self, msg: Image) -> None: - self._coarse_depth = msg - - def _on_coarse_info(self, msg: CameraInfo) -> None: - self._coarse_info = msg - - def _hole_name(self) -> str: - """孔名 k1/k2/...。直接用状态机的,别在节点里再实现一遍(规则 M2)。""" - return self.fsm.ctx.hole_name() - - def _img_age(self, t_recv: Optional[float]) -> float: - """图像从**收到的那一刻**到现在过了多久 [s];从没收到返回 1e9。 - - 为什么不用 `header.stamp`(原来就是那么写的,出过事): - 节点时钟和消息时钟可能是**两个时钟域** —— 仿真里忘了 `use_sim_time` - 时,`/clock` 从 0 开始、节点却用系统时间,于是"按时间戳算年龄"会算出 - `1790217444.7s` 这种数,把"图像 13Hz 好好地流着"报成 - "腕部相机无数据",而人只会去怀疑相机。收到时刻用单调钟记, - 与两个时钟域都无关,判"有没有活数据"永远是对的。 - """ - if t_recv is None: - return 1e9 - return max(0.0, time.monotonic() - t_recv) - - def _stamp_skew(self, msg: Image) -> Optional[float]: - """消息时间戳与节点时钟的差 [s];取不到时间戳返回 None。""" - try: - stamp = float(msg.header.stamp.sec) + float(msg.header.stamp.nanosec) * 1e-9 - except Exception: # noqa: BLE001 - return None - return self.get_clock().now().nanoseconds * 1e-9 - stamp - - def _note_stamp_skew(self, msg: Image, where: str) -> None: - """时钟域不一致时说一次,别每帧都刷。 - - > 1 小时就认为是两个时钟域(仿真差的是整段时间基准, - > 不可能只差几十秒;真机上的时延是毫秒级)。 - """ - if self._skew_warned: - return - skew = self._stamp_skew(msg) - if skew is None or abs(skew) < 3600.0: - return - self._skew_warned = True - self.get_logger().warn( - f"{where}的时间戳与节点时钟差 {skew:.0f}s:**不是数据问题,是时钟域不同**。" - "仿真里给本节点加 use_sim_time:=true(run_gauge_assembly.sh --sim 已带)。" - "不修的话 TF 查询也会全线失败 —— 因为 TF 是按时间戳比对的。" - ) - - def _warn_if_sim_time_missing(self) -> None: - """看起来在仿真里,却没开 use_sim_time → 出声(否则症状极难定位)。 - - `/clock` 有发布者 = 有人在做仿真(真机上没有 `/clock`)。这时如果 - `use_sim_time` 还是 false,所有 header.stamp 比对、TF lookup 都会错, - 而报出来的却是"相机没数据""TF 查不到"这类**假原因**。 - """ - if bool(self.get_parameter("use_sim_time").value): - return - try: - n = self.count_publishers("/clock") - except Exception: # noqa: BLE001 - return - if n > 0: - self.get_logger().warn( - "检测到 /clock 有发布者(在仿真里),但本节点 use_sim_time=false:" - "时间戳比对与 TF 查询都会失败。请加 use_sim_time:=true" - "(scripts/run_gauge_assembly.sh --sim 会自动带)。" - ) - - def _state(self, s: str) -> None: # 覆盖:三阶段的状态话题 + 本流程的 - super()._state(s) - msg = String() - msg.data = s - self._gauge_state_pub.publish(msg) - - def _progress(self, text: str) -> None: - msg = String() - msg.data = text - self._gauge_progress_pub.publish(msg) - - def _publish_gauge_result(self, payload: Dict[str, Any]) -> None: - payload = dict(payload) - payload["fsm"] = [str(step) for step in self.fsm.history] - payload["hole_names"] = [f"k{i + 1}" for i in range(self.cfg.holes_total)] - # 先落盘再发话题:落盘是**给脚本/CI 读**的(话题在进程退出后就没了), - # 顺序反过来的话,"话题发出去了、文件还没写完就被杀掉"会让脚本读不到结论。 - self._write_result_file(payload) - msg = String() - msg.data = json.dumps(payload, ensure_ascii=False) - self._gauge_result_pub.publish(msg) - - def _write_result_file(self, payload: Mapping[str, Any]) -> None: - """把结论写到 ``result_file``(原子写:临时文件 + rename)。""" - if not self._result_file: - return - path = Path(self._result_file) - try: - path.parent.mkdir(parents=True, exist_ok=True) - tmp = path.with_suffix(path.suffix + ".tmp") - tmp.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") - tmp.replace(path) - except OSError as exc: - # 写不了不要拖垮流程,但**必须**说出来(否则脚本只会看到"文件不存在") - self.get_logger().error(f"结论文件写不了({path}):{exc}") - return - self._result_written = True - - def _wait_joint_limits(self, timeout_s: float = 3.0) -> Optional[Tuple[float, float]]: - """拿关节7的限位(从 ``/robot_description``)。拿不到返回 None。""" - t0 = time.monotonic() - while self._robot_description is None and time.monotonic() - t0 < timeout_s: - self._spin(0.05) - if not self._robot_description: - self.get_logger().warn( - "拿不到 /robot_description —— S01 不做限位夹取," - "改为靠驱动器限位报错兜底(真撞上时报 JOINT_LIMIT,流程继续)" - ) - return None - limits = parse_joint_limits(self._robot_description) - got = match_limits(limits, [self.joint_names[-1]]) - if got is None: - self.get_logger().warn( - f"/robot_description 里找不到 {self.joint_names[-1]} 的限位" - f"(解析到 {len(limits)} 个关节)—— 同样不做夹取" - ) - return got - - # ===================================================================== - # S00 自检 - # ===================================================================== - def _boot_checks(self) -> List[BootCheck]: - # 状态话题随后端不同;这里先按"契约"建,S00 内部按**真实服务类型**修正 - return build_checks( - joint_action=str(self.get_parameter("action_name").value), - camera=self._wrist_cam_ns(), - tactile_topic=str( - ((self._site.get("tactile") or {}).get("topic_left")) - or "/tactile/left/status" - ), - gripper_open="/gripper/open", - gripper_close="/gripper/close", - gripper_status=CONTRACT_STATUS_TOPIC, - gripper_status_type="arm_msgs/msg/GripperStatus", - d435_camera=self._coarse_ns or None, - tool_name=self.tool_name, - weights_path=self._weights, - perception_source=self._perception_source(), - ) - - def _perception_source(self) -> str: - """感知来源(site.yaml 顶层 perception.source,按当前臂覆盖后);未知值报错。 - - 两件事在这里必须做对: - - 1. **按当前臂覆盖**:本节点读的是文件里的原始 site.yaml,机器人级 - 覆盖(``robots[].perception.source``)要自己合进来 —— 仿真那条 - ``source: truth`` 就写在 robots[`sim`] 下。忘了合的表现是 - "仿真里明明配了 truth,S00 还是去查 ultralytics"。 - 2. **只有一处读它**:launch 文件(决定起哪个感知节点)和 S00(决定查 - 不查推理依赖)必须看同一个值,否则输出会自相矛盾。 - """ - robot = self._robot_dict(self._site) - return perception_source_of( - deep_merge(self._site.get("perception") or {}, robot.get("perception") or {}) - ) - - def _wrist_cam_ns(self) -> str: - """腕部相机命名空间(``d405_left``)。以 site 的 robots[].camera.name 为准。""" - robot = self._robot_dict(self._site) - cam = deep_merge(self._site.get("camera") or {}, robot.get("camera") or {}) - return str(cam.get("name") or "d405").strip().strip("/") - - def _service_snapshot( - self, names: Iterable[str] = () - ) -> Dict[str, List[str]]: - """等服务发现稳定下来,再取服务表。 - - 为什么不能"查一次就算":`get_service_names_and_types()` 返回的是 - **当前已发现** 的那部分图。本节点是刚加入 DDS 的新参与者,起来那一瞬间 - 别人的服务很可能还没被发现 —— 于是"服务明明在"被判成"名字不在图上", - 同一份代码时好时坏。实测现场:仿真栈全绿时 S00 仍报 `/home`、 - `/set_named_pose`、`/gripper/status` 缺失,而 2 秒后手工 `ros2 service list` - 三个都在。这类"看起来像配置错"的抖动最难查,所以这里等到名字齐了再返回。 - - 等待期间必须 **spin**:发现事件要靠执行器回调处理,`time.sleep()` 只是干等。 - """ - want = {n for n in names if n} - deadline = time.monotonic() + max(0.5, min(5.0, self.cfg.boot_timeout_s)) - snap: Dict[str, List[str]] = {} - while True: - snap = dict(self.get_service_names_and_types()) - if not (want - set(snap)): - return snap - if time.monotonic() >= deadline: - return snap - self._spin(0.2) - - def _probe(self, item: BootCheck) -> Tuple[bool, str]: - """执行一项自检。返回 ``(就绪, 细节)``。""" - if item.probe == "service": - found = self._service_snapshot([item.target]).get(item.target) - if found is None: - return False, "名字不在图上" - if item.expect_type and item.expect_type not in found: - # 类型不符**不算就绪**:这正是"服务在但接不上"的现场 - return False, f"类型是 {list(found)},期望 {item.expect_type}" - return True, "" - - if item.probe == "action": - # 这套 rclpy **没有** get_action_names_and_types()(实测缺这个方法), - # 所以 action 只能"建客户端 + wait_for_server"来探。这样反而更实在: - # 名字在图上但服务端没起来(DDS 端点未匹配)也能查出来。 - return self._probe_action(item) - - if item.probe == "detector": - p = Path(item.target) - if not p.is_file(): - return False, f"文件不存在:{p}" - sidecar = p.with_suffix(".labels.yaml") - if not sidecar.is_file(): - return False, f"缺标签文件 {sidecar.name}(weights.sh doctor 可查)" - # 文件在 ≠ 能推理:缺 torch/ultralytics 时这里必须失败, - # 否则会一路跑到 S04 才以"跟踪没锁定"的形式暴露(见 gauge_boot 的注释)。 - miss = missing_modules() - if miss: - return False, dependency_advice(miss) - return True, f"{p.name} + {sidecar.name}" - - # topic / tactile / camera:**要真收到消息**才算就绪。 - # 只看 topic list 是假阳性来源(话题在、没数据),run_all.sh 里踩过。 - deadline = time.monotonic() + min(10.0, self.cfg.boot_timeout_s) - while time.monotonic() < deadline: - detail = self._peek_topic(item) - if detail is None: - return True, "" - # 必须 **spin** 而不是 sleep:订阅回调只在 executor 转起来时才被调用, - # `time.sleep()` 期间一条消息都进不来。这个坑的现场是"相机/触觉/夹爪 - # 明明都在发数据,S00 却逐项报缺失"(真机和仿真都会中招), - # 而人只会去怀疑硬件。 - self._spin(0.2) - return False, detail or "等不到消息" - - def _probe_action(self, item: BootCheck) -> Tuple[bool, str]: - """探测 action 服务端是否可连。""" - from rosidl_runtime_py.utilities import get_interface - - if not item.expect_type: - return False, "清单里没写期望的 action 类型,无法探测" - try: - cls = get_interface(item.expect_type) - except Exception as exc: # noqa: BLE001 - return False, f"接口类型 {item.expect_type} 解析失败:{exc}" - # 已经建好的 JTC 客户端优先复用(stage2 的 self._cli 就是它)。 - # 比较前两边都要规范化:清单里的目标被补成了绝对名(``/foo``),而 - # 参数默认值是相对的(``foo``)—— 直接比会不相等,于是这里再建一个 - # **同名的** action 客户端,FastRTPS 会以"同话题名不同类型"报错, - # 报出来的是 create_client 失败,看不出真正原因是漏了一次规范化。 - if abs_name(item.target) == abs_name( - str(self.get_parameter("action_name").value) - ): - ok = self._cli.wait_for_server(timeout_sec=2.0) - return (True, "") if ok else (False, "action 服务端未就绪(wait_for_server 超时)") - from rclpy.action import ActionClient - - cli = ActionClient(self, cls, item.target) - ok = cli.wait_for_server(timeout_sec=2.0) - cli.destroy() - return (True, "") if ok else (False, "action 服务端未就绪(wait_for_server 超时)") - - def _peek_topic(self, item: BootCheck) -> Optional[str]: - """看一眼该话题最近有没有**真数据**。``None`` = 就绪,否则返回原因。 - - 为什么每种都要单独判:`topic list` 里有名字 ≠ 有数据。发布者没起、 - 相机没插、驱动崩了,名字都还在。按名字判会在最需要它的时候(S07 要 - 停力、S08 要判拧紧)才发现没数据。 - """ - if item.probe == "camera": - coarse = self._coarse_ns and f"/{self._coarse_ns}/" in item.target - msg = self._coarse_color if coarse else getattr(self, "_color", None) - t_recv = self._t_coarse_color if coarse else self._t_color - if msg is None or t_recv is None: - return "还没收到图像(发布者不在?)" - # 时钟域不对时**必须说清**:否则同一现象有两种完全不同的原因, - # 而报出来的话术会把人引到错的方向(先查这个,再查数据)。 - skew = self._stamp_skew(msg) - if skew is not None and abs(skew) > 3600.0: - return ( - f"图像时间戳与节点时钟差 {skew:.0f}s:数据在流,是**时钟域**不同 —— " - "仿真里要给节点 use_sim_time:=true(不加的话 TF 也会查不到)" - ) - age = self._img_age(t_recv) - if age > 3.0: - return f"最后一帧已过期 {age:.1f}s" - return None - if item.probe == "tactile": - for tac in (getattr(self, "_tac_l", None), getattr(self, "_tac_r", None)): - if not tac: - continue - t, m = tac - if time.monotonic() - t < 0.5 and bool(getattr(m, "connected", False)): - return None - return "触觉无新鲜帧或 connected=false" - if "camera_info" in item.target: - info = self._coarse_info if (self._coarse_ns and self._coarse_ns in item.target) else getattr(self, "_info", None) - if info is None: - return "没收到内参" - return None - if "gripper" in item.target: - if self.grip is None: - return "夹爪客户端未建立" - if not self.grip.seen(): - return "没收到夹爪状态帧(服务在、反馈不在)" - return None - return None - - def _step_boot(self) -> Event: - """S00:全部必检就绪才开指令窗。""" - self._state("S00_boot") - try: - checks = self._boot_checks() - except ValueError as exc: - # 配置错(例如 perception.source 拼错)在这里拦下:继续跑下去只会在 - # S04 以"一阶段不锁定"的形式暴露,那时没人会想到是自检配置写错了。 - self.get_logger().error(f"S00 自检清单建不起来(配置有问题):{exc}") - return Event.BOOT_FAIL - src = self._perception_source() - if src != "yolo": - self.get_logger().info( - f"S00 自检:感知来源 perception.source = {src} —— 不查推理依赖" - + ("(仿真真值节点随 S04 的 visual_servo 一起起)" if src == "truth" - else "(测量由外部节点按 visual_servo/filtered_point 提供)") - + ";它只验控制与接口,不验检测算法" - ) - - # 夹爪后端:按**服务类型**选(真机 Trigger / 契约 GripperExecute)。 - # 选不出来时把这条也算成一项必检失败,而不是抛异常中断整段日志。 - backend_detail = "" - try: - # 夹爪后端按"服务实际类型"选:同样要等发现齐了(见 _service_snapshot)。 - # 两种后端都有 /gripper/open、/gripper/close,等这两个就够。 - choice = pick_backend( - self._service_snapshot(["/gripper/open", "/gripper/close"]), - self._gripper_prefer, - ) - for line in describe_backend_choice(choice): - self.get_logger().info(line) - self.grip = GripperClient(self, choice.backend, choice.status_topic) - checks = [ - c if c.key != "gripper_status" - else BootCheck( - key=c.key, label=c.label, probe=c.probe, target=choice.status_topic, - why=c.why, required=c.required, - expect_type=( - "arm_msgs/msg/GripperStatus" - if choice.backend == "contract" else "std_msgs/msg/Float32MultiArray" - ), - ) - for c in checks - ] - except GripperInterfaceError as exc: - backend_detail = str(exc) - self.get_logger().error(f"夹爪后端无法确定:{exc}") - - # 相机 / 触觉的"真收到消息"探测要先起订阅(stage2/stage3 的 __init__ 已订阅) - results: List[Tuple[BootCheck, bool, str]] = [] - for item in checks: - ok, detail = self._probe(item) - results.append((item, ok, detail)) - - if backend_detail: - # 把"选不出夹爪后端"作为一条必检失败并入报告:一条日志一次看完 - blocker = BootCheck( - key="gripper_backend", label="夹爪后端可确定", probe="service", - target="/gripper/open", why=backend_detail, - ) - results.append((blocker, False, "见上面的详细原因")) - - text, _failures = format_report(results) - for line in text.splitlines(): - self.get_logger().info(line) - counts = summary_counts(results) - self.get_logger().info( - f"S00 摘要:必检 {counts['required_ok']}/{counts['required_total']}," - f"选检 {counts['optional_ok']}/{counts['optional_total']}" - ) - for line in optional_warnings(results): - self.get_logger().warn(line) - self._boot_results = results - - blockers = blocking_failures(results) - if blockers: - for line in blockers: - self.get_logger().error(line) - if self.cfg.dry_run: - self.get_logger().warn( - "干跑模式:自检没过也继续(只为验证编排与配置,不会真的动臂)" - ) - return Event.BOOT_OK - self._publish_gauge_result({"ok": False, "state": "S00", "failures": blockers}) - return Event.BOOT_FAIL - # 记"夹住时的开口"(掉件判据的基准)。**放在这里而不是等到 S08**: - # · 此刻爪里确实夹着规(仿真上料脚本刚装好,真机是人工装好才开始跑); - # · 基准必须是**明确知道夹住**时记的 —— 本后端的 is_gripped 是全开时 - # 都会闪 True 的推断值(实测 99.29mm),拿它当基准会造出假 E1 - # (见 GripperClient.dropped)。 - if self.grip is not None: - self.grip.adopt_current_grip("S00 自检通过:爪里已装好通止规") - return Event.BOOT_OK - - # ===================================================================== - # S01 回 home + 逆时针极限角 - # ===================================================================== - def _step_home_extreme(self) -> Event: - self._state("S01_home_extreme") - if self.cfg.dry_run: - self._fsm_dry(Event.POSE_OK, "回 home + 逆时针预绕") - return Event.POSE_OK - - if not self._call_trigger("/home", timeout_s=60.0): - return Event.TIMEOUT - - # 工具系:要求 tool1 垂直向下且位姿锁定。切不过去就不继续 —— - # 后面每个动作的"工具系"含义都建立在它上面。 - if self.tool_name: - if not self._switch_tool(self.tool_name): - return Event.TIMEOUT - else: - self.get_logger().warn( - "site.yaml 里 robot.tool_name 为空 —— 未确认工具系。" - "看板要求 tool1 全程垂直向下并位姿锁定,请填上名字" - ) - - if self._e1_pending: - # E1 重放:先张开爪把残留放掉,再等人工放好新规。 - # 顺序不能反:先确认再张嘴,会把刚放好的规一起掉下去。 - if self.grip is not None and not self.grip.open(): - self.get_logger().error("E1 重放:张开爪失败,无法继续") - return Event.ABORT - if not self._wait_operator_reload(): - return Event.TIMEOUT - self._e1_pending = False - return Event.RELOADED - - q, Tee = self._wait_state(10.0) - if q is None or Tee is None: - self.get_logger().error("拿不到 joint_states/TF,S01 无法继续") - return Event.TIMEOUT - - # 垂直度:这是"工具系垂直向下"的可测版本(不是靠眼看画面) - tilt = vertical_down_error_deg(Tee[:3, :3]) - self.get_logger().info(f"S01 工具 Z 与垂直向下夹角 {tilt:.2f}(要求≈0)") - - want = self.cfg.extreme_angle_deg - if want <= 0.0: - return Event.POSE_OK - - limits = self._wait_joint_limits() - plan = prewind( - q_now_rad=float(q[-1]), want_deg=want, direction=self.cfg.extreme_direction, - limits=limits, margin_deg=self.cfg.extreme_margin_deg, - ) - if plan.clamped: - self.get_logger().info( - f"S01 预绕被限位夹取:想转 {plan.want_deg:.1f}°," - f"实际转 {plan.applied_deg:.1f}°(限位余量 {self.cfg.extreme_margin_deg:.1f}°)" - ) - return self._rotate_joint_and_verify( - plan.target_rad, tag="S01_extreme", fsm_event=Event.POSE_OK, - speed_deg_s=self.cfg.extreme_speed_deg_s, - ) - - def _wait_operator_reload(self) -> bool: - """E1 重放:等操作员放好通止规并确认。 - - 确认方式:``ros2 topic pub -1 /gauge/reload_ok std_msgs/Bool '{data: true}'`` - 超时(``gauge_assembly.reload_timeout_s``)→ False → 上层 TIMEOUT → 中止。 - 超时不是"再等等",而是"没人管" —— 臂停在 home,让人来处理比继续跑安全。 - """ - self._reload_ok = False - t0 = time.monotonic() - warn_at = self.cfg.reload_timeout_s * 0.5 - warned = False - self.get_logger().warn( - "E1 重放:请把通止规放回爪内并确认。确认命令:\n" - " ros2 topic pub -1 /gauge/reload_ok std_msgs/Bool '{data: true}'\n" - f" (最多等 {self.cfg.reload_timeout_s:.0f}s,超时按中止处理)" - ) - while time.monotonic() - t0 < self.cfg.reload_timeout_s: - self._spin(0.1) - if self._reload_ok: - self.get_logger().info("E1 重放:已确认,继续流程") - return True - if not warned and time.monotonic() - t0 > warn_at: - self.get_logger().warn("E1 重放:还在等确认(已过半程)") - warned = True - self.get_logger().error( - f"E1 重放:等了 {self.cfg.reload_timeout_s:.0f}s 没等到 /gauge/reload_ok,中止" - ) - return False - - def _call_trigger(self, name: str, timeout_s: float) -> bool: - """``std_srvs/Trigger`` 服务调用(home / 复位都用它)。""" - cli = self.create_client(Trigger, name) - if not cli.wait_for_service(timeout_sec=5.0): - self.get_logger().error(f"{name} 服务不在") - return False - fut = cli.call_async(Trigger.Request()) - t0 = time.monotonic() - while not fut.done() and time.monotonic() - t0 < timeout_s: - self._spin(0.05) - if not fut.done(): - self.get_logger().error(f"{name} 超时 {timeout_s:.0f}s") - return False - resp = fut.result() - if not bool(getattr(resp, "success", False)): - msg = str(getattr(resp, "message", "")) - if is_joint_limit_error(msg): - self.get_logger().warn(f"{name} 报关节极限(S01 视为预期):{msg}") - return True - self.get_logger().error(f"{name} 失败:{msg}") - return False - return True - - def _switch_tool(self, tool: str) -> bool: - from arm_msgs.srv import SwitchTool - - cli = self.create_client(SwitchTool, "/switch_tool") - if not cli.wait_for_service(timeout_sec=5.0): - self.get_logger().error("/switch_tool 服务不在 —— 无法确认工具系") - return False - req = SwitchTool.Request() - req.tool_name = tool - fut = cli.call_async(req) - t0 = time.monotonic() - while not fut.done() and time.monotonic() - t0 < 30.0: - self._spin(0.05) - if not fut.done(): - self.get_logger().error("切换工具系超时") - return False - resp = fut.result() - if not bool(getattr(resp, "success", False)): - self.get_logger().error(f"切换工具系失败:{getattr(resp, 'message', '')}") - return False - self.get_logger().info(f"工具系已切到 {tool}") - return True - - def _rotate_joint_and_verify( - self, target_rad: float, tag: str, fsm_event: Event, - speed_deg_s: Optional[float] = None, - ) -> Event: - """只动最后一根关节(= 绕工具 Z),**事后用 TF 量它真的转了**。 - - 为什么只动关节 7:工具轴垂直向下时,最后一根关节的轴就是工具 Z 轴, - 绕工具 Z 转 = 动这一根。好处是行程、速度、限位都是关节空间的量, - 不需要管笛卡尔姿态的插补。 - - 为什么必须量回来:如果这台臂的关节 7 轴与工具 Z 不共线(换了工具/ - 装了转接件就可能不共线),"转 180°"就变成了"绕某个斜轴转 180°", - 规会斜着磨螺纹 —— 而所有日志都显示"成功了"。 - """ - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - R_before = Tee[:3, :3].copy() - tool_z = R_before[:, 2].copy() - - delta_deg = math.degrees(target_rad - float(q[-1])) - speed = max(1.0, abs(speed_deg_s if speed_deg_s else self.cfg.extreme_speed_deg_s)) - dur = max(0.5, abs(delta_deg) / speed) - traj = JointTrajectory() - traj.joint_names = list(self.joint_names) - q_t = q.copy() - q_t[-1] = float(target_rad) - traj.points = [_joint_point(q, np.zeros(len(q)), 0.2), _joint_point(q_t, np.zeros(len(q)), dur)] - ok = self._send_action(traj, wait_s=dur + 8.0) - if not ok: - self.get_logger().warn(f"{tag}: JTC 未确认完成,按 TF 实测判断") - - time.sleep(0.3) - q2, Tee2 = self._wait_state(5.0) - if q2 is None or Tee2 is None: - return Event.TIMEOUT - got = rotation_about_axis_deg(R_before, Tee2[:3, :3], tool_z) - mis = axis_misalignment_deg(R_before, Tee2[:3, :3], tool_z) - self.get_logger().info( - f"{tag}: 目标 {delta_deg:+.1f}°,实测绕工具 Z {got:+.1f}°" - f"(转轴偏差 {mis:.1f}°,阈值 {AXIS_VERIFY_TOL_DEG:.1f}°)" - ) - verdict = rotation_verdict(delta_deg, got, mis, AXIS_VERIFY_TOL_DEG) - if verdict == ROT_LIMIT: - # 完全没动、或只走了一部分:都是**关节限位**把这段截住了 - # (2026-09-24 实测:棘轮回转每轮顶到上限 ±175°,于是下一步反向 - # 只剩 ~16° 余量)。交给调用方让余量重试(见 _ratchet_step); - # 调用方不处理时 FSM 会按未定义转移报错,不会静默走下去。 - self.get_logger().warn( - f"{tag}: 期望 {delta_deg:+.1f}°、实测 {got:+.1f}°" - f"(差 {abs(delta_deg) - abs(got):.1f}°)—— 判为**贴到关节限位**" - ) - return Event.JOINT_LIMIT - if verdict == ROT_AXIS: - self.get_logger().error( - f"{tag}: 转轴偏差 {mis:.1f}° 超过阈值 —— 关节7 轴与工具 Z 不共线," - "以『度』为单位的动作(S01/S08/S09)都不可信,中止。" - "先确认工具系是否垂直向下、有没有装转接件" - ) - return Event.ABORT - if verdict == ROT_SHORT: - self.get_logger().error( - f"{tag}: 期望 {delta_deg:+.1f}°、实测 {got:+.1f}°,偏差过大,中止" - ) - return Event.ABORT - self._axis_verified = True - return fsm_event - - def _ratchet_step( - self, target_rad: float, *, tag: str, fsm_event: Event, speed_deg_s: Optional[float], - direction: int = 0, - ) -> Event: - """棘轮的一步"转腕":行程不够时**张开爪让出余量**再转。 - - :param target_rad: 关节 7 的**目标角(绝对值)**,与 - :meth:`_rotate_joint_and_verify` 同一口径(那边算的就是 - ``target_rad - q_now``)。**不是增量。** - :param direction: 这一步的**工艺转向**:``+1`` 正转、``-1`` 反转、 - ``0`` 交给"最短路径"。棘轮的四步一律显式给:步长接近 180° 时 - "最短路径"会被 0.1° 的读数差翻方向(详见 - :func:`arm_application.gauge_fsm.ratchet_delta_rad`)。 - - ⚠️ 为什么要把口径写在这里(2026-09-24 栽过一次,S09 直接 ABORT): - 调用方(S08/S09)给的本来就是绝对值(``q[-1] ± screw_step_rad``), - 而本函数此前把它当**增量**用(``prewind(want_deg=abs(deg(target)))``、 - 让余量时又按 ``q - target`` 算新目标)。于是 S09 第一步被算成 - "要转 338.9°"(其实是目标 338.9°、增量只有 180°)⇒ 误判"行程不够" - ⇒ 让余量那一步算到限位**外面**(``158.9 − 338.9 = −180°``,比 - −175° 的限位还低 5°)⇒ 报"期望 −338.9°、实测 +26.0°,偏差过大" - ⇒ 整条流程在**最不该失败的一步** ABORT(规在爪里好好的、什么坏事都没发生)。 - 两个函数各用一种口径,编译器不会说话,日志还会把"目标"和"增量"都印成 - 一个数 —— 所以口径写进参数名和 docstring。 - - 为什么需要"让余量"这一步: - 棘轮要求"一正一反各 180°",而关节 7 的行程只有 ±175°(3.0543 rad)。 - 拧入(S08)的**回转**那一步每轮都正好顶到上限(实测 +175.1°), - 于是 S09 要做的**反方向**第一步只剩 ~16° 余量,被限位截住。 - 而这一轮其实什么坏事都没发生。 - - 为什么"让余量"是免费的: - 指间**张开**时规在打滑(这正是棘轮成立的原理),所以手腕空转既不会 - 把已经拧进去的螺纹转回去,也不会漏掉进度 —— 只是把行程重新分配。 - - 让多少:整步(不去算亏欠了多少)。反正张开状态下这一步不产生任何装配 - 效果,整步最省事也最不容易算错;重试时的那一步才是"用力"的那一步。 - - 两条路:**先算**(限位已知时,提前让余量,干净)+ **兜底**(真被限位 - 截住时再让,覆盖"限位没读到 / 轨迹自己没走完"这两种情况)。 - - 两条路**最后都汇到同一次让余量**:只有一次,避免"先算发现不够、 - 让完还不够、再让一次"这种把行程越绕越少的做法。 - """ - limits = self._wait_joint_limits() - q = None - if limits is not None: - q, _Tee = self._wait_state(3.0) - if q is None: - return Event.TIMEOUT - # 目标角可能落在限位**外面**(这正是棘轮要解决的问题),先折成"最近一圈" - # 的增量(gauge_fsm.ratchet_delta_rad,含完整说明与单测): - # 关节在 +158.9°、目标 +338.9° ⇒ 增量 +180°(而不是 +338.9°)。 - # **方向按工艺意图给**:步长贴着 180° 时"最短路径"会被读数差翻向(R2.10)。 - delta_rad = ratchet_delta_rad(target_rad, float(q[-1]), direction) - why = "" - if limits is not None and abs(math.degrees(delta_rad)) > 1e-6: - plan = prewind( - q_now_rad=float(q[-1]), want_deg=abs(math.degrees(delta_rad)), - direction=1 if delta_rad > 0 else -1, - limits=limits, margin_deg=RATCHET_LIMIT_MARGIN_DEG, - ) - if plan.clamped: - why = ( - f"行程不够(关节7 在 {math.degrees(float(q[-1])):+.1f}°," - f"这一步要转 {math.degrees(delta_rad):+.1f}°" - f"(目标 {math.degrees(float(target_rad)):+.1f}°),限位 " - f"{math.degrees(limits[0]):+.0f}~{math.degrees(limits[1]):+.0f}°)" - ) - if not why: - ev = self._rotate_joint_and_verify( - target_rad, tag=tag, fsm_event=fsm_event, speed_deg_s=speed_deg_s - ) - if ev is not Event.JOINT_LIMIT: - return ev - why = "轨迹被关节限位截住(算着够、实际没走完)" - return self._ratchet_rewind_then( - delta_rad, tag=tag, fsm_event=fsm_event, speed_deg_s=speed_deg_s, why=why, - ) - - def _ratchet_rewind_then( - self, delta_rad: float, *, tag: str, fsm_event: Event, - speed_deg_s: Optional[float], why: str, - ) -> Event: - """张开爪 → 反向让一步 → 夹紧 → 转原来那一步。 - - :param delta_rad: **要转的增量**(不是目标角,见 :meth:`_ratchet_step`)。 - 让余量时按它反着退一步,重试时再按它前进 —— 两次都以**当时的** - 关节角为基准重新算目标,所以让完余量后关节会回到原处、工具净转 - ``delta_rad``。把"目标"固定成一开始那个绝对值是错的:让完余量之后 - 那个目标已经在另一圈上了(差 360°)。 - """ - if self.grip is None: - self.get_logger().error(f"{tag}: {why},但没有夹爪客户端,无法让余量 → 中止") - return Event.ABORT - self.get_logger().info( - f"{tag}: {why} —— 张开爪让出一步(此刻规在打滑,不会动到螺纹)再转" - ) - if not self.grip.open(): - self.get_logger().error(f"{tag}: 需要张爪让余量,但开爪失败 → 中止") - return Event.ABORT - time.sleep(self.cfg.screw_release_wait_s) - q, _Tee = self._wait_state(3.0) - if q is None: - return Event.TIMEOUT - ev = self._rotate_joint_and_verify( - float(q[-1]) - delta_rad, tag=f"{tag}_rewind", - fsm_event=fsm_event, speed_deg_s=speed_deg_s, - ) - if ev is not fsm_event: - self.get_logger().error( - f"{tag}: 让余量那一步也没走开({ev})—— 关节7 的行程真用尽了,中止。\n" - f" 排查:site.yaml 的 gauge_assembly.screw_step_deg 太接近关节行程了" - f"(Rizon4 的关节7 是 ±175°),棘轮一步要 {math.degrees(abs(delta_rad)):.0f}°," - f"留给'回转'的余量本来就不够。\n" - f" 改法:把 screw_step_deg 调小(例如 120°),并保证 " - f"screw_max_cycles × screw_step_deg 仍是 **360° 的整数倍** —— " - f"累计必须转整数圈,否则规会停在螺纹中间(S09 拧出也就少转几分之一圈)。" - ) - return Event.ABORT - if not self.grip.close(): - self.get_logger().error(f"{tag}: 让完余量后夹紧失败 → 中止") - return Event.ABORT - # 重试目标**按让完余量后的位置重算**:让余量退了一步,原来那个绝对目标 - # 现在差了 360°(正好一整圈),照原样下发会让关节反向绕一圈回去。 - q2, _Tee2 = self._wait_state(3.0) - if q2 is None: - return Event.TIMEOUT - ev = self._rotate_joint_and_verify( - float(q2[-1]) + delta_rad, tag=f"{tag}_retry", - fsm_event=fsm_event, speed_deg_s=speed_deg_s, - ) - if ev is not fsm_event: - self.get_logger().error( - f"{tag}: 让完余量重试仍然没走到位({ev})—— 中止" - f"(不是限位问题,先查是不是有东西卡住/螺纹咬死)" - ) - return Event.ABORT - return fsm_event - - # ===================================================================== - # S02 夹持确认(预留) - # ===================================================================== - def _step_grip_check(self) -> Event: - self._state("S02_grip_check") - if not self.cfg.grip_check: - self.get_logger().info( - "S02 跳过夹持确认(预留:传感器方案在优化、D435 未标定)。" - "要开:site.yaml 的 gauge_assembly.grip_check: true" - ) - return Event.GRIP_SKIPPED - if self.grip is None: - return Event.GRIP_FAIL - time.sleep(self.cfg.grip_hold_s) - got = self.grip.is_gripped() - if got is None: - self.get_logger().error( - "S02 要求确认夹持,但当前夹爪后端给不出明确状态(状态字是运动中/到位)。" - "把夹爪合到咬住状态,或关掉 gauge_assembly.grip_check" - ) - return Event.GRIP_FAIL - if got: - self._gauge_was_gripped = True - self.get_logger().info("S02 确认:爪里夹着东西") - return Event.GRIP_PASS - self.get_logger().error("S02 判定爪里没有通止规 —— 请放好再跑") - return Event.GRIP_FAIL - - # ===================================================================== - # S03 手外粗定位(S04 的兜底) - # ===================================================================== - def _step_coarse(self) -> Event: - self._state("S03_coarse") - if not self.cfg.coarse_enabled: - self.get_logger().warn("S03 被配置关掉(gauge_assembly.coarse_enabled=false)") - return Event.COARSE_FAIL - ns = self.cfg.coarse_camera - he = self._eye_to_hand_file() - if he is None: - expect = str( - self.get_parameter("coarse_eye_to_hand_file").value or "" - ).strip() or f"handeye/results/{ns}_eye_to_hand.yaml" - self.get_logger().warn( - "S03 需要手外相机的 eye-to-hand 标定文件,现在没有 —— " - f"按兜底逻辑回 S04 跟踪。\n" - f" 应该生成:{expect}\n" - f" 做法:bash scripts/run_handeye.sh --mode eye_to_hand " - f"teach/merge/calibrate(标完再跑本流程)" - ) - return Event.COARSE_FAIL - if not self._wait_coarse_frame(ns): - self.get_logger().warn( - f"S03 相机 {ns} 等了 {self.cfg.coarse_timeout_s:.0f}s 没有新鲜图像" - "(相机没开?),回 S04 跟踪" - ) - return Event.COARSE_FAIL - - xy = self._coarse_workpiece_xy(ns, he) - if xy is None: - self.get_logger().warn("S03 推理没找到工件框(或深度无效),回 S04 跟踪") - return Event.COARSE_FAIL - - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - target = np.array([float(xy[0]), float(xy[1]), self.cfg.coarse_hover_m]) - self.get_logger().info( - f"S03 粗定位:工件中心 ({xy[0]:.3f},{xy[1]:.3f}) → 悬停 " - f"{self.cfg.coarse_hover_m * 1000:.0f}mm" - ) - ok, q, Tee = self._goto( - q, Tee, target, verticalize=True, tol_m=0.005, - tol_tilt=self.vert_tol_rad * 2.0, tag="coarse", - v=self.move_speed, max_hops=10, settle_s=0.25, - ) - if not ok: - self.get_logger().warn("S03 移动到粗定位点未完全到位,仍进 S05 精拍") - self._coarse_ok = True - return Event.COARSE_OK - - def _camera_alive(self, ns: str) -> bool: - return self._img_age(self._t_coarse_color) < 3.0 - - def _wait_coarse_frame(self, ns: str) -> bool: - """等手外相机的**新鲜**图像,最多 ``coarse_timeout_s`` 秒。 - - 为什么要等而不是"看一眼没有就放弃":相机节点刚起来时发现+第一帧 - 可能要一两秒,直接判失败会让 S03 在相机其实是好的情况下退回 S04。 - """ - t0 = time.monotonic() - while time.monotonic() - t0 < self.cfg.coarse_timeout_s: - if self._camera_alive(ns): - return True - self._spin(0.1) - return False - - def _coarse_workpiece_xy(self, ns: str, he: Path) -> Optional[Tuple[float, float]]: - """手外相机拍一张 → 推理工件框中心 → 反投影到基座 XY。 - - 外参从 **TF** 取(`base_link` ← `<相机>_color_optical_frame`),不再自己 - 解析一份 ``T_4x4``:标定产物已经在启动时以静态 TF 发布了,两份解析 - 必然先漂移一份(而漂移的是哪一份没人知道)。 - - 为什么先查标定文件再进来:没有 eye-to-hand 外参时,"反投影"只能靠 - 猜一个 depth 目标 —— 那会得到一个**看起来合理**的坐标(这正是最坏的 - 情形:动作做对了、位置错了)。所以宁可明确失败。 - """ - img = getattr(self, "_coarse_color", None) - depth_msg = getattr(self, "_coarse_depth", None) - intr = getattr(self, "_coarse_info", None) - if img is None or depth_msg is None or intr is None: - return None - depth = self._depth_from_msg(depth_msg) - if depth is None: - return None - intr_d = { - "fx": float(intr.k[0]), "fy": float(intr.k[4]), - "cx": float(intr.k[2]), "cy": float(intr.k[5]), - } - bgr = self._bgr_from_msg(img) - bbox = self._best_bbox(bgr, conf=self.cfg.coarse_conf) - if bbox is None: - return None - u = 0.5 * (bbox[0] + bbox[2]) - v = 0.5 * (bbox[1] + bbox[3]) - z = float(np.median(depth[int(v) - 2:int(v) + 3, int(u) - 2:int(u) + 3])) - if not math.isfinite(z) or z <= 0.05: - return None - p_cam = self._px_to_cam(u, v, z, intr_d) - T = self._lookup(f"{self.prefix}base_link", f"{ns}_color_optical_frame") - if T is None: - self.get_logger().warn( - f"S03 查不到 {ns}_color_optical_frame 到基座的 TF —— 标定文件 {he.name} " - "在,但没有发布成静态 TF(检查启动时有没有跑 handeye TF 那一步)" - ) - return None - p_base = (T @ np.array([p_cam[0], p_cam[1], p_cam[2], 1.0]))[:3] - return float(p_base[0]), float(p_base[1]) - - def _bgr_from_msg(self, msg: Any) -> np.ndarray: - """``sensor_msgs/Image`` → BGR ndarray(复用 stage2 的同一段解码)。""" - return _bgr_copy(msg) - - def _depth_from_msg(self, msg: Image) -> Optional[np.ndarray]: - """``sensor_msgs/Image``(16UC1) → 米为单位的深度图。""" - try: - arr = np.frombuffer(msg.data, dtype=np.uint16) - if msg.encoding.lower() in ("16uc1", "mono16"): - arr = arr.astype(np.float32) / 1000.0 - else: - arr = arr.astype(np.float32) - return arr.reshape((int(msg.height), int(msg.width))) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"深度图解码失败:{exc}") - return None - - # ===================================================================== - # S04 跟踪 - # ===================================================================== - def _step_track(self) -> Event: - self._state("S04_track") - if self.cfg.dry_run: - self._fsm_dry(Event.TRACK_LOCKED, "拉起跟踪并等锁定") - return Event.TRACK_LOCKED - if self._track_retries >= MAX_TRACK_RETRIES: - self.get_logger().error( - f"S04 已连续丢 {self._track_retries} 次(上限 {MAX_TRACK_RETRIES})," - "不再兜底重试 —— 检查工件是否在视野内、相机是否被挡、权重是否正确" - ) - return Event.ABORT - self._track_retries += 1 - code = self._run_stage1() - if code == 0: - self.get_logger().info(f"S04 跟踪锁定(第 {self._track_retries} 次尝试)") - return Event.TRACK_LOCKED - self.get_logger().warn(f"S04 跟踪未锁定(exit={code}),转 S03 兜底") - return Event.TRACK_LOST - - # ===================================================================== - # S05 稳定拍照 - # ===================================================================== - def _step_snap(self) -> Event: - self._state("S05_snap") - if self.cfg.dry_run: - self._fsm_dry(Event.SNAP_OK, "等画面稳定后精拍定位 k1/k2") - return Event.SNAP_OK - if not self._wait_pixel_stable(): - self.get_logger().warn( - f"S05 画面在 {self.cfg.snap_tol_px:.1f}px 容差内没稳定下来,继续等" - ) - return Event.SNAP_UNSTABLE - - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - code, q, Tee, final = self._run_locate(q, Tee) - if code != 0 or not final: - self.get_logger().error( - f"S05 精拍定位失败 code={code}{_LOCATE_CODE_HINT.get(code, '')}" - ) - return Event.TIMEOUT - self._snap_final = dict(final) - self._snap_pose = Tee.copy() - self.get_logger().info( - f"S05 定位完成:k1={final.get('k1_base_m')} k2={final.get('k2_base_m')} " - f"残差 {final.get('residual_mm')}mm,已记位姿 Z={Tee[2, 3]:.4f}" - ) - return Event.SNAP_OK - - def _snap_feature(self) -> str: - """S05 稳定判据用哪个特征:``bbox``(检测框像素)还是 ``motion``(法兰 mm)。 - - ``auto`` 按感知来源选:真机(yolo)用检测框 —— 保持原有行为不变; - 仿真真值/外部感知没有可用的工件检测器(合成图过不了真机训练出来的模型, - 实测最高分 0.017),用检测框只会永远"不稳定"地空转,所以改用法兰位移。 - """ - return snap_feature_of(self.cfg.snap_stable_feature, self._perception_source()) - - def _snap_sample(self, feature: str) -> Optional[Tuple[float, ...]]: - """采一帧"画面特征"(单位随 feature 变:bbox=像素,motion=毫米)。""" - if feature == "bbox": - img = getattr(self, "_color", None) - if img is None: - return None - bbox = self._best_bbox(self._bgr_from_msg(img)) - if bbox is None: - return None - return (0.5 * (bbox[0] + bbox[2]), 0.5 * (bbox[1] + bbox[3])) - # motion:法兰(= 相机)在世界系里的位置。相机装在法兰上,法兰不动, - # 画面就不会动 —— 比"检测框不动"更直接,也不依赖任何模型。 - _q, Tee = self._wait_state(0.5) - if Tee is None: - return None - return (float(Tee[0, 3]) * 1000.0, float(Tee[1, 3]) * 1000.0, float(Tee[2, 3]) * 1000.0) - - def _wait_pixel_stable(self) -> bool: - """等画面稳定:连续采 ``snap_stable_s`` 秒的特征,抖动在容差内才算稳。 - - 用"到均值的最远距离"而不是相邻帧之差 —— 跟踪抖动是零均值的, - 相邻差会让"明明在晃"的时刻被判成稳定,然后拍出一张糊图(表现为 - "孔位偶尔偏 1mm",随机且难复现)。判据实现见 gauge_fsm.pixel_stable。 - """ - feature = self._snap_feature() - tol = self.cfg.snap_tol_px if feature == "bbox" else self.cfg.snap_tol_mm - got_any = False - deadline = time.monotonic() + 20.0 - while time.monotonic() < deadline: - samples: List[Tuple[float, ...]] = [] - t0 = time.monotonic() - while time.monotonic() - t0 < self.cfg.snap_stable_s: - s = self._snap_sample(feature) - if s is not None: - samples.append(s) - got_any = True - self._spin(0.05) - if points_stable(samples, tol, self.cfg.snap_min_frames): - return True - if not got_any and feature == "bbox": - # 一条都采不到 = 检测器根本没出框。这跟"画面在晃"是**两件事**, - # 分开报才找得到人(真机上这是"权重与图像不匹配"的典型症状)。 - self.get_logger().error( - "S05 等稳定时工件检测器一直没出框(0 帧样本)——" - "不是画面在晃,是没检测到工件。查:权重是否与这台相机匹配" - "(models/yolo/README.md)、或把 gauge_assembly.snap_stable_feature " - "设成 motion 改用法兰位移判据" - ) - return False - - # ===================================================================== - # S06 正悬停 - # ===================================================================== - def _step_hover_k(self) -> Event: - hole = self._hole_name() - self._state(f"S06_hover_{hole}") - if self.cfg.dry_run: - self._fsm_dry(Event.ALIGN_OK, f"到 {hole} 正悬停") - return Event.ALIGN_OK - - xy = self._hole_xy(hole) - if xy is None: - self.get_logger().error(f"S06 没有 {hole} 的坐标(S05 没定位到?)") - return Event.TIMEOUT - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - z = float(self._snap_final.get("hover_z_m") or self.hover_z) - target = np.array([xy[0], xy[1], z]) - ok, q, Tee = self._goto( - q, Tee, target, verticalize=True, tol_m=self.cfg.align_tol_mm / 1000.0, - tol_tilt=self.vert_tol_rad * 1.5, tag=f"S06_hover_{hole}", - v=self.move_speed, max_hops=10, settle_s=0.2, - ) - # 对位残差用**实测**算,不用运动返回值:运动"到点了"和对准了是两件事 - gxy = self._gauge_xy(Tee) - residual_mm = math.hypot(gxy[0] - xy[0], gxy[1] - xy[1]) * 1000.0 - self.get_logger().info( - f"S06 {hole} 悬停:实测残差 {residual_mm:.2f}mm" - f"(容差 {self.cfg.align_tol_mm:.1f}mm)Z={Tee[2, 3]:.4f}" - ) - if residual_mm > self.cfg.align_tol_mm: - self.get_logger().warn("对位超差 → 回 S05 重拍") - return Event.ALIGN_OUT - if not ok: - self.get_logger().warn("运动未完全到位但残差在容差内,继续") - self._progress(f"{hole} 悬停完成,残差 {residual_mm:.2f}mm") - return Event.ALIGN_OK - - def _hole_xy(self, hole: str) -> Optional[Tuple[float, float]]: - key = f"{hole}_base_m" - val = self._snap_final.get(key) - if not val or len(val) < 2: - return None - return float(val[0]), float(val[1]) - - # ===================================================================== - # S07 柔顺接触 - # ===================================================================== - def _shear_axes(self) -> Tuple[float, float]: - """当前两路切向读数(取法向最大的那只手指)。 - - 两路都要,是因为切向力到底走 X 还是 Y 通道未确认:只监控一个通道, - 赌错了就是整段流程静默失效(下发正常、日志正常、就是停不住)。 - """ - best = None - best_fn = -1.0 - for tac in (getattr(self, "_tac_l", None), getattr(self, "_tac_r", None)): - if not tac: - continue - t, m = tac - if time.monotonic() - t > 0.5: - continue - fn = abs(float(getattr(m, "fnormal", 0.0))) - if fn > best_fn: - best_fn, best = fn, m - if best is None: - return (0.0, 0.0) - return (float(getattr(best, "fshearx", 0.0)), float(getattr(best, "fsheary", 0.0))) - - def _wrench_axial(self) -> Optional[float]: - """当前腕部 FT 的轴向力 [N];一帧都没收到过时返回 None。 - - 轴向 = ``force.z``。这个口径对真机与仿真**都成立**: - 真机 ``//ft_sensor_wrench`` 是法兰系,z 是法兰轴; - 仿真传感器挂在 joint7 上取 child(link7) 系,z 也是工具轴。 - 工具锁垂直向下时,两者都等于"竖直方向的力"。 - """ - return getattr(self, "_ft_fz", None) - - def _wrench_age(self) -> Optional[float]: - """腕部 FT 最近一帧的年龄 [s];一帧都没收到过时返回 None。""" - t = getattr(self, "_t_ft", None) - return None if t is None else (time.monotonic() - float(t)) - - def _step_contact(self) -> Event: - self._state("S07_contact") - if self.cfg.dry_run: - self._fsm_dry(Event.CONTACT_OK, "柔顺下臂到接触") - return Event.CONTACT_OK - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - - # 基线必须在**还没碰工件**的时候测。S06 结束时悬停在工件上方, - # 正好是测基线的时刻(带载测会把阈值抬飞)。 - ref = self._baseline(samples=8) - # 腕部 FT 的轴向基线:与触觉基线同一时刻采(这时还没碰工件)。 - # 腕部 FT 在夹持摩擦的**上游**,所以它是 S07 的首选判据;触觉只是兜底 - #(通止规靠夹持摩擦抱住,轴向力传不到指垫,见 gauge_fsm.wrench_touch)。 - ft_ref = self._wrench_axial() - ft_age = self._wrench_age() - ft_alive = wrench_live(ft_age) - self.get_logger().info( - f"S07 基线:切向 ({ref[0]:.1f}, {ref[1]:.1f})、法向 {self._fn_rest:.1f}" - f";腕部轴向 {ft_ref if ft_ref is not None else float('nan'):+.2f}N" - f"({'活' if ft_alive else '**没有数据**'},话题 {self.ft_wrench_topic})" - ) - - z0 = float(Tee[2, 3]) - step_m = self.cfg.contact_step_mm / 1000.0 - max_depth_m = self.cfg.contact_max_depth_mm / 1000.0 - # 台肩落面所需的下压量。在下面几何自检里算出来;**要留到接触判据那里用** - # (看 hole_entry_verdict:下压深度远小于它 ⇒ 规没进孔)。 - needed_m: Optional[float] = None - - # ---- 工具几何自检:预算必须是**由几何推出来的**,不能拍 ------------------ - # 判"到底了"的那一下是**台肩落到工件上表面**(不是尖端碰面)。工件上表面 - # 就是 stage2 实测的孔位 z(孔在面上);台肩在规尖上方 30mm(通端长 30)。 - # - # 这里做两件事: - # ① 把"悬停时工具尖端离面还有多高"算出来印出来。**负值说明悬停这一步 - # 就已经把工具捅进工件了**(悬停高度是按相机定的、工具比相机长就 - # 会这样,真机同参数同结果),这是个几何错误,藏得很深:现象是 - # S07 一路压到顶都判不到接触,看起来像力阈值标错了。 - # ② 如果配的预算**不够**走完"台肩落面"那一段,就地按几何**改大**并 - # 大声报出来。2026-09-24 仿真里踩过:预算 25mm 而台肩在尖端上方 - # 30mm → 永远到不了落面那一下,报出来的原因是假的("没触发接触 - # 判据"),真实原因只是预算不够。 - surface_z = float(self.cfg.workpiece_surface_z_m) - if surface_z <= 0.0: - # 没配就取 stage2 实测的孔位 z —— 孔就在工件上表面上。 - k1 = (self._snap_final or {}).get("k1_base_m") or [] - surface_z = float(k1[2]) if len(k1) >= 3 else 0.0 - if surface_z > 0.0: - clear_m = tool_clearance_m( - z0, # 悬停时的法兰高度 = 当前 Tee 的 z(S06 刚把法兰锁到悬停高) - self.cfg.tool_tip_below_flange_m, - surface_z, - ) - needed_m = descend_needed_m( - z0, self.cfg.tool_tip_below_flange_m, surface_z, - GAUGE_SHOULDER_ABOVE_TIP_M, - ) - self.get_logger().info( - f"S07 工具几何:悬停法兰 z={z0:.4f}、工具尖端在法兰下方 " - f"{self.cfg.tool_tip_below_flange_m * 1000:.1f}mm → 尖端 z=" - f"{z0 - self.cfg.tool_tip_below_flange_m:.4f},工件上表面 z={surface_z:.4f}\n" - f" 悬停时尖端离面 {clear_m * 1000:+.1f}mm" - f"{'(**已经插进工件了**)' if clear_m < 0 else ''};" - f"台肩落面还需下压 {needed_m * 1000:+.1f}mm" - ) - if needed_m > max_depth_m: - new_depth_m = descend_budget_m(needed_m) - self.get_logger().warn( - f"S07 下探预算不足:配的是 {max_depth_m * 1000:.1f}mm," - f"但「台肩落面」这一段就要 {needed_m * 1000:.1f}mm" - f"(台肩在尖端上方 {GAUGE_SHOULDER_ABOVE_TIP_M * 1000:.0f}mm)。\n" - f" 按几何自动改大为 {new_depth_m * 1000:.1f}mm。" - f"要固定这个值,改 site.yaml 的 " - f"gauge_assembly.contact_max_depth_mm(建议 ≥ " - f"{new_depth_m * 1000:.0f})" - ) - max_depth_m = new_depth_m - - # 这一步的到位容差**必须小于步长**(见 gauge_fsm.descend_tol_m 的说明: - # 容差≥步长时 _goto 判"已在容差内"直接返回,一步都不走 → 静默自旋)。 - tol_step_m = descend_tol_m(step_m) - budget = descend_iter_budget(max_depth_m, step_m) - self.get_logger().info( - f"S07 步进下压:步长 {step_m * 1000:.2f}mm、到位容差 {tol_step_m * 1000:.3f}mm、" - f"最多 {max_depth_m * 1000:.1f}mm / {budget} 步" - ) - steps = 0 - stalls = 0 - z_prev = z0 - while float(Tee[2, 3]) - z0 > -max_depth_m: - if steps >= budget: - self.get_logger().error( - f"S07 下压步数用尽({budget} 步 ≈ {max_depth_m * 1000:.1f}mm)仍未触发接触判据。\n" - " 这不是正常路径:正常应该是「接触→CONTACT_OK」或「到底→超深失败」。\n" - " 走到这里通常意味着臂**没在动**(控制器死区/被夹住/孔位偏得擦不到面)。" - ) - self._retract(q, Tee, dz_m=0.01) - return Event.TIMEOUT - steps += 1 - target = np.array([float(Tee[0, 3]), float(Tee[1, 3]), float(Tee[2, 3]) - step_m]) - # 不用 _step_to:它把速度写死成 search_speed,而这**一步**必须慢 - # (接触判据要在"碰到"的瞬间停住,快了就是一个冲击)。速度取 - # gauge_assembly.contact_speed_m_s,其余参数与 _step_to 对齐。 - ok, q, Tee = self._goto( - q, Tee, target, verticalize=True, tol_m=tol_step_m, - tol_tilt=self.vert_tol_rad * 2.5, tag="S07_step", - v=self.cfg.contact_speed_m_s, max_hops=2, - settle_s=max(0.06, self.settle3 * 0.3), min_dur=0.16, - ) - if not ok: - self.get_logger().warn("S07 单步未完全到位,继续按实测高度判断") - # 实测位移 = 唯一的推进证据。指令发出去不等于臂动了(R5.1 静默失效)。 - z_now = float(Tee[2, 3]) - if descend_progress(z_prev, z_now, step_m): - stalls = 0 - else: - stalls += 1 - self.get_logger().warn( - f"S07 第 {steps} 步实测只走了 {(z_prev - z_now) * 1000:+.3f}mm" - f"(要求 ≈{step_m * 1000:.2f}mm),连续 {stalls}/{DESCEND_STALL_STEPS} 步没动" - ) - if stalls >= DESCEND_STALL_STEPS: - self.get_logger().error( - f"S07 连续 {stalls} 步**实测零位移**,臂根本没往下走。\n" - " 常见原因:① 这一步的容差 ≥ 步长(_goto 判「已在容差内」直接返回);\n" - " ② 控制器死区/增益太小,0.x mm 的微步被吃掉;\n" - " ③ 工件/夹具把臂顶住了(此时应报接触,却没达到切向阈值);\n" - " ④ 孔位偏了,规擦着孔壁下去但没接触面。" - ) - self._retract(q, Tee, dz_m=0.01) - return Event.TIMEOUT - z_prev = z_now - if steps % 5 == 0: - now_dbg = self._shear_axes() - ax_dbg = self._wrench_axial() - self.get_logger().info( - f"S07 已下压 {abs(z_now - z0) * 1000:.2f}mm" - f"({steps}/{budget} 步)切向 ({now_dbg[0]:.1f}, {now_dbg[1]:.1f})" - f" 腕部轴向 " - f"{ax_dbg - ft_ref if ax_dbg is not None else float('nan'):+.1f}N" - ) - - # ---- 判据一(首选):腕部 FT 轴向突变 -------------------------- - # 腕部 FT 在夹持摩擦的**上游**(工件→规→夹爪→法兰→腕部关节), - # 所以工具在爪里打不打滑都测得准。触觉做不到这点: - # 轴向力要传过"指垫↔规"的摩擦面,上限只有 µ·N≈23N,而台肩落面 - # 一步就产生 25N —— 必然打滑,读数停在 0(而它是对的)。 - # 完整因果链见 gauge_fsm.wrench_touch 与 docs/GAUGE_ASSEMBLY.md §6。 - ft_now = self._wrench_axial() - if ft_alive and ft_now is not None and ft_ref is not None: - if wrench_touch(ft_now, ft_ref, self.cfg.contact_axial_delta_n): - self.get_logger().info( - f"S07 接触(腕部 FT):轴向 {ft_now:+.2f}N 相对基线 " - f"{ft_ref:+.2f}N 超过 +{self.cfg.contact_axial_delta_n:.1f}N" - f"(下压 {abs(float(Tee[2, 3]) - z0) * 1000:.2f}mm)" - ) - # 下压这么浅就"接触" ⇒ 尖端顶在工件上表面,没进孔。必须在这里 - # 拦下:放它进 S08 只会干转几轮、憋住,最后报一句"转轴偏差" - # 把所有人引去查工具系。见 hole_entry_verdict 的说明。 - if self._hole_lost_guard(z0, Tee, needed_m, q, "腕部 FT"): - return Event.HOLE_LOST - # 必须先卸载再交给 S08 —— 判到接触的这一刻臂上顶着的是**出力上限** - # 那个量级的力(实测 200N+,与阈值无关),而规的轴向传力上限 - # 只有 µ·N≈73N。见 _relieve_after_contact 的完整说明。 - self._relieve_after_contact(q, Tee, "腕部 FT", ft_ref) - return Event.CONTACT_OK - elif steps == 1: - # 只报一次,别每步刷屏。降级到触觉兜底时阈值口径要按现场重新标定。 - self.get_logger().warn( - f"S07 腕部 FT 没有数据(话题 {self.ft_wrench_topic}," - f"年龄 {ft_age if ft_age is not None else float('nan'):.1f}s)——" - "降级为只看触觉切向突变。\n" - " ⚠️ 触觉是**靠夹持摩擦**传力的,轴向力上限只有 µ·N(≈23N 量级)," - "台肩落面那一下可能传不过去、读数停在 0。\n" - " 真机上查:真机 bringup 无条件起 flexiv_robot_states_broadcaster," - "话题是 //ft_sensor_wrench;收不到就是话题名/网络的问题。\n" - " 仿真上查:devices/sim/gazebo/config/wrist_ft.yaml 的 topic 与" - " arm.sim.sensors.xacro 的 wrist_ft_topic 必须一致(都是 " - "/sim/ft_sensor_wrench)。" - ) - - try: - fn, _fn_max, _shear, _contact = self._tac_fresh(self.tac_timeout) - except Exception as exc: # noqa: BLE001 - # 腕部 FT 活着时,触觉断流不影响判接触(两个来源互相独立)。 - # 只有两个来源都没了才真的判不了。 - if not ft_alive: - self.get_logger().error( - f"S07 腕部 FT 与触觉**都没有**数据,无法判断接触:{exc}\n" - " 这不是阈值问题,是数据源问题:先让其中一个活过来。" - ) - self._retract(q, Tee, dz_m=0.01) - return Event.TIMEOUT - self.get_logger().warn( - f"S07 触觉断流({exc}),但腕部 FT 活着,继续下压" - ) - fn, _fn_max, _shear, _contact = 0.0, 0.0, (0.0, 0.0), False - - # ---- 判据二(兜底):触觉切向突变 ------------------------------ - now = self._shear_axes() - if tangential_jump(now, ref, self.cfg.contact_tangential_delta): - self.get_logger().info( - f"S07 接触(触觉切向):切向 {now[0]:.1f}/{now[1]:.1f} 相对基线 " - f"{ref[0]:.1f}/{ref[1]:.1f} 超过 +{self.cfg.contact_tangential_delta:.0f}" - f"(法向 {fn:.1f},下压 {abs(float(Tee[2, 3]) - z0) * 1000:.2f}mm)" - ) - # 与腕部 FT 那条同规矩:判到接触时臂上顶着的力远大于阈值,必须先卸载。 - # 同样先过"是不是根本没进孔"这道闸(见 hole_entry_verdict)。 - if self._hole_lost_guard(z0, Tee, needed_m, q, "触觉切向"): - return Event.HOLE_LOST - self._relieve_after_contact(q, Tee, "触觉切向", ft_ref) - return Event.CONTACT_OK - if fn - self._fn_rest > self.cfg.contact_safe_delta: - self.get_logger().error( - f"S07 法向力超安全上限:{fn:.1f} - 基线 {self._fn_rest:.1f} > " - f"+{self.cfg.contact_safe_delta:.0f},抬起并中止" - ) - self._retract(q, Tee, dz_m=0.01) - return Event.FORCE_OVER_LIMIT - # 腕部 FT 的独立安全上限:它测的是**真实轴向力**,所以这里能给出 - # 一个物理量级的兜底(触觉那个 contact_safe_delta 是 au,量纲都对不上)。 - # 取触觉安全上限的同样口径:一旦超过就说明"压得太狠了",与"接触了没" - # 无关 —— 接触判据应该早就返回了,能走到这里说明判据失灵。 - if ft_alive and ft_now is not None and ft_ref is not None: - if abs(ft_now - ft_ref) > self.cfg.contact_safe_delta: - self.get_logger().error( - f"S07 腕部轴向力超安全上限:{ft_now:+.2f}N - 基线 {ft_ref:+.2f}N " - f"= {abs(ft_now - ft_ref):.1f}N > +{self.cfg.contact_safe_delta:.0f}N," - "抬起并中止。\n" - " 能走到这里说明接触判据没生效(那么大的力早该判到接触)——" - "先查 contact_axial_delta_n 是不是被调得太大了。" - ) - self._retract(q, Tee, dz_m=0.01) - return Event.FORCE_OVER_LIMIT - self.get_logger().error( - f"S07 下探 {max_depth_m * 1000:.1f}mm 都没触发接触判据。\n" - " 排查顺序(按物理可信度,别从阈值开始调):\n" - " ① **先看上面每 5 步打印的「腕部轴向」**:它一直≈0 → 是数据源/几何问题,\n" - " 不是阈值问题(传感器没数据、悬停几何错、孔位偏了没碰到面);\n" - " ② 腕部轴向有涨但没到阈值 → 才轮到调 contact_axial_delta_n;\n" - " ③ 只有触觉兜底时:轴向力要经夹持摩擦传递,上限 µ·N≈23N,\n" - " 台肩落面那一下可能传不过来 —— 这时调阈值是白费,要修的是夹持。" - ) - self._retract(q, Tee, dz_m=0.01) - return Event.TIMEOUT - - def _hole_lost_guard( - self, - z0: float, - Tee: np.ndarray, - needed_m: Optional[float], - q: np.ndarray, - why: str, - ) -> bool: - """S07 判到接触时:下压深度是不是**远小于**几何预期(= 规没进孔)。 - - 返回 True 表示"确实没进孔",调用方要抬臂并返回 ``Event.HOLE_LOST``。 - - 完整来龙去脉在 ``gauge_fsm.hole_entry_verdict`` 的 docstring 里,这里只 - 留现场要看的那几句:工件在 S08/S09/S10 会被工具推走,而 k2 的孔位是 - S05 一次性定的 ⇒ 工件一动孔位就失效 ⇒ 规落在孔旁边的平面上。 - 不拦的话会干转 5 轮,最后报一句"转轴偏差…先确认工具系有没有装转接件", - 把所有人引去查工具系(实测 2026-09-28)。 - """ - if needed_m is None: - # 没算出几何预期(工件上表面 z 没标定且 S05 也没给)—— 没有判据就别猜。 - return False - descended_m = abs(float(Tee[2, 3]) - z0) - if hole_entry_verdict(descended_m, needed_m) != ENTRY_HIGH: - return False - self.get_logger().error( - f"S07 接触({why})发生在下压 {descended_m * 1000:.2f}mm 处," - f"而按几何「台肩落面」需要 {needed_m * 1000:.1f}mm —— 只走了 " - f"{descended_m / needed_m * 100.0:.0f}%。\n" - " **规没有进孔,尖端顶在工件上表面**(正常入孔要压到台肩落面那一下)。\n" - " 最可能的原因:工件被工具推走了,而本孔的坐标是 **S05 一次性定下**的 ——\n" - " 工件一动,那个坐标就失效(S06 的「实测残差」发现不了:它比的是\n" - " 「命令位置 vs 实际位置」,不是「规尖 vs 真实孔位」)。\n" - " 所以**不要**去查工具系/转接件/力阈值(那几个都是好的)。\n" - " 正确处置:把臂退开、确认工件的实际位置;能复位就复位工件,然后\n" - " 从 S05 重新拍照定位(重跑流程即会重新定位)。\n" - " 若要治根:换孔前复核工件没动(当前只有 S05 阶段有 drag 看门狗)。\n" - " 抬起并中止,不带着失效的孔位进 S08。" - ) - self._retract(q, Tee, dz_m=0.01) - return True - - def _relieve_after_contact( - self, - q: np.ndarray, - Tee: np.ndarray, - why: str, - axial_ref: Optional[float] = None, - ) -> None: - """判到接触之后的**卸载回退**:把下压量放掉,再交给 S08。 - - 为什么必须有这一步(2026-09-24 用一整轮排查换来的,值得完整读): - - 位置控制的臂撞上硬面时,**不会**在"刚碰到"的地方停住 —— 它会一直顶到 - 自己的出力上限。仿真实测:指令 0.5mm 的一步压在工件上,腕部 FT 直接跳到 - **+244N**,而臂这一步只走了 0.09mm(日志里那句"S07 单步未完全到位")。 - 也就是说"判到接触"的那一刻,臂上是顶着一个**大得多的力**的, - 这个力跟 contact_axial_delta_n 没关系(阈值只决定"什么时候承认接触")。 - - 而通止规是**靠夹持摩擦**抱住的:轴向上能传的力上限 = µ·N,两指合计 - 约 73N(µ=0.8、握力 46N)。244N 远超它 ⇒ 规被轴向力直接顶出爪外。 - 本次就是这样:S07 判到接触 → 进 S08 一转 → 规掉到地上 → 报 E1, - 而 E1 的日志只说"通止规掉了",看不到"是顶着 244N 进去的"。 - - 所以这里回退 contact_relief_mm,把力放回基线附近;S08 只带着"规自身的 - 重量 + 一点点残余"进孔 —— 那才是螺纹/棘轮真正需要的预压。 - - 回退量刻意**不做闭环**(不"退到力小了为止"):判据闭环会在"接触刚度很大" - 时来回震荡,而这里要的只是"把下压量放掉"。放不干净就报出来(见下), - 让现场去改夹持(那是机械问题,不是参数问题)。 - """ - dz = float(self.cfg.contact_relief_mm) / 1000.0 - ft_before = self._wrench_axial() - if dz <= 0.0: - self.get_logger().warn( - f"S07 判到接触({why})但 contact_relief_mm=0 —— **不卸载**。\n" - " 位置控制的臂此刻顶着的力可能远大于判据阈值(实测 200N+)," - "而规靠夹持摩擦抱住、轴向上限只有 µ·N(≈73N)。" - "S08 一转就可能掉件(E1),且日志里看不到真因。" - ) - return - target = np.array([float(Tee[0, 3]), float(Tee[1, 3]), float(Tee[2, 3]) + dz]) - # ⚠️ 到位容差**必须远小于回退量**,不能写死一个与它同量级的常数。 - # 实测(2026-09-24):回退 0.50mm 而 tol_m 也写 0.0005 ⇒ 目标 z 是 - # `Tee[2,3] + 0.0005`,浮点回减后 dist 会比 0.0005 略小 ⇒ `_goto` 的 - # 入口判据 `dist < tol_m` 当场成立、**一步没走就 return True**。 - # 于是"卸载"变成一次空操作,而下面的残余力判据比的是"回退前 vs 回退后" - # 两个一模一样的读数 ⇒ 报"残余 0.0N,已放干净"(**假通过**)。 - # 后果:S08 带着 70N 的轴向力去转 → 掉件(E1),日志里只有"规掉了"。 - # 规则本身抽成 gauge_fsm.relief_tol_m 并有单测钉住(tol 必须 < 回退量)。 - tol = relief_tol_m(dz) - ok = self._goto( - q, Tee, target, verticalize=True, tol_m=tol, - tol_tilt=self.vert_tol_rad * 2.5, tag="S07_relief", - v=min(0.02, self.cfg.contact_speed_m_s), max_hops=3, - settle_s=max(0.1, self.settle3 * 0.5), min_dur=0.3, - )[0] - time.sleep(0.2) - ft_after = self._wrench_axial() - msg = ( - f"S07 接触后卸载:回退 {dz * 1000:.2f}mm,腕部轴向 " - f"{ft_before if ft_before is not None else float('nan'):+.1f}N → " - f"{ft_after if ft_after is not None else float('nan'):+.1f}N" - ) - if not ok: - self.get_logger().warn( - msg + "\n ⚠ 卸载回退**没走到位**(上面有 _goto 的告警)。" - "残余力判据因此不可信 —— 这一路压进去的力仍留在规上。" - ) - if ft_after is not None and ft_before is not None: - # 残余按**基线**(还没碰工件时的轴向力)算,不能按"回退前后之差"算: - # 回退本身要是没生效,前后读数相同 ⇒ 差值 0 ⇒ 假报"放干净"。 - # 基线是"完全没有接触"的状态,这才是"卸载干不干净"的参照。 - residual = ( - abs(float(ft_after) - float(axial_ref)) - if axial_ref is not None - else abs(float(ft_after) - float(ft_before)) - ) - ref_txt = ( - f"基线 {float(axial_ref):+.1f}N" if axial_ref is not None else "无基线" - ) - if residual > float(self.cfg.contact_hold_n): - self.get_logger().warn( - msg + f"(残余 {residual:.1f}N(相对{ref_txt})" - f" > {self.cfg.contact_hold_n:.1f}N)\n" - " ⚠ 卸载没放干净:这一路压进去的力**超过了夹持摩擦能承受的量**" - "(上限 µ·N,两指合计 ≈73N)。\n" - " 接着 S08 一转,规会从爪里被推出去(现象是「通止规掉了」E1," - "看不到真因)。\n" - " 两条真修法:① 降峰值 —— 调小 contact_step_mm(步长越小峰值越小)" - "或加大 contact_relief_mm;② 加握力 —— 改夹爪合拢力度/指垫摩擦。\n" - " **不要**去调 contact_axial_delta_n:它只管「什么时候承认接触」," - "管不了「判到的时候已经顶了多大」。" - ) - else: - self.get_logger().info( - msg + f"(残余 {residual:.1f}N(相对{ref_txt}),已放干净)" - ) - else: - self.get_logger().info(msg + "(腕部 FT 没数据,无法确认卸载效果)") - - def _baseline(self, samples: int) -> Tuple[float, float]: - """静止基线的两路切向均值(顺手把法向基线记到 ``self._fn_rest``)。 - - 单侧可用即可:另一只指没插时,同一侧的阈值仍然自洽(相对量)。 - 拿不到任何读数时按 0 处理并**明确告警** —— 阈值会偏保守, - 结果可能是"碰上了没停",而不是静默地继续跑。 - """ - acc: List[Tuple[float, float]] = [] - fns: List[float] = [] - t0 = time.monotonic() - while len(acc) < samples and time.monotonic() - t0 < 3.0: - sx, sy = self._shear_axes() - if sx != 0.0 or sy != 0.0: - acc.append((sx, sy)) - for tac in (getattr(self, "_tac_l", None), getattr(self, "_tac_r", None)): - if not tac: - continue - tt, mm = tac - if time.monotonic() - tt < 0.5: - fns.append(abs(float(getattr(mm, "fnormal", 0.0)))) - self._spin(0.05) - self._fn_rest = (sum(fns) / len(fns)) if fns else 0.0 - if not acc: - self.get_logger().warn( - "S07 拿不到切向读数,基线按 0 处理(阈值会偏保守:可能碰上了不停)" - ) - return (0.0, 0.0) - return ( - sum(a[0] for a in acc) / len(acc), - sum(a[1] for a in acc) / len(acc), - ) - - # ===================================================================== - # S08 旋转装配循环(棘轮) - # ===================================================================== - def _log_regrip(self, tag: str) -> None: - """把"这一轮夹紧后的开口"打出来(含相对夹住时的塌陷量)。 - - 为什么每轮都要打(2026-09-24 实测): - S08/S09 每轮都是"慢转 → 松爪 → 回转 → 夹紧",而 `close` 在仿真里 - 是"位置控制走到全合 0mm" —— **真机走到力上限就停,仿真会一路挤进规里**。 - 只报一句"通止规掉了(E1)"时,人分不出"真掉了"和"被挤小了"。 - 把开口与塌陷量打出来一眼就能分辨: - · 塌陷量逐轮变大、开口还在十几毫米 → 是**被挤**(规还在指间) - · 开口塌到接近 0(两指合到底) → 是**真掉了** - """ - if self.grip is None: - return - ap = self.grip.settle(settle_s=1.0) # 服务返回时动作还没做完,等它停 - if ap is None: - return - gp = self.grip.grip_aperture() - col = self.grip.collapse_mm() - detail = "" - if gp is not None and col is not None: - detail = f"(夹住时 {gp:.2f}mm,塌陷 {col:+.2f}mm)" - self.get_logger().info(f"{tag}:开口 {ap:.2f}mm{detail}") - - def _step_screw_in(self) -> Event: - hole = self._hole_name() - self._state(f"S08_screw_in_{hole}") - if self.cfg.dry_run: - self._fsm_dry(Event.SCREW_DONE, f"棘轮拧入 {hole}") - return Event.SCREW_DONE - - steps = ratchet_cycles( - self.cfg.screw_max_cycles * self.cfg.screw_step_deg, self.cfg.screw_step_deg - ) - self.get_logger().info( - f"S08 开始:最多 {steps} 轮 × {self.cfg.screw_step_deg:.0f}°" - f"(上限 {self.cfg.screw_max_cycles * self.cfg.screw_step_deg:.0f}°)," - f"停止判据「切向 >+{self.cfg.screw_shear_delta:.0f} " - f"且法向 >+{self.cfg.screw_normal_delta:.0f}」" - ) - # 步长 vs 关节行程:**在这里算一次**,不要等第 3 轮贴限位再炸。 - # 2026-09-24 实测:180° 的步长配 ±175° 的关节 7,第 3 轮 ABORT, - # 日志是一长串"贴限位 → 让余量 → 还是贴限位",真因(配置)藏在最后。 - travel = ratchet_travel_ok( - self.cfg.screw_step_deg, self._wait_joint_limits(), RATCHET_LIMIT_MARGIN_DEG - ) - self.get_logger().info( - f"S08 行程核算:一步棘轮要 {travel.need_deg:.0f}°," - f"关节7 行程 {travel.travel_deg:.0f}°" - f"(最大可用步长 {travel.max_step_deg:.0f}°)—— {'放得下' if travel.ok else '放不下'}" - ) - if not travel.ok: - self.get_logger().error(f"S08 配置自检不通过(先改配置,别硬跑):{travel.why}") - return Event.ABORT - for cycle in range(self.cfg.screw_max_cycles): - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - try: - fn_before, _fn_max, _shear, _c = self._tac_fresh(self.tac_timeout) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f"S08 触觉断流,无法判断拧紧:{exc}") - return Event.ABORT - shear_before = self._shear_axes() - - # --- 四步原子动作,顺序固定(慢转 → 松爪 → 快回转 → 夹紧)--- - # 慢转是**顺时针**:与 S01 的逆时针预绕相反,这样预绕行程就是 - # 这一整段拧入的回转空间(S01 不预绕,转两圈就贴限位)。 - ev = self._ratchet_step( - float(q[-1]) - self.cfg.screw_step_rad, tag=f"S08_slow_{cycle}", - fsm_event=Event.SCREW_DONE, speed_deg_s=self.cfg.screw_speed_deg_s, - direction=-1, # 顺时针拧入(与 S01 的预绕相反) - ) - if ev is not Event.SCREW_DONE: - return ev - # 松爪 → 快回转 → 夹紧 - if self.grip is not None: - if not self.grip.open(): - self.get_logger().error("S08 松爪失败 —— 继续转会把规拧回去") - return Event.ABORT - time.sleep(self.cfg.screw_release_wait_s) - q, Tee = self._wait_state(3.0) - if q is None: - return Event.TIMEOUT - ev = self._ratchet_step( - float(q[-1]) + self.cfg.screw_step_rad, tag=f"S08_back_{cycle}", - fsm_event=Event.SCREW_DONE, speed_deg_s=self.cfg.screw_back_speed_deg_s, - direction=+1, # 回转:与慢转正好相反 - ) - if ev is not Event.SCREW_DONE: - return ev - if not self.grip.close(): - self.get_logger().error("S08 夹紧失败 —— 下一轮慢转会打滑磨螺纹") - return Event.ABORT - self._log_regrip(f"S08 第 {cycle + 1} 轮夹紧后") - else: - self.get_logger().error("S08 没有夹爪客户端,无法松爪/夹紧,中止") - return Event.ABORT - - # --- 停止判据:切向 >阈值 **且** 法向突增 --- - try: - fn_after, _fn_max2, _shear_now, _c2 = self._tac_fresh(self.tac_timeout) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f"S08 触觉断流,无法判断拧紧:{exc}") - return Event.ABORT - sx, sy = self._shear_axes() - shear_delta = max( - abs(sx - shear_before[0]), abs(sy - shear_before[1]), - ) - normal_delta = fn_after - fn_before - self.get_logger().info( - f"S08 第 {cycle + 1}/{self.cfg.screw_max_cycles} 轮:" - f"切向增量 {shear_delta:.1f}(阈值 {self.cfg.screw_shear_delta:.0f})" - f" 法向增量 {normal_delta:+.1f}(阈值 {self.cfg.screw_normal_delta:.0f})" - ) - if screw_stop( - normal_delta, shear_delta, - self.cfg.screw_normal_delta, self.cfg.screw_shear_delta, - ): - self.get_logger().info(f"S08 判据满足,{hole} 拧到位(第 {cycle + 1} 轮)") - self._progress(f"{hole} 拧入到位({cycle + 1} 轮)") - return Event.SCREW_STOP - if self.grip is not None and self.grip.dropped(): - ap = self.grip.aperture() - gp = self.grip.grip_aperture() - self.get_logger().error( - "S08 通止规掉了(E1)—— 回 S01 流程:张开爪、提示人工放好," - "确认后继续(按看板:该孔记为完成,换下一个孔)\n" - f" 开口:夹住时 {gp if gp is None else f'{gp:.2f}mm'}" - f" → 现在 {ap if ap is None else f'{ap:.2f}mm'}" - f"(判据:塌陷 ≥ {GripperClient.DROP_COLLAPSE_MM:.1f}mm)\n" - " 分辨真掉还是被挤:开口塌到接近 0 = 两指合到底(真掉);\n" - " 开口还有十几毫米、只是比夹住时小了几毫米 = 被**挤**" - "(仿真位置控制的「全合」不知道「挡住就停」,见 GripperClient.dropped)" - ) - self._e1_pending = True - return Event.GAUGE_DROPPED - self.get_logger().info(f"S08 达到 {self.cfg.screw_max_cycles} 轮上限,进入拧出") - return Event.SCREW_DONE - - # ===================================================================== - # S09 反向拧出 - # ===================================================================== - def _step_unscrew(self) -> Event: - hole = self._hole_name() - self._state(f"S09_unscrew_{hole}") - if self.cfg.dry_run: - self._fsm_dry(Event.UNSCREW_DONE, f"反向拧出 {hole}") - return Event.UNSCREW_DONE - cycles = ratchet_cycles( - (self.cfg.screw_max_cycles + self.cfg.unscrew_extra_cycles) - * self.cfg.screw_step_deg, - self.cfg.screw_step_deg, - ) - self.get_logger().info( - f"S09 拧出 {hole}:{cycles} 轮 × {self.cfg.screw_step_deg:.0f}°" - f"(= 拧入上限 {self.cfg.screw_max_cycles} 轮 + 额外 " - f"{self.cfg.unscrew_extra_cycles} 轮,确保螺纹脱开)" - ) - for cycle in range(cycles): - q, Tee = self._wait_state(5.0) - if q is None: - return Event.TIMEOUT - # 反向:慢转是逆时针(与 S08 相反),空手回转是顺时针 - ev = self._ratchet_step( - float(q[-1]) + self.cfg.screw_step_rad, tag=f"S09_slow_{cycle}", - fsm_event=Event.UNSCREW_DONE, speed_deg_s=self.cfg.screw_speed_deg_s, - direction=+1, # 逆时针拧出 - ) - if ev is not Event.UNSCREW_DONE: - return ev - if self.grip is None: - return Event.ABORT - if not self.grip.open(): - return Event.ABORT - time.sleep(self.cfg.screw_release_wait_s) - q, Tee = self._wait_state(3.0) - if q is None: - return Event.TIMEOUT - ev = self._ratchet_step( - float(q[-1]) - self.cfg.screw_step_rad, tag=f"S09_back_{cycle}", - fsm_event=Event.UNSCREW_DONE, speed_deg_s=self.cfg.screw_back_speed_deg_s, - direction=-1, # 回转:与慢转相反 - ) - if ev is not Event.UNSCREW_DONE: - return ev - if not self.grip.close(): - return Event.ABORT - self._log_regrip(f"S09 第 {cycle + 1} 轮夹紧后") - self._lift_clear_of_hole(hole) - self._progress(f"{hole} 已拧出") - return Event.UNSCREW_DONE - - def _lift_clear_of_hole(self, hole: str) -> None: - """拧出后**先竖直把规提出孔**,之后才允许任何横向动作。 - - **为什么必须有这一步**(2026-09-24 仿真实测,两次栽在同一个地方): - 1. 仿真里**没有螺纹几何**:S09 的"拧出"只是让规在孔里转,规**仍然插在 - 孔里**(真机会沿螺纹退出来几个毫米,也没退出多少)。 - 2. 于是紧跟着的横向动作(S10 换孔 / S11 回 home)会把规从孔里**拽** - 出来 —— 实测抓取锁被拽断、规掉在台面上,而下游只表现为 - "下一孔 S07 下探 35mm 判不到接触"(工具上已经没规了), - 日志完全指不到真因。 - 3. 真机也怕这个动作:螺纹刚脱开时横向别住最容易啃伤螺纹。标准做法就是 - **先竖直退出来,再走 XY**。 - - 高度提到**跟踪高**(``_track_z()`` = 孔悬停高 + 50mm)而不是写死毫米数: - 跟踪高是这条流程里"工具已离开工件"的既有定义(``_ensure_clearance`` - 也用它),拿它当判据不用再维护第二套口径。实测:不提出时规尖比工件面 - **低 30mm**,而 S10 的斜线只往上抬了 29mm —— 差 1mm 就是"拽出孔"和 - "干净退出"的分界,所以必须是**先后有序**的两个动作,不能靠斜线一起走。 - - 失败只告警(不失败):这一刻孔里已经没有规要保护了,硬失败会把一次成功 - 的装配变成失败;后面的 S10/S11 仍会走到安全位。 - """ - try: - q, Tee = self._wait_state(3.0) - if q is None or Tee is None: - return - tz = self._track_z() - z = float(Tee[2, 3]) - if z >= tz - 0.008: - return - self.get_logger().info( - f"S09 {hole} 拧出后竖直提出:Z {z:.3f} → {tz:.3f}m" - "(先离开孔口,再做横向动作)" - ) - _, q2, _Tee2 = self._goto( - q, Tee, - np.array([float(Tee[0, 3]), float(Tee[1, 3]), tz]), - verticalize=True, tol_m=0.003, tol_tilt=self.vert_tol_rad * 2.0, - tag=f"S09_exit_{hole}", v=self.move_speed, max_hops=8, - hold_xy=True, settle_s=0.25, - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"S09 {hole} 提出孔口失败(继续走 S10/S11):{exc}") - - # ===================================================================== - # S10 换孔 / S11 复位 - # ===================================================================== - def _step_next_hole(self) -> Event: - hole = self._hole_name() # 进入 S10 时序号已推进 - self._state(f"S10_to_{hole}") - if self.cfg.dry_run: - self._fsm_dry(Event.POSE_OK, f"换到 {hole}") - return Event.POSE_OK - q, Tee = self._wait_state(5.0) - if q is None or Tee is None: - return Event.TIMEOUT - xy = self._hole_xy(hole) - if xy is None: - self.get_logger().error(f"S10 没有 {hole} 的坐标 —— S05 那次没定位到它") - return Event.TIMEOUT - z = float(self._snap_final.get("hover_z_m") or self.hover_z) - target = np.array([xy[0], xy[1], z]) - self.get_logger().info(f"S10 回 S05 记录的位姿:{hole} ({xy[0]:.4f},{xy[1]:.4f}) Z={z:.4f}") - ok, q, Tee = self._goto( - q, Tee, target, verticalize=True, tol_m=0.002, - tol_tilt=self.vert_tol_rad * 1.5, tag=f"S10_to_{hole}", - v=self.move_speed, max_hops=10, settle_s=0.2, - ) - if not ok: - self.get_logger().warn(f"S10 到 {hole} 未完全到位,S06 会再核残差") - return Event.POSE_OK - - def _step_reset(self) -> Event: - self._state("S11_reset") - if self.cfg.dry_run: - self._fsm_dry(Event.POSE_OK, "复位退出") - return Event.POSE_OK - try: - if self.grip is not None: - self.grip.open() - self._call_trigger("/home", timeout_s=60.0) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"S11 复位过程中出错(不再拦住退出):{exc}") - return Event.POSE_OK - - # ===================================================================== - # 驱动循环 - # ===================================================================== - def _fsm_dry(self, event: Event, what: str) -> None: - self.get_logger().info(f"[干跑] {self.fsm.state}:{what} → {event.value}") - - def run(self) -> int: - """按状态机把 S00–S11 走完。返回进程退出码(0 = 正常)。""" - self._state("start") - self.get_logger().info( - f"通止规装配开始:{len(self._STEPS)} 个阶段," - f"{self.cfg.holes_total} 个孔,终点 {State.DONE};" - "状态话题 /gauge/state,结果 /gauge/result" - ) - if not self._cli.wait_for_server(timeout_sec=5.0) and not self.cfg.dry_run: - self.get_logger().error("JTC action 不在 —— 先起机械臂(run_real.sh / run_sim_gz.sh)") - return 2 - - while not self.fsm.is_terminal: - handler_name = self._STEPS.get(self.fsm.state) - if handler_name is None: - self.get_logger().error(f"状态 {self.fsm.state} 没有处理方法(看 _STEPS)") - return 2 - try: - event = getattr(self, handler_name)() - except GaugeAbort as exc: - self.get_logger().error(f"{self.fsm.state} 中止:{exc}") - self._safe_retract() - return exc.code - except FsmError: - raise - except Exception as exc: # noqa: BLE001 - self.get_logger().error( - f"{self.fsm.state} 抛异常:{type(exc).__name__}: {exc}" - ) - self._safe_retract() - return 2 - - try: - nxt = self.fsm.handle(event) - except FsmError as exc: - self.get_logger().error(str(exc)) - return 2 - self.get_logger().info( - f"[fsm] {self.fsm.history[-1]}({self._hole_name()})" - ) - if nxt is State.DONE: - break - - if self.fsm.state is State.ABORT and not self.cfg.dry_run: - # E2(中止)落点统一是"退到安全高度":无论从哪个阶段中止,都不能 - # 把规留在孔里/工件上 —— 下次启动(或人来处理)都假设起点在工件上方。 - self.get_logger().warn("E2 中止:退到安全高度") - self._safe_retract() - - ok = self.fsm.ok - # 两个孔数要分清:`hole_index` 是**0 基的当前孔号**(调试用), - # `holes_done` 才是"装完了几个"(给人/脚本看)。混用会把"两个孔都装完了" - # 显示成"已装 1/2",让人以为少装了一个。 - holes_done = ( - self.cfg.holes_total - if self.fsm.state is State.DONE - else max(0, self.fsm.ctx.hole_index) - ) - payload = { - "ok": ok, - "state": str(self.fsm.state), - "holes_total": self.cfg.holes_total, - "holes_done": holes_done, - "hole_index": self.fsm.ctx.hole_index, - "relocations": self.fsm.ctx.relocations, - "notes": self.fsm.ctx.notes, - "dry_run": self.cfg.dry_run, - "snap": self._snap_final, - } - self._publish_gauge_result(payload) - done = min(self.fsm.ctx.hole_index + (1 if ok else 0), self.cfg.holes_total) - self.get_logger().info( - f"通止规装配结束:state={self.fsm.state} ok={ok} 已装 {done}/{self.cfg.holes_total} 孔" - + ("(干跑,未动作)" if self.cfg.dry_run else "") - ) - return 0 if ok else 1 - - def _safe_retract(self) -> None: - """任何失败路径都先退到安全高度:不要让臂停在孔里/工件上。 - - 失败时"不动"看起来更安全,实际最危险:下一次调用(或人来处理)都会 - 从"规插在孔里"这个状态开始,而所有逻辑都假设起点在工件上方。 - """ - try: - q, Tee = self._wait_state(3.0) - if q is None or Tee is None: - return - self._retract(q, Tee, dz_m=0.02) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"退到安全高度失败(继续退出):{exc}") - - -def main(args: Optional[Sequence[str]] = None) -> None: - rclpy.init(args=None if args is None else list(args)) - code = 2 - node: Optional[GaugeAssembly] = None - try: - node = GaugeAssembly() - code = node.run() - except GaugeAbort as exc: - print(f"[gauge_assembly] 无法开始:{exc}") - code = exc.code - except Exception: # noqa: BLE001 - # 必须**显式**打印:下面的 finally 里有 os._exit()(为了避开 rclpy 关不掉 - # 的僵尸线程),它会把正在传播的异常连栈一起吞掉 —— 现场表现就是 - # "ROS 说进程退出码 2,屏幕上什么都没有",完全没法查。 - import traceback - - traceback.print_exc() - code = 2 - except KeyboardInterrupt: - if node is not None: - node.get_logger().warn("用户中断 —— 按安全高度退出") - code = 130 - finally: - if node is not None: - if not node._result_written: - # 走到这里说明**结论还没发布**(构造失败 / JTC 不在 / 抛异常 / 用户中断)。 - # 补一份,内容是"没跑完",这样脚本不会把"没结论"误当成"没跑"。 - node._write_result_file({ - "ok": False, - "state": str(getattr(node.fsm, "state", "?")), - "exit_code": code, - "reason": "节点在发布结论前就退出了(原因见日志)", - }) - if node is not None: - try: - node._stop_stage1() - except Exception: # noqa: BLE001 - pass - try: - node._safe_retract() - node._shutdown_tf() - except Exception: # noqa: BLE001 - pass - try: - node.destroy_node() - except Exception: # noqa: BLE001 - pass - try: - if rclpy.ok(): - rclpy.shutdown() - except Exception: # noqa: BLE001 - pass - os._exit(code) - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_boot.py b/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_boot.py deleted file mode 100644 index 59bd620..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_boot.py +++ /dev/null @@ -1,405 +0,0 @@ -"""S00 开机自检:把"能不能跑"这件事变成一张**可打印的清单**(纯逻辑部分)。 - -为什么要有这一阶段 ------------------- -看板 S00 的要求是"各服务就绪后才开指令窗,任一不就绪即中止并报告"。它挡的是 -这个仓库最常见的一类事故:**流程跑起来了,只是没接上硬件**。例如: - -* 触觉没起 → 三阶段的力阈值全是 0 → 搜孔"一直没找到"(实际是没数据); -* 相机没起 → 精拍拿不到图 → 报"精拍未拿到图像"(离真正原因差三层); -* 夹爪没起 → S08 松爪/夹紧静默失败 → 棘轮循环空转,看起来像"拧不动"。 - -放纯逻辑里的原因 ----------------- -"要检查哪些东西"是**事实**,会随现场(两台臂、两种夹爪后端、D435 有没有标定) -变化;"怎么检查"是 ROS 机制。前者做成纯函数,就能被测试钉住: - -* 少一项检查 → 测试红(比如"忘了查触觉"); -* 检查项的顺序无关紧要,但**必检项**和**选检项**的划分必须明确 —— - 把核心判据依赖的触觉标成选检,就会在没传感器时一路跑到力判据才失败。 -""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Dict, Iterable, List, Mapping, Optional, Sequence, Tuple - -#: 探针类型 —— 决定节点用哪种方式确认"就绪"。 -#: -#: ``service`` 服务在线且类型匹配 -#: ``action`` action server 在线 -#: ``topic`` 话题在,且**真的收到过消息**(只看 topic list 会假阳性) -#: ``tactile`` 触觉状态话题在发,且 ``connected=true`` -#: ``camera`` 图像话题在发(收到首帧) -#: ``detector`` 算法权重能加载(推理预热) -PROBES = ("service", "action", "topic", "tactile", "camera", "detector") - -#: ``detector`` 自检除了"权重文件在",还要求这些 Python 模块能 import。 -#: 为什么必须查:权重文件在 ≠ 能推理。实测现场 —— 仿真环境(ros_gz_sim)里 -#: 没有 torch/ultralytics,S00 的"检测算法预热"照样报 OK,然后 S04 空转 150s -#: 才报"没锁定",看起来像算法或标定问题(真正的错在很远的另一处)。 -#: ``ultralytics`` 会连带把 torch 拉进来,查它就够;真要细分再看 yolo_detector。 -DETECTOR_MODULES = ("ultralytics",) - -#: 感知来源(``site.yaml`` 顶层 ``perception.source``)—— 谁产生"视觉测量"。 -#: -#: ``yolo`` 本体 perception_node(要 torch/ultralytics) -#: ``truth`` 仿真真值:按场景里已知的物体位姿直接算目标点,不跑推理 -#: ``external`` 外部节点按同一话题(``visual_servo/filtered_point``)提供 -#: -#: ⚠️ 别和 ``yolo.backend`` 混:那个是"**怎么**推理"(tensorrt/onnx)。 -PERCEPTION_SOURCES = ("yolo", "truth", "external") - - -def perception_source_of(perception_cfg: Optional[Mapping] = None) -> str: - """读 ``perception.source`` 并校验。**未知值直接报错,不默默当 yolo**。 - - 默默退回 yolo 的后果:仿真里 perception_node 起不来,S00 又去查 - "推理依赖",报出来的错跟真正的原因(source 拼错)隔着两层。 - """ - src = str(((perception_cfg or {}) or {}).get("source") or "yolo").strip().lower() - if src not in PERCEPTION_SOURCES: - raise ValueError( - f"site.yaml 的 perception.source = {src!r} 不认识。" - f"只支持 {' / '.join(PERCEPTION_SOURCES)}" - "(yolo=本体推理,truth=仿真真值,external=外部节点提供)。" - ) - return src - - -def missing_modules(modules: Sequence[str] = DETECTOR_MODULES) -> List[str]: - """哪些模块当前解释器里 import 不到(纯逻辑,可离线测试)。""" - import importlib.util - - out: List[str] = [] - for m in modules: - try: - if importlib.util.find_spec(m) is None: - out.append(m) - except (ImportError, ValueError): - # find_spec 对"父包不存在/名字非法"会抛,这同样等于"用不了" - out.append(m) - return out - - -def dependency_advice(missing: Sequence[str]) -> str: - """缺依赖时给**两条**出路:装它、或换掉这个后端。 - - 只写"请安装 X"是不够的:仿真环境常常是离线的(这台机器实测 pip 直接 - SSL 失败),那样的话现场需要的是"换一条不依赖它的路",而不是反复重试安装。 - """ - mods = ", ".join(missing) - return ( - f"缺推理依赖 {mods} —— 权重文件在也没用,导入不了就跑不了推理。两条路:\n" - f" 1) 装上:pip install {' '.join(missing)}(需要联网;本机仿真环境离线时做不到)\n" - " 2) 换后端:仿真里可以不用 YOLO —— 由外部按同一话题/同一类型提供感知结果\n" - " (见 devices/sim/gazebo/README.md 的「仿真里哪些模块用真值替代」一节)" - ) - - -@dataclass(frozen=True) -class BootCheck: - """一项自检。""" - - key: str - """稳定标识(日志/结果 JSON 里用它,改名要同步文档)。""" - - label: str - """人读的名字。""" - - probe: str - """见 :data:`PROBES`。""" - - target: str - """要探测的对象:服务名 / action 名 / 话题名 / 权重路径。""" - - why: str - """**缺了会怎样**。自检失败的提示必须写这个 —— 只报"未就绪"没人知道该不该急。""" - - required: bool = True - """必检 / 选检。选检失败只告警,不拦流程。""" - - expect_type: Optional[str] = None - """期望的消息/服务类型(有值时类型不符即算失败)。""" - - -#: 需要"绝对名字"的探针:相对名字会按节点命名空间解析, -#: 节点被放进 namespace 之后 ``home`` 会变成 ``/ns/home`` —— 自检就会去探一个 -#: 不存在的名字,报"未就绪"。统一补前导斜杠,把这件事变成不可能发生。 -_ABSOLUTE_PROBES = frozenset({"service", "action", "topic", "tactile", "camera"}) - - -def abs_name(name: str) -> str: - """把 ROS 名字规范成绝对名(``home`` → ``/home``)。 - - 对外公开:调用方(节点)也要用同一套规范化去比较名字,否则会出现 - "清单里是 /foo、参数里是 foo,比较不相等"这类只在运行时暴露的错。 - """ - n = (name or "").strip() - if not n: - return n - return n if n.startswith("/") else "/" + n - - -def _topic(prefix: str, suffix: str) -> str: - """拼话题名,容忍 ``prefix`` 带不带前导斜杠。""" - p = "/" + prefix.strip("/") if prefix else "" - return f"{p}/{suffix.strip('/')}" - - -def build_checks( - *, - joint_action: str, - camera: str, - tactile_topic: str, - gripper_open: str, - gripper_close: str, - gripper_status: str, - gripper_status_type: str, - d435_camera: Optional[str] = None, - tool_name: str = "", - weights_path: str = "", - perception_source: str = "yolo", -) -> List[BootCheck]: - """按现场情况生成检查清单。 - - :param joint_action: JTC action 名(``rizon_arm_controller/follow_joint_trajectory``)。 - :param camera: 腕部相机命名空间(``d405_left``)。 - :param tactile_topic: 触觉状态话题(``/tactile/left/status``)。 - :param gripper_status: 夹爪状态话题,随后端不同(``/gripper/status`` 或 ``/gripper/states``)。 - :param d435_camera: 手外相机命名空间。给 None 表示这台臂没有手外相机 → - 不生成 S03 相关的检查项(**不生成**比"生成了一个必然失败的项"更诚实: - 后者会让每次启动都报一条无关的错,很快所有人都不看自检输出了)。 - :param tool_name: ``site.yaml`` 的 ``robot.tool_name``。空 = 没指定工具系, - 则 S01 的"工具系垂直向下锁定"无法确认 → 单独列为选检告警。 - :param weights_path: 检测权重路径。空 = 不检查推理预热。 - :param perception_source: ``site.yaml`` 的 ``perception.source``。**只有 - ``yolo`` 才查推理预热**:truth/external 根本不跑推理,查了必然是 - 假阴性("缺 ultralytics"),而那是预期之内的。这里刻意**不生成** - 这一项,而不是生成一个永远 OK 的项 —— 后者会让人以为"感知也验过了"。 - - 清单的顺序 = 打印顺序 = 排障顺序:先臂、再夹爪、再相机、再触觉、最后算法。 - """ - checks: List[BootCheck] = [ - BootCheck( - key="arm_jtc", - label="机械臂关节轨迹控制器", - probe="action", - target=joint_action, - why="没有它,S01/S06/S07/S10 的所有运动都发不出去", - # 类型必须是 **control_msgs**:本流程(和 stage2/stage3/pipeline 一样) - # 直接把轨迹发给 ros2_control 的 JTC 服务端,不经过 arm_control 的 - # 轨迹适配器(那个用的是 arm_msgs/action/FollowJointTrajectory)。 - # 写成 arm_msgs 的会得到一个"永远探不到服务端"的自检 —— 假阴性, - # 而且看起来像控制器没起来。 - expect_type="control_msgs/action/FollowJointTrajectory", - ), - BootCheck( - key="arm_home", - label="回零服务", - probe="service", - target="/home", - why="S01 回 home、S11 复位都靠它", - expect_type="std_srvs/srv/Trigger", - ), - BootCheck( - key="arm_named_pose", - label="命名位姿服务", - probe="service", - target="/set_named_pose", - why="/home 内部转发给它;它不在时回零会超时", - expect_type="arm_msgs/srv/SetNamedPose", - ), - BootCheck( - key="arm_compliant", - label="柔顺下压 action", - probe="action", - target="/compliant_descent", - # 选检:S07 现在走节点内的"步进 + 力突变停"(与这个 action 内部 - # 同一套做法),不依赖它;有它时驱动侧原语更顺,属于加分项。 - # 标成必检会让仿真(arm_driver_flexiv 不参与)永远过不了自检。 - why="有它时 S07 用驱动侧柔顺原语;没有则用节点内步进(不影响正确性)", - required=False, - expect_type="arm_msgs/action/CompliantDescent", - ), - BootCheck( - key="gripper_open", - label="夹爪张开服务", - probe="service", - target=gripper_open, - why="S08 棘轮的『松爪』一步靠它;失败会让回转把规拧回去", - ), - BootCheck( - key="gripper_close", - label="夹爪夹紧服务", - probe="service", - target=gripper_close, - why="S08 的『夹紧』一步靠它;失败会让慢转时规打滑(磨螺纹)", - ), - BootCheck( - key="camera_color", - label="腕部相机彩图", - probe="camera", - target=_topic(camera, "color/image_raw"), - why="S05 精拍定位 k1/k2 靠它;缺了只能靠 S03 粗定位(精度不够)", - expect_type="sensor_msgs/msg/Image", - ), - BootCheck( - key="camera_info", - label="腕部相机内参", - probe="topic", - target=_topic(camera, "color/camera_info"), - why="没有内参就无法把像素反投影成基座坐标(会退化成 60° 默认视场)", - expect_type="sensor_msgs/msg/CameraInfo", - ), - BootCheck( - key="tactile_status", - label="触觉三向力", - probe="tactile", - target=tactile_topic, - why="S07 切向力突变停、S08 拧紧判据、E1 掉件都依赖它;" - "缺了这几个判据全部失效(流程能走完但结果不可信)", - expect_type="arm_msgs/msg/TactileStatus", - ), - BootCheck( - key="gripper_status", - label="夹爪状态反馈", - probe="topic", - target=gripper_status, - why="E1 掉件检测靠它;缺了掉件只能靠人看", - expect_type=gripper_status_type, - ), - ] - - if d435_camera: - checks.append( - BootCheck( - key="coarse_camera", - label="手外粗定位相机", - probe="camera", - target=_topic(d435_camera, "color/image_raw"), - why="S03 兜底粗定位用;缺了只能在 S04 跟踪上多试几次", - required=False, - expect_type="sensor_msgs/msg/Image", - ) - ) - if tool_name: - checks.append( - BootCheck( - key="tool_frame", - label="工具坐标系已指定", - probe="service", # 具体内容由节点按 tool_name 复核(只查服务在不在) - target="/switch_tool", - why=f"要求 tool1(垂直向下、位姿锁定),site.yaml 里配的是 {tool_name!r}", - required=False, - expect_type="arm_msgs/srv/SwitchTool", - ) - ) - # 配了工具系就必须能切:S01 切不过去会直接 TIMEOUT 中止, - # 所以在自检里按**必检**拦下(早报比跑到 S01 再报少一次上电动作)。 - checks.append( - BootCheck( - key="arm_switch_tool", - label="工具系切换服务", - probe="service", - target="/switch_tool", - why=f"site.yaml 指定了工具 {tool_name!r},切不过去后面全是歪的", - expect_type="arm_msgs/srv/SwitchTool", - ) - ) - else: - # 没配工具系:S01 只会告警不会切,所以这条只算选检 —— - # 真机没配工具系是**配置问题**(看板要求 tool1),但仿真里根本没有 - # 工具系切换服务,标必检会让仿真永远过不去。 - checks.append( - BootCheck( - key="arm_switch_tool", - label="工具系切换服务", - probe="service", - target="/switch_tool", - why="本机没配 robot.tool_name:真机应配 tool1 并确认这个服务在;仿真不需要", - required=False, - expect_type="arm_msgs/srv/SwitchTool", - ) - ) - if weights_path and perception_source == "yolo": - checks.append( - BootCheck( - key="detector", - label="检测算法预热", - probe="detector", - target=weights_path, - why="S04 跟踪、S03 粗定位都要它;预热失败会在第一次跟踪时才炸", - ) - ) - - # 网络端点统一成绝对名(见 _ABSOLUTE_PROBES 的说明)。 - # detector 的 target 是文件路径,不参与规范化。 - return [ - c if c.probe not in _ABSOLUTE_PROBES - else BootCheck( - key=c.key, label=c.label, probe=c.probe, target=abs_name(c.target), - why=c.why, required=c.required, expect_type=c.expect_type, - ) - for c in checks - ] - - -def format_report(results: Sequence[Tuple[BootCheck, bool, str]]) -> Tuple[str, List[str]]: - """把逐项结果排成一张表,返回 ``(表文本, 失败项描述)``。 - - ``results`` 每项是 ``(检查项, 是否就绪, 细节)``。 - - 两张输出分开是为了让调用方能按"必检失败"决定是否中止:表用来给人看, - 失败项描述用来进日志/结果 JSON。 - """ - lines: List[str] = ["S00 自检:"] - failures: List[str] = [] - for item, ok, detail in results: - mark = "OK " if ok else ("缺失" if item.required else "告警") - tag = "" if item.required else "(选检)" - lines.append(f" [{mark}] {item.label}{tag} {item.target}") - if detail: - lines.append(f" {detail}") - if not ok: - prefix = "必检项未就绪" if item.required else "选检项未就绪" - failures.append(f"{prefix}:{item.label}({item.target})—— {item.why}") - if failures: - lines.append(f" 共 {len(failures)} 项未就绪") - else: - lines.append(" 全部就绪,开指令窗") - return "\n".join(lines), failures - - -def blocking_failures(results: Iterable[Tuple[BootCheck, bool, str]]) -> List[str]: - """只挑出**必检且未就绪**的项 —— 决定要不要中止的就是它们。 - - 和 :func:`format_report` 的 ``failures`` 的区别:那里两项都收(含选检), - 这里只收必检。合成一个函数的话,调用方一不留神就会拿选检失败去中止流程, - 于是"D435 没接"变成"装配跑不起来"。 - """ - return [ - f"必检项未就绪:{item.label}({item.target})—— {item.why}" - for item, ok, _detail in results - if (not ok) and item.required - ] - - -def optional_warnings(results: Iterable[Tuple[BootCheck, bool, str]]) -> List[str]: - """选检未就绪的告警(不拦流程,但必须打出来)。""" - return [ - f"选检项未就绪:{item.label}({item.target})—— {item.why}" - for item, ok, _detail in results - if (not ok) and not item.required - ] - - -def summary_counts(results: Sequence[Tuple[BootCheck, bool, str]]) -> Dict[str, int]: - """统计``必检/选检``各自通过多少,给启动日志一行摘要。""" - out = {"required_ok": 0, "required_total": 0, "optional_ok": 0, "optional_total": 0} - for item, ok, _detail in results: - slot = "required" if item.required else "optional" - out[f"{slot}_total"] += 1 - if ok: - out[f"{slot}_ok"] += 1 - return out diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_config.py b/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_config.py deleted file mode 100644 index 5bc0bea..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_config.py +++ /dev/null @@ -1,591 +0,0 @@ -"""通止规装配的配置:从 ``site.yaml`` 的 ``gauge_assembly:`` 段解析 + 校验。 - -为什么单独一个模块 ------------------- -这一段的键**全是会动的量**(力阈值、角度、悬高、超时),也是现场最常改的地方。 -散在节点里读的话会有三个已知坑(都被这个仓库踩过): - -1. **名字与单位不一致** —— ``hover`` 填了毫米、代码按米用(规则 M3); -2. **键没接线** —— YAML 里写着 ``screw_step_deg``,代码读的是 ``screw_steps``, - 于是改了没效果,而报错也没有(``config_guard`` 模块的头注释就是这件事); -3. **拼错键名** —— YAML 静默接受,行为退回默认值,现场"改了参数没反应"。 - -所以:所有键在一张表里声明(含单位),解析时**逐条校验**,多出来的键直接 -报错并给出最相近的候选名,缺的键按 required/default 明确处理。 -``describe()`` 把**派生**结果(比如"逆时针最多能转 147°")打出来,让现场 -看到的是"实际生效的值",而不是"我填的值"。 -""" - -from __future__ import annotations - -import difflib -from dataclasses import dataclass, fields -from typing import Any, Dict, Iterable, List, Mapping, Optional, Tuple - -from arm_application.gauge_fsm import descend_tol_m - -#: S05 稳定判据可用的特征来源。``auto`` 按 ``perception.source`` 自动选。 -#: -#: 为什么需要有"motion"这一路:判据原本是**工件检测框中心**的抖动(像素), -#: 那要求检测器真的出框。仿真里合成图过不了真机训练出来的模型(实测最高分 -#: 0.017),于是 S05 会永远"不稳定"地空转 —— 而真正该等的是"相机不再动"。 -#: 用法兰位移(mm)当特征既直接又不依赖模型,且判据本身(到均值的最远距离)不变。 -SNAP_STABLE_FEATURES = ("auto", "bbox", "motion") - -def snap_feature_of(want: str, perception_source: str) -> str: - """把 ``snap_stable_feature``(可能是 ``auto``)+ 感知来源 → 实际用哪个特征。 - - 抽成纯函数是为了能脱离 ROS 节点测:这个选择错了,S05 会在真机上"永远不稳定" - 或者在仿真里空转到超时,而两种表现都像是"机械臂在晃",很难往配置上想。 - """ - want = str(want or "auto") - if want != "auto": - return want - return "bbox" if perception_source == "yolo" else "motion" - - -#: 合法的单位后缀。键名必须以 ``_<单位>`` 结尾(``au`` = Orisys 任意单位增量)。 -_UNIT_SUFFIX: Dict[str, str] = { - "s": "_s", - "deg": "_deg", - "mm": "_mm", - "m": "_m", - "px": "_px", - "pct": "_pct", - "au": "_delta", - # 腕部 FT 的**真牛顿**。与 au 分开一个后缀是刻意的:两个口径混用不会报错, - # 只会"判据不触发"或"一碰就炸",看起来像算法问题(见 site.yaml 的注释)。 - "N": "_n", -} - -#: 显式无量纲的键(布尔、计数、比例、枚举)。**必须在这里列出来** —— -#: 没有单位又不登记的键,会让"单位自检"变成一句空话(规则 M1)。 -_UNITLESS = frozenset( - { - "extreme_direction", - "grip_check", - "coarse_enabled", - "coarse_camera", - "coarse_conf", - "snap_min_frames", - "snap_stable_feature", - "screw_max_cycles", - "unscrew_extra_cycles", - "holes_total", - "dry_run", - } -) - -#: 每个键的**类型**(用于类型校验,不做隐式转换:``"20"`` 不当 20 用)。 -_TYPES: Dict[str, type] = { - "boot_timeout_s": float, - "extreme_angle_deg": float, - "extreme_speed_deg_s": float, - "extreme_direction": int, - "extreme_margin_deg": float, - "grip_check": bool, - "grip_hold_s": float, - "coarse_enabled": bool, - "coarse_camera": str, - "coarse_hover_m": float, - "coarse_conf": float, - "coarse_timeout_s": float, - "snap_stable_s": float, - "snap_tol_px": float, - "snap_tol_mm": float, - "snap_min_frames": int, - "snap_stable_feature": str, - "align_tol_mm": float, - "contact_speed_m_s": float, - "contact_step_mm": float, - "contact_max_depth_mm": float, - "tool_tip_below_flange_m": float, - "workpiece_surface_z_m": float, - "contact_tangential_delta": float, - "contact_axial_delta_n": float, - "contact_relief_mm": float, - "contact_hold_n": float, - "contact_safe_delta": float, - "screw_step_deg": float, - "screw_speed_deg_s": float, - "screw_back_speed_deg_s": float, - "screw_max_cycles": int, - "screw_normal_delta": float, - "screw_shear_delta": float, - "screw_grip_force_pct": float, - "screw_grip_speed_pct": float, - "screw_release_wait_s": float, - "unscrew_extra_cycles": int, - "holes_total": int, - "dry_run": bool, - "reload_timeout_s": float, -} - -#: 每个键的单位。``""`` 表示无量纲(须同时登记在 :data:`_UNITLESS`)。 -_UNITS: Dict[str, str] = { - "boot_timeout_s": "s", - "extreme_angle_deg": "deg", - "extreme_speed_deg_s": "deg/s", - "extreme_direction": "", - "extreme_margin_deg": "deg", - "grip_check": "", - "grip_hold_s": "s", - "coarse_enabled": "", - "coarse_camera": "", - "coarse_hover_m": "m", - "coarse_conf": "", - "coarse_timeout_s": "s", - "snap_stable_s": "s", - "snap_tol_px": "px", - "snap_tol_mm": "mm", - "snap_min_frames": "", - "snap_stable_feature": "", - "align_tol_mm": "mm", - "contact_speed_m_s": "m/s", - "contact_step_mm": "mm", - "contact_max_depth_mm": "mm", - # 这两个是**长度**不是"毫米量":用 m 口径,与 hover_z 同一把尺 - "tool_tip_below_flange_m": "m", - "workpiece_surface_z_m": "m", - "contact_tangential_delta": "au", - # 腕部 FT 是**真牛顿**(与触觉的 au 不是一个口径,所以键名也不带 taut 前缀) - "contact_axial_delta_n": "N", - # 卸载回退是**长度**(与 step_mm 同一把尺) - "contact_relief_mm": "mm", - # 残余轴向力是**牛顿**(腕部 FT 口径,不是触觉的 au) - "contact_hold_n": "N", - "contact_safe_delta": "au", - "screw_step_deg": "deg", - "screw_speed_deg_s": "deg/s", - "screw_back_speed_deg_s": "deg/s", - "screw_max_cycles": "", - "screw_normal_delta": "au", - "screw_shear_delta": "au", - "screw_grip_force_pct": "pct", - "screw_grip_speed_pct": "pct", - "screw_release_wait_s": "s", - "unscrew_extra_cycles": "", - "holes_total": "", - "dry_run": "", - "reload_timeout_s": "s", -} - -#: 键名后缀与单位必须一致(防"填毫米当米用")。``contact_speed_m_s`` 这类 -#: 复合单位只检查主单位段。 -_SUFFIX_OVERRIDE: Dict[str, str] = { - # 复合单位:后缀取"最后一个单位段",键名里写全 - "contact_speed_m_s": "_m_s", - "extreme_speed_deg_s": "_deg_s", - "screw_speed_deg_s": "_deg_s", - "screw_back_speed_deg_s": "_deg_s", -} - - -class GaugeConfigError(ValueError): - """``gauge_assembly:`` 段配置错误。消息里必须给出**改哪里**。""" - - -# ============================================================================= -# 默认值 -# ============================================================================= -#: 缺省值。**只有真的有现场依据的才写默认值**:力阈值这类必须现场标定的, -#: 默认值只是"能跑起来的起点",必须在 ``describe()`` 里标出来让现场知道要改。 -DEFAULTS: Dict[str, Any] = { - "boot_timeout_s": 30.0, - # S01:逆时针预绕。符号靠 extreme_direction 定,不靠改代码里的负号。 - "extreme_angle_deg": 150.0, - "extreme_speed_deg_s": 20.0, - "extreme_direction": 1, - "extreme_margin_deg": 3.0, - # S02(预留) - "grip_check": False, - "grip_hold_s": 0.5, - # S03 - "coarse_enabled": True, - "coarse_camera": "d435", - "coarse_hover_m": 0.25, - "coarse_conf": 0.35, - "coarse_timeout_s": 20.0, - # S05 - "snap_stable_s": 1.0, - "snap_tol_px": 2.0, - "snap_tol_mm": 0.4, - "snap_min_frames": 6, - "snap_stable_feature": "auto", - # S06 - "align_tol_mm": 1.0, - # S07 - "contact_speed_m_s": 0.02, - "contact_step_mm": 0.5, - "contact_max_depth_mm": 35.0, - "tool_tip_below_flange_m": 0.243, - "workpiece_surface_z_m": 0.0, # 0 = 未知,运行期用 stage2 实测孔位兜底 - "contact_tangential_delta": 300.0, - # 腕部 FT 的轴向力阈值 [N]。**这是 S07 的首选判据**,触觉只是兜底。 - # - # 为什么默认是 8N 这么小:这是"接触了没有"的判据,不是"压到位了没有"。 - # 台肩一落面,接触刚度 5e4 N/m 意味着过压 0.1mm 就有 5N、0.2mm 有 10N —— - # 所以 8N 对应约 0.16mm 的过压,**在打滑之前**就能判到(打滑上限由 - # µ·N 决定:µ=0.25、N≈46N → 两指合计 ~23N ≈ 0.46mm)。留了 3 倍余量。 - # 现场标定法:空载慢慢压到台肩落面,看日志里"腕部轴向"从基线涨到多少, - # 取那个值的 1/3 作为阈值(要能区分"擦到孔壁"和"台肩落面")。 - "contact_axial_delta_n": 8.0, - # 接触到之后的**卸载回退** [mm]。 - # - # 为什么必须有这一步(2026-09-24 一整轮排查换来的): - # 位置控制的臂在"撞上硬面"时会把力顶到自己的**出力上限**才停住 —— - # 仿真实测:一步 0.5mm 的指令压在工件上,腕部 FT 读数直接跳到 **+244N**, - # 而臂这一步根本没走完("实测只走了 +0.09mm")。这不是仿真特有的: - # 接触刚度越高、步长越大,峰值力就越大,而位置环**不限制**它。 - # - # 规是**靠夹持摩擦**抱住的,轴向能传的力上限是 µ·N(两指合计 ~73N@µ=0.8)。 - # 244N 远超这个上限 ⇒ 规被轴向力**顶出爪外**(本次就是:S08 一转, - # 规直接掉到地上,报 E1)。所以"判到接触"之后不能就那样顶着, - # 必须先把下压量放掉,再交给 S08 拧入。 - # - # 0.5mm 的来历:判到接触时的**真实**过压量通常只有 0.0x mm(刚度 5e4 N/m - # 时,10N 对应 0.2mm),回退 0.5mm 足够把力放干净,而规尖仍在孔里 - # (通端穿板 18mm),不会脱出。 - "contact_relief_mm": 0.5, - # 卸载后允许的残余轴向力 [N]。 - # 超了不失败(可能只是回退量不够),但要**大声报**:它说明"夹持摩擦力不够 - # 承受这次接触",接着 S08 一转就会掉件。调法只有两条 —— 降峰值(调小 - # contact_step_mm / contact_relief_mm)或加握力(改夹爪合拢力度/指垫)。 - "contact_hold_n": 5.0, - "contact_safe_delta": 2000.0, - # S08 - # 步长必须满足 2×step + 2×余量 ≤ 关节7 行程(Rizon4/10 ±175° ⇒ step ≤ 167°): - # 180° 会必然贴限位(棘轮一个来回要 360° > 350°),实测第 3 轮 ABORT。 - "screw_step_deg": 120.0, - "screw_speed_deg_s": 30.0, - "screw_back_speed_deg_s": 120.0, - "screw_max_cycles": 12, - "screw_normal_delta": 400.0, - "screw_shear_delta": 600.0, - "screw_grip_force_pct": 50.0, - "screw_grip_speed_pct": 50.0, - "screw_release_wait_s": 0.3, - # S09 - "unscrew_extra_cycles": 1, - # 全局 - "holes_total": 2, - "dry_run": False, - # E1(掉件)重放:等操作员放好并确认 /gauge/reload_ok 的最长时间。 - # 超时 = 中止(臂在 home,人不在旁边时"继续等"比"停"更危险)。 - "reload_timeout_s": 180.0, -} - - -@dataclass(frozen=True) -class GaugeConfig: - """通止规装配的全部可调量(解析并校验之后)。""" - - boot_timeout_s: float - extreme_angle_deg: float - extreme_speed_deg_s: float - extreme_direction: int - extreme_margin_deg: float - grip_check: bool - grip_hold_s: float - coarse_enabled: bool - coarse_camera: str - coarse_hover_m: float - coarse_conf: float - coarse_timeout_s: float - snap_stable_s: float - snap_tol_px: float - snap_tol_mm: float - snap_min_frames: int - snap_stable_feature: str - align_tol_mm: float - contact_speed_m_s: float - contact_step_mm: float - contact_max_depth_mm: float - tool_tip_below_flange_m: float - workpiece_surface_z_m: float - contact_tangential_delta: float - contact_axial_delta_n: float - contact_relief_mm: float - contact_hold_n: float - contact_safe_delta: float - screw_step_deg: float - screw_speed_deg_s: float - screw_back_speed_deg_s: float - screw_max_cycles: int - screw_normal_delta: float - screw_shear_delta: float - screw_grip_force_pct: float - screw_grip_speed_pct: float - screw_release_wait_s: float - unscrew_extra_cycles: int - holes_total: int - dry_run: bool - reload_timeout_s: float - - # -- 派生量(不占 YAML 键,免得两处各写一份,规则 M2)------------------- - @property - def screw_step_rad(self) -> float: - import math - - return math.radians(self.screw_step_deg) - - @property - def total_screw_deg(self) -> float: - """一根规要拧进去的总角度 = 单次转角 × 循环数。""" - return self.screw_step_deg * self.screw_max_cycles - - @property - def unscrew_cycles(self) -> int: - """拧出要多转几轮:多留 ``unscrew_extra_cycles`` 轮,确保螺纹完全脱开。""" - return self.screw_max_cycles + max(0, self.unscrew_extra_cycles) - - def describe(self) -> List[str]: - """启动时打印的行:**实际生效的**值与派生结论。 - - 特别是 S01 的"能转多少度"和 S08 的"要拧多少轮"—— 这两个数是现场 - 判断"参数是否真的生效"最直接的依据,比打印"我读了 site.yaml"有用。 - """ - return [ - f"通止规装配:每孔孔数 {self.holes_total},干跑={self.dry_run}", - f" S01 预绕 {self.extreme_angle_deg:.1f}°(方向={'逆时针' if self.extreme_direction > 0 else '顺时针'}," - f"限位余量 {self.extreme_margin_deg:.1f}°,关节速度 {self.extreme_speed_deg_s:.1f}°/s)", - f" S03 粗定位={'开' if self.coarse_enabled else '关'} 相机={self.coarse_camera} " - f"悬高 {self.coarse_hover_m * 1000:.0f}mm 置信度≥{self.coarse_conf:.2f}", - f" S05 稳定 {self.snap_stable_s:.1f}s / 至少 {self.snap_min_frames} 帧 / " - f"特征={self.snap_stable_feature}" - f"(检测框 ≤{self.snap_tol_px:.1f}px、法兰位移 ≤{self.snap_tol_mm:.2f}mm)" - "(稳定判据用「到均值的最远距离」,不是相邻帧之差)", - # 悬停高度**不在这里**:它取自 servo.hole_hover_z_m(stage2 那一层), - # 这里只印本段的容差 —— 一段配置里出现"另一个段的键"会让人改错地方。 - f" S06 对位容差 {self.align_tol_mm:.1f}mm(悬停高取自 servo.hole_hover_z_m)", - f" S07 腕部轴向突变阈值 +{self.contact_axial_delta_n:.0f}N(**首选判据**," - "腕部 FT 在夹持摩擦的上游,工具打滑也测得准)," - f"切向突变阈值 +{self.contact_tangential_delta:.0f}au(触觉兜底,两通道任一,现场标定)," - f"安全上限 +{self.contact_safe_delta:.0f},最多下探 {self.contact_max_depth_mm:.0f}mm", - f" S07 接触后卸载:回退 {self.contact_relief_mm:.2f}mm," - f"残余轴向力要求 ≤{self.contact_hold_n:.1f}N" - "(位置控制的臂撞上硬面会把力顶到出力上限再停住,实测能到 200N+;" - "规靠夹持摩擦抱住,轴向上限只有 µ·N≈73N,顶着不放 S08 一转就掉件)", - f" S07 工具几何:尖端在法兰下方 {self.tool_tip_below_flange_m * 1000:.1f}mm," - f"工件上表面 z={self.workpiece_surface_z_m:.3f}m" - "(启动时会按这两个值 + servo.hole_hover_z_m 算「悬停时工具到底入没入工件」," - "入了会**明确报错**——见 gauge_fsm.tool_clearance_m)", - f" S07 步进 {self.contact_step_mm:.2f}mm @ {self.contact_speed_m_s * 1000:.0f}mm/s," - f"到位容差 {descend_tol_m(self.contact_step_mm / 1000.0) * 1000:.3f}mm" - "(=步长的 40%,**推导出来的、不是可调项**:容差 ≥ 步长会让每一步都被判成" - "「已在容差内」,臂一步都不走)", - f" S08 棘轮 {self.screw_step_deg:.0f}°×{self.screw_max_cycles} 轮 = 累计 " - f"{self.total_screw_deg:.0f}°;停止判据「切向 >+{self.screw_shear_delta:.0f} 且 " - f"法向 >+{self.screw_normal_delta:.0f}」", - f" S09 拧出 {self.unscrew_cycles} 轮(比拧入多 {self.unscrew_extra_cycles} 轮)", - ] - - -def _resolve_one(key: str, raw: Mapping[str, Any]) -> Tuple[Any, bool]: - """取一个键的值,返回 ``(值, 是否来自 site.yaml)``。""" - if key in raw: - value = raw[key] - elif key in DEFAULTS: - return DEFAULTS[key], False - else: - raise GaugeConfigError( - f"gauge_assembly.{key} 既没在 site.yaml 里给,也没有默认值。" - f"请在 config/site.yaml 的 gauge_assembly: 段补上" - f"(改完跑一次 bash scripts/show_site_config.sh 确认解析)" - ) - - want = _TYPES[key] - if want is bool and not isinstance(value, bool): - raise GaugeConfigError(_type_msg(key, value, "布尔 true/false")) - if want is int and (isinstance(value, bool) or not isinstance(value, int)): - raise GaugeConfigError(_type_msg(key, value, "整数")) - if want is float and (isinstance(value, bool) or not isinstance(value, (int, float))): - raise GaugeConfigError(_type_msg(key, value, "数字(可带小数)")) - if want is str and not isinstance(value, str): - raise GaugeConfigError(_type_msg(key, value, "字符串")) - return (float(value) if want is float else value), True - - -def _type_msg(key: str, value: Any, human: str) -> str: - unit = _UNITS[key] - hint = f",单位 {unit}" if unit else "" - return ( - f"gauge_assembly.{key} 的类型不对:期望 {human}{hint}," - f"实际读到 {value!r}({type(value).__name__})。" - "本模块不做隐式转换 —— \"20\" 不会被当成 20 用," - "因为那正是「填了字符串、跑起来是默认值」这类静默失效的入口" - ) - - -def from_site(site: Mapping[str, Any], *, overrides: Optional[Mapping[str, Any]] = None) -> GaugeConfig: - """解析并校验 ``site.yaml`` 的 ``gauge_assembly:`` 段。 - - :param site: ``site.yaml`` 解析后的整份字典。 - :param overrides: CLI/launch 覆盖(只允许覆盖已知键,未知键报错)。 - :raises GaugeConfigError: 缺键、类型错、未知键、单位与键名不符。 - - 整段缺失**不报错**(全部走默认值),但会在 :meth:`GaugeConfig.describe` - 之外由调用方打一条告警;理由是"默认值能不能用"取决于现场, - 由节点决定要不要拒绝启动,配置模块只负责如实解析。 - """ - raw_any = site.get("gauge_assembly") or {} - if not isinstance(raw_any, Mapping): - raise GaugeConfigError( - "site.yaml 的 gauge_assembly: 应该是一段映射(键值对)," - f"实际是 {type(raw_any).__name__}" - ) - raw: Dict[str, Any] = dict(raw_any) - - if overrides: - bad = [k for k in overrides if k not in _TYPES] - if bad: - raise GaugeConfigError( - f"未知的覆盖参数: {', '.join(sorted(bad))}。" - f"可在 gauge_assembly 段覆盖的键见 gauge_config._TYPES" - ) - raw.update({k: v for k, v in overrides.items() if v is not None}) - - _reject_unknown(raw) - values = {key: _resolve_one(key, raw)[0] for key in _TYPES} - cfg = GaugeConfig(**values) - _sanity(cfg) - return cfg - - -def _reject_unknown(raw: Mapping[str, Any]) -> None: - """多余的键直接报错,并给出最相近的候选名。 - - 静默忽略多余键的代价是:现场写 ``screw_step_degs``,改参数没反应, - 而日志里一切正常。报错里带候选名,是因为拼错比写错新键常见得多。 - """ - unknown = sorted(set(raw) - set(_TYPES)) - if not unknown: - return - lines: List[str] = [] - for key in unknown: - close = difflib.get_close_matches(key, list(_TYPES), n=1, cutoff=0.6) - hint = f",是不是想写 {close[0]}?" if close else "" - lines.append(f" - {key}{hint}") - raise GaugeConfigError( - "site.yaml 的 gauge_assembly: 段里有本框架不认识的键:\n" - + "\n".join(lines) - + "\n多余的键不会被忽略,因为「写了没生效」比「写错报错」难查得多。" - "确认要新增配置项时,先在 gauge_config._TYPES / _UNITS 里登记" - ) - - -def _sanity(cfg: GaugeConfig) -> None: - """跨键的合理性检查:单键合法、组合起来没意义的,在这里挡住。""" - if cfg.holes_total < 1: - raise GaugeConfigError(f"gauge_assembly.holes_total 至少为 1,收到 {cfg.holes_total}") - if cfg.extreme_direction not in (-1, 1): - raise GaugeConfigError( - f"gauge_assembly.extreme_direction 只能是 +1(逆时针)或 -1(顺时针)," - f"收到 {cfg.extreme_direction}" - ) - if cfg.screw_step_deg <= 0.0: - raise GaugeConfigError( - f"gauge_assembly.screw_step_deg 必须为正,收到 {cfg.screw_step_deg}" - ) - if cfg.screw_max_cycles < 1: - raise GaugeConfigError( - f"gauge_assembly.screw_max_cycles 至少为 1,收到 {cfg.screw_max_cycles}" - ) - if cfg.extreme_angle_deg <= 0.0: - raise GaugeConfigError( - f"gauge_assembly.extreme_angle_deg 必须为正(方向由 extreme_direction 决定," - f"不要用负角度表方向),收到 {cfg.extreme_angle_deg}" - ) - if cfg.contact_safe_delta <= cfg.contact_tangential_delta: - raise GaugeConfigError( - f"contact_safe_delta({cfg.contact_safe_delta}) 必须大于 " - f"contact_tangential_delta({cfg.contact_tangential_delta}):" - "前者是「立刻抬臂」的安全上限,后者只是「停止下压」。" - "两者相等的话,接触一开始就会触发安全上限" - ) - if cfg.tool_tip_below_flange_m <= 0.0: - raise GaugeConfigError( - f"tool_tip_below_flange_m 必须为正(工具尖端在法兰**下方**多少米)," - f"收到 {cfg.tool_tip_below_flange_m}。" - "填 0 会让「悬停时工具会不会已经插进工件」这个判断失效" - ) - if cfg.snap_tol_px <= 0.0: - raise GaugeConfigError(f"gauge_assembly.snap_tol_px 必须为正,收到 {cfg.snap_tol_px}") - if cfg.contact_relief_mm < 0.0: - raise GaugeConfigError( - f"gauge_assembly.contact_relief_mm 不能为负(0 = 接触到之后不卸载)," - f"收到 {cfg.contact_relief_mm}。\n" - " 它为什么值得一条检查:位置控制的臂撞上硬面会把轴向下压顶到**出力上限**" - "才停住(实测 200N+),而规靠夹持摩擦抱住、轴向上限只有 µ·N(≈73N)。" - "卸载这一步省掉,S08 一转就掉件(报 E1)—— 而那时的日志只会说" - "「通止规掉了」,看不到真因。" - ) - if cfg.contact_hold_n <= 0.0: - raise GaugeConfigError( - f"gauge_assembly.contact_hold_n 必须为正(卸载后的残余轴向力上限 [N])," - f"收到 {cfg.contact_hold_n}。0 会让「卸载干不干净」永远判不过。" - ) - if cfg.snap_tol_mm <= 0.0: - raise GaugeConfigError(f"gauge_assembly.snap_tol_mm 必须为正,收到 {cfg.snap_tol_mm}") - if cfg.snap_stable_feature not in SNAP_STABLE_FEATURES: - raise GaugeConfigError( - f"gauge_assembly.snap_stable_feature={cfg.snap_stable_feature!r} 不认识," - f"只支持 {sorted(SNAP_STABLE_FEATURES)}。\n" - f" auto = 按 perception.source 自动选(真机 yolo→bbox、仿真/外部→motion)\n" - f" bbox = 用工件检测框中心(像素),需要检测器真的出框\n" - f" motion = 用法兰位移(mm),不依赖检测器" - ) - - -# ============================================================================= -# 自检:键名必须体现单位(防"填了毫米按米用") -# ============================================================================= -def unit_violations(keys: Optional[Iterable[str]] = None) -> List[str]: - """返回"键名与单位不符"的清单(空 = 全部合规)。 - - 规则:单位非空的键,**键名必须以对应的单位后缀结尾**(见 :data:`_UNIT_SUFFIX`)。 - 例外只有 :data:`_SUFFIX_OVERRIDE` 里显式登记的复合单位。 - - 为什么值得一条专门的检查:``hover`` 填毫米、代码按米用,会给出一个 - "看起来完全合理"的运动(悬停 5 变成悬停 5 米或 5 毫米), - 而 :mod:`arm_interfaces.config_guard` 的头注释记录的正是这类事故。 - """ - bad: List[str] = [] - for key in keys if keys is not None else _UNITS: - unit = _UNITS[key] - if not unit: - if key not in _UNITLESS: - bad.append(f"{key}: 无量纲但未登记在 _UNITLESS") - continue - suffix = _SUFFIX_OVERRIDE.get(key) - if suffix is None: - base = unit.split("/")[0] - suffix = _UNIT_SUFFIX.get(base) - if suffix is None: - bad.append(f"{key}: 单位 {unit} 没有登记后缀(补 _UNIT_SUFFIX 或 _SUFFIX_OVERRIDE)") - continue - if not key.endswith(suffix): - bad.append(f"{key}: 单位是 {unit},键名应以 {suffix} 结尾") - return bad - - -def missing_entries() -> List[str]: - """三张表(类型/单位/默认值)是否互相覆盖完整。""" - problems: List[str] = [] - for key in _TYPES: - if key not in _UNITS: - problems.append(f"{key}: 缺 _UNITS 登记") - if key not in DEFAULTS: - problems.append(f"{key}: 缺 DEFAULTS(required 的键也应写一个起点值并在文档里标注必标定)") - for key in _UNITS: - if key not in _TYPES: - problems.append(f"{key}: 在 _UNITS 里但不在 _TYPES 里") - for key in DEFAULTS: - if key not in _TYPES: - problems.append(f"{key}: 在 DEFAULTS 里但不在 _TYPES 里") - return problems - - -def dataclass_keys() -> List[str]: - """:class:`GaugeConfig` 的字段名 —— 与配置表比对,防"解析了但没存进对象"。""" - return [f.name for f in fields(GaugeConfig)] diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_fsm.py b/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_fsm.py deleted file mode 100644 index 55ebdca..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_fsm.py +++ /dev/null @@ -1,1060 +0,0 @@ -"""通止规装配的状态机 —— **纯逻辑**,不 import rclpy,可离线单测。 - -为什么单独一个文件 ------------------- -状态机的价值全在"顺序"和"边界"上:S07 的力判据有没有在 S08 之前生效、 -E1 掉件之后到底回到哪一步、k2 是"回到 S05 记录的位姿"还是"重新拍照"。 -这些错**不会在运行时暴露成异常**,只会表现成"流程走得下去但结果不对", -和力轴向映射反了一样属于静默失效(规则 R5.1)。所以转移表写成**数据**, -由测试逐条钉住,而不是散在节点的一堆 if/else 里。 - -设计口径 --------- -- 状态编号与看板《五、通止规定位装配:状态机设计》一致(S00–S11), - E1/E2 两条异常分支也在这里,**改名要同步改看板与文档**(规则 R6.1)。 -- 转移表只回答"给这个事件、从当前状态去哪";**做不做得了**由节点判断 - (比如 S03 需要 D435 手眼,没标定就报 COARSE_FAIL 走 S04 兜底)。 - 状态机不掺硬件条件,否则没法离线测。 -- 上下文里的两个字段(`hole_index` / `holes_total`)只影响 S09 的出口: - 最后一个孔拧出后去 S11 复位,否则去 S10 换到下一个孔。 -""" - -from __future__ import annotations - -import math -from dataclasses import dataclass, field -from enum import Enum -from typing import Dict, List, Optional, Sequence, Tuple - - -# ============================================================================= -# 状态与事件 -# ============================================================================= -class State(str, Enum): - """S00–S11 全部状态 + 两个终态。""" - - BOOT = "S00" # 各服务自检(伺服/相机/夹爪/触觉图传/推理预热) - HOME_EXTREME = "S01" # 回 home + 按 tool 系逆时针转到极限角 - GRIP_CHECK = "S02" # 夹持确认(预留,当前跳过) - COARSE = "S03" # 手外 D435 粗定位 - TRACK = "S04" # 腕部 D405 跟踪 k0 - SNAP = "S05" # 像素稳定后拍照定位 k1/k2 + 记位姿 - HOVER_K = "S06" # 到当前孔正悬停 - CONTACT = "S07" # 柔顺接触(切向力突变停) - SCREW_IN = "S08" # 旋转装配循环 - UNSCREW = "S09" # 反向拧出 - NEXT_HOLE = "S10" # 换到下一个孔(回到 S05 记录的位姿) - RESET = "S11" # 复位退出 - DONE = "DONE" # 正常结束 - ABORT = "ABORT" # 中止(已按安全顺序退出到安全高度) - - def __str__(self) -> str: # 日志里直接印 S07 而不是 State.CONTACT - return self.value - - -class Event(str, Enum): - """驱动状态机的事件。命名规则:``动作_结果``。""" - - BOOT_OK = "boot_ok" - BOOT_FAIL = "boot_fail" - - POSE_OK = "pose_ok" - JOINT_LIMIT = "joint_limit" # S01 转不动 = 已经贴着关节极限 - - GRIP_PASS = "grip_pass" - GRIP_FAIL = "grip_fail" - GRIP_SKIPPED = "grip_skipped" # S02 预留:没装/没标定,明确跳过 - - COARSE_OK = "coarse_ok" - COARSE_FAIL = "coarse_fail" - - TRACK_LOCKED = "track_locked" - TRACK_LOST = "track_lost" # 丢失超时 → 回 S03 兜底 - - SNAP_OK = "snap_ok" - SNAP_UNSTABLE = "snap_unstable" # 画面还在动,继续等 - - ALIGN_OK = "align_ok" - ALIGN_OUT = "align_out" # 对位超差 → 回 S05 重拍 - - CONTACT_OK = "contact_ok" - FORCE_OVER_LIMIT = "force_over_limit" # 力超安全上限 → 抬起 - #: S07 判到接触、但**下压深度远小于几何预期** ⇒ 规没进孔,顶在工件上表面。 - #: 单列一个事件是为了让结论与日志都是实话:复用 FORCE_OVER_LIMIT 会把这种 - #: 情况报成"力超安全上限",而它的力根本没超限 —— 又是一句误导。 - HOLE_LOST = "hole_lost" - - SCREW_DONE = "screw_done" - SCREW_STOP = "screw_stop" # 力判据满足:切向力>阈值 且 法向力突增 - GAUGE_DROPPED = "gauge_dropped" # E1:夹持丢了 - - UNSCREW_DONE = "unscrew_done" - - RELOADED = "reloaded" # E1:人工放好按 R 之后 - TIMEOUT = "timeout" # E2:任意阶段超时 - ABORT = "abort" # 用户 ^C / 外部中止 - - -#: 终态:到这里状态机不再接受事件。 -TERMINAL = frozenset({State.DONE, State.ABORT}) - - -# ============================================================================= -# 上下文:只放"影响去哪"的可变数据,不放硬件句柄 -# ============================================================================= -@dataclass -class GaugeContext: - """状态机运行上下文。 - - :param holes_total: 一次任务要装的孔数(k1/k2 两个就是 2)。 - :param hole_index: 当前孔序号,0 基。S10 会 +1。 - :param relocations: E1 掉件后人工重放计数,用于日志与上限保护。 - :param max_relocations: 允许的掉件重试次数,超了直接 ABORT, - 避免"掉件 → 重放 → 又掉"无限循环。 - """ - - holes_total: int = 2 - hole_index: int = 0 - relocations: int = 0 - max_relocations: int = 3 - notes: List[str] = field(default_factory=list) - - @property - def is_last_hole(self) -> bool: - return self.hole_index >= self.holes_total - 1 - - def hole_name(self) -> str: - """给日志用的人读孔名:k1 / k2。""" - return f"k{self.hole_index + 1}" - - -# ============================================================================= -# 转移表 -# ============================================================================= -#: ``(状态, 事件) -> 下一状态``。**没有列出的组合就是非法转移**, -#: 会抛 :class:`FsmError` —— 宁可当场炸,也不要"悄悄停在原地"。 -TRANSITIONS: Dict[Tuple[State, Event], State] = { - # --- S00 自检 --- - (State.BOOT, Event.BOOT_OK): State.HOME_EXTREME, - (State.BOOT, Event.BOOT_FAIL): State.ABORT, - # --- S01 home + 极限角 --- - (State.HOME_EXTREME, Event.POSE_OK): State.GRIP_CHECK, - # 转不动不是失败:已经贴着极限,就按当前角继续(提示即可) - (State.HOME_EXTREME, Event.JOINT_LIMIT): State.GRIP_CHECK, - # E1 掉件后半段:S01 流程走完 → 提示人工放置 → 按 R → 回记录位姿继续 - (State.HOME_EXTREME, Event.RELOADED): State.NEXT_HOLE, - # --- S02 夹持确认(预留)--- - (State.GRIP_CHECK, Event.GRIP_SKIPPED): State.TRACK, - (State.GRIP_CHECK, Event.GRIP_PASS): State.TRACK, - (State.GRIP_CHECK, Event.GRIP_FAIL): State.ABORT, - # --- S03 手外粗定位(S04 的兜底,不是必经)--- - (State.COARSE, Event.COARSE_OK): State.SNAP, - (State.COARSE, Event.COARSE_FAIL): State.TRACK, - # --- S04 跟踪 --- - (State.TRACK, Event.TRACK_LOCKED): State.SNAP, - (State.TRACK, Event.TRACK_LOST): State.COARSE, - # --- S05 稳定拍照 --- - (State.SNAP, Event.SNAP_OK): State.HOVER_K, - (State.SNAP, Event.SNAP_UNSTABLE): State.SNAP, # 自环:继续等稳定 - # --- S06 正悬停 --- - (State.HOVER_K, Event.ALIGN_OK): State.CONTACT, - (State.HOVER_K, Event.ALIGN_OUT): State.SNAP, # 对位超差 → 回 S05 重拍 - # --- S07 柔顺接触 --- - (State.CONTACT, Event.CONTACT_OK): State.SCREW_IN, - (State.CONTACT, Event.FORCE_OVER_LIMIT): State.ABORT, - (State.CONTACT, Event.HOLE_LOST): State.ABORT, - # --- S08 旋转装配循环 --- - (State.SCREW_IN, Event.SCREW_DONE): State.UNSCREW, - (State.SCREW_IN, Event.SCREW_STOP): State.UNSCREW, - (State.SCREW_IN, Event.GAUGE_DROPPED): State.HOME_EXTREME, # E1 前半段 - # --- S09 反向拧出的出口与"是不是最后一个孔"有关,见 resolve_next() --- - # --- S10 换到下一个孔(= 回到 S05 记录的位姿),到了就重复 S06–S09 --- - (State.NEXT_HOLE, Event.POSE_OK): State.HOVER_K, - # --- S11 复位退出 --- - (State.RESET, Event.POSE_OK): State.DONE, -} - -#: 兜底:任意非终态收到 ABORT / TIMEOUT 都去对应终态。 -#: 单列出来是因为"每个状态各自列一遍"最容易漏,而漏的那个状态恰恰会在 -#: 真机上表现为"按了急停但流程还在跑"。 -GLOBAL: Dict[Event, State] = { - Event.ABORT: State.ABORT, - Event.TIMEOUT: State.ABORT, -} - - -def resolve_next(state: State, event: Event, ctx: GaugeContext) -> State: - """算出下一状态。 - - 绝大多数组合直接查 :data:`TRANSITIONS`;只有一处要结合上下文: - - * ``S09 + UNSCREW_DONE``:最后一个孔 → S11 复位;否则 → S10 换到下一个孔。 - - 其余"看起来需要上下文"的分支都用了**显式事件**,而不是让 resolve_next - 去猜(比如 E1 重放用 ``RELOADED`` 而不是"看 relocations 是否大于 0")。 - 猜出来的分支在测试里只能靠改内部计数复现,读代码的人也得跟着一起猜。 - """ - # 全局兜底优先:谁都得能被中止 - if event in GLOBAL: - return GLOBAL[event] - - if state is State.UNSCREW and event is Event.UNSCREW_DONE: - return State.RESET if ctx.is_last_hole else State.NEXT_HOLE - - try: - return TRANSITIONS[(state, event)] - except KeyError: - raise FsmError(state, event, ctx) from None - - -class FsmError(RuntimeError): - """非法转移。附带当前状态与事件,方便直接定位是哪一步没接上。""" - - def __init__(self, state: State, event: Event, ctx: Optional[GaugeContext] = None) -> None: - self.state = state - self.event = event - ctx = ctx or GaugeContext() - super().__init__( - f"通止规装配状态机:状态 {state}({STATE_DOC.get(state, '?')})" - f"不接受事件 {event.value}。当前孔 {ctx.hole_name()}," - f"已重放 {ctx.relocations} 次。" - "若是新增流程,先在 gauge_fsm.TRANSITIONS 里登记这条转移。" - ) - - -# ============================================================================= -# 状态机本体 -# ============================================================================= -@dataclass -class Step: - """一次转移的记录,用于日志与事后复盘。""" - - index: int - prev: State - event: Event - next: State - - def __str__(self) -> str: - return f"#{self.index} {self.prev} --{self.event.value}--> {self.next}" - - -class GaugeFsm: - """通止规装配状态机。 - - 用法:: - - fsm = GaugeFsm(GaugeContext(holes_total=2)) - fsm.handle(Event.BOOT_OK) # S00 -> S01 - print(fsm.state) # S01 - fsm.handle(Event.ABORT) # 任何状态都能中止 - """ - - def __init__(self, ctx: Optional[GaugeContext] = None, start: State = State.BOOT) -> None: - self.ctx = ctx or GaugeContext() - self.state = start - self.history: List[Step] = [] - - # -- 查询 --------------------------------------------------------------- - @property - def is_terminal(self) -> bool: - return self.state in TERMINAL - - @property - def ok(self) -> bool: - return self.state is State.DONE - - def can(self, event: Event) -> bool: - """这个事件在当前状态下合法吗(不改状态,给"要不要试"用)。""" - if event in GLOBAL: - return not self.is_terminal - try: - resolve_next(self.state, event, self.ctx) - except FsmError: - return False - return True - - # -- 推进 --------------------------------------------------------------- - def handle(self, event: Event) -> State: - """吃一个事件,返回新状态。非法转移抛 :class:`FsmError`。""" - if self.is_terminal: - raise FsmError(self.state, event, self.ctx) - prev = self.state - # 先算转移(非法转移在这里就抛,**不留副作用**)—— - # 顺序反过来的话,一次手误的 GAUGE_DROPPED 会白白吃掉一次重放预算, - # 报错信息还说"状态不对",而现场已经少了一次重试机会。 - nxt = resolve_next(prev, event, self.ctx) - - if event is Event.GAUGE_DROPPED: - self.ctx.relocations += 1 - if self.ctx.relocations > self.ctx.max_relocations: - # **超过上限不抛异常**:掉件 4 次不是"程序非法状态",是现场问题。 - # 报错文案要指出现场(夹持/螺纹),而不是指着转移表说这条边不存在。 - self.note( - f"通止规已掉 {self.ctx.relocations} 次(上限 " - f"{self.ctx.max_relocations}),不再自动重放,请检查夹持与螺纹" - ) - nxt = State.ABORT - - if nxt is State.NEXT_HOLE and prev is not State.NEXT_HOLE: - # 换孔动作:序号在**进入** S10 时推进;S10 完成就是新孔的 S06。 - self.ctx.hole_index = min(self.ctx.hole_index + 1, max(0, self.ctx.holes_total - 1)) - - self.state = nxt - self.history.append(Step(len(self.history) + 1, prev, event, nxt)) - return nxt - - def note(self, text: str) -> None: - """挂一条人工说明(比如"跳过 S03:D435 未标定"),随结果一起输出。""" - self.ctx.notes.append(text) - - -# ============================================================================= -# 判据(纯函数,被节点与测试共用) -# ============================================================================= -def points_stable(samples: List[Sequence[float]], tol: float, min_frames: int) -> bool: - """稳定判据(任意维):样本够多、且所有点到均值距离都 ≤ ``tol``。 - - 与 :func:`pixel_stable` 是同一套判据,只是不限定二维。为什么需要: - S05 的"画面稳了再拍"在仿真里用不了检测框(合成图过不了真机训练出来的 - 工件模型),于是改用**法兰位移**(mm)当特征 —— 判据本身一模一样, - 只是量纲从像素变成毫米,所以抽出来共用,而不是各写一份。 - """ - if len(samples) < max(2, int(min_frames)): - return False - dim = len(samples[0]) - means = [sum(float(s[i]) for s in samples) / len(samples) for i in range(dim)] - if any(len(s) != dim for s in samples): - return False - for s in samples: - if math.sqrt(sum((float(s[i]) - means[i]) ** 2 for i in range(dim))) > tol: - return False - return True - - -def pixel_stable(samples: List[Tuple[float, float]], tol_px: float, min_frames: int) -> bool: - """S05:像素稳定判据。 - - :param samples: 最近若干帧的 ``(u, v)`` 像素坐标。 - :param tol_px: 允许的抖动半径(像素)。 - :param min_frames: 至少要看多少帧才敢说"稳定"。 - :returns: 样本够多、且所有点到它们的均值的距离都 ≤ ``tol_px``。 - - 为什么不用"两帧之差":跟踪输出的抖动是**零均值**的,相邻两帧可能恰好 - 很近,于是"稳定"判据会在画面明明在晃的时候早早触发,接着拍出一张糊的 - 定位图 —— 表现为"孔位偶尔偏 1mm",随机且难复现。用"到均值的最远距离" - 才对得上"画面不动"这个物理事实。 - """ - return points_stable(samples, tol_px, min_frames) - - -def tangential_jump( - shear_now: Tuple[float, float], shear_ref: Tuple[float, float], delta: float -) -> bool: - """S07:切向力突变判据 —— **两个通道都看,任一超阈值即算**。 - - 用户明确过:切向力到底走 X 还是 Y 通道未确认。只监控一个通道的话, - 赌错了就是整段流程静默失效(下发正常、日志正常、就是停不住)。 - 两个都监控的代价只是可能更早停一点点,这个方向的错是安全的。 - - :param shear_now: 当前两路切向读数。 - :param shear_ref: 静止基线的两路切向读数。 - :param delta: 触发阈值(相对基线的增量)。 - """ - return any(abs(n - r) >= delta for n, r in zip(shear_now, shear_ref)) - - -def wrench_touch( - axial_now: float, axial_ref: float, delta: float -) -> bool: - """S07(**首选判据**):腕部 FT 的轴向力相对基线突变 → 判为接触到工件。 - - 为什么这是首选、而不是手指触觉(2026-09-24 用一整轮排查换来的结论): - - 通止规是**靠夹持摩擦抱住**的工具。轴向力要传到手指,必须过"指垫↔规"的 - 摩擦面,而摩擦能传的上限是 µ·N: - 夹持段 µ=0.25、实测握力 N≈46N → 单指 ~11.5N、两指 ~23N - 可台肩落面那一下,接触刚度 5e4 N/m 意味着**过压 0.5mm 就是 25N** —— - 一步的步进量就足以让规在爪里打滑。**于是手指触觉物理上读不到那个力** - (读数停在 0,而它是对的),阈值怎么调都不对:调小被噪声骗,调大永远 - 达不到。当时确实是照"阈值调高了"去改的,白费一轮。 - - 腕部 FT 在这条力路的**上游**:工件→规→夹爪→法兰→腕部关节。 - 工具打不打滑都要经过它,所以它测得到真实的轴向力。 - - 判据用**绝对增量**而不是带符号压入量,理由与 ``tangential_jump`` 相同: - 传感器坐标系的正负号方向取决于安装,赌错了就是"整段流程静默失效" - (下发正常、日志正常、就是停不住)。取绝对值只会更早停一点点, - 这个方向的错是安全的 —— 与 ``stage2_locate_node._contact_detected`` - 的既有口径也一致(那里也是 ``abs(fz - baseline)``)。 - - :param axial_now: 当前轴向力读数 [N]。 - :param axial_ref: 静止(还没碰工件)时的轴向基线 [N]。 - :param delta: 触发阈值(相对基线的增量)[N]。 - """ - return abs(float(axial_now) - float(axial_ref)) >= float(delta) - - -#: S07 腕部 FT 判据需要多"新"的数据才算活着 [s]。 -#: 真机 broadcaster 与仿真传感器都是 100Hz,0.5s 相当于容许掉 50 帧 —— -#: 只用来排除"根本没在发",不是用来做实时性判据的。 -WRENCH_MAX_AGE_S: float = 0.5 - - -def wrench_live(age_s: Optional[float]) -> bool: - """腕部 FT 是否有活的数据(够新)。 - - ``age_s`` 为 None 表示**一帧都没收到过**(话题名写错、传感器没起来)。 - 注意"收到过但数值为 0"**是活的** —— 静止时轴向力本来就接近 0。 - 这个区别很关键:拿数值大小判活,会让"安静的传感器"被误判成掉线, - 而那正是 2026-09-24 在触觉上踩过的同一个坑(见 stage3 的 ``live_tactile``)。 - """ - return age_s is not None and float(age_s) <= WRENCH_MAX_AGE_S - - -#: 判定"六个分量全为 0"用的容差 [N]/[Nm]。真机 FT 的噪声量级是 1e-2~1e-1, -#: 所以 1e-6 足够区分"真的是 0(数据没出来)"与"很小但活的读数"。 -WRENCH_ZERO_EPS: float = 1.0e-6 - - -def wrench_all_zero( - fx: float, - fy: float, - fz: float, - tx: float, - ty: float, - tz: float, - eps: float = WRENCH_ZERO_EPS, -) -> bool: - """六个分量**同时**为 0(容差 ``eps``)⇒ 这是"数据没出来"的指纹,不是"安静"。 - - 与 :func:`wrench_live` 的分工(两个都要有,缺一不可): - - * ``wrench_live`` 只看"够不够新",**故意不看数值** —— 静止时轴向力本来就接近 0, - 拿数值判活会把"安静的传感器"误判成掉线(2026-09-24 触觉上踩过)。 - * 但一个**带着负载**的腕部 FT 不可能六个分量**同时**恰好为 0:重力、装配预紧、 - 传感器零漂至少让某个分量不为 0。所以"全零"是另一种失效 —— **数据源没出数** - (话题名对、但内容是空的;或 RDK 侧没启用该传感)。 - - 2026-10-08 真机实测:应用在用的 ``//ft_sensor_wrench`` 就是恒 (0,0,0), - 于是"``abs(fz−基线)>2.5N`` 判接触"的兜底**永远触发不了** —— 而日志里一切正常 - (话题收得到、回调在跑、``wrench_live`` 报"活"),属于最危险的静默失效。 - 改用 ``//external_wrench_in_tcp`` 后有数(≈负载 54N)即可恢复兜底。 - - 所以:``wrench_live`` 通过 **且** ``wrench_all_zero`` 为真 ⇒ 判为"数据源是空的"。 - """ - return all(abs(float(v)) <= eps for v in (fx, fy, fz, tx, ty, tz)) - - -#: S07 单步下压给 ``_goto`` 的到位容差 = 步长的这个比例。 -#: **必须 < 1,而且只能小不能大**:``_goto`` 的语义是"已经落在容差里就直接返回、 -#: 一点都不动"。容差 ≥ 步长时,每一次"往下走 0.5mm"的请求都被判成"已在容差内" -#: → 臂原地不动、循环条件永远成立 → **静默自旋**(日志停在基线那行、CPU 跑满、 -#: 既不报错也不前进)。2026-09-24 在仿真里踩到过一次,真机同参数同结果。 -DESCEND_TOL_FRAC: float = 0.4 -#: 容差下限 [m]:再小就追不动了(伺服死区/噪声会让臂永远"差一点点")。 -DESCEND_TOL_FLOOR_M: float = 2.0e-5 -#: 判定"这一步真的往下走了"的位移下限,占步长的比例。 -DESCEND_PROGRESS_FRAC: float = 0.2 -#: 卸载回退的到位容差占**回退量**的比例(见 :func:`relief_tol_m`)。 -RELIEF_TOL_FRAC: float = 0.2 -#: 允许连续多少步毫无位移后中止(防"没接触也一直转"的静默自旋)。 -DESCEND_STALL_STEPS: int = 5 - - -def relief_tol_m(dz_m: float) -> float: - """S07 判到接触后**卸载回退**该给 ``_goto`` 的到位容差 [m]。 - - 为什么单独立一条(2026-09-24 实测踩到,代价是一轮假通过): - - 回退量 0.50mm,而 ``_goto`` 的容差被写死成 0.0005 m(**同量级**)。 - 目标 z 是 ``Tee[2,3] + 0.0005``,浮点回减后 ``dist`` 会比 0.0005 略小 - ⇒ ``_goto`` 的入口判据 ``dist < tol_m`` 当场成立 ⇒ **一步没走就返回 True**。 - 于是"卸载"变成空操作,而残余力判据比的是"回退前 vs 回退后"两个**相同**的 - 读数 ⇒ 报"残余 0.0N,已放干净"(假通过)。 - 接着 S08 带着 ~70N 的轴向力去转(夹持摩擦上限 µ·N 两指合计 ≈73N) - → 掉件(E1),而 E1 的日志只说"规掉了"。 - - 返回 ``回退量的 20%``,再夹到 ``[DESCEND_TOL_FLOOR_M, 回退量的一半]`` —— - 后者保证**容差永远严格小于回退量**,`_goto` 不可能在入口就判"已到位"。 - """ - dz = float(dz_m) - if dz <= 0.0: - raise ValueError(f"卸载回退量必须为正,收到 {dz_m}") - return min(max(DESCEND_TOL_FLOOR_M, dz * RELIEF_TOL_FRAC), dz * 0.5) - - -def descend_tol_m(step_m: float) -> float: - """S07 单步下压该给 ``_goto`` 的到位容差 [m]。 - - 取步长的 40%,但不超过步长的一半、不低于 ``DESCEND_TOL_FLOOR_M``。 - 这样"走满这一步"才是循环推进的**唯一**出口 —— 容差比步长小,`_goto` - 就不可能因为"已经在容差内"而空转(那正是上面注释里那个静默自旋)。 - """ - if step_m <= 0.0: - raise ValueError(f"下压步长必须为正,收到 {step_m}") - return max(step_m * DESCEND_TOL_FRAC, min(DESCEND_TOL_FLOOR_M, step_m * 0.5)) - - -def descend_iter_budget(max_depth_m: float, step_m: float, slack: int = 8) -> int: - """S07 下压循环的**硬**迭代上限:够走完整个下探深度,再多给几步余量。 - - 为什么要有硬上限:循环条件写的是"实测高度还没到最深",一旦臂因为死区、 - 被夹住、孔位偏了而**实际没动**,这个条件就恒真。上限不是用来"早点失败" - 的(那是 ``contact_max_depth_mm`` 的活),而是**兜住静默自旋**: - 宁可报"S07 没走完也没接触",也不能让节点无声无息地空转到天亮。 - """ - if step_m <= 0.0: - raise ValueError(f"下压步长必须为正,收到 {step_m}") - if max_depth_m <= 0.0: - return 0 - return int(math.ceil(max_depth_m / step_m)) + max(1, int(slack)) - - -def descend_progress(z_prev: float, z_now: float, step_m: float) -> bool: - """这一步是否真的往下走了(法兰 z 向下为负)。 - - 判据是**实测**位移,不是"指令发出去了":``_goto`` 因为容差而空转、 - 或步长被控制器死区吞掉时,实测位移≈0 而指令日志一切正常。 - """ - return (float(z_prev) - float(z_now)) >= step_m * DESCEND_PROGRESS_FRAC - - -#: 通止规**台肩**(COLLAR)在规尖上方的距离 [m]。 -#: 取自 devices/sim/gazebo/models/gauge/model.sdf:通端 φ6×30mm,台肩在 30~33mm。 -#: 判"到底了"的那一下就是台肩落到工件上表面 —— 所以它决定了 S07 至少要下压 -#: 多少(见 descend_needed_m)。改规的模型时必须一起改这里,否则预算会算错。 -GAUGE_SHOULDER_ABOVE_TIP_M: float = 0.030 - - -def tool_clearance_m( - flange_z_m: float, - tool_tip_below_flange_m: float, - surface_z_m: float, -) -> float: - """工具尖端离工件上表面还有多高 [m]。**负 = 已经插进去了。** - - 为什么需要这个:流程里"悬停高度"是按**相机**定的,不是按**工具**定的。 - 腕部相机要看清楚孔,就得离工件面 ~0.17m;而工具(装在法兰下面)可能比 - 相机长得多。两者一冲突,就会出现下面这种极难查的局面: - - 悬停高度 0.632(法兰)− 工具长 0.243 = 0.389 - 工件上表面 0.412 - → 工具尖端已经插进工件 23mm - - 此时"悬停"这一步本身已经把工具捅进孔里了,S07 再往下压就一路压到顶、 - 等不到"台肩落面"那一下,最后报"下探 N mm 都没触发接触判据"然后 ABORT。 - 现象看起来像力阈值标错了,实际是**几何**错了。 - - 真机同参数同结果(不是仿真特有的):只要悬停高度是按相机定的、而工具 - 比相机长,就会这样。所以这个值要在**启动时**算出来并报出来。 - """ - tip_z = float(flange_z_m) - float(tool_tip_below_flange_m) - return tip_z - float(surface_z_m) - - -def hover_z_for_tool_clearance( - surface_z_m: float, - tool_tip_below_flange_m: float, - clearance_m: float, -) -> float: - """让工具尖端停在工件面上方 ``clearance_m`` 所需的**法兰**高度 [m]。 - - 就是 ``tool_clearance_m`` 的逆运算 —— 写成一个函数是为了让"该用多高"这个 - 结论只有一个来源(下面 ``hover_z_guard`` 与调用方都用它,不各推一遍)。 - """ - return float(surface_z_m) + float(tool_tip_below_flange_m) + float(clearance_m) - - -def hover_z_guard( - hover_z_m: float, - surface_z_m: float, - tool_tip_below_flange_m: float, - want_clearance_m: float, -) -> Tuple[float, str]: - """二阶段悬停高度的自检 → ``(该用的悬停高度, 说明; 不用改时说明是空串)``。 - - **为什么必须有这条**(2026-09-24 实测栽在这上面): - - 悬停高度是**按相机**定的(腕部相机要离工件面 ~0.17m 才看得清孔), - 而工具(夹爪 + 通止规)可能比相机长得多 —— 仿真里实测 - ``tool_tip_below_flange_m=0.245``,而悬停算的是 - ``0.412 + 0.17 + 0.05 = 0.632`` ⇒ 工具尖端在工件上表面**下面 25mm**。 - - 后果不在 S07(S07 有自己的几何自检),而在**更早的 S05**: - "悬停"这一步本身就把工具捅进工件里了,于是 S05 的横向对准等于 - 拿规尖去拨工件 —— 实测把工件从 x=0.520 拖到 0.4284(**92mm**)。 - 而真值孔位是按工件的**实测**位姿算的(``sim_live_pose``,这是对的), - 工件一走,孔位就跟着工具走 ⇒ 残差恒定在 13mm、迭代 9 次永不收敛 - (日志:``[fine 3..8] 残差=13.25/13.19/…/11.79mm``)。 - 现象看起来像"手眼标定坏了 / 检测不认孔"。 - - 真机同参数同结果:这不是仿真专有,只要"悬停按相机定、工具比相机长"就会这样。 - - 判据取"明显低于目标间隙"而不是"一毫米都不许低":配置的悬停与实测的 - 工件面 z 都有几毫米的不确定度,拿 0 当界会把正常配置判成错的。 - """ - clear_m = tool_clearance_m(hover_z_m, tool_tip_below_flange_m, surface_z_m) - if clear_m >= float(want_clearance_m) - 0.001: - return float(hover_z_m), "" - need_z = hover_z_for_tool_clearance(surface_z_m, tool_tip_below_flange_m, want_clearance_m) - why = ( - f"悬停高度会让工具尖端钻进工件:法兰 {float(hover_z_m):.4f} − 工具长 " - f"{float(tool_tip_below_flange_m) * 1000:.1f}mm = 尖端 " - f"{float(hover_z_m) - float(tool_tip_below_flange_m):.4f},工件上表面 " - f"{float(surface_z_m):.4f} → 尖端在面{'下' if clear_m < 0 else '上仅'} " - f"{abs(clear_m) * 1000:.1f}mm(要求 ≥ {float(want_clearance_m) * 1000:.1f}mm)。\n" - f" 悬停高度通常是按**相机**视距定的,而工具比相机长 —— 两者冲突时必须" - f"先保证不碰工件。\n" - f" 已按几何抬到 {need_z:.4f}(= {float(surface_z_m):.3f} 上表面 + " - f"{float(tool_tip_below_flange_m) * 1000:.0f}mm 工具 + " - f"{float(want_clearance_m) * 1000:.1f}mm 间隙)。\n" - f" 要固定这个值:改 site.yaml 的 robots[].servo.hole_hover_z_m = " - f"{need_z:.3f}(以及同组件的 ee_z_m ≥ 它 +0.05)。" - ) - return need_z, why - - -def resolve_hover_z( - hover_z_m: float, - surface_z_m: float, - tool_tip_below_flange_m: float, - want_clearance_m: float, - user_set: bool, -) -> Tuple[float, str]: - """返回 ``(要用的法兰悬停高, 拒绝原因)``。 - - 启动参数写了高度:不安全就拒绝,原因非空,高度原样返回,调用方不许改成别的数。 - 没写(用 site):沿用 :func:`hover_z_guard` 的几何抬高,拒绝原因留空。 - """ - fixed, why = hover_z_guard( - hover_z_m, surface_z_m, tool_tip_below_flange_m, want_clearance_m - ) - if not why: - return float(hover_z_m), "" - if not user_set: - return float(fixed), "" - clear_m = tool_clearance_m(hover_z_m, tool_tip_below_flange_m, surface_z_m) - return float(hover_z_m), ( - f"悬停高度会让工具尖端进入工件:法兰 {float(hover_z_m):.4f} − 工具长 " - f"{float(tool_tip_below_flange_m) * 1000:.1f}mm,工件面 {float(surface_z_m):.4f}," - f"间隙 {clear_m * 1000:.1f}mm,要求 ≥ {float(want_clearance_m) * 1000:.1f}mm。" - "这个值是启动参数指定的,不会改成别的高度。" - ) - - -#: S05 精对位时判"工件被工具推走"的两级阈值 [m]。 -# -# 为什么需要这条判据(2026-09-24 又栽了一次,见下面 drag_verdict 的说明): -# S05 的对准是"看着孔走"的闭环,而孔位是**工件上**的。工具一旦碰到工件, -# 闭环追的就不再是孔,而是"自己推着走的工件" —— 残差恒定(本轮 11mm)、 -# 迭代用满,日志报的是"检查手眼/相机安装",与真因(工具比相机长、 -# 悬停时已经插进工件)差着十万八千里。 -# 取 3mm:工件是刚体,两拍之间它整体挪动 >3mm 只可能是被推/被撞(正常加工 -# 过程里它一动不动)。同一对孔的两拍测量噪声在 0.2mm 量级,离阈值很远。 -SNAP_DRAG_TOL_M: float = 0.003 -#: 单拍就这么大 ⇒ 不必等第二拍确认(刚体不会自己"挪回去")。 -SNAP_DRAG_HARD_M: float = 0.006 - - -#: "已经到位"的容差:避免 ±1e-9 的浮点噪声变成"再转一整圈"。 -_RATCHET_FULL_TURN_EPS: float = 1e-9 - - -def ratchet_delta_rad(target_rad: float, q_now_rad: float, direction: int = 0) -> float: - """"目标角 − 当前角",折成**一次**能转到的增量 [rad]。 - - **为什么要有这个函数**(2026-09-24 实测:棘轮把整条流程 ABORT 在 S09 第一步): - - S08/S09 给棘轮的是**关节 7 的目标角(绝对值)**(``q[-1] ± step``), - 而棘轮此前把它当**增量**用。于是"关节在 +158.9°、目标 +338.9°"被算成 - "要转 338.9°"(实际增量只有 180°)⇒ 误判行程不够 ⇒ 让余量那一步算到 - 限位外面(``158.9 − 338.9 = −180°``,比 −175° 还低)⇒ 报 - "期望 −338.9°、实测 +26.0°,偏差过大" ⇒ ABORT。现场什么坏事都没发生。 - - 差值必须折一圈:目标常常**故意**超出限位(这正是要"让余量"的原因), - ``+338.9°`` 与 ``−21.1°`` 是同一个关节位置。 - - **为什么还要 direction**(2026-09-24 又一次实测:S08 第 3 轮 ABORT): - - 不给方向时这里取"最短的那条路",而名义步长**正好是 180°** 时, - 哪条路更短取决于 0.1° 级的读数差:调用方按自己读到的 ``q`` 算出目标 - ``−18.0°``,棘轮再用**稍晚一点**读到的 ``q=+162.1°`` 去算差值, - ``−180.1°`` 折一圈就成了 ``+179.9°`` —— 方向**翻了个个儿**。 - 于是棘轮朝螺纹的反方向走,接着贴限位、让余量、重试,净位移 0 ⇒ ABORT。 - - 棘轮的转向是**工艺意图**(S08 顺时针拧入、S09 逆时针拧出),不能交给 - "谁更短"这种数值巧合决定,所以由调用方明确给出 ``direction``。 - - 注:``direction=0``(默认)保留旧的"最短路径"语义,给"目标本来就明确 - 在某一侧"的调用方用;棘轮的四个原子步一律显式给方向。 - - :param target_rad: 目标角(绝对值,可以是限位外的角度)。 - :param q_now_rad: 当前关节角。 - :param direction: 想要的转向:``+1`` 正转、``-1`` 反转、``0`` 取最短路径。 - :returns: 增量 [rad]。``direction=0`` 时落在 ``(−π, π]``;给了方向时落在 - ``[0, 2π)``(正转)或 ``(−2π, 0]``(反转)——**一定**沿指定方向, - 且是能落到目标角的最小那一步。**同一个目标、同一个当前位置**只会有一个 - 增量 —— 棘轮的"让余量"与"重试"都按它算,两次不会互相矛盾。 - """ - base = float(target_rad) - float(q_now_rad) - two_pi = 2.0 * math.pi - if direction == 0: - return math.remainder(base, two_pi) - # 先折到 [0, 2π),再按想要的转向取那一侧(与目标角差正好一整圈,是同一个位置)。 - pos = math.fmod(base, two_pi) - if pos < 0.0: - pos += two_pi - if pos >= two_pi - _RATCHET_FULL_TURN_EPS: - pos = 0.0 # 已经(几乎)在目标上:不要为了凑方向白转一整圈 - if direction > 0: - return pos - return pos - two_pi if pos > 0.0 else 0.0 - - - -def drag_verdict( - mid_now: Tuple[float, float], - mid_prev: Optional[Tuple[float, float]], - mid_prev2: Optional[Tuple[float, float]] = None, - *, - tol_m: float = SNAP_DRAG_TOL_M, - hard_m: float = SNAP_DRAG_HARD_M, -) -> Tuple[bool, float]: - """两孔中点是否在两拍之间"整体挪动" → ``(是否判定为被推走, 本拍位移 m)``。 - - **为什么看"中点"而不是看目标孔**:目标孔是**追**的对象,工具一动它就该动 - (对准本意如此),看它分不出"正常对准"和"推着工件走"。而两孔**中点**在 - 对准过程中不该动 —— 它只有工件整体平移时才会动。所以中点位移干净地对应 - "工件被搬动了"。 - - **为什么看"两孔中点"而不是单孔**:单孔在相机里会因分辨率/遮挡抖动,且 - 目标孔本来就在被逼近;中点是两者的平均,噪声更小、语义更明确。 - - :param mid_now: 本拍两孔中点 (x, y)[m](基座系)。 - :param mid_prev: 上一拍中点;``None`` = 还没有上一拍(第一拍不判)。 - :param mid_prev2: 上上拍中点。用来确认"位移是持续的"(单拍可能是误检)。 - :returns: ``(判定, 本拍位移 m)``。 - """ - if mid_prev is None: - return False, 0.0 - dx = float(mid_now[0]) - float(mid_prev[0]) - dy = float(mid_now[1]) - float(mid_prev[1]) - d1 = math.hypot(dx, dy) - if d1 >= float(hard_m): - return True, d1 - if d1 < float(tol_m) or mid_prev2 is None: - return False, d1 - px = float(mid_prev[0]) - float(mid_prev2[0]) - py = float(mid_prev[1]) - float(mid_prev2[1]) - d2 = math.hypot(px, py) - # 第二拍确认:上一拍也挪了(≥ 阈值的一半),且方向一致(点积 > 0)。 - # 为什么允许方向只"大致一致":工件被推着走时前后两拍的推动量本来就不同 - # (工件一让开,工具就少推一点),拿夹角严格相等会漏判。 - if d2 >= float(tol_m) * 0.5 and (dx * px + dy * py) > 0.0: - return True, d1 - return False, d1 - - -def descend_needed_m( - flange_z_m: float, - tool_tip_below_flange_m: float, - surface_z_m: float, - tool_shoulder_above_tip_m: float, -) -> float: - """S07 要判"台肩落面",从当前法兰高度起还需要下压多少 [m]。 - - 判"到底了"的那一下不是工具尖端碰面,而是**台肩落到工件上表面**; - 台肩在工具尖端上方 ``tool_shoulder_above_tip_m``(规是通端长 30mm)。 - 所以需要的下压量 = 台肩到面的距离,而不是尖端到面的距离。 - - 返回值可能是负的(台肩已经在面以下)—— 那说明几何配错了,调用方应当 - 报错而不是"往下走一个负距离"。 - """ - shoulder_z = ( - float(flange_z_m) - - float(tool_tip_below_flange_m) - + float(tool_shoulder_above_tip_m) - ) - return shoulder_z - float(surface_z_m) - - -#: S07 下探预算相对"实际需要下压量"的余量系数。 -#: 预算是**兜底**用的(不是用来判成败的):真正让循环停下的是接触判据。 -#: 给 1.5 倍余量是为了容纳对位残差、板厚公差、台肩倒角还没完全落面等。 -DESCEND_BUDGET_FRAC: float = 1.5 -#: 下探预算的绝对下限 [m]:几何算出来很小(比如台肩已快贴面)时也要留够, -#: 否则一旦对位有点偏,"预算用完"会先于"判到接触"触发,报出来的原因是假的。 -DESCEND_BUDGET_FLOOR_M: float = 0.008 - - -def descend_budget_m(needed_m: float) -> float: - """由"实际需要下压多少"推出 S07 的下探预算 [m]。 - - 不要手工填这个数:填小了会在台肩落面**之前**就用完预算(报"下探 N mm - 都没触发接触判据",而真实原因只是预算不够);填大了会在判据失灵时压得 - 更深(更危险)。由几何推出来,两个毛病都没有。 - """ - return max(float(needed_m) * DESCEND_BUDGET_FRAC, DESCEND_BUDGET_FLOOR_M) - - -#: ``hole_entry_verdict`` 的结论。 -ENTRY_OK = "ok" # 接触深度与几何预期相符 ⇒ 规是从孔里下去的、台肩落面 -ENTRY_HIGH = "high" # 早早就接触 ⇒ 尖端顶在工件**上表面**上,根本没进孔 - -#: 判"没进孔"的下压深度比例阈值。 -#: 实测两个锚点(2026-09-28,仿真): -#: · 正常入孔:下压 28.6mm / 需要 31.9mm ⇒ 0.90 -#: · 顶在平面上:下压 0.90mm / 需要 31.9mm ⇒ 0.03 -#: 两者差着一个台肩高度(30mm),取 0.5 时两侧余量都很大(正常那侧要掉到 -#: 一半才会误判)。**不要**为了"更灵敏"把它往 0.9 推 —— 台肩倒角没完全落面、 -#: 板厚公差都会让正常值在 0.85~0.95 之间晃。 -HOLE_ENTRY_MIN_RATIO: float = 0.5 - - -def hole_entry_verdict( - descended_m: float, - needed_m: float, - *, - min_ratio: float = HOLE_ENTRY_MIN_RATIO, -) -> str: - """S07 判到接触的那一刻:规是**进了孔**、还是**顶在工件上表面**。 - - 为什么需要它(2026-09-28 实测,同一命令三跑里坏一跑:DONE / ABORT / DONE): - 工件在 S08/S09/S10 阶段会被工具推走(仿真里实测被推 20~52mm)。而 k2 的 - 孔位是 **S05 一次性定下**的(``_step_hover_k`` 取 ``_hole_xy``),工件一动 - 它就失效。于是规落在孔**旁边的平面**上,只下压「悬停间隙」那么点就判到接触。 - - 不拦的代价,实测完整发生过一次: - S08 干转 5 轮(切向增量 0.0、法向增量 ±0.0,**一点没进给**)→ 第 6 轮憋住 → - 报出来的是「转轴偏差 7.6° 超过阈值 —— 关节7 轴与工具 Z 不共线, - 先确认工具系是否垂直向下、有没有装转接件」。 - - **那句话会把所有人引到错误方向**:真因既不是工具系也不是转接件,是孔位失效。 - 而且为这句误导,白烧了 5 轮无效拧入(≈30 秒)和一次憋劲(有把规顶掉的风险)。 - - 为什么比 ``needed_m`` 而不是比"尖端离面高度":正常入孔时接触发生在**台肩落面** - 那一刻 ≈ ``needed_m``;顶在平面上时接触发生在**尖端刚碰到面**那一刻,而台肩还在 - 尖端上方 30mm。两者差着一个台肩高度,所以用比例判最稳(见上面两个实测锚点)。 - - 纯函数(R5.1):判错两个方向都贵 —— 把正常的判成"没进孔"会白扔一整个孔; - 把"没进孔"判成正常,就是上面那 30 秒 + 一次误导。 - - ``needed_m <= 0`` 时**不判**(几何本身已经错了,上面那条自检会报), - 返回 ``ENTRY_OK`` 不在这里抢着报第二个错。 - """ - if needed_m <= 0.0: - return ENTRY_OK - if float(descended_m) < float(needed_m) * float(min_ratio): - return ENTRY_HIGH - return ENTRY_OK - - -def screw_stop(normal_delta: float, shear_max: float, normal_th: float, shear_th: float) -> bool: - """S08:旋转装配的停止判据 —— **切向力>阈值 且 法向力突增**。 - - 注意是"且":只看切向力,规刚接触螺纹时会误停;只看法向力,规顶到孔底 - 时会误停。两者同时出现才说明"螺纹咬住了",这是拧入到位的特征。 - """ - return shear_max > shear_th and normal_delta > normal_th - - -#: S08 的四个原子步,顺序即执行顺序。 -#: **故意不封装成一个"拧螺丝"复合动作**:中途掉件(E1)时,只有每一步都能 -#: 单独调用、单独判断,才可能从任意一步精确恢复,而不是从头再来。 -RATCHET_STEPS: Tuple[str, ...] = ( - "rotate_slow", # 工具系顺时针慢转 step_deg(拧入,带着规一起转) - "release", # 松爪(规留在孔里) - "rotate_back", # 快回转 step_deg(空手回来) - "regrip", # 夹紧 -) - - -def ratchet_cycles(total_deg: float, step_deg: float) -> int: - """要拧 ``total_deg`` 需要多少轮棘轮。向上取整,``step_deg<=0`` 报错。""" - if step_deg <= 0.0: - raise ValueError(f"单次转角必须为正,收到 {step_deg}") - if total_deg <= 0.0: - return 0 - return int(math.ceil(total_deg / step_deg)) - - -@dataclass(frozen=True) -class RatchetTravel: - """棘轮步长与关节行程的**可用性核算**(S08 开头自检,别等到第 3 轮才炸)。""" - - ok: bool - step_deg: float # 配置的一步转角 - travel_deg: float # 关节行程(上限 − 下限) - need_deg: float # 一步棘轮真正需要的行程 - max_step_deg: float # 行程允许的最大步长 - why: str # 不 ok 时给人看的说明(ok 时为空串) - - -def ratchet_travel_ok( - step_deg: float, limits_rad: Optional[Tuple[float, float]], margin_deg: float -) -> RatchetTravel: - """一步棘轮 ``step_deg`` 放得进关节行程吗? - - **为什么需要**:2026-09-24 实测,``screw_step_deg=180`` 配 Rizon4 的 - 关节 7(±175°,行程 350°)在第 3 轮 ABORT —— 慢转那一步要转 180°、 - 回转那一步还要 180°,两次加起来 360° > 350°,关节**必然**有一头贴限位; - 更糟的是"让余量"也腾不出地方(要腾就得往反向再让一整步,还是 360°)。 - 日志里那一长串"贴限位 → 让余量 → 还是贴限位"就是这么来的。 - - 判据取 ``2×step + 2×margin ≤ 行程``: - - 2×step:棘轮一个来回(慢转 + 回转)要的行程; - - 2×margin:两头都要留余量 —— 贴死限位再让余量时**一点空间都没有**, - 而实测每轮回转还会比指令少走 4~5°(速度/加减速限制), - 这点亏欠要靠余量吃,否则 7~8 轮后累计偏出限位、再也转不回来。 - - :param limits_rad: ``(lower, upper)`` [rad];``None`` = 拿不到限位,放行 - (返回 ``ok=True``,理由写清楚:真机靠驱动器报 JOINT_LIMIT 兜底)。 - """ - need = 2.0 * float(step_deg) + 2.0 * float(margin_deg) - if limits_rad is None: - return RatchetTravel( - ok=True, step_deg=float(step_deg), travel_deg=float("inf"), - need_deg=need, max_step_deg=float("inf"), - why="", - ) - travel = math.degrees(float(limits_rad[1]) - float(limits_rad[0])) - max_step = 0.5 * (travel - 2.0 * float(margin_deg)) - if need <= travel: - return RatchetTravel( - ok=True, step_deg=float(step_deg), travel_deg=travel, - need_deg=need, max_step_deg=max_step, why="", - ) - # 给个能直接照着改的步长:往整十度取整(现场习惯填 120/150/180), - # 但不许把步长压到 30° 以下 —— 那样拧进/拧出的轮数会多到失控。 - suggest = max(30.0, math.floor(max_step / 10.0) * 10.0) - why = ( - f"棘轮一步 {step_deg:.0f}° 放不进关节 7 的行程:一步棘轮要 " - f"2×{step_deg:.0f}° + 2×{margin_deg:.0f}°(余量) = {need:.0f}°," - f"而行程只有 {travel:.0f}°(上限 {math.degrees(limits_rad[1]):.0f}° − " - f"下限 {math.degrees(limits_rad[0]):.0f}°)。\n" - f" 改法:site.yaml 的 gauge_assembly.screw_step_deg 改到 " - f"{max_step:.0f}° 以内(例如 {suggest:.0f}°),并保证 " - f"screw_max_cycles × screw_step_deg 仍是 **360° 的整数倍**(" - f"累计必须转整数圈,否则规停在螺纹中间、S09 也就少拧出几分之一圈)。" - ) - return RatchetTravel( - ok=False, step_deg=float(step_deg), travel_deg=travel, - need_deg=need, max_step_deg=max_step, why=why, - ) - - -#: ``rotation_verdict`` 的结论。 -ROT_OK = "ok" -ROT_LIMIT = "limit" # 转了一部分、方向对、但没走完 ⇒ 最可能是贴到关节限位 -ROT_AXIS = "axis" # 转轴与工具 Z 不共线 ⇒ 以「度」为单位的一切动作都不成立 -ROT_SHORT = "short" # 其它偏差(方向不对/过冲)⇒ 真有问题,该停 - - -def rotation_verdict( - delta_deg: float, - got_deg: float, - mis_deg: float, - tol_deg: float, -) -> str: - """绕工具 Z 转 ``delta_deg``、实测转 ``got_deg`` 的验收判据。 - - **纯函数**:这条判据 2026-09-24 把整条 S09 判死过一次 - ("期望 +180.0°、实测 +16.4°,偏差过大" → ABORT),而真因只是 - **关节7 的行程被前面的棘轮回转顶到了上限**(±175°,而棘轮一步就要 180°)。 - 判错两个方向都贵: - * 把"贴限位"判成"short" ⇒ 白扔一整轮(还可能把规撞歪); - * 把"真有问题"判成"limit" ⇒ 该停的没停,继续拧。 - - 还有一条**曾经漏判**的:只比绝对值时,"让它 +180、它 -170"会算成 - 10° 误差、落在 10% 容差里 ⇒ 判成功,而实际上一个孔都没拧。所以方向必须比。 - 所以它必须能脱离节点被钉住。 - """ - if abs(got_deg) < 3.0 and abs(delta_deg) > 10.0: - return ROT_LIMIT # 几乎没动:与下面的"只走了一部分"同因不同余量 - if mis_deg > tol_deg: - return ROT_AXIS - if abs(got_deg) >= 3.0 and abs(delta_deg) >= 3.0 and got_deg * delta_deg < 0: - # 方向反了。这条以前**漏判**:老判据只比绝对值 - # (``abs(abs(got) - abs(delta))``),所以"让它 +180、它 -170"会算 10° 误差 - # 落在 10% 容差里 → 判成功,而实际上一个孔都没拧。 - return ROT_SHORT - slack = max(tol_deg, 0.1 * abs(delta_deg)) - short = abs(delta_deg) - abs(got_deg) - if short > slack: - return ROT_LIMIT # 方向对、只是没走完 ⇒ 被硬止点截住 - if short < -slack: - return ROT_SHORT # 过冲:转多了,同样不该当成到位 - return ROT_OK - - -def is_joint_limit_error(text: str) -> bool: - """S01:把驱动/规划报的字符串认成"撞到关节极限"。 - - 认得出的理由:这一条在真机上不是异常而是**预期结果**(用户要求"转到不 - 触发关节极限的极限角",那就一定会在某个角度贴住)。贴住时报 JOINT_LIMIT - 继续流程;认不出来时按普通失败处理(更保守),但要把原文打印出来, - 否则下次还得猜。 - """ - low = (text or "").lower() - return any( - key in low - for key in ( - "joint limit", - "joint_limit", - "超出关节", - "关节极限", - "限位", - "out of range", - "position limit", - "exceed", - ) - ) - - -# ============================================================================= -# 给人看的说明(文档 / 日志共用,避免两处各写一份,规则 M2) -# ============================================================================= -STATE_DOC: Dict[State, str] = { - State.BOOT: "各服务自检(伺服/相机/夹爪/触觉图传/推理预热)", - State.HOME_EXTREME: "回 home + 按工具系逆时针转到极限角", - State.GRIP_CHECK: "夹持确认(预留,当前跳过)", - State.COARSE: "手外 D435 粗定位(S04 的兜底)", - State.TRACK: "腕部 D405 跟踪 k0", - State.SNAP: "像素稳定后拍照定位 k1/k2 并记位姿", - State.HOVER_K: "到当前孔正悬停", - State.CONTACT: "柔顺接触(切向力突变即停)", - State.SCREW_IN: "旋转装配循环(棘轮式拧入)", - State.UNSCREW: "反向拧出", - State.NEXT_HOLE: "换到下一个孔(回 S05 记录的位姿)", - State.RESET: "复位退出", - State.DONE: "正常结束", - State.ABORT: "中止(已退到安全高度)", -} - -EVENT_DOC: Dict[Event, str] = { - Event.BOOT_OK: "全部服务就绪", - Event.BOOT_FAIL: "有服务不就绪", - Event.POSE_OK: "位姿就绪", - Event.JOINT_LIMIT: "已贴住关节极限", - Event.GRIP_PASS: "确认夹着通止规", - Event.GRIP_FAIL: "没夹住/判定不可信", - Event.GRIP_SKIPPED: "跳过夹持确认", - Event.COARSE_OK: "粗定位出坐标", - Event.COARSE_FAIL: "粗定位失败(回跟踪兜底)", - Event.TRACK_LOCKED: "跟踪锁定 k0", - Event.TRACK_LOST: "跟踪丢失超时", - Event.SNAP_OK: "定位到 k1/k2", - Event.SNAP_UNSTABLE: "画面还在动", - Event.ALIGN_OK: "对位在容差内", - Event.ALIGN_OUT: "对位超差", - Event.CONTACT_OK: "已接触工件面", - Event.FORCE_OVER_LIMIT: "力超安全上限", - Event.HOLE_LOST: "孔位失效(规没进孔)", - Event.SCREW_DONE: "达到目标圈数", - Event.SCREW_STOP: "力判据满足(咬住螺纹)", - Event.GAUGE_DROPPED: "通止规掉了", - Event.UNSCREW_DONE: "已拧出", - Event.RELOADED: "人工放好并按 R", - Event.TIMEOUT: "阶段超时", - Event.ABORT: "中止", -} diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_gripper.py b/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_gripper.py deleted file mode 100644 index 116875c..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_gripper.py +++ /dev/null @@ -1,228 +0,0 @@ -"""夹爪客户端:把"真机今天的接口"和"框架契约里的接口"收敛到一个出入口。 - -为什么要这一层(这不是多余抽象) --------------------------------- -现场查证(2026-09-24)发现**同一个服务名后面挂着两种类型**: - -=============== ========================== ================================ -服务 A:真机今天跑的 B:框架契约 / 仿真 -=============== ========================== ================================ -``/gripper/open`` ``std_srvs/Trigger`` ``arm_msgs/srv/GripperExecute`` -``/gripper/close`` ``std_srvs/Trigger`` ``arm_msgs/srv/GripperExecute`` -状态 ``/gripper/states`` ``/gripper/status`` - (Float32MultiArray,5 元) (arm_msgs/GripperStatus) -=============== ========================== ================================ - -A 来自 ``arm_application/dh_pgea_node.py``(真机在跑的那个节点,grip_state 直接 -带"咬住/掉落");B 来自 ``devices/grippers/dh_pgea/manifest.yaml`` 声明的 -``arm_driver_dh_gripper`` —— **那个包还不存在**(``src/`` 下没有),目前只有 -仿真适配器实现了它。 - -于是有两个错法,都得避免: - -* 只按契约(B)写:真机上服务类型对不上,装配流程一步都走不了, - 而且报错会像是"服务没起"(实际起了,只是类型不同); -* 只按真机(A)写:仿真跑不了,而且把"临时接口"固化成事实(规则 M2)。 - -所以:**运行时看服务类型自己选**(:func:`pick_backend`),装配节点只依赖 -:class:`GripperClient` 的 ``open/close/wait/is_gripped`` 四个方法。 -等 ``arm_driver_dh_gripper`` 落地后,把 ``gauge_assembly.gripper_backend`` -改回 ``auto`` 即可自动切过去,应用层不用改一行。 -""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Dict, List, Mapping, Optional, Sequence - -#: 契约后端用到的服务名(``arm_msgs/srv/GripperExecute``)。 -CONTRACT_TYPE = "arm_msgs/srv/GripperExecute" -#: 真机今天用的后端(``std_srvs/srv/Trigger``)。 -LEGACY_TYPE = "std_srvs/srv/Trigger" - -CONTRACT_OPEN = "/gripper/open" -CONTRACT_CLOSE = "/gripper/close" -CONTRACT_STATUS_TOPIC = "/gripper/status" -LEGACY_STATUS_TOPIC = "/gripper/states" - -#: DH 状态字(与 ``arm_msgs/GripperStatus.msg`` 里的注释一致)。 -GRIP_STATE_MOVING = 0 -GRIP_STATE_REACHED = 1 -GRIP_STATE_CAUGHT = 2 -GRIP_STATE_DROPPED = 3 -GRIP_STATE_NAME = { - GRIP_STATE_MOVING: "运动中", - GRIP_STATE_REACHED: "到位", - GRIP_STATE_CAUGHT: "咬住物体", - GRIP_STATE_DROPPED: "物体掉落", -} - -BACKENDS = ("contract", "legacy") - - -class GripperInterfaceError(RuntimeError): - """夹爪接口无法确定。消息里必须写清"现在是什么状态、怎么修"。""" - - -@dataclass(frozen=True) -class BackendChoice: - """选择结果。""" - - backend: str - """``contract`` 或 ``legacy``。""" - - reason: str - """为什么这么选 —— 要能直接打进启动日志。""" - - status_topic: str - """该后端下状态从哪个话题读。""" - - -def pick_backend( - services: Mapping[str, Sequence[str]], prefer: str = "auto" -) -> BackendChoice: - """按**实际服务类型**决定用哪种夹爪接口。 - - :param services: ``{服务名: [类型, ...]}``,直接来自 - ``Node.get_service_names_and_types()``。 - :param prefer: ``auto`` / ``contract`` / ``legacy``。 - 非 auto 时若实际类型与之不符,**不静默降级**,而是报错 —— - 现场明确指定了后端却跑在另一个上,是最难查的一类"改了没生效"。 - :raises GripperInterfaceError: 认不出来、两种都有、或指定的后端对不上。 - - 用类型而不是名字判断,是因为两种后端的**服务名完全一样**(都是 - ``/gripper/open``):只看名字必然选不出来,而"随便选一个"的后果是 - 调用一个类型不匹配的服务,报出来的错与真实原因无关(规则 M1)。 - """ - if prefer not in ("auto",) + BACKENDS: - raise GripperInterfaceError( - f"gripper_backend 只能是 auto / {' / '.join(BACKENDS)},收到 {prefer!r}" - ) - - open_types = list(services.get(CONTRACT_OPEN, ())) - close_types = list(services.get(CONTRACT_CLOSE, ())) - has_contract = CONTRACT_TYPE in open_types and CONTRACT_TYPE in close_types - has_legacy = LEGACY_TYPE in open_types and LEGACY_TYPE in close_types - - if prefer == "contract" and not has_contract: - raise GripperInterfaceError( - f"配置要求 contract 后端,但 {CONTRACT_OPEN} 的类型是 " - f"{open_types or '(服务不存在)'},不是 {CONTRACT_TYPE}。\n" - " 怎么修:① 起仿真(它有契约服务)或等 arm_driver_dh_gripper 落地;" - "② 改用 gauge_assembly.gripper_backend: legacy(真机今天的接口);" - "③ 改回 auto 让本函数自己选" - ) - if prefer == "legacy" and not has_legacy: - raise GripperInterfaceError( - f"配置要求 legacy 后端,但 {CONTRACT_OPEN} 的类型是 " - f"{open_types or '(服务不存在)'},不是 {LEGACY_TYPE}。\n" - " 怎么修:确认真机侧起的是 arm_application 的 dh_pgea 节点" - "(bash scripts/run_gripper.sh --arm 89)" - ) - - if has_contract and has_legacy: - # 同名服务两种类型同时在线:ROS 2 允许,但调用方只能撞运气。 - raise GripperInterfaceError( - f"{CONTRACT_OPEN} 同时存在两种类型:{open_types}。" - "是仿真适配器和真机节点同时起着(或旧的没停干净)。\n" - " 怎么修:只留一个 —— 仿真用 scripts/stop_sim_gz.sh 停干净," - "真机 pkill -f dh_pgea" - ) - - if prefer == "auto": - if has_contract: - return BackendChoice("contract", f"{CONTRACT_OPEN} 是 {CONTRACT_TYPE}", CONTRACT_STATUS_TOPIC) - if has_legacy: - return BackendChoice( - "legacy", - f"{CONTRACT_OPEN} 是 {LEGACY_TYPE}(真机 dh_pgea 节点;" - "契约驱动 arm_driver_dh_gripper 还没落地)", - LEGACY_STATUS_TOPIC, - ) - raise GripperInterfaceError(_unrecognised_msg(services, open_types)) - - if prefer == "contract": - return BackendChoice("contract", "配置指定 contract", CONTRACT_STATUS_TOPIC) - return BackendChoice("legacy", "配置指定 legacy", LEGACY_STATUS_TOPIC) - - -def _unrecognised_msg( - services: Mapping[str, Sequence[str]], open_types: Sequence[str] -) -> str: - """认不出来时,把"服务不在"和"服务在但类型不对"分开说。 - - 两者都报成"服务没起"是这个仓库反复踩过的坑:现场明明起了夹爪节点, - 却被提示"去起夹爪节点",然后开始怀疑人生(规则 M1、R5.4)。 - """ - missing = [n for n in (CONTRACT_OPEN, CONTRACT_CLOSE) if n not in services] - if missing: - return ( - f"{' / '.join(missing)} 不在,夹爪节点没起来。\n" - " 怎么修:真机 bash scripts/run_gripper.sh --arm 89;" - "仿真 bash scripts/run_sim_gz.sh(仿真自带契约服务)" - ) - return ( - f"{CONTRACT_OPEN} 在,但类型是 {list(open_types)}," - f"既不认识 {CONTRACT_TYPE}(契约)也不认识 {LEGACY_TYPE}(真机 dh_pgea)。\n" - " 常见原因:这个服务名被别的节点占用了。查是谁:\n" - " ros2 service list -t | grep gripper\n" - " 怎么修:停掉那个节点,或改 gauge_assembly.gripper_backend 明确指定后端" - ) - - -# ============================================================================= -# 状态解读(纯函数) -# ============================================================================= -def is_gripped_from_state(grip_state: int) -> Optional[bool]: - """DH 状态字 → "爪里有没有东西"。 - - ``2`` 咬住 / ``3`` 掉落 是明确的;``0`` 运动中、``1`` 到位(空爪)都要 - 小心:**"到位"不等于"夹住了"** —— 空爪闭合也会到位。所以只有 2/3 给 - 明确答案,其余返回 None("不知道"),由调用方决定要不要等。 - - 返回 None 而不是 False 很重要:把"不知道"当成"没夹住"会让 E1 掉件检测 - 在任何一次开合过程中误报。 - """ - if grip_state == GRIP_STATE_CAUGHT: - return True - if grip_state == GRIP_STATE_DROPPED: - return False - return None - - -def is_dropped_from_state(grip_state: int, was_gripped: bool) -> bool: - """E1 掉件判据:**曾经夹住过**,现在状态字变成"掉落"才是掉件。 - - 为什么要 ``was_gripped``:装配前爪里本来就是空的,那时 ``grip_state`` - 可能是 3(掉落/无物),直接判成掉件会让流程一开始就报 E1。 - """ - return was_gripped and grip_state == GRIP_STATE_DROPPED - - -def legacy_states_to_fields(data: Sequence[float]) -> Dict[str, float]: - """``/gripper/states`` 的 5 元素数组 → 具名字段。 - - 超出长度或为空时返回空字典(而不是抛异常):这是**状态话题**, - 收到畸形数据时应该让上层走"不知道"分支,而不是让整个节点崩掉。 - """ - if not data or len(data) < 5: - return {} - return { - "initialized": float(data[0]), - "grip_state": float(data[1]), - "position": float(data[2]), - "target_position": float(data[3]), - "target_force": float(data[4]), - } - - -def describe_backend_choice(choice: BackendChoice) -> List[str]: - """给启动日志用的多行说明(含"契约驱动还没落地"这类现场事实)。""" - lines = [f"夹爪后端 = {choice.backend}({choice.reason})"] - if choice.backend == "legacy": - lines.append( - " 注意:legacy 后端下 /gripper/open|close 是 std_srvs/Trigger," - "开口是 1000‰ 的百分比语义,不是毫米;装配流程只用它开合," - "不靠它量开口" - ) - return lines diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_kin.py b/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_kin.py deleted file mode 100644 index d7b7855..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/gauge_kin.py +++ /dev/null @@ -1,244 +0,0 @@ -"""通止规装配用的小几何/解析工具 —— **纯函数**,可离线单测。 - -放这里的都是"算错了不会抛异常、只会让动作做错"的东西(规则 M3、R5.1): - -* ``parse_joint_limits``:从 URDF 文本里抠关节限位,给 S01 的"转到极限角" - 做软夹取。为什么不用 ``urdf_parser_py``:本机没装,多一个依赖就多一个 - "在真机上 import 失败"的机会;限位信息在 URDF 里是极规整的一行 - ````,用标准库解析足够,而且**可控**。 -* ``prewind``:算"逆时针转到不触发关节极限的极限角"到底能转多少度。 -* ``rotation_about_axis_deg``:事后验证那个动作**真的**是绕工具 Z 转的。 - 这条是 S01 的验收判据:不验证的话,"绕错轴"会表现成"转是转了,孔位 - 偏了",而且要到几个阶段之后才看出来。 -""" - -from __future__ import annotations - -import math -import re -import xml.etree.ElementTree as ET -from dataclasses import dataclass -from typing import Dict, Iterable, Optional, Sequence, Tuple - -import numpy as np - -#: 限位夹取时留的余量(度)。贴到限位上再下发,驱动器会因为"位置超出限位" -#: 直接拒绝整条轨迹 —— 那不是我们要的"极限角",是报错。 -DEFAULT_LIMIT_MARGIN_DEG = 3.0 - -_JOINT_RE = re.compile(r" Dict[str, Tuple[float, float]]: - """逐行兜底解析:记住最近一个 ````,紧跟的 ```` 归它。 - - 为什么要"记住"而不是"要求同一行":正常格式化的 URDF 里关节名和 limit - **不在同一行**,只认可同一行的兜底等于永远不生效(一个不会触发的兜底, - 和没有兜底是一样的)。属性顺序也按出现顺序读,不假设 lower 在 upper 前。 - """ - out: Dict[str, Tuple[float, float]] = {} - current: Optional[str] = None - for line in text.splitlines(): - m = _JOINT_RE.search(line) - if m: - current = m.group(1) - if current is None or " Dict[str, Tuple[float, float]]: - """从 URDF 文本里解析 ``关节名 -> (lower, upper)``(弧度)。 - - 关节名**原样保留**(含 ``Rizon4-063989_`` 前缀),调用方自己决定怎么匹配; - 这里不做"去前缀"之类的猜测 —— 猜测会在换臂时静默失配,然后限位夹取 - 悄悄失效(所有关节都"查不到限位",于是不夹取,于是贴着限位下发)。 - - 解析失败的关节直接不进结果集:``continuous`` 关节本来就没有限位, - 不该被当成"解析失败"。调用方用"查不到 = 不夹取"来处理。 - """ - out: Dict[str, Tuple[float, float]] = {} - if not urdf_xml or " Optional[Tuple[float, float]]: - """按名字给一串关节名找限位,**要求全部找到**才返回。 - - 只有一部分找到时返回 None 而不是"把找到的那部分用上":半套限位会让 - "能不能转到极限角"的结论变得不可解释(有些关节夹了、有些没夹), - 与其给出一个说不清的边界,不如明确地说"这次没有限位依据"。 - """ - found = [limits.get(n) for n in joint_names] - if any(v is None for v in found): - return None - return found[-1] # 最后一个 = 我们要绕的那根轴(调用方传的顺序有意义) - - -def prewind( - q_now_rad: float, - want_deg: float, - direction: int, - limits: Optional[Tuple[float, float]] = None, - margin_deg: float = DEFAULT_LIMIT_MARGIN_DEG, -) -> PrewindResult: - """算 S01 的预绕目标角。 - - :param q_now_rad: 当前关节角 [rad]。 - :param want_deg: 想转的角度(**正值**)[deg]。 - :param direction: ``+1`` = 绕 +Z 逆时针(右手定则);``-1`` = 顺时针。 - 符号到底对应现场的哪个方向,用真机确认一次后改 ``site.yaml`` 即可, - 不要靠"改代码里的负号"—— 那种改动没人 review 得到(规则 M2)。 - :param limits: ``(lower, upper)`` [rad]。给 None 时不做夹取。 - :param margin_deg: 距离限位保留的余量 [deg]。 - - :returns: :class:`PrewindResult`。**无论有没有限位,都返回目标角**, - 因为"贴到限位再继续转"在现场是预期行为(用户要求转到极限角), - 驱动器真拒绝时会由 :func:`arm_application.gauge_fsm.is_joint_limit_error` - 认成 JOINT_LIMIT 事件继续流程。 - - 为什么要在这里夹取(而不是直接下发、等驱动器报错): - 驱动器拒绝一条轨迹时,整个 action 失败,连带把已经转过的那部分**也** - 变成"没转过"的语义(角度实际到位了,但流程认为失败)。夹取到 - "限位 − 余量"能拿到一个明确成功、且确实接近极限的姿态度。 - """ - if want_deg <= 0.0: - raise ValueError(f"预绕角度必须为正,收到 {want_deg}") - if direction not in (-1, 1): - raise ValueError(f"方向只能是 +1 / -1,收到 {direction}") - - signed = direction * abs(want_deg) - target = q_now_rad + math.radians(signed) - has_limits = limits is not None - clamped = False - if limits is not None: - lo = limits[0] + math.radians(margin_deg) - up = limits[1] - math.radians(margin_deg) - if lo > up: # 限位本身比余量还窄(不该发生,但别让它变成静默走偏) - lo = up = 0.5 * (limits[0] + limits[1]) - if target > up: - target, clamped = up, True - elif target < lo: - target, clamped = lo, True - applied = math.degrees(target - q_now_rad) - return PrewindResult( - target_rad=target, - applied_deg=applied, - want_deg=abs(want_deg), - clamped=clamped, - has_limits=has_limits, - ) - - -def rotation_about_axis_deg(R_before: np.ndarray, R_after: np.ndarray, axis: np.ndarray) -> float: - """从两个旋转矩阵算出"绕 ``axis`` 转了多少度"(带符号)。 - - S01 的验收判据就靠它:绕工具 Z 转 Δ 之后,如果实际绕的是别的轴, - 这个函数给出的角度会与 Δ 明显不符(或者 axis 分量不占优)。 - 做法是把相对旋转投影到 ``axis`` 上: - - ``θ = atan2( axis·(R_b·R_a⁻¹ 的反对称部分) , (trace-1)/2 )`` - - :param axis: **单位**轴(工具 Z 在世界系下的方向 = ``R[:, 2]``)。 - """ - a = np.asarray(axis, dtype=float) - n = float(np.linalg.norm(a)) - if n < 1e-9: - raise ValueError("轴向量长度为 0,无法判定旋转") - a = a / n - - Rb = np.asarray(R_before, dtype=float)[:3, :3] - Ra = np.asarray(R_after, dtype=float)[:3, :3] - Rrel = Ra @ Rb.T - # 反对称部分:sin(θ)·[axis]_× - v = np.array([Rrel[2, 1] - Rrel[1, 2], Rrel[0, 2] - Rrel[2, 0], Rrel[1, 0] - Rrel[0, 1]]) - sin_t = 0.5 * float(np.dot(v, a)) - cos_t = 0.5 * (float(np.trace(Rrel)) - 1.0) - return math.degrees(math.atan2(sin_t, cos_t)) - - -def axis_misalignment_deg(R_before: np.ndarray, R_after: np.ndarray, axis: np.ndarray) -> float: - """相对旋转的转轴与 ``axis`` 的夹角 [deg]。 - - 纯绕轴旋转时这个值≈0;转错轴时它会接近 90°。用作 S01 的判错依据: - 只看"转了多少度"是不够的 —— 绕正确的轴转 90° 和绕错误的轴转 90° - 给出的角度读数一样。 - """ - Rb = np.asarray(R_before, dtype=float)[:3, :3] - Ra = np.asarray(R_after, dtype=float)[:3, :3] - Rrel = Ra @ Rb.T - # 旋转轴 = 反对称部分对应的向量(sinθ 因子不影响方向) - v = np.array([Rrel[2, 1] - Rrel[1, 2], Rrel[0, 2] - Rrel[2, 0], Rrel[1, 0] - Rrel[0, 1]]) - nv = float(np.linalg.norm(v)) - if nv < 1e-9: - return 0.0 # 几乎没转,谈不上"转错轴" - a = np.asarray(axis, dtype=float) - a = a / float(np.linalg.norm(a)) - cos = abs(float(np.dot(v / nv, a))) # 取绝对值:轴线的两个方向等价 - return math.degrees(math.acos(max(-1.0, min(1.0, cos)))) - - -def unit_tool_z(R: np.ndarray) -> np.ndarray: - """工具坐标系的 Z 轴在世界系下的方向(旋转矩阵的第三列)。""" - return np.asarray(R, dtype=float)[:3, 2] - - -def vertical_down_error_deg(R: np.ndarray, world_down: Iterable[float] = (0.0, 0.0, -1.0)) -> float: - """工具 Z 与"垂直向下"的夹角 [deg]。0 = 完全垂直向下。 - - 看板里"工具系全程垂直向下、位姿全局锁定"这句话,只有能算出这个数才算 - 真的在执行 —— 否则每个阶段都得靠人眼看画面判断臂歪没歪。 - """ - z = unit_tool_z(R) - d = np.asarray(list(world_down), dtype=float) - d = d / float(np.linalg.norm(d)) - cos = float(np.dot(z / max(1e-12, float(np.linalg.norm(z))), d)) - return math.degrees(math.acos(max(-1.0, min(1.0, cos)))) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/geom_ik.py b/install/arm_application/lib/python3.11/site-packages/arm_application/geom_ik.py deleted file mode 100644 index 8a226be..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/geom_ik.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -"""向后兼容 shim —— 实现已移到 :mod:`arm_kinematics.geom_ik`。 - -为什么搬走 ----------- -这套几何雅可比 + DLS 逆解同时被应用层(视觉伺服、搜孔装配)和驱动层 -(``arm_driver_flexiv`` 的柔顺下压)需要。留在 ``arm_application`` 里会让驱动层 -反过来依赖应用层,属于层次倒置。搬到不依赖 ROS 的 ``arm_kinematics`` 后, -两边都依赖一个底层包。 - -为什么保留这个文件 ------------------- -``stage2_locate_node`` / ``stage3_search_node`` / ``servo_node`` 等现有代码都在 -``from arm_application.geom_ik import ...``。保留 shim 就不用改动这些已经在跑的 -文件 —— 重构不应牵连能工作的代码。 - -新代码请直接 ``from arm_kinematics import dls_twist``。 -""" - -from arm_kinematics.geom_ik import ( # noqa: F401 - RIZON_LINK_AXES, - dls_position_step, - dls_translate_hold_ori, - dls_twist, - geometric_jacobian, - load_handeye_T, - position_jacobian, - quat_xyzw_to_R, -) - -__all__ = [ - "RIZON_LINK_AXES", - "quat_xyzw_to_R", - "geometric_jacobian", - "position_jacobian", - "dls_position_step", - "dls_twist", - "dls_translate_hold_ori", - "load_handeye_T", -] diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/goto_ee_plane.py b/install/arm_application/lib/python3.11/site-packages/arm_application/goto_ee_plane.py deleted file mode 100644 index c2e1b8c..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/goto_ee_plane.py +++ /dev/null @@ -1,457 +0,0 @@ -#!/usr/bin/env python3 -"""感知/伺服启动前的开机回初始位流程。 - -流程: - [A] 若法兰低于 ``servo.safe_z_m``,先让它竖直上升(闭环 Z 小步跳), - 以免回 home 时扫到墙面/工装; - [B] 调用 ``/set_named_pose``(Flexiv 命名位姿,默认 "home")—— 由 Flexiv - 自己的规划器把机械臂送回 Flexiv 初始位姿; - [C] 保持(pin)住,让伺服从一个干净、静止的位姿接手。 -""" - -from __future__ import annotations - -import sys -import time -from pathlib import Path -from typing import List, Optional, Tuple - -import numpy as np -import rclpy -from arm_msgs.srv import SetNamedPose -from control_msgs.action import FollowJointTrajectory -from rclpy.action import ActionClient -from rclpy.node import Node -from sensor_msgs.msg import JointState -from tf2_ros import Buffer, TransformListener -from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint - -from arm_application.geom_ik import ( - RIZON_LINK_AXES, - dls_translate_hold_ori, - dls_twist, - geometric_jacobian, - quat_xyzw_to_R, -) -from arm_application.site_io import ( - base_frame_default, - ee_frame_default, - joint_prefix_default, -) - -from arm_application.ros_node import TolerantNode - - - -def _load_ee_cfg() -> dict: - root = Path(__file__).resolve().parents[3] - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import load_site, resolve_robot # type: ignore - - data = load_site() - servo = (data.get("servo") or {}) - robot = resolve_robot(data) - ee_z = float(servo.get("ee_z_m") or 0.24) - return { - "prefix": str(robot.get("joint_prefix") or joint_prefix_default()), - "base": str(robot.get("base_frame") or base_frame_default()), - "ee": str(robot.get("ee_frame") or ee_frame_default()), - "z": ee_z, - # 回 home 前先竖直升到这个 Z(避免撞到墙面/工装); - # 然后再回到 Flexiv 的命名初始位姿。 - "safe_z": float(servo.get("safe_z_m") or max(0.40, ee_z + 0.10)), - "home_pose": str(servo.get("home_pose_name") or "home"), - "home_speed": float(servo.get("home_pose_speed") or 0.30), - "v_z": float(servo.get("v_max_z") or 0.04), - # 仅用于(目前未使用的)verticalize 规划路径 - "kp": float(servo.get("ee_hold_kp") or 2.0), - "w_max": float(servo.get("ee_w_max") or 0.50), - } - - -def _pt(q: np.ndarray, qdot: np.ndarray, t_sec: float) -> JointTrajectoryPoint: - pt = JointTrajectoryPoint() - pt.positions = [float(v) for v in q.tolist()] - pt.velocities = [float(v) for v in qdot.tolist()] - pt.accelerations = [0.0] * int(q.size) - ns = int(round(max(0.0, float(t_sec)) * 1e9)) - pt.time_from_start.sec = ns // 1_000_000_000 - pt.time_from_start.nanosec = ns % 1_000_000_000 - return pt - - -class GotoEePlane(TolerantNode): - def __init__(self, cfg: dict) -> None: - super().__init__("goto_ee_plane") - self.cfg = cfg - prefix = cfg["prefix"] - self.joint_names = [f"{prefix}joint{i}" for i in range(1, 8)] - self.link_frames = [f"{prefix}link{i}" for i in range(1, 8)] - self._js: Optional[JointState] = None - self.create_subscription(JointState, "joint_states", self._on_js, 10) - self._tf = Buffer() - TransformListener(self._tf, self, spin_thread=True) - self._cli = ActionClient( - self, FollowJointTrajectory, "rizon_arm_controller/follow_joint_trajectory" - ) - - def _on_js(self, msg: JointState) -> None: - self._js = msg - - def _spin(self, dt: float = 0.05) -> None: - rclpy.spin_once(self, timeout_sec=dt) - - def _lookup(self, parent: str, child: str) -> Optional[np.ndarray]: - try: - tf = self._tf.lookup_transform( - parent, child, rclpy.time.Time(), - timeout=rclpy.duration.Duration(nanoseconds=80_000_000), - ) - except Exception: - return None - t = tf.transform.translation - o = tf.transform.rotation - T = np.eye(4) - T[:3, :3] = quat_xyzw_to_R([o.x, o.y, o.z, o.w]) - T[:3, 3] = [t.x, t.y, t.z] - return T - - def _q(self) -> Optional[np.ndarray]: - if self._js is None: - return None - m = {n: p for n, p in zip(self._js.name, self._js.position)} - try: - return np.array([float(m[n]) for n in self.joint_names], dtype=float) - except KeyError: - return None - - def _jacobian(self, p_ee: np.ndarray) -> Optional[np.ndarray]: - link_R: List[np.ndarray] = [] - link_p: List[np.ndarray] = [] - for fr in self.link_frames: - Tl = self._lookup(self.cfg["base"], fr) - if Tl is None: - return None - link_R.append(Tl[:3, :3]) - link_p.append(Tl[:3, 3]) - return geometric_jacobian(link_R, link_p, p_ee, RIZON_LINK_AXES) - - def _w_down(self, R: np.ndarray) -> Tuple[np.ndarray, float]: - z_now = R[:, 2] - z_des = np.array([0.0, 0.0, -1.0]) - c = float(np.clip(np.dot(z_now, z_des), -1.0, 1.0)) - ang = float(np.arccos(c)) - if ang < 0.02: - return np.zeros(3), ang - axis = np.cross(z_now, z_des) - n = float(np.linalg.norm(axis)) - axis = axis / n if n > 1e-9 else np.array([1.0, 0.0, 0.0]) - mag = float(np.clip(self.cfg["kp"] * ang, -self.cfg["w_max"], self.cfg["w_max"])) - return axis * mag, ang - - def _target_err( - self, p: np.ndarray, R: np.ndarray, target: np.ndarray, verticalize: bool - ) -> Tuple[np.ndarray, float, float]: - dp = np.asarray(target, dtype=float).reshape(3) - np.asarray(p, dtype=float).reshape(3) - _, ang = (self._w_down(R) if verticalize else (np.zeros(3), 0.0)) - xy = float(np.hypot(dp[0], dp[1])) - return dp, ang, xy - - def _wait_state(self, timeout_s: float) -> Tuple[Optional[np.ndarray], Optional[np.ndarray]]: - t0 = time.monotonic() - q = None - Tee = None - while time.monotonic() - t0 < timeout_s: - self._spin(0.05) - q = self._q() - Tee = self._lookup(self.cfg["base"], self.cfg["ee"]) - if q is not None and Tee is not None and self._jacobian(Tee[:3, 3]) is not None: - return q, Tee - return q, Tee - - def _send_action(self, traj: JointTrajectory, wait_s: float) -> bool: - goal = FollowJointTrajectory.Goal() - goal.trajectory = traj - fut = self._cli.send_goal_async(goal) - t0 = time.monotonic() - while not fut.done() and time.monotonic() - t0 < 4.0: - self._spin(0.05) - handle = fut.result() if fut.done() else None - if handle is None or not handle.accepted: - print(" 错误:JTC 拒绝了抬升轨迹", flush=True) - return False - res = handle.get_result_async() - t0 = time.monotonic() - last = 0.0 - while not res.done() and time.monotonic() - t0 < wait_s: - self._spin(0.05) - now = time.monotonic() - if now - last > 0.4: - Tee = self._lookup(self.cfg["base"], self.cfg["ee"]) - if Tee is not None: - p = Tee[:3, 3] - print( - f" 运动中 ee=({p[0]:.3f},{p[1]:.3f},{p[2]:.3f}) " - f"z_err={(self.cfg['z'] - p[2]) * 1000:+.0f}mm", - flush=True, - ) - last = now - if not res.done(): - print(" 警告:JTC 结果超时 —— 仍然继续检查 TF", flush=True) - return False - return True - - def _plan_and_send( - self, - q0: np.ndarray, - Tee: np.ndarray, - target: np.ndarray, - verticalize: bool, - tag: str = "", - max_seg: float = 0.08, - v: float = 0.05, - ) -> bool: - """规划并执行一段朝向 target 的短笛卡尔位移(≤ max_seg)。 - 长距离移动由调用方以闭环小步跳的方式完成,因为雅可比是在当前位姿 - 处冻结的 —— 超过 10 cm 后线性化误差会让一次性规划严重偏离目标。""" - p = Tee[:3, 3].copy() - R = Tee[:3, :3] - dp, ang, _ = self._target_err(p, R, target, verticalize) - dist = float(np.linalg.norm(dp)) - if dist > max_seg: # 限制本次小步跳的长度;调用方会用最新的 TF 循环执行 - dp = dp * (max_seg / dist) - dist = max_seg - print( - f" 规划 {tag} Δxyz=({dp[0]*1000:+.0f},{dp[1]*1000:+.0f},{dp[2]*1000:+.0f})mm " - f"倾角={ang * 180 / np.pi:.1f}deg", - flush=True, - ) - J = self._jacobian(p) - if J is None: - print("错误:缺少用于雅可比的 link TF", flush=True) - return False - - q = q0.copy() - waypoints = [q.copy()] - remain = dp.copy() - w_step, _ = (self._w_down(R) if verticalize else (np.zeros(3), 0.0)) - n_max = int(np.ceil(dist / 0.012)) + 4 - for _ in range(n_max): - if float(np.linalg.norm(remain)) < 0.0015 and ( - (not verticalize) or ang < 0.03 - ): - break - nseg = max(1, int(np.ceil(float(np.linalg.norm(remain)) / 0.012))) - step = remain / nseg - if verticalize and ang > 0.03: - qdot = dls_twist( - J, step / 0.12, w_base=w_step, damping=0.08, max_qdot=0.45 - ) - dq = np.clip(qdot * 0.12, -0.06, 0.06) - else: - dq = dls_translate_hold_ori(J, step, damping=0.08, max_dq=0.06) - if float(np.max(np.abs(dq))) < 1e-5: - break - q = q + dq - waypoints.append(q.copy()) - remain = remain - (J[:3, :] @ dq) - ang = max(0.0, ang - 0.05) - - planned = dist - float(np.linalg.norm(remain)) - if len(waypoints) < 2 or planned < 0.4 * dist: - print( - f" 警告 {tag}:规划器停滞 " - f"(已规划 {planned*1000:.0f}/{dist*1000:.0f}mm)—— 跳过本次小步跳", - flush=True, - ) - return False - # 关节偏移量的合理性闸门:拒绝过于夸张的规划 - if float(np.max(np.abs(waypoints[-1] - q0))) > 1.0: - print(f" 错误 {tag}:关节偏移 >1 rad —— 放弃本次小步跳", flush=True) - return False - - duration = max(1.6, dist / max(min(v, 0.06), 1e-3)) - n = len(waypoints) - 1 - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - traj.points.append(_pt(waypoints[0], np.zeros(7), 0.08)) - zeros = np.zeros(7) - for i, qi in enumerate(waypoints[1:], start=1): - t = 0.08 + duration * (i / n) - qdot = zeros if i == n else (waypoints[min(i + 1, n)] - qi) / max( - duration / n, 0.05 - ) - qdot = np.clip(qdot, -0.40, 0.40) - traj.points.append(_pt(qi, qdot, t)) - # 强制最后一个点的速度为零 - traj.points[-1].velocities = [0.0] * 7 - print( - f" 发送 JTC action {tag},{n} 步 T={duration:.1f}s", - flush=True, - ) - return self._send_action(traj, wait_s=duration + 6.0) - - def _goto( - self, - q: np.ndarray, - Tee: np.ndarray, - target: np.ndarray, - verticalize: bool, - tol_m: float, - tol_tilt: float, - tag: str, - v: float, - max_hops: int = 8, - ) -> Tuple[bool, np.ndarray, np.ndarray]: - """闭环点到点:规划 ≤8 cm 的小步跳 → 执行 → 重新测量 TF → 重复, - 直到落在容差内。这样对长距离下的雅可比线性化误差更鲁棒。""" - for hop in range(max_hops): - p = Tee[:3, 3] - dp, ang, _ = self._target_err(p, Tee[:3, :3], target, verticalize) - dist = float(np.linalg.norm(dp)) - if dist < tol_m and ((not verticalize) or ang < tol_tilt): - return True, q, Tee - print( - f" {tag} 第 {hop + 1} 跳 remain={dist*1000:.0f}mm " - f"倾角={ang * 180 / np.pi:.1f}deg", - flush=True, - ) - if not self._plan_and_send(q, Tee, target, verticalize, tag, v=v): - return False, q, Tee - t_end = time.monotonic() + 0.5 - while time.monotonic() < t_end: - self._spin(0.05) - q2, Tee2 = self._wait_state(2.0) - if q2 is None or Tee2 is None: - print("错误:移动过程中丢失状态", flush=True) - return False, q, Tee - q, Tee = q2, Tee2 - p = Tee[:3, 3] - dp, ang, _ = self._target_err(p, Tee[:3, :3], target, verticalize) - ok = float(np.linalg.norm(dp)) < (tol_m * 2.0) and ( - (not verticalize) or ang < (tol_tilt * 2.0) - ) - return ok, q, Tee - - def _pin(self, q: np.ndarray) -> None: - if not self._cli.wait_for_server(timeout_sec=3.0): - return - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - traj.points = [_pt(q, np.zeros(7), 0.08), _pt(q, np.zeros(7), 0.45)] - self._send_action(traj, wait_s=3.0) - - def _named_pose(self, name: str, speed: float) -> bool: - """调用 Flexiv 的 ``/set_named_pose``,并等待机械臂静止。""" - cli = self.create_client(SetNamedPose, "/set_named_pose") - if not cli.wait_for_server(timeout_sec=8.0): - print("错误:``/set_named_pose`` 不可用 —— 请启动 run_real.sh", flush=True) - return False - req = SetNamedPose.Request() - req.pose_name = name - req.velocity_scale = float(min(max(speed, 0.05), 1.0)) - req.acceleration_scale = 0.0 - print(f" [B] set_named_pose '{name}' speed={req.velocity_scale:.2f}", flush=True) - fut = cli.call_async(req) - t0 = time.monotonic() - while not fut.done() and time.monotonic() - t0 < 90.0: - self._spin(0.1) - if not fut.done(): - print("错误:set_named_pose 超时", flush=True) - return False - resp = fut.result() - print( - f" [B] 响应 success={resp.success} msg={resp.message}", - flush=True, - ) - if not resp.success: - return False - # 等待法兰停止运动(约 0.8 s 内 Δp < 1 mm) - last = None - still = 0.0 - t0 = time.monotonic() - while time.monotonic() - t0 < 30.0: - self._spin(0.2) - Tee = self._lookup(self.cfg["base"], self.cfg["ee"]) - if Tee is not None: - p = Tee[:3, 3] - if last is not None and float(np.linalg.norm(p - last)) < 0.001: - still += 0.2 - if still >= 0.8: - return True - else: - still = 0.0 - last = p.copy() - print(" 警告:等待静止超时 —— 仍然继续", flush=True) - return True - - def run(self, timeout_s: float = 25.0) -> int: - cfg = self.cfg - q, Tee = self._wait_state(4.0) - if q is None or Tee is None: - print("错误:没有 joint_states / TF —— 请启动 run_real.sh", flush=True) - return 2 - if not self._cli.wait_for_server(timeout_sec=8.0): - print("错误:JTC action 不可用 —— 请启动 run_real.sh", flush=True) - return 3 - - p = Tee[:3, 3] - safe_z = float(cfg["safe_z"]) - print( - f"=== 回到 Flexiv 初始位姿 '{cfg['home_pose']}' " - f"safe_z={safe_z*1000:.0f}mm ===", - flush=True, - ) - print( - f" 当前 ee=({p[0]:.3f},{p[1]:.3f},{p[2]:.3f})", - flush=True, - ) - - # --- 阶段 A:回 home 前先沿纯 Z 方向升到安全高度 --- - if p[2] < safe_z - 0.01: - lift_tgt = np.array([p[0], p[1], safe_z], dtype=float) - print(f" [A] 抬升 Z {p[2]*1000:.0f} → {safe_z*1000:.0f}mm", flush=True) - ok, q, Tee = self._goto( - q, Tee, lift_tgt, False, 0.010, 0.0, "[A]lift", v=0.05 - ) - if not ok: - print("错误:抬升阶段失败 —— 就地 pin 住", flush=True) - self._pin(q) - return 4 - - # --- 阶段 B:Flexiv 命名位姿 → 真正的初始位姿,姿态良好 --- - if not self._named_pose(cfg["home_pose"], cfg["home_speed"]): - print("错误:回命名位姿失败 —— 就地 pin 住", flush=True) - self._pin(q) - return 4 - - # --- 阶段 C:保持住,让伺服从一个静止位姿接手 --- - q, Tee = self._wait_state(2.0) - if q is not None: - self._pin(q) - if Tee is not None: - p = Tee[:3, 3] - print( - f" 已到初始位姿 ee=({p[0]:.3f},{p[1]:.3f},{p[2]:.3f})", - flush=True, - ) - return 0 - -def main() -> int: - cfg = _load_ee_cfg() - rclpy.init() - node = GotoEePlane(cfg) - try: - return node.run() - finally: - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_calibrate.py b/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_calibrate.py deleted file mode 100644 index e7e827d..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_calibrate.py +++ /dev/null @@ -1,769 +0,0 @@ -#!/usr/bin/env python3 -"""完整手眼标定流水线:移动 → 棋盘稳定判定 → 采集 → 求解 → 清理。 - -支持 eye_in_hand / eye_to_hand。 - -相机内参优先级: - 1) ROS 的 CameraInfo 话题(若正在发布) - 2) 通过 pyrealsense2 读取 RealSense D405/D435 的 EEPROM(camera_source) - 3) YAML 中手写的 camera_fx/fy/cx/cy - -棋盘尺寸(board_cols / board_rows / square_size_m)可由用户配置。 -""" - -from __future__ import annotations - -import json -import shutil -import time -from datetime import datetime, timezone -from pathlib import Path -from typing import List, Optional, Tuple - -import numpy as np -import rclpy -from geometry_msgs.msg import PoseStamped -from rclpy.action import ActionClient -from rclpy.node import Node -from rclpy.qos import qos_profile_sensor_data -from sensor_msgs.msg import CameraInfo, Image, JointState -from std_msgs.msg import String - -from arm_application.handeye_lib import ( - BoardConfig, - CameraIntrinsics, - ChessboardStabilizer, - T_from_flexiv_tcp, - calibrate_hand_eye, - cam_to_flange_via_tool, - detect_chessboard, - format_matrix_yaml, - format_transform_yaml, - is_pose_filled, - pose_to_Rt, - solve_board_pose, -) -from arm_application.handeye_realsense import ( - is_realsense_source, - query_realsense_color_intrinsics, - resolve_realsense_topics, -) -from arm_application.site_io import joint_prefix_default - -from arm_msgs.action import FollowJointTrajectory -from arm_msgs.srv import GetArmState - -from arm_application.ros_node import TolerantNode - -DEFAULT_JOINTS = [ - 'joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6', 'joint7', -] - - -def _image_to_bgr(msg: Image) -> np.ndarray: - h, w = int(msg.height), int(msg.width) - enc = (msg.encoding or '').lower() - data = np.frombuffer(msg.data, dtype=np.uint8) - - if enc in ('bgr8', 'rgb8'): - img = data.reshape(h, w, 3) - return img[:, :, ::-1].copy() if enc == 'rgb8' else img - if enc in ('mono8', '8uc1'): - gray = data.reshape(h, w) - return np.stack([gray, gray, gray], axis=-1) - if enc in ('bgra8', 'rgba8'): - img = data.reshape(h, w, 4) - bgr = img[:, :, :3] - return bgr[:, :, ::-1].copy() if enc == 'rgba8' else bgr - raise RuntimeError(f'不支持的图像编码:{msg.encoding!r}') - - -def _camera_info_to_intrinsics(msg: CameraInfo) -> CameraIntrinsics: - K = np.array(msg.k, dtype=float).reshape(3, 3) - dist = np.array(msg.d, dtype=float).reshape(-1, 1) if msg.d else np.zeros((5, 1)) - return CameraIntrinsics(K=K, dist=dist) - - -class HandeyeCalibrate(TolerantNode): - def __init__(self) -> None: - super().__init__('handeye_calibrate') - - self.declare_parameter('mode', 'eye_in_hand') # eye_in_hand | eye_to_hand - self.declare_parameter('joint_prefix', joint_prefix_default()) - self.declare_parameter('joint_names', DEFAULT_JOINTS) - self.declare_parameter('velocity_scale', 0.10) - self.declare_parameter('action_name', 'follow_joint_trajectory') - self.declare_parameter('move_time_sec', 4.0) - self.declare_parameter('start_index', 0) - - self.declare_parameter('num_poses', 12) - self.declare_parameter('waypoint_positions', [0.0] * (12 * 7)) - self.declare_parameter('min_poses', 5) - - # 相机来源:manual | d405 | d435 - self.declare_parameter('camera_source', 'manual') - self.declare_parameter('camera_serial', '') - self.declare_parameter('camera_namespace', '') - self.declare_parameter('realsense_width', 1280) - self.declare_parameter('realsense_height', 720) - self.declare_parameter('image_topic', '') - self.declare_parameter('camera_info_topic', '') - self.declare_parameter('camera_fx', 0.0) - self.declare_parameter('camera_fy', 0.0) - self.declare_parameter('camera_cx', 0.0) - self.declare_parameter('camera_cy', 0.0) - self.declare_parameter('camera_dist', [0.0, 0.0, 0.0, 0.0, 0.0]) - - # 棋盘(可自定义) - # 默认值必须与 site.yaml 的 handeye.board_* 及结果文件头里的实际板子一致。 - # 真实使用的板:A5 内角点 11x8,方格 15mm(site.yaml handeye.boards.eye_in_hand)。 - # 这里原先写的是 9x6 / 0.025,后来是 8x11;漏配就会静默用错尺寸。 - self.declare_parameter('board_cols', 11) # 内角点 - self.declare_parameter('board_rows', 8) - self.declare_parameter('square_size_m', 0.015) - - self.declare_parameter('stable_window', 8) - self.declare_parameter('stable_pixel_std', 0.45) - self.declare_parameter('stable_timeout_sec', 25.0) - self.declare_parameter('settle_sec', 0.4) - # 到位后的"真的停住了"判据 —— 直接看关节速度,比固定 sleep 可靠。 - # 这几个参数原先 site.yaml 和 run_handeye.sh 一直在传,但本节点从未声明, - # ROS 2 会静默忽略未声明的覆盖参数,于是"等静止再拍照"这件事其实没实现, - # 实际只靠一次固定 settle_sec。现在补上。 - self.declare_parameter('settle_qd_max', 0.015) # |qd|_max [rad/s] 低于此值算静 - self.declare_parameter('settle_stable_sec', 0.6) # 需要连续静多久 - self.declare_parameter('settle_timeout_sec', 8.0) # 等静止的总超时 - self.declare_parameter('pin_holds', 2) # 静止后再保持几拍 - self.declare_parameter('pin_hold_sec', 0.45) # 每拍多长 - self.declare_parameter('skip_unstable_poses', True) - - self.declare_parameter('output_dir', '/home/cc/ros2/handeye/tmp') - self.declare_parameter('result_file', '') - self.declare_parameter('cleanup_images', True) - # 眼在手上:AX=XB 的 gripper 用 Studio 工具 TCP,再折成 cam→法兰写 T_4x4。 - # 空 = 旧口径(ee_pose 当 gripper,T_4x4 原样写出)。配了就必须带 TCP。 - self.declare_parameter('gripper_tool', '') - self.declare_parameter('gripper_tcp_xyz', [0.0, 0.0, 0.0]) - self.declare_parameter('gripper_tcp_qwxyz', [1.0, 0.0, 0.0, 0.0]) - - prefix = str(self.get_parameter('joint_prefix').value or '') - base = list( - self.get_parameter('joint_names').get_parameter_value().string_array_value - or DEFAULT_JOINTS - ) - self.joint_names = [f'{prefix}{n}' for n in base] - self.mode = str(self.get_parameter('mode').value).strip().lower() - self.velocity_scale = float(self.get_parameter('velocity_scale').value) - self.action_name = str(self.get_parameter('action_name').value) - self.move_time_sec = float(self.get_parameter('move_time_sec').value) - self.start_index = max(0, int(self.get_parameter('start_index').value)) - self.min_poses = int(self.get_parameter('min_poses').value) - self.cleanup_images = bool(self.get_parameter('cleanup_images').value) - self.gripper_tool = str(self.get_parameter('gripper_tool').value or '').strip() - tcp_xyz = list( - self.get_parameter('gripper_tcp_xyz').get_parameter_value().double_array_value - or [0.0, 0.0, 0.0] - ) - tcp_q = list( - self.get_parameter('gripper_tcp_qwxyz').get_parameter_value().double_array_value - or [1.0, 0.0, 0.0, 0.0] - ) - self.T_flange_to_tool = T_from_flexiv_tcp(tcp_xyz[:3], tcp_q[:4]) - if self.gripper_tool and float(np.linalg.norm(self.T_flange_to_tool[:3, 3])) < 1e-4: - raise RuntimeError( - f'gripper_tool={self.gripper_tool!r} 但 gripper_tcp_xyz 几乎是零:' - '等于没把 Studio TCP 传进来。不许按法兰口径假装在用工具系。' - ) - - self.camera_source = str(self.get_parameter('camera_source').value).strip().lower() - self.camera_serial = str(self.get_parameter('camera_serial').value or '').strip() - self.camera_namespace = str( - self.get_parameter('camera_namespace').value or '' - ).strip() - self.rs_width = int(self.get_parameter('realsense_width').value) - self.rs_height = int(self.get_parameter('realsense_height').value) - - self.board = BoardConfig( - cols=int(self.get_parameter('board_cols').value), - rows=int(self.get_parameter('board_rows').value), - square_size=float(self.get_parameter('square_size_m').value), - ) - self.stabilizer = ChessboardStabilizer( - window=int(self.get_parameter('stable_window').value), - max_pixel_std=float(self.get_parameter('stable_pixel_std').value), - ) - self.stable_timeout = float(self.get_parameter('stable_timeout_sec').value) - self.settle_sec = float(self.get_parameter('settle_sec').value) - self.settle_qd_max = float(self.get_parameter('settle_qd_max').value) - self.settle_stable_sec = float(self.get_parameter('settle_stable_sec').value) - self.settle_timeout = float(self.get_parameter('settle_timeout_sec').value) - self.pin_holds = max(0, int(self.get_parameter('pin_holds').value)) - self.pin_hold_sec = max(0.0, float(self.get_parameter('pin_hold_sec').value)) - self.skip_unstable = bool(self.get_parameter('skip_unstable_poses').value) - - out = Path(str(self.get_parameter('output_dir').value)).expanduser() - self.output_dir = out - self.images_dir = out / 'images' - rf = str(self.get_parameter('result_file').value or '').strip() - self.result_file = Path(rf).expanduser() if rf else (out / 'handeye_result.yaml') - - self._client = ActionClient(self, FollowJointTrajectory, self.action_name) - self._get_state = self.create_client(GetArmState, 'get_arm_state') - self._capture_pub = self.create_publisher(String, 'handeye/capture', 10) - - self._latest_image: Optional[Image] = None - self._latest_info: Optional[CameraInfo] = None - self._latest_js: Optional[JointState] = None - self._intrinsics: Optional[CameraIntrinsics] = None - - img_topic = str(self.get_parameter('image_topic').value or '').strip() - info_topic = str(self.get_parameter('camera_info_topic').value or '').strip() - if is_realsense_source(self.camera_source): - img_topic, info_topic = resolve_realsense_topics( - self.camera_source, - camera_namespace=self.camera_namespace, - image_topic=img_topic, - camera_info_topic=info_topic, - ) - self._info_topic = info_topic - - self.create_subscription(JointState, '/joint_states', self._on_js, 10) - - if not img_topic: - self.get_logger().error( - 'image_topic 为空。请设置 camera_source:=d405|d435,或填写 image_topic。' - ) - else: - self.create_subscription( - Image, img_topic, self._on_image, qos_profile_sensor_data - ) - self.get_logger().info(f'已订阅图像:{img_topic}(BEST_EFFORT)') - if info_topic: - self.create_subscription( - CameraInfo, info_topic, self._on_info, qos_profile_sensor_data - ) - self.get_logger().info(f'已订阅 camera_info:{info_topic}(BEST_EFFORT)') - - def _on_js(self, msg: JointState) -> None: - self._latest_js = msg - - def _on_image(self, msg: Image) -> None: - self._latest_image = msg - - def _on_info(self, msg: CameraInfo) -> None: - self._latest_info = msg - - def run(self) -> int: - if self.mode not in ('eye_in_hand', 'eye_to_hand'): - self.get_logger().error( - f'未知的 mode={self.mode!r};请使用 eye_in_hand 或 eye_to_hand' - ) - return 1 - - poses = self._load_poses() - if len(poses) < self.min_poses: - self.get_logger().error( - f'只有 {len(poses)} 个已填写位姿(需要 >= {self.min_poses})。' - '示教命令:bash ~/ros2/scripts/run_handeye.sh teach && merge。' - ) - return 1 - if self.start_index >= len(poses): - self.get_logger().error( - f'start_index {self.start_index} >= 已填写位姿数 {len(poses)}' - ) - return 1 - - if not self._resolve_intrinsics(): - return 1 - - if not self._client.wait_for_server(timeout_sec=15.0): - self.get_logger().error( - f'Action [{self.action_name}] 不可用。' - '请启动:bash ~/ros2/scripts/run_real.sh' - ) - return 2 - - self.output_dir.mkdir(parents=True, exist_ok=True) - self.images_dir.mkdir(parents=True, exist_ok=True) - - eye_to_hand = self.mode == 'eye_to_hand' - grip = self.gripper_tool or '(ee_pose 原样,无工具折算)' - self.get_logger().info( - f'手眼标定 [{self.mode}] camera_source={self.camera_source}:' - f'{len(poses)} 个位姿,棋盘={self.board.cols}x{self.board.rows} ' - f'方格={self.board.square_size}m,v={self.velocity_scale} ' - f'gripper_tool={grip}' - ) - self.get_logger().warn('清理工作空间;确认急停就绪。Ctrl+C 可中止。') - - Rg: List[np.ndarray] = [] - tg: List[np.ndarray] = [] - Rc: List[np.ndarray] = [] - tc: List[np.ndarray] = [] - meta = [] - - try: - for i in range(self.start_index, len(poses)): - q = poses[i] - self._log_progress(i, len(poses), '移动中...') - code = self._move_one(q, self.move_time_sec) - if code != 0: - return code - - if not self._verify_joints(q, tol=0.08): - self.get_logger().error( - f'[{i + 1}] 机械臂未到达目标关节位置 ' - '(控制器报告成功,但关节没有变化)。' - '请重启 run_real.sh;示教器切 AUTO Remote;清除故障。' - '不要相信这次标定结果。' - ) - return 10 - - end = time.monotonic() + max(0.0, self.settle_sec) - while rclpy.ok() and time.monotonic() < end: - rclpy.spin_once(self, timeout_sec=0.05) - - # 固定 settle_sec 之后再看关节速度:真停了才算数,然后 pin 一拍。 - self._wait_settled() - self._pin_hold() - - ok, std, corners, pattern, bgr = self._wait_stable() - if not ok or corners is None or bgr is None: - msg = f'[{i + 1}] 棋盘不稳定(std={std:.3f})' - if self.skip_unstable: - self.get_logger().warn(f'{msg} —— 跳过') - continue - self.get_logger().error(f'{msg}。中止。') - return 7 - - ee = self._read_ee_pose() - if ee is None: - self.get_logger().error('读取 ee_pose 失败') - return 8 - - assert self._intrinsics is not None - R_t2c, t_t2c = solve_board_pose( - corners, self.board, self._intrinsics, pattern=pattern - ) - xyz = [ee.pose.position.x, ee.pose.position.y, ee.pose.position.z] - quat = [ - ee.pose.orientation.x, - ee.pose.orientation.y, - ee.pose.orientation.z, - ee.pose.orientation.w, - ] - R_g2b, t_g2b = pose_to_Rt(xyz, quat) - - stamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S') - img_path = self.images_dir / f'pose_{i:02d}_{stamp}.png' - self._save_png(bgr, img_path) - - msg = String() - msg.data = f'capture:{i}:{len(poses)}' - self._capture_pub.publish(msg) - - Rg.append(R_g2b) - tg.append(t_g2b) - Rc.append(R_t2c) - tc.append(t_t2c) - meta.append( - { - 'index': i, - 'joints': list(q), - 'ee_xyz': xyz, - 'ee_quat_xyzw': quat, - 'image': str(img_path), - 'corner_std_px': std, - } - ) - self.get_logger().info( - f'[{i + 1}/{len(poses)}] 已采集 ' - f'(corner_std={std:.3f}px) -> {img_path.name}' - ) - except KeyboardInterrupt: - self.get_logger().info('已中断') - return 0 - - if len(Rg) < self.min_poses: - self.get_logger().error( - f'只采集到 {len(Rg)} 次;求解至少需要 {self.min_poses} 次' - ) - return 9 - - self.get_logger().info(f'用 {len(Rg)} 个视角求解手眼标定...') - R, t = calibrate_hand_eye(Rg, tg, Rc, tc, eye_to_hand=eye_to_hand) - extra = '' - if eye_to_hand: - name = 'T_cam_to_base (eye_to_hand)' - yaml_txt = format_transform_yaml(R, t, name) - if self.gripper_tool: - extra = ( - f'gripper_tool: {self.gripper_tool}\n' - + format_matrix_yaml(self.T_flange_to_tool, 'T_flange_to_tool') - ) - self.get_logger().info( - f'gripper={self.gripper_tool}:AX=XB 的手是 TCP;' - f'T_4x4 是 cam→基座,不折 t={t.reshape(3)*1000} mm' - ) - elif self.gripper_tool: - T_cam_tool = np.eye(4) - T_cam_tool[:3, :3] = R - T_cam_tool[:3, 3] = t.reshape(3) - T_cam_flange = cam_to_flange_via_tool(T_cam_tool, self.T_flange_to_tool) - delta = float(np.linalg.norm(T_cam_flange[:3, 3] - T_cam_tool[:3, 3])) - tool_len = float(np.linalg.norm(self.T_flange_to_tool[:3, 3])) - if tool_len > 0.05 and delta < 1e-4: - self.get_logger().error( - 'T_cam_to_flange 与 T_cam_to_tool 平移几乎相同,' - '折算没生效。结果作废。' - ) - return 11 - # 腕部相机在法兰前方(法兰 +Z)。乘反了 Z 会落到 −200 mm 一带。 - if ( - self.T_flange_to_tool[2, 3] > 0.05 - and float(T_cam_flange[2, 3]) < 0.0 - ): - self.get_logger().error( - f'T_cam_to_flange tz={float(T_cam_flange[2, 3])*1000:.1f} mm ' - '在法兰后方,乘序反了。结果作废。' - ) - return 12 - R, t = T_cam_flange[:3, :3], T_cam_flange[:3, 3].reshape(3, 1) - name = 'T_cam_to_flange (eye_in_hand,由工具 TCP 折算)' - yaml_txt = format_transform_yaml(R, t, name) - extra = ( - f'gripper_tool: {self.gripper_tool}\n' - + format_matrix_yaml(self.T_flange_to_tool, 'T_flange_to_tool') - + format_matrix_yaml(T_cam_tool, 'T_cam_to_tool') - ) - self.get_logger().info( - f'gripper={self.gripper_tool}:' - f'T_cam_to_tool t={T_cam_tool[:3, 3]*1000} mm → ' - f'T_cam_to_flange t={T_cam_flange[:3, 3]*1000} mm' - ) - else: - name = 'T_cam_to_gripper (eye_in_hand)' - yaml_txt = format_transform_yaml(R, t, name) - header = ( - f'# 手眼标定结果\n' - f'# mode: {self.mode}\n' - f'# camera_source: {self.camera_source}\n' - f'# views: {len(Rg)}\n' - f'# utc: {datetime.now(timezone.utc).isoformat()}\n' - f'# board: {self.board.cols}x{self.board.rows} ' - f'square_m={self.board.square_size}\n' - ) - if self.gripper_tool and eye_to_hand: - header += ( - f'# gripper_tool: {self.gripper_tool}\n' - f'# T_4x4 = cam→基座(AX=XB 的手是 TCP,不折到法兰)\n' - f'# 旧结果备份在 results/backup/\n' - ) - elif self.gripper_tool: - header += ( - f'# gripper_tool: {self.gripper_tool}\n' - f'# T_4x4 = cam→法兰(AX=XB 在 TCP 上解,再左乘 T_flange_to_tool)\n' - f'# T_cam_to_tool 是原始求解;旧的法兰/tool1 备份在 results/backup/\n' - ) - self.result_file.parent.mkdir(parents=True, exist_ok=True) - self.result_file.write_text(header + extra + yaml_txt, encoding='utf-8') - (self.output_dir / 'captures.json').write_text( - json.dumps(meta, indent=2), encoding='utf-8' - ) - - self.get_logger().info('======== 手眼标定结果 ========') - for line in (header + yaml_txt).strip().splitlines(): - self.get_logger().info(line) - self.get_logger().info(f'已保存 -> {self.result_file}') - - if self.cleanup_images: - if self.images_dir.exists(): - shutil.rmtree(self.images_dir, ignore_errors=True) - self.get_logger().info('标定图像已删除') - else: - self.get_logger().info(f'图像保留在 {self.images_dir}') - return 0 - - def _load_poses(self) -> List[List[float]]: - flat = list(self.get_parameter('waypoint_positions').value) - n_j = len(self.joint_names) - n_cfg = int(self.get_parameter('num_poses').value) - if n_cfg < 1: - return [] - need = n_cfg * n_j - if len(flat) < need: - self.get_logger().warn( - f'waypoint_positions 长度 {len(flat)} < num_poses*{n_j}={need};' - '用零补齐' - ) - flat = flat + [0.0] * (need - len(flat)) - poses: List[List[float]] = [] - for i in range(n_cfg): - q = [float(v) for v in flat[i * n_j : (i + 1) * n_j]] - if is_pose_filled(q): - poses.append(q) - else: - self.get_logger().warn(f'位姿槽 {i} 为空(全零)—— 已跳过') - return poses - - def _resolve_intrinsics(self) -> bool: - # 1) CameraInfo - deadline = time.monotonic() + 3.0 - while rclpy.ok() and self._latest_info is None and time.monotonic() < deadline: - rclpy.spin_once(self, timeout_sec=0.1) - - if self._latest_info is not None: - self._intrinsics = _camera_info_to_intrinsics(self._latest_info) - K = self._intrinsics.K - self.get_logger().info( - f'内参来自 CameraInfo({self._info_topic}):' - f'fx={K[0, 0]:.2f} fy={K[1, 1]:.2f} cx={K[0, 2]:.2f} cy={K[1, 2]:.2f}' - ) - return True - - # 2) RealSense EEPROM - if is_realsense_source(self.camera_source): - try: - intr = query_realsense_color_intrinsics( - self.camera_source, - serial=self.camera_serial, - width=self.rs_width, - height=self.rs_height, - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f'RealSense 内参查询失败:{exc}') - else: - self._intrinsics = CameraIntrinsics(K=intr.as_K(), dist=intr.as_dist()) - self.get_logger().info( - f'内参来自 RealSense {intr.model.upper()} ' - f'serial={intr.serial} {intr.width}x{intr.height}:' - f'fx={intr.fx:.2f} fy={intr.fy:.2f} ' - f'cx={intr.cx:.2f} cy={intr.cy:.2f}' - ) - if (intr.width, intr.height) != (self.rs_width, self.rs_height): - self.get_logger().warn( - f'请求 {self.rs_width}x{self.rs_height},' - f'实际得到 {intr.width}x{intr.height}(最接近的 profile)' - ) - return True - - # 3) Manual YAML - fx = float(self.get_parameter('camera_fx').value) - fy = float(self.get_parameter('camera_fy').value) - cx = float(self.get_parameter('camera_cx').value) - cy = float(self.get_parameter('camera_cy').value) - if fx <= 0 or fy <= 0: - self.get_logger().error( - '没有内参。请设置 camera_source:=d405|d435,' - '或提供 camera_info_topic,或填写 camera_fx/fy/cx/cy。' - ) - return False - dist = np.array( - list(self.get_parameter('camera_dist').value), dtype=float - ).reshape(-1, 1) - K = np.array([[fx, 0.0, cx], [0.0, fy, cy], [0.0, 0.0, 1.0]], dtype=float) - self._intrinsics = CameraIntrinsics(K=K, dist=dist) - self.get_logger().info( - f'内参来自 YAML:fx={fx:.2f} fy={fy:.2f} cx={cx:.2f} cy={cy:.2f}' - ) - return True - - def _log_progress(self, i: int, total: int, suffix: str = '') -> None: - """带进度条的日志。 - - 自动标定是无人值守的长流程(十几个点位 × 移动+稳定+拍照), - 单看 `[3/12]` 很难有"还要多久"的直觉,加一条可视化进度条。 - """ - frac = (i + 1) / max(1, total) - width = 24 - filled = int(round(frac * width)) - bar = '█' * filled + '░' * (width - filled) - self.get_logger().info( - f'[{i + 1}/{total}] [{bar}] {frac * 100:5.1f}% {suffix}' - ) - - def _wait_settled(self) -> bool: - """等机械臂真的停下来,再进入拍照。 - - 判据是关节速度 |qd|_max 连续 ``settle_stable_sec`` 低于 ``settle_qd_max``。 - 为什么不用固定 sleep:`settle_sec` 是拍脑袋的时长,臂负载/姿态不同, - 刹车距离差别很大 —— 等太短会在臂还在动时拍照(棋盘虚 → 角点抖动), - 等太长则整轮标定被无谓拉长。直接看速度更准。 - - 超时不算致命:记一条警告后继续,让后面的棋盘稳定性检查去把关。 - """ - if self.settle_qd_max <= 0.0: - return True - deadline = time.monotonic() + self.settle_timeout - stable_since: Optional[float] = None - while rclpy.ok() and time.monotonic() < deadline: - rclpy.spin_once(self, timeout_sec=0.05) - js = self._latest_js - if js is None or not list(js.velocity): - continue - try: - vmax = float(np.max(np.abs(np.asarray(js.velocity, dtype=float)))) - except Exception: # noqa: BLE001 - continue - now = time.monotonic() - if vmax <= self.settle_qd_max: - if stable_since is None: - stable_since = now - elif now - stable_since >= self.settle_stable_sec: - return True - else: - stable_since = None # 又动了,重新计时 - self.get_logger().warn( - f'wait_settled 超时 ({self.settle_timeout:.1f}s),臂可能仍在微动;' - '交给棋盘稳定性检查兜底' - ) - return False - - def _pin_hold(self) -> None: - """静止后再保持几拍,抑制到位后的微小回弹/漂移。 - - 语义取自 site.yaml 的注释"零速 pin 后再拍照":不是重新规划轨迹, - 而是纯粹等一段时间让机械臂自己稳下来(控制器在到位后仍会做少量补偿)。 - """ - total = self.pin_holds * self.pin_hold_sec - end = time.monotonic() + total - while rclpy.ok() and time.monotonic() < end: - rclpy.spin_once(self, timeout_sec=0.05) - - def _wait_stable( - self, - ) -> Tuple[bool, float, Optional[np.ndarray], Optional[np.ndarray]]: - self.stabilizer.reset() - deadline = time.monotonic() + self.stable_timeout - last_std = float('inf') - last_corners = None - last_pattern = None - last_bgr = None - last_log = 0.0 - while rclpy.ok() and time.monotonic() < deadline: - rclpy.spin_once(self, timeout_sec=0.05) - if self._latest_image is None: - continue - try: - bgr = _image_to_bgr(self._latest_image) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f'图像转换失败:{exc}') - return False, last_std, None, None, None - detected = detect_chessboard(bgr, self.board) - corners = detected[0] if detected is not None else None - pattern = detected[1] if detected is not None else None - ok, std = self.stabilizer.push(corners) - last_std = std - if corners is not None: - last_corners = corners - last_pattern = pattern - last_bgr = bgr - now = time.monotonic() - if now - last_log > 1.0: - seen = '有' if corners is not None else '无' - self.get_logger().info( - f' 棋盘={seen} 角点标准差=' - f'{std if std < 1e8 else float("nan"):.3f}px' - ) - last_log = now - if ok: - return True, std, last_corners, last_pattern, last_bgr - return False, last_std, last_corners, last_pattern, last_bgr - - - def _verify_joints(self, target: List[float], tol: float = 0.08) -> bool: - """确认 ``joint_states`` 真的走到了目标位置。 - - 用来识破"假的成功":有些执行接口会立刻返回成功,但关节其实没动 - (或只动了一半)。这里在 2 秒内轮询关节角,逐轴比对容差 ``tol``(弧度), - 只有全部落在容差内才算真到位。 - """ - deadline = time.monotonic() + 2.0 - while rclpy.ok() and time.monotonic() < deadline: - rclpy.spin_once(self, timeout_sec=0.05) - if self._latest_js is None: - continue - name_to_q = dict(zip(list(self._latest_js.name), list(self._latest_js.position))) - actual = [] - for n in self.joint_names: - if n not in name_to_q: - break - actual.append(float(name_to_q[n])) - if len(actual) != len(target): - continue - err = float(np.sqrt(np.mean([(a - b) ** 2 for a, b in zip(actual, target)]))) - self.get_logger().info( - f' 关节相对目标的 RMSE:{err:.4f} rad(tol={tol})' - ) - return err <= tol - self.get_logger().error('校验运动时没有 joint_states') - return False - - def _move_one(self, positions: List[float], duration: float) -> int: - goal = FollowJointTrajectory.Goal() - goal.joint_names = self.joint_names - goal.num_points = 1 - goal.velocity_scale = self.velocity_scale - goal.positions = list(positions) - goal.time_from_start = [float(duration)] - - send = self._client.send_goal_async(goal) - if not self._wait_future(send, 10.0, '发送目标'): - return 3 - handle = send.result() - if handle is None or not handle.accepted: - self.get_logger().error('目标被拒绝') - return 4 - res_fut = handle.get_result_async() - if not self._wait_future(res_fut, max(60.0, duration * 3.0), '结果'): - return 5 - result = res_fut.result().result - if not result.success: - self.get_logger().error(f'移动失败:{result.message}') - return 6 - return 0 - - def _wait_future(self, fut, timeout: float, label: str) -> bool: - deadline = time.monotonic() + timeout - while rclpy.ok() and not fut.done(): - rclpy.spin_once(self, timeout_sec=0.05) - if time.monotonic() > deadline: - self.get_logger().error(f'等待 {label} 超时') - return False - return fut.done() - - def _read_ee_pose(self) -> Optional[PoseStamped]: - if not self._get_state.wait_for_service(timeout_sec=2.0): - return None - fut = self._get_state.call_async(GetArmState.Request()) - if not self._wait_future(fut, 2.0, 'get_arm_state'): - return None - res = fut.result() - if res is None or not res.success: - return None - return res.ee_pose - - def _save_png(self, bgr: np.ndarray, path: Path) -> None: - import cv2 - - if not cv2.imwrite(str(path), bgr): - raise RuntimeError(f'cv2.imwrite 失败:{path}') - - -def main(args=None) -> None: - rclpy.init(args=args) - node = HandeyeCalibrate() - code = 1 - try: - code = node.run() - except KeyboardInterrupt: - code = 0 - finally: - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - raise SystemExit(code) - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_lib.py b/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_lib.py deleted file mode 100644 index 048b358..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_lib.py +++ /dev/null @@ -1,404 +0,0 @@ -#!/usr/bin/env python3 -"""手眼标定辅助工具:棋盘稳定判定 + AX=XB 求解。 - -有 ``cv2.calibrateHandEye`` 时用它,否则用 Tsai-Lenz(NumPy 实现)。 -棋盘检测始终依赖 OpenCV。 -""" - -from __future__ import annotations - -import math -from collections import deque -from dataclasses import dataclass -from pathlib import Path -from typing import Deque, List, Optional, Sequence, Tuple - -import numpy as np - -try: - import cv2 -except Exception: # noqa: BLE001 - cv2 = None # type: ignore - - -@dataclass -class BoardConfig: - cols: int # 内角点数(宽) - rows: int # 内角点数(高) - square_size: float # 米 - - -@dataclass -class CameraIntrinsics: - K: np.ndarray - dist: np.ndarray - - -def R_to_quat_xyzw(R: np.ndarray) -> Tuple[float, float, float, float]: - """3×3 旋转 → ``(x, y, z, w)`` 四元数(Shepperd 法,按最大分量选分支)。 - - 为什么放在库里而不是各个 launch 里:这段换算**已经在两份 launch 里各抄了 - 一遍**,而且抄错过(对角分支的公式被写歪,症状是手眼 TF 差了 30°, - 定位看起来"总能到附近"但永远差一点)。换算只有一份才可能被测试: - ``test_handeye_lib_roundtrip.py`` 拿真实标定文件验证 - ``quat_xyzw_to_R(R_to_quat_xyzw(R)) == R``。 - """ - R = np.asarray(R, dtype=float).reshape(3, 3) - tr = float(R[0, 0] + R[1, 1] + R[2, 2]) - if tr > 0.0: - s = math.sqrt(tr + 1.0) * 2.0 - w = 0.25 * s - x = (R[2, 1] - R[1, 2]) / s - y = (R[0, 2] - R[2, 0]) / s - z = (R[1, 0] - R[0, 1]) / s - elif R[0, 0] > R[1, 1] and R[0, 0] > R[2, 2]: - s = math.sqrt(1.0 + R[0, 0] - R[1, 1] - R[2, 2]) * 2.0 - w = (R[2, 1] - R[1, 2]) / s - x = 0.25 * s - y = (R[0, 1] + R[1, 0]) / s - z = (R[0, 2] + R[2, 0]) / s - elif R[1, 1] > R[2, 2]: - s = math.sqrt(1.0 + R[1, 1] - R[0, 0] - R[2, 2]) * 2.0 - w = (R[0, 2] - R[2, 0]) / s - x = (R[0, 1] + R[1, 0]) / s - y = 0.25 * s - z = (R[1, 2] + R[2, 1]) / s - else: - s = math.sqrt(1.0 + R[2, 2] - R[0, 0] - R[1, 1]) * 2.0 - w = (R[1, 0] - R[0, 1]) / s - x = (R[0, 2] + R[2, 0]) / s - y = (R[1, 2] + R[2, 1]) / s - z = 0.25 * s - n = math.sqrt(x * x + y * y + z * z + w * w) - if n <= 0.0: - raise ValueError("旋转矩阵无法转成四元数(矩阵为零?)") - return x / n, y / n, z / n, w / n - - -def read_transform_yaml(path: str | Path) -> Tuple[np.ndarray, Tuple[float, float, float, float]]: - """读手眼标定产物 → ``(xyz_m, quat_xyzw)``。 - - 文件格式见 :func:`format_transform_yaml`:``T_4x4`` 是 4 行 4 列的列表。 - 读取时**必须校验形状**:手眼文件是现场人手拷来拷去的,形状不对时 - 直接报错,比"取到一堆 nan 然后发了个全零 TF"好得多(后者会让定位 - 永远差一个常量,而且看起来像相机标定不准)。 - """ - import yaml # 局部导入:本模块其它函数不需要 yaml(标定计算本身不依赖) - - with open(path, "r", encoding="utf-8") as f: - data = yaml.safe_load(f) or {} - T = data.get("T_4x4") - if T is None: - raise ValueError(f"{path}: 缺少 T_4x4 字段") - arr = np.asarray(T, dtype=float) - if arr.shape != (4, 4): - raise ValueError(f"{path}: T_4x4 应为 4x4,实际 {arr.shape}") - xyz = np.array([arr[0, 3], arr[1, 3], arr[2, 3]], dtype=float) - return xyz, R_to_quat_xyzw(arr[:3, :3]) - - -def quat_xyzw_to_R(q: Sequence[float]) -> np.ndarray: - x, y, z, w = [float(v) for v in q] - n = np.sqrt(x * x + y * y + z * z + w * w) + 1e-12 - x, y, z, w = x / n, y / n, z / n, w / n - return np.array( - [ - [1 - 2 * (y * y + z * z), 2 * (x * y - z * w), 2 * (x * z + y * w)], - [2 * (x * y + z * w), 1 - 2 * (x * x + z * z), 2 * (y * z - x * w)], - [2 * (x * z - y * w), 2 * (y * z + x * w), 1 - 2 * (x * x + y * y)], - ], - dtype=float, - ) - - -def pose_to_Rt( - xyz: Sequence[float], quat_xyzw: Sequence[float] -) -> Tuple[np.ndarray, np.ndarray]: - R = quat_xyzw_to_R(quat_xyzw) - t = np.array([[float(xyz[0])], [float(xyz[1])], [float(xyz[2])]], dtype=float) - return R, t - - -def Rt_to_T(R: np.ndarray, t: np.ndarray) -> np.ndarray: - T = np.eye(4) - T[:3, :3] = R - T[:3, 3] = t.reshape(3) - return T - - -def cam_to_base_T( - T_handeye: np.ndarray, T_ee: np.ndarray, mode: str -) -> np.ndarray: - """相机系 → 基座系的 4×4。 - - * ``eye_in_hand``:``T_handeye`` 是 cam→法兰,再左乘 ``T_ee``(base→法兰)。 - * ``eye_to_hand``:``T_handeye`` **已经是** cam→基座。再乘 ``T_ee`` 会把 - 固定相机错挂到法兰上 —— 定位总能到附近、永远差一截,看起来像标定不准。 - """ - T_he = np.asarray(T_handeye, dtype=float).reshape(4, 4) - tag = str(mode or "").strip().lower() - if tag == "eye_to_hand": - return T_he - if tag != "eye_in_hand": - raise ValueError( - f"手眼模式只能是 eye_in_hand 或 eye_to_hand,收到 {mode!r}" - ) - return np.asarray(T_ee, dtype=float).reshape(4, 4) @ T_he - - -def cam_point_to_base( - p_cam: np.ndarray, - T_handeye: np.ndarray, - T_ee: np.ndarray, - mode: str, -) -> np.ndarray: - """工件三维点(相机系)→ 基座系 XYZ。""" - T_bc = cam_to_base_T(T_handeye, T_ee, mode) - xyz = np.asarray(p_cam, dtype=float).reshape(3) - ph = np.array([float(xyz[0]), float(xyz[1]), float(xyz[2]), 1.0], dtype=float) - return (T_bc @ ph)[:3] - - -def invert_Rt(R: np.ndarray, t: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: - Ri = R.T - ti = -Ri @ t.reshape(3, 1) - return Ri, ti - - -def board_object_points(cfg: BoardConfig) -> np.ndarray: - obj = np.zeros((cfg.rows * cfg.cols, 3), np.float32) - xs, ys = np.meshgrid(np.arange(cfg.cols), np.arange(cfg.rows)) - obj[:, 0] = xs.reshape(-1) * cfg.square_size - obj[:, 1] = ys.reshape(-1) * cfg.square_size - return obj - - -def detect_chessboard( - image_bgr: np.ndarray, cfg: BoardConfig -) -> Optional[Tuple[np.ndarray, Tuple[int, int]]]: - """返回 (角点, pattern_size) 或 None。pattern 为实际使用的 (cols, rows)。""" - if cv2 is None: - raise RuntimeError('棋盘检测需要 OpenCV(cv2)') - gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY) - pattern = (int(cfg.cols), int(cfg.rows)) - flags = cv2.CALIB_CB_ADAPTIVE_THRESH | cv2.CALIB_CB_NORMALIZE_IMAGE - ok, corners = cv2.findChessboardCorners(gray, pattern, flags) - used = pattern - if not ok: - ok, corners = cv2.findChessboardCorners( - gray, (pattern[1], pattern[0]), flags - ) - used = (pattern[1], pattern[0]) - if not ok or corners is None: - return None - criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 40, 1e-3) - corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) - return np.asarray(corners, dtype=np.float32), used - - -def solve_board_pose( - corners: np.ndarray, - cfg: BoardConfig, - cam: CameraIntrinsics, - pattern: Optional[Tuple[int, int]] = None, -) -> Tuple[np.ndarray, np.ndarray]: - if cv2 is None: - raise RuntimeError('solvePnP 需要 OpenCV(cv2)') - if pattern is None: - pattern = (cfg.cols, cfg.rows) - board = BoardConfig(pattern[0], pattern[1], cfg.square_size) - obj = board_object_points(board) - ok, rvec, tvec = cv2.solvePnP( - obj, corners, cam.K, cam.dist, flags=cv2.SOLVEPNP_ITERATIVE - ) - if not ok: - raise RuntimeError('solvePnP 失败') - R, _ = cv2.Rodrigues(rvec) - return R.astype(float), np.asarray(tvec, dtype=float).reshape(3, 1) - - -class ChessboardStabilizer: - def __init__(self, window: int = 8, max_pixel_std: float = 0.45) -> None: - self.window = int(window) - self.max_pixel_std = float(max_pixel_std) - self._buf: Deque[np.ndarray] = deque(maxlen=self.window) - - def reset(self) -> None: - self._buf.clear() - - def push(self, corners: Optional[np.ndarray]) -> Tuple[bool, float]: - if corners is None: - self._buf.clear() - return False, float('inf') - self._buf.append(corners.reshape(-1, 2).astype(float)) - if len(self._buf) < self.window: - return False, float('inf') - stack = np.stack(list(self._buf), axis=0) - std = float(np.mean(np.std(stack, axis=0))) - return std <= self.max_pixel_std, std - - -def _skew(v: np.ndarray) -> np.ndarray: - x, y, z = v.reshape(3) - return np.array([[0.0, -z, y], [z, 0.0, -x], [-y, x, 0.0]]) - - -def _mat_log(R: np.ndarray) -> np.ndarray: - c = float(np.clip((np.trace(R) - 1.0) * 0.5, -1.0, 1.0)) - theta = float(np.arccos(c)) - if theta < 1e-8: - return np.zeros(3) - w = np.array( - [R[2, 1] - R[1, 2], R[0, 2] - R[2, 0], R[1, 0] - R[0, 1]], dtype=float - ) - return w * (theta / (2.0 * np.sin(theta))) - - -def _rodrigues(rvec: np.ndarray) -> np.ndarray: - r = rvec.reshape(3) - theta = float(np.linalg.norm(r)) - if theta < 1e-12: - return np.eye(3) - k = r / theta - K = _skew(k) - return np.eye(3) + np.sin(theta) * K + (1.0 - np.cos(theta)) * (K @ K) - - -def calibrate_hand_eye_tsai( - R_gripper2base: List[np.ndarray], - t_gripper2base: List[np.ndarray], - R_target2cam: List[np.ndarray], - t_target2cam: List[np.ndarray], -) -> Tuple[np.ndarray, np.ndarray]: - """Tsai-Lenz 方法。返回 R_cam2gripper、t_cam2gripper。""" - n = len(R_gripper2base) - if n < 3: - raise ValueError('至少需要 3 个位姿') - - Hg = [Rt_to_T(R, t) for R, t in zip(R_gripper2base, t_gripper2base)] - Hc = [Rt_to_T(R, t) for R, t in zip(R_target2cam, t_target2cam)] - - A_rows: List[np.ndarray] = [] - b_rows: List[np.ndarray] = [] - for i in range(n - 1): - A = np.linalg.inv(Hg[i + 1]) @ Hg[i] - B = Hc[i + 1] @ np.linalg.inv(Hc[i]) - ra = _mat_log(A[:3, :3]) - rb = _mat_log(B[:3, :3]) - A_rows.append(_skew(ra + rb)) - b_rows.append(rb - ra) - A_mat = np.vstack(A_rows) - b_vec = np.concatenate(b_rows) - p, _, _, _ = np.linalg.lstsq(A_mat, b_vec, rcond=None) - denom = np.sqrt(1.0 + float(p @ p)) - P = 2.0 * p / denom - Rx = _rodrigues(P) - - C_rows: List[np.ndarray] = [] - d_rows: List[np.ndarray] = [] - for i in range(n - 1): - A = np.linalg.inv(Hg[i + 1]) @ Hg[i] - B = Hc[i + 1] @ np.linalg.inv(Hc[i]) - Ra, ta = A[:3, :3], A[:3, 3:4] - _Rb, tb = B[:3, :3], B[:3, 3:4] - C_rows.append(Ra - np.eye(3)) - d_rows.append(Rx @ tb - ta) - C = np.vstack(C_rows) - d = np.vstack(d_rows) - tx, _, _, _ = np.linalg.lstsq(C, d, rcond=None) - return Rx.astype(float), tx.reshape(3, 1).astype(float) - - -def calibrate_hand_eye( - R_gripper2base: List[np.ndarray], - t_gripper2base: List[np.ndarray], - R_target2cam: List[np.ndarray], - t_target2cam: List[np.ndarray], - *, - eye_to_hand: bool = False, -) -> Tuple[np.ndarray, np.ndarray]: - """ - eye_in_hand -> X = cam -> gripper(相机装在法兰上) - eye_to_hand -> X = cam -> base(相机固定安装) - """ - Rg = list(R_gripper2base) - tg = list(t_gripper2base) - if eye_to_hand: - Rg = [] - tg = [] - for R, t in zip(R_gripper2base, t_gripper2base): - Ri, ti = invert_Rt(R, t) - Rg.append(Ri) - tg.append(ti) - - if cv2 is not None and hasattr(cv2, 'calibrateHandEye'): - try: - R, t = cv2.calibrateHandEye( - Rg, tg, R_target2cam, t_target2cam, method=cv2.CALIB_HAND_EYE_TSAI - ) - return np.asarray(R, float), np.asarray(t, float).reshape(3, 1) - except Exception: - pass # 退回 NumPy 版 Tsai - return calibrate_hand_eye_tsai(Rg, tg, R_target2cam, t_target2cam) - - -def T_from_flexiv_tcp(xyz_m, qwxyz) -> np.ndarray: - """Studio ``tcp_location`` → 法兰→工具 4×4。 - - Flexiv 顺序是 ``[x, y, z, q_w, q_x, q_y, q_z]``,四元数是 wxyz, - 和本仓库其余地方的 xyzw 不一样。只在这里换一次。 - """ - xyz = np.asarray(xyz_m, dtype=float).reshape(3) - q = np.asarray(qwxyz, dtype=float).reshape(7) if np.asarray(qwxyz).size == 7 else np.asarray(qwxyz, dtype=float).reshape(4) - if q.size == 7: - qw, qx, qy, qz = (float(q[3]), float(q[4]), float(q[5]), float(q[6])) - else: - qw, qx, qy, qz = (float(q[0]), float(q[1]), float(q[2]), float(q[3])) - R = quat_xyzw_to_R((qx, qy, qz, qw)) - return Rt_to_T(R, xyz.reshape(3, 1)) - - -def cam_to_flange_via_tool(T_cam_to_tool: np.ndarray, T_flange_to_tool: np.ndarray) -> np.ndarray: - """AX=XB 在工具 TCP 上解出 cam→工具后,再折成 cam→法兰。 - - ``T_flange_to_tool`` 是 Studio TCP:``p_法兰 = T_flange_to_tool · p_工具``。 - OpenCV 的 ``T_cam_to_tool`` 是 ``p_工具 = T_cam_to_tool · p_相机``。 - 所以 ``T_cam_to_flange = T_flange_to_tool · T_cam_to_tool``。 - - 乘反了(``T_cam_to_tool · inv(T_ft)``)旋转看着还像,平移会把相机 - 扔到法兰后方约 30 cm。忘了乘则 ``T_4x4`` 停在 TCP 上,沿工具偏 ~225 mm。 - 两种都不报错。 - """ - T_ct = np.asarray(T_cam_to_tool, dtype=float).reshape(4, 4) - T_ft = np.asarray(T_flange_to_tool, dtype=float).reshape(4, 4) - return T_ft @ T_ct - - -def format_transform_yaml(R: np.ndarray, t: np.ndarray, name: str) -> str: - T = Rt_to_T(R, t) - lines = [ - f'# {name}', - f'translation_m: [{t[0, 0]:.8f}, {t[1, 0]:.8f}, {t[2, 0]:.8f}]', - 'T_4x4:', - ] - for row in T: - lines.append(' - [' + ', '.join(f'{v:.8f}' for v in row) + ']') - return '\n'.join(lines) + '\n' - - -def format_matrix_yaml(T: np.ndarray, key: str) -> str: - arr = np.asarray(T, dtype=float).reshape(4, 4) - lines = [f'{key}:'] - for row in arr: - lines.append(' - [' + ', '.join(f'{v:.8f}' for v in row) + ']') - return '\n'.join(lines) + '\n' - - -def is_pose_filled(joints: Sequence[float]) -> bool: - """若全为零 / NaN 占位则返回 False。""" - arr = np.asarray(joints, dtype=float) - if arr.size != 7: - return False - if np.any(np.isnan(arr)): - return False - return float(np.linalg.norm(arr)) > 1e-6 diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_realsense.py b/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_realsense.py deleted file mode 100644 index 3d072e0..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_realsense.py +++ /dev/null @@ -1,251 +0,0 @@ -#!/usr/bin/env python3 -"""通过 pyrealsense2 查询 RealSense(D405 / D435)的出厂彩色内参。""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import List, Tuple - -import numpy as np - - -@dataclass -class RealsenseIntrinsics: - model: str - serial: str - width: int - height: int - fx: float - fy: float - cx: float - cy: float - dist: List[float] # OpenCV 顺序,长度 5 - - def as_K(self) -> np.ndarray: - return np.array( - [[self.fx, 0.0, self.cx], [0.0, self.fy, self.cy], [0.0, 0.0, 1.0]], - dtype=float, - ) - - def as_dist(self) -> np.ndarray: - d = list(self.dist) + [0.0] * 5 - return np.array(d[:5], dtype=float).reshape(-1, 1) - - -# camera_source 为 d405/d435 时的默认 ROS 话题命名空间。 -REALSENSE_TOPIC_DEFAULTS = { - 'd405': { - 'image_topic': '/d405/color/image_raw', - 'camera_info_topic': '/d405/color/camera_info', - }, - 'd435': { - 'image_topic': '/d435/color/image_raw', - 'camera_info_topic': '/d435/color/camera_info', - }, -} - - -def _norm_model(model: str) -> str: - m = model.strip().lower().replace(' ', '').replace('-', '') - if m.startswith('d405') or m in ('realsensed405', 'intelrealsensed405'): - return 'd405' - if m.startswith('d435') or m in ('realsensed435', 'intelrealsensed435'): - return 'd435' - return m - - -def list_realsense_devices() -> List[Tuple[str, str]]: - """返回 [(name, serial), ...]。""" - try: - import pyrealsense2 as rs - except Exception as exc: # noqa: BLE001 - raise RuntimeError( - '未安装 pyrealsense2。' - '请在 ros_flexiv 环境中安装:pip/conda install pyrealsense2' - ) from exc - out: List[Tuple[str, str]] = [] - for d in rs.context().devices: - name = d.get_info(rs.camera_info.name) - serial = d.get_info(rs.camera_info.serial_number) - out.append((name, serial)) - return out - - -def query_realsense_color_intrinsics( - model: str, - *, - serial: str = '', - width: int = 1280, - height: int = 720, -) -> RealsenseIntrinsics: - """ - 在给定分辨率下读取 D405/D435 设备上的彩色内参。 - - 不会启动流管道(只读取 profile 元数据)。 - """ - try: - import pyrealsense2 as rs - except Exception as exc: # noqa: BLE001 - raise RuntimeError( - '未安装 pyrealsense2。' - '请在 ros_flexiv 环境中安装:pip/conda install pyrealsense2' - ) from exc - - want = _norm_model(model) - if want not in ('d405', 'd435'): - raise ValueError(f'不支持的型号 {model!r};请使用 d405 或 d435') - - hint = want.upper() # D405 / D435 - serial = (serial or '').strip() - devices = list(rs.context().devices) - if not devices: - raise RuntimeError('未连接任何 RealSense 设备') - - chosen = None - for d in devices: - name = d.get_info(rs.camera_info.name) - sn = d.get_info(rs.camera_info.serial_number) - if serial and sn != serial: - continue - name_u = name.upper().replace(' ', '') - if hint in name_u or hint in name.upper(): - chosen = d - break - - if chosen is None: - avail = ', '.join( - f'{d.get_info(rs.camera_info.name)}' - f'({d.get_info(rs.camera_info.serial_number)})' - for d in devices - ) - raise RuntimeError( - f'没有匹配 model={want!r} serial={serial!r} 的 RealSense。' - f'已连接的设备:{avail or "无"}' - ) - - name = chosen.get_info(rs.camera_info.name) - sn = chosen.get_info(rs.camera_info.serial_number) - - best = None # (评分, width, height, fx, fy, cx, cy, 畸变系数) - for s in chosen.sensors: - for p in s.profiles: - if p.stream_type() != rs.stream.color: - continue - vp = p.as_video_stream_profile() - try: - intr = vp.get_intrinsics() - except Exception: # noqa: BLE001 - continue - w, h = int(intr.width), int(intr.height) - if w == int(width) and h == int(height): - score = 0 - else: - score = abs(w * h - int(width) * int(height)) + 1 - cand = ( - score, - w, - h, - float(intr.fx), - float(intr.fy), - float(intr.ppx), - float(intr.ppy), - [float(c) for c in list(intr.coeffs)[:5]], - ) - if best is None or cand[0] < best[0]: - best = cand - - if best is None: - raise RuntimeError(f'{name} ({sn}) 上没有彩色流 profile') - - _, w, h, fx, fy, cx, cy, coeffs = best - while len(coeffs) < 5: - coeffs.append(0.0) - return RealsenseIntrinsics( - model=want, - serial=sn, - width=w, - height=h, - fx=fx, - fy=fy, - cx=cx, - cy=cy, - dist=coeffs[:5], - ) - - -def is_realsense_source(name: str) -> bool: - """对 d405 / d435 及带命名空间的别名(d405_left、d405_right)返回 True。""" - return _norm_model(name or "") in ("d405", "d435") - - -def resolve_realsense_topics( - model: str, - *, - camera_namespace: str = '', - image_topic: str = '', - camera_info_topic: str = '', -) -> Tuple[str, str]: - """为空时,为 d405/d435 填充默认的 image/camera_info 话题。 - - ``model`` 可以是 ``d405_left`` / ``d405_right`` 这类话题命名空间。 - """ - ns = (camera_namespace or model or 'd405').strip().strip('/') - img = (image_topic or '').strip() - info = (camera_info_topic or '').strip() - if not img and ns: - img = f'/{ns}/color/image_raw' - if not info and ns: - info = f'/{ns}/color/camera_info' - return img, info - - -def apply_realsense_exposure( - device, - *, - auto_exposure: bool = True, - ae_limit_us: float = 3000.0, - emitter_enabled: bool = False, - laser_power: float = 0.0, - exposure_us: float | None = None, - gain: float | None = None, - log=None, -) -> list[str]: - """限制自动曝光 / 关闭投影器。腕部 D405 过曝通常是自动曝光过长 + 发射器导致。""" - import pyrealsense2 as rs - - notes: list[str] = [] - - def _set(sensor, opt, val) -> bool: - try: - if sensor.supports(opt): - sensor.set_option(opt, float(val)) - return True - except Exception: - return False - return False - - for sensor in device.query_sensors(): - if _set(sensor, rs.option.emitter_enabled, 1.0 if emitter_enabled else 0.0): - notes.append(f"emitter={int(bool(emitter_enabled))}") - laser_opt = getattr(rs.option, "laser_power", None) - if laser_opt is not None and not emitter_enabled: - _set(sensor, laser_opt, float(laser_power)) - # 必须在写曝光*之前*关闭自动曝光;D405 固件在自动曝光开启时会忽略曝光设置。 - if _set(sensor, rs.option.enable_auto_exposure, 1.0 if auto_exposure else 0.0): - notes.append(f"ae={int(bool(auto_exposure))}") - pri = getattr(rs.option, "auto_exposure_priority", None) - # priority 0 = 保帧压暗;无上限时不要设,让自动曝光自己变亮 - if pri is not None and ae_limit_us and auto_exposure: - _set(sensor, pri, 0.0) - limit = getattr(rs.option, "auto_exposure_limit", None) - if auto_exposure and limit is not None and ae_limit_us and ae_limit_us > 0: - if _set(sensor, limit, float(ae_limit_us)): - notes.append(f"ae_limit={int(ae_limit_us)}us") - if not auto_exposure: - if exposure_us is not None and _set(sensor, rs.option.exposure, float(exposure_us)): - notes.append(f"exposure={int(exposure_us)}us") - if gain is not None and _set(sensor, rs.option.gain, float(gain)): - notes.append(f"gain={gain}") - if log and notes: - log("RealSense 曝光设置:" + ", ".join(dict.fromkeys(notes))) - return notes diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_teach.py b/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_teach.py deleted file mode 100644 index a78b0fc..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_teach.py +++ /dev/null @@ -1,668 +0,0 @@ -#!/usr/bin/env python3 -"""手眼示教:实时预览 + Free Drive + 按 Enter 拍照/记录关节。 - -两种后端 ------------- -ros(默认,整套栈正在运行): - - 关节来自 ``/get_arm_state`` - - 拖拽:示教器 Free Drive + 按住使能键 - 需保持:bash ~/ros2/scripts/run_real.sh - -rdk(软件 Free Drive): - - 先停掉 run_real.sh(RDK 独占) - - 按 'd' 通过 RDK 启用 FloatingJoint 拖拽 - - 关节来自 RDK 的 robot.states - - source ~/ros2/scripts/env.sh - ros2 run arm_application handeye_teach --ros-args -p backend:=rdk - -界面按键(预览窗口) - Enter / Space 拍照 + 记录关节 - d 启用 Free Drive(rdk)/ 显示示教器提示(ros) - s 停止 Free Drive(rdk)/ 保持 - q / Esc 结束 -""" - -from __future__ import annotations - -import os -import threading -import time -from datetime import datetime, timezone -from pathlib import Path -from typing import List, Optional - -import numpy as np -import rclpy -from rcl_interfaces.msg import ParameterDescriptor -from rclpy.node import Node - -from arm_application.ros_node import TolerantNode, param_as_str - -HELP = """ -================================================ - 手眼示教 TEACH:预览 -> 拖拽 -> 拍照+位姿 -================================================ - 窗口按键: - Enter / Space = 拍照 + 保存关节 - d = 开启 Free Drive - s = 关闭 Free Drive / 保持 - q / Esc = 结束 - 提示:让棋盘清晰,并占到画面的约 30-70% - 建议采 8-12 个角度有变化的位姿 -================================================ -""" - - -def _setup_matplotlib_font(): - """避免中文乱码:优先选用存在的中日韩(CJK)字体。""" - import matplotlib - - matplotlib.use('QtAgg') - from matplotlib import font_manager, rcParams - - candidates = [ - 'Noto Sans CJK SC', - 'Noto Sans CJK JP', - 'Noto Serif CJK SC', - 'AR PL UMing CN', - 'AR PL UKai CN', - 'WenQuanYi Micro Hei', - 'Source Han Sans CN', - 'DejaVu Sans', - ] - available = {f.name for f in font_manager.fontManager.ttflist} - chosen = None - for name in candidates: - if name in available: - chosen = name - break - if chosen is None: - # 按文件路径再试一次 - for path in ( - '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc', - '/usr/share/fonts/opentype/noto/NotoSansCJK-Medium.ttc', - '/usr/share/fonts/opentype/noto/NotoSansCJK-DemiLight.ttc', - '/usr/share/fonts/truetype/arphic/uming.ttc', - ): - if os.path.isfile(path): - font_manager.fontManager.addfont(path) - prop = font_manager.FontProperties(fname=path) - chosen = prop.get_name() - break - if chosen: - rcParams['font.family'] = chosen - rcParams['axes.unicode_minus'] = False - return chosen - - -class RdkBridge: - """通过 rdk_py310 子进程(Python 3.10 ABI)与 Flexiv RDK 通信。""" - - def __init__(self, robot_sn: str, logger=None) -> None: - import json - import subprocess - - self._json = json - self._logger = logger - self.robot_sn = robot_sn - self._last_q: Optional[List[float]] = None - self._io = threading.Lock() - py = os.environ.get('RDK_PYTHON', '/home/cc/rdk_py310/bin/python') - bridge = Path.home() / 'ros2' / 'scripts' / 'rdk_drag_bridge.py' - if not bridge.is_file(): - bridge = Path('/home/cc/ros2/scripts/rdk_drag_bridge.py') - if not bridge.is_file(): - raise FileNotFoundError(f'找不到 rdk_drag_bridge.py:{bridge}') - - # 只保留 Flexiv 的库 —— 不要继承 conda 的 LD_LIBRARY_PATH(会让 RDK 卡死)。 - flexiv_lib = os.path.expanduser('~/flexiv_install/lib') - env = { - 'HOME': os.environ.get('HOME', ''), - 'PATH': f'{Path(py).parent}:/usr/bin:/bin', - 'LD_LIBRARY_PATH': flexiv_lib, - 'LANG': 'C.UTF-8', - 'SITE_PC_IP': os.environ.get('SITE_PC_IP', ''), - 'SITE_NET_IFACE': os.environ.get('SITE_NET_IFACE', ''), - } - # 不要继承 conda 的 PYTHONPATH。 - # 重要:stderr 不能用 PIPE —— RDK 日志会填满管道并让桥接进程死锁 - # (stdout 永远不返回)。改成写入日志文件。 - log_path = Path('/tmp/rdk_drag_bridge.log') - self._err_file = open(log_path, 'w', encoding='utf-8') - self._proc = subprocess.Popen( - [py, str(bridge)], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=self._err_file, - text=True, - bufsize=1, - env=env, - ) - if logger: - logger.info(f'RDK 桥接已启动;日志 → {log_path}') - pong = self._ask({'cmd': 'ping'}, timeout=8.0) - if not pong.get('ok'): - raise RuntimeError( - f'RDK 桥接 ping 失败:{pong}。参见 {log_path}' - ) - if logger: - logger.info('RDK 桥接 ping 正常,正在连接机器人...') - conn = self._ask( - { - 'cmd': 'connect', - 'sn': robot_sn, - 'iface': os.environ.get('SITE_NET_IFACE', ''), - }, - timeout=45.0, - ) - if not conn.get('ok'): - raise RuntimeError( - f'RDK 连接失败:{conn.get("error")}。' - f'请先停掉 run_real.sh;切 AUTO Remote 并清除故障。参见 {log_path}' - ) - if logger: - logger.info(f'RDK 桥接就绪(py={pong.get("py")})sn={robot_sn}') - q0 = conn.get('q') or [] - if len(q0) >= 7: - self._last_q = [float(v) for v in q0[:7]] - - def _ask(self, msg: dict, timeout: float = 10.0) -> dict: - import select - - # 同一时刻只允许一条在途命令:相机/GUI 绝不能共用这个管道。 - if not self._io.acquire(timeout=max(timeout, 0.2)): - return {'ok': False, 'error': '桥接忙'} - try: - assert self._proc.stdin and self._proc.stdout - self._proc.stdin.write(self._json.dumps(msg) + '\n') - self._proc.stdin.flush() - end = time.monotonic() + timeout - while time.monotonic() < end: - if self._proc.poll() is not None: - tip = '/tmp/rdk_drag_bridge.log' - return { - 'ok': False, - 'error': f'桥接已退出 rc={self._proc.returncode};参见 {tip}', - } - ready, _, _ = select.select([self._proc.stdout], [], [], 0.05) - if not ready: - continue - line = self._proc.stdout.readline() - if not line: - continue - line = line.strip() - if not line.startswith('{'): - continue - try: - return self._json.loads(line) - except Exception as exc: # noqa: BLE001 - return {'ok': False, 'error': f'应答异常:{exc} {line!r}'} - return {'ok': False, 'error': '桥接超时'} - finally: - self._io.release() - - def drag_on(self, primitive: str = 'FloatingJoint', mode: str = 'soft') -> dict: - return self._ask( - {'cmd': 'drag_on', 'primitive': primitive, 'mode': mode}, - timeout=20.0, - ) - - def drag_off(self) -> dict: - return self._ask({'cmd': 'drag_off'}, timeout=6.0) - - def joints(self) -> Optional[List[float]]: - res = self._ask({'cmd': 'joints'}, timeout=2.0) - if res.get('ok'): - q = res.get('q') or [] - if len(q) >= 7: - self._last_q = [float(v) for v in q[:7]] - return self._last_q - return self._last_q - - def close(self) -> None: - try: - self._ask({'cmd': 'quit'}, timeout=3.0) - except Exception: - pass - try: - self._proc.terminate() - except Exception: - pass - try: - if getattr(self, '_err_file', None) is not None: - self._err_file.close() - except Exception: - pass - - -class HandeyeTeach(TolerantNode): - def __init__(self) -> None: - super().__init__('handeye_teach') - self.declare_parameter('output_dir', '/home/cc/ros2/handeye/tmp') - self.declare_parameter('width', 1280) - self.declare_parameter('height', 720) - self.declare_parameter('fps', 15) - self.declare_parameter('backend', 'ros') # ros | rdk - self.declare_parameter('robot_sn', os.environ.get('SITE_ROBOT_SN', '').strip()) - self.declare_parameter('drag_primitive', 'FloatingJoint') # or FloatingCartesian - self._serial = param_as_str(self, 'camera_serial', '') - self.declare_parameter('auto_exposure', True) - self.declare_parameter('ae_limit_us', 1800.0) - self.declare_parameter('emitter_enabled', False) - self.declare_parameter('exposure_us', 0.0) - self.declare_parameter('gain', 0.0) - # 目标采集点数。0 = 不限(按 q 结束)。 - # 设了就只是个"提醒":采够时提示可以收工,不强制关窗 —— - # 常常采到一半发现某个角度还没覆盖,强制退出反而要重开。 - self.declare_parameter('target_points', 0) - # 必须和 run_handeye.sh 的 TAUGHT 是同一个文件。只写 taught_poses.txt、 - # 脚本去读 taught_poses_<模式>.txt,merge 就会「文件在、内容空」。 - self.declare_parameter('poses_file', '') - - self.backend = str(self.get_parameter('backend').value).strip().lower() - self.robot_sn = str(self.get_parameter('robot_sn').value) - self.drag_primitive = str(self.get_parameter('drag_primitive').value).strip() - - self.output_dir = Path(str(self.get_parameter('output_dir').value)).expanduser() - self.images_dir = self.output_dir / 'images' - _pf = str(self.get_parameter('poses_file').value).strip() - self.poses_file = ( - Path(_pf).expanduser() if _pf else self.output_dir / 'taught_poses.txt' - ) - self.yaml_file = self.output_dir / 'taught_waypoint_positions.yaml' - self._last_capture_t = 0.0 - self.images_dir.mkdir(parents=True, exist_ok=True) - - self._captures: List[dict] = [] - self._latest_bgr: Optional[np.ndarray] = None - self._frame_lock = threading.Lock() - self._quit = False - self._busy = False - self._cmd_pending = False - self._drag_on = False - self._robot = None - self._rdk = None - self._get_state = None - self._cam_thread: Optional[threading.Thread] = None - self._pipe = None - self._fps = 15 - - if self.backend == 'rdk': - self._init_rdk() - else: - self._init_ros_state() - - self._start_camera() - font = _setup_matplotlib_font() - self._start_gui() - print(HELP) - if self.backend == 'rdk': - print('[backend=rdk] 按 d = 软拖拽(在 AUTO Remote 下可用,无需 Floating 许可)') - print(' run_real.sh 必须已停止。') - print(' 拖着就能按 Enter 拍照,不必先按 s') - else: - print('[backend=ros] 用示教器 Free Drive + 按住使能键来拖拽。') - print(' 或停掉 run_real.sh 后改用:-p backend:=rdk') - if font: - self.get_logger().info(f'界面字体:{font}') - self.create_timer(1.0 / max(1, self._fps), self._tick) - - def _init_ros_state(self) -> None: - from arm_msgs.srv import GetArmState - - self._get_state = self.create_client(GetArmState, 'get_arm_state') - if not self._get_state.wait_for_service(timeout_sec=10.0): - raise RuntimeError( - 'get_arm_state 不可用。请启动 run_real.sh,' - '或改用:-p backend:=rdk(需先停掉整套栈)' - ) - - def _init_rdk(self) -> None: - self.get_logger().info(f'正在把 RDK 桥接连到 {self.robot_sn} ...') - self._rdk = RdkBridge(self.robot_sn, logger=self.get_logger()) - self._robot = True # 标记:RDK 后端已就绪 - self.get_logger().info('RDK 已连接。按 d 启用 Free Drive。') - - def _start_camera(self) -> None: - import pyrealsense2 as rs - - w = int(self.get_parameter('width').value) - h = int(self.get_parameter('height').value) - fps = int(self.get_parameter('fps').value) - pipe = rs.pipeline() - profile = None - last_err = None - for ww, hh, ff in [ - (w, h, fps), (w, h, 15), (w, h, 10), - (640, 480, 30), (640, 480, 15), - ]: - try: - cfg = rs.config() - if self._serial: - cfg.enable_device(self._serial) - cfg.enable_stream(rs.stream.color, ww, hh, rs.format.bgr8, ff) - profile = pipe.start(cfg) - self._fps = ff - self.get_logger().info(f'相机 {ww}x{hh}@{ff}Hz') - break - except Exception as exc: # noqa: BLE001 - last_err = exc - try: - pipe.stop() - except Exception: # noqa: BLE001 - pass - pipe = rs.pipeline() - if profile is None: - raise RuntimeError( - f'无法打开 D405 —— 请先停掉 realsense_color_pub。({last_err})' - ) - self._pipe = pipe - try: - from arm_application.handeye_realsense import apply_realsense_exposure - - apply_realsense_exposure( - profile.get_device(), - auto_exposure=bool(self.get_parameter('auto_exposure').value), - ae_limit_us=float(self.get_parameter('ae_limit_us').value), - emitter_enabled=bool(self.get_parameter('emitter_enabled').value), - exposure_us=( - float(self.get_parameter('exposure_us').value) or None - ), - gain=(float(self.get_parameter('gain').value) or None), - log=self.get_logger().info, - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f'曝光设置应用失败:{exc}') - self._cam_thread = threading.Thread(target=self._cam_loop, name='d405', daemon=True) - self._cam_thread.start() - - def _cam_loop(self) -> None: - while not self._quit: - try: - frames = self._pipe.wait_for_frames(timeout_ms=400) - color = frames.get_color_frame() - except Exception: # noqa: BLE001 - time.sleep(0.02) - continue - if not color: - continue - bgr = np.asanyarray(color.get_data()).copy() - with self._frame_lock: - self._latest_bgr = bgr - - def _start_gui(self) -> None: - import matplotlib.pyplot as plt - - self._plt = plt - self._fig, self._ax = plt.subplots(1, 1, figsize=(11, 7)) - self._fig.canvas.manager.set_window_title( - 'handeye_teach | Enter=拍照 d=拖拽 s=停止 q=退出' - ) - self._im = None - self._status = self._ax.text( - 0.02, - 0.98, - self._status_text(), - transform=self._ax.transAxes, - color='lime', - fontsize=13, - va='top', - fontweight='bold', - bbox=dict(boxstyle='round', facecolor='black', alpha=0.6), - ) - self._ax.axis('off') - self._fig.canvas.mpl_connect('key_press_event', self._on_key) - plt.ion() - plt.show(block=False) - - def _status_text(self) -> str: - drag = '拖拽开启' if self._drag_on else '拖拽关闭' - if self.backend == 'rdk': - tip = 'd=软拖拽 s=保持' - else: - tip = '示教器 FreeDrive+使能' - return ( - f'已采集:{len(self._captures)} [{drag}] ' - f'{tip} | Enter=拍照 q=退出' - ) - - def _on_key(self, event) -> None: - key = (event.key or '').lower() - if key in ('q', 'escape'): - self._quit = True - self.get_logger().info('收到退出请求') - return - if self._cmd_pending: - return - if key in ('enter', ' ', 'space', 'd', 's'): - self._cmd_pending = True - threading.Thread(target=self._run_key, args=(key,), daemon=True).start() - - def _run_key(self, key: str) -> None: - try: - if key in ('enter', ' ', 'space'): - self._capture_once() - elif key == 'd': - self._enable_drag() - elif key == 's': - self._disable_drag() - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f'按键 {key}:{exc}') - finally: - self._cmd_pending = False - - def _enable_drag(self) -> None: - if self.backend != 'rdk': - self._drag_on = True - self.get_logger().warn( - 'ROS 后端:请用示教器的 Free Drive + 按住使能键。' - '想用软件拖拽:先停掉 run_real.sh,然后执行 ' - 'ros2 run arm_application handeye_teach --ros-args -p backend:=rdk' - ) - self._status.set_text(self._status_text()) - return - self.get_logger().info('正在启动软拖拽(预览保持实时刷新)...') - # soft = AUTO Remote 模式下的关节阻抗拖拽(不需要 Floating 许可) - res = self._rdk.drag_on(self.drag_primitive, mode='soft') - if res.get('ok'): - self._drag_on = True - self.get_logger().info( - f'拖拽已开启 mode={res.get("mode")} —— 推着机械臂走,Enter=拍照(s=保持,可选)' - ) - if res.get('hint'): - self.get_logger().info(str(res.get('hint'))) - else: - self._drag_on = False - self.get_logger().error(f'拖拽失败:{res.get("error")}') - # 状态文字由 GUI 线程里的 _tick 刷新 - - def _disable_drag(self) -> None: - if self.backend == 'rdk' and getattr(self, '_rdk', None) is not None: - res = self._rdk.drag_off() - if not res.get('ok'): - self.get_logger().warn(f'停止拖拽:{res.get("error")}') - self._drag_on = False - self.get_logger().info('Free Drive 已关闭 / 保持') - - def _tick(self) -> None: - if self._quit: - return - with self._frame_lock: - bgr = None if self._latest_bgr is None else self._latest_bgr.copy() - if bgr is None: - try: - self._fig.canvas.flush_events() - except Exception: # noqa: BLE001 - pass - return - rgb = bgr[:, :, ::-1] - if self._im is None: - self._im = self._ax.imshow(rgb) - else: - self._im.set_data(rgb) - try: - self._status.set_text(self._status_text()) - self._fig.canvas.draw_idle() - self._fig.canvas.flush_events() - except Exception: # noqa: BLE001 - pass - - def _read_joints(self) -> Optional[List[float]]: - if self.backend == 'rdk' and getattr(self, '_rdk', None) is not None: - q = self._rdk.joints() - if q is None: - self.get_logger().error('读取 RDK 关节失败') - return q - from arm_msgs.srv import GetArmState - - fut = self._get_state.call_async(GetArmState.Request()) - end = time.monotonic() + 2.0 - while rclpy.ok() and not fut.done() and time.monotonic() < end: - rclpy.spin_once(self, timeout_sec=0.02) - res = fut.result() if fut.done() else None - if res is None or not res.success: - return None - q = list(res.joint_positions) - return [float(v) for v in q[:7]] if len(q) >= 7 else None - - def _capture_once(self) -> None: - if self._busy: - return - self._busy = True - try: - with self._frame_lock: - bgr = None if self._latest_bgr is None else self._latest_bgr.copy() - if bgr is None: - self.get_logger().warn('还没有相机帧') - return - q = self._read_joints() - if q is None: - self.get_logger().error('读取关节失败') - return - now = time.monotonic() - if now - self._last_capture_t < 0.8: - self.get_logger().warn('按太快,忽略(防 Enter 连发)') - return - if self._captures: - last = self._captures[-1]['joints'] - delta = max(abs(a - b) for a, b in zip(q, last)) - if delta < 0.015: - self.get_logger().warn( - f'关节几乎没动(Δ={delta:.4f} rad),忽略这次拍照。' - '先拖到另一个姿态再按 Enter。' - ) - return - self._last_capture_t = now - - idx = len(self._captures) - stamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S') - img_path = self.images_dir / f'teach_{idx:02d}_{stamp}.png' - try: - import cv2 - - cv2.imwrite(str(img_path), bgr) - except Exception: # noqa: BLE001 - from PIL import Image as PILImage - - PILImage.fromarray(bgr[:, :, ::-1]).save(str(img_path)) - - line = ', '.join(f'{v:.6f}' for v in q) + ',' - self._captures.append( - {'index': idx, 'joints': q, 'image': str(img_path), 'line': line} - ) - with self.poses_file.open('a', encoding='utf-8') as f: - f.write(f'# pose {idx} {stamp}\n') - f.write(line + '\n') - f.write(f'# image {img_path}\n') - print(f'\n# pose {idx} {img_path.name}') - print(line) - n = idx + 1 - try: - target = int(self.get_parameter('target_points').value) - except Exception: # noqa: BLE001 - target = 0 - if target > 0: - if n < target: - self.get_logger().info( - f'[{n}/{target}] 已保存照片+关节 —— 还差 {target - n} 个点' - ) - elif n == target: - self.get_logger().info( - f'[{n}/{target}] 已采够 {target} 个点。' - ' 建议按 q 结束,然后跑 merge + calibrate;' - ' 想多采几个点也可以继续按 Enter。' - ) - else: - self.get_logger().info( - f'[{n}/{target}] 已保存照片+关节 —— 已超出目标 ' - f'{n - target} 个点(会用全部点求解)' - ) - else: - self.get_logger().info(f'[{n}] 已保存照片+关节') - self._write_yaml_snippet() - finally: - self._busy = False - - def _write_yaml_snippet(self) -> None: - lines = [ - '# 粘贴到 handeye_calibrate.yaml -> waypoint_positions', - f'# num_poses: {len(self._captures)}', - 'waypoint_positions: [', - ] - for c in self._captures: - lines.append(f' # pose {c["index"]}') - lines.append(f' {c["line"]}') - lines.append(']') - self.yaml_file.write_text('\n'.join(lines) + '\n', encoding='utf-8') - - def finish(self) -> None: - self._quit = True - if self._cam_thread is not None: - self._cam_thread.join(timeout=1.5) - if self._drag_on: - self._disable_drag() - if getattr(self, '_rdk', None) is not None: - try: - self._rdk.close() - except Exception: - pass - n = len(self._captures) - print('\n========== 示教完成 ==========') - print(f'位姿: {n}') - print(f'关节: {self.poses_file}') - print(f'yaml: {self.yaml_file}') - print(f'图像: {self.images_dir}') - if n >= 1: - print('\n--- 粘贴到 handeye_calibrate.yaml ---\n') - print(self.yaml_file.read_text(encoding='utf-8')) - print('同时设置 num_poses:', n) - if n < 5: - self.get_logger().warn(f'只有 {n} 个位姿;至少需要 5 个(建议 8-12 个)。') - - -def main(args=None) -> None: - rclpy.init(args=args) - node = None - try: - node = HandeyeTeach() - while rclpy.ok() and not node._quit: - rclpy.spin_once(node, timeout_sec=0.05) - except SystemExit: - pass - except KeyboardInterrupt: - pass - finally: - if node is not None: - node.finish() - try: - node._pipe.stop() - except Exception: # noqa: BLE001 - pass - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_waypoints.py b/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_waypoints.py deleted file mode 100644 index e03d069..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/handeye_waypoints.py +++ /dev/null @@ -1,525 +0,0 @@ -#!/usr/bin/env python3 -"""手眼标定路点执行器。 - -逐个移动到每个关节路点,等到位后停留一段时间, -让相机(或操作者)采集一张标定图像。 - -capture_mode: - auto — 停留 dwell_sec 后进入下一个位姿 - keypress — 在终端按 Enter 继续 - preview — OpenCV 实时相机 + Enter/Space 确认(示教时推荐) - -处于 ``preview`` 模式时,可在预览窗口打开期间用示教器的 **Free Drive** -拖拽微调(ros2_control 保持 AUTO Remote;拖拽经由示教器,而非 RDK)。 -""" - -from __future__ import annotations - -import csv -import array -import sys -import threading -import time -from datetime import datetime, timezone -from pathlib import Path -from typing import List, Optional - -import numpy as np -import rclpy -from rclpy.action import ActionClient -from rclpy.node import Node -from rclpy.qos import qos_profile_sensor_data -from sensor_msgs.msg import Image -from std_msgs.msg import String - -from arm_application.handeye_realsense import ( - is_realsense_source, - resolve_realsense_topics, -) -from arm_application.site_io import joint_prefix_default - -from arm_msgs.action import FollowJointTrajectory -from arm_msgs.srv import GetArmState - -from arm_application.ros_node import TolerantNode - -try: - import cv2 -except Exception: # noqa: BLE001 - cv2 = None # type: ignore - -DEFAULT_JOINTS = [ - 'joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6', 'joint7', -] - -DEFAULT_TIMES = [4.0] * 12 -DEFAULT_POSITIONS = [ - 0.00, -0.70, 0.00, 1.57, 0.00, 0.70, 0.00, - 0.35, -0.70, 0.00, 1.57, 0.00, 0.70, 0.00, - -0.35, -0.70, 0.00, 1.57, 0.00, 0.70, 0.00, - 0.00, -0.90, 0.00, 1.70, 0.00, 0.85, 0.00, - 0.00, -0.50, 0.00, 1.40, 0.00, 0.55, 0.00, - 0.20, -0.70, 0.15, 1.57, 0.40, 0.70, 0.30, - -0.20, -0.70, -0.15, 1.57, -0.40, 0.70, -0.30, - 0.25, -0.80, 0.10, 1.65, 0.25, 0.90, -0.40, - -0.25, -0.80, -0.10, 1.65, -0.25, 0.90, 0.40, - 0.15, -0.60, 0.20, 1.50, -0.35, 0.60, 0.50, - -0.15, -0.60, -0.20, 1.50, 0.35, 0.60, -0.50, - 0.00, -0.70, 0.00, 1.57, 0.00, 0.70, 0.00, -] - -PREVIEW_HELP_GUI = """ -=== 位姿预览 / 拖拽调整(OpenCV 窗口)=== -1. 示教器:Free Drive + 按住使能键拖拽微调 -2. 预览窗口:确认棋盘在画面内且清晰 -3. 键盘:Enter / Space = 下一个位姿;q / Esc = 退出 -""" - -PREVIEW_HELP_HEADLESS = """ -=== 位姿预览 / 拖拽调整(无 OpenCV 窗口)=== -1. 另开终端查看画面: - ros2 run rqt_image_view rqt_image_view /handeye/preview_image -2. 示教器:Free Drive + 按住使能键拖拽微调 -3. 本终端:Enter = 确认下一个位姿;输入 q 回车 = 退出 -""" - - -def _cv_gui_available() -> bool: - if cv2 is None: - return False - try: - cv2.namedWindow('_handeye_gui_probe', cv2.WINDOW_NORMAL) - cv2.destroyWindow('_handeye_gui_probe') - return True - except Exception: # noqa: BLE001 - return False - - -def _image_to_bgr(msg: Image) -> np.ndarray: - h, w = int(msg.height), int(msg.width) - enc = (msg.encoding or '').lower() - data = np.frombuffer(msg.data, dtype=np.uint8) - if enc in ('bgr8', 'rgb8'): - img = data.reshape(h, w, 3) - return img[:, :, ::-1].copy() if enc == 'rgb8' else img - if enc in ('mono8', '8uc1'): - gray = data.reshape(h, w) - return np.stack([gray, gray, gray], axis=-1) - if enc in ('bgra8', 'rgba8'): - img = data.reshape(h, w, 4) - bgr = img[:, :, :3] - return bgr[:, :, ::-1].copy() if enc == 'rgba8' else bgr - raise RuntimeError(f'不支持的图像编码:{msg.encoding!r}') - - -class HandeyeWaypoints(TolerantNode): - def __init__(self) -> None: - super().__init__('handeye_waypoints') - self.declare_parameter('joint_prefix', joint_prefix_default()) - self.declare_parameter('joint_names', DEFAULT_JOINTS) - self.declare_parameter('velocity_scale', 0.12) - self.declare_parameter('action_name', 'follow_joint_trajectory') - self.declare_parameter('waypoint_times', DEFAULT_TIMES) - self.declare_parameter('waypoint_positions', DEFAULT_POSITIONS) - self.declare_parameter('dwell_sec', 2.5) - # auto | keypress | preview - self.declare_parameter('capture_mode', 'auto') - self.declare_parameter('start_index', 0) - self.declare_parameter('log_csv', '') - self.declare_parameter('capture_topic', 'handeye/capture') - self.declare_parameter('camera_source', 'd405') - self.declare_parameter('camera_namespace', '') - self.declare_parameter('image_topic', '') - self.declare_parameter('preview_window', True) - self.declare_parameter('append_poses_file', '/tmp/handeye_taught_poses.txt') - - prefix = str(self.get_parameter('joint_prefix').value or '') - base = list( - self.get_parameter('joint_names').get_parameter_value().string_array_value - or DEFAULT_JOINTS - ) - self.joint_names = [f'{prefix}{n}' for n in base] - self.velocity_scale = float(self.get_parameter('velocity_scale').value) - self.action_name = str(self.get_parameter('action_name').value) - self.dwell_sec = float(self.get_parameter('dwell_sec').value) - self.capture_mode = str(self.get_parameter('capture_mode').value).strip().lower() - self.start_index = max(0, int(self.get_parameter('start_index').value)) - self.log_csv = str(self.get_parameter('log_csv').value or '').strip() - topic = str(self.get_parameter('capture_topic').value) - self.preview_window = bool(self.get_parameter('preview_window').value) - self.append_poses_file = str( - self.get_parameter('append_poses_file').value or '' - ).strip() - - cam_src = str(self.get_parameter('camera_source').value).strip().lower() - img_topic = str(self.get_parameter('image_topic').value or '').strip() - ns = str(self.get_parameter('camera_namespace').value or '').strip() - if is_realsense_source(cam_src) and not img_topic: - img_topic, _ = resolve_realsense_topics( - cam_src, camera_namespace=ns, image_topic='', camera_info_topic='' - ) - self.image_topic = img_topic - - self._client = ActionClient(self, FollowJointTrajectory, self.action_name) - self._get_state = self.create_client(GetArmState, 'get_arm_state') - self._capture_pub = self.create_publisher(String, topic, 10) - self._preview_pub = self.create_publisher(Image, 'handeye/preview_image', 10) - self._latest_bgr: Optional[np.ndarray] = None - self._cv_gui = _cv_gui_available() and self.preview_window - if self.capture_mode == 'preview' and not self._cv_gui: - self.get_logger().warn( - 'OpenCV 没有 GUI(无头环境)。请在 /handeye/preview_image 上预览,' - '在本终端按 Enter 确认。' - ) - if self.image_topic and self.capture_mode == 'preview': - self.create_subscription( - Image, self.image_topic, self._on_image, qos_profile_sensor_data - ) - self.get_logger().info(f'预览图像:{self.image_topic}') - - def _on_image(self, msg: Image) -> None: - try: - self._latest_bgr = _image_to_bgr(msg) - except Exception: # noqa: BLE001 - pass - - def run(self) -> int: - if self.capture_mode == 'preview': - if cv2 is None: - self.get_logger().error('preview 模式需要 OpenCV(cv2)') - return 1 - if not self.image_topic: - self.get_logger().error('preview 模式需要 image_topic 或 camera_source') - return 1 - - times = list(self.get_parameter('waypoint_times').value) - positions = list(self.get_parameter('waypoint_positions').value) - n_j = len(self.joint_names) - n_pts = len(times) - if n_pts < 1: - self.get_logger().error('waypoint_times 为空') - return 1 - if len(positions) != n_pts * n_j: - self.get_logger().error( - f'waypoint_positions 长度 {len(positions)} != {n_pts}*{n_j}' - ) - return 1 - if self.start_index >= n_pts: - self.get_logger().error( - f'start_index {self.start_index} >= 路点总数 {n_pts}' - ) - return 1 - - if not self._client.wait_for_server(timeout_sec=15.0): - self.get_logger().error( - f'Action [{self.action_name}] 不可用。' - '请先启动整套栈:bash scripts/run_real.sh' - ) - return 2 - - csv_file = None - csv_writer: Optional[csv.writer] = None - if self.log_csv: - path = Path(self.log_csv).expanduser() - path.parent.mkdir(parents=True, exist_ok=True) - csv_file = path.open('w', newline='', encoding='utf-8') - csv_writer = csv.writer(csv_file) - csv_writer.writerow( - ['index', 'utc_iso', 'move_duration_s'] - + [f'target_{n}' for n in self.joint_names] - + [f'measured_{n}' for n in self.joint_names] - ) - self.get_logger().info(f'正在记录采集数据 → {path}') - - if self.capture_mode == 'preview': - print(PREVIEW_HELP_GUI if self._cv_gui else PREVIEW_HELP_HEADLESS) - - self.get_logger().info( - f'手眼标定:{n_pts} 个位姿,start={self.start_index},' - f'v_scale={self.velocity_scale},dwell={self.dwell_sec}s,' - f'mode={self.capture_mode}' - ) - self.get_logger().warn( - '清理工作空间;让棋盘保持在视野内。Ctrl+C 可中止。' - ) - - win = 'handeye_preview' - try: - for i in range(self.start_index, n_pts): - q = positions[i * n_j : (i + 1) * n_j] - move_t = max(1.0, float(times[i])) - self.get_logger().info( - f'[{i + 1}/{n_pts}] 移动中(约 {move_t:.1f}s)...' - ) - code = self._move_one(q, move_t) - if code != 0: - return code - - measured = self._read_joints() - self._announce_capture(i, n_pts, q, measured) - - if csv_writer is not None and csv_file is not None: - csv_writer.writerow( - [i, datetime.now(timezone.utc).isoformat(), move_t] - + list(q) - + list(measured if measured else [float('nan')] * n_j) - ) - csv_file.flush() - - if not self._wait_capture(i, n_pts): - self.get_logger().info('用户已中止') - return 0 - - # 在 preview 模式下确认后,保存示教关节 - if self.capture_mode == 'preview': - taught = self._read_joints() - if taught: - self._save_taught_pose(i, taught) - finally: - if csv_file is not None: - csv_file.close() - if cv2 is not None: - try: - cv2.destroyWindow(win) - except Exception: # noqa: BLE001 - pass - - self.get_logger().info('手眼标定路点序列执行完毕') - if self.append_poses_file and self.capture_mode == 'preview': - self.get_logger().info( - f'示教位姿已保存 → {self.append_poses_file}' - ) - return 0 - - def _save_taught_pose(self, index: int, joints: List[float]) -> None: - line = ', '.join(f'{v:.6f}' for v in joints[:7]) + ',' - print(f'# pose {index}') - print(line) - if not self.append_poses_file: - return - path = Path(self.append_poses_file).expanduser() - path.parent.mkdir(parents=True, exist_ok=True) - with path.open('a', encoding='utf-8') as f: - f.write(f'# pose {index}\n') - f.write(line + '\n') - self.get_logger().info(f'已保存位姿 {index} → {path}') - - def _move_one(self, positions: List[float], duration: float) -> int: - goal = FollowJointTrajectory.Goal() - goal.joint_names = self.joint_names - goal.num_points = 1 - goal.velocity_scale = self.velocity_scale - goal.positions = list(positions) - goal.time_from_start = [float(duration)] - - send = self._client.send_goal_async(goal) - if not self._wait_future(send, 10.0, '发送目标'): - return 3 - handle = send.result() - if handle is None or not handle.accepted: - self.get_logger().error('目标被拒绝') - return 4 - - res_fut = handle.get_result_async() - if not self._wait_future(res_fut, max(60.0, duration * 3.0), '结果'): - return 5 - result = res_fut.result().result - if not result.success: - self.get_logger().error(f'移动失败:{result.message}') - return 6 - return 0 - - def _wait_future(self, fut, timeout: float, label: str) -> bool: - deadline = time.monotonic() + timeout - while rclpy.ok() and not fut.done(): - rclpy.spin_once(self, timeout_sec=0.05) - if time.monotonic() > deadline: - self.get_logger().error(f'等待 {label} 超时') - return False - return fut.done() - - def _read_joints(self) -> Optional[List[float]]: - if not self._get_state.wait_for_service(timeout_sec=0.5): - return None - fut = self._get_state.call_async(GetArmState.Request()) - if not self._wait_future(fut, 2.0, 'get_arm_state'): - return None - res = fut.result() - if res is None or not res.success: - return None - return list(res.joint_positions) - - def _announce_capture( - self, - index: int, - n_pts: int, - target: List[float], - measured: Optional[List[float]], - ) -> None: - msg = String() - msg.data = f'capture:{index}:{n_pts}' - self._capture_pub.publish(msg) - q_str = ', '.join(f'{v:.4f}' for v in (measured or target)) - if self.capture_mode == 'preview': - self.get_logger().info( - f'[{index + 1}/{n_pts}] 已到位 —— 用 Free Drive 调整,然后按 Enter/Space' - ) - else: - self.get_logger().info( - f'[{index + 1}/{n_pts}] 已到位 —— 现在采集 q=[{q_str}]' - ) - - def _wait_capture(self, index: int, n_pts: int) -> bool: - if self.capture_mode == 'preview': - return self._wait_preview(index, n_pts) - - if self.capture_mode in ('key', 'keypress', 'manual'): - self.get_logger().info( - '采集完成后按 Enter(q+Enter 退出)...' - ) - for _ in range(5): - rclpy.spin_once(self, timeout_sec=0.05) - line = sys.stdin.readline() - if not line or line.strip().lower() in ('q', 'quit', 'exit'): - return False - return True - - end = time.monotonic() + max(0.0, self.dwell_sec) - while rclpy.ok() and time.monotonic() < end: - rclpy.spin_once(self, timeout_sec=0.05) - return rclpy.ok() - - def _annotate_preview( - self, bgr: np.ndarray, index: int, n_pts: int - ) -> np.ndarray: - vis = bgr.copy() - if cv2 is None: - return vis - cv2.putText( - vis, - f'位姿 {index + 1}/{n_pts}', - (12, 28), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (0, 255, 0), - 2, - ) - cv2.putText( - vis, - 'Free Drive 拖拽 | Enter=下一个 q=退出', - (12, 56), - cv2.FONT_HERSHEY_SIMPLEX, - 0.6, - (0, 255, 255), - 2, - ) - return vis - - def _publish_preview(self, bgr: np.ndarray) -> None: - msg = Image() - msg.header.stamp = self.get_clock().now().to_msg() - msg.header.frame_id = 'camera' - msg.height, msg.width = bgr.shape[0], bgr.shape[1] - msg.encoding = 'bgr8' - msg.is_bigendian = 0 - msg.step = msg.width * 3 - msg.data = array.array('B', bgr.tobytes()) # 快速路径;用 bytes 会多花约 40 ms - self._preview_pub.publish(msg) - - def _wait_preview(self, index: int, n_pts: int) -> bool: - if self._cv_gui: - return self._wait_preview_opencv(index, n_pts) - return self._wait_preview_terminal(index, n_pts) - - def _wait_preview_terminal(self, index: int, n_pts: int) -> bool: - confirmed = threading.Event() - quit_req = threading.Event() - - def _stdin_reader() -> None: - try: - line = sys.stdin.readline() - except Exception: # noqa: BLE001 - quit_req.set() - return - if not line or line.strip().lower() in ('q', 'quit', 'exit'): - quit_req.set() - else: - confirmed.set() - - self.get_logger().info( - f'[{index + 1}/{n_pts}] 用 Free Drive 调整,然后按 Enter ' - '(q+Enter 退出)' - ) - reader = threading.Thread(target=_stdin_reader, daemon=True) - reader.start() - - no_frame_warn = False - while rclpy.ok(): - rclpy.spin_once(self, timeout_sec=0.05) - if confirmed.is_set(): - return True - if quit_req.is_set(): - return False - if not reader.is_alive() and not confirmed.is_set() and not quit_req.is_set(): - return False - - bgr = self._latest_bgr - if bgr is None: - if not no_frame_warn: - self.get_logger().warn( - f'正在等待 {self.image_topic} ...', - throttle_duration_sec=3.0, - ) - no_frame_warn = True - continue - vis = self._annotate_preview(bgr, index, n_pts) - self._publish_preview(vis) - return False - - def _wait_preview_opencv(self, index: int, n_pts: int) -> bool: - assert cv2 is not None - win = 'handeye_preview' - cv2.namedWindow(win, cv2.WINDOW_NORMAL) - - no_frame_warn = False - while rclpy.ok(): - rclpy.spin_once(self, timeout_sec=0.02) - bgr = self._latest_bgr - if bgr is None: - if not no_frame_warn: - self.get_logger().warn( - f'正在等待 {self.image_topic} ...', - throttle_duration_sec=3.0, - ) - no_frame_warn = True - key = cv2.waitKey(30) & 0xFF - else: - vis = self._annotate_preview(bgr, index, n_pts) - self._publish_preview(vis) - cv2.imshow(win, vis) - key = cv2.waitKey(30) & 0xFF - - if key in (13, 10, 32): - return True - if key in (27, ord('q'), ord('Q')): - return False - return False - - -def main(args=None) -> None: - rclpy.init(args=args) - node = HandeyeWaypoints() - code = 1 - try: - code = node.run() - except KeyboardInterrupt: - code = 0 - finally: - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - raise SystemExit(code) - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_hough.py b/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_hough.py deleted file mode 100644 index e99a025..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_hough.py +++ /dev/null @@ -1,844 +0,0 @@ -"""工件二阶段检测:YOLO 定位工件 + HoughCircles 检测左右螺纹孔中心。""" - -from __future__ import annotations - -import logging - -from pathlib import Path -from typing import Any - -import cv2 -import numpy as np -import yaml - -_PKG_CONFIG = Path(__file__).resolve().parents[1] / "config" / "hole_detect.yaml" -_WS_CONFIG = Path.home() / "ros2" / "src" / "arm_application" / "config" / "hole_detect.yaml" -DEFAULT_CONFIG = _PKG_CONFIG if _PKG_CONFIG.is_file() else _WS_CONFIG - - -def load_config(path: str | Path | None = None) -> dict[str, Any]: - cfg_path = Path(path) if path else DEFAULT_CONFIG - with open(cfg_path, encoding="utf-8") as f: - data = yaml.safe_load(f) or {} - if not isinstance(data, dict): - raise ValueError(f"配置格式错误: {cfg_path}") - return data - - -logger = logging.getLogger(__name__) - - -def _fail( - msg: str, - draw_img: np.ndarray, - bbox: tuple[int, int, int, int] | None = None, - gate_block: bool = False, -) -> dict[str, Any]: - return { - "status": False, - "msg": msg, - "hole_points": [], - "hole_radii": [], - "bbox": list(bbox) if bbox is not None else None, - "gate_block": gate_block, - "draw_img": draw_img, - } - - -def _draw_bbox( - img: np.ndarray, - bbox: tuple[int, int, int, int], - color=(0, 255, 0), - label: str = "", -) -> None: - """画工件框。``label`` 是模型给出的类别名(由标签文件决定)。 - - 这里刻意**不写死类名**:以前写死了 "gongjian",但实际模型的类别是 - "workpiece",图上的字和模型的类名对不上,排查时会被误导。 - 现在用 ``Detection.cls_name``,也就是 ``weights.sh labels`` 里能读到的那份。 - """ - x1, y1, x2, y2 = bbox - cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) - text = (label or "").strip() - if text: - cv2.putText(img, text, (x1, max(20, y1 - 8)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) - - -def _best_label(dets) -> str: - """取置信度最高那个检测的类名(由标签文件决定)。没有则返回空串。""" - if not dets: - return "" - try: - best = max(dets, key=lambda d: float(d.conf)) - except Exception: # noqa: BLE001 - return "" - return str(getattr(best, "cls_name", "") or "").strip() - - -def _draw_center_gate(img: np.ndarray, max_dx: float, max_dy: float, ok: bool) -> None: - h, w = img.shape[:2] - cx, cy = w * 0.5, h * 0.5 - x1 = int(round(cx - max_dx)) - y1 = int(round(cy - max_dy)) - x2 = int(round(cx + max_dx)) - y2 = int(round(cy + max_dy)) - color = (0, 255, 0) if ok else (0, 165, 255) - cv2.rectangle(img, (x1, y1), (x2, y2), color, 1) - cv2.drawMarker(img, (int(cx), int(cy)), color, markerType=cv2.MARKER_CROSS, markerSize=18, thickness=1) - - -def _bbox_center_ok( - bbox: tuple[int, int, int, int], - img_w: int, - img_h: int, - cfg: dict[str, Any], -) -> tuple[bool, float, float, float, float]: - """返回 (是否居中, bbox_cx, bbox_cy, max_dx, max_dy)。""" - x1, y1, x2, y2 = bbox - bx = 0.5 * (x1 + x2) - by = 0.5 * (y1 + y2) - max_dx = float(cfg.get("center_max_offset_ratio_x", 0.12)) * img_w - max_dy = float(cfg.get("center_max_offset_ratio_y", 0.12)) * img_h - ok = abs(bx - img_w * 0.5) <= max_dx and abs(by - img_h * 0.5) <= max_dy - return ok, bx, by, max_dx, max_dy - - -def _draw_holes( - img: np.ndarray, - points: list[list[float]], - radii: list[float] | None = None, -) -> None: - """画孔轮廓圆 + 中心点(十字+实心点)+ 坐标。""" - for i, (cx, cy) in enumerate(points): - px, py = int(round(cx)), int(round(cy)) - r = 12.0 if radii is None or i >= len(radii) else float(radii[i]) - rr = max(4, int(round(r))) - # 轮廓 - cv2.circle(img, (px, py), rr, (0, 0, 255), 2) - # 中心十字 + 黄点 - cv2.drawMarker(img, (px, py), (0, 0, 255), markerType=cv2.MARKER_CROSS, markerSize=16, thickness=2) - cv2.circle(img, (px, py), 3, (0, 255, 255), -1) - label = f"P{i + 1}({px},{py}) r={rr}" - cv2.putText(img, label, (px + 12, py - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2) - - -def _parse_best_bbox(dets, conf_thr: float) -> tuple[int, int, int, int] | None: - """最多取 1 个工件:取置信度最高且 >= conf 的框。""" - if not dets: - return None - ordered = sorted(dets, key=lambda d: d.conf, reverse=True) - for det in ordered: - if float(det.conf) < conf_thr: - continue - return tuple(int(v) for v in det.xyxy) # type: ignore[return-value] - return None - - -def _keypoint_holes( - dets, - *, - conf_thr: float, - min_kconf: float, - radius_px: float, - min_dist_px: float, -): - """pose 模型直接给出的 k1/k2 关键点当孔位。 - - 现场约定(见 ``pose_detector``):k0 跟踪、k1/k2 对孔。 - 返回 ``((k1x,k1y),(k2x,k2y),r,r)``,拿不到可信关键点时返回 None - (不是 pose 模型 / 关键点置信度不够 / 两点几乎重合),调用方回落到找圆。 - - 为什么值得优先用关键点:Hough / 亮环那套是在**孔本身的图像特征**上找圆, - 光照、反光、通止规尖伸进视野都会把圆心拉偏;而关键点是模型在训练分布里 - 直接回归出来的,对这几类干扰天然更稳。 - """ - if not dets: - return None - for det in sorted(dets, key=lambda d: d.conf, reverse=True): - if float(det.conf) < conf_thr: - continue - kpts = getattr(det, "kpts", None) - if kpts is None: - continue - kpts = np.asarray(kpts, dtype=float) - if kpts.ndim != 2 or kpts.shape[0] < 3 or kpts.shape[1] < 3: - continue - k1, k2 = kpts[1].copy(), kpts[2].copy() - if not (np.isfinite(k1[:2]).all() and np.isfinite(k2[:2]).all()): - continue - if float(k1[2]) < min_kconf or float(k2[2]) < min_kconf: - logger.info( - "k1/k2 关键点置信度不足(%.2f / %.2f < %.2f)—— 回落到找圆", - float(k1[2]), - float(k2[2]), - min_kconf, - ) - continue - dist = float(np.hypot(k1[0] - k2[0], k1[1] - k2[1])) - if dist < float(min_dist_px): - logger.info( - "k1/k2 两关键点只差 %.1fpx(< %.1fpx)—— 视为不可信,回落到找圆", - dist, - min_dist_px, - ) - continue - r = float(radius_px) - # **刻意不按图像 x 交换左右**。 - # Hough 路径的 k1/k2 是"画面左孔 / 右孔"(位置定义),但 pose 模型学出来的 - # k1/k2 是**固定语义**(训练时标注的那个物理孔)。工件只要转个角度, - # 位置就会翻面;按 x 强制交换会让 `target_hole=k1` 时左时右地指向两个不同 - # 的物理孔 —— 那是最难查的一类现场问题。 - # 下游怎么认这两个点由 `stage2.k1_label` 决定: - # hole_points[0] = 模型的 k1,hole_points[1] = 模型的 k2, - # 所以 k1_label="left" ↔ k1 就是模型的 k1(见 stage2_locate_node._snap)。 - return (float(k1[0]), float(k1[1])), (float(k2[0]), float(k2[1])), r, r - return None - - -def _refine_circle_center( - gray: np.ndarray, - cx: float, - cy: float, - r: float, -) -> tuple[float, float]: - """Hough 整数圆心 → 暗孔连通域一阶矩(亚像素)。失败则退回原圆心。""" - h, w = gray.shape[:2] - rad = max(5.0, float(r)) - half = int(round(2.2 * rad)) - x0 = max(0, int(round(cx)) - half) - y0 = max(0, int(round(cy)) - half) - x1 = min(w, int(round(cx)) + half) - y1 = min(h, int(round(cy)) + half) - if x1 - x0 < 8 or y1 - y0 < 8: - return cx, cy - roi = gray[y0:y1, x0:x1] - blur = cv2.GaussianBlur(roi, (5, 5), 1.0) - _, bw = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) - n, labels, stats, cents = cv2.connectedComponentsWithStats(bw, 8) - if n <= 1: - return cx, cy - ex, ey = cx - x0, cy - y0 - min_area = np.pi * (0.35 * rad) ** 2 - max_area = np.pi * (1.8 * rad) ** 2 - best_i = 0 - best_d = 1e18 - for i in range(1, n): - area = float(stats[i, cv2.CC_STAT_AREA]) - if area < min_area or area > max_area: - continue - d = (float(cents[i][0]) - ex) ** 2 + (float(cents[i][1]) - ey) ** 2 - if d < best_d: - best_d = d - best_i = i - if best_i <= 0 or best_d > (1.2 * rad) ** 2: - return cx, cy - mask = np.uint8(labels == best_i) - M = cv2.moments(mask) - if M["m00"] < 1.0: - return cx, cy - return x0 + M["m10"] / M["m00"], y0 + M["m01"] / M["m00"] - - -# ==================== 螺纹嵌件对检测(亮环签名 + 关于中心孔对称)==================== -# 目标件是圆形法兰:中心一个大螺纹孔,两个目标螺纹嵌件在中心孔两侧、关于中心对称。 -# 旧 Hough"间距最大的一对"在这类多孔板上会锁到普通安装孔且逐帧跳变。 -# 新路径:金属嵌件有"暗孔芯 + 亮金属环 + 暗法兰背景"的明确签名; -# 两个目标嵌件关于中心孔对称(中点≈中心孔、半径相近)——据此唯一锁定,抗干扰抗跳变。 - - -def _disc_kernel(r: float) -> np.ndarray: - R = int(np.ceil(r)) - y, x = np.mgrid[-R:R + 1, -R:R + 1] - k = (x * x + y * y <= r * r).astype(np.float32) - return k / max(1.0, float(k.sum())) - - -def _ring_kernel(a: float, b: float) -> np.ndarray: - R = int(np.ceil(b)) - y, x = np.mgrid[-R:R + 1, -R:R + 1] - d = x * x + y * y - k = ((d >= a * a) & (d <= b * b)).astype(np.float32) - return k / max(1.0, float(k.sum())) - - -def _insert_score_map(gray: np.ndarray, scales) -> np.ndarray: - """亮环签名评分(多尺度取 max):环越亮、芯越暗、外背景越暗,分越高。""" - g = gray.astype(np.float32) - best = None - for ri, rr, ro in scales: - inner = cv2.filter2D(g, -1, _disc_kernel(ri)) - ringm = cv2.filter2D(g, -1, _ring_kernel(ri + 1, rr)) - outer = cv2.filter2D(g, -1, _ring_kernel(rr + 2, ro)) - s = ringm - 0.5 * (inner + outer) - best = s if best is None else np.maximum(best, s) - return best - - -def _refine_dark_bore(gray: np.ndarray, cx: float, cy: float, half: int = 26): - """暗孔连通域一阶矩 → 亚像素孔心 + 等效半径。失败退回原心。""" - h, w = gray.shape - x0 = max(0, int(round(cx)) - half) - y0 = max(0, int(round(cy)) - half) - x1 = min(w, int(round(cx)) + half) - y1 = min(h, int(round(cy)) + half) - if x1 - x0 < 12 or y1 - y0 < 12: - return float(cx), float(cy), 12.0 - roi = gray[y0:y1, x0:x1].astype(np.float32) - blur = cv2.GaussianBlur(roi, (5, 5), 1.0) - thr = float(np.percentile(blur, 20)) - mask = (blur < thr).astype(np.uint8) * 255 - n, _lab, st, ce = cv2.connectedComponentsWithStats(mask, 8) - best_i, best_d = 0, 1e18 - ex, ey = cx - x0, cy - y0 - for i in range(1, n): - a = float(st[i, cv2.CC_STAT_AREA]) - if a < 15: - continue - d = (float(ce[i][0]) - ex) ** 2 + (float(ce[i][1]) - ey) ** 2 - if d < best_d: - best_d, best_i = d, i - if best_i <= 0: - return float(cx), float(cy), 12.0 - area = float(st[best_i, cv2.CC_STAT_AREA]) - r_eq = float(np.sqrt(area / np.pi)) - return x0 + float(ce[best_i][0]), y0 + float(ce[best_i][1]), max(6.0, r_eq) - - -def _detect_insert_pair(gray: np.ndarray, bbox, cfg, depth_m=None, intr=None): - """找"关于工件中心对称的一对螺纹嵌件"。返回 ((k1x,k1y),(k2x,k2y),r1,r2) 或 None。 - - 尺度自适应:用深度把物理螺栓圆半径(~29mm,两孔间距~58mm)换算成像素半径, - 在中心 C 周围的圆环上搜候选,再选"中点≈C、都在环上、间距≈直径"的对称对。 - 不依赖 YOLO 框是否盖住嵌件(框只用来定中心 C)。k1=左孔(x 小),k2=右孔(x 大)。 - """ - h, w = gray.shape - x1, y1, x2, y2 = [int(v) for v in bbox] - C = np.array([0.5 * (x1 + x2), 0.5 * (y1 + y2)], dtype=float) - # ---- 螺栓圆像素半径 bolt_px ---- - bolt_mm = float(cfg.get("insert_bolt_radius_mm", 29.0)) - bolt_px = 0.0 - if depth_m is not None and intr is not None: - # 工件表面深度:C 附近小邻域的浅分位(孔底更深,表面偏浅) - r_s = max(6, int(round(0.25 * min(x2 - x1, y2 - y1)))) - cxi, cyi = int(round(C[0])), int(round(C[1])) - sx1, sx2 = max(0, cxi - r_s), min(w, cxi + r_s) - sy1, sy2 = max(0, cyi - r_s), min(h, cyi + r_s) - zreg = depth_m[sy1:sy2, sx1:sx2] - zreg = zreg[np.isfinite(zreg) & (zreg > 0.05)] - if zreg.size >= 20: - z_plate = float(np.percentile(zreg, 30)) - z_surf = max(0.05, z_plate - float(cfg.get("plate_thickness_m", 0.004))) - bolt_px = bolt_mm / 1000.0 * float(intr["fx"]) / z_surf - if bolt_px <= 0: - # 无深度时退化为按框尺寸粗估(嵌件约在 0.7×框半宽处) - bolt_px = 0.70 * 0.5 * max(x2 - x1, y2 - y1) - bolt_px = float(np.clip(bolt_px, 24.0, 0.42 * min(h, w))) - # ---- 亮环分数图 ---- - scales = cfg.get("insert_scales") or [ - (3, 6, 10), (5, 9, 14), (7, 12, 18), (10, 16, 23), (14, 21, 30), - ] - score = _insert_score_map(gray, scales) - # ---- 圆环掩码:嵌件在 [0.45, 1.55]×bolt_px 的环上 ---- - yy, xx = np.mgrid[0:h, 0:w] - dist = np.hypot(xx - C[0], yy - C[1]) - ring = ((dist > 0.45 * bolt_px) & (dist < 1.55 * bolt_px)).astype(np.float32) - scm = score * ring - pos = scm[scm > 0] - if pos.size < 20: - return None - thr = float(np.percentile(pos, float(cfg.get("insert_percentile", 96)))) - pk = (scm > thr).astype(np.uint8) * 255 - n, _lab, st, ce = cv2.connectedComponentsWithStats(pk, 8) - cands = [] # (pos, score) - for i in range(1, n): - if st[i, cv2.CC_STAT_AREA] < 8: - continue - cx_i, cy_i = float(ce[i][0]), float(ce[i][1]) - cands.append((np.array([cx_i, cy_i], dtype=float), - float(scm[int(round(cy_i)), int(round(cx_i))]))) - if len(cands) < 2: - return None - # ---- 对称对:两孔都在环上、间距≈直径、中点大致≈C(对称门)。 - # 在几何合格的对里选"亮环总分最高"的——真嵌件亮环最强,稳定选中真孔对, - # 不被"更对称但更弱"的假对带偏(C 与真中心有几像素偏差时仍稳健,消除双稳态跳变)。 - best = None - best_score = -1.0 - sym_gate = float(cfg.get("insert_sym_gate_ratio", 0.40)) * bolt_px - for i in range(len(cands)): - for j in range(i + 1, len(cands)): - pi, si = cands[i] - pj, sj = cands[j] - di = float(np.linalg.norm(pi - C)) - dj = float(np.linalg.norm(pj - C)) - if not (0.40 * bolt_px < di < 1.65 * bolt_px): - continue - if not (0.40 * bolt_px < dj < 1.65 * bolt_px): - continue - sep = float(np.linalg.norm(pi - pj)) - if not (1.2 * bolt_px < sep < 2.9 * bolt_px): - continue - mid = 0.5 * (pi + pj) - if float(np.linalg.norm(mid - C)) > sym_gate: - continue - tot = si + sj - if tot > best_score: - best_score = tot - best = (pi, pj) - if best is None: - return None - p, q = best - # 稳定分配 k1/k2:沿主方向,避免竖直对时"x 小者"被噪声翻转。 - # 竖直对(|dy|>=|dx|) → k1=上(y 小)、k2=下;水平对 → k1=左(x 小)、k2=右。 - if abs(p[1] - q[1]) >= abs(p[0] - q[0]): - k1raw, k2raw = (p, q) if p[1] < q[1] else (q, p) - else: - k1raw, k2raw = (p, q) if p[0] < q[0] else (q, p) - k1x, k1y, r1 = _refine_dark_bore(gray, k1raw[0], k1raw[1]) - k2x, k2y, r2 = _refine_dark_bore(gray, k2raw[0], k2raw[1]) - return (k1x, k1y), (k2x, k2y), r1, r2 - - -def _pad_roi( - img_w: int, - img_h: int, - bbox: tuple[int, int, int, int], - padding: int, -) -> tuple[int, int, int, int, int, int]: - """返回 x1,y1,x2,y2,offset_x,offset_y(裁剪左上角在原图坐标)。""" - x1, y1, x2, y2 = bbox - px1 = max(0, x1 - padding) - py1 = max(0, y1 - padding) - px2 = min(img_w, x2 + padding) - py2 = min(img_h, y2 + padding) - if px2 <= px1 or py2 <= py1: - raise ValueError("ROI 无效(宽或高为 0)") - return px1, py1, px2, py2, px1, py1 - - -def _render_success( - image: np.ndarray, - bbox: tuple[int, int, int, int], - hole_points: list[list[float]], - hole_radii: list[float], - dist: float, - gate: tuple[float, float] | None = None, - label: str = "", -) -> np.ndarray: - draw_img = image.copy() - if gate is not None: - _draw_center_gate(draw_img, gate[0], gate[1], True) - _draw_bbox(draw_img, bbox, label=label) - _draw_holes(draw_img, hole_points, hole_radii) - cv2.putText( - draw_img, - f"OK dist={dist:.1f}px", - (16, 36), - cv2.FONT_HERSHEY_SIMPLEX, - 0.8, - (0, 255, 0), - 2, - ) - return draw_img - - -def detect_holes( - image: np.ndarray, - detector, - config: dict[str, Any] | None = None, - device: str | int = 0, - skip_center_gate: bool = False, - depth_m: np.ndarray | None = None, - intr: dict | None = None, - allow_full_frame_roi: bool = False, -) -> dict[str, Any]: - """ - 二阶段检测螺纹孔中心。 - - detector: 需提供 detect(image_bgr, conf=..., iou=..., imgsz=...) -> list[Detection] - (YOLODetector / FasterRCNNDetector / ONNX 均可) - - :param allow_full_frame_roi: 检测器**没给出工件框**时,是否退回"整幅画面当 ROI"。 - 默认 False(保持原行为:没有框就不做,报「未检测到工件」)。 - 置 True 的场景是**调用方明确要试一把**:知道检测器可能漏检,但孔本身 - 在画面里已经看得见(例如工件检测模型与当前相机/画面不匹配、或工件贴着 - 画面中心)。此时 ROI 的约束由孔自身的判据接手 —— 环半径、两孔间距、 - 居中门控都还在,所以不会凭空多出"随便一个圆"。 - - 返回: - status, msg, hole_points [[cx,cy],...], hole_radii [r1,r2], bbox, draw_img(BGR) - """ - try: - if image is None or not isinstance(image, np.ndarray) or image.size == 0: - return _fail("输入图像无效", np.zeros((480, 640, 3), dtype=np.uint8)) - - cfg = config if config is not None else load_config() - draw_img = image.copy() - h, w = image.shape[:2] - - conf = float(cfg.get("conf", 0.25)) - iou = float(cfg.get("iou", 0.7)) - imgsz = int(cfg.get("imgsz", 640)) - padding = int(cfg.get("bbox_padding", 25)) - ksize = int(cfg.get("gaussian_ksize", 5)) - if ksize % 2 == 0: - ksize += 1 - sigma = float(cfg.get("gaussian_sigma", 1.5)) - - # 1) 检测器定位工件 bbox(最多 1 个)— 兼容 YOLO / Faster R-CNN - dets = detector.detect(image, conf=conf, iou=iou, imgsz=imgsz) - bbox = _parse_best_bbox(dets, conf) - if bbox is None and allow_full_frame_roi: - # 退回整幅画面:ROI 从"检测器给的框"换成"整幅",孔自身的判据 - #(环半径区间、两孔间距、居中门控)继续把关。 - bbox = (0, 0, int(w - 1), int(h - 1)) - logger.info( - "工件检测器没给框,按调用方要求用整幅画面当 ROI 继续找孔" - "(允许的原因见 allow_full_frame_roi 的说明)" - ) - if bbox is None: - return _fail("未检测到工件", draw_img) - - # 类别名来自标签文件(见 model_labels / weights.sh labels),不再写死。 - label = _best_label(dets) - _draw_bbox(draw_img, bbox, label=label) - - # 1.5) 居中门控:bbox 中心接近画面中心才进入二阶检测。 - # 精对准 k1/k2 时工件会离开画面中心,调用方应 skip_center_gate=True。 - center_enable = bool(cfg.get("center_gate_enable", True)) and not skip_center_gate - centered, bx, by, max_dx, max_dy = _bbox_center_ok(bbox, w, h, cfg) - if bool(cfg.get("center_gate_draw", True)): - _draw_center_gate(draw_img, max_dx, max_dy, centered if center_enable else True) - if center_enable and not centered: - dx = abs(bx - w * 0.5) - dy = abs(by - h * 0.5) - cv2.putText( - draw_img, - "MOVE TO CENTER", - (16, 36), - cv2.FONT_HERSHEY_SIMPLEX, - 0.8, - (0, 165, 255), - 2, - ) - return _fail( - f"工件未居中:offset=({dx:.0f},{dy:.0f})px,允许<=({max_dx:.0f},{max_dy:.0f})px", - draw_img, - bbox, - gate_block=True, - ) - - # ---- 首选:pose 模型直接给出 k1/k2 关键点(不必再找圆) ---- - if bool(cfg.get("keypoint_enable", True)): - kp = _keypoint_holes( - dets, - conf_thr=conf, - min_kconf=float(cfg.get("keypoint_min_conf", 0.30)), - radius_px=float(cfg.get("keypoint_hole_radius_px", 12.0)), - min_dist_px=float(cfg.get("keypoint_min_dist_px", 15.0)), - ) - if kp is not None: - (k1, k2, r1, r2) = kp - hole_points = [[float(k1[0]), float(k1[1])], [float(k2[0]), float(k2[1])]] - hole_radii = [float(r1), float(r2)] - dist = float(np.hypot(k1[0] - k2[0], k1[1] - k2[1])) - gate = (max_dx, max_dy) if bool(cfg.get("center_gate_draw", True)) else None - draw_img = _render_success( - image, bbox, hole_points, hole_radii, dist, gate=gate, label=label - ) - return { - "status": True, - "msg": f"pose 关键点 k1/k2,两孔距离 {dist:.1f}px", - "hole_points": hole_points, - "hole_radii": hole_radii, - "bbox": list(bbox), - "label": label, - "source": "keypoint", - "draw_img": draw_img, - } - - # ---- 主路径:螺纹嵌件对(亮环签名 + 关于中心孔对称),抗多孔干扰、抗跳变 ---- - if bool(cfg.get("insert_pair_enable", True)): - gray_full = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) if image.ndim == 3 else image - pair = _detect_insert_pair(gray_full, bbox, cfg, depth_m=depth_m, intr=intr) - if pair is not None: - (k1, k2, r1, r2) = pair - hole_points = [[float(k1[0]), float(k1[1])], [float(k2[0]), float(k2[1])]] - hole_radii = [float(r1), float(r2)] - dist = float(np.hypot(k1[0] - k2[0], k1[1] - k2[1])) - gate = (max_dx, max_dy) if bool(cfg.get("center_gate_draw", True)) else None - draw_img = _render_success( - image, bbox, hole_points, hole_radii, dist, gate=gate, label=label - ) - return { - "status": True, - "msg": f"螺纹嵌件对,两孔距离 {dist:.1f}px", - "hole_points": hole_points, - "hole_radii": hole_radii, - "bbox": list(bbox), - "label": label, - "draw_img": draw_img, - } - # ---- 退路:原 Hough 老路径 ---- - - # YOLO 框经常只包住半边法兰;扩到能同时容纳两个螺纹孔 - min_w = int(cfg.get("bbox_min_width", 280)) - min_h = int(cfg.get("bbox_min_height", 220)) - x1, y1, x2, y2 = bbox - bw, bh = x2 - x1, y2 - y1 - if bw < min_w or bh < min_h: - cxb, cyb = 0.5 * (x1 + x2), 0.5 * (y1 + y2) - bw, bh = max(bw, min_w), max(bh, min_h) - x1 = int(round(cxb - 0.5 * bw)) - y1 = int(round(cyb - 0.5 * bh)) - x2 = int(round(cxb + 0.5 * bw)) - y2 = int(round(cyb + 0.5 * bh)) - bbox = ( - max(0, x1), max(0, y1), - min(w, x2), min(h, y2), - ) - - # 2) padding ROI + 边界保护 - rx1, ry1, rx2, ry2, offset_x, offset_y = _pad_roi(w, h, bbox, padding) - roi = image[ry1:ry2, rx1:rx2] - if roi.size == 0: - return _fail("ROI 裁剪失败", draw_img, bbox) - - # 3) 灰度 + 高斯模糊 - gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) if roi.ndim == 3 else roi - blur = cv2.GaussianBlur(gray, (ksize, ksize), sigma) - - # 4) HoughCircles - circles = cv2.HoughCircles( - blur, - cv2.HOUGH_GRADIENT, - dp=float(cfg.get("hough_dp", 1.2)), - minDist=float(cfg.get("hough_min_dist", 40)), - param1=float(cfg.get("hough_param1", 100)), - param2=float(cfg.get("hough_param2", 28)), - minRadius=int(cfg.get("hough_min_radius", 6)), - maxRadius=int(cfg.get("hough_max_radius", 45)), - ) - if circles is None: - return _fail("HoughCircles 未检测到圆孔", draw_img, bbox) - - # 5) ROI 坐标 -> 原图坐标,再亚像素细化孔心 - circles = np.asarray(circles[0], dtype=np.float64) - gray_full = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) if image.ndim == 3 else image - do_refine = bool(cfg.get("refine_hole_centers", True)) - mapped: list[tuple[float, float, float]] = [] - for cx, cy, r in circles: - fx = float(cx + offset_x) - fy = float(cy + offset_y) - fr = float(r) - if do_refine: - fx, fy = _refine_circle_center(gray_full, fx, fy, fr) - mapped.append((fx, fy, fr)) - - # 6) 工业校验(含 bbox padding 区内的孔,避免螺纹孔落在框外) - bx1, by1, bx2, by2 = bbox - vx1 = max(0, bx1 - padding) - vy1 = max(0, by1 - padding) - vx2 = min(w, bx2 + padding) - vy2 = min(h, by2 + padding) - min_r = float(cfg.get("min_radius", 6)) - max_r = float(cfg.get("max_radius", 45)) - dist_min = float(cfg.get("hole_distance_min", 80)) - dist_max = float(cfg.get("hole_distance_max", 900)) - - valid: list[tuple[float, float, float]] = [] - for cx, cy, r in mapped: - if not (vx1 <= cx <= vx2 and vy1 <= cy <= vy2): - continue - if not (min_r <= r <= max_r): - continue - valid.append((cx, cy, r)) - - # 丢掉法兰中心大孔:螺纹孔在工件两端,中心孔靠近 bbox 中心 - bcx = 0.5 * (bx1 + bx2) - bcy = 0.5 * (by1 + by2) - diag = max(40.0, float(np.hypot(bx2 - bx1, by2 - by1))) - ring = [ - c for c in valid - if float(np.hypot(c[0] - bcx, c[1] - bcy)) >= 0.18 * diag - ] - if len(ring) >= 2: - valid = ring - - # 多于 2 个:在间距窗内取半径接近、间距最大的一对(左右螺纹孔,避开中心大孔边缘) - if len(valid) >= 2: - best = None - best_d = -1.0 - for i in range(len(valid)): - for j in range(i + 1, len(valid)): - d = float(np.hypot(valid[i][0] - valid[j][0], valid[i][1] - valid[j][1])) - if not (dist_min <= d <= dist_max): - continue - if abs(float(valid[i][2]) - float(valid[j][2])) > 10.0: - continue - if d > best_d: - best_d = d - best = (valid[i], valid[j]) - if best is None: - return _fail( - f"候选圆孔={len(valid)},没有间距在 [{dist_min}, {dist_max}] 且半径接近的一对", - draw_img, - bbox, - ) - valid = [best[0], best[1]] - - if len(valid) != 2: - return _fail(f"有效圆孔数量={len(valid)},要求严格等于 2", draw_img, bbox) - - ordered = sorted(valid, key=lambda c: c[0]) - (x1, y1, r1), (x2, y2, r2) = ordered - dist = float(np.hypot(x1 - x2, y1 - y2)) - if not (dist_min <= dist <= dist_max): - return _fail( - f"两孔距离={dist:.1f}px,不在 [{dist_min}, {dist_max}]", - draw_img, - bbox, - ) - - hole_points = [[x1, y1], [x2, y2]] - hole_radii = [r1, r2] - gate = (max_dx, max_dy) if bool(cfg.get("center_gate_draw", True)) else None - draw_img = _render_success(image, bbox, hole_points, hole_radii, dist, gate=gate, label=label) - return { - "status": True, - "msg": f"检测成功,两孔距离 {dist:.1f}px", - "hole_points": hole_points, - "hole_radii": hole_radii, - "bbox": list(bbox), - "label": label, - "draw_img": draw_img, - } - except Exception as exc: - fallback = image.copy() if isinstance(image, np.ndarray) and image.size else np.zeros((480, 640, 3), dtype=np.uint8) - return _fail(f"异常: {exc}", fallback) - - -class HoleStabilizer: - """时序稳帧:EMA 平滑中心/半径,短暂失败时沿用上一帧结果,抑制闪烁。""" - - def __init__(self, config: dict[str, Any] | None = None) -> None: - cfg = config or {} - self.cfg = cfg - self.hold_frames = int(cfg.get("stabilize_hold_frames", 15)) - self.ema_alpha = float(cfg.get("stabilize_ema_alpha", 0.35)) - self.max_jump = float(cfg.get("stabilize_max_jump", 60)) - self.reset() - - def reset(self) -> None: - self.points: list[list[float]] | None = None - self.radii: list[float] | None = None - self.bbox: tuple[int, int, int, int] | None = None - self.miss = 0 - - def update(self, image: np.ndarray, result: dict[str, Any]) -> dict[str, Any]: - try: - # 未居中:不做二阶、不沿用旧孔,立即清空稳帧 - if result.get("gate_block"): - self.reset() - out = dict(result) - out["hole_points"] = [] - out["hole_radii"] = [] - return out - - bbox = result.get("bbox") - if bbox is not None and len(bbox) == 4: - self.bbox = (int(bbox[0]), int(bbox[1]), int(bbox[2]), int(bbox[3])) - - if result.get("status") and len(result.get("hole_points") or []) == 2: - pts = [[float(p[0]), float(p[1])] for p in result["hole_points"]] - pts = sorted(pts, key=lambda p: p[0]) - rad = result.get("hole_radii") or [12.0, 12.0] - rad = [float(rad[0]), float(rad[1])] if len(rad) >= 2 else [12.0, 12.0] - - if self.points is not None: - jump = max( - float(np.hypot(pts[0][0] - self.points[0][0], pts[0][1] - self.points[0][1])), - float(np.hypot(pts[1][0] - self.points[1][0], pts[1][1] - self.points[1][1])), - ) - if jump > self.max_jump: - # 跳变过大,当作本帧失败,沿用稳定值 - self.miss += 1 - else: - a = self.ema_alpha - self.points = [ - [ - (1 - a) * self.points[0][0] + a * pts[0][0], - (1 - a) * self.points[0][1] + a * pts[0][1], - ], - [ - (1 - a) * self.points[1][0] + a * pts[1][0], - (1 - a) * self.points[1][1] + a * pts[1][1], - ], - ] - self.radii = [ - (1 - a) * self.radii[0] + a * rad[0], - (1 - a) * self.radii[1] + a * rad[1], - ] - self.miss = 0 - else: - self.points = pts - self.radii = rad - self.miss = 0 - else: - self.miss += 1 - if self.miss > self.hold_frames: - self.points = None - self.radii = None - - if self.points is None or self.radii is None: - # 彻底丢失:只保留当前帧绘制(可能仅有 bbox) - out = dict(result) - out["hole_points"] = [] - out["hole_radii"] = [] - return out - - dist = float( - np.hypot( - self.points[0][0] - self.points[1][0], - self.points[0][1] - self.points[1][1], - ) - ) - bbox_draw = self.bbox - if bbox_draw is None and result.get("bbox") is not None: - b = result["bbox"] - bbox_draw = (int(b[0]), int(b[1]), int(b[2]), int(b[3])) - if bbox_draw is None: - # 无框时仍画孔 - draw_img = image.copy() - _draw_holes(draw_img, self.points, self.radii) - else: - gate = None - if bool(self.cfg.get("center_gate_draw", True)): - ih, iw = image.shape[:2] - max_dx = float(self.cfg.get("center_max_offset_ratio_x", 0.12)) * iw - max_dy = float(self.cfg.get("center_max_offset_ratio_y", 0.12)) * ih - gate = (max_dx, max_dy) - draw_img = _render_success( - image, - bbox_draw, - self.points, - self.radii, - dist, - gate=gate, - label=str(result.get("label") or ""), - ) - - held = self.miss > 0 - return { - "status": True, - "msg": ( - f"检测成功,两孔距离 {dist:.1f}px" - + (f"(稳帧 hold={self.miss})" if held else "") - ), - "hole_points": [[p[0], p[1]] for p in self.points], - "hole_radii": [float(self.radii[0]), float(self.radii[1])], - "bbox": list(bbox_draw) if bbox_draw is not None else result.get("bbox"), - "draw_img": draw_img, - } - except Exception as exc: - fallback = image.copy() if isinstance(image, np.ndarray) and image.size else np.zeros((480, 640, 3), dtype=np.uint8) - return _fail(f"稳帧异常: {exc}", fallback) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_node.py deleted file mode 100644 index e8d7f8b..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detect_node.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -"""在当前机械臂的 D405 彩色话题上做入孔检测。只检测,不做插入动作。""" - -from __future__ import annotations - -import os - -import numpy as np -import rclpy -from rclpy.node import Node -from rclpy.qos import qos_profile_sensor_data -from sensor_msgs.msg import Image -from std_msgs.msg import Float32MultiArray - -from arm_application.handeye_realsense import resolve_realsense_topics -from arm_application.hole_detect_hough import HoleStabilizer -from arm_application.hole_detector import ( - HoleDetection, - HoleDetectResult, - HoleDetector, - config_from_site, - weights_from_site, -) -from arm_application.site_io import load_site_dict -from arm_msgs.msg import HoleDetection as HoleDetectionMsg -from arm_msgs.msg import HoleDetections - -from arm_application.ros_node import TolerantNode - - -def _as_bool(val, default: bool = False) -> bool: - if val is None: - return default - if isinstance(val, str): - return val.strip().lower() in ("1", "true", "yes", "on") - return bool(val) - - -def _bgr_copy(msg: Image) -> np.ndarray: - h, w = int(msg.height), int(msg.width) - enc = (msg.encoding or "").lower() - buf = np.frombuffer(msg.data, dtype=np.uint8) - if enc == "bgr8": - return buf.reshape(h, w, 3).copy() - if enc == "rgb8": - return buf.reshape(h, w, 3)[:, :, ::-1].copy() - raise RuntimeError(f"Unsupported encoding {msg.encoding!r}") - - -def _bgr_to_msg(image: np.ndarray, stamp, frame_id: str) -> Image: - msg = Image() - msg.header.stamp = stamp - msg.header.frame_id = frame_id - msg.height = int(image.shape[0]) - msg.width = int(image.shape[1]) - msg.encoding = "bgr8" - msg.step = int(image.shape[1] * 3) - msg.data = image.tobytes() - return msg - - -class HoleDetectNode(TolerantNode): - def __init__(self) -> None: - super().__init__("hole_detect") - self.declare_parameter("camera_source", os.environ.get("SITE_CAM_NAME") or "d405") - self.declare_parameter("image_topic", "") - self.declare_parameter("weights", "") - self.declare_parameter("config_file", "") - self.declare_parameter("backend", "two_stage") - self.declare_parameter("device", os.environ.get("SITE_YOLO_DEVICE") or "0") - self.declare_parameter("preview", False) - - site = load_site_dict() - cam = str(self.get_parameter("camera_source").value or "d405") - image_topic, _info = resolve_realsense_topics(cam, image_topic=str(self.get_parameter("image_topic").value or "")) - cfg = config_from_site(site) - param_backend = str(self.get_parameter("backend").value or "").strip().lower() - if param_backend: - cfg["backend"] = param_backend - backend = str(cfg.get("backend") or "two_stage") - weights = str(self.get_parameter("weights").value or "").strip() or weights_from_site(site) - self._preview = _as_bool(self.get_parameter("preview").value, False) - self._detector = HoleDetector( - model_path=weights or None, - config=cfg, - device=str(self.get_parameter("device").value or "0"), - ) - self._stabilizer = ( - HoleStabilizer(cfg) if backend in ("two_stage", "hough_roi") else None - ) - self._pub = self.create_publisher(HoleDetections, "/hole_detect/result", 10) - self._arr_pub = self.create_publisher(Float32MultiArray, "/hole_detect/holes", 10) - self._overlay_pub = self.create_publisher(Image, "/hole_detect/overlay", 10) - self.create_subscription(Image, image_topic, self._on_image, qos_profile_sensor_data) - self.get_logger().info( - f"hole_detect camera={cam} topic={image_topic} backend={backend} " - f"weights={self._detector.model_path} site overlay=hole_detect" - ) - - def _on_image(self, msg: Image) -> None: - try: - bgr = _bgr_copy(msg) - except Exception as exc: - self.get_logger().error(str(exc)) - return - result = self._detector.detect(bgr) - if self._stabilizer is not None: - result = self._stabilize(bgr, result) - out = HoleDetections() - out.header = msg.header - out.ok = bool(result.status) - out.message = result.msg - for hole in result.holes: - hmsg = HoleDetectionMsg() - hmsg.u = float(hole.center_px[0]) - hmsg.v = float(hole.center_px[1]) - hmsg.radius_px = float(hole.radius_px) - hmsg.confidence = float(hole.confidence) - hmsg.label = hole.label or "" - if hole.bbox: - hmsg.bbox = [int(v) for v in hole.bbox] - out.holes.append(hmsg) - self._pub.publish(out) - - arr = Float32MultiArray() - data = [1.0 if result.status else 0.0, float(len(result.holes))] - for hole in result.holes: - data.extend([hole.center_px[0], hole.center_px[1], hole.radius_px, hole.confidence]) - arr.data = data - self._arr_pub.publish(arr) - - overlay = result.draw_img if result.draw_img is not None else bgr - self._overlay_pub.publish(_bgr_to_msg(overlay, msg.header.stamp, msg.header.frame_id)) - if self._preview: - import cv2 - - cv2.imshow("hole_detect", overlay) - cv2.waitKey(1) - - def _stabilize(self, bgr, result: HoleDetectResult) -> HoleDetectResult: - raw = result.raw if isinstance(result.raw, dict) else {} - payload = { - "status": result.status, - "msg": result.msg, - "hole_points": raw.get("hole_points") - or [list(h.center_px) for h in result.holes], - "hole_radii": raw.get("hole_radii") or [h.radius_px for h in result.holes], - "bbox": raw.get("bbox") or (list(result.holes[0].bbox) if result.holes and result.holes[0].bbox else None), - "draw_img": result.draw_img, - "gate_block": bool(raw.get("gate_block")), - } - stab = self._stabilizer.update(bgr, payload) - holes: list[HoleDetection] = [] - radii = stab.get("hole_radii") or [] - bbox = stab.get("bbox") - bbox_t = tuple(int(v) for v in bbox) if bbox and len(bbox) == 4 else None - for i, pt in enumerate(stab.get("hole_points") or []): - rr = float(radii[i]) if i < len(radii) else 0.0 - holes.append( - HoleDetection( - center_px=(float(pt[0]), float(pt[1])), - radius_px=rr, - confidence=1.0, - bbox=bbox_t, - label="left" if i == 0 else "right" if i == 1 else f"h{i + 1}", - ) - ) - return HoleDetectResult( - bool(stab.get("status")), - str(stab.get("msg") or ""), - holes, - stab.get("draw_img", result.draw_img), - raw=stab, - ) - - -def main() -> None: - rclpy.init() - node = HoleDetectNode() - try: - rclpy.spin(node) - except KeyboardInterrupt: - pass - finally: - node.destroy_node() - rclpy.shutdown() - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detector.py b/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detector.py deleted file mode 100644 index 8f31781..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/hole_detector.py +++ /dev/null @@ -1,368 +0,0 @@ -"""孔定位模块:加载已训练模型,输出孔中心像素坐标与置信度。 - -与工件定位(thread_gauge)完全分离,可独立替换模型与参数。 -""" - -from __future__ import annotations - -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -import cv2 -import numpy as np -import yaml - -_PKG_SHARE_FALLBACK = Path(__file__).resolve().parents[1] / "config" -DEFAULT_CONFIG = _PKG_SHARE_FALLBACK / "hole_insert.yaml" - -# 仓库里**实际存在**的孔/工件检测模型,相对仓库根。 -# 以前这个位置上写的是 ``models/hole_insert/best.pt`` —— 文件根本不存在,属于悬空引用: -# 配置齐全时永远走不到这条分支,一旦 site.yaml 缺键就报"模型文件不存在", -# 而打印出来的路径看着特别合理,很容易被误判成"文件被人误删了"。 -# 改动这个常量时,顺手跑 ``bash scripts/weights.sh doctor`` 确认没有悬空引用。 -_CANONICAL_HOLE_MODEL = "models/yolo/gongjian0929.onnx" - - -@dataclass -class HoleDetection: - """单孔检测结果。""" - - center_px: tuple[float, float] - radius_px: float - confidence: float - bbox: tuple[int, int, int, int] | None = None - cls_id: int = 0 - label: str = "" # left / right - - -@dataclass -class HoleDetectResult: - """孔定位整体结果。""" - - status: bool - msg: str - holes: list[HoleDetection] - draw_img: np.ndarray - raw: dict[str, Any] | None = None - - -def load_hole_config(path: str | Path | None = None) -> dict[str, Any]: - cfg_path = Path(path) if path else DEFAULT_CONFIG - with open(cfg_path, encoding="utf-8") as f: - data = yaml.safe_load(f) or {} - if not isinstance(data, dict): - raise ValueError(f"孔定位配置格式错误: {cfg_path}") - return data - - -_HOLE_SITE_SKIP = {"weights", "workpiece_weights", "config"} - - -def config_from_site(data: dict[str, Any] | None = None) -> dict[str, Any]: - """先取包内 yaml 默认值,再用 ``site.yaml`` 的 ``hole_detect:`` 覆盖。 - - 以 ``site.yaml`` 为准(operator 的唯一数据源);``data`` 参数用于测试时直接喂字典。 - """ - from arm_application.site_io import deep_merge, load_site_dict, ros2_root - - site = data if data is not None else load_site_dict() - hd = dict(site.get("hole_detect") or {}) - backend = str(hd.get("backend") or "two_stage").strip().lower() - cfg_path = str(hd.get("config") or "").strip() - if not cfg_path: - root = ros2_root() - if backend in ("two_stage", "hough_roi"): - cfg_path = str(root / "src" / "arm_application" / "config" / "hole_detect.yaml") - else: - cfg_path = str(root / "src" / "arm_application" / "config" / "hole_insert.yaml") - base = load_hole_config(cfg_path) if Path(cfg_path).is_file() else {} - overlay = {k: v for k, v in hd.items() if k not in _HOLE_SITE_SKIP and v != ""} - merged = deep_merge(base, overlay) - merged["backend"] = backend - return merged - - -def weights_from_site(data: dict[str, Any] | None = None) -> str: - from arm_application.site_io import load_site_dict, ros2_root - - site = data if data is not None else load_site_dict() - hd = site.get("hole_detect") or {} - paths = site.get("paths") or {} - backend = str(hd.get("backend") or "two_stage").strip().lower() - if backend in ("two_stage", "hough_roi"): - return str( - hd.get("workpiece_weights") - or paths.get("hole_workpiece_weights") - or paths.get("yolo_weights") - or "" - ) - return str( - hd.get("weights") - or paths.get("hole_weights") - or str(ros2_root() / _CANONICAL_HOLE_MODEL) - ) - - -def _default_model_path() -> Path: - """未显式给 ``model_path`` 时的兜底模型路径。 - - 以前这里枚举了 ``hole_insert/best.pt`` / ``hole_best.pt`` / ``yolo/detect_best.pt``, - 三个文件在本仓库里**都不存在**,函数却会 ``return candidates[0]`` —— - 于是永远返回一个不存在的路径(同 ``weights_from_site`` 里那个悬空的 best.pt)。 - - 现在以 site.yaml 为准(它才是真正的来源),它给的路径存在就用它; - 否则退到仓库里实际存在的规范模型。这样报错信息里的路径至少是对的。 - """ - configured = weights_from_site() - if configured: - p = Path(configured).expanduser() - if p.is_file(): - return p - - from arm_application.site_io import ros2_root - - return ros2_root() / _CANONICAL_HOLE_MODEL - - -class HoleDetector: - """孔定位检测器:支持 YOLO / HoughCircles 双模式,可配置切换。""" - - def __init__( - self, - model_path: str | Path | None = None, - config: dict[str, Any] | None = None, - device: str | int = 0, - ) -> None: - self.cfg = config or load_hole_config() - self.device = device - self.model_path = Path(model_path) if model_path else _default_model_path() - self._detector = None - self._backend = self.cfg.get("backend", "yolo").lower() - - def _load_yolo(self): - if self._detector is not None: - return self._detector - from arm_application.yolo_detector import build_detector, resolve_weights - - weights = resolve_weights( - self.model_path, - backend=str(self.cfg.get("yolo_backend") or "auto"), - ) - # build_detector 会自己识别 pose 模型(k0/k1/k2),不必在这里分支。 - self._detector = build_detector( - weights, - conf=float(self.cfg.get("conf", 0.25)), - iou=float(self.cfg.get("iou", 0.7)), - device=str(self.device), - imgsz=int(self.cfg.get("imgsz", 640)), - ) - return self._detector - - def detect(self, image_bgr: np.ndarray) -> HoleDetectResult: - """检测图像中的孔,返回像素坐标列表。""" - if image_bgr is None or image_bgr.size == 0: - return HoleDetectResult(False, "输入图像无效", [], np.zeros((480, 640, 3), dtype=np.uint8)) - - draw_img = image_bgr.copy() - backend = self._backend - - if backend in {"yolo", "faster_rcnn"}: - return self._detect_by_model(image_bgr, draw_img) - if backend in {"two_stage", "hough_roi"}: - return self._detect_two_stage(image_bgr, draw_img) - if backend == "hough": - return self._detect_by_hough(image_bgr, draw_img) - return HoleDetectResult(False, f"未知 backend: {backend}", [], draw_img) - - def _detect_two_stage(self, image: np.ndarray, draw_img: np.ndarray) -> HoleDetectResult: - from arm_application.hole_detect_hough import detect_holes - - try: - detector = self._load_yolo() - except Exception as exc: - return HoleDetectResult(False, f"模型加载失败: {exc}", [], draw_img) - - raw = detect_holes(image, detector, config=self.cfg, device=self.device) - holes: list[HoleDetection] = [] - points = raw.get("hole_points") or [] - radii = raw.get("hole_radii") or [] - bbox = raw.get("bbox") - bbox_t = tuple(int(v) for v in bbox) if bbox and len(bbox) == 4 else None - for i, pt in enumerate(points): - r = float(radii[i]) if i < len(radii) else 0.0 - label = "left" if i == 0 else "right" if i == 1 else f"h{i + 1}" - holes.append( - HoleDetection( - center_px=(float(pt[0]), float(pt[1])), - radius_px=r, - confidence=1.0, - bbox=bbox_t, - label=label, - ) - ) - draw = raw.get("draw_img", draw_img) - return HoleDetectResult(bool(raw.get("status")), str(raw.get("msg") or ""), holes, draw, raw=raw) - - def _detect_by_model(self, image: np.ndarray, draw_img: np.ndarray) -> HoleDetectResult: - try: - detector = self._load_yolo() - except Exception as exc: - return HoleDetectResult(False, f"模型加载失败: {exc}", [], draw_img) - - conf = float(self.cfg.get("conf", 0.25)) - iou = float(self.cfg.get("iou", 0.7)) - imgsz = int(self.cfg.get("imgsz", 640)) - - dets = detector.detect(image, conf=conf, iou=iou, imgsz=imgsz) - if not dets: - return HoleDetectResult(False, "未检测到孔", [], draw_img) - - holes: list[HoleDetection] = [] - for d in dets: - x1, y1, x2, y2 = [int(v) for v in d.xyxy] - cx = 0.5 * (x1 + x2) - cy = 0.5 * (y1 + y2) - r = 0.5 * max(x2 - x1, y2 - y1) - holes.append( - HoleDetection( - center_px=(float(cx), float(cy)), - radius_px=float(r), - confidence=float(d.conf), - bbox=(x1, y1, x2, y2), - cls_id=int(getattr(d, "cls_id", 0)), - ) - ) - return _finalize_holes(holes, draw_img, raw={"dets": dets}, cfg=self.cfg) - - def _detect_by_hough(self, image: np.ndarray, draw_img: np.ndarray) -> HoleDetectResult: - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) if image.ndim == 3 else image - ksize = int(self.cfg.get("gaussian_ksize", 5)) - if ksize % 2 == 0: - ksize += 1 - blur = cv2.GaussianBlur(gray, (ksize, ksize), float(self.cfg.get("gaussian_sigma", 1.5))) - - circles = cv2.HoughCircles( - blur, - cv2.HOUGH_GRADIENT, - dp=float(self.cfg.get("hough_dp", 1.2)), - minDist=float(self.cfg.get("hough_min_dist", 40)), - param1=float(self.cfg.get("hough_param1", 100)), - param2=float(self.cfg.get("hough_param2", 28)), - minRadius=int(self.cfg.get("hough_min_radius", 6)), - maxRadius=int(self.cfg.get("hough_max_radius", 45)), - ) - if circles is None: - return HoleDetectResult(False, "HoughCircles 未检测到孔", [], draw_img) - - holes: list[HoleDetection] = [] - for c in np.asarray(circles[0], dtype=np.float64): - cx, cy, r = float(c[0]), float(c[1]), float(c[2]) - holes.append(HoleDetection(center_px=(cx, cy), radius_px=r, confidence=1.0)) - return _finalize_holes(holes, draw_img, cfg=self.cfg) - - def pixel_to_camera( - self, - hole: HoleDetection, - depth_m: float | None = None, - intrinsics: dict[str, float] | None = None, - ) -> np.ndarray: - depth = float(depth_m if depth_m is not None else self.cfg.get("default_depth_m", 0.10)) - intr = intrinsics or self.cfg.get("camera_intrinsics") or {} - return pixel_to_camera(hole, depth, intr) - - -def pair_two_holes(holes: list[HoleDetection], cfg: dict[str, Any] | None = None) -> list[HoleDetection]: - """取左右两孔:优先最高置信度,再按图像 x 排序并打 left/right 标签。""" - cfg = cfg or {} - expected = int(cfg.get("expected_holes", 2)) - if expected != 2: - ordered = sorted(holes, key=lambda h: h.center_px[0]) - for i, hole in enumerate(ordered): - hole.label = f"h{i + 1}" - return ordered - - if len(holes) < 2: - return holes - - picked = sorted(holes, key=lambda h: h.confidence, reverse=True) - if len(picked) > 2: - by_x = sorted(picked, key=lambda h: h.center_px[0]) - picked = [by_x[0], by_x[-1]] - else: - picked = picked[:2] - picked.sort(key=lambda h: h.center_px[0]) - dist = float( - np.hypot( - picked[1].center_px[0] - picked[0].center_px[0], - picked[1].center_px[1] - picked[0].center_px[1], - ) - ) - min_sep = float(cfg.get("min_hole_sep_px", 20.0)) - max_sep = float(cfg.get("max_hole_sep_px", 2000.0)) - if not (min_sep <= dist <= max_sep): - return [] - picked[0].label = "left" - picked[1].label = "right" - return picked - - -def _draw_holes(draw_img: np.ndarray, holes: list[HoleDetection]) -> None: - for hole in holes: - cx, cy = int(round(hole.center_px[0])), int(round(hole.center_px[1])) - rr = max(4, int(round(hole.radius_px))) - cv2.circle(draw_img, (cx, cy), rr, (0, 0, 255), 2) - cv2.drawMarker(draw_img, (cx, cy), (0, 255, 255), cv2.MARKER_CROSS, 16, 2) - cv2.circle(draw_img, (cx, cy), 3, (0, 255, 255), -1) - name = hole.label or "hole" - cv2.putText( - draw_img, - f"{name} ({cx},{cy}) {hole.confidence:.2f}", - (cx + 12, cy - 8), - cv2.FONT_HERSHEY_SIMPLEX, - 0.55, - (0, 0, 255), - 2, - ) - - -def _finalize_holes( - holes: list[HoleDetection], - draw_img: np.ndarray, - raw: dict[str, Any] | None = None, - cfg: dict[str, Any] | None = None, -) -> HoleDetectResult: - cfg = cfg or {} - paired = pair_two_holes(holes, cfg) - if len(holes) >= 2 and not paired: - _draw_holes(draw_img, holes) - return HoleDetectResult(False, "两孔间距不在允许范围", holes, draw_img, raw=raw) - if not paired: - _draw_holes(draw_img, holes) - return HoleDetectResult(False, f"有效孔数量={len(holes)},需要 2 个", holes, draw_img, raw=raw) - _draw_holes(draw_img, paired) - dist = float( - np.hypot( - paired[1].center_px[0] - paired[0].center_px[0], - paired[1].center_px[1] - paired[0].center_px[1], - ) - ) - msg = f"检测到双孔 left={paired[0].center_px} right={paired[1].center_px} dist={dist:.1f}px" - return HoleDetectResult(True, msg, paired, draw_img, raw=raw) - - -def pixel_to_camera( - hole: HoleDetection, - depth_m: float, - intrinsics: dict[str, float], -) -> np.ndarray: - """像素坐标 + 深度 -> 相机系三维坐标(m)。""" - fx = float(intrinsics["fx"]) - fy = float(intrinsics["fy"]) - cx = float(intrinsics["cx"]) - cy = float(intrinsics["cy"]) - u, v = hole.center_px - z = float(depth_m) - x = (u - cx) * z / fx - y = (v - cy) * z / fy - return np.array([x, y, z], dtype=float) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/image_utils.py b/install/arm_application/lib/python3.11/site-packages/arm_application/image_utils.py deleted file mode 100644 index 4f0d294..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/image_utils.py +++ /dev/null @@ -1,149 +0,0 @@ -"""把 numpy 数组打包成 ``sensor_msgs/Image``。 - -为什么需要 ----------- -Orisys 视触觉传感器的数据分两类: - -* **三力**(``fnormal`` / ``fshearx`` / ``fsheary``)—— 每帧几个标量,走子进程 - 队列几乎没有开销。 -* **图像类**(形变图 / 深度图 / 力矢量场)—— 每帧几百 KB 到几 MB。原先 - ``tactile_worker`` 为了性能**故意不过队列**,于是这些数据从未离开子进程、 - 也从未发布到 ROS 话题上。 - -本模块只负责最后一公里:把已经拿到的数组正确打包成 ``Image``。放在单独文件 -里是为了能脱离相机单测 —— 编码、``step``、通道顺序这些细节一旦写错,下游 -拿到的图会静默错位(图像撕裂、颜色通道互换),而不是报错。 - -支持的形状与编码 ----------------- -=============== ============== ========================================== -形状 dtype 编码 -=============== ============== ========================================== -``(H, W)`` ``uint8`` ``mono8`` -``(H, W)`` ``uint16`` ``mono16`` -``(H, W)`` ``float32`` ``32FC1`` -``(H, W, 1)`` 任意 ``mono8`` -``(H, W, 2)`` ``float32`` ``32FC2``(力矢量场:每像素 dx, dy) -``(H, W, 3)`` ``uint8`` ``rgb8`` -``(H, W, 4)`` ``uint8`` ``rgba8`` -=============== ============== ========================================== - -2 通道的 ``32FC2`` 是 ROS 里表达矢量场的标准做法,``step = W * 4 * 2``。 -""" - -from __future__ import annotations - -from typing import Optional, Tuple - -import numpy as np -from sensor_msgs.msg import Image - -__all__ = ["ndarray_to_image", "infer_encoding", "UnsupportedImageError"] - - -class UnsupportedImageError(ValueError): - """数组的形状/类型没有对应的 ROS 编码。 - - 宁可显式报错也不要猜 —— 猜错的结果是下游拿到一张静默错位的图。 - 错误消息里带上实际形状与 dtype,方便对照本文档的表格。 - """ - - -#: (通道数, dtype) -> ROS 编码 -_ENCODING_BY_CHANNELS = { - (1, np.dtype(np.uint8)): "mono8", - (1, np.dtype(np.uint16)): "mono16", - (1, np.dtype(np.float32)): "32FC1", - (2, np.dtype(np.float32)): "32FC2", - (3, np.dtype(np.uint8)): "rgb8", - (4, np.dtype(np.uint8)): "rgba8", -} - - -def infer_encoding(array: np.ndarray) -> str: - """推断 ROS 编码。推不出来时抛 :class:`UnsupportedImageError`。""" - arr = np.asarray(array) - if arr.ndim == 2: - channels = 1 - elif arr.ndim == 3: - channels = arr.shape[2] - else: - raise UnsupportedImageError( - f"只支持 2D(灰度)或 3D(H,W,C)数组,收到 {arr.ndim}D,形状 {arr.shape}" - ) - - key = (channels, arr.dtype) - encoding = _ENCODING_BY_CHANNELS.get(key) - if encoding is None: - supported = ", ".join( - f"{enc}({c}通道/{d.name})" - for (c, d), enc in sorted(_ENCODING_BY_CHANNELS.items(), key=lambda kv: kv[1]) - ) - raise UnsupportedImageError( - f"没有 {channels} 通道 + {arr.dtype.name} 对应的 ROS 编码。" - f"支持: {supported}。" - f"(收到形状 {arr.shape})" - ) - return encoding - - -def _layout(array: np.ndarray) -> Tuple[int, int, int]: - """返回 ``(height, width, channels)``,并把 (H,W,1) 归一化成 2D 语义。""" - arr = np.asarray(array) - if arr.ndim == 2: - h, w = arr.shape - return int(h), int(w), 1 - h, w, c = arr.shape - return int(h), int(w), int(c) - - -def ndarray_to_image( - array: np.ndarray, - *, - frame_id: str = "", - stamp=None, - encoding: Optional[str] = None, -) -> Image: - """把数组打包成 ``sensor_msgs/Image``。 - - 参数 - ---- - array: - 图像或矢量场。必须是 C 连续(``np.ascontiguousarray`` 会自动处理)。 - encoding: - 显式指定编码以覆盖推断。仅在确实知道自己在做什么时使用 —— - 编码与 dtype 不匹配会让下游按错误的元素大小解读 ``data``。 - """ - arr = np.asarray(array) - if encoding is None: - encoding = infer_encoding(arr) - - height, width, channels = _layout(arr) - - # (H,W,1) 在内存里与 (H,W) 连续一致,压平即可。 - flat = np.ascontiguousarray(arr).reshape(-1) - - msg = Image() - if stamp is not None: - msg.header.stamp = stamp - msg.header.frame_id = frame_id - msg.height = height - msg.width = width - msg.encoding = encoding - msg.is_bigendian = False - msg.step = int(width * channels * flat.dtype.itemsize) - msg.data = flat.tobytes() - return msg - - -def expected_step(array: np.ndarray, encoding: Optional[str] = None) -> int: - """算出应当写入 ``Image.step`` 的值。测试与自检用。""" - arr = np.asarray(array) - _, width, channels = _layout(arr) - if encoding is not None: - channels = {"mono8": 1, "mono16": 1, "32FC1": 1, "32FC2": 2, - "rgb8": 3, "rgba8": 4}.get(encoding, channels) - itemsize = {"mono8": 1, "mono16": 2, "32FC1": 4, "32FC2": 4, - "rgb8": 1, "rgba8": 1}.get(encoding, arr.dtype.itemsize) - return int(width * channels * itemsize) - return int(width * channels * arr.dtype.itemsize) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/kalman_filter.py b/install/arm_application/lib/python3.11/site-packages/arm_application/kalman_filter.py deleted file mode 100644 index eafcbbd..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/kalman_filter.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python3 -"""三维点的匀速模型卡尔曼滤波(坐标系为相机系)。""" - -from __future__ import annotations - -from typing import Optional - -import numpy as np - - -class KalmanFilter3D: - """状态量为 ``[x, y, z, vx, vy, vz]``;观测只有位置,没有速度。""" - - def __init__( - self, - *, - q_pos: float = 1e-4, - q_vel: float = 5e-3, - r_pos: float = 4e-4, - ) -> None: - self.q_pos = float(q_pos) - self.q_vel = float(q_vel) - self.r_pos = float(r_pos) - self.x = np.zeros(6, dtype=float) - self.P = np.eye(6, dtype=float) - self._t: Optional[float] = None - self.initialized = False - - def reset(self, p: np.ndarray, t: Optional[float] = None) -> None: - p = np.asarray(p, dtype=float).reshape(3) - self.x[:] = 0.0 - self.x[:3] = p - self.P = np.diag([1e-3, 1e-3, 1e-3, 1e-2, 1e-2, 1e-2]) - self._t = t - self.initialized = True - - @property - def position(self) -> np.ndarray: - return self.x[:3].copy() - - @property - def velocity(self) -> np.ndarray: - return self.x[3:].copy() - - def advance(self, t: float) -> None: - """把状态预测到时刻 ``t``(秒,必须单调递增)。 - - 超过 0.5 秒的空档按"目标可能已经跑掉"处理:位置不动、速度清零, - 否则旧速度会把位置外推得很离谱。 - """ - if not self.initialized or self._t is None: - self._t = t - return - dt = float(t - self._t) - if dt <= 1e-6: - return - if dt > 0.5: - # 空档太长——位置保持不动,速度清零。 - self.x[3:] = 0.0 - self._t = t - return - self._predict(dt) - self._t = t - - def zero_velocity(self) -> None: - """把速度状态清零、位置保持不动。 - - 用途:观测疑似假跳变(见 ``feature_jump_guard.FeatureJumpGate``)时本次不 - 采信观测,但**不能**让上一次的速度继续把位置外推出去 —— 否则"不动"会变成 - "按旧速度匀速跑掉",刚好是我们要避免的那件事。 - """ - self.x[3:] = 0.0 - - def update(self, z: np.ndarray) -> None: - """用一次三维位置观测做量测更新。""" - z = np.asarray(z, dtype=float).reshape(3) - if not self.initialized: - self.reset(z) - return - H = np.zeros((3, 6), dtype=float) - H[0, 0] = H[1, 1] = H[2, 2] = 1.0 - R = np.eye(3, dtype=float) * self.r_pos - y = z - H @ self.x - S = H @ self.P @ H.T + R - K = self.P @ H.T @ np.linalg.inv(S) - self.x = self.x + K @ y - I = np.eye(6) - self.P = (I - K @ H) @ self.P - - def _predict(self, dt: float) -> None: - F = np.eye(6, dtype=float) - F[0, 3] = F[1, 4] = F[2, 5] = dt - q_p = self.q_pos - q_v = self.q_vel - Q = np.diag([q_p, q_p, q_p, q_v, q_v, q_v]) - self.x = F @ self.x - self.P = F @ self.P @ F.T + Q diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/model_labels.py b/install/arm_application/lib/python3.11/site-packages/arm_application/model_labels.py deleted file mode 100644 index a8c299b..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/model_labels.py +++ /dev/null @@ -1,558 +0,0 @@ -"""模型类别标签(class names)的统一读写。 - -## 为什么需要这个模块 - -推理代码需要把模型输出的**类别索引**(整数 0/1/2…)翻译成**人能看懂的名字**。 -这件事原先没有统一做法,导致同一个模型在不同后端下名字都不一样: - -- `.pt`:从 Ultralytics 的 `model.names` 读(来源是 checkpoint 内嵌 metadata) -- `.onnx`:ONNX 文件里有 `names` metadata,但代码没用,而是**硬编码** `{0: "workpiece"}` -- `.engine`:**标签直接丢了** - -最后一条是本模块存在的主要原因。TensorRT engine 要用 `trt.OnnxParser` 重新构建, -而**当前安装的 TensorRT(10.13)Python API 根本没有 metadata 读写接口** —— -`INetworkDefinition` / `IBuilderConfig` / `ICudaEngine` 上都没有任何 metadata 方法。 -所以 engine 构建完就只剩张量,标签无从附着。实测: - - detect_best_0.engine 二进制里搜不到 "workpiece" → 标签已丢 - detect_hc90.engine 能搜到 "workpiece" → 旧版 TRT 建的,但当前环境已无法加载 - -(`detect_hc90` 已作为零引用模型移出仓库,这里保留这行是因为它同时印证了两件事: -旧版 TRT 建的 engine 里其实是有标签的,以及 engine 与 TRT 版本绑死。) - -后果很隐蔽:`yolo_detector` 读不到名字时会退化成 `str(cid)`,也就是类名变成字符串 -`"0"`;而预览界面又不绘制类名,所以**没有任何地方看得出标签丢了**。 - -## 解决办法:旁挂标签文件 - -在每个权重旁边放一个同名文本文件 `<模型名>.labels.yaml`: - - models/yolo/detect_best_0.onnx - models/yolo/detect_best_0.engine - models/yolo/detect_best_0.labels.yaml ← 就是这个 - -选文本文件而不是想办法塞进 engine,理由有二: - -1. **可修改**。标签是配置,不是模型的一部分。塞进 engine 就只能重建 engine 才能改。 -2. **跨格式统一**。engine / onnx / pt 三种格式共用同一份标签,不会出现 - "换后端名字就变了"。engine 丢标签的问题也一并绕过了。 - -标签文件是纯文本,进 git(体积小、属于配置);权重二进制不进 git。 - -## 读取优先级 - - sidecar(旁挂文件) > onnx(ONNX metadata) > model(模型自身 metadata) > placeholder - -`read_labels()` 会连**来源**一起返回。这点很重要:调用方可以据此提示 -"标签来自占位符,请补一个 .labels.yaml",而不是悄悄给出一个错的类名。 -""" - -from __future__ import annotations - -import re -from dataclasses import dataclass -from pathlib import Path -from typing import Dict, List, Optional, Sequence, Tuple, Union - -# 标签文件的扩展名。刻意用双后缀:既能被 *.yaml 工具识别, -# 又能和模型自身的配置(如果有)区分开。 -LABELS_SUFFIX = ".labels.yaml" - -# read_labels() 的来源标记。顺序即优先级(高 → 低)。 -SOURCE_SIDECAR = "sidecar" # 旁挂 <模型名>.labels.yaml(权威,用户可直接改) -SOURCE_ONNX = "onnx" # ONNX 文件内嵌 metadata -SOURCE_MODEL = "model" # 模型自身 metadata(Ultralytics 的 .names) -SOURCE_PLACEHOLDER = "placeholder" # 都没有 → 占位符 class_0/class_1… - -SOURCE_LABELS_ZH = { - SOURCE_SIDECAR: "旁挂标签文件", - SOURCE_ONNX: "ONNX 内嵌 metadata", - SOURCE_MODEL: "模型内嵌 metadata", - SOURCE_PLACEHOLDER: "占位符(缺标签)", -} - - -@dataclass(frozen=True) -class LabelSet: - """一次标签读取的结果。 - - ``names`` 是索引 → 名字;``source`` 说明它从哪来(见 SOURCE_* 常量)。 - - 调用方**应该**检查 ``source``:如果是 ``placeholder``,说明这个模型缺标签, - 此时给出的是 ``class_0`` 这样的占位名,只适合占位显示,不该当成真名使用。 - """ - - names: Dict[int, str] - source: str - path: Optional[Path] = None # 实际读到的文件(placeholder 时为 None) - - @property - def is_placeholder(self) -> bool: - return self.source == SOURCE_PLACEHOLDER - - def get(self, cid: int, default: Optional[str] = None) -> str: - if cid in self.names: - return self.names[cid] - return default if default is not None else f"class_{cid}" - - def sorted_names(self) -> List[str]: - return [self.names[k] for k in sorted(self.names)] - - -# --------------------------------------------------------------------------- -# 路径 -# --------------------------------------------------------------------------- - - -def labels_path_for(weights: Union[str, Path]) -> Path: - """给出权重对应的旁挂标签文件路径。 - - 只换后缀,目录不变:``models/yolo/detect_best_0.engine`` → - ``models/yolo/detect_best_0.labels.yaml``。 - - 这样无论 ``resolve_weights()`` 最后选中了 .pt/.onnx/.engine 中的哪一个, - 算出来的标签路径都相同 —— 一份标签服务同一个模型的所有格式。 - """ - p = Path(weights).expanduser() - # 用 stem 手工拼接,而不是 with_suffix('.labels.yaml'): - # 后者对 `a.b.onnx` 这类含点文件名容易踩坑,手工拼没有歧义。 - return p.parent / (p.stem + LABELS_SUFFIX) - - -# --------------------------------------------------------------------------- -# 解析:把各种形状的标签定义统一成 {索引: 名字} -# --------------------------------------------------------------------------- - - -def _clean(text: object) -> str: - # None 必须先拦掉:str(None) == "None" 是 truthy 的, - # 直接 str() 会让空项变成一个字面量为 "None" 的类名。 - if text is None: - return "" - return str(text).strip() - - -def _try_parse_structured(text: str) -> Optional[Dict[int, str]]: - """尝试把字符串当成 dict/list 的字面量解析。 - - 为什么需要:ONNX metadata 里的 ``names`` 存的**不是** JSON,也不是逗号列表, - 而是 Python 字典的 repr(单引号): - - "{0: 'workpiece'}" - - Ultralytics 是直接 ``str(names)`` 写进去的,所以 ``json.loads`` 会失败。 - 两种都试一遍(JSON 标准、literal_eval 兜底),都不行才交给逗号解析。 - ``ast.literal_eval`` 只解析字面量、不执行代码,是安全的。 - """ - s = text.strip() - if not s: - return None - import ast - import json - - for loader in (json.loads, ast.literal_eval): - try: - obj = loader(s) - except Exception: # noqa: BLE001 - continue - if isinstance(obj, (dict, list, tuple)): - return parse_names_field(obj) - return None - - -def _parse_freeform_text(text: str) -> Dict[int, str]: - """解析"自由文本"形式的标签内容。 - - 两种情况要分开,否则会互相吃掉: - - - 一行一个名字(有人把 ``classes.txt`` 直接改名成 ``.labels.yaml``): - ``"a\\nb"`` → ``{0:'a', 1:'b'}`` - - 单行逗号串:``"a, b"`` → ``{0:'a', 1:'b'}`` - - 判据是"有没有多行"。只有一行时才按逗号切, - 否则 ``"a, b"`` 这种文件名里带逗号的写法会被切错。 - """ - items = [ - ln.strip() - for ln in text.splitlines() - if ln.strip() and not ln.strip().startswith("#") - ] - if len(items) > 1: - return {i: n for i, n in enumerate(items)} - return parse_label_list(text) - - -def parse_names_field(value: object) -> Dict[int, str]: - """把 YAML/metadata 里的 ``names`` 字段规范成 ``{int: str}``。 - - 容忍三种写法,因为它们各自都很常见: - - - 字典(Ultralytics data.yaml 的写法):``{0: workpiece, 1: hole}`` - - 列表(本模块写出的规范形式,索引即顺序):``[workpiece, hole]`` - - 逗号分隔的字符串:``"workpiece, hole"`` - - 跳过空项但**保留其索引位置**,这样 ``[a, "", c]`` 不会让 c 变成 1 号。 - 无法解析成整数键的字典项会被忽略(不抛异常 —— 标签读不出来不该让程序崩)。 - """ - if value is None: - return {} - if isinstance(value, dict): - out: Dict[int, str] = {} - for k, v in value.items(): - try: - idx = int(k) - except (TypeError, ValueError): - continue - name = _clean(v) - if name: - out[idx] = name - return out - if isinstance(value, (list, tuple)): - out = {} - for i, v in enumerate(value): - name = _clean(v) - if name: - out[i] = name - return out - if isinstance(value, str): - # 字符串可能是三种东西:dict/list 的字面量(ONNX metadata)、 - # 逗号列表、或者多行文本。先试结构化的,再退到逗号/多行解析。 - structured = _try_parse_structured(value) - if structured is not None: - return structured - return _parse_freeform_text(value) - return {} - - -def parse_label_list(text: str) -> Dict[int, str]: - """解析逗号(或中文逗号、分号)分隔的类别名。 - - ``"workpiece, hole"`` → ``{0: 'workpiece', 1: 'hole'}`` - - 同时兼容 ``"0:workpiece, 1:hole"`` 这种带显式索引的写法, - 因为用户从别处拷配置过来时经常带着索引。空项被跳过。 - """ - if not text or not text.strip(): - return {} - parts = [p for p in re.split(r"[,,;;\n]", text)] - out: Dict[int, str] = {} - next_idx = 0 - for raw in parts: - item = raw.strip() - if not item: - continue - m = re.match(r"^\s*(\d+)\s*[::]\s*(.+)$", item) - if m: - idx = int(m.group(1)) - name = m.group(2).strip() - if name: - out[idx] = name - next_idx = max(next_idx, idx + 1) - continue - out[next_idx] = item - next_idx += 1 - return out - - -def read_label_text_file(path: Union[str, Path]) -> Dict[int, str]: - """读纯文本标签文件:一行一个类名(YOLO 的 classes.txt 就是这个格式)。 - - 空行和 ``#`` 开头的注释行被忽略,且**不占索引**。 - 这样用户可以在文件里随意加注释而不破坏索引对应关系。 - """ - p = Path(path).expanduser() - out: Dict[int, str] = {} - idx = 0 - with p.open("r", encoding="utf-8") as f: - for line in f: - s = line.strip() - if not s or s.startswith("#"): - continue - out[idx] = s - idx += 1 - return out - - -def placeholder_labels(nc: int) -> Dict[int, str]: - """没有标签可用时的占位名。 - - 刻意用 ``class_0`` 而不是直接回退成字符串形式的数字 ``"0"``: - 后者和"真的有一个叫 0 的类"无法区分,正是原先难以发现问题所在。 - ``class_`` 前缀一眼就能看出是没配标签。 - """ - n = max(0, int(nc)) - return {i: f"class_{i}" for i in range(n)} - - -# --------------------------------------------------------------------------- -# 旁挂标签文件读写 -# --------------------------------------------------------------------------- - - -def format_labels_yaml(names: Dict[int, str], model: Optional[str] = None) -> str: - """生成旁挂标签文件的内容(带使用说明的注释头)。 - - 注释头是刻意保留的:这个文件会被不熟悉的人直接打开编辑, - 把"第几行 = 第几类"写在文件里比写在文档里有效得多。 - """ - lines: List[str] = [] - lines.append("# 模型类别标签(class names)") - lines.append("#") - lines.append("# 一个模型对应一份标签,放在权重旁边、同名前缀:") - lines.append("# detect_best_0.engine ← 权重") - lines.append("# detect_best_0.labels.yaml ← 本文件") - lines.append("#") - lines.append("# 写法:names 下面一行一个类名,第 1 行对应类别 0,第 2 行对应类别 1,依次类推。") - lines.append("# 改完保存即生效,不需要重新转换模型、也不用重启环境(重跑节点即可)。") - lines.append("#") - lines.append("# 命令行查看/修改(推荐,不用手改本文件):") - lines.append("# bash ~/ros2/scripts/weights.sh labels <模型名>") - lines.append("# bash ~/ros2/scripts/weights.sh labels <模型名> --set \"工件,通止规\"") - lines.append("") - if model: - # 记下所属模型,便于发现"标签文件被拷给了另一个模型"这种错配。 - lines.append(f"model: {model}") - lines.append("names:") - if names: - for k in sorted(names): - lines.append(f" - {names[k]}") - else: - lines.append(" []") - return "\n".join(lines) + "\n" - - -def write_labels( - weights: Union[str, Path], - names: Dict[int, str], - *, - path: Optional[Union[str, Path]] = None, -) -> Path: - """把标签写到权重旁边的旁挂文件,返回写入路径。""" - dst = Path(path).expanduser() if path else labels_path_for(weights) - dst.parent.mkdir(parents=True, exist_ok=True) - model = Path(weights).stem - dst.write_text(format_labels_yaml(names, model=model), encoding="utf-8") - return dst - - -def read_label_file(path: Union[str, Path]) -> Optional[Dict[int, str]]: - """读旁挂标签文件。文件不存在或内容为空返回 None(不抛异常)。""" - p = Path(path).expanduser() - if not p.is_file(): - return None - try: - raw = p.read_text(encoding="utf-8") - except Exception: # noqa: BLE001 - return None - try: - import yaml - - data = yaml.safe_load(raw) - except Exception: # noqa: BLE001 - # 文件存在但读不动(语法错、编码错、权限)。返回 None 让调用方按 - # "没有标签"处理,而不是让整个推理进程崩掉 —— 标签缺失不该是致命的。 - return None - - if isinstance(data, dict): - # 规范形式:names: [...] - names = parse_names_field(data.get("names")) - if names: - return names - # 容忍 {0: 'a', 1: 'b'} 这种"顶层直接就是索引字典"的写法(Ultralytics data.yaml) - names = { - int(k): str(v).strip() - for k, v in data.items() - if str(k).lstrip("-").isdigit() and str(v).strip() - } - # 是合法 YAML 字典却读不出类别名 → 就是没有标签。 - # 这里**不能**再回落到"按行读文件",否则会把 `names: []` 里的 - # 'names:' 这几个字当成类名。 - return names or None - - if isinstance(data, (list, tuple)): - return parse_names_field(data) or None - - if isinstance(data, str): - # 整个文件就是一个标量 —— 可能是"改名过来的 classes.txt"。 - # 注意必须用**原始文本**:YAML 会把多行纯标量折成一行 - # ("a\nb\n" → "a b"),用 data 的话换行已经没了, - # "一行一个类名"会被当成一个带空格的长名字。 - return _parse_freeform_text(raw) or None - - # 空文件 / 只有注释 / 其它标量类型:按行读(能正确处理注释行)。 - try: - return read_label_text_file(p) or None - except Exception: # noqa: BLE001 - return None - - -def label_file_model(path: Union[str, Path]) -> Optional[str]: - """读旁挂标签文件里记录的 ``model:`` 字段(用于发现标签错配)。""" - p = Path(path).expanduser() - if not p.is_file(): - return None - try: - import yaml - - data = yaml.safe_load(p.read_text(encoding="utf-8")) - except Exception: # noqa: BLE001 - return None - if isinstance(data, dict): - v = data.get("model") - return _clean(v) if v else None - return None - - -# --------------------------------------------------------------------------- -# 从模型自身读标签 -# --------------------------------------------------------------------------- - - -def onnx_metadata(path: Union[str, Path]) -> Dict[str, str]: - """读 ONNX 的 ``metadata_props``(全是字符串),读不到返回空字典。 - - 用 ``load_external_data=False``:只读图结构不读权重,对 38MB 的模型也是毫秒级。 - Ultralytics 导出时会写入 ``names`` / ``imgsz`` / ``nc`` / ``task`` 等。 - """ - p = Path(path).expanduser() - if not p.is_file(): - return {} - try: - import onnx - - m = onnx.load(str(p), load_external_data=False) - except Exception: # noqa: BLE001 - return {} - return {x.key: x.value for x in m.metadata_props} - - -def labels_from_onnx(path: Union[str, Path]) -> Optional[Tuple[Dict[int, str], int]]: - """从 ONNX 的 ``metadata_props`` 读 ``names`` 与类别数 ``nc``。 - - 返回 ``(names, nc)``;读不到返回 None。 - - 注意 ``names`` 在 ONNX 里存的是 **Python 字典的 repr 字符串**(单引号), - 形如 ``"{0: 'workpiece'}"`` —— 不是 JSON。解析细节见 ``parse_names_field``。 - """ - meta = onnx_metadata(path) - if not meta: - return None - - names = parse_names_field(meta.get("names")) - nc = 0 - raw_nc = meta.get("nc") - if raw_nc is not None: - try: - nc = int(str(raw_nc).strip()) - except (TypeError, ValueError): - nc = 0 - if not nc and names: - nc = max(names) + 1 - return (names, nc) if names else None - - -def labels_from_model(path: Union[str, Path]) -> Optional[Tuple[Dict[int, str], int]]: - """从模型自身 metadata 读标签(走 Ultralytics,主要给 .pt 用)。 - - 对 .engine / .onnx 也能用(Ultralytics 会自己反序列化),但代价高: - 要加载整个模型。所以 ``read_labels()`` 只在必要时才调它。 - - Ultralytics 的 model 对象除了 ``names`` 还有 ``nc``;拿不到 nc 时用 names 推断。 - """ - p = Path(path).expanduser() - if not p.is_file(): - return None - try: - from ultralytics import YOLO - - model = YOLO(str(p), task="detect") - raw = getattr(model, "names", None) or {} - names = parse_names_field(raw) - nc = 0 - for attr in ("nc",): - try: - nc = int(getattr(model, attr) or 0) - except Exception: # noqa: BLE001 - nc = 0 - if not nc and names: - nc = max(names) + 1 - return (names, nc) if names else None - except Exception: # noqa: BLE001 - return None - - -# --------------------------------------------------------------------------- -# 统一入口 -# --------------------------------------------------------------------------- - - -def read_labels( - weights: Union[str, Path], - *, - allow_model_metadata: bool = True, - nc_hint: int = 0, -) -> LabelSet: - """按优先级读出一个模型该用的标签。 - - 优先级:旁挂文件 > ONNX metadata > 模型自身 metadata > 占位符。 - - 旁挂优先是刻意的:它是用户能直接编辑的那一份,必须覆盖模型内嵌的旧值, - 否则"我明明改了标签为什么不生效"就会变成一个很难查的问题。 - - 绝不抛异常。读不到就返回占位符并把原因记在 ``source`` 里, - 由调用方决定是记一条警告还是直接显示。 - """ - p = Path(weights).expanduser() - - side = labels_path_for(p) - names = read_label_file(side) - if names: - return LabelSet(names=names, source=SOURCE_SIDECAR, path=side) - - suffix = p.suffix.lower() - # .pt 的标签只可能来自模型自身;.onnx 先看内嵌 metadata(快); - # .engine / .trt 没有可用 metadata(见模块头说明),直接落到占位符或模型加载。 - if suffix == ".onnx": - got = labels_from_onnx(p) - if got: - return LabelSet(names=got[0], source=SOURCE_ONNX, path=p) - elif suffix in (".pt", ".pth"): - got = labels_from_model(p) - if got: - return LabelSet(names=got[0], source=SOURCE_MODEL, path=p) - - if allow_model_metadata and suffix in (".engine", ".trt"): - # engine 一般读不到(当前 TRT 没 metadata API),但也别直接放弃: - # 若用户是用 Ultralytics 导出的 engine,metadata 可能在。 - got = labels_from_model(p) - if got: - return LabelSet(names=got[0], source=SOURCE_MODEL, path=p) - - return LabelSet(names=placeholder_labels(nc_hint), source=SOURCE_PLACEHOLDER, path=None) - - -def describe(labels: LabelSet) -> str: - """一句人能看懂的说明,用于日志:``workpiece (来源: 旁挂标签文件)``。""" - names = ", ".join(labels.sorted_names()) or "(空)" - src = SOURCE_LABELS_ZH.get(labels.source, labels.source) - return f"{names} (来源: {src})" - - -def label_file_status( - weights: Union[str, Path], -) -> Tuple[bool, Optional[Path], Optional[str]]: - """检查旁挂标签文件状态,供 doctor 用。 - - 返回 ``(存在, 路径, 提示)``;``提示`` 为 None 表示没有问题。 - """ - p = Path(weights).expanduser() - side = labels_path_for(p) - if not side.is_file(): - return False, side, f"缺标签文件:{side.name}" - recorded = label_file_model(side) - if recorded and Path(weights).stem != recorded: - return True, side, ( - f"标签文件记录的 model 是 '{recorded}',但当前权重是 " - f"'{Path(weights).stem}' —— 可能是拷错了标签文件" - ) - return True, side, None diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/move_to_pose_client.py b/install/arm_application/lib/python3.11/site-packages/arm_application/move_to_pose_client.py deleted file mode 100644 index 2a55ac5..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/move_to_pose_client.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -"""``arm_msgs/action/MoveToPose``(笛卡尔目标)的示例客户端。 - -等你有了 MoveIt 或自己的 IK 求解 action server 后,把它接上去即可。 -""" - -from __future__ import annotations - -import sys - -import rclpy -from rclpy.action import ActionClient -from rclpy.node import Node -from geometry_msgs.msg import PoseStamped - -from arm_msgs.action import MoveToPose - -from arm_application.ros_node import TolerantNode - - -class MoveToPoseClient(TolerantNode): - def __init__(self) -> None: - super().__init__('move_to_pose_client') - self._client = ActionClient(self, MoveToPose, 'move_to_pose') - - def send(self, x: float, y: float, z: float) -> None: - if not self._client.wait_for_server(timeout_sec=5.0): - self.get_logger().error( - 'move_to_pose action 不可用。' - '请启动一个实现了它的笛卡尔规划器(例如 MoveIt)。' - ) - return - - goal = MoveToPose.Goal() - goal.target_pose = PoseStamped() - goal.target_pose.header.frame_id = 'base_link' - goal.target_pose.header.stamp = self.get_clock().now().to_msg() - goal.target_pose.pose.position.x = x - goal.target_pose.pose.position.y = y - goal.target_pose.pose.position.z = z - # 单位姿态(不旋转) - goal.target_pose.pose.orientation.w = 1.0 - goal.velocity_scale = 0.3 - goal.acceleration_scale = 0.3 - goal.avoid_collisions = True - - self.get_logger().info(f'发送笛卡尔目标:({x:.3f}, {y:.3f}, {z:.3f})') - future = self._client.send_goal_async(goal) - rclpy.spin_until_future_complete(self, future) - handle = future.result() - if handle is None or not handle.accepted: - self.get_logger().error('目标被拒绝') - return - - result_future = handle.get_result_async() - rclpy.spin_until_future_complete(self, result_future) - result = result_future.result().result - self.get_logger().info(f'success={result.success} msg={result.message}') - - -def main(args=None) -> None: - rclpy.init(args=args) - node = MoveToPoseClient() - # 默认演示位姿;可通过命令行覆盖:x y z - vals = [0.35, 0.0, 0.35] - if len(sys.argv) >= 4: - vals = [float(sys.argv[1]), float(sys.argv[2]), float(sys.argv[3])] - node.send(*vals) - node.destroy_node() - rclpy.shutdown() - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/onnx_workpiece.py b/install/arm_application/lib/python3.11/site-packages/arm_application/onnx_workpiece.py deleted file mode 100644 index f3ae202..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/onnx_workpiece.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python3 -"""Direct ONNX Runtime inference for Ultralytics end2end detect models. - -为什么不走 ultralytics.YOLO:它对 .onnx 会按发行包名检查 onnxruntime, -环境装的是 onnxruntime-gpu 时会触发 pip AutoUpdate(可能卡死/破坏环境)。 -本模块用 onnxruntime 直接推理,显式 CPU provider,一次性拍照场景足够快。 - -模型要求:Ultralytics 导出时 end2end=True(NMS 已融合), -输出形状 [1, N, 6] = x1, y1, x2, y2, conf, cls(letterbox 坐标系)。 -detect_best_1.onnx 满足(metadata: end2end=True, nms=False)。 -""" - -from __future__ import annotations - -import logging -from pathlib import Path -from typing import List, Optional, Union - -import numpy as np - -from arm_application.model_labels import ( - SOURCE_MODEL, - LabelSet, - parse_names_field, - read_labels, -) -from arm_application.yolo_detector import Detection - -logger = logging.getLogger(__name__) - - -class OnnxWorkpieceDetector: - """给 detect_holes() 用的最小接口:detect(image, conf, iou, imgsz)。""" - - def __init__( - self, - weights: Union[str, Path], - *, - conf: float = 0.25, - imgsz: int = 640, - class_names: Optional[dict] = None, - ) -> None: - import onnxruntime as ort - - path = Path(weights).expanduser() - if not path.is_file(): - raise FileNotFoundError(f"ONNX weights not found: {path}") - so = ort.SessionOptions() - so.log_severity_level = 3 # 关掉 ORT 刷屏告警 - self._sess = ort.InferenceSession( - str(path), sess_options=so, providers=["CPUExecutionProvider"] - ) - inp = self._sess.get_inputs()[0] - self._iname = inp.name - shape = [d if isinstance(d, int) and d > 0 else imgsz for d in inp.shape] - self._in_h, self._in_w = int(shape[-2]), int(shape[-1]) - # 只认 ultralytics end2end 检测输出 ``[1, N, 6]``,否则**当场报错**。 - # 为什么必须在这里硬失败:2026-10-08 真机,把一个 ``task=pose`` 的模型 - # (输出 ``[1, 4+nc+3K, 8400]``)从这条分支解出来,得到的是 12 个垃圾框 - # ——conf 直接是坐标值(最高 70.87)、类名 ``class_73``、退化框 ``y1=y2=0``。 - # 而流水线照跑不误,只在二阶段"看不出工件"上体现出来,排查代价极大。 - # 宁可启动就失败(元规则:静默失效是头号敌人)。 - outs = self._sess.get_outputs() - tail = outs[0].shape[-1] if (outs and outs[0].shape) else None - if isinstance(tail, int) and tail != 6: - raise RuntimeError( - f"{path.name} 的检测输出最后一维是 {tail},不是 6 —— 它不是" - " ultralytics end2end 检测模型([1,N,6])。带 k0/k1/k2 关键点的" - " pose 模型必须交给 pose_detector / build_detector,否则坐标会被" - "当成置信度解出垃圾框,而且不会报错。" - ) - self.conf = float(conf) - self.imgsz = int(imgsz) - # 类别名:显式传入 > 旁挂标签文件 > ONNX 内嵌 metadata > 占位符。 - # 原先这里是硬编码 {0: "workpiece"},等于把类名写死在代码里 —— - # 换一个多类模型就会展示错误的名字,而且没人改得动。 - if class_names: - names = parse_names_field(class_names) - self._labels = LabelSet(names=names, source=SOURCE_MODEL, path=path) - else: - self._labels = read_labels(path, allow_model_metadata=False) - if self._labels.is_placeholder: - logger.warning( - "ONNX %s 没有类别标签,将用占位名显示。" - "补法: bash ~/ros2/scripts/weights.sh labels %s --from-model", - path.name, - path.stem, - ) - # 兼容旧属性名,避免外部代码引用时报 AttributeError。 - self._names = dict(self._labels.names) - - def _letterbox(self, img: np.ndarray): - h, w = img.shape[:2] - scale = min(self._in_w / w, self._in_h / h) - nw, nh = int(round(w * scale)), int(round(h * scale)) - import cv2 - - resized = cv2.resize(img, (nw, nh), interpolation=cv2.INTER_LINEAR) - canvas = np.full((self._in_h, self._in_w, 3), 114, dtype=np.uint8) - top = (self._in_h - nh) // 2 - left = (self._in_w - nw) // 2 - canvas[top : top + nh, left : left + nw] = resized - return canvas, scale, left, top - - def detect( - self, - image_bgr: np.ndarray, - conf: Optional[float] = None, - iou: Optional[float] = None, # end2end 模型已内置 NMS,忽略 - imgsz: Optional[int] = None, # 输入尺寸由模型决定,忽略 - **_kwargs, - ) -> List[Detection]: - del iou, imgsz - thr = float(conf if conf is not None else self.conf) - canvas, scale, left, top = self._letterbox(image_bgr) - blob = canvas[:, :, ::-1].transpose(2, 0, 1)[None].astype(np.float32) / 255.0 - out = self._sess.run(None, {self._iname: blob})[0] # [1, N, 6] - dets: List[Detection] = [] - if out is None or out.size == 0: - return dets - arr = np.asarray(out).reshape(-1, out.shape[-1]) - h, w = image_bgr.shape[:2] - for row in arr: - if row.shape[0] < 6: - continue - x1, y1, x2, y2, score, cls = [float(v) for v in row[:6]] - if score < thr: - continue - # letterbox 坐标 → 原图坐标 - xa = (x1 - left) / scale - ya = (y1 - top) / scale - xb = (x2 - left) / scale - yb = (y2 - top) / scale - xyxy = np.array( - [ - float(np.clip(xa, 0, w - 1)), - float(np.clip(ya, 0, h - 1)), - float(np.clip(xb, 0, w - 1)), - float(np.clip(yb, 0, h - 1)), - ] - ) - cid = int(cls) - dets.append( - Detection( - xyxy=xyxy, - conf=float(score), - cls_id=cid, - cls_name=self._labels.get(cid), - ) - ) - dets.sort(key=lambda d: d.conf, reverse=True) - return dets diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/orisys_tactile.py b/install/arm_application/lib/python3.11/site-packages/arm_application/orisys_tactile.py deleted file mode 100644 index 2ff58a8..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/orisys_tactile.py +++ /dev/null @@ -1,587 +0,0 @@ -"""Orisys 视触觉适配器。SDK 通过 pip 安装;设备 id 存放在 ``site.yaml`` 里。""" - -from __future__ import annotations - -import time -from dataclasses import dataclass -from pathlib import Path -from typing import Any, Optional - -import numpy as np - -from arm_application.site_io import ros2_root -from arm_application.tactile_interface import TactileCommand, TactileInterface, TactileSample - - -@dataclass -class OrisysSensorConfig: - vid_src: int | str = 0 - config_name: str = "dd03" - rotation_config_path: str = "" - cuda: bool = True - isstitch: bool = True - backend: str = "auto" - motion_threshold: float = 0.0 - target_fps: float = 30.0 - - -@dataclass -class OrisysDualConfig: - left: OrisysSensorConfig - right: OrisysSensorConfig - baseline_seconds: float = 2.0 - filter_alpha: float = 0.25 - backend: str = "orisys" # orisys | mock - image_hz: float = 0.0 - """视触觉图像(深度/形变图)的发布频率。0 = 不发布图像。 - - 为什么默认关:图像每帧几百 KB,跨进程序列化 + ROS 发布的开销远大于三力。 - 三力路径必须跑在 30fps(接触判据靠它),图像只是给人看和给算法备用, - 默认不开以免动到已经调好的三力时序。装配现场按需在 site.yaml 打开。""" - - -def resolve_orisys_config(config_name: str, config_file: str = "") -> str: - """把型号名解析成实际的 config.json 路径。 - - 查找顺序(先命中先用): - - 1. 显式传入的 ``config_file`` - 2. 参数本身就是存在的文件路径 - 3. ``devices/sensors/orisys/models/<型号>/config.json`` —— 型号配置随 SDK 放, - 这是现在唯一推荐的位置 - 4. 老位置 ``src/arm_application/config/orisys/<型号>.json``(兼容保留: - 站点自己放的定制配置可能还在这里) - 5. Orisys 包自带的 ``configs/<型号>.json`` - 6. 都没找到就把原样返回,交给 SDK 自己解析(它支持内置型号名) - """ - if config_file: - p = Path(config_file).expanduser() - if p.is_file(): - return str(p) - raw = (config_name or "dd03").strip() - p = Path(raw).expanduser() - if p.is_file(): - return str(p) - - root = ros2_root() - for cand in ( - root / "devices" / "sensors" / "orisys" / "models" / raw / "config.json", - root / "src" / "arm_application" / "config" / "orisys" / f"{raw}.json", - ): - if cand.is_file(): - return str(cand) - try: - import orisys - - pkg_root = Path(orisys.__file__).resolve().parent.parent - for cand in (pkg_root / "configs" / f"{raw}.json", pkg_root / "config" / f"{raw}.json"): - if cand.is_file(): - return str(cand) - except Exception: - pass - return raw - - -def load_orisys_from_site(data: dict) -> OrisysDualConfig: - t = data.get("tactile") or {} - left_raw = t.get("left") if isinstance(t.get("left"), dict) else {} - right_raw = t.get("right") if isinstance(t.get("right"), dict) else {} - cfg_file = str(t.get("config_file") or "") - # model 是设备契约层选型号用的键(对应 models/<型号>/ 目录名); - # config 是它的旧名,仅为兼容老站点文件保留,站点里应统一用 model。 - cfg_name = str(t.get("model") or t.get("config") or "dd03") - resolved = resolve_orisys_config(cfg_name, cfg_file) - common = dict( - config_name=resolved, - rotation_config_path=str(t.get("rotation_config") or ""), - cuda=bool(t.get("cuda", True)), - isstitch=bool(t.get("isstitch", True)), - backend=str(t.get("infer_backend") or t.get("backend_infer") or "auto"), - motion_threshold=float(t.get("motion_threshold") or 0.0), - target_fps=float(t.get("target_fps") or 30.0), - ) - left_vid = left_raw.get("video", t.get("left_video", 0)) - right_vid = right_raw.get("video", t.get("right_video", 2)) - left = OrisysSensorConfig(vid_src=_parse_video(left_vid), **common) - right = OrisysSensorConfig(vid_src=_parse_video(right_vid), **common) - if left_raw.get("config") or left_raw.get("config_file"): - left.config_name = resolve_orisys_config( - str(left_raw.get("config") or cfg_name), - str(left_raw.get("config_file") or ""), - ) - if right_raw.get("config") or right_raw.get("config_file"): - right.config_name = resolve_orisys_config( - str(right_raw.get("config") or cfg_name), - str(right_raw.get("config_file") or ""), - ) - left.rotation_config_path = str( - left_raw.get("rotation_config") or t.get("left_rotation") or t.get("rotation_config") or "" - ) - right.rotation_config_path = str( - right_raw.get("rotation_config") or t.get("right_rotation") or t.get("rotation_config") or "" - ) - return OrisysDualConfig( - left=left, - right=right, - baseline_seconds=float(t.get("baseline_seconds") or 2.0), - filter_alpha=float(t.get("filter_alpha") or 0.25), - backend=str(t.get("backend") or "orisys"), - image_hz=float(t.get("image_hz") or 0.0), - ) - - -def read_vector_map(sensor: Any) -> Optional[np.ndarray]: - """尝试从传感器读出力矢量场(每像素的切向力/位移矢量)。 - - 为什么要"尝试" - -------------- - Orisys 的 Python 绑定是编译过的,公开接口里没有一个明确叫 - "force vector map" 的方法。按语义最接近的是 ``compute_flow()`` - (形变光流 ≈ 切向位移场 ≈ 力矢量场),其次是 ``compute_hhd()``。 - 不同 SDK 版本这两个方法的返回值也不一样 —— 有的是 ``(H,W,2)`` 数组, - 有的返回 ``bool``(只给"形变是否超阈值")或可视化图。 - - 所以这里逐个试,只接受真正是二维以上数组的结果;都拿不到就返回 ``None``, - 上层跳过该话题而不是发一张假图。哪一路成功会打到日志里,便于现场核对。 - """ - for name in ("compute_flow", "compute_hhd", "compute_deformation"): - fn = getattr(sensor, name, None) - if fn is None: - continue - try: - result = fn() - except Exception: - continue - if isinstance(result, np.ndarray) and result.ndim >= 2 and result.size: - return result - return None - - -def _parse_video(value) -> int | str: - if isinstance(value, int): - return value - text = str(value).strip() - if text.isdigit(): - return int(text) - return text - - -class OrisysTactile(TactileInterface): - name = "orisys_tactile" - - def __init__(self, config: OrisysDualConfig | None = None) -> None: - self.cfg = config or OrisysDualConfig( - left=OrisysSensorConfig(vid_src=0), - right=OrisysSensorConfig(vid_src=2), - ) - self._sensors: list[dict[str, Any]] = [] - self._baseline: dict[str, float] = {} - self._connected = False - - def connect(self, sides=("left", "right")) -> None: - """连接指定侧的传感器。注意:SDK 单进程双开会严重掉帧(30→0.8fps), - 双指请拆两个进程各连一侧(tactile.launch.py 已是双进程)。""" - try: - import orisys - except ImportError as exc: - raise RuntimeError( - "缺少 orisys SDK。请执行 pip install -e /path/to/orisys-sdk " - "(git.orisys-tech.cn/orisys/test)。配置依旧从 ``site.yaml`` 的 ``tactile`` 段读取。" - ) from exc - - self._sensors = [] - for side, cfg in (("left", self.cfg.left), ("right", self.cfg.right)): - if side not in sides: - continue - kwargs = dict( - cuda=cfg.cuda, - isstitch=cfg.isstitch, - verbose=False, - config_name=cfg.config_name, - backend=cfg.backend, - ) - if cfg.rotation_config_path: - kwargs["rotation_config_path"] = cfg.rotation_config_path - sensor = orisys.Sensor(cfg.vid_src, **kwargs) - self._sensors.append({"side": side, "sensor": sensor, "cfg": cfg}) - self._calibrate_baseline() - self._connected = True - - def read_side(self, side: str, want_vector: bool = False) -> dict[str, Any]: - """读指定侧(单侧进程模式);未连接/未知侧返回全零。 - - ``want_vector=True`` 时额外计算力矢量场(逐像素运算,较贵)—— - 只应在需要发布矢量图的那些帧上打开。 - """ - if not self._connected: - return self._empty_sample(side) - for item in self._sensors: - if item["side"] == side: - return self._read_single(item, want_vector=want_vector) - return self._empty_sample(side) - - def disconnect(self) -> None: - for item in self._sensors: - try: - item["sensor"].disconnect() - except Exception: - pass - self._sensors = [] - self._connected = False - - def reset(self, hole_id: int) -> None: - del hole_id - - def step(self, sample: TactileSample) -> TactileCommand: - del sample - return TactileCommand( - delta_xyz=np.zeros(3), - delta_rpy=np.zeros(3), - done=False, - ok=True, - message="orisys step", - ) - - def read_sample(self) -> TactileSample: - if not self._connected or len(self._sensors) != 2: - return TactileSample( - timestamp=time.time(), - force_xyz=np.zeros(3), - torque_xyz=np.zeros(3), - contact=False, - ) - left = self._read_single(self._sensors[0]) - right = self._read_single(self._sensors[1]) - force_xyz = np.array( - [ - (left["fnormal"] + right["fnormal"]) * 0.5, - (left["fshearx"] + right["fshearx"]) * 0.5, - (left["fsheary"] + right["fsheary"]) * 0.5, - ] - ) - torque_xyz = np.array( - [ - right["fnormal"] - left["fnormal"], - right["fshearx"] - left["fshearx"], - right["fsheary"] - left["fsheary"], - ] - ) - return TactileSample( - timestamp=time.time(), - force_xyz=force_xyz, - torque_xyz=torque_xyz, - contact=bool(left["is_contact"] or right["is_contact"]), - embedding=np.array( - [ - left["fnormal"], - right["fnormal"], - left["fshearx"], - right["fshearx"], - left["fsheary"], - right["fsheary"], - ] - ), - raw={"left": left, "right": right, "centroid": self._estimate_centroid(left, right)}, - ) - - def _read_single(self, item: dict, want_vector: bool = False) -> dict[str, Any]: - sensor = item["sensor"] - cfg = item["cfg"] - img = sensor.get_img() - if img is None: - return self._empty_sample(item["side"]) - is_contact = sensor.compute_deformation(check_motion=True, threshold=cfg.motion_threshold) - fps, fnormal, fshearx, fsheary = sensor.read_info( - sensor.info.FPS, - sensor.info.FNORMAL, - sensor.info.FSHEARX, - sensor.info.FSHEARY, - ) - side = item["side"] - fnormal = max(0.0, float(fnormal) - self._baseline.get(f"{side}_normal", 0.0)) - fshearx = float(fshearx) - self._baseline.get(f"{side}_shearx", 0.0) - fsheary = float(fsheary) - self._baseline.get(f"{side}_sheary", 0.0) - centroid = (0.0, 0.0) - centroid_found = False - try: - sensor.compute_contact() - c, found = sensor.read_info(sensor.info.CENTROID) - if found: - centroid = c - centroid_found = True - except Exception: - pass - return { - "side": side, - "fnormal": fnormal, - "fshearx": fshearx, - "fsheary": fsheary, - "fps": float(fps), - "is_contact": bool(is_contact), - "centroid": centroid, - "centroid_found": centroid_found, - "img": img, - # 矢量场只在被要求时才算:compute_flow 是逐像素运算,每帧都做会 - # 明显增加 worker 耗时,可能拖累三力的 30fps。 - "vector": read_vector_map(sensor) if want_vector else None, - } - - def _empty_sample(self, side: str = "unknown") -> dict[str, Any]: - return { - "side": side, - "fnormal": 0.0, - "fshearx": 0.0, - "fsheary": 0.0, - "fps": 0.0, - "is_contact": False, - "centroid": (0.0, 0.0), - "centroid_found": False, - "img": None, - "vector": None, - } - - def _calibrate_baseline(self) -> None: - seconds = self.cfg.baseline_seconds - if seconds <= 0: - return - buckets: dict[str, list[float]] = { - "left_normal": [], - "right_normal": [], - "left_shearx": [], - "right_shearx": [], - "left_sheary": [], - "right_sheary": [], - } - deadline = time.perf_counter() + seconds - while time.perf_counter() < deadline: - for item in self._sensors: - sensor = item["sensor"] - side = item["side"] - img = sensor.get_img() - if img is None: - continue - sensor.compute_deformation(check_motion=False) - fnormal, fshearx, fsheary = sensor.read_info( - sensor.info.FNORMAL, - sensor.info.FSHEARX, - sensor.info.FSHEARY, - ) - buckets[f"{side}_normal"].append(float(fnormal)) - buckets[f"{side}_shearx"].append(float(fshearx)) - buckets[f"{side}_sheary"].append(float(fsheary)) - time.sleep(0.01) - self._baseline = {k: float(np.mean(v)) if v else 0.0 for k, v in buckets.items()} - - def _estimate_centroid(self, left: dict, right: dict) -> tuple[float, float]: - if left["centroid_found"] and right["centroid_found"]: - return ( - (left["centroid"][0] + right["centroid"][0]) * 0.5, - (left["centroid"][1] + right["centroid"][1]) * 0.5, - ) - if left["centroid_found"]: - return left["centroid"] - if right["centroid_found"]: - return right["centroid"] - return (0.0, 0.0) - - -class MockOrisysTactile(OrisysTactile): - name = "mock_orisys" - - def __init__(self, config: OrisysDualConfig | None = None) -> None: - super().__init__(config) - self._n = 0 - - def connect(self) -> None: - self._connected = True - self._baseline = {} - self._n = 0 - self._sensors = [ - {"side": "left", "sensor": None, "cfg": self.cfg.left}, - {"side": "right", "sensor": None, "cfg": self.cfg.right}, - ] - - def read_sample(self) -> TactileSample: - self._n += 1 - contact = self._n >= 8 - force = 0.2 if contact else 0.0 - return TactileSample( - timestamp=time.time(), - force_xyz=np.array([force, 0.01, 0.005]), - torque_xyz=np.zeros(3), - contact=contact, - raw={ - "left": {"fnormal": force, "fshearx": 0.0, "fsheary": 0.0, "is_contact": contact, "fps": 30.0, "centroid": (0, 0), "centroid_found": False}, - "right": {"fnormal": force, "fshearx": 0.0, "fsheary": 0.0, "is_contact": contact, "fps": 30.0, "centroid": (0, 0), "centroid_found": False}, - }, - ) - - -def make_tactile(data: dict) -> TactileInterface: - cfg = load_orisys_from_site(data) - backend = (cfg.backend or "orisys").strip().lower() - if backend in ("mock", "mock_orisys"): - return MockOrisysTactile(cfg) - return OrisysTactile(cfg) - - -# ==================== 多进程工作器(厂家推荐架构,每进程独立 CUDA 上下文) ==================== -# 实测:单进程双开两路传感器会互相拖垮(30→0.8fps);两个独立进程各开一路则稳定 30fps。 - -def _usb_devpath_for_video(vid_src) -> Optional[str]: - """/dev/v4l/by-path/... 或 /dev/videoN → sysfs USB 设备号(如 1-3.4.1)。""" - import re - - try: - real = os.path.realpath(str(vid_src)) - base = os.path.basename(real) - if not base.startswith("video"): - return None - sysdev = os.path.realpath(f"/sys/class/video4linux/{base}/device") - for part in reversed(sysdev.split("/")): - if re.fullmatch(r"\d+-\d+(\.\d+)*", part): - return part - except Exception: - pass - return None - - -def _usb_self_heal(vid_src, side: str) -> None: - """内核级卡死(select 超时循环)只有 unbind/bind 能救。orisys-usb-reset - 是 root 拥有的白名单脚本(sudoers NOPASSWD),只认 Orisys 的 vid/pid。""" - import subprocess - - dev = _usb_devpath_for_video(vid_src) - if not dev: - return f"[{side}] USB 自愈:解析不到设备号({vid_src})" - try: - r = subprocess.run( - ["sudo", "-n", "/usr/local/bin/orisys-usb-reset", dev], - capture_output=True, text=True, timeout=15.0, - ) - note = (r.stdout or r.stderr).strip().splitlines() - return f"[{side}] USB 自愈复位 {dev}: {note[-1] if note else 'ok'}" - except Exception as exc: - return f"[{side}] USB 自愈失败 {dev}: {exc}" - - -def tactile_worker(side: str, cfg: OrisysDualConfig, q, stop_event, image_q=None) -> None: - """独立进程:开一侧传感器,把样本推进队列。 - - q: mp.Queue(调用方给 maxsize≈2,满了丢旧留新)—— 三力等轻量数据,每帧都推。 - image_q: mp.Queue 或 None —— 视触觉图像与力矢量场。 - - 图像默认**不过队列**(``image_q=None``):每帧几百 KB,跨进程序列化 + - ROS 发布的开销会挤占三力的 30fps 时序。需要图像时调用方传一个 - ``maxsize=1`` 的队列,并按 ``cfg.image_hz`` 节流推送 —— 队列满时丢旧留新, - 主进程来不及消费也只会丢图像,不会影响三力。 - - stop_event: mp.Event,置位后干净退出(先 disconnect 释放 V4L2 设备) - - 自动重连:摄像头被强占/USB 抖动后会出现 get_img 持续 select 超时(空读, - 单次最长阻塞 ~10s)。连续 2 次空读或单次读取 >2s 即断开重连,直到恢复。 - """ - try: # 给进程起个可识别的 comm 名,便于 pkill 清理孤儿(否则占死 /dev/video*) - import ctypes - ctypes.CDLL("libc.so.6").prctl(15, b"orisys_tac_w", 0, 0, 0) # PR_SET_NAME - except Exception: - pass - - def _put(item: dict) -> None: - try: - if q.full(): - try: - q.get_nowait() - except Exception: - pass - q.put(item) - except Exception: - pass - - def _put_image(item: dict) -> None: - """图像入队:只保留最新一帧。队列满说明主进程没在消费,丢掉旧的即可。""" - try: - if image_q is None: - return - if image_q.full(): - try: - image_q.get_nowait() - except Exception: - pass - image_q.put(item) - except Exception: - pass - - period = 1.0 / max(1.0, float(getattr(cfg.left if side == "left" else cfg.right, "target_fps", 30.0))) - img_period = (1.0 / cfg.image_hz) if (image_q is not None and cfg.image_hz > 0) else 0.0 - last_img_t = 0.0 - vid_src = getattr(cfg.left if side == "left" else cfg.right, "vid_src", None) - tac: Optional[OrisysTactile] = None - bad = 0 - dead_cycles = 0 # 连续“重连了但读不到数据”的轮数 → 内核级卡死 → USB 自愈 - backoff = 0.5 - while not stop_event.is_set(): - if tac is None: - try: - tac = OrisysTactile(cfg) - tac.connect(sides=(side,)) - _put({"side": side, "error": f"[{side}] (re)connected"}) - backoff = 0.5 - except Exception as exc: - _put({"side": side, "error": f"connect failed: {exc}"}) - tac = None - dead_cycles += 1 - if dead_cycles >= 2: - _put({"side": side, "error": _usb_self_heal(vid_src, side)}) - dead_cycles = 0 - time.sleep(min(backoff, 3.0)) - backoff *= 2.0 - continue - # 只有图像帧才算矢量场:compute_flow 是逐像素运算,每帧都算会拖累三力。 - want_img = image_q is not None and (time.perf_counter() - last_img_t) >= img_period - t0 = time.perf_counter() - try: - d = tac.read_side(side, want_vector=want_img) - empty = d.get("img") is None - except Exception: - d, empty = None, True - dt = time.perf_counter() - t0 - if empty or dt > 2.0: - bad += 1 - if bad >= 2: - _put({"side": side, "error": f"[{side}] 相机断流,自动重连中…"}) - try: - tac.disconnect() - except Exception: - pass - tac = None - bad = 0 - dead_cycles += 1 - if dead_cycles >= 2: - _put({"side": side, "error": _usb_self_heal(vid_src, side)}) - dead_cycles = 0 - continue - else: - bad = 0 - dead_cycles = 0 - if d is not None and not empty: - if want_img: - last_img_t = time.perf_counter() - _put_image({ - "side": side, - "img": d.get("img"), - "vector": d.get("vector"), - "stamp": time.time(), - }) - # 图像与矢量场已单独走 image_q;三力这条轻量队列不背它们。 - d = {k: v for k, v in d.items() if k not in ("img", "vector")} - d["error"] = "" - _put(d) - rest = period - (time.perf_counter() - t0) - if rest > 0: - time.sleep(rest) - try: - if tac is not None: - tac.disconnect() - except Exception: - pass diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/perception_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/perception_node.py deleted file mode 100644 index 21510b1..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/perception_node.py +++ /dev/null @@ -1,1668 +0,0 @@ -#!/usr/bin/env python3 -"""perception_node —— YOLO + 深度 + 卡尔曼滤波(独立进程)。 - -硬性规则: -- 图像回调**只**存最新帧(绝不在回调里跑 YOLO) -- YOLO 跑在专门的工作线程上,保证 ``MutuallyExclusive`` 的 I/O 回调永远不会被阻塞 -- 用 ``SensorDataQoS`` ``BEST_EFFORT`` ``keep_last(5)`` -- 滤波后的三维点用 ``geometry_msgs/PointStamped`` 发布(不用 Service) -- 动态物体 TF 只在视觉帧率下发布 -- 高置信度检测始终重新捕获(快速运动时不会冻结) -""" - -from __future__ import annotations - -import os -import threading -import time -from pathlib import Path -from typing import Optional - -import numpy as np -import rclpy -from geometry_msgs.msg import PointStamped, TransformStamped -from rclpy.callback_groups import MutuallyExclusiveCallbackGroup -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node -from rclpy.qos import ( - HistoryPolicy, - QoSProfile, - ReliabilityPolicy, - qos_profile_sensor_data, -) -from sensor_msgs.msg import CameraInfo, Image -from std_msgs.msg import Bool, Float32, Float32MultiArray -from tf2_ros import TransformBroadcaster - -from arm_application.box_tracker import BoxTracker -from arm_application.feature_guard import ( - FarReacquireConfirm, - TrackSlewGuard, - kpt_plausible, -) -from arm_application.geom_ik import load_handeye_T -from arm_application.handeye_realsense import ( - is_realsense_source, - resolve_realsense_topics, -) -from arm_application.overhead_oneshot import ( - D405_MISS_BEFORE_D435_S, - ONESHOT_ACCEPT_TIMEOUT_S, - best_det_conf, - depth_raw_to_m, - oneshot_k0_base, - oneshot_shot_timed_out, - oneshot_should_submit, - select_oneshot_det, - wrist_needs_handoff, - z_locked_qos, -) -from arm_application.kalman_filter import KalmanFilter3D -from arm_application.plane_feature import ( - PlaneFeature, - geometric_center_on_plane, - workpiece_xyz_in_box, -) -from arm_application.pose_detector import TRACK_KPT_INDEX -from arm_application.yolo_detector import ( - INFER_BUSY, - YoloDetector, - YoloInferProcess, - build_detector, - pick_best, - resolve_weights, -) - -from arm_application.ros_node import TolerantNode - -# D435 一次性推理用的 seq。必须远离腕部帧序号,结果绝不能当 D405 检测去立体匹配。 -_ONESHOT_SEQ = 2_000_000_000 -_ONESHOT_VIZ_SEQ = 2_000_000_001 - - -def _bgr_copy(msg: Image) -> np.ndarray: - """返回调用方持有的 BGR uint8 数组(对异步 YOLO 安全;ROS 可能把原消息丢掉)。""" - h, w = int(msg.height), int(msg.width) - enc = (msg.encoding or "").lower() - buf = np.frombuffer(msg.data, dtype=np.uint8) - if enc == "bgr8": - return buf.reshape(h, w, 3).copy() - if enc == "rgb8": - return buf.reshape(h, w, 3)[:, :, ::-1].copy() - raise RuntimeError(f"不支持的编码 {msg.encoding!r}") - - -class PerceptionNode(TolerantNode): - def __init__(self) -> None: - super().__init__("perception_node") - tid = threading.get_ident() - self.get_logger().warn( - f"perception_node 已启动 pid={os.getpid()} thread_id={tid}" - ) - - self.declare_parameter("camera_source", "d405") - self.declare_parameter("camera_namespace", "") - self.declare_parameter("image_topic", "") - self.declare_parameter("camera_info_topic", "") - self.declare_parameter("depth_topic", "/d405/aligned_depth_to_color/image_raw") - self.declare_parameter("weights", "/home/cc/ros2/models/yolo/gongjian0929.onnx") - self.declare_parameter("conf", 0.10) - self.declare_parameter("iou", 0.45) - self.declare_parameter("imgsz", 640) - self.declare_parameter("device", "0") - self.declare_parameter("min_conf", 0.12) - # 重新捕获门槛(跳到新位置必须达到的置信度)。为什么必须比 min_conf 高得多: - # 真机实测假框 conf 0.13~0.47,而真 k0 是 0.87(推导见 site.yaml 同名字段)。 - # 旧写法把它接成 min_conf ⇒ 0.15 的远框被原样采信、kf.reset() 直接跳过去。 - self.declare_parameter("reacquire_conf", 0.55) - # ---- 跟踪点可信性的三道守卫(实现与推导见 feature_guard.py)---- - # 2026-10-08 真机:真 k0(conf 0.87)被一串**高置信度假 k0**(conf 0.53~0.73) - # 顶掉,1s 内把臂从 home 带到工作盒角落,之后 148s 全是"检测漏检"。 - # 假 k0 挡不住的地方:置信度没有可分区间;它们**贴在画面边上**、**借深度**。 - self.declare_parameter("keypoint_border_px", 6.0) - self.declare_parameter("track_max_step_m", 0.04) - self.declare_parameter("reacquire_far_px", 120.0) - self.declare_parameter("reacquire_confirm_frames", 3) - self.declare_parameter("vision_hz", 30.0) - self.declare_parameter("z_ref_m", 0.40) - self.declare_parameter("jump_px", 280.0) - self.declare_parameter("jump_z_m", 0.20) - self.declare_parameter("min_depth_m", 0.04) - # 特征点的**相机量程下限**:比这更近的深度读数一定来自机械臂自身(爪上夹的 - # 通止规 / 相机座),不是工件。判据是实测两条带(见 site.yaml 同名字段的推导): - # 随臂一起动的近带 0.078~0.087m,工件面 0.19~0.29m ⇒ 取 0.14。 - self.declare_parameter("feature_min_range_m", 0.14) - self.declare_parameter("max_depth_m", 0.55) - self.declare_parameter("work_z_max_m", 0.50) # 高于此值 = 孔 / 背景 - self.declare_parameter("object_frame", "tracked_object") - self.declare_parameter("camera_frame", "d405_color_optical_frame") - self.declare_parameter("kf_q_pos", 2.0e-3) - self.declare_parameter("kf_q_vel", 5.0e-2) - self.declare_parameter("kf_r_pos", 8.0e-4) - self.declare_parameter("meas_blend", 0.65) # 1 = 原始测量值,0 = 纯卡尔曼滤波 - self.declare_parameter("half_precision", True) - self.declare_parameter("backend", "auto") # auto|torch|tensorrt - self.declare_parameter("mp_infer", True) # YOLO 跑在 spawn() 子进程里 - # 自适应 Z 低通滤波:alpha_z = clamp(z_alpha_min + |vel_z|*z_alpha_gain, min, max) - self.declare_parameter("z_alpha_min", 0.10) - self.declare_parameter("z_alpha_max", 0.60) - self.declare_parameter("z_alpha_gain", 2.0) - # 加速 YOLO:推理前先降采样;检测框再缩放回全分辨率 - self.declare_parameter("infer_max_width", 0) - # 检测框 EMA(1 = 每帧都用原始 YOLO —— 紧跟目标;更低 = 更平滑但滞后) - self.declare_parameter("box_ema_alpha", 0.85) - # YOLO 短暂漏检:预览里保留上一个框;只有连续 N 帧都漏检才清除 - self.declare_parameter("miss_clear_frames", 12) - self.declare_parameter("overlay_hold_on_miss", True) - self.declare_parameter("hold_point_on_miss", True) - self.declare_parameter("miss_hold_point_frames", 2) - # plane = 立体表面质心(推荐);box = YOLO 检测框中心 - # keypoint = pose 模型的 k0 关键点(跟踪孔);见 pose_detector - self.declare_parameter("feature_mode", "plane") - self.declare_parameter("keypoint_index", TRACK_KPT_INDEX) - self.declare_parameter("keypoint_min_conf", 0.30) - self.declare_parameter("keypoint_win_px", 6) - self.declare_parameter("plane_inlier_m", 0.008) - self.declare_parameter("plane_band_m", 0.06) - # ---- D405 主跟踪 + D435 一次性(键必须从 site 接入,缺了启动即红)---- - self.declare_parameter("wrist_handoff_conf", -1.0) - self.declare_parameter("overhead_oneshot_enable", False) - self.declare_parameter("d435_move_only", False) - self.declare_parameter("overhead_min_depth_m", -1.0) - self.declare_parameter("overhead_max_depth_m", -1.0) - self.declare_parameter("overhead_oneshot_conf", -1.0) - self.declare_parameter("overhead_cooldown_s", -1.0) - self.declare_parameter("overhead_frame_max_age_s", -1.0) - self.declare_parameter("overhead_handeye_file", "") - self.declare_parameter("overhead_camera_source", "") - self.declare_parameter("overhead_camera_frame", "") - self.declare_parameter("overhead_image_topic", "") - self.declare_parameter("overhead_info_topic", "") - self.declare_parameter("overhead_depth_topic", "") - self.declare_parameter("base_frame", "") - - self.z_ref = float(self.get_parameter("z_ref_m").value) - self.min_conf = float(self.get_parameter("min_conf").value) - self.reacquire_conf = float(self.get_parameter("reacquire_conf").value) - self.jump_px = float(self.get_parameter("jump_px").value) - self.jump_z_m = float(self.get_parameter("jump_z_m").value) - self.min_depth = float(self.get_parameter("min_depth_m").value) - self.max_depth = float(self.get_parameter("max_depth_m").value) - # 特征点量程下限 = max(解码量程下限, 工具几何下限):两者取严,不许被调松到 - # 比 min_depth 还小(那会让"工具自己"重新变成合法目标)。 - self.feature_min_range = max( - self.min_depth, float(self.get_parameter("feature_min_range_m").value) - ) - self.work_z_max = float(self.get_parameter("work_z_max_m").value) - self.hold_point_on_miss = bool(self.get_parameter("hold_point_on_miss").value) - self.object_frame = str(self.get_parameter("object_frame").value) - self.camera_frame = str(self.get_parameter("camera_frame").value) - self.meas_blend = float(np.clip(float(self.get_parameter("meas_blend").value), 0.0, 1.0)) - self.z_alpha_min = float(self.get_parameter("z_alpha_min").value) - self.z_alpha_max = float(self.get_parameter("z_alpha_max").value) - self.z_alpha_gain = float(self.get_parameter("z_alpha_gain").value) - self.infer_max_width = int(self.get_parameter("infer_max_width").value) - self.backend_name = str(self.get_parameter("backend").value or "auto") - self.mp_infer = bool(self.get_parameter("mp_infer").value) - self.box_ema_alpha = float(np.clip(float(self.get_parameter("box_ema_alpha").value), 0.2, 1.0)) - self.miss_clear_frames = max(1, int(self.get_parameter("miss_clear_frames").value)) - self.overlay_hold_on_miss = bool(self.get_parameter("overlay_hold_on_miss").value) - self.miss_hold_point_frames = max( - 1, int(self.get_parameter("miss_hold_point_frames").value) - ) - self.feature_mode = str(self.get_parameter("feature_mode").value or "plane").strip().lower() - self.keypoint_index = max(0, int(self.get_parameter("keypoint_index").value)) - self.keypoint_min_conf = float(self.get_parameter("keypoint_min_conf").value) - self.keypoint_win_px = max(1, int(self.get_parameter("keypoint_win_px").value)) - # 跟踪点三道守卫(单一实现见 feature_guard.py) - self.keypoint_border_px = float(self.get_parameter("keypoint_border_px").value) - self.track_max_step_m = float(self.get_parameter("track_max_step_m").value) - self.reacquire_far_px = float(self.get_parameter("reacquire_far_px").value) - self._slew = TrackSlewGuard(self.track_max_step_m) - self._far = FarReacquireConfirm( - self.reacquire_far_px, - int(self.get_parameter("reacquire_confirm_frames").value), - ) - self.plane_inlier_m = float(self.get_parameter("plane_inlier_m").value) - self.plane_band_m = float(self.get_parameter("plane_band_m").value) - self.overhead_oneshot_enable = bool( - self.get_parameter("overhead_oneshot_enable").value - ) - self.d435_move_only = bool(self.get_parameter("d435_move_only").value) - self._T_oh: Optional[np.ndarray] = None - self._oh_image: Optional[Image] = None - self._oh_depth: Optional[Image] = None - self._oh_image_mono = -1.0 - self._oh_depth_mono = -1.0 - self._oh_fx = self._oh_fy = self._oh_cx = self._oh_cy = 0.0 - self._oh_frame = "" - self._oneshot_t = -1.0e9 - self._need_oneshot = False - self._oneshot_inflight = False - self._oneshot_shot = False - self._oneshot_shot_t = -1.0e9 - self._low_since: Optional[float] = None - self._d435_commanding = False - self._z_locked = False - self._oneshot_img: Optional[Image] = None - self._oneshot_depth: Optional[Image] = None - self._oneshot_viz_only = False - self._oh_viz_t = -1.0e9 - if self.overhead_oneshot_enable: - self.wrist_handoff_conf = float( - self.get_parameter("wrist_handoff_conf").value - ) - if self.wrist_handoff_conf < 0.0: - raise RuntimeError( - "overhead_oneshot_enable 时 wrist_handoff_conf 必须由 site.yaml 接入," - "收到哨兵 -1 —— 配置没接线。" - ) - self.overhead_min_depth = float( - self.get_parameter("overhead_min_depth_m").value - ) - self.overhead_max_depth = float( - self.get_parameter("overhead_max_depth_m").value - ) - self.overhead_oneshot_conf = float( - self.get_parameter("overhead_oneshot_conf").value - ) - self.overhead_cooldown_s = float( - self.get_parameter("overhead_cooldown_s").value - ) - self.overhead_frame_max_age_s = float( - self.get_parameter("overhead_frame_max_age_s").value - ) - if min( - self.overhead_min_depth, - self.overhead_max_depth, - self.overhead_oneshot_conf, - self.overhead_cooldown_s, - self.overhead_frame_max_age_s, - ) < 0.0: - raise RuntimeError( - "D435 一次性参数仍是哨兵 -1 —— site.yaml 的 perception.overhead 没接到节点。" - ) - oh_file = str(self.get_parameter("overhead_handeye_file").value or "") - if not Path(oh_file).is_file(): - raise RuntimeError( - f"D435 一次性定位缺眼在手外结果:{oh_file}。" - "先跑 bash ~/ros2/scripts/run_handeye.sh --arm 89 --mode eye_to_hand calibrate" - ) - self._T_oh = load_handeye_T(oh_file) - self._oh_frame = str( - self.get_parameter("overhead_camera_frame").value or "" - ) - - self._fx = self._fy = self._cx = self._cy = 0.0 - self._latest_image: Optional[Image] = None - self._latest_depth: Optional[Image] = None - self._last_uv: Optional[np.ndarray] = None - # k0 相对工件检测框的**归一化偏移**(相对框中心、除以框宽高)。k0 掉信时 - # 用它在框上重建 k0 —— 只借"偏移"不借"绝对位置",跟踪点就不会横移一大截 - #(见 `_keypoint_feature` 的真机反例)。 - self._kpt_box_frac: Optional[np.ndarray] = None - self._last_good_z: Optional[float] = None - self._last_plane_xyz: Optional[np.ndarray] = None - self._last_filt: Optional[np.ndarray] = None - self._z_filt: Optional[float] = None - self._z_filt_t: Optional[float] = None - self._box_ema: Optional[np.ndarray] = None # xyxy - self._last_raw_xyxy: Optional[np.ndarray] = None - self._box_trk = BoxTracker() - self._last_box_cls = 0.0 - self._last_box_conf = 0.0 - self._last_yolo_t: Optional[float] = None - self._miss_count = 0 - self._last_det_payload: Optional[list] = None - self._frame_seq = 0 - self._done_seq = -1 - self._frame_t: dict = {} - self._infer_meta: dict = {} - self._submitted_seq = -1 - self._last_gpu_t: Optional[float] = None - self._last_restart_t = 0.0 - self._lock = threading.Lock() - self._infer_busy = False - self._stop = threading.Event() - self._wake = threading.Event() - - # I/O 回调组:只做轻量的“存最新帧”(绝不跑 YOLO) - self._io_cbg = MutuallyExclusiveCallbackGroup() - self._wake_cbg = MutuallyExclusiveCallbackGroup() - - self.kf = KalmanFilter3D( - q_pos=float(self.get_parameter("kf_q_pos").value), - q_vel=float(self.get_parameter("kf_q_vel").value), - r_pos=float(self.get_parameter("kf_r_pos").value), - ) - - weights_raw = str(self.get_parameter("weights").value) - weights = str(resolve_weights(weights_raw, self.backend_name)) - yolo_cfg = { - "weights": weights, - "backend": self.backend_name, - "conf": float(self.get_parameter("conf").value), - "iou": float(self.get_parameter("iou").value), - "device": str(self.get_parameter("device").value or ""), - "imgsz": int(self.get_parameter("imgsz").value), - "half": bool(self.get_parameter("half_precision").value), - } - self._yolo_half = bool(yolo_cfg["half"]) - self._yolo_proc: Optional[YoloInferProcess] = None - if self.mp_infer: - self._yolo_proc = YoloInferProcess(yolo_cfg) - self.detector = self._yolo_proc # 鸭子类型,只要求有 infer() - imgsz = self._yolo_proc.imgsz - self.get_logger().info( - f"YOLO worker pid={self._yolo_proc._p.pid} weights={self._yolo_proc.weights_path}" - ) - else: - self.detector = build_detector( - weights, - backend=self.backend_name, - conf=float(yolo_cfg["conf"]), - iou=float(yolo_cfg["iou"]), - device=str(yolo_cfg["device"]), - imgsz=int(yolo_cfg["imgsz"]), - ) - # PoseDetector 自己管 GPU 张量,没有 ultralytics 的 _model 可挪。 - if self._yolo_half and hasattr(self.detector, "_model"): - try: - import torch - - if torch.cuda.is_available(): - self.detector._model.to("cuda") - else: - self._yolo_half = False - except Exception: # noqa: BLE001 - self._yolo_half = False - elif self._yolo_half: - self._yolo_half = False - try: - self.detector.warmup(half=self._yolo_half) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"YOLO 预热失败:{exc}") - imgsz = self.detector.imgsz - - image_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.BEST_EFFORT, - ) - assert image_qos.reliability == qos_profile_sensor_data.reliability - - cam_src = str(self.get_parameter("camera_source").value).strip().lower() - img_topic = str(self.get_parameter("image_topic").value or "").strip() - info_topic = str(self.get_parameter("camera_info_topic").value or "").strip() - ns = str(self.get_parameter("camera_namespace").value or "").strip() - if is_realsense_source(cam_src) or is_realsense_source(ns): - img_topic, info_topic = resolve_realsense_topics( - cam_src, - camera_namespace=ns, - image_topic=img_topic, - camera_info_topic=info_topic, - ) - depth_topic = str(self.get_parameter("depth_topic").value or "").strip() - cam_ns = (ns or cam_src).strip().strip("/") - if not depth_topic or ( - is_realsense_source(cam_ns) - and depth_topic - in ( - "/d405/aligned_depth_to_color/image_raw", - "/d435/aligned_depth_to_color/image_raw", - ) - and cam_ns not in ("d405", "d435") - ): - depth_topic = f"/{cam_ns}/aligned_depth_to_color/image_raw" - if not img_topic: - raise RuntimeError( - f"image_topic 为空(camera_source={cam_src!r} ns={ns!r});" - "请使用 d405 / d405_left / d405_right" - ) - self.get_logger().info( - f"perception image={img_topic} depth={depth_topic} info={info_topic or '-'}" - ) - - self.create_subscription( - Image, img_topic, self._on_image, image_qos, callback_group=self._io_cbg - ) - if info_topic: - self.create_subscription( - CameraInfo, info_topic, self._on_info, image_qos, - callback_group=self._io_cbg, - ) - self.create_subscription( - Image, depth_topic, self._on_depth, image_qos, callback_group=self._io_cbg - ) - self.base_frame = str(self.get_parameter("base_frame").value or "").strip() - if self.overhead_oneshot_enable: - oh_img = str(self.get_parameter("overhead_image_topic").value or "").strip() - oh_info = str(self.get_parameter("overhead_info_topic").value or "").strip() - oh_dep = str(self.get_parameter("overhead_depth_topic").value or "").strip() - if not oh_img or not oh_dep: - raise RuntimeError( - "overhead_oneshot_enable 但 overhead_image_topic / " - "overhead_depth_topic 为空 —— 配置没接线。" - ) - self.create_subscription( - Image, oh_img, self._on_oh_image, image_qos, - callback_group=self._io_cbg, - ) - self.create_subscription( - Image, oh_dep, self._on_oh_depth, image_qos, - callback_group=self._io_cbg, - ) - if oh_info: - self.create_subscription( - CameraInfo, oh_info, self._on_oh_info, image_qos, - callback_group=self._io_cbg, - ) - self.create_subscription( - Bool, "visual_servo/z_locked", self._on_z_locked, z_locked_qos(), - callback_group=self._io_cbg, - ) - self.create_subscription( - Bool, - "visual_servo/d435_commanding", - self._on_d435_commanding, - z_locked_qos(), - callback_group=self._io_cbg, - ) - extra = ( - ";d435_move_only:不等 D405 丢目标,0.5s 后必拍一张" - if self.d435_move_only - else "" - ) - self.get_logger().info( - f"D435 待命 image={oh_img} depth={oh_dep} " - f"handoff_conf={self.wrist_handoff_conf:.2f} " - f"看不到满 {D405_MISS_BEFORE_D435_S:.1f}s 才拍一张 " - f"T={self.get_parameter('overhead_handeye_file').value}" - f"{extra}" - ) - - point_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.BEST_EFFORT, - ) - self._point_pub = self.create_publisher( - PointStamped, "visual_servo/filtered_point", point_qos - ) - self._wrist_conf_pub = self.create_publisher( - Float32, "visual_servo/wrist_conf", 5 - ) - self._overhead_k0_pub = self.create_publisher( - PointStamped, "visual_servo/overhead_k0", point_qos - ) - # RELIABLE + keep_last(5):相机预览能容忍短暂的 DDS 丢包间隙 - det_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.RELIABLE, - ) - self._det_pub = self.create_publisher(Float32MultiArray, "workpiece/detection", det_qos) - # 顶视框单独话题:像素是 D435 的,不能叠到 D405 窗上。 - self._oh_det_pub = self.create_publisher( - Float32MultiArray, "workpiece/detection_overhead", det_qos - ) - self._tf_br = TransformBroadcaster(self) - - vision_hz = max(5.0, min(40.0, float(self.get_parameter("vision_hz").value))) - self.create_timer(1.0 / vision_hz, self._wake_infer, callback_group=self._wake_cbg) - self._worker = threading.Thread(target=self._infer_loop, name="yolo_worker", daemon=True) - self._worker.start() - - self.get_logger().info( - f"perception 就绪 vision≤{vision_hz:.0f}Hz imgsz={imgsz} " - f"infer_max_w={self.infer_max_width} mp={int(self.mp_infer)} " - f"backend={self.backend_name} half={self._yolo_half} " - f"feature={self.feature_mode} image={img_topic}" - ) - - def destroy_node(self) -> bool: - self._stop.set() - self._wake.set() - if self._yolo_proc is not None: - self._yolo_proc.close() - self._yolo_proc = None - return super().destroy_node() - - def _on_image(self, msg: Image) -> None: - self._latest_image = msg - self._frame_seq += 1 - seq = self._frame_seq - self._frame_t[seq] = time.monotonic() - if len(self._frame_t) > 40: - cut = seq - 30 - self._frame_t = {k: v for k, v in self._frame_t.items() if k >= cut} - self._infer_meta = {k: v for k, v in self._infer_meta.items() if k >= cut} - if self._cx <= 1.0: - self._cx = float(msg.width) * 0.5 - self._cy = float(msg.height) * 0.5 - if self._fx <= 1.0: - w = float(msg.width) - self._fx = 654.8 if w >= 1200 else 393.9 * (w / 640.0) - self._fy = 654.0 if w >= 1200 else 393.4 * (float(msg.height) / 480.0) - # 千万不要在这里把图像 pickle 进 YOLO 队列 —— 那会卡住相机回调, - # 看起来就像是推理冻结。由推理线程负责提交。 - self._wake.set() - - def _on_info(self, msg: CameraInfo) -> None: - self._fx = float(msg.k[0]) - self._fy = float(msg.k[4]) - self._cx = float(msg.k[2]) - self._cy = float(msg.k[5]) - if msg.header.frame_id: - self.camera_frame = msg.header.frame_id - - def _on_depth(self, msg: Image) -> None: - self._latest_depth = msg - - def _on_oh_image(self, msg: Image) -> None: - self._oh_image = msg - self._oh_image_mono = time.monotonic() - - def _on_oh_depth(self, msg: Image) -> None: - self._oh_depth = msg - self._oh_depth_mono = time.monotonic() - - def _on_oh_info(self, msg: CameraInfo) -> None: - self._oh_fx = float(msg.k[0]) - self._oh_fy = float(msg.k[4]) - self._oh_cx = float(msg.k[2]) - self._oh_cy = float(msg.k[5]) - if msg.header.frame_id: - self._oh_frame = str(msg.header.frame_id) - - def _wake_infer(self) -> None: - if self._latest_image is None: - return - self._wake.set() - - def _submit_latest(self) -> None: - """复制最新的相机帧,交给 GPU 进程。""" - msg = self._latest_image - seq = int(self._frame_seq) - if msg is None or seq <= self._submitted_seq: - return - try: - bgr = _bgr_copy(msg) - small, scale = self._prepare_infer(bgr) - self._infer_meta[seq] = scale - self.detector.submit(small, seq) - self._submitted_seq = seq - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"yolo 提交失败:{exc}", throttle_duration_sec=2.0) - - def _restart_yolo(self, why: str) -> None: - """自愈:重启卡死 / 挂掉的 GPU 工作进程(重新加载 engine 需要几秒)。""" - now = time.monotonic() - if now - self._last_restart_t < 5.0: - return - if not hasattr(self.detector, "restart"): - return - self._last_restart_t = now - self.get_logger().error(f"YOLO 工作进程 {why} —— 正在重启(检测框靠惯性滑行)") - try: - self.detector.restart() - self._submitted_seq = -1 - self._oneshot_inflight = False - self._oneshot_viz_only = False - self._last_gpu_t = time.monotonic() - self.get_logger().info("YOLO 工作进程已重启") - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f"YOLO 重启失败:{exc}") - - def _infer_loop(self) -> None: - """提交最新帧,收集 GPU 结果,再做立体匹配。 - - GPU 绝不能等立体匹配:如果我们短暂正忙,工作进程会直接丢掉旧结果。 - 我们还会**先**提交再去等,这样下一次推理已经排进队列了。 - """ - while not self._stop.is_set(): - # 一次性占用 GPU 时不要再塞 D405,否则两帧挤一条队列,结果会对错图。 - if not self._oneshot_inflight: - self._submit_latest() - try: - got = self.detector.wait_result(timeout=0.030) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f"推理:{exc}", throttle_duration_sec=2.0) - if not getattr(self.detector, "alive", True): - self._restart_yolo("died") - time.sleep(0.02) - continue - now = time.monotonic() - if got is None: - silent = (now - self._last_gpu_t) if self._last_gpu_t else 0.0 - if self._last_gpu_t is not None and silent > 0.25: - self.get_logger().warn( - f"YOLO 静默 {silent*1000:.0f}ms " - f"(worker={'存活' if getattr(self.detector, 'alive', True) else '已死'})", - throttle_duration_sec=1.0, - ) - outstanding = self._submitted_seq > self._done_seq or self._oneshot_inflight - if outstanding and self._last_gpu_t is not None and silent > 2.0: - self._oneshot_inflight = False - self._restart_yolo(f"卡死 {silent:.1f}s") - continue - if ( - self._last_yolo_t is not None - and (now - self._last_yolo_t) > 0.070 - and self._last_raw_xyxy is not None - ): - self._coast_box("gpu") - self._wake.wait(timeout=0.015) - self._wake.clear() - continue - self._last_gpu_t = now - seq, dets, gpu_ms = got - if dets is INFER_BUSY: - continue - if int(seq) >= _ONESHOT_SEQ: - try: - self._finish_overhead_oneshot( - dets, - float(self._infer_meta.get(int(seq), 1.0)), - viz_only=bool(int(seq) == _ONESHOT_VIZ_SEQ), - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().error( - f"D435 一次性结果处理失败:{exc}", throttle_duration_sec=2.0 - ) - self._oneshot_inflight = False - self._oneshot_viz_only = False - self._oneshot_t = time.monotonic() - continue - scale = float(self._infer_meta.get(int(seq), 1.0)) - t_img = float(self._frame_t.get(int(seq), time.monotonic())) - t0 = time.monotonic() - try: - self._apply_detections(dets, scale, t_img) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f"应用检测结果出错:{exc}", throttle_duration_sec=2.0) - self._done_seq = int(seq) - if self._need_oneshot and not self._oneshot_inflight: - self._submit_overhead_oneshot(viz_only=False) - elif self._should_submit_overhead_viz() and not self._oneshot_inflight: - self._submit_overhead_oneshot(viz_only=True) - else: - self._submit_latest() - dt_ms = (time.monotonic() - t0) * 1000.0 - lag_ms = (time.monotonic() - t_img) * 1000.0 - self.get_logger().info( - f"infer gpu={gpu_ms:.0f}ms apply={dt_ms:.0f}ms lag={lag_ms:.0f}ms seq={seq}", - throttle_duration_sec=1.0, - ) - - def _decode_depth_m(self, msg: Image) -> Optional[np.ndarray]: - w, h = int(msg.width), int(msg.height) - enc = (msg.encoding or "").lower() - if enc in ("16uc1", "mono16"): - raw = np.frombuffer(msg.data, dtype=np.uint16) - if raw.size < w * h: - return None - return raw[: w * h].reshape(h, w) - if enc == "32fc1": - raw = np.frombuffer(msg.data, dtype=np.float32) - if raw.size < w * h: - return None - return raw[: w * h].reshape(h, w) - return None - - def _depth_in_box(self, xyxy) -> tuple: - msg = self._latest_depth - if msg is None: - return None, "无深度" - if not self._depth_fresh(msg): - return None, "深度过期" - enc = (msg.encoding or "").lower() - buf = self._decode_depth_m(msg) - if buf is None: - return None, "深度无效" - h, w = buf.shape - x1, y1, x2, y2 = [float(v) for v in xyxy] - img = self._latest_image - if img is not None and (int(img.width) != w or int(img.height) != h): - sx, sy = w / float(img.width), h / float(img.height) - x1, y1, x2, y2 = x1 * sx, y1 * sy, x2 * sx, y2 * sy - bw, bh = max(8.0, x2 - x1), max(8.0, y2 - y1) - # 内部 ROI —— 避开检测框边缘;但对有孔的工件仍要保留足够像素 - ix0 = int(np.clip(x1 + 0.20 * bw, 0, w - 1)) - iy0 = int(np.clip(y1 + 0.20 * bh, 0, h - 1)) - ix1 = int(np.clip(x2 - 0.20 * bw, ix0 + 2, w)) - iy1 = int(np.clip(y2 - 0.20 * bh, iy0 + 2, h)) - roi = buf[iy0:iy1, ix0:ix1].reshape(-1).astype(np.float32) - scale = 0.001 - if enc in ("16uc1", "mono16"): - pos = roi[roi > 0] - if pos.size >= 8: - med_raw = float(np.median(pos)) - scale = 0.001 if 20.0 <= med_raw <= 8000.0 else (1.0 if med_raw < 20 else 0.0001) - meters = pos * scale - else: - meters = np.array([], dtype=np.float32) - else: - meters = roi - scale = 1.0 - vals = meters[np.isfinite(meters) & (meters > self.feature_min_range) & (meters < self.max_depth)] - if vals.size < 8: - # 内部 ROI 经常落在孔上;改用整个检测框重试。 - y0 = int(np.clip(y1, 0, h - 1)) - x0 = int(np.clip(x1, 0, w - 1)) - y1b = int(np.clip(y2, y0 + 2, h)) - x1b = int(np.clip(x2, x0 + 2, w)) - roi2 = buf[y0:y1b, x0:x1b].reshape(-1).astype(np.float32) - if enc in ("16uc1", "mono16"): - pos2 = roi2[roi2 > 0] - if pos2.size >= 8: - med_raw = float(np.median(pos2)) - scale = 0.001 if 20.0 <= med_raw <= 8000.0 else (1.0 if med_raw < 20 else 0.0001) - meters2 = pos2 * scale - else: - meters2 = roi2 - vals = meters2[np.isfinite(meters2) & (meters2 > self.feature_min_range) & (meters2 < self.max_depth)] - if vals.size < 8: - med_m = float(np.median(meters)) if meters.size else 0.0 - return None, f"ok={vals.size} scale={scale} med={med_m:.3f}" - # 只取近表面:孔 / 桌面 / 远处背景绝不能把 Z 拉偏。 - # 先取最近的 40%,再围绕第 10 百分位保留一个 6 cm 的带宽。 - vals = np.sort(vals) - n_near = max(8, int(0.40 * vals.size)) - near = vals[:n_near] - z_p10 = float(np.percentile(near, 10)) - band = near[near <= (z_p10 + 0.06)] - if band.size < 4: - band = near - z = float(np.median(band)) - if z > self.work_z_max: - return None, f"ok={vals.size} far={z:.3f}" - return z, f"ok={vals.size} near={band.size}" - - def _adaptive_filter_z(self, z_raw: float, now: float) -> float: - """第 4 项:对深度做自适应低通滤波 —— 静止时更稳,运动时更灵敏。""" - if self._z_filt is None or self._z_filt_t is None: - self._z_filt = float(z_raw) - self._z_filt_t = now - return self._z_filt - dt = max(1e-3, float(now - self._z_filt_t)) - vel_z = abs(float(z_raw) - self._z_filt) / dt - alpha_z = float( - np.clip( - self.z_alpha_min + vel_z * self.z_alpha_gain, - self.z_alpha_min, - self.z_alpha_max, - ) - ) - self._z_filt = alpha_z * float(z_raw) + (1.0 - alpha_z) * self._z_filt - self._z_filt_t = now - return float(self._z_filt) - - def _pixel_to_cam(self, u: float, v: float, z: float) -> np.ndarray: - return np.array( - [ - (u - self._cx) * z / max(self._fx, 1.0), - (v - self._cy) * z / max(self._fy, 1.0), - z, - ], - dtype=float, - ) - - def _cam_to_pixel(self, p: np.ndarray) -> np.ndarray: - z = max(float(p[2]), 1e-3) - return np.array( - [ - self._fx * float(p[0]) / z + self._cx, - self._fy * float(p[1]) / z + self._cy, - ], - dtype=float, - ) - - def _publish_detection_clear(self) -> None: - """空检测 → 预览清掉绿框(绝不能复用上一次的 xyxy)。""" - self._last_det_payload = None - msg = Float32MultiArray() - msg.data = [] - self._det_pub.publish(msg) - - def _publish_detection_box( - self, xyxy: np.ndarray, conf: float, cls_id: float, uv: np.ndarray, z: float - ) -> None: - det = Float32MultiArray() - det.data = [ - float(xyxy[0]), float(xyxy[1]), float(xyxy[2]), float(xyxy[3]), - float(conf), float(cls_id), - float(uv[0]), float(uv[1]), float(z), - ] - self._last_det_payload = list(det.data) - self._det_pub.publish(det) - - def _republish_last_box(self) -> None: - if not self._last_det_payload: - return - msg = Float32MultiArray() - msg.data = list(self._last_det_payload) - self._det_pub.publish(msg) - - def _prepare_infer(self, bgr: np.ndarray) -> tuple: - """可选的 YOLO 降采样;返回 (infer_bgr, scale),全分辨率 = 推理图 * scale。""" - max_w = self.infer_max_width - h, w = bgr.shape[:2] - if max_w <= 0 or w <= max_w: - return bgr, 1.0 - scale = w / float(max_w) - new_w = int(max_w) - new_h = max(1, int(round(h / scale))) - try: - import cv2 - small = cv2.resize(bgr, (new_w, new_h), interpolation=cv2.INTER_AREA) - except Exception: # noqa: BLE001 - small = bgr - scale = 1.0 - return small, scale - - def _img_wh(self) -> Optional[tuple]: - msg = self._latest_image - if msg is None: - return None - return (int(msg.width), int(msg.height)) - - def _coast_box(self, note: str) -> bool: - """让绿框按上一次的速度继续移动;不要用它驱动三维。""" - now = time.monotonic() - pred = self._box_trk.predict(now, self._img_wh()) - if pred is None and self._last_raw_xyxy is not None: - pred = np.asarray(self._last_raw_xyxy, dtype=float).reshape(4) - if pred is None: - return False - uv = np.array( - [0.5 * (pred[0] + pred[2]), 0.5 * (pred[1] + pred[3])], dtype=float - ) - z = float(self._z_filt if self._z_filt is not None else self.z_ref) - self._publish_detection_box( - pred, float(self._last_box_conf), float(self._last_box_cls), uv, z - ) - self.get_logger().info(f"检测框惯滑 {note}", throttle_duration_sec=0.5) - return True - - def _clear_track(self) -> None: - self._box_ema = None - self._last_raw_xyxy = None - self._last_uv = None - self._kpt_box_frac = None - self._last_filt = None - self._last_plane_xyz = None - self._box_trk.reset() - # 两道有状态守卫跟着"真正丢目标"一起冷启动。**只在长丢时清**,不在单帧 - # 漏检时清:单帧漏检极常见(真机日志里几乎每隔一两帧就一次),每漏一帧 - # 就把锚点清空,会让下一帧的任何观测都变成"首次观测"而被 TrackSlewGuard - # 无条件放行 —— 借深度的假点于是每次都能重新锚定,守卫形同虚设。 - self._slew.reset() - self._far.reset() - self._last_yolo_t = None - self._publish_detection_clear() - - def _apply_detections(self, dets, scale: float, t_img: float) -> None: - """匹配 YOLO 结果,发布按当前时刻预测的检测框,再在该框上做立体匹配。""" - if scale != 1.0: - for d in dets: - d.xyxy = d.xyxy * scale - best_conf = best_det_conf(dets) - self._publish_wrist_conf(best_conf) - handoff = bool( - self.overhead_oneshot_enable - and ( - self.d435_move_only - or wrist_needs_handoff(best_conf, self.wrist_handoff_conf) - ) - ) - now_m = time.monotonic() - if self._d435_commanding: - # 臂还在赶 D435 那个点。漏检计时清掉,走到并停稳之后再重新计。 - self._low_since = None - self._need_oneshot = False - elif not handoff: - self._low_since = None - self._oneshot_shot = False - self._need_oneshot = False - else: - if oneshot_shot_timed_out( - shot=self._oneshot_shot, - commanding=self._d435_commanding, - age_s=now_m - float(self._oneshot_shot_t), - timeout_s=ONESHOT_ACCEPT_TIMEOUT_S, - ): - self.get_logger().warn( - "D435 拍了但伺服没接住(工作盒拒收等),允许再拍" - ) - self._oneshot_shot = False - self._low_since = None - if self._low_since is None: - self._low_since = now_m - low_for = now_m - self._low_since - self._need_oneshot = oneshot_should_submit( - handoff=True, - low_for_s=low_for, - already_shot=self._oneshot_shot, - wait_s=D405_MISS_BEFORE_D435_S, - ) - if self._oneshot_shot: - self.get_logger().info( - "D435 这一轮已经拍过一张,等这一段走完,不再连拍", - throttle_duration_sec=2.0, - ) - elif not self._need_oneshot: - self.get_logger().info( - f"D405 已连续 {low_for:.2f}s 没有高置信度目标," - f"未满 {D405_MISS_BEFORE_D435_S:.1f}s,D435 继续待命", - throttle_duration_sec=0.5, - ) - now = time.monotonic() - pred_at_img = self._box_trk.predict(t_img, self._img_wh()) - with self._lock: - prev_uv = None if self._last_uv is None else self._last_uv.copy() - prev_xyxy = pred_at_img if pred_at_img is not None else self._last_raw_xyxy - best = pick_best( - dets, - prefer_center=(self._cx, self._cy), - prev_uv=prev_uv, - prev_xyxy=prev_xyxy, - max_track_px=max(400.0, self.jump_px), - reacquire_conf=self.reacquire_conf, - min_conf=self.min_conf, - lock_iou=0.05, - ) - if best is None: - self._miss_count += 1 - # 单帧漏检**不清**守卫锚点(见 _clear_track 的注释):真机 2026-10-08 - # 漏检几乎每帧都有,一漏就 reset ⇒ 每帧都当"首次观测" ⇒ 借深度的假 k0 - # 次次都能重新锚定。真正丢目标由下面的 miss_clear_frames 长丢分支 - # 走 _clear_track(连丢 miss_clear_frames 帧才冷启动)。 - if self._miss_count >= self.miss_clear_frames: - self._clear_track() - self._last_yolo_t = None - self.get_logger().info( - "检测漏检 —— 已清除叠加显示", - throttle_duration_sec=1.0, - ) - else: - if not self._coast_box(f"miss={self._miss_count}"): - if self.overlay_hold_on_miss: - self._republish_last_box() - if ( - self.hold_point_on_miss - and self._miss_count <= self.miss_hold_point_frames - and not handoff - ): - self._republish_held_point() - return - - self._miss_count = 0 - self._last_yolo_t = now - xyxy_raw = np.asarray(best.xyxy, dtype=float).reshape(4) - a = self.box_ema_alpha - if self._box_ema is None: - self._box_ema = xyxy_raw.copy() - else: - self._box_ema = a * xyxy_raw + (1.0 - a) * self._box_ema - self._last_raw_xyxy = xyxy_raw.copy() - self._last_box_conf = float(best.conf) - self._last_box_cls = float(best.cls_id) - self._box_trk.update(xyxy_raw, t_img) - # 补偿推理延迟:画工件**当前**所在的位置,而不是 YOLO 看到它时的位置 - xyxy = self._box_trk.predict(now, self._img_wh()) - if xyxy is None: - xyxy = xyxy_raw - uv = np.array( - [0.5 * (xyxy[0] + xyxy[2]), 0.5 * (xyxy[1] + xyxy[3])], - dtype=float, - ) - box_uv = uv.copy() - z_preview = float(self._z_filt if self._z_filt is not None else self.z_ref) - self._publish_detection_box( - xyxy, float(best.conf), float(best.cls_id), box_uv, z_preview - ) - - # 悬停目标 = 检测框内工件表面的立体三维点(不是穿过孔 / 桌面的射线, - # 也不是 z_ref)。红点 = 该三维点。 - # 混合流程交回 D405 之后追工件框的矩形中心,不追 k0。 - # YOLO-pose 照常跑(框和关键点都在),只是跟踪点取框心。 - # 对小孔关键点在二阶段,那里不用深度图。 - track_box = self.overhead_oneshot_enable and not self.d435_move_only - feat = None - p_cam: Optional[np.ndarray] = None - note = "框心" if track_box else "box" - z_meas = None - uv = box_uv - # 本帧的深度是不是**借**来的(见 PlaneFeature.borrowed)—— 给"每帧位移上限" - # 守卫用:借来的深度意味着该像素读不到自己的深度,绝对位置不足以重定位。 - borrowed = False - if track_box: - feat = None - elif self.feature_mode == "keypoint": - feat = self._keypoint_feature(best) - # k0 掉信时 `_keypoint_feature` 会**按 k0 相对框的偏移**在框上重建跟踪点 - # (位置连续、不横移)。只有冷启动、连一次可信 k0 都没见过时才返回 None, - # 此时才退到"框内深度 + 框中心"。 - elif self.feature_mode != "box": - feat = self._workpiece_xyz(xyxy) - if feat is None: - feat = self._plane_center(xyxy) - if feat is not None: - p_cam = np.asarray(feat.xyz, dtype=float).reshape(3) - uv = np.asarray(feat.uv, dtype=float).reshape(2) - z_meas = float(p_cam[2]) - note = feat.note - borrowed = bool(getattr(feat, "borrowed", False)) - else: - z_meas, note = self._depth_in_box(xyxy) - note = f"框心 {note} box_z" if track_box else f"{note} box_z" - z_ok = z_meas is not None - z, note = self._metric_z(z_meas, note) - if z is None: - # 从未拿到过可用深度(目标超出 D405 量程 / 不在工作区内 / 相机安装或 - # 手眼标定有问题)。不要发布 z_ref 点 —— 那会在幻影位置上假装锁定夹爪。 - # 此时应保持不动。 - self.get_logger().warn( - f"目标没有可用深度({note})—— 不跟踪。" - f"请把工件放到相机视野内 {self.min_depth:.2f}-{self.work_z_max:.2f} m 处," - "或检查相机安装 / 手眼标定。", - throttle_duration_sec=1.0, - ) - return - now = time.monotonic() - z = self._adaptive_filter_z(float(z), now) - if p_cam is None: - p_cam = self._pixel_to_cam(box_uv[0], box_uv[1], float(z)) - stamp = self.get_clock().now().to_msg() - - self._publish_detection_box(xyxy, float(best.conf), float(best.cls_id), uv, float(z)) - - # ---- 守卫二:跟踪点的**每帧位移上限** ---- - # 工件不动、相机 30Hz,真实观测一帧走不了 4cm(实测真实运动 ≤15mm/帧)。 - # 观测可信 ⇒ 夹到上限限速跟随(不丢目标);观测是**借深度**的 ⇒ 超上限整帧 - # 不采信(2026-10-08 真机,假 k0 带着借来的深度、z 看着很合理,1s 把臂带走 - # 400mm)。判不采信时**不发跟踪点**,让伺服按"目标丢失"处理(原地不动)。 - step, why_step = self._slew.update( - np.asarray(p_cam, dtype=float).reshape(3)[:2], borrowed=borrowed - ) - if step is None: - self.get_logger().warn( - f"跟踪点判误检,本帧不发点({why_step})" - f" uv=({uv[0]:.0f},{uv[1]:.0f}) conf={best.conf:.2f}", - throttle_duration_sec=0.5, - ) - return - p_cam = np.asarray(p_cam, dtype=float).reshape(3).copy() - p_cam[0], p_cam[1] = float(step[0]), float(step[1]) - - with self._lock: - self.kf.advance(now) - if self.kf.initialized: - pred = self.kf.position - dpx = float(np.linalg.norm(box_uv - self._cam_to_pixel(pred))) - dz = abs(float(p_cam[2] - pred[2])) if z_ok else 0.0 - if dpx > self.jump_px or (z_ok and dz > self.jump_z_m): - # ---- 守卫三:远框"重新捕获"要多帧确认 ---- - # 一帧的远框更可能是模型在别的东西上误报,而不是工件真被挪走了 - #(真机那串假框的 dpx 是 480/418/207,而且每帧换个地方)。 - ok_far, why_far = self._far.allow( - None if self.feature_mode != "keypoint" else tuple(uv), - dpx, - near_px=self.reacquire_far_px, - ) - if not ok_far: - self.get_logger().warn( - f"重新捕获未确认({why_far})conf={best.conf:.2f} —— " - "本帧不发点,不追这一帧的新位置", - throttle_duration_sec=0.5, - ) - return - self.kf.reset(p_cam, now) - self.get_logger().info( - f"重新捕获 conf={best.conf:.2f} dpx={dpx:.0f}", - throttle_duration_sec=0.5, - ) - else: - self.kf.update(p_cam) - else: - self.kf.reset(p_cam, now) - self._last_uv = box_uv - kf_p = self.kf.position - blend = self.meas_blend - filt = blend * p_cam + (1.0 - blend) * kf_p - # 即使卡尔曼里还残留着旧的远距离 Z,也要保证 XY 的尺度真实 - z_use = float(np.clip(filt[2], self.min_depth, self.work_z_max)) - if abs(z_use - float(p_cam[2])) > 0.04: - filt = p_cam.copy() - z_use = float(p_cam[2]) - filt[2] = z_use - self._last_filt = filt.copy() - - if handoff or self._d435_commanding: - # 没有高置信度,或 D435 厂家移动还没交接:推理留着,控制点不许发。 - return - self._publish_point(filt, stamp) - self.get_logger().info( - f"跟踪 {'框心' if track_box else self.feature_mode} conf={best.conf:.2f} uv=({uv[0]:.0f},{uv[1]:.0f}) " - f"z={filt[2]:.3f} z_ok={int(z_ok)} {note}", - throttle_duration_sec=0.4, - ) - - def _depth_fresh(self, msg: Image) -> bool: - """拒绝过期的深度 —— 对快速运动的工件,当前检测框处的旧深度会读到背景 - (约 2.4 m 处的桌面),从而污染三维点。""" - try: - t = rclpy.time.Time.from_msg(msg.header.stamp) - age = (self.get_clock().now() - t).nanoseconds * 1e-9 - except Exception: # noqa: BLE001 - return True - return age < 0.25 - - def _keypoint_feature(self, det): - """用 pose 模型的 ``keypoint_index``(默认 k0)当跟踪点。 - - 约定:k0 是跟踪孔,k1/k2 是对孔(见 ``pose_detector``)。 - 返回 ``PlaneFeature``,坐标系 / 语义和 plane 模式完全一致 —— 下游 - (卡尔曼、visual_servo)不需要知道这是关键点。 - - k0 掉信(置信度低 / 该处没深度)时**不许把跟踪点横移到框中心** —— - 那是另一个点,会瞬间平移一大截。正确做法是用 k0 相对工件框的**归一化偏移** - 在框上重建 k0:位置连续,工件动时还能跟着动。 - - 真机反例(2026-10-08,一阶段跑 150s 没锁上,arm 89): - - 0659.551 死区保持 |e_xy|=3.0mm ← 其实已经锁定(误差 3mm) - 0659.598 k0 置信度 0.01 < 0.30,本帧不用它 - 0659.604 feat_base=(0.675,-0.099) ← 兜底切到框中心,跟踪点横移 89mm - 0660.121 v=(-0.206,+0.400) ← 伺服以 0.45m/s 去追这个假点 - 0660.561 过期保持 —— 不跟踪冻结的检测框 ← 画面糊掉,彻底丢失 - - 只有在"连一次可信的 k0 都没见过"(``_kpt_box_frac`` 为空)时才返回 None, - 交给调用方回落到框中心 —— 那是冷启动,没有更好的信息可用。 - """ - kpts = getattr(det, "kpts", None) - if kpts is None: - return None - kpts = np.asarray(kpts, dtype=float) - if kpts.ndim != 2 or kpts.shape[0] <= self.keypoint_index or kpts.shape[1] < 3: - return None - u, v, kc = (float(x) for x in kpts[self.keypoint_index][:3]) - - # 工件框(用来把 k0 的偏移归一化,以及掉信时重建) - box = getattr(det, "xyxy", None) - box = None if box is None else np.asarray(box, dtype=float).reshape(4) - cx = cy = bw = bh = None - if box is not None: - cx = 0.5 * (box[0] + box[2]) - cy = 0.5 * (box[1] + box[3]) - bw = abs(box[2] - box[0]) - bh = abs(box[3] - box[1]) - - finite = bool(np.isfinite(u) and np.isfinite(v) and np.isfinite(kc)) - # k0 的**像素位置**是否可信:置信度够 ≠ 位置对。2026-10-08 真机,模型在 - # uv=(12,30)/(76,75)/(143,92) 这些**贴画面边**的地方以 conf 0.53~0.73 报 k0 - #(真 k0 是 0.87,没有可分区间)—— 孔心长在工件上,不可能在画面边上。 - # 位置不可信不是"没有目标",而是"本帧 k0 位置不能用",交回下面的连续性路径。 - why_pos = ( - kpt_plausible( - u, v, box, *self._img_wh_or_zero(), border_px=self.keypoint_border_px - ) - if finite - else None - ) - borrowed = False - if finite and kc >= self.keypoint_min_conf and why_pos is None: - # k0 可信:位置就用 k0 自己 - uv = np.array([u, v], dtype=float) - z, znote = self._depth_at_uv(u, v) - if z is None: - # 位置可信、只是深度读不到:XY 仍然用 k0(不许横移),只借深度 - if box is None: - return None - z, note2 = self._depth_in_box(box) - if z is None: - return None - znote = f"{note2} 借深度" - borrowed = True - if box is not None and bw is not None and bw > 1e-6 and bh > 1e-6: - self._kpt_box_frac = np.array( - [(u - cx) / bw, (v - cy) / bh], dtype=float - ) - reason = "" - else: - # k0 不可信:按"相对框的偏移"重建,位置连续、且跟着框走。 - if not finite: - reason = "非有限值" - elif why_pos is not None: - # 置信度够但**位置**不合理(贴画面边 / 不在自己的框里) - reason = why_pos - else: - reason = f"置信度 {kc:.2f} < {self.keypoint_min_conf:.2f}" - if ( - self._kpt_box_frac is None - or box is None - or bw is None - or bw <= 1e-6 - or bh is None - or bh <= 1e-6 - ): - self.get_logger().warn( - f"k{self.keypoint_index} {reason},且还没有可信历史 —— 本帧不用它", - throttle_duration_sec=1.0, - ) - return None - uv = np.array( - [cx + float(self._kpt_box_frac[0]) * bw, - cy + float(self._kpt_box_frac[1]) * bh], - dtype=float, - ) - z, znote = self._depth_at_uv(float(uv[0]), float(uv[1])) - if z is None: - z, note2 = self._depth_in_box(box) - if z is None: - return None - znote = f"{note2} 借深度" - borrowed = True - self.get_logger().warn( - f"k{self.keypoint_index} {reason} —— 按框上相对偏移重建跟踪点" - f"(uv=({uv[0]:.0f},{uv[1]:.0f}),框心=({cx:.0f},{cy:.0f})),不横移", - throttle_duration_sec=1.0, - ) - z = float(z) - return PlaneFeature( - uv=uv, - z=z, - xyz=self._pixel_to_cam(float(uv[0]), float(uv[1]), z), - n_inliers=1, - note=f"k{self.keypoint_index}保持({reason}) {znote} z={z:.3f}", - borrowed=borrowed, - ) - - z = float(z) - return PlaneFeature( - uv=uv, - z=z, - xyz=self._pixel_to_cam(float(uv[0]), float(uv[1]), z), - # 关键点特征没有"平面内点"的概念——支撑样本就它自己一个。 - # 这个字段目前没有下游消费者,给 1 是为了让日志里 n=1 说得通。 - n_inliers=1, - note=f"k{self.keypoint_index}({znote}) z={z:.3f}", - borrowed=borrowed, - ) - - def _img_wh_or_zero(self) -> tuple: - """当前彩色图 ``(w,h)``;还没收到图时给 ``(0,0)``(守卫会跳过边缘判据)。""" - wh = self._img_wh() - return (0, 0) if wh is None else (int(wh[0]), int(wh[1])) - - def _depth_at_uv(self, u: float, v: float) -> tuple: - """取 (u,v) 附近小窗口的中位深度(米)。``u,v`` 是**彩色图**像素。 - - 深度是 aligned-to-color,但分辨率不一定等于彩色图(D405 的 aligned - 深度会和彩色图不同尺寸),所以先按比例映射到深度图坐标 —— 这点和 - ``_depth_in_box`` 里的缩放保持一致,否则关键点深度会整体偏。 - """ - msg = self._latest_depth - if msg is None: - return None, "无深度" - if not self._depth_fresh(msg): - return None, "深度过期" - buf = self._decode_depth_m(msg) - if buf is None: - return None, "深度无效" - h, w = buf.shape - img = self._latest_image - if img is not None and (int(img.width) != w or int(img.height) != h): - u = u * (w / float(img.width)) - v = v * (h / float(img.height)) - win = self.keypoint_win_px - x0 = int(np.clip(round(u) - win, 0, w - 1)) - x1 = int(np.clip(round(u) + win, x0 + 1, w)) - y0 = int(np.clip(round(v) - win, 0, h - 1)) - y1 = int(np.clip(round(v) + win, y0 + 1, h)) - roi = buf[y0:y1, x0:x1].reshape(-1).astype(np.float32) - if roi.size == 0: - return None, "窗口越界" - enc = (msg.encoding or "").lower() - if enc in ("16uc1", "mono16"): - pos = roi[roi > 0] - if pos.size < 4: - return None, "该处无有效深度" - med = float(np.median(pos)) - # 和 _depth_in_box 同一套量纲判断(有的相机给 mm,有的给 m) - scale = 0.001 if 20.0 <= med <= 8000.0 else (1.0 if med < 20 else 0.0001) - z = med * scale - else: - vals = roi[np.isfinite(roi) & (roi > 0)] - if vals.size < 4: - return None, "该处无有效深度" - z = float(np.median(vals)) - if not (self.feature_min_range < z < self.max_depth): - # 太近 ⇒ 十有八九是爪上夹的通止规(规尖在相机前 ~0.10m,工件面 0.17~0.22m)。 - # 当"这里没有目标"处理,绝不把它当工件去伺服 —— 否则臂会去追自己的工具。 - return None, f"深度 {z:.3f}m 命中工具量程(<{self.feature_min_range:.2f}m)" - return z, f"({u:.0f},{v:.0f})" - - def _workpiece_xyz(self, xyxy): - msg = self._latest_depth - img = self._latest_image - if msg is None or img is None: - return None - if not self._depth_fresh(msg): - return None - buf = self._decode_depth_m(msg) - if buf is None: - return None - try: - return workpiece_xyz_in_box( - buf, - msg.encoding or "", - xyxy, - self._fx, - self._fy, - self._cx, - self._cy, - (int(img.width), int(img.height)), - min_depth=self.feature_min_range, # 太近=爪上工具,见 feature_min_range_m - max_depth=self.max_depth, - work_z_max=self.work_z_max, - band_m=self.plane_band_m, - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"inner3d 特征计算失败:{exc}", throttle_duration_sec=2.0) - return None - - def _plane_center(self, xyxy): - msg = self._latest_depth - img = self._latest_image - if msg is None or img is None: - return None - if not self._depth_fresh(msg): - return None - buf = self._decode_depth_m(msg) - if buf is None: - return None - try: - return geometric_center_on_plane( - buf, - msg.encoding or "", - xyxy, - self._fx, - self._fy, - self._cx, - self._cy, - (int(img.width), int(img.height)), - min_depth=self.feature_min_range, # 太近=爪上工具,见 feature_min_range_m - max_depth=self.max_depth, - work_z_max=self.work_z_max, - inlier_m=self.plane_inlier_m, - band_m=self.plane_band_m, - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"平面特征计算失败:{exc}", throttle_duration_sec=2.0) - return None - - def _metric_z(self, z_meas: Optional[float], note: str) -> tuple: - """用于像素→米的 Z。绝不能用孔 / 地面的深度(会放大 XY 误差)。 - 当这个目标**从未**有过可用深度时返回 (None, note) —— 那种情况下发布 - z_ref 点会让伺服假锁到一个幻影 XY 上。""" - z_ref = max(0.12, float(self.z_ref)) - if z_meas is not None and self.min_depth <= z_meas <= self.work_z_max: - self._last_good_z = float(z_meas) - return float(z_meas), note - if self._last_good_z is not None and self._last_good_z <= self.work_z_max: - return float(self._last_good_z), f"{note} hold_near" - return None, f"{note} no_depth" - - def _publish_wrist_conf(self, best_conf: Optional[float]) -> None: - msg = Float32() - msg.data = float("nan") if best_conf is None else float(best_conf) - self._wrist_conf_pub.publish(msg) - - def _on_z_locked(self, msg: Bool) -> None: - """锁高状态只记着。拍不拍 D435 不看它,看 D405 连续漏检。""" - self._z_locked = bool(msg.data) - - def _on_d435_commanding(self, msg: Bool) -> None: - """伺服还在执行 D435 那一个点时,不再提交下一张,D405 控制点也不发。 - - 这一轮已经拍过并走完。停稳后打开 D405 框心,不因交接瞬间漏检再 MoveL。 - """ - self._d435_commanding = bool(msg.data) - - def _publish_overhead_k0(self, p_base: np.ndarray, is_k0: bool) -> None: - pt = PointStamped() - pt.header.stamp = self.get_clock().now().to_msg() - pt.header.frame_id = self.base_frame or "base" - pt.point.x = float(p_base[0]) - pt.point.y = float(p_base[1]) - pt.point.z = float(p_base[2]) - self._overhead_k0_pub.publish(pt) - del is_k0 # 语义写在日志里;话题保持 PointStamped,避免再抄一份类型 - - def _should_submit_overhead_viz(self) -> bool: - """低频率给 D435 窗刷绿框;不发控制点。赶路时不抢 GPU。""" - if not self.overhead_oneshot_enable or self.d435_move_only: - return False - if self._d435_commanding or self._need_oneshot: - return False - return (time.monotonic() - self._oh_viz_t) >= 0.5 - - def _publish_overhead_det( - self, xyxy: np.ndarray, conf: float, cls_id: float, uv: np.ndarray, z: float - ) -> None: - det = Float32MultiArray() - det.data = [ - float(xyxy[0]), float(xyxy[1]), float(xyxy[2]), float(xyxy[3]), - float(conf), float(cls_id), - float(uv[0]), float(uv[1]), float(z), - ] - self._oh_det_pub.publish(det) - - def _publish_overhead_det_clear(self) -> None: - msg = Float32MultiArray() - msg.data = [] - self._oh_det_pub.publish(msg) - - def _submit_overhead_oneshot(self, *, viz_only: bool = False) -> None: - """把最新 D435 帧排进同一条 YOLO 队列。不在这里等结果 —— 等会把 D405 卡死。""" - if self._oneshot_inflight or not self.overhead_oneshot_enable: - return - now = time.monotonic() - if (not viz_only) and now - self._oneshot_t < self.overhead_cooldown_s: - return - img = self._oh_image - depth = self._oh_depth - if img is None or depth is None: - if not viz_only: - self.get_logger().warn( - "D405 无合格目标,但 D435 还没出图 —— 不编造点", - throttle_duration_sec=1.0, - ) - return - if (now - self._oh_image_mono) > self.overhead_frame_max_age_s: - if not viz_only: - self.get_logger().warn( - f"D435 彩图过期 {(now - self._oh_image_mono)*1000:.0f}ms —— 不反投影", - throttle_duration_sec=1.0, - ) - return - if (not viz_only) and (now - self._oh_depth_mono) > self.overhead_frame_max_age_s: - self.get_logger().warn( - f"D435 深度过期 {(now - self._oh_depth_mono)*1000:.0f}ms —— 不反投影", - throttle_duration_sec=1.0, - ) - return - if (not viz_only) and self._oh_fx <= 1.0: - self.get_logger().warn( - "D435 内参还没到(camera_info)—— 不反投影", - throttle_duration_sec=1.0, - ) - return - if (not viz_only) and self._T_oh is None: - self.get_logger().error("眼在手外 T 没加载 —— 一次性定位拒绝") - return - seq = _ONESHOT_VIZ_SEQ if viz_only else _ONESHOT_SEQ - try: - bgr = _bgr_copy(img) - small, scale = self._prepare_infer(bgr) - self._infer_meta[seq] = scale - if not self.detector.submit(small, seq): - return - except Exception as exc: # noqa: BLE001 - self.get_logger().warn( - f"D435 {'预览' if viz_only else '一次性'}提交失败:{exc}", - throttle_duration_sec=2.0, - ) - return - self._oneshot_inflight = True - self._oneshot_viz_only = bool(viz_only) - self._oneshot_img = img - self._oneshot_depth = depth - if viz_only: - self._oh_viz_t = now - else: - self.get_logger().info("D435 一次性已提交(不打断 D405 队列)") - - def _finish_overhead_oneshot( - self, dets, scale: float, *, viz_only: bool = False - ) -> None: - """YOLO 返回的顶视结果。viz_only 只刷绿框;控制路径才发基座点。""" - self._oneshot_inflight = False - viz_only = bool(viz_only or self._oneshot_viz_only) - self._oneshot_viz_only = False - now = time.monotonic() - if not viz_only: - self._oneshot_t = now - img = self._oneshot_img - depth = self._oneshot_depth - self._oneshot_img = None - self._oneshot_depth = None - if dets is INFER_BUSY or dets is None or img is None: - return - if scale != 1.0: - for d in dets: - d.xyxy = d.xyxy * scale - if getattr(d, "kpts", None) is not None: - d.kpts = np.asarray(d.kpts, dtype=float).copy() - d.kpts[:, :2] *= scale - det = select_oneshot_det(dets, self.overhead_oneshot_conf if not viz_only else 0.25) - if det is None: - self._publish_overhead_det_clear() - if not viz_only: - self._oneshot_t = now - self.get_logger().warn( - f"D435 一次性:画面里没有 conf≥{self.overhead_oneshot_conf:.2f} 的工件", - throttle_duration_sec=1.0, - ) - return - xyxy = np.asarray(det.xyxy, dtype=float).reshape(4) - uv = np.array( - [0.5 * (xyxy[0] + xyxy[2]), 0.5 * (xyxy[1] + xyxy[3])], dtype=float - ) - self._publish_overhead_det( - xyxy, float(det.conf), float(det.cls_id), uv, 0.0 - ) - if viz_only: - return - if depth is None: - self._oneshot_t = now - return - raw = self._decode_depth_m(depth) - depth_m = depth_raw_to_m(raw, depth.encoding or "") - if depth_m is None: - self._oneshot_t = now - self.get_logger().warn( - "D435 深度无法转成米 —— 不发点", throttle_duration_sec=1.0 - ) - return - color_wh = (int(img.width), int(img.height)) - depth_wh = (int(depth_m.shape[1]), int(depth_m.shape[0])) - got = oneshot_k0_base( - det, - depth_m, - fx=self._oh_fx, - fy=self._oh_fy, - cx=self._oh_cx, - cy=self._oh_cy, - T_cam_to_base=self._T_oh, - min_z_m=self.overhead_min_depth, - max_z_m=self.overhead_max_depth, - kpt_index=self.keypoint_index, - kpt_min_conf=self.keypoint_min_conf, - min_det_conf=self.overhead_oneshot_conf, - color_wh=color_wh, - depth_wh=depth_wh, - ) - self._oneshot_t = now - if got is None: - self.get_logger().warn( - "D435 一次性:深度或 k0 不可用,不发点", - throttle_duration_sec=1.0, - ) - return - p_base, is_k0 = got - self._oneshot_shot = True - self._oneshot_shot_t = now - self._need_oneshot = False - self._publish_overhead_k0(p_base, is_k0) - self.get_logger().info( - f"D435 一次性定位 {'k0' if is_k0 else '框心(顶视看不见 k0)'} " - f"base=({p_base[0]:.3f},{p_base[1]:.3f},{p_base[2]:.3f}) " - f"conf={float(det.conf):.2f}" - ) - - def _publish_point(self, filt: np.ndarray, stamp) -> None: - pt = PointStamped() - pt.header.stamp = stamp - pt.header.frame_id = self.camera_frame - pt.point.x = float(filt[0]) - pt.point.y = float(filt[1]) - pt.point.z = float(filt[2]) - self._point_pub.publish(pt) - tf = TransformStamped() - tf.header.stamp = stamp - tf.header.frame_id = self.camera_frame - tf.child_frame_id = self.object_frame - tf.transform.translation.x = float(filt[0]) - tf.transform.translation.y = float(filt[1]) - tf.transform.translation.z = float(filt[2]) - tf.transform.rotation.w = 1.0 - self._tf_br.sendTransform(tf) - - def _republish_held_point(self) -> None: - if self._last_filt is None: - return - self._publish_point(self._last_filt, self.get_clock().now().to_msg()) - - -def main(args=None) -> None: - import multiprocessing as mp - - try: - mp.set_start_method("spawn", force=True) - except RuntimeError: - pass - rclpy.init(args=args) - node = PerceptionNode() - executor = MultiThreadedExecutor(num_threads=4) - executor.add_node(node) - try: - executor.spin() - except KeyboardInterrupt: - pass - finally: - node._stop.set() - node._wake.set() - if getattr(node, "_yolo_proc", None) is not None: - node._yolo_proc.close() - node._yolo_proc = None - executor.shutdown() - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/pid_controller.py b/install/arm_application/lib/python3.11/site-packages/arm_application/pid_controller.py deleted file mode 100644 index 5819675..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/pid_controller.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 -"""PID 控制器,带积分限幅、微分作用于测量值(derivative-on-measurement)以及积分分离。""" - -from __future__ import annotations - -from typing import Optional - - -class PidController: - """``u = Kp e + Ki ∫e + Kd (−dmeas/dt)``,然后再做饱和限幅。 - - 积分分离:当 ``|error| > i_sep_thresh`` 时,积分被强制置 0 且不再累积 - (只用 P+D,以便快速追赶 / 减少超调)。 - """ - - def __init__( - self, - kp: float, - ki: float, - kd: float, - *, - i_limit: float = 0.05, - out_limit: float = 0.20, - i_sep_thresh: float = 0.005, - ) -> None: - self.kp = float(kp) - self.ki = float(ki) - self.kd = float(kd) - self.i_limit = abs(float(i_limit)) - self.out_limit = abs(float(out_limit)) - self.i_sep_thresh = abs(float(i_sep_thresh)) - self._i = 0.0 - self._meas_prev: Optional[float] = None - - def reset(self) -> None: - self._i = 0.0 - self._meas_prev = None - - @property - def integral(self) -> float: - return float(self._i) - - def update(self, error: float, meas: float, dt: float) -> float: - dt = max(float(dt), 1e-4) - err = float(error) - x = float(meas) - if self._meas_prev is None: - dterm = 0.0 - else: - dterm = -(x - self._meas_prev) / dt - self._meas_prev = x - - # 积分分离 —— 误差较大:清空 I,不再累积 - if self.i_sep_thresh > 0.0 and abs(err) > self.i_sep_thresh: - self._i = 0.0 - else: - self._i = max(-self.i_limit, min(self.i_limit, self._i + err * dt)) - - u = self.kp * err + self.ki * self._i + self.kd * dterm - if u > self.out_limit: - u = self.out_limit - elif u < -self.out_limit: - u = -self.out_limit - return float(u) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/pipeline_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/pipeline_node.py deleted file mode 100644 index a27c828..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/pipeline_node.py +++ /dev/null @@ -1,521 +0,0 @@ -#!/usr/bin/env python3 -"""三阶段串联:视觉跟踪锁定 → 孔定位 → 搜孔并轻轻按压(默认不拧入)。 - -流畅性(相对 bash 杀进程再起节点): - - 相机 / 触觉 / 手眼 TF 全程只起一次 - - 一阶段锁定后 SIGTERM 跟踪节点,立刻 pin 当前关节,不回零、不抬臂 - - 二阶段已垂直 / 已在悬停高则跳过对应动作;对准完立刻下压搜孔 - - 找到孔位后力闭环轻压保持;拧入是后续阶段(--depth 才插入) -""" - -from __future__ import annotations - -import json -import os -import signal -import subprocess -import time -from pathlib import Path -from typing import Optional - -import numpy as np -import rclpy -from geometry_msgs.msg import PointStamped -from rclpy.qos import HistoryPolicy, QoSProfile, ReliabilityPolicy -from std_msgs.msg import Bool, String - -from arm_application.overhead_oneshot import D435_MOVEL_GAVE_UP -from arm_application.stage3_search_node import Stage3Search - - -#: 悬停时规尖离面不够,跟踪高再抬的量 [m]。 -#: -#: 只在「悬停高上规尖离工件面 < :data:`TRACK_LOCK_GAP_M`」时加上。仿真悬停按 -#: 工具几何只留约 2mm,不抬就会在跟踪时刮到工件。真机 89 悬停 0.320 时规尖 -#: 已经在面上方约 75mm,再抬 50mm 会让对孔前先改一次高度(0.37→0.32)。 -#: -#: ⚠️ 抽成常量是因为它不只被流程用:``scripts/check_sim_scene.py`` 要用它核对 -#: "跟踪高有没有超出工作盒上界"(仿真里悬停 0.632 + 0.05 = 0.682 > 真机那套 -#: 0.65 上界,就是被这条查出来的)。两处各写一个字面量迟早漂移。 -TRACK_CLEARANCE_M = 0.05 -#: 悬停时规尖离面已经不少于这个值 [m],一阶段就锁在悬停高,对孔完成后再下降。 -TRACK_LOCK_GAP_M = 0.040 - - -def init_z_refusal( - z_m: float, - tool_len_m: float, - surface_z_m: float, - gap_m: float, - z_min: float, - z_max: float, -) -> str: - """初始法兰高度能不能用。空串表示可以;非空就是拒绝原因,不许悄悄抬高。""" - z = float(z_m) - if z < float(z_min) - 1e-6 or z > float(z_max) + 1e-6: - return ( - f"初始法兰 Z {z:.3f}m 超出工作盒 [{float(z_min):.3f}, {float(z_max):.3f}]," - "拒绝开跑" - ) - tool = float(tool_len_m) - surf = float(surface_z_m) - if tool <= 0.0 or surf <= 0.0: - return "写了初始高度,但工具长度或工件面未知,无法确认尖端在面之上,拒绝开跑" - clear = z - tool - surf - if clear < float(gap_m) - 0.001: - return ( - f"初始法兰 Z {z:.3f}m 会让工具尖进入工件:" - f"尖端 {z - tool:.3f},工件面 {surf:.3f}," - f"间隙 {clear * 1000:.1f}mm,要求 ≥ {float(gap_m) * 1000:.1f}mm。" - "拒绝开跑,不会悄悄抬高。" - ) - return "" - - -def hold_at_insert_z(final, *, skip3: bool) -> bool: - """贴面已经按 ``final_gap_mm`` 停下时,不再进三阶段。 - - 三阶段开局会抬到悬高上方测触觉,再落回 ``hole_hover_z_m``。 - 没有接触传感器。到位高度就是这次的贴面间隙,不另设一个 Z。 - """ - if skip3: - return True - if not isinstance(final, dict): - return False - return bool(final.get("insert_held")) - - -def track_lock_z(hover_z: float, tool_len_m: float, surface_z_m: float) -> float: - """一阶段锁高。 - - 悬停时规尖离面已经 ≥ ``TRACK_LOCK_GAP_M``:锁在悬停高,跟踪和对孔都不改 Z, - 对孔完成后再下降。离面不够(仿真悬停只留 2mm):再抬 ``TRACK_CLEARANCE_M``, - 否则跟踪会刮到工件。工具长或工件面缺失时抬升 —— 缺数时锁在悬停高等于没检查。 - """ - tool = float(tool_len_m) - surf = float(surface_z_m) - hover = float(hover_z) - if tool > 0.0 and surf > 0.0 and (hover - tool - surf) >= TRACK_LOCK_GAP_M: - return hover - return hover + TRACK_CLEARANCE_M - - -def stage1_log_fatal(log_path: str) -> str: - """一阶段日志里已经写明失败时,不许再空等锁定。空串 = 还没到这一步。""" - try: - text = Path(log_path).read_text(encoding="utf-8", errors="replace") - except OSError: - return "" - if D435_MOVEL_GAVE_UP in text: - return ( - f"D435 {D435_MOVEL_GAVE_UP}(RDK 控制模式没切到 primitive)," - f"一阶段中止。不是视野/标定。看 {log_path}" - ) - return "" - - -def stage1_timeout_reason(points_seen: int, timeout_s: float, log_path: str) -> str: - """一阶段超时了,到底是"感知没给点"还是"给了点但没收敛"。 - - 这两种情况的排查方向完全相反,而现象长得一模一样(都是"没锁定"): - - * **一个点都没收到** → 感知侧的事:yolo 后端多半缺 ultralytics/torch、 - truth 后端真值节点没起来、external 后端没人发。跟标定、跟工件在不在 - 视野里**都没关系**。 - * **收到了点但没收敛** → 控制/几何侧的事:工件不在视野、手眼不对、 - 目标超出工作空间、增益太小。 - - 以前两种情况共用一句"没锁定(视野里没工件?)",于是"perception_node - 因为缺依赖早退了"被读成"算法不收敛",白查半天。 - """ - fatal = stage1_log_fatal(log_path) - if fatal: - return fatal - if points_seen <= 0: - return ( - f"一阶段 {timeout_s:.0f}s 没锁定:**一个视觉目标点都没收到**" - "(visual_servo/filtered_point 上 0 条)—— 这是感知没起来," - "不是标定/视野问题。按 perception.source 对号入座:\n" - " yolo → 多半缺推理依赖(ultralytics/torch)," - f"看感知进程退出前几行:{log_path}\n" - " truth → 仿真真值节点没起来,或场景/物体名读不出来" - "(它退出前会打印原因)\n" - " external → 外部节点没按这个话题/这个类型发" - ) - return ( - f"一阶段 {timeout_s:.0f}s 没锁定(收到 {points_seen} 个目标点但没收敛):" - f"工件不在视野 / 手眼不对 / 目标超出工作空间。看 {log_path}" - ) - - -class AssemblyPipeline(Stage3Search): - def __init__(self, node_name: str = "assembly_pipeline") -> None: - # node_name 可覆盖:通止规装配(gauge_assembly_node)继承本类以复用 - # 一阶段跟踪的拉起/拆分与二阶段定位链,但它是**另一条流程**, - # 在图上必须是另一个节点名(否则 ros2 node list 里两个同名的节点, - # 出问题时连"是哪条流程在发指令"都分不清)。 - super().__init__(node_name=node_name) - self.declare_parameter("skip_stage1", False) - self.declare_parameter("skip_stage2", False) - self.declare_parameter("skip_stage3", False) # 默认搜孔+轻压;拧入靠 --depth - self.declare_parameter("d435_move_only", False) - self.declare_parameter("init_z_m", -1.0) # >0:启动后先到这个法兰高度 - self.declare_parameter("stage1_timeout_sec", 150.0) - self.linger3 = 1.2 # 串联结束短保持;单独跑 stage3 仍用 site linger_sec - - self._s1: Optional[subprocess.Popen] = None - self._locked = False - self.create_subscription(Bool, "/visual_servo/locked", self._on_lock, 10) - # 诊断用:一阶段超时时靠它区分"感知没给点"和"给了点没收敛"。 - # 只计数,不参与控制 —— 它绝不能影响流程本身的判断。 - # - # ⚠️ QoS 必须与感知发布端**逐项一致**(BEST_EFFORT + KEEP_LAST(5), - # 见 perception_node / sim_truth_perception)。用默认的 RELIABLE 订阅 - # BEST_EFFORT 的话题:不报错、话题列表里也在,但**一条都收不到** —— - # 于是超时归因会一口咬定"感知没起来",把人往完全错误的方向带 - #(真实原因可能只是这里 QoS 不匹配)。这类"诊断自己坏了"最难查, - # 所以宁可多写这几行。 - self.declare_parameter("diag_point_topic", "visual_servo/filtered_point") - self._diag_point_topic = str(self.get_parameter("diag_point_topic").value) - self._point_msgs = 0 - self.create_subscription( - PointStamped, - self._diag_point_topic, - self._on_point_seen, - QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.BEST_EFFORT, - ), - ) - self._pipe_pub = self.create_publisher(String, "/pipeline/state", 10) - self._pipe_result = self.create_publisher(String, "/pipeline/result", 10) - - skip1 = bool(self.get_parameter("skip_stage1").value) - skip2 = bool(self.get_parameter("skip_stage2").value) - skip3 = bool(self.get_parameter("skip_stage3").value) - self.d435_move_only = bool(self.get_parameter("d435_move_only").value) - self.get_logger().info( - f"pipeline arm_ee={self.ee_frame} hole={self.target_hole} " - f"skip1={skip1} skip2={skip2} skip3={skip3} " - f"d435_only={self.d435_move_only} insert={self.insert_depth_mm:.1f}mm" - ) - - def _state(self, s: str) -> None: - self.get_logger().info(f"[pipeline] === {s} ===") - msg = String() - msg.data = s - self._state_pub.publish(msg) - self._pipe_pub.publish(msg) - - def _on_lock(self, msg: Bool) -> None: - if bool(msg.data): - self._locked = True - - def _on_point_seen(self, _msg: PointStamped) -> None: - """只记"收到过目标点",用于超时后的归因(见 stage1_timeout_reason)。""" - self._point_msgs += 1 - - def _kill_old_stage1(self) -> None: - for pat in ( - "visual_servo.launch", - "lib/arm_application/servo_node", - "lib/arm_application/perception_node", - ): - subprocess.call(["pkill", "-f", pat], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - time.sleep(0.25) - - def _stop_stage1(self) -> None: - proc = self._s1 - self._s1 = None - if proc is None: - self._kill_old_stage1() - return - if proc.poll() is None: - try: - os.killpg(proc.pid, signal.SIGTERM) - except Exception: - proc.terminate() - try: - proc.wait(timeout=4.0) - except Exception: - try: - os.killpg(proc.pid, signal.SIGKILL) - except Exception: - proc.kill() - self._kill_old_stage1() - - def _track_z(self) -> float: - """一阶段锁高。写了 ``init_z_m`` 就用它,否则见 :func:`track_lock_z`。""" - z = float(self.get_parameter("init_z_m").value) - if z > 0.0: - return z - return track_lock_z( - float(self.hover_z), - float(getattr(self, "tool_tip_below_flange_m", 0.0) or 0.0), - float(getattr(self, "surface_z_m", 0.0) or 0.0), - ) - - def _ensure_clearance(self) -> bool: - """没写初始高度:只在低于锁高时抬上去。写了:升或降到那个法兰 Z,不安全就拒绝。""" - user = float(self.get_parameter("init_z_m").value) > 0.0 - q, Tee = self._wait_state(4.0) - if q is None or Tee is None: - if user: - self.get_logger().error("设了 --init-z,但拿不到当前位姿,拒绝开跑") - return False - return True - tz = self._track_z() - if user: - why = init_z_refusal( - tz, - float(getattr(self, "tool_tip_below_flange_m", 0.0) or 0.0), - float(getattr(self, "surface_z_m", 0.0) or 0.0), - float(self.final_gap_m), - float(self.ws_min[2]), - float(self.ws_max[2]), - ) - if why: - self.get_logger().error(why) - return False - z = float(Tee[2, 3]) - if user: - if abs(z - tz) <= 0.008: - self.get_logger().info(f"已在初始高度 Z={z:.3f}m(目标 {tz:.3f})") - return True - elif z >= tz - 0.008: - return True - self._state("pre_lift") - self.get_logger().info(f"先到初始高度:Z {z:.3f} → {tz:.3f}m") - ok, q, Tee = self._goto( - q, Tee, np.array([float(Tee[0, 3]), float(Tee[1, 3]), tz]), - verticalize=True, tol_m=0.003, tol_tilt=self.vert_tol_rad * 2.0, - tag="pre_lift", v=self.move_speed, max_hops=8, hold_xy=True, settle_s=0.25, - ) - q2 = self._q() - self._pin(q2 if q2 is not None else q) - z2 = float(Tee[2, 3]) - if user and (not ok or abs(z2 - tz) > 0.008): - self.get_logger().error(f"初始高度没到位:Z={z2:.3f},目标 {tz:.3f}") - return False - return True - - def _run_stage1(self) -> int: - """拉起 perception+servo,等到 /visual_servo/locked 后冻结并拆跟踪。""" - if not self._ensure_clearance(): - return 2 - self._state("stage1_track") - self._kill_old_stage1() - self._locked = False - log_path = "/tmp/pipeline_stage1.log" - logf = open(log_path, "w", encoding="utf-8") - lock_z = self._track_z() - # use_sim_time 必须**原样传下去**:本节点在仿真里是 true,子 launch 若是 - # false,perception/servo 就跑在系统时间上,TF 全是仿真时刻的戳 → - # "看得见图、算得出点,就是查不到变换",一阶段永远不收敛。 - use_sim = bool(self.get_parameter("use_sim_time").value) - cmd = [ - "ros2", "launch", "arm_application", "visual_servo.launch.py", - "enable_control:=true", - "publish_handeye_tf:=false", - f"ee_z_m:={lock_z:.3f}", - f"use_sim_time:={str(use_sim).lower()}", - f"d435_move_only:={str(self.d435_move_only).lower()}", - ] - if self.d435_move_only: - self.get_logger().info( - f"启动 D435 位移测试(锁高 {lock_z:.3f}m,到位后不交 D405、不进二阶段)" - ) - else: - self.get_logger().info( - f"启动一阶段跟踪(锁高 {lock_z:.3f}m,锁定后自动交二阶段)" - ) - self._s1 = subprocess.Popen( - cmd, stdout=logf, stderr=subprocess.STDOUT, start_new_session=True, - ) - timeout = float(self.get_parameter("stage1_timeout_sec").value) - self._point_msgs = 0 - t0 = time.monotonic() - while time.monotonic() - t0 < timeout: - self._spin(0.1) - if self._locked: - break - fatal = stage1_log_fatal(log_path) - if fatal: - self._stop_stage1() - self.get_logger().error(fatal) - return 1 - if self._s1.poll() is not None: - self.get_logger().error(f"一阶段进程提前退出,看 {log_path}") - return 1 - else: - self._stop_stage1() - self.get_logger().error( - stage1_timeout_reason(self._point_msgs, timeout, log_path) - ) - return 1 - if self.d435_move_only: - self.get_logger().info( - "D435 位移测试结束 — 停跟踪、钉住当前关节,跳过二阶段" - ) - else: - self.get_logger().info("一阶段已锁定 — 停跟踪、钉住当前关节,直接进二阶段") - self._stop_stage1() - time.sleep(0.35) - q = self._q() - if q is not None: - self._pin(q) - return 0 - - def run(self) -> int: - skip1 = bool(self.get_parameter("skip_stage1").value) - skip2 = bool(self.get_parameter("skip_stage2").value) - skip3 = bool(self.get_parameter("skip_stage3").value) - if self.d435_move_only: - skip2 = True - skip3 = True - if not self._cli.wait_for_server(timeout_sec=5.0): - self.get_logger().error("JTC action 不在 —— 先开 T1: run_real.sh --arm 89") - return 2 - - try: - if not skip1: - code = self._run_stage1() - if code != 0: - return code - else: - if not self._ensure_clearance(): - return 2 - self._state("skip_stage1") - - q, Tee = self._wait_state(10.0) - if q is None or Tee is None: - self.get_logger().error("拿不到 joint_states/TF") - return 2 - - final: dict = {} - if not skip2: - self._state("stage2_locate") - code, q, Tee, final = self._run_locate(q, Tee) - if code != 0: - self.get_logger().error(f"二阶段失败 exit={code},停在当前位姿") - return code - stay = hold_at_insert_z(final, skip3=skip3) - if stay and final.get("insert_held"): - self.get_logger().info( - f"二阶段 OK 残差 {final.get('residual_mm', -1)}mm — " - f"插孔停在法兰 Z={final.get('flange_z_m')}m," - f"规尖离面 {final.get('tip_gap_mm')}mm" - f"(目标 {final.get('commanded_gap_mm')}mm,来自 final_gap_mm)。" - "没有接触传感器,不另设 Z,不抬回悬高。" - ) - else: - self.get_logger().info( - f"二阶段 OK 残差 {final.get('residual_mm', -1)}mm" - + ( - " — 跳过搜孔,停在观测高度(看规尖是否对中;进程退出后臂保持)" - if skip3 - else " — 立刻下压搜孔并轻压(不拧入)" - ) - ) - else: - self._state("skip_stage2") - stay = hold_at_insert_z(final, skip3=skip3) - - if stay: - self._state("skip_stage3") - if self.d435_move_only: - self.get_logger().info( - "D435 位移测试结束 —— 臂停在当前高度,不交 D405、不对孔;" - "15s 后本进程退出,臂保持不动" - ) - elif isinstance(final, dict) and final.get("insert_held"): - if q is not None: - self._pin(q) - self.get_logger().info( - "插孔已停在贴面高度,不进搜孔、不抬回悬高。" - "15s 后本进程退出,臂保持这个 Z。" - ) - else: - self.get_logger().info( - "跳过搜孔 —— 臂停在当前高度。请看规尖与孔是否对中;" - "15s 后本进程退出,臂保持不动" - ) - if final: - self._publish_result(final) - self._linger_hold(final if final else {"ok": True}, seconds=15.0) - payload = {"ok": True, "stage": "pipeline", "exit": 0, "skipped": "stage3"} - try: - payload["stage2"] = json.loads( - open("/tmp/stage2_result.json", encoding="utf-8").read() - ) - except Exception: - pass - msg = String() - msg.data = json.dumps(payload, ensure_ascii=False) - self._pipe_result.publish(msg) - return 0 - - self._state("stage3_search") - code = self._run_search(q, Tee, linger=False, stage2_final=final) - payload = { - "ok": code == 0, - "stage": "pipeline", - "exit": code, - } - try: - payload["stage3"] = json.loads( - open("/tmp/stage3_result.json", encoding="utf-8").read() - ) - except Exception: - pass - msg = String() - msg.data = json.dumps(payload, ensure_ascii=False) - self._pipe_result.publish(msg) - return code - finally: - self._stop_stage1() - - -def main(args=None) -> None: - rclpy.init(args=args) - node = AssemblyPipeline() - code = 2 - try: - code = node.run() - except KeyboardInterrupt: - node.get_logger().info("用户中断") - code = 130 - except Exception as exc: # noqa: BLE001 - node.get_logger().error(f"pipeline 异常终止: {exc}") - code = 2 - finally: - try: - node._stop_stage1() - except Exception: - pass - if code != 0: - try: - q = node._q() - if q is not None: - node._pin(q) - except Exception: - pass - try: - node._shutdown_tf() - except Exception: - pass - try: - node.destroy_node() - except Exception: - pass - try: - if rclpy.ok(): - rclpy.shutdown() - except Exception: - pass - os._exit(code) - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/plane_feature.py b/install/arm_application/lib/python3.11/site-packages/arm_application/plane_feature.py deleted file mode 100644 index 1cc1eae..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/plane_feature.py +++ /dev/null @@ -1,300 +0,0 @@ -#!/usr/bin/env python3 -"""在 YOLO 检测框中心处求立体平面的 Z。 - -悬停目标是「检测框中心射线」与「拟合出的近平面」的交点。这样既能留在检测结果上, -又带有真实的米制 Z(30° 相机下,Z 错了会把 base 系的 XY 也带偏)。不使用点云均值 -质心 —— 孔 / 桌面的内点会把它从绿框上拉走。 -""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Optional, Tuple - -import numpy as np - - -@dataclass -class PlaneFeature: - uv: np.ndarray # (2,) 三维质心对应的彩色像素坐标 - z: float # 三维质心在相机坐标系下的 Z - xyz: np.ndarray # (3,) 相机坐标系下的立体点云质心 - n_inliers: int - note: str - # 这个点的 Z 是不是**借**来的(该像素处读不到自己的深度,从检测框里借了一个)。 - # 为什么要显式带出来、而不是让下游去认 ``note`` 里的字:借深度意味着该像素的 - # 深度不可读 ⇒ 绝对位置不足以用来**重定位**(2026-10-08 真机,假 k0 带着借来的 - # 深度、z 看着很合理 0.27~0.39m,于是"物理量程"守卫也失效)。 - borrowed: bool = False - - -def _depth_meters(buf: np.ndarray, encoding: str) -> Tuple[np.ndarray, float]: - enc = (encoding or "").lower() - raw = np.asarray(buf) - if enc in ("16uc1", "mono16") or raw.dtype == np.uint16: - pos = raw.reshape(-1).astype(np.float32) - pos = pos[pos > 0] - if pos.size >= 8: - med = float(np.median(pos)) - scale = 0.001 if 20.0 <= med <= 8000.0 else (1.0 if med < 20.0 else 0.0001) - else: - scale = 0.001 - return raw.astype(np.float32) * scale, scale - return raw.astype(np.float32), 1.0 - - -def _near_band_mask( - meters: np.ndarray, - valid: np.ndarray, - min_depth: float, - work_z_max: float, - band_m: float, -) -> np.ndarray: - vals = meters[valid] - if vals.size < 8: - return valid - vals = np.sort(vals) - n_near = max(8, int(0.40 * vals.size)) - near = vals[:n_near] - z_p10 = float(np.percentile(near, 10)) - hi = min(float(work_z_max), z_p10 + float(band_m)) - return valid & (meters <= hi) & (meters >= float(min_depth)) - - -def _ransac_plane( - pts: np.ndarray, - thresh: float, - n_iter: int = 24, - rng: Optional[np.random.Generator] = None, -) -> Optional[Tuple[np.ndarray, np.ndarray]]: - n = int(pts.shape[0]) - if n < 12: - return None - rng = rng or np.random.default_rng() - best_inl: Optional[np.ndarray] = None - best_count = 0 - for _ in range(n_iter): - i = rng.choice(n, 3, replace=False) - p0, p1, p2 = pts[i] - nvec = np.cross(p1 - p0, p2 - p0) - nn = float(np.linalg.norm(nvec)) - if nn < 1e-9: - continue - nvec = nvec / nn - dist = np.abs((pts - p0) @ nvec) - inl = dist < thresh - c = int(inl.sum()) - if c > best_count: - best_count = c - best_inl = inl - if best_inl is None or best_count < max(12, int(0.15 * n)): - return None - subset = pts[best_inl] - p0 = subset.mean(axis=0) - _, _, vh = np.linalg.svd(subset - p0, full_matrices=False) - nvec = vh[-1] - nvec = nvec / (float(np.linalg.norm(nvec)) + 1e-12) - if float(nvec @ p0) > 0.0: - nvec = -nvec - return nvec, p0 - - -def _plane_z( - nvec: np.ndarray, - p0: np.ndarray, - u: float, - v: float, - fx: float, - fy: float, - cx: float, - cy: float, -) -> Optional[float]: - direc = np.array([(u - cx) / max(fx, 1.0), (v - cy) / max(fy, 1.0), 1.0], dtype=float) - denom = float(nvec @ direc) - if abs(denom) < 1e-8: - return None - z = float(nvec @ p0) / denom - return z if np.isfinite(z) else None - - -def workpiece_xyz_in_box( - depth_buf: np.ndarray, - encoding: str, - xyxy, - fx: float, - fy: float, - cx: float, - cy: float, - img_wh: Tuple[int, int], - min_depth: float, - max_depth: float, - work_z_max: float, - inner: float = 0.40, - band_m: float = 0.06, -) -> Optional[PlaneFeature]: - """工件上的实体点:内层检测框里近表面深度的三维中位数。 - - 不是单目射线(孔会穿透到桌面),也不是整个 ROI 的点云均值 - (桌面 / 单侧深度会把它从工件上拉走)。 - """ - meters, _ = _depth_meters(depth_buf, encoding) - if meters.ndim != 2: - return None - img_w, img_h = int(img_wh[0]), int(img_wh[1]) - dh, dw = int(meters.shape[0]), int(meters.shape[1]) - x1, y1, x2, y2 = [float(v) for v in xyxy] - u_c = 0.5 * (x1 + x2) - v_c = 0.5 * (y1 + y2) - if dw != img_w or dh != img_h: - sx, sy = dw / max(float(img_w), 1.0), dh / max(float(img_h), 1.0) - x1, y1, x2, y2 = x1 * sx, y1 * sy, x2 * sx, y2 * sy - scale_u, scale_v = 1.0 / sx, 1.0 / sy - else: - scale_u = scale_v = 1.0 - bw = max(8.0, x2 - x1) - bh = max(8.0, y2 - y1) - frac = 0.5 * float(np.clip(inner, 0.2, 0.8)) - ix0 = int(np.clip(min(x1, x2) + (0.5 - frac) * bw, 0, dw - 1)) - iy0 = int(np.clip(min(y1, y2) + (0.5 - frac) * bh, 0, dh - 1)) - ix1 = int(np.clip(max(x1, x2) - (0.5 - frac) * bw, ix0 + 2, dw)) - iy1 = int(np.clip(max(y1, y2) - (0.5 - frac) * bh, iy0 + 2, dh)) - roi = meters[iy0:iy1, ix0:ix1] - finite = np.isfinite(roi) & (roi > float(min_depth)) & (roi < float(max_depth)) - if int(finite.sum()) < 12: - return None - near = _near_band_mask(roi, finite, min_depth, work_z_max, band_m) - if int(near.sum()) < 8: - near = finite - yy, xx = np.nonzero(near) - if yy.size < 8: - return None - zs = roi[yy, xx] - us = (xx + ix0) * scale_u - vs = (yy + iy0) * scale_v - pts = np.stack( - [ - (us - cx) * zs / max(fx, 1.0), - (vs - cy) * zs / max(fy, 1.0), - zs, - ], - axis=1, - ) - p_xyz = np.median(pts, axis=0) - if not np.all(np.isfinite(p_xyz)): - return None - z = float(p_xyz[2]) - if not (min_depth <= z <= work_z_max): - return None - uv = np.array( - [ - fx * float(p_xyz[0]) / max(z, 1e-6) + cx, - fy * float(p_xyz[1]) / max(z, 1e-6) + cy, - ], - dtype=float, - ) - return PlaneFeature( - uv=uv, - z=z, - xyz=p_xyz.astype(float), - n_inliers=int(yy.size), - note=f"inner3d n={int(yy.size)} z={z:.3f}", - ) - - -def geometric_center_on_plane( - depth_buf: np.ndarray, - encoding: str, - xyxy, - fx: float, - fy: float, - cx: float, - cy: float, - img_wh: Tuple[int, int], - min_depth: float, - max_depth: float, - work_z_max: float, - inlier_m: float = 0.008, - band_m: float = 0.06, -) -> Optional[PlaneFeature]: - """拟合出的近平面上、位于检测框中心的点,拿不到则返回 None。""" - meters, _ = _depth_meters(depth_buf, encoding) - if meters.ndim != 2: - return None - img_w, img_h = int(img_wh[0]), int(img_wh[1]) - dh, dw = int(meters.shape[0]), int(meters.shape[1]) - x1, y1, x2, y2 = [float(v) for v in xyxy] - u_c = 0.5 * (x1 + x2) - v_c = 0.5 * (y1 + y2) - if dw != img_w or dh != img_h: - sx, sy = dw / max(float(img_w), 1.0), dh / max(float(img_h), 1.0) - x1, y1, x2, y2 = x1 * sx, y1 * sy, x2 * sx, y2 * sy - # uv 保持用彩色像素坐标:先在深度像素下计算,再缩放回来。 - scale_u, scale_v = 1.0 / sx, 1.0 / sy - else: - scale_u = scale_v = 1.0 - - x0 = int(np.clip(min(x1, x2), 0, dw - 1)) - y0 = int(np.clip(min(y1, y2), 0, dh - 1)) - x1i = int(np.clip(max(x1, x2), x0 + 2, dw)) - y1i = int(np.clip(max(y1, y2), y0 + 2, dh)) - roi = meters[y0:y1i, x0:x1i] - if roi.size < 16: - return None - - finite = np.isfinite(roi) & (roi > float(min_depth)) & (roi < float(max_depth)) - if int(finite.sum()) < 16: - return None - near = _near_band_mask(roi, finite, min_depth, work_z_max, band_m) - if int(near.sum()) < 12: - near = finite - - yy, xx = np.nonzero(near) - zs = roi[yy, xx] - # 反投影用的彩色等效像素(对齐后的深度使用的是彩色内参 K)。 - us = (xx + x0) * scale_u - vs = (yy + y0) * scale_v - pts = np.stack( - [ - (us - cx) * zs / max(fx, 1.0), - (vs - cy) * zs / max(fy, 1.0), - zs, - ], - axis=1, - ) - if pts.shape[0] > 800: - rng = np.random.default_rng() - sel = rng.choice(pts.shape[0], 800, replace=False) - fit_pts = pts[sel] - else: - fit_pts = pts - - fitted = _ransac_plane(fit_pts, thresh=float(inlier_m)) - if fitted is None: - return None - nvec, p0 = fitted - dist = np.abs((pts - p0) @ nvec) - n_inl = int((dist < float(inlier_m)).sum()) - if n_inl < 12: - return None - z = _plane_z(nvec, p0, u_c, v_c, fx, fy, cx, cy) - if z is None or not (min_depth <= float(z) <= work_z_max): - zs_inl = pts[dist < float(inlier_m), 2] - z = float(np.median(zs_inl)) if zs_inl.size else None - if z is None or not (min_depth <= z <= work_z_max): - return None - z = float(z) - p_xyz = np.array( - [ - (u_c - cx) * z / max(fx, 1.0), - (v_c - cy) * z / max(fy, 1.0), - z, - ], - dtype=float, - ) - return PlaneFeature( - uv=np.array([u_c, v_c], dtype=float), - z=z, - xyz=p_xyz, - n_inliers=n_inl, - note=f"box_on_plane n={n_inl} z={z:.3f}", - ) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_color_pub.py b/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_color_pub.py deleted file mode 100644 index c95b46a..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_color_pub.py +++ /dev/null @@ -1,977 +0,0 @@ -#!/usr/bin/env python3 -"""把 RealSense 彩色流发布到 ROS 话题(不依赖 realsense2_camera 的 apt 包)。 - -当你没装 ``ros-humble-realsense2-camera``、但 ``pyrealsense2`` 能正常工作时用它。 - -默认话题(camera_name=d405): - /d405/color/image_raw - /d405/color/camera_info - /d405/aligned_depth_to_color/image_raw (16UC1 mm,需开启 enable_depth) - -性能说明 --------- -* 在采集线程里直接发布(没有定时器带来的延迟)。 -* 使用 SensorDataQoS(BEST_EFFORT,depth=1),这样慢的订阅者会主动丢旧帧。 -* 可选的 SDK 预览:``-p show_preview:=true``(沿用 Intel 示例的链路:pipeline → numpy → 窗口)。 -""" - -from __future__ import annotations - -import array -import os -import threading -import time -from pathlib import Path -from typing import Optional - -import numpy as np -import rclpy -from rcl_interfaces.msg import ParameterDescriptor -from rclpy.node import Node -from rclpy.qos import qos_profile_sensor_data -from sensor_msgs.msg import CameraInfo, Image -from std_msgs.msg import Float32MultiArray - -from arm_application.ros_node import TolerantNode, param_as_str - -# RealSense 掉到 480Mbps(或整台消失)时的排查口径。写在这里是为了"只有一处": -# 相机节点的报错、preflight 脚本、文档都引用同一套说法,不会各说各的。 -# 为什么 480Mbps 值得专门解释一次(2026-09-28 现场): -# D435 原本协商到 USB 3.2、1280x720@30 跑得好好的,中途 -# `xioctl(UVCIOC_CTRL_QUERY) ... No such file or directory`(= 设备从总线上消失) -# 之后重新枚举成了 **USB 2.1**。USB3 线缆/座子里 SuperSpeed 那一对针脚一旦 -# 接触不良,USB2 的针脚还能用 —— 于是设备不会"掉线",只是**悄悄掉速**, -# 表现成"相机在,但帧率/分辨率不对"。这时查软件是查不出来的。 -USB_RESEAT_HINT = ( - '拔插一次、换一根 USB3 线,或换到机箱后面板直连的蓝色口 —— ' - '只协商到 480Mbps 通常是 SuperSpeed 针脚没接上,不是相机坏了。' - '看当前协商速率:lsusb -t(设备后面写 480M 还是 5000M)。' -) - - -def _fill_camera_info( - msg: CameraInfo, width: int, height: int, fx, fy, cx, cy, frame_id: str, dist -) -> None: - msg.width = width - msg.height = height - msg.distortion_model = 'plumb_bob' - msg.d = [float(v) for v in list(dist)[:5]] - while len(msg.d) < 5: - msg.d.append(0.0) - msg.k = [ - float(fx), 0.0, float(cx), - 0.0, float(fy), float(cy), - 0.0, 0.0, 1.0, - ] - msg.r = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] - msg.p = [ - float(fx), 0.0, float(cx), 0.0, - 0.0, float(fy), float(cy), 0.0, - 0.0, 0.0, 1.0, 0.0, - ] - msg.header.frame_id = frame_id - - -def _site_yaml_path() -> Path: - from arm_application.site_io import site_path - - return site_path() - - -class RealsenseColorPub(TolerantNode): - def __init__(self) -> None: - super().__init__('realsense_color_pub') - self.declare_parameter('camera_name', 'd405') # 话题命名空间 - self._name = str(self.get_parameter('camera_name').value).strip().strip('/') - self._serial = param_as_str(self, 'camera_serial', '') - self.declare_parameter('width', 1280) - self.declare_parameter('height', 720) - self.declare_parameter('fps', 15) - self.declare_parameter('show_preview', False) - self.declare_parameter('overlay_detection', True) - self.declare_parameter('overlay_hold_sec', 1.5) - self.declare_parameter('enable_depth', True) - self.declare_parameter('enable_infra', True) - self.declare_parameter('preview_stereo', True) - # Qt 预览每 N 帧才渲染一次 —— 发布始终保持满帧率; - # CPU 上色 + 四窗格绘制绝不能拖慢数据流。 - self.declare_parameter('preview_decimation', 2) - self.declare_parameter('auto_exposure', True) - self.declare_parameter('ae_limit_us', 3000.0) - self.declare_parameter('emitter_enabled', False) - self.declare_parameter('laser_power', 0.0) - self.declare_parameter('exposure_us', 0.0) - self.declare_parameter('gain', 0.0) - - self._width = int(self.get_parameter('width').value) - self._height = int(self.get_parameter('height').value) - self._fps = int(self.get_parameter('fps').value) - self._show_preview = bool(self.get_parameter('show_preview').value) - self._overlay_detection = bool(self.get_parameter('overlay_detection').value) - self._overlay_hold_sec = float(self.get_parameter('overlay_hold_sec').value) - self._enable_depth_param = bool(self.get_parameter('enable_depth').value) - self._enable_infra_param = bool(self.get_parameter('enable_infra').value) - self._preview_stereo = bool(self.get_parameter('preview_stereo').value) - self._preview_every = max( - 1, int(self.get_parameter('preview_decimation').value) - ) - self._auto_exposure = bool(self.get_parameter('auto_exposure').value) - self._ae_limit_us = float(self.get_parameter('ae_limit_us').value) - self._emitter_enabled = bool(self.get_parameter('emitter_enabled').value) - self._laser_power = float(self.get_parameter('laser_power').value) - self._exposure_us = float(self.get_parameter('exposure_us').value) - self._gain = float(self.get_parameter('gain').value) - # FPS 表:硬件帧号对比实际发布帧数(循环速率) - self._fps_t0 = 0.0 - self._fps_pub_color = 0 - self._fps_pub_depth = 0 - self._fps_fn_color = -1 - self._fps_fn_depth = -1 - self._t_wait = 0.0 - self._t_align = 0.0 - self._t_pub = 0.0 - - qos = qos_profile_sensor_data # BEST_EFFORT,只保留最后 1 帧 - base = f'/{self._name}/color' - self._img_pub = self.create_publisher( - Image, f'{base}/image_raw', qos - ) - self._info_pub = self.create_publisher( - CameraInfo, f'{base}/camera_info', qos - ) - self._depth_pub = self.create_publisher( - Image, f'/{self._name}/aligned_depth_to_color/image_raw', qos - ) - # IR 流也会一起发布,这样预览可以放在独立的查看器进程里 - # (Qt 不能和采集循环共享 GIL)。 - self._ir1_pub = None - self._ir2_pub = None - if self._enable_infra_param and self._preview_stereo: - self._ir1_pub = self.create_publisher( - Image, f'/{self._name}/infra1/image_rect_raw', qos - ) - self._ir2_pub = self.create_publisher( - Image, f'/{self._name}/infra2/image_rect_raw', qos - ) - - self._pipe = None - self._profile = None - self._align = None - self._have_depth = False - self._have_infra = False - self._infra_mode = 'none' - self._colorizer = None - self._logged_depth = False - # 设备深度尺度 → 用原始 uint16 乘上它才是真实的 mm。 - # D405 = 0.1 mm/单位,D435 = 1.0 mm/单位。启动时从传感器读取。 - self._depth_to_mm = 1.0 - self._running = True - self._thread: Optional[threading.Thread] = None - self._fx = self._fy = self._cx = self._cy = 0.0 - self._dist = [0.0] * 5 - self._frame_id = f'{self._name}_color_optical_frame' - self._info_every = 1 - self._frame_i = 0 - self._preview = None - self._overlay: Optional[list] = None - self._overlay_stamp = 0.0 - self._capture_started = False - self._cap_lock = threading.Lock() - self._cap_event = threading.Event() - self._pending = None - self._last_frame_mono = 0.0 - self._usb_desc = '' - self._last_ok = None - self._site_yaml = _site_yaml_path() - self._site_mtime = 0.0 - self._site_wh_warned = False - if self._show_preview: - from arm_application.realsense_sdk_view import SdkPreviewWindow, ensure_app - - self._qt_app = ensure_app() - self._preview = SdkPreviewWindow( - title=f'RealSense {self._name} COLOR|DEPTH|IR-L|IR-R (pyrealsense2 SDK)' - ) - self._preview.show() - if self._overlay_detection: - from rclpy.qos import HistoryPolicy, QoSProfile, ReliabilityPolicy - - det_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.RELIABLE, - ) - self.create_subscription( - Float32MultiArray, - 'workpiece/detection', - self._on_det, - det_qos, - ) - self.get_logger().info( - 'SDK 预览已开启 —— 本进程内显示 COLOR|DEPTH|IR-L|IR-R ' - f'(保留 {self._overlay_hold_sec:.1f}s)。关窗口 ≠ 停相机。' - ) - self._start_pipeline() - - def _pick_device(self, devices, rs): - """优先用配置的序列号,其次按名字选 D405(这台机器上还接了 D435)。""" - hint = (self._name or 'd405').lower() - if self._serial: - for d in devices: - if d.get_info(rs.camera_info.serial_number) == self._serial: - return d - avail = ', '.join( - f"{d.get_info(rs.camera_info.name)}:{d.get_info(rs.camera_info.serial_number)}" - for d in devices - ) - raise RuntimeError( - f'找不到序列号 {self._serial!r}。当前已连接:{avail}' - ) - for d in devices: - name = str(d.get_info(rs.camera_info.name) or '').lower() - if hint in name or (hint == 'd405' and '405' in name): - return d - return devices[0] - - def _reload_site_preview(self, stream_w: int = 0, stream_h: int = 0) -> None: - """不重启就能读到新的 overlay_hold_sec(宽高变了则给出警告)。""" - path = self._site_yaml - if not path.is_file(): - return - try: - mtime = path.stat().st_mtime - except OSError: - return - if mtime <= self._site_mtime: - return - self._site_mtime = mtime - try: - import yaml - - data = yaml.safe_load(path.read_text(encoding="utf-8")) or {} - cam = data.get("camera") or {} - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"site.yaml 重新加载失败:{exc}") - return - if "overlay_hold_sec" in cam: - hold = max(0.0, float(cam.get("overlay_hold_sec") or 0.0)) - if abs(hold - self._overlay_hold_sec) > 1e-6: - self.get_logger().info( - f"overlay_hold_sec {self._overlay_hold_sec:.2f}s → {hold:.2f}s (site.yaml)" - ) - self._overlay_hold_sec = hold - want_w = int(cam.get("width") or self._width) - want_h = int(cam.get("height") or self._height) - live_w = stream_w or self._width - live_h = stream_h or self._height - if (want_w, want_h) != (live_w, live_h) and not self._site_wh_warned: - self._site_wh_warned = True - self.get_logger().warn( - f"预览流是 {live_w}x{live_h},而 site.yaml 里的 camera 是 " - f"{want_w}x{want_h} —— 请重启:bash ~/ros2/scripts/run_camera_d405.sh --preview" - ) - elif (want_w, want_h) == (live_w, live_h): - self._site_wh_warned = False - - def _on_det(self, msg: Float32MultiArray) -> None: - # 空负载 = 感知漏检 → 立刻清掉绿框 - if not msg.data or len(msg.data) < 8: - self._overlay = None - self._overlay_stamp = 0.0 - if self._preview is not None: - self._preview.set_overlay(None) - return - self._overlay = list(msg.data) - self._overlay_stamp = time.monotonic() - if self._preview is not None: - self._preview.set_overlay(self._overlay) - - def _publish_frame(self, bgr: np.ndarray, depth_u16: Optional[np.ndarray] = None) -> None: - h, w = bgr.shape[0], bgr.shape[1] - stamp = self.get_clock().now().to_msg() - - img = Image() - img.header.stamp = stamp - img.header.frame_id = self._frame_id - img.height = h - img.width = w - img.encoding = 'bgr8' - img.is_bigendian = 0 - img.step = w * 3 - # array.array('B', ...) 会走 setter 的快路径 —— 直接传 bytes 会触发 - # 逐元素的 debug 检查,在这里每帧要多花约 40 ms。 - img.data = array.array('B', np.ascontiguousarray(bgr).tobytes()) - self._img_pub.publish(img) - - info = CameraInfo() - info.header.stamp = stamp - info.header.frame_id = self._frame_id - _fill_camera_info( - info, w, h, self._fx, self._fy, self._cx, self._cy, - self._frame_id, self._dist, - ) - self._info_pub.publish(info) - - if depth_u16 is not None: - self._publish_depth(depth_u16, stamp) - - def _publish_depth(self, depth_u16: np.ndarray, stamp=None) -> None: - dh, dw = int(depth_u16.shape[0]), int(depth_u16.shape[1]) - dmsg = Image() - dmsg.header.stamp = stamp or self.get_clock().now().to_msg() - dmsg.header.frame_id = self._frame_id - dmsg.height = dh - dmsg.width = dw - dmsg.encoding = '16UC1' - dmsg.is_bigendian = 0 - dmsg.step = dw * 2 - dmsg.data = array.array('B', np.ascontiguousarray(depth_u16).tobytes()) - self._depth_pub.publish(dmsg) - if not self._logged_depth: - self._logged_depth = True - self.get_logger().info( - f'首个对齐深度 {dw}x{dh} → ' - f'/{self._name}/aligned_depth_to_color/image_raw' - ) - - def _start_pipeline(self, reconnect: bool = False) -> None: - try: - import pyrealsense2 as rs - except Exception as exc: # noqa: BLE001 - raise RuntimeError( - 'pyrealsense2 不可用。请执行 conda activate ros_flexiv' - ) from exc - - # 杀掉上一个发布进程后,USB 需要 1–3s 才能重新枚举。 - ctx = rs.context() - devices = [] - for attempt in range(8): - devices = list(ctx.devices) - if devices: - break - time.sleep(0.4) - ctx = rs.context() - if not devices: - raise RuntimeError( - '没有连接 RealSense(多次重试后 USB 仍为空)。' - '拔插一次;确认没有 realsense-viewer / 其它进程占着这台相机;' - + USB_RESEAT_HINT - ) - - found = self._pick_device(devices, rs) - try: - self._serial = str(found.get_info(rs.camera_info.serial_number)) - except Exception: # noqa: BLE001 - pass - usb_desc = '' - try: - usb_desc = str(found.get_info(rs.camera_info.usb_type_descriptor)) - except Exception: # noqa: BLE001 - usb_desc = '?' - self._usb_desc = usb_desc - usb2 = usb_desc.startswith('2') - cam_name = '' - try: - cam_name = str(found.get_info(rs.camera_info.name)) - except Exception: # noqa: BLE001 - cam_name = self._name - self.get_logger().info( - f'{cam_name} serial={self._serial or "?"} USB={usb_desc} ' - f'requested {self._width}x{self._height}@{self._fps}Hz' - ) - if usb2: - # 只在 480Mbps 口上才降。实测(2026-09-28)640x480@15 彩色+深度 - # 可以稳定跑满 15fps;但 1280x720@30 在 USB2 上物理不可能 - # (SuperSpeed 没协商上)。 - self.get_logger().warn( - f'{cam_name} 只协商到 USB {usb_desc}(480Mbps)—— 降到 ' - f'640x480@15Hz。' + USB_RESEAT_HINT - ) - self._width, self._height, self._fps = 640, 480, 15 - - want = (self._width, self._height, self._fps) - last = self._last_ok - if reconnect: - candidates = [] - if last: - candidates.append(last) - if want not in candidates: - candidates.append(want) - if (640, 480, 15) not in candidates: - candidates.append((640, 480, 15)) - else: - candidates = [ - want, - (1280, 720, 15), - (640, 480, 15), - (640, 480, 5), - ] - if usb2: - candidates = [(640, 480, 15), (640, 480, 5), (424, 240, 15)] - # 丢弃固件里的垃圾模式(848@90 之类),它们会 ioctl 失败并卡死 USB。 - seen = set() - trimmed = [] - for item in candidates: - if item in seen: - continue - w, h, fps = item - if fps not in (5, 15, 30): - continue - if w * h > 1280 * 720: - continue - seen.add(item) - trimmed.append(item) - candidates = trimmed or [(640, 480, 15)] - - pipe = rs.pipeline() - profile = None - last_err = None - want_depth = bool(self._enable_depth_param) - want_infra = ( - bool(self._enable_infra_param) - and bool(self._preview_stereo) - ) - have_depth = False - have_infra = False - - # USB3:先尝试真正的 IR-L+IR-R(共享立体自动曝光)。彩色+IR-L 在 D405 上 - # 经常失败 —— 那就退回 IR-R + 把彩色当左目(观感不同,且不共享自动曝光)。 - def _modes(): - if want_depth and want_infra and not usb2: - yield True, 'both' - if want_depth and want_infra: - yield True, 'right' - if want_depth: - yield True, 'none' - yield False, 'none' - - for w, h, fps in candidates: - for with_depth, infra_mode in _modes(): - try: - trial = rs.config() - if self._serial: - trial.enable_device(self._serial) - trial.enable_stream(rs.stream.color, w, h, rs.format.bgr8, fps) - if with_depth: - trial.enable_stream( - rs.stream.depth, w, h, rs.format.z16, fps - ) - if infra_mode in ('both', 'left'): - trial.enable_stream( - rs.stream.infrared, 1, w, h, rs.format.y8, fps - ) - if infra_mode in ('both', 'right'): - trial.enable_stream( - rs.stream.infrared, 2, w, h, rs.format.y8, fps - ) - # 回调里只留最新一帧。wait_for_frames 会等彩色、深度、红外齐套, - # 场景一动红外对不齐,彩色帧就在这里被丢掉。 - profile = pipe.start(trial, self._on_sdk_frame) - have_depth = with_depth - have_infra = infra_mode != 'none' - self._infra_mode = infra_mode - if (w, h, fps) != want: - self.get_logger().warn( - f'请求 {want[0]}x{want[1]}@{want[2]}Hz ' - f'→ 改用 {w}x{h}@{fps}Hz' - ) - if want_depth and not with_depth: - self.get_logger().warn( - f'{w}x{h}@{fps}Hz 彩色+深度失败 —— 只用彩色' - ) - elif want_infra and infra_mode == 'none': - self.get_logger().warn( - f'{w}x{h}@{fps}Hz 立体 IR 失败 —— 改用彩色+深度预览' - ) - elif infra_mode == 'both': - self.get_logger().info( - f'{w}x{h}@{fps}Hz 立体 IR-L+IR-R(共享自动曝光)+ 深度' - ) - elif infra_mode == 'right': - self.get_logger().info( - f'{w}x{h}@{fps}Hz IR-L=彩色灰度,IR-R=原始 IR ' - '(明暗不同 —— 这不是两路自动曝光)' - ) - self._width, self._height, self._fps = w, h, fps - self._last_ok = (w, h, fps) - break - except Exception as exc: # noqa: BLE001 - last_err = exc - kind = f'color+depth+IR-{infra_mode}' if with_depth else 'color' - self.get_logger().warn(f'{w}x{h}@{fps}Hz {kind} 失败:{exc}') - profile = None - have_depth = False - have_infra = False - try: - pipe.stop() - except Exception: # noqa: BLE001 - pass - time.sleep(0.8) - pipe = rs.pipeline() - if profile is not None: - break - if profile is None: - raise RuntimeError( - f'{self._name} 没有可用的彩色配置。最后的错误:{last_err}' - ) - - self._pipe = pipe - self._profile = profile - try: - sensor = profile.get_device().first_color_sensor() - if sensor.supports(rs.option.frames_queue_size): - # 队列只留最新一张,避免越积越慢,动起来画面还停在旧帧。 - sensor.set_option(rs.option.frames_queue_size, 1) - except Exception: # noqa: BLE001 - pass - self._have_depth = have_depth - self._have_infra = have_infra - self._logged_depth = False - # 深度按**真实毫米**发布。D405 的原始单位是 0.1 mm(D435 是 1 mm); - # 下游(感知/伺服)都按 mm 处理,所以要按设备尺度归一化。 - self._depth_to_mm = 1.0 - if have_depth: - try: - ds = float(profile.get_device().first_depth_sensor().get_depth_scale()) - self._depth_to_mm = ds * 1000.0 # m/单位 → mm/单位 - self.get_logger().info( - f'深度尺度 {ds * 1000.0:.4f} mm/单位 → 按真实 mm 发布' - ) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f'读取深度尺度失败,按 mm 处理:{exc}') - self._depth_to_mm = 1.0 - self._align = rs.align(rs.stream.color) if have_depth else None - self._colorizer = None - if have_depth: - try: - self._colorizer = rs.colorizer() - self._colorizer.set_option(rs.option.color_scheme, 0) - except Exception: # noqa: BLE001 - self._colorizer = None - try: - from arm_application.handeye_realsense import apply_realsense_exposure - import time as _time - - exp_us = self._exposure_us if self._exposure_us > 0 else None - gain = self._gain if self._gain > 0 else None - kwargs = dict( - auto_exposure=self._auto_exposure, - ae_limit_us=self._ae_limit_us, - emitter_enabled=self._emitter_enabled, - laser_power=self._laser_power, - exposure_us=exp_us, - gain=gain, - log=self.get_logger().info, - ) - apply_realsense_exposure(profile.get_device(), **kwargs) - # 固件经常会在最初几帧重置自动曝光;所以再设置一次。 - _time.sleep(0.25) - apply_realsense_exposure(profile.get_device(), **kwargs) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f'应用曝光参数失败:{exc}') - if self._preview is not None: - if self._infra_mode == 'both': - self._preview.set_pane_titles( - 'COLOR', 'DEPTH', 'IR-L (左红外,与右目同一曝光)', 'IR-R (右红外)' - ) - elif self._infra_mode == 'right': - self._preview.set_pane_titles( - 'COLOR', 'DEPTH', '左目≈彩图灰度(不是红外曝光)', 'IR-R (右红外)' - ) - else: - self._preview.set_pane_titles( - 'COLOR', 'DEPTH', 'IR-L (无)', 'IR-R (无)' - ) - - vs = profile.get_stream(rs.stream.color).as_video_stream_profile() - try: - intr = vs.get_intrinsics() - self._fx = float(intr.fx) - self._fy = float(intr.fy) - self._cx = float(intr.ppx) - self._cy = float(intr.ppy) - dist = list(intr.coeffs[:5]) if intr.coeffs else [0.0] * 5 - except Exception as exc: # noqa: BLE001 - self.get_logger().warn( - f'get_intrinsics 失败({exc});改用 D405 的默认内参,' - f'分辨率 {self._width}x{self._height}' - ) - w, h = float(self._width), float(self._height) - if w >= 1200: - self._fx, self._fy = 654.8, 654.0 - else: - self._fx = 393.9 * (w / 640.0) - self._fy = 393.4 * (h / 480.0) - self._cx, self._cy = w * 0.5, h * 0.5 - dist = [0.0] * 5 - while len(dist) < 5: - dist.append(0.0) - self._dist = dist - - sn = profile.get_device().get_info(rs.camera_info.serial_number) - model = profile.get_device().get_info(rs.camera_info.name) - depth_txt = ( - f' + aligned depth /{self._name}/aligned_depth_to_color/image_raw' - if have_depth - else ' (仅彩色)' - ) - if have_infra: - depth_txt += ' + IR-L/IR-R 预览' - self.get_logger().info( - f'{model} serial={sn} USB={usb_desc} → /{self._name}/color/image_raw ' - f'{self._width}x{self._height}@{self._fps}Hz ' - f'fx={self._fx:.1f} fy={self._fy:.1f}{depth_txt} (SensorDataQoS)' - ) - - if not getattr(self, '_capture_started', False): - self._capture_started = True - self._thread = threading.Thread(target=self._publish_loop, daemon=True, name="rs-publish") - self._thread.start() - - def _enable_color_ae_fast(self, profile, rs) -> None: - """彩色自动曝光,优先用短曝光(减少运动模糊)。""" - try: - sensor = profile.get_device().first_color_sensor() - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f'彩色 AE:没有彩色传感器({exc})') - return - try: - if sensor.supports(rs.option.enable_auto_exposure): - sensor.set_option(rs.option.enable_auto_exposure, 1.0) - if sensor.supports(rs.option.auto_exposure_priority): - # 0 = 保住帧率,场景够亮时缩短曝光时间 - sensor.set_option(rs.option.auto_exposure_priority, 0.0) - limit = getattr(rs.option, "auto_exposure_limit", None) - if limit is not None and sensor.supports(limit): - try: - sensor.set_option(limit, 5000.0) # µs;30 Hz 下减少运动模糊 - except Exception: - pass - self.get_logger().info('彩色自动曝光已开启(优先帧率 / 减少模糊)') - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f'彩色 AE:{exc}') - - def _enable_stereo_ae(self, profile, rs) -> None: - """两路 IR 成像器共用一路自动曝光(立体模块)。""" - try: - sensor = profile.get_device().first_depth_sensor() - if sensor.supports(rs.option.enable_auto_exposure): - sensor.set_option(rs.option.enable_auto_exposure, 1.0) - limit = getattr(rs.option, "auto_exposure_limit", None) - if limit is not None and sensor.supports(limit): - try: - # 把 IR 曝光上限压到远低于 33 ms 的帧周期,这样光线暗的场景 - # 也不会悄悄把数据流掉到 30 Hz 以下。 - sensor.set_option(limit, 20000.0) - self.get_logger().info('立体 IR 曝光上限 20ms') - except Exception: - pass - self.get_logger().info('立体 IR 自动曝光已开启(左右共享)') - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f'立体 AE:{exc}') - - def _colorize_depth(self, depth_frame, depth_u16: np.ndarray) -> np.ndarray: - if self._colorizer is not None: - try: - rgb = np.asanyarray(self._colorizer.colorize(depth_frame).get_data()) - if rgb.ndim == 3 and rgb.shape[2] >= 3: - return rgb[:, :, ::-1].copy() - except Exception: # noqa: BLE001 - pass - d = np.asarray(depth_u16) - vis = np.zeros((d.shape[0], d.shape[1], 3), dtype=np.uint8) - valid = d > 0 - if not valid.any(): - return vis - x = d.astype(np.float32) - lo, hi = np.percentile(x[valid], [5, 95]) - hi = max(float(hi), float(lo) + 1.0) - gray = np.clip((x - lo) / (hi - lo), 0.0, 1.0) - gray = (gray * 255.0).astype(np.uint8) - gray[~valid] = 0 - try: - import cv2 - - vis = cv2.applyColorMap(gray, cv2.COLORMAP_JET) - vis[~valid] = 0 - except Exception: # noqa: BLE001 - vis[:, :, 0] = gray - vis[:, :, 1] = gray - vis[:, :, 2] = gray - return vis - - def _reconnect(self) -> bool: - try: - if self._pipe is not None: - self._pipe.stop() - except Exception: # noqa: BLE001 - pass - self._pipe = None - time.sleep(2.5) - try: - self._start_pipeline(reconnect=True) - return self._pipe is not None - except Exception as exc: # noqa: BLE001 - self.get_logger().error( - f'重连失败:{exc}。请拔插 USB3,并给线缆留点余量。', - throttle_duration_sec=5.0, - ) - return False - - def _on_sdk_frame(self, frame) -> None: - """SDK 回调。只拷走彩色并握住这一组帧,立刻返回。 - - 对齐、深度换算和 ROS 发布若做在这个回调里,下一帧来不及取, - 动起来时彩色帧号会跳。那些工作放到 ``_publish_loop``。 - """ - try: - frames = frame.as_frameset() - color = frames.get_color_frame() - if not color: - return - bgr = np.array(np.asanyarray(color.get_data()), copy=True) - frames.keep() - with self._cap_lock: - self._pending = (bgr, frames) - self._last_frame_mono = time.monotonic() - self._cap_event.set() - except Exception as exc: # noqa: BLE001 - try: - self.get_logger().warn(f'收帧:{exc}', throttle_duration_sec=2.0) - except Exception: # noqa: BLE001 - pass - - def _publish_loop(self) -> None: - got = False - while self._running and rclpy.ok(): - if self._pipe is None: - if not self._reconnect(): - time.sleep(2.0) - continue - if not self._cap_event.wait(0.2): - silent = self._last_frame_mono and time.monotonic() - self._last_frame_mono > 2.0 - if silent: - usb = getattr(self, '_usb_desc', '?') - self.get_logger().error( - f'相机超过 2 秒没有新帧(USB={usb})。正在重连 —— ' - '请给 USB 线缆留点余量,别让机械臂把它拽掉。' - ) - self._last_frame_mono = 0.0 - got = False - self._reconnect() - continue - self._cap_event.clear() - with self._cap_lock: - item = self._pending - self._pending = None - if item is None: - continue - bgr, frames = item - try: - t_pub = time.monotonic() - # 彩色先发出去。深度对齐再慢,也不能把这一帧彩色拖掉。 - self._publish_frame(bgr, None) - self._t_pub = time.monotonic() - t_pub - ir_l = ( - frames.get_infrared_frame(1) - if self._have_infra and self._infra_mode in ('both', 'left') - else None - ) - ir_r = ( - frames.get_infrared_frame(2) - if self._have_infra and self._infra_mode in ('both', 'right') - else None - ) - aligned = frames - if self._align is not None: - t_al = time.monotonic() - aligned = self._align.process(frames) - self._t_align = time.monotonic() - t_al - depth = aligned.get_depth_frame() - color = frames.get_color_frame() - except Exception as exc: # noqa: BLE001 - text = str(exc) - dropped = ( - 'disconnect' in text.lower() - or 'ioctl' in text.lower() - or 'errno=5' in text.lower() - ) - if dropped: - usb = getattr(self, '_usb_desc', '?') - self.get_logger().error( - f'相机数据流中断(USB={usb}):{text[:120]}。' - '正在重连 —— 请给 USB 线缆留点余量,别让机械臂把它拽掉。' - ) - got = False - self._last_frame_mono = 0.0 - self._reconnect() - else: - self.get_logger().warn(f'整理帧:{exc}', throttle_duration_sec=2.0) - continue - depth_u16 = np.asanyarray(depth.get_data()) if depth else None - if depth_u16 is not None and self._depth_to_mm != 1.0: - # 原始设备单位 → 真实 mm(D405 原始为 0.1 mm/单位) - depth_u16 = np.clip( - depth_u16.astype(np.float32) * self._depth_to_mm, 0, 65535 - ).astype(np.uint16) - if depth_u16 is not None: - try: - self._publish_depth(depth_u16) - except Exception as exc: # noqa: BLE001 - if not self._running: - break - self.get_logger().warn(f'发布深度失败:{exc}', throttle_duration_sec=2.0) - self._frame_i += 1 - self._fps_meter(color, depth, depth_u16) - # 预览相关的工作(CPU 上色、IR 拷贝、四窗格绘制)每 N 帧才做一次 - # —— 它绝不能拖慢发布。 - do_push = ( - self._preview is not None - and (self._frame_i % self._preview_every) == 0 - ) - depth_bgr = None - ir_l_img = None - ir_r_img = None - if do_push: - if depth and depth_u16 is not None and depth_u16.size: - depth_bgr = self._colorize_depth(depth, depth_u16) - ir_l_img = np.asanyarray(ir_l.get_data()).copy() if ir_l else None - ir_r_img = np.asanyarray(ir_r.get_data()).copy() if ir_r else None - # 只有在拿不到原始左目 IR 流时,才用彩色灰度来顶替。 - if ir_l_img is None and self._infra_mode != 'both': - ir_l_img = np.mean(bgr, axis=2).astype(np.uint8) - if not got: - got = True - sw, sh = int(bgr.shape[1]), int(bgr.shape[0]) - self.get_logger().info(f'首帧 {sw}x{sh}') - if self._preview is not None: - self._preview.set_pane_titles( - f"COLOR {sw}x{sh}", - "DEPTH", - "IR-L (左红外)", - "IR-R (右红外)", - ) - try: - t_pub = time.monotonic() - if self._ir1_pub is not None and ir_l is not None: - self._publish_ir(ir_l, self._ir1_pub) - if self._ir2_pub is not None and ir_r is not None: - self._publish_ir(ir_r, self._ir2_pub) - self._t_pub = time.monotonic() - t_pub - if do_push: - self._reload_site_preview(int(bgr.shape[1]), int(bgr.shape[0])) - hold = max(0.0, self._overlay_hold_sec) - age = time.monotonic() - self._overlay_stamp - if self._overlay_detection and self._overlay is not None and age > hold: - self._overlay = None - self._preview.set_overlay(None) - if self._overlay_detection and ( - self._overlay is None or age > hold - ): - self._preview.set_status( - '没有框 —— 检查 perception_node / conf' - ) - else: - self._preview.set_status('') - self._preview.push_views( - bgr.copy(), depth_bgr, ir_l_img, ir_r_img - ) - except Exception as exc: # noqa: BLE001 - # 上下文可能正在关闭 - if not self._running: - break - self.get_logger().warn( - f'发布失败:{exc}', throttle_duration_sec=2.0 - ) - - def _publish_ir(self, frame, pub) -> None: - """把原始 IR 成像器以 mono8 发布,供外部查看器进程使用。""" - arr = np.asanyarray(frame.get_data()) - h, w = int(arr.shape[0]), int(arr.shape[1]) - msg = Image() - msg.header.stamp = self.get_clock().now().to_msg() - msg.header.frame_id = self._frame_id - msg.height = h - msg.width = w - msg.encoding = 'mono8' - msg.is_bigendian = 0 - msg.step = w - msg.data = array.array('B', np.ascontiguousarray(arr).tobytes()) - pub.publish(msg) - - def _fps_meter(self, color, depth, depth_u16) -> None: - """记录发布帧率与硬件帧率 —— 用来区分循环太慢 - (预览/CPU)和 SDK 侧掉帧(自动曝光长曝光 / USB)。""" - now = time.monotonic() - try: - fn_c = int(color.get_frame_number()) - except Exception: # noqa: BLE001 - fn_c = -1 - try: - fn_d = int(depth.get_frame_number()) if depth else -1 - except Exception: # noqa: BLE001 - fn_d = -1 - if self._fps_t0 <= 0.0: - self._fps_t0 = now - self._fps_pub_color = 0 - self._fps_pub_depth = 0 - self._fps_fn_color = fn_c - self._fps_fn_depth = fn_d - return - self._fps_pub_color += 1 - if depth_u16 is not None: - self._fps_pub_depth += 1 - dt = now - self._fps_t0 - if dt < 5.0: - return - hw_c = (fn_c - self._fps_fn_color) / dt if self._fps_fn_color >= 0 and fn_c >= 0 else -1.0 - hw_d = (fn_d - self._fps_fn_depth) / dt if self._fps_fn_depth >= 0 and fn_d >= 0 else -1.0 - self.get_logger().info( - f'stream fps color={self._fps_pub_color / dt:.1f} (hw {hw_c:.1f}) ' - f'depth={self._fps_pub_depth / dt:.1f} (hw {hw_d:.1f}) ' - f'wait={self._t_wait * 1e3:.0f} align={getattr(self, "_t_align", 0.0) * 1e3:.0f} ' - f'pub={getattr(self, "_t_pub", 0.0) * 1e3:.0f}ms' - ) - self._fps_t0 = now - self._fps_pub_color = 0 - self._fps_pub_depth = 0 - self._fps_fn_color = fn_c - self._fps_fn_depth = fn_d - - -def main(args=None) -> None: - rclpy.init(args=args) - node = RealsenseColorPub() - try: - preview = getattr(node, '_preview', None) - if preview is not None: - app = node._qt_app - # 关闭窗口绝不能停掉相机 —— 跟踪需要这条数据流。 - while rclpy.ok() and node._running: - rclpy.spin_once(node, timeout_sec=0.01) - app.processEvents() - if node._preview is not None and not node._preview.isVisible(): - node.get_logger().warn( - '预览已关闭 —— 相机继续发布' - ) - node._preview = None - else: - rclpy.spin(node) - except KeyboardInterrupt: - pass - finally: - node._running = False - if node._pipe is not None: - try: - node._pipe.stop() - except Exception: # noqa: BLE001 - pass - if node._thread is not None: - node._thread.join(timeout=1.0) - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_sdk_view.py b/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_sdk_view.py deleted file mode 100644 index 1bb3b14..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_sdk_view.py +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env python3 -"""RealSense SDK 预览:固定的 2x2 Qt 窗格(彩色 / 深度 / IR-L / IR-R)。 - -把四路画面拼成一张 pixmap 时,一旦缺了深度 / IR 看起来就像单相机视图。 -现在每路画面都有自己带标题的独立窗格。 -""" - -from __future__ import annotations - -import threading -from typing import Optional, Sequence, Tuple - -import numpy as np - -try: - from PySide6.QtCore import Qt, QTimer - from PySide6.QtGui import QImage, QPixmap - from PySide6.QtWidgets import ( - QApplication, - QGridLayout, - QLabel, - QMainWindow, - QSizePolicy, - QVBoxLayout, - QWidget, - ) -except Exception: # noqa: BLE001 - QApplication = None # type: ignore - - -def _to_bgr(img: Optional[np.ndarray]) -> Optional[np.ndarray]: - if img is None: - return None - vis = img - if vis.ndim == 2: - vis = np.stack([vis, vis, vis], axis=-1) - elif vis.ndim == 3 and vis.shape[2] == 4: - vis = vis[:, :, :3] - if vis.dtype != np.uint8: - vis = np.clip(vis, 0, 255).astype(np.uint8) - return np.ascontiguousarray(vis) - - -def _bgr_to_pixmap(bgr: np.ndarray) -> "QPixmap": - rgb = np.ascontiguousarray(bgr[:, :, ::-1]) - h, w, _ = rgb.shape - qimg = QImage(rgb.data, w, h, w * 3, QImage.Format_RGB888).copy() - return QPixmap.fromImage(qimg) - - -def _placeholder(text: str, w: int = 424, h: int = 240) -> np.ndarray: - vis = np.zeros((h, w, 3), dtype=np.uint8) - vis[:] = (28, 28, 28) - try: - import cv2 - - cv2.putText( - vis, text, (16, h // 2), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (180, 180, 180), 2 - ) - except Exception: # noqa: BLE001 - pass - return vis - - -class SdkPreviewWindow(QMainWindow): - def __init__(self, title: str = "RealSense") -> None: - super().__init__() - self.setWindowTitle(title) - self._lock = threading.Lock() - self._color: Optional[np.ndarray] = None - self._depth: Optional[np.ndarray] = None - self._ir_l: Optional[np.ndarray] = None - self._ir_r: Optional[np.ndarray] = None - self._overlay: Optional[Sequence[float]] = None - self._status: str = "" - self._hud: str = "" - - central = QWidget() - grid = QGridLayout(central) - grid.setContentsMargins(6, 6, 6, 6) - grid.setSpacing(6) - self._img_labels: Tuple[QLabel, QLabel, QLabel, QLabel] - self._cap_labels: Tuple[QLabel, QLabel, QLabel, QLabel] - panes = [] - caps = [] - for row, col, name in ( - (0, 0, "COLOR"), - (0, 1, "DEPTH"), - (1, 0, "IR-L (左红外)"), - (1, 1, "IR-R (右红外)"), - ): - box, lab, cap = self._make_pane(name) - grid.addWidget(box, row, col) - panes.append(lab) - caps.append(cap) - self._img_labels = tuple(panes) # type: ignore[assignment] - self._cap_labels = tuple(caps) # type: ignore[assignment] - self.setCentralWidget(central) - self.resize(1360, 820) - self.setMinimumSize(880, 520) - - self._timer = QTimer(self) - self._timer.timeout.connect(self._redraw) - self._timer.start(66) - - @staticmethod - def _make_pane(title: str) -> Tuple[QWidget, QLabel, QLabel]: - box = QWidget() - lay = QVBoxLayout(box) - lay.setContentsMargins(0, 0, 0, 0) - lay.setSpacing(2) - cap = QLabel(title) - cap.setAlignment(Qt.AlignCenter) - cap.setStyleSheet("color:#e8e8e8; font-weight:600; font-size:13px; background:#222;") - img = QLabel("等待画面 …") - img.setAlignment(Qt.AlignCenter) - img.setMinimumSize(400, 220) - img.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - img.setStyleSheet("background:#111; color:#777;") - img.setScaledContents(False) - lay.addWidget(cap) - lay.addWidget(img, 1) - return box, img, cap - - def set_pane_titles(self, color: str, depth: str, ir_l: str, ir_r: str) -> None: - for lab, text in zip(self._cap_labels, (color, depth, ir_l, ir_r)): - lab.setText(text) - - def push_bgr(self, bgr: np.ndarray) -> None: - self.push_views(bgr) - - def push_views( - self, - color: np.ndarray, - depth_bgr: Optional[np.ndarray] = None, - ir_left: Optional[np.ndarray] = None, - ir_right: Optional[np.ndarray] = None, - ) -> None: - with self._lock: - self._color = color - self._depth = depth_bgr - self._ir_l = ir_left - self._ir_r = ir_right - - def set_overlay(self, data: Optional[Sequence[float]]) -> None: - with self._lock: - self._overlay = data - - def set_status(self, text: str) -> None: - with self._lock: - self._status = text or "" - - def _draw_overlay(self, bgr: np.ndarray, ov, status: str) -> np.ndarray: - vis = bgr - need = (ov is not None and len(ov) >= 8) or bool(status) - if not need: - return vis - try: - import cv2 - except Exception: # noqa: BLE001 - return vis - vis = bgr.copy() - if ov is not None and len(ov) >= 8: - x1, y1, x2, y2 = [int(round(v)) for v in ov[:4]] - cx, cy = int(round(ov[6])), int(round(ov[7])) - cv2.rectangle(vis, (x1, y1), (x2, y2), (0, 255, 0), 2) - cv2.drawMarker( - vis, - (vis.shape[1] // 2, vis.shape[0] // 2), - (255, 255, 0), - cv2.MARKER_CROSS, - 20, - 2, - ) - cv2.circle(vis, (cx, cy), 6, (0, 0, 255), -1) - conf = float(ov[4]) if len(ov) > 4 else 0.0 - z = float(ov[8]) if len(ov) > 8 else 0.0 - cv2.putText( - vis, - f"{conf:.2f} z={z:.3f}m", - (x1, max(20, y1 - 8)), - cv2.FONT_HERSHEY_SIMPLEX, - 0.65, - (0, 255, 0), - 2, - ) - if status: - is_right = ("91" in status) or ("右" in status) - col = (0, 140, 255) if is_right else (40, 200, 255) - cv2.rectangle(vis, (0, 0), (vis.shape[1], 40), (16, 16, 16), -1) - cv2.putText( - vis, - status[:80], - (12, 28), - cv2.FONT_HERSHEY_SIMPLEX, - 0.75, - col, - 2, - ) - return vis - - def _set_pane(self, label: QLabel, bgr: Optional[np.ndarray], empty: str) -> None: - vis = _to_bgr(bgr) - if vis is None: - vis = _placeholder(empty) - pix = _bgr_to_pixmap(vis) - slot = label.size() - if slot.width() > 4 and slot.height() > 4: - pix = pix.scaled(slot, Qt.KeepAspectRatio, Qt.FastTransformation) - label.setPixmap(pix) - - def _redraw(self) -> None: - with self._lock: - color = None if self._color is None else self._color - depth = self._depth - ir_l = self._ir_l - ir_r = self._ir_r - ov = self._overlay - status = self._status - if color is None: - return - color = self._draw_overlay(color, ov, status) - labs = self._img_labels - self._set_pane(labs[0], color, "无彩色") - self._set_pane(labs[1], depth, "无深度") - self._set_pane(labs[2], ir_l, "无 IR-L") - self._set_pane(labs[3], ir_r, "无 IR-R") - - -def ensure_app() -> "QApplication": - if QApplication is None: - raise RuntimeError("RealSense 预览窗口缺少 PySide6,无法创建") - app = QApplication.instance() - if app is None: - app = QApplication([]) - return app diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_view.py b/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_view.py deleted file mode 100644 index e1a6c87..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/realsense_view.py +++ /dev/null @@ -1,292 +0,0 @@ -#!/usr/bin/env python3 -"""realsense_view —— D405 四窗格预览(COLOR|DEPTH|IR-L|IR-R),独立进程运行。 - -相机节点(``realsense_color_pub``)只负责发布话题。所有 Qt 工作都放在这里, -这样绘制永远不会拖垮相机采集循环(两者同进程时,Python 的 GIL 会让 ``publish`` -的墙钟耗时从 1 ms 跳到约 70 ms)。关闭窗口只是隐藏预览;Ctrl+C 才停止查看器 -(相机仍在持续发布)。 -""" - -from __future__ import annotations - -import threading -import time -from typing import Optional - -import numpy as np -import rclpy -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node -from rclpy.qos import ( - HistoryPolicy, - QoSProfile, - ReliabilityPolicy, - qos_profile_sensor_data, -) -from sensor_msgs.msg import Image -from std_msgs.msg import Float32MultiArray - -from arm_application.realsense_color_pub import _site_yaml_path -from arm_application.ros_node import TolerantNode - - -def _colorize_depth_u16(d: np.ndarray) -> np.ndarray: - """为预览窗格做快速 numpy JET 上色(不使用 SDK 的 colorizer)。""" - vis = np.zeros((d.shape[0], d.shape[1], 3), dtype=np.uint8) - valid = d > 0 - if not valid.any(): - return vis - x = d.astype(np.float32) - lo, hi = np.percentile(x[valid], [5, 95]) - hi = max(float(hi), float(lo) + 1.0) - gray = (np.clip((x - lo) / (hi - lo), 0.0, 1.0) * 255.0).astype(np.uint8) - gray[~valid] = 0 - try: - import cv2 - - vis = cv2.applyColorMap(gray, cv2.COLORMAP_JET) - vis[~valid] = 0 - except Exception: # noqa: BLE001 - vis[:, :, 0] = gray - vis[:, :, 1] = gray - vis[:, :, 2] = gray - return vis - - -def _mono_to_bgr(mono: np.ndarray) -> np.ndarray: - return np.ascontiguousarray(np.stack([mono, mono, mono], axis=-1)) - - -class RealsenseView(TolerantNode): - def __init__(self) -> None: - super().__init__('realsense_view') - self.declare_parameter('camera_name', 'd405') - self.declare_parameter('overlay_hold_sec', 0.10) - self.declare_parameter('overlay_detection', True) - # D405 用 workpiece/detection;D435 用 workpiece/detection_overhead(像素坐标系不同)。 - self.declare_parameter('detection_topic', 'workpiece/detection') - self.declare_parameter('view_hz', 20.0) - self.declare_parameter('hud_label', '') - self._name = str(self.get_parameter('camera_name').value).strip().strip('/') - self._hold = max(0.0, float(self.get_parameter('overlay_hold_sec').value)) - self._overlay_detection = bool(self.get_parameter('overlay_detection').value) - self._det_topic = str(self.get_parameter('detection_topic').value or '').strip() or ( - 'workpiece/detection' - ) - self._hud = str(self.get_parameter('hud_label').value or '').strip() - - self._color: Optional[Image] = None - self._depth: Optional[Image] = None - self._ir1: Optional[Image] = None - self._ir2: Optional[Image] = None - self._overlay: Optional[list] = None - self._overlay_stamp = 0.0 - # stage2 孔对准叠图(已是标注好的 BGR 图),新鲜时 COLOR 窗格直接显示它 - self._stage2_img: Optional[np.ndarray] = None - self._stage2_stamp = 0.0 - self._site_yaml = _site_yaml_path() - self._site_mtime = 0.0 - # RX 速率表 —— 用来直观诊断卡顿(是传输问题还是绘制问题) - self._rx_color = 0 - self._rx_depth = 0 - self._rx_ir = 0 - self._rx_t0 = 0.0 - - qos = qos_profile_sensor_data # BEST_EFFORT keep_last(1) - base = f'/{self._name}' - self.create_subscription(Image, f'{base}/color/image_raw', self._on_color, qos) - self.create_subscription( - Image, f'{base}/aligned_depth_to_color/image_raw', self._on_depth, qos - ) - self.create_subscription( - Image, f'{base}/infra1/image_rect_raw', self._on_ir1, qos - ) - self.create_subscription( - Image, f'{base}/infra2/image_rect_raw', self._on_ir2, qos - ) - det_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.RELIABLE, - ) - if self._overlay_detection: - self.create_subscription( - Float32MultiArray, self._det_topic, self._on_det, det_qos - ) - # stage2 孔对准叠图(k1/k2 标注 + 残差 HUD),有它时优先显示 - self.create_subscription( - Image, '/stage2/overlay', self._on_stage2_overlay, qos_profile_sensor_data - ) - - from arm_application.realsense_sdk_view import SdkPreviewWindow, ensure_app - - self._qt_app = ensure_app() - hud = self._hud or self._name - self._preview = SdkPreviewWindow( - title=f'{hud} /{self._name} COLOR|DEPTH|IR (查看器)' - ) - self._preview.set_pane_titles( - 'COLOR', 'DEPTH', 'IR-L (左红外)', 'IR-R (右红外)' - ) - self._preview.show() - hz = max(5.0, min(30.0, float(self.get_parameter('view_hz').value))) - self.create_timer(1.0 / hz, self._push) - self.get_logger().info( - f'查看器已启动 —— 订阅 /{self._name}/color|depth|infra1|infra2 ' - f'检测={self._det_topic if self._overlay_detection else "关"} ' - f'(保留 {self._hold:.2f}s)。关闭窗口 = 仅隐藏。' - ) - - # 回调只存最新消息;转换在 _push 里做。 - def _on_color(self, msg: Image) -> None: - self._color = msg - self._rx_color += 1 - - def _on_depth(self, msg: Image) -> None: - self._depth = msg - self._rx_depth += 1 - - def _on_ir1(self, msg: Image) -> None: - self._ir1 = msg - self._rx_ir += 1 - - def _on_ir2(self, msg: Image) -> None: - self._ir2 = msg - - def _on_stage2_overlay(self, msg: Image) -> None: - try: - arr = np.frombuffer(msg.data, dtype=np.uint8).reshape( - int(msg.height), int(msg.width), 3 - ) - self._stage2_img = np.ascontiguousarray(arr) - self._stage2_stamp = time.monotonic() - except Exception: # noqa: BLE001 - pass - - def _on_det(self, msg: Float32MultiArray) -> None: - data = list(msg.data) - if not data: - self._overlay = None - self._overlay_stamp = 0.0 - if self._preview is not None: - self._preview.set_overlay(None) - return - self._overlay = data - self._overlay_stamp = time.monotonic() - if self._preview is not None: - self._preview.set_overlay(data) - - def _reload_site(self) -> None: - path = self._site_yaml - if not path.is_file(): - return - try: - mtime = path.stat().st_mtime - except OSError: - return - if mtime <= self._site_mtime: - return - self._site_mtime = mtime - try: - import yaml - - data = yaml.safe_load(path.read_text(encoding="utf-8")) or {} - cam = data.get("camera") or {} - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"site.yaml 重新加载失败:{exc}") - return - if "overlay_hold_sec" in cam: - # 顶视检测频率低,保留 launch 里设的较长 hold,别被 site 的 0.1s 冲掉。 - if "overhead" in self._det_topic: - return - hold = max(0.0, float(cam.get("overlay_hold_sec") or 0.0)) - if abs(hold - self._hold) > 1e-6: - self.get_logger().info( - f"overlay_hold_sec {self._hold:.2f}s → {hold:.2f}s (site.yaml)" - ) - self._hold = hold - - @staticmethod - def _bgr(msg: Image) -> np.ndarray: - return np.frombuffer(msg.data, dtype=np.uint8).reshape( - int(msg.height), int(msg.width), 3 - ) - - @staticmethod - def _mono(msg: Image) -> np.ndarray: - return np.frombuffer(msg.data, dtype=np.uint8).reshape( - int(msg.height), int(msg.width) - ) - - def _push(self) -> None: - if self._preview is None: - return - self._reload_site() - now = time.monotonic() - if self._rx_t0 <= 0.0: - self._rx_t0 = now - elif now - self._rx_t0 >= 5.0: - dt = now - self._rx_t0 - self.get_logger().info( - f'查看器接收 color={self._rx_color / dt:.1f}/s ' - f'depth={self._rx_depth / dt:.1f}/s ir={self._rx_ir / dt:.1f}/s' - ) - self._rx_t0 = now - self._rx_color = 0 - self._rx_depth = 0 - self._rx_ir = 0 - age = now - self._overlay_stamp - if self._overlay is not None and age > self._hold: - self._overlay = None - self._preview.set_overlay(None) - if self._overlay is None or age > self._hold: - miss = '没有框 —— 检查 perception_node / conf' - self._preview.set_status(f'{self._hud} {miss}' if self._hud else miss) - else: - self._preview.set_status(self._hud) - if self._color is None: - return - color = self._bgr(self._color) - # stage2 孔对准叠图新鲜时,COLOR 窗格直接显示它(带 k1/k2 标注 + 残差) - if self._stage2_img is not None and (now - self._stage2_stamp) < 2.5: - color = self._stage2_img - depth_bgr = None - if self._depth is not None: - d = np.frombuffer(self._depth.data, dtype=np.uint16).reshape( - int(self._depth.height), int(self._depth.width) - ) - depth_bgr = _colorize_depth_u16(d) - # 在这里(执行器线程)做 Mono→BGR,让 Qt 绘制线程保持轻量。 - ir1 = None if self._ir1 is None else _mono_to_bgr(self._mono(self._ir1)) - ir2 = None if self._ir2 is None else _mono_to_bgr(self._mono(self._ir2)) - self._preview.push_views(color, depth_bgr, ir1, ir2) - - -def main(args=None) -> None: - rclpy.init(args=args) - node = RealsenseView() - app = node._qt_app - # ROS 回调(图像反序列化、深度上色、推送)跑在执行器线程上; - # 主线程只负责绘制 Qt —— 不会有共享的 GIL 突发。 - executor = MultiThreadedExecutor(num_threads=3) - executor.add_node(node) - spin_t = threading.Thread(target=executor.spin, daemon=True) - spin_t.start() - try: - while rclpy.ok() and spin_t.is_alive(): - app.processEvents() - time.sleep(0.005) - if node._preview is not None and not node._preview.isVisible(): - node.get_logger().warn('预览已关闭 —— 查看器挂起(相机仍在发布)') - node._preview = None - except KeyboardInterrupt: - pass - finally: - executor.shutdown() - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/run_joint_trajectory.py b/install/arm_application/lib/python3.11/site-packages/arm_application/run_joint_trajectory.py deleted file mode 100644 index 771b9ac..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/run_joint_trajectory.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python3 -"""通过 ``/follow_joint_trajectory`` 发送多点关节轨迹(真机 + mock 都适用)。""" - -from __future__ import annotations - -import time - -import rclpy -from rclpy.action import ActionClient -from rclpy.node import Node - -from arm_application.site_io import joint_prefix_default -from arm_msgs.action import FollowJointTrajectory - -from arm_application.ros_node import TolerantNode - -DEFAULT_JOINTS = [ - 'joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6', 'joint7', -] -NUM_JOINTS = 7 -# 扁平化存放的位置(3 个点 x 7 个关节)+ 时间 —— ROS 参数不支持列表套字典 -DEFAULT_TIMES = [3.0, 6.0, 9.0] -DEFAULT_POSITIONS = [ - 0.0, -0.698, 0.0, 1.57, 0.0, 0.698, 0.0, - 0.35, -0.698, 0.35, 1.57, 0.0, 0.698, 0.0, - 0.0, -0.698, 0.0, 1.57, 0.0, 0.698, 0.0, -] - - -class RunJointTrajectory(TolerantNode): - def __init__(self) -> None: - super().__init__('run_joint_trajectory') - self.declare_parameter('joint_prefix', joint_prefix_default()) - self.declare_parameter('joint_names', DEFAULT_JOINTS) - self.declare_parameter('velocity_scale', 0.15) - self.declare_parameter('action_name', 'follow_joint_trajectory') - self.declare_parameter('waypoint_times', DEFAULT_TIMES) - self.declare_parameter('waypoint_positions', DEFAULT_POSITIONS) - # 1 = 只跑一次(默认);0 = 循环直到 Ctrl+C;N = 重复 N 次 - self.declare_parameter('loop_count', 1) - self.declare_parameter('pause_between_loops', 0.5) - - prefix = str(self.get_parameter('joint_prefix').value or '') - base = list( - self.get_parameter('joint_names').get_parameter_value().string_array_value - or DEFAULT_JOINTS - ) - self.joint_names = [f'{prefix}{n}' for n in base] - self.velocity_scale = float(self.get_parameter('velocity_scale').value) - action = str(self.get_parameter('action_name').value) - self._action_name = action - self._client = ActionClient(self, FollowJointTrajectory, action) - - def run(self) -> int: - if not self._client.wait_for_server(timeout_sec=15.0): - self.get_logger().error( - f'Action [{self._action_name}] 不可用。' - '请先启动真机栈:bash scripts/run_real.sh' - ) - return 1 - - times = list(self.get_parameter('waypoint_times').value) - positions = list(self.get_parameter('waypoint_positions').value) - n_j = len(self.joint_names) - n_pts = len(times) - if n_pts < 1: - self.get_logger().error('waypoint_times 为空') - return 1 - if len(positions) != n_pts * n_j: - self.get_logger().error( - f'waypoint_positions 长度 {len(positions)} != ' - f'{n_pts} 个点 x {n_j} 个关节 = {n_pts * n_j}' - ) - return 1 - - goal = FollowJointTrajectory.Goal() - goal.joint_names = self.joint_names - goal.num_points = n_pts - goal.velocity_scale = self.velocity_scale - goal.positions = positions - goal.time_from_start = [float(t) for t in times] - - loop_count = int(self.get_parameter('loop_count').value) - pause = float(self.get_parameter('pause_between_loops').value) - duration = goal.time_from_start[-1] - if loop_count == 0: - self.get_logger().info( - f'循环模式:{goal.num_points} 个点,约 {duration:.1f}s/圈 ' - f'(Ctrl+C 停止)' - ) - elif loop_count > 1: - self.get_logger().info( - f'循环模式:{loop_count} 圈,{goal.num_points} 个点,' - f'约 {duration:.1f}s/圈' - ) - else: - self.get_logger().info( - f'发送 {goal.num_points} 个点,v_scale={goal.velocity_scale},' - f'时长={duration:.1f}s' - ) - - iteration = 0 - while rclpy.ok(): - iteration += 1 - if loop_count > 1: - self.get_logger().info(f'第 {iteration}/{loop_count} 圈') - - code = self._send_once(goal, duration) - if code != 0: - return code - - if loop_count == 1: - self.get_logger().info('完成:OK') - return 0 - if loop_count > 1 and iteration >= loop_count: - self.get_logger().info(f'完成:已跑完 {loop_count} 圈') - return 0 - if pause > 0: - time.sleep(pause) - - def _send_once(self, goal: FollowJointTrajectory.Goal, duration: float) -> int: - send = self._client.send_goal_async(goal) - deadline = time.monotonic() + 10.0 - while rclpy.ok() and not send.done(): - rclpy.spin_once(self, timeout_sec=0.05) - if time.monotonic() > deadline: - self.get_logger().error('发送目标超时') - return 2 - handle = send.result() - if handle is None or not handle.accepted: - self.get_logger().error('目标被拒绝') - return 3 - - res_fut = handle.get_result_async() - deadline = time.monotonic() + max(120.0, duration * 3.0) - next_log = time.monotonic() + 10.0 - while rclpy.ok() and not res_fut.done(): - rclpy.spin_once(self, timeout_sec=0.05) - now = time.monotonic() - if now >= next_log: - left = max(0.0, deadline - now) - self.get_logger().info( - f'正在执行轨迹(计划约 {duration:.0f}s),' - f'等待机器人……(剩余超时 {left:.0f}s)' - ) - next_log = now + 10.0 - if now > deadline: - self.get_logger().error('等待结果超时') - return 4 - result = res_fut.result().result - if not result.success: - self.get_logger().error(f'失败:{result.message}') - return 5 - self.get_logger().info(f'本圈结束:{result.message or "OK"}') - return 0 - - -def main(args=None) -> None: - rclpy.init(args=args) - node = RunJointTrajectory() - code = 1 - try: - code = node.run() - except KeyboardInterrupt: - code = 0 - finally: - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - raise SystemExit(code) - - -if __name__ == '__main__': - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/servo_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/servo_node.py deleted file mode 100644 index 10eb349..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/servo_node.py +++ /dev/null @@ -1,2357 +0,0 @@ -#!/usr/bin/env python3 -"""servo_node —— 100 Hz 的 Twist 视觉伺服(PBVS,独立进程,不跑 YOLO)。 - -硬性规则: -- 用 ``MultiThreadedExecutor`` + ``Reentrant`` 的 ``ControlCallbackGroup`` 驱动 100 Hz 定时器 -- 只订阅 ``PointStamped``(不用 Service) -- ``cmd_vel`` 用 ``SystemDefaults`` + ``keep_last(1)``,保证驱动器总能看到最新指令 -- 看门狗:目标丢失 → 冻结外推、速度置零、清 I、轨迹置零 -- 只有在目标数据新鲜时才做延迟补偿 -- 绝不在 100 Hz 循环里调用 ``sendTransform`` -""" - -from __future__ import annotations - -import os -import math -import sys -import threading -import time -from collections import deque -from typing import Deque, List, Optional, Tuple - -import numpy as np -import rclpy -from geometry_msgs.msg import PointStamped, Twist -from std_msgs.msg import Bool, Float32 -from rclpy.callback_groups import MutuallyExclusiveCallbackGroup, ReentrantCallbackGroup -from rclpy.action import ActionClient -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node -from control_msgs.action import FollowJointTrajectory -from rclpy.qos import ( - DurabilityPolicy, - HistoryPolicy, - QoSProfile, - ReliabilityPolicy, - qos_profile_sensor_data, - qos_profile_system_default, -) -from sensor_msgs.msg import JointState -from tf2_ros import Buffer, TransformListener -from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint - -from arm_application.geom_ik import ( - RIZON_LINK_AXES, - dls_twist, - geometric_jacobian, - load_handeye_T, - quat_xyzw_to_R, -) -from arm_application.handeye_lib import cam_point_to_base, cam_to_base_T -from arm_application.overhead_oneshot import ( - D435_MOVEL_GAVE_UP, - D435_MOVEL_RETRY, - D435_MOVEL_RETRY_S, - D435_NEAR_CRUISE_MPS, - D435_SETTLE_S, - D435_VENDOR_MOVEL_VEL_MPS, - StillLock, - at_lock_height, - d405_commands_arm, - d435_movel_from_tcp, - flange_tilt_rad, - hold_translation_vz, - hybrid_cruise_vxy, - lock_z_velocity, - oneshot_concat_hold_ori, - oneshot_full_cruise_mps, - oneshot_full_segments, - oneshot_hop_limits, - oneshot_may_send_another, - oneshot_needs_verticalize, - wrist_needs_handoff, - z_locked_qos, -) -from arm_application.path_profile import smooth_joint_schedule, translate_hold_ori_waypoints -from arm_application.pid_controller import PidController -from arm_application.kalman_filter import KalmanFilter3D -from arm_application.feature_jump_guard import ( - ACCEPT, - HOLD, - REJECT, - FeatureJumpGate, -) -from arm_application.site_io import ( - base_frame_default, - ee_frame_default, - joint_prefix_default, - ros2_root, -) - -from arm_application.ros_node import TolerantNode - -try: - from flexiv_msgs.msg import RobotStates -except ImportError: # pragma: no cover - RobotStates = None # type: ignore - - -DEFAULT_JOINTS = [ - "joint1", "joint2", "joint3", "joint4", "joint5", "joint6", "joint7", -] - - -def _saturate_vec(v: np.ndarray, limit: float) -> np.ndarray: - n = float(np.linalg.norm(v)) - if n > limit > 0.0: - v = v * (limit / n) - return v - - -class ServoNode(TolerantNode): - def __init__(self) -> None: - super().__init__("servo_node") - tid = threading.get_ident() - self.get_logger().warn( - f"servo_node 已启动 pid={os.getpid()} thread_id={tid}" - ) - - self.declare_parameter("joint_prefix", joint_prefix_default()) - self.declare_parameter("joint_names", DEFAULT_JOINTS) - self.declare_parameter("base_frame", base_frame_default()) - self.declare_parameter("ee_frame", ee_frame_default()) - self.declare_parameter("camera_frame", "d405_color_optical_frame") - self.declare_parameter("traj_topic", "rizon_arm_controller/joint_trajectory") - self.declare_parameter( - "action_name", "rizon_arm_controller/follow_joint_trajectory" - ) - self.declare_parameter("point_topic", "visual_servo/filtered_point") - # 默认值只作兜底:真机运行一定由 launch 传入 site.yaml 的 paths.handeye_file。 - # 指向 /tmp 是历史遗留(标定临时产物),会让人误以为"标定结果在那里"。 - self.declare_parameter("handeye_file", "/home/cc/ros2/handeye/results/89_eye_in_hand.yaml") - # eye_in_hand = cam→法兰;eye_to_hand = cam→基座。写错会把固定相机当腕部用。 - self.declare_parameter("handeye_mode", "eye_in_hand") - self.declare_parameter("use_static_handeye_tf", False) - self.declare_parameter("handeye_child_frame", "d405_color_optical_frame") - - self.declare_parameter("control_hz", 100.0) - self.declare_parameter("z_ref_m", 0.40) - self.declare_parameter("z_min_m", 0.25) - self.declare_parameter("approach_xy_gate_m", 0.040) - self.declare_parameter("v_approach_z", 0.025) - self.declare_parameter("enable_control", False) - self.declare_parameter("max_extrapolate_sec", 0.18) - self.declare_parameter("predict_enable", True) - self.declare_parameter("predict_sec", 0.10) - self.declare_parameter("predict_v_max", 0.35) - self.declare_parameter("predict_jump_m", 0.08) - # 大跳变要连续多少帧指向同一新位置才采信(见 feature_jump_guard 的注释)。 - # 30Hz 下 3 帧 ≈ 0.1s:真的重定位 0.1s 就被认,假点(乱跳)永远认不了。 - self.declare_parameter("jump_confirm_frames", 3) - # 特征点位置合理性:必须落在工作盒 XY 内(含此余量 [m])。跑出去的点几乎必然 - # 是误检(见 feature_jump_guard 的注释),当"没有目标"处理。 - self.declare_parameter("feat_ws_margin_m", 0.05) - - # --- 看门狗(丢失目标即硬停) --- - self.declare_parameter("watchdog_timeout_sec", 1.2) - self.declare_parameter("stale_hold_sec", 0.28) # 触发看门狗前先冻结 XY - - # --- PID --- - self.declare_parameter("kp_xy", 2.00) - self.declare_parameter("ki_xy", 0.02) - self.declare_parameter("kd_xy", 0.50) - self.declare_parameter("kp_z", 1.20) - self.declare_parameter("ki_z", 0.02) - self.declare_parameter("kd_z", 0.45) - self.declare_parameter("i_limit_xy", 0.03) - self.declare_parameter("i_limit_z", 0.025) - # 积分分离阈值 - self.declare_parameter("i_sep_pos_m", 0.005) - self.declare_parameter("i_sep_ang_rad", 0.02) - - self.declare_parameter("deadzone_m", 0.008) - self.declare_parameter("deadzone_z_m", 0.012) - self.declare_parameter("v_max_xy", 0.06) - self.declare_parameter("v_max_z", 0.04) - # 远处限速(防"追着假目标把臂带走"):目标离得超过 slow_far_m 时 XY 限速到 - # v_slow_xy。真机 2026-10-08:0.7s 内被假 k0 从 home 带走 400mm 到工作盒角落。 - self.declare_parameter("slow_far_m", 0.05) - self.declare_parameter("v_slow_xy", 0.08) - self.declare_parameter("a_max", 0.45) - self.declare_parameter("lost_timeout_sec", 1.2) # 别名 / 用时间戳年龄兜底 - self.declare_parameter("e_xy_clip_m", 0.080) # 误差绝不按大于 8 cm 处理 - - # --- 速度低通滤波(把 100Hz 平滑成轨迹) --- - self.declare_parameter("vel_lpf_alpha", 0.40) - self.declare_parameter("wz_lpf_alpha", 0.40) - - # --- JTC 的 dq 滑动窗口 --- - self.declare_parameter("dq_window_size", 5) - - self.declare_parameter("min_ee_z_m", 0.20) - self.declare_parameter("workspace_xyz_min", [0.15, -0.50, 0.18]) - self.declare_parameter("workspace_xyz_max", [0.80, 0.50, 0.60]) - # base 系下的末端保持(法兰)。Z/XY 单位为米,可通过 site.yaml 修改。 - self.declare_parameter("ee_x_m", 0.25) - self.declare_parameter("ee_y_m", 0.00) - self.declare_parameter("ee_z_m", 0.25) - self.declare_parameter("ee_hold_xy", False) - self.declare_parameter("ee_vertical_down", True) - # hover = 让法兰/夹爪中心 XY 停在三维特征点上(任意锁定高度都可)。 - # lookat = 对准图像中心。hover_offset_ee_xy_m 是法兰 XY 到爪中心的偏移。 - self.declare_parameter("xy_track", "hover") - self.declare_parameter("hover_offset_ee_xy_m", [0.0, 0.0]) - self.declare_parameter("arm_label", "") - self.declare_parameter("ee_hold_kp", 2.0) - self.declare_parameter("ee_w_max", 0.60) - self.declare_parameter("damping", 0.08) - self.declare_parameter("max_qdot", 0.85) - self.declare_parameter("exec_horizon_sec", 0.20) - self.declare_parameter("traj_stream_hz", 15.0) - self.declare_parameter("min_cmd_delta_rad", 0.004) - self.declare_parameter("camera_fx", 390.0) - self.declare_parameter("camera_fy", 390.0) - self.declare_parameter("camera_cx", 320.0) - self.declare_parameter("camera_cy", 240.0) - # Seek:到达锁定高度却没有有效目标时,扫描工作区域,让 eye-in-hand - # 相机自己去找到工件(自适应找工件)。 - self.declare_parameter("seek_enabled", True) - self.declare_parameter("seek_radius_max_m", 0.16) - self.declare_parameter("seek_speed_mps", 0.05) - self.declare_parameter("seek_timeout_sec", 45.0) - # 悬停积分:用来突破约 4mm 的关节指令死区,否则 XY 收敛到最后几毫米 - # 时就会停滞、贴不到工件上。 - self.declare_parameter("ki_hover", 0.8) - # 串联用:XY 入死区 + Z 到锁高持续这么久 → /visual_servo/locked=True - self.declare_parameter("lock_hold_sec", 2.0) - # D405 跟住后法兰静止多久进二阶段。哨兵 -1 = 没从 site 接入。 - # lock_still_sec 仍须从 site 接上(缺了就报错)。 - # 厂家 MoveL 结束后,法兰连续停稳 d435_handback_sec 才打开 D405 框心。 - self.declare_parameter("lock_still_sec", -1.0) - self.declare_parameter("d435_handback_sec", -1.0) - self.declare_parameter("wrist_align_sec", -1.0) - self.declare_parameter("lock_still_move_m", -1.0) - self.declare_parameter("wrist_handoff_conf", -1.0) - self.declare_parameter("overhead_hold_s", -1.0) - # 只测 D435 位移:到位后不交 D405、不靠 D405 静止去锁二阶段。 - self.declare_parameter("d435_move_only", False) - self.declare_parameter("overhead_k0_topic", "visual_servo/overhead_k0") - self.declare_parameter("wrist_conf_topic", "visual_servo/wrist_conf") - - prefix = str(self.get_parameter("joint_prefix").value or "") - base = list( - self.get_parameter("joint_names").get_parameter_value().string_array_value - or DEFAULT_JOINTS - ) - self.joint_names = [f"{prefix}{n}" for n in base] - self.link_frames = [f"{prefix}link{i}" for i in range(1, 8)] - self.base_frame = str(self.get_parameter("base_frame").value) - self.ee_frame = str(self.get_parameter("ee_frame").value) - self.camera_frame = str(self.get_parameter("camera_frame").value) - self.handeye_child = str(self.get_parameter("handeye_child_frame").value) - self.use_static_tf = bool(self.get_parameter("use_static_handeye_tf").value) - - self.z_ref = float(self.get_parameter("z_ref_m").value) - self.z_min_m = float(self.get_parameter("z_min_m").value) - self.approach_xy_gate_m = float(self.get_parameter("approach_xy_gate_m").value) - self.v_approach_z = float(self.get_parameter("v_approach_z").value) - self.enable_control = bool(self.get_parameter("enable_control").value) - self.max_extrap = float(self.get_parameter("max_extrapolate_sec").value) - self.predict_enable = bool(self.get_parameter("predict_enable").value) - self.predict_sec = float(self.get_parameter("predict_sec").value) - self.predict_v_max = float(self.get_parameter("predict_v_max").value) - self.predict_jump_m = float(self.get_parameter("predict_jump_m").value) - self.jump_confirm_frames = max(1, int(self.get_parameter("jump_confirm_frames").value)) - self.feat_ws_margin_m = float(self.get_parameter("feat_ws_margin_m").value) - self.watchdog_timeout = float(self.get_parameter("watchdog_timeout_sec").value) - self.stale_hold_sec = float(self.get_parameter("stale_hold_sec").value) - self.deadzone_m = float(self.get_parameter("deadzone_m").value) - self.deadzone_z_m = float(self.get_parameter("deadzone_z_m").value) - self.v_max_xy = float(self.get_parameter("v_max_xy").value) - self.v_max_z = float(self.get_parameter("v_max_z").value) - # 远处限速:目标离得比 slow_far_m 远时,XY 速度降到 v_slow_xy(见 hover 段注释) - self.slow_far_m = float(self.get_parameter("slow_far_m").value) - self.v_slow_xy = float(self.get_parameter("v_slow_xy").value) - self.a_max = float(self.get_parameter("a_max").value) - self.lost_timeout = float(self.get_parameter("lost_timeout_sec").value) - self.e_xy_clip = float(self.get_parameter("e_xy_clip_m").value) - self.kp_xy = float(self.get_parameter("kp_xy").value) - self.vel_lpf_alpha = float(np.clip(float(self.get_parameter("vel_lpf_alpha").value), 0.05, 1.0)) - self.wz_lpf_alpha = float(np.clip(float(self.get_parameter("wz_lpf_alpha").value), 0.05, 1.0)) - self.dq_window_size = max(1, int(self.get_parameter("dq_window_size").value)) - self.min_ee_z = float(self.get_parameter("min_ee_z_m").value) - self.ee_x_m = float(self.get_parameter("ee_x_m").value) - self.ee_y_m = float(self.get_parameter("ee_y_m").value) - self.ee_z_m = float(self.get_parameter("ee_z_m").value) - self.ee_hold_xy = bool(self.get_parameter("ee_hold_xy").value) - self.ee_vertical_down = bool(self.get_parameter("ee_vertical_down").value) - self.xy_track = str(self.get_parameter("xy_track").value or "hover").strip().lower() - if self.xy_track not in ("hover", "lookat"): - self.xy_track = "hover" - off = list( - self.get_parameter("hover_offset_ee_xy_m").get_parameter_value().double_array_value - or [0.0, 0.0] - ) - self.hover_offset_ee_xy = np.array( - [float(off[0]) if len(off) > 0 else 0.0, float(off[1]) if len(off) > 1 else 0.0, 0.0], - dtype=float, - ) - self.arm_label = str(self.get_parameter("arm_label").value or "").strip() - self.ee_hold_kp = float(self.get_parameter("ee_hold_kp").value) - self.ee_w_max = float(self.get_parameter("ee_w_max").value) - self.damping = float(self.get_parameter("damping").value) - self.max_qdot = float(self.get_parameter("max_qdot").value) - self.exec_horizon = float(self.get_parameter("exec_horizon_sec").value) - self.traj_stream_hz = max(8.0, float(self.get_parameter("traj_stream_hz").value)) - self.min_cmd_delta = float(self.get_parameter("min_cmd_delta_rad").value) - self._last_traj_mono = 0.0 - self._fx = float(self.get_parameter("camera_fx").value) - self._fy = float(self.get_parameter("camera_fy").value) - self._cx = float(self.get_parameter("camera_cx").value) - self._cy = float(self.get_parameter("camera_cy").value) - self.seek_enabled = bool(self.get_parameter("seek_enabled").value) - self.seek_radius_max = float(self.get_parameter("seek_radius_max_m").value) - self.seek_speed = float(self.get_parameter("seek_speed_mps").value) - self.seek_timeout = float(self.get_parameter("seek_timeout_sec").value) - self.ki_hover = float(self.get_parameter("ki_hover").value) - self.lock_hold_sec = float(self.get_parameter("lock_hold_sec").value) - self.lock_still_sec = float(self.get_parameter("lock_still_sec").value) - self.d435_handback_sec = float(self.get_parameter("d435_handback_sec").value) - self.wrist_align_sec = float(self.get_parameter("wrist_align_sec").value) - self.lock_still_move_m = float(self.get_parameter("lock_still_move_m").value) - self.wrist_handoff_conf = float(self.get_parameter("wrist_handoff_conf").value) - self.overhead_hold_s = float(self.get_parameter("overhead_hold_s").value) - self.d435_move_only = bool(self.get_parameter("d435_move_only").value) - self._hybrid = ( - self.lock_still_sec >= 0.0 - and self.d435_handback_sec >= 0.0 - and self.wrist_align_sec >= 0.0 - and self.lock_still_move_m >= 0.0 - and self.wrist_handoff_conf >= 0.0 - and self.overhead_hold_s >= 0.0 - ) - # 框心对准进精拍用 wrist_align_sec。D435 交接只用 d435_handback_sec,两段不要合成一个数。 - self._still = StillLock( - still_sec=max(0.0, self.wrist_align_sec), - still_move_m=max(0.0, self.lock_still_move_m), - ) - self._arrive = StillLock( - still_sec=max(0.0, self.d435_handback_sec), - still_move_m=max(0.0, self.lock_still_move_m), - ) - self._sw_cli = None - self._d435_vendor_done = False - self._d435_vendor_busy = False - self._d435_vendor_failed = False - self._d435_vendor_tries = 0 - self._d435_retry_after = 0.0 - self._d435_settled = False - self._d435_exec_until = 0.0 - self._d435_pinned = False - self._d435_sent = False - self._d435_last_dist = None - self._d435_give_up = False - self._d435_plan_lock = threading.Lock() - self._d435_inflight = False - self._d435_settle_until = 0.0 - self._d435_last_z_err = None - self._d435_z_stall = 0 - self._d435_remeasure_log = False - self._d435_vert_done = False - self._d435_full_done = False - self._d435_fix_done = False - self._track_source = "wrist" # wrist | overhead - self._wrist_conf: Optional[float] = None - self._wrist_conf_t = -1.0 - self._overhead_t = -1.0e9 - i_sep_pos = float(self.get_parameter("i_sep_pos_m").value) - self.i_sep_ang = float(self.get_parameter("i_sep_ang_rad").value) - ws_min = list( - self.get_parameter("workspace_xyz_min").get_parameter_value().double_array_value - or [0.30, -0.50, 0.15] - ) - ws_max = list( - self.get_parameter("workspace_xyz_max").get_parameter_value().double_array_value - or [0.80, 0.50, 0.60] - ) - self.ws_min = np.array([float(v) for v in ws_min[:3]], dtype=float) - self.ws_max = np.array([float(v) for v in ws_max[:3]], dtype=float) - - self.T_cam_to_gripper = load_handeye_T( - str(self.get_parameter("handeye_file").value) - ) - self.handeye_mode = str( - self.get_parameter("handeye_mode").value or "eye_in_hand" - ).strip().lower() - if self.handeye_mode not in ("eye_in_hand", "eye_to_hand"): - raise RuntimeError( - f"handeye_mode 只能是 eye_in_hand 或 eye_to_hand," - f"收到 {self.handeye_mode!r}" - ) - if self.handeye_mode == "eye_to_hand" and self.xy_track == "lookat": - raise RuntimeError( - "眼在手外相机固定,lookat 没有意义。xy_track 必须是 hover" - ) - if self.handeye_mode == "eye_in_hand" and not self._hybrid: - raise RuntimeError( - "腕部主跟踪必须从 site.yaml 接入 lock_still_sec / d435_handback_sec / " - "wrist_align_sec / lock_still_move_m / wrist_handoff_conf / overhead_hold_s。" - "收到哨兵 -1 = 配置没接线,不许用代码默认秒数假装已经静止判据。" - ) - R_he = np.asarray(self.T_cam_to_gripper[:3, :3], dtype=float) - t_he = np.asarray(self.T_cam_to_gripper[:3, 3], dtype=float) - axis_z = float(np.clip(R_he[2, 2], -1.0, 1.0)) - self._cam_tilt_deg = float(np.degrees(np.arccos(axis_z))) - he_path = str(self.get_parameter("handeye_file").value) - if self.handeye_mode == "eye_to_hand": - self.get_logger().warn( - f"HANDEYE yaml={he_path} mode=eye_to_hand " - f"cam_in_base=({t_he[0]:.3f},{t_he[1]:.3f},{t_he[2]:.3f})m " - f"— 悬停用 cam→基座,不乘法兰" - ) - else: - self.get_logger().warn( - f"HANDEYE yaml={he_path} " - f"cam_in_flange=({t_he[0]*1000:.1f},{t_he[1]*1000:.1f},{t_he[2]*1000:.1f})mm " - f"optical_vs_flangeZ={self._cam_tilt_deg:.1f}deg " - f"— 悬停使用这个 T,而不是用 TF 查询" - ) - if self.d435_move_only: - self.get_logger().warn( - "d435_move_only:只跑 D435 单次位移。到位停稳后钉住," - "不交 D405;locked 只用来结束一阶段,不进二阶段" - ) - - self.pid_x = PidController( - float(self.get_parameter("kp_xy").value), - float(self.get_parameter("ki_xy").value), - float(self.get_parameter("kd_xy").value), - i_limit=float(self.get_parameter("i_limit_xy").value), - out_limit=self.v_max_xy, - i_sep_thresh=i_sep_pos, - ) - self.pid_y = PidController( - float(self.get_parameter("kp_xy").value), - float(self.get_parameter("ki_xy").value), - float(self.get_parameter("kd_xy").value), - i_limit=float(self.get_parameter("i_limit_xy").value), - out_limit=self.v_max_xy, - i_sep_thresh=i_sep_pos, - ) - self.pid_z = PidController( - float(self.get_parameter("kp_z").value), - float(self.get_parameter("ki_z").value), - float(self.get_parameter("kd_z").value), - i_limit=float(self.get_parameter("i_limit_z").value), - out_limit=self.v_max_z, - i_sep_thresh=i_sep_pos, - ) - - self._control_cbg = ReentrantCallbackGroup() - self._state_cbg = MutuallyExclusiveCallbackGroup() - - self._lock = threading.Lock() - self._p_meas = np.zeros(3, dtype=float) - self._stamp_sec = -1.0 - self._last_seen_time = -1.0 # 单调时钟,每次收到 PointStamped 都会更新 - self._have_target = False - self._target_lost_flag = True - self._v_raw = np.zeros(3, dtype=float) - self._v_filt = np.zeros(3, dtype=float) # 线速度低通(相机系) - self._wz_filt = 0.0 # 预留的角速度 z 低通 - self._wz_raw = 0.0 - self._zeroed = True - self._last_js: Optional[JointState] = None - self._ctrl_count = 0 - self._ctrl_t0 = self.get_clock().now() - self._dq_hist: Deque[np.ndarray] = deque(maxlen=self.dq_window_size) - self._reacq_mono = 0.0 - self._xy_in_dead = False - self._v_xy_cmd = np.zeros(2, dtype=float) - self._p_feat_base: Optional[np.ndarray] = None - self._he_cmp_done = False - self._feat_kf = KalmanFilter3D(q_pos=2.0e-3, q_vel=1.5e-1, r_pos=4.0e-4) - # 大跳变确认门限:单帧不采信(见 feature_jump_guard 的注释与真机反例)。 - self._jump_gate = FeatureJumpGate(self.predict_jump_m, self.jump_confirm_frames) - # 只有当法兰 Z 已经落到锁定平面上(深度新鲜)才开启 XY 悬停。 - self._xy_armed = bool(self.ee_z_m <= 0.0) - self._z_hold: Optional[float] = None - # Seek(搜索)状态:在锁定高度且没有目标时扫描工件。 - self._seek_t0 = 0.0 - self._seek_theta = 0.0 - self._seek_origin = (0.0, 0.0) - self._seek_warned = False - self._hover_ixy = np.zeros(2, dtype=float) # 悬停积分(抗死区) - - point_topic = str(self.get_parameter("point_topic").value) - point_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=5, - reliability=ReliabilityPolicy.BEST_EFFORT, - ) - self.create_subscription( - PointStamped, - point_topic, - self._on_point, - point_qos, - callback_group=self._state_cbg, - ) - if self._hybrid: - oh_topic = str(self.get_parameter("overhead_k0_topic").value) - conf_topic = str(self.get_parameter("wrist_conf_topic").value) - self.create_subscription( - PointStamped, - oh_topic, - self._on_overhead_k0, - point_qos, - callback_group=self._state_cbg, - ) - self.create_subscription( - Float32, - conf_topic, - self._on_wrist_conf, - 5, - callback_group=self._state_cbg, - ) - self.create_subscription( - JointState, - "joint_states", - self._on_js, - 10, - callback_group=self._control_cbg, - ) - # 厂家 tcp_pose(WORLD)。D435 MoveL 必须在这上面加 ROS 相对位移。 - self._tcp_world: Optional[Tuple[float, float, float]] = None - self._t_tcp: Optional[float] = None - prefix_ns = str(self.get_parameter("joint_prefix").value or "").rstrip("_") - self.robot_states_topic = f"/{prefix_ns.replace('-', '_')}/flexiv_robot_states" - if RobotStates is not None: - self.create_subscription( - RobotStates, - self.robot_states_topic, - self._on_servo_robot_states, - qos_profile_sensor_data, - callback_group=self._state_cbg, - ) - else: - self.get_logger().error( - "没有 flexiv_msgs.RobotStates,D435 粗定位不能读厂家 tcp_pose," - "不许退回杀栈 MoveL" - ) - - cmd_qos = QoSProfile( - history=HistoryPolicy.KEEP_LAST, - depth=1, - reliability=qos_profile_system_default.reliability, - durability=qos_profile_system_default.durability, - ) - self._twist_pub = self.create_publisher( - Twist, "visual_servo/cmd_vel", cmd_qos - ) - # 一阶段锁定信号(串联编排器用它判断可以进入二阶段) - self._lock_pub = self.create_publisher(Bool, "visual_servo/locked", 1) - # TRANSIENT_LOCAL:感知节点比伺服晚起来,默认 QoS 会丢掉启动时那一拍 - # True,感知就永远停在「还没到锁高」、D435 不拍。两边必须同一份 QoS。 - self._z_lock_pub = self.create_publisher( - Bool, "visual_servo/z_locked", z_locked_qos() - ) - # 感知用它挡住「平移半路再拍一张」。晚启动也能拿到当前值。 - self._d435_cmd_pub = self.create_publisher( - Bool, "visual_servo/d435_commanding", z_locked_qos() - ) - self._d435_cmd_sent: Optional[bool] = None - self._z_locked_sent: Optional[bool] = None - self._z_lock_pub_mono = 0.0 - self._lock_since: Optional[float] = None - self._locked = False - self._lock_pub_t = 0.0 - traj_topic = str(self.get_parameter("traj_topic").value) - self._traj_pub = self.create_publisher(JointTrajectory, traj_topic, cmd_qos) - self._jtc_cbg = ReentrantCallbackGroup() - self._jtc = ActionClient( - self, - FollowJointTrajectory, - str(self.get_parameter("action_name").value), - callback_group=self._jtc_cbg, - ) - - self._tf = Buffer() - TransformListener(self._tf, self, spin_thread=True) - - control_hz = max(50.0, float(self.get_parameter("control_hz").value)) - self._ctrl_dt = 1.0 / control_hz - self.create_timer( - self._ctrl_dt, - self._control_tick, - callback_group=self._control_cbg, - ) - - mode = "控制已开启" if self.enable_control else "仅 cmd_vel" - arm = self.arm_label or self.ee_frame - self.get_logger().info( - f"伺服就绪 [{arm}] [{mode}] {control_hz:.0f}Hz watchdog={self.watchdog_timeout:.2f}s " - f"vel_lpf_α={self.vel_lpf_alpha:.2f} dq_win={self.dq_window_size} " - f"lock_z={self.ee_z_m:.3f}m (site servo.ee_z_m) " - f"xy_track={self.xy_track} cam_tilt={self._cam_tilt_deg:.1f}° " - f"cam_in_flange=({t_he[0]*1000:.0f},{t_he[1]*1000:.0f},{t_he[2]*1000:.0f})mm " - f"hover_off_ee_xy=({self.hover_offset_ee_xy[0]*1000:.1f},{self.hover_offset_ee_xy[1]*1000:.1f})mm " - f"base EE xy=({self.ee_x_m:.3f},{self.ee_y_m:.3f}) " - f"hold_xy={int(self.ee_hold_xy)} down={int(self.ee_vertical_down)} " - f"XY_after_lock_z±{self.approach_xy_gate_m*1000:.0f}mm" - ) - self._publish_z_locked(self._xy_armed) - self._publish_d435_commanding(False) - - def _publish_z_locked(self, locked: bool) -> None: - """法兰是否在锁高带里。只记日志,不拦 D435。 - - 状态没变也每 0.5 s 再发一次:只发一次的话,晚订阅的感知收不到。 - """ - locked = bool(locked) - now = time.monotonic() - changed = self._z_locked_sent is not locked - if (not changed) and (now - self._z_lock_pub_mono) < 0.5: - return - self._z_locked_sent = locked - self._z_lock_pub_mono = now - self._z_lock_pub.publish(Bool(data=locked)) - if not changed: - return - if locked: - self.get_logger().info("锁高已到位") - else: - self.get_logger().info("离开锁高带 —— 平移仍保持当前高度,不改去追锁高") - - def _publish_d435_commanding(self, commanding: bool) -> None: - """正在用 D435 那一个点赶路。感知看到 True 就不再拍第二张。""" - commanding = bool(commanding) - if self._d435_cmd_sent is commanding: - return - self._d435_cmd_sent = commanding - self._d435_cmd_pub.publish(Bool(data=commanding)) - - def _on_js(self, msg: JointState) -> None: - self._last_js = msg - - def _on_servo_robot_states(self, msg) -> None: - """缓存厂家 ``tcp_pose``(WORLD)。名字避开其它节点的 ``_on_robot_states``。""" - p = msg.tcp_pose.pose.position - xyz = (float(p.x), float(p.y), float(p.z)) - if not all(math.isfinite(v) for v in xyz): - return - self._tcp_world = xyz - self._t_tcp = time.monotonic() - - def _fresh_tcp_world(self): - """最近 0.5s 的厂家 TCP [m]。过期/没有 → None,不许用旧值凑。""" - if self._tcp_world is None or self._t_tcp is None: - return None - if time.monotonic() - float(self._t_tcp) > 0.5: - return None - return self._tcp_world - - def _on_wrist_conf(self, msg: Float32) -> None: - c = float(msg.data) - with self._lock: - self._wrist_conf = None if not np.isfinite(c) else c - self._wrist_conf_t = time.monotonic() - - def _on_overhead_k0(self, msg: PointStamped) -> None: - """D435 一次性:点已经在基座系。再乘腕部 T 会差几十厘米还看起来合理。""" - if not self._hybrid: - return - if not self.enable_control: - # 仅观察时不占臂:占着 d435_commanding 会把感知的预览框也卡死。 - self.get_logger().info( - "仅观察:收到 D435 点,不占臂、不挡 D405 预览", - throttle_duration_sec=2.0, - ) - return - fid = str(msg.header.frame_id or "").strip() - if fid and self.base_frame and fid != self.base_frame: - self.get_logger().error( - f"overhead_k0 的 frame_id={fid!r} 不是基座 {self.base_frame!r} —— 丢弃," - "不许当相机系点去乘手眼 T" - ) - return - p_base = np.array( - [float(msg.point.x), float(msg.point.y), float(msg.point.z)], dtype=float - ) - if not np.all(np.isfinite(p_base)): - return - if not self._feat_workspace_ok(p_base): - m = float(self.feat_ws_margin_m) - self.get_logger().warn( - f"D435 一次性点 ({p_base[0]:.3f},{p_base[1]:.3f}) 在工作盒外 " - f"(x[{self.ws_min[0]:.2f},{self.ws_max[0]:.2f}] " - f"y[{self.ws_min[1]:.2f},{self.ws_max[1]:.2f}] ±{m:.2f})" - "—— 丢弃,不发轨迹。这不是起步加速度。" - ) - return - with self._lock: - busy = self._track_source == "overhead" and not self._d435_settled - if busy: - self.get_logger().info( - "D435 这一段还没走完,不再换目标", - throttle_duration_sec=1.0, - ) - return - now_m = time.monotonic() - now_sec = self.get_clock().now().nanoseconds * 1e-9 - with self._lock: - self._p_feat_base = p_base.copy() - self._p_meas[:] = 0.0 - self._p_meas[2] = self.z_ref - self._feat_kf.reset(p_base, now_m) - self._jump_gate.reset() - self._have_target = True - self._target_lost_flag = False - self._track_source = "overhead" - self._d435_settled = False - self._d435_vendor_done = False - self._d435_vendor_busy = False - self._d435_vendor_failed = False - self._d435_vendor_tries = 0 - self._d435_retry_after = 0.0 - self._overhead_t = now_m - self._last_seen_time = now_m - self._stamp_sec = now_sec - self._seek_t0 = 0.0 - self._seek_warned = False - self._still.reset() - self._arrive.reset() - self._d435_exec_until = 0.0 - self._d435_pinned = False - self._d435_sent = False - self._d435_last_dist = None - self._d435_give_up = False - self._d435_inflight = False - self._d435_settle_until = 0.0 - self._d435_last_z_err = None - self._d435_z_stall = 0 - self._d435_remeasure_log = False - self._d435_vert_done = False - self._d435_full_done = False - self._d435_fix_done = False - self._d435_vendor_done = False - self._d435_vendor_busy = False - self._d435_vendor_failed = False - self._d435_vendor_tries = 0 - self._d435_retry_after = 0.0 - self._publish_d435_commanding(True) - self.get_logger().info( - f"D435 一次性设定 feat_base=({p_base[0]:.3f},{p_base[1]:.3f},{p_base[2]:.3f}) " - f"—— 走到这个点并停稳之前,不下发 D405 的点" - ) - - def _on_point(self, msg: PointStamped) -> None: - """新的视觉测量 —— 给看门狗“上弦”并清除丢失标志。""" - if ( - self._hybrid - and self._wrist_conf is not None - and wrist_needs_handoff(self._wrist_conf, self.wrist_handoff_conf) - ): - # 已经收到腕部 conf 且低于门槛:这条 D405 点不能当跟踪源。 - # conf 还是 None = 感知还没报到,不要把开场几帧也丢掉。 - return - with self._lock: - using_d435 = self._track_source == "overhead" - settled = self._d435_settled - # 到位必须是 MoveL 已经结束,不能把「还在赶路、XY 进了 15mm」当成到位。 - # 停稳计时也不许在这段路上累计,否则 D405 会在 D435 没走完时就开始带臂晃。 - if self._hybrid and not d405_commands_arm( - using_d435=using_d435, - arrived=(self._d435_vendor_done and not self._d435_vendor_busy), - settled=settled, - move_only=self.d435_move_only, - ): - # 推理不关。没到「法兰停稳」之前,这帧不能进运动控制。 - self.get_logger().info( - "D405 输出已截断:D435 厂家移动还没结束或法兰还没停稳", - throttle_duration_sec=1.0, - ) - return - p_cam = np.array( - [float(msg.point.x), float(msg.point.y), float(msg.point.z)], dtype=float - ) - T_ee = self._lookup_T(self.base_frame, self.ee_frame) - p_base = self._feature_in_base(T_ee, p_cam) if T_ee is not None else None - if not self._he_cmp_done: - self._he_cmp_done = True - self._log_handeye_tf_vs_yaml() - now_m = time.monotonic() - rejected = False - with self._lock: - was_lost = self._target_lost_flag - self._track_source = "wrist" - self._p_meas[:] = p_cam - if p_base is not None: - verdict = self._update_feat_track(p_base, was_lost=was_lost, now_m=now_m) - if verdict == ACCEPT: - self._p_feat_base = np.asarray(p_base, dtype=float).copy() - elif verdict == HOLD: - # hold 时下游必须拿到"钉住的旧位置":`_hover_vs_feature` 用的是 - # `_p_feat_base`,这里若照抄 p_base,就等于还是去追那个假点。 - self._p_feat_base = self._feat_kf.position.copy() - else: # REJECT:物理上不合理的点,当"没有目标"处理 - # 关键:必须同时清掉 `_have_target`。只清 `_p_feat_base` 不够 —— - # `_hover_vs_feature` 在 frozen=None 时会退回原始 `p_cam`, - # 那还是去追那个假点。 - self._p_feat_base = None - self._have_target = False - rejected = True - self._stamp_sec = float(msg.header.stamp.sec) + 1e-9 * float( - msg.header.stamp.nanosec - ) - self._last_seen_time = now_m - if not rejected: - self._have_target = True - self._target_lost_flag = False - self._seek_t0 = 0.0 # 已捕获目标 —— 重置 seek,供下次使用 - self._seek_warned = False - if msg.header.frame_id: - self.camera_frame = msg.header.frame_id - if p_base is not None: - v = self._feat_kf.velocity if self._feat_kf.initialized else np.zeros(3) - self.get_logger().info( - f"HANDEYE snap feat_base=({p_base[0]:.3f},{p_base[1]:.3f},{p_base[2]:.3f}) " - f"v_xy=({v[0]:+.3f},{v[1]:+.3f}) " - f"p_cam=({p_cam[0]:.3f},{p_cam[1]:.3f},{p_cam[2]:.3f})", - throttle_duration_sec=0.5, - ) - if was_lost: - self._reacq_mono = time.monotonic() - self.get_logger().info( - "已重新捕获目标 —— 继续伺服", - throttle_duration_sec=0.5, - ) - - def _feat_workspace_ok(self, p: np.ndarray) -> bool: - """特征点 XY 是否落在工作盒内(含余量)。 - - 只查 XY、**不查 Z**:特征点是**工件表面点**(z≈0.022,贴台面),而工作盒 - 的 z 区间(0.18~0.65)是给**法兰**用的,两者不是一回事。 - """ - m = float(self.feat_ws_margin_m) - return bool( - self.ws_min[0] - m <= float(p[0]) <= self.ws_max[0] + m - and self.ws_min[1] - m <= float(p[1]) <= self.ws_max[1] + m - ) - - def _slow_xy_limit(self, nerr: float, v_xy: float) -> tuple: - """远处限速:目标离得超过 ``slow_far_m`` 就把 XY 速度上限降到 ``v_slow_xy``。 - - 返回 ``(上限, 原因或 None)``。单拎出来是为了能**离线测**(不需要 ROS 实体)。 - - 为什么需要(2026-10-08 真机,一阶段):被一串高置信度假 k0(conf 0.53~0.73) - 顶掉后,伺服在 0.7s 内以 ``v_max_xy``=0.45m/s 把臂从 home ``(0.686,-0.113)`` - 带到工作盒角落 ``(0.083,-0.515)``,之后 148s 全是"检测漏检"、150s 超时。 - - 这道限速**与"目标真不真"无关** —— 它不试图判断真假,只保证"追错时走得少": - 真目标(实测真 k0 离 145mm)只是晚 ~1.8s 到位;假目标最多把臂带走几厘米。 - """ - if nerr > self.slow_far_m: - return min(float(v_xy), self.v_slow_xy), ( - f"目标离 {nerr*1000:.0f}mm > {self.slow_far_m*1000:.0f}mm" - ) - return float(v_xy), None - - def _update_feat_track( - self, p_base: np.ndarray, *, was_lost: bool, now_m: float - ) -> str: - """把一次特征观测并入 ``_feat_kf``;返回 :data:`ACCEPT` / ``HOLD`` / ``REJECT``。 - - 为什么要单拎出来(2026-10-08 真机实测):一阶段已经收敛到 9mm 之后,模型在 - 运动模糊下误检出一连串"假工件"(框置信度 0.13~0.47,位置各不相同),伺服每 - 个都追 —— 机械臂被带到工作盒边缘卡住(`ee_xy` 从 0.68,-0.12 漂到 0.07,-0.50, - 横移 0.62m)。两道独立防线: - - 1. **跳变确认**(:class:`FeatureJumpGate`):单帧大跳只 hold、不动;乱跳 - (每帧不同位置)永远确认不了 ⇒ 这一串假点全被挡掉。 - 2. **物理合理性**:跑出工作盒 XY 的点直接 reject —— 实测假点落在基座后方 - ``(-0.10,-0.65)``,而工件在 ``(0.5,-0.12)``。 - - 调用方必须在 ``self._lock`` 内调用(会改 ``_feat_kf`` 与 ``_jump_gate``)。 - """ - p = np.asarray(p_base, dtype=float).reshape(3) - - # --- 防线 2:物理合理性(先判,因为它在"单帧 vs 多帧"之外) --- - if not self._feat_workspace_ok(p): - self._feat_kf.zero_velocity() - self._jump_gate.reset() - self.get_logger().warn( - f"特征点 ({p[0]:.3f},{p[1]:.3f}) 在工作盒外" - f"(x[{self.ws_min[0]:.2f},{self.ws_max[0]:.2f}] " - f"y[{self.ws_min[1]:.2f},{self.ws_max[1]:.2f}] ±{self.feat_ws_margin_m:.2f})" - "—— 判为误检,当「没有目标」处理,不去追", - throttle_duration_sec=1.0, - ) - return REJECT - - # --- 防线 1:跳变确认 --- - if was_lost or (not self._feat_kf.initialized): - # 刚重新捕获:没有可信的历史位置可比,直接以新观测重定位。 - self._feat_kf.reset(p, now_m) - self._jump_gate.reset() - return ACCEPT - verdict = self._jump_gate.update(p[:2], self._feat_kf.position[:2]) - if verdict == FeatureJumpGate.JUMP: - self._feat_kf.reset(p, now_m) - return ACCEPT - if verdict == FeatureJumpGate.NEAR: - self._feat_kf.advance(now_m) - self._feat_kf.update(p) - return ACCEPT - - # HOLD:本次观测不采信。位置钉住不动,并把速度清零 —— 否则旧速度会把 - # "不动"变成"按旧速度匀速跑掉",正是要避免的那件事。 - self._feat_kf.zero_velocity() - dxy = float( - np.hypot(p[0] - self._feat_kf.position[0], p[1] - self._feat_kf.position[1]) - ) - self.get_logger().warn( - f"特征点疑似假跳 {dxy * 1000:.0f}mm > {self.predict_jump_m * 1000:.0f}mm" - f"(连续 {self._jump_gate.hold_frames} 帧)—— 本次不采信,位置保持不动;" - f"连续 {self._jump_gate.confirm_frames} 帧一致才认", - throttle_duration_sec=1.0, - ) - return HOLD - - def _reset_motion_state(self) -> None: - """硬停内部状态:I=0、滤波速度=0、dq 窗口清空。""" - self.pid_x.reset() - self.pid_y.reset() - self.pid_z.reset() - self._v_raw[:] = 0.0 - self._v_filt[:] = 0.0 - self._wz_raw = 0.0 - self._wz_filt = 0.0 - self._v_xy_cmd[:] = 0.0 - self._p_feat_base = None - self._feat_kf.initialized = False - self._jump_gate.reset() - self._dq_hist.clear() - - def _pub_zero_twist(self) -> None: - tw = Twist() - self._twist_pub.publish(tw) - - def _watchdog_trip(self, reason: str) -> None: - """优先级 1 的硬停:不外推、指令置零、轨迹增量为零。""" - if not self._target_lost_flag: - self.get_logger().warn(f"看门狗急停:{reason}") - self._target_lost_flag = True - self._reset_motion_state() - self._zeroed = True - self._pub_zero_twist() - if self.enable_control: - self._send_hold() - - def _control_tick(self) -> None: - now_msg = self.get_clock().now() - now_sec = float(now_msg.nanoseconds) * 1e-9 - now_mono = time.monotonic() - dt = self._ctrl_dt - - self._ctrl_count += 1 - if self._ctrl_count >= int(round(1.0 / self._ctrl_dt)): - elapsed = (now_msg - self._ctrl_t0).nanoseconds * 1e-9 - hz = self._ctrl_count / max(elapsed, 1e-6) - self.get_logger().info(f"cmd_vel 速率约 {hz:.1f} Hz", throttle_duration_sec=1.0) - self._ctrl_count = 0 - self._ctrl_t0 = now_msg - - with self._lock: - have = self._have_target - stamp = self._stamp_sec - last_seen = self._last_seen_time - p_meas = self._p_meas.copy() - lost = self._target_lost_flag - source = self._track_source - if self._hybrid: - self._tick_d435_arrive() - self._tick_still_lock() - if self.enable_control and self._d435_oneshot_holds_the_arm(): - return - if ( - self.enable_control - and self._hybrid - and self._locked - and not self.d435_move_only - ): - # 框心已经对准并停稳。实时预测到此为止,臂钉住,等二阶段精拍一次。 - self._execute_twist(np.zeros(3, dtype=float), p_cam=None, hold_xy=True) - return - - # 还没有目标、人又停在锁高下面:只抬一次 Z。已经有 D435 点或腕部点之后 - # 不再插这一步 —— 平移途中改高度会抖,也会把正在走的 XY 掐掉。 - if self.enable_control and self.ee_z_m > 0.0 and not have: - T_ee0 = self._lookup_T(self.base_frame, self.ee_frame) - if T_ee0 is None: - return - z_now = float(T_ee0[2, 3]) - self._update_xy_arm(z_now) - if not self._xy_armed: - self.get_logger().info( - f"先回锁高 {self.ee_z_m:.3f}m 当前={z_now:.3f}m(还没有目标,只动 Z)", - throttle_duration_sec=1.0, - ) - self._target_lost_flag = False - self._execute_twist(np.zeros(3, dtype=float), p_cam=None, hold_xy=True) - self._lock_feedback(False) - return - - # ----- Seek:已在锁定高度但还没有有效目标。eye-in-hand 相机只能看到 - # 一小块区域,所以扫描工作区(先漂到标称工作 XY,再向外螺旋)直到工件进入视野。 - if ( - self.enable_control - and self.seek_enabled - and (not self._hybrid) # 混合模式用 D435 一次性,不螺旋搜 - and self.ee_z_m > 0.0 - and not have - and self._xy_armed - ): - T_ee0 = self._lookup_T(self.base_frame, self.ee_frame) - if T_ee0 is None: - return # TF 还没就绪 —— 等待,不要触发保持急停 - v_seek = self._seek_velocity(T_ee0[:3, 3]) - if v_seek is None: - # 超时了 —— 放弃搜索,原地保持 - if not self._seek_warned: - self._seek_warned = True - self.get_logger().warn( - f"seek 超时 {self.seek_timeout:.0f}s —— 没找到工件。" - "保持当前位置。请把工件放到桌面视野内,或调大 " - "seek_radius_max_m / 检查相机安装与手眼标定。" - ) - self._lock_feedback(False) - self._pub_zero_twist() - self._send_hold() - return - self.get_logger().info( - f"寻找工件…… ee_xy=({T_ee0[0,3]:.3f},{T_ee0[1,3]:.3f}) " - f"v=({v_seek[0]:+.3f},{v_seek[1]:+.3f})", - throttle_duration_sec=1.0, - ) - self._target_lost_flag = False # seek 期间允许执行 - self._execute_twist( - np.zeros(3, dtype=float), p_cam=None, v_base_override=v_seek - ) - self._lock_feedback(False) - return - - # ----- 第 1 项:看门狗(按接收时间)—— 数据过期就冻结所有运动 ----- - if (not have) or last_seen < 0.0: - self._lock_feedback(False) - self._watchdog_trip("还没有收到 PointStamped") - return - - seen_age = now_mono - last_seen - stamp_age = now_sec - stamp if stamp >= 0.0 else 1e9 - if self._hybrid and source == "overhead": - # 一次性设定一直用到 D405 接上。按秒数冻住的话,臂还在平移就被看门狗 - # 掐掉,D435 又不再拍,停在半路。 - stamp_age = 0.0 - seen_age = 0.0 - elif seen_age > self.watchdog_timeout or stamp_age > self.lost_timeout: - self._watchdog_trip( - f"目标丢失 seen_age={seen_age:.3f}s stamp_age={stamp_age:.3f}s" - ) - self._lock_feedback(False) - return - - # 检测框冻结 / USB 卡住:锁住关节,不要继续按上一个误差驱动。 - # D435 一次性不是流,保持设定直到 hold 超时或 D405 接回。 - stale = max(0.15, float(self.stale_hold_sec)) - if (not (self._hybrid and source == "overhead")) and ( - seen_age > stale or stamp_age > stale - ): - self.get_logger().info( - f"过期保持 seen_age={seen_age:.2f}s —— 不跟踪冻结的检测框", - throttle_duration_sec=1.0, - ) - self._v_raw[:] = 0.0 - self._v_filt[:] = 0.0 - self._lock_feedback(False) - self._pub_zero_twist() - if self.enable_control: - self._send_hold() - return - - if lost: - # 本应在 _on_point 里清掉;这里再加一道保险 - self._lock_feedback(False) - self._pub_zero_twist() - return - - # Hover 直接使用视觉三维点。不要把 cmd_vel(坐标系不对) - # 叠加到 p_cam 上 —— 那样会把目标从工件上带跑。 - p = p_meas.copy() - if self.xy_track == "lookat": - dt_lat = float(np.clip(stamp_age, 0.0, self.max_extrap)) - p = p_meas + self._v_filt * dt_lat - - ex, ey = float(p[0]), float(p[1]) - ez = float(p[2] - self.z_ref) - r_xy_raw = float(np.hypot(ex, ey)) - look = None - T_ee_now = None - if self.ee_z_m > 0.0: - T_ee_now = self._lookup_T(self.base_frame, self.ee_frame) - if T_ee_now is not None: - self._update_xy_arm(float(T_ee_now[2, 3])) - if self.ee_z_m > 0.0 and self._xy_armed: - if T_ee_now is not None: - look = self._xy_track_vs_feature(T_ee_now, p) - if look is not None: - ex, ey = float(look[0][0]), float(look[0][1]) - r_xy_raw = float(np.hypot(ex, ey)) - elif self.ee_z_m > 0.0: - ex = ey = 0.0 - r_xy_raw = 0.0 - xy_dead = self._xy_deadzone(r_xy_raw) - clip_xy = max(0.03, float(self.e_xy_clip)) - r_xy = r_xy_raw - if r_xy > clip_xy: - s = clip_xy / r_xy - ex *= s - ey *= s - r_xy = clip_xy - # 在 base 系里保持法兰高度时,相机深度 Z 就不再使用 - z_dead = True if self.ee_z_m > 0.0 else (abs(ez) <= self.deadzone_z_m) - if xy_dead: - ex = ey = 0.0 - self.pid_x.reset() - self.pid_y.reset() - if z_dead: - ez = 0.0 - self.pid_z.reset() - - # ----- 第 2 项:带积分分离的 PID(分离逻辑在 PidController 内部) ----- - v_des = np.array( - [ - 0.0 if self.ee_hold_xy else self.pid_x.update(ex, float(p[0]), dt), - 0.0 if self.ee_hold_xy else self.pid_y.update(ey, float(p[1]), dt), - 0.0 if self.ee_z_m > 0.0 else self.pid_z.update(ez, float(p[2]), dt), - ], - dtype=float, - ) - if xy_dead: - v_des[0] = v_des[1] = 0.0 - if z_dead: - v_des[2] = 0.0 - v_des[:2] = _saturate_vec(v_des[:2].copy(), self.v_max_xy) - v_des[2] = float(np.clip(v_des[2], -self.v_max_z, self.v_max_z)) - - # base 平面模式:绝不指令相机 +Z(那会直接扎进工件里) - if self.ee_z_m > 0.0: - v_des[2] = 0.0 - else: - z_meas = float(p[2]) - too_close = z_meas < self.z_min_m - off_center = r_xy > self.approach_xy_gate_m - if v_des[2] > 0.0 and (too_close or off_center): - v_des[2] = 0.0 - self.pid_z.reset() - elif v_des[2] > 0.0: - v_des[2] = min(v_des[2], self.v_approach_z) - if too_close: - v_des[2] = min(v_des[2], 0.0) - if z_meas < (self.z_min_m - 0.02): - v_des[2] = min(v_des[2], -0.03) - - # 先对原始期望速度做加速度限制,再做低通滤波 - dv = v_des - self._v_raw - n_dv = float(np.linalg.norm(dv)) - dv_max = self.a_max * dt - if n_dv > dv_max > 0.0: - dv *= dv_max / n_dv - self._v_raw = self._v_raw + dv - - # ----- 第 3 项:对线速度做一阶低通(+ 预留的 wz) ----- - a = self.vel_lpf_alpha - self._v_filt = a * self._v_raw + (1.0 - a) * self._v_filt - # 角速度目前预留(PBVS 当前只做线速度);仍做滤波以保持接口完整 - self._wz_raw = 0.0 - aw = self.wz_lpf_alpha - self._wz_filt = aw * self._wz_raw + (1.0 - aw) * self._wz_filt - - if xy_dead and z_dead: - self._v_raw[:] = 0.0 - self._v_filt[:] = 0.0 - self._wz_filt = 0.0 - - v_cam = self._v_filt.copy() - if self.ee_z_m > 0.0: - v_cam[2] = 0.0 - self._v_filt[2] = 0.0 - self._v_raw[2] = 0.0 - elif v_cam[2] > 0.0 and (float(p[2]) < self.z_min_m or r_xy > self.approach_xy_gate_m): - v_cam[2] = 0.0 - self._v_filt[2] = 0.0 - self._v_raw[2] = 0.0 - elif v_cam[2] > 0.0: - v_cam[2] = min(v_cam[2], self.v_approach_z) - self._v_filt[2] = v_cam[2] - - tw = Twist() - tw.linear.x = float(v_cam[0]) - tw.linear.y = float(v_cam[1]) - tw.linear.z = float(v_cam[2]) - tw.angular.z = float(self._wz_filt) - self._twist_pub.publish(tw) - - need_base = self.ee_z_m > 0.0 or self.ee_vertical_down or self.ee_hold_xy - if xy_dead and z_dead: - self._lock_feedback(True) # 串联信号:活目标 + 死区驻留 = 收敛 - self.get_logger().info( - f"死区保持 |e_xy|={r_xy_raw*1000:.1f}mm ez={ez*1000:.1f}mm", - throttle_duration_sec=1.0, - ) - if self.enable_control: - # 若高度 / 垂直朝下稍有偏差仍要修正,否则彻底冻结 - if need_base: - self._execute_twist(np.zeros(3, dtype=float), p_cam=p, hold_xy=True) - elif not self._zeroed: - self._dq_hist.clear() - self._send_hold() - self._zeroed = True - return - - self._zeroed = False - self._lock_feedback(False) # 仍在跟踪收敛中 - extra = "" - if look is not None: - extra = ( - f" {self.xy_track}=({look[2][0]:.3f},{look[2][1]:.3f})" - f" feat=({look[1][0]:.3f},{look[1][1]:.3f})" - ) - self.get_logger().info( - f"twist 相机系 v=({v_cam[0]:+.3f},{v_cam[1]:+.3f},{v_cam[2]:+.3f}) " - f"|e_xy|={r_xy_raw*1000:.0f}mm ez={ez*1000:.0f}mm age={stamp_age*1000:.0f}ms" - f"{extra}", - throttle_duration_sec=0.5, - ) - if self.enable_control and ( - float(np.linalg.norm(v_cam)) > 1e-4 or need_base or r_xy_raw > self.deadzone_m - ): - self._execute_twist(v_cam, p_cam=p) - - def _e_stop(self, reason: str) -> None: - self.get_logger().warn(f"急停:{reason}") - self._watchdog_trip(reason) - - def _R_cam_to_base(self, T_ee: np.ndarray) -> np.ndarray: - return self._T_cam_in_base(T_ee)[:3, :3] - - def _T_ee_cam(self) -> np.ndarray: - # 始终使用标定出的 yaml。TF 只用于 RViz / 打印做核对。 - return np.array(self.T_cam_to_gripper, dtype=float) - - def _T_cam_in_base(self, T_ee: np.ndarray) -> np.ndarray: - return cam_to_base_T(self.T_cam_to_gripper, T_ee, self.handeye_mode) - - def _log_handeye_tf_vs_yaml(self) -> None: - t_yaml = np.asarray(self.T_cam_to_gripper[:3, 3], dtype=float) - parent = ( - self.base_frame if self.handeye_mode == "eye_to_hand" else self.ee_frame - ) - T_tf = self._lookup_T(parent, self.handeye_child) - if T_tf is None: - self.get_logger().warn( - "HANDEYE TF 查询失败(无妨)—— 伺服使用 yaml " - f"t=({t_yaml[0]*1000:.1f},{t_yaml[1]*1000:.1f},{t_yaml[2]*1000:.1f})mm" - ) - return - t_tf = T_tf[:3, 3] - d = float(np.linalg.norm(t_tf - t_yaml)) - self.get_logger().warn( - f"HANDEYE yaml t=({t_yaml[0]*1000:.1f},{t_yaml[1]*1000:.1f},{t_yaml[2]*1000:.1f})mm " - f"TF t=({t_tf[0]*1000:.1f},{t_tf[1]*1000:.1f},{t_tf[2]*1000:.1f})mm " - f"|Δ|={d*1000:.1f}mm" - ) - if d > 0.015: - self.get_logger().error( - "HANDEYE TF 与 yaml 的偏差 >15mm —— 相机坐标系上挂了重复的父节点? " - "伺服仍然使用 yaml。" - ) - - def _intersect_z( - self, origin: np.ndarray, direction: np.ndarray, z_plane: float - ) -> Optional[np.ndarray]: - d = np.asarray(direction, dtype=float).reshape(3) - n = float(np.linalg.norm(d)) - if n < 1e-9: - return None - d = d / n - if abs(float(d[2])) < 1e-4: - return None - t = (float(z_plane) - float(origin[2])) / float(d[2]) - if t < 0.03 or t > 1.50: - return None - return np.asarray(origin, dtype=float).reshape(3) + t * d - - def _lookat_vs_feature( - self, T_ee: np.ndarray, p_cam: np.ndarray - ) -> Optional[tuple]: - """让特征点居中到图像里所需的 base 系 XY 误差。 - - 30° 的 eye-in-hand 安装:图像中心是光轴打到工作平面上的点, - 而不是法兰的 XY。在固定高度 / 姿态下平移法兰 XY,会把该 look-at 点 - 按 1:1 一起带走。 - """ - T_bc = self._T_cam_in_base(T_ee) - R = T_bc[:3, :3] - o = T_bc[:3, 3] - zc = float(np.clip(float(p_cam[2]), 0.04, 0.60)) - axis = R @ np.array([0.0, 0.0, 1.0], dtype=float) - z_plane = float(o[2] + zc * axis[2]) - p_look = self._intersect_z(o, axis, z_plane) - d_feat = R @ np.array( - [float(p_cam[0]), float(p_cam[1]), zc], dtype=float - ) - p_feat = self._intersect_z(o, d_feat, z_plane) - if p_look is None or p_feat is None: - return None - err = p_feat[:2] - p_look[:2] - return err, p_feat, p_look - - def _feature_in_base(self, T_ee: np.ndarray, p_cam: np.ndarray) -> np.ndarray: - """工件三维点(相机系)→ base 系 XYZ。保持 XYZ 一致。""" - return cam_point_to_base( - p_cam, self.T_cam_to_gripper, T_ee, self.handeye_mode - ) - - def _hover_vs_feature( - self, T_ee: np.ndarray, p_cam: np.ndarray - ) -> Optional[tuple]: - """把法兰(以及同轴的夹爪中心)的 XY 停在 base 系里的工件 XY 上。 - - hover_offset_ee_xy_m 会在法兰坐标系里平移被跟踪点 - (当爪中心不在法兰原点时用它)。RGI 是同轴的:保持 [0,0] 即可。 - 绝不能拿实时的 T_ee 去重复乘一个过期的 p_cam。 - """ - p_ee = np.asarray(T_ee[:3, 3], dtype=float) - off = self.hover_offset_ee_xy - if abs(float(off[0])) > 1e-6 or abs(float(off[1])) > 1e-6: - p_tool = p_ee + T_ee[:3, :3] @ off - else: - p_tool = p_ee - with self._lock: - frozen = None if self._p_feat_base is None else self._p_feat_base.copy() - last_seen = float(self._last_seen_time) - v_kf = self._feat_kf.velocity if self._feat_kf.initialized else np.zeros(3) - p_feat = frozen if frozen is not None else self._feature_in_base(T_ee, p_cam) - lead = 0.0 - if self.predict_enable and frozen is not None and last_seen > 0.0: - age = max(0.0, time.monotonic() - last_seen) - lead = float(np.clip(age + self.predict_sec, 0.0, max(0.04, self.max_extrap))) - v_xy = np.array([float(v_kf[0]), float(v_kf[1])], dtype=float) - n = float(np.hypot(v_xy[0], v_xy[1])) - if n > self.predict_v_max > 0.0: - v_xy *= self.predict_v_max / n - if n > 0.01: - p_feat = p_feat.copy() - p_feat[0] += v_xy[0] * lead - p_feat[1] += v_xy[1] * lead - err = p_feat[:2] - p_tool[:2] - return err, p_feat, p_tool - - def _xy_track_vs_feature( - self, T_ee: np.ndarray, p_cam: np.ndarray - ) -> Optional[tuple]: - if self.xy_track == "lookat": - return self._lookat_vs_feature(T_ee, p_cam) - return self._hover_vs_feature(T_ee, p_cam) - - def _lookup_T(self, parent: str, child: str) -> Optional[np.ndarray]: - try: - tf = self._tf.lookup_transform( - parent, child, rclpy.time.Time(), - timeout=rclpy.duration.Duration(nanoseconds=20_000_000), - ) - except Exception: # noqa: BLE001 - return None - t = tf.transform.translation - o = tf.transform.rotation - T = np.eye(4) - T[:3, :3] = quat_xyzw_to_R([o.x, o.y, o.z, o.w]) - T[:3, 3] = [t.x, t.y, t.z] - return T - - def _current_joints(self) -> Optional[np.ndarray]: - js = self._last_js - if js is None: - return None - m = {n: p for n, p in zip(js.name, js.position)} - try: - return np.array([float(m[n]) for n in self.joint_names], dtype=float) - except KeyError: - return None - - def _xy_deadzone(self, r_xy: float, *, update: bool = True) -> bool: - """滞回:在 deadzone_m 处进入,在 1.6 倍处退出,避免噪声来回抖。""" - enter = max(0.002, float(self.deadzone_m)) - leave = enter * 1.6 - if self._xy_in_dead: - dead = float(r_xy) <= leave - else: - dead = float(r_xy) <= enter - if update: - self._xy_in_dead = dead - return dead - - def _jacobian_at(self, p_ee: np.ndarray): - link_R: List[np.ndarray] = [] - link_p: List[np.ndarray] = [] - for fr in self.link_frames: - Tl = self._lookup_T(self.base_frame, fr) - if Tl is None: - return None - link_R.append(Tl[:3, :3]) - link_p.append(Tl[:3, 3]) - return geometric_jacobian(link_R, link_p, p_ee, RIZON_LINK_AXES) - - def _d435_oneshot_holds_the_arm(self) -> bool: - """D435 粗定位只走厂家 MoveL。停稳后先钉住,等 D405 框心接上再放开。 - - 这段不许再用流式伺服去追 D435 那个点。D405 点被 ``_on_point`` 接上后 - 跟踪源变成腕部,这里返回 False,框心才开始带臂。 - """ - if self._hybrid and self._track_source == "overhead" and self._d435_settled: - return True - if not (self._hybrid and self._track_source == "overhead" and not self._d435_settled): - return False - if not self._d435_plan_lock.acquire(blocking=False): - return True - try: - return self._d435_oneshot_holds_locked() - finally: - self._d435_plan_lock.release() - - def _d435_pin_and_stop_hops(self, why: str) -> None: - if not self._d435_pinned: - self._send_hold() - self._d435_pinned = True - self._d435_give_up = True - self.get_logger().error(why) - - def _sanitize_d435_traj(self, traj: JointTrajectory, min_dt: float = 0.02) -> JointTrajectory: - """与二阶段 ``_sanitize_traj`` 同一条:time_from_start 必须严格递增。""" - last = -min_dt - for p in traj.points: - t = float(p.time_from_start.sec) + float(p.time_from_start.nanosec) * 1e-9 - if t < last + min_dt: - t = last + min_dt - ns = int(round(t * 1e9)) - p.time_from_start.sec = ns // 1_000_000_000 - p.time_from_start.nanosec = ns % 1_000_000_000 - last = t - return traj - - def _d435_send_action( - self, - sched, - tag: str, - hop_m: float, - leftover_m: float, - v_peak: float, - T_move: float, - *, - ee_z: float, - tilt_deg: float, - max_dq: float, - ) -> None: - """先占住 in-flight 再 ``send_goal_async``。话题插点会把这条掐掉。""" - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - for qi, qdot, t_sec in sched: - pt = JointTrajectoryPoint() - pt.positions = [float(v) for v in np.asarray(qi).tolist()] - pt.velocities = [float(v) for v in np.asarray(qdot).tolist()] - ns = int(round(max(0.0, float(t_sec)) * 1e9)) - pt.time_from_start.sec = ns // 1_000_000_000 - pt.time_from_start.nanosec = ns % 1_000_000_000 - traj.points.append(pt) - traj = self._sanitize_d435_traj(traj) - goal = FollowJointTrajectory.Goal() - goal.trajectory = traj - self._d435_inflight = True - self._d435_sent = True - self._d435_pinned = False - fut = self._jtc.send_goal_async(goal) - fut.add_done_callback(self._d435_on_goal) - self.get_logger().info( - f"D435 action 下发 {len(sched)} 点 tag={tag} 本跳={hop_m*1000:.0f}mm " - f"剩={leftover_m*1000:.0f}mm v={v_peak*1000:.0f}mm/s T={T_move:.1f}s " - f"ee_z={ee_z:.3f} tilt={tilt_deg:.2f}deg max|Δq|={max_dq:.4f}rad " - f"—— 结果回来之前不再发下一条" - ) - - def _d435_on_goal(self, fut) -> None: - try: - handle = fut.result() - except Exception as exc: - self.get_logger().error(f"D435 JTC 目标回调失败:{exc}") - self._d435_inflight = False - self._d435_give_up = True - return - if handle is None or not bool(getattr(handle, "accepted", False)): - self.get_logger().error("JTC 拒绝了 D435 轨迹") - self._d435_inflight = False - self._d435_give_up = True - return - handle.get_result_async().add_done_callback(self._d435_on_result) - - def _d435_on_result(self, fut) -> None: - ok = True - try: - r = fut.result() - inner = getattr(r, "result", None) - code = getattr(inner, "error_code", 0) if inner is not None else 0 - if code not in (0, None): - ok = False - msg = getattr(inner, "error_string", "") - self.get_logger().error(f"D435 JTC 执行失败 error_code={code} {msg}") - except Exception as exc: - ok = False - self.get_logger().error(f"D435 JTC 结果失败:{exc}") - self._d435_inflight = False - self._d435_settle_until = time.monotonic() + float(D435_SETTLE_S) - self._d435_remeasure_log = True - if not ok: - self._d435_give_up = True - - def _switch_arm_controller(self, activate: bool) -> bool: - """停或重新打开关节轨迹控制器。关节状态广播留着,硬件接口不下线。 - - 用节点里的客户端,不走 ``ros2 service call``:那条命令自己就要一两秒, - 停稳锁定的预算会被它吃掉。 - """ - from controller_manager_msgs.srv import SwitchController - - if self._sw_cli is None: - self._sw_cli = self.create_client( - SwitchController, - "/controller_manager/switch_controller", - callback_group=ReentrantCallbackGroup(), - ) - t0 = time.monotonic() - while not self._sw_cli.service_is_ready(): - if time.monotonic() - t0 > 3.0: - self.get_logger().error("switch_controller 服务不在") - return False - time.sleep(0.02) - req = SwitchController.Request() - if activate: - req.activate_controllers = ["rizon_arm_controller"] - req.deactivate_controllers = [] - else: - req.activate_controllers = [] - req.deactivate_controllers = ["rizon_arm_controller"] - req.strictness = SwitchController.Request.STRICT - req.activate_asap = True - req.timeout.sec = 3 - req.timeout.nanosec = 0 - fut = self._sw_cli.call_async(req) - while not fut.done(): - if time.monotonic() - t0 > 8.0: - self.get_logger().error( - "switch_controller 超时," - + ("没能重新激活" if activate else "没能停掉") - + " rizon_arm_controller" - ) - return False - time.sleep(0.02) - try: - resp = fut.result() - except Exception as exc: - self.get_logger().error(f"switch_controller 失败:{exc}") - return False - if resp is None or not bool(resp.ok): - self.get_logger().error( - "switch_controller 返回失败," - + ("控制器没回来" if activate else "控制器还占着关节") - ) - return False - return True - - def _wait_movel_file(self, seq: int, timeout_s: float, want_done: bool): - lib = ros2_root() / "scripts" / "lib" - if str(lib) not in sys.path: - sys.path.insert(0, str(lib)) - from flexiv_movel_ipc import read_ack, read_done - - t0 = time.monotonic() - while time.monotonic() - t0 < timeout_s: - if want_done: - got = read_done() - if got is not None and int(got[0]) == int(seq): - return bool(got[1]), str(got[2]) - elif read_ack() == int(seq): - return True, "" - time.sleep(0.02) - return False, "" - - def _d435_vendor_movel(self) -> bool: - """D435 这一点:进程内厂家 MoveL,不杀控制栈。 - - 目标 = 当前厂家 TCP + (K0−法兰) 的 ROS XY,``keep_z``。硬件在 MoveL - 期间不灌关节指令,D405 被 ``d435_commanding`` 挡住。不许退回杀栈 - (那会冷启动十几秒,而且两套控制会互抢晃臂)。 - """ - lib = ros2_root() / "scripts" / "lib" - if str(lib) not in sys.path: - sys.path.insert(0, str(lib)) - from flexiv_movel_ipc import write_request - - with self._lock: - goal = None if self._p_feat_base is None else np.asarray( - self._p_feat_base, dtype=float - ).reshape(3).copy() - if goal is None or not np.all(np.isfinite(goal)): - self.get_logger().error("没有 D435 基座点,厂家 MoveL 不下发") - return False - tcp_now = self._fresh_tcp_world() - if tcp_now is None: - self.get_logger().error( - "没有厂家 tcp_pose(话题 " - f"{getattr(self, 'robot_states_topic', '?')} 不新鲜)," - "拒绝杀栈凑 MoveL" - ) - return False - T_ee = self._lookup_T(self.base_frame, self.ee_frame) - if T_ee is None: - self.get_logger().error("没有法兰 TF,D435 相对位移算不出,不下发") - return False - tgt = d435_movel_from_tcp(tcp_now, T_ee[:2, 3], goal[:2]) - if tgt is None: - self.get_logger().error("D435 厂家 TCP 加上相对位移算不出,不下发") - return False - seq = int(time.monotonic() * 1000.0) % 1_000_000_000 - write_request( - seq, - float(tgt[0]), - float(tgt[1]), - float(tgt[2]), - True, - float(D435_VENDOR_MOVEL_VEL_MPS), - ) - self.get_logger().info( - f"D435 进程内 MoveL XY=({goal[0]:.3f},{goal[1]:.3f}) " - f"厂家TCP现=({tcp_now[0]:.4f},{tcp_now[1]:.4f},{tcp_now[2]:.4f}) " - f"MoveL=({tgt[0]:.4f},{tgt[1]:.4f},keep_z) " - f"vel={D435_VENDOR_MOVEL_VEL_MPS * 1000:.0f}mm/s " - "—— 不杀栈;期间不下发 D405" - ) - t0 = time.monotonic() - acked, _why = self._wait_movel_file(seq, 2.0, want_done=False) - if not acked: - self.get_logger().error( - "厂家 MoveL 2s 内没 ack —— 硬件没接 /tmp/flexiv_movel_req。" - "真机环境重建 install/ 后再跑,不许改走杀栈假装成功" - ) - return False - ok, detail = self._wait_movel_file(seq, 90.0, want_done=True) - dt = time.monotonic() - t0 - self.get_logger().info( - f"D435 进程内 MoveL {'完成' if ok else '失败'},耗时 {dt:.2f}s" - + (f" {detail}" if detail else "") - ) - return bool(ok) - - def _d435_oneshot_holds_locked(self) -> bool: - # 混合流程这一段只走厂家 MoveL。下面留下的关节折线不再执行: - # 那条路径会在真机上一段一段启停。 - if self._d435_vendor_failed or self._d435_vendor_busy: - return True - if not self._d435_vendor_done: - if time.monotonic() < float(self._d435_retry_after): - return True - if int(self._d435_vendor_tries) >= int(D435_MOVEL_RETRY): - self._d435_vendor_failed = True - self.get_logger().error( - f"{D435_MOVEL_GAVE_UP} —— 一阶段中止,D405 也不带臂" - ) - return True - # busy 先于调用置位:另一条控制回调不能再开一次 MoveL,也不能提前锁定。 - self._d435_vendor_busy = True - ok = self._d435_vendor_movel() - self._d435_vendor_busy = False - if not ok: - self._d435_vendor_tries = int(self._d435_vendor_tries) + 1 - self._d435_retry_after = time.monotonic() + float(D435_MOVEL_RETRY_S) - self.get_logger().error( - f"厂家 MoveL 第{self._d435_vendor_tries}次没走成," - f"{D435_MOVEL_RETRY_S:.1f}s 后再试" - ) - else: - self._d435_vendor_done = True - self._arrive.reset() - # MoveL 切回关节后 JTC 还握着出发前的悬停。不钉住的话 - # 硬件 3 s 窗口一过,臂会按悬停关节走回去(比交回 D405 的 10 cm 更远)。 - self._send_hold() - self._d435_pinned = True - return True - return True - - def _d435_oneshot_holds_locked_joint(self) -> bool: - """旧的关节折线。混合流程不再调用,源码留着给负向测试对字符串。""" - now = time.monotonic() - if self._d435_inflight: - return True - if now < self._d435_settle_until: - return True - T_ee = self._lookup_T(self.base_frame, self.ee_frame) - q = self._current_joints() - if T_ee is None or q is None: - return True - # 只更新锁高标志。这一段不许把控制权交给回锁高流式。 - self._update_xy_arm(float(T_ee[2, 3])) - with self._lock: - goal = None if self._p_feat_base is None else self._p_feat_base[:2].copy() - if goal is None: - return True - p = np.asarray(T_ee[:3, 3], dtype=float) - dist = float(np.hypot(float(goal[0]) - p[0], float(goal[1]) - p[1])) - arrive = float(self.lock_still_move_m) - z_lock = float(self.ee_z_m) - tilt = flange_tilt_rad(T_ee[:3, :3]) - at = at_lock_height(float(p[2]), z_lock, self.approach_xy_gate_m) - if self._d435_remeasure_log: - self._d435_remeasure_log = False - self.get_logger().info( - f"D435 重测 leftover={dist*1000:.0f}mm " - f"dxy=({(p[0]-goal[0])*1000:+.0f},{(p[1]-goal[1])*1000:+.0f})mm " - f"ee_xy=({p[0]:.3f},{p[1]:.3f}) goal=({goal[0]:.3f},{goal[1]:.3f}) " - f"ee_z={p[2]:.3f} tilt={math.degrees(tilt):.2f}deg" - ) - if self._d435_give_up: - self._d435_pinned = True - return True - hop_max, _cruise_unused = oneshot_hop_limits( - dist, hybrid_cruise_vxy(self.v_slow_xy) - ) - if at and dist <= arrive: - if oneshot_needs_verticalize( - tilt, dist, arrive, already_done=self._d435_vert_done - ): - return self._d435_send_verticalize(q, T_ee, leftover=dist, tilt=tilt) - # action 已经 rest-to-rest。到位成功不许再往话题插 hold,那会再抖一下。 - self._d435_pinned = True - return True - if self._d435_full_done and self._d435_fix_done: - self._d435_pin_and_stop_hops( - f"D435 整段+补刀后还差 {dist*1000:.0f}mm —— 钉住不再补刀" - ) - return True - if at and not oneshot_may_send_another( - dist, self._d435_last_dist, arrive_m=arrive, hop_max_m=hop_max - ): - self._d435_pin_and_stop_hops( - f"D435 上一跳几乎没走近,剩差还是 {dist*1000:.0f}mm " - f"—— 钉住不再补刀,等停稳后锁定进二阶段" - ) - return True - if not at: - z_err = abs(float(p[2]) - z_lock) - if self._d435_last_z_err is not None and z_err > self._d435_last_z_err * 0.8: - self._d435_z_stall += 1 - else: - self._d435_z_stall = 0 - self._d435_last_z_err = z_err - if self._d435_z_stall >= 2: - self._d435_pin_and_stop_hops( - f"D435 收锁高连续无进展 当前={p[2]:.3f}m 期望={z_lock:.3f}m" - ) - return True - if not self._jtc.server_is_ready(): - self.get_logger().warn("D435 等 JTC action 就绪", throttle_duration_sec=1.0) - return True - J = self._jacobian_at(p) - if J is None: - self.get_logger().warn("D435 平移缺 link TF,等下一拍", throttle_duration_sec=1.0) - return True - segs = oneshot_full_segments( - p, goal, z_lock, gate_m=self.approach_xy_gate_m - ) - if not segs: - return True - # XY / 收 Z 都不许夹收垂直:冻结 J 会把腕部转动漏成 Y 过冲。 - wps, planned, asked, tag = oneshot_concat_hold_ori( - q, J, segs, R=T_ee[:3, :3] - ) - if self._d435_full_done: - tag = "fix" - if len(wps) < 2 or asked < 1e-5 or planned < 0.75 * asked: - self._d435_pin_and_stop_hops( - f"D435 平移规划停滞 {planned*1000:.0f}/{asked*1000:.0f}mm —— 钉住不瞎发" - ) - return True - max_dq = float(np.max(np.abs(wps[-1] - q))) - if max_dq > 1.0: - self._d435_pin_and_stop_hops("D435 平移关节行程 >1 rad,拒绝执行") - return True - cruise = oneshot_full_cruise_mps(dist, hybrid_cruise_vxy(self.v_slow_xy)) - sched, T_move, v_peak = smooth_joint_schedule(wps, asked, cruise) - if tag in ("full", "fix", "xy"): - self._d435_last_dist = dist - if not self._d435_full_done: - self._d435_full_done = True - else: - self._d435_fix_done = True - self._d435_send_action( - sched, - tag, - asked, - dist, - v_peak, - T_move, - ee_z=float(p[2]), - tilt_deg=float(np.degrees(tilt)), - max_dq=max_dq, - ) - return True - - def _d435_send_verticalize(self, q, T_ee, *, leftover: float, tilt: float) -> bool: - """XY 已到位后单独收法兰朝下。和平移拆开,避免 Y 过冲。""" - if not self._jtc.server_is_ready(): - self.get_logger().warn("D435 收垂直等 JTC action 就绪", throttle_duration_sec=1.0) - return True - p = np.asarray(T_ee[:3, 3], dtype=float) - J = self._jacobian_at(p) - if J is None: - self.get_logger().warn("D435 收垂直缺 link TF,等下一拍", throttle_duration_sec=1.0) - return True - wps, _remain = translate_hold_ori_waypoints( - q, J, np.zeros(3, dtype=float), R=T_ee[:3, :3], verticalize=True - ) - if len(wps) < 2: - self._d435_vert_done = True - self.get_logger().info( - f"D435 收垂直无需再动 tilt={math.degrees(tilt):.2f}deg" - ) - return True - max_dq = float(np.max(np.abs(wps[-1] - q))) - if max_dq < 1e-4: - self._d435_vert_done = True - return True - if max_dq > 1.0: - self._d435_pin_and_stop_hops("D435 收垂直关节行程 >1 rad,拒绝执行") - return True - hop = max(0.008, float(tilt) * 0.05) - cruise = D435_NEAR_CRUISE_MPS - sched, T_move, v_peak = smooth_joint_schedule(wps, hop, cruise) - self._d435_vert_done = True - self._d435_send_action( - sched, - "vert", - hop, - leftover, - v_peak, - T_move, - ee_z=float(p[2]), - tilt_deg=float(np.degrees(tilt)), - max_dq=max_dq, - ) - return True - - def _tick_d435_arrive(self) -> None: - """厂家 MoveL 已结束:看法兰还在不在动。连续停稳后才打开 D405 框心。""" - if not self._hybrid: - return - if ( - self._d435_inflight - or self._d435_vendor_busy - or not self._d435_vendor_done - or time.monotonic() < self._d435_settle_until - ): - self._arrive.reset() - return - with self._lock: - if self._track_source != "overhead" or self._d435_settled: - return - goal = None if self._p_feat_base is None else self._p_feat_base[:2].copy() - if goal is None: - return - T = self._lookup_T(self.base_frame, self.ee_frame) - if T is None: - return - xy = np.asarray(T[:2, 3], dtype=float) - dist = float(np.hypot(float(xy[0]) - goal[0], float(xy[1]) - goal[1])) - # 到位看法兰是否还在动,不看离视觉点还差几毫米。 - settled = self._arrive.update(xy, time.monotonic(), tracking_ok=True) - if not settled: - self.get_logger().info( - f"D435 厂家 MoveL 已结束,法兰还在动或未满 " - f"{self.d435_handback_sec:.1f}s(离点 {dist*1000:.0f}mm)," - "D405 输出仍截断", - throttle_duration_sec=1.0, - ) - return - with self._lock: - self._d435_settled = True - self._d435_exec_until = 0.0 - if self.d435_move_only: - # 保持 d435_commanding=True,感知不会重拍;D405 被 move_only 挡住。 - # locked 只让 pipeline 结束一阶段,后面会 skip_stage2。 - # action 已 rest-to-rest,到位不再往话题插 hold。 - now_m = time.monotonic() - if not self._locked: - self._locked = True - self.get_logger().info( - f"已到 D435 位置(还差 {dist*1000:.0f}mm)并停稳 " - f"{self.d435_handback_sec:.1f}s —— D435 位移测试结束," - "不交 D405、不进二阶段" - ) - self._lock_pub.publish(Bool(data=True)) - self._lock_pub_t = now_m - elif now_m - self._lock_pub_t > 1.0: - self._lock_pub_t = now_m - self._lock_pub.publish(Bool(data=True)) - return - # 法兰已停稳:打开 D405。不在这里锁定;框心对准停稳后才精拍下臂。 - self._publish_d435_commanding(False) - self.get_logger().info( - f"法兰已连续停稳 {self.d435_handback_sec:.1f}s" - f"(离 D435 点 {dist*1000:.0f}mm)" - " —— 打开 D405 输出,追工件框矩形中心;对准后才精拍下臂" - ) - - def _tick_still_lock(self) -> None: - """D405 跟住且法兰 XY 连续 still_sec 秒没大幅动 → 锁定进二阶段。 - - 顶视一次性迁臂不算。门槛与位移上限只从 site 来,这里不再写死 3 / 15mm。 - """ - if not self._hybrid or self.d435_move_only: - return - if self._locked: - # 框心对准并且停稳这一拍已经抓住。后面的实时点不再解开,也不再带臂。 - return - T = self._lookup_T(self.base_frame, self.ee_frame) - xy = None if T is None else np.asarray(T[:2, 3], dtype=float) - with self._lock: - have = self._have_target - lost = self._target_lost_flag - source = self._track_source - conf = self._wrist_conf - tracking_ok = ( - source == "wrist" - and have - and not lost - and (not wrist_needs_handoff(conf, self.wrist_handoff_conf)) - and self._xy_armed - ) - locked_now = self._still.update( - xy, time.monotonic(), tracking_ok=tracking_ok - ) - now_m = time.monotonic() - if locked_now and self.enable_control: - if not self._locked: - self._locked = True - self.get_logger().info( - f"=== 一阶段已锁定(D405 框心对准且臂静止 {self.wrist_align_sec:.1f}s," - f"位移≤{self.lock_still_move_m*1000:.0f}mm)" - " → /visual_servo/locked ===" - ) - self._lock_pub.publish(Bool(data=True)) - self._lock_pub_t = now_m - elif now_m - self._lock_pub_t > 1.0: - self._lock_pub_t = now_m - self._lock_pub.publish(Bool(data=True)) - else: - if self._locked: - self._lock_pub.publish(Bool(data=False)) - self._locked = False - self._lock_since = None - - def _lock_feedback(self, converged: bool) -> None: - """串联锁定信号:持续收敛 lock_hold_sec → /visual_servo/locked=True。 - - 混合模式由 ``_tick_still_lock`` 独占,这里直接返回,避免死区 0.6s 抢先锁定。 - """ - if self._hybrid: - return - now_m = time.monotonic() - if converged and self.enable_control: - if self._lock_since is None: - self._lock_since = now_m - if not self._locked and (now_m - self._lock_since >= self.lock_hold_sec): - self._locked = True - self.get_logger().info( - f"=== 一阶段已锁定(死区驻留 {self.lock_hold_sec:.1f}s)" - " → /visual_servo/locked ===" - ) - self._lock_pub.publish(Bool(data=True)) - elif self._locked and now_m - self._lock_pub_t > 1.0: - self._lock_pub_t = now_m - self._lock_pub.publish(Bool(data=True)) - else: - if self._locked: - self._lock_pub.publish(Bool(data=False)) - self._locked = False - self._lock_since = None - - def _w_align_flange_down(self, R_ee: np.ndarray) -> np.ndarray: - """base 系下的角速度,用来把法兰 +Z 转到世界 −Z 方向(工具朝下)。""" - z_now = np.asarray(R_ee, dtype=float).reshape(3, 3)[:, 2] - z_des = np.array([0.0, 0.0, -1.0], dtype=float) - c = float(np.clip(np.dot(z_now, z_des), -1.0, 1.0)) - ang = float(np.arccos(c)) - if ang < 0.015: - return np.zeros(3, dtype=float) - axis = np.cross(z_now, z_des) - n = float(np.linalg.norm(axis)) - if n < 1e-9: - axis = np.array([1.0, 0.0, 0.0], dtype=float) - else: - axis = axis / n - mag = float(np.clip(self.ee_hold_kp * ang, -self.ee_w_max, self.ee_w_max)) - return axis * mag - - def _shape_xy_vel(self, v_des_xy: np.ndarray, dt: float) -> np.ndarray: - """真正驱动机械臂的那条悬停指令,外加变化率限制 + 低通滤波。""" - v_des = np.asarray(v_des_xy, dtype=float).reshape(2) - prev = self._v_xy_cmd - dv = v_des - prev - n = float(np.linalg.norm(dv)) - dv_max = max(1e-4, float(self.a_max) * max(float(dt), 1e-3)) - if n > dv_max: - dv = dv * (dv_max / n) - raw = prev + dv - a = self.vel_lpf_alpha - out = a * raw + (1.0 - a) * prev - nxy = float(np.hypot(out[0], out[1])) - lim = float(self.v_max_xy) - if nxy > lim > 0.0: - out = out * (lim / nxy) - self._v_xy_cmd = out - return out - - def _update_xy_arm(self, ee_z: float) -> bool: - """只有法兰落在锁高带内才做 XY。低于锁高要先抬回去,不算到位。""" - if self.ee_z_m <= 0.0: - self._xy_armed = True - self._publish_z_locked(True) - return True - z = float(ee_z) - at = at_lock_height(z, self.ee_z_m, self.approach_xy_gate_m) - if at and not self._xy_armed: - self._xy_armed = True - self._v_xy_cmd[:] = 0.0 - self.pid_x.reset() - self.pid_y.reset() - self.get_logger().info( - f"锁高到位 ee_z={z:.3f}m(期望 {self.ee_z_m:.3f})" - " —— 开始 XY;腕部无目标时 D435 可以拍一张" - ) - elif (not at) and self._xy_armed: - self._xy_armed = False - self._v_xy_cmd[:] = 0.0 - self.get_logger().info( - f"离开锁高 ee_z={z:.3f}m(期望 {self.ee_z_m:.3f})" - " —— 先回高度,XY 暂停", - throttle_duration_sec=1.0, - ) - self._publish_z_locked(at) - return self._xy_armed - - def _seek_velocity(self, p_ee: np.ndarray) -> Optional[np.ndarray]: - """base 系下的 XY 速度,用来扫描寻找工件:以「机械臂到达锁定高度时的位置」 - 为中心向外螺旋,让 eye-in-hand 相机扫过桌面。超时后返回 None(由调用方保持)。""" - now = time.monotonic() - if self._seek_t0 <= 0.0: - self._seek_t0 = now - self._seek_theta = 0.0 - self._seek_origin = (float(p_ee[0]), float(p_ee[1])) # 在下降点附近搜索 XY - if (now - self._seek_t0) > self.seek_timeout: - return None - ox, oy = self._seek_origin - self._seek_theta += 0.7 * self._ctrl_dt - r = min( - self.seek_radius_max, - 0.02 + 0.5 * self.seek_speed * (now - self._seek_t0), - ) - tx = ox + r * math.cos(self._seek_theta) - ty = oy + r * math.sin(self._seek_theta) - dx = tx - float(p_ee[0]) - dy = ty - float(p_ee[1]) - dist = math.hypot(dx, dy) - v = np.zeros(3, dtype=float) - if dist > 0.012: - speed = min(self.seek_speed, float(self.v_max_xy)) - v[0] = speed * dx / dist - v[1] = speed * dy / dist - return v - - def _clip_workspace_vel( - self, p_ee: np.ndarray, v_base: np.ndarray, T: float - ) -> np.ndarray: - """把指令限制在盒子里;如果本来就在盒子外,允许它往回恢复。""" - v = np.asarray(v_base, dtype=float).copy() - dt = max(float(T), 1e-3) - for i in range(3): - lo = float(self.ws_min[i]) - hi = float(self.ws_max[i]) - p = float(p_ee[i]) - if p < lo: - v[i] = max(v[i], 0.0) - elif p > hi: - v[i] = min(v[i], 0.0) - else: - p_n = p + v[i] * dt - if p_n < lo: - v[i] = (lo - p) / dt - elif p_n > hi: - v[i] = (hi - p) / dt - return v - - def _execute_twist( - self, - v_cam: np.ndarray, - p_cam: Optional[np.ndarray] = None, - hold_xy: bool = False, - v_base_override: Optional[np.ndarray] = None, - ) -> None: - # 如果看门狗在本周期中途已经触发,就硬冻结 - if self._target_lost_flag: - self._dq_hist.clear() - return - - now_m = time.monotonic() - dt_cmd = now_m - self._last_traj_mono - min_dt = 1.0 / self.traj_stream_hz - if self._last_traj_mono > 0.0 and dt_cmd < min_dt: - return - dt_use = float(np.clip(dt_cmd if self._last_traj_mono > 0.0 else 0.04, 0.015, 0.08)) - - q = self._current_joints() - T_ee = self._lookup_T(self.base_frame, self.ee_frame) - if q is None or T_ee is None: - self.get_logger().warn( - "execute 跳过:缺少 joint_states 或 base→ee 的 TF", - throttle_duration_sec=1.0, - ) - return - R_ee = T_ee[:3, :3] - p_ee = T_ee[:3, 3] - R_bc = self._R_cam_to_base(T_ee) - if hold_xy: - v_base = np.zeros(3, dtype=float) - elif v_base_override is not None: - v_base = np.asarray(v_base_override, dtype=float).reshape(3).copy() - else: - v_base = R_bc @ v_cam - T = max(0.08, self.exec_horizon) - kp = self.ee_hold_kp - v_xy = self.v_max_xy - if self._reacq_mono > 0.0 and (now_m - self._reacq_mono) < 0.12: - v_xy *= 0.85 - - # hover:在任意锁定高度上把法兰 XY 停在三维特征点上。 - # lookat:把光轴命中点(图像中心)驱到特征点上。 - xy_ok = self._update_xy_arm(float(p_ee[2])) - cruise = hybrid_cruise_vxy(self.v_slow_xy) - if ( - xy_ok - and (not hold_xy) - and (not self.ee_hold_xy) - and self.ee_z_m > 0.0 - and p_cam is not None - ): - look = self._xy_track_vs_feature(T_ee, p_cam) - if look is not None: - err, p_feat, p_ref = look - nerr = float(np.linalg.norm(err)) - clip_xy = max(0.03, float(self.e_xy_clip)) - if nerr > clip_xy: - err = err * (clip_xy / nerr) - nerr = clip_xy - # 锁定前整段同一巡航速度。不再用 50mm 远近两档: - # 远处本来就慢,近处一放开就按 kp×误差冲,越近越抖。 - if self._hybrid and not self._locked: - v_xy = min(float(v_xy), cruise) - if self._xy_deadzone(nerr, update=False): - v_base[0] = 0.0 - v_base[1] = 0.0 - self._hover_ixy[:] = 0.0 - else: - # 在死区附近做渐变,避免 P 控制来回 bang-bang。 - enter = max(0.002, float(self.deadzone_m)) - taper = float(np.clip((nerr - enter) / max(enter, 1e-3), 0.0, 1.0)) - # 积分项(抗积分饱和 ±4cm)用来突破关节指令死区, - # 否则 XY 收敛的最后几毫米就会停滞。 - self._hover_ixy[0] = float(np.clip( - self._hover_ixy[0] + float(err[0]) * dt_use, -0.04, 0.04)) - self._hover_ixy[1] = float(np.clip( - self._hover_ixy[1] + float(err[1]) * dt_use, -0.04, 0.04)) - v_base[0] = float(np.clip( - self.kp_xy * float(err[0]) * taper + self.ki_hover * self._hover_ixy[0], - -v_xy, v_xy)) - v_base[1] = float(np.clip( - self.kp_xy * float(err[1]) * taper + self.ki_hover * self._hover_ixy[1], - -v_xy, v_xy)) - self.get_logger().info( - f"{self.xy_track} dxy={nerr*1000:.0f}mm " - f"feat_xy=({p_feat[0]:.3f},{p_feat[1]:.3f}) " - f"ee_xy=({p_ee[0]:.3f},{p_ee[1]:.3f}) " - f"feat_z={p_feat[2]:.3f} ee_z={p_ee[2]:.3f} " - f"p_cam=({p_cam[0]:.3f},{p_cam[1]:.3f},{p_cam[2]:.3f})", - throttle_duration_sec=0.5, - ) - - nxy = float(np.hypot(v_base[0], v_base[1])) - cap_xy = cruise if (self._hybrid and not self._locked) else v_xy - if nxy > cap_xy > 0.0: - v_base[0] *= cap_xy / nxy - v_base[1] *= cap_xy / nxy - - # 在 base 系里保持法兰 XYZ(可配置,默认约 250 mm)。当 ee_hold_xy - # 为真时,视觉算出的 XY 会被覆盖。 - if self.ee_hold_xy: - v_base[0] = float(np.clip(kp * (self.ee_x_m - p_ee[0]), -self.v_max_xy, self.v_max_xy)) - v_base[1] = float(np.clip(kp * (self.ee_y_m - p_ee[1]), -self.v_max_xy, self.v_max_xy)) - if abs(self.ee_x_m - p_ee[0]) < 0.004: - v_base[0] = 0.0 - if abs(self.ee_y_m - p_ee[1]) < 0.004: - v_base[1] = 0.0 - # 有目标:XY 平移,Z 钉在这一段开始的高度。没目标才回锁高。 - translating = (not hold_xy) and self._have_target - if (not translating) and ((not xy_ok) or hold_xy): - v_base[0] = 0.0 - v_base[1] = 0.0 - self._v_xy_cmd[:] = 0.0 - if self.ee_z_m > 0.0: - self.get_logger().info( - f"回锁高 {self.ee_z_m:.3f}m 当前={p_ee[2]:.3f}m XY 保持", - throttle_duration_sec=1.0, - ) - shaped = self._shape_xy_vel(v_base[:2], dt_use) - v_base[0] = float(shaped[0]) - v_base[1] = float(shaped[1]) - if translating: - if self._z_hold is None: - self._z_hold = float(p_ee[2]) - v_base[2] = hold_translation_vz( - float(p_ee[2]), self._z_hold, kp=kp, v_lim=float(self.v_max_z) - ) - else: - self._z_hold = None - if self.ee_z_m > 0.0: - vz_lim = max(float(self.v_max_z), 0.08) - v_base[2] = lock_z_velocity( - float(p_ee[2]), self.ee_z_m, kp=kp, v_lim=vz_lim - ) - - w_base = ( - self._w_align_flange_down(R_ee) - if self.ee_vertical_down - else None - ) - - p_next = p_ee + v_base * T - if self.ee_z_m > 0.0 and not translating: - # 向下只许到锁高死区内。已经低于锁高时 v_z>0,这条不挡上抬。 - floor = float(self.ee_z_m) - 0.004 - if p_next[2] < floor and v_base[2] < 0.0: - v_base[2] = 0.0 - p_next = p_ee + v_base * T - elif p_next[2] < self.min_ee_z and v_base[2] < 0: - v_base[2] = 0.0 - p_next = p_ee + v_base * T - v_base = self._clip_workspace_vel(p_ee, v_base, T) - p_next = p_ee + v_base * T - link_R: List[np.ndarray] = [] - link_p: List[np.ndarray] = [] - for fr in self.link_frames: - Tl = self._lookup_T(self.base_frame, fr) - if Tl is None: - self.get_logger().warn( - f"execute 跳过:TF 缺 {fr}", - throttle_duration_sec=1.0, - ) - return - link_R.append(Tl[:3, :3]) - link_p.append(Tl[:3, 3]) - J = geometric_jacobian(link_R, link_p, p_ee, RIZON_LINK_AXES) - qdot = dls_twist( - J, v_base, w_base=w_base, damping=self.damping, max_qdot=self.max_qdot - ) - dq = qdot * T - - # ----- 第 5 项:对关节位移做滑动窗口平均 ----- - self._dq_hist.append(dq.copy()) - dq_avg = np.mean(np.stack(list(self._dq_hist), axis=0), axis=0) - # 让末端速度与平均后的步长保持一致 - qdot_avg = dq_avg / T - - mag = float(np.max(np.abs(dq_avg))) - v_lin = float(np.linalg.norm(v_base[:3])) - w_lin = 0.0 if w_base is None else float(np.linalg.norm(w_base)) - if mag < 1e-6 or (v_lin < 0.006 and w_lin < 0.04): - if self._xy_in_dead or hold_xy: - self._send_hold() - return - if mag < self.min_cmd_delta and v_lin < 0.012: - return - - q1 = q + dq_avg - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - pt = JointTrajectoryPoint() - pt.positions = [float(v) for v in q1.tolist()] - pt.velocities = [float(v) for v in qdot_avg.tolist()] - ns = int(round(T * 1e9)) - pt.time_from_start.sec = ns // 1_000_000_000 - pt.time_from_start.nanosec = ns % 1_000_000_000 - traj.points = [pt] - self._traj_pub.publish(traj) - self._last_traj_mono = now_m - self.get_logger().info( - f"traj Δq_avg_max={float(np.max(np.abs(dq_avg))):.4f} rad " - f"win={len(self._dq_hist)} |v_base|={float(np.linalg.norm(v_base)):.3f} " - f"ee_z={p_ee[2]:.3f}/{self.ee_z_m:.3f}", - throttle_duration_sec=0.5, - ) - - def _send_hold(self) -> None: - self._dq_hist.clear() - q = self._current_joints() - if q is None: - return - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - pt = JointTrajectoryPoint() - pt.positions = [float(v) for v in q.tolist()] - pt.velocities = [0.0] * int(q.size) - pt.time_from_start.nanosec = 120_000_000 - traj.points = [pt] - self._traj_pub.publish(traj) - - -def main(args=None) -> None: - rclpy.init(args=args) - node = ServoNode() - executor = MultiThreadedExecutor(num_threads=4) - executor.add_node(node) - try: - executor.spin() - except KeyboardInterrupt: - pass - finally: - node._e_stop("节点关闭") - executor.shutdown() - node.destroy_node() - if rclpy.ok(): - rclpy.shutdown() - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/site_io.py b/install/arm_application/lib/python3.11/site-packages/arm_application/site_io.py deleted file mode 100644 index 9243123..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/site_io.py +++ /dev/null @@ -1,216 +0,0 @@ -"""供应用节点加载 ``~/ros2/config/site.yaml``。""" - -from __future__ import annotations - -import os -from pathlib import Path -from typing import Any - -import yaml - - -def ros2_root() -> Path: - for key in ("SITE_ROS2_ROOT", "ROS2_WS"): - v = os.environ.get(key, "").strip() - if v: - return Path(v).expanduser() - return Path.home() / "ros2" - - -def site_path() -> Path: - env = os.environ.get("SITE_CONFIG", "").strip() - if env: - return Path(env).expanduser() - return ros2_root() / "config" / "site.yaml" - - -def load_site_dict(path: str | Path | None = None) -> dict[str, Any]: - p = Path(path).expanduser() if path else site_path() - if not p.is_file(): - return {} - data = yaml.safe_load(p.read_text(encoding="utf-8")) or {} - return data if isinstance(data, dict) else {} - - -def deep_merge(base: dict[str, Any], overlay: dict[str, Any]) -> dict[str, Any]: - out = dict(base) - for key, val in overlay.items(): - if isinstance(val, dict) and isinstance(out.get(key), dict): - out[key] = deep_merge(out[key], val) - else: - out[key] = val - return out - - -def joint_prefix_default() -> str: - """当前臂的关节名前缀(``Rizon4-XXXXXX_``),用作 ROS 参数的默认值。 - - 来源顺序: - - 1. ``SITE_JOINT_PREFIX`` —— ``scripts/env.sh`` → ``load_site_config.sh`` 从 - site.yaml 导出,这就是**权威值**; - 2. 由 ``SITE_ROBOT_SN`` 现算(``Rizon4-063989`` → ``Rizon4-063989_``); - 3. 都没有 → 空字符串。 - - **绝不写死某个具体 SN。** 以前这里的默认值是 ``"Rizon4-063989_"``, - 于是换台机器人后 ``ros2 run`` 直接起的节点会去订**上一台臂**的关节话题, - 表现为"节点起来了、什么都不动、也不报错"(R1.1)。 - """ - prefix = os.environ.get("SITE_JOINT_PREFIX", "").strip() - if prefix: - return prefix - sn = os.environ.get("SITE_ROBOT_SN", "").strip() - return f"{sn}_" if sn else "" - - -def base_frame_default() -> str: - """当前臂的基座坐标系(``_base_link``),用作 ROS 参数默认值。""" - frame = os.environ.get("SITE_BASE_FRAME", "").strip() - if frame: - return frame - sn = os.environ.get("SITE_ROBOT_SN", "").strip() - return f"{sn}_base_link" if sn else "" - - -def ee_frame_default() -> str: - """当前臂的法兰坐标系(``_flange``),用作 ROS 参数默认值。""" - frame = os.environ.get("SITE_EE_FRAME", "").strip() - if frame: - return frame - sn = os.environ.get("SITE_ROBOT_SN", "").strip() - return f"{sn}_flange" if sn else "" - - -def overhead_camera( - site: dict[str, Any], robot: dict[str, Any] | None = None -) -> tuple[dict[str, Any], list[str]]: - """手外(固定)相机 → ``(相机配置字典, 同样合格但未被选中的相机名)``。 - - 手外相机 = ``cameras.*`` 里 ``role`` 以 ``overhead`` 开头的那台(眼在手外时 - 相机固定在工位外,不随臂动)。 - - **为什么必须有唯一实现**:这份"按 role 找,再按 arm 收敛"的规则有两个调用方—— - S03 粗定位取命名空间(本模块给节点用)、手眼标定脚本取相机名。两边各写一份的 - 后果不是报错,而是"标定用的相机"和"推理用的相机"悄悄不是同一台,且没人发现。 - 所以规则只写在这里,两边都调它(`export_site_env.overhead_camera` 也走这里)。 - - 收敛规则(确定性的三级): - 1. ``arm`` 与当前臂相同的优先(仿真 ``sim_d435`` 靠这级选中); - 2. 都没有 ``arm``(= 双臂共用的那台)时回落到它; - 3. 还是多个 → 取第一个,并把其余名字放进第二个返回值,让调用方**出声告警**。 - """ - cams = [ - cfg - for cfg in (site.get("cameras") or {}).values() - if isinstance(cfg, dict) - and str(cfg.get("role") or "").strip().lower().startswith("overhead") - ] - if not cams: - return {}, [] - arm = str((robot or {}).get("arm") or "").strip() - mine = [c for c in cams if str(c.get("arm") or "").strip() == arm] if arm else [] - hits = mine or [c for c in cams if not str(c.get("arm") or "").strip()] or cams - chosen = dict(hits[0]) - others = [str(c.get("name") or "?") for c in hits[1:]] - return chosen, others - - -def eye_to_hand_result_name(short: str, camera_name: str) -> str: - """眼在手外结果文件的**文件名**(不含目录)。 - - 外参绑定「这条臂的基座 + 这台相机」:换条臂或换台相机都不通用, - 所以名字必须同时带上臂号与相机。调用方只许调这里,不许自己拼 - (launch / export_site_env / S03 找文件都走这一处)。 - """ - short = str(short or "").strip() - cam = str(camera_name or "").strip().strip("/") - if short and cam: - return f"{short}_{cam}_eye_to_hand.yaml" - if cam: - return f"{cam}_eye_to_hand.yaml" - if short: - return f"{short}_eye_to_hand.yaml" - return "eye_to_hand.yaml" - - -def resolve_eye_to_hand_file( - root: Path, - *, - explicit: str = "", - camera_name: str = "", -) -> Path | None: - """找手外相机的手眼文件。没有就返回 None。 - - 路径一律按 ``root`` 解析,不跟当前工作目录走——相对 CWD 的路径会在 - "换个目录启动"时静默失效(文件找不到 → S03 直接降级),而人只会怀疑标定。 - - 候选顺序: - 1. ``explicit`` —— launch 按 site.yaml 派生的确切路径 - (``<臂号>_<相机>_eye_to_hand.yaml``); - 2. ``<相机名>_eye_to_hand.yaml`` —— 旧命名 / 仿真(``sim_d435_...``); - 3. ``eye_to_hand.yaml`` —— 再兜底。 - """ - candidates: list[Path] = [] - if explicit: - p = Path(explicit).expanduser() - candidates.append(p if p.is_absolute() else root / p) - cam = str(camera_name or "").strip().strip("/") - if cam: - candidates.append(root / "handeye" / "results" / f"{cam}_eye_to_hand.yaml") - candidates.append(root / "handeye" / "results" / "eye_to_hand.yaml") - for cand in candidates: - if cand.is_file(): - return cand - return None - - -TRACK_CAMERA_ROLES = ("wrist", "overhead") - - -def track_camera_role(site: dict[str, Any] | None) -> str: - """一阶段跟踪用哪台相机:``wrist``(腕部 D405)或 ``overhead``(顶置 D435)。 - - 写错**当场报错**,不会退回腕部 —— 退回会让人以为在验 D435,其实还在用 D405。 - 缺省 ``wrist``:没写这个键时行为与改之前一致(腕部追踪)。 - """ - perc = (site or {}).get("perception") - perc = perc if isinstance(perc, dict) else {} - raw = perc.get("track_camera") - if raw is None or str(raw).strip() == "": - return "wrist" - role = str(raw).strip().lower() - if role not in TRACK_CAMERA_ROLES: - raise ValueError( - f"perception.track_camera 只能是 wrist 或 overhead,收到 {raw!r}。" - "写错不会退回腕部 —— 退回会让人以为在用 D435 其实还在用 D405。" - ) - return role - - -def track_handeye_mode(role: str) -> str: - """跟踪相机角色 → 手眼装法。overhead 必须用 cam→基座,不能用 cam→法兰。""" - if str(role or "").strip().lower() == "overhead": - return "eye_to_hand" - return "eye_in_hand" - - -def handeye_static_tf_frames( - *, - mode: str, - ee_frame: str, - base_frame: str, - cam_frame: str, -) -> tuple[str, str]: - """手眼静态 TF 的 ``(父系, 子系)``。 - - 两种装法的父子关系**不同**,不能混: - * ``eye_in_hand``:法兰 ← 相机(相机跟着臂动) - * ``eye_to_hand``:基座 ← 相机(相机固定,不随臂动) - - 把眼在手外的文件按"法兰 ← 相机"发出去,会得到一条**看着合理**的错 TF —— - 定位总能到附近、永远差一截,而人只会去怀疑标定精度。 - """ - if str(mode or "").strip().lower() == "eye_to_hand": - return str(base_frame), str(cam_frame) - return str(ee_frame), str(cam_frame) - diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/stage2_locate_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/stage2_locate_node.py deleted file mode 100644 index a3575d2..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/stage2_locate_node.py +++ /dev/null @@ -1,3490 +0,0 @@ -#!/usr/bin/env python3 -"""Stage-2 one-shot hole localization + gauge alignment (left arm 89 first). - -与一阶段(实时跟踪)不同:到位悬停后「拍一张照」一次性解算 k1/k2 孔坐标, -不做连续推理。流程: - - 1. verticalize — 法兰 +Z 严格朝世界 -Z(垂直朝下),XY/Z 不动 - 2. hover — 闭环升到/降到 robots[].servo.hole_hover_z_m(悬停锁高) - 3. coarse — 拍照,工件(pose 模型给框;k1/k2 用关键点)粗移到 bbox 中心上方 - 4. fine — 拍照,two_stage(YOLO+HoughCircles)解 k1/k2 孔心像素 - 5. align — 像素射线交工件面 + 内参 + 手眼,把规尖移到目标孔正上方。 - ``hole_keypoint_once`` 时只走一次,核验拍只记账; - ``hole_once_lock_xy_descend`` 时按视线前馈一条 MoveL 贴面; - 否则复拍迭代到 align_tol_m - 6. hold — 锁定关节,发布 /stage2/result(JSON) + /tmp/stage2_result.json - -高度调试(不动 XY、不拍照定位): - bash ~/ros2/scripts/run_stage2_locate.sh --arm 89 --hover-only -""" - -from __future__ import annotations - -import json -import math -import os -import sys -import time -from pathlib import Path -from typing import Any, Dict, List, Optional, Tuple - -import numpy as np -import rclpy -from control_msgs.action import FollowJointTrajectory -from rclpy.action import ActionClient -from rclpy.node import Node -from rclpy.qos import qos_profile_sensor_data -from geometry_msgs.msg import WrenchStamped -from sensor_msgs.msg import CameraInfo, Image, JointState -from std_msgs.msg import String -from tf2_ros import Buffer, TransformListener -from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint - -from arm_application.geom_ik import ( - RIZON_LINK_AXES, - dls_translate_hold_ori, - dls_twist, - geometric_jacobian, - quat_xyzw_to_R, -) -from arm_application.path_profile import ( - FROZEN_J_HOP_MAX_M, - path_interp as _path_interp, - trap_params as _trap_params, - trap_sv as _trap_sv, -) -from arm_application.overhead_oneshot import ( - ONCE_APPROACH_STEP_M, - ONCE_FF_LOOK_PER_M, - ONCE_FF_MOVEL_VEL_MPS, - ONCE_TRIM_MAX_STEP_M, - ONCE_TRIM_REFUSE_M, - cam_xy_bias_axes, - decompose_base_xy, - flange_z_for_gap_m, - final_gap_refusal, - hole_pair_span_m, - hole_pair_span_ok, - once_ff_movel_from_tcp, - once_ff_tcp_xyz, - oneshot_align_step_m, - pixel_on_base_plane, - retract_goal_z, -) -from arm_application.handeye_realsense import resolve_realsense_topics -from arm_application.gauge_boot import perception_source_of -from arm_application.gauge_fsm import drag_verdict, resolve_hover_z, wrench_all_zero -from arm_application.hole_detect_hough import detect_holes -from arm_application.hole_detector import config_from_site, weights_from_site -from arm_application.site_io import deep_merge, load_site_dict, ros2_root -from arm_application.ros_node import TolerantNode - -try: - from flexiv_msgs.msg import RobotStates -except ImportError: # pragma: no cover - RobotStates = None # type: ignore - -def contact_armed_gap_m(observe_gap_m: float, final_gap_m: float = 0.002) -> float: - """轻降力接触门槛对应的几何间隙。离面更远时腕部力会漂几牛,不能当碰到。 - - 2026-10-13 远场:法兰 0.384、间隙 138mm、ΔFz=+2.87N。 - 2026-10-13 近场仍假:间隙 9.5mm、ΔFz=+2.77N,尖几何上还在面上约 1cm, - 碰不到板。观察间隙 15mm 会把这一档武装起来,所以门控只收到 - ``final_gap_m + 4mm``(贴面 2mm 时 = 6mm)。``observe_gap_m`` 仍从调用方 - 传入,避免两处签名分叉,但不放宽门控。 - """ - _ = observe_gap_m - return float(final_gap_m) + 0.004 - - -def contact_armed_by_gap( - gap_m: float, observe_gap_m: float, final_gap_m: float = 0.002 -) -> bool: - """当前几何间隙够近,才许把腕部力突变当成碰到工件。""" - return float(gap_m) <= contact_armed_gap_m(observe_gap_m, final_gap_m) - - -# 一次 hop 之后实测关节变化小于这个值,就认为「臂根本没跟随指令」。 -# -# 真机踩到过(2026-09-28):一次 hover hop 计划要动 `max|Δq|=0.17378rad`,实测 -# `0.00000rad`,而控制器照样打印 "Goal reached, success!"。原因不在几何/对位, -# 而是 RDK 断连后 `operational()` 仍为 true、`read()` 一直返回最后一帧缓存, -# 关节状态永久冻结(`robot_timestamp` 推进量为 0),而控制器是本地插值、不校验反馈。 -# 真机上报成"垂直化或悬停失败"会把人往"倾角/悬停高度"上带,故单独拎出来报。 -_NO_FOLLOW_EPS_RAD = 1e-4 - - -def _as_bool(val: Any, default: bool = False) -> bool: - if val is None: - return default - if isinstance(val, str): - return val.strip().lower() in ("1", "true", "yes", "on") - return bool(val) - - -def _pt(q: np.ndarray, qdot: np.ndarray, t_sec: float) -> JointTrajectoryPoint: - pt = JointTrajectoryPoint() - pt.positions = [float(v) for v in q.tolist()] - pt.velocities = [float(v) for v in qdot.tolist()] - # 不填 accelerations:全 0 会和样条速度冲突,终点附近抖/过冲。 - ns = int(round(max(0.0, float(t_sec)) * 1e9)) - pt.time_from_start.sec = ns // 1_000_000_000 - pt.time_from_start.nanosec = ns % 1_000_000_000 - return pt - - -def _sanitize_traj(traj: JointTrajectory, min_dt: float = 0.02) -> JointTrajectory: - """JTC 要求 time_from_start 严格递增;短 hop 保持点曾经倒退导致拒轨。""" - last = -min_dt - for p in traj.points: - t = float(p.time_from_start.sec) + float(p.time_from_start.nanosec) * 1e-9 - if t < last + min_dt: - t = last + min_dt - ns = int(round(t * 1e9)) - p.time_from_start.sec = ns // 1_000_000_000 - p.time_from_start.nanosec = ns % 1_000_000_000 - last = t - return traj - - -def _bgr_copy(msg: Image) -> np.ndarray: - h, w = int(msg.height), int(msg.width) - enc = (msg.encoding or "").lower() - buf = np.frombuffer(msg.data, dtype=np.uint8) - if enc == "bgr8": - return buf.reshape(h, w, 3).copy() - if enc == "rgb8": - return buf.reshape(h, w, 3)[:, :, ::-1].copy() - raise RuntimeError(f"Unsupported color encoding {msg.encoding!r}") - - -class Stage2Locate(TolerantNode): - def __init__(self, node_name: str = "stage2_locate") -> None: - super().__init__(node_name) - - self.declare_parameter("robot_sn", os.environ.get("SITE_ROBOT_SN") or "") - self.declare_parameter("hover_only", False) - self.declare_parameter("target_hole", "") # 空字符串 → 用 site 的 stage2.target_hole - self.declare_parameter("hover_z_m", -1.0) # 大于 0 → 覆盖 site 里的值 - # 贴面规尖离面 [mm]。≥0 → 覆盖 site ``final_gap_mm``。-1=用 site。 - # 笛卡尔锁 XY 时法兰 Z = 工具长 + 工件面 + 间隙,XY 不动。 - self.declare_parameter("final_gap_mm", -1.0) - # 工具尖端在法兰下方多少 [m];大于 0 → 覆盖 site。 - # 仿真里由 run_gauge_assembly.sh --sim 传**实测值**(每次上料都可能不同), - # 真机不传(走 site.yaml)。悬停高度与 S07 下探预算都按它算。 - self.declare_parameter("tool_tip_below_flange_m", -1.0) - # 调试开关:只验证**精对准**、不轻降(避免"对准还没confirmed就把规往孔里带")。 - # 用 int 不用 bool —— `ros2 launch` 传 bool 参数容易踩到 CLI 解析的坑。 - # -1=按 site 的 stage2.final_descent_enable;0=强制不降;1=强制降。 - self.declare_parameter("final_descent_enable", -1) - self.declare_parameter("preview", True) - self.declare_parameter("action_name", "rizon_arm_controller/follow_joint_trajectory") - # 真值孔位(perception.source=truth)要把 scene.yaml 的物体位姿投影成像, - # 场景位姿在 Gazebo 的 world 系里,所以要有世界系的名字。 - self.declare_parameter("world_frame", "world") - - # ---------------- site.yaml 解析(和脚本同一套) ---------------- - site = load_site_dict() - sn = str(self.get_parameter("robot_sn").value or "").strip() - robots = (site.get("robot") or {}).get("robots") or [] - robot: Dict[str, Any] = {} - for r in robots: - if isinstance(r, dict) and str(r.get("sn") or "").strip() == sn: - robot = dict(r) - break - if not robot: - self.get_logger().warn(f"robot.sn {sn!r} 不在 site robots[],用全局默认") - - servo = deep_merge(site.get("servo") or {}, robot.get("servo") or {}) - paths = deep_merge(site.get("paths") or {}, robot.get("paths") or {}) - cam_cfg = deep_merge(site.get("camera") or {}, robot.get("camera") or {}) - stage2 = dict((site.get("hole_detect") or {}).get("stage2") or {}) - - self.prefix = str(robot.get("joint_prefix") or f"{sn}_") - self.base_frame = str(robot.get("base_frame") or f"{sn}_base_link") - self.ee_frame = str(robot.get("ee_frame") or f"{sn}_flange") - cam = str(cam_cfg.get("name") or "d405").strip().strip("/") - self.image_topic, self.info_topic = resolve_realsense_topics(cam, image_topic="") - self.depth_topic = f"/{cam}/aligned_depth_to_color/image_raw" - self.cam_frame = f"{cam}_color_optical_frame" - self.handeye_file = str(paths.get("handeye_file") or "") - - # 悬停锁高:launch 覆盖 > robots[].servo.hole_hover_z_m > stage2.hover_z_m - hover_override = float(self.get_parameter("hover_z_m").value) - self.hover_z_user_set = hover_override > 0.0 - self._hover_refused = "" - self.hover_z = ( - hover_override if self.hover_z_user_set - else float(servo.get("hole_hover_z_m") or stage2.get("hover_z_m") or 0.30) - ) - self.min_ee_z = float(servo.get("min_ee_z_m") or 0.20) - self.safe_z = float(servo.get("safe_z_m") or 0.45) - self.ws_min = np.array(servo.get("workspace_xyz_min") or [0.08, -0.55, 0.18], dtype=float) - self.ws_max = np.array(servo.get("workspace_xyz_max") or [0.85, 0.55, 0.65], dtype=float) - self.hover_offset = np.array( - servo.get("hover_offset_ee_xy_m") or [0.0, 0.0], dtype=float - ).reshape(2) - - # ---- 感知来源:本节点的孔位是"检测出来的"还是"场景真值算出来的" ---- - # 与 gauge_assembly_node 用**同一个解析函数**(gauge_boot.perception_source_of): - # 两处各自读一遍 site,迟早会出现"流程以为在用真值、检测节点还在跑模型"。 - perception = deep_merge(site.get("perception") or {}, robot.get("perception") or {}) - self.perception_source = perception_source_of(perception) - self._truth_object = str((perception.get("truth") or {}).get("object") or "") - self._truth_warn_t = 0.0 - # 真值路径的"实测位姿"订阅与场景缓存(懒建,见 _truth_scene/_truth_live_pose) - self._truth_live = None - self._truth_spec = None - - self.target_hole = ( - str(self.get_parameter("target_hole").value or "").strip().lower() - or str(stage2.get("target_hole") or "k1").strip().lower() - ) - self.k1_label = str(stage2.get("k1_label") or "left").strip().lower() - self.align_tol = float(stage2.get("align_tol_m") or 0.0007) - self.align_max_iters = int(stage2.get("align_max_iters") or 8) - self.coarse_max_moves = int(stage2.get("coarse_max_moves") or 2) - self.align_speed = float(stage2.get("align_speed") or 0.03) - self.move_speed = float(stage2.get("move_speed") or 0.05) - # 粗居中的两条**误检守卫**(2026-10-08 真机 arm 89 的 exit=4,见 - # _coarse_target_reject / _bbox_on_border 的注释):粗居中的目的是把臂 - # 挪到工件正上方,**挪错比不挪危险得多** —— 一挪错精定位就再也看不到 - # k1/k2,而流程会把它当"孔检测失败",现场根本想不到是粗居中把臂带走的。 - self.coarse_max_offset_m = float(stage2.get("coarse_max_offset_m") or 0.08) - self.coarse_border_px = int(stage2.get("coarse_border_px") or 2) - # 最后轻降到孔面上方 final_gap_mm(不接触)。启动参数 ≥0 覆盖 site。 - self._final_gap_refused = "" - _gap_override_mm = float(self.get_parameter("final_gap_mm").value) - self.final_gap_user_set = _gap_override_mm >= 0.0 - if self.final_gap_user_set: - self.final_gap_m = _gap_override_mm / 1000.0 - else: - self.final_gap_m = float(stage2.get("final_gap_mm") or 1.5) / 1000.0 - # 观测下降:对准后降到这个间隙就停,方便看规尖是不是对着孔。 - # 比 final_gap(贴面 2mm)高一截,对偏了也不会把规压上孔沿。 - self.observe_gap_m = float(stage2.get("observe_gap_mm") or 15.0) / 1000.0 - if self.observe_gap_m < self.final_gap_m: - self.get_logger().warn( - f"observe_gap_mm={self.observe_gap_m*1000:.1f} 比贴面目标 " - f"{self.final_gap_m*1000:.1f}mm 还近 —— 收到贴面高度,避免观测下降钻进孔" - ) - self.observe_gap_m = self.final_gap_m - # 悬停高度**必须**让工具尖端留在工件面上方(2026-09-24 的教训,完整说明见 - # gauge_fsm.hover_z_guard):悬停高是按相机视距定的,而工具(夹爪+通止规) - # 比相机长 —— 实测悬停时尖端已经钻进工件 25mm,于是 S05 的横向对准把工件 - # 拖走 92mm,而真值孔位按工件的**实测**位姿算 ⇒ 孔位跟着工具走、残差恒定 - # 13mm 永不收敛(现场看着像手眼标定坏了)。这里按几何兜住并喊出原因。 - _ga = deep_merge(site.get("gauge_assembly") or {}, robot.get("gauge_assembly") or {}) - # 工具长优先取**启动参数**(launch 覆盖 > site):仿真里上料脚本会实测它 - # 并落盘(sim_load_gauge → sim_tool_geometry.yaml → run_gauge_assembly.sh), - # 因为仿真里规会在指间下滑、下滑量随装夹变化(实测见过 243 / 254mm)。 - # 真机不给这个参数,走 site.yaml 的实测值 —— 与 hover_z_m 同一套优先级。 - _tool_len = float(self.get_parameter("tool_tip_below_flange_m").value) - if _tool_len <= 0.0: - _tool_len = float(_ga.get("tool_tip_below_flange_m") or 0.0) - _surface_z = float(_ga.get("workpiece_surface_z_m") or 0.0) - # 记成成员:轻降的几何夹逼(_descend_above_hole)要用同一套数字, - # 不能各推一遍 —— 否则改了一处另一处就悄悄失配。 - self.tool_tip_below_flange_m = _tool_len - self.surface_z_m = _surface_z - # 对小孔只用关键点像素和已知工件面,不读深度图。缺了就按旧的深度路径。 - self.hole_visual_only = _as_bool(stage2.get("hole_visual_only"), False) - # 本分支实验:悬停拍一次 k1/k2,走一次,复拍只记账不改 XY。 - # 键必须接线——写了 true 却仍多走多拍,等于没做实验。 - self.hole_keypoint_once = _as_bool(stage2.get("hole_keypoint_once"), False) - # 悬停走完后一条厂家 MoveL 收到贴面。k=0:笛卡尔锁 XY 只降 Z。 - # 缺键 = 仍走观察高补交(37b85aa)。 - self.hole_once_lock_xy_descend = _as_bool( - stage2.get("hole_once_lock_xy_descend"), False - ) - _ff = stage2.get("once_ff_look_per_m") - if _ff is None: - self.once_ff_look_per_m = float(ONCE_FF_LOOK_PER_M) - else: - self.once_ff_look_per_m = float(_ff) - self._ws_clipped = False - self._hole_snaps: List[Dict[str, Any]] = [] - if self.hover_z_user_set and (_tool_len <= 0.0 or _surface_z <= 0.0): - self._hover_refused = ( - "写了 --hover-z,但工具长度或工件面未知,无法确认尖端在面之上,拒绝执行" - ) - self.get_logger().error(self._hover_refused) - elif _tool_len > 0.0: - _used, _refused = resolve_hover_z( - self.hover_z, _surface_z, _tool_len, self.final_gap_m, self.hover_z_user_set - ) - if _refused: - self._hover_refused = _refused - self.get_logger().error( - "启动参数指定的悬停高度不安全,拒绝执行,不会改成别的高度:\n " - + _refused - ) - elif abs(_used - self.hover_z) > 1e-9: - self.get_logger().warn( - f"二阶段悬停高度自检不通过 —— 用几何修正值 {_used:.4f}m" - "(这次没写 --hover-z,沿用 site 的几何抬高)" - ) - self.hover_z = _used - # 轻降**最多能降多少**:从悬停高度降到"规尖停在工件面上方 final_gap"为止。 - # 这是纯几何量,与深度测量无关 —— 测量的唯一职责是让下降**提前**收工, - # 绝不允许它把下降量**放大**(2026-09-29 实测就是这么撞的:测量出的 - # gap0=141mm 比几何真值大 ~86mm,于是多降 86mm 把规撞进孔)。 - # 工具长/工件面未知(<=0)时给 None = 不启用夹逼,行为与改动前一致。 - self.descent_budget_m: Optional[float] = None - if _tool_len > 0.0 and _surface_z > 0.0: - self.descent_budget_m = max( - 0.0, self.hover_z - _tool_len - _surface_z - self.final_gap_m - ) - # 轻降结束后**按几何**算出的真实间隙 [m],供收尾日志如实汇报(不是把目标值 - # 当结果念一遍 —— 那会让"停在离面 50mm"也显示成"~2.0mm",R1.1 的静默失效)。 - self.descent_final_gap_m: Optional[float] = None - self.final_descent_speed = float(stage2.get("final_descent_speed") or 0.006) - self.final_descent_enable = _as_bool(stage2.get("final_descent_enable"), True) - _fd = int(self.get_parameter("final_descent_enable").value) - if _fd in (0, 1): # -1 = 按 site;0/1 = 启动参数强制(调试用) - self.final_descent_enable = bool(_fd) - self.get_logger().warn( - f"final_descent_enable 被启动参数覆盖为 {self.final_descent_enable} " - f"(site 里是 {stage2.get('final_descent_enable')})—— 只在调试时这么用" - ) - if self.final_gap_user_set and not self.final_descent_enable: - self._final_gap_refused = ( - "同时写了 --final-gap 和 --no-descent,不知道听谁的,拒绝开跑" - ) - self.get_logger().error(self._final_gap_refused) - elif self.final_gap_user_set and (_tool_len <= 0.0 or _surface_z <= 0.0): - self._final_gap_refused = ( - "写了 --final-gap,但工具长度或工件面未知,无法确认尖端在面之上,拒绝执行" - ) - self.get_logger().error(self._final_gap_refused) - elif _tool_len > 0.0 and _surface_z > 0.0: - _why_gap = final_gap_refusal( - self.final_gap_m, - _tool_len, - _surface_z, - self.hover_z, - float(self.ws_min[2]), - float(self.ws_max[2]), - ) - if _why_gap: - self._final_gap_refused = _why_gap - self.get_logger().error(_why_gap) - self.vert_tol_rad = math.radians(float(stage2.get("verticalize_tol_deg") or 0.8)) - self.settle_sec = float(stage2.get("settle_sec") or 0.45) - self.snap_frames = int(stage2.get("snap_frames") or 5) - self.min_depth = float(stage2.get("min_depth_m") or 0.06) - self.max_depth = float(stage2.get("max_depth_m") or 0.60) - self.linger_sec = float(stage2.get("linger_sec") or 8.0) - - # ---- 精对准的「工具位置」:视觉量规尖(默认)还是法兰+固定偏置 ---- - # 为什么必须能视觉量(2026-10-08 真机 arm 89): - # 规是**夹在爪里**的零件,它相对法兰轴线可以整体偏出约 10mm(实测规杆 - # 轴线相对法兰 = (+10.7, −0.1)mm)。二阶段原来把**法兰轴线**对到孔上 - # (hover_offset_ee_xy_m 写死 [0,0]),于是规尖实际离孔心 ~10mm, - # 轻降一压,φ6 规尖就骑在 φ7 孔的**孔沿**上、力从 −1N 蹦到 63N 卡死。 - # 现场看到的是"轻降在离面 4mm 停住",离真正原因(规偏了)很远。 - # 改成在同一帧里同时解「规尖基座 XY」和「孔基座 XY」,两者走同一条手眼链, - # 链路误差/装夹变动一起抵消 —— 这才是"用视觉把孔对正"。 - # 规尖偏移**逐帧实测+一致性校验**(见 _tip_offset_from_depth):偏移是刚体量, - # 竖直朝下姿态下在基座 XY 里恒定,所以可以用"上一拍的偏移"剔掉偶发误检。 - # 规尖偏移**逐帧实测 + 一致性校验后冻结**(见 _refresh_tip_offset):偏移是刚体量, - # 竖直朝下姿态下在基座 XY 里恒定。为什么要冻结而不是逐拍重算: - # 2026-10-08 真机实测,逐拍重算时残差在 0.44~0.85mm 之间来回荡、收不进 0.25mm —— - # 元凶是**规杆略微倾斜**(<1°):每拍取到的"最深像素"高度不同(工具长在 - # 192~223mm 之间跳),同一根杆在不同高度上的基座 XY 差 ~0.4mm。 - # 偏移既然是刚体量,量准一份冻结住,那 0.4mm 的抖动就没了。 - self.tip_vision = _as_bool(stage2.get("align_tip_vision"), True) - self.tip_near_m = float(stage2.get("tip_near_m") or 0.15) - self.tip_min_m = float(stage2.get("tip_min_m") or 0.04) - self.tip_max_m = float(stage2.get("tip_max_m") or 0.60) - self.tip_band_frac = float(stage2.get("tip_search_band_frac") or 0.25) - self.tip_min_px = int(stage2.get("tip_min_px") or 150) - self.tip_off_tol = float(stage2.get("tip_offset_tol_m") or 0.003) - self.tip_len_min = float(stage2.get("tip_len_min_m") or 0.15) - self.tip_len_max = float(stage2.get("tip_len_max_m") or 0.32) - self.tip_calib_n = int(stage2.get("tip_calib_n") or 4) - self._tip_off: Optional[np.ndarray] = None # 规尖相对法兰的基座 XY 偏移(冻结后不变) - self._tip_samp: list = [] # 校准期攒下的 (偏移, 工具长) 样本 - self._tip_len_m: Optional[float] = None # 定偏移时并记下的工具长(用于交叉核对配置) - - self.hover_only = _as_bool(self.get_parameter("hover_only").value, False) - self.preview = _as_bool(self.get_parameter("preview").value, True) - - # 孔检测参数(hole_detect.yaml + site 覆盖) - self._hole_cfg = config_from_site(site) - self._weights = weights_from_site(site) - self._weights_fb = str(paths.get("yolo_weights") or "") - - self.joint_names = [f"{self.prefix}joint{i}" for i in range(1, 8)] - self.link_frames = [f"{self.prefix}link{i}" for i in range(1, 8)] - - # ---------------- ROS 接口 ---------------- - self._js: Optional[JointState] = None - self.create_subscription(JointState, "joint_states", self._on_js, 10) - self._tf = Buffer() - self._tfl = TransformListener(self._tf, self, spin_thread=False) - self._cli = ActionClient( - self, FollowJointTrajectory, - str(self.get_parameter("action_name").value), - ) - - self._color: Optional[Image] = None - self._depth: Optional[Image] = None - self._info: Optional[CameraInfo] = None - self.create_subscription(Image, self.image_topic, self._on_color, qos_profile_sensor_data) - self.create_subscription(Image, self.depth_topic, self._on_depth, qos_profile_sensor_data) - self.create_subscription(CameraInfo, self.info_topic, self._on_info, qos_profile_sensor_data) - # 腕部六维力(轻降安全兜底:规尖一碰工件 force.z 突变,立即停)。 - # 它**同时是 S07 柔顺下压的首选接触判据**(见 gauge_fsm.wrench_touch): - # 通止规靠夹持摩擦抱住,轴向力传不到指垫触觉,只有腕部 FT 测得准。 - self._ft_fz: Optional[float] = None - #: 最近一帧的收到时刻(单调钟)。判"有没有活的数据"用它,**不用数值大小** —— - #: 静止时轴向力本来就接近 0,拿数值判活会把"安静的传感器"误判成掉线。 - self._t_ft: Optional[float] = None - #: "FT 全零"守卫的状态(见 _on_wrench):零值起始时刻 + 是否已喊过一次。 - self._ft_zero_since: Optional[float] = None - self._ft_zero_warned: bool = False - robot_ns = str(self.get_parameter("robot_sn").value).replace("-", "_") - # 话题可配:默认按 sn 推导,与真机 flexiv_robot_states_broadcaster 一致。 - # 换 FT 来源(换个厂家、或走 external_wrench_in_tcp)时不用改代码。 - self.ft_wrench_topic = str( - servo.get("ft_wrench_topic") or f"/{robot_ns}/ft_sensor_wrench" - ) - self.create_subscription( - WrenchStamped, self.ft_wrench_topic, self._on_wrench, qos_profile_sensor_data - ) - # 厂家 tcp_pose(WORLD)。视线前馈 MoveL 必须在这上面加相对位移, - # 不许拿 ROS 法兰+规尖当绝对目标。回调名避开 stage3 的 `_on_robot_states`。 - self._tcp_world: Optional[Tuple[float, float, float]] = None - self._t_tcp: Optional[float] = None - self.robot_states_topic = f"/{robot_ns}/flexiv_robot_states" - if RobotStates is not None: - self.create_subscription( - RobotStates, - self.robot_states_topic, - self._on_stage2_robot_states, - qos_profile_sensor_data, - ) - elif self.hole_once_lock_xy_descend: - self.get_logger().error( - "没有 flexiv_msgs.RobotStates,视线前馈不能读厂家 tcp_pose," - "不许退回 ROS 绝对坐标" - ) - - self._state_pub = self.create_publisher(String, "/stage2/state", 10) - self._result_pub = self.create_publisher(String, "/stage2/result", 10) - self._overlay_pub = self.create_publisher(Image, "/stage2/overlay", 10) - - self._detector = None # 懒加载,hover_only 不需要 GPU/ORT - self._detector_fb = None - self._last_overlay: Optional[np.ndarray] = None - - self.get_logger().info( - f"stage2 arm={robot.get('label') or sn} ee={self.ee_frame} cam={cam}\n" - f" hover_z={self.hover_z:.3f}m (site: robots[].servo.hole_hover_z_m) " - f"safe_z={self.safe_z:.2f} min_z={self.min_ee_z:.2f}\n" - f" weights={self._weights}\n" - f" image={self.image_topic} depth={self.depth_topic}\n" - f" target={self.target_hole} (k1={self.k1_label}) tol={self.align_tol*1000:.1f}mm " - f"hover_only={self.hover_only} hole_visual_only={self.hole_visual_only} " - f"hole_keypoint_once={self.hole_keypoint_once} " - f"lock_xy_descend={self.hole_once_lock_xy_descend} " - f"ff_look={self.once_ff_look_per_m:.3f} " - f"final_gap={self.final_gap_m * 1000:.1f}mm" - + ( - f"→法兰Z={flange_z_for_gap_m(self.tool_tip_below_flange_m, self.surface_z_m, self.final_gap_m):.4f}m" - if self.tool_tip_below_flange_m > 0.0 and self.surface_z_m > 0.0 - else "" - ) - + "\n" - f" 工具长={self.tool_tip_below_flange_m:.4f}m(法兰到尖,下臂不得低于面+间隙)" - ) - if self.hole_keypoint_once and self.hole_once_lock_xy_descend: - k = float(self.once_ff_look_per_m) - if k <= 1e-9: - self.get_logger().warn( - "对孔方案=单次精拍·笛卡尔锁 XY(实验)。悬停走完后不补拍," - "厂家 MoveL 只降 Z、ΔXY=0。k>0 会沿 -look 再加前馈。" - "对照 37b85aa 把 hole_once_lock_xy_descend 改回 false。" - ) - else: - self.get_logger().warn( - "对孔方案=单次精拍·视线前馈斜线(实验)。悬停走完后不补拍," - f"ΔXY=-look×{k:.3f}×剩余下降,一条 MoveL 到贴面。" - "对照 37b85aa 把 hole_once_lock_xy_descend 改回 false。" - ) - elif self.hole_keypoint_once: - self.get_logger().warn( - "对孔方案=单次精拍(实验分支)。拍一次→走一次,复拍和下降后只记账不改 XY。" - "残差以核验拍为准,不许用 hop 到位冒充。看 /tmp/stage2_result.json 的 snaps。" - ) - - # ==================== 状态/运动原语(闭环 hop,同 goto_ee_plane) ==================== - - def _on_js(self, msg: JointState) -> None: - self._js = msg - - def _on_color(self, msg: Image) -> None: - self._color = msg - - def _on_depth(self, msg: Image) -> None: - self._depth = msg - - def _on_info(self, msg: CameraInfo) -> None: - self._info = msg - - def _on_stage2_robot_states(self, msg) -> None: - """缓存厂家 ``tcp_pose``(WORLD)。名字必须与 stage3 ``_on_robot_states`` 分开。""" - p = msg.tcp_pose.pose.position - xyz = (float(p.x), float(p.y), float(p.z)) - if not all(math.isfinite(v) for v in xyz): - return - self._tcp_world = xyz - self._t_tcp = time.monotonic() - - def _fresh_tcp_world(self): - """最近 0.5s 的厂家 TCP [m]。过期/没有 → None,不许用旧值凑。""" - if self._tcp_world is None or self._t_tcp is None: - return None - if time.monotonic() - float(self._t_tcp) > 0.5: - return None - return self._tcp_world - - def _on_wrench(self, msg: WrenchStamped) -> None: - """缓存腕部 FT 的**轴向力**(`geometry_msgs/WrenchStamped`,法兰系)。 - - ⚠️ 名字**必须**与 `Stage3Search._on_robot_states` 区分开。2026-09-24 踩到: - 两者原先都叫 `_on_ft`,子类定义静默覆盖父类的,于是本订阅的 WrenchStamped - 被塞进了 stage3 的 RobotStates 缓存,`_ft_fz` 永远不写 —— 现象是 - "S07 腕部 FT 没有数据",而话题数据完全正常(在 shell 里 echo 得到)。 - 真实原因与"阈值/话题名"都无关,纯粹是**同名覆盖**。""" - self._ft_fz = float(msg.wrench.force.z) - # 记收到时刻:下游(尤其 S07)要区分"收到过但读数为 0"(活)与 - # "一帧都没收到"(话题名/网络/传感器的问题)。 - self._t_ft = time.monotonic() - # —— "全零"守卫(2026-10-08 加):上面那个"收到过就算活"的口径有个盲区 —— - # 数据源没出数时,话题照样在发、回调照样在跑、读数恒为 (0,0,0),于是 - # `wrench_live` 报"活",而"abs(fz−基线)>2.5N 判接触"的兜底**永远不触发**。 - # 真机就踩到了(ft_sensor_wrench 恒零,external_wrench_in_tcp 才有数)。 - # 判据见 wrench_all_zero:带负载的 FT 不可能六个分量同时恰好为 0。 - w = msg.wrench - if wrench_all_zero( - w.force.x, w.force.y, w.force.z, w.torque.x, w.torque.y, w.torque.z - ): - if self._ft_zero_since is None: - self._ft_zero_since = self._t_ft - elif not self._ft_zero_warned and self._t_ft - self._ft_zero_since > 5.0: - self._ft_zero_warned = True - self.get_logger().error( - f"腕部 FT 话题 {self.ft_wrench_topic} 连续 >5s 六个分量**全为 0** —— " - "这不是'安静'(带负载的 FT 不可能全零),是**数据源没有出数**。" - "后果:轻降/下压的接触兜底 abs(fz−基线)>2.5N **永远判不到接触**" - "(静默失效)。真机请指向有数的话题,例如 " - "//external_wrench_in_tcp(site.yaml 的 servo.ft_wrench_topic)。" - ) - else: - self._ft_zero_since = None - - def _contact_detected(self, baseline_fz: float, thresh_n: float = 2.5) -> bool: - """腕部力 Z 偏离基线 thresh_n 牛以上 → 判为规尖碰工件(接触)。""" - if self._ft_fz is None: - return False - return abs(self._ft_fz - baseline_fz) > thresh_n - - def _spin(self, dt: float = 0.05) -> None: - try: - rclpy.spin_once(self, timeout_sec=dt) - except Exception as exc: # noqa: BLE001 - if type(exc).__name__ == "ExternalShutdownException": - return - raise - - def _shutdown_tf(self) -> None: - tfl = getattr(self, "_tfl", None) - self._tfl = None - if tfl is None: - return - try: - tfl.unregister() - except Exception: - pass - - def _state(self, s: str) -> None: - self.get_logger().info(f"[stage2] === {s} ===") - msg = String() - msg.data = s - self._state_pub.publish(msg) - - def _lookup(self, parent: str, child: str) -> Optional[np.ndarray]: - try: - tf = self._tf.lookup_transform( - parent, child, rclpy.time.Time(), - timeout=rclpy.duration.Duration(nanoseconds=80_000_000), - ) - except Exception: - return None - t = tf.transform.translation - o = tf.transform.rotation - T = np.eye(4) - T[:3, :3] = quat_xyzw_to_R([o.x, o.y, o.z, o.w]) - T[:3, 3] = [t.x, t.y, t.z] - return T - - def _q(self) -> Optional[np.ndarray]: - if self._js is None: - return None - m = {n: p for n, p in zip(self._js.name, self._js.position)} - try: - return np.array([float(m[n]) for n in self.joint_names], dtype=float) - except KeyError: - return None - - def _jacobian(self, p_ee: np.ndarray) -> Optional[np.ndarray]: - link_R: List[np.ndarray] = [] - link_p: List[np.ndarray] = [] - for fr in self.link_frames: - Tl = self._lookup(self.base_frame, fr) - if Tl is None: - return None - link_R.append(Tl[:3, :3]) - link_p.append(Tl[:3, 3]) - return geometric_jacobian(link_R, link_p, p_ee, RIZON_LINK_AXES) - - def _w_down(self, R: np.ndarray) -> Tuple[np.ndarray, float]: - """让法兰 +Z 指向世界 -Z。公式只在 ``path_profile.flange_down_w``。""" - from arm_application.path_profile import flange_down_w - - return flange_down_w(R) - - def _wait_state(self, timeout_s: float) -> Tuple[Optional[np.ndarray], Optional[np.ndarray]]: - t0 = time.monotonic() - q = Tee = None - while time.monotonic() - t0 < timeout_s: - self._spin(0.05) - q = self._q() - Tee = self._lookup(self.base_frame, self.ee_frame) - if q is not None and Tee is not None and self._jacobian(Tee[:3, 3]) is not None: - return q, Tee - return q, Tee - - def _send_action(self, traj: JointTrajectory, wait_s: float) -> bool: - traj = _sanitize_traj(traj) - goal = FollowJointTrajectory.Goal() - goal.trajectory = traj - handle = None - for attempt in range(3): - fut = self._cli.send_goal_async(goal) - t0 = time.monotonic() - while not fut.done() and time.monotonic() - t0 < 4.0: - self._spin(0.05) - handle = fut.result() if fut.done() else None - if handle is not None and bool(getattr(handle, "accepted", False)): - break - self.get_logger().warn( - f"JTC 未接受轨迹(attempt {attempt + 1}/3),0.25s 后重发" - ) - t_wait = time.monotonic() + 0.25 - while time.monotonic() < t_wait: - self._spin(0.05) - handle = None - if handle is None or not bool(getattr(handle, "accepted", False)): - self.get_logger().error("JTC 拒绝了轨迹(控制器未激活?先跑 T1 run_real.sh)") - return False - res = handle.get_result_async() - t0 = time.monotonic() - while not res.done() and time.monotonic() - t0 < wait_s: - self._spin(0.05) - if not res.done(): - self.get_logger().warn("JTC 结果超时——按 TF 继续核验") - return False - try: - r = res.result() - inner = getattr(r, "result", None) - code = getattr(inner, "error_code", 0) if inner is not None else 0 - if code not in (0, None): - msg = getattr(inner, "error_string", "") - self.get_logger().error(f"JTC 执行失败 error_code={code} {msg}") - return False - except Exception: - pass - return True - - def _clamp_ws(self, target: np.ndarray) -> np.ndarray: - lo = self.ws_min + 0.005 - hi = self.ws_max - 0.005 - clamped = np.clip(np.asarray(target, dtype=float).reshape(3), lo, hi) - self._ws_clipped = bool(not np.allclose(clamped, target, atol=1e-6)) - if self._ws_clipped: - self.get_logger().warn( - f"目标超出工作盒,已截断: ({target[0]:.3f},{target[1]:.3f},{target[2]:.3f}) → " - f"({clamped[0]:.3f},{clamped[1]:.3f},{clamped[2]:.3f})" - ) - return clamped - - def _plan_and_send( - self, - q0: np.ndarray, - Tee: np.ndarray, - target: np.ndarray, - verticalize: bool, - tag: str, - max_seg: float = FROZEN_J_HOP_MAX_M, - v: float = 0.05, - min_dur: float = 1.6, - ) -> bool: - """规划并执行一段 ≤max_seg 的笛卡尔 hop(J 冻结在当前位姿)。""" - p = Tee[:3, 3].copy() - R = Tee[:3, :3] - dp_full = np.asarray(target, dtype=float).reshape(3) - p - _, ang = self._w_down(R) if verticalize else (np.zeros(3), 0.0) - dp = dp_full.copy() - dist = float(np.linalg.norm(dp)) - if dist > max_seg: - dp = dp * (max_seg / dist) - dist = max_seg - self.get_logger().info( - f" plan {tag} Δ=({dp[0]*1000:+.0f},{dp[1]*1000:+.0f},{dp[2]*1000:+.0f})mm " - f"tilt={math.degrees(ang):.2f}deg" - ) - J = self._jacobian(p) - if J is None: - self.get_logger().error("缺 link TF,无法算雅可比") - return False - - q = q0.copy() - waypoints = [q.copy()] - remain = dp.copy() - w_step, _ = (self._w_down(R) if verticalize else (np.zeros(3), 0.0)) - # 入口倾角:**纯旋转 hop 的进度判据必须用它**(见下面 progressed 的说明) - ang0 = float(ang) - # 旋转-only hop 需要更多内部步数;角度模型按实际步长递减 - # 内层收敛下限随请求距离缩放:stage3 的微步只有 0.3~1mm, - # 固定 1.5mm 下限会让亚毫米微步第一步就退出(planned=0 → 规划停滞) - inner_tol = min(0.00012, max(0.00005, 0.05 * dist)) - n_max = int(np.ceil(dist / 0.008)) + 16 - for _ in range(n_max): - if float(np.linalg.norm(remain)) < inner_tol and ((not verticalize) or ang < 0.006): - break - nseg = max(1, int(np.ceil(float(np.linalg.norm(remain)) / 0.012))) - step = remain / nseg - if verticalize and ang > 0.008: - qdot = dls_twist(J, step / 0.12, w_base=w_step, damping=0.08, max_qdot=0.45) - dq = np.clip(qdot * 0.12, -0.06, 0.06) - else: - dq = dls_translate_hold_ori(J, step, damping=0.08, max_dq=0.06) - if float(np.max(np.abs(dq))) < 1e-5: - break - q = q + dq - waypoints.append(q.copy()) - remain = remain - (J[:3, :] @ dq) - ang = max(0.0, ang - float(np.linalg.norm(w_step)) * 0.12) - - planned = dist - float(np.linalg.norm(remain)) - min_frac = 0.75 if dist >= 0.0008 else 0.45 - # 进度判据分两种情形 —— 混用会**静默整段跳过**(2026-09-24 踩到): - # · 平移 hop(dist > 0):按"走完了请求距离的多少"(planned/dist)。 - # · **纯旋转 hop**(verticalize 且目标位置≈当前位置 ⇒ dist≈0): - # 必须按**倾角**判。此时 planned = 0 − |remain|,而绕腕旋转本来就会让 - # 法兰/TCP 漂移一点(实测 2.78mm)⇒ planned 变成负数 ⇒ 立刻判"规划停滞"、 - # 整段垂直化被跳过。现场症状:日志只说"规划停滞"(看起来像 IK 解不出来), - # 真相是 S05 带着 6.2° 倾角去压孔 —— 工具斜着顶在工件面上,重则撞件(E2)。 - if dist > 1e-6: - progressed = planned >= min_frac * dist - else: - progressed = (ang0 - float(ang)) >= min_frac * max(ang0, 1e-9) - if len(waypoints) < 2 or not progressed: - self.get_logger().warn( - f" {tag}: 规划停滞 (planned {planned*1000:.2f}/{dist*1000:.2f}mm, " - f"倾角 {math.degrees(ang0):.2f}→{math.degrees(float(ang)):.2f}deg) — 跳过" - ) - return False - if float(np.max(np.abs(waypoints[-1] - q0))) > 1.0: - self.get_logger().error(f" {tag}: 关节行程 >1 rad,拒绝执行") - return False - - if dist < 0.008: - # 纯旋转 hop 的 dist=0:用它算时间是 0.14s 的硬下限,对 6.2°(手腕要转 - # 0.11rad)来说太快 —— JTC 追不上速度上限就会欠到位,现象是"发了没动"。 - # 把倾角按 0.10m 力臂折算成等效弧长再交给微步的时间规划。 - equiv_m = max(dist, 0.10 * (ang0 - float(ang))) - return self._send_micro(waypoints, equiv_m, v, q0, tag) - - # 巡航速度保持 v,头尾平滑加减速。刹车距拉长、加速度下限放低—— - # 夹爪持规时急加速/急停会把规震脱,柔顺剖面(长刹车、低加速度)消除过冲和震动。 - v_cmd = max(min(float(v), 0.08), 1e-3) - d_brake = min(0.030, max(0.006, 0.32 * dist)) - a_cmd = max(v_cmd * v_cmd / (2.0 * d_brake), 0.030) - T_move, v_peak, t_acc, t_cruise, a_use = _trap_params(dist, v_cmd, a_cmd) - t0 = 0.06 - dt = 0.04 - zeros = np.zeros(7) - times = [0.0] - n_samp = max(8, int(math.ceil(T_move / dt))) - for k in range(1, n_samp + 1): - times.append(T_move * k / n_samp) - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - for t_local in times: - s, vs = _trap_sv(t_local, dist, v_peak, t_acc, t_cruise, a_use) - u = s / dist - qi, dq_du = _path_interp(waypoints, u) - qdot = dq_du * (vs / dist) if dist > 1e-9 else zeros - qdot = np.clip(qdot, -0.40, 0.40) - if t_local >= T_move - 1e-9: - qi = waypoints[-1] - qdot = zeros - traj.points.append(_pt(qi, qdot, t0 + t_local)) - t_hold = 0.12 + 0.40 * min(1.0, dist / 0.08) - if dist >= 0.03: - t_hold = max(t_hold, float(min_dur) - T_move) - t_hold = float(min(max(t_hold, 0.20), 1.2)) - q_end = waypoints[-1] - t_end = t0 + T_move - last_t = t_end - for frac in (0.40, 0.70, 1.00): - t = t_end + t_hold * frac - if t < last_t + 0.05: - t = last_t + 0.05 - traj.points.append(_pt(q_end, zeros, t)) - last_t = t - self.get_logger().info( - f" send {tag}: {len(traj.points)} pts T={T_move:.2f}s hold={t_hold:.2f}s " - f"v={v_peak*1000:.0f}mm/s brake={t_acc*1000:.0f}ms " - f"max|Δq|={float(np.max(np.abs(q_end - q0))):.5f}rad" - ) - return self._send_action(traj, wait_s=t0 + T_move + t_hold + 5.0) - - def _send_micro( - self, - waypoints: List[np.ndarray], - dist: float, - v: float, - q0: np.ndarray, - tag: str, - ) -> bool: - """亚厘米步进:3 点 + 短保持。12 点梯形在 1mm 上又慢又晃。""" - v_cmd = max(min(float(v), 0.04), 0.01) - T = max(0.14, dist / v_cmd) - t0 = 0.05 - zeros = np.zeros(7) - q_end = waypoints[-1] - q_mid, _ = _path_interp(waypoints, 0.5) - qdot = np.clip((q_end - waypoints[0]) / max(T, 1e-3), -0.35, 0.35) - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - t_hold = 0.16 - traj.points.append(_pt(waypoints[0], zeros, t0)) - traj.points.append(_pt(q_mid, qdot, t0 + 0.5 * T)) - traj.points.append(_pt(q_end, zeros, t0 + T)) - traj.points.append(_pt(q_end, zeros, t0 + T + t_hold)) - self.get_logger().info( - f" send {tag}: micro 4pts T={T:.2f}s hold={t_hold:.2f}s v={v_cmd*1000:.0f}mm/s " - f"max|Δq|={float(np.max(np.abs(q_end - q0))):.5f}rad" - ) - return self._send_action(traj, wait_s=t0 + T + t_hold + 2.5) - - def _goto( - self, - q: np.ndarray, - Tee: np.ndarray, - target: np.ndarray, - verticalize: bool, - tol_m: float, - tol_tilt: float, - tag: str, - v: float, - max_hops: int = 8, - settle_s: float = 0.25, - min_dur: float = 1.6, - hold_xy: bool = False, - strict_xy: bool = False, - z_up_only: bool = False, - ) -> Tuple[bool, np.ndarray, np.ndarray]: - """闭环点到点:规划短 hop → 执行 → 重新看 TF → 重复,直到容差内。 - - hold_xy=True:只收 Z/姿态(悬停降锁高),不把下降中漂出的 XY 再拽回去。 - z_up_only=True:当前已经高于目标 Z 就停,不许为了追 5 mm 往下补 - (贴面 MoveL 后收臂 hop1 抬过头、hop2 回压进孔,2026-10-16)。 - """ - target = self._clamp_ws(target) - last_dist: Optional[float] = None - last_ang: Optional[float] = None - stall = 0 - for hop in range(max_hops): - p = Tee[:3, 3] - z_tgt = float(target[2]) - if z_up_only: - if float(p[2]) >= z_tgt - float(tol_m): - return True, q, Tee - z_tgt = retract_goal_z(float(p[2]), z_tgt) - goal = np.array([p[0], p[1], z_tgt]) if hold_xy else np.array( - [target[0], target[1], z_tgt], dtype=float - ) - if hold_xy: - goal = self._clamp_ws(goal) - dp = goal - p - _, ang = self._w_down(Tee[:3, :3]) if verticalize else (np.zeros(3), 0.0) - dist = float(np.linalg.norm(dp)) - if dist < tol_m and ((not verticalize) or ang < tol_tilt): - return True, q, Tee - # 关节死区内反复 hop 不动:无进展且在放宽容差内 → 提前接受 - if last_dist is not None and last_ang is not None: - progress = (dist < last_dist * 0.8) or (ang < last_ang * 0.8) - stall = 0 if progress else stall + 1 - if stall >= 2: - lim = tol_m * 1.25 if strict_xy else tol_m * 2.5 - accept = dist < lim and ((not verticalize) or ang < tol_tilt * 1.5) - self.get_logger().warn( - f" {tag}: 连续 {stall} hop 无进展(remain={dist*1000:.1f}mm " - f"tilt={math.degrees(ang):.2f}deg)→ {'按容差接受' if accept else '放弃'}" - ) - return accept, q, Tee - last_dist, last_ang = dist, ang - self.get_logger().info( - f" {tag} hop{hop + 1} remain={dist*1000:.1f}mm tilt={math.degrees(ang):.2f}deg" - ) - if not self._plan_and_send(q, Tee, goal, verticalize, tag, v=v, min_dur=min_dur): - self.get_logger().warn(f" {tag}: hop 发送失败,复测后继续") - q2, Tee2 = self._wait_state(1.0) - if q2 is not None and Tee2 is not None: - q, Tee = q2, Tee2 - continue - t_end = time.monotonic() + settle_s - while time.monotonic() < t_end: - self._spin(0.05) - q2, Tee2 = self._wait_state(2.0) - if q2 is None or Tee2 is None: - self.get_logger().error("运动途中丢了 joint_states/TF") - return False, q, Tee - d_moved = float(np.max(np.abs(q2 - q))) - self.get_logger().info( - f" {tag} hop{hop + 1} 实际 max|Δq|={d_moved:.5f}rad " - f"Δxy=({(Tee2[0, 3] - Tee[0, 3]) * 1000:+.2f}," - f"{(Tee2[1, 3] - Tee[1, 3]) * 1000:+.2f})mm " - f"Δz={float((Tee2[2, 3] - Tee[2, 3]) * 1000):+.2f}mm" - ) - if d_moved < _NO_FOLLOW_EPS_RAD: - # 轨迹发出去了、控制器也报成功,臂却一步没动 —— 别往几何/对位上找。 - self.get_logger().error( - f" {tag} hop{hop + 1}:关节状态**毫无变化**(实测 max|Δq|={d_moved:.5f}rad," - f"指令计划见上一条 send 日志)—— 臂没有跟随指令。这**不是**倾角/悬停高度的问题," - "而是关节状态没在更新:RDK 断连后 operational() 仍为 true,read() 只会一直" - "返回最后一帧缓存,而控制器是本地插值、不校验反馈,所以照样报 success。" - "先查网络:ping 机器人 IP 是否丢包、两台臂是否同 MAC 抢 L2 转发。" - ) - q, Tee = q2, Tee2 - p = Tee[:3, 3] - goal = np.array([p[0], p[1], target[2]]) if hold_xy else target - dp = goal - p - _, ang = self._w_down(Tee[:3, :3]) if verticalize else (np.zeros(3), 0.0) - lim = tol_m * 1.3 if strict_xy else tol_m * 2.0 - ok = float(np.linalg.norm(dp)) < lim and ( - (not verticalize) or ang < (tol_tilt * (1.4 if strict_xy else 2.0)) - ) - return ok, q, Tee - - def _pin(self, q: np.ndarray) -> None: - if not self._cli.wait_for_server(timeout_sec=1.0): - return - traj = JointTrajectory() - traj.header.stamp.sec = 0 - traj.header.stamp.nanosec = 0 - traj.joint_names = list(self.joint_names) - traj.points = [_pt(q, np.zeros(7), 0.08), _pt(q, np.zeros(7), 0.45)] - self._send_action(traj, wait_s=3.0) - - # ==================== 拍照与解算 ==================== - - def _grab(self, timeout_s: float = 4.0) -> Tuple[np.ndarray, np.ndarray, Dict[str, float]]: - """抓一帧彩图 + 一帧对齐深度 + 内参(要新鲜帧,等待 settle 后再调)。""" - t0 = time.monotonic() - while time.monotonic() - t0 < timeout_s: - self._spin(0.05) - if self._color is None or self._depth is None or self._info is None: - continue - now = self.get_clock().now().nanoseconds * 1e-9 - c_age = now - self._color.header.stamp.sec - self._color.header.stamp.nanosec * 1e-9 - d_age = now - self._depth.header.stamp.sec - self._depth.header.stamp.nanosec * 1e-9 - if c_age < 1.0 and d_age < 1.0: - break - else: - raise RuntimeError( - f"相机帧超时:{self.image_topic} / {self.depth_topic}。" - " 先开相机: bash ~/ros2/scripts/run_camera_d405.sh --arm <本臂> --preview" - ) - if self._info is None: - raise RuntimeError(f"没有 camera_info: {self.info_topic}") - bgr = _bgr_copy(self._color) # type: ignore[arg-type] - dmsg = self._depth # type: ignore[assignment] - if (dmsg.encoding or "").lower() != "16uc1": - raise RuntimeError(f"深度编码应为 16UC1(mm),实际 {dmsg.encoding!r}") - depth_mm = np.frombuffer(dmsg.data, dtype=np.uint16).reshape(int(dmsg.height), int(dmsg.width)) - depth_m = depth_mm.astype(np.float32) * 1e-3 - if depth_m.shape[:2] != bgr.shape[:2]: - raise RuntimeError(f"深度/彩色尺寸不一致 {depth_m.shape} vs {bgr.shape}") - k = self._info.k # type: ignore[union-attr] - intr = {"fx": float(k[0]), "fy": float(k[4]), "cx": float(k[2]), "cy": float(k[5])} - if intr["fx"] <= 1.0: - raise RuntimeError("camera_info 内参无效") - return bgr, depth_m, intr - - def _surface_depth( - self, - depth_m: np.ndarray, - bbox: Tuple[int, int, int, int], - holes: Optional[List[Tuple[float, float, float]]] = None, - ) -> float: - """工作面深度:bbox 内有效像素中值;排除孔盘(孔底/桌面会拉偏 XY)。""" - h, w = depth_m.shape - x1, y1, x2, y2 = bbox - pad_x = int(0.10 * (x2 - x1)) - pad_y = int(0.10 * (y2 - y1)) - x1 = max(0, x1 + pad_x); x2 = min(w, x2 - pad_x) - y1 = max(0, y1 + pad_y); y2 = min(h, y2 - pad_y) - roi = depth_m[y1:y2, x1:x2] - mask = (roi > self.min_depth) & (roi < self.max_depth) - if holes: - yy, xx = np.mgrid[y1:y2, x1:x2] - for cx, cy, r in holes: - rr = max(4.0, 1.8 * float(r)) - mask &= ((xx - cx) ** 2 + (yy - cy) ** 2) > rr * rr - vals = roi[mask] - if vals.size < 50: - vals = roi[(roi > self.min_depth) & (roi < self.max_depth)] - if vals.size < 20: - raise RuntimeError("工作面有效深度太少(孔/桌面占比过大或距离超界)") - z = float(np.median(vals)) - if z > 2.0: - raise RuntimeError(f"深度中值 {z:.2f}m 异常——深度尺度不对(应为 16UC1 毫米)") - return z - - def _ring_depth( - self, - depth_m: np.ndarray, - cx: float, - cy: float, - r: float, - ) -> Optional[float]: - """孔周围环形工作面深度。倾斜相机下左右孔的 camera-Z 不同,不能共用一个中值。""" - h, w = depth_m.shape - rad = max(4.0, float(r)) - x0 = max(0, int(round(cx - 2.6 * rad))) - y0 = max(0, int(round(cy - 2.6 * rad))) - x1 = min(w, int(round(cx + 2.6 * rad))) - y1 = min(h, int(round(cy + 2.6 * rad))) - if x1 - x0 < 6 or y1 - y0 < 6: - return None - yy, xx = np.mgrid[y0:y1, x0:x1] - d2 = (xx.astype(float) - cx) ** 2 + (yy.astype(float) - cy) ** 2 - r1, r2 = (1.15 * rad) ** 2, (2.5 * rad) ** 2 - roi = depth_m[y0:y1, x0:x1] - mask = (d2 >= r1) & (d2 <= r2) & (roi > self.min_depth) & (roi < self.max_depth) - vals = roi[mask] - if vals.size < 20: - return None - z = float(np.percentile(vals, 50)) - if z > 2.0: - return None - return z - - def _px_to_cam(self, u: float, v: float, z: float, intr: Dict[str, float]) -> np.ndarray: - return np.array( - [(u - intr["cx"]) * z / intr["fx"], (v - intr["cy"]) * z / intr["fy"], z], - dtype=float, - ) - - def _cam_to_base(self, p_cam: np.ndarray) -> np.ndarray: - T = self._lookup(self.base_frame, self.cam_frame) - if T is None: - raise RuntimeError("TF 缺 base→camera(手眼静态 TF 没起来)") - p = np.ones(4) - p[:3] = p_cam - return (T @ p)[:3] - - def _project_holes( - self, - depth_m: np.ndarray, - pts: Any, - radii: Any, - bbox: Any, - intr: Dict[str, float], - ) -> Optional[Dict[str, Any]]: - """单帧:孔心像素 → 基座系 XYZ。 - - ``hole_visual_only`` 时射线交到已知工件面,不读深度图。 - 否则仍用环形深度(旧路径)。 - """ - if self.hole_visual_only: - return self._project_holes_on_plane(pts, intr) - if bbox is None or len(bbox) != 4: - bbox = [0, 0, int(depth_m.shape[1]), int(depth_m.shape[0])] - holes_px = [ - (float(pts[0][0]), float(pts[0][1]), float(radii[0])), - (float(pts[1][0]), float(pts[1][1]), float(radii[1])), - ] - try: - z_wp = self._surface_depth(depth_m, tuple(int(v) for v in bbox), holes=holes_px) - except Exception: - return None - # 两孔统一用工件表面深度 z_wp(中值,稳健)。 - # 不用每孔的环形深度:通止规逼近时环上会采到更近的规(~88mm vs 面 ~115mm), - # 孔的基座坐标就跟着臂飘、精对准追不动。 - # 法兰相对竖直大约 0.4°,但相机光轴相对法兰大约 30°。深度误差会进 XY: - # 2026-10-09 观测高度实测 dXY/dz ≈ 0.46 mm/mm。z_wp 必须是工件面, - # 不能是规。同一孔在悬停和观测高度上反投影,基座 XY 可以差约 2mm, - # 所以下降之后还要在当前高度再对一次(见 _trim_xy_after_descent)。 - z_left = z_right = z_wp - try: - left_b = self._cam_to_base(self._px_to_cam(pts[0][0], pts[0][1], z_left, intr)) - right_b = self._cam_to_base(self._px_to_cam(pts[1][0], pts[1][1], z_right, intr)) - except Exception: - return None - return { - "left_b": left_b, - "right_b": right_b, - "z_left": float(z_left), - "z_right": float(z_right), - "z_wp": float(z_wp), - } - - def _project_holes_on_plane(self, pts, intr: Dict[str, float]) -> Optional[Dict[str, Any]]: - """小孔关键点像素交到工件面上。深度图不参与。""" - if float(self.surface_z_m) <= 0.0: - self.get_logger().error( - "对孔不用深度图,但 workpiece_surface_z_m 没有配 —— 拒绝反投影" - ) - return None - T = self._lookup(self.base_frame, self.cam_frame) - if T is None: - self.get_logger().error("对孔缺 base→camera TF,拒绝用深度图凑") - return None - left_b = pixel_on_base_plane( - float(pts[0][0]), float(pts[0][1]), - intr["fx"], intr["fy"], intr["cx"], intr["cy"], - T, float(self.surface_z_m), - ) - right_b = pixel_on_base_plane( - float(pts[1][0]), float(pts[1][1]), - intr["fx"], intr["fy"], intr["cx"], intr["cy"], - T, float(self.surface_z_m), - ) - if left_b is None or right_b is None: - self.get_logger().error("孔心射线没交到工件面(相机朝向或工件面高度不对)") - return None - z = float(self.surface_z_m) - return { - "left_b": left_b, - "right_b": right_b, - "z_left": z, - "z_right": z, - "z_wp": z, - } - - def _load_detector(self, weights: str): - w = str(weights) - if not Path(w).is_file(): - raise RuntimeError(f"工件权重不存在: {w}") - from arm_application.pose_detector import is_pose_model - from arm_application.yolo_detector import YoloDetector, build_detector, resolve_weights - - conf = float(self._hole_cfg.get("conf", 0.25)) - iou = float(self._hole_cfg.get("iou", 0.7)) - imgsz = int(self._hole_cfg.get("imgsz", 640)) - if is_pose_model(w): - # pose 模型同时给工件框 + k1/k2 关键点。走自解码实现 —— - # ultralytics 解不了 pose 的 TensorRT engine(见 pose_detector 模块头), - # OnnxWorkpieceDetector 同样只认检测输出。 - det = build_detector( - resolve_weights(w, "auto"), - conf=conf, - iou=iou, - imgsz=imgsz, - ) - elif w.lower().endswith(".onnx"): - from arm_application.onnx_workpiece import OnnxWorkpieceDetector - - det = OnnxWorkpieceDetector( - w, - conf=conf, - imgsz=imgsz, - ) - else: - det = YoloDetector( - resolve_weights(w, "auto"), - device="cpu", - conf=conf, - iou=iou, - imgsz=imgsz, - ) - self.get_logger().info(f"工件检测器已加载: {w}") - return det - - def _det(self): - if self._detector is None: - self._detector = self._load_detector(str(self._weights)) - return self._detector - - def _det_fb(self): - w = str(self._weights_fb or "") - if not w or w == str(self._weights) or not Path(w).is_file(): - return None - if self._detector_fb is None: - self._detector_fb = self._load_detector(w) - return self._detector_fb - - def _iter_dets(self): - yield self._det() - fb = self._det_fb() - if fb is not None: - yield fb - - def _truth_enabled(self) -> bool: - """本节点该不该走"真值孔位"。 - - 只看 ``perception.source``(site.yaml 的 robots[].perception.source 也会 - 合进来):``truth`` = 仿真真值;``yolo``/``external`` = 老老实实跑检测器。 - 真机上永远是后者 —— 这条分支在真机不可达。 - """ - return str(getattr(self, "perception_source", "yolo")) == "truth" - - def _truth_hole_result(self, bgr: np.ndarray, depth_m=None, intr=None) -> Optional[dict]: - """真值孔位(像素 + ROI 框)。拿不到就返回 status=False 的结果并说明原因。 - - 为什么失败也**不**退回检测器:既然明确配了 ``perception.source=truth``, - 说明这台机器上"检测器给不出可信结果"(仿真里合成图过不了真机模型)。 - 退回检测器的后果是**用整幅画面当 ROI**,于是 HoughCircles 在夹爪/通规/ - 台面上找出一对"假孔"(实测间距 108mm,真值 58mm),再被门槛丢掉 —— - 现象是"每拍都丢、最后超时",比直接说"TF 没到"难查得多。 - - ⚠️ 几何用**实测**位姿(``sim_live_pose``)而不是 scene.yaml 的名义位姿: - 工件落地/蠕动后就偏 2~3mm,而规尖(φ6)进 φ7 的孔只有 0.5mm 余量 —— - 按名义位姿算的孔位会把这一整条链指偏两毫米(现象是"S07 压到工件面、 - 孔却没进去",看起来像柔顺参数不对)。真机上的视觉量的也是"实际在哪"。 - """ - try: - from arm_sim_gazebo import sim_live_pose, sim_scene, truth_holes - except ImportError: - # 真机上没有仿真包,perception.source 也不会是 truth —— 到这里只可能是 - # 有人把 source 配成 truth 却没装仿真包,直接报清楚。 - return None - T = self._lookup(self.cam_frame, str(self.get_parameter("world_frame").value or "world")) - if intr is None and self._info is not None: - k = self._info.k - intr = {"fx": float(k[0]), "fy": float(k[4]), "cx": float(k[2]), "cy": float(k[5])} - i3 = None - if intr is not None: - i3 = (intr.get("fx"), intr.get("fy"), intr.get("cx"), intr.get("cy")) - spec = self._truth_scene(sim_scene) - live = self._truth_live_pose(spec, sim_live_pose) - if live is not None: - spec = live.apply(spec, [str(self._truth_object or spec.operating.part_object)]) - res = truth_holes.locate_holes( - T, i3, (int(bgr.shape[0]), int(bgr.shape[1])), - spec=spec, object_name=self._truth_object, root=None, - ) - if not res.ok: - now = time.monotonic() - if now - self._truth_warn_t > 5.0: - self._truth_warn_t = now - self.get_logger().warn(f"真值孔位不可用:{res.why}") - return { - "status": False, - "msg": f"真值孔位不可用:{res.why}", - "hole_points": [], - "hole_radii": [], - "bbox": None, - "draw_img": truth_holes.draw(bgr, res), - } - # 真值三维 → 基座系(TF 查不到时返回空列表,调用方会退回深度反投影) - base = self._truth_to_base(res.hole_world) - center = self._truth_to_base([res.part_center_world] if res.part_center_world else []) - return { - "status": True, - "msg": f"真值孔位({res.note})", - "hole_points": [[float(p[0]), float(p[1])] for p in res.hole_points], - "hole_radii": [float(r) for r in res.hole_radii], - # ---- 真值的三维:**直接给**,不让调用方再去反投影 -------------- - # 为什么必须这样(2026-09-24 的教训,详见 truth_holes.HoleTruth): - # 孔是贯通孔,孔位正下方是台面通槽,深度相机在孔位看到的是槽底/地面 - # (0.62m)而不是工件面(0.21m)。用深度图反投影会把 58mm 的孔距 - # 算成 169mm、被间距门槛丢掉 —— 现象像"检测坏了",其实真值本来就知道。 - "hole_base": base, - "hole_z": [float(v[2]) for v in base] if base else [0.0, 0.0], - # 工件上表面的世界 z 与基准面:S07 的悬停几何要用它判断 - # "悬停时规尖到底入没入工件",缺了它那项自检只能按 0 算(会误报)。 - "z_wp": float(res.part_top_z or 0.0), - "part_center_base": center, - "bbox": [int(v) for v in res.bbox], - "label": "workpiece(truth)", - "draw_img": truth_holes.draw(bgr, res), - } - - def _truth_scene(self, sim_scene): - """真值路径的场景配置(读一次,缓存)。 - - 为什么缓存:S05 会连着算很多拍,而 scene.yaml 是**静态配置** - (物体位姿那种会变的东西走 ``sim_live_pose``,不从这里读)。 - """ - if self._truth_spec is None: - self._truth_spec = sim_scene.load_scene(None, None) - return self._truth_spec - - def _truth_live_pose(self, spec, sim_live_pose): - """真值路径的"实测位姿"订阅(懒建一次)。没配 pose_info 就返回 None。 - - 为什么这里也要(不只是真值感知节点):二阶段的**孔位**是这条链上 - 精度要求最高的一处(规尖 φ6 进 φ7 的孔),而它和真值感知共用同一份 - "物体现在在哪"的实现(``sim_live_pose``,R5.8)。 - """ - if self._truth_live is None: - pi = getattr(spec, "pose_info", None) - topic = str(getattr(pi, "ros_topic", "") or "") - self._truth_live = sim_live_pose.LiveScenePose(self, topic) if topic else False - if self._truth_live: - self.get_logger().info( - f"真值孔位按**实测**位姿算(订阅 {topic})—— " - f"按名义位姿算会偏 2~3mm,而规尖进孔只有 0.5mm 余量。" - ) - return self._truth_live or None - - def _truth_to_base(self, pts_world: Any) -> list: - """世界系点列 → 基座系点列(TF 查不到时返回空列表,调用方会退回深度反投影)。 - - 为什么不在 truth_holes 里做:那里是**纯几何**模块(没有 ROS、因此能脱机测), - 变换必须由持有 TF 的节点来查。这条分工是刻意的。 - """ - p = [list(map(float, v)) for v in (pts_world or [])] - if not p: - return [] - T = self._lookup(self.base_frame, str(self.get_parameter("world_frame").value or "world")) - if T is None: - self.get_logger().warn( - "查不到 TF 基座→世界 —— 真值三维用不了,本拍退回深度反投影" - "(仿真里那一步会因孔下方是通槽而算错孔距)。" - ) - return [] - out = [] - for v in p: - q = np.ones(4) - q[:3] = v[:3] - out.append([float(x) for x in (T @ q)[:3]]) - return out - - def _detect_holes_img(self, bgr: np.ndarray, *, skip_center_gate: bool, - depth_m: np.ndarray = None, intr: dict = None) -> dict: - """跑一次孔检测。第二次调用(``skip_center_gate=True``)允许整幅画面当 ROI。 - - 为什么第二次要放宽到整幅:走到那一步时调用方的处境是"**没找到工件框**, - 但可能已经看得见孔了"。不放宽的话会停在"未检测到工件"上 —— 而这恰恰是 - "模型没出框、孔明明在画面里"的情形(换相机/换画面域、或模型漏检时会出现)。 - 放宽不等于乱认:环半径区间、两孔间距、居中门控这些判据都还在。 - """ - if self._truth_enabled(): - res = self._truth_hole_result(bgr, depth_m=depth_m, intr=intr) - if res is not None: - return res - last = {} - for det in self._iter_dets(): - res = detect_holes( - bgr, det, config=self._hole_cfg, skip_center_gate=skip_center_gate, - depth_m=depth_m, intr=intr, - ) - last = res - if res.get("status"): - return res - if (not res.get("status")) and res.get("gate_block") and not skip_center_gate: - res = detect_holes( - bgr, det, config=self._hole_cfg, skip_center_gate=True, - depth_m=depth_m, intr=intr, allow_full_frame_roi=True, - ) - last = res - if res.get("status"): - return res - elif (not res.get("status")) and skip_center_gate: - res = detect_holes( - bgr, det, config=self._hole_cfg, skip_center_gate=True, - depth_m=depth_m, intr=intr, allow_full_frame_roi=True, - ) - last = res - if res.get("status"): - return res - return last - - def _best_bbox(self, bgr: np.ndarray, conf: Optional[float] = None) -> Optional[Tuple[int, int, int, int]]: - if self._truth_enabled(): - # 真值模式:工件框由场景几何投出来。**必须走这条路**,不能落到检测器上: - # 检测器在仿真里出不了框,S05 的"粗居中"就会拿整幅画面当工件, - # 于是把"画面中心 ≠ 工件中心"算成 58.8mm 偏差,白白横移。 - res = self._truth_hole_result(bgr) - if res is not None and res.get("status") and res.get("bbox"): - return tuple(int(v) for v in res["bbox"]) # type: ignore[return-value] - return None - thr = float(conf if conf is not None else min(0.12, float(self._hole_cfg.get("conf", 0.25)))) - min_area = 4000.0 - best = None - best_area = -1.0 - for det in self._iter_dets(): - dets = det.detect( - bgr, - conf=thr, - iou=float(self._hole_cfg.get("iou", 0.7)), - imgsz=int(self._hole_cfg.get("imgsz", 640)), - ) - for d in dets: - area = float(getattr(d, "area", 0.0) or 0.0) - if area < min_area: - continue - if area > best_area: - best, best_area = d, area - if best is None: - return None - bbox = tuple(int(v) for v in best.xyxy) # type: ignore[assignment] - h, w = bgr.shape[:2] - if self._bbox_on_border(bbox, w, h): - return None - return bbox # type: ignore[return-value] - - def _bbox_on_border( - self, bbox: Any, w: int, h: int, margin_px: Optional[int] = None - ) -> bool: - """框是否被画面边缘切到(= 只看到工件的一部分,不是整个工件)。 - - 为什么这种框一个都不能用(2026-10-08 真机 arm 89 实测) - -------------------------------------------------------- - 粗居中要的是**框中心落在工件的哪个位置**,再对那个点做深度反投影。 - 框被边缘切掉时,框中心根本不在工件上 —— 真机那一帧:: - - snap_coarse_0: 工件 bbox=(0, 142, 97, 222) 中心=(48,182) - base=(0.280,-0.747)[深度] 偏差=211.5mm - - ``x0=0`` 就是左边缘切的。反投影出来的 (0.280,-0.747) 落在工作盒外 - 197mm,而下一步**没有判误检,而是"截断到盒边"照样横移** 56mm, - 把臂带离工件 ⇒ 精定位再也看不到 k1/k2 ⇒ ``exit=4``。 - - 同一个判据顺手挡掉另一种退化输入:YOLO 空框时兜底用的"孔检测器 bbox" - 在真机那帧是 ``[0, 0, 847, 479]``(整幅画面,四边全贴边)。 - """ - if margin_px is None: - margin_px = int(getattr(self, "coarse_border_px", 2)) - if bbox is None or len(bbox) < 4 or w <= 0 or h <= 0: - return True - x0, y0, x1, y1 = (float(v) for v in bbox[:4]) - m = float(margin_px) - return x0 <= m or y0 <= m or x1 >= (w - 1) - m or y1 >= (h - 1) - m - - def _coarse_target_reject( - self, - p_base: np.ndarray, - gxy: np.ndarray, - max_offset_m: Optional[float] = None, - ) -> Optional[str]: - """粗居中的目标点是不是**误检**。返回 None = 可信;否则返回拒绝原因。 - - 为什么必须能在**移动前**否掉(2026-10-08 真机 arm 89,exit=4) - -------------------------------------------------------------- - 真机那一帧:: - - snap_coarse_0: base=(0.280,-0.747)[深度] 偏差=211.5mm - 目标超出工作盒,已截断: (0.280,-0.747,0.320) → (0.280,-0.545,0.320) - coarse Δ=(-56,-2,-0)mm ← 臂被带离工件 56mm - snap_fine_*: 两孔基座间距 210.0/213.2/212.2mm 不像 k1/k2,丢弃本拍 - 二阶段失败 exit=4 - - 工件其实在 (0.5,-0.12) 一带 —— 也就是说这个"截断"不是安全兜底, - 而是**把一次误检变成了对机械臂的一条真实横移指令**:越界只是被夹到盒边, - 臂照样走出去。这就是规矩里禁的"宽容降级":把"没检查"伪装成"检查通过"。 - - 两条判据(都是"盒外/离谱 ⇒ 判误检",不是"夹到盒边继续"): - - 1. 目标点落在 ``workspace_xyz_*`` 的 XY 之外(含 5mm 余量)—— 一阶段刚锁 - 定时臂就在工件上方,工件**不该**在盒外; - 2. 目标点离当前夹爪轴线超过 ``coarse_max_offset_m``(缺省 0.08m)—— 粗居中 - 是"把臂挪到工件正上方",合理位移是厘米级;十几厘米只可能是坏读数 - (2026-10-16 三次 110mm 回撤,0.12 放行了)。 - - 注意:判误检后**原地不动**,由精定位(直接量 k1/k2)继续。不动的代价只是 - "少挪一次",而挪错的代价是精定位彻底看不到孔 —— 所以这里必须选不动。 - """ - if max_offset_m is None: - max_offset_m = float(getattr(self, "coarse_max_offset_m", 0.08)) - p = np.asarray(p_base, dtype=float).reshape(3) - if not np.all(np.isfinite(p[:2])): - return "目标点非有限值(深度/三角化失败)" - lo = np.asarray(getattr(self, "ws_min", None), dtype=float).reshape(-1) - hi = np.asarray(getattr(self, "ws_max", None), dtype=float).reshape(-1) - if lo.size >= 2 and hi.size >= 2: - margin = 0.005 - for i, name in ((0, "x"), (1, "y")): - if p[i] < lo[i] - margin or p[i] > hi[i] + margin: - return ( - f"目标 {name}={p[i]:.3f} 在工作盒 [{lo[i]:.3f},{hi[i]:.3f}] 外 " - f"⇒ 反投影/检测坏了" - ) - g = np.asarray(gxy, dtype=float).reshape(-1) - if g.size >= 2: - d = float(np.hypot(p[0] - g[0], p[1] - g[1])) - if d > max_offset_m: - return ( - f"目标离夹爪轴线 {d*1000:.1f}mm > 上限 {max_offset_m*1000:.0f}mm " - f"⇒ 不像'臂已在工件上方'的粗居中量" - ) - return None - - def _gauge_xy(self, Tee: np.ndarray) -> np.ndarray: - """夹爪/通止规轴线(法兰原点 + hover_offset)在基座系 XY。 - - 退路用(视觉规尖不可用时)。注意它假设"规和法兰同轴"——2026-10-08 真机实测 - 该假设不成立(规偏出 ~10mm),所以**不是**首选,见 _tip_offset_from_depth。 - """ - p = Tee[:3, 3] - R = Tee[:3, :3] - off = R @ np.array([self.hover_offset[0], self.hover_offset[1], 0.0]) - return np.array([p[0] + off[0], p[1] + off[1]]) - - def _tip_offset_from_depth( - self, - depth_m: np.ndarray, - intr: Dict[str, float], - Tee: np.ndarray, - z_wp_cam: Optional[float] = None, - ) -> Tuple[Optional[np.ndarray], Optional[float], str]: - """从一帧深度里找**规尖**,返回 (规尖相对法兰的基座 XY 偏移, 工具长, 说明)。 - - 找不到/不可信时返回 (None, None, 原因)。判据(每条都能真的失败): - 1. 只看法兰轴线附近的**中央竖带**——规就夹在爪里,不会跑到画面边上; - 2. 多个连通域里取画面**更靠下**(v 更大)的那一个,不按面积、也不按 - 「最接近配置工具长」——按面积会选爪子;贴配置长会选法兰轴上的假深点 - (2026-10-09 真机工具长 225mm、偏移约 0,残差 0.14mm 但孔偏了); - 3. 有同一帧工件面深度时,只留**比工件面至少近 8mm** 的像素。相机前倾 - ~30°,规尖沿光轴只比面近十来毫米(2026-10-09 观测高度:面 127mm、 - 尖 115mm)。再往前砍 15mm 会把尖切掉,只剩更近的夹爪/杆身(~80mm), - 反投影偏移 ~2mm,残差 0.2mm 看着达标,针却偏在孔沿上。 - 没给工件面深度时,退回固定近端(默认 150mm); - 4. 反投出的"法兰 z − 规尖 z"必须落在 [tip_len_min, tip_len_max], - 并且基座 z 要比工件面高出一截 —— 挡住"深度读到台面/工件"。 - - ⚠️ 工具长这一项**只在单帧内**可信;实测它会跳(192~223mm)——规尖细、反光, - 掠射角下深度容易丢,丢了以后"最深有效像素"就往上跑、工具长只会**变短**。 - XY 偏移对这件事不敏感(杆细且接近竖直),见 _refresh_tip_offset。 - """ - import cv2 - - h, w = depth_m.shape - # 8mm:3mm 挡不住深度噪声(工件漏进来,工具长测成 296–315mm); - # 15mm 又把真规尖切掉(面 127mm、尖 115mm,只剩夹爪)。两条都在真机上红过。 - wp_gap = 0.008 - # z_wp 只在像相机深度时才当上限(真机孔 ~0.13–0.18m)。基座 z~0.03 会把近端切空。 - _z_wp = float(z_wp_cam) if z_wp_cam is not None else 0.0 - if 0.08 <= _z_wp <= 0.45: - ceiling = min(_z_wp - wp_gap, self.tip_max_m) - ceil_s = f"比工件面{_z_wp*1000:.0f}近{wp_gap*1000:.0f}" - else: - ceiling = self.tip_near_m - ceil_s = f"固定近端{self.tip_near_m*1000:.0f}" - valid = (depth_m > self.tip_min_m) & (depth_m < self.tip_max_m) - near = (valid & (depth_m < ceiling)).astype(np.uint8) - band = np.zeros_like(near) - half = max(1, int(self.tip_band_frac * w)) - c0, c1 = int(intr["cx"]) - half, int(intr["cx"]) + half - band[:, max(0, c0):min(w, c1)] = 1 - near = near & band - if int(near.sum()) < self.tip_min_px: - return None, None, ( - f"近端(<{ceiling*1000:.0f}mm,{ceil_s})中央竖带内像素 " - f"{int(near.sum())} < {self.tip_min_px}" - ) - n, lab, stats, _ = cv2.connectedComponentsWithStats(near, 8) - if n <= 1: - return None, None, "近端无连通域(规不见了吗)" - - # 掩膜已经丢掉贴着工件面的像素。基座 z 再挡一层:反投影落在面上的 - # 仍不是规尖。裕量 8mm 而不是 20mm——观测高度规尖离面只有约 15mm, - # 20mm 会把真尖一起丢掉(2026-10-09)。悬停时尖离面约 75mm,8mm 仍够。 - surf = float(getattr(self, "surface_z_m", 0.0) or 0.0) - above_surface_m = 0.008 - cands = [] - stuck = 0 - for i in range(1, n): - if int(stats[i, 4]) < self.tip_min_px: - continue - ys, xs = np.where(lab == i) - dv = depth_m[ys, xs] - k = float(np.percentile(dv, 97)) - sel = dv >= k - 1e-6 - u = float(np.median(xs[sel])) - v = float(np.median(ys[sel])) - # 用连通域自己的近端深度,不用周围 5×5:规尖只有几像素宽, - # 邻域中值会落到工件面上,尖又被当成面丢掉。 - z_tip = float(np.median(dv[sel])) - try: - p_tip = self._cam_to_base(self._px_to_cam(u, v, z_tip, intr)) - except Exception as exc: # noqa: BLE001 - return None, None, f"规尖反投影失败(手眼 TF 缺?): {exc}" - tool_len = float(Tee[2, 3]) - float(p_tip[2]) - if not (self.tip_len_min <= tool_len <= self.tip_len_max): - continue - if surf > 0.0 and float(p_tip[2]) < surf + above_surface_m: - stuck += 1 - continue - off = np.array( - [float(p_tip[0]) - float(Tee[0, 3]), float(p_tip[1]) - float(Tee[1, 3])] - ) - cands.append((off, tool_len, u, v)) - if not cands: - if stuck: - return None, None, ( - f"近端点贴着工件面(高出不足 {above_surface_m*1000:.0f}mm),不是规尖" - ) - return None, None, ( - f"反投影出的工具长不在 " - f"[{self.tip_len_min*1000:.0f},{self.tip_len_max*1000:.0f}]mm —— " - f"近端那个物体不是规" - ) - # v 优先:画面更靠下的才是伸向工件的那一端。工具长只作同分时的次序, - # 不拿去贴近 site.yaml —— 贴配置长会把法兰轴上的点当成规尖。 - off, tool_len, u, v = max(cands, key=lambda c: (c[3], c[1])) - return off, tool_len, f"px=({u:.0f},{v:.0f}) 工具长 {tool_len*1000:.0f}mm {ceil_s}" - - def _refresh_tip_offset(self) -> None: - """攒够**一致**样本后,定下并**冻结**「规尖相对法兰」的偏移。 - - 判据只有一条:取中位数剔掉外点后,还要剩 ``tip_calib_n`` 个样本落在 - ``tip_offset_tol_m`` 内。**不再要求"工具长分簇"** —— 实测那样太严: - 规尖像素时有时无,工具长在 203/222mm 之间跳,"工具长最长那一簇"往往只有 - 1~2 拍,永远凑不满 4 拍 ⇒ 永远冻不住 ⇒ 退回"法兰+偏置"(那就白改了)。 - 而"规杆细且接近竖直"⇒ 杆上任一像素反投回基座 XY 都在杆轴 ~3mm 内, - 所以**工具长差不影响偏移**,一致性校验就够。 - 工具长只用来跟 site.yaml 交叉核对(见下面的告警),不参与对准。 - - 为什么必须冻结:偏移是刚体量;逐拍重算会把"规杆略有倾斜"引入的 ±0.2~0.4mm - 抖动带进残差(2026-10-08 真机残差 0.44~0.85mm 来回荡、收不进 0.25mm)。 - """ - if self._tip_off is not None or len(self._tip_samp) < self.tip_calib_n: - return - arr = np.stack([o for o, _t in self._tip_samp]) - med = np.median(arr, axis=0) - inl = np.linalg.norm(arr - med, axis=1) <= self.tip_off_tol - if int(inl.sum()) < self.tip_calib_n: - self.get_logger().warn( - f" 规尖样本 {len(self._tip_samp)} 拍、一致的只有 {int(inl.sum())}/" - f"{self.tip_calib_n}(tol={self.tip_off_tol*1000:.0f}mm)—— 还冻不住,继续采" - ) - return - idx = np.where(inl)[0] - self._tip_off = arr[idx].mean(0) - tl = np.array([self._tip_samp[i][1] for i in idx], dtype=float) - self._tip_len_m = float(np.median(tl)) - cfg = float(self.tool_tip_below_flange_m or 0.0) - agree = "" if cfg <= 0 else ( - ",与 site.yaml 的工具长一致" - if abs(self._tip_len_m - cfg) <= 0.003 - else f" ⚠️ 与 site.yaml 的工具长 {cfg*1000:.0f}mm 差 " - f"{(self._tip_len_m-cfg)*1000:+.0f}mm —— 夹持变动?" - "下降量按 site 的几何走,这时要人工核对(别让规撞进孔)" - ) - self.get_logger().info( - f" 规尖偏移已冻结 = ({self._tip_off[0]*1000:+.1f},{self._tip_off[1]*1000:+.1f})mm" - f"({int(inl.sum())} 拍一致,最大散布 " - f"{float(np.max(np.linalg.norm(arr[idx]-self._tip_off, axis=1)))*1000:.2f}mm," - f"工具长 {self._tip_len_m*1000:.0f}mm{agree})" - " —— 刚体量,对准期间只量这一份" - ) - - def _grab_median_depth(self, n: int) -> Optional[np.ndarray]: - """拍 n 帧深度取时间中值(稳)。""" - deps = [] - for _ in range(max(3, n)): - _, d, _ = self._grab() - if d is not None: - deps.append(np.asarray(d, dtype=np.float32)) - time.sleep(0.025) - if len(deps) < 3: - return None - return np.median(np.stack(deps), axis=0).astype(np.float32) - - def _measure_gauge_state(self): - """悬停时测一次:通止规尖深度 tip_d(恒定,规固定在臂上)、规杆掩码 rod_mask、 - 局部工件面深度 z_wp(规尖周围)。返回 (tip_d, rod_mask, z_wp),相机系米。 - - 金属规杆反光、尖端深度会失效,所以用「杆顶最近深度+固定跨度」阈值分离规杆和工件, - 规尖取杆深度的 97 分位(杆最接近工件的一端);工件面取规杆周围环形的局部中值。""" - import cv2 - depth = self._grab_median_depth(10) - if depth is None: - return None, None, None - h, w = depth.shape - valid = (depth > 0.05) & (depth < 0.30) - if int(valid.sum()) < 200: - return None, None, None - rod_top = float(np.percentile(depth[valid], 2)) # 规杆顶=全图最近 2% - # 规杆掩码:深度 < 杆顶+42mm(规杆深度跨度~40mm),限在中央竖带(规在画面中央) - band = np.zeros_like(valid) - band[:, int(w * 0.40):int(w * 0.62)] = True - thr = rod_top + 0.042 - rod = valid & band & (depth < thr) - if int(rod.sum()) < 200: - return None, None, None - ys, xs = np.where(rod) - tip_d = float(np.percentile(depth[ys, xs], 97)) # 规尖=杆最深处 - z_wp = self._local_wp_depth(depth, rod) # 局部工件面(与下降闭环同一方法) - return tip_d, rod, z_wp - - @staticmethod - def _local_wp_depth(depth: np.ndarray, rod_mask: np.ndarray) -> Optional[float]: - """规杆周围环形(19~61px)的工件面深度中值。规杆图像位置恒定(固定在臂上), - 纯 Z 下降时环形处的工件面深度即 z_wp,随下降 1:1 减小。""" - import cv2 - valid = (depth > 0.05) & (depth < 0.30) - rod_out = cv2.dilate(rod_mask.astype(np.uint8), np.ones((61, 61), np.uint8)).astype(bool) - rod_in = cv2.dilate(rod_mask.astype(np.uint8), np.ones((19, 19), np.uint8)).astype(bool) - ring = rod_out & ~rod_in & valid - if int(ring.sum()) < 30: - return None - return float(np.median(depth[ring])) - - def _descend_above_hole(self, q, Tee, *, target_gap_m=None, step_m=None): - """对准后柔顺轻降,把规尖悬在孔面上方 final_gap_m(不接触)。 - - **下降量只由几何决定**(这条是 2026-10-08 真机修出来的):: - - 规尖到工件面的间隙 = 法兰 Z(正运动学) − 工具长 − 工件面 Z - 需下降 = 该间隙 − final_gap - - 三个量都是确定的:法兰 Z 来自 FK(0.1mm 量级),工具长是标定值,工件面 Z - 是现场实测值(``gauge_assembly.workpiece_surface_z_m``)。 - - ⚠️ 为什么**不再**让深度测量决定下降量(或叫停)—— - 2026-09-29:``z_wp``("规杆外环形"深度中值)报 141mm,几何真值 53mm, - 于是多降 86mm 把规撞进工件(工件被推走 5mm)。 - 2026-10-08:同一个读数又反着错 —— 悬停时报 144mm(几何真值 75mm), - 只降 24mm 后又翻成 **−7mm**,触发 ``SAFE_FLOOR`` 把轻降停在离面 ~50mm 处, - 永远到不了 2mm。同一套读数在两个方向上各错一次、幅度 150mm 量级、还随位姿 - 乱跳 —— 它对"能降多少"和"该不该停"都没有发言权。 - - 所以现在深度读数**只做交叉核对**:与几何对不上就喊出来(把"测距方法待修" - 摆在日志里),但不再参与任何决策。真正的安全由三条**物理/几何**机制保证: - - 1. 几何预算上限 ``descent_budget_m``(与 ``gauge_fsm.hover_z_guard`` 同源)—— - FK/配置异常时也压不下去; - 2. 腕部 FT 接触检测:``force.z`` 相对悬空基线突变 ⇒ 立即停 + 回退 1mm; - 3. 任一步 ``_goto`` 没走到位(多半是碰到东西/被挡)⇒ 停止,保持当前高度。 - """ - # final_descent_enable:多走多拍降到贴面 final_gap(约 2mm)。 - # 关掉时(--no-descent)仍做**观测下降**,停在 observe_gap(约 15mm)。 - # 单次精拍补交路径传入观察高;锁 XY 实验传入贴面 final_gap。 - if target_gap_m is None: - target_gap = ( - self.final_gap_m if self.final_descent_enable else self.observe_gap_m - ) - else: - target_gap = float(target_gap_m) - step_cap = 0.004 if step_m is None else float(step_m) - kind = ( - "贴面轻降" - if target_gap <= float(self.final_gap_m) + 1e-6 - else "观测下降" - ) - self._state("descend_above_hole") - tip_len = float(self.tool_tip_below_flange_m) - surf = float(self.surface_z_m) - if tip_len <= 0.0 or surf <= 0.0 or self.descent_budget_m is None: - # 缺几何就没法算安全下降量 —— 停在悬停高,**绝不**拿测距去赌 - # (2026-09-29 撞工件就是"没有几何、只有测距"时发生的)。配置缺键 - # 必须当失败处理(R1.1),不能静默降级成"按测量降"。 - self.get_logger().error( - "轻降缺少几何:tool_tip_below_flange_m / workpiece_surface_z_m / " - "descent_budget 至少一个没配 —— 停在悬停高,不下降。" - "请补 site.yaml 的 robots[].gauge_assembly 两把尺子。" - ) - return False, q, Tee - - gap0 = float(Tee[2, 3]) - tip_len - surf # 几何间隙(唯一决定下降量的量) - descent = gap0 - target_gap - if descent > self.descent_budget_m + 5e-4: - self.get_logger().warn( - f"轻降超过配置几何预算:按 FK 算需降 {descent * 1000:.1f}mm > " - f"预算 {self.descent_budget_m * 1000:.1f}mm" - f"(当前法兰 {Tee[2, 3]:.4f} 与配置悬停 {self.hover_z:.4f} 不符)" - "—— 收到预算(宁高勿撞)" - ) - descent = self.descent_budget_m - - # ---- 深度读数只做交叉核对(无权叫停、无权加码)---- - tip_d, _rod_mask, z_wp = self._measure_gauge_state() - if tip_d is not None and z_wp is not None: - gap_meas = float(z_wp) - float(tip_d) - if abs(gap_meas - gap0) > 0.010: - self.get_logger().warn( - f"深度测距与几何不符:测量间隙 {gap_meas * 1000:.1f}mm vs " - f"几何 {gap0 * 1000:.1f}mm(差 {(gap_meas - gap0) * 1000:+.1f}mm)" - "—— 本次**按几何下降**,深度读数不参与决策" - "(测距方法待修,见 site.yaml 的 final_descent_enable 注释)" - ) - else: - self.get_logger().warn( - "未测到通止规/工件(规可能不在视野)—— 深度核对跳过,仍按几何下降" - "(下降量不依赖规是否可见)" - ) - - self.get_logger().info( - f"{kind}准备: 几何间隙 {gap0 * 1000:.1f}mm → 目标 {target_gap * 1000:.1f}mm," - f"需下降 {descent * 1000:.1f}mm(法兰 {Tee[2, 3]:.4f} − 工具长 {tip_len * 1000:.0f}mm" - f" − 工件面 {surf:.4f};很慢,XY 保持)" - ) - if descent <= 0.001: - self.get_logger().info("规尖已在目标间隙附近,无需下降") - self.descent_final_gap_m = gap0 - return True, q, Tee - # 腕部力基线(规尖悬空时的 force.z),用于接触检测兜底 - base_fz = self._ft_fz - if base_fz is None: - self.get_logger().warn( - "轻降开始前还没收到腕部 FT —— 接触兜底不生效(只剩几何预算与 _goto 两道)" - ) - # 步数上限:预算 ≤~80mm、单步 ≤4mm ⇒ 20 步足够;给 60 步余量,真正收工靠 - # 几何预算(下面的 remaining),不靠步数。 - for step_i in range(60): - if not rclpy.ok(): - return False, q, Tee - # 每步把 FT 轴向力打进日志:这是"停住到底是碰到了还是没跟上"的**唯一** - # 直接证据(2026-10-08 排查轻降在离面 ~4mm 处停住时,就靠这一行区分 - # "接触"与"驱动没跟上"——没有它只能靠猜)。 - if self._ft_fz is None: - ft_txt = "FT_fz=None" - elif base_fz is None: - ft_txt = f"FT_fz={self._ft_fz:+.2f}N(无基线)" - else: - ft_txt = ( - f"FT_fz={self._ft_fz:+.2f}N(基线 {base_fz:+.2f}," - f"Δ{self._ft_fz - base_fz:+.2f})" - ) - self.get_logger().info( - f" 轻降第 {step_i + 1} 步: 法兰 Z={Tee[2, 3]:.4f} {ft_txt}" - ) - # 力觉兜底:规尖一碰工件 force.z 突变,立即停并回退 1mm。 - # 离面还远时力会漂几牛,不能当碰到。 - gap_now = float(Tee[2, 3]) - tip_len - surf - if ( - base_fz is not None - and self._contact_detected(base_fz) - and not contact_armed_by_gap( - gap_now, self.observe_gap_m, self.final_gap_m - ) - ): - if not getattr(self, "_ft_gap_disarmed_logged", False): - self._ft_gap_disarmed_logged = True - armed_m = contact_armed_gap_m( - self.observe_gap_m, self.final_gap_m - ) - self.get_logger().info( - f" ΔFz 超门槛但间隙 {gap_now * 1000:.1f}mm > 接触门控 " - f"{armed_m * 1000:.1f}mm,不当作碰到" - ) - if ( - base_fz is not None - and contact_armed_by_gap( - gap_now, self.observe_gap_m, self.final_gap_m - ) - and self._contact_detected(base_fz) - ): - self.get_logger().warn("腕部力突变(规尖触到工件),立即停止并回退 1mm(安全优先)") - p = Tee[:3, 3].copy() - ok, q, Tee = self._goto( - q, Tee, np.array([p[0], p[1], p[2] + 0.001]), verticalize=True, - tol_m=0.0005, tol_tilt=self.vert_tol_rad * 2.0, tag="descend_backoff", - v=self.final_descent_speed, max_hops=3, hold_xy=True, settle_s=0.25, - ) - self._pin(q) - self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf - return True, q, Tee - # 用 FK 现算剩余下降量(不是累加指令)—— 单步没走到也不会积累误差。 - remaining = (float(Tee[2, 3]) - tip_len - surf) - target_gap - if remaining <= 1e-4: - break - step = min(remaining, step_cap) # 贴面默认 ≤4mm;观察高 20mm,见 step_m - p = Tee[:3, 3].copy() - target = np.array([p[0], p[1], p[2] - step]) - ok, q, Tee = self._goto( - q, Tee, target, verticalize=True, - tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, tag="descend_gentle", - v=self.final_descent_speed, max_hops=4, hold_xy=True, settle_s=0.30, - ) - self._pin(q) - if not ok: - self.get_logger().warn("轻降中途未到位,停止(保持当前高度,安全优先)") - self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf - return False, q, Tee - # 收尾:按几何如实汇报最终间隙(不再用那个错 150mm 的深度读数当结论) - gap_f = float(Tee[2, 3]) - tip_len - surf - self.descent_final_gap_m = gap_f - lvl = self.get_logger().info if gap_f >= 0.0 else self.get_logger().warn - lvl( - f"=== {kind}完成: 规尖悬在孔面上方 ≈{gap_f * 1000:.1f}mm(几何:法兰 " - f"{Tee[2, 3]:.4f} − 工具长 {tip_len * 1000:.0f}mm − 工件面 {surf:.4f};" - f"目标 {target_gap * 1000:.1f}mm,不接触)===" - ) - return True, q, Tee - - def _stamp_bias( - self, - rec: Dict[str, Any], - *, - tgt_b: np.ndarray, - gxy: np.ndarray, - tag: str, - ) -> Dict[str, Any]: - """把基座残差拆成视线 / 画面右,写入记录。投影退化时键仍在、值为 None。""" - rec = dict(rec) - rec["tag"] = tag - if self.hole_keypoint_once and getattr(self, "hole_once_lock_xy_descend", False): - rec["scheme"] = "keypoint_once_look_ff" - elif self.hole_keypoint_once: - rec["scheme"] = "keypoint_once" - else: - rec["scheme"] = "multi_snap" - rec["cam_frame"] = self.cam_frame - rec["image_topic"] = self.image_topic - err_vec = np.array( - [float(tgt_b[0]) - float(gxy[0]), float(tgt_b[1]) - float(gxy[1])], - dtype=float, - ) - rec["err_xy_m"] = [round(float(err_vec[0]), 5), round(float(err_vec[1]), 5)] - rec["workspace_clipped"] = bool(self._ws_clipped) - T_cam = self._lookup(self.base_frame, self.cam_frame) - rec["along_look_mm"] = None - rec["along_right_mm"] = None - rec["look_xy"] = None - rec["right_xy"] = None - rec["cam_origin_base_m"] = None - if T_cam is None: - self.get_logger().warn(f"{tag}:没有 cam TF,残差分解缺轴") - return rec - rec["cam_origin_base_m"] = [ - round(float(T_cam[0, 3]), 5), - round(float(T_cam[1, 3]), 5), - round(float(T_cam[2, 3]), 5), - ] - decomp = decompose_base_xy(err_vec, T_cam) - if decomp is None: - self.get_logger().warn(f"{tag}:光轴水平投影退化,残差分解缺轴") - return rec - rec["along_look_mm"] = round(float(decomp["along_look_m"]) * 1000.0, 2) - rec["along_right_mm"] = round(float(decomp["along_right_m"]) * 1000.0, 2) - rec["look_xy"] = [round(float(v), 5) for v in decomp["look_xy"]] - rec["right_xy"] = [round(float(v), 5) for v in decomp["right_xy"]] - self.get_logger().info( - f"[{tag}] 残差分解 视线={rec['along_look_mm']:+.2f}mm " - f"画面右={rec['along_right_mm']:+.2f}mm " - f"ΔXY=({err_vec[0]*1000:+.2f},{err_vec[1]*1000:+.2f})mm\n" - f" 画面右为正:孔在规的画面右侧(目视就是规偏左)。" - f"视线为正:孔在光轴水平投影前方(工件面写低 / 交深了会往这偏)。" - ) - return rec - - def _observe_holes(self, q, Tee, final: Dict[str, Any], *, tag: str): - """核验拍:只记账,不改 XY。拍不到就保持原 final,并标明没复测。""" - try: - _bgr, _depth_m, _intr, res = self._snap_holes(skip_center_gate=True) - except Exception as exc: # noqa: BLE001 - self.get_logger().error(f"{tag}失败,残差仍是开环指令值:{exc}") - final = dict(final) - final["residual_remeasured"] = False - return q, Tee, final - if not res.get("status"): - self.get_logger().error( - f"{tag}丢孔({res.get('msg')}),残差仍是开环指令值,不是 hop 到位" - ) - final = dict(final) - final["residual_remeasured"] = False - return q, Tee, final - hb = res.get("hole_base") - z_wp = float(res.get("z_wp") or 0.0) - if hb is None or len(hb) != 2 or z_wp <= 0.0: - self.get_logger().error(f"{tag}没有孔的基座坐标,残差未复测") - final = dict(final) - final["residual_remeasured"] = False - return q, Tee, final - left_b = np.asarray(hb[0], dtype=float) - right_b = np.asarray(hb[1], dtype=float) - k1_b, k2_b = (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) - tgt_b = k1_b if self.target_hole == "k1" else k2_b - Tee_now = self._lookup(self.base_frame, self.ee_frame) - if Tee_now is not None: - Tee = Tee_now - pts = res.get("hole_points") or [] - if self._tip_off is not None: - gxy = np.array( - [float(Tee[0, 3]) + float(self._tip_off[0]), - float(Tee[1, 3]) + float(self._tip_off[1])] - ) - tip_src = "视觉规尖(开环本步)" - else: - gxy = self._gauge_xy(Tee) - tip_src = "法兰+偏置" - err = float(np.hypot(float(tgt_b[0]) - gxy[0], float(tgt_b[1]) - gxy[1])) - rec = { - "ok": err <= self.align_tol, - "arm": self.prefix.rstrip("_"), - "target_hole": self.target_hole, - "k1_base_m": [round(float(v), 5) for v in k1_b], - "k2_base_m": [round(float(v), 5) for v in k2_b], - "k1_px": ( - [round(float(pts[0][0]), 1), round(float(pts[0][1]), 1)] - if len(pts) >= 2 else None - ), - "k2_px": ( - [round(float(pts[1][0]), 1), round(float(pts[1][1]), 1)] - if len(pts) >= 2 else None - ), - "workpiece_surface_z_m": round(z_wp, 4), - "gauge_xy_m": [round(float(gxy[0]), 5), round(float(gxy[1]), 5)], - "gauge_source": tip_src, - "tip_offset_m": ( - [round(float(self._tip_off[0]), 5), round(float(self._tip_off[1]), 5)] - if self._tip_off is not None else None - ), - "residual_mm": round(err * 1000.0, 2), - "hover_z_m": round(float(Tee[2, 3]), 4), - "residual_remeasured": True, - "align_trusted": self._tip_off is not None, - } - rec = self._stamp_bias(rec, tgt_b=tgt_b, gxy=gxy, tag=tag) - snaps = list(final.get("snaps") or []) - snaps.append({k: rec[k] for k in ( - "tag", "residual_mm", "err_xy_m", "along_look_mm", "along_right_mm", - "k1_base_m", "k2_base_m", "k1_px", "k2_px", "gauge_xy_m", - "gauge_source", "tip_offset_m", "hover_z_m", "workspace_clipped", - ) if k in rec}) - merged = dict(final) - merged.update(rec) - merged["snaps"] = snaps - merged["ok"] = bool(rec["ok"] and rec["align_trusted"]) - draw = res.get("draw_img") - if draw is None: - draw = _bgr - if draw is not None: - self._publish_overlay(draw) - self._publish_result(merged) - self.get_logger().info( - f"[{tag}] k1=({k1_b[0]:.4f},{k1_b[1]:.4f}) " - f"工具=({gxy[0]:.4f},{gxy[1]:.4f})[{tip_src}] " - f"复测残差={err*1000:.2f}mm(此拍不改 XY)" - ) - return q, Tee, merged - - def _oneshot_align_move(self, q, Tee, tgt_b, gxy, err): - """单次精拍只走这一步。返回 (q, Tee, 是否走了)。""" - if err <= self.align_tol: - self.get_logger().info( - f"单次精拍开环残差 {err*1000:.2f}mm 已在容差内,这一步不横移" - ) - return q, Tee, False - raw = np.array([float(tgt_b[0]) - float(gxy[0]), float(tgt_b[1]) - float(gxy[1])]) - n_raw = float(np.linalg.norm(raw)) - max_step = oneshot_align_step_m(n_raw) - step = raw - if n_raw > max_step + 1e-9: - step = raw * (max_step / n_raw) - self.get_logger().warn( - f" 单次精拍步长 {n_raw*1000:.1f}mm 超过 " - f"{max_step*1000:.0f}mm(不像框心到 k1 的半孔距),截断。" - "截断后下降补 XY 也补不完,会留下厘米级残差" - ) - else: - self.get_logger().info( - f" 单次精拍这一步走完 {n_raw*1000:.1f}mm(框心到目标孔,不再用 12mm 封顶)" - ) - move = np.array([ - float(Tee[0, 3]) + float(step[0]), - float(Tee[1, 3]) + float(step[1]), - self.hover_z, - ]) - hop_tol = 0.00022 if err < 0.003 else max(0.0003, min(0.0005, 0.25 * err)) - hop_v = self.align_speed if err > 0.005 else min(self.align_speed, 0.016) - self._state("align_move_once") - ok, q, Tee = self._goto( - q, Tee, move, verticalize=True, - tol_m=hop_tol, tol_tilt=self.vert_tol_rad * 2.0, - tag="align_once", v=hop_v, - max_hops=8, settle_s=max(0.35, self.settle_sec), - min_dur=0.35, strict_xy=True, - ) - self._pin(q) - if not ok: - self.get_logger().warn( - "单次精拍这一步没走到位;残差以随后核验拍为准,不把 hop 容差当对上" - ) - return q, Tee, True - - def _vendor_movel_tcp(self, xyz, vel: float) -> bool: - """进程内厂家 MoveL:TCP 目标,不杀控制栈。""" - lib = ros2_root() / "scripts" / "lib" - if str(lib) not in sys.path: - sys.path.insert(0, str(lib)) - from flexiv_movel_ipc import read_ack, read_done, write_request - - seq = int(time.monotonic() * 1000.0) % 1_000_000_000 - write_request( - seq, float(xyz[0]), float(xyz[1]), float(xyz[2]), False, float(vel) - ) - t0 = time.monotonic() - acked = False - while time.monotonic() - t0 < 90.0: - if not rclpy.ok(): - return False - self._spin(0.02) - if not acked: - if read_ack() == seq: - acked = True - elif time.monotonic() - t0 > 2.0: - self.get_logger().error( - "厂家 MoveL 2s 内没 ack —— 硬件没接 /tmp/flexiv_movel_req。" - "真机环境重建 install/ 后再跑,不许改走关节折线假装成功" - ) - return False - continue - got = read_done() - if got is not None and int(got[0]) == seq: - if not got[1]: - self.get_logger().error(f"厂家 MoveL 失败:{got[2]}") - return bool(got[1]) - self.get_logger().error("厂家 MoveL 90s 内没有 done") - return False - - def _once_ff_diagonal_to_gap(self, q, Tee, *, target_gap_m): - """悬停点一条 MoveL 收到 ``target_gap_m``。k=0 只降 Z;k>0 再沿 -look 收 XY。""" - self._state("ff_diagonal_movel") - tip_len = float(self.tool_tip_below_flange_m) - surf = float(self.surface_z_m) - if tip_len <= 0.0 or surf <= 0.0: - self.get_logger().error("贴面下降缺工具长/工件面,停在悬停高") - return False, q, Tee - if self._tip_off is None: - self.get_logger().error("贴面下降需要悬停规尖偏移,没有就不许用法兰凑") - return False, q, Tee - k = float(self.once_ff_look_per_m) - look_xy = np.array([0.0, 0.0], dtype=float) - T_cam = self._lookup(self.base_frame, self.cam_frame) - if k > 1e-9: - if T_cam is None: - self.get_logger().error("没有 cam TF,视线轴算不出,不下发") - return False, q, Tee - axes = cam_xy_bias_axes(T_cam) - if axes is None: - self.get_logger().error("光轴水平投影退化,不下发") - return False, q, Tee - look_xy, _right = axes - elif T_cam is not None: - axes = cam_xy_bias_axes(T_cam) - if axes is not None: - look_xy, _right = axes - gap0 = float(Tee[2, 3]) - tip_len - surf - descent = gap0 - float(target_gap_m) - packed = once_ff_tcp_xyz( - [Tee[0, 3], Tee[1, 3]], - self._tip_off, - look_xy, - descent, - k, - surf, - target_gap_m, - ) - if packed is None: - if descent <= 0.001: - self.get_logger().info("规尖已在目标间隙附近,无需斜线") - self.descent_final_gap_m = gap0 - return True, q, Tee - self.get_logger().error("视线前馈算不出 ΔXY,停在悬停高") - return False, q, Tee - tcp, dxy = packed - n_xy = float(np.hypot(float(dxy[0]), float(dxy[1]))) - if n_xy > ONCE_TRIM_REFUSE_M + 1e-9: - self.get_logger().error( - f"视线前馈 {n_xy * 1000:.1f}mm 超过 {ONCE_TRIM_REFUSE_M * 1000:.0f}mm," - "不像交平面那几毫米,停在悬停高" - ) - return False, q, Tee - z_flange = flange_z_for_gap_m(tip_len, surf, target_gap_m) - flange_tgt = np.array( - [ - float(Tee[0, 3]) + float(dxy[0]), - float(Tee[1, 3]) + float(dxy[1]), - z_flange, - ] - ) - self._ws_clipped = False - self._clamp_ws(flange_tgt) - if self._ws_clipped: - self.get_logger().error( - "视线前馈目标被工作盒截断,不下发(不许把孔位改到盒沿)" - ) - return False, q, Tee - self._spin(0.05) - tcp_now = self._fresh_tcp_world() - if tcp_now is None: - self.get_logger().error( - "没有厂家 tcp_pose(话题 " - f"{getattr(self, 'robot_states_topic', '?')} 不新鲜)," - "拒绝用 ROS 规尖绝对坐标发 MoveL" - ) - return False, q, Tee - movel_xyz = once_ff_movel_from_tcp(tcp_now, dxy, descent) - if movel_xyz is None: - self.get_logger().error("厂家 TCP 加上相对位移算不出,停在悬停高") - return False, q, Tee - off_xy = ( - (float(tcp_now[0]) - float(tcp[0]) + float(dxy[0])) * 1000.0, - (float(tcp_now[1]) - float(tcp[1]) + float(dxy[1])) * 1000.0, - ) - scheme = "笛卡尔锁XY只降Z" if n_xy < 1e-6 else "视线前馈斜线" - self.get_logger().info( - f"{scheme}:look=({look_xy[0]:+.3f},{look_xy[1]:+.3f}) " - f"k={k:.3f} 降 {descent * 1000:.1f}mm → " - f"ΔXY=({dxy[0] * 1000:+.2f},{dxy[1] * 1000:+.2f})mm " - f"厂家TCP现=({tcp_now[0]:.4f},{tcp_now[1]:.4f},{tcp_now[2]:.4f}) " - f"MoveL=({movel_xyz[0]:.4f},{movel_xyz[1]:.4f},{movel_xyz[2]:.4f}) " - f"ROS尖目标=({tcp[0]:.4f},{tcp[1]:.4f},{tcp[2]:.4f}) " - f"WORLD相对ROS XY差≈({off_xy[0]:+.1f},{off_xy[1]:+.1f})mm " - f"vel={ONCE_FF_MOVEL_VEL_MPS * 1000:.0f}mm/s" - ) - fl0 = (float(Tee[0, 3]), float(Tee[1, 3]), float(Tee[2, 3])) - ok = self._vendor_movel_tcp(movel_xyz, ONCE_FF_MOVEL_VEL_MPS) - # MoveL 刚切回关节模式:JTC 还握着贴面前的悬停关节。等 2 s 再钉 - # 等于让 vmax=0.05 往悬停留 0.1 rad(2026-10-16 收臂实测多抬 13–20 mm)。 - q2, Tee2 = self._wait_state(0.3) - if q2 is not None and Tee2 is not None: - q, Tee = q2, Tee2 - self._pin(q) - self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf - dax = (float(Tee[0, 3]) - fl0[0]) * 1000.0 - day = (float(Tee[1, 3]) - fl0[1]) * 1000.0 - daz = (float(Tee[2, 3]) - fl0[2]) * 1000.0 - self.get_logger().info( - f"贴面走后:法兰 ΔXYZ=({dax:+.2f},{day:+.2f},{daz:+.2f})mm " - f"指令 ΔXY=({dxy[0] * 1000:+.2f},{dxy[1] * 1000:+.2f})mm " - f"间隙 {self.descent_final_gap_m * 1000:.1f}mm " - f"{'到位' if ok else 'MoveL未完成'}" - ) - return bool(ok), q, Tee - - def _trim_xy_keep_hover_tip(self, q, Tee, final: Dict[str, Any], z_target_m=None): - """观察高重交孔,规尖沿用悬停冻住的偏移。只许一跳、XY ≤3mm。 - - 2026-10-13 真机两遍:走后核验 0.4~0.7mm,降后交平面漂 4~5mm;观测高度 - 深度把夹爪当尖,两拍差 8~36mm,重测守卫把该补的 4mm 也拒掉了。悬停规尖 - 只有 0.1mm 量级,沿用它,只补孔 XY。没有冻住的偏移就不许用法兰凑。 - - 同日第二次:两跳合计 +4.3mm X 把近距检测带崩(k1 像素 446→403,间距 - 60→45mm,残差 2.6→14.8mm),流水线还把走之前的 2.61mm 当终值。所以 - 只许一跳、步长 ≤3mm;超过 8mm 根本不动。 - - ``z_target_m`` 有值时这一跳同时收到贴面法兰高(观察高测补偿,斜线一步 - 贴面)。贴面复拍只记账:近了画面更容易漂,不按近距那一拍撤回观察高的解。 - """ - if self._tip_off is None: - self.get_logger().error( - "下降后补 XY 需要悬停冻住的规尖偏移;没有就不许用法兰凑,保持原地" - ) - return q, Tee, final - off = np.asarray(self._tip_off, dtype=float).reshape(2) - final_in = final - z_hold = float(Tee[2, 3]) - - def _measure(src: Dict[str, Any], tag: str): - nonlocal Tee - try: - _bgr, _depth_m, _intr, res = self._snap_holes(skip_center_gate=True) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"{tag}复拍失败,保持原地:{exc}") - return None - if not res.get("status"): - self.get_logger().warn(f"{tag}丢孔({res.get('msg')}),不再改 XY") - return None - hb = res.get("hole_base") - z_wp = float(res.get("z_wp") or 0.0) - if hb is None or len(hb) != 2 or z_wp <= 0.0: - self.get_logger().warn(f"{tag}没有孔的基座坐标,不再改 XY") - return None - left_b = np.asarray(hb[0], dtype=float) - right_b = np.asarray(hb[1], dtype=float) - k1_b, k2_b = ( - (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) - ) - tgt = k1_b if self.target_hole == "k1" else k2_b - Tee_now = self._lookup(self.base_frame, self.ee_frame) - if Tee_now is not None: - Tee = Tee_now - gxy = np.array( - [float(Tee[0, 3]) + float(off[0]), float(Tee[1, 3]) + float(off[1])] - ) - raw = np.array([float(tgt[0]) - gxy[0], float(tgt[1]) - gxy[1]]) - err = float(np.linalg.norm(raw)) - pair = hole_pair_span_m(k1_b, k2_b) - rec = dict(src) - rec["residual_mm"] = round(err * 1000.0, 2) - rec["tip_offset_m"] = [round(float(off[0]), 5), round(float(off[1]), 5)] - rec["gauge_xy_m"] = [round(float(gxy[0]), 5), round(float(gxy[1]), 5)] - rec["gauge_source"] = "视觉规尖(悬停冻结,下降后只重交孔)" - rec["k1_base_m"] = [round(float(v), 5) for v in k1_b] - rec["k2_base_m"] = [round(float(v), 5) for v in k2_b] - rec["hover_z_m"] = round(float(Tee[2, 3]), 4) - rec["pair_span_mm"] = round(pair * 1000.0, 2) - rec["residual_remeasured"] = True - rec["align_trusted"] = True - rec = self._stamp_bias(rec, tgt_b=tgt, gxy=gxy, tag=tag) - snaps = list(src.get("snaps") or []) - snaps.append({ - "tag": rec.get("tag"), - "residual_mm": rec.get("residual_mm"), - "err_xy_m": rec.get("err_xy_m"), - "along_look_mm": rec.get("along_look_mm"), - "along_right_mm": rec.get("along_right_mm"), - "k1_base_m": rec.get("k1_base_m"), - "gauge_xy_m": rec.get("gauge_xy_m"), - "gauge_source": rec.get("gauge_source"), - "tip_offset_m": rec.get("tip_offset_m"), - "hover_z_m": rec.get("hover_z_m"), - "pair_span_mm": rec.get("pair_span_mm"), - }) - rec["snaps"] = snaps - rec["ok"] = err <= self.align_tol - rec["trim_reverted"] = False - self._publish_result(rec) - self.get_logger().info( - f"[{tag}] 工具=({gxy[0]:.4f},{gxy[1]:.4f})" - f"[悬停冻结] 残差={err * 1000:.2f}mm 间距={pair * 1000:.1f}mm —— 不重测规尖" - ) - return rec, err, raw, pair - - def _revert(xy_flange) -> None: - nonlocal q, Tee - back = np.array([float(xy_flange[0]), float(xy_flange[1]), z_hold]) - okb, q, Tee = self._goto( - q, Tee, back, verticalize=True, - tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, - tag="trim_xy_revert", v=min(float(self.align_speed), 0.010), - max_hops=4, settle_s=0.30, strict_xy=True, - ) - self._pin(q) - if not okb: - self.get_logger().error("下降后补孔撤回没走到,位置以当前 FK 为准") - - if not rclpy.ok(): - return q, Tee, final_in - measured = _measure(final_in, "下降后补孔 0") - if measured is None: - return q, Tee, final_in - rec, err, raw, pair = measured - z_goal = z_hold - blend_z = False - if z_target_m is not None: - z_goal = min(z_hold, float(z_target_m)) - blend_z = (z_hold - z_goal) > 0.0005 - if not hole_pair_span_ok(pair): - self.get_logger().error( - f"下降后两孔间距 {pair * 1000:.1f}mm 不在 50–70mm,检测漂了,不动" - ) - return q, Tee, final_in - if err > ONCE_TRIM_REFUSE_M: - self.get_logger().error( - f"下降后要对 {err * 1000:.1f}mm,超过 {ONCE_TRIM_REFUSE_M * 1000:.0f}mm " - "—— 不像交平面漂移,停在原地" - ) - return q, Tee, final_in - need_xy = err > self.align_tol - if (not need_xy) and (not blend_z): - self.get_logger().info( - f"下降后 XY 已在容差内({err * 1000:.2f}mm),高度保持 {z_hold:.4f}" - ) - return q, Tee, rec - step = np.zeros(2, dtype=float) if not need_xy else np.asarray(raw, dtype=float) - if need_xy and err > ONCE_TRIM_MAX_STEP_M: - step = raw * (ONCE_TRIM_MAX_STEP_M / err) - xy_before = np.array([float(Tee[0, 3]), float(Tee[1, 3])]) - move = np.array([ - float(Tee[0, 3]) + float(step[0]), - float(Tee[1, 3]) + float(step[1]), - z_goal, - ]) - hop_tag = "trim_blend_to_final" if blend_z else "trim_xy_keep_tip" - hop_v = ( - min(float(getattr(self, "final_descent_speed", 0.005) or 0.005), 0.008) - if blend_z - else min(float(self.align_speed), 0.010) - ) - if blend_z: - self.get_logger().info( - f"观察高斜线贴面 Δxy=({step[0] * 1000:+.1f},{step[1] * 1000:+.1f})mm " - f"Δz={(z_goal - z_hold) * 1000:+.1f}mm → 法兰 Z {z_goal:.4f}" - ) - ok, q, Tee = self._goto( - q, Tee, move, verticalize=True, - tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, - tag=hop_tag, v=hop_v, - max_hops=4, settle_s=0.30, strict_xy=True, - ) - self._pin(q) - if not ok: - self.get_logger().warn("下降后 XY 修正没走到,停;残差以走前重测为准") - return q, Tee, rec - if abs(float(Tee[2, 3]) - z_goal) > 0.002: - self.get_logger().error( - f"下降后修正把高度从 {z_hold:.4f} 带到了 {float(Tee[2, 3]):.4f}" - f"(目标 {z_goal:.4f}),撤回" - ) - _revert(xy_before) - rec["trim_reverted"] = True - rec["ok"] = err <= self.align_tol - return q, Tee, rec - after = _measure(rec, "下降后补孔核验") - if blend_z: - if after is None or (not hole_pair_span_ok(after[3])) or after[1] > ONCE_TRIM_REFUSE_M: - self.get_logger().warn( - "贴面复拍不可信,斜线位姿保留(补偿按观察高那一拍)" - ) - rec["close_snap_untrusted"] = True - rec["hover_z_m"] = round(float(Tee[2, 3]), 4) - rec["ok"] = err <= self.align_tol - self._publish_result(rec) - return q, Tee, rec - rec2, err2, _raw2, _pair2 = after - rec2["ok"] = err2 <= self.align_tol - rec2["trim_reverted"] = False - rec2["close_snap_untrusted"] = False - self._publish_result(rec2) - return q, Tee, rec2 - if after is None: - self.get_logger().error("下降后补孔走完复拍失败,撤回这一跳") - _revert(xy_before) - rec["trim_reverted"] = True - rec["ok"] = err <= self.align_tol - return q, Tee, rec - rec2, err2, _raw2, pair2 = after - worse_pair = (not hole_pair_span_ok(pair2)) or (pair2 < pair - 0.002) - worse_res = err2 > err + 1e-6 - if worse_pair or worse_res: - self.get_logger().error( - f"下降后补了 {float(np.linalg.norm(step)) * 1000:.1f}mm 后变差" - f"(残差 {err * 1000:.2f}→{err2 * 1000:.2f}mm," - f"间距 {pair * 1000:.1f}→{pair2 * 1000:.1f}mm),撤回这一跳" - ) - _revert(xy_before) - rec["trim_reverted"] = True - rec["ok"] = err <= self.align_tol - rec["snaps"] = rec2.get("snaps") or rec.get("snaps") - self._publish_result(rec) - return q, Tee, rec - rec2["ok"] = err2 <= self.align_tol - rec2["trim_reverted"] = False - self._publish_result(rec2) - return q, Tee, rec2 - - def _trim_xy_after_descent(self, q, Tee, final: Dict[str, Any]): - """下降之后、保持当前高度,用这一高度的规尖和孔再对一次 XY。 - - 悬停残差不能拿来当下降后的孔位。相机光轴相对法兰约 30°,孔的基座 XY - 对深度大约 0.5 mm/mm。2026-10-09:同一孔在悬停(相机深度 180mm,残差 - 0.22mm)和观测高度(127mm)上反投影,基座 XY 差约 2mm;法兰 XY 下降时 - 只动了 0.2mm。画面里针在孔的上方一截,主要是 15mm 间隙的透视,横着的 - 那 2mm 才是要补的。 - - 多走多拍:只用本高度新量的规尖,不沿用悬停时冻住的偏移。总修正超过 8mm - 就不动 —— 那一档是夹爪/杆身,不是针。量不到规尖也不动,悬停对准的结果留着。 - 单次精拍:观测高度深度会把夹爪当尖(2026-10-13 两拍差 8~36mm),改走 - ``_trim_xy_keep_hover_tip``。 - """ - if getattr(self, "hole_keypoint_once", False): - # 打桩测试把 stub 当 self 传入未绑定方法,必须点到类上的实现。 - z_target = None - if bool(getattr(self, "final_descent_enable", False)): - tip = float(getattr(self, "tool_tip_below_flange_m", 0.0) or 0.0) - surf = float(getattr(self, "surface_z_m", 0.0) or 0.0) - if tip > 0.0 and surf > 0.0: - z_target = flange_z_for_gap_m( - tip, surf, getattr(self, "final_gap_m", 0.002) - ) - return Stage2Locate._trim_xy_keep_hover_tip( - self, q, Tee, final, z_target_m=z_target - ) - if not self.tip_vision: - return q, Tee, final - final_in = final - z_hold = float(Tee[2, 3]) - saved = self._tip_off - budget = 0.008 - moved = 0.0 - prev: Optional[np.ndarray] = None - for it in range(4): - if not rclpy.ok(): - break - try: - _bgr, depth_m, intr, res = self._snap_holes(skip_center_gate=True) - except Exception as exc: # noqa: BLE001 - self.get_logger().warn(f"下降后复拍失败,保持悬停对准的位置:{exc}") - self._tip_off = saved - return q, Tee, final - if not res.get("status"): - self.get_logger().warn(f"下降后丢孔({res.get('msg')}),不再改 XY") - self._tip_off = saved - return q, Tee, final - hb = res.get("hole_base") - z_wp = float(res.get("z_wp") or 0.0) - if hb is None or len(hb) != 2 or z_wp <= 0.0: - self.get_logger().warn("下降后没有孔的基座坐标,不再改 XY") - self._tip_off = saved - return q, Tee, final - left_b = np.asarray(hb[0], dtype=float) - right_b = np.asarray(hb[1], dtype=float) - k1_b, k2_b = (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) - tgt = k1_b if self.target_hole == "k1" else k2_b - Tee_now = self._lookup(self.base_frame, self.ee_frame) - if Tee_now is not None: - Tee = Tee_now - off, tlen, why = self._tip_offset_from_depth( - depth_m, intr, Tee, z_wp_cam=z_wp - ) - if off is None or tlen is None: - self.get_logger().warn(f"下降后没量到规尖({why}),不再改 XY") - self._tip_off = saved - return q, Tee, final - if prev is not None and float(np.linalg.norm(off - prev)) > 0.003: - self.get_logger().warn( - f"下降后规尖两拍差 {float(np.linalg.norm(off - prev))*1000:.1f}mm,这一拍不动" - ) - prev = np.array(off, dtype=float) - continue - prev = np.array(off, dtype=float) - if it == 0: - continue - gxy = np.array([ - float(Tee[0, 3]) + float(off[0]), float(Tee[1, 3]) + float(off[1]) - ]) - raw = np.array([float(tgt[0]) - gxy[0], float(tgt[1]) - gxy[1]]) - err = float(np.linalg.norm(raw)) - final = dict(final) - final["residual_mm"] = round(err * 1000.0, 2) - final["tip_offset_m"] = [round(float(off[0]), 5), round(float(off[1]), 5)] - final["tip_len_m"] = round(float(tlen), 5) - final["gauge_xy_m"] = [round(float(gxy[0]), 5), round(float(gxy[1]), 5)] - final["gauge_source"] = "视觉规尖(下降后重测)" - self._tip_off = np.array(off, dtype=float) - self.get_logger().info( - f"[下降后 {it}] 工具=({gxy[0]:.4f},{gxy[1]:.4f}) " - f"残差={err*1000:.2f}mm {why}" - ) - if err <= self.align_tol: - self.get_logger().info( - f"下降后 XY 已在容差内({err*1000:.2f}mm),高度保持 {z_hold:.4f}" - ) - return q, Tee, final - if moved + err > budget: - self.get_logger().error( - f"下降后要对 {err*1000:.1f}mm(已走 {moved*1000:.1f}mm)," - f"超过 {budget*1000:.0f}mm —— 不像针,停在原地" - ) - self._tip_off = saved - return q, Tee, final_in - - step = raw - if err > 0.004: - step = raw * (0.004 / err) - move = np.array([ - float(Tee[0, 3]) + float(step[0]), - float(Tee[1, 3]) + float(step[1]), - z_hold, - ]) - ok, q, Tee = self._goto( - q, Tee, move, verticalize=True, - tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.0, - tag="trim_xy", v=min(float(self.align_speed), 0.010), - max_hops=4, settle_s=0.30, strict_xy=True, - ) - self._pin(q) - moved += float(np.linalg.norm(step)) - if not ok: - self.get_logger().warn("下降后 XY 修正没走到,停") - return q, Tee, final - if abs(float(Tee[2, 3]) - z_hold) > 0.002: - self.get_logger().error( - f"下降后修正把高度从 {z_hold:.4f} 带到了 {float(Tee[2, 3]):.4f},停下" - ) - return q, Tee, final - return q, Tee, final - - def _snap_holes(self, *, skip_center_gate: bool) -> Tuple[np.ndarray, np.ndarray, Dict[str, float], dict]: - """多帧拍孔:先对 N 帧做时间中值得到干净图,再在其上检测螺纹嵌件对。 - - 工件在拍照期间静止,中值图几乎无噪声 → 嵌件亮环峰稳定 → 孔对不跳变。 - 精对准时跳过居中门控。退路:中值图检测失败则逐帧检测取首个成功。 - """ - n = max(1, int(self.snap_frames)) - frames: List[np.ndarray] = [] - depths: List[np.ndarray] = [] - last_intr: Optional[Dict[str, float]] = None - seen: set = set() - time.sleep(self.settle_sec) - t_end = time.monotonic() + 5.0 + 0.40 * n - while len(frames) < n and time.monotonic() < t_end: - bgr, depth_m, intr = self._grab() - stamp = None - if self._color is not None: - stamp = ( - int(self._color.header.stamp.sec), - int(self._color.header.stamp.nanosec), - ) - if stamp is not None and stamp in seen: - self._spin(0.03) - continue - if stamp is not None: - seen.add(stamp) - frames.append(bgr) - depths.append(depth_m) - last_intr = intr - self._spin(0.02) - if not frames or last_intr is None: - raise RuntimeError("精拍未拿到图像") - med_bgr = ( - np.median(np.stack(frames), axis=0).astype(np.uint8) if len(frames) > 1 else frames[0] - ) - med_depth = ( - np.median(np.stack(depths), axis=0).astype(np.float32) if len(depths) > 1 else depths[0] - ) - # 对孔只认像素关键点。把深度图传进去,嵌件对会用深度换像素半径,等于又用上了深度。 - det_depth = None if self.hole_visual_only else med_depth - res = self._detect_holes_img(med_bgr, skip_center_gate=skip_center_gate, - depth_m=det_depth, intr=last_intr) - if not res.get("status"): - for bgr in frames: - r2 = self._detect_holes_img(bgr, skip_center_gate=skip_center_gate, - depth_m=det_depth, intr=last_intr) - if r2.get("status"): - res = r2 - med_bgr = bgr - break - res = dict(res) - pts = res.get("hole_points") or [] - rad = res.get("hole_radii") or [] - if res.get("status") and len(pts) == 2 and len(rad) >= 2: - # **只在调用方还没给三维时**才反投影。 - # 真值路径(perception.source=truth)已经把孔的世界系精确位置带出来了 - # (见 _truth_hole_result → _truth_to_base),再拿深度图反投影一遍 - # 只会把它换成一个**更差**的数:孔位正下方是贯通孔 + 台面通槽, - # 深度相机在孔位看到的是槽底/地面(0.62m)而不是工件面(0.21m), - # 三角化出的孔距会从 58mm 变成 169mm。2026-09-24 就是栽在这里。 - if not res.get("hole_base"): - proj = self._project_holes(med_depth, pts, rad, res.get("bbox"), last_intr) - if proj is not None: - res["hole_base"] = [ - [float(proj["left_b"][0]), float(proj["left_b"][1]), float(proj["left_b"][2])], - [float(proj["right_b"][0]), float(proj["right_b"][1]), float(proj["right_b"][2])], - ] - res["hole_z"] = [float(proj["z_left"]), float(proj["z_right"])] - res["z_wp"] = float(proj["z_wp"]) - res["snap_frames"] = int(len(frames)) - # 把"三维是哪来的"也打出来:这一项错了(真值被当成深度、或反过来) - # 会让孔距从 58mm 变成 169mm,而现象看起来只是"检测不认"。 - if self._truth_enabled() and res.get("hole_base"): - _src = "真值" - elif self.hole_visual_only: - _src = "像素交工件面" - else: - _src = "深度反投影" - self.get_logger().info( - f"精拍 {len(frames)}帧中值图 " - f"L=({pts[0][0]:.1f},{pts[0][1]:.1f}) R=({pts[1][0]:.1f},{pts[1][1]:.1f})" - f" 三维来源={_src}" - ) - return med_bgr, med_depth, last_intr, res - - # ==================== 叠图/结果输出 ==================== - - def _publish_overlay(self, bgr: np.ndarray) -> None: - if not self.preview: - return - self._last_overlay = bgr - try: - import cv2 - - cv2.imwrite("/tmp/stage2_overlay.png", bgr) - except Exception: - pass - msg = Image() - msg.header.stamp = self.get_clock().now().to_msg() - msg.header.frame_id = self.cam_frame - msg.height, msg.width = int(bgr.shape[0]), int(bgr.shape[1]) - msg.encoding = "bgr8" - msg.step = int(bgr.shape[1] * 3) - msg.data = bgr.tobytes() - self._overlay_pub.publish(msg) - - def _publish_result(self, payload: Dict[str, Any]) -> None: - msg = String() - msg.data = json.dumps(payload, ensure_ascii=False) - self._result_pub.publish(msg) - try: - Path("/tmp/stage2_result.json").write_text( - json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8" - ) - except Exception: - pass - - # ==================== 主流程 ==================== - - def run(self) -> int: - self._state("wait_state") - q, Tee = self._wait_state(10.0) - if q is None or Tee is None: - self.get_logger().error( - "拿不到 joint_states/TF —— 先确认 T1: bash ~/ros2/scripts/run_real.sh --arm 89" - ) - return 2 - if not self._cli.wait_for_server(timeout_sec=5.0): - self.get_logger().error("JTC action 不在 —— 控制器没起来(T1 run_real.sh --arm 89)") - return 2 - - if self._hover_refused: - self.get_logger().error(self._hover_refused) - return 2 - if self._final_gap_refused: - self.get_logger().error(self._final_gap_refused) - return 2 - - if self.hover_z_user_set: - z_lo = float(self.ws_min[2]) - z_hi = float(self.ws_max[2]) - if not (z_lo - 1e-6) <= self.hover_z <= (z_hi + 1e-6): - self.get_logger().error( - f"--hover-z {self.hover_z:.3f} 超出工作盒 Z [{z_lo:.3f}, {z_hi:.3f}],拒绝执行" - ) - return 2 - elif not (self.min_ee_z - 1e-6) <= self.hover_z <= (self.safe_z + 0.05): - self.get_logger().error( - f"hole_hover_z_m={self.hover_z:.3f} 越界 [{self.min_ee_z:.2f}, {self.safe_z + 0.05:.2f}],拒绝执行" - ) - return 2 - - code, q, Tee, final = self._run_locate(q, Tee) - if code != 0: - return code - self._linger_hold(final) - return 0 - - def _run_locate( - self, q: np.ndarray, Tee: np.ndarray - ) -> Tuple[int, np.ndarray, np.ndarray, Dict[str, Any]]: - """从当前位姿完成垂直/悬停/拍照对准。不 linger——串联时立刻交三阶段。""" - self.get_logger().warn("请确认:左臂夹爪已夹持通止规,且通止规轴线≈法兰轴线") - - # ---- 1) 垂直朝下(已垂直则跳过,避免串联时原地扭一下) ---- - _, ang = self._w_down(Tee[:3, :3]) - if ang > self.vert_tol_rad: - self._state("verticalize") - ok, q, Tee = self._goto( - q, Tee, Tee[:3, 3].copy(), verticalize=True, - tol_m=0.002, tol_tilt=self.vert_tol_rad, tag="verticalize", v=0.04, - max_hops=12, - ) - _, ang = self._w_down(Tee[:3, :3]) - if not ok: - self.get_logger().warn("垂直化未完全收敛,继续但请注意") - self.get_logger().info( - f"垂直度: 残余倾角 {math.degrees(ang):.2f} deg(阈值 {math.degrees(self.vert_tol_rad):.2f})" - ) - - # ---- 2) 悬停到锁高(已在 ±3mm 内则跳过) ---- - p0 = Tee[:3, 3].copy() - if abs(float(p0[2]) - self.hover_z) > 0.003: - self._state("hover") - target = np.array([p0[0], p0[1], self.hover_z]) - ok, q, Tee = self._goto( - q, Tee, target, verticalize=True, - tol_m=0.002, tol_tilt=self.vert_tol_rad * 1.5, tag="hover", v=self.move_speed, - max_hops=12, hold_xy=True, settle_s=0.30, - ) - self._pin(q) - self._spin(0.2) - Tee_now = self._lookup(self.base_frame, self.ee_frame) - if Tee_now is not None: - Tee = Tee_now - z_now = float(Tee[2, 3]) - _, ang2 = self._w_down(Tee[:3, :3]) - z_err = abs(z_now - self.hover_z) - self.get_logger().info( - f"悬停到位: 法兰 Z={z_now:.3f}m(目标 {self.hover_z:.3f},差 {(z_now - self.hover_z)*1000:+.0f}mm)" - f" 残余倾角 {math.degrees(ang2):.2f}deg" - ) - if z_err > 0.004: - self.get_logger().error( - f"悬停未达容差(Z 差 {(z_now - self.hover_z)*1000:+.0f}mm,倾角 {math.degrees(ang2):.2f}deg),终止" - ) - return 2, q, Tee, {} - if not ok: - self.get_logger().warn( - f"悬停闭环未完全收敛,但 Z 差 {z_err*1000:.1f}mm 可接受,继续拍照定位" - ) - else: - self._state("hover") - self._pin(q) - self._spin(0.2) - Tee_now = self._lookup(self.base_frame, self.ee_frame) - if Tee_now is not None: - Tee = Tee_now - z_now = float(Tee[2, 3]) - if abs(z_now - self.hover_z) > 0.004: - self.get_logger().error( - f"悬停未达容差(Z={z_now:.3f},目标 {self.hover_z:.3f}),终止" - ) - return 2, q, Tee, {} - self.get_logger().info( - f"已在悬停高 Z={z_now:.3f}m(目标 {self.hover_z:.3f}),跳过升降" - ) - - if self.hover_only: - self._state("hover_only_hold") - self.get_logger().info( - f"=== 悬停锁定调试:当前法兰 Z={z_now:.3f}m ===\n" - " 看通止规尖到工件的距离是否合适;改 site.yaml:\n" - " robots[89].servo.hole_hover_z_m (或 robots[91] 对应段)\n" - " Ctrl-C 结束(机械臂保持当前位姿)。" - ) - try: - while rclpy.ok(): - self._spin(0.5) - Tee2 = self._lookup(self.base_frame, self.ee_frame) - if Tee2 is not None: - _, ang2 = self._w_down(Tee2[:3, :3]) - self.get_logger().info( - f"hold: ee=({Tee2[0,3]:.3f},{Tee2[1,3]:.3f},{Tee2[2,3]:.3f}) " - f"tilt={math.degrees(ang2):.2f}deg", - throttle_duration_sec=1.5, - ) - except KeyboardInterrupt: - pass - q_end = self._q() - self._pin(q_end if q_end is not None else q) - return 0, q_end if q_end is not None else q, Tee, {"ok": True, "hover_only": True} - - # ---- 3) 粗居中:工件 bbox 中心移到图像中心一带 ---- - for move_i in range(self.coarse_max_moves + 1): - self._state(f"snap_coarse_{move_i}") - bbox = None - truth: Optional[dict] = None - bgr = depth_m = intr = None - # 本拍是否"跳过粗居中"(精定位已看到 k1/k2)—— 见下面 holes 分支 - skip_coarse = False - time.sleep(self.settle_sec if move_i == 0 else min(0.20, self.settle_sec)) - for attempt in range(8): - if attempt: - self._spin(0.12) - bgr, depth_m, intr = self._grab() - # 真值三维(有就带上):粗居中的目标点优先用它,别绕深度图。 - truth = self._truth_hole_result(bgr) if self._truth_enabled() else None - bbox = self._best_bbox(bgr) - if bbox is not None: - break - holes = self._detect_holes_img(bgr, skip_center_gate=True) - if holes.get("status"): - # 精定位已经能看到 k1/k2(它是**直接量孔**,比粗居中可靠), - # 所以不居中、不移动,直接交给精定位。 - # 旧写法在这里把孔检测器的整幅 bbox 拿来当工件目标,然后**照样算 - # 偏差横移**:真机那帧 bbox=[0,0,847,479](整幅画面)⇒ 偏差 - # 55.9mm ⇒ 又挪一次。一句话:"跳过居中"就必须真的不动。 - self.get_logger().info( - "粗定位 YOLO 无可信框(空框/被边缘切),但已看到 k1/k2 " - "—— 跳过粗居中、原地直进精对准" - ) - self._publish_overlay(holes.get("draw_img", bgr)) - skip_coarse = True - break - self.get_logger().warn(f"粗定位第 {attempt + 1}/8 帧未见工件,复拍") - if skip_coarse: - break - if bbox is None: - if bgr is not None: - self._publish_overlay(bgr) - self.get_logger().error( - "视野里检测不到工件。把臂移到工件上方再来,或先跑一阶段对准。" - ) - return 3, q, Tee, {} - h, w = bgr.shape[:2] - bx, by = 0.5 * (bbox[0] + bbox[2]), 0.5 * (bbox[1] + bbox[3]) - # 收敛判据用"基座系下夹爪轴→工件中心距离",与相机偏置无关 - # (旧版用图像中心,相机偏置时图像居中≠夹爪对准,会误判/白动)。 - # - # 目标点优先用**真值三维**(truth 模式):工件中心是一个已知点, - # 没必要绕"像素 → 深度图 → 三角化"。仿真里那一步还会因为孔下方是 - # 通槽而把深度取到槽底/地面,算出个偏出好几厘米的"中心" - # (实测第二轮 coarse 偏差反而从 53.7mm 涨到 97.7mm —— 越走越偏)。 - p_base, src = None, "深度" - if truth is not None and truth.get("part_center_base"): - p_base = np.asarray(truth["part_center_base"][0], dtype=float) - src = "真值" - # 对孔走平面交点时,框心必须同一条射线∩面。深度框心沿 30° 视线 - # 偏 1~2mm,符号随站位翻(D435 送到夹具位 vs 纯 D405 停在别处), - # 精拍再把这截当 K1.x−规尖.x 走掉,前馈又沿同轴加一次。 - if p_base is None and self.hole_visual_only: - if float(self.surface_z_m) <= 0.0: - self.get_logger().error( - "粗居中要对孔同一平面,但 workpiece_surface_z_m 没有配," - "拒绝用深度图凑框心" - ) - break - T_cam = self._lookup(self.base_frame, self.cam_frame) - if T_cam is None: - self.get_logger().error("粗居中缺 cam TF,拒绝用深度图凑框心") - break - hit = pixel_on_base_plane( - float(bx), - float(by), - float(intr["fx"]), - float(intr["fy"]), - float(intr["cx"]), - float(intr["cy"]), - T_cam, - float(self.surface_z_m), - ) - if hit is None: - self.get_logger().error( - "粗居中框心射线没交到工件面,拒绝用深度图凑" - ) - break - p_base = hit - src = "像素交工件面" - if p_base is None: - z_wp = self._surface_depth(depth_m, bbox) - p_base = self._cam_to_base(self._px_to_cam(bx, by, z_wp, intr)) - T_now = self._lookup(self.base_frame, self.ee_frame) - if T_now is not None: - Tee = T_now - gxy = self._gauge_xy(Tee) - err_xy = float(np.hypot(p_base[0] - gxy[0], p_base[1] - gxy[1])) - # 目标点先过**误检守卫**:宁可原地不动交给精定位,也不许按一个坏点横移。 - # 一阶段刚锁定时臂已经在工件上方,粗居中的合理位移是厘米级;出现 - # 十几厘米以上的"偏差"或盒外目标,只可能是反投影/检测坏了。 - why = self._coarse_target_reject(p_base, gxy) - if why: - self.get_logger().warn( - f"粗定位目标判误检({why})—— **不移动**,原地直进精定位:" - f"base=({p_base[0]:.3f},{p_base[1]:.3f})[{src}] " - f"夹爪=({gxy[0]:.3f},{gxy[1]:.3f}) 偏差={err_xy*1000:.1f}mm" - ) - break - coarse_tol = float(self._hole_cfg.get("coarse_tol_m", 0.006)) - self.get_logger().info( - f"工件 bbox={bbox} 中心=({bx:.0f},{by:.0f}) " - f"base=({p_base[0]:.3f},{p_base[1]:.3f})[{src}] " - f"夹爪=({gxy[0]:.3f},{gxy[1]:.3f}) " - f"偏差={err_xy*1000:.1f}mm" - ) - try: - import cv2 - - coarse_draw = bgr.copy() - cv2.rectangle(coarse_draw, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) - cv2.drawMarker(coarse_draw, (int(bx), int(by)), (0, 255, 0), cv2.MARKER_CROSS, 22, 2) - cv2.putText( - coarse_draw, f"coarse err={err_xy*1000:.1f}mm", - (16, 36), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, - ) - self._publish_overlay(coarse_draw) - except Exception: - pass - if err_xy <= coarse_tol or move_i >= self.coarse_max_moves: - break - tgt = np.array([ - Tee[0, 3] + (p_base[0] - gxy[0]), - Tee[1, 3] + (p_base[1] - gxy[1]), - self.hover_z, - ]) - self._state(f"coarse_move_{move_i}") - ok, q, Tee = self._goto( - q, Tee, tgt, verticalize=True, - tol_m=0.004, tol_tilt=self.vert_tol_rad * 2.0, tag="coarse", v=self.move_speed, - ) - self._pin(q) - if not ok: - self.get_logger().warn("粗居中未完全到位,继续精定位") - - # ---- 4) 精定位 k1/k2 + 对准目标孔 ---- - final: Dict[str, Any] = {} - xy_gain = 1.0 - last_good: Optional[Tuple[np.ndarray, np.ndarray, float, Dict[str, Any]]] = None - # 两孔中点的历史(本拍 = [-1],上一拍 = [-2],上上拍 = [-3]): - # 对准时工具在动、孔位也会被"追"着动,唯一**不该动**的是两孔中点 —— - # 它一动就说明工件在动,而工件只会被工具推走(见 gauge_fsm.drag_verdict)。 - mids: List[Tuple[float, float]] = [] - for it in range(self.align_max_iters + 1): - self._state(f"snap_fine_{it}") - bgr, depth_m, intr, res = self._snap_holes(skip_center_gate=True) - draw = res.get("draw_img", bgr) - if not res.get("status"): - self._publish_overlay(draw) - if last_good is not None and last_good[2] <= 0.00085: - self.get_logger().warn( - f"复拍丢孔({res.get('msg')}),通止规可能挡住目标孔,沿用上一拍残差 {last_good[2]*1000:.2f}mm" - ) - q, Tee = last_good[0], last_good[1] - final = dict(last_good[3]) - final["ok"] = True - self._pin(q) - self._state("aligned") - break - self.get_logger().error(f"k1/k2 检测失败: {res.get('msg')}") - if it >= self.align_max_iters: - return 4, q, Tee, final if final else {} - continue - pts = res["hole_points"] # 按图像 x 排序: [左, 右] - radii = res["hole_radii"] - bbox_l = res.get("bbox") or [0, 0, bgr.shape[1], bgr.shape[0]] - proj = None - hb = res.get("hole_base") - hz = res.get("hole_z") or [None, None] - z_wp_s = float(res.get("z_wp") or 0.0) - if hb is not None and len(hb) == 2 and hz[0] is not None and hz[1] is not None and z_wp_s > 0.0: - proj = { - "left_b": np.asarray(hb[0], dtype=float), - "right_b": np.asarray(hb[1], dtype=float), - "z_left": float(hz[0]), - "z_right": float(hz[1]), - "z_wp": z_wp_s, - } - if proj is None: - proj = self._project_holes(depth_m, pts, radii, bbox_l, intr) - if proj is None: - self.get_logger().error( - "孔心像素没交到工件面" if self.hole_visual_only else "孔深度/手眼投影失败" - ) - if it >= self.align_max_iters: - return 4, q, Tee, {} - continue - left_b, right_b = proj["left_b"], proj["right_b"] - z_left, z_right, z_wp = proj["z_left"], proj["z_right"], proj["z_wp"] - k1_b, k2_b = (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) - pair_d = float(np.hypot(k1_b[0] - k2_b[0], k1_b[1] - k2_b[1])) - if pair_d < 0.032 or pair_d > 0.085: - self.get_logger().warn( - f"两孔基座间距 {pair_d*1000:.1f}mm 不像 k1/k2(期望 32–85mm),丢弃本拍" - ) - if it >= self.align_max_iters: - return 4, q, Tee, final if final else {} - continue - tgt_b = k1_b if self.target_hole == "k1" else k2_b - - Tee_now = self._lookup(self.base_frame, self.ee_frame) - if Tee_now is not None: - Tee = Tee_now - # ---- 工具位置取"视觉规尖",不是"法兰轴线"-------------------- - # 见 _tip_offset_from_depth / _refresh_tip_offset:规可偏出法兰轴线 ~10mm, - # 把法兰对到孔上等于把规偏着对过去。偏移量准一次后冻结(刚体量)。 - tip_src = "法兰+偏置" - if self.tip_vision and self._tip_off is None: - off, tlen, why = self._tip_offset_from_depth( - depth_m, intr, Tee, z_wp_cam=float(z_wp) - ) - if off is not None and tlen is not None: - self._tip_samp.append((off, tlen)) - self._refresh_tip_offset() - if self.hole_keypoint_once and self._tip_off is None: - self._tip_off = np.asarray(off, dtype=float).reshape(2) - self._tip_len_m = float(tlen) - self.get_logger().warn( - f"单次精拍凑不满 tip_calib_n={self.tip_calib_n},本帧规尖偏移 " - f"({off[0]*1000:+.1f},{off[1]*1000:+.1f})mm 仅用于这一步,未冻结" - ) - tip_src = ( - f"视觉规尖(校准中 n={len(self._tip_samp)} {why})" - if (self._tip_off is None or ( - self.hole_keypoint_once and len(self._tip_samp) < self.tip_calib_n - )) - else "视觉规尖(已冻结)" - ) - if self.hole_keypoint_once and self._tip_off is not None: - tip_src = ( - "视觉规尖(已冻结)" - if len(self._tip_samp) >= self.tip_calib_n - else "视觉规尖(单次精拍·本帧)" - ) - else: - self.get_logger().warn(f" 规尖视觉量取失败:{why}") - elif self._tip_off is not None: - tip_src = "视觉规尖(已冻结)" - if self._tip_off is not None: - gxy = np.array( - [Tee[0, 3] + self._tip_off[0], Tee[1, 3] + self._tip_off[1]] - ) - else: - gxy = self._gauge_xy(Tee) - if self.tip_vision and self._tip_off is None and len(self._tip_samp) == 0: - self.get_logger().warn( - " 规尖还没量到,本拍先用法兰+偏置兜着 —— 此时可能对的是法兰不是规" - ) - err = float(np.hypot(tgt_b[0] - gxy[0], tgt_b[1] - gxy[1])) - - final = { - "ok": err <= self.align_tol, - "arm": self.prefix.rstrip("_"), - "target_hole": self.target_hole, - "k1_base_m": [round(float(v), 5) for v in k1_b], - "k2_base_m": [round(float(v), 5) for v in k2_b], - "k1_px": [round(float(pts[0][0]), 1), round(float(pts[0][1]), 1)], - "k2_px": [round(float(pts[1][0]), 1), round(float(pts[1][1]), 1)], - "workpiece_surface_z_m": round(z_wp, 4), - "hole_z_m": [round(z_left, 4), round(z_right, 4)], - "gauge_xy_m": [round(float(gxy[0]), 5), round(float(gxy[1]), 5)], - "gauge_source": tip_src, - "tip_offset_m": ( - [round(float(self._tip_off[0]), 5), round(float(self._tip_off[1]), 5)] - if self._tip_off is not None - else None - ), - "tip_len_m": (round(self._tip_len_m, 5) if self._tip_len_m else None), - "residual_mm": round(err * 1000.0, 2), - "hover_z_m": round(float(Tee[2, 3]), 4), - "iter": it, - "snap_frames": int(res.get("snap_frames") or 1), - "residual_remeasured": False, - } - final = self._stamp_bias(final, tgt_b=tgt_b, gxy=gxy, tag=f"fine {it}") - snap0 = { - "tag": final.get("tag"), - "residual_mm": final.get("residual_mm"), - "err_xy_m": final.get("err_xy_m"), - "along_look_mm": final.get("along_look_mm"), - "along_right_mm": final.get("along_right_mm"), - "k1_base_m": final.get("k1_base_m"), - "k2_base_m": final.get("k2_base_m"), - "k1_px": final.get("k1_px"), - "k2_px": final.get("k2_px"), - "gauge_xy_m": final.get("gauge_xy_m"), - "gauge_source": final.get("gauge_source"), - "tip_offset_m": final.get("tip_offset_m"), - "hover_z_m": final.get("hover_z_m"), - "workspace_clipped": final.get("workspace_clipped"), - } - snaps = list(final.get("snaps") or []) - snaps.append(snap0) - final["snaps"] = snaps - self.get_logger().info( - f"[fine {it}] k1=({k1_b[0]:.4f},{k1_b[1]:.4f}) k2=({k2_b[0]:.4f},{k2_b[1]:.4f}) " - f"zL={z_left*1000:.0f} zR={z_right*1000:.0f}mm " - f"工具=({gxy[0]:.4f},{gxy[1]:.4f})[{tip_src}] " - f"残差={err*1000:.2f}mm (tol {self.align_tol*1000:.1f})" - ) - - # ---- 工件被推走的看门狗 ----------------------------------------- - # 为什么放在"打印之后、动手之前":这一拍的数据已经完整,判出来就 - # 立刻停,不再多推一下(每多推一下工件就多走十几毫米,而它已经 - # 离开孔位了,后面的每一拍都在追一个被自己推着走的目标)。 - mid_now = ( - float(k1_b[0] + k2_b[0]) / 2.0, - float(k1_b[1] + k2_b[1]) / 2.0, - ) - dragged, d_mid = drag_verdict( - mid_now, - mids[-1] if len(mids) >= 1 else None, - mids[-2] if len(mids) >= 2 else None, - ) - mids.append(mid_now) - if dragged: - tool_mm = 0.0 - if last_good is not None: - _g0 = last_good[3].get("gauge_xy_m") or [] - if len(_g0) == 2: - tool_mm = math.hypot(gxy[0] - float(_g0[0]), gxy[1] - float(_g0[1])) * 1000.0 - self.get_logger().error( - f"工件被工具推走了:两孔中点两拍之间挪了 {d_mid*1000:.1f}mm" - f"(同期工具只走了 {tool_mm:.1f}mm)—— 对准闭环追的孔位长在工件上," - f"工件一走,孔位就跟着工具走、残差恒定不收敛。\n" - f" 这**不是**手眼标定/检测的问题(那两样坏了不会让工件移动)。" - f"按下面顺序查:\n" - f" ① 悬停时工具尖端是不是已经进了工件:法兰 z={Tee[2, 3]:.4f} − " - f"工具长(site.yaml 的 gauge_assembly.tool_tip_below_flange_m)" - f" 要高于工件上表面 z={z_wp:.4f};\n" - f" ② 工具长是**实测**的吗(真机夹上规后读 TF;仿真里 " - f"scripts/sim_load_gauge.py 会打印实测值);装夹位置一变它就变;\n" - f" ③ 装夹后规有没有下滑(仿真里合爪后规会落到落座位置," - f"下滑量直接加在工具长上)。" - ) - self._publish_overlay(draw) - self._publish_result(final) - return 6, q, Tee, final - - # 在叠图上标目标孔 + 写基座坐标 - try: - import cv2 - - tgt_px = pts[0] if (self.target_hole == "k1") == (self.k1_label == "left") else pts[1] - cv2.drawMarker( - draw, (int(tgt_px[0]), int(tgt_px[1])), (255, 0, 255), - cv2.MARKER_TILTED_CROSS, 26, 3, - ) - cv2.putText( - draw, - f"{self.target_hole} res={err*1000:.2f}mm z={z_wp:.3f}m", - (16, int(draw.shape[0]) - 20), - cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 255), 2, - ) - except Exception: - pass - self._publish_overlay(draw) - self._publish_result(final) - - if self.hole_keypoint_once: - commanded_mm = round(err * 1000.0, 2) - if self._tip_off is None and self.tip_vision: - self.get_logger().error( - "单次精拍没量到规尖,这一步对的是法兰。align_trusted=false," - "仍走一次并下降,方便目视;不把法兰对上说成成功" - ) - final["ok"] = False - final["align_trusted"] = False - final["fail_reason"] = "未量到规尖偏移,工具位置退化为法兰轴线" - q, Tee, _moved = self._oneshot_align_move(q, Tee, tgt_b, gxy, err) - final["commanded_residual_mm"] = commanded_mm - if self.hole_once_lock_xy_descend: - final["residual_remeasured"] = False - final["lock_xy_descend"] = True - if self._tip_off is not None: - final["ok"] = True - self.get_logger().warn( - f"视线前馈斜线:悬停指令 {commanded_mm:.2f}mm 已走," - "不补拍。下一步按 k×下降收 XY,一条 MoveL 到贴面。" - "residual_mm 仍是走之前那一拍,不是贴面复测" - ) - else: - q, Tee, final = self._observe_holes( - q, Tee, final, tag="走后核验" - ) - if not final.get("residual_remeasured"): - self.get_logger().error( - f"走后核验没复测到。开环指令残差 {commanded_mm:.2f}mm," - "不是 hop 到位,不把这次当对准成功" - ) - final["ok"] = False - self.get_logger().info( - f"单次精拍悬停走完:指令 {commanded_mm:.2f}mm → " - f"复测 {final.get('residual_mm')}mm;下降后还要补交平面漂的那几毫米" - ) - self._state("aligned") - break - - if err <= self.align_tol: - if self.tip_vision and self._tip_off is None: - # 容差达标了,但这一拍的"工具位置"其实是**法兰**(退路了)—— - # 对的是法兰不是规,δ 就是那个 ~10mm 的装夹偏置。2026-10-08 真机 - # 就出现过:tip_offset_m=None、残差 0.15mm 看着漂亮,其实法兰 - # 压在 k1 上、规尖偏出 ~11mm。**不许把没做到说成做到**。 - self.get_logger().error( - f"残差 {err*1000:.2f}mm 达标,但规尖偏移一直没量到(用的是法兰轴线)" - " —— 这个结果不可信:对的可能是法兰、不是规。" - "判失败,摆到能看清规尖再跑(别按这个结果下降)" - ) - final["ok"] = False - final["align_trusted"] = False - final["fail_reason"] = "未量到规尖偏移,工具位置退化为法兰轴线" - self._publish_result(final) - return 8, q, Tee, final - self._state("aligned") - break - if last_good is not None: - q_g, tee_g, prev_err, prev_final = last_good - if err > prev_err + 0.00025 and prev_err <= 0.0010: - self.get_logger().warn( - f"残差变差 {prev_err*1000:.2f}→{err*1000:.2f}mm,退回上一拍" - ) - self._pin(q_g) - q, Tee = q_g, tee_g - final = dict(prev_final) - final["ok"] = prev_err <= max(self.align_tol, 0.0008) - self._state("aligned") - break - last_good = (q.copy(), Tee.copy(), err, dict(final)) - if it >= self.align_max_iters: - if err <= 0.00085: - final["ok"] = True - self.get_logger().warn( - f"残差 {err*1000:.2f}mm 略大于 tol {self.align_tol*1000:.1f}mm,按到位接受" - ) - self._state("aligned") - break - self.get_logger().error( - f"迭代 {it + 1} 次后残差仍 {err*1000:.2f}mm > tol。检查手眼/相机安装,或放宽 align_tol_m。" - ) - return 5, q, Tee, final - - raw = np.array([tgt_b[0] - gxy[0], tgt_b[1] - gxy[1]]) - n_raw = float(np.linalg.norm(raw)) - max_step = 0.012 if n_raw > 0.025 else 0.018 - step = raw * xy_gain - n_step = float(np.linalg.norm(step)) - if n_step > max_step and n_step > 1e-9: - step = step * (max_step / n_step) - self.get_logger().info( - f" 对准步长封顶 {n_raw*1000:.1f}→{max_step*1000:.0f}mm,避免冲出视野" - ) - move = np.array([ - Tee[0, 3] + step[0], - Tee[1, 3] + step[1], - self.hover_z, - ]) - hop_tol = 0.00022 if err < 0.003 else max(0.0003, min(0.0005, 0.25 * err)) - hop_v = self.align_speed if err > 0.005 else min(self.align_speed, 0.016) - self._state(f"align_move_{it}") - gxy_before = gxy.copy() - ok, q, Tee = self._goto( - q, Tee, move, verticalize=True, - tol_m=hop_tol, tol_tilt=self.vert_tol_rad * 2.0, - tag="align", v=hop_v, - max_hops=8, settle_s=max(0.35, self.settle_sec), - min_dur=0.35, strict_xy=True, - ) - self._pin(q) - gxy_after = self._gauge_xy(Tee) - ach = gxy_after - gxy_before - n_cmd = float(np.linalg.norm(step)) - n_ach = float(np.linalg.norm(ach)) - if n_ach > 0.00025 and n_cmd > 0.00025: - ratio = n_cmd / n_ach - # 允许增益<1:实测过移动(ratio<1)时降增益收敛不冲;欠移动时升增益补到位 - xy_gain = float(np.clip(0.55 * xy_gain + 0.45 * ratio, 0.60, 1.40)) - self.get_logger().info( - f" xy_gain={xy_gain:.2f} 指令 {n_cmd*1000:.2f}mm 实走 {n_ach*1000:.2f}mm" - ) - if not ok: - self.get_logger().warn("对准移动未完全到位,复拍核验") - - # ---- 4.5) 柔顺轻降到孔面上方 1-2mm(不接触)---- - # 下降量由**几何**决定(法兰 FK − 工具长 − 工件面 − final_gap),深度读数只 - # 做交叉核对,见 _descend_above_hole 的说明。 - if self.hole_keypoint_once and self.hole_once_lock_xy_descend: - # 视线前馈斜线:不经过观察高、不补交。一条 MoveL 收到贴面。 - lock_gap = ( - self.final_gap_m if self.final_descent_enable else self.observe_gap_m - ) - okd, q, Tee = self._once_ff_diagonal_to_gap( - q, Tee, target_gap_m=lock_gap - ) - elif self.hole_keypoint_once: - # 先降到观察高(约 15mm)再交孔;贴面由补孔斜线一步完成,不再 4mm 切到 2mm。 - okd, q, Tee = self._descend_above_hole( - q, Tee, - target_gap_m=self.observe_gap_m, - step_m=ONCE_APPROACH_STEP_M, - ) - else: - okd, q, Tee = self._descend_above_hole(q, Tee) - if not okd: - self.get_logger().warn("轻降未完全到位,保持当前高度(安全优先)") - if self.hole_keypoint_once and self.hole_once_lock_xy_descend: - tip_len = float(self.tool_tip_below_flange_m) - surf = float(self.surface_z_m) - if tip_len > 0.0 and surf > 0.0: - self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf - elif self.hole_keypoint_once: - # 悬停那一拍的基座 XY 不能带到观测高:前倾 30°,降 50mm 交点会漂约 4mm。 - # 核验记账后补 XY;规尖沿用悬停冻结值,不在观测高度重测。 - q, Tee, final = self._observe_holes(q, Tee, final, tag="降后核验") - q, Tee, final = self._trim_xy_after_descent(q, Tee, final) - tip_len = float(self.tool_tip_below_flange_m) - surf = float(self.surface_z_m) - if tip_len > 0.0 and surf > 0.0: - self.descent_final_gap_m = float(Tee[2, 3]) - tip_len - surf - elif okd: - # 悬停残差在下降 60mm 之后会变大约 2mm(相机 30°,同一孔两个高度 - # 反投影对不齐)。在观测高度重测规尖,只补 XY。 - q, Tee, final = self._trim_xy_after_descent(q, Tee, final) - # 如实汇报**实际**间隙(几何量)——不是把目标值念一遍。停在离面 50mm 时 - # 也显示 ~50mm,现场才看得出"轻降没做到"(R1.1:不许把没做到说成做到)。 - gap_txt = ( - f"{self.descent_final_gap_m * 1000:.1f}" - if self.descent_final_gap_m is not None - else f">{self.final_gap_m * 1000:.1f}(未能测得/未下降)" - ) - - # ---- 5) 锁定保持 ---- - # 贴面之后就停在这个法兰 Z。没有接触传感器,到位只认 final_gap_mm - # (规尖离面)。三阶段开局会抬回悬高,这里标明已经插到位,流水线不再上抬。 - if ( - self.descent_final_gap_m is not None - and self.final_descent_enable - and not self.hover_only - ): - final = dict(final) - final["insert_held"] = True - final["flange_z_m"] = round(float(Tee[2, 3]), 4) - final["tip_gap_mm"] = round(float(self.descent_final_gap_m) * 1000.0, 2) - final["commanded_gap_mm"] = round(float(self.final_gap_m) * 1000.0, 2) - final["insert_z_source"] = "final_gap_mm" - self._state("hold") - q_fin = self._q() - self._pin(q_fin if q_fin is not None else q) - if final.get("insert_held"): - self.get_logger().info( - f"=== 二阶段定位完成: {self.target_hole} 残差 {final.get('residual_mm', -1)}mm," - f"法兰 Z={final.get('flange_z_m')}m,规尖离面 {gap_txt}mm" - f"(final_gap {self.final_gap_m * 1000:.1f}mm,无接触传感器)。" - "停在这一高度,不抬回悬高。" - f"结果: /stage2/result, /tmp/stage2_result.json ===" - ) - else: - self.get_logger().info( - f"=== 二阶段定位完成: {self.target_hole} 残差 {final.get('residual_mm', -1)}mm," - f"规尖悬在孔面上方 ≈{gap_txt}mm(不接触)。" - f"结果: /stage2/result, /tmp/stage2_result.json ===" - ) - return 0, q_fin if q_fin is not None else q, Tee, final - - def _linger_hold(self, final: Dict[str, Any], seconds: Optional[float] = None) -> None: - """单独跑二阶段时的保持窗口;串联时跳过,立刻进三阶段。""" - sec = self.linger_sec if seconds is None else float(seconds) - if sec <= 0.0: - return - t_end = time.monotonic() + sec - while time.monotonic() < t_end and rclpy.ok(): - if final: - self._publish_result(final) - if self._last_overlay is not None: - self._publish_overlay(self._last_overlay) - self._spin(0.3) - - -def main(args=None) -> None: - rclpy.init(args=args) - node = Stage2Locate() - code = 2 - try: - code = node.run() - except KeyboardInterrupt: - pass - except Exception as exc: # noqa: BLE001 - node.get_logger().error(f"stage2 异常终止: {exc}") - code = 2 - finally: - try: - q = node._q() - if q is not None: - node._pin(q) - except Exception: - pass - try: - node._shutdown_tf() - except Exception: - pass - try: - node.destroy_node() - except Exception: - pass - try: - if rclpy.ok(): - rclpy.shutdown() - except Exception: - pass - raise SystemExit(code) - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/stage3_search_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/stage3_search_node.py deleted file mode 100644 index acf1a50..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/stage3_search_node.py +++ /dev/null @@ -1,1127 +0,0 @@ -#!/usr/bin/env python3 -"""Stage-3 柔顺搜孔(Orisys 指垫触觉为主,腕部 F/T 看门狗,D405 可复拍)。 - -二阶段已把通止规轴线对准目标孔并悬停锁定。本阶段做**柔顺搜孔 + 对准确认**: - - 1. verify — 位姿核验(垂直朝下,必要时再垂直化);触觉话题判活 - 2. approach — 小步下降,fnormal 超过触面阈值判定触面,记 z_contact - 3. seat — Z 力闭环建立轻触(fn ≈ 触面阈值 + press_delta) - 4. spiral — 阿基米德螺旋搜孔:XY 沿螺旋走,Z 由力闭环维持轻触; - fnormal 相对接触均值跌落 drop_ratio 持续 N 帧 → 尖端入孔 - 5. center — 入孔点十字微扫,剪切力最小点 = 孔心(center_scan 可关) - 6. insert — 力限下压 insert_depth_mm;screw_pitch_mm≠0 时按螺距同步 - 绕世界 Z 旋入(螺纹通止规;>0 右旋 / <0 左旋)。0 = 只落座 - 7. hold — 锁定关节,发布 /stage3/result(JSON) - -安全(任一触发立即抬升中止): - - Orisys fnormal > 静止均值 + safe_press_delta;切向 > 静止均值 + shear_delta 自动微抬减拖 - - 腕部 F/T |F| > ft_safe_n(//flexiv_robot_states,订阅不到则只警告) - - 触觉话题断流 > tactile_timeout_s - -力单位说明:Orisys 读数是形变**任意单位**(非牛顿),且夹持基线会漂移。 -所以节点启动时自动测 ~1.2s 静止均值 μ0/方差 σ0,所有阈值都是相对 μ0 的 -增量(touch_delta / press_delta / safe_press_delta…),见 site.yaml → -hole_detect.stage3。调参先看日志里打印的「触觉基线/派生阈值」两行。 - -前置:先跑通二阶段(run_stage2_locate.sh --arm 89),臂保持悬停不动。 -用法:bash ~/ros2/scripts/run_stage3_search.sh --arm 89 [--hole k1] [--depth 2] [--pitch 1.0] -""" - -from __future__ import annotations - -import json -import math -import time -from pathlib import Path -from typing import Any, Dict, List, Optional, Sequence, Tuple - -import numpy as np -import rclpy -from std_msgs.msg import String - -from arm_application.geom_ik import dls_twist -from arm_application.site_io import load_site_dict -from arm_application.stage2_locate_node import Stage2Locate, _pt - -try: - from arm_msgs.msg import TactileStatus -except Exception: # pragma: no cover - TactileStatus = None # type: ignore - -try: - from flexiv_msgs.msg import RobotStates -except Exception: # pragma: no cover - RobotStates = None # type: ignore - -from trajectory_msgs.msg import JointTrajectory - - -# ==================== 纯逻辑(可离线单测) ==================== - -#: 触觉帧"够新"的窗口 [s]:比它更久没更新就认为这一侧没数据。 -TACTILE_MAX_AGE_S = 0.4 - - -def live_tactile( - now: float, pairs: Sequence[Any], max_age_s: float = TACTILE_MAX_AGE_S -) -> List[Any]: - """挑出这一轮**可用**的触觉帧。``pairs`` 是每侧一个 ``(收到时刻, msg)``。 - - 判据只有两条:**够新** + ``connected=true``。 - - ⚠️ 不要拿力的**幅值**当"传感器活着"的代理(曾经写的是 ``|fnormal| > 1.0``): - 静止时读数本来就是 0 —— 空手、还没接触、或者读数本身就是形变任意单位 - (Orisys 的量纲)—— 于是 S07 一进柔顺下压就报"触觉断流(左右指都无新鲜 - 数据)",而话题其实以 19Hz 在发、``connected`` 也是 true。 - 上下游的契约在 ``sim_tactile_adapter`` 里写得很清楚: - "没数据"发零 **且** ``connected=false``;"零力"是 ``connected=true``。 - """ - out: List[Any] = [] - for pair in pairs or (): - if pair is None: - continue - t, msg = pair - if now - float(t) < max_age_s and bool(getattr(msg, "connected", False)): - out.append(msg) - return out - - -def tactile_timeout_reason(pairs: Sequence[Any], timeout_s: float) -> str: - """触觉等超时了 → 给一句**照着就能修**的话。 - - 两种"没数据"现象一样(都是等不到可用帧),修法却完全不同: - · 有帧到、但 ``connected=false`` → 驱动在跑,设备/SDK 那边的问题; - · 一帧都没到 / 帧全过期 → 话题或驱动根本没在发。 - 以前共用一句"断流(左右指都无新鲜数据)",于是"设备没连上"被读成 - "话题没起来",查错方向。 - """ - seen = [p for p in (pairs or ()) if p is not None] - if seen and not any(bool(getattr(m, "connected", False)) for _t, m in seen): - return ( - f"触觉帧有到但 connected=false(驱动在跑、设备没连上;已等 {timeout_s:.1f}s)" - f"——看 /tmp/stage3_tactile.log,或先跑 " - f"bash ~/ros2/scripts/run_tactile.sh --cli 验证" - ) - return f"触觉话题断流 >{timeout_s:.1f}s(左右指都无新鲜数据)" - - -def should_lift_air_baseline( - z_now_m: float, z_air_m: float, *, tactile_live: bool -) -> bool: - """空载抬升只在触觉已经在发、并且当前低于空载高度时做。 - - 触觉没数据时先抬到 hover+50mm 再报断流,等于插孔做到一半把臂送回锁高。 - """ - if not tactile_live: - return False - return float(z_now_m) < float(z_air_m) - 0.008 - -def spiral_points( - cx: float, cy: float, pitch_mm: float, step_mm: float, r_max_mm: float -) -> List[Tuple[float, float]]: - """阿基米德螺旋 r = pitch·θ/2π,弧长步长 ≈ step_mm,覆盖半径 r_max_mm。 - cx/cy 与返回点都是【米】(基座系);pitch/step/r_max 是【毫米】,内部换算。""" - pts: List[Tuple[float, float]] = [] - if pitch_mm <= 0.0 or step_mm <= 0.0 or r_max_mm <= 0.0: - return pts - theta = step_mm / max(0.5 * pitch_mm, 1e-3) - while True: - r = pitch_mm * theta / (2.0 * math.pi) - if r > r_max_mm: - break - pts.append((cx + r / 1000.0 * math.cos(theta), cy + r / 1000.0 * math.sin(theta))) - theta += step_mm / max(r, 0.5 * pitch_mm) - return pts - - -class DropDetector: - """尖端入孔判据:接触建立后 fnormal 相对接触均值(慢EMA)跌落 drop_ratio,持续 frames 帧。 - - 判定用原始 fnormal(响应快,20Hz 下 2 帧=0.1s);接触均值用慢 EMA 跟踪, - 毛刺靠连续帧数抑制。 - """ - - def __init__(self, drop_ratio: float, frames: int, alpha: float = 0.15) -> None: - self.drop_ratio = float(drop_ratio) - self.frames = int(frames) - self.alpha = float(alpha) - self.contact_avg: Optional[float] = None - self.last: Optional[float] = None - self._low = 0 - - def update(self, fn: float, in_contact_band: bool) -> bool: - self.last = fn - if self.contact_avg is None: - if in_contact_band: - self.contact_avg = fn - return False - dropping = fn < self.contact_avg * (1.0 - self.drop_ratio) - # 接触均值只在「实接触且未跌落」时更新,避免入孔后的低力把基线拖下去。 - # 跌落相对接触均值判定,不要求掉到 touch 阈值以下(否则半入孔检测不到)。 - if in_contact_band and not dropping: - self.contact_avg = self.alpha * fn + (1.0 - self.alpha) * self.contact_avg - self._low = 0 - return False - if dropping: - self._low += 1 - else: - self._low = 0 - return self._low >= self.frames - - -class SearchAbort(Exception): - def __init__(self, msg: str, code: int = 6) -> None: - super().__init__(msg) - self.code = code - - -# ==================== 节点 ==================== - -class Stage3Search(Stage2Locate): - def __init__(self, node_name: str = "stage3_search") -> None: - super().__init__(node_name=node_name) - - self.declare_parameter("insert_depth_mm", -1.0) # >=0 覆盖 site - self.declare_parameter("screw_pitch_mm", -999.0) # ≠-999 覆盖 site - self.declare_parameter("spiral_r_max_mm", -1.0) # >0 覆盖 site - self.declare_parameter("resnap", False) # 搜孔前用 D405 复拍对准一次 - - s3 = dict((load_site_dict().get("hole_detect") or {}).get("stage3") or {}) - - def ov(name: str, key: str, default: float) -> float: - v = float(self.get_parameter(name).value) - return v if v != (-1.0 if name != "screw_pitch_mm" else -999.0) else float( - s3.get(key, default) - ) - - # Orisys 读数是形变任意单位(非牛顿),且夹持基线会漂移。 - # 所有力阈值都是「相对静止均值的增量」,节点启动时自动测静止均值/方差。 - self.touch_delta = float(s3.get("touch_delta", 250.0)) # 触面:> μ0+max(4σ0, 本值) - self.press_delta = float(s3.get("press_delta", 400.0)) # 轻触目标按压量(触面阈值之上) - self.max_press_delta = float(s3.get("max_press_delta", 900.0)) # 螺旋中超过→力闭环抬起 - self.safe_press_delta = float(s3.get("safe_press_delta", 2000.0)) # 立即中止 - self.shear_delta = float(s3.get("shear_delta", 600.0)) # 切向拖拽保护(静止切向均值之上) - self.insert_press_delta = float(s3.get("insert_press_delta", 1200.0)) # 插入力上限 - self.kp_z_mm = float(s3.get("kp_z_mm_per_unit", 0.001)) # Z 力闭环增益 mm/单位 - self.approach_step_mm = float(s3.get("approach_step_mm", 1.5)) - self.approach_max_mm = float(s3.get("approach_max_mm", 25.0)) - # 触面深于这个值 = 通止规可能直接滑进孔里(工件面不会比悬停低这么多) - self.enter_probe_mm = float(s3.get("enter_probe_mm", 2.0)) - # 直接入孔后抬这个高度到孔口倒角段定心(避免深插横探别死孔壁) - self.mouth_lift_mm = float(s3.get("mouth_lift_mm", 2.0)) - # 触觉基线健康窗(Orisys 任意单位;窗外 = tare 异常/近饱和) - self.baseline_min = float(s3.get("baseline_min", 8.0)) - self.baseline_max = float(s3.get("baseline_max", 1500.0)) - # approach 的腕部 F/T 旁路触面判据(牛顿,标定量;自由空气 |F|≈2-3N) - self.approach_ft_touch_n = float(s3.get("approach_ft_touch_n", 6.0)) - self.spiral_pitch_mm = float(s3.get("spiral_pitch_mm", 1.0)) - self.spiral_step_mm = float(s3.get("spiral_step_mm", 0.8)) - self.spiral_r_max_mm = ov("spiral_r_max_mm", "spiral_r_max_mm", 4.0) - self.spiral_expand_max = int(s3.get("spiral_expand_max", 2)) - self.spiral_expand_step_mm = float(s3.get("spiral_expand_step_mm", 2.0)) - self.drop_ratio = float(s3.get("drop_ratio", 0.45)) - self.drop_frames = int(s3.get("drop_frames", 2)) - self.center_scan = bool(s3.get("center_scan", False)) - self.center_scan_mm = float(s3.get("center_scan_mm", 0.3)) - self.insert_depth_mm = ov("insert_depth_mm", "insert_depth_mm", 2.0) - self.insert_retry = int(s3.get("insert_retry", 3)) - self.screw_pitch_mm = ov("screw_pitch_mm", "screw_pitch_mm", 0.0) - self.search_speed = float(s3.get("search_speed", 0.03)) - self.settle3 = float(s3.get("settle_sec", 0.25)) - self.tac_timeout = float(s3.get("tactile_timeout_s", 3.0)) - self.ft_watchdog = bool(s3.get("ft_watchdog", True)) - self.ft_safe_n = float(s3.get("ft_safe_n", 20.0)) - self.linger3 = float(s3.get("linger_sec", 8.0)) - self.resnap = bool(self.get_parameter("resnap").value) - - # 运行时自适应阈值(tactile_check 时测量填充) - self._fn_rest = 0.0 - self._fn_sigma = 0.0 - self._shear_rest = 0.0 - self._th_touch = 0.0 - self._th_target = 0.0 - self._th_max = 0.0 - self._th_safe = float("inf") - self._th_shear = float("inf") - self._th_insert = 0.0 - - tac = load_site_dict().get("tactile") or {} - self.tac_topic_l = str(tac.get("topic_left") or "/tactile/left/status") - self.tac_topic_r = str(tac.get("topic_right") or "/tactile/right/status") - - # ---------------- ROS 接口 ---------------- - self._tac_l: Optional[Tuple[float, Any]] = None - self._tac_r: Optional[Tuple[float, Any]] = None - self._ft: Optional[Tuple[float, Any]] = None - if TactileStatus is not None: - self.create_subscription(TactileStatus, self.tac_topic_l, self._on_tac_l, 10) - self.create_subscription(TactileStatus, self.tac_topic_r, self._on_tac_r, 10) - sn_us = self.prefix.rstrip("_").replace("-", "_") - self.ft_topic = str(s3.get("ft_topic") or f"/{sn_us}/flexiv_robot_states") - if self.ft_watchdog and RobotStates is not None: - self.create_subscription( - RobotStates, self.ft_topic, self._on_robot_states, 10 - ) - - self._state_pub = self.create_publisher(String, "/stage3/state", 10) - self._result_pub = self.create_publisher(String, "/stage3/result", 10) - - self.get_logger().info( - f"stage3 arm_ee={self.ee_frame} target={self.target_hole}\n" - f" 触觉: {self.tac_topic_l} + {self.tac_topic_r} 看门狗: {self.ft_topic}\n" - f" 阈值(相对静止均值增量): touch=+{self.touch_delta:.0f} press=+{self.press_delta:.0f} " - f"max=+{self.max_press_delta:.0f} safe=+{self.safe_press_delta:.0f} shear=+{self.shear_delta:.0f}\n" - f" 螺旋: pitch={self.spiral_pitch_mm}mm step={self.spiral_step_mm}mm " - f"r_max={self.spiral_r_max_mm}mm expand×{self.spiral_expand_max}\n" - f" 插入: depth={self.insert_depth_mm}mm press=+{self.insert_press_delta:.0f} " - f"pitch={self.screw_pitch_mm}mm resnap={self.resnap}" - ) - - # ---------------- 传感器 ---------------- - - def _on_tac_l(self, msg: Any) -> None: - self._tac_l = (time.monotonic(), msg) - - def _on_tac_r(self, msg: Any) -> None: - self._tac_r = (time.monotonic(), msg) - - def _on_robot_states(self, msg: Any) -> None: - """缓存 ``flexiv_msgs/RobotStates``(腕部力看门狗的输入)。 - - ⚠️ 这个方法名**必须**与 ``Stage2Locate`` 里那个腕部 FT 的回调区分开。 - 2026-09-24 踩到:两者原先都叫 ``_on_ft``,子类的定义**静默覆盖**了父类的, - 而两个订阅都在 ``__init__`` 里建好了 —— 于是: - Stage2Locate 建的 WrenchStamped 订阅 → 实际进了这个 RobotStates 缓存; - ``_ft_fz`` 永远不写 → S07 打"腕部 FT 没有数据"(而话题数据是好的)。 - 真机上更阴:两个话题都存在,``self._ft`` 里 RobotStates 与 WrenchStamped - 交替被覆盖 → ``_ft_mag()`` 时有时无 → 看门狗时灵时不灵。 - 这类"同名覆盖 + 不报错"的坑,只要名字区分开就根除。 - """ - self._ft = (time.monotonic(), msg) - - def _tac_fresh(self, timeout_s: float = 1.0) -> Tuple[float, float, float, bool]: - """等新鲜触觉帧 → (fn_avg, fn_max, shear_max, contact_any)。 - 单侧可用即可(另一指掉线/未插时用健在侧继续,阈值相对同侧基线仍自洽)。 - - "可用"= **帧到了(0.4s 内)且 connected=true**,与幅值无关。 - 曾经这里写的是 ``|fnormal| > 1.0``(拿力的大小当"传感器活着"的代理), - 那条判据在**静止读数≈0** 时必然误判:空手、还没接触、或者读数本身就是 - 形变任意单位(Orisys 的量纲)—— 于是 S07 一进柔顺下压就报 - "触觉断流 >3.0s(左右指都无新鲜数据)",而话题其实以 19Hz 在发、 - ``connected`` 也是 true。仿真适配器早就把这两个概念分开了 - (没数据时发零 + ``connected=false``,见 sim_tactile_adapter), - 下游必须按同一条契约判"有没有数据"。 - """ - t0 = time.monotonic() - while time.monotonic() - t0 < timeout_s: - self._spin(0.02) - live = live_tactile(time.monotonic(), (self._tac_l, self._tac_r)) - if live: - fns = [float(m.fnormal) for m in live] - shear = max( - math.hypot(float(m.fshearx), float(m.fsheary)) for m in live - ) - return ( - sum(fns) / len(fns), max(fns), shear, - any(bool(m.contact) for m in live), - ) - # 超时了 —— 归因写在纯函数里(两条判据、两种修法,能被测试钉住) - raise SearchAbort( - tactile_timeout_reason((self._tac_l, self._tac_r), timeout_s), code=7 - ) - - def _ft_mag(self) -> Optional[float]: - if self._ft is None: - return None - t, msg = self._ft - if time.monotonic() - t > 0.5: - return None - try: - f = msg.ext_wrench_in_tcp.wrench.force - return math.sqrt(float(f.x) ** 2 + float(f.y) ** 2 + float(f.z) ** 2) - except Exception: - return None - - def _in_hole_probe( - self, q: np.ndarray, Tee: np.ndarray, z: float - ) -> Tuple[bool, np.ndarray, np.ndarray]: - """深触面后验证是否已直接滑进孔里:抬 0.8mm 卸载,±0.4mm 四向微探, - ≥2 个方向切向力飙升(顶到孔壁)= 在孔中。探完回到原位原深度。""" - cx, cy = float(Tee[0, 3]), float(Tee[1, 3]) - th = self._shear_rest + self.shear_delta - ok, q, Tee = self._step_to( - q, Tee, np.array([cx, cy, z + 0.0008]), "probe_lift", tol_m=0.0003 - ) - if not ok: - return False, q, Tee - hits = 0 - for dx, dy in ((0.4, 0.0), (-0.4, 0.0), (0.0, 0.4), (0.0, -0.4)): - ok, q, Tee = self._step_to( - q, Tee, - np.array([cx + dx / 1000.0, cy + dy / 1000.0, z + 0.0008]), - "probe", tol_m=0.0003, - ) - if not ok: - continue - _, _, sh, _ = self._tac_fresh(self.tac_timeout) - self.get_logger().info( - f" 微探 Δ=({dx:+.1f},{dy:+.1f})mm shear={sh:.0f}(壁阈 {th:.0f})" - ) - if sh > th: - hits += 1 - ok, q, Tee = self._step_to(q, Tee, np.array([cx, cy, z]), "probe_back", tol_m=0.0003) - self.get_logger().info(f" 微探命中 {hits}/4 向") - return hits >= 2, q, Tee - - def _guard(self, fn_max: float) -> None: - if fn_max > self._th_safe: - raise SearchAbort( - f"Orisys fnormal {fn_max:.0f} > 安全线 {self._th_safe:.0f}" - f"(静止 {self._fn_rest:.0f}+{self.safe_press_delta:.0f})" - ) - # 腕部 F/T 硬上限:连续 3 拍超限才中止(单拍毛刺/定心探边瞬态不敏感) - ft = self._ft_mag() - if ft is not None and ft > self.ft_safe_n: - self._ft_over = getattr(self, "_ft_over", 0) + 1 - if self._ft_over >= 3: - raise SearchAbort( - f"腕部F/T |F|={ft:.1f}N > 安全上限 {self.ft_safe_n}N(连续3拍)" - ) - else: - self._ft_over = 0 - - # ---------------- 输出 ---------------- - - def _state(self, s: str) -> None: # 覆盖:发到 /stage3/state - self.get_logger().info(f"[stage3] === {s} ===") - msg = String() - msg.data = s - self._state_pub.publish(msg) - - def _publish_result(self, payload: Dict[str, Any]) -> None: - # pipeline 继承本类:二阶段精对准也会走到这里,必须仍写 stage2 文件。 - if "k1_base_m" in payload or "residual_mm" in payload: - Stage2Locate._publish_result(self, payload) - return - msg = String() - msg.data = json.dumps(payload, ensure_ascii=False) - self._result_pub.publish(msg) - try: - Path("/tmp/stage3_result.json").write_text( - json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8" - ) - except Exception: - pass - - def _publish_overlay(self, bgr: np.ndarray) -> None: - Stage2Locate._publish_overlay(self, bgr) - if not self.preview: - return - try: - import cv2 - - cv2.imwrite("/tmp/stage3_overlay.png", bgr) - except Exception: - pass - - # ---------------- 运动 ---------------- - - def _step_to( - self, - q: np.ndarray, - Tee: np.ndarray, - target: np.ndarray, - tag: str, - tol_m: float = 0.0005, - max_hops: int = 2, - ) -> Tuple[bool, np.ndarray, np.ndarray]: - return self._goto( - q, Tee, target, verticalize=True, tol_m=tol_m, - tol_tilt=self.vert_tol_rad * 2.5, tag=tag, v=self.search_speed, - max_hops=max_hops, settle_s=max(0.06, self.settle3 * 0.3), min_dur=0.16, - ) - - def _unload_z( - self, - q: np.ndarray, - Tee: np.ndarray, - z_contact: float, - fn_limit: float, - ) -> Tuple[np.ndarray, np.ndarray, float]: - """纯 Z 上抬直到力回到轻触带,避免卡在工件里接着横扫。""" - z = float(Tee[2, 3]) - for _ in range(8): - fn_avg, _, _, _ = self._tac_fresh(self.tac_timeout) - if fn_avg <= fn_limit and z >= float(z_contact) - 0.0002: - return q, Tee, z - z = min(float(z_contact) + 0.0012, z + 0.0005) - ok, q, Tee = self._goto( - q, Tee, np.array([float(Tee[0, 3]), float(Tee[1, 3]), z]), - verticalize=True, tol_m=0.0004, tol_tilt=self.vert_tol_rad * 2.5, - tag="unload", v=self.search_speed, max_hops=1, hold_xy=True, - settle_s=0.08, min_dur=0.16, - ) - z = float(Tee[2, 3]) - if not ok: - break - return q, Tee, z - - def _clip_search_z(self, z: float, z_contact: float) -> float: - """搜孔法兰 Z 钉在触面附近:禁止切向抬升把规抬离工件空扫。""" - lo = float(z_contact) - 0.0025 - hi = float(z_contact) + 0.0010 - return float(min(hi, max(lo, z))) - - def _xy_to_ref( - self, q: np.ndarray, Tee: np.ndarray, ref_xy: Any - ) -> Tuple[bool, np.ndarray, np.ndarray, float]: - """把通止规 XY 平移到二阶段孔心,Z/姿态保持。""" - gxy = self._gauge_xy(Tee) - dx = float(ref_xy[0]) - float(gxy[0]) - dy = float(ref_xy[1]) - float(gxy[1]) - dist = float(math.hypot(dx, dy)) - if dist < 0.00025: - return True, q, Tee, dist - tgt = np.array([Tee[0, 3] + dx, Tee[1, 3] + dy, Tee[2, 3]]) - ok, q, Tee = self._goto( - q, Tee, tgt, verticalize=True, tol_m=0.0004, - tol_tilt=self.vert_tol_rad * 2.0, tag="goto_hole_xy", - v=0.03, max_hops=6, settle_s=0.18, min_dur=0.35, - ) - return ok, q, Tee, dist - - def _screw_hop( - self, q: np.ndarray, Tee: np.ndarray, dz_m: float, pitch_m: float - ) -> Tuple[bool, np.ndarray, np.ndarray]: - """螺纹旋入微步:Z 平移 dz 同时绕世界 Z 转 2π·dz/pitch(dz<0 下压=右旋拧入)。""" - p = Tee[:3, 3] - J = self._jacobian(p) - if J is None: - self.get_logger().error("缺 link TF,无法旋入") - return False, q, Tee - dpsi = 2.0 * math.pi * dz_m / pitch_m # dz<0 → 绕世界 -Z(俯视顺时针,右旋入) - w = np.array([0.0, 0.0, 1.0]) * (dpsi / 0.12) - v = np.array([0.0, 0.0, dz_m / 0.12]) - qdot = dls_twist(J, v, w_base=w, damping=0.08, max_qdot=0.35) - dq = np.clip(qdot * 0.12, -0.06, 0.06) - if float(np.max(np.abs(dq))) < 1e-5: - self.get_logger().warn("screw hop 规划停滞") - return False, q, Tee - traj = JointTrajectory() - traj.joint_names = list(self.joint_names) - traj.points = [_pt(q, np.zeros(7), 0.08), _pt(q + dq, np.zeros(7), 0.8)] - if not self._send_action(traj, wait_s=4.0): - return False, q, Tee - t_end = time.monotonic() + self.settle3 - while time.monotonic() < t_end: - self._spin(0.05) - q2, Tee2 = self._wait_state(2.0) - if q2 is None or Tee2 is None: - return False, q, Tee - return True, q2, Tee2 - - def _retract(self, q: np.ndarray, Tee: np.ndarray, dz_m: float = 0.005) -> None: - try: - tgt = Tee[:3, 3].copy() - tgt[2] += dz_m - self._goto(q, Tee, tgt, verticalize=True, tol_m=0.001, - tol_tilt=self.vert_tol_rad * 3.0, tag="retract", - v=0.03, max_hops=2, settle_s=0.2, min_dur=0.6, - hold_xy=True, z_up_only=True) - except Exception: - pass - - # ---------------- D405 复拍对准(可选) ---------------- - - def _resnap_align(self, q: np.ndarray, Tee: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: - from arm_application.hole_detect_hough import detect_holes - - self._state("resnap") - time.sleep(self.settle_sec) - bgr, depth_m, intr = self._grab() - res = detect_holes(bgr, self._det(), config=self._hole_cfg) - draw = res.get("draw_img", bgr) - self._publish_overlay(draw) - if not res.get("status"): - self.get_logger().warn(f"复拍检测失败({res.get('msg')}),按当前位姿继续搜孔") - return q, Tee - pts = res["hole_points"] - radii = res["hole_radii"] - bbox_l = res.get("bbox") or [0, 0, bgr.shape[1], bgr.shape[0]] - holes_px = [(pts[0][0], pts[0][1], radii[0]), (pts[1][0], pts[1][1], radii[1])] - z_wp = self._surface_depth(depth_m, tuple(bbox_l), holes=holes_px) - left_b = self._cam_to_base(self._px_to_cam(pts[0][0], pts[0][1], z_wp, intr)) - right_b = self._cam_to_base(self._px_to_cam(pts[1][0], pts[1][1], z_wp, intr)) - k1_b, k2_b = (left_b, right_b) if self.k1_label == "left" else (right_b, left_b) - tgt_b = k1_b if self.target_hole == "k1" else k2_b - gxy = self._gauge_xy(Tee) - err = float(np.hypot(tgt_b[0] - gxy[0], tgt_b[1] - gxy[1])) - self.get_logger().info(f"复拍: {self.target_hole}=({tgt_b[0]:.4f},{tgt_b[1]:.4f}) 残差={err*1000:.1f}mm") - if err > 0.001: - move = np.array([ - Tee[0, 3] + (tgt_b[0] - gxy[0]), - Tee[1, 3] + (tgt_b[1] - gxy[1]), - Tee[2, 3], - ]) - ok, q, Tee = self._goto( - q, Tee, move, verticalize=True, tol_m=0.0008, - tol_tilt=self.vert_tol_rad * 2.0, tag="resnap_align", v=self.align_speed, - max_hops=4, settle_s=0.3, - ) - self._pin(q) - if not ok: - self.get_logger().warn("复拍对准未完全到位,按当前位姿继续") - return q, Tee - - # ---------------- 主流程 ---------------- - - def run(self) -> int: - self._state("wait_state") - q, Tee = self._wait_state(10.0) - if q is None or Tee is None: - self.get_logger().error("拿不到 joint_states/TF —— 先跑 T1: run_real.sh --arm 89") - return 2 - if not self._cli.wait_for_server(timeout_sec=5.0): - self.get_logger().error("JTC action 不在 —— 控制器没起来") - return 2 - return self._run_search(q, Tee, linger=True) - - def _run_search( - self, q: np.ndarray, Tee: np.ndarray, linger: bool = True, - stage2_final: Optional[Dict[str, Any]] = None, - ) -> int: - t_start = time.monotonic() - result: Dict[str, Any] = {"ok": False, "stage": "stage3", "target_hole": self.target_hole} - try: - # 基线必须悬空测。二阶段结束在 hover≈触面+1mm,带载会把阈值抬飞。 - # 触觉没在发就原地中止,不许先抬到锁高再报断流。 - z_now = float(Tee[2, 3]) - z_air = float(self.hover_z) + 0.05 - self._spin(0.05) - tac_live = bool( - live_tactile(time.monotonic(), (self._tac_l, self._tac_r)) - ) - if not tac_live: - raise SearchAbort( - tactile_timeout_reason( - (self._tac_l, self._tac_r), float(self.tac_timeout) - ), - code=7, - ) - if should_lift_air_baseline(z_now, z_air, tactile_live=True): - self._state("air_baseline") - self.get_logger().info( - f"抬到 {z_air:.3f}m 测触觉空载基线(当前 Z={z_now:.3f})" - ) - ok, q, Tee = self._goto( - q, Tee, - np.array([float(Tee[0, 3]), float(Tee[1, 3]), z_air]), - verticalize=True, hold_xy=True, tag="air_baseline", - v=self.move_speed, max_hops=6, settle_s=0.20, min_dur=0.5, - tol_m=0.003, tol_tilt=self.vert_tol_rad * 2.0, - ) - if not ok: - self.get_logger().warn("空载抬升未完全到位,仍按当前高度测基线") - - self._state("tactile_check") - l_ok = r_ok = False - samples: List[Tuple[float, float]] = [] - t0 = time.monotonic() - while time.monotonic() - t0 < 2.2: - fn_avg, _, shear, _ = self._tac_fresh(self.tac_timeout) - if fn_avg > 1.0: - samples.append((fn_avg, shear)) - self._spin(0.05) - if len(samples) >= 10 and time.monotonic() - t0 >= 0.8: - break - if len(samples) < 6: - raise SearchAbort( - f"触觉有效样本不足 ({len(samples)}) —— 传感器刚重启或 tare 为 0,稍后再跑", - code=7, - ) - l_ok = bool(self._tac_l and getattr(self._tac_l[1], "connected", False)) - r_ok = bool(self._tac_r and getattr(self._tac_r[1], "connected", False)) - if not (l_ok or r_ok): - raise SearchAbort( - "触觉传感器未真正连接(SDK/设备异常)——看 /tmp/stage3_tactile.log," - "或先跑 bash ~/ros2/scripts/run_tactile.sh --cli 验证", code=7, - ) - if not (l_ok and r_ok): - self.get_logger().warn( - f"单指触觉模式:左={'OK' if l_ok else '掉线'} 右={'OK' if r_ok else '掉线'}" - "——力反馈只来自健在侧,阈值相对该侧基线,功能可用但灵敏度减半" - ) - fn_arr = np.array([s[0] for s in samples], dtype=float) - sh_arr = np.array([s[1] for s in samples], dtype=float) - # 中位数 + MAD:自由空气中偶发的夹持振动尖峰不再污染基线 - # (均值/标准差对尖峰敏感,曾把 touch 阈值推到真实触面之上) - self._fn_rest = float(np.median(fn_arr)) - self._fn_sigma = float(1.4826 * np.median(np.abs(fn_arr - self._fn_rest))) - self._shear_rest = float(np.median(sh_arr)) - # 基线合理性闸:Orisys 每次连接 tare 的零点是随机的—— - # μ≈0 是带载 tare(真实接触力被吃掉),μ>1500 是近饱和(接触余量不够)。 - # 两种都会让后续相对阈值失效,必须在下臂前拦住。 - if not (self.baseline_min <= self._fn_rest <= self.baseline_max): - raise SearchAbort( - f"触觉基线异常 μ={self._fn_rest:.0f}(健康范围 " - f"{self.baseline_min:.0f}~{self.baseline_max:.0f})——" - "零点漂移/带载 tare。请让通止规完全悬空后重启触觉服务再跑:" - "pkill -f tactile; pkill orisys_tac_w; ros2 launch arm_application tactile.launch.py", - code=7, - ) - self._th_touch = self._fn_rest + max(4.0 * self._fn_sigma, self.touch_delta) - self._th_target = self._th_touch + self.press_delta - self._th_max = self._th_touch + 2.0 * self.press_delta + max(4.0 * self._fn_sigma, 300.0) - self._th_safe = self._fn_rest + self.safe_press_delta - self._th_shear = self._shear_rest + self.shear_delta - self._th_insert = self._th_touch + self.insert_press_delta - self.get_logger().info( - f"触觉基线: fn μ={self._fn_rest:.0f} σ={self._fn_sigma:.0f} shear μ={self._shear_rest:.0f}\n" - f" 派生阈值: touch={self._th_touch:.0f} target={self._th_target:.0f} " - f"max={self._th_max:.0f} safe={self._th_safe:.0f} shear={self._th_shear:.0f} " - f"insert={self._th_insert:.0f}" - ) - if self.ft_watchdog and self._ft_mag() is None: - self.get_logger().warn(f"腕部F/T话题 {self.ft_topic} 无数据,仅用 Orisys 看门狗") - - # 垂直度核验 - _, ang = self._w_down(Tee[:3, :3]) - if ang > self.vert_tol_rad: - self._state("verticalize") - ok, q, Tee = self._goto( - q, Tee, Tee[:3, 3].copy(), verticalize=True, - tol_m=0.002, tol_tilt=self.vert_tol_rad, tag="verticalize", - v=0.04, max_hops=12, - ) - if not ok: - raise SearchAbort("垂直化未收敛", code=2) - _, ang = self._w_down(Tee[:3, :3]) - self.get_logger().info(f"垂直度 OK: 残余倾角 {math.degrees(ang):.2f}deg") - - # 参考:二阶段结果(内存优先,避免 /tmp 读写失败把孔位丢掉) - ref_xy = None - src = stage2_final if isinstance(stage2_final, dict) else None - if src is None: - try: - src = json.loads(Path("/tmp/stage2_result.json").read_text(encoding="utf-8")) - except Exception: - src = None - residual_mm: Optional[float] = None - if src: - ref_xy = src.get(f"{self.target_hole}_base_m") or src.get("k1_base_m") - try: - rv = src.get("residual_mm") - residual_mm = float(rv) if rv is not None else None - except (TypeError, ValueError): - residual_mm = None - if ref_xy: - extra = f" 残差 {residual_mm:.2f}mm" if residual_mm is not None else "" - self.get_logger().info( - f"二阶段参考: {self.target_hole}=({float(ref_xy[0]):.4f},{float(ref_xy[1]):.4f}){extra}" - ) - if ref_xy is None: - self.get_logger().warn("没有二阶段孔坐标 —— 以当前通止规 XY 为搜索中心") - else: - self._state("goto_hole_xy") - ok_xy, q, Tee, dist_xy = self._xy_to_ref(q, Tee, ref_xy) - self.get_logger().info( - f"平移到孔 XY:偏差 {dist_xy*1000:.2f}mm" - + (",到位" if ok_xy else ",未完全到位,按下压点搜") - ) - - if self.resnap: - q, Tee = self._resnap_align(q, Tee) - - # XY 已在空中对准:纯 Z 降回悬停高,再小步触面(避免贴面横移刮擦) - z_now = float(Tee[2, 3]) - if z_now > self.hover_z + 0.008: - self._state("rehover") - ok, q, Tee = self._goto( - q, Tee, - np.array([float(Tee[0, 3]), float(Tee[1, 3]), self.hover_z]), - verticalize=True, hold_xy=True, tag="rehover", - v=self.move_speed, max_hops=8, settle_s=0.20, min_dur=0.5, - tol_m=0.002, tol_tilt=self.vert_tol_rad * 1.5, - ) - if not ok: - self.get_logger().warn("回悬停高未完全到位,继续下压") - - # ---- approach:小步下降找面 ---- - self._state("approach") - x0, y0, z0 = [float(v) for v in Tee[:3, 3]] - z = z0 - descended = 0.0 - z_contact: Optional[float] = None - found: Optional[Tuple[float, float]] = None - fn_peak = 0.0 - while True: - fn_avg, fn_max, _, contact = self._tac_fresh(self.tac_timeout) - self._guard(fn_max) - fn_peak = max(fn_peak, fn_max) - # 注意:SDK 的 contact 标志在夹爪夹着通止规时恒为 True(夹持形变), - # 触面只能看 fnormal 超阈值;腕部 F/T(标定牛顿)做独立旁路判据 - ft_now = self._ft_mag() - ft_touch = ft_now is not None and ft_now > self.approach_ft_touch_n - if fn_avg >= self._th_touch or ft_touch: - z_contact = z - how = f"fn={fn_avg:.0f}≥{self._th_touch:.0f}" if fn_avg >= self._th_touch else ( - f"腕部F/T={ft_now:.1f}N>{self.approach_ft_touch_n:.0f}N(Orisys 未越阈 {self._th_touch:.0f})" - ) - self.get_logger().info( - f"触面: Z={z:.4f}m {how}(下降 {descended:.1f}mm)" - ) - if descended >= self.enter_probe_mm: - # 触面异常深——通止规很可能已经直接滑进孔(工件面不会这么低) - in_hole, q, Tee = self._in_hole_probe(q, Tee, z) - if in_hole: - gxy = self._gauge_xy(Tee) - found = (float(gxy[0]), float(gxy[1])) - # 抬到孔口倒角段再定心:深插状态直接横探会别死孔壁 - z += self.mouth_lift_mm / 1000.0 - self.get_logger().info( - f"★ 直接入孔: gauge=({found[0]:.4f},{found[1]:.4f})," - f"抬 {self.mouth_lift_mm:.1f}mm 到孔口定心,跳过 seat/螺旋" - ) - else: - self.get_logger().info("微探无孔壁特征——按普通触面处理(工件面偏低)") - break - descended += self.approach_step_mm - if descended > self.approach_max_mm: - raise SearchAbort( - f"下降 {self.approach_max_mm:.0f}mm 未触面——孔位/工件不对,回二阶段检查", code=3 - ) - z = z0 - descended / 1000.0 - if z < self.min_ee_z: - raise SearchAbort(f"触面搜索 Z={z:.3f} 低于 min_ee_z={self.min_ee_z:.2f}", code=3) - ok, q, Tee = self._step_to(q, Tee, np.array([x0, y0, z]), "approach", max_hops=1) - if not ok: - raise SearchAbort("approach 运动失败", code=3) - - # ---- seat + 螺旋(直接入孔时跳过) ---- - if found is None: - # ---- seat:建立轻触 ---- - self._state("seat") - for _ in range(8): - fn_avg, fn_max, _, _ = self._tac_fresh(self.tac_timeout) - self._guard(fn_max) - if self._th_target * 0.95 <= fn_avg <= self._th_max: - break - # err>0 = 压力不足 → 下压(z 减小);err<0 = 超压 → 微抬。z 向上为正。 - dz_mm = float(np.clip(-self.kp_z_mm * (self._th_target - fn_avg), -0.6, 0.4)) - z += dz_mm / 1000.0 - ok, q, Tee = self._step_to(q, Tee, np.array([x0, y0, z]), "seat", tol_m=0.0003) - if not ok: - raise SearchAbort("seat 运动失败", code=3) - self.get_logger().info(f"轻触建立: z={z:.4f}m fn={fn_avg:.0f}(目标 {self._th_target:.0f})") - if z_contact is None: - z_contact = float(z) - - # 单步轻探 0.6mm。多 hop 会在力检查前把规顶进工件。 - seat_fn = float(fn_avg) - self._state("press_probe") - z_now = float(Tee[2, 3]) - z_probe = z_now - 0.0006 - ok, q, Tee = self._step_to( - q, Tee, np.array([x0, y0, z_probe]), "press_probe", - tol_m=0.0005, max_hops=1, - ) - fn_p, fn_max, _, _ = self._tac_fresh(self.tac_timeout) - fn_peak = max(fn_peak, fn_max) - dropped = fn_p < seat_fn * (1.0 - self.drop_ratio) or fn_p < self._th_touch - jammed = fn_p > self._th_max or fn_max > self._th_max - if jammed or not dropped: - if jammed: - self.get_logger().warn( - f"轻探力 {fn_p:.0f} 偏高(未入孔),卸载回触面" - ) - else: - self.get_logger().info( - f"轻探未入孔 fn {seat_fn:.0f}→{fn_p:.0f},卸载回触面螺旋" - ) - q, Tee, z = self._unload_z(q, Tee, float(z_contact), self._th_target) - fn_avg, fn_max, _, _ = self._tac_fresh(self.tac_timeout) - if fn_avg > self._th_max: - self.get_logger().warn( - f"卸载后力仍 {fn_avg:.0f},继续螺旋并在步间卸载" - ) - else: - gxy = self._gauge_xy(Tee) - found = (float(gxy[0]), float(gxy[1])) - z = float(Tee[2, 3]) - self.get_logger().info( - f"★ 轻探入孔: gauge=({found[0]:.4f},{found[1]:.4f}) " - f"fn {seat_fn:.0f}→{fn_p:.0f}" - ) - - # 拖拽基线:接触静止时的切向读数作为螺旋期切向阈值的基准 - # (自由空气基线不含夹持/姿态负载,拖拽时的摩擦尖峰会误触发减拖) - if found is None: - shear_seat: List[float] = [] - for _ in range(8): - _, _, sh, _ = self._tac_fresh(self.tac_timeout) - shear_seat.append(sh) - self._spin(0.04) - shear_drag = float(np.median(np.array(shear_seat, dtype=float))) - self._th_shear = shear_drag + self.shear_delta - self.get_logger().info( - f"拖拽切向基线: μ={shear_drag:.0f} → 螺旋减拖阈值 {self._th_shear:.0f}" - ) - - # ---- spiral:力闭环螺旋搜孔 ---- - if found is None: - gxy0 = self._gauge_xy(Tee) - if ref_xy is not None: - cx, cy = float(ref_xy[0]), float(ref_xy[1]) - else: - cx, cy = float(gxy0[0]), float(gxy0[1]) - det = DropDetector(self.drop_ratio, self.drop_frames) - n_expand = int(self.spiral_expand_max) - if residual_mm is not None and residual_mm <= 1.8: - n_expand = 0 - else: - n_expand = min(n_expand, 1) - for attempt in range(n_expand + 1): - r_max = self.spiral_r_max_mm + attempt * self.spiral_expand_step_mm - self._state(f"spiral_r{r_max:.0f}mm") - pts = spiral_points(cx, cy, self.spiral_pitch_mm, self.spiral_step_mm, r_max) - self.get_logger().info(f"螺旋点数={len(pts)} (r_max={r_max:.1f}mm)") - for i, (px, py) in enumerate(pts): - gxy = self._gauge_xy(Tee) - z = self._clip_search_z(z, float(z_contact)) - tgt = np.array([ - Tee[0, 3] + (px - gxy[0]), - Tee[1, 3] + (py - gxy[1]), - z, - ]) - hop_dist = float(np.linalg.norm(tgt - Tee[:3, 3])) - if hop_dist > 0.008: - raise SearchAbort( - f"螺旋目标异常跳变 {hop_dist*1000:.1f}mm > 8mm(坐标/单位错误),立即中止", - code=4, - ) - ok, q, Tee = self._step_to(q, Tee, tgt, f"spiral{i}", tol_m=0.0004) - if not ok: - raise SearchAbort(f"螺旋运动失败 @r={r_max:.1f}mm idx={i}", code=4) - fn_avg, fn_max, shear, _ = self._tac_fresh(self.tac_timeout) - if fn_max > self._th_max: - self.get_logger().warn( - f"螺旋力 {fn_max:.0f} > max {self._th_max:.0f},卸载回触面" - ) - q, Tee, z = self._unload_z( - q, Tee, float(z_contact), self._th_target - ) - continue - self._guard(fn_max) - fn_peak = max(fn_peak, fn_max) - # Z 力闭环维持轻触(err>0 压力不足 → 下压 z 减小;z 向上为正) - dz_mm = float(np.clip( - -self.kp_z_mm * (self._th_target - fn_avg), -0.3, 0.25 - )) - z += dz_mm / 1000.0 - # 切向大只在仍贴着触面时微抬 0.15mm,禁止累计抬离工件 - if shear > self._th_shear and z <= float(z_contact) + 0.0004: - z += 0.00015 - self.get_logger().warn( - f"切向力 {shear:.0f} 偏大,微抬 0.15mm 减拖" - ) - if fn_avg < self._th_touch: - z = min(z, float(z_contact)) - z = self._clip_search_z(z, float(z_contact)) - if det.update(fn_avg, in_contact_band=fn_avg >= self._th_touch): - found = (px, py) - self.get_logger().info( - f"★ 入孔: gauge=({px:.4f},{py:.4f}) " - f"r={math.hypot(px-cx, py-cy)*1000:.1f}mm " - f"fn {det.contact_avg:.0f}→{fn_avg:.0f}" - ) - break - if i % 15 == 0: - self.get_logger().info( - f" spiral {i}/{len(pts)} " - f"r={math.hypot(px-cx, py-cy)*1000:.1f}mm " - f"fn={fn_avg:.0f} shear={shear:.0f} z={z:.4f}" - ) - if found is not None: - break - self.get_logger().warn(f"r_max={r_max:.1f}mm 未入孔,扩大搜索半径") - if found is None: - raise SearchAbort( - f"螺旋搜孔未找到孔(r_max={self.spiral_r_max_mm + self.spiral_expand_max * self.spiral_expand_step_mm:.0f}mm)。" - "回二阶段复对准,或加大 spiral_r_max_mm", code=4, - ) - result["hole_xy_base_m"] = [round(found[0], 5), round(found[1], 5)] - result["z_contact_m"] = round(float(z_contact if z_contact is not None else z), 4) - - # ---- center:十字微扫定心 ---- - if self.center_scan: - self._state("center_scan") - d = self.center_scan_mm / 1000.0 - probes = [(0.0, 0.0), (d, 0.0), (-d, 0.0), (0.0, d), (0.0, -d)] - best_xy, best_metric = found, float("inf") - for dx, dy in probes: - gxy = self._gauge_xy(Tee) - tgt = np.array([ - Tee[0, 3] + (found[0] + dx - gxy[0]), - Tee[1, 3] + (found[1] + dy - gxy[1]), - z, - ]) - ok, q, Tee = self._step_to(q, Tee, tgt, "scan", tol_m=0.0003) - if not ok: - continue - fn_avg, fn_max, shear, _ = self._tac_fresh(self.tac_timeout) - self._guard(fn_max) - metric = shear + 0.3 * fn_avg - self.get_logger().info( - f" scan Δ=({dx*1000:+.1f},{dy*1000:+.1f})mm shear={shear:.2f} fn={fn_avg:.2f} m={metric:.2f}" - ) - if metric < best_metric: - best_metric, best_xy = metric, (found[0] + dx, found[1] + dy) - gxy = self._gauge_xy(Tee) - ok, q, Tee = self._step_to( - q, Tee, - np.array([Tee[0, 3] + (best_xy[0] - gxy[0]), Tee[1, 3] + (best_xy[1] - gxy[1]), z]), - "center", tol_m=0.0003, - ) - found = best_xy - self.get_logger().info(f"定心: ({best_xy[0]:.4f},{best_xy[1]:.4f}) metric={best_metric:.2f}") - result["hole_xy_base_m"] = [round(best_xy[0], 5), round(best_xy[1], 5)] - - # ---- 轻压:找到孔后轻轻按在孔口,不拧入(拧入是后续阶段) ---- - self._state("press") - xh, yh = [float(v) for v in Tee[:3, 3][:2]] - for _ in range(8): - fn_avg, fn_max, _, _ = self._tac_fresh(self.tac_timeout) - self._guard(fn_max) - fn_peak = max(fn_peak, fn_max) - if self._th_target * 0.9 <= fn_avg <= self._th_max: - break - dz_mm = float(np.clip(-self.kp_z_mm * (self._th_target - fn_avg), -0.4, 0.3)) - z += dz_mm / 1000.0 - ok, q, Tee = self._step_to( - q, Tee, np.array([xh, yh, z]), "press", tol_m=0.0003, - ) - if not ok: - self.get_logger().warn("轻压步进未完全到位,按当前力保持") - break - self.get_logger().info( - f"轻压到位: z={z:.4f}m fn={fn_avg:.0f}(目标 {self._th_target:.0f})——不拧入" - ) - result["press_fn"] = round(float(fn_avg), 1) - - # ---- insert:仅 --depth >0 才拧入/下压;默认 0 留给后续拧入阶段 ---- - inserted_mm = 0.0 - if self.insert_depth_mm > 0.0: - self._state("insert") - retries = 0 - while inserted_mm < self.insert_depth_mm - 1e-6: - dz_mm = min(0.5, self.insert_depth_mm - inserted_mm) - if abs(self.screw_pitch_mm) > 1e-6: - ok, q, Tee = self._screw_hop(q, Tee, -dz_mm / 1000.0, self.screw_pitch_mm / 1000.0) - else: - ok, q, Tee = self._step_to( - q, Tee, np.array([Tee[0, 3], Tee[1, 3], z - dz_mm / 1000.0]), - "insert", tol_m=0.0003, - ) - if not ok: - raise SearchAbort("插入运动失败", code=5) - fn_avg, fn_max, _, _ = self._tac_fresh(self.tac_timeout) - self._guard(fn_max) - fn_peak = max(fn_peak, fn_max) - if fn_max > self._th_insert: - retries += 1 - self.get_logger().warn( - f"插入力 {fn_max:.0f} > {self._th_insert:.0f},回退微抖重试 {retries}/{self.insert_retry}" - ) - if retries > self.insert_retry: - raise SearchAbort( - f"插入受阻({fn_max:.0f})——孔位仍有偏差或螺纹咬死", code=5 - ) - self._retract(q, Tee, 0.0004) - q2, Tee2 = self._wait_state(2.0) - if q2 is not None and Tee2 is not None: - q, Tee = q2, Tee2 - wig = 0.0003 * (1.0 if retries % 2 else -1.0) - ok, q, Tee = self._step_to( - q, Tee, np.array([Tee[0, 3] + wig, Tee[1, 3], Tee[2, 3]]), - "wiggle", tol_m=0.0003, - ) - continue - inserted_mm += dz_mm - z -= dz_mm / 1000.0 - self.get_logger().info( - f" insert {inserted_mm:.1f}/{self.insert_depth_mm:.1f}mm fn={fn_avg:.0f}" - ) - self._state("inserted") - result["inserted_mm"] = round(inserted_mm, 2) - - # ---- hold ---- - self._state("hold") - self._pin(q) - result.update( - ok=True, - fn_peak_n=round(fn_peak, 2), - elapsed_s=round(time.monotonic() - t_start, 1), - note="搜孔+轻压完成" + ( - f",插入 {inserted_mm:.1f}mm" if inserted_mm > 0 else "(未拧入,保持轻压)" - ), - ) - self._publish_result(result) - self.get_logger().info( - f"=== 三阶段搜孔完成: {result['note']} 峰值力 {fn_peak:.0f}," - f"耗时 {result['elapsed_s']}s。结果: /stage3/result, /tmp/stage3_result.json ===" - ) - if linger and self.linger3 > 0.0: - t_end = time.monotonic() + self.linger3 - while time.monotonic() < t_end and rclpy.ok(): - self._publish_result(result) - self._spin(0.3) - return 0 - - except SearchAbort as exc: - self.get_logger().error(f"搜孔中止: {exc}") - self._state("abort") - result.update(ok=False, note=str(exc)) - self._publish_result(result) - if q is not None and Tee is not None: - self._retract(q, Tee, 0.005) - q2 = self._q() - self._pin(q2 if q2 is not None else q) - return exc.code - - -def main(args=None) -> None: - rclpy.init(args=args) - node = Stage3Search() - code = 2 - try: - code = node.run() - except KeyboardInterrupt: - pass - except Exception as exc: # noqa: BLE001 - node.get_logger().error(f"stage3 异常终止: {exc}") - code = 2 - finally: - try: - q = node._q() - if q is not None: - node._pin(q) - except Exception: - pass - try: - node._shutdown_tf() - except Exception: - pass - try: - node.destroy_node() - except Exception: - pass - try: - if rclpy.ok(): - rclpy.shutdown() - except Exception: - pass - raise SystemExit(code) - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_cli.py b/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_cli.py deleted file mode 100644 index f9dc5ad..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_cli.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -"""Orisys 视触觉命令行工具。端口 / 配置来自 ``site.yaml`` 的 ``tactile`` 段。""" - -from __future__ import annotations - -import argparse -import sys -import time - -from arm_application.orisys_tactile import make_tactile, resolve_orisys_config -from arm_application.site_io import load_site_dict, site_path - - -def main() -> int: - parser = argparse.ArgumentParser(description="Orisys 触觉命令行工具(site.yaml)") - parser.add_argument("--duration", type=float, default=10.0) - parser.add_argument("--site", default="") - args = parser.parse_args() - data = load_site_dict(args.site or None) - t = data.get("tactile") or {} - cfg_name = resolve_orisys_config(str(t.get("config") or "dd03"), str(t.get("config_file") or "")) - print( - f"site={site_path() if not args.site else args.site} " - f"backend={t.get('backend') or 'orisys'} " - f"left={t.get('left_video', 0)} right={t.get('right_video', 2)} " - f"config={cfg_name}" - ) - tactile = make_tactile(data) - try: - tactile.connect() - except Exception as exc: - print(f"错误:{exc}", file=sys.stderr) - return 1 - t0 = time.time() - n = 0 - try: - while time.time() - t0 < args.duration: - sample = tactile.read_sample() - n += 1 - raw = sample.raw or {} - left = raw.get("left") or {} - right = raw.get("right") or {} - if n % 10 == 0: - print( - f"n={n:4d} contact={int(sample.contact)} " - f"L F={float(left.get('fnormal') or 0):8.2f} " - f"R F={float(right.get('fnormal') or 0):8.2f} " - f"Fz={float(sample.force_xyz[0]):8.2f}" - ) - time.sleep(0.01) - except KeyboardInterrupt: - print("已中断") - finally: - tactile.disconnect() - print(f"完成 frames={n}") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_interface.py b/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_interface.py deleted file mode 100644 index 6c121ee..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_interface.py +++ /dev/null @@ -1,84 +0,0 @@ -"""触觉采样 / 指令类型。后端(Orisys / mock)可替换。""" - -from __future__ import annotations - -import time -from abc import ABC, abstractmethod -from dataclasses import dataclass -from typing import Any - -import numpy as np - - -@dataclass -class TactileSample: - timestamp: float - force_xyz: np.ndarray - torque_xyz: np.ndarray - contact: bool - embedding: np.ndarray | None = None - raw: dict[str, Any] | None = None - - -@dataclass -class TactileCommand: - delta_xyz: np.ndarray - delta_rpy: np.ndarray - gripper_pos: float | None = None - done: bool = False - ok: bool = True - message: str = "" - - -class TactileInterface(ABC): - name: str = "tactile_base" - - @abstractmethod - def connect(self) -> None: ... - - @abstractmethod - def disconnect(self) -> None: ... - - @abstractmethod - def reset(self, hole_id: int) -> None: ... - - @abstractmethod - def step(self, sample: TactileSample) -> TactileCommand: ... - - -class MockTactile(TactileInterface): - name = "mock_tactile" - - def __init__(self) -> None: - self._i = 0 - self._hole = 0 - - def connect(self) -> None: - self._i = 0 - - def disconnect(self) -> None: - pass - - def reset(self, hole_id: int) -> None: - self._hole = hole_id - self._i = 0 - - def read_sample(self) -> TactileSample: - self._i += 1 - return TactileSample( - timestamp=time.time(), - force_xyz=np.zeros(3), - torque_xyz=np.zeros(3), - contact=self._i >= 8, - ) - - def step(self, sample: TactileSample) -> TactileCommand: - self._i += 1 - done = self._i >= 15 - return TactileCommand( - delta_xyz=np.zeros(3), - delta_rpy=np.zeros(3), - done=done, - ok=True, - message=f"mock hole={self._hole} step={self._i}", - ) diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_node.py b/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_node.py deleted file mode 100644 index 85a144f..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/tactile_node.py +++ /dev/null @@ -1,305 +0,0 @@ -#!/usr/bin/env python3 -"""Publish Orisys dual-finger tactile status. Config from site.yaml tactile:. - -架构(厂家示例 two_sensor_pipeline 的推荐):每个传感器一个独立 -multiprocessing 进程(独立 CUDA 上下文),ROS 主进程只做队列→话题转发。 -原因:实测单进程内双开两路传感器会互相拖垮(30→0.8fps);独立进程稳定 30fps。 -""" - -from __future__ import annotations - -import multiprocessing as mp -import signal -import time - -import numpy as np -import rclpy -from rclpy.node import Node - -from arm_application.image_utils import UnsupportedImageError, ndarray_to_image -from arm_application.orisys_tactile import load_orisys_from_site, tactile_worker -from arm_application.site_io import load_site_dict, site_path -from arm_msgs.msg import TactileStatus -from sensor_msgs.msg import Image - -from arm_application.ros_node import TolerantNode - - -class TactileNode(TolerantNode): - def __init__(self) -> None: - super().__init__("tactile") - self.declare_parameter("publish_hz", 20.0) - # 下面两个可以用 ROS 参数覆盖 site.yaml,便于不改站点文件就做验证 - # (例如 mock 后端 + 打开图像话题来确认链路通)。 - self.declare_parameter("backend", "") - self.declare_parameter("image_hz", -1.0) - data = load_site_dict() - t = data.get("tactile") or {} - hz = float(t.get("publish_hz") or self.get_parameter("publish_hz").value or 20.0) - backend_override = str(self.get_parameter("backend").value).strip() - self._backend = ( - backend_override or str(t.get("backend") or "orisys") - ).strip().lower() - self._mock = self._backend in ("mock", "mock_orisys") - - self._pub = { - side: self.create_publisher(TactileStatus, f"/tactile/{side}/status", 10) - for side in ("left", "right") - } - self._latest: dict[str, tuple[float, dict]] = {} - self._connected = {"left": False, "right": False} - self._mock_n = 0 - self._workers: list = [] - self._queues: dict[str, object] = {} - self._stop = None - - # --- 视触觉图像 / 力矢量场 --- - # 默认关闭(image_hz=0):图像每帧几百 KB,不该拖累三力的 30fps 时序。 - # 打开后走一条 maxsize=1 的独立队列,满则丢旧留新 —— 主进程来不及消费 - # 只会丢图像,三力一条不受影响。 - self._image_hz = ( - float(self.get_parameter("image_hz").value) - if float(self.get_parameter("image_hz").value) >= 0 - else float(t.get("image_hz") or 0.0) - ) - self._image_q = None - self._image_warned: set[str] = set() - self._image_pub: dict[str, object] = {} - self._vector_pub: dict[str, object] = {} - self._image_count: dict[str, int] = {} - self._last_mock_img = 0.0 - - # 图像 publisher 与后端无关 —— mock 后端也要能发。 - # 否则"图像话题到底通不通"只能等到有相机、上真机那天才发现。 - if self._image_hz > 0: - for side in ("left", "right"): - self._image_pub[side] = self.create_publisher( - Image, f"/tactile/{side}/image", 5 - ) - self._vector_pub[side] = self.create_publisher( - Image, f"/tactile/{side}/vector", 5 - ) - self.get_logger().info( - f"视触觉图像已开启: {self._image_hz:.1f}Hz " - f"→ /tactile/{{left,right}}/image 与 /vector" - ) - - if self._mock: - self._connected = {"left": True, "right": True} - self.get_logger().info("触觉使用 mock 后端(假数据,不接真实传感器)") - else: - cfg = load_orisys_from_site(data) - ctx = mp.get_context("spawn") # spawn:子进程不带 DDS 线程,CUDA 上下文干净 - self._stop = ctx.Event() - if self._image_hz > 0: - self._image_q = ctx.Queue(maxsize=1) - for side in ("left", "right"): - q = ctx.Queue(maxsize=2) - self._queues[side] = q - p = ctx.Process( - target=tactile_worker, - args=(side, cfg, q, self._stop, self._image_q), - name=f"tactile_{side}", daemon=True, - ) - p.start() - self._workers.append(p) - self.get_logger().info( - f"tactile workers spawned (left pid={self._workers[0].pid} right pid={self._workers[1].pid}) " - f"site={site_path()}" - ) - self.create_timer(1.0 / max(1e-3, hz), self._tick) - - def _drain(self, side: str) -> None: - q = self._queues.get(side) - if q is None: - return - latest = None - while True: - try: - latest = q.get_nowait() - except Exception: - break - if latest is None: - return - if latest.get("error"): - self.get_logger().error(f"[{side}] {latest['error']}", throttle_duration_sec=3.0) - return - self._connected[side] = True - self._latest[side] = (time.monotonic(), latest) - - def _drain_images(self) -> None: - """把 worker 推来的最新图像 / 力矢量场发布出去。 - - 只取最新一帧:worker 已按 ``image_hz`` 节流、队列 ``maxsize=1``, - 所以这里读到的永远是最新画面;主进程偶尔卡一下,丢掉的是中间帧 - 而不是最新帧。 - """ - if self._image_q is None: - return - latest = None - while True: - try: - latest = self._image_q.get_nowait() - except Exception: - break - if latest is None: - return - - side = str(latest.get("side") or "") - if side not in self._image_pub: - return - stamp = self.get_clock().now().to_msg() - frame_id = f"{side}_tactile" - - self._publish_array( - self._image_pub[side], latest.get("img"), frame_id, stamp, side, "image" - ) - self._publish_array( - self._vector_pub[side], latest.get("vector"), frame_id, stamp, side, "vector" - ) - - def _publish_array(self, pub, array, frame_id: str, stamp, side: str, tag: str) -> None: - """打包并发布一个数组;形状/类型不支持时跳过该话题而不是崩溃。 - - ``array is None`` 是正常情况(该侧没有矢量场输出、或本帧没算), - 不报错也不发空图 —— 发一张全零的假图会让下游以为接触到了东西。 - """ - if array is None: - return - key = f"{side}_{tag}" - try: - msg = ndarray_to_image(array, frame_id=frame_id, stamp=stamp) - except UnsupportedImageError as exc: - # 编码不支持是固定的(SDK 给的 dtype 不会变),每侧每种图只提醒一次, - # 否则 5Hz 的警告会把现场日志冲掉。 - if key not in self._image_warned: - self._image_warned.add(key) - self.get_logger().warn( - f"[{key}] 无法打包成 Image,已跳过该话题: {exc}" - ) - return - - try: - pub.publish(msg) - except Exception as exc: - if f"{key}_pub" not in self._image_warned: - self._image_warned.add(f"{key}_pub") - self.get_logger().warn(f"[{key}] 发布失败: {exc}") - return - - if self._image_count.get(key, 0) == 0: - self.get_logger().info( - f"[{key}] 首帧已发布 ({msg.width}x{msg.height} {msg.encoding})" - ) - self._image_count[key] = self._image_count.get(key, 0) + 1 - - def _publish_mock_images(self, force: float) -> None: - """mock 后端下造一张形变图 + 一张力矢量场,用来打通图像发布链路。 - - 没有传感器时也要能把 ``/tactile//image`` 与 ``/vector`` 跑起来 —— - 否则这两个话题是否真的能出图,只能等到上真机那天才知道。 - - 图像内容模仿视触觉的形变:中间一个高斯隆起(法向深度), - 连同指向中心的切向流(矢量场),接触越深幅度越大。 - """ - if not self._image_pub: - return - stamp = self.get_clock().now().to_msg() - h, w = 48, 64 - yy, xx = np.mgrid[0:h, 0:w] - cx, cy = w / 2.0, h / 2.0 - bump = np.exp(-(((xx - cx) ** 2 + (yy - cy) ** 2) / (2.0 * 9.0 ** 2))) - - depth = (bump * (0.05 + 0.5 * float(force))).astype(np.float32) - vx = ((cx - xx) / w * bump * float(force)).astype(np.float32) - vy = ((cy - yy) / h * bump * float(force)).astype(np.float32) - vector = np.dstack([vx, vy]) - - for side in ("left", "right"): - frame = f"{side}_tactile" - self._publish_array(self._image_pub[side], depth, frame, stamp, side, "image") - self._publish_array(self._vector_pub[side], vector, frame, stamp, side, "vector") - - def _tick(self) -> None: - self._drain_images() - if self._mock: - self._mock_n += 1 - force = 0.2 if self._mock_n >= 8 else 0.0 - for side in ("left", "right"): - self._publish(side, { - "fnormal": force, "fshearx": 0.0, "fsheary": 0.0, - "fps": 30.0, "is_contact": self._mock_n >= 8, - "centroid": (0.0, 0.0), - }) - # mock 的图像也按 image_hz 节流,避免比真机行为更"勤快"。 - if self._image_hz > 0: - now = time.monotonic() - if now - self._last_mock_img >= 1.0 / self._image_hz: - self._last_mock_img = now - self._publish_mock_images(force) - return - for side in ("left", "right"): - self._drain(side) - item = self._latest.get(side) - if item is None: - continue - ts, data = item - if time.monotonic() - ts > 0.6: - continue # 数据太旧(worker 卡住)不发布 - self._publish(side, data) - - def _publish(self, side: str, data: dict) -> None: - msg = TactileStatus() - msg.header.stamp = self.get_clock().now().to_msg() - msg.header.frame_id = f"{side}_tactile" - msg.side = side - msg.connected = bool(self._connected.get(side, False)) - msg.contact = bool(data.get("is_contact", False)) - msg.fnormal = float(data.get("fnormal") or 0.0) - msg.fshearx = float(data.get("fshearx") or 0.0) - msg.fsheary = float(data.get("fsheary") or 0.0) - msg.fps = float(data.get("fps") or 0.0) - c = data.get("centroid") or (0.0, 0.0) - msg.centroid_u = float(c[0]) - msg.centroid_v = float(c[1]) - msg.error_msg = "" - self._pub[side].publish(msg) - - def destroy_node(self) -> bool: - try: - if self._stop is not None: - self._stop.set() - for p in self._workers: - p.join(timeout=2.0) - if p.is_alive(): - p.terminate() - for p in self._workers: - p.join(timeout=1.5) - if p.is_alive(): - try: - p.kill() # 还赖着就 SIGKILL,绝不留孤儿占摄像头 - except Exception: - pass - finally: - return super().destroy_node() - - -def main() -> None: - rclpy.init() - node = TactileNode() - - def _sigterm(_sig, _frm) -> None: - raise KeyboardInterrupt - - signal.signal(signal.SIGTERM, _sigterm) # SIGTERM 也走干净退出,释放相机 - try: - rclpy.spin(node) - except KeyboardInterrupt: - pass - finally: - node.destroy_node() - rclpy.shutdown() - - -if __name__ == "__main__": - main() diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/weights_layout.py b/install/arm_application/lib/python3.11/site-packages/arm_application/weights_layout.py deleted file mode 100644 index 75c3a5a..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/weights_layout.py +++ /dev/null @@ -1,448 +0,0 @@ -"""权重模块的目录布局、模型发现与标签归属(纯逻辑)。 - -这个模块刻意**只依赖标准库 + model_labels**,不 import ROS、不 import -ultralytics/tensorrt。原因: - -1. 可以在没有 GPU、没有 ROS 的环境里跑单元测试; -2. ``scripts/weights.sh`` 这个命令行工具能直接用上,不必先 ``source`` 一整套环境。 - -真正干重活的转换(PyTorch → ONNX → TensorRT)在 ``scripts/weights.py`` 里, -那部分才需要 ``ros_flexiv`` 环境和 GPU。 - -## 目录约定 - - models/ - README.md ← 模块规则(要改这个模块先读它) - staging/ ← 非标准格式先丢这里,转换工具有序地消费它 - <分组>/ ← 例如 yolo/、hole_insert/ - <模型名>.onnx - <模型名>.engine - <模型名>.labels.yaml ← 标签(旁挂,可手改,进 git) - -"分组"只是一个子目录名,用来分门别类,没有语义约束。默认 ``yolo``。 -""" -from __future__ import annotations - -from dataclasses import dataclass, field -from pathlib import Path -from typing import Dict, List, Optional, Sequence, Tuple, Union - -from .model_labels import ( - SOURCE_MODEL, - SOURCE_ONNX, - SOURCE_PLACEHOLDER, - SOURCE_SIDECAR, - LabelSet, - label_file_status, - labels_path_for, - labels_from_model, - labels_from_onnx, - placeholder_labels, - read_label_file, -) - -# 会被当成"权重"的文件后缀(不带点的小写形式)。 -WEIGHT_EXTS: Tuple[str, ...] = ( - "pt", - "pth", - "onnx", - "engine", - "trt", - "plan", - "tflite", -) - -# 转换工具认识的输入格式。其它格式一律归到 staging 等人工处理。 -# 注意 pth 也收:虽然 Ultralytics 主要用 .pt,但用户手里常是 .pth。 -CONVERTIBLE_INPUT_EXTS: Tuple[str, ...] = ("pt", "pth", "onnx") - -# 已经被转换过的产物,重转没有意义。 -FINAL_EXTS: Tuple[str, ...] = ("engine", "trt", "plan") - -# 非标准格式/待转换文件放这里。 -STAGING_DIRNAME = "staging" - -# 读标签时挑格式的顺序:onnx 有内嵌 metadata 且读取代价极低(毫秒级), -# 所以排在前面;engine 排最后是因为它很可能什么都没有。 -LABEL_READ_ORDER: Tuple[str, ...] = ("onnx", "pt", "pth", "engine", "trt") - - -# --------------------------------------------------------------------------- -# 仓库根 / 权重根 -# --------------------------------------------------------------------------- - - -def find_repo_root(start: Optional[Union[str, Path]] = None) -> Optional[Path]: - """从 ``start`` 往上找仓库根(以存在 ``config/site.yaml`` 为标志)。 - - 这样无论代码是从 ``src/`` 直接跑、还是从 ``install/`` 跑, - 都能定位到同一份 ``models/``,不会出现"两份权重"。 - """ - here = Path(start).resolve() if start else Path(__file__).resolve() - for cand in [here, *here.parents]: - if (cand / "config" / "site.yaml").is_file(): - return cand - return None - - -def default_weights_root() -> Path: - """``models/`` 的默认位置。找不到仓库根时退回当前工作目录下的 models/。""" - import os - - env = os.environ.get("SITE_WEIGHTS_ROOT") - if env: - return Path(env).expanduser() - root = find_repo_root() - if root is not None: - return root / "models" - return Path.cwd() / "models" - - -# --------------------------------------------------------------------------- -# 模型条目 -# --------------------------------------------------------------------------- - - -@dataclass -class ModelEntry: - """一个"模型" = 权重目录里同名前缀的一组文件。""" - - group: str - name: str - files: Dict[str, Path] = field(default_factory=dict) - - @property - def dir(self) -> Path: - if not self.files: - return Path(".") - return next(iter(self.files.values())).parent - - @property - def labels_path(self) -> Path: - return self.dir / (self.name + ".labels.yaml") - - @property - def exts(self) -> List[str]: - """已存在的格式,按固定顺序返回,保证输出稳定。 - - 顺序就是转换流水线的顺序:``pt → onnx → engine``(源头 → 中间 → 最终)。 - 这样列表里一眼能看出这个模型走到哪一步了。 - """ - order = list(WEIGHT_EXTS) - return sorted(self.files, key=lambda e: (order.index(e) if e in order else 99, e)) - - def path(self, ext: str) -> Optional[Path]: - return self.files.get(ext.lower().lstrip(".")) - - def sorted_files(self) -> List[Path]: - """按读标签的推荐顺序给出文件列表。""" - out: List[Path] = [] - for ext in LABEL_READ_ORDER: - p = self.files.get(ext) - if p: - out.append(p) - for ext in self.exts: - p = self.files.get(ext) - if p and p not in out: - out.append(p) - return out - - def missing_of(self, wanted: Sequence[str]) -> List[str]: - return [e for e in wanted if e not in self.files] - - -# --------------------------------------------------------------------------- -# 发现 -# --------------------------------------------------------------------------- - - -def is_staging(path: Path) -> bool: - return path.name == STAGING_DIRNAME - - -def groups(root: Union[str, Path]) -> List[str]: - """列出所有权重分组目录(跳过 staging 与隐藏目录)。""" - r = Path(root) - if not r.is_dir(): - return [] - return sorted( - p.name - for p in r.iterdir() - if p.is_dir() and not p.name.startswith(".") and not is_staging(p) - ) - - -def staging_dir(root: Union[str, Path]) -> Path: - return Path(root) / STAGING_DIRNAME - - -def infer_group( - root: Union[str, Path], - source: Union[str, Path], - fallback: str = "yolo", -) -> str: - """转换产物该落到**哪个分组**:默认沿用源文件所在的分组。 - - 为什么不能一律落到 ``yolo``(2026-09-28 真机踩到,代价是一次白转) - ---------------------------------------------------------------- - 现场把 ``models/hole_insert/detect_best_1.onnx`` 转 engine,工具默认 - ``--group yolo``,于是产物落到 ``models/yolo/detect_best_1.engine`` —— - 而运行时找 engine 的规则是**同级同名**(``yolo_detector.resolve_weights``: - ``p.with_suffix(".engine")``,即 site.yaml 指的 ``.onnx`` 旁边)。两边 - 一分家,engine 就等于不存在:现象是"启动即报缺 engine",而文件明明躺着。 - 这正是本项目最忌讳的**静默失效** —— 工具没报错,位置也"合理"。 - - 规则: - - 源文件已在权重根目录下的某个分组里(例如 ``models/hole_insert/x.onnx``) - → 沿用 ``hole_insert``。这样"就地转换"永远落在原地,运行时必然找得到; - - 源文件在 ``staging/``、权重根目录之外或根目录正下方 → ``fallback`` - (默认 ``yolo``):那才是"新来的模型,还没决定分组"的正常情形。 - - Args: - root: 权重根目录(``models/``)。 - source: 输入文件。 - fallback: 无法沿用时的分组名。 - - Returns: - 分组名(不带路径)。 - """ - r = Path(root) - try: - rel = Path(source).expanduser().resolve().relative_to(r.resolve()) - except ValueError: - # 不在权重根目录下(/tmp、外部磁盘、staging 之类)→ 没有"原地"可言 - return fallback - if len(rel.parts) < 2: - # 直接躺在 models/ 正下方:没有分组信息,用默认分组 - return fallback - group = rel.parts[0] - if is_staging(r / group) or group.startswith("."): - return fallback - return group - - -def staging_files(root: Union[str, Path]) -> List[Path]: - """staging 里的待处理文件。 - - 跳过隐藏文件(``.gitkeep`` 等)和 ``.md`` 说明文档 —— 那些是给人和 git 看的, - 不是待转换的模型。否则 ``doctor`` 会把 README 报成"格式不支持"。 - """ - d = staging_dir(root) - if not d.is_dir(): - return [] - return sorted( - p - for p in d.iterdir() - if p.is_file() and not p.name.startswith(".") and p.suffix.lower() != ".md" - ) - - -def discover(root: Optional[Union[str, Path]] = None) -> List[ModelEntry]: - """扫描权重根,按"分组 + 模型名"归并出所有模型。 - - 同名不同格式(m.onnx / m.engine / m.pt)会被合成一个条目 —— 因为它们 - 共用一个模型名、一份标签。``.labels.yaml`` 本身不算权重。 - """ - r = Path(root) if root is not None else default_weights_root() - out: List[ModelEntry] = [] - if not r.is_dir(): - return out - for g in groups(r): - gdir = r / g - by_name: Dict[str, ModelEntry] = {} - for p in sorted(gdir.iterdir()): - if not p.is_file() or p.name.startswith("."): - continue - ext = p.suffix.lower().lstrip(".") - if ext not in WEIGHT_EXTS: - continue - # m.labels.yaml 的后缀是 .yaml,不会落进 WEIGHT_EXTS,天然被排除。 - stem = p.name[: -(len(ext) + 1)] - entry = by_name.get(stem) - if entry is None: - entry = ModelEntry(group=g, name=stem, files={}) - by_name[stem] = entry - entry.files[ext] = p - out.extend(by_name.values()) - return out - - -def find_model( - root: Optional[Union[str, Path]] = None, - name: str = "", - group: Optional[str] = None, -) -> Optional[ModelEntry]: - """按模型名找模型。 - - - ``name`` 是完整路径 → 直接按路径构造条目(不要求它在权重目录里) - - ``name`` 是 ``分组/模型名`` → 按分组+名字精确查找 - - ``name`` 是裸名字 → 在所有分组里找同名模型;``group`` 可缩小范围 - - 裸名字跨分组同名时会优先返回 ``group`` 指定的那个;都没指定就返回找到的第一个, - 并由调用方提示存在歧义。 - """ - p = Path(name).expanduser() - if p.suffix and (p.is_file() or p.parent.is_dir() and str(name).count("/")): - ext = p.suffix.lower().lstrip(".") - if ext in WEIGHT_EXTS: - entry = ModelEntry(group=group or p.parent.name, name=p.stem, files={}) - entry.files[ext] = p - return entry - - for e in discover(root): - if e.name != name: - continue - if group and e.group != group: - continue - return e - - # 裸名字没匹配上,再试 ``分组/模型名``。 - # ``list`` 的输出里模型是带分组一起显示的,用户照着敲 ``yolo/detect_best`` - # 非常自然;以前这里会直接报"找不到模型",而报错又只列出裸名字,很别扭。 - # 放在裸名字查找之后,是为了不把真正的相对路径(``a/b.onnx``)误判成分组名。 - if group is None and "/" in name: - head, _, tail = name.rpartition("/") - if head and tail: - return find_model(root, tail, head) - return None - - -# --------------------------------------------------------------------------- -# 标签归属 -# --------------------------------------------------------------------------- - - -def model_labels(entry: ModelEntry, *, deep: bool = False) -> LabelSet: - """给出某个模型当前生效的标签,附带来源。 - - 优先级:旁挂文件 > ONNX 内嵌 > 模型内嵌 > 占位符。 - - ``deep=False``(默认)只读旁挂文件和 ONNX metadata —— 都快。 - ``deep=True`` 才会去加载模型本身(``.pt`` / ``.engine``), - 代价是要起 Ultralytics、加载权重,秒级,所以默认不开。 - 这样 ``weights.sh list`` 能秒出结果,不因为几个 .pt 卡十几秒。 - """ - files = entry.sorted_files() - if not files: - return LabelSet(names={}, source=SOURCE_PLACEHOLDER, path=None) - - side = label_file_status(files[0])[1] - names = read_label_file(side) if side else None - if names: - return LabelSet(names=names, source=SOURCE_SIDECAR, path=side) - - for p in files: - ext = p.suffix.lower().lstrip(".") - if ext == "onnx": - got = labels_from_onnx(p) - if got: - return LabelSet(names=got[0], source=SOURCE_ONNX, path=p) - elif deep and ext in ("pt", "pth", "engine", "trt", "plan"): - # engine 在当前的 TensorRT 下读不到(没有 metadata API), - # 但万一用户是拿 Ultralytics 导出的,还是值得试一次。 - got = labels_from_model(p) - if got: - return LabelSet(names=got[0], source=SOURCE_MODEL, path=p) - - return LabelSet(names=placeholder_labels(0), source=SOURCE_PLACEHOLDER, path=None) - - -# --------------------------------------------------------------------------- -# 转换规划 -# --------------------------------------------------------------------------- - - -@dataclass(frozen=True) -class ConversionChain: - """从某个输入格式到目标格式,需要依次产出哪些文件。""" - - source_ext: str - target: str - produce: Tuple[str, ...] - - @property - def is_noop(self) -> bool: - return not self.produce - - def describe(self) -> str: - if self.is_noop: - return f"{self.source_ext} → 无需转换" - return f"{self.source_ext} → " + " → ".join(self.produce) - - -def conversion_chain(source_ext: str, target: str = "all") -> ConversionChain: - """算出转换链。 - - TensorRT 的 engine 只能由 ONNX 构建,所以任何通往 engine 的路都必须 - 先得到 ONNX。这点在这里集中表达,避免调用方各写一遍。 - - - ``target="all"``:能产出多少产出多少(.pt → ONNX + engine) - - ``target="onnx"``:只要 ONNX(engine 无法反向拆回 ONNX,返回空) - - ``target="engine"``:只要 engine(.pt 会顺带产出 ONNX 作为中间产物) - """ - src = source_ext.lower().lstrip(".") - tgt = (target or "all").lower().strip() - if tgt not in ("all", "onnx", "engine"): - raise ValueError(f"未知转换目标: {target}(可选 all/onnx/engine)") - - if src not in CONVERTIBLE_INPUT_EXTS: - # 已经是最终产物,或干脆不认识 —— 都交给调用方去报错/跳过。 - return ConversionChain(src, tgt, ()) - - if src in ("pt", "pth"): - if tgt == "onnx": - return ConversionChain(src, tgt, ("onnx",)) - # engine 需要 ONNX 做中间产物,两条路都带上它。 - return ConversionChain(src, tgt, ("onnx", "engine")) - - # src == "onnx" - if tgt == "onnx": - return ConversionChain(src, tgt, ()) - return ConversionChain(src, tgt, ("engine",)) - - -def canonical_path(root: Union[str, Path], group: str, name: str, ext: str) -> Path: - """转换产物该落在哪:``models//.``。 - - 这是"自动改名并归位"的落点。无论输入文件叫什么、放在哪 - (哪怕在 /tmp 或 staging 里叫 ``best_v3_final(1).pt``), - 产出都用调用方给的 ``name`` 和 ``group``。 - """ - return Path(root) / group / f"{name}.{ext.lstrip('.')}" - - -def validate_name(name: str) -> Optional[str]: - """检查模型名是否安全可用作文件名。返回错误信息或 None。""" - n = (name or "").strip() - if not n: - return "模型名不能为空" - if n != name: - return f"模型名首尾不能有空格: {name!r}" - if any(c.isspace() for c in n): - # 名字里有空格会让命令行、site.yaml、ROS 参数到处都要加引号, - # 早晚有人忘。直接禁掉,改用下划线或短横线。 - return "模型名不能含有空格(建议用 _ 或 - 代替)" - bad = set('/\\:*?"<>|') - hit = sorted(bad & set(n)) - if hit: - return f"模型名不能含有这些字符: {''.join(hit)}" - if n.startswith("."): - return "模型名不能以点开头" - if n.endswith(".labels"): - return "不要带 .labels 后缀,标签文件会自动生成" - return None - - -def plan_conversion( - root: Union[str, Path], - source: Union[str, Path], - *, - name: str, - group: str = "yolo", - target: str = "all", -) -> Tuple[ConversionChain, List[Path]]: - """算出一条完整的转换计划:产出链 + 每个产物的最终落点。""" - src = Path(source).expanduser() - chain = conversion_chain(src.suffix, target) - outs = [canonical_path(root, group, name, ext) for ext in chain.produce] - return chain, outs diff --git a/install/arm_application/lib/python3.11/site-packages/arm_application/yolo_detector.py b/install/arm_application/lib/python3.11/site-packages/arm_application/yolo_detector.py deleted file mode 100644 index 9276ca0..0000000 --- a/install/arm_application/lib/python3.11/site-packages/arm_application/yolo_detector.py +++ /dev/null @@ -1,618 +0,0 @@ -#!/usr/bin/env python3 -"""Ultralytics YOLO / TensorRT 封装。 - -对外接口:``resolve_weights``、``YoloDetector``、``Detection``、``pick_best``、 -``MpYoloDetector``。当 ``backend='tensorrt'`` 时,TensorRT 会加载与 -``.onnx`` / ``.pt`` 路径同级的 ``.engine`` 文件。 - -类别名(标签)由 ``model_labels`` 统一提供:优先读权重旁边的 -``<模型名>.labels.yaml``(用户可随时手改),其次读模型内嵌 metadata。 -这样做是因为 TensorRT engine 在当前的 TensorRT Python API 下**无法携带标签**, -只能靠旁挂文件;详见 ``model_labels`` 模块头。 -""" - -from __future__ import annotations - -import logging -import multiprocessing as mp -import time -from dataclasses import dataclass -from pathlib import Path -from typing import List, Optional, Sequence, Union - -import numpy as np - -from .model_labels import ( - SOURCE_PLACEHOLDER, - LabelSet, - describe, - parse_names_field, - placeholder_labels, - read_labels, -) - -logger = logging.getLogger(__name__) - -# 哨兵值:worker 还停在上一次的那帧 —— 调用方不能把它算作漏检。 -INFER_BUSY = object() - - -@dataclass -class Detection: - xyxy: np.ndarray # (4,) float:x1,y1,x2,y2 - conf: float - cls_id: int - cls_name: str - # pose 模型才有:(K, 3) = 每个关键点的 x, y, conf(**原图像素坐标**)。 - # 检测模型恒为 None —— 下游必须先判 None,别假设它有。 - kpts: Optional[np.ndarray] = None - - @property - def cx(self) -> float: - return float(0.5 * (self.xyxy[0] + self.xyxy[2])) - - @property - def cy(self) -> float: - return float(0.5 * (self.xyxy[1] + self.xyxy[3])) - - @property - def area(self) -> float: - return float(max(0.0, self.xyxy[2] - self.xyxy[0]) * max(0.0, self.xyxy[3] - self.xyxy[1])) - - -def _resolve_device(device: str) -> str: - try: - import torch - except Exception: # noqa: BLE001 - return "cpu" - d = (device or "").strip().lower() - if d in ("", "auto", "cuda", "cuda:0", "0", "gpu"): - return "0" if torch.cuda.is_available() else "cpu" - return device.strip() or "cpu" - - -def resolve_weights(weights: Union[str, Path], backend: str = "auto") -> Path: - """当 backend=auto/tensorrt 时,优先使用与 .pt 同级的 TensorRT .engine。""" - p = Path(weights).expanduser() - b = (backend or "auto").strip().lower() - engine = p.with_suffix(".engine") - onnx = p.with_suffix(".onnx") - if b in ("tensorrt", "engine"): - if engine.is_file(): - return engine - raise FileNotFoundError( - f"缺少 TensorRT engine:{engine}。" - f"导出命令:bash ~/ros2/scripts/weights.sh convert {p} --name {p.stem}" - ) - if b == "onnx": - if onnx.is_file(): - return onnx - raise FileNotFoundError(f"缺少 ONNX 文件:{onnx}") - if b in ("", "auto"): - if engine.is_file(): - return engine - if p.is_file(): - return p - if onnx.is_file(): - return onnx - return p - - -def resolve_class_labels(path: Union[str, Path], model=None) -> LabelSet: - """给出一个权重该用的类别标签(旁挂文件优先)。 - - ``model`` 是已经加载好的 Ultralytics 模型对象(可为 None)。顺序: - - 1. ``<模型名>.labels.yaml`` —— 用户可编辑的权威来源 - 2. 传入的 ``model.names`` —— 模型内嵌 metadata - 3. 占位符 ``class_0 / class_1 …`` - - 第 3 步刻意不用 ``str(cid)``。原先读不到名字时会退化成类名 `"0"`, - 和"真的有个叫 0 的类"无法区分,标签丢了都看不出来。 - 占位符 + 一条 warning 让这件事在日志里可见。 - """ - p = Path(path).expanduser() - - # 先只看旁挂文件(快,不加载模型):它必须能覆盖模型内嵌的旧值, - # 否则"我改了标签为什么不生效"会变成很难查的问题。 - labels = read_labels(p, allow_model_metadata=False) - if not labels.is_placeholder: - return labels - - raw = getattr(model, "names", None) if model is not None else None - names = parse_names_field(raw or {}) - if names: - from .model_labels import SOURCE_MODEL - - return LabelSet(names=names, source=SOURCE_MODEL, path=p) - - nc = 0 - try: - nc = int(getattr(model, "nc", 0) or 0) - except (TypeError, ValueError): - nc = 0 - labels = LabelSet(names=placeholder_labels(nc), source=SOURCE_PLACEHOLDER, path=None) - logger.warning( - "模型 %s 没有类别标签,暂时用占位名显示。补一个 %s 即可(改完重跑节点生效)。" - "命令行: bash ~/ros2/scripts/weights.sh labels %s --from-model", - p.name, - p.stem + ".labels.yaml", - p.stem, - ) - return labels - - -class YoloDetector: - def __init__( - self, - weights: Union[str, Path], - *, - conf: float = 0.5, - iou: float = 0.45, - device: str = "", - imgsz: int = 640, - class_ids: Optional[Sequence[int]] = None, - class_names: Optional[Sequence[str]] = None, - ) -> None: - try: - from ultralytics import YOLO - except Exception as exc: # noqa: BLE001 - raise RuntimeError( - "未安装 ultralytics。在 ros_flexiv 环境里执行:pip install ultralytics" - ) from exc - - path = Path(weights).expanduser() - if not path.is_file(): - raise FileNotFoundError( - f"找不到 YOLO 权重:{path}。" - f"请把你的 .pt 放到 ~/ros2/models/yolo/workpiece.pt" - ) - try: - import torch - - # 别让 PyTorch 占满所有 CPU 核心(相机 + ROS 都要用)。 - torch.set_num_threads(1) - torch.set_num_interop_threads(1) - if torch.cuda.is_available(): - torch.backends.cudnn.benchmark = True - except Exception: - pass - - self.device = _resolve_device(device) - self.conf = float(conf) - self.iou = float(iou) - self.imgsz = int(imgsz) - self._half_ok = False - self._is_engine = path.suffix.lower() in {".engine", ".trt"} - self._model = YOLO(str(path), task="detect") - if not self._is_engine: - try: - self._model.fuse() - except Exception: - pass - self.class_ids = set(int(v) for v in class_ids) if class_ids else None - self.class_names = ( - {str(n).strip().lower() for n in class_names if str(n).strip()} - if class_names - else None - ) - self._labels = resolve_class_labels(path, self._model) - self._id_to_name = dict(self._labels.names) - self._warmed = False - self._pending = None - - def warmup(self, *, half: bool = False) -> None: - if self._warmed: - return - if half and (not self._is_engine) and self.device != "cpu": - try: - self._model.to("cuda") - self._model.model.half() - self._half_ok = True - except Exception: - self._half_ok = False - dummy = np.zeros((self.imgsz, self.imgsz, 3), dtype=np.uint8) - self._predict(dummy) - self._warmed = True - - def _predict(self, image_bgr: np.ndarray): - kwargs = dict( - source=image_bgr, - conf=self.conf, - iou=self.iou, - imgsz=self.imgsz, - device=self.device, - verbose=False, - max_det=20, - ) - if self._half_ok and not self._is_engine: - kwargs["quantize"] = 16 - try: - import torch - - ctx = torch.inference_mode() - except Exception: - from contextlib import nullcontext - - ctx = nullcontext() - with ctx: - return self._model.predict(**kwargs) - - def detect( - self, - image_bgr: np.ndarray, - conf: float | None = None, - iou: float | None = None, - imgsz: int | None = None, - **_kwargs, - ) -> List[Detection]: - """给孔检测器用的别名接口(xyxy + conf)。""" - if conf is not None: - self.conf = float(conf) - if iou is not None: - self.iou = float(iou) - if imgsz is not None: - self.imgsz = int(imgsz) - return self.infer(image_bgr) - - def infer(self, image_bgr: np.ndarray, *, half: bool = False, seq: int = 0) -> List[Detection]: - del seq - if not self._warmed: - self.warmup(half=half) - results = self._predict(image_bgr) - if not results: - return [] - r0 = results[0] - boxes = getattr(r0, "boxes", None) - if boxes is None or len(boxes) == 0: - return [] - - out: List[Detection] = [] - xyxy = boxes.xyxy.detach().cpu().numpy() - confs = boxes.conf.detach().cpu().numpy() - clss = boxes.cls.detach().cpu().numpy().astype(int) - for i in range(len(xyxy)): - cid = int(clss[i]) - # 用 LabelSet.get:读不到名字时给 class_N 占位,而不是退化成裸数字 "0"。 - name = self._labels.get(cid) - if self.class_ids is not None and cid not in self.class_ids: - continue - if self.class_names is not None and name.lower() not in self.class_names: - continue - out.append( - Detection( - xyxy=xyxy[i].astype(float), - conf=float(confs[i]), - cls_id=cid, - cls_name=name, - ) - ) - out.sort(key=lambda d: d.conf, reverse=True) - return out - - def submit(self, image_bgr: np.ndarray, seq: int = 0) -> None: - self._pending = (int(seq), image_bgr) - - def wait_result(self, timeout: float = 0.045): - del timeout - if self._pending is None: - return None - seq, img = self._pending - self._pending = None - t0 = time.monotonic() - dets = self.infer(img, seq=seq) - return seq, dets, (time.monotonic() - t0) * 1000.0 - - -def build_detector( - weights: Union[str, Path], - *, - backend: str = "auto", - conf: float = 0.25, - iou: float = 0.45, - device: str = "", - imgsz: int = 640, -): - """按权重类型挑检测器:pose 模型走 ``PoseDetector``,否则走 ``YoloDetector``。 - - 为什么要这个工厂:ultralytics 解不了 pose 的 TensorRT engine(见 - ``pose_detector`` 模块头),所以 pose 必须换成自解码实现。判断依据是模型 - 是不是 ``task=pose`` —— 直接读旁边 ``.onnx`` 的 metadata,不靠调用方声明。 - - 返回对象统一有 ``detect()/infer()/warmup()/imgsz/class_names/class_ids``。 - """ - path = Path(weights).expanduser() - from .pose_detector import PoseDetector, is_pose_model - - if is_pose_model(path): - logger.info("检测到 pose 模型 %s → 用 PoseDetector(自解码关键点)", path.name) - return PoseDetector( - path, - conf=conf, - iou=iou, - device=device or "0", - imgsz=imgsz, - ) - return YoloDetector( - path, - conf=conf, - iou=iou, - device=device, - imgsz=imgsz, - ) - - -def _yolo_worker_main(q_in, q_out, cfg: dict) -> None: - """spawn 出来的子进程:只跑 GPU 上的检测。这里绝不能 import rclpy。""" - try: - path = resolve_weights(cfg["weights"], cfg.get("backend") or "auto") - det = build_detector( - path, - backend=cfg.get("backend") or "auto", - conf=float(cfg.get("conf") or 0.25), - iou=float(cfg.get("iou") or 0.45), - device=str(cfg.get("device") or "0"), - imgsz=int(cfg.get("imgsz") or 416), - ) - det.warmup(half=bool(cfg.get("half", True))) - q_out.put(("ready", str(path))) - except Exception as exc: # noqa: BLE001 - q_out.put(("error", str(exc))) - return - while True: - item = q_in.get() - if item is None: - return - # 一直排空到队列里最新的帧 —— 绝不把 GPU 浪费在过期图像上。 - try: - while True: - newer = q_in.get_nowait() - if newer is None: - return - item = newer - except Exception: - pass - seq, image = item - try: - t0 = time.monotonic() - dets = det.infer(image, half=bool(cfg.get("half", True))) - gpu_ms = (time.monotonic() - t0) * 1000.0 - packed = [ - ( - d.xyxy.astype(np.float32), - float(d.conf), - int(d.cls_id), - str(d.cls_name), - None if d.kpts is None else np.asarray(d.kpts, dtype=np.float32), - ) - for d in dets - ] - _put_drop_old(q_out, ("ok", seq, packed, gpu_ms)) - except Exception as exc: # noqa: BLE001 - _put_drop_old(q_out, ("error", str(exc))) - - -def _put_drop_old(q, item) -> None: - """绝不让 GPU 进程因为结果队列满了而阻塞。""" - try: - q.put_nowait(item) - return - except Exception: - pass - try: - q.get_nowait() - except Exception: - pass - try: - q.put_nowait(item) - except Exception: - pass - - -class YoloInferProcess: - """把 YOLO 放进 spawn() 子进程,让 ROS 回调永远不用和 PyTorch 抢 GIL。""" - - def __init__(self, cfg: dict) -> None: - self._cfg = dict(cfg) - self._p = None - self._start() - - def _start(self) -> None: - ctx = mp.get_context("spawn") - # maxsize=2 + worker 排空到最新:父进程永远不需要主动丢帧 - # (之前 Queue put_nowait/get_nowait 的竞争,正是 worker 明明活着 - # 却出现数秒“静默”冻结的根源)。 - self._q_in = ctx.Queue(maxsize=2) - self._q_out = ctx.Queue(maxsize=4) - self._p = ctx.Process( - target=_yolo_worker_main, - args=(self._q_in, self._q_out, self._cfg), - name="yolo_infer", - daemon=True, - ) - self._p.start() - msg = self._q_out.get(timeout=90.0) - if not msg or msg[0] != "ready": - err = msg[1] if msg and len(msg) > 1 else "worker failed" - raise RuntimeError(f"YOLO 工作进程:{err}") - self.weights_path = str(msg[1]) - self.imgsz = int(self._cfg.get("imgsz") or 416) - - def restart(self) -> None: - """杀掉卡死 / 挂掉的 worker,再起一个新的(重新加载 engine 约 2-5 s)。""" - self.close() - self._start() - - @property - def alive(self) -> bool: - return bool(self._p is not None and self._p.is_alive()) - - def submit(self, image_bgr: np.ndarray, seq: int = 0) -> bool: - """把最新一帧排进队列。如果 worker 正忙就跳过 —— 它在每次推理后都会 - 排空到队列里最新的帧,所以不会跑任何过期数据。 - - 返回是否真的进队。进不去必须告诉调用方,否则一次性会以为「已经在跑」 - 而空等,把 D405 也卡住。 - """ - if not self.alive: - raise RuntimeError("YOLO 工作进程已死亡") - try: - self._q_in.put((int(seq), image_bgr), timeout=0.010) - return True - except Exception: - return False - - def wait_result(self, timeout: float = 0.045): - """返回 ``(seq, list[Detection], gpu_ms)`` 或 ``None``。""" - if not self.alive: - raise RuntimeError("YOLO 工作进程已死亡") - deadline = time.monotonic() + max(0.004, float(timeout)) - latest = None - while time.monotonic() < deadline: - try: - msg = self._q_out.get( - timeout=max(0.001, deadline - time.monotonic()) - ) - except Exception: - break - latest = self._parse_out(msg) - while True: - try: - extra = self._q_out.get_nowait() - except Exception: - break - parsed = self._parse_out(extra) - if parsed is not None: - latest = parsed - if latest is not None: - break - return latest - - def _parse_out(self, msg): - if not msg: - return None - if msg[0] == "error": - raise RuntimeError(str(msg[1])) - if msg[0] != "ok": - return None - seq, packed = int(msg[1]), msg[2] - gpu_ms = float(msg[3]) if len(msg) > 3 else 0.0 - dets = [] - for row in packed: - # 兼容旧格式(4 元组,无关键点),免得子进程和父进程版本不一致时炸掉。 - xyxy, conf, cid, name = row[0], row[1], row[2], row[3] - kpts = row[4] if len(row) > 4 else None - dets.append( - Detection( - xyxy=np.asarray(xyxy, dtype=float), - conf=float(conf), - cls_id=int(cid), - cls_name=str(name), - kpts=None if kpts is None else np.asarray(kpts, dtype=float), - ) - ) - return seq, dets, gpu_ms - - def infer(self, image_bgr: np.ndarray, *, half: bool = False, seq: int = 0): - """兼容接口:提交 + 等待。要做流水线的话优先用 submit/wait_result。""" - del half - self.submit(image_bgr, seq) - got = self.wait_result(timeout=0.08) - if got is None: - return INFER_BUSY - return got[1] - - def close(self) -> None: - if self._p is None: - return - try: - self._q_in.put_nowait(None) - except Exception: - pass - self._p.join(timeout=2.0) - if self._p.is_alive(): - self._p.terminate() - self._p.join(timeout=1.0) - if self._p.is_alive(): - self._p.kill() # 卡在 CUDA 调用里出不来 —— 直接 SIGKILL - self._p.join(timeout=1.0) - self._p = None - - -def _iou_xyxy(a: np.ndarray, b: np.ndarray) -> float: - ax1, ay1, ax2, ay2 = [float(v) for v in a] - bx1, by1, bx2, by2 = [float(v) for v in b] - ix1, iy1 = max(ax1, bx1), max(ay1, by1) - ix2, iy2 = min(ax2, bx2), min(ay2, by2) - inter = max(0.0, ix2 - ix1) * max(0.0, iy2 - iy1) - ua = ( - max(0.0, ax2 - ax1) * max(0.0, ay2 - ay1) - + max(0.0, bx2 - bx1) * max(0.0, by2 - by1) - - inter - ) - return float(inter / ua) if ua > 1e-6 else 0.0 - - -def pick_best( - dets: Sequence[Detection], - *, - prefer_center: Optional[tuple] = None, - prev_uv: Optional[np.ndarray] = None, - prev_xyxy: Optional[np.ndarray] = None, - max_track_px: float = 320.0, - reacquire_conf: float = 0.18, - lock_iou: float = 0.08, - min_conf: float = 0.12, - min_area: float = 4000.0, -) -> Optional[Detection]: - """让当前工件在快速运动下也能被持续跟踪。 - - 用一个较宽的匹配门限去和**预测出的**上一帧检测框做匹配。如果 IoU 不达标、 - 但 YOLO 仍以高于 min_conf 的置信度报出了目标,就保留该检测 —— 不要返回 - None(那正是运动过程中目标丢失的主要来源)。 - 过小的框(logo / 通止规尖)会被拒掉,避免机械臂锁到垫子上。 - """ - if not dets: - return None - # 已锁定的跟踪在运动(模糊)时可能掉到 min_conf 以下;但新锁定不允许这样。 - floor = max(0.06, 0.50 * float(min_conf)) - usable = [d for d in dets if float(d.conf) >= floor and float(d.area) >= float(min_area)] - if not usable: - return None - - locked: List[Detection] = [] - if prev_xyxy is not None: - pw = max(8.0, float(prev_xyxy[2] - prev_xyxy[0])) - ph = max(8.0, float(prev_xyxy[3] - prev_xyxy[1])) - gate = max(0.90 * float(max_track_px), 1.25 * float(np.hypot(pw, ph))) - pcx = 0.5 * (float(prev_xyxy[0]) + float(prev_xyxy[2])) - pcy = 0.5 * (float(prev_xyxy[1]) + float(prev_xyxy[3])) - for d in usable: - iou = _iou_xyxy(d.xyxy, prev_xyxy) - dpx = float(np.hypot(d.cx - pcx, d.cy - pcy)) - if iou >= float(lock_iou) or dpx <= gate: - locked.append(d) - - if locked: - return max( - locked, - key=lambda d: (float(d.conf) * (float(d.area) ** 0.25), float(d.conf)), - ) - - def score_new(d: Detection) -> float: - s = float(d.conf) * 10.0 + 0.015 * np.sqrt(max(float(d.area), 1.0)) - if prefer_center is not None: - cx0, cy0 = float(prefer_center[0]), float(prefer_center[1]) - s -= 1e-6 * ((d.cx - cx0) ** 2 + (d.cy - cy0) ** 2) - if prev_uv is not None: - dpx = float(np.hypot(d.cx - float(prev_uv[0]), d.cy - float(prev_uv[1]))) - if dpx <= max_track_px: - s += 2.0 * (1.0 - dpx / max(max_track_px, 1.0)) - return s - - best = max(usable, key=score_new) - # 快速移动:即使 YOLO 报出的框离上一帧很远,也保留这个实时检测。 - need = max(float(min_conf), float(reacquire_conf)) - if float(best.conf) >= need: - return best - return None diff --git a/install/arm_application/share/ament_index/resource_index/packages/arm_application b/install/arm_application/share/ament_index/resource_index/packages/arm_application deleted file mode 100644 index e69de29..0000000 diff --git a/install/arm_application/share/ament_index/resource_index/packages/arm_application b/install/arm_application/share/ament_index/resource_index/packages/arm_application new file mode 120000 index 0000000..26ed9ce --- /dev/null +++ b/install/arm_application/share/ament_index/resource_index/packages/arm_application @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/resource/arm_application \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/demo.yaml b/install/arm_application/share/arm_application/config/demo.yaml deleted file mode 100644 index c127573..0000000 --- a/install/arm_application/share/arm_application/config/demo.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# Application-level waypoints / task parameters -demo: - poses: [home, ready, inspect, home] - velocity_scale: 0.5 - dwell_sec: 1.0 diff --git a/install/arm_application/share/arm_application/config/demo.yaml b/install/arm_application/share/arm_application/config/demo.yaml new file mode 120000 index 0000000..c675e00 --- /dev/null +++ b/install/arm_application/share/arm_application/config/demo.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/demo.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/dual_grippers.yaml b/install/arm_application/share/arm_application/config/dual_grippers.yaml deleted file mode 100644 index 1bcd231..0000000 --- a/install/arm_application/share/arm_application/config/dual_grippers.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# DualArmGripperManager(load_dual_arm_gripper_config(path)) 的可选兜底配置。 -# 日常使用通过 load_from_site() 读取 ~/ros2/config/site.yaml。 -left_arm: - robot_sn: "Rizon4-063989" - gripper_port: "/dev/ttyUSB0" - gripper_slave_id: 1 - gripper_baudrate: 115200 -right_arm: - robot_sn: "Rizon4-063991" - gripper_port: "/dev/ttyUSB1" - gripper_slave_id: 1 - gripper_baudrate: 115200 -gripper: - parallel: - stroke_min: 0.0 - stroke_max: 20.0 - default_speed: 50 - default_force: 20 - auto_initialize: true - rotary: - auto_initialize: false - default_speed: 50 - default_torque: 50 - finger_open_per_mille: 1000 - finger_close_per_mille: 0 diff --git a/install/arm_application/share/arm_application/config/dual_grippers.yaml b/install/arm_application/share/arm_application/config/dual_grippers.yaml new file mode 120000 index 0000000..3b60bd3 --- /dev/null +++ b/install/arm_application/share/arm_application/config/dual_grippers.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/dual_grippers.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/hole_detect.yaml b/install/arm_application/share/arm_application/config/hole_detect.yaml deleted file mode 100644 index 0c9b5f8..0000000 --- a/install/arm_application/share/arm_application/config/hole_detect.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# 工件二阶段检测配置:YOLO 定位 + HoughCircles 螺纹孔 -# 供 hole_detect_hough.py / hole_detect_node(backend=two_stage)使用 -# 操作入口:bash ~/ros2/scripts/run_hole_detect.sh --arm 89|91 --preview - -# ----- YOLO ----- -conf: 0.25 -iou: 0.7 -imgsz: 640 - -# ----- 居中门控:bbox 中心接近画面中心才做二阶圆孔检测 ----- -# 精对准 k1/k2 时 stage2 会 skip 此门控(对准目标孔后工件必然离开画面中心) -center_gate_enable: true -center_max_offset_ratio_x: 0.15 # |bbox_cx - 图像中心x| <= 该比例 * 宽 -center_max_offset_ratio_y: 0.18 # |bbox_cy - 图像中心y| <= 该比例 * 高 -center_gate_draw: true # 可视化画出允许居中区域 -refine_hole_centers: true # Hough 后再用暗孔矩细化亚像素圆心 - -# ----- ROI:bbox 向外膨胀像素,裁剪时做边界保护 ----- -bbox_padding: 25 - -# ----- ROI 预处理 ----- -gaussian_ksize: 5 # 必须为奇数 -gaussian_sigma: 1.5 - -# ----- HoughCircles(全部由此读取)----- -hough_dp: 1.2 -hough_min_dist: 50 -hough_param1: 100 -hough_param2: 26 -hough_min_radius: 10 -hough_max_radius: 30 - -# ----- 工业校验 ----- -min_radius: 10 # 有效圆孔半径下限(滤掉噪点) -max_radius: 30 # 有效圆孔半径上限(滤掉中间大孔) -hole_distance_min: 150 # 两孔像素距离下限 -hole_distance_max: 700 # 两孔像素距离上限 - -# ----- 时序稳帧(抑制闪烁)----- -stabilize_hold_frames: 15 # 连续失败多少帧后才清空结果 -stabilize_ema_alpha: 0.35 # 中心点/半径 EMA,越小越稳 -stabilize_max_jump: 60 # 单帧跳变超过该像素则忽略(防闪) - -# ----- 螺纹嵌件对(亮环签名 + 关于中心对称,深度自适应)----- -insert_pair_enable: true -insert_percentile: 96 -insert_bolt_radius_mm: 29.0 # 两目标孔物理间距~58mm → 螺栓圆半径29mm;按深度换算像素,尺度不变 diff --git a/install/arm_application/share/arm_application/config/hole_detect.yaml b/install/arm_application/share/arm_application/config/hole_detect.yaml new file mode 120000 index 0000000..1cd0bb0 --- /dev/null +++ b/install/arm_application/share/arm_application/config/hole_detect.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/hole_detect.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/hole_insert.yaml b/install/arm_application/share/arm_application/config/hole_insert.yaml deleted file mode 100644 index e499818..0000000 --- a/install/arm_application/share/arm_application/config/hole_insert.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# 孔定位检测配置(改 conf / 内参 / 双孔间距即可,不必改代码) -# 权重来源:优先 site.yaml(hole_detect.weights / paths.hole_weights); -# 两者都缺时兜底到 models/yolo/gongjian0929.onnx。 -# 原先这里注释写的是 best.pt —— 该文件不存在,已修正。 -# backend: yolo | hough | two_stage(two_stage 请用 hole_detect.yaml) - -model_path: "" -backend: yolo # yolo | faster_rcnn | hough -num_classes: 1 # 单类孔=1;左右孔分两类=2 -expected_holes: 2 -min_hole_sep_px: 20 -max_hole_sep_px: 2000 - -conf: 0.25 -iou: 0.7 -imgsz: 640 - -gaussian_ksize: 5 -gaussian_sigma: 1.5 -hough_dp: 1.2 -hough_min_dist: 40 -hough_param1: 100 -hough_param2: 28 -hough_min_radius: 6 -hough_max_radius: 45 - -stabilize_window: 7 -stabilize_ema: 0.35 -stabilize_max_jump_px: 60 - -camera_intrinsics: - fx: 425.0 - fy: 425.0 - cx: 640.0 - cy: 360.0 - -default_depth_m: 0.10 diff --git a/install/arm_application/share/arm_application/config/hole_insert.yaml b/install/arm_application/share/arm_application/config/hole_insert.yaml new file mode 120000 index 0000000..b43b02e --- /dev/null +++ b/install/arm_application/share/arm_application/config/hole_insert.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/hole_insert.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/perception.yaml b/install/arm_application/share/arm_application/config/perception.yaml deleted file mode 100644 index 5685bf9..0000000 --- a/install/arm_application/share/arm_application/config/perception.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# perception_node 的默认值。launch 会用 ~/ros2/config/site.yaml 的 yolo: / paths: 覆盖。 -# 日常调参**不要改这里**,改 site.yaml。 -# -# 注意:下面 weights / conf / iou / imgsz / device / half_precision / min_conf 这几项 -# 一定被 site.yaml 覆盖,这里只是"没有 site.yaml 时的兜底"。所以它们必须和 site.yaml -# 保持一致 —— 曾经这里写死 imgsz=416 而实际模型是 640,一旦覆盖失效就会用错尺寸。 - -perception_node: - ros__parameters: - camera_source: "d405" - camera_namespace: "" - image_topic: "" - camera_info_topic: "" - depth_topic: "/d405/aligned_depth_to_color/image_raw" - weights: "/home/cc/ros2/models/yolo/gongjian0929.onnx" - conf: 0.10 - iou: 0.45 - imgsz: 640 - device: "0" - half_precision: true - min_conf: 0.12 - vision_hz: 20.0 - z_ref_m: 0.30 - # 大跳变门限 + 重新捕获:快速运动绝不能把跟踪卡死 - jump_px: 280.0 - jump_z_m: 0.20 - min_depth_m: 0.05 - max_depth_m: 2.50 - object_frame: "tracked_object" - camera_frame: "d405_color_optical_frame" - # 灵敏的 KF + 向原始观测融合 - kf_q_pos: 0.002 - kf_q_vel: 0.05 - kf_r_pos: 0.0008 - meas_blend: 0.65 - # 更快的推理 + 更紧的框跟随 - infer_max_width: 640 - box_ema_alpha: 0.85 - miss_clear_frames: 2 - # 第 4 项 — 自适应 Z 深度低通滤波 - z_alpha_min: 0.10 - z_alpha_max: 0.60 - z_alpha_gain: 2.0 - feature_mode: "plane" # stereo 为 3D 质心;box = 单目框中心的射线 - plane_inlier_m: 0.008 - plane_band_m: 0.06 diff --git a/install/arm_application/share/arm_application/config/perception.yaml b/install/arm_application/share/arm_application/config/perception.yaml new file mode 120000 index 0000000..d9557b2 --- /dev/null +++ b/install/arm_application/share/arm_application/config/perception.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/perception.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/servo.yaml b/install/arm_application/share/arm_application/config/servo.yaml deleted file mode 100644 index ad71745..0000000 --- a/install/arm_application/share/arm_application/config/servo.yaml +++ /dev/null @@ -1,69 +0,0 @@ -# servo_node 的默认值。launch 会用 ~/ros2/config/site.yaml 的 servo: 覆盖。 -# 日常调参不要改这个文件。 - -servo_node: - ros__parameters: - joint_prefix: "Rizon4-063989_" - joint_names: [joint1, joint2, joint3, joint4, joint5, joint6, joint7] - base_frame: "Rizon4-063989_base_link" - ee_frame: "Rizon4-063989_flange" - camera_frame: "d405_color_optical_frame" - traj_topic: "rizon_arm_controller/joint_trajectory" - point_topic: "visual_servo/filtered_point" - handeye_file: "src/arm_application/config/handeye_result.yaml" - use_static_handeye_tf: false - handeye_child_frame: "d405_color_optical_frame" - - control_hz: 100.0 - z_ref_m: 0.30 - enable_control: false - max_extrapolate_sec: 0.08 - - # 第 1 项 — 丢失目标硬停 - watchdog_timeout_sec: 0.3 - lost_timeout_sec: 0.3 - - kp_xy: 2.00 - ki_xy: 0.02 - kd_xy: 0.50 - kp_z: 1.20 - ki_z: 0.02 - kd_z: 0.45 - i_limit_xy: 0.03 - i_limit_z: 0.025 - # 第 2 项 — 积分分离 - i_sep_pos_m: 0.005 - i_sep_ang_rad: 0.02 - - deadzone_m: 0.0015 - deadzone_z_m: 0.006 - v_max_xy: 0.15 - v_max_z: 0.07 - a_max: 0.70 - - # 第 3 项 — 速度低通滤波 - vel_lpf_alpha: 0.40 - wz_lpf_alpha: 0.40 - - # 第 5 项 — dq 滑动窗口 - dq_window_size: 5 - - min_ee_z_m: 0.20 - workspace_xyz_min: [0.08, -0.55, 0.18] - workspace_xyz_max: [0.85, 0.55, 0.65] - ee_x_m: 0.25 - ee_y_m: 0.00 - ee_z_m: 0.25 - ee_hold_xy: false - ee_vertical_down: true - ee_hold_kp: 2.0 - ee_w_max: 0.60 - damping: 0.08 - max_qdot: 0.85 - exec_horizon_sec: 0.20 - traj_stream_hz: 15.0 - min_cmd_delta_rad: 0.004 - camera_fx: 390.0 - camera_fy: 390.0 - camera_cx: 320.0 - camera_cy: 240.0 diff --git a/install/arm_application/share/arm_application/config/servo.yaml b/install/arm_application/share/arm_application/config/servo.yaml new file mode 120000 index 0000000..49253e0 --- /dev/null +++ b/install/arm_application/share/arm_application/config/servo.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/servo.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml b/install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml deleted file mode 100644 index 6ab0a4b..0000000 --- a/install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml +++ /dev/null @@ -1,15 +0,0 @@ -# Auto-converted from Flexiv Elements .traj (joints: deg -> rad) -# ROS params: flat waypoint_positions + waypoint_times (no nested dicts) -run_joint_trajectory: - ros__parameters: - joint_prefix: "Rizon4-063989_" - joint_names: [joint1, joint2, joint3, joint4, joint5, joint6, joint7] - velocity_scale: 0.2 - waypoint_times: [3.0, 6.0, 9.92, 12.92, 20.54] - waypoint_positions: [ - -0.121649, 0.522726, 0.030020, 1.610764, -0.113097, -0.218864, -0.006458, # WPT0 - -0.006889, 0.050452, 0.128620, 1.823614, -0.044784, 0.338795, -0.091060, # WPT1 - -0.009020, -0.311032, 0.106302, 2.548074, -0.066892, 1.318222, -0.091348, # WPT2 - 0.014012, -0.847726, 0.074948, 2.395150, -0.251875, 1.738244, -0.091738, # WPT3 - 0.089637, 0.502090, 0.299444, 1.749088, 0.070761, -0.168363, -0.091845, # WPT4 - ] diff --git a/install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml b/install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml new file mode 120000 index 0000000..5683a01 --- /dev/null +++ b/install/arm_application/share/arm_application/config/xunhuan_trajectory.yaml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/config/xunhuan_trajectory.yaml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/demo.launch.py b/install/arm_application/share/arm_application/launch/demo.launch.py deleted file mode 100644 index 29d14a6..0000000 --- a/install/arm_application/share/arm_application/launch/demo.launch.py +++ /dev/null @@ -1,19 +0,0 @@ -from launch import LaunchDescription -from launch_ros.actions import Node - - -def generate_launch_description(): - return LaunchDescription([ - Node( - package='arm_application', - executable='demo_named_poses', - name='demo_named_poses', - output='screen', - parameters=[{ - 'poses': ['home', 'ready', 'inspect', 'home'], - 'velocity_scale': 0.5, - 'dwell_sec': 1.0, - 'loops': 1, - }], - ), - ]) diff --git a/install/arm_application/share/arm_application/launch/demo.launch.py b/install/arm_application/share/arm_application/launch/demo.launch.py new file mode 120000 index 0000000..78b7b86 --- /dev/null +++ b/install/arm_application/share/arm_application/launch/demo.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/demo.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/dh_pgea.launch.py b/install/arm_application/share/arm_application/launch/dh_pgea.launch.py deleted file mode 100644 index 5f9203f..0000000 --- a/install/arm_application/share/arm_application/launch/dh_pgea.launch.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -"""启动 DH PGEA Modbus 节点。配置来自 ``~/ros2/config/site.yaml`` 的 ``gripper`` 段。""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path - -from launch import LaunchDescription -from launch.actions import LogInfo, OpaqueFunction -from launch_ros.actions import Node - - -def _ws_root() -> Path: - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - here = Path(__file__).resolve() - for p in [here.parents[i] for i in range(2, 8)]: - if (p / "config" / "site.yaml").is_file(): - return p - return Path.home() / "ros2" - - -def _setup(context, *args, **kwargs): - root = _ws_root() - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import gripper_overrides, load_site, site_path # type: ignore - - cfg = os.environ.get("SITE_CONFIG", "").strip() - path = Path(cfg).expanduser() if cfg else site_path() - if not path.is_file(): - path = root / "config" / "site.yaml" - data = load_site(path) - params = gripper_overrides(data) - return [ - LogInfo( - msg=( - f"[dh_pgea] {params.get('model')} SN={params.get('serial_number')} " - f"{params.get('port')} @{params.get('baud')} site={path}" - ) - ), - LogInfo( - msg=( - "[dh_pgea] Flexiv 的 load_gripper 保持 false —— 这里是 DH Modbus," - "不是 Flexiv Studio 夹爪。" - ) - ), - Node( - package="arm_application", - executable="dh_pgea", - name="dh_pgea", - output="screen", - parameters=[params], - ), - ] - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription([OpaqueFunction(function=_setup)]) diff --git a/install/arm_application/share/arm_application/launch/dh_pgea.launch.py b/install/arm_application/share/arm_application/launch/dh_pgea.launch.py new file mode 120000 index 0000000..d87dd75 --- /dev/null +++ b/install/arm_application/share/arm_application/launch/dh_pgea.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/dh_pgea.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/dual_gripper.launch.py b/install/arm_application/share/arm_application/launch/dual_gripper.launch.py deleted file mode 100644 index 13831cf..0000000 --- a/install/arm_application/share/arm_application/launch/dual_gripper.launch.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -"""启动双路 DH 夹爪。端口来自 ``site.yaml`` 的 ``robots[].gripper``。""" - -from __future__ import annotations - -import os -from pathlib import Path - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, LogInfo -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def generate_launch_description() -> LaunchDescription: - sides = LaunchConfiguration("sides") - allow_offline = LaunchConfiguration("allow_offline") - site = os.environ.get("SITE_CONFIG") or str(Path.home() / "ros2" / "config" / "site.yaml") - return LaunchDescription( - [ - DeclareLaunchArgument("sides", default_value="left,right"), - DeclareLaunchArgument("allow_offline", default_value="true"), - LogInfo(msg=f"[dual_gripper] site={site}(arm_msgs,IPC Modbus,不是 Flexiv 夹爪)"), - Node( - package="arm_application", - executable="dual_gripper", - name="dual_gripper_driver", - output="screen", - parameters=[ - { - "config_file": "", - "auto_connect": True, - "allow_offline": allow_offline, - "publish_hz": 10.0, - "sides": sides, - } - ], - ), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/dual_gripper.launch.py b/install/arm_application/share/arm_application/launch/dual_gripper.launch.py new file mode 120000 index 0000000..244db65 --- /dev/null +++ b/install/arm_application/share/arm_application/launch/dual_gripper.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/dual_gripper.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/gauge_assembly.launch.py b/install/arm_application/share/arm_application/launch/gauge_assembly.launch.py deleted file mode 100755 index 0c4e1ed..0000000 --- a/install/arm_application/share/arm_application/launch/gauge_assembly.launch.py +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env python3 -"""启动通止规装配主流程(看板 S00–S11)。 - -与 stage2/stage3 的 launch 差别:**这里不检查任何服务**。 -"所有服务是否就绪"是 S00 的职责(``gauge_boot`` + 节点里的探测), -在 launch/shell 里再查一遍就会出现两处判据 —— 一处改了另一处没改, -现场表现为"脚本说没问题、节点说没数据"。 - -唯一在这里做的是**发布手眼静态 TF**:腕部相机的 eye-in-hand 外参是主流程 -(S05 精拍定位)算坐标的前提,而它只能由标定产物提供(site.yaml → -paths.handeye_file)。文件不存在时不发 TF,节点会在 S05 报"查不到 TF"。 - -用法(一般由 scripts/run_gauge_assembly.sh 调用):: - - ros2 launch arm_application gauge_assembly.launch.py - ros2 launch arm_application gauge_assembly.launch.py dry_run:=true holes_total:=1 -""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path - -from launch import LaunchDescription -from launch.actions import ( - DeclareLaunchArgument, - LogInfo, - OpaqueFunction, - RegisterEventHandler, - Shutdown, -) -from launch.event_handlers import OnProcessExit -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def _ws_root() -> Path: - """工作区根目录:优先环境变量,其次向上找 config/site.yaml。""" - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - here = Path(__file__).resolve() - for i in range(2, 8): - p = here.parents[i] - if (p / "config" / "site.yaml").is_file(): - return p - return Path.home() / "ros2" - - -def _handeye_xyz_xyzw(path: str): - """读手眼文件 → ``(tx, ty, tz, qx, qy, qz, qw)``。 - - **不要在这里再写一遍四元数换算**:这段换算在别的 launch 里已各抄了一遍, - 抄错过的症状是"手眼 TF 差了 30°"(定位总能到附近,永远差一点)。 - 实现只有一份在 ``arm_application.handeye_lib``,且被回环测试钉住。 - """ - from arm_application.handeye_lib import read_transform_yaml - - xyz, quat = read_transform_yaml(path) - return ( - float(xyz[0]), float(xyz[1]), float(xyz[2]), - float(quat[0]), float(quat[1]), float(quat[2]), float(quat[3]), - ) - - -def _launch_setup(context, *args, **kwargs): - root = _ws_root() - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import apply_active_arm, load_site, site_path # type: ignore - - cfg = os.environ.get("SITE_CONFIG", "").strip() - path = Path(cfg).expanduser() if cfg else site_path() - if not path.is_file(): - path = root / "config" / "site.yaml" - data = load_site(path) - merged, robot = apply_active_arm(data) - - ee_frame = str(robot.get("ee_frame") or f"{robot.get('sn')}_flange") - base_frame = str( - robot.get("base_frame") - or os.environ.get("SITE_BASE_FRAME") - or f"{robot.get('sn')}_base_link" - ) - handeye = str((merged.get("paths") or {}).get("handeye_file") or "").strip() - if not handeye: - handeye = str((robot.get("paths") or {}).get("handeye_file") or "").strip() - cam_cfg = merged.get("camera") or {} - cam = str(cam_cfg.get("name") or "d405").strip().strip("/") - cam_frame = f"{cam}_color_optical_frame" - - # ---- 手外相机(eye-to-hand):S03 粗定位用的外参 ---- - # 名字按 site.yaml 的 cameras 注册表(role=overhead*)由**唯一实现**解析 - # (site_io.overhead_camera,节点自己取命名空间也走它)。 - sys.path.insert(0, str(root / "src" / "arm_application")) - from arm_application.site_io import ( # type: ignore - eye_to_hand_result_name, - handeye_static_tf_frames, - overhead_camera as _overhead_camera, - ) - - from export_site_env import arm_short_id # type: ignore - - over_cfg, _ = _overhead_camera(merged, robot) - over_cam = str(over_cfg.get("name") or "").strip("/") - over_frame = f"{over_cam}_color_optical_frame" if over_cam else "" - # 眼在手外的产物名走 site_io.eye_to_hand_result_name(唯一口径), - # 不在这里自己拼(拼错/漏拼会让 S03 找不到刚标完的文件)。 - short = arm_short_id(str(robot.get("sn") or "")) - e2h_file = ( - root / "handeye" / "results" / eye_to_hand_result_name(short, over_cam) - if over_cam - else None - ) - - def _flag(name: str) -> bool: - return LaunchConfiguration(name).perform(context).strip().lower() in ( - "1", "true", "yes", "on", - ) - - dry_run = _flag("dry_run") - holes = LaunchConfiguration("holes_total").perform(context).strip() - # 仿真里必须 true:本节点所有 header.stamp 比对和 TF 查询都按这个时钟走。 - # 忘了开的话症状是"相机没数据/TF 查不到",看不出真正原因(脚本 --sim 会带)。 - use_sim_time = _flag("use_sim_time") - backend = LaunchConfiguration("gripper_backend").perform(context).strip() or "auto" - result_file = LaunchConfiguration("result_file").perform(context).strip() - - # 是否由本 launch 发手眼静态 TF。真机必须发(相机系与法兰之间除了标定值 - # 没有别的来源);仿真**不能**发 —— 仿真里相机在 URDF 里就挂在法兰上, - # 再发一条同父子关系的静态 TF 会出现两个父节点(TF_MULTIPLE_AUTHORITIES), - # 查出来的位姿在两条之间跳。脚本 --sim 会传 false。 - publish_handeye_tf = _flag("publish_handeye_tf") - nodes = [] - frames = [] - if publish_handeye_tf and os.path.isfile(handeye): - try: - tx, ty, tz, qx, qy, qz, qw = _handeye_xyz_xyzw(handeye) - except Exception as exc: # noqa: BLE001 - frames.append(f"[gauge] 手眼文件读不了({handeye}):{exc}") - else: - frames.append(f"[gauge] 手眼 TF {ee_frame} ← {cam_frame}({Path(handeye).name})") - nodes.append( - Node( - package="tf2_ros", - executable="static_transform_publisher", - name="gauge_handeye_static_tf", - arguments=[ - "--x", str(tx), "--y", str(ty), "--z", str(tz), - "--qx", str(qx), "--qy", str(qy), "--qz", str(qz), "--qw", str(qw), - "--frame-id", ee_frame, - "--child-frame-id", cam_frame, - ], - output="screen", - ) - ) - elif not publish_handeye_tf: - frames.append( - f"[gauge] 按参数不发手眼静态 TF(publish_handeye_tf=false):" - f"相机系 {cam_frame} 由 URDF/驱动给出(仿真就是这条路径)" - ) - else: - frames.append( - f"[gauge] 没有手眼文件({handeye or 'paths.handeye_file 为空'})" - "—— 不发布静态 TF,S05 会在查 TF 时报错。先跑 scripts/run_handeye.sh" - ) - - # ---- 手外相机外参:**基座 ← 相机**(眼在手外)---- - # 与上面那条的父子关系**不同**,两者不能混: - # 腕部(eye-in-hand):法兰 ← 相机(相机跟着臂动) - # 手外(eye-to-hand):基座 ← 相机(相机固定,不随臂动) - # S03 反投影查的正是 `{prefix}base_link ← {相机}_color_optical_frame` - #(gauge_assembly_node._coarse_workpiece_xy)。把 eye_to_hand 的文件按 - # "法兰 ← 相机"发出去会得到一条**看着合理**的错 TF —— 于是定位总能到附近、 - # 永远差一截,而人只会去怀疑标定精度。 - if over_cam and e2h_file and publish_handeye_tf: - if e2h_file.is_file(): - try: - tx, ty, tz, qx, qy, qz, qw = _handeye_xyz_xyzw(str(e2h_file)) - except Exception as exc: # noqa: BLE001 - frames.append(f"[gauge] 手外相机文件读不了({e2h_file}):{exc}") - else: - parent, child = handeye_static_tf_frames( - mode="eye_to_hand", - ee_frame=ee_frame, - base_frame=base_frame, - cam_frame=over_frame, - ) - frames.append( - f"[gauge] 手外 TF {parent} ← {child}({e2h_file.name})" - ) - nodes.append( - Node( - package="tf2_ros", - executable="static_transform_publisher", - name="gauge_coarse_handeye_static_tf", - arguments=[ - "--x", str(tx), "--y", str(ty), "--z", str(tz), - "--qx", str(qx), "--qy", str(qy), "--qz", str(qz), - "--qw", str(qw), - "--frame-id", parent, - "--child-frame-id", child, - ], - output="screen", - ) - ) - else: - frames.append( - f"[gauge] 手外相机 {over_cam} 没有 eye-to-hand 标定({e2h_file.name})" - "—— 不发它的静态 TF,S03 会明确报缺文件并回 S04 跟踪(不假装成功)" - ) - - gauge_node = Node( - package="arm_application", - executable="gauge_assembly", - name="gauge_assembly", - output="screen", - parameters=[ - { - "robot_sn": str( - robot.get("sn") or os.environ.get("SITE_ROBOT_SN") or "" - ), - "dry_run": dry_run, - "holes_total": int(holes) if holes else -1, - "gripper_backend": backend, - "result_file": result_file, - "use_sim_time": use_sim_time, - # S03 找手外外参用的确切路径(名字口径由 export_site_env 一处实现)。 - "coarse_eye_to_hand_file": str(e2h_file) if e2h_file else "", - } - ], - ) - nodes.append(gauge_node) - - return [ - LogInfo(msg=f"[gauge] site={path}"), - LogInfo(msg=f"[gauge] arm={robot.get('label') or robot.get('sn')} cam={cam}"), - LogInfo( - msg=f"[gauge] dry_run={dry_run} holes={holes or 'site'} " - f"backend={backend} use_sim_time={use_sim_time}" - ), - LogInfo(msg=f"[gauge] 结论文件 {result_file}"), - *[LogInfo(msg=m) for m in frames], - *nodes, - # 流程节点退出 → 整个 launch 退出。 - # 为什么必须显式写:静态 TF 发布者是**常驻**的(它不发完就退, - # 要一直挂着供 tf2 查询),所以主流程跑完 DONE 之后 launch 不会自己结束 —— - # 表现为"流程明明打完了,终端一直不回到提示符"(实测会一直挂到 timeout 杀掉)。 - RegisterEventHandler( - OnProcessExit(target_action=gauge_node, on_exit=Shutdown()) - ), - ] - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription( - [ - DeclareLaunchArgument("dry_run", default_value="false"), - DeclareLaunchArgument("holes_total", default_value=""), - DeclareLaunchArgument("gripper_backend", default_value="auto"), - # 结论落盘路径(脚本读它判成败:ros2 launch 的退出码恒为 0) - DeclareLaunchArgument("result_file", default_value="/tmp/gauge_assembly_result.json"), - # 仿真必须 true(真机 false)。理由见 _launch_setup 里的注释。 - DeclareLaunchArgument("use_sim_time", default_value="false"), - # 真机 true(相机系只能由标定值给出);仿真 false(URDF 已给出)。 - DeclareLaunchArgument("publish_handeye_tf", default_value="true"), - OpaqueFunction(function=_launch_setup), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/gauge_assembly.launch.py b/install/arm_application/share/arm_application/launch/gauge_assembly.launch.py new file mode 120000 index 0000000..a75b05b --- /dev/null +++ b/install/arm_application/share/arm_application/launch/gauge_assembly.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/gauge_assembly.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/hole_detect.launch.py b/install/arm_application/share/arm_application/launch/hole_detect.launch.py deleted file mode 100644 index 0f481d8..0000000 --- a/install/arm_application/share/arm_application/launch/hole_detect.launch.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -"""在当前机械臂的彩色话题上启动 hole_detect。""" - -from __future__ import annotations - -import os -from pathlib import Path - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, LogInfo, OpaqueFunction -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def _ws_root() -> Path: - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - return Path.home() / "ros2" - - -def _setup(context, *args, **kwargs): - root = _ws_root() - backend = LaunchConfiguration("backend").perform(context) or os.environ.get("SITE_HOLE_BACKEND") or "two_stage" - weights = LaunchConfiguration("weights").perform(context) or os.environ.get("SITE_HOLE_WEIGHTS") or "" - cfg = LaunchConfiguration("config_file").perform(context) or os.environ.get("SITE_HOLE_CONFIG") or "" - cam = os.environ.get("SITE_CAM_NAME") or "d405" - preview = LaunchConfiguration("preview").perform(context).lower() in ("1", "true", "yes") - if not cfg: - if backend in ("two_stage", "hough_roi"): - cfg = str(root / "src" / "arm_application" / "config" / "hole_detect.yaml") - else: - cfg = str(root / "src" / "arm_application" / "config" / "hole_insert.yaml") - if not weights: - if backend in ("two_stage", "hough_roi"): - weights = os.environ.get("SITE_HOLE_WORKPIECE_WEIGHTS") or os.environ.get("SITE_YOLO_WEIGHTS") or "" - else: - weights = os.environ.get("SITE_HOLE_WEIGHTS") or str(root / "models" / "yolo" / "gongjian0929.onnx") - return [ - LogInfo(msg=f"[hole_detect] cam={cam} backend={backend} weights={weights} cfg={cfg}"), - Node( - package="arm_application", - executable="hole_detect", - name="hole_detect", - output="screen", - parameters=[ - { - "camera_source": cam, - "weights": weights, - "config_file": cfg, - "backend": backend, - "device": os.environ.get("SITE_YOLO_DEVICE") or "0", - "preview": preview, - } - ], - ), - ] - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription( - [ - DeclareLaunchArgument("backend", default_value=""), - DeclareLaunchArgument("weights", default_value=""), - DeclareLaunchArgument("config_file", default_value=""), - DeclareLaunchArgument("preview", default_value="false"), - OpaqueFunction(function=_setup), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/hole_detect.launch.py b/install/arm_application/share/arm_application/launch/hole_detect.launch.py new file mode 120000 index 0000000..6fa71ed --- /dev/null +++ b/install/arm_application/share/arm_application/launch/hole_detect.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/hole_detect.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/pipeline.launch.py b/install/arm_application/share/arm_application/launch/pipeline.launch.py deleted file mode 100644 index ea18aff..0000000 --- a/install/arm_application/share/arm_application/launch/pipeline.launch.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python3 -"""Launch the three-stage assembly pipeline + static hand-eye TF. - -相机 / 触觉由 scripts/run_all.sh 负责拉起一次。本 launch 只起手眼 TF 和串联节点。 -一阶段跟踪由 pipeline 节点在进程内再拉 visual_servo.launch(不重复发手眼 TF)。 -""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, LogInfo, OpaqueFunction -from launch.actions import EmitEvent, RegisterEventHandler -from launch.event_handlers import OnProcessExit -from launch.events import Shutdown -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def _ws_root() -> Path: - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - here = Path(__file__).resolve() - for p in [here.parents[i] for i in range(2, 8)]: - if (p / "config" / "site.yaml").is_file(): - return p - return Path.home() / "ros2" - - -def _handeye_xyz_xyzw(path: str): - """读手眼文件 → ``(tx, ty, tz, qx, qy, qz, qw)``。 - - 实现只有一份,在 ``arm_application.handeye_lib``(``read_transform_yaml``), - 并由回环测试钉住:``quat → R`` 必须能还原文件里的 ``T_4x4``。 - 这段换算曾经在 4 个 launch 文件里各抄了一遍,且抄错了 3 个分支 —— - 手眼姿态差几十度,定位"总能到附近、永远差一点",看起来像相机标定不准。 - """ - from arm_application.handeye_lib import read_transform_yaml - - xyz, quat = read_transform_yaml(path) - return ( - float(xyz[0]), float(xyz[1]), float(xyz[2]), - float(quat[0]), float(quat[1]), float(quat[2]), float(quat[3]), - ) - - -def _as_bool(s: str) -> bool: - return s.strip().lower() in ("1", "true", "yes") - - -def _launch_setup(context, *args, **kwargs): - root = _ws_root() - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import apply_active_arm, load_site, site_path # type: ignore - - cfg = os.environ.get("SITE_CONFIG", "").strip() - path = Path(cfg).expanduser() if cfg else site_path() - if not path.is_file(): - path = root / "config" / "site.yaml" - data = load_site(path) - merged, robot = apply_active_arm(data) - - ee_frame = str(robot.get("ee_frame") or f"{robot.get('sn')}_flange") - paths = merged.get("paths") or {} - handeye = str(paths.get("handeye_file") or "").strip() - cam_cfg = merged.get("camera") or {} - cam = str(cam_cfg.get("name") or "d405").strip().strip("/") - cam_frame = f"{cam}_color_optical_frame" - - skip1 = _as_bool(LaunchConfiguration("skip_stage1").perform(context)) - skip2 = _as_bool(LaunchConfiguration("skip_stage2").perform(context)) - skip3 = _as_bool(LaunchConfiguration("skip_stage3").perform(context)) - preview = _as_bool(LaunchConfiguration("preview").perform(context)) - resnap = _as_bool(LaunchConfiguration("resnap").perform(context)) - # 调试开关:只验证精对准、不轻降。用途是"对准逻辑刚改完、还没确认它真能把规 - # 对到孔心"时先别让规往下走 —— 对不准就下压会把规顶在孔沿上(2026-10-08 真机 - # 顶到 63N)。默认关;验证对准时用 --no-descent 打开。 - no_descent = _as_bool(LaunchConfiguration("no_descent").perform(context)) - d435_only = _as_bool(LaunchConfiguration("d435_move_only").perform(context)) - init_z = LaunchConfiguration("init_z_m").perform(context).strip() - hover_z = LaunchConfiguration("hover_z_m").perform(context).strip() - final_gap = LaunchConfiguration("final_gap_mm").perform(context).strip() - target_hole = LaunchConfiguration("target_hole").perform(context).strip() - depth = LaunchConfiguration("insert_depth_mm").perform(context).strip() - pitch = LaunchConfiguration("screw_pitch_mm").perform(context).strip() - - nodes = [] - if handeye and Path(handeye).is_file(): - tx, ty, tz, qx, qy, qz, qw = _handeye_xyz_xyzw(handeye) - nodes.append( - Node( - package="tf2_ros", - executable="static_transform_publisher", - name="handeye_static_tf", - arguments=[ - "--x", str(tx), "--y", str(ty), "--z", str(tz), - "--qx", str(qx), "--qy", str(qy), "--qz", str(qz), "--qw", str(qw), - "--frame-id", ee_frame, - "--child-frame-id", cam_frame, - ], - output="screen", - ) - ) - - node = Node( - package="arm_application", - executable="assembly_pipeline", - name="assembly_pipeline", - output="screen", - parameters=[ - { - "robot_sn": str(robot.get("sn") or os.environ.get("SITE_ROBOT_SN") or ""), - "preview": preview, - "resnap": resnap, - "target_hole": target_hole, - "insert_depth_mm": float(depth) if depth else -1.0, - "screw_pitch_mm": float(pitch) if pitch else -999.0, - "skip_stage1": skip1, - "skip_stage2": skip2 or d435_only, - "skip_stage3": skip3 or d435_only, - "d435_move_only": d435_only, - "init_z_m": float(init_z) if init_z else -1.0, - "hover_z_m": float(hover_z) if hover_z else -1.0, - "final_gap_mm": float(final_gap) if final_gap else -1.0, - # -1=按 site 的 stage2.final_descent_enable;0=强制不降(调试) - "final_descent_enable": 0 if no_descent else -1, - } - ], - ) - - return [ - LogInfo(msg=f"[pipeline] site={path}"), - LogInfo(msg=f"[pipeline] arm={robot.get('label') or robot.get('sn')} cam={cam}"), - LogInfo( - msg=f"[pipeline] hole={target_hole or 'site'} depth={depth or 'site'} " - f"pitch={pitch or 'site'} final_gap={final_gap or 'site'} " - f"skip1={skip1} skip2={skip2} skip3={skip3}" - + (" [d435_only:只测 D435 位移]" if d435_only else "") - + (" [no_descent:只对准,不轻降]" if no_descent else "") - ), - *nodes, - node, - RegisterEventHandler( - OnProcessExit( - target_action=node, - on_exit=[EmitEvent(event=Shutdown(reason="pipeline 完成"))], - ) - ), - ] - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription( - [ - DeclareLaunchArgument("skip_stage1", default_value="false"), - DeclareLaunchArgument("skip_stage2", default_value="false"), - DeclareLaunchArgument("skip_stage3", default_value="false"), - DeclareLaunchArgument("target_hole", default_value=""), - DeclareLaunchArgument("insert_depth_mm", default_value=""), - DeclareLaunchArgument("screw_pitch_mm", default_value=""), - DeclareLaunchArgument("resnap", default_value="false"), - # 只验证精对准、不轻降(见 _launch_setup 里的说明) - DeclareLaunchArgument("no_descent", default_value="false"), - DeclareLaunchArgument("d435_move_only", default_value="false"), - DeclareLaunchArgument("init_z_m", default_value=""), - DeclareLaunchArgument("hover_z_m", default_value=""), - DeclareLaunchArgument("final_gap_mm", default_value=""), - DeclareLaunchArgument("preview", default_value="true"), - OpaqueFunction(function=_launch_setup), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/pipeline.launch.py b/install/arm_application/share/arm_application/launch/pipeline.launch.py new file mode 120000 index 0000000..032c11f --- /dev/null +++ b/install/arm_application/share/arm_application/launch/pipeline.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/pipeline.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/stage2_locate.launch.py b/install/arm_application/share/arm_application/launch/stage2_locate.launch.py deleted file mode 100644 index f7cdc5b..0000000 --- a/install/arm_application/share/arm_application/launch/stage2_locate.launch.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python3 -"""Launch stage-2 one-shot hole localization (k1/k2) + static hand-eye TF. - -所有参数来自 ~/ros2/config/site.yaml(launch 参数仅做少量覆盖)。 -相机与触觉服务由 scripts/run_stage2_locate.sh 负责拉起/检查。 -""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path - -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, LogInfo, OpaqueFunction -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def _ws_root() -> Path: - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - here = Path(__file__).resolve() - for p in [here.parents[i] for i in range(2, 8)]: - if (p / "config" / "site.yaml").is_file(): - return p - return Path.home() / "ros2" - - -def _handeye_xyz_xyzw(path: str): - """读手眼文件 → ``(tx, ty, tz, qx, qy, qz, qw)``。 - - 实现只有一份,在 ``arm_application.handeye_lib``(``read_transform_yaml``), - 并由回环测试钉住:``quat → R`` 必须能还原文件里的 ``T_4x4``。 - 这段换算曾经在 4 个 launch 文件里各抄了一遍,且抄错了 3 个分支 —— - 手眼姿态差几十度,定位"总能到附近、永远差一点",看起来像相机标定不准。 - """ - from arm_application.handeye_lib import read_transform_yaml - - xyz, quat = read_transform_yaml(path) - return ( - float(xyz[0]), float(xyz[1]), float(xyz[2]), - float(quat[0]), float(quat[1]), float(quat[2]), float(quat[3]), - ) - - -def _launch_setup(context, *args, **kwargs): - root = _ws_root() - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import apply_active_arm, load_site, site_path # type: ignore - - cfg = os.environ.get("SITE_CONFIG", "").strip() - path = Path(cfg).expanduser() if cfg else site_path() - if not path.is_file(): - path = root / "config" / "site.yaml" - data = load_site(path) - merged, robot = apply_active_arm(data) - - ee_frame = str(robot.get("ee_frame") or f"{robot.get('sn')}_flange") - paths = merged.get("paths") or {} - handeye = str(paths.get("handeye_file") or "").strip() - if not handeye or not Path(handeye).is_file(): - raise FileNotFoundError( - f"hand-eye result missing: {handeye}. " - "先标定: bash ~/ros2/scripts/run_handeye.sh calibrate" - ) - cam_cfg = merged.get("camera") or {} - cam = str(cam_cfg.get("name") or "d405").strip().strip("/") - cam_frame = f"{cam}_color_optical_frame" - - hover_only = LaunchConfiguration("hover_only").perform(context).lower() in ("1", "true", "yes") - preview = LaunchConfiguration("preview").perform(context).lower() in ("1", "true", "yes") - target_hole = LaunchConfiguration("target_hole").perform(context).strip() - hover_z = LaunchConfiguration("hover_z_m").perform(context).strip() - final_gap = LaunchConfiguration("final_gap_mm").perform(context).strip() - - tx, ty, tz, qx, qy, qz, qw = _handeye_xyz_xyzw(handeye) - static_tf = Node( - package="tf2_ros", - executable="static_transform_publisher", - name="handeye_static_tf", - arguments=[ - "--x", str(tx), "--y", str(ty), "--z", str(tz), - "--qx", str(qx), "--qy", str(qy), "--qz", str(qz), "--qw", str(qw), - "--frame-id", ee_frame, - "--child-frame-id", cam_frame, - ], - output="screen", - ) - - node = Node( - package="arm_application", - executable="stage2_locate", - name="stage2_locate", - output="screen", - parameters=[ - { - "robot_sn": str(robot.get("sn") or os.environ.get("SITE_ROBOT_SN") or ""), - "hover_only": hover_only, - "target_hole": target_hole, - "hover_z_m": float(hover_z) if hover_z else -1.0, - "final_gap_mm": float(final_gap) if final_gap else -1.0, - "preview": preview, - } - ], - ) - - return [ - LogInfo(msg=f"[stage2] site={path}"), - LogInfo( - msg=f"[stage2] arm={robot.get('label') or robot.get('sn')} cam={cam} handeye={handeye}" - ), - LogInfo(msg=f"[stage2] hover_only={hover_only} target={target_hole or 'site'}"), - static_tf, - node, - ] - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription( - [ - DeclareLaunchArgument("hover_only", default_value="false"), - DeclareLaunchArgument("target_hole", default_value=""), - DeclareLaunchArgument("hover_z_m", default_value=""), - DeclareLaunchArgument("final_gap_mm", default_value=""), - DeclareLaunchArgument("preview", default_value="true"), - OpaqueFunction(function=_launch_setup), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/stage2_locate.launch.py b/install/arm_application/share/arm_application/launch/stage2_locate.launch.py new file mode 120000 index 0000000..8df95cb --- /dev/null +++ b/install/arm_application/share/arm_application/launch/stage2_locate.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/stage2_locate.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/stage3_search.launch.py b/install/arm_application/share/arm_application/launch/stage3_search.launch.py deleted file mode 100644 index 58e0cdd..0000000 --- a/install/arm_application/share/arm_application/launch/stage3_search.launch.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python3 -"""Launch stage-3 compliant hole search (Orisys tactile + optional D405 resnap). - -所有阈值来自 ~/ros2/config/site.yaml → hole_detect.stage3(launch 参数仅做少量覆盖)。 -触觉服务由 scripts/run_stage3_search.sh 负责拉起/检查。 -前置:二阶段已完成(臂悬停在目标孔上方、垂直、夹持通止规)。 -""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, LogInfo, OpaqueFunction -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def _ws_root() -> Path: - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - here = Path(__file__).resolve() - for p in [here.parents[i] for i in range(2, 8)]: - if (p / "config" / "site.yaml").is_file(): - return p - return Path.home() / "ros2" - - -def _handeye_xyz_xyzw(path: str): - """读手眼文件 → ``(tx, ty, tz, qx, qy, qz, qw)``。 - - 实现只有一份,在 ``arm_application.handeye_lib``(``read_transform_yaml``), - 并由回环测试钉住:``quat → R`` 必须能还原文件里的 ``T_4x4``。 - 这段换算曾经在 4 个 launch 文件里各抄了一遍,且抄错了 3 个分支 —— - 手眼姿态差几十度,定位"总能到附近、永远差一点",看起来像相机标定不准。 - """ - from arm_application.handeye_lib import read_transform_yaml - - xyz, quat = read_transform_yaml(path) - return ( - float(xyz[0]), float(xyz[1]), float(xyz[2]), - float(quat[0]), float(quat[1]), float(quat[2]), float(quat[3]), - ) - - -def _launch_setup(context, *args, **kwargs): - root = _ws_root() - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import apply_active_arm, load_site, site_path # type: ignore - - cfg = os.environ.get("SITE_CONFIG", "").strip() - path = Path(cfg).expanduser() if cfg else site_path() - if not path.is_file(): - path = root / "config" / "site.yaml" - data = load_site(path) - merged, robot = apply_active_arm(data) - - ee_frame = str(robot.get("ee_frame") or f"{robot.get('sn')}_flange") - paths = merged.get("paths") or {} - handeye = str(paths.get("handeye_file") or "").strip() - cam_cfg = merged.get("camera") or {} - cam = str(cam_cfg.get("name") or "d405").strip().strip("/") - cam_frame = f"{cam}_color_optical_frame" - - preview = LaunchConfiguration("preview").perform(context).lower() in ("1", "true", "yes") - resnap = LaunchConfiguration("resnap").perform(context).lower() in ("1", "true", "yes") - target_hole = LaunchConfiguration("target_hole").perform(context).strip() - depth = LaunchConfiguration("insert_depth_mm").perform(context).strip() - pitch = LaunchConfiguration("screw_pitch_mm").perform(context).strip() - rmax = LaunchConfiguration("spiral_r_max_mm").perform(context).strip() - - nodes = [] - if handeye and Path(handeye).is_file(): - tx, ty, tz, qx, qy, qz, qw = _handeye_xyz_xyzw(handeye) - nodes.append( - Node( - package="tf2_ros", - executable="static_transform_publisher", - name="handeye_static_tf", - arguments=[ - "--x", str(tx), "--y", str(ty), "--z", str(tz), - "--qx", str(qx), "--qy", str(qy), "--qz", str(qz), "--qw", str(qw), - "--frame-id", ee_frame, - "--child-frame-id", cam_frame, - ], - output="screen", - ) - ) - - node = Node( - package="arm_application", - executable="stage3_search", - name="stage3_search", - output="screen", - parameters=[ - { - "robot_sn": str(robot.get("sn") or os.environ.get("SITE_ROBOT_SN") or ""), - "preview": preview, - "resnap": resnap, - "target_hole": target_hole, - "insert_depth_mm": float(depth) if depth else -1.0, - "screw_pitch_mm": float(pitch) if pitch else -999.0, - "spiral_r_max_mm": float(rmax) if rmax else -1.0, - } - ], - ) - - return [ - LogInfo(msg=f"[stage3] site={path}"), - LogInfo(msg=f"[stage3] arm={robot.get('label') or robot.get('sn')} cam={cam}"), - LogInfo( - msg=f"[stage3] target={target_hole or 'site'} depth={depth or 'site'} " - f"pitch={pitch or 'site'} r_max={rmax or 'site'} resnap={resnap}" - ), - *nodes, - node, - ] - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription( - [ - DeclareLaunchArgument("target_hole", default_value=""), - DeclareLaunchArgument("insert_depth_mm", default_value=""), - DeclareLaunchArgument("screw_pitch_mm", default_value=""), - DeclareLaunchArgument("spiral_r_max_mm", default_value=""), - DeclareLaunchArgument("resnap", default_value="false"), - DeclareLaunchArgument("preview", default_value="true"), - OpaqueFunction(function=_launch_setup), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/stage3_search.launch.py b/install/arm_application/share/arm_application/launch/stage3_search.launch.py new file mode 120000 index 0000000..77fe356 --- /dev/null +++ b/install/arm_application/share/arm_application/launch/stage3_search.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/stage3_search.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/tactile.launch.py b/install/arm_application/share/arm_application/launch/tactile.launch.py deleted file mode 100644 index 3127dbf..0000000 --- a/install/arm_application/share/arm_application/launch/tactile.launch.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -"""Launch Orisys tactile node(双指,多进程架构)。 - -tactile 节点内部为每侧手指各起一个独立进程(厂家推荐:独立 CUDA 上下文), -发布 /tactile/left|right/status。Device ids come from site.yaml tactile:. -""" - -from pathlib import Path -import os - -from launch import LaunchDescription -from launch.actions import LogInfo -from launch_ros.actions import Node - - -def generate_launch_description() -> LaunchDescription: - site = os.environ.get("SITE_CONFIG") or str(Path.home() / "ros2" / "config" / "site.yaml") - return LaunchDescription( - [ - LogInfo(msg=f"[tactile] site={site} (mp workers: left + right)"), - Node( - package="arm_application", - executable="tactile", - name="tactile", - output="screen", - ), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/tactile.launch.py b/install/arm_application/share/arm_application/launch/tactile.launch.py new file mode 120000 index 0000000..71bd802 --- /dev/null +++ b/install/arm_application/share/arm_application/launch/tactile.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/tactile.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/launch/visual_servo.launch.py b/install/arm_application/share/arm_application/launch/visual_servo.launch.py deleted file mode 100644 index 00b0958..0000000 --- a/install/arm_application/share/arm_application/launch/visual_servo.launch.py +++ /dev/null @@ -1,365 +0,0 @@ -#!/usr/bin/env python3 -"""启动:perception_node + servo_node + 静态手眼 TF。 - -所有可调参数都来自 ``~/ros2/config/site.yaml``(必要时可用 launch 参数覆盖)。 -""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path - -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.actions import ( - DeclareLaunchArgument, - EmitEvent, - LogInfo, - OpaqueFunction, - RegisterEventHandler, -) -from launch.event_handlers import OnProcessExit -from launch.events import Shutdown -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def _ws_root() -> Path: - # 优先使用 env.sh / load_site_config 提供的环境变量 - for key in ("ROS2_WS", "SITE_ROS2_ROOT"): - v = os.environ.get(key, "").strip() - if v: - return Path(v) - # launch 文件可能位于 install/.../share/arm_application/launch 或 src/... - here = Path(__file__).resolve() - for p in [here.parents[i] for i in range(2, 8)]: - if (p / "config" / "site.yaml").is_file(): - return p - return Path.home() / "ros2" - - -def _load_site(): - root = _ws_root() - sys.path.insert(0, str(root / "scripts" / "lib")) - from export_site_env import ( # type: ignore - apply_active_arm, - load_site, - perception_overrides, - servo_overrides, - site_path, - ) - - cfg = os.environ.get("SITE_CONFIG", "").strip() - path = Path(cfg).expanduser() if cfg else site_path() - # site_path() 依赖脚本所在位置;这里强制使用工作区根目录下的文件 - if not path.is_file(): - path = root / "config" / "site.yaml" - data = load_site(path) - merged, robot = apply_active_arm(data) - return merged, path, perception_overrides(data), servo_overrides(data), robot - - -def _as_bool(s: str) -> bool: - return s.strip().lower() in ("1", "true", "yes") - - -def _handeye_xyz_xyzw(path: str): - """读手眼文件 → ``(tx, ty, tz, qx, qy, qz, qw)``。 - - 实现只有一份,在 ``arm_application.handeye_lib``(``read_transform_yaml``), - 并由回环测试钉住:``quat → R`` 必须能还原文件里的 ``T_4x4``。 - 这段换算曾经在 4 个 launch 文件里各抄了一遍,且抄错了 3 个分支 —— - 手眼姿态差几十度,定位"总能到附近、永远差一点",看起来像相机标定不准。 - """ - from arm_application.handeye_lib import read_transform_yaml - - xyz, quat = read_transform_yaml(path) - return ( - float(xyz[0]), float(xyz[1]), float(xyz[2]), - float(quat[0]), float(quat[1]), float(quat[2]), float(quat[3]), - ) - - -def _launch_setup(context, *args, **kwargs): - share = Path(get_package_share_directory("arm_application")) - site, site_path, perc_over, servo_over, robot = _load_site() - - # launch 参数显式传入时覆盖;空则用 servo_overrides(已按 track_camera 选文件)。 - # 不要再拿某个臂的腕部结果路径当"空"哨兵:换臂或切到 D435 后那个判断失效, - # 会把眼在手外的跟踪悄悄接上腕部 T。 - handeye = LaunchConfiguration("handeye_file").perform(context).strip() - site_he = str(servo_over.get("handeye_file") or "") - if not handeye: - handeye = site_he - if not Path(handeye).is_file(): - raise FileNotFoundError( - f"手眼标定结果缺失:{handeye}。" - "请重新运行:bash ~/ros2/scripts/run_handeye.sh calibrate" - ) - - enable = LaunchConfiguration("enable_control").perform(context).lower() in ( - "1", "true", "yes", - ) - ee_frame = LaunchConfiguration("ee_frame").perform(context).strip() - cam_frame = LaunchConfiguration("camera_frame").perform(context).strip() - yolo = site.get("yolo") or {} - # "没指定"用**空串**表示,不再拿一个具体坐标系名当哨兵: - # 之前写的是 `ee_frame == "Rizon4-063989_flange"`,换个站点以后 - # 这个判断永远不成立,于是 site.yaml 里的 ee_frame 再也不会被用上 - # (症状是静态 TF 挂到了错的坐标系上,而点还是能查到)。 - if not ee_frame: - ee_frame = str(robot.get("ee_frame") or ee_frame) - # 同 ee_frame:用空串表示"没指定",不拿具体坐标系名当哨兵。 - if not cam_frame: - cam_frame = str( - perc_over.get("camera_frame") - or yolo.get("camera_frame") - or cam_frame - ) - - detect_yaml = str(share / "config" / "perception.yaml") - servo_yaml = str(share / "config" / "servo.yaml") - - tx, ty, tz, qx, qy, qz, qw = _handeye_xyz_xyzw(handeye) - - # 跟踪相机的手眼父子:腕部=法兰←相机,顶视=基座←相机。不许写死法兰。 - from arm_application.site_io import handeye_static_tf_frames # noqa: PLC0415 - - he_mode = str(servo_over.get("handeye_mode") or "eye_in_hand") - base_frame = str(robot.get("base_frame") or "") - tf_parent, tf_child = handeye_static_tf_frames( - mode=he_mode, - ee_frame=ee_frame, - base_frame=base_frame, - cam_frame=cam_frame, - ) - - static_tf = Node( - package="tf2_ros", - executable="static_transform_publisher", - name="handeye_static_tf", - arguments=[ - "--x", str(tx), "--y", str(ty), "--z", str(tz), - "--qx", str(qx), "--qy", str(qy), "--qz", str(qz), "--qw", str(qw), - "--frame-id", tf_parent, - "--child-frame-id", tf_child, - ], - output="screen", - ) - - perc_params = dict(perc_over) - perc_params["camera_frame"] = cam_frame - - servo_params = dict(servo_over) - servo_params.update( - { - "enable_control": enable, - "ee_frame": ee_frame, - "camera_frame": cam_frame, - "handeye_child_frame": cam_frame, - "handeye_file": handeye, - } - ) - ee_z_arg = LaunchConfiguration("ee_z_m").perform(context).strip() - if ee_z_arg: - try: - z = float(ee_z_arg) - if z > 0.05: - servo_params["ee_z_m"] = z - except ValueError: - pass - lock_hold_arg = LaunchConfiguration("lock_hold_sec").perform(context).strip() - if lock_hold_arg: - try: - servo_params["lock_hold_sec"] = float(lock_hold_arg) - except ValueError: - pass - d435_only = _as_bool(LaunchConfiguration("d435_move_only").perform(context)) - perc_params["d435_move_only"] = d435_only - servo_params["d435_move_only"] = d435_only - - # ------------------------------------------------------------------ - # 感知来源:谁来产生"视觉测量"(site.yaml 的 perception.source) - # - # yolo 本体 perception_node(要 torch/ultralytics) - # truth 仿真真值节点(按场景已知位姿直接算目标点,不跑推理) - # external 外部节点按同一话题提供,本 launch 不起感知进程 - # - # 为什么要有这个开关:仿真环境(ros_gz_sim conda)没有 torch/ultralytics - # 且离线装不上,perception_node 一启动就死;而仿真里工件位姿本来就是 - # 已知的。切到 truth 后,流程能在仿真里验"控制与接口"那一半。 - # 值写错**直接报错**,不要默默当 yolo —— 那会退回到"一阶段永远不锁定"。 - # ------------------------------------------------------------------ - # 允许值与校验只有一处实现(gauge_boot.perception_source_of),S00 自检用的 - # 也是它 —— 两边各写一份的话,会出现"起了真值节点、S00 却去查 ultralytics"。 - from arm_application.gauge_boot import perception_source_of - - perc_src = perception_source_of(site.get("perception")) - # 仿真时间必须**一路传下去**:这个 launch 由装配流程(pipeline_node)在 - # S04 里以子进程拉起,父节点在仿真里带 use_sim_time=true,这里若漏传, - # perception/servo 会跑在系统时间上 —— TF 全是仿真时刻的戳,于是 - # "看得见图、算得出点,就是查不到变换",表现为一阶段永远不收敛。 - use_sim = LaunchConfiguration("use_sim_time").perform(context).lower() in ( - "1", "true", "yes", - ) - - perception = None - if perc_src == "yolo": - perception = Node( - package="arm_application", - executable="perception_node", - name="perception_node", - output="screen", - parameters=[detect_yaml, perc_params, {"use_sim_time": use_sim}], - ) - elif perc_src == "truth": - truth_cfg = (site.get("perception") or {}).get("truth") or {} - perception = Node( - package="arm_sim_gazebo", - executable="sim_truth_perception", - name="sim_truth_perception", - output="screen", - parameters=[ - { - "camera_frame": cam_frame, - "target_object": str(truth_cfg.get("object") or ""), - "offset_m": [float(v) for v in (truth_cfg.get("offset_m") or [0.0, 0.0, 0.0])], - "use_sim_time": use_sim, - } - ], - ) - - servo = Node( - package="arm_application", - executable="servo_node", - name="servo_node", - output="screen", - parameters=[servo_yaml, servo_params, {"use_sim_time": use_sim}], - ) - - weights = perc_params.get("weights", "") - nodes = [ - LogInfo(msg=f"[site] {site_path}"), - LogInfo( - msg=f"[arm] {robot.get('label') or robot.get('sn')} " - f"handeye={handeye} mode={he_mode} track_cam={cam_frame}" - ), - LogInfo(msg=f"[site] 感知来源 perception.source = {perc_src}"), - ] - if d435_only: - nodes.append( - LogInfo(msg="[d435_only] 只测 D435 单次位移:不交 D405、不进二阶段") - ) - if perc_src == "yolo": - nodes.append(LogInfo(msg=f"[site] YOLO weights: {weights}")) - nodes.append( - LogInfo( - msg="节点:perception_node(YOLO)| servo_node(100Hz)—— " - "各自独立进程,话题 /visual_servo/filtered_point" - ) - ) - elif perc_src == "truth": - nodes.append( - LogInfo( - msg="节点:sim_truth_perception(仿真真值,不跑推理)| servo_node(100Hz)\n" - " 真值只验**控制与接口**:像素噪声/遮挡/算法错判它都没有。" - "能不能在真机上看到孔,要看真机那一次(见 devices/sim/gazebo/README.md)" - ) - ) - else: - nodes.append( - LogInfo( - msg="节点:servo_node(100Hz)。感知由**外部**节点按 " - "visual_servo/filtered_point 提供(本 launch 不起感知进程)" - ) - ) - pub_tf = LaunchConfiguration("publish_handeye_tf").perform(context).lower() in ( - "1", "true", "yes", - ) - if pub_tf: - nodes.append( - LogInfo( - msg=f"静态手眼 {tf_parent} → {tf_child} t=[{tx:.3f},{ty:.3f},{tz:.3f}] " - f"({he_mode})" - ) - ) - nodes.append(static_tf) - if perception is not None: - nodes.append(perception) - nodes.append(servo) - # 感知进程一死就整段退出(truth 后端同样适用 —— 它可能因为配置/场景读 - # 不出来而退出,那时 servo 还活着,调用方只能等满 stage1_timeout_sec)。 - # 为什么必须显式写:yolo 后端是最需要 GPU/torch 的那个(缺 ultralytics/torch - # 时**启动即死**,而 servo_node 还活着继续跑)。没有这个 handler,launch 不会 - # 结束,调用方(装配流程的 S04)只能等满 stage1_timeout_sec 才报"没锁定"—— - # 现场看到的是"算法不收敛",真正原因是感知进程早就不在了。 - if perception is not None: - nodes.append( - RegisterEventHandler( - OnProcessExit( - target_action=perception, - on_exit=[ - LogInfo( - msg=f"[visual_servo] ✘ 感知进程({perc_src})退出了 —— 停止本段(" - "看它退出前最后几行:yolo 多为缺推理依赖," - "truth 多为场景/参数读不出来)" - ), - EmitEvent(event=Shutdown(reason="perception exited")), - ], - ) - ) - ) - return nodes - - -def generate_launch_description() -> LaunchDescription: - return LaunchDescription( - [ - # 默认值从环境取(scripts/env.sh → load_site_config.sh 导出的 - # SITE_HANDEYE_FILE / SITE_EE_FRAME 已经是**当前臂**的值)。 - # 不写死某个臂的文件名/坐标系:写死的话换臂后这里就悄悄指向上一台。 - DeclareLaunchArgument( - "handeye_file", - default_value=os.environ.get("SITE_HANDEYE_FILE", ""), - ), - DeclareLaunchArgument( - "ee_frame", - default_value=os.environ.get("SITE_EE_FRAME", ""), - ), - DeclareLaunchArgument( - "camera_frame", - default_value=os.environ.get("SITE_CAMERA_FRAME", ""), - ), - DeclareLaunchArgument( - "enable_control", - default_value="false", - ), - DeclareLaunchArgument( - "publish_handeye_tf", - default_value="true", - ), - # 仿真时间开关。**仿真里必须传 true**:/clock 由 Gazebo 发, - # 节点若跑在系统时间上,TF/图像时间戳全对不上(症状是"看得见图、 - # 就是查不到变换,一阶段永远不锁定")。 - # 装配流程在仿真里跑时由 pipeline_node 自动传 true(见 - # pipeline_node._run_stage1),手工跑时自己加上。 - DeclareLaunchArgument( - "use_sim_time", - default_value="false", - ), - DeclareLaunchArgument( - "ee_z_m", - default_value="", - ), - DeclareLaunchArgument( - "lock_hold_sec", - default_value="", - ), - DeclareLaunchArgument( - "d435_move_only", - default_value="false", - ), - OpaqueFunction(function=_launch_setup), - ] - ) diff --git a/install/arm_application/share/arm_application/launch/visual_servo.launch.py b/install/arm_application/share/arm_application/launch/visual_servo.launch.py new file mode 120000 index 0000000..49f9dbb --- /dev/null +++ b/install/arm_application/share/arm_application/launch/visual_servo.launch.py @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/launch/visual_servo.launch.py \ No newline at end of file diff --git a/install/arm_application/share/arm_application/package.dsv b/install/arm_application/share/arm_application/package.dsv index c9e0574..bce7487 100644 --- a/install/arm_application/share/arm_application/package.dsv +++ b/install/arm_application/share/arm_application/package.dsv @@ -4,3 +4,6 @@ source;share/arm_application/hook/pythonpath.sh source;share/arm_application/hook/ament_prefix_path.ps1 source;share/arm_application/hook/ament_prefix_path.dsv source;share/arm_application/hook/ament_prefix_path.sh +source;../../build/arm_application/share/arm_application/hook/pythonpath_develop.ps1 +source;../../build/arm_application/share/arm_application/hook/pythonpath_develop.dsv +source;../../build/arm_application/share/arm_application/hook/pythonpath_develop.sh diff --git a/install/arm_application/share/arm_application/package.ps1 b/install/arm_application/share/arm_application/package.ps1 index 44f3ad6..c4a4018 100644 --- a/install/arm_application/share/arm_application/package.ps1 +++ b/install/arm_application/share/arm_application/package.ps1 @@ -112,5 +112,6 @@ $env:COLCON_CURRENT_PREFIX=(Get-Item $PSCommandPath).Directory.Parent.Parent.Ful colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX/share/arm_application/hook/pythonpath.ps1" colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX/share/arm_application/hook/ament_prefix_path.ps1" +colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX/../../build/arm_application/share/arm_application/hook/pythonpath_develop.ps1" Remove-Item Env:\COLCON_CURRENT_PREFIX diff --git a/install/arm_application/share/arm_application/package.sh b/install/arm_application/share/arm_application/package.sh index af58cda..cc1068e 100644 --- a/install/arm_application/share/arm_application/package.sh +++ b/install/arm_application/share/arm_application/package.sh @@ -80,6 +80,7 @@ _colcon_package_sh_source_script() { # source sh hooks _colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/arm_application/hook/pythonpath.sh" _colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/arm_application/hook/ament_prefix_path.sh" +_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/../../build/arm_application/share/arm_application/hook/pythonpath_develop.sh" unset _colcon_package_sh_source_script unset COLCON_CURRENT_PREFIX diff --git a/install/arm_application/share/arm_application/package.xml b/install/arm_application/share/arm_application/package.xml deleted file mode 100644 index a0fb83a..0000000 --- a/install/arm_application/share/arm_application/package.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - arm_application - 0.1.0 - Field nodes: D405, visual servo, hand-eye, DH grippers, hole detect. - arm_dev - Apache-2.0 - - ament_python - - rclpy - arm_msgs - geometry_msgs - sensor_msgs - std_msgs - std_srvs - trajectory_msgs - control_msgs - tf2_ros - python3-yaml - python3-serial - - arm_kinematics - - - ament_python - - diff --git a/install/arm_application/share/arm_application/package.xml b/install/arm_application/share/arm_application/package.xml new file mode 120000 index 0000000..a941e7b --- /dev/null +++ b/install/arm_application/share/arm_application/package.xml @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/package.xml \ No newline at end of file diff --git a/install/arm_application/share/arm_application/trajectories/xunhuan.traj b/install/arm_application/share/arm_application/trajectories/xunhuan.traj deleted file mode 100755 index 0657865..0000000 --- a/install/arm_application/share/arm_application/trajectories/xunhuan.traj +++ /dev/null @@ -1,247 +0,0 @@ -traj_coord_type: "" -traj_coord_ref: "" -pattern_params { - pattern_name: "WPT0" - pattern_type: "Scatter" - scatterpoint_pattern { - pose_params { - x: "0.26072" - y: "-0.14604" - z: "0.85707" - rx: "6.58" - ry: "165.63" - rz: "-6.63" - coord_type: "WORLD" - coord_ref: "WORLD_ORIGIN" - use_quaternion: false - preferJntPos { - joint1: "-6.97" - joint2: "29.95" - joint3: "1.72" - joint4: "92.29" - joint5: "-6.48" - joint6: "-12.54" - joint7: "-0.37" - } - externalAxes { - axis1: "0" - axis2: "0" - axis3: "0" - axis4: "0" - axis5: "0" - axis6: "0" - } - } - force_params { - fx: "0" - fy: "0" - fz: "0" - mx: "0" - my: "0" - mz: "0" - } - path_profile: "line" - blend_zone: "Z10" - velocity: "0.2" - acceleration: "1" - vel_var_name: "" - wrench_var_name: "" - } -} -pattern_params { - pattern_name: "WPT1" - pattern_type: "Scatter" - scatterpoint_pattern { - pose_params { - x: "0.50244" - y: "-0.05458" - z: "0.62368" - rx: "3.30681" - ry: "173.28739" - rz: "12.76833" - coord_type: "WORLD" - coord_ref: "WORLD_ORIGIN" - use_quaternion: false - preferJntPos { - joint1: "-0.39471" - joint2: "2.89069" - joint3: "7.36936" - joint4: "104.4854" - joint5: "-2.56594" - joint6: "19.41153" - joint7: "-5.21738" - } - externalAxes { - axis1: "0" - axis2: "0" - axis3: "0" - axis4: "0" - axis5: "0" - axis6: "0" - } - } - force_params { - fx: "0" - fy: "0" - fz: "0" - mx: "0" - my: "0" - mz: "0" - } - path_profile: "line" - blend_zone: "Z10" - velocity: "0.2" - acceleration: "1" - vel_var_name: "" - wrench_var_name: "" - } -} -pattern_params { - pattern_name: "WPT2" - pattern_type: "Scatter" - scatterpoint_pattern { - pose_params { - x: "0.38216" - y: "-0.07015" - z: "0.2772" - rx: "-0.76189" - ry: "178.83063" - rz: "13.77851" - coord_type: "WORLD" - coord_ref: "WORLD_ORIGIN" - use_quaternion: false - preferJntPos { - joint1: "-0.51679" - joint2: "-17.82083" - joint3: "6.09068" - joint4: "145.99388" - joint5: "-3.83264" - joint6: "75.52854" - joint7: "-5.23384" - } - externalAxes { - axis1: "0" - axis2: "0" - axis3: "0" - axis4: "0" - axis5: "0" - axis6: "0" - } - } - force_params { - fx: "0" - fy: "0" - fz: "0" - mx: "0" - my: "0" - mz: "0" - } - path_profile: "line" - blend_zone: "Z10" - velocity: "0.2" - acceleration: "1" - vel_var_name: "" - wrench_var_name: "" - } -} -pattern_params { - pattern_name: "WPT3" - pattern_type: "Scatter" - scatterpoint_pattern { - pose_params { - x: "0.42395" - y: "-0.04059" - z: "0.135" - rx: "-4.09647" - ry: "175.59924" - rz: "22.59976" - coord_type: "WORLD" - coord_ref: "WORLD_ORIGIN" - use_quaternion: false - preferJntPos { - joint1: "0.80285" - joint2: "-48.57114" - joint3: "4.29418" - joint4: "137.232" - joint5: "-14.43138" - joint6: "99.59405" - joint7: "-5.25622" - } - externalAxes { - axis1: "0" - axis2: "0" - axis3: "0" - axis4: "0" - axis5: "0" - axis6: "0" - } - } - force_params { - fx: "0" - fy: "0" - fz: "0" - mx: "0" - my: "0" - mz: "0" - } - path_profile: "line" - blend_zone: "Z10" - velocity: "0.2" - acceleration: "1" - vel_var_name: "" - wrench_var_name: "" - } -} -pattern_params { - pattern_name: "WPT4" - pattern_type: "Scatter" - scatterpoint_pattern { - pose_params { - x: "0.2971" - y: "0.06042" - z: "0.76959" - rx: "4.64468" - ry: "173.46657" - rz: "27.06819" - coord_type: "WORLD" - coord_ref: "WORLD_ORIGIN" - use_quaternion: false - preferJntPos { - joint1: "5.13584" - joint2: "28.76765" - joint3: "17.15688" - joint4: "100.21538" - joint5: "4.05433" - joint6: "-9.64651" - joint7: "-5.26232" - } - externalAxes { - axis1: "0" - axis2: "0" - axis3: "0" - axis4: "0" - axis5: "0" - axis6: "0" - } - } - force_params { - fx: "0" - fy: "0" - fz: "0" - mx: "0" - my: "0" - mz: "0" - } - path_profile: "line" - blend_zone: "Z10" - velocity: "0.2" - acceleration: "1" - vel_var_name: "" - wrench_var_name: "" - } -} -group_params { - group_name: "RecordGroup" - pattern_start_idx: 0 - pattern_end_idx: 4 -} diff --git a/install/arm_application/share/arm_application/trajectories/xunhuan.traj b/install/arm_application/share/arm_application/trajectories/xunhuan.traj new file mode 120000 index 0000000..02d7911 --- /dev/null +++ b/install/arm_application/share/arm_application/trajectories/xunhuan.traj @@ -0,0 +1 @@ +/home/cc/ros2/build/arm_application/trajectories/xunhuan.traj \ No newline at end of file diff --git a/src/arm_application/arm_application/pipeline_node.py b/src/arm_application/arm_application/pipeline_node.py index a515033..79d21ab 100644 --- a/src/arm_application/arm_application/pipeline_node.py +++ b/src/arm_application/arm_application/pipeline_node.py @@ -511,7 +511,6 @@ class AssemblyPipeline(Stage3Search): ga = load_site_dict().get("gauge_assembly") or {} try: margin = float(ga["extreme_margin_deg"]) - speed = float(ga["extreme_speed_deg_s"]) ccw = int(ga["extreme_direction"]) lift_mm = float(ga["unwind_lift_mm"]) open_permille = int(ga["unwind_open_permille"]) @@ -536,16 +535,17 @@ class AssemblyPipeline(Stage3Search): ) return False # extreme_direction 是逆时针的符号。第一步出孔,第二步顺时针进孔。 + # 四段 A7 都走接口上限。样条峰速由 a7_move_duration_s 压在 0.90 rad/s。 first = ( (ccw, "A7 逆时针至极限(出孔)"), (-ccw, "A7 顺时针至极限(进孔)"), ) for direction, tag in first: - if not self._a7_to_limit(limits, direction, margin, speed, tag): + if not self._a7_to_limit(limits, direction, margin, A7_MAX_SPEED_DEG_S, tag): return False self._state("首轮咬合结束") self.get_logger().info("首轮咬合结束:A7 已顺时针转到限位。") - # 第三步:只张开到 unwind_open_permille,微抬 Z,最快逆时针空回,再降回同一段 Z,合爪,慢速顺时针进。 + # 第三步:只张开到 unwind_open_permille,微抬 Z,最快逆时针空回,再降回同一段 Z,合爪,最快顺时针进。 if not self._gripper_cli("pos", str(open_permille)): return False dz_up = self._shift_flange_z(lift_mm / 1000.0, "空回前微抬") @@ -574,7 +574,7 @@ class AssemblyPipeline(Stage3Search): if not self._gripper_cli("close"): return False if not self._a7_to_limit( - limits, -ccw, margin, speed, "A7 顺时针至极限(夹紧再进)" + limits, -ccw, margin, A7_MAX_SPEED_DEG_S, "A7 顺时针至极限(夹紧再进)" ): return False self.get_logger().info( @@ -809,9 +809,9 @@ class AssemblyPipeline(Stage3Search): self._pin(q) self.get_logger().info( "插孔已停在贴面高度,不进搜孔、不抬回悬高。" - "接着只转 A7:先逆时针到限位,再顺时针到限位(首轮咬合)。" + "接着只转 A7:先逆时针到限位,再顺时针到限位(首轮咬合),都用接口最快。" "然后平行爪只张开到指定开度、微抬 Z、最快逆时针回限位、" - "按记住的上抬量降回、合爪、再顺时针到限位。" + "按记住的上抬量降回、合爪、再最快顺时针到限位。" ) if not self._run_a7_seat(): self.get_logger().error( diff --git a/src/arm_application/test/test_pipeline_stage1_diag.py b/src/arm_application/test/test_pipeline_stage1_diag.py index ed09176..fb43ded 100644 --- a/src/arm_application/test/test_pipeline_stage1_diag.py +++ b/src/arm_application/test/test_pipeline_stage1_diag.py @@ -86,7 +86,6 @@ def test_insert_hold_does_not_return_to_hover(): "首轮咬合结束", '_gripper_cli("pos", str(open_permille))', "空回前微抬", - "A7_MAX_SPEED_DEG_S", "松爪回转", "空回后降回", '_gripper_cli("close")', @@ -95,6 +94,8 @@ def test_insert_hold_does_not_return_to_hover(): pos = [seat.find(m) for m in marks] assert all(i >= 0 for i in pos) assert pos == sorted(pos) + assert seat.count("A7_MAX_SPEED_DEG_S") == 3 + assert "extreme_speed_deg_s" not in seat grip = pipe[pipe.find("def _gripper_cli") : pipe.find("def _wait_gripper")] assert "run_gripper.sh" in grip assert '"--cli"' in grip

    (6iX=U0kNk6Ls$a)$TBWKECS{9xW+b??26yg$c# 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.vI9Z`p=|vWr?d9^K-2A?;j3GL`;*f#09j}ZnVR|@w(uOd z*RF>`)fd`SILsG%hu>>Gc`G7#&;uq2?Lajqf~$f22-dy>It|&M%`Hb>d)NQ)b&Wj` zC;hY2IBt+MU{cp}_|h(5rC*K=0kI$Kp};B#i=_M}#2zm?rRs9_d{b==z#ulIsg|D8 z8FGD0T4Yre*xf;Dp@zc1mQ>@e3xLvz_=s`{p7U4#wHv-ahq~DeHJ}Cf7*KGUiNi_a z^hcoD=G(|sD5$=T{OW?j3k!!AUQ~E7ZP5lFsyK7{3iXnR^weNzgtYvjheM51P3@95jGwtu8qZ)Zarcrwv zxWOFNr3$I}>^E3x#rYtNFLld=8R0#OE^3BeteYA5u}9T=4z&B*%Q$?c&X`s8-uy}9 zQd8_!sLeGp3(y+U8O-^@r0+1?x>%dmI=v3DtZd5 zFCD`u`0Yvs=f=beEXtCRn(>P9$UKQ5L8d@G;xGl? z0{!y{EQ$X8AvG2O2v(%AT_KjR^#eh3Ba1@0aQuMP09=0yC&8hOn0%$v6z%gM-L`lZ z5+f(}AY!*d`@4b>Ipox;$!T+poCZ)r6LKOh^Kt#zA%R1HUmM!*f}2b2(S892aE+Y; zQIj-(nf)cD#u$rm^3|$!I&$d%O zV;7!~ZPeb3Y|L>I*SS!w2?Wgil}7M0paCZ+Sc-G~R&OrF{?PaSoNxR&wiybSO134& z?fZxhb0Ds0$;azV&97yuG42*%#iOVN-+NG^ge7Y0Z!N}QkDCAf&?XY>Fr01p0*$y< zyg17YJj;BkRiBwwSWw}DZ}s+DH{sDIUWqTYaWKV)0IK&}&z7N3oe!6{eAYQ237Eky z#`HSQ#C^pXFy!EXN0F*krX~29UAuA}Q?v6DPGZF>{s>U&JSuVibT~f`c&_dI`+CmuHUX?6?Gv`iobOl0xR?d z&rQwneObVT=E}iSH_pRN30yNW@?(s|B;@3V#wxL|7n*f6yKp0K6rVb&pL5-L6i2ZX#SLWRQ1`n%K$-jUx>d6L5~Oe^0E7iRcEuahXRG%bYn(1MIIQK7vr zI@%xl#-G2j>P>JEX#%X|!wVC}dO90x=Dcoie0FmyoRK6Ma%f?*#gIdyumW0L0!2y| zSy_Gq47~$N^fC0m!oF7w`^W&K@V+JF-I@=CoCJX|Z{Jj8*`pHT3J_OdmnOuOA+F3W za>vc7LC>1useIUnC!|bLDSX%&@f1jwWkAGlO|552FGxX<4U4SoCcJ`MDr5A|gA4di zn9iIqYliqjt9zj3VB7^oH`La{)?}a_v9o!%m&J`@8${0b0Pt!=7B=BtzJRkE&;>DA zGni%>f$srpA;PoqUt^{&G#7l8WzDy%%Q9gxdFz8iM7k z+Ipm6LfI^Cc}_YAr!`PT%bk4~VPUk|9()d<1!5BCeT3$VN_NQffyA=z&tK1b)?zhB7J?1`Y)4?bIX3@4P1vk} z7s|c~Omh-I7WY|-d$pds=XXhY3EvHZ0>!$_?0yKN*DBa~mTa$Z`1Q%tZaXg3ObZJX zQDW3CL0{U#NN!fGj23nRkj^uZ&u`U=tZs#;;!W)Z@cErpfo?3xXr0ahY@N;#ZJo{$ zw!g*#rbG^7Mwnv>v6$loA(f!9L9nkzvoQ#x{>byUxdg8i#0sMm=5lC_;IWLilr5K~ zlQCHiMugh0z*&1}4g62ho=YKzAYB{VNyjOHQ9A}1UG`kA)#cg2+Pob-Ud3Z3y&W})T&r&3nOp$lIA>^_^WxDCK9##A-~wsK2dCCmhJD22 zSbwfq0FH4e(6iU!Bq=^Q9eI^&9uGWlba!;%ht$eb0zY)A92WSYYt^1S@x|4vUFK!7 z5obIBgaS$Sg2a_&+9^v%iq8+`_&(Qo{YdBe!7`4q4ih6$1l>U1I-Qq{4o$J}T-g6W8AN zm*uqQ2yz41KguL&!u}D?XSDqzRpP;TiLbDn#;?7*?H_>xD8jvj6R6n!SFLBBxgZu9 z^q*Z<*1GH4X=8Kk5m+qb3ZuHOHYVGihR#9^3>3)?HpCo+gHo`@ANGd$WsT7H!ir6b zRtG|~`V=I}HT{}ov8oaWKV#atU-!Z!Tn9vJ=ar$`>6Ld9B4SIw$OnCr<%6mhV;M4| zlfe(%azXSjBkNr6>CxBq{@3!%1uK$e$QoUs=Lj%;9H<$ZqBnG;bEwCBklsK zYmIq!I*1KGzUU#HQm%juEOjmmz6OF;opNhJrxc)5GSMmcD5|M)KY$b$veGFJKH_Hi zvWR1xFE9g586c9@)#_X==BPA7f$wh>Q;rM`qZC>7Xe>E1dY_!TD7r8f6sJXQfw&u+ zAF=rKXrt3#XwO`&JCUcIV z=jfxlb#<)0Y0(hd8-I_Sg?`cV2mO>Dy(=L-J^Gx}KRhS$hiBHHom519rx**iWJ9oc zRGYAynTf4Gq_+e?uN=ClN3b447^&rV;5=@>7RR0=jiZs(82>2ZC{N`AY|4E8+VlS| z+j)$~lgKExQhmt5r9Fk)yZ`tggmFuF6nIi0QnHxBK`Vr`=7o81sv136d#TiHCzZuA ze2#p%gaW0JlkOE+&pr*6%Fe36{)hS|pdQe%T}$^i4%`D5NUs}FCI@DyufTx_>lz@C zuITOxGc+9k6uVGCi9qTG&}f*EbGf&~{sAHu@?n+u8s^>#>_0D}71>3QWbql*E#6#v z6*8bR?Smd;#v*UIOSXkcPcA#vIC)Zw3$`+rdA!bsHq|{&& z40CyXmfp6EZ)WHto_YNQS^RFQ{*w(F&4?GVeN&$c566PC*kl)-1do}^F7e{tMtN9 z>{6~=QE-ZZ4ME>7=Im+rzT3;*^{72e*b&FUE>k>KDBb7?krk3%=UvKGj3ZNAF|Lg5ee(M1DU|<1D!>&j0{YY!&NXnO=sl{>%mTW*EX)a50a%Mr2X?IvCQ| z<$H+qWdz?sceIhf3Xv6)MrF-+vevbi^$ZcoCL@U=*=`R|LIM57#4gHZMzB^Fb)Vf- zJs8WB$;G1vc@oQ2UfD*TyT?_gHc6g~j1uY*IBK2J_Iz{NjZcq^Za+SHe|!tc{%s=< zjor9csP*7DFtOhY@@U%}iLz2O?uk zFd#qB87C!YJX=dQ=-+L~H&9YaVV8{aU~K6}Z^!0SEKQ%f{RCzqRIBK3oL%(8iqEf+Gs%H6I<~Qz4hL*vVzt*UFtK{QEack6Duo6vroad$ zR`|14BN3^J(tHH>>HGxoZ9L)d z2)}r-@qopiiFgo93!VV;J(-isQe(432YADWkXFkx==}*#7!krRie_-Zohe!zLdwD` zAic3`BBV^_nh{ti5bhO!F=*4lk~y$Q!&Mr=z^nT82&BUPB;Ej*yJ=KIj95*Hl=Mta z7=oaeH_cJa27z#|m|sOTXG`Y5w-Oul4#le#NW(7xm9xam0P&**rVH^T{AxVWjPj&r zR51690FBMCL(1?3{6FJi1-Qva$q9G>U>+U>G!ah#>Yp?~b<8y*a6D51s0L2}dJqpQ za3X$D@?m)~)yrf&0JW447;btQPePxCC!ptaPweffh_(WwmBMC9+z*ti%KG zh%DjQcmmGOY06^fYQDPYfbUk|PR0V>ay(IHtwc^#FD-Zg9?>McGzf@*_X6O#;iO1( z;2Gp1pk_Ydw_s=FLZNh|S~yApB$(?gU|xJUfrKmtEg<>sm5;_1`-S@;B=xChmANX@ z?#v{-8P<0tDj?P1tJiY8^3QKQPW))ms1#3s@5hNfF(|?7;Lw-Ggxz5z*0C%*3Zf`1 z%Ss+=3Y*|qmR*R`E^vEeLURVd1&835M>DhMI~XH?#oNep^qrXmUzmg0emX7O#Nm{}$4B`W``oZC8oy~=-;%D+r91c)X_ zZ8@GW0f%3_ti}VdST$ia;|V|SFZNO>v~{zir@CtyeTgz7c_t(kF*`b3Qkx^x@GE(mlQQ@)97$lq6}LP3r!Y4K zFN?9_$gN0?$xpH+9){vB`=k7>3p4+E?gelsj9YqiG-!)asbYpqM;7 z`DX<0go812Ry`VkKU|esY>c0+?T=o6=hn!CAV?+-RLf#rAQPFeAx$P?e$*5)QSJLh z_D9bJlDxI|F}lr}Q@_~$DCvgxMYe8!v6~Gh^h8ux8Db2_xA0PmcX9p+07lYEKrjvnFl<%`d!($abM{Dgpgq+F zGL$y>2XSwUV{kzG_}j!EW3Up>-^!lq98#4({Dik0R6@h4v{MRmL3eZk30r?n;TuL~ zHFJg5gW{VJvI6(wml7z`u_u^AazP@EO@jWbNdKB@TO>-GQ-x1Q0fiTtG1k)r@|tjn9PQK4YJX4s%pnHR*&g)HZ$T1^0BYc zWGayWq-s34F+L8Qm}FOncm5S(I?$YFPS9I}s58QSd0-2uo9!FNVatoD(vitjf^f?D z08?I@cd#5vKZ4bo8Q9}e)l%Zc{xrkNu{6xFG0}vx)d_gogO*|}{oW&H zp#zZ#7E?i?Vl)+Mi$CLTqgXdJ&Rl?3v1`h$V@kM3%}C?gX29m=F?GdAqoQ#&>gCpt z>EO@YIU>eoIhDKPF0l7RsXCQ|VG>0|kgmFpG~Nw*7a@z?gZHQ{)d&+dQ;DatnaU84 z)stwA;XX@QgE-59TmuzfE;M_2_ADM+h6WbMSq`k7s7Zi5lUb!hbj?k6Qj{$Wm&x%*xUBGxse^MRX!l|d3LZyhCS!G=0^oWX0J=m$W~yE`X0%k<4ji#c?>(?%J~9tRRT_(A-dFK1#I4J zizb6I64YY_iXRM%`{Pu50WM+ZkHulUuUYFU9J{D6W^xu<4YeQdD=Mp~P$ps|en5VS zj$E&8qV^QF66C}}CoDE;=(F}}aD~Xz_|fttN1O2dz9FG?u#37_#~otN(V+wF7j$S}`)P#if3xhf{F%(3$NBRJesDkQfm3nw z`0OzfwirHDg~u{{yb3>w0|EP^zoO7T$4kbq_Cv&LhyZ|(7+!!dR+31Xwu{;VrYq`- zP*e0^6=;Z_>jbXCOu$@iHEN$0Li*S~ixq)kWU(K_!vwTBv~Ft81e(zZ=dMgiP`;jx z9CwdBfvrHIOv(6cM50kk3mPW)E9Z@UGVW9Gg_FbX!tIXbd7LDL!Yx8!FUp2JiFj+6 z1?M+O^y{$=sn|2C#YMEJUx=_R@m{}4f$4yLJ$5}i01B+kd(q3&@De!%OOAcz!;Y4y z!M;ZHNUAw84xlYm9?ZW%D~}%Gj57$qHYed**(7{GFHESK%GnOh`%^> zEOxH)Esp-tVe3`5C?1Y2*(kC;TeVG^#qQhrX4awTsPYy?L#90t@=bJ|Fjj&Z3Q*BE zRVP(bNDcS%RmW~!odY2Oo%F_c(n%RyIMC(-9POzRr>YYD<0ZT(5x;e{E2%vCo&6k# z3nh1Ygi{0Gzs0(_AyNy<)RQ679Rub}jC3dRF>->z_;DhZfsZ)hQ)2Opqp=e2BZKs= zre)0yIT3<`(3AE>=$gm?gd8xuNp5FOWNX#5AW;ct*F;5-_F*ixT!3R;V)ylA%pi?V z2mbSt^g9nWcT3do%mNqgP`}ex4kNUFXQC))wnM*jD(bTD;UI>zerLRZaP&L9s@?jX zWYvz1((z4hr&T+?jqYNQ@W^`FQSEf-La&eZjYI|y3Vs}&{ z+6we#B6_1-GWFaSWQ8Kza-qk0!cr4iN=s3b5mt(hsRGM$C^PBASrYY2T<8tkGp^`( zyh9gy|D;4tMMr;RH-Zmp7kZ~)4sFGS-bUy{+=`CR{)Frr>7sM*7 zi71)LEHeX3G@xt+D4Il(SrXlm3%!2Kt;Z!#Ea7zlKe|t=sl9uD-#r?zI>opu$+OKdsakAft_%nxBjbczoiSk zlC{7i*6v^BLhtX9__(y7l~7>g7j2{{h@P*<8+%@sKFf3M*Y27@8Yg`bV)~McksW%uWXU@aa+Y+(@EBMP6 z;-kqbS4BltlM!}1cddd2%x!R3hl0IvCvLC&tZlL^$ z!%nc9$OA}?okwg%pY^Dm-4>(I+UT=Rtsw8;mOiUY0myOzaP(Q8IDoeLtZEFD)@S8% z%z97Z6yX{%fv=#HiFhhX`41PTM19sDv_9+6>$gTG1VJ)!pjsB|0-3O`7@6!CeU{@- z&k&4$r9ZvS>9Z~shk07t+D4xhmedaPS^vaN$!uSrb;h;sad+vniZPzx9i7r=?fW^H z85aLKcC=<{lNjD%{`3x}rXEK(|G17=ZKnq4|AaritH`O*f)CN*?X+Myx{D01Ub^kS zs{d)wmW8Pw#dcM<3hmPw(3`@s+qm5$#lI%!}KO`qnynJN=Jx4#Z5}7FEGIOLW zjx4o)$htDFAKD@Q^l+_J)-3iB|3p8e`%3gf+wV{Bu;;f^Kg4~lOFzV&ZCpR(xYUDS z%WZ9%R2fFJ}py#KiSNiCUqGJl?@I z!)6&iBQwLNnx;|QY=0(%FQ6$y`{S;D8*6qPaTC7yf(QVA(=!ry9a#S@+))76?g}UBq;(@tR!6!6STh|ly zO0IlFymF-{>ZU879|P)CuHN{OKJ$0!O4jz@?phAK}s)?TfBzM{l$c`IX-2JgqnSnNLSwbQw-+BmclplD_CI zo)Yg8i>JP*Hs(if-sRNSaJwY>qJKz;`l9=E+#$B5LkHTo>CnFRXoT$BS#}J6s`+yx zf3C$3)IC=m0d>#8mr3{nhWA$CGa24Rg{vwMe(oj|y6GCpI6D;)e@6rWJjd`o2vc7) zS?h}?y8P&EO0Q_kz|&ANkvdi)yr8$9zG9ne$o9 z6H_6bPa!(oZ~C<{6;j?+?1`Q)$TaS^0nC!Rje~I>sOs2;3TbE30F)wqWc=6IkswB^ z^X}~)yp*+f#KCW2s-r?W6K9T*qcAt(Dx?dMzHJp!V;Sp6Rw1Q83UaBC_5dhHh18F7 zZn)p3(wGWqFUS$-q&q+0!1jBMeT6pv42+ZtsjDjSdA!6YSWMcgkgn!%p=3jVvt^C_ z<7lUwJF7xEKBg*ah|JU~8#B}pIXV{aQXw^omM4i2wJu0hNc&xa4s4@BdPj7(YNn8W zh3V^J1ZjVc9*xWu;97;Wf-!v&6aV-M_i{Sx&+glm=+HpipIx{2a1?1=hi`SSTTb>) zxo{23cyXP^n@l|k^8HOMSM#u|YxDn*D#@akRVw9PR!=U198b?4KfBGM@%5yaNm2Lgm%|aaM?|1fRcRklxbx*8hHrA08`yc0%plUl$&(A?#@A499+rK6)|`!RqHQc@-B^du8Wg88WXi&IxNegqp~#DrCln?+H!!*$ z)yQEW^6<~8kJ#C7SAo0q0(a5!v@cX2S;Cbd{Gw_lSZV<-)hmB???NKr+U53V*M*l6 z6vjK;pWTdi*+Yr`><$LTHt%b6+MiwB1za%P?6W}KD6l-kFTVAx#1UGc!!3`~vg zl_P4#X5xIE_u;KUX?;Gx_m^3)mwO}(jDO7Uf2*;?;L1&^T?9lBo|lK5_Fp;~WA4;_Xhy z6il|Ass!jRXu6uJ1IuvaD-y4EEw}_TH^J|q+Mv~gb%p0}AD56g5fRweNaBRV#IW*b zcQOPvl*~k;J&mnv*PorQlqsH5UI$+7__I5F1)9Enc6&CT%f73@)RAk3zl%S+0OUiC zUJ8Ve;gKrAph({^`rq+qx9(y}Ah=SA)d5C1ml}6l=)}Ra3G;6R{Hameb!i%mZ^mI} zqua+^W@(>g0W9a^`eh)=5nTZm2=oW&Bz#($8HlFB5>>d{Dj0@_Xp^(t441Z;q4(|4 zs1@3a?e}MQ2D&-fpWP3`u&NBf_DS1C0H$<@_PIG5ar`sP{N<)GXrVvccQJ9pLSTP) zPG|kueQ^r4o)s=h4Gl>%Lq{wq%K!A1x7!RW==!v9(K;MlEw6kESG=;LlN|fayo(E4 z$h5Y74@VW27NP<0F@I=-FJ$*w$0po00HXlMgqSXV2(fAQc%qTy&+gcv7{&vTQ4+L2 zyGa+L^H*V?#%{+~y_|5;5D#*5cQ%{@)1g1R;?QgKH}Wd{f`(|Iu#~n-;M~OOc4#&_ zQ-p1Bq5^WrrtS4-hl9~U=(8e7a^XSdd|nUZTc-Ut;HEqIR!Zw_{Ml7AgVpnr5!}4C z>(6e>GGa8a0x-e5WB%-bYx+{AY{Q$Kp)&CwTf7_@b;Np6BkdPqL=Zwk;xfkZR~Qo#KA*Az(8AsFjRN3bc- z!-;5;dtJ;0u-Q7cF_4Q;Dr{6QVuIz_cZoFBbV@<4Y7CS!4tJKRW~foF53{N3VFyk{%FEv z^|k~L7^OFYyMikg^V8R#5dei}W73%R-4KJ#@FUmKO4tjU`M1DMS8x|ZfMtLj2d2TaG7OvH_9;IzqQQ?WQal_X zBRkvN*d19JoBu{71Sf6}xHp+uLOgCRhjn55A>6U1cRd)Jf)`~J%w<8*7%)J?Sy`eE z;QBC|%pRsFfphEfjfF%D<*xI4vw-4XCn!`OnkX1b$D?cbMpLd?=rraqaxMfKkSh{R zkorT@CIEO*Xv$hCj(xFfum3EPz@|!FUlnM%*6D>1kWjrBdL!~Q{;fnOvUU zEg?sAKl{PK$O9T#0RhXN3rSN!T^u#lfVR_ycREN;QBAL+R2=Si96or^O@Cb0gq~}gr0L(GI-)TEXQM0{*-wT{?YEpWE7-eL zoE-*kNDraDUKekNj*O9(=Qg6=G$;*kd}ioprhaD0lbbf2v4jU<>Bag;K7Kte@qh`J zFAF!!OP920s+=kkR^HfLauFwOib$2%V1I%gL*j809EBd(}oS= zLOB^*&{*I_Yzbz~sD(`hGD$Is%j}^t9$cxZwkxrpz=0oWx3PE+bj*4*Yc{aJbgE%x zO@T>x@Q=J6v1)_g*DKB}O28cW4GKTyk}BM97IgZl7o4Uik^t;R6IGJT5? z{EzVYJ0(@*H2!>#DBF#)W*!VKYDm%zbi?VuAp#BU9F52ROEb21JhJ_K;LZ7kTQ z6FgvVjR#B_YE^)E0C^jVq=g=|T6sT&mGHQ&=7;dzX4i-FT@eCLdc`fWN#5#B~H!TA|T zu=7tBE0nT6S)Tna)Rrg*hq)Z)6nQIrpcm3!^+Jp)?>Pbz{}`U2f->4PM`=gd%1~(r zKbXv%^b68280o;`TOjx_M<&E#_!8w=Tzkarbo@R>OgrJP|q!<8>IwR*hE`*1lxxaYpbk zSrOYCvvsD7S*9AZ`Pa&r_1g!W%E+n2aP4A8!Pwp7bOCgaGET&LA{yyhWrwjIe7=WR z*FvlGt5_|2akVspbVLEkK?u=)cn}f5OyHEz)ClT!mduLCQP6^5e?YQ_k+jN>yI|vzZG_G=GM)FiS;bYBWSM~tJz#o(2-+&!jX(k)I zGis+{b&loAj68u?;HThd`*!0I7XzFg83R7)N>7i@G-jv~R|0^vT{L=7y0>P7Q=8awU(!z&0YnMA@8WVR2&j;l5IJa z@$C`9=Saco%fvi;A8<5=GVKp58G`Q`0lQw-_M0g(qLNSe2B163Nj2CmnZUz<6TRD6 zy<f+S9?aAZtNtJRN7FuD~Pjn5m8Se{yJFf?_QwVwmPN61r!*sQF zdkJ-8=IwUR1r)As@n&NS(ANws5P{>(1PQ4cCHP5LP+9%bLK2s%)u2UN7~7rRNvH!H z>~qaZkHD*l89838#t?Zuhs^`gVkxx2FW|#3s5A#qr{lZ!mB^h+h*(QY@=&gvYgS>PZu3jrW<-y9Sz3f<|g=ex)xLGMCl z!XIi~77s2*5Mz(QLt_y}>S{cg0TAx>evS|kW{i>ZurlF?ckXtHw5gw^`dKc|JH6HV zUG_-4zoy?O<7s<1qtWBdcmiOOFy6#b9r2|DXUJW+vXWhur1sOI9Ge+cI3Afrtk#xM~9e5Y}z zn5Mw{rF>_e$vO{$^$1>$Xe9GP5gZnPXb?csN<4PKIE;j3MFGvoc|r)EtM^pA+qYu% z;(T~U4EnGG`mAt1Q+X+iby=Pb$(KIt_0@4C~G8%K5d?oPq)` zF@tn4BKge5lep*M$v=`Ig0Kn^^cLwjhIz-1e|DCfe)jbeFJcf{C@`6)T<3v_4uUSl zs~Pwz72MYhE%zBki`C>ID0>wo=J_T7qMSpifQ9Nws;K~>F<}Oh&*jLgq4`5LZU-)$ zEp!Cp7UDre1@NRo3TBJVZ~^#S5jHxOXUy4MV2w|90_V?0zkx8sjiXpyk$qN{og?}H zo<#1)4SPXhV{s8i4Ob5-g_oJ3ZeDR-`3}&i^W!AC#H91c%TS5!PhCxK!8ll<1!8{) zA}M_Z8{@wP-gFjh)UH5C90p@$@rRn3rxgBzv!DRICf9euHF@w?&EX1l49yP(p!^0({Ik+X&@}*cT|y&EkSv;?Li#uH>qPEzpo9tLmvI zW2)xw?=@MDMI^^N0VVeUi=R1u(1Xr4`r$XBlsTc2o$Hm@6(IwdeaHY7=;n^ z0ujt1ngaK z8NqDCLA0}1%l27W%W+AW2ebEYTg25XLCUOQeNc|#w2D2|1*>)BP5g-b2~pXoT_=E> zBiRzG@}r$FIF7FGvqJU2X>#UWM4Q#}T}=UL6OCMpWB3C z<=Ph>gI@XC?vG7xRvl6L!Qgu8~8WcEydktN!HjiT+e}oyC~~{OuugEMI2iQ6lDy57qp6j;xv*xy6A? z2S^269msX;kr;C}o6bVu&J*~sw#u{HY&B|UAT1^xXGpH&+se>&?p&FX+oXXq9xgdK zE&8nMEj_w8_Ewx8IfN@{c)*yh*zF179(z0qcfcq_*oPr(Kc?!|Je{fL-gZ5obp zNzGIKhn0t^d2H>Q89L3jPG1{3jrCrDde3i0wyKZ0X-R`}%KmpgRD!AB;w*`1 zVCK3|iL01^mC&_smeW=Yc9Uu-_J--v&GW~fB^t%Puf08U9Wa#npTZo}gE75CXBb`KqX;7k1} z@)Twa2I(e`y*uO^d*3{=cg@dbCc(~{(33Cp6ZR6;#aUdZP3t-wOm*jF^<(1j+1EIe z6Gyx!pb0q1T&&i#8vvHq;Xm}@L&Z!UJ@uxlHk;(4|M-G5RHxu1_NmvJWN zN8if*hc@=$?*?{a5B~M3I2N|9$OUfMf@5e14L8)&N*Tr! z8U^sCHHVvfC#gUuoh3=0TfII?xT!nd>_qt@c8mEg5vO6 zHV{4MgB&kiCz+kTi}q2FoX(R(r}tjhiB9)PVm;xZYhTcb>_8t*J0>z7J-CNYpNtEm zwItUlZ#h{`Ia!Vo9UP}0vje^}6vf)`os$t6>&Ij8lE8P$KsTE2?2R-fSLpfo&NG~U z4zuC91Aa5J8M3`;J#X_tuJd)(9??Ika%2&RAm6zLd}m!H`ObXwsJM^e)%nC-Th;5a z9ftBS^Onlu+K5z5VHU-E;C%|b=j*CReHOk4W&NmPFRptnf{c8QR+7s;@Vo%r2P1_C zHOxMX`#%{^b&jL(zBLi=E8KW@ckteVqT9f`cjxeS_+bno2md9+P9zw+?r6c^_oSl3 zIv3svL_LWKAgD6rC&5`{(dud=9ZeUqDann(% zCZ5*BYD&|It90UWB$BRq<`bi9c_C|$cCiGjm{p zUK9i5jFm79HCCS=$sT!F&U%?IQyRUk?=GK1DPR<@T<)2u%1xR6cQOYmpC1G2RG!Tm zROMF)7*7WHo)4!$D5;#qkYhn6@VrL~!l`_k!^R+wwpQ*&ak-Rza2U#C;aW3%UP?C* zxLUaOM5JqdhU3IxxNaX?ukijeKlgFIU*v^}$hr85&7%U~jc>BC8Hg;zkBX0%Pmg3L zz)Kekbei9cKvUxUCeCa^KPK^;$nD^oSYI7}b6rf%@moip`4ph2a}An(ZnOF?i%UB? z+iN<7Mw#b~o0loh=>ww`0r62CQ#%m;ZL-h&%u zlMzGKvv&k%V`zeskDPXZ|7dv)?HG^o(+GZ!Qk`hW0iA7!gA=HV_%9)vim3Kf_`fnq z#0Q7@0C9)+Pz-Tc&liWYv2z^G!=woW1>#yJNuFts37l-kiWnkS>qv*p>~NjGD>x3* zVUojhZdXYT%VAQQuHp)nM1})N#NjuTL}KiwNU}^JxABM7154?)<&ktLmn4sD&T;XZ zukbP$JGi;9Et5wKtSRI++$I)}tZTz><{*2*lyAdt{)Qaf5-!q^xU_L>T-@eQ$b#y! zRCVMvtPbCnqxSaf0H2y%>2%5(Za(AHmCi?{!n<^(E-sTQKs^6?oCA4tjLATtB#*iA zQAG1ruaYszVQ{i5)!Zo8=0FP~5YNtb?`dNE0Q-SRdHj2xg!s((`5yTV+G^D9MSgQ; z0>6>?j`&THH$8H6yYSN^AIIa9_aAaz^)%?L@LV(WgBkippIdP+iq&bPI=DL8vPuhFM`n)g&u=zvKLmr~x5i>ew*~usU;ZXzd^y1IcII7sgUjOThYxGqg73RUi!g3} z>(EEhgW6MEFXRjq;QXDdxHUShD12&b5w8CRwxm{`CHjp(Lxv9`mKliPzax z!Ob$Y9WY9X`*tmr@8fj6>M6o_72r>Cz*jvt58c*^OADh3ud$MNIDL^jT5{{~ zL~rXk%7vV1orseQMq=}iIfaZy@H^CKjZW8ir2~vndpUq=P}pT)Jk3x#pny1rvK%8U z7zP=@F^ipP$ZgdJi2p2@VCEmr+Zv7WYZ(@#cgkETH z>e}d@b%8?k5=jmn;?G}Qc@$2ocEufYTup^?VQJ-OxYuZch1HytQuS7IQtql1rgc8B zI-D!)?vVhgm7NMfVKlyzgxuO%`8B$(I{@gB*&lcn;(#`6!fET7)HhVU>a)6=p&mfB z)p6TPY>i-s%A2n8%2G0kd0B;%AHCB9>ZWMb-Fn>wGMIY%nAQ!*1f3gFVRX9oP}K#4 zQ}OxZ;r`GK8IdPJU?c0ANhTclNDr>Db6K9u$^M9^<9|C^W zlY~J+TlI*B?+_YpwJ1t^&PPhaN4mW91d0QIZZ0~*!2(DHipK9IpBWl5S8Lto)R!6*3C!DqlddSH0=1=l-t8V6@PU zi^RhKR=YPiNmFvT|l@KY|_}je6B5OC_=!AuSFT zT3jw$Bq6St4{1_Z<>>#9y)%KYt0?<_(q3PO|!i7k){XhIQE(zNHojYPU? zTPRRUl>&t(P|DImk~X)Oi&ata6%_#$6%a+BEJF9NDHR0EUiNbd&`P0HmiGVs&75=Z zIX5>;L0{khNBPj)GjnF<%<{}L&pt+}V+tBT{AHw|fx^!3hUFCX#k%mhUp@CYEHdcP z(kB_zF*rSl>?Jm>6&{@a8W5Pl+hd9iTFs=nPeu(!Q)k+*6Vx-iq`$ zGv4ixZ;hNF4ZE0YDOhBk!|AeWfphyr#`@{ESnTO;$c1Ds76ZxiN{27wc8H3C8SEq1 zO-?M)#g(A{cW|`;bFi0!NK1N<4Gs7d-KtX4l#-^^*e^E5Dj#!NUlc7B!oge|CEo$r z;8uTD$fp?~8Ely)2tR-M`u}0Mj*8-EQ@Z&P=XMYR+VqMUD0gL6*_o$SwGCVeN?$?CdoU%FEul6I3UE>YQ_|urFMqdIb^m( zpzqN+KX*UA*%YDAU;Ux>qx9#kM;NTdN^lwdNTE2L5MB8U-NVpD)|ijaaMd|M9=OdI zCm6}bx%;vrT4&z!hsfDx#W_Yw4L1?(ugzANYyy`NewTi*$CEdFAAkw9n=FW><}*`AK;WSPJ|C*UI1+Wl3z#DIr7UhR6S;({GT*Ht z0v#4NFR+D7EV?!$+yTv>v^FJGm308t?{=3s!X$p~)+r%wLboJ26GV`-PZ?B>=y;I#gX5u4;#QLD5|+lfZn9ZS27a1AfgZoyV#on!DU zSHI6%DcNbMP8}de*4%NZ!SnVKL}JKoyD@;dhAbHvON{1Y7(#`1+z1V(WtAJiG{lF| zR~aLt$Jt*p8!AgnA!zcY?4=R$akh(6{Hl9U-cH;8Y&^63GW&<}Oj8oa6Mw3lAxxE- zrqxcHu0~3)DQ~#qRN~33hZ7kH+q0p!#p$dmAa_ z#XhB;aDV6q!biZ{59OTcs4r6k&XB24=B3)h_i%>lzxh}_bFe#$_ERqA#ygtoYh;4E zCRXsadKFKcTILL?2TqRV3U9Dt&GM$B%|(1~F)i2{7<-9%UUKg1iFvX&aIrT4jB1u+ zFOeF_K3(Q6_XfnA->!*&W{aB|RXc#ahktJ~CjT2=qL)?lvVvY#+g_ep;j~^V$nVn2 zMP_q%c+&+diQHaR(@U_(u~qc4LcNUJUS=00e}BXG1@_oqz_PB^-X{c2Qk$&fughKF z@%H+-SGzZTYGJLgyW7hhF$Kz}?HfRop*xD&v(3c%K0o$_=oW1ZQg@Ff7hR3P&Rf;tnA!1co-Ty>|wfUtp_C6 zDDq}~BGlCrNr+%Q0Mji+N&Br%?#$LV_)SXW%_GOh5+54%s_Y34jwko$tZhCneY-&1 zx3>Z3fWR**@s4>4E`=2S2^Up(M<~Ta)N1)eIB5Z~#~f82Z%CGxvy3h(3u)ZXXsCIm zd1>bk_B=q}DP3o*<%|++O*eRduy#a75T8+Q{FE8!vKWiW%q+%5BpR@`xS7c>#)L(b z69~N)HvE;QPGuUGB8&jvoXSl2qWndO^8ImXCPz**C%3WX&nVTguDIlN8S8~mNULv9 z?53=(dpvcw34$e_gNt`Kaka~r4L4THqtGP~k880tDScP_o`0JSo8eM%fnXO&jZ-NM zE~X(_^pndF8UnCi=bd@U^U3C!0<%fX6pG<@F59-BH(xp|nv%veutGoG&%1)WtQGna zQpO5B&g(mTEA;yb3PJ6gRZ{loGVH#JglzP$=GWU-xYs$0Bj{dhX5MPAU7<52_oxT5 zv0kU&WYMDxRHo0`lEy&V46W6e-K*F%A(~{-2cMHoYpZXC-)i(jN{eQZEqeU(_zGYZ z-=yMnP6L&JwbaS_kH@w4$z-qhpRt(s^eD^nE&P&xPia+^oLK+yIElyUJo0)9kH$7# z+CE;*=0~>a8iOSI-dmhvBc0nv7t61DMx(|Q`=h3x|Mpdv7f?#Z=}Y-#WWR5>ZfHxC z^ap>no+)xOzp>=#9cA#|&zuXb<$}49$BASpq>L z=QC3x-Gu&ghWx>Rxv>KO4K?k#ID9u@6`hMZadOVZQ#lu>5v@OalcYHpxj*u9<#H~* zwX3Si1g!@mDEi zSuM?Jrx*i&j)8^On~z^Etk95LC{!cJnoTkN*UpyY5s+T^E0Wq()6@bT#NU~Y-Nynt zt)uu__f&aeHuA8{Zd@*QVgiN))_jpPE`;KQqZ++9J zw_4Jr@yg}y@-#Hog%87eTrLE}V1$wkrUP9`m7#&P^Q-@G2ooZiOEO-$(rHa9LVw1B z)~#9TEOJcupYvXGO!q^LGANxR9d1FU`)W7SAlW1>uQ!(tJm-Dh_CM5Up8l&{O}}Zd_x^|J-JJOcpoUX9uT^3)1(B$d!eY@{^F6%$9+x2g>Uvv2h=Fg*P%~vr5kN)%FcZqEy5GAW6dp9|}Q3l294m4k6jY55uODC&;JfeH1mX5OH|7@GhRRmOZ>%&pU`- z?<%tC(IjfbQ`Z@q1%C26L*h_O&`VBc#(JixEXkaGUvBW}snbd3* zN-Q*cgg%Q{Q=hdTG#_*MrLZ=Fx0mVj4aR+v4+`ky(o;ybhP%{M!ATa?lUdDvfSjb# z5YLuI3aC+?QeP)e#1fAu^LU?qoXO)l`#4u^iZD_W7pjT%B(!H2Fdn5nKW!F;^hQ6e zbtbumB&Dw;rKUtDX=`h_Rl7v{gtQjTTlSWj+bZRya0oN+p5v|7-+KfBh9-29vW?V+ z;MqKbX*9QLU1ywH*P458aiO`J#9dr%&E<`^UO6O|kPsWUR#%=|M5b(m4ic}L<-DFE zG&G6s>YGAk&JerGd{1kt-V5ca_cKY8Tx%<7G1VKPFZITd-n?Gtm!8XeZ=BzkEhck= zH_G(3=#Ll4_`$zT)~8o**4LyzmA9NWzN}vUI!LS>#-pkqyxgb+FK;(5i>{t;8`F5h z#BZkj)qeR!eq)-Y%*%HFy0{6agzD>X%Cy2SSd({a6WnU3pC zn{bHXiCp5pOq!QPO&8miszNQz&a_nP7e2vnsWjYDh5vG-|FU2BWr_c?+<&a(O|j9Ct%fTQkZ_ zR*4;th*xTTdCKjC)VJ$oE=Cfc6jX_No7kC*nJ_Vb?epLX{i@7yWsNKgeKLKZp!=L4TgXAXVwP@TlJ32X_%2t?oR;ijG!y#-gI5=2J5ZQK_EG zAmJJBO(e{nJ8R%K0~g+L5@n|F?eyx6P;-MfRlmWuX1n`4T7Xz&`m4HYRrf`D)49U* zxATgi6VC?^#{>`M{(~Bwt6fQ>{?4|ICN*GQn(fU?e`nj5XZkPAy5!m3U*UZ`d7atb z4K*J)tp_ntG7+ti?Pql?xi{7&TWwpPrL10I1uO+!kiCK@$ciPN_TFdGJ8!YQ zUTK`cf}v!>aqX%(o9#Wn6FmowS0ZYaJMOnp?x$~rM++*?^Pfjfj3xe-(MJsm3A>RN zpJya=ShE=YQ=!p6%{MzZ&_8WNm}m7*zVazn=>>YH549hpclrWVOsorSnEORD?<-nR z)*MGWL-vM)7D`et`5LEAya*h&qQDt4*jgObJbqrfd)EgK=pUWMNidtA81fv&3os(hP_z4V6&JXb7|Zw zaBr(n_BK~G;1NjQ>iJ?Mdd8AiQW21hW=M8IQww~}Q0E^leu&*2m{qZe zaS>JDWC7#JLZlwcV+E_E`%1sTLiqAQM&Y!55hzK|;7@i@n0LiAML|-CV59T*?7_JM z(TUsuC!Q6tX8c#acRoyo@lV?h|Gv72|J--_0Y0ddv;KVsGAkqyV5D<+ZEcpTS!102 zP9|f<66`_BRO^?W_xbv)ect0Bs^=iGK{+L38svS?pmQ4^We1+S#z$GXyMbOmK1vad zcZrX3zaJU}zXehPF%524sKe%Q|wRh^YhZy{x5(>L?F&k<5uC@hQxICUQ(Ok@-VX3?y#2UhsMAFYrQf!3mWm$C#7Fr&;%lq_vy4Qo64QJx;!p2xHe5ul zSd7N>s~J7A;)!J9qwM)vD9J4Z&w=g${k=R)2AH^fe~@paDK7{u3615McbQZHm%=(K%G zRORBBo%9sV`76Y_8|DZG1mevNZiX$tA`DW+V2y_5C_;hEDb4!wfZ3!n%gM zGWovK`Zd#XPJ9>&XUY*D#x7bbm;pe-EIS+@CTKSrA7-?8VKI*aqt+)Gkr{2C_%Qe6 z8La{}bsg;$;gY54Hj<1lGhU{#^G59F?Lwr_F(6wDx(UavxydlK@WMh=##P~5%C#<2 zT*uLN877#RLv1IJA4?9z-p^lzrm+;U^FKir*G}7rP?6H~f#!qR{){f}ye-o?0@Pf? z`%GHSD+fT2XEH_)?)*(Ap|{!s(BwDX4PQKS6Id+u<)86vW7|w5gPx^-z#MoFe7M=? zz*eW%{w83VSEo1n&*>32WHU#Go-YnPZ_Pg2z&6)}TG|$Rew~83{6Wb4-NvI4Z<)U4 z?al0G@rH)iOn)bnX0wfFv&EBR$}IJ%xXD$q8eI*NJP$owhq$!#NmN)8YCB8+k2vh* zZ;Bs@hvU~AelKQbqsh*I%FTCj8I z*6ut2$lv47Wb*DM{Wzmm&;XSdd}^RFA2#pyxFdKMiYG~I$&8VWS-)bf=Ob?g{n5mK zZp61WA_90gw-t@~ps*jCh)^@KS6OdEvH18RbzmiLsjwpzBtDo2yy9>1sKUOd_82Tf zfz+4V*bH8kWzoC}$=b3_&B*q~&d1oq``$~t=rCB3ST{KWAtwHdQ3|DYUQVyw#15j@2bHW0HE;NO_)8O(D^ z^j;^^!g;?;6ghx%;mfp+tYB=MCUlUWPJD?6_~qn4@;aXk&Oh5!&*;Wm8Y0k)yYL5D@d{u_m1gvPCWeZqt7}^u4QF+&N@*%Egxzu zHTK>_#|LB6ph}mnA(Et0WL<=#`Z}leExv=4j(0IhN^j9;lj9p*j8726xoiWc^%u%S zjsxuT33acOoFGtoiCgoW4QO6w_QKjXHX~v8YT)ibJ?^_tw!APPHL8Ch@hQDOFx2+? z!My&w5JJnAl5?k%__W0iW_Npy24}UIO-NV6X5BwmM_K~2?hs1LbXPNFrV*WW`gp;l z!4u{>gwCI4;E7X(Luz%?ahfCc*dw?e3U?fU0@pk0b!}$lYmyS<-5{)XNm?Oj1s}3} zEVE&#O{vax_B;CO(*UG5`5jAcfbi1a{yCVfEB=({6S0MbbRLz^jIkw;XJO_PM_@~S zPgqd`A7wfhUSM`@q*z@EiA{ge5|EQ~TZwn&V95*?pcsG~+2DL{*^I;huMV}ne1-@F zJ!zXAR+#|69SNDlWDY&LI8j%qhARztp)}7ZWSWPFAEMN#z}$7E*8;U+kTcXrVr_cO zb(Uz-FdySN*slhkn(>*tBQ^!&n^5Q`&&@YJ^0QQgFK+%1W-dNFU%2g;Po+ z+n;0>pPBJY%!ueOdHqUFi*wsqgAr{G4y~89Djl@8q5SOX>%gm_Lwiiq&{V>%N zUP#Loz|Z@`VZq*Z6OVbtAR~z$Ai9iU|1D-mBv!~b_~}mO;C^CnCN_(u{qc^Pnyp&p zM_6!RU~s?YA#AKw>^JQ)XW^anBc3{Cy2{+7nF0u^aIaURkIk$Mtgk`Ki_PxAIQ(??e&BB znblqo*;98$d;JdloY`K#BR^-g*YCv7Y_I@7XSdhy%+ERP^}Fyhr@h|M=zfCqD}8Sm z|GUW+brdfbzdxCbT6%}!xc|DgKfTMQ2GGfDs*t{BQ$=(+n;J;Zv#CK0Ae$;?9NE+k z3@4k~kx^w+J2ALyYA|EWrgmni+0-tKIGb`9c)CBh#oG_c#scN)^u0fe*e{E43Gc7o z(q<2Y=&{_iq2HM8n^9ER{nE0kI8>gk_{It1AENQN=GVGi$e(9k6+mUlpFf?HA%Bj} zrE1tLHZY*bpX;&(Wvv{hYML$xlRp<^3+B>EPV41>h9Q44^V5ZX=}P}JGu@eDrAF_Q z-S3$f-P1oOMC%_%vfKK(^p6Vb6Ft#C{|Li>i2hkhewLmoHeo2U>FuC@Sl^we+V!;@ zmyM^W^{o%cTOLH-e)zKFQ>RuVr)c^t&be=#XgrOb)^RLau57019Ew(`=>8O45fmMg zr>N7~BJ`6y)!fOU;@=I5@0z!`%-uC<_srx0$}xQkJ%i2sFh(0ln+rf6>Xx`ua$_-hTe|-Q>TP zH{Zn53)LT--j=_d5v_#$Be=CJ!#@ZGel7ryc4=;#5@v}`QMZ9f-3<)&kaEii)!x2w{BgtiP*ROb8kJuzm}2SEvSrMGI^ zzZ4mtbK9Uun!)s#2H(OPSboIJPj zHQbBk{Zt|XbXpyCWxy$_rMhzccGOvS^^Uq)CCQ$o-;TOz`r+c5D*hRd#+CZKNUj@y z6w=SeiLrrrMzR;E$n)SmtbnNYh0WWT>uhg*{ypP&|BgBtPaF{GdJ9D-$Yl+5_Kqb#U>nEMRqOElbj)ARb*1Kep;e#n!(AzX|}KJYj*x% zr{0mY*Gy4M2i}3WB_&3<$bx2N)QfI@FLLnasF^JWVmq=|Gg z(?9y!w@wNgCr|a^8XbDmweUX#QF%my8d!pI@8I=1-N-}brC2{}M(tM8FMU2+ICI`0 zC@pEPE9qPxk`Ea}00y_o0RFGV)gO>+-56Y1d9rR8Ru5c3IFb}|T31VQ z9On2Wnbx{V7;X%K;ZS-~vTmA+P4h)4li~X9{>y$(F7ie=^F@M7yTp}gy_?C55%nLy zz{j=bVW)MmauT{Tid-8dEjiXa$f??Cy^!}>jRelT!DM2V5!i%rLxzK7Q32hVC<#umpgyEG%PeA`-bkmd(9f(Ov%*>Y4wLJ&ZQ!p;4kL4zvv|G9eA3UXBD2a_ z{GiEP?PnfJ=Aq7F-E&TSdOx$8%xY)x&rIfz{LCZBJi=LgnaNz}XV#KgJMV(#^YztH zBu33Uvw0Q?oG}lobLXAZe4-L@67hNCnvYkakwoLXG0pX=Gmbjr<{jQ#t;8e}lja@R zjGJOf-4qg2=9M+?qr@~4)0Xm4RFOYgHOi@9pH?t^=8+kmJe7F`Xu}xE;7_wnZh5WS z^Fe{Aj4;7XU3R!8R3X9rjQ9|E*idS4C^c>fdfUIamDGNs<#~j6qlWAq`MQq}g^w&Q zl6xc(dp3BFagb<0WlFe6WZl#pEQmIkJBhqs7PF;O+zw8Lu2J*8uME%$nP9;UlkdcK z9uf6?vcsdz{T^I=%j=~fCUR7Hu}+ev@AcTI06Pfc%pX7e`hM=v1> z%N`j*;^|jWoQCk5#9;=#<)WLWliXB8fN7ez4g<8ABm?=Uwl}{fZo|+#=*7pyOH7?` zd4ml)|C-sqgr4W50GDO(!QS4YCmFEv6k3wXK04?mzH$~1=w;{g?ElV1IpfPc|1~!6 zmZzi=T_%IKch|M77xWA$iVe`!E52w8)maI^w>Ee`u0Oz+Nsa0c@U6f!ZgK#sqxu7V z_E3z{8yr_-%0l!NfEP(~xR(L9MxJHrONKqB9F1IJ%&>g&`QF~A#*|0e%SnUP2ht^k z1jJWJjH#t;MBmZdd-_|I(|#oF*LVH)CnZOhCdNz?jb-&Wy}hS>H>dq*I)|R?jehg> zAty;fldBK8iapqyKBTAmI)6V-{ipj--yZqW$J`^W1zV|$KBkmrj5f-f`~*d;KBmMc z$$gbnK(D2~EwhUdy_;=+AB2E;+sEhAZ~y&unfBMqx`f{3v|rbK`&+Tw$=iNKru`pf z+rL^CBVF77#}Y#uXU}(n!e#YIod^j*lID((sp(JuEzl>0_gA?5(5)KJhI=%^sp&T! z@2z|%A}p0xkEf>pm?Na^i|6b@1wq|oBH4WnDtNUYkd>1Cr4lQ5)+AB;nsLB z`m!4yQ@O0b=&Iu~0;8VwWplCxbLBuy5q;S)*@FMomu2Nc#paUkY+ z9u9dw3=fa}r5AWuW!Aaqdu}iAa2XAS;o-t#`v?zXvjuyGhtFpV{udtpdGN4O2S5ft ztbRBQ58JCx-!}TA>C+v)+C`uKSrArKpMK>lf-zs8zSk=SP<>L28!h@AUyF{WeF$&R zrkANGHr2H-Hlw=LroY5jpj!iN`i=T%t~UK@W%gN{e(9f$HvIx=SOS(K(55eBpjMk6 zH#8jD^b=6}9i>E~!)nv}qeXNRd9~?3P)D-bbkW^zp!SdG(I;i(DOQjE^Cdm%&$m5f zCpM4%d>13msYNc+z5ZNcZEr6qCQ+i2a@H@(%Rg_oea49&5uWa4JYC>vKTTf5KEs7& z&cM@y7-AcET2uSk6D>@gItQr@mKng*pLpA6nA*sfLNN6^eK;4Uu2W{8Vd@|T1e}Z! znVkz$m!es=FtskQ&^Vd04~8u?Zj#s`KTKV#j)Y;#(%<>vN(vRr&swZiHyLP_k0MxPJiBqua4TXrc>uw5c8pHzTWi(TfM?JLXh=aeKHrau2E*6A?vUA z8_2rxMFB{T?N2c*r-iItWauH=pJ_l=ff50>8Yl5ze#rWvI+BGf3pe@UN}9beTwU8U zzB=wcKFWOM!B>O(08gIa>2wH|0G@8Wv>SN(DE2;YF{2?v7+~w_I&1H9y~kV!b})gx z&)77uWbJ*{`S_?Tzr9b50jJ*VeZIRkutzXfF|S>cwfFf4&tdt1wP)H6d!IcS8sk}e zbbfoE`#ADs@6#xl3dR|-_gVUgU}b|h8}*E}UtkS;u=lx-)6xnzjJ?mX{!oBD+4~$r zGAiF1`M+%M)6PlVoxRWN9n3-2-seV07vJ7zSCB{6-e;6f`!4oA_ZX@>zrD{Ro7L2- z-eQEONJ;-K_C7ZunEns7_c`QG0Z^_^zj(3mMn=B-(d+|Ptj@(3vyZa)VlMa~vyTFN zv7anEEWWtXY)2V*=Cu#p0kweM^lTq^3Z#YIWM)^DF{A)39?bK{!WXZuGWg=^BlF{n zD>-z8FUpvK%s4~%VjZSc!WXqq_YGfM`Cu>4{4~k|Z&=z@}Yfn7$ISpllw~=C*afa~4eRorx_azLZFZ9Js&S*On zgD-ABKY}lABl+*e7gs{?b%!r5yElR_8aR*xdtxkzv-HI{5sh8wixa?<-QkOKs4sl+ zd8oC27ryukxavO?Up&g08Q_cK&WqR+=i1l(v(rXjDEnftwcS4`=|cML;Qcayt;hH9 zg!$fc6AT7P9b=3k7<@NAY7zZ(uD;sXFQRNlbw8$<=(=1TqdFOSE3jX5lM^U1ks=c) zGO>hqjK01P?}sm|-m__d@h|%dW>&`)H*Yc@su@!vL&#|VG=6Ur#E6uadF&xkLc8y- zZCQ_1->B*xj1|F_mKO?0_3uxgvW@xnBref{g7Q_i{KlTjhwWXQ+l;--sUin(KoQ#e zhc@iJbFd`Cpao-=sp&7V5Fz?h_1(l)qw_H)EXCff&>2{hnEEv$B2+g;8>apNw@2!4 zzdh!8#Swi!_mM@?sc3pe;ykTgc71PWxkG6eW64OmH+z8``v#JX?>Xzmafm1DY}rxEgLHV;_QTU{M6n?i8{^Xb;!+o$w zgVe04i%PvF(PRu-zMw+;5}(gJ+Y%zCbZUO7ccM5s952(az%ga_hiz|cJasB2OPjoZ zz$ob8{*18{A;`uC@0B(B%$!nXf0ITs_PzSd-u`FY#L9FL&t2dxr~M!L?JqZ$9Jc*i zvh5!ZT^ebB-Ryv#TA5zXbDs9OHOLsGX-W?F`>F^QrQY2>n$^V(vOUz?WbI{D{+s@{ z{qiCmna6PXFuZyrfX&ur&5jBUUzW8WHUP(+VW|sB!IvYS9(8_7*EX>tm88w_>J_Z6FHqJ#fJ&J%D3;o!+hJy-!#(2m&rd?am8MVOyFofNrZhYrvmU0C z-ZQ`kqkz@+-a`KcyfG8p6X>;OU;I$#i{>O)Pxe!!z1;rv(f(_>5qN(rfB1Vi=*%ML z`onKLAh3^mO5kSguWr_Av%op_QU5pt7!UBbA>qRINITu7`Wx<1i&N86Ss8QAVXM4A zhmy*7V;}VVo_(}0%4gqG_y<0lEPAY>7ybQ1zf-xaeb3!P`>4PFZnj|0`ulHY3;tJs z|IgFkx4;w&uB?4e(ar4Ez#ent_>Zm+8~6F`(1#uOTedt5yLIID{o%`i>Zm?!oiIG| z2kQ^NCak~r6=4gNNr_(7_HURilTq8-`VrP)dFjI@-)8wvqrd+~^tAT*m5(Oheu0UN>cf_RjEw&~cr+u&3FK9E=J=3Q z$D6sr4yzk^Riy!^-sIaYw+8&Qk#EnNnUz;1cn;(1?be44VrU@OWe4P!S1pwp0#sP7 zKr4?vtk@hW_`f6nw)`?{*n>W7DY)F6D+wd7dg`=*zA__wl4O)0`Cr$Eaf)^)uX_51 zh`j2@P*uLX>O0I%R$evAoWx!H-?b~dk#DbnU=g&;gHZW*$*X>X^!`6oUbP>Tj0MWo z={cuHV4;W98L;e zcN0VT3_hHpPk}e(?(%7MBYc|gs5PovE zEYLG!x`!(90AsnDe}}S^X(qnBB_C0vdmRu^?%Z_Z20HRR$qL*EeA zILnEM9dm9Uh>=VKZiY?er85$E6VBIl=v+NX$4lh{S&BQVTq`i|B2on1C|1Aj`-MRH ztnpl&w0ox`7(is@lL!hqVnf#I1Wnrf_>i zvfj9dy3}|5`qct2z-E);Ta6$}gQhpQJy9;9EA12?OzW|lXPUXcezU-lxFPSxD>r+4 zDqk@x-Bfeqon>0oLw|0@@N=zdEO~die(gy9P_EUbGuN3+H`%6ijM%Pb)jLemcC0Oc z2{X3e(WINYRWK7HaIk@$9|QD03lwZDb7L!X&Pvwp8K-S1TPhvrPgY*Ry3D8{MydF^ z=r&i38Lg7>HWP5+`&YTqty$6JOdh^0*ty2uk^QuTcLK&c_;S9;6_^zu1{P;L|C%e@ z#KUeSyX0{K<~6T&Ywl~>H^X0*^m7jCKkw$|n+WqnwDT2&XkXs!#glVtf%Izjqn4;P zo_LEGwz@>PW<_&LL(SVwBMkh-M7PF9jOVJ$Z!#!t>pc`vSFWty!|?J7-mV=OYgttm z19)|-;saV2BnypqmN0o<1=vW%D%F6$@shWixlVp}E+tqK^An8TY1;~Erf==+o$i0* zb>-OAa8q|_F@gn1SHQys``@5si6*WUjgnt}0lz)|j_E8pa*USs1!HlHtL|@I;k1p6 z^W3=p$mTN6aaZ(T0*Vf0^!_^7&*4UlFKA1;pqaSzp|Obmehm7ak%1-Zt zYwR$rP{sG3_U(OQi4Ux(geYImy^@PZTr-LF6@xzb{G+rW!-;L)aY9*a)RNfHCXfQM z@a0?kd*9$BQ!aP|4n(+da*Y{}N#!>?JPnq@)FgZ-Kyj&a<-nXUQ7KL<63 zKjl54-Aenls#|UA7I~XkG=nrO!l-;Fw*14QroH9AsD7<4iX{&n=zR#lv$YC@1zyrE zpN+irURAE`*oCHXE~qhcxMAc_ZeZZiyMpFpNt=izuL$1jAh|=GgQ%*`dYA4aHYM2P zv>bre$P?2K-osI%^VA;phUEP2)CdLoyJ+%LCq&*p%iAdao{`9j?{IrB@g0!A8t3>P z=mg=Ay3z=taD=(aH%lmd8;H*(6m|x@;sZ{Bo;al>7&M}pS`#n0^_#XEi|YOt9l+nAqJta zmn9U!9nHj56#lYw!r^KtcSsp}40^$}$l1ypExj-hWZ?~=^M+pFEZl`)rm*W9mbu9> zrOuG!nB56%jfotfqf3|q4$y%OM7=EGK0tk!SRR*BeZ~^xgxSRo^j*2~^RDT#Ue^~q zUsu&-eJetQV7~P|khy0v%9!+u?ONZLw31!c_s>5z>l-C&59D>;D>;tYHR}tN)7|=B zL-lUgw=66lM!p+K2l6PWP>vT1U8iyCp2Z1#mdn?9HlEASNSUvT{2UffycnD#89J%y z2(bhi8fhmj3E1&jAi3#aOPffFFgafNiXkA<>8p(L#KOC&NAcfMy!kIGZowj_|J6OF z83i(OpYpo%M|6O8vi{H-W%m95bbX&1)0oqKPI{3c4ipbW_(pVYSSKL8w_%R%wKRkw z--(Q8c%-ednzzrZi6@gf5gHQr#VWTnh`~wH5My@QteyB>=D^4fKcF8}r1e#8@b`Z_U0=f6_ zWuTAduX3cJJgI!E`QUiLt7*l3^4HsEm)Uk)X#^_50pk4w#5H>xG zSN&0!i~FUapMdcwe&FSo(Dggw#~U?PT5pW+A?nG1%b(?pDqFP{qmv*v-J}j&9&Lk zb|Z;yG_I<@wP%OM8XG8nr}QuMsvuw78Sgq(d-oZoRC8!a%gcnJS?ey}LjBd}T<>jS za(Jumq(;%kfCZ(@QAWf|!zG2@R`8}kjWhQm?ACCe~{pSp65y*O9f~GTfNF_Gh zQ9=gsN4cEj@gESI{UM2zMKitTU*fS;1$2#vn=nmUlxcLk5^v6c>> z|K}52izfd64TTDWM?tO}N4~O$`S=m#SpmQy-&1!CGw)+OjfBn_kw75h$#VNFr^RB| z3M8B%QQrSnwPv|ZZGvB1Ns<6G0SRSz{sjUl^;I{wwH*Q$P0LTr@(HWcFC8DS0mSj= z+2X&DY`W!jIFL|m<_bdT)NFNHzYMDxPoBy0?E`}vBXFvufP}P9q}|FV;@Gwj%9RYZE`2y@@gJJkc+G|7#Z3hM0z}3z;Etwr1UyQv0L7_H^V8zzO56eUj8h>{N0nD( zm^-KK2#uj-Rds0fGUuJ!cE8j5B~9bf^(-F$%||}sEc%DCIAfpY8=4agCHzS!HB%&p z^uY92DCMtf5A)%)?oYWM=Hv!mhvsCdfh*?Z*P4?X(`!fv`^DVXqHwzJdY8bI#u9|q z>Ck}7xbPPcLHxVbJK#Gy{WZtQBhz0;aFRt(8t>)Tk`+rl)Btn=BEDV@_#nI!QY?fx z-p`k1;RB(-(lWXLtL8e#t%wzLq)%3xwq6ipJN=aMkmms=wtvqfXU*TgMc)qf?}2Fl zl2ZZ4Q%xMTVZfOQna0$clY|iY?=TwP2TS<#B^~ssFK?X0 z0r8t}ndg`E{8OHNu|WFRm791?q~GDpN^HO^ z#5r7XgJyb8nM9>!-gjP=0BugSQq^7)m&+K*sglU*<}`YLHzWJ5&|xgaoyt0+kVH;$ zt&lFBG{kJo7p_XUVu-%PW2Tc^-I{ltMSnD%yv&GOEb$#z-zTVhy7KCeJjA#x+fd*3 z91O%R-p{1=gd&$IlP~(r;#t*hJx+=306FMZz>1ib|Ekxywjf{)Hy*&M!aN7 z!dyYi`J22mVPitn75Un3BLn)X%n*npC&W|dH3m##Kw}vZF*H_1_cWGBl+>7N5myO_ zt-nK4Si;Rvi8?NOqPcVolz6YB%NF59#BxJtrRs~(r)kr0nN{)(HuD95*eZL3NJ1Cr z@tj4^vt~IWx|;yGc+ITxQm6HAdbHZSnSfd#(Q*wmr<%*W6)&=%k-|d)ReJ>PXLI|? z5FHNXmkCW-qDDkP(>OQzJ?*-9@Bdlwfd3F}*{OQU-A5VusvQFC%d2kb!feuKd zZQhH})a>4j@WyQ2T2rHSqH1LJtLa|gCiVhX{_KO;(oGAPAN_QieCHojh#m0cK?ch|0JJa|LTAU@$Uolfyg8v ztF-+4QeGXKI%5BL;ubSimVNh!oGu1p!{_NEP3T$Q^j4ZaY0(22CW|k^A+&|v8W2$P zp}rW?T*GGN0N)7quG98iO@6_v!PoxBY^++SJj`5t3Fjm}C3xt(W5$x<_nU2#p=bQ* zJIwUPNGBvWXrL8)Ui1if?g)Q*w3sr#u^e30YBf`bBP|_U$bL8aZb58`gAxgMTwa zgkf)hMEmcC&m+>ZwX;)e zo`c`xjH~V3L+5~<&uVWa?~JO*d^1-0jPynE#IW+FI>aivd7@P32;?s_91x}6MM!iM zX;aZip#+ypmhha{@dLgip$g<~e8jNwbMDtoEYrB7g1T!6Sqy%g0#!salLSlrmg(0! zi00H(nYQC3+a6zT^qOf=%h%X|Ibfp^D!8el)qmI<035S7rQ5vi1So@)w4c-4-kp9} zsPk5`;f(R4_YK3j95(Mm?tGJKX|?x*8#U*9Oaf!M$-^qmiw)jzxDxLwHm%QsApT4L zsxH8=aI`dUHLXK))SbeF%-e>fM(VA5jlN#p=T_^`ME*7jS1 ze}vCYo9>5-7j)`c*p7yTbl$1LpDMEHeYzU9X;o8fc?I1BdU46|8BfT%KMH zgvE3Pr~aGY`4~*=VVA+E{sQ!5`;}Q=(HWUf4AA-#dpg&m$g-k}y^at-Qdm6qDmTgU zEb)vHRSO4Krr|};`wE-^h81p#Tf91IjjJODC!A02`Zcv1%^Ehp;4Xi;$Y)`Uvs70; zFPJyCChc5WVZh~$I4wJMkHrgKb1vP%fXgFJ+x_(4!b&W)`@U`>ZO0c+9nJTT_P@WP zES@-e{hFioeatRiK)%-07*D*{S&=!965NVImlMYzUv%jdU2a)Hw~xURW=j)-hGV$a zh*)YWR~*N5=1<5JT@1C4De3$Z@(!2>=u^X60`ptF3oc=a3*HF99b;}N_)r;-0eUL} z(DM~<232M@+5k9i*BQgsd7&tlcw9^U^-BdaS_8wab~F@l!fi|sWQAk*1TrhL)WOV zS*Uya+?r>dOUG;eYdT%CgYk4>2TKTMR^lbIk6)uGyzek}irik=yH4Bp$!kE!7~^t+ zI95Jwk2v4@nevbbw*5nG7d)d0TGfz1fK%|Y_UWJeeTwu3p+E#u*r#fpzp1$#;;$7n zBmKIlD@0K)15X7ji8s6pq$mVH=U)JpRz6D$Egc2Cc*jr|kq%ydB9rCY>b|l-Ye3g3 zF+tnr{a`*@HpXk#|IT1a%`P3i)?c;js6ihkg)M+0JYrZd7p-rzM?2et@B6KGUe8ut z%*Dgr``_hLi9dJVncc6JDg9^MfB6$&Nwe7{-tt7vt9RJ zUI4j~>+iFVun0^j+a$RE5(%sr1Qc;+6`lSaTzl-*m&Z5O8KF@}ZRzo+&Yoq1EuQZO z@JuxBtvaCIp0B~|H&`D3V3 z>j89%=ze(sO{MGvB?1qi7-hQg0Q!kK67~S1TmE&Ok+_{-6D~D)!utRGB8#7Uy#Mli zzRaXSie6O9MGB$&F9*@0;G?JboiBoky~&_NAtexAy1C|`>HovD=J@}BoQ(euGoA5^ z$@u?3%_B#Wz-pc0632O9NhE4lM8em(U@G*b@t}HvQ{rOZsb=ckmpXKPqCW zzU_#IH;AEuY?o~skT+hgI6oS%H#htsaXJn{|}5#pZtHo?RF@}|7RzED26#& zo8FORmf$ht`CpEQ=gQ&`43PK!%el-!HXh!OIURkP;w?_1tp86TZFG%Sa}#8~fS?Nf zwGLFE!$=;?{g;^J3R>pDp#R(af1nWlQ~iISY%EZ&PG5W2|26-gbAgRqUm1g6CBg5} z|HtgjT)W=K=LimS{C}Fn=wQ~{i~kP|A`^$L__+Q*YAAP1-TD83)V+~(+S=pz@%~#n zW_nL+e8~$M#k9#nd75~(4oZgIeuii9Ne})%RO;UU$4pqR|BuZy3XKD#&=6C@_tRr| z5y+1}hW}5}y8k4&(sp#AQFgYEDeS8g(8_ZJ&mYMNsNGimC{92J;RIyhGArkETH6gx z6S8qVfDg#vBG(Vdu^&FQQM_@Z*d&d58XWd?M66uxCu!a^?4733A~rttX4#E%&tK05 z4pPlCC9I$6tpS#OPA9@>)RDAE^-PRRm?uaES3K-23%?jZx+wzbV)%36IP zFXOI>?i_tS5pncEp9{w-{uU-_2O}@WOce8$9{hdoL2}!?yEG80mv!=K+Ks?3#`))} zCa?2KOJDWm_v5t9W_qo6`-lS`0UJ!OUR()5mi@T7MTwCcHzwYnLcb zJd&_K5B8N~tpkrD0j)Jc4aJ(mz;9fC6ci!1n~&hq13ZLV$m`D&ao_p!S+>_fOcdWf zFl!6q>MA$IhLI&koO!OIxN^HV^BDc4 zt?BwTDpXb1zXg+*@ z9)BQrXm`_P^eOo7phNNg#?mW?eQne%>WbH2YzDMY$ZcmY@fKzW(^LRB`0VTnN#tG1 z8E6k^LjXGm1+s6GJTRL4el+=Yl3Do+?mCh9CP|_%h3RMDk4YKs(>N8c5Pi6gkRx&-TZw25{_ObkX=Bc6FA@#Dp zqv5i=uhRMO`fjIx&kCw{yS@>B9`WBK>spJV*d z?uDcY?5YeEBgdY=`DQ+6`y42&klW1{;>lwtg?w%nQD1=A_6yNQi3=u)#rsaHu_4Mf&YiIMdz|N-mOUA|~ zr$^9FzWvNQG%ONEb}n_$E1CI~ecZax%l&z&{pQ=%{E=6h1WW#eJ#IQ%4SfcF8X0cS z`_T-bHcL|K{P6LUA!t#hPQyctVH^K6h}npbP00VSKNHj~{O0&q<@jI07^U|^C>6vz zQ~DNGAxNjj%#8SJ`TjM~S|i6pS{d&e`PmfWr6m^|OK(l-U*vt7lRV;LGgwD^-(74j z5-j)*D#k@;78yO&&vmhp2CW!*R2~{vu7ryM%Yh=U+p+s#xfC3Xz6g zXr43~VHcV$35r-3ng&U+6$>uch34t$#)amCTSg(VRMx1#z!SFfSbt+<)YF~OijF1GF~e3SbefL!H znADHvsWKE#6}CQjA?v5obYa8^AxY!%QNjN*$4BLC-msNVW$)HcGdet<5w*x+4*MF0 zG*QRzDOtvJggOf^qzOA1+`uA)-A*$8CZ~f%I+K9}>SyHvb-Oy9;yFW~28J8P_w?WA zZ!%s+$N#_kn_PVo$o*gJZ!+s-mK>?Y|3QC~ArM*l{W)$wQK#PYkKu1}n5^l2_&^Ev zk^D{0KCip}?HTUhNB1|mTFrFlZ_>g`v8PxWVzKa1{7o)_vGFcDfj=Fhby8nmfZLEa zVyby=((}PQ`z&pGTUoH=q-scTM!U_ z&_3n^@8YxsFJsGMDXiq=>@f}bPz8<$2m$aJk#QXKe%K3T6=#FY;3}+Hv++Wiivfu7 zLive|L#!9dAD9k#8DN+(tGpt6pk+N!PR0X;Z#U}Okee%-MoU)2x2-f!{6FMe*ttah zfiigVNlfEea)dr9&ypk$F?61j_<}FhYt&)O85VUYvGZj7Nvz*jU@m3+Nv<Z&g}17Fv0n{7Lj3r(O32ONNs$P3QWP%<-FM z^cr|T;SQr|%t!DfkvN3$L2)z4^e23}Gvhx}N2_LGO#gyqw5tTwYeQ`f_l>VA(oKlm zM7QSHpEnuhl93?~#-={Z{z{*)cn$jVce-xunnsx=F_UC$sF)(nlsSX zUcmYrXAk%!!gXYwJ*1}>d+aZW0=JzHJjm~%*lE2+kJj1a0^lHEe!#ALQ*II*h?5W@HPB*w6m*&|^R!@#ZK%T83` zsNaVCt)z8a#WG+6Y5E`b+qmItCSNn5JtDu2D*3A#^6kX0^U_!>8o!M)i4&~fM#kPZ z^IfO?B>z)iv!CKk(-1pJE@qQ;nGcy6@HfoPZenn`_paV02bUj{I^r|B1+ zf8TFoC$(ueO8>wVTtE&s z8VJaJ|BWk|1}$;t?~MP(QcBS&3*SBzG@F^S{HO1{5xh71XS|xo@|gx0{M~c5*vrg( zYJXOQ8tZ4e#J;~j{Sc2!yuBuw{lx6zudx+^)7ycZfUewkui%tfo!*OQ%a6!k1<;ErMH)PUwxSd&|Xe$IMiz3_kxyn>RdD zEqqD>^;+XWAw@>iYa>4A%)o0SUh`VhNf_iaKbg2QPHUAJ9D2FL?$}NvXHpo% zGHRY|ek70I#!eG8ueft`@!J>yug>`*pNq`2{>hl}S$_>2cYJ@1Jps!ce~n-@>|~s4 zAe>FA^YwgWFu^2TWVT)iTrOr-MAl5wT7wueju1n6F=t5N2!TyCbVk+-;#NKoC>p#; z=s-m3O$zy#pQ71rS(Q;=W&I!cjQk5GHQg(12|Idk7i_Q z`kAllv>Sz8c!*!ZKdWh9M3=Y$zvCt0BEcf}XoOSKH}+coeV|h1)#It@i!$YXxwHDy zjlJ_%m-f-#xtsc*`IzyBsG$)aYYh0uDnm>qB|pk%LuLhWeU8S0my z0vr#s8dWZ9Z$0IKKH6I!k}cS?z4eaSg8#L*{^!|S&w;8DT(2|x;OAdKE-ijh@SG1G zt}yFdbn5C};9&|4h2bH7UmxLNzih#t;o&_%a^!*|%KJI3|AmKt9y~m%4WEIB@5Ot8 zhgP%BMdMfY0uON-3d6$@Yci`Rc?rRZQjOaZq+H?{z}79f$Abn5!VkZs6bD{CmiII0lcH>yNP?RigeFlhjr5-}1+JY8w6+5aK0k zYCn6Tb-|cE2l3nx`g>N<&Ilc5BpS<993MaY{vd(jD&Vu$6!zz+lfS>54QkdotsD6g z3Lf4WSB&53!?~^)8dTq1F^*(FxK~WXbg7Fg#x;nCtt-YlSOMdTaWZ8eR3dQ2xW^D9 zZ88;CSF@&4PTRH03%g>plA*rk^T$veGb<;t{un>Y(1*yNY6&pdbev`g#oQxJd%7*} z6%fxp@vQgTF?OQ!_+#{^MZs53{us{!kluqFBmy!yD(o>>a_uhk_jddH9QVhM2480} zo-Xi(hj$KqZ9(*!fv*cr@ZqbYw(N{EPCBy-h}}s6K&;$=*qYk?PwWlM(tI!kX1~_= zbHVJ#W+^X}`;h!b0x5x<4iU_jWC99Up8ap54VX=XSnUF452EF zx`D4gqOPSvb3WqYj@A!AWryB9pj#Z)1%Ek=rwe?QYX&3!WLLuTX5eeDDOvbBbNZYU z&4T;b>ny$N3+8%-Z-hYVxB6r*NL{1MK0A@Mjxr$iV~|uAkg8xCS&+I%k`sZ{G(hTi zN(3NPC}7JEQa@BjvY5-lO@6qVkONoOF6j|pZ9AHe=7*=jeSjxV@U#~MOaM=9gSvqy z8-ErPj7R+_Hp$~TM&=Yp&O(COxQUkq4`m#z-Zji<)PJn;9_v3g2@`>gUsd2gHh>N4 z`;Qf$X@^y&Gr%2rH$d9Y9eQ+e!roSzHWKgN{Kx8!jR;!q9B4%;Ld*B_9LTFR^zHT^ z>!?!)ixz;E&2U4*lz-e@bl~zI>nE7X<3Cm*3me{-F_6CakIjWRQ9rqw5p%WlUj9&k zJ&BM$MKXKDnDP8C`;QfalDhLBy9y8u`HxMN34-oHdDVN1T3P?GRSnDuJIh&kC##Ki zYP!mtNf`k_RUZGbOV3tQuX=|=K>WM>$4)@5{U7Q-_995p0_E!TEdzu%j9ey2H8SUW%ZPpKwPR5%e6bN#MPKlR z3wad67hm;<;^T`(lK)v6aU__sJA83G zN4ub9M~OIZtDC;2zNDbN9)iB^)b{!UerB}S_vh!d_Ihmj>SnfM&UahgH`?oq`1xjg z{Xl+BZ?DHWt!`F(eK9|0wAb&z&zbG@JMwc@d;L!Q%!X3n=j`_So%uPZy?z&d=Cs#4 zGKf0}T=gG{FK%J^0(_C)CM(g8i7$>mA{Sq5yw&21Er`rB`zXK{*9zz?zPKLxLu6Ao z^hH7v`(E+IiyUlrJO*Fv&ybW9eQ_Ai9}8ccHbOlpDq}qP=!;UuCwy@=#WLdz;fw1} zq&n}HffxINFG@2*G4#cvt&x!}B>C^f7p{!byYWvy;_wK*_z>N{k1u`?w#?#-LZb=F zr7v~?Q+9_hK8q|u_~J(O-hiXQTMF`wOL>-~PYmKFs~U1T5zIj+^lqd!r5}CdbZc z6vw-Km7h29^P;|ZREEd zi7ef%h!IkyvZipOgG5HGkB{v+GbV-nYGGPf6*-(>wi_RQ0Cqy)6D$t z0ibkaBhxMHaBqeZP3Ob%$tS@Lp()?Qq6?o-R3o#H1=(&W~^l2 z^=eJ}beFWN^QFq9Pnkw~nqaAnbP&IJuD2^G9JJfC7S8Q$T7gYmP@?3FM2nILJ;HW* z!Rdd}79(r7@>^wU75g?0WIns_Z$b%wPAKEg43=3@1J11F&$+C%!|%n@`12JOe4@&I ze*s-_hKw%ZUm5?XF}l_naw5;C@q8A~=QTP*=1;>-X|^-u2Y&HJ=k|pbsz&o>G;bE_ z4I^G?hiG7q5gTBP_|Jyymwnr1{J&o`=E8GIWpz^OJ!Vr?N>zCsHf3CaUGEN?nx=Qt zyx*AA*ts!mrRK`a_=GsuHPI6+jpxexls~QI0@<*k^Lb|}fTt;D%m9s@^D+t!*`U1NitJt}*#0}*O$Y+3N4V~M~8g3#OL2J1g@kj!n`pYU4iLAdegEuzJt@5|a z;vr*?EPE2sBIER(F7fS;tRh!q(8ei=CI4UsqJ8o) zHK?lobY#ZMw1i9_bwTfL#%kCOFTJ-Bj4@e3JoyKP`!mq_6yuOxux@h?=r`Hv7J0vb zEAf7Ju#bPtt+fJL5XUAR20+VB!(QN;=>nn+M}6{<2303fb$Yo=)k(&>i>j0Sss_WEsxxiX)2FGb@dQ$bXH#_+mfp#_ z*{V95sz6YHLA(aI{Ou6_wvuOI#A45>3vVVZg6AdS1P zfQfBT#(&5noqyO%YClmw{C+oC5KoTAKJL9(<=R-~iiVoCO*@WC+?P4Ow=|b_R%Ymn zY&?pNY&?qoO&%?&(h@g$K5WFuQq%H;Qkuqsnx82c5QlezUuFmTMn}`j>5Q7u%kKlF{Bw+M8zE!{1``%xHTzBUM&6dus0< z%Fw^t`H3elS-^6;$*%$o7xT}c*@ndOSmj^Ljp56kwr^2x__EGVF}}k7>Y;Pcs6ih% zi_at9X;Z-EcxrI}2EvFuLy=2_t(=1lnsyeCHDzRj>?8CUHJ1pBjdZS9o-QQ2tA0*f z+G~+wAG$7YypH$Wcb{x|0dt}F;n@E^5Tq^}Vq&<@i9l5vjfjZP9s));SMRQN%d)kG+ggp(a)Vk8 zwiXC(Y-6a_glw(%K`o4GCbgyowf3~Nz-?n^hH8~%Yppi5%sEWOxk1HeYfNK6@plbS zXGixEk{@8x9Icf0rX#6xZo9>trzFS2w~7(XYP_32$?NZFXP`QwhCOc6!zk#T#@S~P zn~^ zSJpuz7zYHoid@b(4CNsk1K&m9_|NB~|9j(S22-mmKePD&O<$Cs`F#cFdhh(qgOxq; zGrHDwZ|gUa3E>O5Q=5s)o24TzRYQH`XC{1+RXmAKoB8EL--STrIvo{x93s~DmM0Q) z#9Mw>E_Cp3>-{U0O+Uh`<=gk>#&hYCPK_xw@ez8ukD2XRR}ooM-N#%OTGV{^^)Jy+k3*^0bzS$_U+bE~LOnsIjn|^jR75^y=)-+PA8ulT)L~Wc zIi5$jqj}c#*J>ztNE!Mdf4r7+Vd%U|J{MWvF^1G*fh%A%m|YVO0WvSL!X?=iev9he z#zQEL*#EMgIq9li*VmAXUDmg{m-YQIbI)YJE}l}oUF$neE7?U3ab&q!-zeYw4>Ilg z>NB;GPi5D4H}xc0SIzoDEA-zxn++|3;tnc?hz~0aHi>|Ms$64Q6)|c5e z>kBR3-TLmzFuPsfs@(O=NxQwSuc7I?tZ!p4>-$GK#bm(#pVGKp>)WK2?6STmeAcXQ zR9Ny!=FP6JJ~JuusqFe5qMpbKJ9z;_YftMN?r5I%eT~m`8B#Cnds`LjyZkfJ^)*Zr z>pO|{Wp>T_PU?PrzrfhLU0*kMJ#*62dR-!9yVlt*N=^0m_KH=vp zw31!c_u?|MzEKHT4fAH#SD%?3`BZj&$EqjEI(Uf-U?O^2-*89stnZHbhSbaYJ`VZj zJ-=^seGO;J`XcH%j@dQq3s>9S{ymwnOkBlc< z78nvLLt6caq#>Gp)^lWLpOBB7hJ>=Z;vOy5SGJZP4vboRfXPjU(qxYTBoLj`(PmZ|4c?t(SXEP zyt~fU=fduN4PU}7A2nRqt@^u=u^silwYR>HHD#k;|6($>qyAZ@KA(5}`X_8({o`1H zAl8uS|B+;D$M>H@3>WGDpULQ{e!TL1Vj~@l!W`(?& zcv6APw-#}!;w9cLKF;7#rJdW1Y&es4Q_(c##n@%uQ$CWWd^DXCpAmgjM83tCGXB!~ zzJcqGF}~nYN|C+!cPRhjdet$el&>Re8#B!RWxts86#Y_cde7~<$eV$3(OwIofI^j@vr{pOG9r3_<*%ycovwCrMaWgwKO~xoPm`6=f&+V5Cat<2kEOz>{Tx~n>7Z4qTRBUviv-mv@6{qcO{wlMW z%wlKp%O>+VKXWjdgPp}|P38lBW(k=k&f>dF=B<9_?qu%nEdGVbyxPw!C9~97{B4t| zxF!0~-em6WEWXfW>OwVTmXTTJEH?L9w&9v!GRw&fb&ZnK_E|r(ip(l!@opw_XFu~$G7ohYZx#HuZQ-w~SCd)oESCMb)ApjD zc?6k9IE!`OIcQ38rex^&N>nzs(L@sGFN5`Fm z#>Ab)3rIF!%$G+ulF>MCPV?DHj3Y5_-i+qy>eD3ZPn!3&=7~y7Au(lMy!jX0qK^m$)su2NzqiJ9|0*Swz+vq;RESK9muC1#VDErZE^&X1Nk^($5`5pD=! zI4i%AJaa58OJC%fc&&%Tmk90pmHVBf!s6t zecXHAxpNScXm9G|mM|_7XUeLMX3A1?=+TBd2lCq6*Jgms{ES^}M%=vCf&Ae}Bj&3E zuWj%aAmw3|pm9me@e^E|vca3-CuVC!$e27eJ(ev0eCe(~%l6Fa&u?u;wm&~1!}cXL z2Q<6EOW6{pJHt_QF&xvI&)H|wnNR9j{YatVHhmdHPRKq>_{`w3(a=W*zk}FA_7uIn z?;?N7InQkUG29{YctxAEa&i z-{m~(?LFMfZvP;88ir*2ePUzzLuiajjz zhi~g!N%SOhiYbM|MnCUzSX(!Bi%P4+SrU4%b1Z|E2}rQ&i9q7MI(;+Gx%jx3?^pWY zAJX;vyT~vw^!)?#et$~n`)=yva=w*&l2N@NQvuZ}EOD4$yuhmb$xK zWAzpyL(xE`_BS+igkCfH@NV1tx|o)n_HKh8>%KiVInb>c)Kn-q5iV30?V8RvUG-i? zJkz=iy*^zUzHIW;m09{xS#Ii9_1aAtm;tv=92&uA2DxwA#daaDes7CFgFvvbUV{je zT5V^Dn|CkzGPMd;>Jr`;K4lwlD?L9tegJ>!v+1vy)-MSU?}2haVCcdLS85SWH%WLK)3dX z>!(YYHj_>*(tG+~_m|J#eqj0Aci?X|Nma$(d?42k6gy7bIlHD{rB|b|+wieRB5Mui z%fOMPPjcGdZhSEzM}yfI(O|m&kG*e!kE*!-U!F!qH>ho~zOJqO3>6{o7e0u|hTXD+ zn1n}Fx-8iZi6q&$4+!7`B}kSvid8EeL{uRnLBf4=FFLyGiT16Lw1`yPo%&}8nhu?YVPtryWDsaaZ+Iv&m?Ge&9g{)4Q|*%ig?jr;qllLY!&?mb)IOfh z(?`K$_IvV_ACUB85DpYGjHa1BvJ!Ggc~`BO+;o&ytyW-Bt=3au^9|L4H!i9cE|Wt; zB(7f8rFr;@Ggh6$@550s9JuPeXtySozGt{r`aVc^)Y3iirOy?m7o+s-#L{0!^2E}M zjiv9SA!uxSORRLiuJobtrSIp6iPb3Go>=-k)6%PrrTY_0-E1*TbYPL1SPz4!RIjkECl@Q?cR{r~{lfcw`n5S(iLPMK68^ zrcuPvw0bOE_RHu`S%(pL8e|_=4wHbVlCmI1Li9wu=;mi4)^X*MwWC8MkfIAIfjYlI zs-2DR#nz4w#P{Opn{nUm_+D-87!TbI6i^*4A|(!8{&xE~ZmhNAB+^$AEsq|JcN&k> zW#h^ltsR$&{Eg9&AwR||R3zm)i4du-P*PBhM{R|rO&ZT#3$x`8@txHX)bAsy#{Atb zd&GB~6Vz6#-xq7&XUY}g`%F?XP`|&geQ%df5#J${WK9A!$vLR2GrWtsi{#J30M&j> zF0eCo=oMrS2O0s-%Kt^1y~q!CFCps{1?w)S54aBis*+E`?81|}xIH-j&xYU(WAJ8U zaIG=8!x;QGf;^w|njQX{mq2AJbpwjl*1tTwC#-+i{;2B<38`{6Z>1d>NvSaVl1eEH zv4&yYiV>3{zeAjXA7MXImBYf2yg(o_e8MpBHG{2dD~~52Ci=B~O>bR`&9|=-VD~qK ze`H-dbznny+CYeGl)|Q=u&F3)8g?Os>b|C@)y$T&6S|{dAgpVLHh>v|m4at7DpajY zVz!063C$X44`a*vSwqQ$fuT2@UA|#p#Rikl=}`w@$f#@XV0kw%4mV62>|M1ditDt_ zQGW~GZ|@2XBR2Lq{tShvXZGC0q(PhChf~Q5_AlNs0Qy74C>jS5`xk#ep@G1ySkJ@z z#P@9ReP7&nJ%41~#Qc%12;ILafb@Ii61;=yhR|T|`V4fv+^Dc>hy>2}p1=Mm#LkGG zi|AzZHgYh-V0g!hcO5+9aG3y&@DR=L8shjb>)O=(S3`K-Ks`TYT|2=L#(u~c27e2R z)c7glcMai0|2hW$JIa1?82UbwNji@H(|t#MXdLPH%f@gVf0?jfiw!q{FH&6TI^s$6 z3WfwE1v-0l$J5wNV~qI5BPV;^0jS^p`+;+x!_(9^MmsqG2f9837UeW{pzpl@nV=%>R4T?u<* z1p}D|mHkp*?Fn7eesK0)E*k)*CElLUsi113J&ufHiN+LrLWdt4v&Z4RDC8CPUIIa| zd%~p9ff4_4doQ~!xa8L(FJ~RGr-ZCn_3(T+xMpFT;~|oDs`g&)q=0IiV>WhoNsM!R ztM*=8J)be6!9`v&-ss=C*Y;i(W(Wq2q+ENR163vRKg2K4aWfdMKHRq-2x8G0uE6B9 zdV#njB5`HYjwY{qkq15{lSQ-j2DQ*BN1-hqMEPv=*k@@#Edr%6f5SAbghs2+s8W#p2!AZh)m$ z_lt{nAzT>?JHn7;e^F-LlpXyT>f-ttli`c+&hVD#*I#_5m(DBu$-eUcY2}r%;or~v z@-K<$ASA`}%f;wwVSo7T12ma!#k?xFne)qsKb?wSUPw|Q@XG{oMs&uPpY@twE}QiY z_~pU>qNQ`l>%KJn@{9W^U5sDe;O`~Bd|fPIYJT~`SipCmdG!U1fd)Go3ZH(?*q+txf^ zZ@=zk`i6wC&3Q^%vxxuX*;uo_`7jk5Z^KUbo$Rey#Lb^!E$@-_x96j-v2Yofo4WL#o;27!t%r>G`p$&%^C<>1s@{p zZ{DuStL&-lZ;t(x1~cD+jpvu?mLkpfsqAmQ1L3GV@!y|mjO2tTjI+NozaJdG{0gvZ z|whpcWj=a*OUIT`E$5Pg~O%Nf)F@XOU$vU|fXufovR@yqXSP&pND**gfv z=<7ehFOL8TCF7T0{KUX7ckx*r+q3)NP(8o=8towx>{H#w8$xq_`Hw#l{PKm^P5h_$ zWs<-BALW;i24|!4%c1oKei`ylZT_Mp>B8dtV#|bqIJF?{Tg{=U!r!vK1U7$>%Oo-i z5c9*?y|o6$J|k7>}6bo)pTk)&R#Qg>PsJBQ50;W8Ee11iEGdiMdM%gcw{S+d2U*jzKBxvLFN?ffTHzgwo z+Xc{c!Dl78+OH(6wnswX9mdH$5bWWc=XI_m=!E?3JmH8;%5p?(67rLa8?+k6ChXyt z?W4BZN4-IJdzXYzb9>2?!5 zK)P*ja-JvTE8GX-sA=&>c5%+6ldpik0YV_3c;WcZd&;b9LVQ;A5-Ii2s@)@hu#W~~ zDARFT2x>cY-yQzNuyRep&6PfRX?>P`)1kQ3yI^3i?F5LBEEim&WVh))@Q6Vjg)G7Hu(M@v`~n zM-8j!UIf+sabNed<2&Qdv)06&U&Wngsr#<@$lDf?K7~DK`qR%6RHa{!lGoAlj=tOs}FZrf)0*>2r_8N#r*_V(Vtx=t3o z_#;@Khzw>KH|=nh70{tR0r)qk=L ziguU4QEn?-8KOi5(txKOCGT20c9Pf|rm#S>>@E+^EB2fWc$mQtDeJ^61BjEt4H=Hb zTcmTg3_jI@T)~SRU6*D$BlQ`M@LA5tIA?gjbHI+^p_7*MSUVm8KxdeIKQI2uYF#=S zEx_A=-~+@*JQOWOnC4NcCHu|}p2DuwCoo4AHMmkAzY8PbTlTL#Y&XpVXtjm}Fib!Z zni)DhT7}w*^)wYetQ~O1Y)OHW`|w$ZlXV#HjFUeQPVSFxL0H{y+KJ`Nd4-7iA#8cf z{cBI#NplV1IC56>JW{vP^mXh@p0{3o2cjI|7bk(bKqAbaLSYm~G=e^!mE_m4&r<0F z@|A<~uRT0z{nmb{tKY%<*B(#JOy*zvr}#)qI=ahtaQ?MVh6qO z9P{@3{C*6*zl?W!c%I&?voz);w@nD*|qk8&Itz; zdv!Y3+BK?AX0if?o{V#?J zay5U`uL6-=W6r0xOJe2cxbS8LYZT%DW z;~K#F$rquLyx!3!BxXuSuidVWCRBrM#_hp;~l4gY*U{7%ldTfT}=ns7gS?heGp^C3CZDKS1| zPd?3~gnzcrQcI=B_z!N14*P7k&xHSo@f}Ag)!*|D!3CeuNP831ANKk_$KFjIfJ)J5 zpd;mH@8vTNp^w4(@`JvloecL!+j*s=>J!K>0Pv`OY9YLAn@T?82r8Jum-YJ zdl>Gw?;;O!_y<^rCPgm6)_(>Rn)WNcZ5`n);6&#+ z0<(o{+f(u;mFy0lXT~>MJ2o>+-JbZt_fXrC_d;(?3VSp69K-l0f5Dez$oW7H?P91n z$EbHEg?Bly!3kDE?~t4vLv>x~7veA&O+fQVk;@`~Ol^h|dj-Zi?!_toZHq{5vG|z* zy!e)U>VLr=IpY)^R^(q}jL=F!8!7pwf5gym34j{Va3rlv*s)H+jx|xUc@2`ssg*mz zHtd}As?|3!F&f?5en#aiHn_JH>m==r9ph|S!Iucoo~^(Mc6T8#Hy=(a`PABx3!-AY z#r7ws81^R<|4KM!zqa1Y=pasx`GHq1L~q@*TdZe{cS&}Faig};hEG-Mt>8=o-y+|8 z)+Im1ni#FXfA&Z|aJiTFdqUqggSJGGf@7!B`5Nf$S-Ft4%YN|1FX*(a;JGRE0saJN z!59aoM7K>m{vK^v0P`CihhS_m#{5M|X@2S-eZJdBGQ8O2e3H~B#QEen;18{!^U39q zyNV5-L7(rvRjJM=_Xy$h69jQabmKd{KcCF0Bs3kQKA(rG9T`$kOBhd~&o>$s(w|Qr zk4{s(`K8w9`vje+Busri`9dt=_ve%ScRpE5TEp7;r1ve|eoK{i9L)LTPV`o<&nF*z z6KiC=K40SbWHBaG?R;|FKQQ@VN05p0$)M9WTYo-zHhufgoli<=4xLX9AJ~@K|>iOhKi0J>L=abj`MIhQlpRd>FllSVllH=~|$MeZtVAps)xuZs$ zPs)(CXy+?<9PBj>kiT0TJ!^lAUNS|*xl4GKT+jKuTFuZg=ySDWec9R(f( zIF(<(ko-@bPyYSm&;GBTPX@q9i1GDo)Uom#olllc!&y+yD>{dl}~5E69Twk3*+A`*xyn<0#~-m`8aJ$ zc`?0LgE6ygfmv|~q#IQu;akevaX30?Yx!XMDt}IUxvqr}M%Tjr^=8y0=W{xP`76i6 zoG)(C#p1t^w{SebMQYn(@q6V5h<+D8qshCW4of(rNoeHlG}rQek6RhJtPyR19X8?Z zy`9fgFMWmRf1#aQr+k^tUp(RqwYyl&Q_Np}F1}>o%Lw}N1IXcV2)lU8faq9!Qsf%& z>%jW}!+a5cw;d3$#qTZFas6k%ig(~LQu$RX?2{QjJ@(;DQN9d|E~C8*q6DDZ$6=tG z9YA~`lm5E13ux{NHPQq-8DSIjVh0i(eOv6jscfpf3uiuEQ#1JNms+`a%LvGsDrLH= zwsc^#$4KQqwSB2trf-$KWS_O89eYTeDNG_l z1?h%x{yq_=bZtzbke{I6retjy3RWltiUZZrSy#YJGRWrDU zXuBT1#13#UBWdGt0&wjB*C@b&z85w!xRDCDHuls!jdDh6+X1c-;My46&jq+ffNKZ1 zHdNLEFxugbpg*laylvhZ%~$ugT^Q3P+pHZ68TJ&kSaFSP?I8P0@^ycrp@DcpShzNO z%itfO4wqy_|7n!xmi*b;v7EQ9Q!;fhzCvx}$pQwQS7!i5=9Y@1M_8h>2!P5TU=#s? zsK+2t51>k`2jO2nT)?PiOowZ$m3r9OJ$M8BrNZ0}<;RSM`b`0DUJ1fb1YA7V$uGae zZD?b(hHKlDyp7QpMHOh@uA($-117gd|A;TV|5tl1Y_n7RL?zz3#@616i>4?DeYNKv zgo`?>bS>Xu!BEOIK6C0{8*io=n15o)Awjq-&Q!k!%xPhsmL z#_TBa0WJ@dC}hUseros-T(qV87`VmA(_jRKI%pK!hE8;JIUxp%)Z)P8Wow6rV#1IF zIUU=L3mp^kpQ#F(wk;!%M%KmZM51^hoL@QVQh$7+Co z6(2Q0!-3$#fkGYeGPV3t%U z!xZ>PCF|Fx(;h-4y0wOIWCAEUZfjOsum!3U87KAofxe%b+}P1K)C z1b&bR(FDH@-}r^BZ{pgzfZquC80Ny|2D*w+gHEF!<8?;h*oa=94Yx+`2Kng5TWy8| zf=cw)Q`U~Z5^(A&44M%%XsjIpM9IH?fd)=3q=grw=Lo78Itw$R)0r62iVA8IV5}D~ zc;G28CJ>Ao0i%su&ka*xG%AzOBBE!4lf`gm2{_rhy8MXX946po6Pzr9qfA8@ZKJs^ z8XP;rIRL1rd$kVEQbfs5J|WIP;8W9Awos-$G7ZZt-9NXFo0=KSRIaFl2*vzFSRYPP19@PPe~Ik~6qMdVyTIq|gkn>6 z=p`kISc~OxBFS1L0n0~8szZNJlkoZ~j}S?&M-p&XB4xE9rCr|nMgq)>M9MZp%0_uTQqrCk zmjM+!C80xshfHF8o|eye*>J;0oWJ$)et&qL(OzJL@9xLeUwiz0eX_swQ_!8V-vIVu zOo~ix(b)`{+A3s!L?v5-GwofIXmP~!`*JXkcvX7@5n=F7G!2KR(4rXpnLRuX^F4Uj z@(k(-b+VrU|3j2TpF9j3MO*jaC{h`JT{ggeIyiv~(Rd+AewwLikLDAeqYUj&txvUhYgY7VC{Cxu2WEYN4_eGMd}IM1m@$d(WPH#f zo(3OThUAI(KtU$>c=%}z9}FNBKC;r{!=Mif`Y?tUZ?#7U{WA?d>?%Hp`OxrT2R^2w zfz=8=i0Md!54$0GB0f-%2|n(4O2Y>ONQDo3T71|I`dD2PjN!#w8>62<%9xTq8dZD{ zv!vmp5%_3F1KSjQ5R;S!AB~3OiTFT4CiuASNev$iAQe6u)8eDifDh=WL1p+e(od^n zw-Z;9D}B3$d~^aCz0WI@ZBC6pW*o8owCI{ z$;%Ty4|qm?7;Xd+r9Yuu0@O=? zLPN1BmWQL#ntq91lO(w_RK^0ZAE z#IR%Zkqgxk^bTFr(;1PEQ&#m8<)=?aiBH>gpJaN+r!Sr$^gq5?_lc@PpWYFlR_Q*G zdK!ItQhZvj`?ON|bT@xm$diNK!|T-|ekRq8^k>@$&U_JRbXwvOk=Tuhl;bJoWDz++ zjm)CRQjTQWISL?!hu4vaWO_{P-__oABUPUSXxC5^on1=_KV?&#UDpr}on1E)mdQXW z7`m>tn-Ry@Ck=O48pmctg5Cx0F~EydN;kOQu;&%gFYVr;{5ir2u`on;&QqX2iye;q zL+mK@o@R$~IOb{gb2v4H{7(@y?v;0OxE|b)@HG1dIX$JlCL-G9=af*Uz3WjzkGxii z7=Z{vlYF-l0qv+q2`BOmN<toj}j*3fD!@0!lQ&!c@{-zR~%W#o;M2+ zZax|&*|8?SCH;u+WPCv$$*yk6=dI%I7H^ubTXt`I=}dE9w&V!6sty0K|64q7Bh=w} z_ewm4*W3qIi>Ni5IchQ`e`1@6yLt!5-MEM!w=0={y$?YGCT4-(uN1+%X*RG9e{eM? zX0o&n-$anC!>`%Fj~gkcb@=T{Mv)=jDK8AC4>!2mh1cEXobSq&;vq`7aZY68X4Q{E=xh&m~b zsdNLyVQE&Sb7Ftz2!BOH$(sx?3+SLe_@fO!Mkh-L<&U;XWIY&vv`34q2jh=+`#P@h z!T6*7jmY{<{n1VpU>;vi-4zktPaQxWj8`HKH_1e#J+hd>w6G(ajBt7U4AUEToft(>g-m)E$1d^UANEz<{c`HW(B!vkiJpqy)^aqfXO9OeB z0C~qgL=s4Psvv171LU0?36K;fkn{vdde9$0QZ5bT+BMwpdwJvlBt2D-#F+r(eH;mp z6ef_&v25j_0+MoRAUy!7A9w10SS%6!;a_+^`xhQ)9b;MWy?^2VvHpeOu6PBJTIAa0 z{CGk}g_*eLQC{9C`t8`}i`)*rmB5I8H1h1pwk$9*BJblG5Etv z4Um6vi6Qt$WAHFzFfQ@W07^a2`gZ)0KXt#Eye*yl@M7djlpi+SOFdweAO7UNUda!~ zQ8kjv5BuPc{GTYVxAMa+*o?`4{(~Yv#AXmT`1|IMyaFwz{()ROL0=?ZKAaH#_WY55 zjB4SI8w6B+^hbUt^9`}VuA$CCfC%Fw@k^+!GnZBKgNKHmR$d>G0(PE>A*dZVF%LnZobD0 zKgKW9(rUb?`XZv}TxTcsWJ3S`=`QYHqi8>Tx7xo{%ydIhvHraS0MWnI=wG|Z!46H# zioFbdMNRBwoJWA-o0O)1{|ii|57n+hN5Eq`!vvl{>6FnH}profB?le zDNX-Yg3*)DMdkJVJ5w3Iz4S-^6tXAn-7NEZ@db2Nbd!LLbBr_$yJ-~;vx3LgM{l-+Ki5AHKDB`Bx$ z*N6_Hh5bfu{#Jw6`eWdi%t>3kEz!FHO3yNH3)X*c=T>>18PPdh&2IQn!9Ar8+6}LT$oHEVrK-!5g{x zN$F)SK&7M?f~2RH`0!?YPdmSGB60MTKrhb$fR6V!n_q^b=YS}Jg8rfm2SG0zh%yr9 zm%DFadLhv2{IZSSK`-aus?rO6MZxqTdHEW>)T1EK3sn>J!g*8DOOo~^(#v54*c=T> z>E#XVG357eHqr~#Nud{N6X=Cv#Kz%9ZhlgFsRX`K(hEV-(@T7KJC&4fe&IyoTrq)O zb^t&cdU+p}1fmEE`in9g1if5El#xI$b8ljL;R-7AiwyWgFQ);^Vm(p{rVq)>*XSjW zY8zQh)dan8-jwu02~FCQNH1@pLP^k&lwR(}o<)9Wg^^yUP71wHn?Ntzelfpr^OMrc z4}q_g^g@vI^b#N5hwo|Wg%gQG;{IOw|OvaNd;klB7L}^zsLEdlEDxrI)$b z1Id^F+DI={Cxu?9O`sQUzn~Xxeo}hb1yCvJg&^taB|gl8@^tfykfyT=Kmxsxh&>Ix zT#lXtq6iB5i!vMpy^JQxNT8P=-oW(26;$X&)v)|;d=m7c6igqIm#@*wt3WB}g^vy* zk8|FX^pd1KiS)970Gp#BDZNx;?7+=pVtm1% z!Sc(HPTC`OD67NXC*^;FM8)CFWGq-DOP&9u4RPfkiHJVrpZpNzNAY&0{Id|zhy0h( zs`w`KH{MQgO9?7(qR4e%}MMNL+pS>oo{$mi)hx{+EjjR6?i0DK9lfYIR z>VG7i;q<=$HeDB2{|6A!hx}t1e>(i1*f;#01YXrxe_~!!)L*eT`*du7&iYMVOAX^C z{`@AvKWLmkQloqUH=wEwC-6!Av(LoT#s(hu%3e$mupcMu4%e_xvt`kJ|0|jf zrHF6jpZ!sqyUqNwJAVZf@>##;pZ$4EE=slj1nGoYt*3B#!ceVOGPqi>R13op2~N5{ zK`Y`++2LX+w72!9?EZ9ZLg^D@rB~}p_r#Z8CrVG^pZx~Y(xG^uFTFak^p`-uO50z7 zTtjX9(D>5dIE34t#6NqHY3bF*(qCDg(Duo(((81kKQ}lI^V3D?jllfOM9ja5$|hnS ziV*s?*Cm$zXOM!@_BSA^P}}~q_|o5E`b^=Uy`3u13;*ofu1Ubaq*xtlbamJ@C=LTt zMIBavEy5zdoS4D{3Ov@d8kEI|3P)l!wtzAeRQxxlBo!5x#aH8Hri;jGQH@om)p!c{ zOT-3cF;?TLs}rzscB~o|x@wGwuZCSz<2g}{&8F3uV_FT$Vywov#A>Vqtti;o2$_V6 zjfVyzuYR6-k|`y!12EAk+fA!+jA=C}i?JGybR}RTCsvI@T{V6lUyV{x4cY*p8pJ6l z(#A%hFtJl8i?JG~CsyMRAQuH24?;AdV&g+_Tn21B%)Jz0#yYZ?S-S)hZ7{6{^Q?x^ zdiPbp1~gvm+8to)lH~+{@iY3)0Wi0{SGH{-tB@x9vGF`n*|gv+a=MR?KYZ?}(Iya<@IcANx7 zLVK74(W60Mw_)e4& z{X~4{t{lfZ3u{LM^jra-x{NJ<+edA&cP$(tR}irht|PUQY6tZYx+}rov*lC7cUFf} zzk9Xsc6qS)&Wdm9_oub*Gv%E`g@j9}xT)VyrXFMX?ea6?yQ;~iCbbE)dBD5W%9<+H*$~>!{ zy)oUO5%!5Oc*-vfU(1ZaxyImi#^6R{@UO<;QRf*T=NW?y#^6!}wed@p=S}I>37J5y zW$T0y^ssN8Fj{$HlA&m)5}c_#+r^VlTIf|=AUht{^z!k;y{8E<<+OAWzUV#Lusk1U zHk!SBMjpJWK*xifG#!tZsrmTtm(}>M0bI<4OgK@(`vU}vOPPE;xm1c&j)v2wd?Xl+ z_X^w^1H(0;B2wwJ4xil^p5R36Ox)q3Z1{kYQ`wFuMhIWQvWLYXk(qwi|FHU?@d7v4 zsNh{e58aQ1?0~VPqQ@SdmKm8!E^3YsPXmgkDkz!;6iuzb*NVtgpvP4mo(A+x1$t%! z!_$D9sqGr7rU6C2Ud~wK+nWjfr>~Dvi^PJtqKF=imtTS$&{L*WpyH9F0n~!JpdN^5 zM}*SdqWjX-C-V^Nn4#8XRxFX$C5PgFD7{Y@Y#mcM*t+Zh_yy~dPw_uRW*{=dx~!Wc z-%}!oA##{?**1=RL5a*nWTti5;~e>@5_t?FkFhShn#~bEa;_37AyTp~o6V7KCGr$Ro?=~A!;wxUG7FJe)@5gMWRVg%8j+)|%d$A~CrV^C zBD1Z_j^@ZCl*oKU=3AGM@h0n%{rI2SUW~|M>#`_E68}PxXCU$n>$2B4lI%}WoPKuWnEIOL{3NKbn7y*Cv9CaPKmq#kr!B(kv|jb67u&!Rho&&nbu`wN6ETm zxDx3>q{q5!AV-p&HcHuu$VTh3j}f#k*{wu2BeL1Lj8-1&l2??-Hbk~rmp#pq8{6jg|c4U?|@Z&%}9`QI5z&eQ1Wkelu~agsABjCO+HC1H#>8+ zcR6#D!*C8y{!N7sKyNO7pR7XY;M3iR_1H3F+W(sGNI;57P0l7A*scJe?p=@lq(weS zL|_fs%jxAKMFbWSCB?r<;@K6TTLmJ^M-)M(BmlFE?-Ou5EEK(hFTx&YvhueriYtGU zh=`T{fQX2d{~HkzEB`8rFfHGYFQR z6D#WI`1L&9cj)gNk34$)9z$5kj|GF_V@XE?oH76F>AnMgejI#5Sji97M}|+jV+MXC z-FLvRj)QLqEBUdSF?`ZpGJ~J=JK!7bslo4u7#|L& z@wXLg4$mjdKXx7QB#*fLpu7gVwe?AR_(%4xACQ|33ck=_ZGI9=VWys&!1)RDe;Azh z$k{oc%VV(5=SeBv|N9P1=8FIKi;+a}uW+eIEqvJsQ!cP>5S^ULzrwxqDgWLl2qOHy zFI4PU02zc6t`AhGGReT^af=TO44#M?6!o-s4RM2MIB5S0gD*j`@c;e~z)0m^;l%}% zPUrs}j7zWlD_j>#NN0}`TSixPPk2hk;{5}H3jh&DJwAqJSY+gdv4r3ISLjFo3J~BD zT@f=eBRT|Brt|;)*Z_114U@7uXF4bFpppsu24cr`C(&av-wF-k$zNgajr0HBj-7G5 ze}%Dt66gONn^yL(Ago_M<_lS_wipPWm*FkLR_dcpkyj%F&DKgw!xA6DOW48-6(ECVm zyKn*y^n}}mdggE77Jdd?G)$#{>ULoior0RXg};p|qS;L0ac}Am{ue^UvBF|unZcgB zwf(d`l|T5C<_g4PXBO`d{t&i7H$J65c(Q>hkGo7r92~F#{)37A=x^aEpw;Map$(H2 z`GarA3ApBmK=rrqQ#xT%{J{rAvm_Q-DuydhJ12u|UgMCM9!@g?k+a;mjWpj4hztp6}Y<0;#Vj@wc!cWbn6e z37^h=O*c@k=rH(OAU*a3fACjdF1i|G&WE=FBgjX%ntob!hWtA!6>!e$#FD$F+_S}& zIiS-~2+h9DJI&DMnxUkbU6puNbHn`X>Z|<~Z;L*}) zI~0%BPTOI4_&RNeJNSpI2}Qh&qm89 zd^3Lw;{N%+Yn@$QiFa0od{nbrCVdEJ*Zt!$NXWka%MhyCyEbk|Q2r2uj95EmkWf_| zVAkHQR0qe?(GAKw#XpXBm7m3a>fiRRO$_G62!o^&aM6ZlYj?~LeKORxuu z4K9Vh)XwXb8izlTmtamJVtfe?>$qQXvC*y8$sA&;dxhyO}r|I;v)6_6;?h>Pg` zVYQXKp1}N(lIblB8BI}2H1nCLq-*Avwpf!t)4l%#@61n|)c19gVWa31jP-4W3|d#; z%Xp&V`VOXpETz7k=oMXkOBjW*`eJfSsPC=1dWCfF7wO(xwEEUL!e6Pjn&cNSzNutK z7u;&fANjPh$>tOH+kUJks1G5G?L|>v-bqq-kcVmq$}ry>;Qx%y#x(f%0U=7;H2Bk( zCBpv{^I9_aI$H`Eas+He$L5fg5|f8|W#0_LZ7{~RP?B!}htaV)xC3U^s4+Ms;Wl-k zO^AM;vXPB8@rfP~4g3Z4so(FCFya$ZyhUOY`x->=wLGp)Y^9c5Fa+Gudve)g1O_}! zub=z1*W+l6QK6$`wrXjzzcRG%ziBN*L+rRC;v%Gr22gN3&E8!9$GQIDzoYJNW8R3{ zzZ&5Ei)y978%yIb25%enR6M+eS0=!V-pFy9JRmv&9jM1w+ijHwsix`DoVa^+QNir2`1gO`W8ixX ze2;w*}Z<#-VNdY zt#46wVY>SED}IWy)Aok}G19JOw{&l~qI=!Cy&JCT-n4P|4R>`vwr2O^zu*1%{Q@PW z(#QalPQTW(FhBo0#Y6a|<$Qz?|)C^ZMPi)VQ0atU%Bm3><*yj9 zlvU$x@ddq%@P5U2ZedP3dJyAhUSm_USMpNBXv}=D=z7#$8RD^as$+=;dOz1Q?K;-4 zNsckZ1jy7J`9qy7^ zd>-$a{XQQQ7pKLyq5ZpVUEh7vs-5fC?^<@(t{av_Z@!gkc=@fn?*HBH`@`K&Ea|@b zcKN~k(XgExyF^0;;&!gP-!$*;TOQc8k`S?TUDwX_S0amo=qDcN?phkXsjK^%KkT~t zuI_7Y1arM>-EX_ES}&bf+0^Qlx_@<*CQak_ckfFE?K)aGw$ z!BRKZE1}Wp=|tbZL>&EE|NPv%boHMAE`|7!3w_vP1$0b`J1Ehj8kCCqpFhb@&u{iG z9*WZT)-kor{$;O z>dO^RsIaa(DFF?U{;g-pce~!^m!$2-er;btcG~?%TtCoIB97LZj%xb1o;hjzA+DZG zFL4z$p_YE8mx7${xc_p~_Fw<@LwbIq+U<9@crl?!r}{l}ToAkk{k~=wt?y#yX=-J0 z8wuS)UY?M~NR!)Ww}eg7g)~dK+I#`5FuvB&O1P<|&5NB*y|=%|cR|5-%fIIpr7e#H zYP&aH+uils-8XIQUf$K+bwl*GkBNzU*NwjeAF*r2gS&3M5A23WhBP}LyImjOee3G( z-z=id7wx~m(+LR_q;oqrtVF`@`&V?|x@z~$9RR#@!_D#o_efMKaUhT1x$Elit{Wcd z-mp?Do>-u3y5vPyLBdCD%(`V7t3!f4<*$F~tT65RV1lQe>(=kSXT93)-Pf<;Wa+t(CJ?~_>TAM1?l(e{cs$@GmLtA5<4j= zEv=moL0OAKWnVd6++j;;X(gY&*pJTj0qO2S@d zWS|tgawKG7wVD|CaeL;AJPmHh<~*DU`Dp&!x$bIhD#vnw`JMKne45j}A+~@ld01X{ z#qMQmb}hP`wyU)KEb3l<_0DyRy4U@F_lE1Ro?wj-f&+l*zINlz$M2+-V#Ce5ufKiQ z4V@n@x?CjY&fM!W#!WD zTh?_izY0PEfWdNwcN8c&bERDmJi2Sy@8pg5K~8~k<=?K_eKq#i>!mglIYt-VymRA~ zJJG`$F1nnW2^iG08`t2J3iCZ`)9?MBpLYI4x5w+LOYYNskP6F_6XaAm)omTKI+DDU@$!Q4Wg=kZ`kUxks_yFcMYJqyt z5#WOkT{}ms&HOg{D<|znI2HXmswyYcehBvWm5x6*@Up?J>2 z;SPm;ZS?=FP+&eiJy2@E{u{#A{Dyv~+nltFHwaX!#laKrx2u(nnyyli2&0BbAf&@{ zp(&xf)wd{dN=v?#eoQL}`*~ftr0y@V!m zIlC|&gWS*aQE@s!Y5$g&Qtmkzn9oSF)s9(ly;OkZ8dc#pM0`ZrqzhVD{iO=X)Oz| zba$55+e-6ptJed4CBH8;yHRpWEnatPKmv8ET1@IE#0V@Xc$0t?fhe?GYIE1manJT* z4QeE{186@ry4wJo&Zp=5LYSDEz@{pQ6{w=qZRkmXX%+Rul!gJuno}2sAaWOp(a%j| z0JqiWZ^5B=J*|ZR=$8Ng$L4OP9=(9;D%Po1D zskvZ0F;y`VpO7Pfw@UJOY$|SO%XJrHN}mi zd%r?S5~SpeM6cB7^Fd%<7mq;&X^bw+GN@YsllEvJE67M|anGljpQNZhrmFyQpcj12 zpkz`~(`uXL9W#53it9!<&RwXx0z`@m&bcvwBw=Joo~DKd#*soJRDZ$&^%RW?%H1MC zcLNlG=}iSiy9&m#SDHmQrA`v~BJ^-ys-u7?pw%}IKLBhc^g~@H;BN4uS3<2k@;roN zf?XaPPm;%nst`jkhjPzr1O>JFT2EISp>RS0DA7SNuT?^qjgcH;sE($>^stC1NFYcF zRg!6Ls%NDOK^mx2i1jOo7DTmxhxyvb@lkHKs6mMO9cON&&7vDRW29=qjo=0~&ljR7 zrc(fI!h}SEaFv+3E79mCD1gjsjiFz#V0wyE#&fN0s;$N*5%=q;nji)?O)>GLK-JO| zsKD7l^CQ_ThRI2)^3K!dHy$OEQOvX&N1csynSftR7HF+9q#$Vx3AAw$0nstBVQezP z&@k~d`5{0;kJC8CETarmpcsXCp$bW=Em9WI0AW^PawLq`#vqVB4?ERXR+2$wu-pbP zIRyfkWk7=p(gWT$h>~^q^-WH5M-L`pQxP><>}8`c@2`9t#v7BU+8&5(vmS(Cg$w{O;kK$=wM z@nALMC8tf(A2sN!mbxa9;N zgAbw$)&m0osvt%q2msSJjYT2=q8^Cf;DZN2Y?Hp)I&uOD`n?BX5SMbu-Dp|d}!Ab7+ za$-K}gLOVX`lU~mLl>IY&kSxY^uTGjH}MEll*P{{4RJ6GL=iJ$OJ9o{`*KAC7CMuC zDkotC8;YQjM!b@8u9j>#_n}>>k)I4dyf1WMZim)-ZN0m>uZZshTyw-@?xV6@0V+H- z?rEgwZ=lKD>QE0+`!*8#0yhCc6J6~ycn#$zV$-#{!N6NfEAi2<|&10B--ko4Ym)v2|kDK z3;fhrNY?%;96Z+29tSd`AlQ=rYJVbJ^JxJ*yrx%>YF6ld{S)vUSA>RYq3MuxMovxl ziS0WG{5yU1b8PJpfj}d@tes}Xc(%<^fdeO!x`^5&p@&2`sVkFoUYg%pKMhQ{DnIo4 z50W4924n08iMtaUc2N8%_~>}J=^C1hZl-#hef3Sj`3JKWQeX5EZUQkvKbOlD>mX)f zaj(tWUQfpiIoa7GMNjti;pA$B!P^_I~!+pLLR}p^;T686@nQEzeu)6qBE9N zjD{S9uf@=wp5-DC^idC-oP6B0dJd|$lG0zV;HB@aKEsb2?*WN79JKLw`&}6Oqxp&| zcJLuwTa8613EcJd#sr9%A+?Zb7IL%M=q^&=V|i`1m?q4}w~a+TUa=*OtCDm+59yS` zg{1w&00L)%IX_pIWRovVSBGGY2=JiejC*5L{l>WUzeTB*(woR;5 zYR)EEJrm(3V3_s`v6-Zg8@S$=n;JPrIORT{-!ntPc*Y%m$clMMI-eNsi(D-lbA!3d z+tL=CPp2iyM=Zp&05J>B7p{$P6}jnD(nSu``IKTRLM*_9*j8{QbG-8dLUx{Ho{r03 zr7f9IXJ~LQYbwTb!fd_-XgmxOXrmmnLN4hu$O4-nZDK|z;eUpnD_z1(+G-0JT#eeerX;=94 z@KQG_Wq$RlT-@ZH(5PhNUTs$rIB6RPxWa-7&Xj|tm<9b11Y)nHOo)(=3L_Lq2mMjW zMG_Jz3knqwQX|pG1))*WS>OYk0;iu9U~?yNUz5yNiS-r~N!vcKh1dzY_#_HL9mNEF z;v|{QQ$U)n0c;DTESf)X$QY1NIsEk!~r8Ju(c?m1W~SjV6t)GExxpk}^S97MV2 zVyDBWS*Tx&*Mp<2W+B2SfoGs(p?Oc|O}NaGI$x|2Nz!3{6LR*0lj$bKrwLqh z{%)e{qLil^y|1@9{PX$^e!^79RqwrQ&a{6`@RU#vH=+N_iP47n6l+pny==`li%yA@ z6DT^t#m1Yq%w}{vLz>bW2(^)T2D^1XAM}!lusI3+%#bGIsGoM|r0pZpU&z-^d8bce zfO;<$c#k;S6&7Gv^-j4HmIN-2w?nODIito~k8A3FEYMhkH?9c~iC{f|*o;LfnAdfyZqj}=t8Z*^ zG-pA0oe`XcChhmLJb?Lm94J5+yB-VwY`nE9`clc$2byM+9rP*Oj2BI!QCJz zg3lvvDAY0UY5*tBip@co zF7lI#b&7mbMG8?-^k#i?69|W-%N$|N!Et23bt{%{igg!VSQ*>@p z{=19>mrWk-SS^#PYKe|$rV}{Lq$1bB6c3P3HsMqai4`cN(!xtpwBMl`9Tg{WDr-qO zOyEQBlt-aBfOjbN9cb&Ls(zxS*z|(hbCX_zc4|0eJ3}Pxt_5=j6 z>a(OR1|E<>k$gBJ&}H7Shan(CD)GgeK-M07<(tuDDG&36F{eNaov;zH#ifO&F0NQjpc zC@hmQ1+LME1xnmAqbqNGEktiTn(gcG$}|={hu;H{YH&Voo$>4DEsuG?MD)V6k`O zWW+rRw?xTyu3$T|Y#60>hFwr4M zb|6^D=x(8}+D%z1+lwaSv%(AuxJJ%4zWS#Iq=2s>$YiJS&^lDJ+K@!^VOvNv5wk|> z@7i=|o{kq)z9z5DKQVZ8$s7Zadksf2%_MnNWXj?O5wUO3x)meNluj^Mac2rso{32LC!Uc)Wb+?c+?O9QpER6RYbAg+V9n6y>VUGAb0f(|DZG{!R%2Tc{? zOM#Gw`*6;t4qFTE?|>HA(SefDt;?#M9HKrkxr-iG$g=PfvXxF&BWZ$B&6R5DmKfR3wpJDev-VYEVc54W~^c4`JX_AySx3sMi)xGX=a@Q*?X>t@us#O>H>TC0e0B z(TAmUgOD%qxpw`Gg(%V>}WRu5;zN7tud5!%17s|*C z4-Pa`3l;NYXVK_?2sv^p(k6ET@Lb#1FkzY?4w8!>V=>;>R1h!* zAS{w^jtMM2eBw$<77P=dsfj&F%#cCA!k}G&R*Sf6=TgFC?jvA)WL6TW;xIvUt}GtI533Eo&^(Cf7JC#Q(0zHI506 zDvMZiEM(ld#_eee1(cXNvhwW22B%qA;8E$^-uvLrc8%NRdgq!=VIYrXewx^WqB%!N!nLM>lYZ^b%}FSSp>i>5i!` zEP$>mTOHaz(FL13wwlVaa+?KqcWkcea+jmpG8RXS!eql(02yl$g0@6sVziRRS#1O} zHZm~7Qmx&%JyrDJsbW@!^*7xowdZ3WV|0h9gBqr_$}**DV%6knRTkdBYxaWbCfA%h z#b${a5OPeawpEl>p+T`Y)u<3hRXfY7VkWsoRHCVFjxR5(sk7BOkbcr+GD_sCoLr*- zuANeCtBKk8woFl^i{NwM_W*K77$8#z9vw(x2wQ|714e{)>9z`Ml^9|kWFp0G8tgE< zF$csysR>3RFnaX9L@ed7pTo)+aq$j12=;_{MWwNWJqsel(XlugrkF`WK+MOuoPbrO zg(C%y1Vwu+%zRj4@-6)|qf9>ytO(B&PaDiP;C!Ri(U*u>gQPOv6?ZYdFl-T3otz4^|-LVFD-SOPR8mqoinCnOpc|B4!uF1 z@Em~!4_5FvP^}Y%S;)wetHxGNb^?B3sdiMj(4)1E+BzGE$2DP!qry^+{&$o+s>@)Q zs_qxnHcLgV3#n^C3YOe4*_P}v{LfNaYJrNT*V5o_4tOolo3u>Cua5T5n5DpJ1)7A8 zodrYQ-E0x_Ce5oBC`R%VSJ#Ot@v&qYNk}W*#r8HpQLP>eY(`+QBvCQAF^^>yus4gW zR$Dx<(g6BUpHN}N-V^{JLPd=#9aUvcOIdZbt*WBz97w(n zUas;|n2#49T$+gZVua?gsGk2vh?yD-S;6r5!18)6^RSmE0!QWC0gD&1Y^q?3J21z> z_itF9YC$5XvEmXO);(+%C`kZi1Qd~g1s5vZ^DXFNi=)a>XQ{25jA~c7CY4o9K^xQ{ zb(qo7P>f=CN!9oP;w|^+(t7zM{|b@Tl}#|BZL~;G)I+Iq!MD-%DXXnWsS{N zQ9~yFl}g4UI8$ZW6lb0GjRU%PBP^8?)#O@ODPGVi8l`V>Z5=3dO0}i-7ggn!8e7Gb za$AL^YI4maAgr#YtV-BY!xyKmtk&i_r>1P8%~D=g=gM{wKKV5#_L?hRvvYFu@(T)! zic8REz9#z5V}V_uxYZwI25Qf;NVDc+r6yK<7ASRIlPB0X3Pdm)HWsix@?8~+kS?<> zjWW0C_$-BlReq|jyc)D1PRV$(Wb^D;&XlX0T!MxFSGj%Av6s$qlv5Nin1eN@<`z_poeM?42N}LX3S^0)qwJjW3R@*M4Gk6;EwfaWVKu6vusE;a z9f`WD^;@t_;>q0fL`%&>^Bf<9VTMGRr!G8I14o}?0da<;3^WyVtSPZ#RnfUPWQiR` zs!NomrV0E_zVg6Q#laditiDVV5jolF6U&iy^k5T55KfEoViyM%N~2<@7uqh&a+*ad zl`Ln*kq`+SA!IXhmHH4sX=mDO#zk8rpg}~ww9I$Vw1|NmE{zxZS!$=8Q(Io+ILB6_ zahskwV^yv+FxKJ+yQA`<_@YVP##+vzKmD1bkZeh3&>zMKT;?@|XnJ$83p=z{k*z=! zfkhb~lvUIM69_IZ3>eb0MLPLRda+FNV?KpcqZ!-)jv+vNVDLkb#&|5{HRXA^AQA{} zpkpqn+i$>E6wCAyjWg+tOZ%dp_b_SlCtc&PtsHA1cAxEc-~|Rq^olK7AnsodggO%c8gkshcHi50_<8+nJI$8K6D`x+ezFns@vDt4h3i>kSz zhU1@AImL-4eRJ}OU7QT9TRSGuW-rdClKq+IFQEL>$gW~K0OtAg!6gN~4%MP?pUW>K z2`Q?c9)fxK1!9++KD(tVr$8ZK6^*%hNp>fut*FY$)tfNNCsTR3xn(p9VFD&=MdCun zIau1v0GQ>^DNfAq=w(A~afO(|&yLj#aC?t{KG$LYWyAk=`sFv>coF*~vRL+=-SzRK zE5F#X`mFs=*8ljOyPV^RF1;_kRQA!i>rPy<=b^I&o$fe$;V}H>oJq7we_><0cD z%JsHbexW>9pKwMzYECH<=k+^F(=Ov%4XNw@DZ(axX}wv6xLzrB|c9_V!d zp7i6t@z;!(k3V1;sD|;(&d!F_;OxBY{Op44!tA2#;_Q-~?3|pO+?>3e{G5WE!knU< z;+&G)?A)B(+}ym}{M>@v!rY?V;@pzF?7W=3T(mSluOP25uPCoLuOvS^KPNvoKQBK& zzaYObzbL;rzXa}0atd+_@(S_`3JMAfiVBJgN(!?Ja|&|{^9u6|3knMhiwcViONz3K za*A?`@{00{3X0%^tf;uCq&T}cr#QDbuQicAaFF$GKl{Twupa2Ec9WR_O3|Y6 z=UDl}qF=8N3Eux~2*12=^EiI)JiLzkS)ObE5k+L)^_oo2mHw&`hvGSYLFOmt;kjtb zotJh|Ay4}LdF4;>TsEWKR*ynFzkhhmjw28u{_c2xxcX}8e04m($3NSCFXH2$olh(2 z2ZH*dX+9ZkG3#PEvFvEM{1@*^ZZcLTU7c{B2@ZPzc1Q%fXOMwtwErI zjlM1nrZq%Gh`*=y98NEcR^(Kl%2%xpY76;0KB{$7!zw^E47S$Q5||w*Eye$(r5+Mb z>cgIZOLa&-UoZZ$=Q;egMuE)QXJ}s4BjI`6cW54I{z8Syex;Xv!{(j#cS56zk zEAiX@!IwQ9yT0r>;cv0uRd~M`Kc_BE|GmH8Z;dM_AK?q|8!Th4_~^@?`#?s|1px=Lw0AIa<^5?fA)*2ESGKb>i2EpB=v}{PrVXCw>|D zQN9)Uwd0qK-`DtlbnStj*QXumc?!P=@Vgnm%kgW(uMWRl{9c@Tpl3RMN8$JNlmk6a z;@5%SnfR%EXl*bj$2BPw^tQVofDij=O9vI<*8WLWjlDfaDyoQ!w?%d)+4@5~#&4sg|q3HEH>Qy<9`aP#a$T(rs z1r8ZpYBFa_L3XyS)=e3VfR!@R=FcrK;O174ftYjDL>!s;7sf2=UK-+k1Lwj~D-(IsfaPA&8HEZr-@BhxW(u&qYnMdk#T- z{L^yMVF!4d9sex!K0{&-OS&he(fwh&PuqFz5A>Jsng-L_IE@HEX78ed3l~NSE?YS! zB~V~ak#28^L&)0DEL-K=xi;sl9P{ym@n4hxzYlCSf(od2K=p&PFej5POENIA@{5Un{K2+BZcYuH0EJ*(lYJU^JyTg< z)zL__OefW_9obCEw*e@M1Rb-Sv$Acrs@iN<9$Ib42wgFujft0rrr9)UH`;20h2kh4 z01I46mK}}EV)fJ0cWySHxi!_3Vs5ggF%0wkIYm=&n430p^8U@QgLsL~Y&?~GHzR2s zl9XR)hZR&T#7Xn12r$o|n`gju3K~t4zc4mFYsIaEBsDS5pHt*)!W};-#3sq6RzKPJ zC?ed~VCur5I%tH*)Ets|`FRC(n5IEh0icn_xs9%P*0T{fBOLSmxy878LTXUeY|de> zx2$}kITFqD=M>Nxu&vd@sv9UV=`?MgKR27&UkmmUhsDMUYnT%+=J|7qRYikxsKSvh zxUbc`3d!;d{FBmxlTqmPr^~O+5BW4nY z#}ozpi#fL0D`1)TLX!L#KUDjKQIvoL^ZYr*ar9?iIJ(e0e{P=Ie+0)9>qJLYZH_A^ zyB2O|n{htg;KOv8WYPu00hYrYeomnZU%h?SXTS;_n!`^~e`eN6VxNcqSkXWg#e-c+ z*P1xuPl`XY_VshYYWtP_S58igb{Q-;r=SvRC2ruTW5-ctC_R_-D|F4S4$T6iNL`(< z+^HO<5q^;ZAGwtKkq28sZLq*~4%EIKmAz+Xt7&JYj0BKhLEQe#QEg5XIeDyrN@JRv z+N-@;Z}xxvi5uEC7WQ)ANF-q1)Z9XiKdXgeQ0weqW0F}sS^hdQz(>~;s>zWatYP*o ze>O;pZnu#wfFwBu0VgRxkCk`&H2=lV{{q6n&i^8J|IGgamiZK{jxSAykdrqVM}^FB z1aN?tFySlXUVS9yFVdY3;%XB*A{7ji{KmO~c93deCeOtDITaNXp%6!hjo8{He$U2t zUftX30XX5iPKH9oso#xbtWcSM6e@#2sj65#nHBT;IZ)?LF|BDWsRFwXizrxaA%~*_ zS}#j-upGIHU5?hdzBvGnNh%0iz+T7C6DKKMeJkhIOsuNScbRR%ZPnOJ&{~P>JLH$K z-V0wWr1lQz81Ldwt5xi!pX=A()$5gf>>Kx8Unj*F`uOeF*@w&(4#(remLJ zIpms8FKjEgt3Ga z=y~t5$rlVb=FR4z_4Q|34}5k+M%Qyv>$qQLHaT~e&3xT|(d^&-dFP-rCcHLy;=h+1 z@yeV>54-EYsz(c&SN!puH=cj|?eSl3xbMT}?YW@~-m|@Y#2fGY;>$!{0{mXMdbZ^`A=%tD9swQ=2T>jq|JbPjR-@y%gdPKh4=(9(;2 zV~0B%r{8;m`^hs;Z&gd{|{) zNr%4H@YwA;-G4gr%fJ3|#q)2D`pJrIs~=hQm#sfK^Wk4ye#9eV#$B*+?fuQ`H%p7x zeZ1!3O*aqwV9lVLUwJ54GU4^VJvi@`-~8ae-X6U8hwlWAI=ueFj&Yvr&$_VXh*jrZ zxZv=YkKFm2oN zRtQ+3LWO`;hZKl7p+LoeQ!7@?+H`Aoe$RW8rfGWHZQ%d=@8`2Ux$iyaJ@0wXIqy05 z+?$*3x^4Hp^2%54eDU7M(_72dzW3&u|6KOOiX1P`1_BpyR^6SrE3m9?ydT@-@Y+# zi>)&EiC-RMJ?yhbEI9MYlOBJzIQLf%f9ss^QTi2+)IOm8^z_j$3_SYHd;VPVv4`F` zxBF?|-ABB4@$jbmuDE{DomW|Zyl~%5ryQ66&s#3r=h_3$))sty)l=WL-_-NgLr4Am z=CVT`%e#ByOW)e>$v?jRi+>L`f8x#8a-%Q3yng9h(f=eKdA`GcPP+PO#k za`Z1Zc3*R2G3M0CmqLw_pCyMTwWyl@~65q2ZvWw-$B2 z`_g`Y@~+cQd-@UE2^Su5*#lz-)eW3ldHKrMZoK;BRadYbAEut8E*R!+yar^~b zrL!}?@}jA0l62vGnD_c&mac5y%EWi{UR(`imYn=NZ~3Ozj#F!^y>1&8KIUyBwK)EL z)?%*fgQ@+4S^E<+E_BoO?EQs(%9ZBj@AmqBj|(>MpS!t!pTp0yTYs+cx7+LYJuYGP zc*yF*$6vtPr1&P+%8S;R4UqTWKQq_x!+I#{R@ocYQFuZ7@r5a$+`* zU-RsbroT=z^+>VIhh@gqyj<1Gdd2h}TXMU1RtPdL-zY8O_PrZIdpmxPP3<1Zw&sOb&9ksh zHInq#dDhp{zBEys8Qb=$j)+!Tx7!llfB$>m zeSfdQ>fYP;L4C7V=Dn}$%e@H|y9ws$>&#gLW2%3qpRdfi|LgL|&FiVRuFd%f(CqPL zJU(r|{;;fArbB4VJfi`LDV7nug@ljdR?8PWvyje4Zbgy8l04 zX4+tm@=M+P&ei2tXS{{Py!bix59IwF#`7s>`WjE;5dzbx)93-S%TKo7=g#1p6PNhY z)tGL@nY!j3f3tj()a^Rc?YY5ardr04Ep597j#Ro+)!bd5$alOvk1^W8YpZC->e)bM0omeCE1g%G9~+ zGt;p5*3IQV(~apVlV)&k`=++^rw7RY&c5Ajt7TX?mwoeV*fUElhuBWicpK3Ld~wg& z8COMow!acrZs>-Na!vEV9Nz9#3%lVD;pS5`?IE~n3Eu;R^-DEv)mHK^)3oznjVq^H z(@uOduFB{V-+;rgU?{G9D>xQbq6apugm1-F`6^ATj>T0RJ`5X9)wIw%an*7f24=JK$~qj;j){rd_oot~wwOO{ocZ%q05H)U+%1-L4wX)3kOt%u3|y zMcdW33(=RmT{$np(Rtfd2VA?~cGYmPrhPqsyBdOy{gLx>o1B8}Dh@|r{Uw@q(}y?@ zb^CTzbE&3n{P1=)0Jj{pT~+Zl*}DWGYtV(hv_)3(9R^_tdDLcLoxt?V=8zg5%Tg(L8Xi?^%p+o<+uIsZ-G zM+i&XG;Iiu!0OWNs_1-8TMtLRt7&(^ihDHeei($0!5DlFx_+Q(ufVnt-xED%yDIw; zes*nFeGl>)D>(5}O?&US?W*-5+No^2+VnF`+i@at*l;rbdz}2R7mh;b6Zq#8^uYie zft}FXOFx4>a0nLt3O`kBS1s^FIM|2ZVa2cU6AZzECHUiM+7XsL!+X?V7hL3~9V43d z#pU?-H?(&p{_4k1EAi*=HLVKzw`f`r4#3~7=J-WTTT_j`mua_Cx2yIj?Y0K~iE#k6 zKWo~P&;$PfJK-BJ4&Q~1uWH&ZH~{lKl>3^d?RPqUfVFG4tF3R~S1;`n)3ldh``f%1 z@=W^AJDT<;Ec`qD_AKiC55{Q?=l{dIs?OQ2eE+3>wY0-_zD5hTj`BMq&^Lx3U<7WG z^9fDsf;l^=4{U_n;J_~Ig4K#~f8KW0508WeR*QBbY=o=e06YiQ+AP|7*bBR1iEh#Q zU^^U!Bk-W}>F*0H+7U1U*Fxt)i`EQ-uni6_vS^#2JJ+K1h#W>?Am5_>1BUjuXggqO z0eUV#KlDKD0E<=!?FU-4raH#kM=aVOU>KHM$T%vrXb;0}u;3!f`KU$HFXsFq7VV=j zT4d3VgmoXYXlKDb*aAxrwP@|o>#%5>ee^%4MN7a0^jtz*INYMW0!xmtXp1kUAHtl= zwkt=mMLQG*pbKiB#$T}XDEtN6;T3QM-UORVEZY5W5DviV&sek}*bVdQ@%v(nb{uSh zD_{&>3*Dc^UoZ^2L|#gHm*a2Lq>59xPZ(d9V?_0*Bx`(0hhOt8S#d;KMNQ3l?qgi}d$%XwU13 z*SzK~awGk|-lDw<%P*&Yz*beTDfJEe<35TeQ$8MwLcCjtc3=!NW#X9J-GhRfF_LKkWK6`ASAr z0sSlH8dV zqiO;=n~}2)@wJSqre(Y@@N4)F>UTgldhW!I<)pt0`&Urz-LR7O`TnSKt|a|0N7Xjy z<^8=~tV3Kc;U`&#yfv!atV7}nj#+=WCwbp5bn0WOe=Y5|-sXF|tKQ*QbS7SHy!SFMbCw!KARa5S7#*`O^e~Vm>e}`Xa5B+)k zE*u~~?Gl9{7AvmU#uum`$UCDfp>8h>1l9Jay`?7ISgtfBr_V%J*g z*}(A`q=R-Z_FsiP&=1|P_8RPfMb}aeEQQgtDepS!3)^5E4#UV7@Q)w8=O@&Jur8qn zu15|hzK)+RPN<=E*a71(0-XVP1$u6w-dAJSdeVI}p$fl&ei(ysn1Jp!>}aL@JE$KF zew+5a75l!6owrfmCeDA8dUSFg2JYj08^;gGdmO13tb;D-hi=#ky>Jus!EWe>5g345 zVH6HS=jMdc=*Qk4(@rn|i(wd+!x;2H`%eptg) zhoDY>_C3wGq2KwR!;jF}kH6@DG1v@4zr{}aq3?Oxf&QoefpGw1uQKkWAN~b7jKDtV ze~W$q<1p`P^8b}|(6tSJK>t4zYDA8=CsZT-HlWA{gBtG`Y($@RTs6UfZCpiQR7d_r z+Gi2(#)Pgs-jxXL9~oD@^mF&2yyK339XNvbD8lHcct;@pI#4{Ws_54-*ev|)xQfBx zG2_a01No2TJoLK8RjcrL^xTNNjQ0$}2n<923F9gXohOc~IE=!ICj4;{@5_Yoa>|3T zlX-{Vm(YI-@0NtVigD$KuI1DN`d9J(&zsOwO@0_Um3J!&*YNI17(AVH(7l#)H`8BW zF^rvo9vDA|a-e=0@91pC&g;fiJq%rsoiNhEdm6vY@z?PajDG_;jJA!doUb6?Fs{5X ze9ySrEXSd7H4NiF#-6WY?_=XC2qRCAt8LKx0`CEBA^&UG2gAH~F(${nn{Lb3DF2`x zs)TqEF5*3IFj~GtbrLV)D|vSs@xr}|_q@SSHShj|acC!gxOx9t84U4$HJvyThsDs% zyVW8v$~)4^i6fD7cBpn3y>y2P5=Weu@jf=_hhE}I1U5l?J$i{NK3FF41xBHMIq!0V zUKk|KgkTShLoe~heFgbp5ZX83XIKVZSME@?FbJbT%7+us-oQKFzD@a8?NGxodNuEf z`wr=@;r)i+MK3J4hw>VCs5+>Bk@o^ZAJl(ojPFQdU^@1ZDd!dtKA8g||0LwTI zLLbLrSj}++4sslWbsWcGImh;|&<-3sVH3x0*vhdNdN}sOO&kZHPQMDlZjQsSnDbE> z;W!4j!Z<7>o&BryTaKO3E_$K%E%L*LP1L6aKXUAc6)+6FFb*4``)l}1`Z4T+F&IGZ z`Z|989&+e|ao8#8*O5=s!+@lRVM!mrUy>e{NP0LR@>?jEbbc7)I0C&K+t*{~o%j>l zVHlRe2z0|JtbsAu0OPO)y1#)P&=14V)rwrogIhTc+)Dd$Y`=~6F<9_@@_z?C9J{|uf8jWMH~FFd1N=Z-3c)t$`XTKL1NV`y6MawNcj0e{1JDV# zK;IV1xfi|9(~n^ACE@|}zfAppNV+KXf>G#${#Pgu24SBZZ^e%L(EBR=55`}k9YXm1 zb=n`gV#JmENe?3rpa%{^``fhBX7ay-9_acT>0lhT{Fr(T)80@Yp`Sm9eR1r32zdg% zFrw{LuAku-=z;cqcd9-Z&D*Jb#N{|FCBJ>YovMjr7j$#%g>4eIVJ8g0Fbu+e7=nW^ z3`bxD>ewHJ9oQFxg&fCW7sq=3PF2FO9aca$^g=(ZhXL3OgRmWjU|d)U=ZpBJJn|Bf<-?;KlDQX0n{7XKeSUt zU<8hc{6Ny-U#ESis)A7%gTW8)RQ4`-5OU#1cB)nwFT`Hx`{+)!P2`8r4nL*bL$M$F z%XX^TpQ8u1KSFsYkRE#B5DcG)-C^YAi-1!*X~r^(0ev^_98zQKS0+7v>$Z)Xpdi^zka9M)JJ`<+^Mu*ldqBTq3Z_P z|7r9$QO+~SZ^CZjZM1KMe0PwppZW%ODrYz4e|x7YgLYUAeb5K}un7iW8w|ou7=d9J zgZ2lhf2?1Vnp3xjX~>fgm*w3qL0>J3A%8oD=8AKEDhx4{_9c?><@ z->HgW09HZ$o}H=%#(zM$v}e4N@`U$dKXl%QpL?(idSEC-d&1z4cB+D3QlAHC4`_do z@}Rp5KhU0`pYBvq7=MU*K1o08rr$%?!}tS+9$`E_h5kp8!|-D})dURnU_br9`2_lC z|L~LKr~UP(cB*pdg|*QCH2UcWp=Ys|eh_^fz0f;K`#g(%JLyj_Fo7JpCh0%V;Roo1 z0Y$%nA=o0vmI;-BPTPd){SD>qJE02bSH1%#l;gLggHCmH>PpG!% zNe{y?03Cn8p3jpGx=)!<#V?SqVnWrz2z0)P|CUcEZxns2uopYRFo*mRSOjCR6vm+& z>Z>PI4fMh$7=VM&Sv{dT&}%=9d;{o%wI|42K-W*COspuKfMHN1lSR{RcKw^7eO zQ7){5?r%;g*H-M?IH6i#pdEj~5FCK|9r*3fv@2|c5!eS^-N>2G2OEQEeo0)wyu zhM*UQVLgn%W*CL-Fa|>~4ttq-uxm1(RwJ`W8;ALh2RCom5fi+;39p)W@Gcsfyph55<$J8HSclssR|Q zoK$6hqns+_FtBn`bwbywN!2Iv)ssrwhW)SzMo*noLFivYKK$c7b5gaz_<576w{Bqf(a{mK+U=57I1{i}aFb;!Iub)(#p&j-@Cmet-7=vz@fL@q~{t&De zUP1kaNp~gX!5D0T(S}LYCC68hUyiSyRHgsIj%y}WBaAmrs!h;)?WEc&@*D8myByz) zUKnkmd>H;3_5L^KZ^1v%xgI-V^wvo=A;%kNhY`3DeK6cPsYYPnhm$Hy{q6TnD&Kq9 z4+GE#3;v7U4^1jN$6;6uBd{Dsp$FQ3MtedZoRIUdm3(?P?F#L18}!2o7=Q(F`Vn+O z`_J(=biu9A4~OME)VEU(tcUu;*ah7%3SD9JjN%8_0mF}>Z;X7uARYAe;7=HPd{X(* z7l*A-e}ei$JM4x|7=bS6L9Z8J8ly{Ie4~o}E-xFb3 z=o^%)Q~sOy5e9~6N1mt9|4P4uF&Km481ZT$cKwZhA^w2dpchU+A1t8$e&~b&SO$Y| z7=~dz^^U?AjKf~^*|%XYbix>P!vyrfynV0-I$#*OU=&tE{qM8`bU{D#!%Z*@BQOHD z!YCYuF{tI>7ifq2Kj;V04$GkvdY}vXpc^(pFKmN8*a`hG39|=z($A1fBoJAJ7Z?p$`s1 zKOBJpsPlY55EjA^EP-KI0VB{0^%2Ggw8J2D!p+bHd!ZW^^L#=8mctPA!Wis?_WzI$ zdSM>VFS!4UKcEl#V0b(Bz~CtM7a$*_pTpQV{Q~`QsF7dafj>kabn^UVvv&wPFM$B&<{hlT`B?NFwahUeV1}TJ9NRo zf?cWyM&TA1gF`S5<1n;vm#X+M^?_a(f%Py3TcEzrF4Y0;unRh29}MU0QUwPg-*=aC zLMJSPE?5oSunu~mANpV`j4j%w`e7UnLOpkv8i97G^Bj~D7Qz_xK|Oz$+6v%X1J=U;Y=%MD z4nr^m!>|WN;1=jQnRanfZ|Hzt=z>021^uuVM&M>SuE39nbKZ?!VI}p0kyX2t=LqbC zJ{VX-y*`B;c0=8>OGTg?ZiPNL0z*|26b`=xyAka*ih57x5R=ucIHpu%GiVb_4Av z@*C;TFbbnE{w3P`81mnY-(d)DfnhiVBQOqKU#7nwOZl)324N=*!7#LcmHN17FIWxz zunq>GAI4jVd(izg`rGFy4?3U^x?uF{lntq=!Y&2}_|1x}h7^Krd{7KG*{NFbD&1GYrCB7=i;Z4r5Snr9RLH z^UAOfI-v7b>H`C?3WmSQ_<>RAhu${YRgU2%=-a@!fN?ks?Hh?NCtxSELpLmjURVzO z&;x_e2Scz4hG83w!cG{6VW{6u9D;T@2wiXldZB(I<-eq z*bbvG1Y@uV#^DyIx6=;L4&%@Xb55dMSOnd$6ndc>`d|$V!ObuNBhY;Z}#mn_w6Y!Wc|I=MNYU%SeAO?Fn7569(_2-?_;b zqFm_y5%$B#1GFpoqOeT#zzEbgWAAeGz$WN~ZO{cfp&N#w7xqIR9E1TFhe4RLf_lOt z7=fiQ2Hh|YYoPvP+7H@c3v|LDbivKg4GSyL3rk=Kx?v2qL;FwYuh0u8pu3BDRACSF z!pK966Bzm#<83AN@5X)@e;9kwuRnr+p&jbvcS8Fr^uS^mg>}#wroTh`qr`RLWAvZZ z*a^#E2v)=JFE|e)Fbbn^8;rpT7>5Pbl-q;fp&gdN2n@g|?0_-Y1-*~sw^Pv%-7pMm zVDJgji5zx`9QMHojKV0~CdW?^7f+);za|}wJWaW4I1kHU>{;5$L;aqkouC`KU;wtj zFx&*=a2Uq=@yqGh|6A;VzTY#hpnD5;uBATD(=IUh0&xocAvgrXFb*S7KLZZXub}%y z>H(cE5of&Q`y+mY`YZSw#{W!v!N{xVgE1I`-q+~wFbo}Ma(1%E*=tbzJl*aht{1f8%4y5JV*h7&OKSK6V5bTP&S^uA3xsQ(Rre}VdMLoW>e zopA*1|H7Zb|Ipsh1tT#09&rl>MrrqR@Xr`=5xNqzA9TYQ^uh#;jN`v^(X#_Pp%aFn z3--X!PU2fF{)HZ>PY^Gl9X7$hB=*B7EI5zypcBSn8T2X2hhaDXBQOS|Faf<5rJB#D z9M}%SFa#s82l{PFm0v)5=z%flgK^jdLkpCefciqkbG6t7ozMx(V00g)dZ8;vsR8JQ zG3bQ}s4t@Y3$YWnLq80`0PKOTJj%Zaze5iUK_3jmCg{tjd>DZR7gHW|!uSEChx&&| z5ACoCI$;}h!A?2$TrKlH*@=!ctN5O%{5jKDD53Zrls#-Vl@e)*JAc4&vi&FQ zurA9lAWtbGZYyby!}wkf)RyKKv{{$r7p}K0&v&fT-T4*PWsCA1NXWS~KWBNaRw(H) zs))MfNuKT}gI z&sCwrw%%$zGo4^%ZZp|i(GmRQsCvi7!Rq{i+pVkf3pd)9<~ug%OY@7{7P#|E*DrME zm#y1pb$*>~jU~TqNq*^){9;lp%`c=j*u3hQ=e9imhZm~y>(=eFeqq~!4f;mg?N-~E zWl?@v6WI_t+QT3vw5W1jPs40AD-uYJLij*nCF-F=;nN=Bd%7Y^;;`YZM4-E z&Xtna?A$ia`Q|vMbKHAIB~n=&1_RzaQ(t1(xz_OwA-{z$tt=wqsxtrpEuF9 zT>6Kh%jh4K`5tSS7RNFy%lRk#w^(h@VXAnR zK9C-HE5uIGCGo9x*_isA=(>1H*K*OdLUfUDy|mT3g{wr@A5C<*MVFg@z5MemA5-_x z=K2xn${cqU)*I3xq$>B~^yk&N)^Dc|mKgmowgCUF7*h)+h|Sp#S10?S$2OR2^qs8O zLRN{P9&Bk?JEm^K-}(ceP1#hn-@?@!Z5#Bq1?v{tPPQyAwdL3rF_SFGb&)4Po-)3F zc`u*!+sT6sZNz0_uR9rgJ=OrRm*|;{y-Skq)=R!c-;S#fNj}-U%=e_@uk?xDh4}ld zF~x1(sX5~BwEAfhY~=hP=RIf7I6pi!htzYvh&J+I*A}TuUeYe}F`61zoeOPeGt^~d z;T`%$y8V~uR+{!-dLS``f2~qhFs^Q;PI}*B>e9I|Ge}FCwte`%KlWDhS=xGCYRW@( z&Po)?T-!~WEu^_#(lFmRE+)G2QR18Tgi&>()a5$#o3*nshZymuGJl}JRw-j{#jIJx z=*tdtmNTZ0!2btIU%pvv9w^APS=zQDhjzf8OZc2@S6Xqs#K(2I)syUq%uFk2lT_nk zCrO*g7b_n%{E?jRjM%tx=6simjUMY)O})D!*Sa-7Cpqb%Q~WT3%|(2tcmMsddF(T@ z{4gCWQ+^mKwcTqTd+3G9wsYgtV~9P2;@jVdABIY^{ZPgH;KUEB$&=v+qko^Bc7r?j z9K#K6nX-)W)Iz>;@_kS88Ew8Q-@%kAYnJ7?EF+R1nB?R`a-Iv5XES*|CV7@iKRMgb z=i_h$8%wH3)dFd=8?n_`OBlX2))Le8H~O@jxnirSZ3hM2O0 z^}?xq){Dg_Gm>aBcQ%v8ft_bC4)y&>W5lmz`z>60yKVVKy=udPHpYOpVsU}>)Ww?Z zNvnhmBEGa^4|)Bkj;fPsPyHnFn)PR6&P%o9h;I9$)wCu?JawQm4?FI}=2kxI9~YZP z^vrrmxuv8j_ppYfeEq-~hY^LR=`%eI!A#xQs9GrcuAUk{tJ3S1>Hd=%n=KaG#iB476EjyE>DU)Q=ONVp zqf-CFrT#55>M!-!Oqy`rn0i>s-FFY_QD=K>u6op>Z!2@1^J2dHOgkpWK$XmcM+v3pLs61dS0+TxpMwIMaVp#PQeN)c^y->AM4@zF?BM>@>kBk z2FB+AvKEQ)H6=!$-C$+zpSfPFusKC7-6^ehsWDHtp|jwMG4)$fxVv_&uzqi@UROo- ztzsX#R!RMLr>oBP2lJtm>=SO{O$U9Vm`PQ?^{CWXq+aH0S>_hIZT&%}eL|)&V?OLa z=V9N8E4k>?|A9_2WsV7{!=`-FUh}`HL(U?~;T;NV56Y~=bX=Ui#+r&J2imSX(6kQe zcv6eb^SKuJu`#Dh9Yzk!u0tL3P}g;1>Yvm{Vp!(&gV7HeH?meu^|BR4KRh)zxx7sG zkK}rA3*~j*GOGS0% zv2Nk|1#S8U+eQgL;`_n^=I8%`-7>ZVl-KI#y#W%-$Bs1bKbdQjI-AA3KPF>d6n%*s z$C7<#pQIn=UANWQ_A`$a%Z(W7Bvx$x(wK^fU*DW{Ov`eu6|)-;?a8(YA3*(^KX{y| zN1uZ@Q9_@(g7(%IPSxEQ7sh-yE8cfoY{7k~{p@w)%3RwQgmC`;no z$&C5;#LttTrr&kXmN3rgu@{p54; zZjkp<`7+1Fw7-owmvVJ-s4Yj&4Bw-xn16)_(*M6Urk>?po zZ~Pno=Pi^qwzX~Hh6Nk-+il{L5VjP5eN4U0=WL%?`_nFw>z*l>XyTJW@(qy>twz4g zYg)r6#&xJom)WRt#>LERpNPH^yQcN6``_u?L~QH~Bx9p~-Hg7MwN_27H9XdbOvhd7 zdT|T(Rq!5|Z(*yn0egnGaOt!PzvPJhdGzr<&Ns(H5Xy+>5%-n)Z_VqT(8e}i^Lh7Qgl<_}vpHb}TCQa9aqw3GBYxU2}wr5s6@)-TM3=^}e zh&>$(rtO(|d18#cB4Wlv*t1gXd94_GW+oD!S4ceCFs2?ApFc&K-T9pL@XgX`X8YXO z%MzVIbk^LF(s|bh*C~G6hEDI#iQ}xR^s8p;%<@}hexq&K0?eH4H!e1u<`*kxQqiPv>^tF3nPn~U0?5Q%^k!=8`AY9F&e7Uh^ z=|`X3V>m#{yhO^J*>_~kKTMi}XGc}bXGyb~G*fZdEphm)R3JXy*qK_LYl{(xFIcQu z+mdKCU@NoCkaE&mMX;87R}){(x;w7^$~sKHd3LPkwB|XOYXROp^$|YvrQL$HT$z{f zv6YiP-d*`!=|>Wg4cpepoZ_Y}Hl$`YBGr;y+0X1D{qsMHtK+1;ep#b6%6$W4UogtK z&Ho)$&xjo+>%i&QzAC@3zD91DZx?%E_BqPW0-e>opB^OE+K3>O)HlD8XKS5~?Rvdzfk zy!;8bA`2l~ZAg-`VPr$d+!-?2ATK&Sq1fp#{v@v*S=rizIwB*TT>E*mWaY>jvt%A* zZCNrOvdvktCS(z0nSN*YS)I@{WO z$4$lpNH)qO-C#=J+H^YO{#btK55_*Mxa<6^d%V&P`p1b6=vgXxjQv!(XIU-FMonUzlk*AAe_PJe4w=^^vPEB5 zX-rgAxu;LBza?KS`RdM0s2`c-TTed9VuGv6Tpw1EHb_3H|8p`Xse}2oZE8(iXZxwe zY#Jx4T$>D`tK^(jZMR-$o{;;O71j&0dJNZVVn>k!f0B0zbJiZ%QEZ#T z4$)PQuIRlVT$eHa(bYqHT!7w;@lP9D*G_dLsrw-5Mo9N>@uM-mjP-ey+?%jn&nh-` zwX`&MRr<56S4v1;$iNSsl`!@g%=4}^8c!B=($-a^_tzwn_hqvC2sdz2ePnrNA90hf zg?xFTF||gnTc>SgHvk*E#Kx&|PEXtD&ixXfSzOS0WJ68HT|av4yql5`pYqA+#>^zX zk8!S$b04%nm7~i;4B7NRvOnp$M;PnjS#hbFfwq}GMT?~4QtBG5o&4`T7&qn?{msK! zbCj-Qx3!HGkg@OI&G{nUt@%TparrXmch~<}ZwKU_-0X#{ag8Hw6FZFcHt#k3n}vg^ zwvp#F9JV8-d%=p_=Cp^G}`J9Xk$oS|&o}jI#6_p_=4rhhLw6% zlg7b&U}c#pf5rT(Lso?B8zPwYsl=+4X}1t>#s6)jZ6R%z|0S(2opz@GrOWP(`;E0> zoO0@UPpuIvC|By8!(z{mjAgu0?+dB7$Q{Vrkbf#AKR+ceLmo1bdyw}cm%5ApWcC+5 z^~j^hDLO3|pS2(#Mn2W<9%SK9Fussg>$KCF!_3>=*po=jfy96|^GnwBUVRQR;47Q? zZ3p_cehNCX?m>x-C8Qa6bd2vkljc~`@aN#48~J+r&8d9WKaSj3SI`fQF_rAA^`wcC zw?g#qGiCFf_ZQ@OA3LMaWSd|~u9Vq>zBY+s}_*)2}bYKC8=A6K#9wf}NVv3+Iy$@-%iy$)oXq(1j0^`@RV zoc7fv5{qa1s)xKS*!?&3=+}$g)4mejTRHE0Jf-`}z0+-H5auxl8@fL~Q@6B(i}RbG z7*mhiDEru??%U^ncFlN@iJSLk?O@!qaGxfHSNd!lX*|4le5>?1WeAyc*yMHmIdphRLXLk#EA40cb_wBQFcXGb>P3{GV-RtMjeYd&YgXBHy zVdf>td;VN4V4)gwIfBtDTJ2+8tE z4dD9-uk3_~*L~=e(a6ZUd_NU^Te{oxgXt*7M=@o$@TP5uZRpzk;+r|Kw8yPCens#(+Jhc`Hr8NaJY z(?FWe7;#kk+rLPI&o|1oP3k$?%zbI5?u#&^6d7}2x?aXT5-G0-U5C-We6>r{A2rIe zOz%x&4`~KTGeny_CUx(bqdemFx`iuc@?J+z&o0kc2f5KzOeYMzGp6`zxu*YgN*C>$ zdTy8Nvea|CtLZAQ&(=f)7P}kK^E7sc`KnIHIF1#VXuf71V3kwtm8 z{&z)!-)5}CE=zZQ<62Gn<5n`cFXS3Bk8+Mk+B@%DIb^fFZ9Zoi&*T)KGw&Gw!!G$O ze^O2b7ec*PCDgGpN8PpCaw_vj7TUVZ=cx3vQ+~?XjIXEGO0wQ=MHakn@AugH$Tva0 zABn+6e4Bn=z&ghso768sKEI!9bjin`QU7DcKTb#<=oIEIwT>YK43{;Z{8hlmGL*TdDw z+9|*H7WTXsQND9V`P29OjkQ)~a{r^zcB^@n+{UvzeU#CAJHLIwxJ||zV#x*@F}_Xb zxt-LQwO*8rpY)C7BvP4sEfOL(Pjw_EL>`H!rKR|%o!=^uIPkNN?#}1c?4I6*4`x3N zvpV;B z^{UwR1(Wr>(blQ{>yf7>OjNDNz0pj}V%G7GN}t*i9rc|=jNxfE?qNK&OGt9&UW@(6Pxr?*GcsM-s!bNIkI}nh#>pCw9)>_GBW#C z`hIOFt7l=k#NEx3pWoiuE;j!2pp-AB+k;so^E-a4cxFVthh`cq88TV|eZd9W)$1Qd z-wWt7?zf)4-$GBuGl|{%FD|hCn6PJa7~j2Mh2|iyi@5h)_AY)Tw%ku$vYySTB~2NX zw)gRyKYY$;x9Pq!9oOaBYTX>BG6-f*orS3EK))aT4~c&6*jYQ1cTkEr40A5$*9o;b zb?%GCh9+C#d^*dy$9ah)S_ zaKA|V)u7A8Z$9 ztN(pM9mAR>Ti>iTvRnw7>oa0}F)Hk*VE;fu-J9}dn>@Rn{9gBO(+x^$si*uV`r1Ukr2EIr-4Vu~Lowk-G3nF6=0ri}UCUcvbIQ$k%M`uLN+ zQCz`(3o@S6%Ji|>HG_=zubEC2w3vtNLE>lq)`YUiy5;->GvmGyKa4hGFD3QeXueOf z&^9S+2kMbE`50{`KIq3j=bH(&C~t;+=JBZ0Vq0lGkEHb#E@7$g53VcH`le&?^c-%C z)3y2NJIq|4F^7x)>d_Y(O(-7WOZm^xH|@X7>&Qmi!4lhNS2uah6Gqpz1kc?NQXf{i zGW;lQ-9lU{Uofs#%JoDWPj4D?JmVmBzuSm;#&|c@Lu=&r^q$qVXB3@f{Lb5- zWR2yU(rK)*m?=!YqsRAlPnY(Y?NCFfv`@}5;z<6udWO$p;|6*ELh5^4*l2vu-&&V7 zC#;-3Cy0F#->UW>SGjC(=x-Fvn#;4=h^GgFVR-YZu&e2?U*#Rb>M^^Dk+N1W(BJk=K8n6hjBws_Ut zF5{Up(OHMit|Q0QC5#jOf+?Nz^ljp=e5=l+Ez*4^Eb;8Padp1vbj;8>9UqMGVvN64 z`6Cva$6Tl3Ke02Xf_}4fT-_o%|FVB(o0yM5>^#+6XWGtMbQbWtd|wfrKb)a+PCM(& zb*Am?MrZlCO-I4vvW%4%JdkVUS}I) zkbR^D)`)2nEzh+r((_w+@UWeK9sKKDa30BRzp`dYYeed^rKD%UB_cV|l9kRQ(wu!v zq}HFC2yHJdGLcfpTK;WW!GHXY;R!j=h%;s}dwKGDrp0Q#k2=oYx2VjuT}U0d3~p!t zyOn24TZq|yRF+h-pLOTBx`XSLr2edTv`qI&;~wF;(k`V50+}6+mgllt-a*No zM4t{yZnw&sF+zOK`QEttu!HuydB5qsjP&=YtJ@Yt|1Ne|E|q7hOe$KLOI5T@l>f?oapmN*{xb25`w*YyPu6icE1B<~<+naX zz;mnXtT*!HN-}P`-CR$QeoU@Y55Z5&akHM;n$h;U?F#etigBIlKyL>+cl|J)y!SIA zb#I^bUG!ekbYj!#(mt<~#^}?=xaAq<%=ZEranLQd^NbzY**(jc=cL>b>e=<1@#Hh$ z=xejGReJgKb4-%PzKZ(`^Q4h@TC*IR`ct;me{kDGXBRq4**h`r=bVI2!_U*PZ#qsH z_2p3$-FB?`yqA*?9gQE|f71+PdhR!u&|IogfgG9=Wk){dTz9DOa>KSb@ zy$_hVp6;{R9yX6a#=QseNntfHPfsYC#E5lr4dmcKzNzQkq}*EKVf!D()jK-nI;YAt z;z!n;nrbh~-8fIVqO%*FB`@<^zA~rgOzF((1JgcauF`EQ7n=IeSbGB$K)8lEe`FKk2MS6%IS|}B_Zbqlcc=Db` z|Cz@&2P&FKaF?C2z)gYXbHPM)&gX>Pywbmo(JY!g2;ktQ-v8l(SH*3dx-^>wkoZ{L*v z&91Fd-CClML!=5E8LMHk$ z^OhpZ*5^i6oRzKynJY`yfUF`*)`F}$OBO^{lO@}X%$FtWMb?-l8$i~aC5s_z&5|XM z1+!#%XVM;7G6%A*ESU>gPnN6-Ss0l;qdjVo^&!jbr;W(AAY<#(_>+DWK-P~eKSS1m zERrSbO6ki?*N3b(D_sE!^j*NvLf;K+3dF=2%uF9fR{S6H^aGqLdM{OWN`DMl zD>Al$Qu-Uy`n4L``@b{w+mTfvGqb0ZbIqK~>|1VROPVL*Y1Yk1<0egUg1yBVY4|R0Mp^Zw zagNV#PaA0*JI2-BX+83I(af^CNmIU)J*adVxs&vjbXiX1QPT9hGOj8ljd9=CxEIg; zpqbyZogm%7ZqkVkClA@?OpGVrt77asPd!_}#zA57{mLtHPs{i$-=|E<pZ)oPaXDc!Ky8W!ibjvt)K;Ie%ln+{l^C zTZ}C5&P-W3vToWVGo1(7M3&5ltT;>7ge;ULYeP1GpELD!BCE}kg^?9z$@-B+@pES0 zL1aT&=|+&1XUX*QiQiea6e5de$x4t_;H!^h_@x5bFl&etQnEtmMOM!oy9U_Kp`6K&~eAa(6k=m;=zMH`w z)H*%&^bub}OMY*lfEcimcezTr`hBFAM5%YWi|qv$FrKi5w`%{OD9{wEstE$7F@%iVj2GZ2Amgyk<^n5!#zlrX4 z(v+b4P)Wm|gMXnq#y7g>n)B*OBk@gVE<+|H9tll@o=t$IUIAQ&aIMj zMI1J8u9PvlHg#^Db$YGYf~-s86M5x(>iUt%I+#5}c6xr<8Tl3G8Ma$DWW~hFT)wqA zBTDkUjtWHF8c#pWw9I%(2s{62iQIscwL<|5-7VDZaP{2dB^nquuOlSI-kF#tO#Z0>|#AC`ykc3EsL9y7TZDFXfnZFa!kbD5h_|~_yX&vcL`&KHRypfm@ zPf9u8!uetJJ-}!EInEo;7OYBtugS`{`&0eS*kcu)Ve%}R(%EU~On>1QOep8eswk&A3E$$MgxaU`>^ z8PBJQ&Hy?$AG$;BZz;S`cTbQ$|Y$L^T*ZWll2`Z%|Rb9?yx zisww5b$M=+S!=JDWd$hr~%Ee-f*F+^nj~fCF@5P$&wAG^kwE9LDrjWzT&iS6Nhj$ZLmIrGC z%XDGsWZ4Cl^W&bK-k&G+oHlEyepz5{{lxy|gNc48@NC;QVqeZZcBcJF&p?Opx>0P} z9I$M#3BqI6i1s~kLSI8#froxISaB43DNi$L8*_U?c|7kd-nAXNwq4LwA|mA+$^+fr zid9J+EJcUx-$eHNwP1NJEDO3Ou(h;h6VEb-?&`j~9LT!h$@xjo9>rR+&Sm`kI&v)M zgLQbYX<)_Z>W)Xu0-No^3elw!Y!)@;icov6G_=@41vj=?D@U;!) z;~Q(TNU-xeCUG!7+0+$V+zej<0r zK2k0*xw(N02fUOMjNAffH$&@@%i4QxfcJ9-Zn2X#s=@v&$nOaqN1F%MbPmoroM$Y! zB5>RyeOz@+0p}UNZ_f2`AhW^`(sb2RQ!;^{A}K~fyzFGCO7nr&}Yx;3C$j$$8B}) zI+0`gsay}pmtzLTMI2+k{G1;1{zhQV$7Za#?_TlUJdnrK2p3f92cIB(kCXK8>_0L8 zpW72Uhq>RStG!MeJ-ALg$+b=^g0vbPmdx%6oxLw*onh;+nA5J|cL9d3PvZUaQ+D8R zAx~^s8#2>A=?Wc~g3R-&cj|bakN4c1_k2&NjyaW{bfvuMcDuabyHJjbo|G7bH|<>Z zmgaHCmiREIeln!*BtsMYGyb9LoPw027{1iwdqOj$|IYu^v0LWcTeNfE#t&OF7;AE` z5eLpytw!dr=*LUNpB9-oZ|-w`Rph$~8g*h%C_WCFxpuxo_EGS#<=b*imj6t$^nO{Q zAkkOKwSk4)f;E+E1Lc+$dEwRf_h{f>qkuAZXO}a6e>QYIB4c|t_NAJ%Lqx}|)M?nC zw9hJsFX3KkM)vWE{*jDqj_Ud^^qc?tK5^c^4kBvSVW^6Vha7$GXJ6eX+1B^nbz|3$Mp^KxX{c^uJ(Z+9T)U z9I$3Emh|RF_fv&nO<*Sr!rgZgIhHJ@>BuVqOP;@TKU4h2`v0R0%n+fLTjXR%q@?dFTr5-E`ti*%mgH7{b)4+;dn3QuC zSP|Hc{N!rVD@h;c=r8SB2UZOh%}?GyT3t8|TAAxQ|HQZfV>+TAU}MdAaQv1m*Jo$3 zJlW8Qed~jMs*JI@(3>;i&^vQUKEYIZcT*z8_VjhUxx+JO4r8dJXJFqa4_Sp^MPOI) z?8=ve!@IXnEPZAPGIB57wJ+ZYUGXmHDv{R)-7M(#mMH5JFmLbaAbp_&9nu+# zzY%|d{r7153TB%CkAtSRcS86E;LjuX63kw^Y_&Ug_7XRX*lRHH$t<#%_IL7I@XgjG z)$laH^CRE*;Vpl+Cv>dvnm#{xhqt76kX}!Ew6Q1YaTnmf?j${f^uT-3 z`DGjxke*FCX4M%(E`N-7Z=>D+TnT9%wx|L=v*&Z#(0ik1H8}M%sT4GHb8}#)rNLnS(y9?RQ7*QaHCGs1Pzx}@?U+OUVAN0rVJ)zBFC!(##@h=C~ z<3;Q=MbTb5!A#gIusO*e^@Ns*e|6jYJCSG3FB_+IHp_=7B8fdtjhY|}oE-Anh~D|1 z*lq9XYs5v_lQ?%^ZNr;zys0LOBeT&HIZJ2o({;c%>k?1+N7r~mwiL07&n>(q@ zdsb5=5IpoftATUYbC8)-<($*+?ZBVszDn22ZMo!I3r+GO=4z>*x1b68uD^HP(Q&Ks zlut9=O6Tr7h_Rt(JAg?a%JI<7ZOYRR3GH#Kx7CD>ANAe6DJ+wShXD!f_T-y`+iRAU29puGFuW6Lmrgp4=gEW3=~JoQ4W7Td6;(j zH~gM!dxWvByK2Q-ok5Xv*ZpC+(x+>j49&O>eI%Y^Y>fpbMJWO5X z4b4M*+WJeVFYL&fVv`2vkyFjsmT;IIzhMWTdgtF}=r?}c6FSwgVG(f-zJ}yDvg}Fn z%$PH=4VPUIC#D=ZX>;jso&WnisT%Ul`Lt(u?}n@0kzp*L3~k6N{LG0H?a-bZ`zw2N za{n4ujax(9Q3~D)EJIe|MXc|;=(A!=p4~RYo_qHE9rlKJ$Do=}J6bJT9+Q|ensK125~oqKI& zA+M;rC-iq&OO4)vJYJq2xYwlAzpqRqLj~rW{lpE(Yg>h_6B{uCdExoNZHJCBV~cmn zlbo^j8)GVhig5}5FD`QI>F4cH?NIPy#`x{{wE^;Y6`E*y{KVwJIihzR8!?ziDg493 zc|00Dk1A+Z-^pHp>|5TlgFO7`5P$%i*MW?%5?Ptfr zrpO2BPT~XTm&i=QyZ=`m9z2s!SgunO_WSS1s9x6-nkIc}U0BAHVKD{axm6^*ArkOy z{&INm1Wb61=>jT<4vO)gLER>K zTgEu~oz$`P1y4IjA6^Shveg^PN`>Z8XiOg-jE@`pYWz^=eLvnGe`-`z12S-*h`N;Z zLTYd5FCz2L@4980GXtKOJ9}&i{!u$Q&s2t<#mG$kZm)fI=TzqGL4TQ9W61qG1ey2j zoKfvU#?SYA_xPMq5M9+g{Olj}+UIwkp!`wJ@1#SMF}c@1zq8V&ai8DGC%ut$bAIPC z(g%GIvo7`T;`~n8<?d!wG;sU$6pwEy+_om6aB)sK4Z^E(fO``XUVzU=t?j*OR? z$lLruS7={?s)35IyumwWSZ7pgvzP09*C@~bNg`dBgP0y?!~RxJBl2EgtdEqjo25tTh&%?YBeILf$k0CO%7BF7&dPAqjAu};T=3w6*T*J!- zivQ&3_iCG1SPn9)keT{4wnXgFWMqctSmuE#@_}eJsbstJW@An;<0}sj{`zoxP1FSM zYuNAm#BLl4ug7jABfps-ML}_IM0|e>SU#9L#=RXZ&xOexr>-F03KlIcmQHd|(hGV+ zc|vRU*04wN%~H?1LN3?$4Yy2p+mt5z27*_mA$+`K}~ef{TZQcIAU(-kn2pq3hlSos>PP zn)Mv@IC($x{Ijj+uJ)f7N1qGL{F;T#Qe^gZb%jdek$Jmq_ZInz=?&k&kBjZ_Q z+TnCzk}+2U&!&p5kl0P*$GE;-A^meb>C-4rYAop&ATw+)jQ>*Le8<>lJ}A%idyhC< znkooyC%hYw{e7{U*TEabUUXfFe{^AQNa*F4%)dA`ZR)`=rRFDC8dx1ziVMpETMIVa zh2?{-c41P+X^y;Tc12{*A$>DE6C63x-qm2U&)v1HSr6TUUC`wruN6AcpZ_^^X!gN& zdq1iYw&2x_ck_DXc9M~9sA_MQ&X&ogS+U!L9jjn0{sz*7g$qws%|{hUh38y7Qg zR`lBYB8m1`{a@~jNFPqShVexIAAoXkf|8! zn{Mn49qC8rk0c}9MH=^$gM6CEn<`DXKYdM*Cpx^F&@XOdqf zwx=52lX(uj@}_%jfPXwUP|Aq4cVq2$U>cy0q5n%C4XlG+h@AJcE5TYwpY@jG7u;vd z`(OG6vL4I6!LE;Q`(1QtkGiEyfA{rxPWTTA%byh~ zzli*k8UJZ-_J%g>i~bkb@^`uhCLa9EPJB#}S%%Dl4ZWd5_Ce-3b{j0_6G9Q^x=qZ? z#Qsi}@3gp6}%QN7Q;)muzv-V5J4_*D%f6WhFa1-mDzHjG;Zb#Rw ze#Z~ZL)R#NXz~sCJJ8%A^%}Hk+4jfAerSO7L3^}YvF@Uqsjtvb+f+_|vq)1rzb7W#Yq;N68X24<2+v9HheBezD3fj#yk zHy|_kVsGeq@gqM*W^_NYGnyaS4R6Jt9Y69*cz5DQ2I`3~r1gb@ltX?}##FF;Ft;C> z36=-u_9OGa3O#hiU} zO1O8=a62!gY-($8?lvDq?>cWD_(Q^8T7$<0rOoS zHqZWB=Ypl&x!Ac*`t#R32Y!SOgL6UDy^37uX2Y}LfIfSFBq4&wjGdkBkBD#G0DncW z&)(~J?$se4Mv(GYfz%S%n%ix(%*|aNyJO{gxe^6g& zx~A+W+Il!X%?{6mimM*wOsIL+J`b7I$Sh?X^od=Wg3PczH*vJW@N190PsK|)A(4+| zxKI5t7a*er8DF30oaxCxhR0_SpMCRf^w&fBLcfSCw^>j4cV4ulcJvYl+L0_I<0f8MWBJqO<$#xT!|hDE?{_G_BAWe{~ym z1dZEYZ6kfwulnq`>C;2)&92U7CgDr27+)Lto-^zdM&^^i=cpjbA6=EAk1vbOuiJML%J^QzP z_SuU^BXr!Mzq_lm7i*E(^vAx?4RPf8P=w4Kp1n9@7iTXNwqpCRKKty&d&msi-0=R# z4$fYrQ|?@NPoxga*$Wx-9$N&7@s;!M!vDW8(pR1aRt82<%unprEU;1!RtZ+(;jICi z=Al~+R_vkM09FL%_KRD<3O!gmSb+!Y2FrJ0;*%sbV8_8u5RJ`TKX{Laq!+HCeg0(o z%7I?&q#3Uz<~_|+Nr%6M^!zu-w)i){?iA%kp+fN^xOh(c~xI%c7Q)jnJJf3W@2>zLmb^o1^q!arDN{wCq4qafUF)l(CFSB4S$)CYC|c{7pMUfmZuAAeH%|6-r{ zX5*k;8$8#UPsH(R-|)Eb?OUbpxR?Lx=!cf&Jt%4G7V_!4vM+?SGJV9|*7T8ZThH^f z^(o%AmNA=)jaYJ3UnoEw1V+5<$m5;^ci*AU&5bdyM78nimK^4zItTg?@8DE{lCxb& zc9jr`mA+819(!|bU#OJlA!nM32fBjs$2X!&IkYRqzgw}{&@cAw^Mp5SYuzrQ2AM%Er zv*kOIG5*CPc6=UK^y@^w4R`g0nw>GV(>g5j>*&4h7;|2s1iPZn=?l$@N58QV`Vo6~ z^c#HNfn#9t{zsyJt7#x6+knjK-*%br-v;_$lDKcg_pW4pv;ID@_kE$ud3M=M+g>}% z67D`Rv1FldhrUsL9$Fd4AI5GP-^V_mb!psSrIVb@zm)rlS8Rx!&ojWPz}$0fE?A`p zD*~$k`z~_im&U&;Y|(1;oxpS8Sjyy?H>==jB;7l2iVdtIZEf5)pVuVcR(P|}CE9#0 z9|c~i#0*obVPr9x8-eLL+rM(9UC z&)UFW?NgFR(S!86CkFEn4^Vh!f|rqpi~)6`tl^5ElnN33t4NzeT8^aglm9OTOCRyg z`@QgPhF99_W5>otoR!@$;EVB2?dpN{lb3!(&*X;~vyVg{i8rrgyZ9J zBr{U3)bUJsn`xtX#(-_JaM9+;8BtHs2c_IA6XNT`>FmrD=`cw_y^_UV}^05;O9_iom3N?lPBwN%`E^97moTs|J(u#hM)KJnF!teBt_%d2Kz|oRrT^f3nw^(~WHv zwk-a2VdqxEa{|_~ltZx`^gX^(@GXWXcjM`synY%{=FTmqE2Vu(ps9pX8 zB@=#;JBp+^K_ntji0?%pTeEt@hPX=<9kWboEj{k1f(9AV+ z<;=V9d|R5ibkOv}4bZkgdoFzTyu`Y7u9VUDi|}M5GTWg`-H3f1u!n|DWO7QuS*21F z+0Z68v0wHybDf*kxeMr&f#T#R`U~x~ntaer`dk5g<PZ4I=zqUI<3txeP? z*b{;b<|E~vGEkSiyDR*0|HS{;G}uRFE=U8*0z1p$=lrisnT9@xv~m}{$S4Gx4dxz8 zrC_r>SUK2Cu&}Pey8x^V%sswp9eHl70j$Eq+YC0xgKYs5{frGjzT~kTtkQ$2$MCm3 zyeVJ{JXi);71(~rk)O!R1zY05ioj|;yk%fZJ=h$u8ZfHU{6t>0BQIk7gNc3-;~#8w za`f>payFAb?fuAh=m0DBV0~ak9xVBB+R=lhgB5tN9I$*3RtVNffBT+YBvVJFU}@;@ z#>z#W3zPA)08H9zU*UE6W=+^SY46FvfvHbB<9x@ySts<#XF9&w5zxDQv+d+j*D;uf z_-2xKpqcuLl6Nk4qcoiN2OD>p_bljdKf}rUDd=5!&m@ohD0x?c=SIo95n1`+yyxyZ z?+&34=Y3XW-tFYk@m^%PWqkL62gzds&u*Vo(o!)R**i$fCQaJU%O`!Wh_n*YazrLS z!OFm7Jh`zsVC!9&q*a3{d@_n+Vh2Os%gX0-V80vU0vUgKBfRy<+Y_HRfa5jox#&J` zkhBug_C#(8yvZ%m<<223g|t19yB^++FAS9{zGNphZWC!o`{>taL1@(V zNjLg4-m4|%T$rr!BkM!BdH-7(nq<;&) zKZv|SL{yNUjOoBi$uH9Hm;NzZXkK&b>~cHLA#wVhtd$yI$q3ik?<9}NI%@&yLq0u^ zJ9Kv@KYE=dQ_Wq|oH{!)Qoht#7U{EIck1j=TmEA2Sg;#6{5`F+bmWPBYdhVkv+qcLk^Kx3Gp}rTmiBtPFEmyFep1IRV7Xx0 zAU4(xmIG#d3x}>7EFWyVi!Nys_RWI@!Aigmap=Tf$OfAO=3QSFf>(kc=#p6qR_nr~ zeC1$`U_TVPLBE`J%UNbMf>&?W3ANC*M9{HKGuKa`{O4w!AaqjZX6QPgixYYL1lt1E z?!mT$wRteb608+0-f-HyDPUVXSO(Z;50(oi`nh?Fz&3fXGO&#vYz|m6m|N#+uqLnw z{}*fnn7cjKgGv2KIprt+-w3weL)Qw{0OnplbUO0f>w>^@wtj9b6->%|q{)G~n*V2l zsdt99dp>v^xU{YOM4xG3=`KvtW`X5_9VJ8&?S6JdyVpQB4Z6Yp5xw0vKsOsYcm213 z&GKOFU^Btob=?hC2IgL?B@xOg^e!J_SQt3|xcIl- z$d~ppHo>$-kt}UZJUAQMkU`p1$>*Q&4dz3`z$UWxJNQ9{RMfyx&L4Gxo8?uCF7IZR-|}ADkYJW*Ga?3Z2yd&ge{CzF@cK z(0+L`CAGg}J4HSVMT}N#j*NvIc%=WhZJ_8@1TOt=g6KBb$Ei0vBonr6bD%4S?$Ag& z+L65})_-BTI_N5PL6?k-jnGv==kAlOV3i)M(~;-ye}NaV=g_&aR4~zRnCQn(^2h{} z@#enwJ0~V~PPprkBr+?ZmGZgut^xDvvl>kFagUJ=V4_cW zj7Yz30n1Dn8XJ(jwv*QRL8J`z61WFT0qgK!8DJ^o^*!XsPx?SEnAkJ#n!Oy`BIDVt z+1EYf)WMF|?DaxlxwYEYqJn`z9Mmll~oESIYlez)E;GVNceONt^BR z?8%y}0N$>x(br^R-?~XNYqI+vH1*-EZ6nt-=X=*Q$D1`xGyFd})v;q2!|z%%Nq=i5 z?+nVktNlUo&y!o2Pq#U~=1;@A?7pvA1pi~FIKJk7qD!Q&Ih*v{cO74I#LnbL_ca^f zzXJJYP4gasY?u5(X_(C^BlNd@{9B}E5XzM&3GVo zv$x(M$VP|N=+I2O?FpV;^O3#hf9=48bgKJ|Rsp1K@Rj_hFLb+Q^9}j#BIhxj`;3XM z`2R=`jI!~QZ_YbpzJh;-U6?7dPTSEp%+De~bFAxV2nU^0tjF1-dlGOHhYkM4@vrA( zvQ0ruB{EyL51mJrg13V+`_VwMU&^_Uxqj|E^<5KomWoJf!=_by*k_+n+y3bw(8 zRl-{i)(Cc<)Z^40)uXS-j&w0L!>43?Qn&7dM8_olB@)OVdOGlQ56_9_`vu+TQ2#MD z2^HigWlDOL`UG>&MM1Du7gh;fHrN)hy{UgAIy84i>c0t0eG;jE8(1H7;WEjX=mP5o zyNzcVOHtyCS-!KWHoOsLZoBqRNjxobpV_Xnyw@0Co;-`ernxZb=QF{I!NfcjM9)OTo)rG6Y)-R_emU9yU4rmr7sy#lV?JI?3QWGCth6h%It<{!8uib*@ht z*yTxno%QOcgZovIZ#q~9SQ5|j6D$X;-Gdc^wSh^x{N(?oV67gk9Bhk=SLUS!V4J}z zr5yN~SI8NYMY5MyE${lw(~RM{G5&mKh8#F4CceJpvl0H3u1FnQ!IHr+HRdODonT2| zZa*r}%K8l~>_>^uo`d}ffUV~_@Yy=Ympw&n5bwWmb*Ay-@KRAA6`GmQXPnR#`i0PM zf}Vwff1b~rrK}=t4zkSopGMNmoHcl+Xz-lf@p7iFCnO8qFGoYat?_{2olN9Gh&+|l+X94!2ub?Y5Px3rg@|+!! zr;Mw@H`rhKsxNd5dD>;f=X0MWGFS`EreTs36`Nz=T)LA3)hDRJLwe8=VWUTrJ{QGkLk}C-+bpP(Y z1Mx)EW;;Id{AjH?C49m)viZ#2+e^u}J*GdjO~%772igvQ(K%P>p40Le&e3{HSbmPSD9@+QB9J&WrPJs6oUXFc8D0dT%okSE^|j*{{5iPNIOQT4%xC*RfBv6`>@ zLKO_cz`=Jr?akabr2m+25SVWztl;o*)ZC@r_}7Qb%qd-=E}o4{xwqf-4!w+9)rP&} z-25bYHtSXUEQQ#LG}4+z^+(u>EU*n8EFY}VgG~e5Og*~SOS8aKeE*R3Qav^)4tz4n zffWs=?A5*J88+}lLMdp%>UmeuA=vBy_5^D zlxI)YOLO2|pU^+#%%{u+>#@g;q?zy1-ExjFq;Qz_-j!%CM z{GRnv7kMwG%)7H*%EP8rC-vKBzb1us+5PoWCH#*a=d71vMVH9+QXT0@!}{&meD9r3 zS)<91zFumB{|e-r_0mi5yX1=Bg!(%7jIw^3vkjUtk+!uOEX#w{fn|cZ zeYo{t8DL?bUi#ujuyhaB3Kn!>mC$v9rGf3uwM+TC*!!{l5o@mnVEJI~GS!0RxiHbc z0W246Z|a}@9`!#iQvU+5GBCIPC19m4Onk)IU?pI;@%(MqUK^0rHqE%W9kuuiaFOF0MEQ23110bZ~Puc6YNS#!u5 zD(QX3%f5p$r7S_PG_W|H9Qoyv3I+0~AJMYiTV zC!a=1Wf#R>LYXzxTIf^qxQ;SI(w9TINfb)HeBLC0DObuN_ z9c|V#sn~(;pLW^zaGfG~MLOYy=#UFd(SH5*8tO=BzU3N9>{}~&&Xe-(CwUHCLoN9a z?YMt`=u;m=ri>n2Z0?XZ{`X0ohU%h-LzhsT(-!^v$glE1=3!YwJ-^D4#~Stu|BmV` zIeMKPZ|bZN+jBGepDy}efjm#0N#7{?fcYqWu>VS1R>3zDtRVp3Sz$dqvqDx(bZ=VLw%9q0pY)*8p&YWl>^)*5-xxBbLfYa9T*v(}J2azCVg zqvTNz&&+ThpRL?w9%A3F3g_`W^sYSW$fG2GupHqtn~mW4QS$CYR$(~r%Xgi(*tg7Z z-oG2nTh@kYA2I(TYl76FYwtggN@<^*7ZBOJ@z?+pBUG7rSvPs($xtrnb zIBcj~nIn@K^V>-?Ys-snF?}=Y+Hwcy7sbAf%5~O1C&2GoTZ;VIBL4_S{&#mGf1Wc7 z54R#dw&PR%U`%_r{9g*@gq<%i3 z-|xn|qEglpWHlV=td0K|)+O57HTru|V&A^_k+U|QBDzGbjW>{|j+9>rmWBKI^^9+ex}Z}FSlsWY)}89#FB?4g~> zk6veG@E;Pcv#TTJOPy7bz7+YU&gR?l_q5K^ktg=8Eyt;|9W0btbZEj<(k?GUm-Y)aG3^|K+?%X5W+oozz(kw5iAT zhYs@b2S4$(R)b~ZAG*(532hU2E_jO&@)H}=MR~iyM#CRC_D1)3aqkPx_FpA)5J$5H z<{8jm>eL;@wS2rT7qMA=Y@+WB50sx+9!X=q zul}4YvSa4y>cArZ6~141c#bvu*Nx~B1_Z%LdB;+nf3~qC?8bk@{}}D*|)( zpEj^U7bg05ffayV#Q5IH`IBFI1|A<~28A$@e>1(Cq?YCG*iFttJMS_3FT--$2XPJmCTLaBAio*^V11_! z#v=sl0_*l*aed%mNuh*5SdXfwg!VvTmTejC7Az_bf%0ow#N#f7zl#ZfPAx^A!l*w0;bN&Qrx2MdDLf=zSLWrKBi zumZ5`pY?|hcFkEOB5&%@IjbCe8u%QS%mrZ0E=>HKTCl9*e*0cBvo~wbfbsr=Z)SK8 zL+F~JTMFG}A}^AzG<=v?+H*T}>gP@@fk(mA*Nl4)mI9Uv=C1z?uoMrL3ziIK=43}+ z5m=fBD+9{_3-@cucMe#(2df4PdU)%=GCkOOupAHXMzCxT)(V#8;q3&=^)zu+;kOSqMsXE0w(2k*Ht~3)SsKK5lrgOjco#x z`g8NPfk}I~>AJwAecf1`vP}EBdDFn8eck;a3rzZpdmQG2#es##SEjTtHYNae6wiT^ zu5oM^j@CSRk8y5*lYEZpvfm+C4Sm58j!%Cm^g`r(_ahYxBPt_&wib5c?+e zW#q5<=JKoHuL;Y)AX2`J-zv*8{pC2GUA{5*6#QnuGZwnF(3PUc&ginC+YH?T=zb~k zekNx}!*@swzRz%yyw7mz`=$JDF$i z-29ht_jY8?gjUKI=9l~`z`W&K0w(2ikFR<#DPMSe6~Ma%J0|5@3>Y|ql_b8w74n{@ zb2nf3uDQ7}eA3zSmvU4n>!e6uW#G=WbnHP=W>@GKe2l>9$ddi)f%OONPktEz#@}>z z+q&M#a@tnLPZ4z0pWCqpyAKSWCz?fCCo&F%PJU7cm0(FT2FoT`4Okr5K|;h&u+?Dc z9&7_x9@r6v%BE`pD{)~tq_u<10jm@`>S@UPxU6IOJZZ#AQ0{|Dfjp=!wEqY{3c*@jnABS-SS#46JV%a+Sp#>S2;Bnc0wr#`aQ*&vfKKvgfG!g{_t++?Wngh0Yz~-|*VHTJ zlCo7h^4wS*m{-5`U|#(;f{A|adTDj!xyMo`nCKTCOKIdAh(*88hW1&Kj9%%aFa1sA ze3=7Q3w$zgVDw_ge(d(j11+FvPv zcQf)n9$2TCx!!(1V;6U>Rl&R9jOhCnP1wF_(#(E^c*17*k6$0_!UpX z?~3J!4Oj7&>ieW?x6Z;9BCGT)Ck{J5tjq4luB+isLKhQ<{k7;48M|IfdK>beM6JN- zJCh$h4!a%xEr&X>>mwrN7fSmw{)50(m+PJV7%mI+n_7Pd2CTULfGnFelb z+17=-v}HBW|KU51EqfGt*ZJKgl;z%<#>%Geyn}u!n-r;hIcMsIQyKz1IrRmPNx*L9v&00_1 z9ef9Mch2vMeQRZI*h2LL&I{|Z`!*{N{`P|%n{|@t5^1waNiX@WW3zs`Gx^bNRvr8e z$e$?sjf<2oHmiyBO~^NUM~SxlJ+)auIi_ zDPUMlr+>4yaqh)4_xwew)IcRnJT`v2@i-;(tv&%4WCQcRy z#{W&me?h+2hUS2Gf&WVK1YKSUT7i z7bb0(1GX9LHeobAi5cH!e~Go%TzOw>ci*9_LRJp;*R97=uxuArNj7W2vcS$0A8RkY zH<>jGdwWh~+&v#`8dz9=S^rN1D+YU=XV+OwVwcqc;xW!yOyBi(NM@khNl3=D!&3OW zTr#C?)`E3{x!bx4Y&)2HuG|dP0T!MsrEkU!r~Sdq`(UFl{nlq0ry=i=1Dvyry;a6W zyI!p^YVIzmo>0{yNm(DaLNZfg6A4{JEy= zJ3B*I1^q|+JO0j8=w1F!C3*Cb?*#PsuF+~qOC}$;ztaG=X%GFK?M`_<7W+YaeUp2! zGsaqK{rS=ToiglFBWcFpx!@AFJv8xG^G#fN!*U1yPCfkXQy|L>IG0d+TC!iS&1hNKg8^(&yf5g*JzSwIy8+H z{UO;N3LG8I)A%Ijy+@NLcE!0TVe0Tw-}uQrX1*wfXXgCKd3q*TnFp%?EA?PYz)Cz=J=io4)(BP%7WO%e{Rb-o8zyDqC-v6` zRtP5RA6Gf$4(I~AswwC(_8rhk`%%aRkurl|eV%->!MZ*96o7T@WT5xy#c4RtvT}5FXM9uk(r52 zxN#hFlgRu7GNY`wvi8USSkxc7OLXHWwj>{H=3>qX3SjJBc;Cf0z&vQZGxPEx)=y)Gf69#J;TsE4^;0eQTEd!7Ch{#FmSF+q|?tv$%bz!3a9IzU&y{Ug6I#kw0>YscN{T|G%e>zyB3lsfwz}AE9 zP5n2ZL)}f0`nQ0!g1Pl?2ixMpME`EE&0rVpy#N1K&j3~&%>LZXgRwy~|A8gl5~+VZ zSey$J{TsmoV0VfB+ewj&2eFsq|E^<2iu$a_n|}G%1Hf_ze79;%&mVqSceM}{d2(D!S<&9 z8_*$nRiyqcU?pH~{oBE&xiHbc8>|>?Z|Yxh2=-@nr2b35Hi5bIuLs-c!bJZ@ux7Bm zsekUFtha89)V~NU_x4Er%fND6nCL$TEE{ZZ>feVBrE4PfPtLH^TCi~a%Ni;jY&F=} z0l&?42D#T~7Oe6eAT$1))^Of7M~)_BL0q#H?TY(cxO6^@t!lXE40*ytn>b4`?s!hPO@G|o`C)R zXy|%D%8^N0OJjeijA!`?mIs#kz@W~86@z7fT`WZW1e*y~@4+g-f)DnGstlD)w*;)# zgVlqjKE&B#moMB1mi@?3U$_N47u>AtoxIz@7Pv68{s-F(_7BNB^2{(F$|BIfQbXv1 zECwC#=*-?Qe+yOuw#0+Y2CD^g_k}93r5cRFyFZqdneP9h9EO`?CkB2uMtkHwzfUO5}>sJWYfvn$+v35tfNchImv=i@n+H>w%y(en@hNaf0`hL@SLqGCQbTFj->IE z|IY+Vp$_)soI*XkQl5{+*E8$u-9KB^25-qfqsQ&jumPo{oh|n8sdJn)a+I@GH3SYK zPEOnRjFrHD?Qkcyd?oy@HF5^3mK;w1cz^fe_N$SV|F{#kKQ*iiHheeZ_8su=i!LT^ zKS^|njN8XC)|-)U&Q=|;Gx^cu_F~`O9p=RCznm2zzfjtj^z3FQZvO%4v{UqW_3p*( z8eli{dw@H4HaeIkzv_doc$^Hq)yycn`Dljy^9(d1(rsApgX^btXA& z7O?YoO~)z^nkHzrhx6(9qp8<#noj_Gus)p6qsZ{=amqXw_g&iWseW^}OJoe|qJhYi z&}Bh4YZr7`&`pD`9=hN2?20=R>l!?RKP8bfz`Q>yQ9X%oRm0N;k2`)ZdDeq>fFBbn zixVC2yUyQlf-ZTZ^L{`?Ouua4{JqHQf-YwlbkgtA2tbxX=bl@$z)Cz=KG-xc_uMcI ztk{Fi0xJR=CgtEKc~pWGdaxR>0x);JtHJU;*aomXFp(oa`F{&ot_N!elkz4RDx0nw zEZc)69m#su!y5$4^kCUw87^M2bp>GQVDw_gMw@*a+KBIfP7m+t*m;*jJJZE4dM^Mg z19R75Etu55dwy*Illphhugzc?AMSX5Z6|$5`N5?8VL75hQnp=w%!By}76g;>k8)wz zU?R_r6@W?mg#AD1&m~~e-tPV^GRwiGzerz{pD90BxeJrDTCgQxlY}UuKNIJ+x2R0~ zxf!~p&>c2F7d|^b_$>{|V>@(p(7EeVeII|+gQb9pJa=1UfYo@gTrknkO;-d~4d(8< zWnc?DbaTL}z}&i2gH?is+eFqQbzl`AL~q+r$Wr`EyxGz>2UJ4l}yrsAJ)N-GG z!>9UvHaI4Q|9@@i*W=WSKHV0lE{(Tyfgye(kF)jlMp$5&&5)MC|Cd{5KN_#@@ad=G zRh|Db{b0Q6jkD87#OfZOO4X11)aNFT<-fFkmPOi$dRd%0kB93meS4g0v<{%+Q7}#| z6}o$T`jR;HnLOU$*Z0J!7XJd=nvQ^87-#iL5mst_Rh-(W@5L)&ebhpsmLFyvG=`)f zEVSP7tAAViQ@^V6X`T^xWk7ZK79vBuBh~r5(AW8_g+5!GjcMwSuwG;7mNd1_I^d!4 z)_azIa=d?mPxFj`W#j!X`^NJ;->(;s_dn|we4AfajrU&}IF0A-fZmekZ`Ojps`b`1 z|79`ytMUGaVgz|PMmLQ2e;qT1=T)%{zLn$sU&ZV8@p?sqBtMX#A5QbXW}d4Ob=Cg< zm5GA4B%;-S67>t?)#XV%-kYSik5{kD3rNEI0sUIMTA^=2-u4)H zFOU7idMMuS7C&2LhpaLGAo)d0_xlyIHMi3H^yhv_2pnl!h|u!iSThcSXwqS=iRyg1 zdYz@WC#riaeP@z-%L3@P^nViRHJE}&Q7lpYGjKO$SQx86NwhY_^XAPZ3G%ot@d%}E zOVW=gsYj&xo|FHellg^~f8RRnI{>HYwK3{OpRS2f&-!$IjC#ZO{n{9HlYgK4VpOkR z-yLIJt2Kzt8CpKZN;(d{pXpzyvO$3qA#2JyYi)w6_vt4S)Iz_0BtgC7*C1C?R|#sa z)(<48_qBdDLA@0tI6TR*dIF>6XDVIKTwgv}y%f-&{XkV}{lO1ZORRo;vg(i34^39r zCFA90t>qxzBvT94!&rVji?4w_rtXlTbuTNH& z?yEnTtUljQkiPx(*2!wwLHe`F>cMo~3;vy7&COAjhw246>fS^3k{tEnp}Hv^{Y<8+JCyvMIaK#gQkP{2Q|-iB zTeGC+tty^g^JUEEe<-{ByVjvU)m*{;8~v!?`iFkXZ#`|v-yd80e!qnUxyx^TC&3K)!eyU5<>Ez@jgqELSO})d?i(=Gcmi|nuHlJP)BewG+ts4EhGDf}W*Y9iV zOTWG<#(FN04RVXt?b_O)b+5Kw(+ME!WAyE@>fbT?OFDDxpm=osj+Hi5f8kTNSo#y6 z^`0+*=NtWyyy4e90}4t59Co?C(XSqrH2zG+G~$2w^pb$O(V0We`lnBC45}sm;~ogA ze!6&2-KBL)P<^eByFI8rh|w#9sy*)5YlG_fc)dQT-cHnS1l9GUj;jl*d874RLDiIU z+_s>)V~l=0sBRs1?DC+xGF5L0s!azRXR@ubVl}lrTF>>X19YcPP0}y<)nt90rH<8) z_|&Po$D&)T_p9IOMLzXsNw`Reud+Bh^*B?R#Z16}_}mhr1wPOReEJ2S+T;WMz$fCq zmPh6pGP+BK*mHip(Nb?q$v>o4Xq(XTZlCp*?@>#y&Qu>*dSRyOu_nJmSMn7-oXMn` z-H@q14e0&}>Po%J*FC|%DONu-$^UGeZp_rL#7}-@QtZtM^uze45;V`93Hqwc_^T52 zW0Ml=6ZM0W5+6(y{JBJZ*QEH5#p2$Yq>=w%QZbTihv^>Ek$HY;nErHfHw@R; zOpO262z^OrY-oi3&m^@rSwBBXZ5*j@pA>udSpDyb@y%oPvlHWQ7^nLt#@~{v-=7%Y zl&ZTX>f83wZ%@=;?lTo-uiHvvQ28v*}$ z`gu#uxAbO9Jt4huzE3~qi@(~hztsMFbOOvp7yQ`Scwz>I%Q!8Yh+wq6J?LPg?DD_XjesPrQ@$1({sTTtJol&YkpnFEDTVt|#Z#h<9 zHA?lx>SZLx>6=HXh4K3KQR?k@ea|ShC_z8SbHWOu-B%3PmyA-kjG!p@jnE56nW7XP zXNq!G>c!Lnp5!fK)pdToW~^koZmhy{duXhBAfR6wquvYXtH;WWynL)`)-S|x*IJVP zV2pYxNq;s*RSwg=W7JA!!m+Ann7(|hx@EY2eT;f^xZXO(Wc90=(pN*vt2ItwW=}w= z2eq!5ff+=j+hcU?4E0*9UOU6z8@vC@GyIhaWod6lRrk27sLFfy(er1hYxdQzmZ+Ea zooB&)Pnup?;(sx1|79iqOUCQ9XZjb7&${VM|GfQmsKmcwfBnLA{}blFnZo00Ypl_J2H<{<|33~N(y>z0!WV*iU zaQ$3~#)G)_Ougku{dS3d?@0aFnYuDt-_L(1Prar@cTCprP1o1|u(W5oe)&g2b91hK z>kR!+uHJlx-fEr~|5!hLhQ9sBg1`J@{m(P>jX%*J&QSONL_boZF8`^1WV*gTPuHEH zU&zx7&(IeiqpvwbFF!`Ve5UR_Rw(Q9^}o(k-TC_cU+OE5(`(Mq_Z%nBuOFxHJ41hA zo^Lx|Z!ghHr-%-#rs%n6>X)YI?lbgl1)~4Df@Ky7FP^a2LW{L0Js(RYR8GChqWoVJ zUuls^%`fI#fa^}b(xOpcp0?N`2V=U#Y^FR;oQi*;PpaG zCFrXY^>c};JrVEvg{14PI)>aZea9$u<8aOM#^L&QD2EG8SaqoGi%~z)T`}rpy*-AP z<=bPJ>04veJm!KJSwc3)aP5WO6r-4-H^j)2VttI-W{ER@m2u-&`ow8(3_JE+TD|Gh zRWY*SXxFOBud8FkJZ#tMcE9e^>S4de0=D?|X05jR^(L)01_&@K<9uO6cwwDjCD7IVWbWBm9YEV6uh-5B+h_~aPB=JERRVzp@h!+3sfe_c6MeZ9Y~n`$jQKrfwYJ#xSi z;59-0(rIdQ@Q_D}b^pN{cOwcb*wKh%=(oZJnj?>ib6EnA-reB}t*W2)*(&Rg#dD(>UzI^ zc9?qFuV09_UiRykUDAI zl~{S6AFtnxSJm-H!L=%3y|rbS>cpWQrs|UP1Ea0AN&2Bt)`v+NeAzJl(r9(%aQzPB zcDOKCkI*lVP*;xl5zk+Y(7hwnqGXi&Dp|iaQhl8)@Y5r8?@0CXNd4YOb?qp>L>&+NLg=PHcq`TMqfKlT|8DVA7?EZs~4tPFOJpVp|N^hs(NIc zzBN@nKJF-x!HTJPMCxUv6)#KHQ_pzHl7NHh(<808VS1E05Zs1jSjoThWZ^nPU!S0; z$wdijrKK-U5XWj|f~;2_PEb7oeRqPoE=GSIuhz%vrxPS(Md~&2l3Hh;SDWX10!7>6D1we%%E^{gmP(CT{Pc@~BM z`o!gy{>ZN?{X|pvGcL@)^ACRj^-@c}hgGyBY*XjgE46C!>up+HruCXw^^BHPXPds5 z%;(4In`6}tj?c>S|HQD{ydqgi@%jSA3dF|38#Rh>ZY(PY=YZuVW5t_~rsq^U&Z; z|0-+M0kTGII6!UPcTIpl5S}qk6O53CI6>V1vvjkiF3|X}S6VC^m{;!bsnw1msZx>+ z)(zHs!_@6szdlT@Nm?U+Am?D095!dqg7N~*oN*=5G$dHp*cJBeD?^&}Ql>#akulw5 z+GcdP$>}2>TJ(`0+8yJ!daa*Z(w&~OFx@be23+n*kWIru+=bzv?$)ZDfs4f2`H> ze*LaijK}w5)!SO%7pq>B5aUNNdR45dlI~d-tLX>-j@4UZCAeiW4SZjpBAF+R(?^lp z_Xvi8FF(*4`!~JKr*2@B_^bu8-e=)dKM)166+ULh4VHSyQ7Yk>Q-u_|r3KmO5yguN~OxfajnL9HGah2Qp1tc;bIBB7q-jONQ}UP6Cr*=5bhV}H!e-{LrZP^`^uU?=9JRzsH-s-)`GiRx!yb)Qcl!0} z(dx^9f9q&fr}exP)q+_Vt~#`SV~o0(Y96ibh}CzFRZkG9Nmd)<^uNZcO$mD2aCLPO zO5B}v*vDg3dy;;43|rLzn}_LF$Exdxi}aPlMb_i2q(-afhl`Z9;llr!tmTMk0N#u_t8JsPiXN|I>; z&njMjnV_~On(e93^6^&6_d$QD=fzknVkAPmPC6hpZ053%^_O$`^C?Sz$s!jYaJ0I_ zC(m!h>gv&IL7c7|tyT;Zq-hvq@!H`v)?Fji^CNU;vf4I6^ZbF#%S%V@gRq1acOTBW#5Ki9vy){4i|SDpd2StyU&( zuupcfHuz>6hSRbSghXFCOf9r7Vz=BkH)i2*wN9Gyh4{nPCaJ0f-I%1Bq$JNJoI~1{ zL?S6$h<6WHA4!j0I7}}artTl6tA?wOhY>45jTw`XdcLk5t`=FV(CmKSJ+W^OQ@2Q@ z?w^T=wGLNZiTcSAszC%il60v>;>E*t<8XD|a5!HcuAd*FLc{gE5fZ0(cm!X5`vs#p zS>Kf`;z#7bcAnU5w&jRZ0*wpXs$Y|Y`N2-UVA-?Y{xWIdr#!)4jQ=j{op@ClqyHVR zE{=Q90)rXX;Cyx1*~VUAmL3wuS|5gwjVzoD`oKBXZ*q}xwx&kT=iwPk|1&|to%M;T zI-o0usecm>NmR??1b>4#W`flde;BEEQhx~+TUCn_)j}!%rX>Akl6ogeSU;8WGt4&< zTN);u)RpOT*xG9?{anE6^-ncp@OrIQi;=Pk49z~)$REC9E%8}wnqa9|t%Z{%#y(;8 z_n*<~E}y>GgvIaCR;B+^0xoPgC6I832zy8C_jEYVkadOcyZZeMm9JlzM3nuBNd)X3 zn4~V$cTB?8>6<1=6#SY=>OMg*7kbu+532Kej*H2LQYrSZKdQ$6)Cnz=#KhIFxwSFN(g|vPmL$Ne? zAVaN;(RXC1#u$B5hQbTICWAGCzAQt17^C|SRh4Xb9jeyEel(6PwFC6FL)Ak;CK1(p zkbWaW-JJdirjMQxIP4Jf|D*|Mb27c;Pj;UgD`sn%rN2m0D`MvdI0bRH7;88({^R@k zWAW;BQU50V7M??~$5Pkvx+y`;PtX7l$!LOh>>v66e4OYwihe`j?Kp|qnUs;Y_`V>g zXAaa|2NFxNGtKDto%bSpWYTmYeY20}p12ttJxS1864mvI8sH`AVxq%TN!OyKWC?8JM z@1?4D!r=e2_b%{J6zTeZb!KXEA&>|G!o5KVC;^fH5xkC~QP&&lZVv0Z$8lGqtGKeR zW;yPzXXFw=5fCsSAdaXJK@o2O5n)6PE}$Z6R6rfMM8pfA7!XnZZ*@KIn0^gLf9H69 zp5LE*KJZL`yHZut)6>t>)zzJ;DYaD5%&z){u4)C|Kz8ZYFdbJ;)?c5j>QAQC-hNC^ zpS(BadUIGj5L}+QrC8nCN^dw`eb7d~cDx$fmIj;Dw6=PDvD(#EKXJTzFjv!L!!^0O z{us3(SASBhs@rM$t=l@7wQqLN^N&}Lb~LYdb=037r{3j#fhs|M>$ z$Ev%IH4Q&?tX_AlT63(a=Jn(B-s99q$C-}aa-xo%q$*F;(@#>lEsMohs%Yt+WF!r>hm0FXbA8n;-Gt8*+W)_QImb$1){`u#Si(>3e1`j&R;KwJH7uByq^cePWm~!_ z*O4?4j`rmqG&$k@=IV30`qZ3;VqOibZf*wDKW?s8rJq2r>3z^^D%iZOe!#e2kvf&? zA#fy}73~brNrSEnm}^?^2Gnwj!~yko!0@%^+wtRzb)oZJx={FVik?Cj76N)ss=6(x zD^k_A;B6`UL#C!+cQSv{eGUzetr@J|*7}Y?YMa*24N}k11(iW+PMWSAq&~{fI|rLD z?puS^_-1;`V6~$8T!&WEq=c_&MYbvW?h$51WsZ4W(MGQrY%U>h9;8-x)RP9Qm7Vn6 zgH&B7^ZMy7xuXZGI@gq3(@pOmq;}_h7#KT9)#U3Z2CE(U`oY0!c0WyIbfJD~kh-z%%n=9Zn)WfK zL+>ABI`Q!_rp~>`n6A*9?=;5*e!9N5f-Wv;{ZP;xvR>C_n4ex#fwQmFn={lN?^+L? z&wfHfHX)NNXQ%2f)6~?oPV{=`N@%VtIBi#e^ zc^;t_(G{`QYD!SAZf!FAokysRAsU%f)oFpxa@6~2dS_cTE?sZWF@q(Waui($+n=Kz zr)wT<)#~PYLtC|#f>5s7*IaLDt8S$+-L|T#gh}EWa zS`bvX2eWCmSRIZhofkT0gnVL3Rmz<-u&%Rd;TxSnua}#%AJdgC%}dnD{;p&c{%RJ@ z{Wjm71|6i5r>j$%VBWEx=4VYyx$rVNyGYfe2dGt9`t$y3SGK;pSgmfQCk}LO%hA&Z zI=8mgAN5zW+vtyqoRw|$ZT*}H?erbR>Xr6-Y_XcyQGZ#a#<}|4{%W_YU+b^NcGHXd zs?WOVg?-f%y-dwCeoVi+v$r1APgUnB*M9 zv`ID;(SP?1&|3$nr_K1;rvvn;f$AIcGG44-rT1N|-!5*DnQ5NUTaI4T!hDD;Tc}rp z`oR`-pc)f+x`mq5{L(os)ZXT1#po7C5Si+oR?|3$2!Gv9rv|pAu1R?yOHIqvv$Ir1 zb4{w^&HPW_iKa`KQv5ILBD&E05)Cbw;WV1iK&u{d%x-gmezcAHgGsA5=#9B%JnPk5 zMbn6$&oyIwi*wcMj$V*!CNSKSYbNnc&872VeM_#ohX&Q!nv+60+P|1$j__}%=(pOM zc`<9+s!DPmI@;6q^0w;ffPS#8@uFF6)%!F9vaR|&phve=V`=26jhaChG1{mFLH&Lk zwVbZ0w=tLVSGA#MYMZOz11B*w5NOCJf~5PKG2NLr}Y=j%!$~e&78-zzB`jf zoQLdAS5s2W>(!|#`_s(@NFtleNyfBhdPy@iznNJ{vt?dyrsA1;W2UOjG{n|UZOuB( zDPBfX95U2%&fqsQ)FwKbW|(U*qv(`2m@?5!6Vx-Csm;OuJIHrahi}XXOiVYCk7KD? z`+%vZ&~Xc>*>Tj%fEmkMK_}-anx1G&mk9%EX@FiPe}jf?%i-m@7$J3Q!!|f z56w*a@Mb(XR#7#=w;?1s%Flbc{sK%xI+aGBKrPGB{~F+IZmkdYcJ}A$Y58h-dp#~+ecM5QL%&P23Hqyf zUG(<;>Iv7>Ho2=Q|717)c7a-dq<*zPE$ptR6{wew&Y)H{9c@~vJKEH|>u6Kk{-aH8 zV|ts~#`iXBC-ydLr}j2$XY@8}@AlR{)Z6sxsoth1&-FI_e7ScUYH>$z)B2dcdVF8? zdO!LEzUrs%E>M#SOtW$GDZX5!EBdP~<{*2pNKfjo?(DDU_g4?}C&0T7eda$j4l&s2 zcilir$TSWyBSe>pXE@)`5TMrghManxK`SQE`FY5p?>Swr-q~Pi(0r_uQcj|lE;Fa@ z*PAnUI#Z@I_s40-p{JSAMCa@qX*9j3qH(vEd#amh$f2j2Mj5H6qJ(pIPqmZ=9(t;m zX*P3DGc#~(PcyOQt2|XfLk@Xn@BSdq3_`q_XRho%kY}!3KbuF>M)mD^YCH`>^a!h-@u)TVSOMdRWOeJYtfNtB|&qlS+Sw@~z+f_%qsjqo-LV6PI+vhta zWwgQR*!Vn6uqSh%Q<4<@YMME{UXVr;oz0ZCeE~f+O;ywJhNia#_1CHDA+2|&s(*#d zRh8W#nnr?)oZfMY#*?+4>ClBNs`-6KXP7hFR%~(Sy0Um=oe|8Nr3S5paHv0rlu>bG*4xQ)?-5|?!Bftel)CX z4j2vEI>WT}T>wZsng;RyKt;^G4o8x0zZ?jBMT3-q0G;O1|1=apgx>460L=}ia&%Dp zXO6Aohr)luHu!bZW|c`}s2f5wxyVeypFLos-B^tja2o1Ft93>#%GVC zQ;{un#+<4i2@NB1S1R>wA%%LH2br2hb0z7wgB{KLq7jbkNN+UP0B&`5I#lzPz)AG~ z>%ms^|4Kd1AXB`(E#B;RdN$qQ!PlaLLoM!g9_i(JU52_Y@1IaSuhx%esGDBaRT=7u)RXA{`_fv`|I^aPIV25AA8AXkOH-qq zD_=-cucr*5|KoudQ%IJkMjes{{p=Q@%CFSBLTbd7Tj^Xb==Xb#|oF^_i3C|1SbJ(f_OU27}&Dy|O-CeVeA~|2NV#5%c@z+7xNWt4Oai z(@1W5GKKE6nW`i7|AtW1A!*RgPlyY&&*8e!5WPCZ*^;8Sr-luK3A8}3Lpu?YPNR7PHsiKQaDJRkYTLJ^={{z98L1u&a_km~A)L-v*XgV#G zrvJADM$-RJ>SYEcOH;-?)_$rLndU!nu z)XqyfgI?1Yi(bDP(jSLZorxWRvF7V#zWR21e&1Vpu>Z5>G}!+}aBp+I@o_fC7t3OJVie=MBQ&r@yxz@np0#BSl>FA%%rm)8vD^S?OM~tEt=rH zRjXAr*;}if-fOy`M%EyX@DvB{^0s`-^Yq%FnwxTmLoy}k(*I^p!%1_qQ)!9S>GvL)ZLl7x{FhjspoWY7Psg^d{y=p^#7DrxwLjp>p#EJC9tQBrq|E3)hoL= zJKNr1*0wuse`gxIy`Em*+(Fap+K#5JjU9&)d7)DW`k(F^Ao6Z!(>k3a{Zsv8hPOL< z+w7QAsmC|z(GL9;GEIN1Xt$%+&{P;Y$JFYXfc_$A=E^&2Dou|Ms%Om0H?^*JXs1s3 z=YR(F6#WO)b8E^aRdoIt&oLv1oGy`~F;-VFdgccn|@)9q(i zY>$_(&_D@Yirzrii-RZ8|M!vIkStAIV%S?5e_YWbu%}rUdOfR!rvH;kBIeao=yW}c zenXY&CsSxzCbhVN&bw30wbi|j`rLb+{1r9a`<*cCcboHBbC9!7)wen<7)5`LmrskJ=n%dU) zG_}3u@eg{MI_tc(AA4(ed27G)_|3gc{kQirZQbR)UfN54*h{S=(o5ZX)O|G2cz3>j zAzwX_PcvSs`sf9H)boAyOMTUDGh*>UKmBpPhR3)Aj`M}L9qLl`*uH9UmVTQ0pRH&0 zQHzhzi~2Y;FY(?2XK714v9DU*O0Vqee9}sPRN!oCt-t9<52Vz07O3}f^{Aswh8|y_ zsyga5G``o#)Ha#!T`6#$>S8X~#$CPeD0P2VbM5uZo*C52m|mupiM>qCGkTfY=JqnR zJ?QbrdYL+_y|vGHYvbP97d`%3FH`@!y-Zsld9QChN-sW2#f~!dZ#ar(KB;IQ{a_ze z+2>lNZtth3^i#9?={5b-3kCWW^LG->4}GQm=kZMs3^iTC)XM)F89LhQ7*qL;UYbim zX<|n;Qjh9r#$oC^m!vH$At5$$6C> z)GI0a)(+<4__ys%B>23&x#6*{y?Tsh8Mim1%+>AH8v#APz50+YO0+lM(kbm}h*`hV zo*`B^{x}v?Rp}RlYsds|xX6ma@%G)$GH(h^`u3k^qM99WxP?|J0x5OKK zq9G{44ZQlF&J9=T&6zay>+LKv<9aKd?9i6VGL!F@W~mu;l%g@#pnk7~x+ka?w@^>f z%$XL>?qJ9H=2Yn4sO0uky@LjE>3U$MnUq8)L6g$;+AK9I<7iq-vn^=tyP2l8Ix~*5 zt_5A-#a!ZP3;~-8HQG{ZT;lI zY40=f#{Drawa6Qnx~IPxms&m0j7vQ;z>G`L-TX8zRoUN+OH~$`aj7+Z&A8O^fo5Fl z@quPsYHpF**hSykU#)cYw?%4OSG~87daj%PtdIJlr>2_eXhpyKXm2{2sQTU+)XLa= z)5@fLQ}bQK|lo7x`t)-LweF7wtt=dGoSlC*YxzUkY0`KD&NKuP_nrz7A1 zXH*~42f7|WtGDv+rlRZl}}l{f~{|PfmHCh8t#f(=T*WD|ih5=L>jaD4{*sPQOP72hMVv z9h&~9p6a0A@1QpDD9CnaHkEv%o&J_Cz;nsZ9U9SA4|LG4c2KLi#+J%uJRI{&Po>=4kanw!h= zk2a@~Tm4LPhfe${YQGlz6pD9!akJOJBs_otN-U1r;&7f8u?rmDB?rmz0_cpby z?rmy&qqnK;9dGS>-r6nR+U?%jPrbEY^)|htZ#VVi4)bkw?#^#REiR?+=>YXcU;R#B zRc%f>Hx=k;q58bQG<%;h$VL6lHNYD4t=!z-T!7ryU*A4JjWgfP@4k=bJiuhpX(^Y` z6EuU z{Q>6`R-?mW|lmlp*FO9^tF&4C;jd?u7D{ah! zMOL;^+h|fal?mL@%6lKdj@{|VZ}u;`|DF8!=esU+vQu;!ZM(nfY3XX@paW@UE;?;t zN-#^(X?A(a!|7(cd|Wz>ln;*4>(JFNq$h1tExFC~aiG(~>?&i-hd^(QF3`|hyE|xZ z9dpc`WAvzoZT<^GQS*Crk^CrqvO3;=bZn77%k_G1-)Q=peUIkn&@5p43E)ICt#Nj? zGWJ4mfxDg7tNA7BB0p{#zEC zZ*8r&cB8j8;jP`~t=-+*^y-`5rYGa`O+W9!Q(2~we|r)OalD!P4tCQT6Rt|u0$QTa~= zsD?_@Yr2b$YIwlBobSDSvcOcfyueiUQh}*#eSxWr4yROEU4f}=SAnT)e}Sp&pjUoO zp(#JU(3GE8Xv$A5H05U$n(}uSn(}iCP5Fn+rlI$tcQ`bxL*K!l?Hb*U_7dIhu5^iR zT32(4?uD*&L+K8hWcYbVf9R@>sb*U3ESj*@Rn=$c1FouQrXTKVrmMc{s)w8DZ8Sf$ znI1>KMc1mks%_2mMpx}?rq^{f&+yshsyUfD)|GCIFb}Xd| z`~_YO`yWnsdw+Dg`#-%JMw`27cWk8JbIBJcO;8Whdce>M>KFh&0>5QqiL|8&C;ktK8$ zI^fV$5E~ySoAN)LNgHfMQ}pcN`u=qFfum=otJhM@tq!*a19SuDg5cm+GR&O=M7Gea zfP}WDQ7fa;^(*G)*sM3`P98HGl4cAp%}@_#m}*RgT~8)B)QklVyOaiIAEXN~nr`{N zkpABgr0Xws+A%Hz{DgxmZNC$o0mem#noCE+eovQ)X3;f<40Rh_2Oy!)H<9k0(DPGh z;Z3@w3|^qSsi(2Ql0%0tNiok9Qq;Tit-)9K%~c6t(xK=DxiAqM>yQOVoe z>&5NW<6N@wLH|*w_~v!d=bbzUqIol$XnK8f{X~%&pIBF9#wThE%=pCn1!jC=evuiU zc)=T=u=8f_XfSVP8~tu)J*UXbo0;y-o1xlh-VBwec{4lvsZ~enx_;`u?s`E#GjE1k zp?NdZ3eB6LnrYq))s~z$L$%So8Cpy8W@s(Vo1wMIc{8+@=FL#AlJjP$pEPfVTBLb1 zrgbw8v9hmTMZ=~2^ppKmRX@}0TV^87Q-%7oLbb+t@P~zZZ=w38P){jRx0_Lm@AlL0 zwhNsbuIO*h4QUjG&JCaFZ_W*$E;Q$cD+|rJ;qCp+x#5HTzdJYlpuxG}OEe{?i@v$P zIXB!-HMpiWIya>9bZ)r5z?>WYtH7KaPV~+VsTDdmq*mzMkZPuLL#i!#Zb-G!xgo8k zb3D-Wdl{`13e$u%iwMgfN)Ow}a01x!j^ZThU`swKfYCHv)0=3j+ zpBY8^wIa39Y=+fEdP9*)6qyO2yZqbb|H9br8SV9oR_bVTm%|C>mb{^QK@MG8q$%0u z=II{e9eoSkr|0OeTd7CshJse+Ax3ns<(rOvtChKzcTFobJ%tB3I?>znGS|;CR{B}C z`iFj_xw&)wjx2L_Sl`0Tup5_Urm@o>bf*c1k7cXLGz*0$g9P>GS2=v^U7CI;TirufTC?f6e-y2Ks<~PFTys;~<`(oe?#R~jva!pWXKDPH zvC3MbD_B_hzN_RWb-F=!KUEmbVd}f7 z=UQqCzc1(P)Z4o%dL|J4!c5ov!c(r^)ZJV`BC^LL-@2xXab3+XPw8qZn%&j>a#dGT z(SojK?IMpq<&|0L@fBW~HC;_@%ey^IVVXL7Ol9!$nwI8XHhQenf^>5S58Yt4u%%j& zc}vQcmTF8^Z+ZgMo7uXurP@cgkq~LAiO{dM>PheS_cSYl&g$t#p-pBwf!V%?xBpMr z{%6hzUjAWgGh>lPQ0ZA2^q4D}bxRNBU6pyzp-1%4_Wz=_xkH&&+(+M{Hs+Z%>szZ& zTj`qC>b}OYd+Fv9h&q+w~AeSqgi)^6U_6f^KKqH!(*+@!zLCx&V@bZ zIo@MNRRNdnL1pPHL|;eM(J(p||FtXK$>t3E^t(1qZ}RoEUaxX(uYz6m)yZY=_ZsW_ zk7c3ZV^f~;wHF#bzTvy}w!`R#We&X^er;xci|r8h*!Qpd5;GiJtN>e?$Aq`T|7SEj7gz8@K@3e3MmfVYQ#q4wL{OC%E`J+ zot(AaQ5Vr8z9u+XV^Y-9PS!4ZDyDM`%Dz$VwXZMJG;N+b5i2lZ>I4qefut1t8niBxC4d6Z5()lhn9CINh3y<<2%qoZ|8-B%r@ zPYIYutX!k7Q#YIO#qSDH)6MBJ$>LNsK4qbP-kt-QM(M}QcRjtBp2_u+)AiE~XRkw} zEOfH^Je`lF(90RY^VerMck9j{WY9AQ2~4Kv_hdMp@y;(hpk4u?(c%#i8LDMHE1n53ndigC~3{P>Uq_p*(lS+?8 z*~&Y|*6Yph{on^rV3I_%rVj2f+)?r}Q)L8_iDFuZPqh zx9U}PqTdC!%`=^o2hl?&X}{Q$M*BrJoi@@+j?k61@@Td+S|M7sk$nDkFnaFmnv5pZ)um^4RzHt?k#D_eW(L>|1XbcF5ySuGQ- zpWw0Yw|PC6ZO~@q|Der$uBSnpxrb;|aoGlKe)5+ec%L*9eb$9*yyG6tVl%rGZKreS zxjDIJe(RW^^Y87HInDYq;7oJq;M%Cx<=*TrMkoC2ujF>fB z)8vLMx)tW0Af>=(gISAcEW^AUt+S?u=;1g=nuq#i(WA0&4VBp7d9l~#8xFlk9G%|F zNgkbE%}E}ersgD%PIGgTN2kYfl1C?c;_53QI#8{o2RP<9Z>G}Af2HY%T05K4=;gX} zJ+rm5C7oWrMGqHg?d-^)m+v*xpXNBbo6*Z{nfgGEGo2o|p5rXereQVbt!zy#?akKI z$n+!36J1x*gxwtH^CL{Hb6c7U*S9ovjcR48dAyaW;jLD7M;>#v*_P)!XXcngUf3M* z%n>l^w4mn>KJ2tu?HvJ^m?L0|Vf3``7IOnMM3%LHp864JF)c`s6KFwm5S9m9RL~Uk zV2eqbj*)~n1q|94=W$G-m^Si)r+d`>oC{y411_Nan-oumJH)zJwc{fwC0!qX^J zL9=<;TYLDw!&~6+7C5{G4sU_~O}$imBaR;Vp1@3mo18hqu7tEpT`X z9Nq$lx4_{oaCi$G-U5fW!2c^-Ao|u1T&VsLZ_<7HzxMk-qKW?}iiGKb9}RzEVp(nQ zuWwlP@azBj7Kr`Awr_aj|L)H_vdQ27xL9`I^{@Z0e}ac=Xt)L9zp(8adG8nYdB6Y5 z>QC%{xIgBeNAt7qV|yinm$N?cFZUA5$BE_h#qv#JxmqlLA(p#+>TmC2u{=vGuNBMt z#d0_Lvohv~-_LKv^6g@Iu~_~@Ea%Z(ybbHSKrH`VEYA_kYsK;bvD}aTFhRrme=U~B zi{(XP`3zrG=2d5lazrdo6U%GF@*c6=hyIjD z!}^Db<)~P$6w42b`BSm{wODRJPvmI0{avwqqFDZmSgsPw?}_EyZ~XP2DweMi%hSd3 z3bDLLEcgD_U;pJ|`ChU7s#xAHmh%q!>l-STFA~cW#quh#{Eb*1r0ncu_OHvu@+7gm zR4i{1%Lm1B3-b&*`r-O}isi6aK2I!PEtdZwmM4hiSz`GCvHXNs_MVYP{j+yP(K9lz zKFjO1Ql|%O|1+_yqICZ}{WQmNZabUn=rJJPPb6;dv!Vw=c|W;$=(?injkNvpSm){KcWcncif0*AN2;Vp1@3;go8K-y@!DXy|5}Q`$iDpvBML!;3?G!I$~ErFIo%b?}Z z3TP#?3R(@Vf!0Fnp!Lwu7_<+~gBC+eprz0Cnhv<_Mi4bij1%ugF=9<&%*0xgA>LCc{P&`M|(v>I9i zt%cS>>!G1r&^|N|S`00LmO{&*<3k^Pt7h5@;#33|bDYfL21Qpw-YCXf3o3S`Q7~iuR#- z&|+u_v=mwfEr(V>E1^};YG@6#7Fq|bhlXxL`_MdSF|-6)3N3?{Lo1+_&?;y(v<6xW zt%KG>Lle+GG!I$~ErFIo%b?}Z3TP#?3R(@Vf!0Fnp!Lwu?PwpG2Q7w{Kue)z&~j)6 zv=Ukct%lY>YoT?}dT3}O+K1*ri=idZQfL{p99jXbgjPYTp*7H2XdSd38ltBbddDAV z9<&%*0xgA>LCc{P&`M|(v>I9it%cS>>!G2^XdjvfErymrOQB`Za%cs#5?TeVhSor9 zp>@!DXy^{K56y!XLrb8g&@yN_v;tZQt%6oVYoN8zI%qvKGzINL^Pt7h5@;#33|bDY zfL21Qpw-YCXf3o3S`Q6PMf=b^Xfd<|S_&!9_}(4A->ng=b0mOx9PWzceH1+)@c1+9kGKx?6O z(0XX76756tpvBMLo?7mG!I$~ErFIo%b?}Z3TP#?3R(@Vf!0Fnp!LwuU1%Sg2Q7w{ zKue)z&~j)6v=Ukct%lY>YoT?}dT3}S+K1*ri=idZQfL{p99jXbgjPYTp*7H2XdSd3 z8k&Xnp?T0^XbH3wS_UnLRzNGERnTf^4YU?o2d#&O=y}AR|3LGg#n2LHDYOh)4y}Mz zLaU(F&>Cnhv<_Mi4c(3Qp?T0^XbH3wS_UnLRzNGERnTf^4YU?o2d#&O=AeCO9<&%* z0xgA>LCc{P&`M|(v>I9it%cS>>!G20&^|N|S`00LmO{&*<!9_}(EVs1ng=b0mOx9PWzceH1+)@c1+9kGKx?6O(0XX- z0kjXzgBC+eprz0_Mv&uVrU7p6j}x?hgLu@!DXlOp# zhvq?xp(W5#Xc@E|S^=$uRza(wHPBjU9kd=AT7dSUdC+2L3A7Yi1}%qHKr5kD&}wK6 zv=&+it%rslM*Gk_Xfd<|S_&?S_7?x)Cnh zv<_Mi4LyeTp?T0^XbH3wS_UnLRzNGERnTf^4YU?o2d#&O9!LAoJZLer1X>C$gO)=p zpq0=nXf?D3S_`d%)!9_}&{Jq1ng=b0mOx9PWzceH1+)@c1+9kGKx?6O z(0XX7+P1%|eJk%gi2pl%oSh#uZm`vv$%#I;gj_$RiS-kjSbu&K>yK+Fi28T%#3$4**S{v#-y(j0WfSX{H?jWdCe}YG z*54`Gf2fJ|4>Ym<{wCJn-NgEtO{|~R#QI51te?=t`tePyr$4vp`}t&y|NA#wte-8` z4;Ab072E%`Cf1+a#QJa(>yK|@{eULc_iJMP(M_yBvWfM%O{{O;#QIPZ>*-HV`+ns1 z|Eh`gpEt4o<0jT`ZDRdBE$DO1QFx_nvETgR zhCg3_gIieGcL1#|yun*6ys3!F4(QvT3VSQOIkMhXpuV4ea(AcyrG@G&{CxvfGapr! z;kmkPqSl)mE5q}5UCiTctW0aHV{NPqx6$DT+Tu2Ppgy_n8ZK|{smLmKA8g3XYxD7? zD4LCYf}N3j9SU?m1V0@-it=4i-b}tV^+-M)d=biDi1J&&vrn|`#=r+shfF1t)~ut-IIolL*ywR?`O=U=Fw{-~SB zcU@vWCE85jf1})C%4eTv%QK%yyN2OIhg$wR`tvRL9MPY@(gbExzTnrk{0Kgt(W2q= zQJ!Z*okZMG?Nszgn+sj9S4v%h^2<xS3Xy{oosoYPhCiF$5FH-_yX{FM}PSq zG$Gscr(}uU_gkT#V~Cr25~BRKC?APX2k3|U)0QTZoAQy){`zkR4-2ko2k`0_{rsoL z+o>3~Llp0K4$8;6`s>f23HGL*sNf^PW1{|D;925ep19x%a3%UbEX$U61z$(p zY|o39+U>asIkpcSbi96w`X2y~2;S)kTRtM**KNd2{pv4v`)hn&TfvK0*mlps{&NcL zV5WTbUv2plvESYcJ{sl6p}eNeYszQFZ9RVjuK-{4cUuqp^LFsjD9`sVoJThbnD-kK z+ozhiseca2vyTT`WBZ8m*AVy0ueAMn2>Zjc;6oSL{=5aAOE)B#@@KqY%a@`5Bk3#Q z(A^s&?(mNOitj_13w|ZIt&RSOI(Sr+-$UHgzYz6vj+jh0c9{1Y7T=dIz+J&hX+xRv z5y2M|H}%JAZ2vKAr4EAcdfWE!Wb9XG(hVf0{Ml=5`AhMBXMl&_wdLQz4HcWg7oz-` zC|^i7nwWart+xDC*g#i-??ZXc74yI+e`?DQ!Hp#Ef?xlN?avYTT-tWB@7ERk^Azxe z>;GP7(cdsN+b1sg1n^iFfB8)MtEt}pCd!Woj|v`g(I3G_gNFrIU2XY@;Qs_qi2m#c zSEBsix}hFXelNHy_}`AS<>TUeu@^in%ag%-`=Qv*dx)FQx8ha%xop9WK&3rwc_r$p z1y6`}OY>~`s4NezM7tOEME^zk*NL0{@ZaOQ3&$nZ%am`Y+#dGxjbi`lMBJ4B(+1oB zV({}&eklAR4g2#`;1O{9tyikuQMNxZ@x8mvgmupV|4ge6}b*&g10E9sK+MHz=Pb%3s{a*0ZmhEzjHM4Ug0D zS=4i8Ut4~cC_fK8SJdCRpD9lVMX`PE@Hl;rqMq~ulo##Z7UkRbx1VF*ckSmmh%DFqTu~}1G9p&et{4Q{lp~qx|{c=YDF-7l2<6 ze$!``&q2Gh!8`7>{6p~Pz=ON|{8R8xz&W=UoM8J?{<$sB{CaS;$Iq97-}%U;1CIdSuSS&ep|LVt=+wmh0*`}3)?KUabOIbit^lwSz3lsP3;o+?HI?^{C*UrMe+nKeu;nA*t%lh0pY*jH z-BI1ZBj8-mAHbJ@<1nnIf+qy80bd86jds5PpC`(@r`rC^5PT^3WN>>lP--OjIKgLw zM+JW#JPgk7D{vaNr{E`mE5ZL0JkiH)H?HRq@VMX`!DE8!65DQ6@B;9N;Fp4j1)m1) z3cdS6JR*4J8MfW9;Aeunf{z7Pf-eJ4^!E3E zH+Wp|zGvEYV}f4_9u<5#ctr5k;9 z;BC*c{fP)Z1UxMG2yj>M+2Bg>Rp5!E{QdtNJT7?Wv$6dJKMOo6_I=f+n#It6Bhh*a98lZf-Ave;0gE< zAAep2j|=`acuepf=V3nqr_B<$ z{|fM-|6$8tfPS7pCkSRc&uL-nzY6_{gD?7rzx;`%wtQNazx;FH*-=~m52*j-f3xMU z6Xk2bqoZy4QM~3QhY`cB3!8`rdmY*W{CE#-fpAG)F;2XeK z3f_)_uIZ2apzTi)_O}V(Lm%<;-QfIp(EplgJDSXIC)(px1pQCuy^}0=!8t#>Cs@w; zna6Wt$N4$uzzN_o2P$x`pL5_aaC9@71EYd-4jci_+n;mb8KOMrz(Im@4lDpq!~5kN z*h_HEfv(`30~5#kw;SicxZs=vV}f%Ij0(;{&NnD3(h$(COGH7sNkFfBZ6}d z3=7UV&=s6>pc0&OVB#2m|2YT71?L;G6?vf^!ax3eGt&A~@&3u;82nUBNjAD#1AiCI^f^!ZG3*LtO+T>(c@RNxf z|5^`UaLxnS zFWUM!C+tN(N7PszM?IVq3RYRpIf2JB7p=9N$1^Xd_hq)jgdBf<;PIKnO_q1fu??^< zyJ!19U-t3%S(Zo8ANK3m8J0`Gc2DDSQ`f4l70Z-Yy}R;Y(L`}HoAmwx?{ zsE7S}iQw$li@>E{&l8;eIwm;#bp+hSc4NN|3(kJ+3eJA51ZTfaoaWzd?ALL@*{@@Q zvtLIAXTOdJ&VC&hoc-Droc&q}&VHRZ)!%>i>$u?T*D=A_ucLyqUq=LIzYYt|e(eg* zeys#&zfKJC_n-YbE;##jOmOz=sNn3^5y9E7!-BJ4yMnV{E5X^X6Q}t5&wd>joc%f` zIQw-}aQ5qn;Oy67!P&1}!P&2s;Oy6lll}c?zm5yeejO8>{W>Z*`*lQc_Uo|V?ANZ~ z?AJ&J`D<9@WM2YlHR|`dwn{A91AR z9l#UdS9Z4BjmLi~Bewi{@GfX~z@?Ud4t^bY6#TL-ww{jQuYgAdANmJd&unn6eUUm*CP%We5TgU>v=SCMG!Ny~*IbJ$ZcQ zN>QHk-Y~&A?+pc)dG8FtIq!u9=e(!D`F(NTOI%>L4|C3Yaltw7#RTWP7ZsfIUPN%t zdtt#j@413=-cy2e-b{pY+F7o786OmNP7QNcOy zMFi)(7Z#lJo+~)#Jta8jy~Mfx{&U`o3(k2jCOGH4sNkIUB7$??3k%M9&lQ~Wo)Vn% zUg8{o|2gl)1?RjM6P)v2RB+CF5y3g{g$3ul=L*hwPYKR>FCotBIq$^<=e!paobz5( zaL#)X!LK9VG5IYl_;mQuH9f3<9RXi^7W}53mRG|t#{8-A+{NQ9k=@oQ!pi<|j*1D+ zc_{(Tc`2EHzOePIKs_f@yT&&M9A*2%{&E9&_+HB|M$k<9X~ga)5!93PQ*alY{qbyY z>5uVC{QDdGV=l@|e+&!G{#XFc{bzqn6Xn?-_n}>`pZ#$cxb(;Eg0nv+1ZRJYf%A4? ze~b#w{umLQ{V^;!`=cv3`=b(^{W0tA6>!O zAC=(jkBQ&=`_KLu7o7buCOG?JRB-mkh~VsxVZqrSUBTHOmEi1;iHrUHXMcIQwHnaQ4Tr;OvjC;Ovh|aQ4T<@BIB|e~b&x{umRS{V^&y`(s3K_Q$Z`?2oSC z?2k%t_Q%9U{{FK+#sz18j0w*E7!{oTF(NqoV_0zZM^|w6MW8$~|{oMtb2j{97x-lGf$+@%SO2g- zs*cUQ8p5cD{V^;!k26HU*&ma>*~!+!oUc=ayI3Aa{p_d8wVeI*A2c9f{IsUG_06#; z{}}kL3v78lZ|yinmp2sqZ2T(wxkpeB`>cDle}71xxBkg;K5u3J%?FqM z8@tk95Bu*vaQ4TkLoiN-dYH5SW`j%r-7e~3|9x9<_TP2j(tlqPoc%X0IQwrD+{Jcd z|BVRF{u>sY{nr(o{Z|Rj{+qbMzdhN1& zcZb{lD8WwyPvCrwkJ}@N8-F}2-}>X1IG#@f5BIVBBIJaJuKnShP*7(5H;j5XCyWrB zbHXBU&I6nivahuDFz1{w;!l>xQ9tK|f~zd&oY3YP`@UxOv;Ak^wjP;(9tM~B#|3v$59gne;F;i@e`11j{+SHU zpCgYyTq(+P{uw4X=bxeAGXI<*IOm_R;GBOHIKMB>KZ(Eiw?F5fxZs?BVuEx2i3-m7 zCn7lKpRnMZe_X*i|0uyZ|0G8E`_K6&E;#3(nBbg$qJne&i3ra5CoDMUA6IbBKT2@U zKZ$Go{pb7>7o77?OmNOWQNcO?L7o77?OmNOW zQNcO?LYC zE3%w(Na8O)oI|o#+4{rq7tSF=1?L-#zMzRdO+KG2q@x9|P@9z52qg}2Px?KSYp*ly=#*z!rg z{)gS4zvtKB?AJ+O19xpT-(6=HJn7@$-}7<7lRggqJs%h4lRhqZ(#OHS=i`DWeO&OQ zU;o|zeNXze;7Pw0Jn7ehC;eLRq+bi3^lQPBel2*?uW$7CKk3(kC;eLRq+bi3^lQPB zel2*?uLV!~wcts={ttiulYT9D(ys+i`nBLmzZN{{*McYgTJWS_3!e1rk^cTC{aWy( zUkje}Yr&I#EqKze1yB05;7Pw0Jn7ee^Y=gL*McYgTJWS_3!e0A!IOS1c+#&0Px`gs zNxv@l_dn^^f+zi2@T6Z0p7d+MlYT9D(ys+i`nBLmzZU0fNxv36>DPiM{aWy(UkkpI z{KE5V!8_5!IpaGU;X9LX{11a)Rc!r;uc!b1`o{hDIh2o`VSQ>Z42FF(@tUoNeKY;9 zw%wt>v*rJW`vk8CcdxPhEA;18=7VfKAE5qosXwOwvGtZe0ApZZON{aFCp>OHVXWos zgWWI=ufW*{+3$vdOTUW>&VDxnT>9M^qCETEAi>%13c#h`^%9)@&J~>fE-tnM`&~?M z_PeOy>~|5t+3&)Fv){Rbv)?Jf+3ymg{ht^6U0iVXyO`kYcTvIF?;?V;--QKdzjFm= zzf*#<-z7%*`_FzC7o7brCOG?DRB-mYh~VsZVZqt&T*2Azl;G@liJSfXXTOUJ&VCmY zoc%5;IQv~haQ3^f;Ouv<;OuuwaQ3@I)Zc&hySU)&cQL`)@1laU-$evxzY7b_e&-6# zey0Ryzf1h5zyIuaalzT|VuG{ZMFnTSiwMqs7Z#lT&J~>fP6^I_m$=E_fA+h$;OuuX z!P)Pkg0tU61ZTes3;xX^e2V>O=tjRET?ZdYIo9&_82A1RJbP2){t}+xf4}T6pMXn$ ziHP#-FH69sza#`_e_01E{bimg&;Bw)aQ2tU;L=~l3C{i!6`cLW1!v!6e^G+7za(z+ zZ#VXrxZvzBF~QkiqJp!(L@Q)#*@SIN z{{FMS#06)6i3!gB5*3{NB_cTcOIUFB7guoh7bQ6ROX3!P|Jh&Sg0sKG1ZRJV3eNr# z5uE)cEI9j%D>(a$5}f@dQQ_}D`%7GK_LrF8>@QKl*b65kAhdf5o@@{c9HLDMCG5{zdTUw#NM{Hr4+*vVWaD&2s5qaZ#TAD;MRZ ze}x5S|0)3Ie)4s_G*O=YYaiO>`q{sBflL3|E;##FLU8u4C^+vA>|YVV*}uYqvwyjQ zvwtbU*}oD~{M(=XD=s+uS4?pBuc+YcUlGCCzrupEf4PFQe<{J)zY=%&`_KLr7o7bo zCOG?7RB-mMh~VsBVZqtIT*2ADl;G@NiOK%{vwy_}Xa9-`&i)k@oc${zIQv&vaP}`( zaP}`HIQv&(lE44#Uva_NzhZ*3e?M??3xjTyXZU znBeSRQNh{2B7(Djg#~B-as_AqQi8L8C2sfkpZzN?IQv&jaQ3gL;Ot)!!P&pUg0p|Q zg0p`q!MDQ~PJv(ahVT69Z`P0g41P5Dqu?`yzhsUyKGj0GZ`&jJX(;~$@y7lx%&&FR`6Y- z{FobU`G_c=_IJw*9`V=z5O`da@B0s1ek|OW?b}q|d|r8Im;E|}wzJ{If}a3hBKTjxhwf}Vhp1Wp?-75# z4}&y6B{=7h#GU^Ba}J3M&N(C|IOmY4;G9Duf^!ZD3(h&j z6`XU35}b2L0)EQpL7YS4f^!au3C=krDmdqmh~RVJ3#IT2_V={^wEi**oO8$x;13Ib z*#N#w)N@+Y*0WvI^8|Ry6RjWd@xR^8wtP2m?$228bHTYkd%#DEdVV*`=A!UBw&rt? zixz;#z|RFg0IoLJ^5=nX9^H7JIhVNc-*KYdk>E4HJD{E_@FxX-9bD~eJYPKmpK?&o z2DdAi1pMR!|vHgs$^XIEpRFCQZI`oJ0&pE_Rp2_~mpJ%pE`=)#W`pNlZ z7V4=J+hGm(E|izog(GwQ-&4*TnfF=F@0asNRFvnu@iw^38w&L>=e)5C<#~VOyz!E# zhx5h~!8va%0+)GXp5UA}VuEwt2!p%$d^vBpf^*(bf^*(T-0R<-oHycvbKZyv&Uqs$ zIOmOs;G8$Yf^*(*1?Rk>1n0bwi23`^c_S`3=Z%=)oHwF^bKZyu&Uqs&IOh#laLyY_ zaLyZvd;I<9yb%|i^F~Z?&Kps|Id4P+=e!XXob!e&IOh!|IOmPT9Dn~gZ^Q-Xyb%+e z^F~x~&KnWIId6mo=e*$x&Ur%#&Uqtox4-|KH{ybG-iQg#c_S(~=Z%QqoHxRPbKYe!>2JafS7lZYNnEWPe`;el|ECw~xNX`g;t1eHMy z2(E_M{%}rcMfIDU5IaOpSciUcPPl~1o9)&H_3-C-JNV=j`@UpOh(F~2Uhw-JKHqYg z6B434=Y&Bh&v{_#5Yzv5Dk3=NgrVTvPtFOwM0w5$xq@>}$OcctcIM~CrwPtEK?%+| zAtv4z=Y*)>oD(8~b4~~g&N;yqoO6N_oO42Ap8s>oD(8~b4~~g&N;yqoO6N_oO42=%HMy^ z330(WC&UEjoDdb9b3#OL&Iw_`IVZS+b52l#b52M+;O{@@gt*|G6JmmMPKXN5IUyoA z=Y+7}oD*EZIVUK=IVU9U_xGQ3LR@gp2{FMrCqxD3oDdP5b3#~f&IzvIoD-DboD&l8 z3m3;F&IxhBIVZ#f=bR7~oO41%aLx%~!8s?mfEQRDYW;C2>R$@J2YeVf z=Y$citzYJZvrn`2RG@qU^{fY{KbPbEq*DKlpB`Oe%WnWb8$8^s@tklC{Dpn zhbvLfu0nrKNSkQe4Hx)x!UXVwB7gaUNw$1UlwSfqLX`jQWLsXLUCtrzfd@~w@0W8( zhdXTf_JUswULg2P;wHC5cKF9PJ_a8lczB8}9~GR(Lq=dbbIzGU<;~|(f_Cj*r__t! zrGg&-FB80gJ{MC@L1yE*$bHOz{NY@*7Mwp{9zO|-@|=rifM;U=;an6KoO974aDHE$ zi^hraoQp;Z&bep=xXeXY3eLGGA~@$F1@5B%oQo2R{M(0fQCx7&MKQrS7exivCCH6} zb1n)Ceksbkf^#lXf^#lPJnHX1=c2gaoQq7Jb5UGy&P6f7 zITu9*|NT_!3+3<&&P6YQ&jsgPR6Na=Un~4&Huxq{PqRC1`Lr{v&vHHg1TO;T}Y;qf2$ z9Gg!#*L9s?`#BH&q2Uql=UniDGwpV`ABH*|{Ec5(&fDQR@U7svsAnhm0l_;`KaIcV zoMr1d1@&J6p2%rDzr75>|En`h#JbDoI_&Uq#(IOmy&;GAc|f^(j61?N1Y1m`@HsP^}t^GsZD z&NDH=InP7|=R6Y;obyaraLzNX;GAca;GAa?Px<@Lc_uD6=b4z`oM)nfbDoI^&Uq#* zIOiExaLzMIaLzM{C;k2BJQEk3^Gr-|&NETLInP7{=R6Y@ob!w;IOiE9IOmzf6aM~l zo{0<2c_t<}=b5PBoM$3}bDjwc&UwZaob!wlobycLaex0g&%_1iJQEX~^GsB5&NC6g zInRUz=RD&I&Ur=&&Uq#w&ev{%U;G1p!TDh?_&jjVAy>_|{<2>9%bUc_I8PjT;6fZf z4|N@+_uaOh>|6c*_zHM*yyfhVznNppZ$`W9k9QI`{y5^3#{DtT+3$}Zp`LxB|9l-J z)}?WOOsw#K?(B~f;+9K)RN(9*?2p61*$1cMI!IJ-_Qw(6(jU(d<=Gzx3C{jl051Kp zm*DJ=uHfvCaj_lPA7g^EKSl*-e~bvu{umaV{m~Vi{ZR?d{+L+q|Gd~AF7!jQPF)TRyqboT3qY|9`G4ZUw|Ll)(!Py^Ug0nwH1!sSZ2+sZ(7M%Uj6`cK1 z3C{kQSmy6P`(s>i_Q#mu?2l2w*&icEuHfvC zN^tha1kMZi_{shl7o7buCOG?JRB-mkh~VsxVZpoHV|^#>9D82I{&+k10C4ulZ^8c^ zoR8aA#Qs0_{xiVIqWk~HFR>viM&wph)L4)rNOozfSc0&^N()V~ku0#VD+?QUm!_bx zca0Rq9#I685=38?{m95oAn0&`0@MTp9f@l<>btnGiT1s zH8a;0jE|9bK?ZPqtZyIWF_Aadr{k#SO3Lg0MfxU;kM91(&y>HI@;lrPJ+XeUKTO_< zJVP$G!`PSZUxZp=9Mt;icy|@Y1s(4$x+C}X{`u6OysP&3-eNZF@ssQLzJUD1{;*TW z_f5jh`0jn4dwh@4&ZlU9Q0y^&E2kdy{{-@2>)hjeaCz? ze$(+im;X1xY9IoSg(BV41`yH<1yXSBn-!sqDwqM8h zl*4s=PdHr1_n5$M>Mab$s_bT*r6M;X1x&o~~`bj_)al>-e5m&R z%hh%G;4>JPbsc^&^)F(%ZK!BH`I-T+C$udL?IQY({jG+8&uRdE1-U;zx1C=&c78A~ zx19^A$JY@4)b;aI=Azu#j^H|f_>4St6713WLnqO1<`41u<`1+}=MU3G-qh<2>d|re zRq|j5)XP05nRuyoKhpU_pVi>nE;@fmIr2JxXhwN={t$Gy&L0BgYNyU08anbifB2E* zs(zh6WXT&c4)vVm28ZkXA>(kJKg7uW)T8ro?{J+zcn;rgKE{iWIbP`eVG4PZp%{;J{_q3&QRJGp&$t`&hXm&j zr!s%W?#Vqqt`K=MPW7RlgDL+zd6Zo3DG)tI{$_`tNuKSRd%W(;aYVjdY-ID&tmHFabMfj^OCdwUf=yDcU+44Cb|Ca>S@Py9<}G)dhA(E zdqVZhXTEgiGuti5-Co~OkN>FLe(vY^dDnXMG!t&xu{ZV5&E7ubV;$a({4R%g7jEvq z@D8foF8wXv!<+Op)>~Bn1nODm=sDlYH}N8=+VZyx&vl>debnQ{Wv(o*U0A?Iav%B0 ztlb=`*zl=Oad6eRLj|<<%Yv!#v5cSo0&PSH-?Pag5%^NSmys;IZKc?qN zf|fV-VsE17wx>Onl#kJG0rL9V@lGr6^Ol5a`^|hUr{Ao6GcQZ~sor~1cmr=&ui4(3 zN$|;1%BP(At|MRK@E^%HIQ+21#t(aW8~&(mXE)26d1*)fbj$zaHTYE1d|f_5`F$##3p(D z0_Xjb4vnA^7?eB*@iL;>RAj)?X zZsfD~p-1R-UnS+!Z6KfA4qv!WxbctwHTWk$Js+r^YV>F=ci#t~KQIAYJZoQ%lY0@^ zIh_1c^3>Ph5|;MW_(7E0>ebrq(v>{39$c>zAGW-)m!N<0sArRKQ{Pw_^j}SW=tJPC zr_myF$h$ubp1vCVIPxV+=>G@c|BmEY%bR*@o`F4a^5&1g|Gu9ZTe2(pHRKsSA4%JN z1$nBfcAWeo+}I!d680BS&%8&$Lt(Vz@#L=wH}M&rT3gR9kHMe4-hrK{h3AbFZsTDS z^zThQbA>~afN!lIXSt_BUfcaN^2{i3)Y|j5eFE}H__zZHF(+Cy%Uvp8cq2wQyr+^c2{+J^3H1=Vi!$$%${9l_+=U3$@EFv%ImF;&bgZ zp05*b`)MWob29a($dhBh|3m({aAQxbHOiIgmVNbn9z5>kjVa`*o{(=y`IY2>6+2l{ zuq{6LeHH9U6`)-8XS){+ulqVdxbbu7ZG7sd$gRSSo!%F<{T6r;JkuBUY@~d#@^|Dr z@|r<^J}BJy$M*^3VXfz_Cy!6u)yf~rM7GaMkPpnSEq{z~>$i2#KihuG^WxfdS(eX?c#Bs)|z_Stjj&$C>3t) zaptiJ^5_e-+i|6E8_&1FKfmnA0^Wh2V;lzq#2tj^iqGDb@8V_VK>q;BUm)D*k8+-d z*73X(-h-W~DC%2H`6}T?K0OBZ%py;cC!R&dyPV^%mw}$-3g{6r`^pn;{2zG{C90km zg&X~`!)oWfA@Ap|*BQc%eD*xFl=iP(KFIC=LgB{$kx$WrTHoQqjh^6d&{G66y}dsK zPn?VTUc|U66mIk+Mx$OmDL~A|$mdc%el7gph5QZ5d$*z7{bC(?g#B?peyQ1d*y-B=HP!x7VtGx?_9l!1rZpw|1fFIO9 zYbl@Myh6u|h96Tt3i)eURBz$NZ-Lw4hl%7-%j?>+fb!98VgG3q`Mw_cojzf?%hA4j zQNF+MT>avF;bt6PodEbZVFTYa0T)6Rba31V|H#~0^ zcuD7WC6~c}F4Ch6SssB0hMJfHrv;P5ywVqcc-1s5b2KCi`dce2PlU|Qtktn@nJrrbE!VYEM1d}rikeK-ZpBPsu;@Lc_Lqi~}q%J~n&%G=|6 z*zfBBj~&Je+-*6P)_8kTxV7g#_(6tm`)d9}?s88MZsfDWAzwuKv+9w*o$~&9FeF9! z*U2+&5IOLk=T-j*`!jpO585x1!tMC@Fu0$3UZZ@Z5qL4jquqXjovEI%vj^pu{G7X9 zO@2YSA+AekyAKs^^VR!k1?@-QQ9kl1;!5p2ToR5QPk%y&>Bn+U6mI;MSPXfM=WEEb z%^O+CkD14w7jEjCV!pkKdQSZf`h(0HYUd5)p^hNhAD<>qbVRxPQqMQSO}z@(}nzd^4R@| z5VgOB>@FBTdmJ}4KOavXI2J9^fE^=cIhEFUdztbmCalj~i3P~;Bb zroP_UX!jEGuas|uJtuMCd8z^Aeb=B~MU+2zTkwRl9(##!Q{O~ev~Lmf+dA@ibF{Cv z`(E2YJ~R$o$KS!ijsFvi(Bhq0?$s*qtXn>zoY%{mXWkTU>g(e=mB#Zv+Z+9|UdMGI zjjJl*Mn3)r{GjvFy?20}nGE{rq4dwW=5vjKbA{V_tpV|~s5w@?Zn>}2!y7h&|NY!w=*X`Ig=<+g zwN(f=^-Y9f=Rkfqk38K99+*wuU}wntK0qW$x3#aZaN~z)b?y8Ur+lm-^3PDpe@*$& zGRV(oUOIRe=nq^8e?Cb0q2!TCXy4Z4JM4;bGtCeQYy~fmJiz!Vr~Gj81p9k8w%0Y} z-W{lK0qwb8xbaW4J-E)V;*G&$ypHQl{U`Y-ABQDj@>j_d^T8it|LU+i?2j-GyHb9r z<@`^LxAQ6Q`waGIe_1Zv*cmt(?Wnv#6X;Lw4L_@Y0>X`asu|j49?Muo9_RQwn0&iE zARqq)`p4350pTWYCw+kE()PWKd_x9Y`)P}&(BtmwjUdlB`-5xAQ%|7WkvqVk$Nz(R z`S*fmM1|+QFWlsx%p2g7X#eSZ8u_}f+v?%(ST6a8d073q!(PxIn-BdhsIt9q6aNwR zYn7is`3Tox+EV^5%BPrDM=;*r5pLQgJ{pN?2UcuHd9axAbByzC_46>{w%yNyd>`t+ zmpm~Id?ooODG8}>)HN4+#o`jQ8oasNu;rd;3mh@WfOE_3$*_ZFgD-B)^D zxUoO#tl$19+~&_G5T9#k&*}Su`=6{Gw=;zsJsIcvZUyB7&i=@@&7mjA`+9WTKgMzv zR^x53a65iI3qM@T&o)v|=0n({@#fzT_01j$KQ!V8i-g;J7>E31_LnC6gZrH8>r==> zyzf}|L9P(Kdky>a&$(7!|M%znOR6V<{D4-FGY$v9&d6iP+qy4Ms{CzmjoTgl#?HF0 z?!t}#3zpaJ*X34TD$hIyZ+PAvO~Yd!DS1K}UfIfpP#xRH;(jvDEF zEJ6ABcW``rn*0mp)6V>`-9aoj4;J1|`O}2kIAniUdoH7V%-LUiO1O!W*eb+{=J|sT zhMvszwd1y*aASXp*T3r93n(Aq{4mBm@Pu&V=M~OAc*8@W$2SaqIF9yr6mIPIoc)~= z@;IO0tMNaJJo6)FRxvv6JL*rk`!y|4U+-zu_imQ^fpD!0k$v0!P}rY%9iJBP!y?Ni zKQDxy!^kHI&lTqjg&V&Gob}I-$g{j&D59RdTEY+Up@@gG=+6t4pI*CN77Nc+?kAM@ zIr+!mitWzpivw70cgtm;bS>)JjC_=E8@HFho*OytpH1$Lr*p}Dx1xPNqn@4GpkC=& zwe3INathUW8zJ13n|TY7tn=p^$OG4--)a1ONd4})pr(hR9UF4J&d)N23peqWTm}6) zZ@G&+&VGbid)@}&#-0S%ku=ZjFBA1#@iWYF>F-=OZq9OJ!i^r!ndkgQc^~%+w7#9& z<<@^fJ$z<8yusn9Z?-??Ap>d8vBFJ1jW4a;?or{!&Ir#JX?+iDpWB`a%f+AX)o$O} z!i}CF^RxOt9LTNbO5sM{T@QawxXD+k>F9S8X@9po)GNj7cO7>sET>S7w`G*~JL@NZ z)Fa<7AO49t`>>Y@x8q}f)b~x6aW8rHOT>RW@|UP5%X5s{zkX3YoCj(w9o!+ee|lIh z?Xo}0)pog9`0dh;spp^}#Bx9B2s`~eA2o$vXwwNi(G7ZZe7{1toj>rrT!4C>vRuxM zJPZAP@*_J#Pv8UeqYCD$YRf59<87^Q)4oZrw?B+w+uNlJxW|1Q&4UQ$5>uh|8>GmKMgwb&lL4!kB0wS^Q)iNqv!ap&@*%uYJuM5 zc@u=&c;`x{k~<;uW>#=xY6%tUPTu2ymKtCTi?0D zjo&g8AX!F{jPP9J-C;-5{)Mnd^T5fL*VTUsm0o#wl$%(ING_tDM}(Vl9`)GZa3AgRVd1fBv`}Kmn?hW*RP$J8S~Rk*2drXwPJ=|1?vSIV7zu?zab z9(Vn1o^VsIEZ3QbvfQ_+c0S@vrBVk|&1414SHYUlMNoAKMFl=tf7pSldZfwx7_JRbEzls5L)mc>VHwVDL35@irhVi zwr2=_NWF&^*LXNvxb-vRY6JBzwDNM!^YIVggp2=>Q#VhdyC0EXJ2XR(A@r?Zn?xW&tp7E{i}rAIO&6U z)3|MLGVBcU+?w{UBZcQ0UrrTn^dy{hs-~wvkH>Sf0hZg9ywr)?V&T@F-OwKwa^Cp8 zaO2N_lULiF3i;%%xRO1N`iBTN@#eo5aULOmM7Yrt&%lxWss9z~$vXSdXP*ZB-cyJN zoe%s-9(@SyrSp@4r$at_HSAf-{5gd@=9?FamlK zyx)Y~+IxsR`wsF|DcfruxySvxzSOhNNazVNzv+3=?#i!3eKkI-g`4`OxWC}1p4KJM zlXUirONATxYz!V#|36{n`Q;jK>!~OGCj2vs{wW?szj6OU_oEjHxBhq5Z`TO7aq=?y z?@279!)U`L4mqE}r=E9>@Lch*$a0yl^89%>>iM)D`Ih2v)4pCI{PrB>X9zcTCi|ma z9ayjYGT0O0@4{<74+}T)QRYL9tA=OLpNFA+H9rg{k8z)9Jj=a7xT)_vu3Kt-UnHN! z``46zr}}5YPLv|oxnpws=O^LD&WN*K-J%>k!G1B2_EeDj$TgljkAu9&-|5qFq>4P{ z%roy5Zu}hNxyo}H=bsDDHNLcv#AWPEb3a$l^K6Pz561=V*B#FUkFJCV^t{Ss;kF&` zK#%)_<<738{my+H9jg$B-t+MAG4#U(;YLsFJ(Q^Z>v`ce&r~9QG|s=Jy#E1|`x*5N zsm@*Bi|gU93peFPOEB(eJnuFh-0z-unqcgy``T$D?DUqy&c*b@5yEY}Ip-Ws7jDXp zJLkk6BhTD`{P{WcWR&xKY=|cKCP7ccnNJpxrys+3!RfVkFM0ME=%1@qnT&RcJ%x5D zBOfc=_&?hP@+)c2&E#qB|7yEDE8Ns8}*dvmr+mZNVKDmf&1*)kWX%saLWEJn-IjDBv^l?5B{|@$1lYARpQhai#N$ z{=!YUA?JMQ`Bt7r*LZtbc&R2t;Qgr45Pqk>BoL!N>+GkTFWlIl?hJdrWIWs} zT-R!96zjc0`Ixh=^0VbNCGq$EF_ar~?o*yF+{VLbl&g8^dGd&JU&Ghb<70k9^m<;? z^NgOluLp#i`lh*_)|w)(Sb53koaYQ6_n!}WzcZg1OrBsKTTB1U5^nN9W(7*u`0-x= zJy9pmyl^4f#m{}iHZ1pN;nx4oyrSSD=<#?xuGgFQlV_aq>$HoZC-FY~ss5QE+|ROV zzTF|*#vA*o&STe-r$2&*vsiH7OCTR{_J1!Hp3DC?P(C>Vk>82e5%-g47!T+jp11#{ zx%DiyT&|lqeraCX^)lEKe;bjrk(H|yp3@%6C!O=9>#V$t7mP#gr~6zEely6N+VFBNX{%YB!;PSp8T zr>kI3Isy;BMgPncZsIL_12Wh^cJd5)fcNp~c)k7AkPk3#tA7p_Zv2pFhx-1`esL=0 zgJ&WRt6A;^me-6x{Jlu!?}VK)4Y04*gq!-tc%N)5{pvNehvxzE$-9%MKS814xMi7srx!YxX}}Lt~+K3w|T~y&n#E&oG-1K3HhkAUi~Y1#>vll*RfqLfSo$N z-%K8Q4fBUnIWF&TJ^g<;#_O|Kl@`K{{Y$tnru}G$aMSKSJ_kng@U7$lp4&W(dOoE7 zAjc_{A9@4I^>|;{Ov=v?p39#*+z5Mo&N-!%gd2bQ&Op5`rJlHOJB|e52hCSMQQmX> zcFIkV_umKkQeLlJAl&8|o*xTP|HG8eoLxH}J`rx)cOvZhg#EYbX6R48j((x-@`iA0 zzjHpM;8w^-=R$s&)=Ri)mr|ZjK=1Ip#gtE6Q@g(V-Uj_yXT9z;;l@A7rO>bY-A|H7 zX4U3^VLqbLw}s(j>gFV;YLrw zZC}aE{Q@Q@xR|iWujeW*hx=U)KsZ{=C%L|6OI}WuDLdP|g1>??8RM74ZBJ zs*DLYc1G{QJYga2+5b-PWHIdAj`j>v?wm_sL7tcc`vdHFo#xOFDfCl4H{0?q+QSQ= zLugNb;ii3qyiZE~d?$IVJ=#V2CaXvKyK~;@yt!=m4yc#jzpzfYjoUpiUL4K(ZZ|)- zpSuXR@lb*hQ^M80F0%3xCttxHP7}Oml%EV9ru=Wz6Wtr-&SQOVz8m@jPF{UcxXlAx z7u9y$>7Lwn&bM6V$DNK7 zr)ivbT?{?`>k)^V-(D4-%l;oIA9U_}ZI^_es1yH7$+ONl7`+dEi}U`Yp=|e+!cD#0 zb@E?@=d!2Ze)z|KF5*h_#u)OXbN=C0;ikR(8EDh?`p*N<<8!Xp`jTh3|BGn%ybFaJ zJH6jAE)?@Z`fKv&Y(#!*jytD5NIM6>&iB~97bxdGk>=GU%F~Dkg#cz zv5LIp5!jR9^PJV5+k_kaarSF1xAUX9{cx&qBOiDamanJ&^MsrF#(5sNfPA0FP%l5v z4{JW`Meh3sdRkFFD%|L4=FA7~P(4o}e&B7-dq=pjC(;XX*n@g5eu8`8QCv_u?kr2I7DCJ*~Ke?Tq7?Uavwh;nrnOTj-u&gY@c^STQ+c6yH@kIm+H<_gah&!4HhbG?7) z)37JVc4b1CoRIZxI98hMoGIr~%p*VL0d8*!`8hYu`6xjsH;Ui}#rZpzI%_aD7a zo|*;86IgKYImo-?c$IKduN3W(X^(x)P##D8tme4C*K)}Fd0vQV((5SP^rOT}h`=*h zulXv!wst@LNVtBNqV}!%3ZuX7tGjShU+-ent1(g?V3%7Cd4BAWWZ1xiLgciV_*3>^hxXJ$w`Md?4 zpG*~=D}HVeZt9hO7VY>T`@4TN{ljtpLh7F<+{Ay3`Q#Gv7lqsY<=n5~r6KRV1UuVP zzO`^8pPY|!SCXGD{C3kX?m~U>ujk!DdHJ;I&eVylQ40sLPHy!P(^QalZjUO_PgQFIn_ax<0yf0h#`+lZ;_8rJq z(Eejyhn^6xM|2%&Jh}T^%4sU^+{cs>ZtRcU4NIo7zkf#gH21TRojkAo8;Fy6-2c@$ zxktFslR6!Gy3s%1llz_fG7fqZ{*1hUmeTxxI=QzTyn=etmdkxl&hxMS5N`Y#dK_`0 z>kr{I^z$6}EuVVsCQmu{%WM#C><@K!cD#6-4VCy{~yRxrKp$Y)q~eTkH`C(HQvgE z=Zf>~-+_GeevE@^=jp;txe=b<(DCS{p@%9v)p?rU+S#SyicCxIbqea zcZPcSd{m9kfx=Durk(4cYsn*iv~Qa2yOMg`b6+2jC!O)4;QieGDYjhV)45KZCEVEK zIp?2u{Sf}yz~7nGdL1p?_{VeNzl=P<`wleD7YR3cHR1V zl-Fy1>UoFqFsN$=!A7-k-wG)NSZT=d!}%g`0Uoa49la zoc8SWS#JNA2{-l!oclMo-30v^&QElG?`ZPmsVG;+yHS?2uo`by3ODvd-h@4>=MM59 z&%+$V@2n(GEP(uBuxD|v>`A81KFO1QB<$@8chhuePz9(2yJUoPC(bsUEm?`ZP4Gw(f3xUnDc60@{Jp}BKRvFKgebrL_t4{gguI8@g6FjpZtZvWO^SsZdxFmS=S5ZzmDYGm z)x-Dv0ro_AKVv(7r>Ah^hu{XpA=9&W4!O@+k6K8cb?%E_E8N(hbn@puKZ3i@WA8@p zbJp!AlY3X7zr4VJTPfW5;l~UjR>#Lvexm+c=uggvFBWd<6>E$=jBze9hP z&j&7Iy_O0$?Gkty_Do?uZ1@Lwd>rz&Ojqoyy>R3I*eT#M$giNhkLwSbmllx+w}*a7 zv-b6-%5y%f{oVX(NUr*}5pLUkG3G5icJECi4-ADp8=>C&qaHndw`q{`dORZB==aY= zTwO^!`!z83nCoSmMlkY~Sxd^1j%nrsVse-G4m4egmC-006b=cVrzZu6USZu1rL zfHSVO-VXZR=UfdCZuL0lZGI4L%FRrHo!aj6w}+mnbN&0Ca3k;DUmxGW$k%;6D%_Nt z<$O%@K)W4TUnkFx6mI&Le;x8b8>*Zp-1ynI4t}ek|KB5za-Of(=@&1~{angGLzJ6v zo|9Qdo(-WLPoe%>gd6)qFQIlrY0qkMzcb%xuoLWb_pLe!H+piTmX^{0~XgPsFv&~~w;@pSrPx(>gN!qXVy^}mkKj?Mn+vI6y-EW5`x$D)u9v-k<;*<0INwnuo@(9aS zf8I^*-p_l;9;jF3P)M#}|LP~)_$|Qw8uTX5`L%ROH|~u4Rl-d_&G0_Q zas29ft4HF;Imf>1KCm3 zcd2kwU!Sv&-_cJ$3_*nNh2p(Ogq!+$ub^M({{D#vf(N<3e=+No5pM0|`3h~{gAbw~ zxK8-r{2<)e6XH5U5%nA_1HEbYv@<^(rra5SzZP!Fjd1^{EA=!#BzHTWA>8O+^E7%v zGs@2tZtO`q1bf4cfnLO>xH|`T|{nHYGp!bu$Cj55M@8^72$KORQp+D+8uk2ZJ_qlUl3OD*Q zT#uD*XkUA@qCa_FVj=xJQMi$J@0YoY@)2j9^O)9<_w&9g_0Ji?O?#!w;mK#Ie}R?f ze`>t_L3!U?1h~fGQEi|Cd~6Bok&`do|d?dhL=o2mS7T*=XU$pOH5a z36mKo%P5~{4?n!m`u;{9=lZIjRVmBQU9W|f%Y1`zuJQ9SdGtfruk-f3JHXB)>!tbR zMDkz&adHV2T_HS|KbO|Sn{|Z#6t4$$e{CdrjO$?9AFn5O*X33#ch2*CL!SHix= z9uRKx(tFTzuC^oP1I{_FP6fIBIaRocs~pJ1a zp6rLPQ~mrDd4l(?XuEtw9(WCzZ5r#<>PY%$6Y8~?^_nQ$_$T0uclQZ5_AhbvNk5>T z2=CWuM>|`0h5e~C<_V?bGld)b{k)!1JKqv+%1t?OyT?)BvGN!)mvD44zvzyfr-*@@cMT9>~x72{(QY7NguE z@=Ju9a%VZu>1rN?y!#xsQ-xc5c+ODA&DoR>a9lu?dfqYJjC|eK2+QUAg6AIl@Otnf za`!%(MZ%5!F+QhsBI6-V`2^>~+An@1_jv9_^WmY#!Tv1ghb?K^7|ZM0c{%0d{oyyw zw<+Pqo~+YfexQ8dbi_$Fs_f7m^6qo6i-jBi4|VqIucdtKGSui$>KR%HJxS;K@lxTr z{G72|=K1u4jw3rAk8&?{u3I~hZ{U2O8Ox0e&!vAU>WBI{h-?xynsbKH%(6H7tTXQD>gqUAXDLDc+}} z`-W458#{dq(Y}*8?q{gS|1IKV5&f|936M|EhWxh7!-L5E?5BDicb0IQ|DS{h;?&c) zH}tr_Khj>fiNoa8=yBTb7Fl_IxyIW&)RSWTx8`Si_kn(QAGRBLvMciN6xu&axG6U= zot*vg;=a)1)@uQI;#v4%9Ls%6xX}}E)>U@z2S51v9D~l3?=9TON2g<+tmkj%2{-MM zWnO|+^7H7_6PW{l>T^+kqbA+2X{P9Kf0?p5hEthi(++RML z@>$`=&NP4bLHCauhrqKuPjWTok0TE``Q$?K1kbC`{obAfU}rQ8J2mfhBTt=)%shtr zCki+Ar?`F+AiqVpu`|j0-!(rRKM?YP=TYAR%8wUr~__Xy9GAC4UadEXC^ zZ_5eyrNVQ`&lhg&Y~`$TpjKEn8)E!>nFD?_`;a)f=YR`~-k60M*f--(b9`~mq3 z$$OB8Xurnu733+N*UG2-YnJmrHQrjC1b?n^_PI)h8#{yFA!Dp&U|nT-4F&x3o_hFO z!gJ-@->Bcub$|z`XMee%w(;idN1RR`XaWD^GZ1GAxBZ&)OtgaMy+-*cpVKmt`VT(Y z$k%<17H;Bd5}#YH@%+7TV^6@jzj(~4Mqcti&;1@mmDdV4_ISKsK>OXxY90$& zURVDJ;l@rM*FB0Tvi~r0=l+gIg&RLNbM}8*gi&rXANFWIJW06G@2-1XOCCH8{e3O% ze}{VFTvt*5H;F)h-SPt{Wi+SL+1KT5c<)8q5LULl`Fo^aNq-W6`zF_=Job-eh6Ji_ynI%YK=3;8VL zQ|CWDgqw0R{2j@MSnhPnN1XHUjmAOVU3V=MZtb}X_7qdk#g_9wHQt`4eC#*m$@BQx z_tYP4gZy(l^UvWGXqSj{|IU2j#{S?;WB@(C`Yh#3opZduP(I1~-TW-KW0dV1gr4P` z&)g*3=y!jYYMGU7KF{-N>bZgPah|JD`E}&! zcWUctR!RH)7)L(ie6^QwtKT`lHw3o^B~0)!fn2Fu6G_4o-1E%uw3Q|AH#l~uO2c1`u*deU)yn*aAQx5 z&llBxHp779##-RI}bAP;c;R`b;xaz5pq3m zGtcUgeM#qcpZA!O`?}y5;YNRk_v5!_xfha$xR2J2{CV=!)rhM#z1A>~X?v9j zw|?gO|7n!Jhdkz7H+^F{g=)MVe-8Ad`24rUY{zSan|9AS>u+t(CI1m|9;N&M;l>{K z+~Z{O1miiMW#3Kio;!V&Jmu^QH;O@j!r4deMjqjMh_-trxyS1%otGvpui*gxxl*|4 z7inibu-$p|^LB`zb0{BEz6aWCA^C&C&A1=o{Tdo?pHSZYJ&QjUu2ZO?{M;fb6)N?;ietkb=1`=&vP|})PK+gkdIA8W*bj_+=bvC&vhS1ekOU8 z&#gU>{Bq$s_aL%w_X{`nyT4ERk>xcd@pp%dST4`!=(^Tg;YN?&c}_x;iy`lO9Fg!d zulH{hZrV4&^P<|1+Fks;YRdZt zVcsR~vaeO-+1AkCi{&=FoceiQ9ahQjzmxl&a_<#x%JrRrxEe)=?so-vkn>EW5Pw?C&?F8S>YjB9;auSLR5xv6Ow*W?(yeZ8Ra z5%l+Nl;8EL-1_~NOTQZo`Ge@sBITTCqIA!jDcro@_^GGmwcwMS^GI`q8~y%I;OC3zpY_6X z_4mD}q1>Re?%j_($$c~(AKw>l^e6fI<8RTP?WaSJ$KOj@MqV%j@?I(YJcN8CdBhn< zW?4?58gC!f!*`mAa^s7kU;SAq+}N3Q_T$D2H~BxvynPtUxRdf3-VcT7^1Rj5pW^wS zBFYcB&gifEI;$T3fbd-YUu)%M|Kd8>zYE*Te|>I0_YiLF=e~9YO?cRHd0x764*wJK zfO8Ii*IDqJyIy@1d6M&X%^TkdH~vh~&%d$UeQyBw_`3`P$VZX~xWBLb0rJe7sIT_Z zKP<27&l_)qe&15a>$#of?>)l9hQzgezJOrl6nD=+opb(XgKWODa8 z;q!&t{Nwni=w@*L1<0S8|F0Bo{1)Q%m&WHqlutY7rhK=+&eCU5i#YAS z3-Wnc`INs~xUth4TYFsljPeQRcN6xw6?SH(!q1wwhYGiOp4a1hQ~wMr&;QhTTS57_ zbN&8{aO3}3%ww7-N8E;TldBPF>i_G>6Rek>H+#YI8U^yt_b4Cb^F1_g{~_GipZ*-< z<`Jye>9>Oiocq>ana%os4Zkg-{-4PG*Fr&z{j}kous=%s)o)#eTfaH?(Uc1}e(2?_ zm)=M{p_33HFK~U}6LKH(gI1+~{w`-#u49e`DqA`t5+bAm7lL zFP$vh*dI6(ewfCuenOsd&g1##!kz&4BlJ4@4B;kUrFcJeOX`_P`Djy&k6N!)R$lhm zX@4`ycbNx!((j>VH4lF!-1IMx`={E!4xbPC)C@$F&Xe!B8}cdVIS(%hx9#FQm-SoA z<$jQBVW--Ez&+ISDEf=qe*$@g>y1Nc|5Wme^-@{GZ|d^?H4Df$&`8(JCu1`^&r^O8x(9J@Wf6qW=TT&n$Pe zaBB~L7fkmlrd#hbY8NSX(JArEnV2HDl~@)x7MB0TS*aelXO6Ay7-Z)zU+ zn%w<;u|1PUzV55D<+3is=R~!k$Y9|nPCVy6k&7swnw0aQwgX<9IcQdc{5pLoqavk#a zFgE-Hl=nOP2%9J$m(_)E`_r3{KXu&PeF^$wn$I!Q{?$&nu_y61%GG(%B;mRG=|bT~f4~`+za&rb z9EDzw&wd2@Gwc_rwdZ|B?xkU8A=~TdMXv;q{%4j}hT!KHz^Ce$ae)IeCV^Z*mI#vq8AA)92iG zzxOlXsV5M(`W)$B$kROk_9XQj`mC|1?rVhQl4puxzpiiJR*(E!!i_!dy6c3c;DI*q zo8AZU3VD*(1)tJ{tZ?JcjB{UM+hyP(&S%u-A>?s#J*RiBa1;MA=l-L#<+2aX^Jbdg zzNGvTXM7*<9Ln`mzsB1H;nx3rE>K_Ef5LK<8+Z1jCkeN4!t=DvDSsb%me<$w$q!ip z`Is|*K2f--*NV^J0nL+_S}yyxJm=P$dLE>FDh>IewM=9BwZ!=EwkkE@*@k_THM z-^$~*>}!`a^rXU=0cw8ODBQGf(m5Zs$IED!OPzBC3xykdLL6uJqMaWJH+tOlkVdb7 zdri^qI-lu9o|=RFp!skdd1P+w@o~B8`4;V~>q0-0yU&-~|5cQmZmEaAPCb6-`7q^gK!0opbO_xqeonaYXL=Wm z3u{=&5pUA}j-HpvJ??vI9=LW5^dw(_|6gFgcvtvAH4W$AzfwNpoD0f-3+1}^0o^Lx z<_GSR>UjEwaMLe5K6mtR>TkFf@}9FFT`1hNOJrYYxR7x>gFM~@T+b7(QqJ{Qjl*GY zLr?q!v~LfV+vpvZ%l%Ew=ON)H|D>J#vzGD+XI;9%yX>d@T?X}Yd*QkAOb_8U-Z=mC z)1Ldt-Sx5W$bEcH;|R(h{2uI2aa=f-yx4O7r^eeH%BQEJ-HZ6yOTtZkTk+glEAmJN z`m?<6PxqIv6>j8{ybl-A=y{J*KEdZc6G#{Nmp`t4NVra#8V(?Z(+h~+e*#@pvskMz@*;Qy=m**P0fZs7HuEGc5g-ex1? z#5tGMTDY-4-3NKQ0n0s=Jk$`pI}`D0>hbgZhVBRL`Ki%g_ccJc(I4jzj=e_x74^v9 zDBSob?(7Hc{uy|b{@3{LNWOvB#X4Uq7jDZPiF`7crp*>^{OmssBkz$M-+#4wB;J<6 zpED^xb5ri|;zi*`f5=%E`boIaAK~?QG2^P^=PZ}=D825u$nv^=%cwlpA$6Y6Xs@%Wa+T$E_3!&7^rSq*TNh5Or<1$C$NiXaqd$8z^lSdyAl$T9ig`xo zrA@PxAB%pc<9L5^kMk(?!>uac0RGoJ@EW;~=OL?Em2JO*e)qZb2a>zzLwb>Cmvi38 zcAqZX*k9nRgDs=HpX*MVHxBz6e)Dnsf;T)bOrAUk9qxTrY?*N5x45%^_lsZu(ZQUb zUq_yN9_^)h>`Cg0@Ek=?>e=ZJ#sjZg)rZFl*S{%h-!7$mjMod(_+b-oTWf!&1M<%{ z?7$b1N3MZALnz;P8_36<`|kS)H|;fx>oCa1vTiBd)Hl)+@utr?dD_a$xcM$5+fx5m zl#lj@{F~%^H$b^*r=Ru~ZuG}E4@A_-Ibpr6Xq_f}Aemm$7@_d^1-xNt>~c-Fy1x^H~N##e7Nb3hRgZDhtMwVS+Aa!%XJgi&03KU z7jFEPcGlJJvz$UT-rk^mg3pW7`w@0-2t9tD3)OL?K)A6#>g*$zQohc8bC%aAkbmB- z`ez`nz9fHDxWBHr_qp&~g3JH9ub}JXg8*2{-MPdKJA}ZQdl@=y%sQy6z190bZABT*ZYO`K7r(et6!;(fv~;<4b-slpEr@qK-#D?TvPfIQy{s?E`zfJ>gI7FWt!f z%&U66e6es-uY?m<$L`^4=iG>-{@N2siqD z&hH%$rF?8LB2Dw^Manr(K96=jN}eu+{>k*i0sEVB>%NLCmwjipyS7)gaAQxhC(6}) zdk5u%T$j`JmX+kOGZ7)9I4<`(0DAn+^FKclZvDo7r17?wA3VYRO>M8v!cG73zm9&< zmQ@)g+}Ih|1k2xMKAcYO9|im8(4LkDLVxxv@Z-q)kSDobs`gZo2YKF4`8~o-xoMuK z%Hwr(M)h#tN9A`uh~+x#lSh$9O3_|AFC9%D;PtZVnJ(Ov8+Fz_ekV`yIbeEDVD7<) zXTP(*oDrUDT>f3S(VvZ>9d&_bDy05c@8+rFR4+pmZ&p6MS`SeiQJdhWNJLN(rA5^n5qpBvxxaPVL;B5)M*$q?bDz7gm8 z^l8c`IR78WGInkc`G6}=KF?X_JR|`5&`LyI0ri|h9@_+7N`AR;>z^0lm>=1%9~W-w z<>&pjDavQblUE^c=>ALNJm_(M@2sum{Bn)A!S(PngxmQ5&!q?Wom+()dwe$_4j<=& z;KBJQH{KHMTdww#rw)Rh`dsDp!i}DUGaqQt0e*|~JgWLp?c<%mvzH+;m!NvyA)Ue9-+k^S+}g?f8K&RP zCl3_Cex0{(qMp>#@Xs8|?^FOiX(yj|5^k>x`23%?lrK^Flc0YO#`%15?*oh%nup&Y z&pZpR_5_bG<<@;&FZ_1XU!3!GzZ?lWBWI)B7{7X0SNg32GrDWZONCqi@VZ;a#|J1M za`MU9N9VTZ)_VB&!i|3-T>sbof_}%KT=#c&CJQ(19&86Yb>4MQFn768%Vm6V#{E0V z(=VZ49K*co?}l=H&CtHt9pH%5ET>ayyp0!b>`4woOC870?jXgJ$oc?$hk*A#aPf}09Igk1=<>Nf}1#gS}g~%rb&UvJj!gIy>55kR| z8E5}G(Gz}7@;XKR_B^@!{QO^p8$EI7KKi^~)UyWhwi6vXh&<-_;d1iO8njmh$Ne`g zr_*b^l@*~}_uSVq;ilh3xPPtwX>Ey9>NRYEB zzn(nExNSjxKyT>x^S%$=SLz|$_${&k{@Fy5c|V_rqt{sn^g+8Pocr_# z2{-x^zazr+{>Q20z7!hdL5^QuU$)l@$ZNZ|BKOTiyL>~N29ZbZ0oQTraq_Hlp80d( z#-8*O@Z0!iP;_!X`rpahmk2lVA?GK5pMEHg84_wJ>VqP z>kE(!52nu$ZscRUk8d&USx@f%p7q{Cp(pkp;-?|yZxU|wWO;5`^=!19#?^SsJDGMm z&tn{>{6zTqc7A7;ht?!j+_XqjaRlLBZ$8&zKeAfv5#(n&5w5K5XJcB&oj7K*KH~RgYKcjTdTQ1z>$u-V%HMbdI_d#qP4eX#C(g>y|yqgFJ_z{*RKUIsZI_E?FSl*y-c*c}mIGQ9e@uJ9Ylw zXf*8f7D4kXFxT6;6g=iU@3)I^n;)Eg_R*A&JHJEMp$zir;kErUPPp+;+PObv=QCh` z<|DMSpY|Uu+?LDz)0X6?ll$*M3+naG4Du|WE2#0j)^dKi##{avqrdL!7U3puWH^3x zq{!=5Ug9ku_0o0h9m`>-?{3(m`T02EroK^U-h00ATS|47RvKl}(!2HB5J6K?z&WW05!{>z1%_KLg*&H6m#rPSlgM}X_~ zc(*9qi~Ajg)Kezh*cox+@D|F)8=+mEqx?2!LQi}p_(b;WJmGd6WFA&~#t1j|yZ0m9 zNImZJ^PeQIbAN}`FTZc-T+jBaM7asB3+2(y3xwN#bRFVTuSYV%jXnO8G4ImrwIi#* zCTIsB}7=74JWZ65b$wSA8gZuDoI{9jG(=W~W<($07 zcmlY4j;@n%qu+gA@p8(?oq6VN(m+N&>fATcN4W7%gzMqjf3Ki?oa+^Oefm7*LodUh zng_n4eA*dDW=x{rcn)9Jw^s=__M{Jk9=&dDIT`-k;PjUn!i}A&k%%|#U#lr!>WrHW z&w~B{pOe{|{%kAU=*j$mnreOxjUq@sBZQpy(hJL?u9lAkyuDsfK z3goknf0hWh_HZAhg8lsu$_Je5%Cn~C*8hg(63@J^LFf4goCANRoc++A!cDocUd#{d zzt0Fa?c(wGn6zIUdM@OX&bT~~Ji_@Khg0twazFP?l&=tO@=TidhpIn+7Jj?%1fTD% z^XJLup zEbFWN<+uwGKmIwWk;c_o!i}E;d|t$G>UmhWvD1A{)VJgT=e$#hf1fqG@R-=SrlXgQry{mJcoQJxqCkF3E`&P z4DWZ=eEW@XQ?Fh;C#L$_IEoqV~K(`APiU96wEKaV_+Ro<_SQ$wvw| z`j_w=PBZfFEN|=udEd}5@{^`Pev-4le7b83ak%dc)HmZi2V;QcG@{1anZk`9S~=(3t|U)52{SBmF(v>)9o+{9aeajW(HnLNS#e-LeLeI4v9$RO%8 zp05;c^aP#r9uJepQYcaLYP0L>@xSG=zP%ChI&O{=ZrUZ?9Qkc8CdAu>8^1N={(AxK z>^ciP$@zSMd<^-e&U)_+!i|1E&qt|$R*}2UQQY+{WT%H1xb zgqwQ(==kkc;YPpjBQ!``+TZKu+_j2yLpDWz7i;w61biDY8dg5adZ&$P2X1C_9*I~kq z{sQ_(^Vli%$lqz@C2#O|V`ou+@HXga=$ym3S-9~-bQLo8LrmNm;kokv50*=R!q`2-^$a061r~4uDzaXD3+|(=W2si$ZIrGvtgx_xR|6GhO9^-$zJ0b5m=b5{Z`+43&=V>E_8^5JGqTDa3XBy=* z?;!qXkbg{h_c@kL=0K0fe6D^dBoA=@sd;{ya8s{zEBIkH{jf>p`CN3STW`O+AfIva zq!&J=UtWH=XP^GZb?Xxj_Y3Fc<@Kwq9#k@JWY6O2k{8BtwPSu|3rG_tU;c#x?~UhT@L%vg~bTUeOaDcm<) zSv+oZNw{oWRY_%aQNJU?;nCy9TknYz$5m90EiMn2RhLv28{MI?qOnk369#n-4-OCN z5*}2Y9~f0pIkC8Mv$stT7^6pt*a>{vE7TArWZ zZMgKZ;t|z-#oPUdpCP6nXKbrem+pVoMU>gv2rA6)DAgHVQq4#Vj~`biy+0hSs45&N zarO_@Mf&%I;>xn(an(g9l#LX7`gI;vUNWg{LWjzcV>+G?lG6JP>K5+Qy`rLWq*O&C zxl9_NOzPGnto_aWDc?7ZBek-hNMoD-9;g59ZvSg4D=)W+Lv`IEXp7vU#{I1Zrrmk@ zCDNM3BTB-A;(TA)+7N3{Ro+RgBPS6;3D{P%lI{t>lfth8)gb)Jm6(w)T#2Et&<>%ST}*zLQW*}yBgR)&mPpOcs4(@Dp>1sOxRF(V zmMjDJW~u1e^k^A#<$XkPby>wYsmZ@mZrF_D|4zyITh@A8;%W_|f2U%3recGtx89KQ z|9l$$>#VEiIuX}5FT4Gp`=`tz}{P@V{5TKMklIXL+5fqUAEqO)M2pmX}pkn<@L2 zFJsl1(A06`)-6FRvL$IRzeCBSXob04G8Z1QWWehzxybp;lwgBmvm5L$O8HwxccRg} zBKyb8{;P7-a0v;nd)WmsSqIzVMN_jRg|#xX?!l!TSpgGOe=fS!SjH0h0=cY}^~CB5 zyGSD6FO?NJ`?pzTF-v9@Be@`HK9TE3yZn+L2=^!%RXo1D8Xu07EAFaN{U}sfHr8A* z8z$>ToYu{t8`{PKo+vfMvp6!#nL`uYegX3&8!agv&(^I zg-|T3wM1AD)(sgBmmXVQgqh0xv$fc= z0U)QB)ZNl*|D77;ipabU|6Tqo8aJxKE_9pC6HKyXW2ojX)7H?m`G$3u-L8spvPAg* zvtgU1>A!~MbW`WSvIA8$woKA+#W-US98@c#{;eF4As(k$?3iEpAH!xQi_R z$ehs5(Q?+YR)Je}fpu#ZZ7(1Ht$K&I^qP6A)?Bu|!&{iOwrcriE$mEnQmJs)cXqV%%0O{D^-u;I?!*aI4llEPL$#X63_jT;ty@zu;dkzaz`9 zz2ecKQ)Nk2Mfn6dV^LB)v7&O!pH~I7S3$PI2)hM4r&}0%|Mv7D9F_wz|8977`IpPj z|5wZ3(tYYJjIY037n8;hNagh~U)A{G;i9l}xZ%%Ub+~N)OQh7?IO~%a7$a*pCA$5# z1)4PQd!D!@^O%m6CB-An(k8d+Iu4daAiLC=7cS^A9@~3z3M;>=S_CJDN63oKm@N$N z|A)%hiYF^JvsQ9ertVpe;;L$Uu%pDBIs6Bj>#wT0#S0Kyr=qslElB&DSL)vj`c8Ix zwp~*5<1JU%uSZ>*&oc_b*O`ZSlqX z<`xQHmTc*;E5d8Q#(ro6YsxU*^kytkC}vn_Ie0vQ;W;3f+R~!e*AK^M!vvb>aVtnJr!G z+RQ5b^##d4R_OnTnJwLd+A5X(#|r%)mEF?CIzDKuO?Vie}p9Y#&4?2~sy;iT&B z)s^Mu3Uct|sJ)7`yRGK#B6A;tTzi_^lm0x7-><`{vDNt#3OeK7p3cL^j~Z1{X>R4h z{@RFIyK8?-N&gx;233nE<@Ao+<234j-Xqm}CxJ^We(`t zD^#}8+qT|Kw!<4N{ZoBMSfvrJ#E;J{lw@91I%AyXr}>MUpPV}#Qg*LA9PlotGfO=j ze$mjGg->|WSuO*l`e~i?M&pNk`}}^1E)vyPVOIzJC$I9yK@Q*NF^KNtPQZVrDOO;MY? zg7&eW8ScLjZ~Az~YqL*Tf;1oIC<9w`go%DE=Zz=aiXwA*$0~#%N z>-@5qqo_Ttx&JAe%&7M5Jw)Z|y}^RoHR~QAIXa)^~)h*tjbXG)K73D)t$1LC5rXi(Kjv=sI%!OMqbsZCj)x6 z6rHO|F8Ud?qJ56a!AZO1i5zs@DgG0`aFPsu=I9p8`BZ+pFE=mf+(|m$ub1-zLh2OH1J&WAXz z0`Bi?)*($HJU0YGead;iNTaNmvs&?_^Xh*1>}R1wPM_C%-dnrR9Y@mK#=ZRwR!V-K z=@E7sXonw3;L~JPSn)8 zlJB<{pZ>_#1WI$a-uXxupSUb0Zoo3yUIO}Dz;qN_$^-Os++$PB$0rX+?M|ng4*q-D zIR-2geQGKSpk}n~bB6!j;HX3I=Go(}nDR~S_xtqy^>(%C(*K}WcmmMz&4>&yAaiuP zy!H#}(Ioo~SG`&155>>y%i{ZD`9r-}^d4RHmDV3N5A?tJdRhB0$%*^)PuQv0+g>Jk zh!!u2@}v4(&Al&^j=7d_%N8318(U0@6}SSjErL}46}|7Lr@{tLH-Oug@?@9Y`)21v z_@?RSZn}b&jov03-aK{Brc>Y|HfM`x`ANM`_hO&6f_F^s49Pn>|9m~V%kFN!4E*a> zKAEUbemJ`vHGTBt?E3oi-5H^*vrmKn$%YpV*FJT=fF7ZJzjF8aW_aFsm(+c%!C!X> zABOLTmjIVHel>9)@Wb#L6gf@rly;qWI=i_UTwk2MzZ^7wFLAzi_2sVJmyVn-T@OZg z18C%iMF+)4xl5mKXtUb9mb(&HUm!YPt}j3+ad&pz;+B2qme&vtklGB-E{Ffy=5agD zci#{1viF~H=jOL`m-Axq;q1%hUGtaRmo#63pbTzXtdJ)wf1F)@X|d<-R+#>T#-~J{ z%@bml%ld*q@Yf{VRqgb@2 ztC}aE1#bGRc{O_4#+@@Vp+2nIb>gdLKK36(3yW!PP z6^`T4GkkkQTPQ6PMy~u5azH`4*Zlq9h$bF#pQi}@56K`?Y-f6ui1kf(pE)smB{WuL zjLsk9*)G3ZB1}d%r%7bcL!cg_Shbv_@{2DLe|70`4(fVE%zB#Le)71mT0Qrx+^y*a zLB&K1eYgBW(V88&-_3jSx;JWit(X{(1k?f@}+ z`MvghIS}FfvX^`Lz4m;$gIBW@O_W6;l0*ZzuSgy)H#K+Pa{&%s@tQ}V+*muE`4)HI za{&&KZEYl8WeMKq{`)P0Z@877-B*}vuAv{s?;2PW7nkWZC|6QWs-{O5%Ai1 zAXeyiNS1CDt#a#IqW+M;ZlbidSj!Jp(N^IsTiw<*Jyd z6g&ce7S{_8X`L)|hq{p*jK;~lm`-OobCM><=25>)S43)Zs7qKs63{jD4wF~ zay~0?#*>q)C0=>CM!jqSx?u&8B0o?#re&eEx<9`IKd`;e$Ee}g?2oyv+2{C!ag^mK ztV5`EptlG~RMte}w@Y~Euk4N=xW8>~Rm#}@Y(eGq%cc1W{ruHvXHWCGMan}AURgS2>)hx4?RQmM)=zu&?WJoRAEB42Qp~bfr11ADPaM!r6vniLK3`bPfG!lnzFHj3}nP?ep>#j^^+ZaSxsTY z?v_9%9K3A${>c$t=7y@^oA&Pm=ZgnIINv>R`>-=+DGqv+wC_F2GZEoKo{HOiLol=# zT{}tiwLcWVf*rcjrHa!!w(UOmNqxNJ*5BM*;hr~7PW8KA&>e}YDUvy%Xq9qKUQ0ZQ;3Kv!*dfV>x$bCt@wBo4cs{KSLd6Tlm#q4@(Pew>Ahfb{$pz4O zOC&KUGK}P8TFbI!!kz*UXz~+%zBb+CP?>ff(d?9dk1jP9bTBic_cfovUA;W{o;_kL zkcU02e5n6Dd(OdC`h&}fu}d8z0g)?&UF;*h@7d%T(0C^=Te%sYh&hFuK7@O{e{BBH zCg1Xhf+Nl85=#7Go$C&Eu#|Bbb>$)|oo{-mJ9t(~PQsi6pdFLVia-Zn>mrbIipW+Y z*hG4n8w$Qz?I)^9^abBdRdIT_U`TuW?;Yc5H6EV7+x~G=#An+pc+myHpwU>tDCgR| zXzr+TT8*b>`@(l2Q#NHT|x3l=jva)d=uc%7BWRCh4O?3DdI*46GxWp*y@p z>6FqJsGXS1L=VcFtMMa!SYX#v69`?67sYBfv)+vB%mCO<6Z=eVvT}-?>-}f^YWD%K zdhFO!!-E%(_w8@&o4n9gnbgor#RmIeWG0mVE?OiON<`>zIUlJD0+wVHlHuIxeDLTwg83Pqtj-?mnLw8x^ypdN+^0e z{B&P<;15O+d1(PB_R-SdJGM}ITxH94(-k*fzMD)O-^71JS0WC7yuF@ps@dpiWTbvH z@(HsKy9L)Fz)!zG{bfD;@a<^;Yk=Ml>qaKs_mumxx!m;l5tcp25JGgU#K+k-uCabw=JVPSg^!cX~g?K|{_C=XC` z>F+GvcmZ3}xf?ZHzxBpZ3zmtv+}y0QX}DF*ryz)^Bq@i$-`+BBY<9Nxbh!6GRmB20 zcbmV(;eEBot3AZ+SICDV{QZ{bMbGz2YZM?H{(g(}vInePCGX6}&Xa5w{PUj1cCyu% zqi-mGn=R679W@w}>h)r8(^6wrFBpBpmRAf`JEHmG`Z&5jHD8H7v-2HancsRqtnwt4 zR=drvy^i&6bEo9BtazK7z0jHm5)hNnH(0#bt=?w!Vt0Gp<%`Pp8?0aSUT?F2(c8Un z1=*c!Bj_zvTJ?Idtv~pJ(WPj4MgPo&SV%_=hTd;*V|>!}fSW)4Ip!|=8g_q|*?}6B z>bcEoyiv64$-lVOcA%3~d@^Q%8{IZTn1(sC+oJFjv_>6C$*2Md~jY<=5 z_3G+Oyi427Ez_17ZYChtKY8x93;T1n=eA5&Fj9LmU3bo>YbP(^ijjK}M|eUFrs#AMfv$Sl^VKS>_Ib(^ zOJ(=>U8fg6<14LIw*mZJ7zmay)2Z?lYbcYNKYjEedjtYh?EZ?lNe+r4lFh3w-C{4~;>RBd-X z|60A(Qh8P{8eNZ;SM;AT@zpUjqwhus84Lf@j&L=&(!t6k!Am#_x%rd+19~eiTsIy& z1h4K(Z^Qf4nT<99f(S5`yGq+^>)S*Lul9L zbhx{)$NhXsKip^7#Hf#1v)yjd7c!*l5-fC~PQoTf*1&tc~#I_lhJLISp-yN*p+vX2MIg>8#$oeb$ z1k&An0e@wWK)T`EX`kxizi8v_zB{`e(=O)Lfp(FF!$b+PM0B~&jN?(l;s;m!-)mV@ zqKSdp)9lwAA!<}wt)9b|lZI>h@9jUCdHcOpWhyk`l}ED8R{uh!`3euazxu4d>7I(T z{$g#GJE~IaFYO#RUyiChnC14@tJ(S+I%nmT6>j}~{Ui0ts<-~uZ>5Cm@A@L4k$P|) zQHf~g$hZ7NlB@s)b%XmkNu?&~RGQBJ6m>L7zjwP?q`$KcwS`hL4AQ5FzLI}GS#L4$ z?cw3wo8%O7cw5qc))7)`pwSU^mCoi4M-+43Glj#KnHZnE+2=f5UPVqx6oQ=)K` zK0zZ_i;RcZWuSFfKmY52<|bv+-F*IxuQ)&P&?oPsAD-6S!VSI-oYvKf)Wavghc!LH zhcq1+fA$<5X^+eGGfiOaE{Lc7Y2UA%%rSHaZF+-(^^rHGtoD9HXu0oKlKsDO#9#T} zv=e#tr$HaXcDc<9PlGAzEkAiTyxwDRiTdGgwD&ju*z+6Nhg+H_f>AnI26?%=Iye6& z$@m7Avpm{O>ImuVVlH&h9Nte5AwtUDiNcS;!|5ioMmDj*XV|_Kesy>sS zKYYMwf=o^5aW4elBz@S?#KbILub1n8Wf%X0K`6uXf3aBO$$z{4k_~>>uk-uGt^4h| z$4I-^%k5yX+&zB1LPPNS*?p{Rx>@Q@ReQbc@#jyTMYhDaJ#YtQPdJ-UcD?mvhC`Ii ziidpiJelRmF*U#9`Eb%7F!FJerkCb##EoOynfn;I#&3muKj`1U8;?Uq`#;*QW zBng;`pe@$pV!OczXLLVfm~fnF3M+V&-C=Aklq2|&PO-E9d-q3`F4w1pV6qW^YIK6x z(r{wAjdu7nNKR+@!!}!ur&F-uW}C0Y!*;`8)1A@8oTo-KpC|k>`*UHz5LhlKrwRK0 zo)`J}VV3_ao-&tpMv7^0d!?8Bl0>x#n4~oJ8I8!yhsdH1(Nwu8&r8CnzNVm$!-C~4wFPAYDD{(k~FRr3j=!er}!fcuFdAfW&@6# zn`@>AF2BdyoMd2^)}OrM50VV;)U9P>?ln!Bn2MIL-2UsN53!#TM{jwGlJsn{-4Ww} zA}0nB013LW4c>m+9FxD+u~>+N;DrFydHq7r zy`6LA@^hyhb*jK&x!hrDEYEP>Xi2#Hx=4CiM0!rl;lPJ)c+HPtAjWGW3Lr1|eZ2X) zrBTj9O=wy=pgED>t;WTANR8WZwI8(;E6^Ir~Fs*r<*kt5VQ$>!w4H+?xcKQ zW7cT;xcYAbp|uCvd1A=#lbYFrQkRQ>rfw;T>UEogp>EKVgmOK%PQp z(O(O*Q*5Dkn4kia2S(Skn86h8C0F;fLBy(^_0E!Y7_NPdXc(*hL1727Qw~LG&Y9 zHR-KA;7$NfDYpslPuH!{yJ?NQx(c{rO~~YTz^~W;?_IvjiO}#s%2W9BX?8+9ZTZhF zv|^fdKNXAV;J?m4UkuLP53{6ZI0I44&I(QHWe=LMxV83CTss83Lm+c)R(;3{1W->4veu0Y$#2wKl>!us`-PL#VBwF`!UZ%kM=#(B`qU ztoQ?R8|&Rv5x0)>-eFxj`$}S;z_5$RT+%v$I=|~j|2WI(iI?(=Qlcr zTk?cK>M-i;a2vBu*THx3`QNkA$82<&jW8PbhQ2tu#s5BiMuhyCLS$`NKL>_2{{33R zn)JKf-buH6bkaFFIz2v4ddV^FDcD+azYr@3f)E2fCr3(wQ|tv6qRKa|44bAQIy&`k zw5TQojVy+6a#%|%+{P-={t_I(0|yD>H0Tux6iw0}<=fvl zJIj6~+;rucC_-y^VWC?_UTzEN|5!>t{^|OL^dn>!OG)(Bkl`UYc=&NhLQD|>o?*j| zB>mO~2zVAG!tfvCF@B<-YlRlf>!O5$mOJ6xQLMx%B;=jaO--1M5NEzkpZYx$iuh@! zqp$hTY+5`b+r=hc;P4|0o%U5cMhC)X)~ub>-)t-5zHjLC(}oU*Y(RVm)}Sq7N! zUY2dYu9rWcy{1+V&buyay1>1!=K7qS#22vm2!Pb$ zyZP%3qKT#dKll3YQqJ+Vd^#i_aRGd|lMR=f3=HdwIr6>k1^NCsT>Ac?wZ<#6Ux9B1 zAM|Mgjc>#SGul{DH;3qhq=O_L<$DnB(G;kf3{N#zVLbl^S1x(OsSNQK6?BmCDaE6I zY)CuwtS^(Cf(oq(*nFoBx<}=kx?e7Cp1Lo|H5r4$>W9ye?;qPmEvfkqjYW`67ssy9 z+Irg059Z)aP>Gd4CF+n9(!HD2cwtqq*#PgVvb&(887eOwXYUaj4L@8}*Q7dBaPZ;j zX>fyhN(F&PSh#93O0dNdL(oSN1ep21DL_^)9DK5>QWi|>sXi==n@-xA^g7g`T*EMQ z#Ez00n1ff5KDK`8CBpN?3e8MDmS4aBV6XSK^%&~bJTV89{+pYr7Ef5Eh=1VIPaDyw%sv#;Q* z`v;-Uk*U>qqBKjldyN#8$!SzXmYtN63mS=(hvE^UZoVKsWn-R0!bKzFY*G=fCh`2b zV_-E<_O#habvE=f@VYAv?vFF5@a2tuxXr z>Tt6#A_FcLMhdMF_uqcPNaw+mTQ9M~PVZmD2^gkAJI^7>CXR+Xj;>HMcC z-Dx^lZ1JHF@S1@>u*;!xTgKo9<=yTLh|zf%6D4#vMsiszRT;KnDFy55i|}YJdzm9!Ka>bEUtL3IrOg0%UhQj6~ZN;3Z>lh+s^a(Wc93eIZNLq2=KBcidWfc zz5J5PVwa+kIh>OkO(ea31k#gsDmV@W&0x!$q}A+J*Wh+< zW;^)lPAF$!NKR4BxKkx|u=xDSCIhnItz zzz2jWpL99DO%AoHkyBA#PoTWNoCDM7F8M3_YBBqU@yH9DMvOC61F=<>&9Qf#+77?-CQ}ka1vUlIOwc|*fY z?91g{6+YnZQB+G;aV@@jPkhSfV~)|(39i^P&OnK(!Z9DNI`ZBt`LkHl44>^1Q%G!3 z&l2Ccx;Q3>IVd=UQc|Wv8!d@Nyp>gMob-11v46_uzou+XN1=*Gi`B?O1Qs9?CS_Y2 zWQlkhM_wJbLkB&0rYrQ=%t%dBa%9ky6nWsJ2)vXBQf;l&m0PYK!K>_Mf97MFNJ^FL zjB#3shaPr|p;bh$Y!9HmEO?;IOJYkX$$ohcJSM%&UfG2*b>fZ})yV)FuU4N7Ko&Qa z44BStp5{(=^xdg?xYvjjJT)3iol=_k)$r6Ocb{*D=e5fHllHqDOal5&Y-0Y^-#akz zombng52`g71CSE0nVzU?u5g@?ZR9Qw>($yj)TRl& zIc)5(7+W2<*j?1G#_MO;HJJGAv&za1?+6fQA_w$WQNQ0E0li-)woanXTcBv%A3fx> zrx>bU4~vH?#(TK&?4L~@0L2zd^KLt|6%0iPvzpZ z-jnnQSFFbE{1EehDeQ_(-KFo2NzPlz$_YA;&~&)v0ynVyWfc9eRMF68H3d|nhyP;A z;|cyB$`P6R_=$oNZTPnsk2m0sG34@LNNPKD=*kF&5k|gZNC4dL;W2@FSJmlO+R8=S+b5GOXsC^x>4dW%_H*kohV5Yxd}%VMuW;ND@7AQiuX<@f8>Q|Np)|7&G3m zK1t%h++Z0GOLV%WzjtZ8_;Vl#0M4Yt`{5=nl9S5uIPeu9Dv0KI4Dyg7ENZIlWL6Ol zzOnujl|Ul+NNEDahs+WZOkZI?v+ZQXzLKhBHkm&ls4<~gXPiRC{y{yVN3Y2v% zi7qQpS+VruS(v3q4AXrY2;4Wf-vF`8i1#q^lxDG#mQ#JcyZ;%zswG?XZ4GEDtd#TIife@ zfr~j%$xjTWJk6*O^3t}7%Tj9bPsb%dBhZlgfgq3{Nr>r3G|l42Pb8D2)B>;KNG+O= z&>4%r-#cv;_(iS9a7q^xlA1UG$r<|${)T#`kD~|R>Xo~z_SN^A9X~wrsw8Ao(eLcw z$&_ApGh2QoRuE;<#C0hVzU1F1U@|pv%AUqa6`Cv|Z#X)_>JuSQTZM z+U1vesWsLM!HI4S7(xFzsC1?j-0cVxDD^;?oSUceYw|PR=g|n091(ExJt(;HHJs0z ziHtLV{|7li*E}>5p6UP4{{kGzb~vR4KhmCljgW~Up5%*KIcTD?A+3bHYRotrZzXc! zs!c_oJ=c1(El3)azh@h5%d~@+zK`1MdYU;bs>K1o(IobX18Z^r^!xdS=@Z#D^!MRE zUo=BRbH5++YY2v^?DtC!C$j<>7!d4?(*|1?M@SB%RgnA%C>WB?<{2zRb3m+_JxCif zk6VCj4|R*|dj@+NH|+q!#FG+Bv$Q*ebU@ni!NP2##efx zSOG38=(_CwAd;vo|G7d*0^!nxT!%7wHW;8sxvXJgz2gz0}&NhUO4#m&TVaIT5Z#+ zqH27h33OapPPNP9`R0!2Zd^wFTBS`6S_HAHXi?g1KNJWlw}++GKrB>l9&P3TOrm+! zCG?+_SA*~EMc@fp5|I8R-Q2M%5gr}rz8l(fjTR@Oh&Q_~XLe>nvk zgKns9yeDB%?_4o3S=6mLVHItk_C{!B9M5g7S#fTBpr#~_tTYmHdO1HC&@WOX6u96_ z8L&Qw0p1qcWQ>0fT1DekL_<#{bKNJ=P91-cvFVu9}N?Znh20s^E!GrI&!xgsZw&#dJE$ ziTRQ}=>2PvOqc4dTnL&on^}9v#RY5JqzIar|7#lb*deWj46#BX0h1g7d+>p$#Vujuh7;}>$X%ojUzEv)hBN05FHwe8@uj{L4aEn z^4f4{zz}+&lnW8;GhNsKxhPFpH$)|Ne_cBmJb^h=F(t`M6f`Kne}hs|tPuw0atiSQ z2MkiNs3~T~*}a^n$48{B;P!SO!4p&iB&qI~zdqJSaeT}{+CjQzqZoym+C2lxX7ZJp zo<%<+VL?);9=1*WEImfI15pz51+LWhsSRSM384G;y8^7NgziGSGIODK0MY6aD(GY} zUVw90vm(pOCvd!2C&jbWUZ$vgP4UBSjl?OkwYGSXN0kl(X_GP>_cPeP6jbo?;vkrG zElt%w9D;AcAs9g#In5BdK&ptMdn4vreZNG{A@?33aNJ*q8PAB?7syXDz7c-rGEo@e zmM#}FaRS(@i@CG$;!u~h*=IF{gik$%1T~;fno}_OPRwI~h31SE(cGOiC04Yq>GTtN z#gJt1)tyeS31%3ft_rx65+u7?WuG(NwSRxBf=PK$eV1U1oJUjX#vntY7}=fypN3_i zTnONeNRD)V6w~e33|e~f9Uw=}we*zvC{dD(glr9x#6{@B9Jf zgqUJNOVJWN!%%-k--mDL)hZn}KY>!UY_I{+MjWt-m5t&d&rDc?Qmk_BGxx*c;H;_7p&nYo@ z4FJ*Op%89dL*JIqpp(lqr#iwWpSbV{*0a8{3}Gs5)pab|O8N#zc)py?Q28JtM0ycV zM6HUhZ*!pcm-rXFrUkPAHV$o4Yu=O89Tt9WY+uhEAwmJ@upYgF=0YnG8R$E=*=_^+ z<>XPVWylnlrXJHN+?#3K*_}N zrRR}QvWEw34pB*+j?rLEag{A(7*u$V^RauK)_7 z{vS)5yQw$2G{c8cg+_*B zBq(+{KUG|G;+s2)tB)A3`-eupo(&ta1}H_6O&L zK(>$2*qYp3t_V`(uBSioXJE15>z>m4n!&GB)6wiOm0~&?w3D_3Vl)#9o@r<>V`PL z$iRT8;}aZKU3BSt9x+!EhddLFkAPQT1eQ7e64oG;D|6tm&YF9?ui%gyXbmD_Rn0zV z-HU>Y$uy-}VX?E%;_dq>I`TOt5Ka!S%%-ZmvN;!onwd64d6WtW;tSQ6l*%mQ>(nsB zM|epsLu*VZI9peM%SKeNU{eH?lMFV^2m6X)3?K_R%3K#qr;a1s=T+y)^Bt0EQ878D zwpaN40Ew(Kv}q2QqG128@yTto;?_Qt)h*U2AnmR9Qsn$@^_6^v#nK^dgw~oHXz8>M znw(UIFC;zVWa#QL5&!!xV=#0?rD**#W#Y2ave~x`lyxNME5j1+(9>=gc_}xaSkJ{Z ziKEG#o{1p0p`V5ru&6oH!}buaMlVkcQPVOUZ#uj+o`O+hwzYv$Lv<;LXg5xf;ou|g}`V? zTcu9qEdV*-5mR)7Sl}t4qV&_ez^G}O*PucS`19zIvI&9etC%NiA7VEgyn}&akG4dBGsG?EN6Ivi0}TjExd{lHrKP>_}oQ27-c!`tL4M3j1LT&xia9PEY! zE{o)JN_iR~eOo1lI)wl&aKOwqi@I4X4xFMmP)>a=7SyB)EIC@EdH&Ch${Q&zCGr`$ z#)q-b$S)d4WP&KQfm7&J6k;Sa4yedvxlNbqLgjhi+wFUnsN`|d_!~+>7$ND-mc%b=xH_m5W}8b<`NNR#0T7cT zJ$qe{F2`}&V?1H2gMN78Jr+UNjbA~f=hqdKpH^UG)O}6gk9y`aX14czlQ*rQ9O@-@=A~46b!Q2{WCnY z0C(x$!Mf7yS|um%6?FYYt-a8nc@z~9LT>^wb&KZi88>T%}jCg28s0=xq|Lk=Pg z%$@pF7~;nbaM8<^92mmXvBV+*5D;*&eV2em8i&6*&1_j&_GH(_CyrHvT$;`1{=p5lu$@qvweVn zayVcN0#`BVhp{C{`b&!S6M-ztQ*;&RG3g!Zk`jq5d&msZ5Uhf1hcjlU(FYfzG|y(S z$KeO#QYh{{dK{iws}UMD_ptro^+15p0^-l_AdG4CXI*%28qCExMKJ|*X*Au6VF_rK zDW_AqlED`Kb;2J1d8|uQ8pgKa&cDnq(>O(&YUyCWB6%a?ag105e4~wZGQuDyVcO2& zc@zF<;|7y*?0%#ubE0{9ZLG{cN2DX;Xj=~{|OObL@HCV>(9leB;7>HEGw=)tpk5cfW5 zk>!+wgo;&&T)!H_4t_~fs(+&V%rXy%AcUNs#kHZqujWxQ8HI{5Px>@!ggKvpg(biy zT5kEFs~bCHonkf}{&82YjygHGudruO~(&g`Axm3ow`)x_XE?sS}C(+jG`${aJ^7q{@ z7dKB`OOjodFFCc+X@W~C$_#fli+m)3H$&28o`0FH2+zQwq8q@aZU85>0_o`On=3a! zU6ZCGDp3dyLrI{_R%j#t4z5y&4?MT+_z|EG@JvDhqT-DoNjcSY6ec20(gvO4>%Cck z!`e}n7}+%XR5#^Waswl4!pnf2&hO+q`trVK4=4j$<4m?W4r65dioVN5YQLaou86Dj z!klW#>@+H&agjfak;Oww0|U~OQwnK%%_%A`Aqg~ohp*=YjtDG1oojeLm6ORCCP@rg z9DJ;9(%*hv?luU=(9DysG9D($8FU~dj{LvD5x}DH#1U0_grn{D;)o9tt5O&ov;R0s zC5Lp550?el{D{*LZAEB=;D#fyNdiY%el)j6V+A$S1zg!TB0rIL#h`|2rLB%O z+aRE9{?+%&S|80;z-qgE)@z9+H1)H;R%21!3bc+=NaINXb@U+Aq8>%o$l7mIkv*sc zs+t2@vWf}&H~WKBfGDH@H_7@e#$}B{iFNDx1XyAaP6P_S6yvv)tAi50R1n!bFD690 z?Qy4TRweIfm72w4wwF02kuUiNxhf)82_=l?-p}hp0Ibl8qb(*PPq4lTm;%-r$Tf=X z2HAV%1jhZwyG)TrV64q20D(VCbctcw%cO+GGylp-G;=S}J!;w7A{U&EH5NcL1>x=8 z!0e5VsCl{8!FHP()nU70k1^mSH91W-tp_O;v)pZM1 z&EW`N`2Wbs7DYmcD?D{2#{e}26Dq^W)=emNA82UkZAQ!4W>B~xD*e`bcDEGP&~WP4 z(Bj2wKlq7x)@f723zDjS@iKgm+Bm!IMvBKIx}h(dpsJ51*GyYXq_j>VZTu335PLBXEQEK%BoAuPHIY0piTB{CY2-CN#^JxEgAiA>!sfxORh+X@@WS#) z_#SKDpQjrqQ|uUe4~h(?CC3M_ec(1a+G|=^MW+}Ce}A!S?bgdig*T~j_=idXm8_`| z_gONf@@@%v-+Ddn)}~}dDlLSkjp7w0)V6iOu#&Kh4%-y1)~nE9dJir4hbPoGIYn9~ z8$ThJLnG#*O5Y_^q%-YnT9>9!v7%7IfOD$sPsrOBc3D)1O?b`xfXFYGvob0seg#5G zQ@@9bsC~O(Z9CoF=P`3_tj0spONoyuYg&_(sYc~aA33h++7@4BB;6a#fV0DwGz(>Q zHgXhA1t7`xY_nNT3gD5Zm&N^>=6a8}G6(PxX>w5*cNvTE5}k~rye@fE?%JF@fagc!PJ;XiJ72ZNQo~g8bvOz#o>8$l zK*y_VnOfGZ?gX?G!bIxGPSRPvcm(?$WAZ|$K+e*J4IoJm%Z)^ug5eagy9F z@0VKwJxVY(fit4PC;aA@|27G-xNbA;$Ghh1jnJd zW6;fphT(8o6No5I$>@|8@-;h}ytkC~HA0;p+I6KuE`us=P%1~_ufCJXTaGGLx@7tw z`=X~a*qI2jzhMHms0wpnlcnh^VRTS76<%;UhoRD`oJpsJJ36A>Q`meGkh6s!ka$)5-L(ZziI` zkL(%n4}YZaIP)#o+K2a_70pEKWO|y69Nji_SzOLLuEnxEV@{)ETZ|nSg#V#;ryAug92RhSya~N~ zY%DaQJRCtfK)(MeTeMi^J2HJTa*+xzh^Ksm8n;Eo$szvT9aKtJL5P+Q2y8K5OR67v z%^yl%{3Epk22l;jPlh1|6YOzzg)x*Fjb~(q%#%t!7E@G^2_}lq|DMqx^UG{>osDkj zi*G8m&@vLz6qdzEt>}&gS>Mh^Wqpfs97J(3kG%G+1JV8EVTtSEvmc#yJy*S2{r>7B91K6>Ul^k z6MK6Y17!Vfs0KqhK+Xd4h#{o*AlnFLelocm)~bQnjVn&pz0piEOV#%lSJT+DSf`!{ z%&8?3vB~?FYWjcXtG&W}wMf?hBx#hWDOTucQHH!&0`dWo4lp2tF3C11YtavBLBp{3 zs_PTIh+&RIHV#3R0{FO^$!#9HCL0P#4y6j$UgbaIl?xz_A)@$`4e(zmFRF~OoH051 z0wX2OLaBp1!$SiH6pr)^%~5{@Fezvc>4FTorXG_F`R(+pE4L} zqWcX^nnR;nZ-^WODhr;o?oq2PE;zlYo+_5T)fz~JtM*GANSY#qy&+1!r~Ctrb|t<6 zFobd2R^Vs&c?QEzL+*%?vLM4!Z45V(<5@#4tT{})wIWahiog(#e7x3D=Rz#`27X$o zW|R>!clL$cx=b!eT0V|i)4H2Hoh+l)*bGe>x&`O2zp~D|u5R!0 z9yn+WK88`m2pYgLxYWRKDq^Xz{1HLDp*HryqtxbSIjDlCRnMf)ncu0KiVj|Y0g{H< zJ~@3@7d#gUVat4#ZKyLv+Z;D5FTXdB6F??aVs+^L_&U}zKjgE0G*Tl(@4;tqqLKE5 zpFtK$6WO3{(o@YJn%$GeH<2=;!FA+q-SS6EOntxnWouwPbfWwMrn)L?%)pTq00wf^ zNL-7EEjI3jTTAdZ(<+X}8Uj^WjE1#t%`a|hc5;@+P?F+|8iOSFZieHztE4!@gaNik^C3>5uM@q@e_F`G5-aVp3we{ zzu((#^H21P+D`I>E(k8P?5WrwYoRGeM@S)!k~8ilk9dyN$qT%*o@5Hh60e?Gspr>f zMk~6;Ie3*O+VXh4SxxbEs#iu6wZuA^nM>0p>)-5g4rC%aP1oCu6M&V~jMEdjF-WO} zOkR%T1D_BM83kfK2yn%Ol|llt5mua1qauo1E0C&_CtlMp90{Ju2ZFl;#F%nXvhIsxlPjJ{O1Zta*BrL=0BYFy}mFV+xn>+xADNiy;4HVjRlcp<;#-1 z?KY*}6udyI%F9nRwjV}PRAInny&UX}9BM(9(5JM*R)W+OoFpVrjt(^v#Wu+&8Q43- z_P10<`p1C&Fk8p$mx)TnsA??Wtk`_r50!5!nO6Q?K9UMXzVBh=ZDu1xrv#~hvJmQ` zE$?xLg4{>j*ApK$QXen`m@i>6IM@ijtT~WQwD_tmu)N#`f%@x`lL|=b*hgKf1pl$56KD&s0=1w*MWZ?!y3NSsIuae+|Wn>p^3Nt zNmHoogXx+6&!s7jo6;2j`NWoXGwQ%f!>&QGgUsbu`sr}4i` z$H%Za#UxL*a z)F%~a$nB48o2~PNL=IcQ?%u#5EZ(ej=BK`fHW=VE#nQf2($51=HDbbt-GYHsL+(ns zQR8#YW;0guh(Qop&|w>VQ}XXEoMdt1_PPFrn^m)S>u5~ScpZ*%&_e8G*r^^oL%F1V zQ@{T-qWg-o-Ksbiq#lkr^N=J4$TP!~*29$cJ!ds=$UP^RbxcwgLvq6BSlw`ls^Ql> z!!UU#$AEi|(91R1VsI61(1$5P*?qg@2~fD(Su*EwNb{KG4hiqk;M_BZ$Z;R$m;< zZ$A;b75WMZ5>0^jszJ{c% ztob(~x4#recf=SrUXSOSfR?NTe}JGx`!w>+9Oknm!L+sAdI9`9olAcDzNt=^Tz>j5 z0%(L@w>`&SIHp~8EWCif%qjQ<&_F0;3@u}0#YF%k-EuxI7FbF%T^=iMd{HPF3{0>9 zVyaqVP$!TI8?;4!-7UT|CDy|ZOQ*+F0$HVI3*s+thGY{h)E;U%c>z*`Mn!JE?zYqA z52e7JQIWyUIOYSBzwGcw945C&{1w*Zt8u+eUXir>>p>4hARL1dTHxS9dQJZv`bj+Q z(Z|SMg)OK=G7dA5$-dX2>UvfgkjFx_YoStjvFje=0Ww8{gCc@@mx%aI56-VaE)uqa zYLMv7rzh}#od5OL+52IZyz9I>hH6EW+DWsBf)$zrZI$sg&Z{pSLSWz4eKPPB$N4yr zROBCw_J&~HZn$_5MjN(Ns){%m?LS_0Y$61-QD-4Srm6-j;Gp!g+k5zlc@BF8=qm9K zP{(lj>jl^+(5%D$ zH3mRFp%a)Jaa0*qeg@A+K_*RMyf%b=9c*bW#c)~z64m9#27^vAv>6RsxmdzqwF7`u zt#`AUqJ`0C7n`GP_?3ymYFE+ex0OZ7?axcnV)H3~Mmz)#R@2w*BHTg{r1%A~A}0^| z)q_X$zLagXX_px5&*2AR%IA1-wIq^X?pvn3k)J2TFH*FPT+Vy&y877^{~^N@!+8o` zJtq|WYJiN)T?F7mikbIoE6=v*Yo+K1Gs;V(Pt9=TV@yEX77J!M{=7y=Q@R}*#8zFr zBlLQ6GusgH3o>sb?pvv<4@DY1 z-QWb$ioh71WFK^<&P2(>5BT*F*jtd~XOt*?EGQtSn61LpG>FD?gxYD=M?!@dv)52` zI`*!i(`z6@^^}PoZtfIqiCRHqm^;-6;9+UJ`#<&%0wvSn9hLxV>?Pe>C+58K=c(f$ zP-Apsm5d|lLPacBNH&2NVWagngU^%fYKNqVX3cWDjMD592Fql$QgtfiP7sSEz}P1s zkTf>Mn-CANcnR|7S2i#9p&NgjE$_#(KgOU1Mfz^TCWVV5FX&wSSavSrpKj+O{Ro0G z)JJ}Y_CfpNkjC2L$02^iFH8}|_ll`HGWx=w_%cJ+*MRyf@pEnGA{CLO&PB^+^YTGP zG{cC883kI-R=3n>HGy>=7P+E5XfPAc093r1kvOrf(zFp?z2|8XO0u|1DC7QivLbHu zT;&o<$d#VzC+0M6Kfy#a=QIk~C#SP7;?4~VG#-$i7v1+Nw&)NOXz=o`CPTWBngcPEK!;{XcU)1jf3bOhal3)* zhrM&-wRefmd4QHyeyvz#-eef6+CA;$3#ciSE3*6Dc8hEcvg8}1=11H7-x4bo^b1no z_jN^`U^p2qu!r(sHXYTS!{JPTTL?@a0T&c%FYRuh;TpIykLmxaE%PCbtE_84E_r_&luy^}!Q-^}w-piK38`CPX)K`&1ub^hPcr4h3b(PC2nMI4iog?N;X-~xJryqG4Og9JMX@swu9d)ZeNZ=97StsRDT1C+zPkNeK zrEEteCy0!nXFgTwZupV^GI%mA?-6w>SBxa+pu0VqTF)31wx9xyW|SxC*kpb5`0xXZ z=Z;M)Qy<6g*BBShX|7mB!RV@k8?-vH85Q(IqTp3};=1!C@$teb0=5V2GjtH|5MmkH z<6=MBW2)roaxMmF!*|x#7c#$93z* zOj%Tfd=ONkIdk4~$K6%qqdP(6g^$m`SQeVgA9j z*0;POv@Pi&?{iUh$7&WB5kn&B;bR3mE4>Wd1bSGjJ78~@>-l)AI{)bbpyn~?At0%C zQ)N&g3;GTiU69jc4G#`$@!p;dKoY_tC;$e8uhSt5GeBbJhW=@(tlx(jW1CC)Pw&v z*$y$j;DC$@&h^7A|5-edyJ+ZOYv|NIlu1ealjbEr3W1^=pyocL*$MdZ!u+*FsuNhT`;I3bNr^a#E{E$zHh3Mx^sD6pXcmroV&(kgRKfh4N6>@wMGbeY zhiq03dW-Gg01$S!o+VaU1HF)ksA#nFpqyr{o~d72o3833iE1*s1G?M*TplA7cUux+yprDeBrc%h(`;{^r`4jzp0B_et2>XG~*h z{U*(uqHAohpp z=f&*#ckazGZj-o=5u9z6;ol7HQMwxc8yUf;o|^Q5n{8GU|Gw~+1|VInmy>)-eI~_J zIiunRSaa$lXAWFgGP=~_^73#%epn+cT0~;1S}Gy2Lm+S$DX;8!#MoHDL#}Fw8uEj% zP*~dlUo$>N*8OtIAe4k~)~;8uz9P}P0N(<)nC>Dq1?&nelVjEB2H`cPH) zg#2e6ZrwVr-jkzInx4jUOk5<7)CeHEbCN=IuxWMtaxkMa6iTQs7C`teRqWIB>>kD) zWYt&scKrFC;0y1^n;Z&qH=jS_mtU8vk%5cTZ$o>Fm8mmE$>}AAWDtgFQxf*hbgOy->8S`t0Y05Cz< z-{W%q?8kKqpgT%>AD-4sd~~iqMmpSbFY)aJKp4k45rlS9?Pg}x7#ZM~kascKt%%$R z4f**aF}tpLzOybm2^2h$bVB*K)gn-Ge7;++2S2yx82-Xp8IJ$`1+{0VteKc7T(lR} zjD>h4MR)ck9p|x_RIWU0%Vdi1n%jWkU(@_yOyjf_*pNpL;@aZ7O19Chs-TcV>>s;( z)Ck#QR2g|88m2r{O-A0|lE4dSPRPSKHgAfIu-l~+7TZlBL?PjXr7#OohPeF^8jNm; zCWxiS_d}9uRKb4D`ihe@irE;s?c*^IGp$p)x0YoOV%;vB@ymYMf6gPATOR*@iEI$OFHd4 zzV4CZ6X(_@#e*vua`D;f6U?AV`vo-?IM931q@ioqS{FE*yKd@svz@7K#->*|3T?o)2meX-f5k|E#DuhR%72iOPVmv zAdxF%W@rd}=o+85(ZMDs5;@;`RFt&|wfB0N8zx7K?fh$%f$hYY#^m_WoC!_9cYKbG z{|;X!pHXO#?vC!!jP)1jaY*;38M!pXbvx{7=PuJskl`#AyZ-TRYay zb3=@^YrP7hMwic$xwf}(zAG<(MDV|iD=j{!3nbAWgyOKn7ZuyBYQX?2fa?~~D*Gib zxiBA&fvl@&#gJH{khhOjOrf$NR?&w;P6M7oOjX5&8+zfdsl3z_ZYfv#*4e+IO#JhS zP#9dcYSr8^&X!CLkhQ(Z8t@i|p&7}0zY0RXFu5gDOgTj{1;2;!;J!(&jW~SFLv$F> zB|)zO!asb3K8atcoKud<9jLG~#Vj=ZcuR#z6e$PDBP;jHu;tm78~XCSwXnWwb*F*^ z1iU_^LNoAcnJtgti6R)&4azis=2x`-ddIM~(cMX>9mL%sN_teCD-%)H3hg?TW6{XG z#S*5~Do^Ply%m&L(q7TX`S)_t zgSOQ`YB$~AF*J#FCo=MGy?;bRItEC?R<5jTkCwY_wtP_Z?^Syg_59urTp#i4y3{T} z=!WTsVuldF#!cF4QyYMn*$OyXoTJv-n@Mz|KL8BN2?8+ģXFuX_H5Ik)$u{@5H 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 LjpTsj?Z*EH=1dQ) literal 1595352 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°A}LhO^KV4wR!cA@y*6qio*e9`OHUuNY;D5m&> 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