likeRunner/DATA_FLOW_GUIDE.md
pythagodzilla 07cb1304d2 init
2026-03-19 17:57:03 +08:00

5.8 KiB
Raw Permalink Blame History

数据流快速参考指南

一句话理解4步处理流程

时间 → 物理 → 路径 → 噪声 → 结果

详细数据流

第1步物理计算 (Physics)

输入double time

过程:
  RunnerPhysics.calculate(time)
    ↓
  计算距离、速度、加速度

输出PhysicsState
  {
    time: Double,           // 时间
    distance: Double,       // 行进距离(米)
    velocity: Double,       // 速度m/s
    acceleration: Double    // 加速度m/s²
  }

文件位置src/main/kotlin/core/physics/RunnerPhysics.kt

第2步路径插值 (Trajectory)

输入double distance来自第1步

过程:
  PathInterpolator.interpolate(distance)
    ↓
  在轨迹上查找对应坐标
  使用Haversine算法计算路段距离
  (线性插值得到准确坐标)

输出RawCoordinate无噪声
  {
    lon: Double,  // 经度
    lat: Double   // 纬度
  }

文件位置src/main/kotlin/core/trajectory/PathInterpolator.kt

第3步噪声处理 (Noise)

输入:
  - RawCoordinate第2步的输出
  - PhysicsState第1步的输出

过程:
  NoiseProcessor.applyNoise()
    ↓
  ├─ GpsNoiseEngine.applyNoise(lon, lat)
  │   - 白噪声:每个时刻的随机偏差
  │   - 漂移GPS偏向某侧的持续特性
  │   - 返回:(lon±noise, lat±noise, error_magnitude)
  │
  ├─ [预留] VelocityNoiseEngine.applyNoise(velocity)
  │   - 速度波动噪声
  │
  └─ [预留] AccelerationNoiseEngine.applyNoise(acceleration)
      - 加速度波动噪声

输出NoisyCoordinate
  {
    lon: Double,           // 经度(带噪声)
    lat: Double,           // 纬度(带噪声)
    gpsError: Double       // 噪声大小(米)
  }

文件位置:
  - 协调器src/main/kotlin/noise/NoiseProcessor.kt
  - GPS噪声src/main/kotlin/noise/GpsNoiseEngine.kt

第4步结果组装 (Assembly)

输入:
  - PhysicsState第1步
  - NoisyCoordinate第3步

过程:
  组装所有数据到单一对象

输出MotionState最终结果
  {
    time: Double,                // 时间(秒)
    distance: Double,            // 距离(米)
    velocity: Double,            // 速度m/s
    acceleration: Double,        // 加速度m/s²
    latitude: Double,            // 纬度(带噪声)
    longitude: Double,           // 经度(带噪声)
    gpsError: Double,            // GPS噪声
    velocityNoise: Double,       // 速度噪声(预留)
    accelNoise: Double           // 加速度噪声(预留)
  }

文件位置src/main/kotlin/model/MotionState.kt

在哪里插入新功能?

想添加速度噪声?

位置第3步 - NoiseProcessor.applyNoise()
方法:
  1. 在 GpsNoiseEngine.kt 中实现 VelocityNoiseEngine
  2. 在 NoiseProcessor 中调用:
     val velNoise = velocityNoiseEngine.applyNoise(physicsState.velocity)
  3. 在 MotionState 中记录结果velocityNoise = velNoise

想添加高程信息?

位置第2步和第3步之间
方法:
  1. 创建 src/main/kotlin/core/trajectory/ElevationInterpolator.kt
  2. 在 TrajectorySimulator.simulate() 中:
     步骤2.5: val elevation = elevationInterpolator.interpolate(distance)
  3. 扩展 MotionState 添加 elevation 字段

想改变运动模式(跑步/散步)?

位置第1步 - RunnerPhysics.calculate()
方法:
  1. 在 RunnerPhysics 中添加运动模式参数
  2. 根据速度判断当前模式
  3. 不同模式使用不同的速度曲线

想添加传感器噪声(加速度计)?

位置第3步 - NoiseProcessor.applyNoise()
方法:
  1. 在 GpsNoiseEngine.kt 中实现 AccelerationNoiseEngine
  2. 在 NoiseProcessor 中调用
  3. 在 MotionState 中记录结果

重要的类和文件

类名 文件位置 职责
TrajectorySimulator core/TrajectorySimulator.kt 主协调器管理4步流程
RunnerPhysics core/physics/RunnerPhysics.kt 第1步物理计算
PathInterpolator core/trajectory/PathInterpolator.kt 第2步路径插值
NoiseProcessor noise/NoiseProcessor.kt 第3步噪声处理
GpsNoiseEngine noise/GpsNoiseEngine.kt GPS噪声实现
MotionState model/MotionState.kt 最终输出数据结构

调用顺序(不要改)

main()
  ↓
TrajectorySimulator(route)  // 初始化
  ↓
for (time in 0..duration)
  ↓
  simulator.simulate(time)
    ↓
    [第1步] physicsEngine.calculate(time) → PhysicsState
    ↓
    [第2步] pathInterpolator.interpolate(distance) → RawCoordinate
    ↓
    [第3步] noiseProcessor.applyNoise(rawCoord, physicsState) → NoisyCoordinate
    ↓
    [第4步] 组装 MotionState
    ↓
    return MotionState

核心算法(逻辑保持原样)

Haversine 公式(计算球面距离)

位置PathInterpolator.calculateHaversineDistance()

  • 输入:两个坐标点
  • 输出:球面距离(米)
  • 逻辑完全保留

GPS 噪声模型

位置GpsNoiseEngine.applyNoise()

  • 白噪声:高斯分布
  • 漂移0.8 衰减 + 随机累积
  • 逻辑完全保留

常见问题

Q: 我该改哪个文件? A: 看你要做什么:

  • 改物理计算 → RunnerPhysics.kt
  • 改路径算法 → PathInterpolator.kt但不要改Haversine
  • 加新噪声 → GpsNoiseEngine.kt 或新建文件
  • 改输出格式 → MotionState.kt

Q: 怎么知道在哪一步插入新功能? A: 问自己"我的新功能需要什么输入"

  • 需要时间 → 第1步前
  • 需要距离 → 第2步前
  • 需要坐标 → 第3步前
  • 需要物理参数 → 第3步中

Q: 原有代码会不会被破坏? A: 不会。原始项目likeRunner完全保留新项目refactored-likeRunner独立放置。