Skip to main content

概述

本篇实践介绍如何将 tactile_binary 接触判定渲染为终端网格。应用场景包括观察接触位置、检查标定效果和调整接触灵敏度。 对应的 Python 示例为 8.tactile_contact_view.py,C 示例为 6_tactile_contact_view.c。 触觉数据的字段定义见触觉,本页说明集成流程和运行时行为。
本文的网格渲染、布局映射、参数行为、未标定时的表现均为实测结果。有接触时的画面未实测——手套需要有人戴着并真实触碰才会产生接触。

前置条件

硬件

软件

前序步骤

先做触觉标定。 没标定过的手套 tactile_binary 精确恒为 0,网格永远是空的。见触觉标定。 判断标不标定过,直接看这条流是不是全零:

网格是原始阵列的几何排布

这是理解整个视图的关键:24 × 31 = 744,正好等于原始 tactile 流的通道数。网格不是重新采样出来的,就是把 744 个通道按传感器的物理排布铺开。 映射规则实测为行优先:
tactile、tactile_binary、tactile_residual 三条流长度都是 744,无效通道位置完全一致(实测均为 218 个)。所以三个视图的网格轮廓是同一个形状。

无效通道勾出手的轮廓

实测按行统计无效通道数:
边缘行无效多、中间行几乎为零。渲染出来就是一个手的形状——五根手指在上方分叉,掌心在中间连成一片。 没有任何一整列全是无效通道,744 这个数字本身已经是剔除过硬件屏蔽列之后的形态。

图例

-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:
回调在 SDK 工作线程上按帧触发,不限流的话终端刷屏会把这条线程拖垮。这是回调里做渲染的标准写法:快速判断该不该画,不该画就立刻返回。

集成步骤

完整示例:Python tactile_binary 视图 和 C tactile_binary 视图。 以下为接入片段。Python 导入与 manager 初始化、C 初始化与连接错误分支、回调定义均沿用 Python 示例 和 C 示例。C 每次调用应检查返回状态,失败时按 Python 示例 和 C 示例 释放已有资源并退出。

1. 连接目标手套

按序列号连接目标手套。多设备环境不要依赖扫描结果顺序。

2. 设置灵敏度并订阅

二值流的灵敏度写入设备,影响所有订阅者。写入失败时保留视图并报告错误,再注册回调。

3. 限时运行并收尾

视图退出时先关闭订阅,再断开设备。回调线程不直接执行阻塞渲染。

运行与输出

实测输出(未标定、无人佩戴):
以上为实机运行结果,设备是右手 Wuji Glove,手套静置无人佩戴且未做触觉标定。 网格轮廓清晰可读:上方五根手指分叉,中间掌心连成一片,左侧竖着一列是拇指。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 个有效点,换算时要跳过无效通道。

相关内容