概述
本篇实践介绍如何将tactile_residual 连续残差信号渲染为终端网格并调整显示阈值。应用场景包括观察信号强度变化、比较区域响应和选择应用侧接触阈值。
对应的 Python 示例为 9.tactile_residual_view.py,C 示例为 7_tactile_residual_view.c。 触觉数据的字段定义见触觉,本页说明集成流程和运行时行为。
前置条件
硬件
软件
- Python
- C
前序步骤
先做触觉标定。 残差是相对标定基线算的,没有基线就没有残差——实测未标定时这条流精确恒为 0。见触觉标定。残差与二值的关系
两条流出自同一个模型,tactile_binary 是 tactile_residual 过了一道阈值。需要现成判定就用前者,需要自己控制判据就用后者。
网格与二值视图完全一致
tactile_residual 长度同样是 744,无效通道位置同样是那 218 个,映射同样是行优先 index = row * 31 + col。24 × 31 = 744,网格就是传感器阵列的物理排布。
所以两个视图的手形轮廓一模一样,切换着看不会错位。通道数的来历见数据订阅:回调。
六级字符梯度
这是与二值视图最大的显示差异:
梯度的映射是按比例切的:
.,1/6 到 2/6 显示 :,以此类推,到 * 就快够着阈值了。梯度是相对阈值的,调阈值会让整个梯度重新分布,不是绝对刻度。
无效通道的判据用的是浮点近似比较而不是 == -1.0,避开相等比较的坑:
阈值行为实测
钳制只有下限:
[0.5, 3.0]。残差阈值由应用侧设定,示例不设定边界。
threshold = 0 是个特例:cell_for 里 value <= 0.0 or threshold <= 0.0 这一条会让所有有效通道都渲染成 .,# 永不出现。想「显示一切」不能靠把阈值设成 0,要设一个很小的正数。
交互式终端下 + / - 每次调 0.1(THRESHOLD_STEP = 0.1)。
状态行
peak 带符号是关键——负峰值说明整片区域比标定基线还轻,可能是手套没戴紧或者标定时手的姿态与现在差太多。
seq 可以用来确认流没有停:数字不动就是没收到新帧。
渲染限流
与二值视图一样限到 10 Hz:集成步骤
完整示例:Python tactile_residual 视图 和 C tactile_residual 视图。 以下为接入片段。Python 导入与 manager 初始化、C 初始化与连接错误分支、回调定义均沿用 Python 示例 和 C 示例。C 每次调用应检查返回状态,失败时按 Python 示例 和 C 示例 释放已有资源并退出。1. 连接目标手套
按序列号连接目标手套。多设备环境不要依赖扫描结果顺序。- Python
- C
2. 订阅残差流
残差流不需要下发设备参数。回调中读取有符号触觉单元数组,自行应用阈值并限流渲染。- Python
- C
3. 限时运行并收尾
视图退出时先关闭订阅,再断开设备。回调线程不直接执行阻塞渲染。- Python
- C
运行与输出
- Python
- C
peak=+0.000 与 above=0 是未标定的典型表现。seq 在递增,说明流本身是通的——流有数据不等于流有内容,这正是 seq 字段的用处。
标定并戴上手套之后,接触区域会按强度显示 . : - = + * 的梯度,达到阈值的位置变成 #,peak 给出当前最强残差。
注意事项
扩展用法
用 peak 找阈值
这是本示例最实用的用法:保持应用场景中的最小接触,观察peak 的稳定值,并将阈值设为略低于该值。比拍脑袋猜或者反复调灵敏度靠谱得多。
梯度用来看接触边缘
# 只标记超过阈值的位置,梯度用于显示接触向边缘衰减的过程。抓握姿态分析、接触面积估计等任务,梯度信息比二值有用。
负残差是个信号
peak 长期为负说明整只手套都比标定基线轻。常见原因是手套戴得比标定时松。发现这种情况先重新佩戴手套后重试,不要靠调低阈值硬凑。
需要判定就用二值流
自定义阈值逻辑需要处理:要处理噪声、要做时间滤波、要定滞回。仅需判断是否接触时,可使用tactile_binary,相关处理由 SDK 完成。残差适用于自定义判据与默认判据不一致的场景。