P5c-5 触觉链路打通:接触传感器此前是"完全静默失效",已定位并修复

两条独立的静默坑,都不报错、不告警,只会"永远收不到数据":

1) world 里没声明 contact-system 系统插件。
   gz-sim 的 <sensor type="contact"> 不由 ignition-sensors 库实现,而是由
   ignition-gazebo6-contact-system 插件实现 —— 所以环境里根本没有
   libignition-sensors6-contact.so(相机/IMU/lidar 的后端都在,唯独缺它),
   那不是包缺失。不声明插件的症状:话题不出现、日志空白。
   实测:加上插件后 /tactile/left/raw、/tactile/right/raw 立刻出现。

2) 接触传感器的三个必备写法,错一个就静默失效:
   - <contact><collision> 必须写 URDF→SDF 自动生成的 collision 名;
     留空 <contact/> 会被补成 SDF 规范的默认值 __default__(不存在的
     collision)。实测生成名:
       sim_left_finger_mount_fixed_joint_lump__sim_left_finger_tip_collision
   - 话题必须写在 <contact><topic> 里,写在外层 <sensor><topic> 无效,
     gz 会静默改用默认 scoped 话题名。
   - 传感器必须挂在有碰撞体的 link 上(指尖),不是另建的空 link。

两处均已按实测结果修正,并把"为什么这么写"写进文件注释。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
arm_dev
2026-09-23 15:29:09 +08:00
parent 47ad9d9a8b
commit 02516fe567
2 changed files with 78 additions and 29 deletions
+34
View File
@@ -221,6 +221,40 @@
<render_engine>ogre2</render_engine>
</plugin>
<!-- =========================================================================
接触系统插件(触觉传感器必需)
=========================================================================
⚠️ 这是本项目踩得最深的一个坑,务必看懂:
**gz-sim 里的 `<sensor type="contact">` 不是由 ignition-sensors 库
实现的,而是由这个 contact-system 系统插件实现的。**
所以 conda 环境里根本不存在 libignition-sensors6-contact.so
(相机/IMU/lidar 的后端都在,唯独没有 contact)—— 那不是包缺失,
而是接触本来就不归 sensors 库管。
不声明它的后果是**彻底静默**:
- 传感器永远不会被创建
- /tactile/left/raw 话题不出现(连空消息都没有)
- Gazebo 日志里**什么都不打**:没有 error、没有 warn
- 看起来就像"还没接触到东西",而实际上永远不会接触到
实测确认方式(2026-09-23):
ign topic -l | grep tactile # 不声明时:无任何输出
# 加上下面这行插件后立刻出现 /tactile/left/raw 与 /tactile/right/raw
⚠️ 另外两个必须同时满足的条件(否则一样是静默失效):
1. `<contact><collision>` 里写的是 **URDF 转 SDF 后自动生成的 collision 名**
(URDF 无法给 collision 命名),例如
sim_left_finger_mount_fixed_joint_lump__sim_left_finger_tip_collision
留空 `<contact/>` 不会"监测全部",而是被补成 SDF 规范的默认值
`__default__`(一个不存在的 collision)。启动检查
robot_description.check_tactile_collisions() 会核对这两个名字,
一旦 sdformat 换了命名规则就明确报错。
2. 传感器必须挂在**有碰撞体的那个 link** 上(指尖),不是另建空 link。
========================================================================= -->
<plugin filename="libignition-gazebo6-contact-system.so"
name="ignition::gazebo::systems::Contact"/>
<!-- =========================================================================
RealSense D435 —— 眼在手外(俯视工作台)
=========================================================================