整理中文文档结构与索引

This commit is contained in:
2026-03-30 18:49:22 +08:00
parent 3b9117427e
commit 24bc60bc7f
49 changed files with 462 additions and 136 deletions

View File

@@ -0,0 +1,235 @@
# 传感器现状总结
本文档用于说明当前小程序版本已经接入并实际使用的传感器/输入源、它们在系统中的作用,以及当前阶段的稳定边界。
## 1. 当前正式在用的传感器/输入源
### 1.1 GPS 定位
当前作用:
- 当前定位点显示
- GPS 轨迹线绘制
- 到目标点距离计算
- 打点半径判定
- 地图锁定跟随
- 自动转图中的前进方向判断
- 速度、里程、卡路里等 telemetry 统计
当前涉及层:
- `LocationController`
- `TelemetryRuntime`
- `MapEngine`
- `RuleEngine`
说明:
- 这是当前地图和玩法系统最核心的输入源。
### 1.2 Compass 罗盘
当前作用:
- 指北针
- 静止或低速时的地图朝向
- 真北 / 磁北参考切换相关显示
当前涉及层:
- `CompassHeadingController`
- `MapEngine`
说明:
- 当前自动转图的稳定主来源之一。
### 1.3 Gyroscope 陀螺仪
当前作用:
- 提供设备旋转速率调试数据
- 为设备朝向可信度提供辅助参考
- 为后续更稳的自动转图平滑能力预留输入
当前涉及层:
- `GyroscopeController`
- `TelemetryRuntime`
说明:
- 当前已接入并显示,但还没有直接主导地图旋转。
### 1.4 DeviceMotion 设备方向
当前作用:
- 提供设备朝向角参考
- 参与 `deviceHeadingDeg`
- 参与 `headingConfidence`
- 用于调试观察姿态相关信息
当前涉及层:
- `DeviceMotionController`
- `TelemetryRuntime`
说明:
- 当前不直接接管自动转图,主要作为辅助与调试输入。
### 1.5 BLE 心率带
虽然不是手机内置传感器,但当前已经是正式输入源。
当前作用:
- 实时心率采集
- HUD 颜色分区
- 卡路里估算
- 橙 / 红警戒边框
- 后续心率相关玩法
当前涉及层:
- `HeartRateController`
- `HeartRateInputController`
- `TelemetryRuntime`
- HUD / Feedback
## 2. 当前正式在用的模拟输入源
### 2.1 模拟 GPS
当前作用:
- 室内测试路线与打点
- 模拟移动
- 测试规则、HUD、自动转图
说明:
- 与真实 GPS 并列,是正式的开发调试输入源。
### 2.2 模拟心率
当前作用:
- 测试心率颜色区间
- 测试卡路里累计
- 测试边框警示
- 测试第二块 HUD
说明:
- 与真实心率带并列,是正式的开发调试输入源。
## 3. 当前没有纳入正式能力的传感器
### 3.1 Accelerometer 加速度计
当前状态:
- 在当前微信小程序运行时 / 设备环境下不稳定
- 启动时出现 `startAccelerometer:fail, has enable, should stop pre operation`
- 已从当前第一阶段正式方案中移出
结论:
- 当前小程序版本不依赖加速度计
- 后续更完整的姿态 / 运动融合,建议放到原生 Flutter 端实现
## 4. 当前地图上真正直接起作用的核心输入
如果只看当前会直接影响地图行为和玩法行为的核心输入,主要是:
- `GPS`
- `Compass`
- `Heart Rate (BLE)`
其中:
- `GPS` 负责位置、轨迹、速度、距离、打点、跟随、前进方向
- `Compass` 负责当前稳定的地图朝向与指北针
- `Heart Rate` 负责 HUD 颜色、卡路里和警戒反馈
而:
- `Gyroscope`
- `DeviceMotion`
当前更多是为后续更稳的朝向融合能力做准备。
## 5. 当前阶段的稳定边界
小程序第一阶段推荐稳定边界如下:
- 保留:
- `Location`
- `Compass`
- `Gyroscope`
- `DeviceMotion`
- `BLE Heart Rate`
- `Mock GPS`
- `Mock Heart Rate`
- 放弃:
- `Accelerometer`
结论:
- 小程序端以稳定为优先
- 更完整的原始传感器融合,放在原生 Flutter 端推进
## 6. 一句话总结
当前小程序版本已经正式使用的核心传感器 / 输入源是:
- `GPS`
- `Compass`
- `Gyroscope`
- `DeviceMotion`
- `Heart Rate (BLE)`
- `Mock GPS`
- `Mock Heart Rate`
其中真正直接驱动地图行为的核心仍然是:
- `GPS`
- `Compass`
其余能力更多承担辅助、调试、反馈和后续扩展输入的角色。
---
## 7. 当前主体能力边界补充
最近排查已经确认:
- 当前最初使用的是**个人主体**小程序
这会影响部分设备能力的可用性与稳定性,尤其是:
- `Compass`
- `Accelerometer`
-`web-view` 相关的扩展体验链
因此当前这份传感器结论要加一个前提:
**它不仅受到代码实现影响,也受到小程序主体能力边界影响。**
这意味着:
- 某些 Android 上的样本异常,不一定是算法错误
- 某些 H5 / 传感器问题,不一定能在个人主体下彻底解决
当前建议:
- 原生主流程继续开发
- 传感器高级能力与 H5 接入先保留设计与代码入口
- 等企业主体切换完成后,再做专项回归
详细说明见:
- [platform-capability-notes.md](D:/dev/cmr-mini/doc/debug/平台能力说明.md)

