TERRA导航状态机深度解析:如何精准引导你走完10个检查点
2026/8/23 14:46:13 网站建设 项目流程

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 精准导航的"秘密参数"

参数数值作用
checkpointTrigger10 米判定"到达"检查点/起点
vibrationTrigger20 米提前触发接近震动
震动间隔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 步生成你的专属检查点路线

  1. 生成路线:本地运行 App/server.js(Node.js v21.5),调用/generate-trail接口,让 ChatGPT 按你的时间和心情产出检查点坐标,再在 index.html 中下载生成的config.h
  2. 写入固件:用下载的文件替换 Arduino Code/Terra/config.h,重新编译烧录 ESP32 即可
  3. 打印外壳:使用 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询