真机落地前的仿真补齐:夹持/腕力/真值位姿,让仿真能验证 S07–S09
这批是 09-24 那轮仿真工作的收尾,一直没提交。内容按目的分四块: 1) 仿真真能「夹住」工件 sim_grasp_lock:给规与夹爪之间加接触锁(默认关,run_gauge_assembly --sim 才开)。 没有它时仿真里规只靠摩擦,S08 棘轮一转就滑出指间,于是把「仿真不真」误读成 「力判据不对」。新增 test_sim_grasp_lock.py。 2) 腕部力传感器进仿真 sim_wrist_ft(+ config/wrist_ft.yaml):S07 的首选判据是腕部 FT 的轴向突变, 而仿真里以前根本没有腕部力,S07 只能退到触觉兜底,两套判据从没在同一场景下比过。 现在两条通道都在,接触判定可对照。 3) 真值位姿可查(不再靠猜) sim_live_pose / sim_pose_service:把 Gazebo 里刚体的实测位姿发布出来, stage2 的真值路径按**实测**位姿算孔位,而不是按场景文件里的标称位姿。 顺带把真值孔位的推导(truth_holes)独立出来并补测。 4) 工具几何成为可配置项 config/sim_tool_geometry.yaml + stage2 的 tool_tip_below_flange_m 启动参数: 仿真里规会在指间下滑,工具长每次装夹都不同(实测见过 243/254mm), 悬停高度与 S07 下探预算必须按实测值算,不能再写死。 应用层同时跟进:gauge_fsm / gauge_config 把「悬停时工具尖端入没入工件」的判据 (hover_z_guard)与拖件判定(drag_verdict)收成纯函数并补测;stage3 搜孔、 site 导出、run_gauge_assembly 与若干文档同步。 新增 test_gauge_exit_lift / test_gauge_gripper_client / test_node_handler_collisions。 测试:全仓库 1085 passed。
This commit is contained in:
@@ -41,6 +41,8 @@
|
||||
sensors_file:=''
|
||||
d405_enable:=true
|
||||
tactile_enable:=true
|
||||
wrist_ft_enable:=true
|
||||
wrist_ft_topic:='/sim/ft_sensor_wrench'
|
||||
d405_x:=0.0
|
||||
d405_y:=-0.06
|
||||
d405_z:=0.05
|
||||
@@ -313,6 +315,56 @@
|
||||
</gazebo>
|
||||
</xacro:if>
|
||||
|
||||
<!-- =======================================================================
|
||||
腕部力扭矩(wrist force/torque)—— 与手指触觉是**两回事**,别互相替代
|
||||
=======================================================================
|
||||
为什么必须有它(2026-09-24 踩过,代价是整整两轮排查方向错):
|
||||
|
||||
"通止规"是**靠夹持摩擦抱住**的工具。轴向力(往下压的力)要传到手指上,
|
||||
必须经过"指垫↔规"的摩擦面,而摩擦能传的上限是 µ·N:
|
||||
夹持段 µ=0.25、实测握力 N≈46N → 单指 ~11.5N、两指 ~23N
|
||||
台肩一落面,接触刚度 5e4 N/m 意味着**过压 0.5mm 就是 25N** —— 一步
|
||||
步进量就足以让规在爪里打滑。所以手指触觉**根本读不到**"台肩落面"那
|
||||
一下的力(读数停在 0,而它是对的)。拿手指触觉当"到底了"的判据,
|
||||
阈值调多大都不对:调小了被噪声骗,调大了物理上永远达不到。
|
||||
|
||||
腕部 FT 装在这条力路的**上游**:工件→规→夹爪→法兰→腕部关节。
|
||||
工具打不打滑都要经过它,所以它测得到真实的轴向力。真机同理 ——
|
||||
真机上这个量由 Flexiv 的 flexiv_robot_states_broadcaster 发在
|
||||
/<sn>/ft_sensor_wrench(geometry_msgs/WrenchStamped,法兰系)。
|
||||
|
||||
为什么挂在 ${prefix}joint7 而不是 flange_joint:
|
||||
flange_joint 是 **fixed** 关节,物理引擎不会把它当独立关节求解
|
||||
(它是刚体的一部分),挂上去的 force_torque 传感器永远没有输出、
|
||||
而且**不报任何错**。joint7 是最后一个 revolute 关节,它下游挂着
|
||||
link7 + flange + 夹爪 + 工具 —— 正好是"整个腕部以下"的全部载荷,
|
||||
这才是工程意义上的腕部 FT。
|
||||
为什么是 frame=child:
|
||||
child 是关节的下游连杆(link7)。工具竖直朝下时 link7 的 z 轴
|
||||
就是工具轴,所以 **z 分量 = 轴向力**,与真机 ft_sensor_wrench
|
||||
(法兰系,z=法兰轴)口径一致 —— 应用层因此可以两边共用一套判据。
|
||||
|
||||
⚠️ 话题名必须与"应用层按 sn 推出的那个名字"一致:
|
||||
仿真臂的 sn 固定是 `sim`(见 config/site.yaml 的 robot.arms[sim]),
|
||||
应用层算 `/{sn}/ft_sensor_wrench` = /sim/ft_sensor_wrench。
|
||||
改 sn 时必须同步改这里,否则只是"话题上没有数据"(不报错)。
|
||||
-->
|
||||
<xacro:if value="${wrist_ft_enable}">
|
||||
<gazebo reference="${prefix}joint7">
|
||||
<sensor name="wrist_ft" type="force_torque">
|
||||
<always_on>true</always_on>
|
||||
<!-- 与真机 flexiv_robot_states_broadcaster 的发布率(100Hz)对齐:
|
||||
下游按"够不够新"判活,率太低会被当成掉线。 -->
|
||||
<update_rate>100</update_rate>
|
||||
<topic>${wrist_ft_topic}</topic>
|
||||
<force_torque>
|
||||
<frame>child</frame>
|
||||
<measure_direction>parent_to_child</measure_direction>
|
||||
</force_torque>
|
||||
</sensor>
|
||||
</gazebo>
|
||||
</xacro:if>
|
||||
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
|
||||
Reference in New Issue
Block a user