View File

@@ -0,0 +1,145 @@
# 平台能力与主体限制说明
本文档用于记录当前项目在 **微信小程序平台能力** 上已经确认的边界,避免后续把环境或主体限制误判成代码问题。
---
## 1. 当前已确认的关键事实
当前项目最初使用的是**个人主体**小程序。
在这个前提下,已经出现并确认了以下问题:
- `web-view` 无法打开指定 H5 页面
- 某些传感器能力在不同设备上表现异常或不稳定
- 部分能力在 `iOS``Android` 上差异极大
这些问题在排查后,已经基本确认不完全是代码链路问题,而与 **小程序主体能力边界** 直接相关。
---
## 2. 当前确认受影响的能力
### 2.1 WebView / H5 定制内容
现象:
- 浏览器中 H5 页面可正常打开
- 小程序 `web-view` 中提示:
- `无法打开该页面`
- `不支持打开 https://...`
当前结论:
- 这不代表 H5 页面本身有问题
- 也不代表内容体验链路本身有问题
- 在个人主体下,即使同域名下配置可读,`web-view` 仍可能不可用或受限
### 2.2 传感器相关能力
现象:
- `Compass` 在不同平台表现不一致
- `Accelerometer` 启动异常
- 某些 Android 设备上指北针样本不稳定
当前结论:
- 这类问题不能简单归因为算法
- 其中一部分和小程序主体能力、平台能力边界有关
- 在企业主体完成前,不宜继续对这类问题做过度代码优化
---
## 3. 为什么“同域名能读配置”不代表“能开 H5”
这是排查中最容易误判的点。
在微信小程序里:
- 读取配置、请求接口,依赖的是:
- `request` 相关域名能力
- 打开 `web-view`,依赖的是:
- `业务域名`
这两者不是同一条能力链。
因此会出现:
- 配置文件能正常读取
- 同域名 H5 页面却无法在 `web-view` 中打开
这个现象本身并不矛盾。
---
## 4. 当前开发策略
在企业主体审核完成前,建议采用以下策略:
### 4.1 原生能力优先
继续优先开发:
- 地图主流程
- 打点逻辑
- HUD
- 指北针与自动转图
- 原生内容卡兜底
- 原生结果页兜底
### 4.2 H5 与高级传感器相关能力先按“接口预留”处理
当前阶段可以继续做:
- 文档
- 模型
- 配置结构
- Bridge 设计
- 容器页
但不要再花大量时间试图用当前个人主体把所有能力彻底打通。
### 4.3 企业主体通过后再做专项回归
企业主体切换完成后,应专项回归:
- `web-view`
- `Compass`
- `Accelerometer`
- 其它之前表现异常的能力
---
## 5. 企业主体切换后的回归建议
建议回归顺序:
1. 最小 `web-view` 测试页
2. H5 内容体验页自动弹出
3. H5 点击内容页
4. `Compass` 样本接收
5. 自动转图
6. `Accelerometer`
如果最小 `web-view` 测试页仍失败,再继续查:
- 业务域名
- 当前 appid
- 当前环境版本
- 真机微信缓存
---
## 6. 一句话结论
当前阶段已经确认:
**个人主体会直接影响 `web-view` 和部分传感器能力的可用性与稳定性。**
因此在企业主体审核完成前,最合理的做法是:
- 原生主流程继续开发
- H5 和高级传感器按“预留 + 待验证”处理
- 待企业主体生效后,再统一回归验证

View File

