qq_52139071 2025-07-22 17:00 采纳率: 0%
浏览 11

毫米波雷达感知速度异常,如何解决?(标签-AR|关键词-世界坐标)

使用大陆ARS408毫米波雷达进行目标检测,速度和目标运动状态不理想,请求指点

按照大陆ARS408毫米波雷达手册,选择Object模式,输入自车的横摆角速度yaw_rate和自车线速度speed,相关代码参考Apollo,解析并输出目标的相对运动状态和检测速度,此时出现问题:
1)自车向右旋转时,静止目标状态检测错误,均为运动状态;自车向左旋转时,静止目标运动状态输出为静止;自车直线行驶时,目标运动状态输出正确;
2)按照毫米波雷达速度+自车线速度+角速度附加速度的公式计算目标在世界坐标系下的速度,自车直线行驶时目标运动速度正确,但是当车辆旋转时最终计算的速度不准确,具体表现在静止目标最终计算速度不接近0m/s,误差在2-3m/s左右。

//添加速度给radar
void MotionInputSpeed300::UpdateData(uint8_t* data) {
  if (std::isnan(speed_)) {
    AWARN << "speed is nan";
    return;
  }
  uint32_t speed_direction = 0;
  if (fabs(speed_) < 0.02) {
    speed_direction = 0;
  } else if (speed_ < 0) {
    speed_direction = 2;
  } else {
    speed_direction = 1;
  }
  uint32_t speed_value = static_cast<uint32_t>(fabs(speed_) / 0.02);
  Byte frame_speed_direction(data);
  frame_speed_direction.set_value(
      static_cast<unsigned char>((speed_direction << 6) & 0x00C0) |
          static_cast<unsigned char>((speed_value & 0x1F00) >> 8),
      0, 8);
  Byte frame_speed(data + 1);
  frame_speed.set_value(static_cast<unsigned char>(speed_value & 0x00FF), 0, 8);
}
//添加yaw_rate给radar
void MotionInputYawRate301::UpdateData(uint8_t* data) {
  if (std::isnan(yaw_rate_)) {
    AWARN << "yaw_rate is nan";
    return;
  }
  // Due to radar 408 manual: max 327.68, res 0.01, unit:deg/s
  uint32_t yaw_rate_value = static_cast<uint32_t>((yaw_rate_ + 327.68) * 100);
  Byte yaw_rate_low(data);
  yaw_rate_low.set_value(
      static_cast<unsigned char>((yaw_rate_value & 0xFF00) >> 8), 0, 8);
  Byte yaw_rate_high(data + 1);
  yaw_rate_high.set_value(static_cast<unsigned char>(yaw_rate_value & 0x00FF),
                          0, 8);
}

