教程
每个教程都是一个独立运行的程序,展示了 Inverse Service 的某项功能。我们提供了三种语言版本的并列示例,以便您比较不同的惯用表达方式,并为您的项目选择合适的技术栈:
- Python — 最短且最易上手的入门途径(
websockets+json) - C++ (nlohmann/json)— 具有出色可移植性的 C++11,采用运行时解析方式的 JSON
- C++ (Glaze)— 支持编译时反射和无内存分配的语法分析,符合最新的 C++20 标准,推荐用于实时触觉反馈循环
源代码已发布在两个公开的示例代码库中:
- haply — 每个教程都有一个对应的目录,其中包含 nlohmann/json(C++11)和 Glaze(C++20)两种实现。构建目标中包含用于 Glaze 实现的
-glz会加上后缀。 - haply-inverse-python-samples— 每个教程都有一个对应的目录。
Inverse Service 的每个版本都会在两个存储库中固定对应的标签。若要保持与本文对应的版本,请 release/<version> 请关注该分支。
先决条件
- 港口
10001在……中 逆向服务 服务必须正在运行(Haply Hub 或者 独立安装程序(通过...运行)。 - 必须检测到至少一台Haply 设备。每个教程针对特定的设备系列。请参阅下表。
- Python 教程:
pip install websockets(教程 04、05、06、07、08、09 中还包含keyboard需要,这在 Linux 中需要管理员权限。教程 08 和 09 中requests也需要。) - C++ 教程: nlohmann 变体需要 CMake 3.15 及以上版本和 C++11 编译器,而 Glaze(
-glz) 此变体需要 C++20 编译器。示例仓库的根目录CMakeLists.txt通过 FetchContentlibhv,nlohmann/json,glaze由于会自动导入,因此无需手动设置依赖关系。
教程列表
| # | 姓名 | 设备 | 变形 | 学习内容 |
|---|---|---|---|---|
| 00 | 设备列表 | 所有设备 | Py · C++ · C++ Glaze | HTTP 设备搜索、会话范围查询 |
| 01 | Inverse3 输出 | Inverse3 | Py · C++ · C++ Glaze | WebSocket 状态流、零开销保持活动、首次消息握手 |
| 02 | VerseGrip 输出 | 有线 VG | Py · C++ · C++ Glaze | 定向流媒体, probe_orientation KeepAlive,四元数 → 欧拉变换 |
| 03 | 无线 VG 输出 | WVG | Py · C++ · C++ Glaze | 按钮、电池、霍尔传感器 |
| 04 | 你好,Floor | Inverse3 | Py · C++ · C++ Glaze | 第一个触觉效果 — set_cursor_force 罚球弹簧 |
| 05 | 位置控制 | Inverse3 | Py · C++ · C++ Glaze | set_cursor_position 控制:随机目标点(C++)或按WASD键移动(Python) |
| 06 | 结合 | Inverse3 WVG | Py · C++ · C++ Glaze | 多设备循环、基于四元数方向的光标控制 |
| 07 | 参考坐标系与赤道仪 | Inverse3 | Py · C++ · C++ Glaze | configure.basis, configure.preset, 运行时 configure.mount 重新定义;预设与挂载之间的互斥性 |
| 08 | HTTP 远程配置 | Inverse3 | Py · C++ · C++ Glaze | HTTP 专用会话配置器:通过配置文件查找会话后,通过 REST 交互式地向 basis / preset / mount 发送 POST 请求 |
| 09 | WS 远程控制 | Inverse3 | Py · C++ · C++ Glaze | 实时工作区导航器:在检索 HTTP 会话/设备后,通过 WebSocket 每 tick 一次 set_transform 流媒体 |
| 10 | 活动 | — | Py · C++ · C++ Glaze | 端口 10020 的事件流监听器,级别/名称过滤 |
提示 — 触觉循环基准测试
教程 10(事件)的设计初衷是与其他教程配合使用。 --no-hide-rate 启用该选项后,该服务的 system-rate-report 系统会输出一个事件,其中包含实际设备的时钟频率。通过比较同一教程中 Python / C++(nlohmann) / C++(Glaze)版本的频率,可以观察到序列化开销对约 4 kHz 控制环路的影响。
# Terminal 1 — pick a tutorial variant
./04-haply-inverse-hello-floor # C++ nlohmann
./04-haply-inverse-hello-floor-glz # C++ Glaze
python 04-haply-inverse-hello-floor.py # Python
# Terminal 2 — watch the rate
./10-haply-inverse-events --no-hide-rate