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

159 lines
4.9 KiB
Markdown
Raw Permalink 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.

# TrajectoryRunner - 轨迹生成器
## 概述
这是一个模拟真实跑步轨迹的 Kotlin 程序用于生成带有物理特性和GPS噪声的运动轨迹数据。
## 核心架构
整个程序遵循清晰的 4 步数据流:
```
时间 t
[步骤1: 物理计算] → 距离、速度、加速度
[步骤2: 路径插值] → 原始坐标(lon, lat)
[步骤3: 噪声处理] → 添加GPS/速度/加速度噪声
[步骤4: 结果组装] → MotionState(完整运动状态)
输出: 模拟的轨迹点
```
## 目录结构
```
src/main/kotlin/
├── Main.kt # 程序入口
├── model/ # 数据模型
│ ├── Coordinate.kt # 坐标类型定义
│ └── MotionState.kt # 运动状态定义
├── core/ # 核心模拟逻辑
│ ├── TrajectorySimulator.kt # 主协调器
│ ├── physics/ # 物理引擎
│ │ └── RunnerPhysics.kt # 物理计算
│ └── trajectory/ # 轨迹处理
│ └── PathInterpolator.kt # 路径插值含Haversine算法
├── noise/ # 噪声引擎
│ ├── NoiseProcessor.kt # 噪声协调器
│ ├── GpsNoiseEngine.kt # GPS噪声已实现
│ │ # + VelocityNoiseEngine预留
│ │ # + AccelerationNoiseEngine预留
└── resources/data/ # 样本数据
└── SampleRoute.kt # 样本轨迹数据
```
## 关键类说明
### TrajectorySimulator轨迹模拟器
- **职责**:管理整个数据流,协调各个引擎
- **初始化**:创建 PathInterpolator, RunnerPhysics, NoiseProcessor
- **核心方法**`simulate(time)` - 执行完整的4步处理
### PathInterpolator路径插值器
- **职责**:根据距离在轨迹上查找坐标
- **算法**Haversine计算球面距离
- **核心方法**`interpolate(distance)` - 线性插值
### RunnerPhysics物理引擎
- **职责**:计算物理参数(距离、速度、加速度)
- **输入**:时间
- **输出**PhysicsState
### NoiseProcessor噪声处理器
- **职责**:管理并应用各种噪声
- **已实现**GpsNoiseEngineGPS信号误差 + 漂移)
- **预留**VelocityNoiseEngine, AccelerationNoiseEngine
## 数据模型
### MetaCoordinate原始坐标
```kotlin
data class MetaCoordinate(val lon: Double, val lat: Double)
```
轨迹的基础路径点。
### PhysicsState物理状态
```kotlin
data class PhysicsState(
val time: Double,
val distance: Double,
val velocity: Double,
val acceleration: Double
)
```
某一时刻的物理参数。
### MotionState运动状态
```kotlin
data class MotionState(
val time: Double,
val distance: Double,
val velocity: Double,
val acceleration: Double,
val latitude: Double, // 带GPS噪声
val longitude: Double, // 带GPS噪声
val gpsError: Double,
val velocityNoise: Double, // 预留
val accelNoise: Double // 预留
)
```
最终的综合运动状态。
## 添加新功能的方法
### 例1添加速度噪声
`GpsNoiseEngine.kt` 中,有预留的 `VelocityNoiseEngine` 类框架,只需在 `NoiseProcessor.applyNoise()` 中调用:
```kotlin
val velocityNoise = velocityNoiseEngine.applyNoise(physicsState.velocity)
```
### 例2添加高程信息
`PathInterpolator.interpolate()` 返回后,创建 `ElevationInterpolator`在步骤2和步骤3之间插入
```kotlin
// 步骤2.5:插值高程
val elevation = elevationInterpolator.interpolate(physicsState.distance)
```
### 例3支持不同运动模式
`RunnerPhysics.calculate()` 中增加运动模式判断,不同模式使用不同的速度曲线。
## 代码设计原则
1. **单一职责**:每个类只做一件事
2. **清晰的数据流**4步处理输入输出明确
3. **易于扩展**:预留位置和接口,支持未来添加新功能
4. **逻辑完整**:核心算法逻辑保持原有
5. **充分注释**:伪代码和数据流说明帮助理解
## 使用示例
```kotlin
fun main() {
// 创建模拟器
val simulator = TrajectorySimulator(sampleRoute)
// 配置参数
simulator.setPhysicsParams(5000.0, 1800.0, 4.0)
simulator.setNoiseParams(0.00002, 0.3)
// 模拟运动
for (time in 0.0..1800.0 step 0.1) {
val motionState = simulator.simulate(time)
println(motionState)
}
}
```
## 预留扩展点
- [ ] 完整的 RunnerPhysics 物理模型实现
- [ ] VelocityNoiseEngine 速度噪声引擎
- [ ] AccelerationNoiseEngine 加速度噪声引擎
- [ ] 高程插值 (ElevationInterpolator)
- [ ] GPX/KML 导出功能
- [ ] 不同运动模式支持