@@ -0,0 +1,126 @@
# 模拟器调试日志方案
## 目标
复用现有 GPS 模拟器 websocket在不污染地图调试面板的前提下把高频、临时、开发期日志输出到外部模拟器。
第一阶段只做最小闭环:
- 复用 `tools/mock-gps-sim` 现有 websocket
- 增加 `debug-log` 消息类型
- 小程序侧增加最小 logger
- 第一批只发送 `gps-logo` 范围日志
## 设计原则
- 调试面板看“当前状态”
- 模拟器日志看“变化过程”
- 日志链只在开发/调试期间启用
- 不进入正式玩法逻辑
- 不把高频临时日志继续塞进页面 WXML
## 协议
消息类型:
```json
{
"type": "debug-log",
"timestamp": 1712345678901,
"scope": "gps-logo",
"level": "info",
"message": "wx.getImageInfo success",
"payload": {
"src": "https://example.com/logo.png",
"path": "wxfile://tmp_xxx"
}
}
```
字段说明:
- `type`
固定为 `debug-log`
- `timestamp`
毫秒时间戳
- `scope`
日志分类,例如 `gps-logo``h5``compass`
- `level`
`info / warn / error`
- `message`
简短可读说明
- `payload`
可选附加对象,用于排查细节
## 第一阶段 scope
第一批只接:
- `gps-logo`
典型日志点:
- logo 未配置
- 当前风格不是 `badge`
- 开始加载 logo
- `wx.getImageInfo` 成功
- `wx.getImageInfo` 失败
- 图片 `onload`
- 图片 `onerror`
## 小程序侧实现
新增:
- `miniprogram/engine/debug/mockSimulatorDebugLogger.ts`
职责:
- 复用 mock GPS simulator websocket 地址
- 负责连接、断开、简单队列、发送 `debug-log`
- 只在调试 UI 开启时启用
接入点:
- `MapEngine`
- 调试 UI 开启时启用 logger
- 调试 UI 关闭时关闭 logger
- mock bridge 地址变化时同步 logger 地址
- `CourseLabelRenderer`
- 发送 `gps-logo` 相关日志
## 模拟器侧实现
复用:
- `tools/mock-gps-sim/server.js`
- `tools/mock-gps-sim/public/index.html`
- `tools/mock-gps-sim/public/simulator.js`
最小能力:
- websocket 接收 `debug-log`
- UI 新增“调试日志”区域
- 仅显示 `debug-log`
- 保留最近若干条,避免无限增长
## 后续扩展
第二阶段可以再补:
- `compass`
- `h5`
- `content-card`
- `heart-rate`
第三阶段再补:
- scope 过滤
- level 过滤
- 暂停滚动
- 导出日志
## 当前结论
先把 `gps-logo` 调试链打通,再回头用模拟器日志查 logo 为什么不显示,比继续把临时字段堆在调试面板里更稳。

View File

