v3.5.0
这是自一年前重写 API 以来规模最大的版本发布。3.5.0 引入了统一的 3D 数学层、对Minverse 的全面支持、类型化的事件流、完整的配置 API 以及更加简洁的 HTTP 接口。此外,该版本还包含了过去一年中修复的各项错误以及对易用性的改进。
主要内容
- 集成 3D 数学层——这是一个可组合的变换管道,具备用于设备基准(帧)、安装变换、工作空间变换和导航变换的一级基元,并同时提供本地、会话、应用程序以及内部空间之间的显式变换。
- 气泡导航——通过具有明确形状的区域(SDF 基元)在大规模虚拟工作空间中进行导航,提供基于速度映射的速度控制、考虑滞后效应的碰撞检测以及可选的光标方向漂移功能。基于 HTTP 和 WebSocket 进行完整配置,并支持应用空间的往返转换。
- 指定类型的事件流——专用于设备生命周期、安全通知、校准、电池、控制周期警报以及支持终止提示的专用 WebSocket 事件通道。
- 配置 API— 这是一个支持 HTTP CRUD、类型提示、范围约束和注释的完整键值配置系统,用于替代传统的嵌套配置文件。
- 一致的设备配置 — 为所有设备提供一组 HTTP 路由:
basis,mount,preset,transform,filters,handedness,torque_scaling,gravity_compensation,home_return. - Minverse 的同步校准 + 笔校准— 设备与笔现可同步校准,且校准状态将保持锁定,直至握柄被物理安装到位。
- 改进 HTTP 的易用性 — 基于索引的设备选择器(不使用 ID,而是通过索引指定设备)、WebSocket 之间共享的统一请求/响应格式、可选使用的
{ok, error, data}信封(?format=json),提供了通配符会话选择器。
新功能
设备
- Minverse — 本次发布正式支持以下功能:设备检测、就绪(ready)序列、安全提示以及同步校准工作流。
- Ruko和Kingfisher被认定为官方握把产品类型。
- 支持设备模拟器——能够检测并与软件模拟的设备(配合实际硬件)进行通信。
- 连接回路保护 — 运行异常的端口将被自动封锁,
POST /ports/{port}/reset将其重置为。 - 笔身安装心跳监测——通过应用Dibounce算法,可稳定检测笔握的安装与拆卸。
会话、命令和 WebSocket
- 会话配置文件过滤与持久性— 会话会声明配置文件名称和所需的 SDK 版本,服务在重新连接后仍会记住这些信息;客户端和监控工具可以据此过滤会话并将其指定为目标。
- 按会话划分的命令缓冲区——一个运行缓慢的会话不再会阻碍其他会话的运行。
- 用于单次命令的显式
configure地图 — 按设备分类basis,preset,mount,force_gate,damping按科目和课时profile,basis现在都configure包含在内。根据输出映射表,发送的值与读取的值在往返过程中保持一致。 - 自定义设备挂载 — 内置工作区预设(
defaults,arm_front,arm_front_centered,led_front,led_front_centered) 您可以选择其中之一,或发送显式转换。手动更改挂载时,预设会自动custom将切换为。 - 命名命令字段 —
position,vector,angles,torques是常见的values替换数组。 set_angular_torquesaset_angular_torque用于替代(单数形式已停止支持)。- 会话帧扩展 — 可扩展至 v3.0 和 v3.1 会话帧
config,state,status包含对象。新的输出字段包括:current_cursor_force,current_cursor_position,current_angular_torques,current_angular_position,control_domain,control_mode,transform,transform_velocity, 扩展的config.*,以及status.safety(默认情况下为隐藏) - 部分转换更新 — 安装、工作空间转换、导航几何体中需要更改的子字段(
position,rotation,scale)只需发送即可。
超文本传输协定
GET /— 服务版本。GET/POST/DELETE /settings以及/settings/*— 完整的键值配置 API。GET /sessions/{session}以及GET/POST/DELETE /sessions/{session}/profile.GET /devices?session=<selector>— 将设备坐标转换为指定会话的应用程序空间坐标。- 基于索引的设备选择器 — 即使不知道 ID,也可以通过索引指定所有设备(以第一个 Inverse3 为例)
/inverse3/0/..., 对于 Inverse 系列的所有设备/inverse*/*/...). - 集成请求/响应格式 — POST/GET 请求体与 WebSocket 中使用的相同
command_data使用 JSON 格式。基于一种传输方式编写的代码在其他传输方式下也能正常运行。 - 选择性包络 — 在所有路由中
?format=json可以通过……来激活,/settings*以及GET /home_return默认情况下{ok, error, data}使用。如果需要原始格式,请?format=plain使用。 - 会话选择器通配符 — 来自个人资料名称
*将任意字符串,?表示单个字符。 - 百分比解码的选择器 —
%2A,%3A等在路由之前会被解码。
活动
communication/events/port这是其专用的 WebSocket 事件流。- 共有 24 种指定类型的事件类别,包括设备生命周期、安全(电子制动、异物检测、失速)、校准失败、电池提醒、会话警告、控制周期过低/临界、输入验证以及支持终止提示。
观测性
- 在性能分析过程中,日志消息会连同各级别对应的颜色一起传递到 Tracy。
- 所有 HTTP 处理程序都已配置了 Tracy 区域。
- 主循环定时统计事件。
- 可以配置日志目录和服务器主机名(支持 Docker)。
3.6 计划中的功能
- 基于SDF 触觉效果(SDF HFX)的功能已纳入 3.5 版本(模块、生命周期以及模块提供的命令/状态序列化)。公开 API 预计将随完整文档一同在 3.6 版本中发布。
改进内容
- 力振动滤波——包括按轴检测振动、8级渐进式恢复、采用滞后效应的进入投票,以及非对称解除区间。
- 运行时强制门控滤波器 — 来自 WebSocket 或 HTTP
configure.force_gate.gain可以由……组成,并提供持久存储的默认值。 - 将主循环的最大频率提高至 32 kHz(适用于精密应用领域)。
- 更小的 WebSocket 负载 — 默认的恒等(identity)变换子域(
position = 0,rotation = identity,scale = 1) 通常会在输出中省略。这样可以减小有效载荷大小,并恢复与具有 4 KB 消息限制的旧版 Unity 包的兼容性。有两项高级设置(serialization/explicit_fields,serialization/force_complete_transforms) 的话,就可以为有此需求的消费者重新包含所有字段。 - 减少主循环抖动——即使在解析 JSON 和进行网络传输期间,WebSocket 消息的处理也不会阻塞主循环的 tick,并且会话 tick 的调度已被提前至响应序列化之前。
- 服务器默认仅限 localhost 访问 —
communication/bind_all_interfaces您可以在“设置”中启用网络访问。 - 在设备选择器通配符中使用前缀语法 (例如:
inverse*(与 Inverse 系列的所有设备均兼容)。 - 阻尼指令这个
force_gate与……一起configure已移至地图上。 - 轮转日志记录器将取代之前的日志记录器,并可配置目录。
- 模块提供的命令和状态— 模块无需修改核心模式,即可注入自定义命令、配置字段,并将状态输出添加到 WebSocket 帧中。
修改内容
其中包含了为期一年的错误修复,影响最大的项目如下。
- 在特定条件下,会话速度出现不稳定现象的问题。
- **GripHook(Verse Grip Stopper)**在模拟未运行时无法干净利落地解除的问题。
- Inverse3 由于超时设置过短,导致在启动较慢的设备上引发连接中断循环的问题。
- Windows 中的服务无法正常关闭——存在服务关闭时 HTTP 服务器并非总能被清理的问题。
- 当服务向旧版固件发送了不被支持的命令时,会引发重连循环。
- 在配备蓝牙适配器的系统中,蓝牙设备枚举会导致日志被过度填满的问题。
- 在连续多次重启服务时发生的崩溃。
- Ubuntu笔记本电脑在从省电模式恢复后,无线Verse Grip适配器出现卡顿现象。
- 在 Linux 和 macOS 系统上,如果无线 Verse Grip 的握手在首次检测尝试中失败,现在将正确地切换到备用流程。
- macOS 设置文件的位置 — 而不是设置错误的路径
~/Library/Application Support/已更改为保存在该处。 - Linux 和 macOS 中的 SIGSEGV 信号处理——当启用了多线程冲突捕获时,进程将不再因致命信号而陷入无限循环。
- 会话间命令覆盖— 此前,一个会话的配置命令可能会被另一个会话的命令悄然替换,但现在这些命令会得到正确的过滤和合并。
- 覆盖 Probe 命令的设置 —
probe_position传输监控会话(例如:Haply Hub)将不再默默覆盖待处理的 basis / preset / profile 更改。 - 原型握把显示— 原型硬件被错误地显示为标准握把,而非自定义握把的问题。
- 针对尚未迁移的客户端 Legacy
set_basis行列规则此功能现已恢复支持。 - 断开会话连接后,Inverse3 的强力踢击将不再触发剩余力量激增。
- 在反复快速建立和断开连接的过程中出现的WebSocket 连接丢失竞争状态。
- 在某些发送有效载荷中,**WebSocket
session_id**A0此前在序列化时出现的问题。 - 在 Windows 中
--dev现在与……配合使用时--log-level此规则适用(此前为debug已静默重置为)。
关于停止资助的通知
虽然目前仍可正常使用,但计划在未来的重大版本中移除。如涉及此情况,请在回复中 deprecation_warning 包含字段。
| 停止资助对象 | 替代项目 |
|---|---|
POST /force_scale | POST /settings/devices/inverse*/filters/force_scale/gain |
POST /gravity_compensation | POST /{device}/{id}/config/gravity_compensation |
POST /torque_scaling | POST /{device}/{id}/config/torque_scaling |
POST /device_handedness | POST /{device}/{id}/config/handedness |
POST /serial_enable | POST /settings/communication/serial/enabled |
POST /experimental/features/grip_dropped_simulation_stopper | 设置 API |
POST /experimental/features/screensaver_enable | 设置 API |
WebSocket command_data.values | position, vector, angles, torques |
WebSocket set_angular_torque | set_angular_torques |
WebSocket probe_cursor_position | probe_position |
WebSocket set_coordinate_origin | configure.preset |
WebSocket 会话层 set_basis | configure.basis |
兼容性注意事项
3.4.19 版本中没有会导致兼容性问题的重大变更。关于现有集成的注意事项有以下两点:
- 已停止支持的 HTTP 端点现在会在响应中
deprecation_warning包含该字段。严格验证响应架构的客户端必须允许此附加字段。 - WebSocket
command_data的values该字段虽已停止支持,但仍会被解析。建议使用命名字段。
教程和文档
- 新教程:05 位置控制(Position Control)、06 集成(Inverse3 + Verse Grip)、07 基座与安装(Basis and Mount)、08 HTTP 远程配置器(Remote Configurator)、09 WebSocket 远程控制(Remote Control)、10 事件流监听器(Event Stream Listener)。
- 新的 Glaze 变体: 除了现有的 nlohmann/json 变体外,所有 C++ 教程都新增了 Glaze 变体(
cpp-glz/)已添加。 - 重写所有教程: 已根据 v3.1 API 进行了重写(端口 10001,
configure.preset, 命名的命令字段,print_state()助手)。 - 已删除:原有的 Verse Grip Stopper 教程已被删除,并由新的综合教程取代。
- 公开文档更新:SDK 指南、API 参考和硬件页面均已全面更新。