# 传感器接入待开发方案 本文档用于整理当前项目后续可利用的传感器能力,分为: - 微信小程序能力边界 - 原生 Flutter App 能力边界 - 两端统一的抽象建议 - 推荐落地顺序 目标不是一次性接入所有传感器,而是优先接入对当前地图玩法、自动转图、运动状态识别、HUD/反馈最有价值的能力。 --- ## 1. 总体原则 传感器接入必须遵守以下原则: - 原始传感器数据只放在 `engine/sensor` - 融合后的高级状态放在 `telemetry` - 地图引擎只消费“对地图有意义的结果” - 规则引擎只在玩法确实需要时消费高级状态 - 不要把原始三轴值直接喂给地图或玩法逻辑 推荐统一产出的高级状态包括: - `movementState` - `headingSource` - `devicePose` - `headingConfidence` - `cadenceSpm` - `motionIntensity` --- ## 2. 微信小程序可用传感器 ### 2.1 当前确认可用 基于微信小程序官方 API 与项目内 typings,当前可直接使用的能力包括: - `Location` - `wx.startLocationUpdate` - `wx.startLocationUpdateBackground` - `wx.onLocationChange` - `Accelerometer` - `wx.startAccelerometer` - `wx.onAccelerometerChange` - `Compass` - `wx.startCompass` - `wx.onCompassChange` - `DeviceMotion` - `wx.startDeviceMotionListening` - `wx.onDeviceMotionChange` - `Gyroscope` - `wx.startGyroscope` - `wx.onGyroscopeChange` - `WeRunData` - `wx.getWeRunData` ### 2.2 当前确认不可直接获得的原始能力 微信小程序没有直接开放以下原始传感器接口: - `Gravity` - `Linear Acceleration` - `Rotation Vector` - `Geomagnetic Field` 原始三轴 - `Proximity` - 原始 `Step Counter` 说明: - `wx.getWeRunData` 不是实时步数传感器流 - 它更适合中长期统计,不适合实时地图玩法 --- ## 3. 微信小程序推荐应用方案 ### 3.1 第一优先级 #### A. Gyroscope 用途: - 提升自动转图平滑度 - 降低跑步中手机晃动导致的朝向抖动 - 增强指北针和地图旋转过渡体验 推荐产出: - `turnRate` - `headingSmoothFactor` - `headingStability` #### B. DeviceMotion 用途: - 识别手机姿态 - 判断设备是竖持、倾斜还是接近平放 - 配合 gyro 增强朝向可信度 推荐产出: - `devicePose` - `orientationConfidence` - `tiltState` #### C. Compass 用途: - 静止或低速时,作为持机朝向基准 - 指北针展示 推荐角色: - 继续保留 - 作为“静止朝向输入” - 不再单独承担跑动中的全部朝向逻辑 ### 3.2 第二优先级 #### D. Accelerometer 用途: - 辅助识别是否真的在移动 - 识别急停、抖动、运动强度变化 推荐产出: - `motionIntensity` - `movementConfidence` 说明: - 不建议直接用原始加速度驱动地图行为 - 应和 GPS、gyro 一起融合使用 #### E. Location 用途: - 当前定位 - 轨迹 - 目标距离 - movement heading - 速度估计 推荐角色: - 继续作为地图和玩法核心输入 - 后续更多与 gyro / accelerometer 配合使用 ### 3.3 当前不建议优先投入 #### F. WeRunData 用途: - 日级步数统计 - 长周期运动数据 当前不建议投入原因: - 不是实时传感器 - 不适合当前地图实时玩法主链 --- ## 4. 微信小程序推荐先产出的高级状态 ### A. movementState 建议值: - `idle` - `walk` - `run` 来源: - GPS 速度 - accelerometer - device motion ### B. headingSource 建议值: - `sensor` - `blended` - `movement` 来源: - compass - gyroscope - GPS track ### C. devicePose 建议值: - `upright` - `tilted` - `flat` 来源: - device motion - gyroscope ### D. headingConfidence 建议值: - `low` - `medium` - `high` 来源: - compass - gyroscope - GPS 精度 - movement heading 是否可靠 --- ## 5. 原生 Flutter App 可用传感器 原生 Flutter App 的能力边界明显更强,后续如果迁移或并行开发,可直接利用系统原始传感器。 ### 5.1 可考虑直接接入 - `Location / GNSS` - `Compass / Magnetometer` - `Gyroscope` - `Accelerometer` - `Linear Acceleration` - `Gravity` - `Rotation Vector` - `Step Counter / Pedometer` - `Barometer`(如设备支持) - `Proximity`(视玩法需求) 说明: - Flutter 本身一般通过插件获取这些能力 - 具体以 Android / iOS 可用性差异为准 ### 5.2 Flutter 相对小程序的主要优势 - 能直接拿到更完整的原始传感器矩阵 - 更适合做高质量姿态融合 - 更适合做步数、步频、跑动状态识别 - 可更深度控制后台行为和采样频率 --- ## 6. Flutter 推荐应用方案 ### 6.1 第一优先级 #### A. Rotation Vector 用途: - 作为地图自动转图的高质量姿态输入 - 优于单纯磁力计 + 罗盘 推荐产出: - `deviceHeadingDeg` - `devicePose` - `headingConfidence` #### B. Gyroscope 用途: - 旋转平滑 - 快速转身检测 - 姿态短时补偿 #### C. Linear Acceleration 用途: - 识别运动状态 - 急停、冲刺、抖动判定 推荐产出: - `motionIntensity` - `movementState` #### D. Step Counter 用途: - 实时步数 - 步频 - 跑步状态识别 - 训练/卡路里模型增强 推荐产出: - `stepCount` - `cadenceSpm` - `movementState` ### 6.2 第二优先级 #### E. Gravity 用途: - 持机姿态识别 - 平放/竖持策略切换 #### F. Magnetometer 用途: - 作为姿态融合底层输入 建议: - 不建议单独直接映射到业务逻辑 - 主要与 rotation vector / gyro 融合 #### G. Barometer 用途: - 海拔变化 - 爬升检测 适合: - 户外定向训练 - 赛后统计 --- ## 7. Flutter 推荐先产出的高级状态 ### A. movementState 建议值: - `idle` - `walk` - `run` - `sprint` 来源: - GPS - step counter - linear acceleration ### B. cadenceSpm 用途: - 训练分析 - 卡路里估算增强 - 玩法资源逻辑 ### C. devicePose 建议值: - `upright` - `tilted` - `flat` ### D. headingSource 建议值: - `sensor` - `blended` - `movement` ### E. headingConfidence 建议值: - `low` - `medium` - `high` ### F. elevationTrend 建议值: - `flat` - `ascending` - `descending` 来源: - barometer - GPS altitude --- ## 8. 两端统一抽象建议 尽管两端可用传感器不同,但建议统一抽象,不让上层感知平台差异。 ### 8.1 原始层 放在: - `engine/sensor` 职责: - 读取平台原始传感器 - 做最基础的节流、归一化、权限处理 ### 8.2 融合层 放在: - `telemetry` 职责: - 生成统一高级状态 - 对外屏蔽平台差异 建议统一输出: - `movementState` - `devicePose` - `headingSource` - `headingConfidence` - `cadenceSpm` - `motionIntensity` ### 8.3 消费层 #### 地图引擎消费 - `headingSource` - `devicePose` - `headingConfidence` #### 规则层消费 - `movementState` - `cadenceSpm` - `motionIntensity` #### HUD / Feedback 消费 - `movementState` - `cadenceSpm` - 心率 / 卡路里 / 训练强度 --- ## 9. 推荐接入顺序 ### 微信小程序第一阶段 先接: - `Gyroscope` - `DeviceMotion` 目标: - 提升自动转图质量 - 产出更稳定的姿态与朝向可信度 ### 微信小程序第二阶段 再接: - `Accelerometer` 目标: - 提升 movement state 识别 ### Flutter 第一阶段 先接: - `Rotation Vector` - `Gyroscope` - `Linear Acceleration` 目标: - 直接建立高质量朝向与运动状态底座 ### Flutter 第二阶段 再接: - `Step Counter` - `Gravity` 目标: - 增强运动统计与姿态判断 --- ## 10. 当前最值得优先投入的方向 如果只从当前项目收益看,最值得优先做的是: ### 微信小程序 - `Gyroscope` - `DeviceMotion` ### Flutter - `Rotation Vector` - `Gyroscope` - `Linear Acceleration` 原因: - 这些能力最直接影响地图体验 - 最贴近当前自动转图、前进方向、姿态识别需求 - 复用价值高 --- ## 11. 一句话结论 ### 微信小程序 可用传感器有限,但足够继续做: - 更稳的自动转图 - 更好的朝向平滑 - 更好的运动状态识别 最值得优先接入的是: - `Gyroscope` - `DeviceMotion` - `Accelerometer` ### 原生 Flutter App 可利用的原始传感器更完整,建议未来重点发挥: - `Rotation Vector` - `Gyroscope` - `Linear Acceleration` - `Step Counter` 两端都应遵守同一个原则: **原始传感器进 `engine/sensor`,高级状态进 `telemetry`,上层只消费统一状态。**