768da34cf4
此前方案是"从接触传感器拿力",实测证明**行不通**: gz.msgs.Contacts 虽然 schema 里有 wrench/force 字段,但 Fortress 的 Contact 系统从不填充它们 —— 一条接触消息全文只有 header + 碰撞体名 + 接触点坐标,连 normal/depth 都是空的;该系统的二进制里连一个 "wrench" 字符串都搜不到。所以那不是配置问题,是设计上只有位置。 改为: - 三向力 ← <sensor type="force_torque"> 挂在**指尖关节**上 (转动关节物理上要承受三向约束力,读到的即整条手指链的力) - 是否接触 ← 保留接触传感器(几何接触,比力阈值准) - URDF 无"关节传感器"语法,用 sdformat 扩展 <gazebo reference="关节名"> 表达;已验证转换后传感器确实落在 <joint> 内 踩坑(与 contact-system 同一个坑的第二次): world 里声明了任何 <plugin> 后 gz 不再加载默认系统列表,所以 forcetorque-system 必须显式声明,否则 /tactile/*/wrench 话题**不出现**、 日志一片空白。补上后立即出现。 已实测确认: - wrench 话题 ~100Hz **持续发布**(无接触也发零)—— 这点关键,接触传感器 只在接触时发消息,若适配器只靠它驱动,下游会误判"话题断流" - 静止读数 = 远端三个 link 重量 2.94mN,物理自洽 - 轴向:静止重量落在 child x(竖直),child z = 世界 +x,故法向 = child y; 符号与 force_scale 一起作为可配置标定项 Co-authored-by: Cursor <cursoragent@cursor.com>