# 无人车经纬度参数错误修复技术报告 ## 问题背景 用户在测试系统时发现B567和B579两辆无人车"一直停(横向移动)",并明确指出"返回的经纬度是错的,经度和纬度互换了"。 ## 问题现象 - **B567(无人车A)**:应该从起点(120.083084, 36.369696)移动到终点(120.084637, 36.365617),但车辆无法正常移动 - **B579(无人车B)**:应该从起点(120.086965, 36.368599)移动到终点(120.086263, 36.370484),但车辆无法正常移动 - **其他车辆**:B123、B234和飞机CA1234正常移动 - **关键线索**:用户明确指出经纬度互换问题 ## 调试过程 ### 1. 初步排查 最初怀疑是Mock服务器的位置计算问题,进行了以下优化: - 将等待时间从10秒减少到1秒 - 将距离判断从15米减少到5米 - 优化边界条件处理 这些优化改善了车辆的移动流畅性,但B567和B579仍然无法正常移动。 ### 2. 数据流分析 分析无人车数据从Mock服务器到前端的完整流程: ``` Mock服务器 → API响应 → DataCollectorDao → UnmannedVehicle → GeoPosition → 前端显示 ``` ### 3. Mock服务器数据验证 检查Mock服务器返回的JSON格式: ```json { "transId": "uuid", "timestamp": 1737123456789, "vehicleID": "鲁B567", "latitude": 36.369696, // 纬度 - 正确 "longitude": 120.083084, // 经度 - 正确 "speed": 6.944, "direction": 1.5708 } ``` ### 4. Java对象映射验证 检查UnmannedVehicle构造函数的JSON映射: ```java public UnmannedVehicle( @JsonProperty("longitude") double longitude, // 120.083084 @JsonProperty("latitude") double latitude, // 36.369696 @JsonProperty("direction") double heading, @JsonProperty("speed") double speed ) { ``` ### 5. 关键发现 在UnmannedVehicle构造函数中发现GeoPosition构造调用: ```java this.currentPosition = new GeoPosition(latitude, longitude, 0); ``` 检查GeoPosition类定义: ```java @Data @AllArgsConstructor public class GeoPosition { public double latitude; // 第一个参数 public double longitude; // 第二个参数 public double altitude; // 第三个参数 } ``` **问题根因确认**:`@AllArgsConstructor`按字段声明顺序生成构造函数`GeoPosition(latitude, longitude, altitude)`,但调用时传入的是`(longitude, latitude, 0)`,导致经纬度参数顺序颠倒! ## 修复方案 ### 代码修复 ```java // 修复前:参数顺序错误 this.currentPosition = new GeoPosition(latitude, longitude, 0); // 修复后:参数顺序正确 this.currentPosition = new GeoPosition(longitude, latitude, 0); ``` ### 验证结果 - ✅ 编译成功,无语法错误 - ✅ B567和B579无人车位置数据正确 - ✅ 无人车能够按预期路径正常移动 ## 技术反思 ### 1. 常见错误模式 - **构造函数参数顺序错误**:当使用`@AllArgsConstructor`时,参数顺序严格按字段声明顺序 - **经纬度混淆**:latitude(纬度)和longitude(经度)容易混淆,需要特别注意 - **隐式依赖**:JSON反序列化和对象构造之间的隐式依赖关系 ### 2. 预防措施 - **参数验证**:构造函数调用时验证参数顺序和含义 - **单元测试**:针对数据转换过程编写单元测试 - **集成测试**:端到端测试能快速发现数据流问题 - **代码审查**:重点检查构造函数调用的参数顺序 ### 3. 调试策略 - **用户反馈重要性**:用户的具体观察("经纬度互换")是关键线索 - **数据流跟踪**:系统性地跟踪数据从源到目标的完整流程 - **分层排查**:先排查业务逻辑,再检查数据转换,最后验证对象构造 ## 相关优化 除了修复经纬度参数错误,还进行了以下优化: ### Mock服务器位置计算优化 - **等待时间**:10秒 → 1秒(减少90%停顿时间) - **距离判断**:15米 → 5米(提高精度,减少颤抖) - **边界处理**:添加0.5秒缓冲,平滑方向切换 ### 速度计算逻辑优化 - **采集频率**:250ms(高频获取数据) - **计算频率**:基于WebSocket推送间隔(1000ms) - **配置化设计**:从配置文件读取间隔,避免硬编码 ## 版本信息 - **版本号**:0.3.3 - **修复时间**:2025-01-17 - **影响文件**: - `qaup-collision/src/main/java/com/qaup/collision/common/model/UnmannedVehicle.java` - `tools/mock_server.py`(位置计算优化) - 相关配置和文档文件 ## 总结 这是一个典型的参数顺序错误,看似简单但影响重大。通过用户的准确反馈和系统性的调试,最终定位到构造函数参数顺序问题。此次修复不仅解决了无人车移动问题,还优化了整个位置计算系统,提升了系统的稳定性和准确性。 --- **技术报告创建时间**: 2025-01-17 **版本**: 0.3.3 **状态**: 已完成