//计算世界坐标系下的毫米波雷达目标速度
   Eigen::Matrix4d radar2world = frame->sensor2world_pose.matrix();
    Eigen::Matrix3d radar2world_rotate = radar2world.block<3, 3>(0, 0).cast<double>();
    Eigen::Matrix3d radar2novatel_rot = radar2gnss.matrix().block<3, 3>(0, 0).cast<double>();
    // 2. 提取车辆运动参数
    // 角速度(转换为弧度,并构建叉乘矩阵)
    Eigen::Vector3d angular_speed_body(
        gnss_data.twist.twist.angular.x,
        gnss_data.twist.twist.angular.y,
        gnss_data.twist.twist.angular.z 
    );
    Eigen::Matrix3d omega_skew;  
    omega_skew << 0, -angular_speed_body.z(), angular_speed_body.y(),
                  angular_speed_body.z(), 0, -angular_speed_body.x(),
                  -angular_speed_body.y(), angular_speed_body.x(), 0;
    // 3. 坐标系转换
    // 将车体坐标系下的角速度叉乘矩阵转换到雷达坐标系
    Eigen::Matrix3d omega_radar = radar2novatel_rot.inverse() * omega_skew * radar2novatel_rot; 
    // 4. 遍历目标进行速度修正
    for (auto& obj : frame->objects) {
        // 获取目标在雷达坐标系中的位置
        Eigen::Vector3d pos_radar = obj->center_orig.cast<double>();
        // 计算角速度引起的附加速度: ω × r (雷达坐标系)
        Eigen::Vector3d angular_induced_speed = omega_radar * pos_radar;
        // 雷达检测的目标速度(雷达坐标系)
        Eigen::Vector3d velocity_radar = obj->velocity.cast<double>();
        // 总速度 = 检测速度 + 角速度附加速度
        Eigen::Vector3d total_velocity_radar = velocity_radar + angular_induced_speed;
        // 转换到世界坐标系
        Eigen::Vector3d velocity_world = radar2world_rotate * total_velocity_radar;
        // 叠加车辆线速度
        velocity_world += linear_speed_world;
        // 更新目标速度
        obj->velocity = velocity_world.cast<float>();
        Eigen::Vector4d coor_in_radar(obj->center(0), obj->center(1), obj->center(2), 1.0);
        Eigen::Vector4d coor_in_world = radar2world * coor_in_radar; 
        obj->center = coor_in_world.head<3>();
        obj->anchor_point = obj->center;

  • 写回答

5条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-07-22 17:00
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 毫米波雷达感知速度异常,涉及到大陆ARS408毫米波雷达的Object模式设置及相关参数输入。
      - 输入的自车横摆角速度yaw_rate和自车线速度speed可能存在不准确或设置不当的情况。
      - 雷达本身的校准、环境因素等也可能影响速度和目标运动状态的检测。
    2. 解决方案:
      - 检查输入参数准确性
      • 确保自车横摆角速度yaw_rate和自车线速度speed的获取准确。可以通过车辆的其他传感器(如轮速传感器、IMU等)交叉验证。例如,在一些车辆数据采集系统中,可以读取多个传感器的数据进行对比分析。
      • 检查数据传输过程是否有丢失或错误。如果是通过CAN总线等方式传输数据,要确保CAN协议的配置正确,数据帧无损坏。
      • 雷达校准
      • 按照大陆ARS408毫米波雷达手册进行精确校准。包括距离校准、角度校准等。
      • 距离校准示例代码(假设使用Python和相关雷达库):
    import radar_library
    
    # 初始化雷达
    radar = radar_library.init_radar()
    
    # 进行距离校准
    calibration_distance = radar.calibrate_distance()
    if calibration_distance:
        print("Distance calibration successful")
    else:
        print("Distance calibration failed")
    
     - 角度校准类似,根据具体雷达库的函数进行操作。
    
    • 环境因素考虑
      • 检查雷达安装位置是否有遮挡,确保雷达视野清晰。
      • 考虑环境中的干扰因素,如强电磁干扰、多径效应等。如果存在电磁干扰,可以采取屏蔽措施;对于多径效应,可以通过优化雷达的安装角度或使用一些信号处理算法来减轻影响。
    • 检查雷达配置参数
      • 再次确认Object模式下的其他相关配置参数是否正确设置,如检测范围、分辨率等。不同的应用场景可能需要调整这些参数。例如,如果检测远距离目标较多,可以适当增大检测范围。
        3. 不同方案优缺点:
    • 检查输入参数准确性
      • 优点:简单直接,能够快速定位是否是输入数据的问题。
      • 缺点:依赖其他传感器,且可能需要对车辆数据采集系统有一定了解和调试能力。
    • 雷达校准
      • 优点:从根本上解决雷达本身的精度问题,提高检测准确性。
      • 缺点:操作相对复杂,需要严格按照手册进行,且可能需要一些专业设备辅助校准。
    • 环境因素考虑
      • 优点:容易实施,能快速排除一些明显的外部干扰因素。
      • 缺点:环境因素复杂多样,难以全面考虑和解决所有可能的问题。
    • 检查雷达配置参数
      • 优点:针对性强,能直接调整与目标检测相关的参数。
      • 缺点:可能需要多次尝试不同参数组合,调试过程较繁琐。
        4. 总结:
        毫米波雷达感知速度异常需要综合考虑多个方面。首先要确保输入参数准确,然后进行雷达校准,同时注意环境因素影响,最后检查配置参数。通过这些步骤逐步排查和解决问题,以提高毫米波雷达对目标速度和运动状态检测的准确性。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月22日