# 传感器接入待开发方案
> 文档版本：v1.0
> 最后更新：2026-04-02 08:28:05


本文档用于整理当前项目后续可利用的传感器能力，分为：

- 微信小程序能力边界
- 原生 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`，上层只消费统一状态。**



