From bb672e3f39340b00ccdc37921dfcac6365dd4bfb Mon Sep 17 00:00:00 2001 From: YikaiFu-cart Date: Wed, 5 Aug 2026 15:59:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=20RealManAdapter=20?= =?UTF-8?q?=E4=B8=AD=E5=AF=B9=E6=9C=BA=E6=A2=B0=E8=87=82=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E7=94=A8=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=AD=A3=E7=A1=AE=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=85=B3=E8=8A=82=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- xr_rm_teleop/xr_rm_teleop/realman_adapter.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 7c0ff92..f4c8bad 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -288,7 +288,7 @@ test: 添加 xxx 测试 ## 项目专属规则 -* 本项目面向 Ubuntu 22.04 和 ROS2 Humble;构建、测试和运行命令应在工作空间根目录 `/home/robot/WS_xr` 执行,并先 `source /opt/ros/humble/setup.bash`。 +* 本项目面向 Ubuntu 22.04 和 ROS2 Humble;编译前必须先切换到工作空间根目录 `/home/robot/WS_xr`,并执行 `source /opt/ros/humble/setup.bash`。禁止在 `/home/robot/WS_xr/src` 中运行 `colcon build`,否则会在源码目录生成多余的 `build/`、`install/` 和 `log/`;测试和运行命令也应在工作空间根目录执行。 * 工作空间包含 `xr_rm_input`、`xr_rm_teleop` 两个 `ament_python` 包,以及 `xr_rm_interfaces`、`xr_rm_bringup` 两个 `ament_cmake` 包;优先使用现有 ROS2 包、节点和消息,不要另建重复入口。 * 修改 ROS 节点、launch、消息定义或安装配置后,至少运行 `colcon build --symlink-install`;涉及遥操作姿态控制时,再运行 `pytest src/xr_rm_teleop/test/test_orientation_control.py`。 * 遥操作统一使用 `xr_rm_bringup/launch/arm_debug.launch.py`;调试和验证默认使用 `use_mock:=true`,未经用户明确要求不得连接真机、移动机械臂或操作夹爪。 diff --git a/xr_rm_teleop/xr_rm_teleop/realman_adapter.py b/xr_rm_teleop/xr_rm_teleop/realman_adapter.py index c00d466..1618cdc 100755 --- a/xr_rm_teleop/xr_rm_teleop/realman_adapter.py +++ b/xr_rm_teleop/xr_rm_teleop/realman_adapter.py @@ -237,9 +237,9 @@ class RealManAdapter: ) def read_joint_state(self) -> JointStateSnapshot: - self._require_arm() + arm = self._require_arm() started_at = time.monotonic() - result = self._arm.rm_get_joint_degree() + result = arm.rm_get_joint_degree() finished_at = time.monotonic() if not isinstance(result, tuple) or len(result) != 2: raise RuntimeError( @@ -256,10 +256,10 @@ class RealManAdapter: ) def send_joint_target(self, joints: list[float], follow: bool) -> None: - self._require_arm() + arm = self._require_arm() if len(joints) != 7 or not all(math.isfinite(value) for value in joints): raise ValueError("joint target must contain 7 finite values") - ret = self._arm.rm_movej_canfd( + ret = arm.rm_movej_canfd( [math.degrees(value) for value in joints], follow, 0, @@ -315,9 +315,10 @@ class RealManAdapter: self._arm = None self._realtime_callback = None - def _require_arm(self) -> None: + def _require_arm(self) -> Any: if self._arm is None: raise RuntimeError("睿尔曼机械臂尚未连接") + return self._arm def _on_realtime_arm_state(self, data: Any) -> None: if not self._accept_realtime_feedback: @@ -457,11 +458,11 @@ class RealManAdapter: self._try_call("rm_set_joint_max_acc", joint_index, self._joint_max_acc) def move_to_initial_pose(self) -> None: - self._require_arm() + arm = self._require_arm() if self._initial_joint_pose is None: raise RuntimeError("启用初始位姿移动时必须配置 initial_joint_pose") - ret = self._arm.rm_movej( + ret = arm.rm_movej( self._initial_joint_pose, self._init_move_speed, 0,