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