P5c-5 触觉适配器落地:Gazebo 关节力 → arm_msgs/TactileStatus
链路:指尖关节 force_torque(持续发布)→ ros_gz_bridge → sim_tactile_adapter
→ /tactile/{left,right}/status。字段口径与真机 tactile_node 完全同构:
20Hz、frame_id=<side>_tactile、fnormal clamp 到非负、所有力都是"相对静止
基线的增量"。所以 compliant_descent 与 stage3_search_node 一行不改就能在
仿真里跑 —— 这是"同一套接口、换后端"契约的一部分。
新增 sim_tactile.py 把三件纯数据变换独立出来(轴向投影、桥接参数、基线
跟踪),因为这三处的错误全都**不会报错**,只会让力的语义静默错位:
轴向映射反了照样"有力、会响应、松开归零",基线把接触吃掉了则表现为
"明明夹住了 fnormal 恒为 0"。抽出来才有单测可钉(新增 25 条)。
已实测验收(关闭夹爪夹静态薄板,60×120×80mm):
空载 fnormal ~1e-8、contact=false(基线相减到位)
夹住 contact=true、fnormal=714.7/102.5,切向同时起变化
松开 contact 立刻回 false(靠 contact_timeout_s,因为 gz 的接触消息
是事件式的,不接触时一条都不发),力回落到 ~1e-8
启动期 check_tactile_collisions 无告警
check_tactile_collisions 顺带被负向单测逼出两处"会被静默骗过"的判据:
sdformat 对缺失的 contact/topic 会补 __default_topic__、对缺失的 collision
会补 __default__,所以只判"空"是抓不到的 —— 必须连占位值一起判。
force_scale 口径写入 config/tactile.yaml:仿真输出 = Gazebo 牛顿 × force_scale。
要共用真机那套 250/600 阈值必须先标定它,否则要么永不触发要么一碰就炸
(实测位置控制器硬压可到几百,量级与真机完全不同)。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -166,7 +166,12 @@
|
||||
所有阈值都按"相对静止均值的增量"使用(见
|
||||
devices/sensors/orisys/manifest.yaml)。仿真给的是牛顿,
|
||||
所以两者的数值**不能直接共用阈值** —— 标度换算由
|
||||
config/tactile.yaml 的 force_scale 负责,详见该文件与 README。
|
||||
devices/sim/gazebo/config/tactile.yaml 的 force_scale 负责,
|
||||
该文件头把两种用法讲清楚了。
|
||||
|
||||
⚠️ 三向力的轴映射(哪根轴是指腹法向)是**实测**出来的,不是读代码推的,
|
||||
结论与实测方法记在同一个 yaml 的 axis: 段里。改夹爪/换传感器后
|
||||
要重测,否则力的语义会静默错位(有数值、但方向没意义)。
|
||||
======================================================================= -->
|
||||
<xacro:if value="${tactile_enable}">
|
||||
<gazebo reference="${prefix}left_finger_tip">
|
||||
@@ -225,7 +230,8 @@
|
||||
→ 读"父 link 施加给子 link 的力"。
|
||||
静止时它等于 -(接触力 + 手指自重),
|
||||
所以真正符号如何、哪根轴对应"法向",
|
||||
以实测为准(见 config/tactile.yaml 的
|
||||
以实测为准(见 devices/sim/gazebo/config/
|
||||
tactile.yaml 的
|
||||
axis_* 映射项与 README 的实测记录)。
|
||||
|
||||
⚠️ 这个传感器是**持续发布**的(即使没有任何接触,也按 update_rate
|
||||
|
||||
Reference in New Issue
Block a user