概述
本篇实践介绍如何将tactile_binary 接触判定渲染为终端网格。应用场景包括观察接触位置、检查标定效果和调整接触灵敏度。
对应的 Python 示例为 8.tactile_contact_view.py,C 示例为 6_tactile_contact_view.c。 触觉数据的字段定义见触觉,本页说明集成流程和运行时行为。
前置条件
硬件
软件
- Python
- C
前序步骤
先做触觉标定。 没标定过的手套tactile_binary 精确恒为 0,网格永远是空的。见触觉标定。
判断标不标定过,直接看这条流是不是全零:
网格是原始阵列的几何排布
这是理解整个视图的关键:24 × 31 = 744,正好等于原始tactile 流的通道数。网格不是重新采样出来的,就是把 744 个通道按传感器的物理排布铺开。
映射规则实测为行优先:
tactile、tactile_binary、tactile_residual 三条流长度都是 744,无效通道位置完全一致(实测均为 218 个)。所以三个视图的网格轮廓是同一个形状。
无效通道勾出手的轮廓
实测按行统计无效通道数:图例
-1.0 是无效通道的哨兵值,所以空格判据写成 v < -0.5 而不是 v == -1.0,避开浮点相等比较。
状态行
网格上方一行:灵敏度有两层钳制,只有一层是真的
此处为本篇的关键限制。
实测直接调 SDK 接口:
glove.set("algorithms.tactile_binary.sensitivity", 5.0) 能成功写入并读回。示例的 [0.5, 3.0] 是推荐范围,不是 SDK 强制的边界。
所以命令行传 --sensitivity 20.0 时,状态行显示的是 3.0——示例先钳了再写:
这个参数写的是设备
SENSITIVITY_PARAM = "algorithms.tactile_binary.sensitivity",设置通过 glove.set() 下发,影响的是 tactile_binary 这条流本身,不是本地显示。同一时刻别的订阅者也会受影响。
未设置过时读取会抛异常,不是返回默认值:
set_sensitivity 特意包了 try,写失败也不让视图挂掉——观察工具中途崩掉比读数不准更糟。
渲染限流
流是 130 Hz,渲染限到 10 Hz:集成步骤
完整示例:Python tactile_binary 视图 和 C tactile_binary 视图。 以下为接入片段。Python 导入与 manager 初始化、C 初始化与连接错误分支、回调定义均沿用 Python 示例 和 C 示例。C 每次调用应检查返回状态,失败时按 Python 示例 和 C 示例 释放已有资源并退出。1. 连接目标手套
按序列号连接目标手套。多设备环境不要依赖扫描结果顺序。- Python
- C
2. 设置灵敏度并订阅
二值流的灵敏度写入设备,影响所有订阅者。写入失败时保留视图并报告错误,再注册回调。- Python
- C
3. 限时运行并收尾
视图退出时先关闭订阅,再断开设备。回调线程不直接执行阻塞渲染。- Python
- C
运行与输出
- Python
- C
contacts=0 与 peak=0.000 是未标定的典型表现——这个轮廓来自无效通道的分布,与是否完成标定无关,所以看到手形不等于流有数据。
标定并戴上手套之后,接触区域会变成 #,contacts 随按压面积增长,peak 上升,row / col 指向按得最重的位置。
注意事项
交互式终端下按
+ / - 调灵敏度、q 退出。
扩展用法
用它验证标定质量
标定完挨个区域按一遍,看网格对应位置是不是亮起。哪片区域怎么按都不亮,说明标定时那里没被覆盖到,回去重标那一组动作。这比看dead_pct 一个数字更能定位问题。
调灵敏度找工作点
+ / - 实时调。压着不放时慢慢调低,直到刚好不再误报,就是这只手套的工作点。记录到应用配置中。
想自己定阈值就看残差
tactile_binary 的判定阈值是 SDK 按灵敏度算的。需要完全控制阈值时,使用 tactile_residual。该流提供连续值,阈值由应用侧设定。见触觉残差网格视图。
网格坐标对应到点云
状态行的row / col 可以换回通道索引 row * 31 + col,再对上 tactile_point_cloud 的空间坐标,就知道接触点在三维空间的位置。点云只含 526 个有效点,换算时要跳过无效通道。