从Apollo record文件中提取坐标信息绘制地图轨迹
一、背景
自动驾驶技术的发展离不开大量真实道路数据的收集和分析。百度Apollo平台使用record文件格式记录车辆在实际道路测试中的各种传感器数据,包括定位信息、摄像头图像、激光雷达点云等。这些记录文件就像汽车的"黑匣子",保存了车辆运行过程中的关键信息。
为什么我们需要提取轨迹信息呢?绘制车辆轨迹可以帮助我们:
- 可视化车辆行驶路径,直观了解测试路线
- 分析定位系统的精度,验证定位算法效果
- 复现测试场景,用于调试和优化
- 创建高精地图,为自动驾驶系统提供参考
本文将详细介绍如何从Apollo record文件中提取车辆的定位坐标信息,并绘制到地图上,让普通读者也能轻松掌握这项实用技能。
二、操作步骤
2.1 下载record文件并解压
首先我们需要获取Apollo平台提供的示例数据。百度Apollo开放平台提供了丰富的测试数据集,我们可以直接下载使用:
# 下载RGB传感器数据记录文件
https://apollo-system.bj.bcebos.com/dataset/6.0_edu/sensor_rgb.tar.xz
# 解压文件
tar -xvf sensor_rgb.tar.xz
为什么需要这一步?
record文件是Apollo系统的专有数据格式,包含了车辆在测试过程中收集的所有传感器信息。下载并解压后,我们就获得了绘制轨迹所需的原始数据。
2.2 查看record文件信息
在提取数据前,我们需要了解record文件包含哪些信息:
cyber_recorder info resources/records/bev_test.record
执行后输出:
record_file: resources/records/bev_test.record
version: 1.0
duration: 19.221952 Seconds
begin_time: 2018-07-24-11:28:47
end_time: 2018-07-24-11:29:06
size: 5946901361 Bytes (5.538484 GB)
is_complete: true
message_number: 7626
channel_number: 9
channel_info:
/apollo/sensor/camera/CAM_FRONT_LEFT/image 224 messages: apollo.drivers.Image
/apollo/localization/pose 2963 messages: apollo.localization.LocalizationEstimate
/tf 2963 messages: apollo.transform.TransformStampeds
/apollo/sensor/camera/CAM_FRONT/image 224 messages: apollo.drivers.Image
/apollo/sensor/camera/CAM_FRONT_RIGHT/image 217 messages: apollo.drivers.Image
/apollo/sensor/camera/CAM_BACK_RIGHT/image 218 messages: apollo.drivers.Image
/apollo/sensor/camera/CAM_BACK/image 216 messages: apollo.drivers.Image
/apollo/sensor/camera/CAM_BACK_LEFT/image 219 messages: apollo.drivers.Image
/apollo/sensor/LIDAR_TOP/compensator/PointCloud2 382 messages: apollo.drivers.PointCloud
关键信息解析:
/apollo/localization/pose
通道包含了2963条定位信息- 每条定位信息使用
apollo.localization.LocalizationEstimate
格式- 定位频率约为150Hz(2963条/19.2秒)
为什么需要这一步?
了解record文件的结构可以帮助我们确定哪些通道包含所需的位置信息。在这个例子中,我们将使用/apollo/localization/pose
通道的数据来提取车辆位置。
2.3 查询Sunnyvale的经纬度
Apollo的示例数据通常采集于美国加州Sunnyvale地区。为了正确转换坐标,我们需要知道该地区的经纬度:
为什么需要这一步?
Apollo系统使用UTM坐标系统(一种平面坐标系统),而地图绘制需要WGS84经纬度坐标(全球通用的地理坐标系统)。通过知道测试地点的经度,我们可以计算出正确的UTM带号,这是坐标转换的关键参数。
2.4 从record中提取position绘制地图轨迹
现在进入核心环节:编写Python脚本提取位置信息并绘制轨迹:
cat > extract_pos_plot_map_trajectory.py <<-'EOF'
import cv2
import sys
import sys
sys.path.append("/apollo/bazel-bin")
import numpy as np
from cyber.python.cyber_py3 import record
from modules.common_msgs.localization_msgs.localization_pb2 import LocalizationEstimate
from pyproj import Transformer
import folium
import webbrowser
from pyproj import Proj, transform
def longitude_to_utm_zone(longitude):
"""
根据经度计算UTM带号
:param longitude: 经度,范围 -180 至 180 (单位:度)
:return: UTM带号,范围1~60
"""
if not -180 <= longitude <= 180:
raise ValueError("经度必须在-180到180之间")
zone = int((longitude + 180) / 6) + 1
if zone > 60:
zone = 60 # 保证最大不超过60
return zone
def utm_to_wgs84