QDAirPortBackend0122/doc/work/无人车经纬度参数错误修复_20250117.md
2026-01-22 13:19:47 +08:00

4.8 KiB
Raw Blame History

无人车经纬度参数错误修复技术报告

问题背景

用户在测试系统时发现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.java
    • tools/mock_server.py(位置计算优化)
    • 相关配置和文档文件

总结

这是一个典型的参数顺序错误,看似简单但影响重大。通过用户的准确反馈和系统性的调试,最终定位到构造函数参数顺序问题。此次修复不仅解决了无人车移动问题,还优化了整个位置计算系统,提升了系统的稳定性和准确性。


技术报告创建时间: 2025-01-17
版本: 0.3.3
状态: 已完成