TERRA导航状态机深度解析:如何精准引导你走完10个检查点
【免费下载链接】terra项目地址: https://gitcode.com/gh_mirrors/terra2/terra
TERRA 是一款将 AI 与正念散步结合的开源口袋导航设备:ChatGPT 根据你想要的时间和心情生成一串 GPS 检查点,固件中的 TERRA导航状态机则通过 16 向箭头和震动反馈,精准引导你走完最多 10 个检查点并回到起点。本文带你完整拆解这套状态机的 4 个状态、2 个关键距离阈值,以及让它"聪明又省电"的工程细节。
🧭 一图看懂:4 个状态如何串联整段路线
TERRA 的导航核心是一个简洁有限状态机,定义在 Terra.ino 中:
enum NavigationState { NOT_STARTED, // 未开始:等待定位、走向起点 NAVIGATING, // 导航中:箭头指路 AT_CHECKPOINT, // 到达检查点:停留展示 TRAIL_ENDED // 路线结束 };整个流转路径非常直观:
NOT_STARTED→(距起点 ≤ 10m)→NAVIGATING⇄(距检查点 ≤ 10m ↔ 停留 5 秒)→AT_CHECKPOINT→(到达终点站)→TRAIL_ENDED
| 状态 | 进入条件 | 屏幕显示 | 下一步 |
|---|---|---|---|
NOT_STARTED | 上电初始 | PENDING → GOTOSTART | 走近起点后开始导航 |
NAVIGATING | 出发 / 检查点停留结束 | 16 向箭头之一 | 接近下一站时开始震动 |
AT_CHECKPOINT | 距检查点 ≤ 10m | 对应检查点图案(1~10) | 5 秒后自动继续导航 |
TRAIL_ENDED | 到达最后一个检查点 | PENDING(完成提示) | 路线结束 ✅ |
📍 状态一:NOT_STARTED——先找到起点
刚开机时,状态机会先显示PENDING图案等待第一次 GPS 数据;收到定位后切换为GOTOSTART,提示你"请走到路线起点"。只有当数据已收到且距起点不超过 10 米时,才正式进入NAVIGATING,并把目标设为第 1 个检查点。这段逻辑见 Terra.ino 第 227~243 行。
这样设计的意义在于:把"走到起点"也当作一次导航任务,避免用户在错误位置就开启路线。
📍 状态二:NAVIGATING——16 向箭头实时指路
导航中,固件每秒计算一次相对方位角(目标方位角 − 罗盘当前朝向,见 calculateRelativeDirection),再落入 selectArrowImage 的 16 个 22.5° 扇区,从 N 到 NNW 中挑出最贴近的那支箭头渲染到圆屏上。
接近下一站时还有贴心反馈:当距离进入20 米,设备开始每 500ms 震动一次(DRV2605 触觉马达),让你不用抬眼也能感知"快到站了",触发逻辑在 第 311~314 行。
📍 状态三:AT_CHECKPOINT——到站的 5 秒仪式
当与检查点距离 ≤10 米,状态机切换为AT_CHECKPOINT:屏幕淡出当前箭头、淡入对应的检查点图案(imagelist.h 中共备有 10 张 240×240 图案),并记录到达时间戳;5 秒后自动回到NAVIGATING,同时把目标推进到下一站(第 289~293 行)。
若到的是最后一站,则直接进入TRAIL_ENDED并显示完成提示(第 277~284 行)。检查点坐标与数量由 config.h 中的stopLats[]、stopLons[]和numberOfStops决定。
⚡ 关键阈值速查表:TERRA 精准导航的"秘密参数"
| 参数 | 数值 | 作用 |
|---|---|---|
checkpointTrigger | 10 米 | 判定"到达"检查点/起点 |
vibrationTrigger | 20 米 | 提前触发接近震动 |
| 震动间隔 | 500ms | 接近时的连续提示节奏 |
| 检查点停留 | 5 秒 | 让你从容"打卡"后自动继续 |
| 主循环周期 | 1000ms | 每秒刷新一次导航 |
| 刷新阈值 | 0.5 米 | 距离变化不足 0.5m 不重复刷屏 |
这些参数集中在 Terra.ino 第 37~42 行,改起来毫不费力——想更灵敏?把 10 调成 15 即可。
📡 传感器如何"喂"给状态机:GPS + CMPS12 罗盘
状态机的每一次判断都来自两个传感器:
- GPS(北天 BN-880,9600 波特串口):提供经纬度,配合 TinyGPSPlus 库计算距离与方位角,见 getDistanceTo
- CMPS12 倾角补偿电子罗盘(I2C 地址 0x60):读出 16 位角度再除以 10 得到朝向,实现见 readCompass
🛠️ 调试技巧:固件默认开启debugMode(第 3 行),无需真实 GPS——在串口监视器里输入纬度,经度逐点"挪动"自己,就能在书桌前完整走一遍从 PENDING 到 TRAIL_ENDED 的全部状态,是验证状态机逻辑最快的方式。
🛠️ 快速上手:3 步生成你的专属检查点路线
- 生成路线:本地运行 App/server.js(Node.js v21.5),调用
/generate-trail接口,让 ChatGPT 按你的时间和心情产出检查点坐标,再在 index.html 中下载生成的config.h - 写入固件:用下载的文件替换 Arduino Code/Terra/config.h,重新编译烧录 ESP32 即可
- 打印外壳:使用 STL Files/ 中的 3D 打印模型,把硬件装进透明外壳,即可出门散步 🚶
💡 进阶玩法:你可以把 240×240 黑白 BMP 图片转成 XBM 位图,替换 images/checkpoints/ 中的图案,让每个检查点都有专属视觉符号;16 支箭头图案同样位于 images/arrows/。
小结
TERRA导航状态机用最朴素的 4 状态设计,把"生成路线 → 走向起点 → 逐站导航 → 到站停留 → 完成"串成一次无需手机的散步体验:10 米判定到达保证精准,20 米震动提示带来从容,16 向箭头让方向一目了然。读懂这套状态机,你也能为自己的任何 IoT 导航项目搭出同样可靠的骨架。
【免费下载链接】terra项目地址: https://gitcode.com/gh_mirrors/terra2/terra
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考