From 83c7a897315805686cefa7250fde1d407173ac63 Mon Sep 17 00:00:00 2001 From: arm_dev Date: Wed, 23 Sep 2026 15:46:08 +0800 Subject: [PATCH] =?UTF-8?q?P5c-5=20=E4=BB=BF=E7=9C=9F=E5=A4=B9=E7=88=AA?= =?UTF-8?q?=E5=8F=AF=E5=BC=80=E5=90=88=EF=BC=9AGazebo=20=E4=B8=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20mimic=EF=BC=8C=E6=94=B9=E4=B8=BA=E6=98=BE=E5=BC=8F?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E5=85=A8=E9=83=A8=207=20=E4=B8=AA=E5=85=B3?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三条独立的坑,前两条都在"看起来完全正常"的表象下静默失效: 1) 夹爪在仿真里是死的(关节级) 夹爪只有 finger_width_joint 是真关节(effort=80),其余 6 个手指关节 全是 mimic、effort="0"(上游语义:靠机械耦合跟随,不由电机驱动)。 而 sdformat 转 SDF 时**直接丢弃 **(实测生成 SDF 里 "mimic" 出现 0 次),gz-sim 也没有任何 mimic 实现,SDF 规范里就没有这个元素。 于是 7 个关节在 Gazebo 里互相独立、谁都不跟随谁。 2) 补了 effort 才有用(力度) gz_ros2_control 的 position 接口是"位置误差 → 力" (实测 position_proportional_gain=0.1),力被 effort 上限夹到 0 → 永远出不了力。症状极隐蔽:接口 [claimed]、控制器 active、话题有订阅、 命令也发得出去,但手指一动不动,只是自由地被重力拽着漂。 对照实验:同一套链路下 sim_joint1 收到 0.2 rad 后精确到位(0.19998), 所以链路本身没问题,差别只在这 6 个关节的 effort=0。 3) 描述与 Gazebo 的事实不一致(语义) robot_state_publisher 支持 mimic,会用主关节的值覆盖从动关节;而 Gazebo 里它们是独立被驱动的。实测当前 RSP 没有应用 mimic(TF 跟随真实值), 所以碰巧一致 —— 但这是实现细节,它一变 TF 就静默退回闭合位。 改动: - ros2_control 增加夹爪 7 个关节的接口(含 load_gripper 开关) - controllers.yaml 增加 gripper_controller(JointGroupPositionController) - 启动器 spawn 它;并重命名归一化第三条修复 - urdf_normalize 第三条修复:被 mimic 关节补 effort=80、删除 并记录耦合关系;新增 mimic_relations() 供适配器在归一化前读取 (信息只是搬家,不能丢) - 新增 6 项单测锁定上述行为 验收(实测):命令 width 0→0.1,指尖间距 27.1mm → 127.0mm(约 100mm 行程, 与真机 GRAV 规格吻合),7 个关节实测值均命中命令值,TF 与之一致。 Co-authored-by: Cursor --- devices/sim/gazebo/config/controllers.yaml | 29 +++ .../gazebo/urdf/arm.sim.ros2_control.xacro | 46 ++++- devices/sim/gazebo/urdf/arm.sim.urdf.xacro | 2 +- .../arm_sim_gazebo/urdf_normalize.py | 168 +++++++++++++++++- .../launch/gazebo_sim.launch.py | 2 +- .../test/test_urdf_normalize.py | 103 +++++++++++ 6 files changed, 345 insertions(+), 5 deletions(-) diff --git a/devices/sim/gazebo/config/controllers.yaml b/devices/sim/gazebo/config/controllers.yaml index 077f91a..d29fc22 100644 --- a/devices/sim/gazebo/config/controllers.yaml +++ b/devices/sim/gazebo/config/controllers.yaml @@ -37,6 +37,11 @@ controller_manager: rizon_arm_controller: type: joint_trajectory_controller/JointTrajectoryController + # 夹爪。名字是仿真内部的事(应用层通过 GripperExecute 服务访问夹爪, + # 不直接碰这个控制器),所以可以自由命名。 + gripper_controller: + type: position_controllers/JointGroupPositionController + # --- 关节状态广播 ------------------------------------------------------------- # TF 与 /joint_states 的来源。robot_state_publisher 靠 /joint_states 算 TF, # 少了它 RViz / 跟踪节点全都查不到 tcp 的位置。 @@ -76,3 +81,27 @@ rizon_arm_controller: # 与官方 joint_limits.yaml 的 soft 限位对齐(真机软限位)。 # 不设的话 JTC 只按硬限位卡,仿真里会走到真机不敢走的姿态。 stopped_velocity_tolerance: 0.05 + +# --- 夹爪控制器 --------------------------------------------------------------- +# ⚠️ 为什么这里要 7 个关节,而真机只需要 1 个"宽度"关节: +# Gazebo 不支持 URDF 的 (sdformat 转 SDF 时直接丢掉), +# 所以 6 个从动关节在仿真里不会自动跟随,必须由 sim_gripper_adapter +# 算出角度后**一起下发**。详见 arm.sim.ros2_control.xacro 里的长注释。 +# +# 用 JointGroupPositionController(一次收一组位置)而不是 JTC: +# 夹爪是"两态"动作(开/合),不需要轨迹插值和时间参数化, +# JointGroupPositionController 的语义更直接、也少一层容错。 +# 它订阅 ~/commands (std_msgs/Float64MultiArray),顺序 = 下面的 joints 顺序。 +# +# 顺序约定:第 0 个是主关节 finger_width_joint,其余 6 个从动关节按 +# 左右、由外到内排列。适配器按同一顺序填数组(它自己也会校验)。 +gripper_controller: + ros__parameters: + joints: + - sim_finger_width_joint + - sim_left_outer_knuckle_joint + - sim_left_inner_knuckle_joint + - sim_left_inner_finger_joint + - sim_right_outer_knuckle_joint + - sim_right_inner_knuckle_joint + - sim_right_inner_finger_joint diff --git a/devices/sim/gazebo/urdf/arm.sim.ros2_control.xacro b/devices/sim/gazebo/urdf/arm.sim.ros2_control.xacro index ee641c9..74eda0c 100644 --- a/devices/sim/gazebo/urdf/arm.sim.ros2_control.xacro +++ b/devices/sim/gazebo/urdf/arm.sim.ros2_control.xacro @@ -23,7 +23,7 @@ --> - + @@ -56,6 +56,50 @@ + + + + + + + + + + + diff --git a/devices/sim/gazebo/urdf/arm.sim.urdf.xacro b/devices/sim/gazebo/urdf/arm.sim.urdf.xacro index b425ac5..ce19498 100644 --- a/devices/sim/gazebo/urdf/arm.sim.urdf.xacro +++ b/devices/sim/gazebo/urdf/arm.sim.urdf.xacro @@ -131,7 +131,7 @@ ros2_control:gz_ros2_control 硬件(同目录) ========================================================================= --> - +