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

217 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据流快速参考指南
## 一句话理解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独立放置。