@@ -0,0 +1,213 @@
# 罗盘问题排查记录
## 背景
本项目在微信小程序中使用罗盘驱动:
- 指北针针头
- 指北针顶部角度数字
- `heading-up` 自动转图
在一次围绕顶部提示窗、传感器显示链和性能优化的修改后,出现了以下问题:
- iOS 端偶发正常,偶发异常
- Android 端罗盘长期无样本
- 指北针不转
- `heading-up` 自动转图一起失效
## 最终结论
这次问题的主因不是算法本身,而是:
**Android 微信环境下,罗盘监听需要被持续保活;之前将多处看似冗余的 `compassController.start()` 清理掉后Android 的罗盘样本链被破坏了。**
也就是说:
- iOS 对罗盘监听更宽容
- Android 对罗盘监听更脆弱
- 之前稳定,不是因为链路更“干净”,而是因为老代码里存在一条实际有效的“罗盘保活链”
## 现象总结
### 失效期
- Android 调试面板里 `Compass Source``无数据`
- iOS 仍可能有 `罗盘` 样本
- 若强行用 `DeviceMotion` 兜底,会出现:
- 指针会转
- 但方向不准
- 自动转图方向错误
### 恢复后
- Android `Compass Source` 恢复为 `罗盘`
- 指北针针头恢复
- 顶部角度数字恢复
- `heading-up` 恢复
## 误判过的方向
以下方向在本次排查中都被考虑过,但最终不是根因或不是主要根因:
### 1. `DeviceMotion` 兜底方案
问题:
- `DeviceMotion` 可以给出设备姿态角
- 但不能稳定代替“指向北”的绝对罗盘
- 用它兜底会导致:
- 能转
- 但方向明显不准
结论:
**`DeviceMotion` 不能作为正式指北针来源。**
### 2. 加速度计 / 其他传感器互斥
曾排查:
- `Accelerometer`
- `Gyroscope`
- `DeviceMotion`
- `Compass`
结论:
- 加速度计在当前微信 Android 环境下不稳定,已放弃
- 但这不是这次罗盘彻底失效的主因
### 3. 算法问题
曾尝试调整:
- 角度平滑
- 设备方向单位解释
- motion fallback 算法
结论:
这些会影响“顺不顺”、“准不准”,但**不能解释 Android 完全无罗盘样本**。
## 真正修复的方法
将之前被清理掉的多处 `this.compassController.start()` 恢复回去。
这些调用点主要分布在:
- `commitViewport(...)`
- `handleTouchStart(...)`
- `animatePreviewToRest(...)`
- `normalizeTranslate(...)`
- `zoomAroundPoint(...)`
- `handleRecenter(...)`
- `handleRotateStep(...)`
- `handleRotationReset(...)`
这些调用在代码审美上看起来像“重复启动”,但在 Android 微信环境里,它们实际上承担了:
**重新拉起 / 保活罗盘监听**
的作用。
## 当前工程判断
本项目当前应当采用以下原则:
### 1. 罗盘主来源只使用 `Compass`
不要再让:
- `DeviceMotion`
- 其它姿态角
参与正式指北针和自动转图的主方向链。
### 2. `DeviceMotion` 只保留为辅助或调试输入
可用于:
- 调试面板显示
- 设备姿态观察
- 未来原生端姿态融合参考
但不要直接驱动指北针。
### 3. Android 端罗盘需要保活
后续不要再把这些 `compassController.start()` 当成纯冗余逻辑随意清掉。
如果要优化代码,应该:
- 保留现有行为
- 将其收口为有明确语义的方法
例如:
- `ensureCompassAlive()`
- `refreshCompassBinding()`
而不是直接删掉。
## 与生命周期相关的硬约束
以下约束必须保持:
### 单实例
页面层必须保证任意时刻只有一个 `MapEngine` 活跃实例。
### 完整销毁
`MapEngine.destroy()` 中必须完整执行:
- `compassController.destroy()`
- 其它传感器 `destroy()`
防止旧监听残留。
### 调试状态不应影响罗盘主链
调试面板开关不应再控制:
- 罗盘是否启动
- 罗盘是否停止
否则容易再次引入平台差异问题。
## 推荐保留的调试字段
以下字段建议长期保留,便于后续定位:
- `Compass Source`
- `sensorHeadingText`
- 顶部角度数字
- `heading-up` 开关状态
其中 `Compass Source` 至少应显示:
- `罗盘`
- `无数据`
避免再次将问题误判为算法问题。
## 后续优化建议
如果后面要继续优化这段代码,推荐方向是:
### 可做
- 将分散的 `compassController.start()` 收口成命名明确的方法
- 为 Android 罗盘链补一层更可读的“保活机制”注释
- 保留当前稳定行为前提下做重构
### 不建议
- 再次移除这些重复 `start()` 调用
-`DeviceMotion` 正式兜底指北针
- 让调试开关影响罗盘主链启动
## 一句话经验
**在微信小程序里Android 罗盘监听的稳定性比 iOS 更脆;某些看似冗余的 `start()` 调用,实际是平台兼容补丁,不应该在没有真机回归的情况下清理。**

View File

@@ -0,0 +1,34 @@
# 调试文档索引
这一组文档用于记录:
- 平台能力边界
- 传感器问题排查
- 模拟器日志方案
- 当前调试约束和回归重点
## 当前主文档
- [平台能力说明](/D:/dev/cmr-mini/doc/debug/平台能力说明.md)
用于记录主体能力、`web-view`、传感器等平台边界。
- [模拟器调试日志方案](/D:/dev/cmr-mini/doc/debug/模拟器调试日志方案.md)
用于说明 mock simulator 的日志旁路与 `debug-log` 协议。
- [传感器当前状态总结](/D:/dev/cmr-mini/doc/debug/传感器现状总结.md)
用于看当前已确认的传感器状态与调试结论。
- [罗盘问题记录](/D:/dev/cmr-mini/doc/debug/罗盘排障记录.md)
用于回看 Android / iOS 罗盘保活链的排查过程。
## 推荐阅读顺序
1. [platform-capability-notes.md](/D:/dev/cmr-mini/doc/debug/平台能力说明.md)
2. [sensor-current-summary.md](/D:/dev/cmr-mini/doc/debug/传感器现状总结.md)
3. [mock-simulator-debug-log-proposal.md](/D:/dev/cmr-mini/doc/debug/模拟器调试日志方案.md)
4. [compass-debugging-notes.md](/D:/dev/cmr-mini/doc/debug/罗盘排障记录.md)
## 使用建议
- 看“当前限制”和“为什么会这样”,优先看平台能力说明。
- 看“现在系统是什么状态”,优先看传感器现状总结。
- 看“以后日志怎么打”,优先看模拟器日志方案。
- 看“为什么罗盘以前坏过”,再去看罗盘问题记录。