import core.TrajectorySimulator import core.SimulatorConfig import core.PhysicsConfig import core.NoiseConfig import core.OutputConfig import resources.data.sampleRoute /** * 主程序入口 * * 演示如何使用 TrajectorySimulator 生成轨迹数据 * * 完整流程: * 1. 加载样本轨迹 * 2. 创建模拟器实例 * 3. 配置参数 * 4. 模拟运动 * 5. 输出结果 */ fun main() { // ════════════════════════════════════════════ // 第1步:准备数据 // ════════════════════════════════════════════ val route = sampleRoute // ════════════════════════════════════════════ // 第2步:创建模拟器 // ════════════════════════════════════════════ val config = SimulatorConfig( physics = PhysicsConfig( totalDistance = 2000.0, duration = 600.0, maxVelocity = 4.0, minVelocity = 1.8, sampleStepSeconds = 1.0, modelMaxAccelerationMps2 = 1.2, seed = 42L ), noise = NoiseConfig( gpsErrorStdDev = 0.00002, driftWeight = 0.1 ), output = OutputConfig( duration = 600.0, timeStep = 3.0 ) ) val simulator = TrajectorySimulator(route, config) // ════════════════════════════════════════════ // 第4步:模拟运动(逐个时间步) // ════════════════════════════════════════════ val timeStep = config.output.timeStep val duration = config.output.duration // 总模拟时长10分钟 println("时间(秒)\t距离(米)\t速度(m/s)\t加速度(m/s²)\t纬度\t\t经度\t\tGPS误差(m)") println("─".repeat(100)) val routeStates = simulator.routeOut(duration = duration, timeStep = timeStep) routeStates.forEach { motionState -> println( "%.1f\t%.1f\t%.3f\t%.3f\t%.6f\t%.6f\t%.6f".format( motionState.time, motionState.distance, motionState.velocity, motionState.acceleration, motionState.latitude, motionState.longitude, motionState.gpsError ) ) } println("\n模拟完成!") } /** * 伪代码:未来扩展示例 * * // 例1:支持多个样本轨迹 * val simulator2 = TrajectorySimulator(customRoute) * * // 例2:生成多个轨迹并导出GPX/KML * val motionStates = mutableListOf() * for (time in 0.0..duration step timeStep) { * motionStates.add(simulator.simulate(time)) * } * GpxExporter.export(motionStates, "output.gpx") * KmlExporter.export(motionStates, "output.kml") * * // 例3:统计分析 * val avgVelocity = motionStates.map { it.velocity }.average() * val maxError = motionStates.map { it.gpsError }.maxOrNull() */