4.8 KiB
4.8 KiB
无人车经纬度参数错误修复技术报告
问题背景
用户在测试系统时发现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格式:
{
"transId": "uuid",
"timestamp": 1737123456789,
"vehicleID": "鲁B567",
"latitude": 36.369696, // 纬度 - 正确
"longitude": 120.083084, // 经度 - 正确
"speed": 6.944,
"direction": 1.5708
}
4. Java对象映射验证
检查UnmannedVehicle构造函数的JSON映射:
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构造调用:
this.currentPosition = new GeoPosition(latitude, longitude, 0);
检查GeoPosition类定义:
@Data
@AllArgsConstructor
public class GeoPosition {
public double latitude; // 第一个参数
public double longitude; // 第二个参数
public double altitude; // 第三个参数
}
问题根因确认:@AllArgsConstructor按字段声明顺序生成构造函数GeoPosition(latitude, longitude, altitude),但调用时传入的是(longitude, latitude, 0),导致经纬度参数顺序颠倒!
修复方案
代码修复
// 修复前:参数顺序错误
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.javatools/mock_server.py(位置计算优化)- 相关配置和文档文件
总结
这是一个典型的参数顺序错误,看似简单但影响重大。通过用户的准确反馈和系统性的调试,最终定位到构造函数参数顺序问题。此次修复不仅解决了无人车移动问题,还优化了整个位置计算系统,提升了系统的稳定性和准确性。
技术报告创建时间: 2025-01-17
版本: 0.3.3
状态: 已完成