一、背景及方案

1.1 背景

高精度地图(High-Definition Map)是自动驾驶系统中的关键基础设施,它提供了厘米级的道路信息,包括车道线、交通标志等。然而,Apollo园区版高精地图生成功能按区域收费。

1.2 方案概述

本文尝试替代Apollo平台的方案,通过激光雷达点云数据生成基础地图并绘制车道线,核心思路如下:

  1. 数据采集:利用车载激光雷达获取环境点云数据
  2. 坐标转换:将局部坐标系下的点云转换为全局坐标系
  3. 地图生成:从点云数据生成底图
  4. 车道标注:在底图上手动或自动绘制车道线
  5. 坐标回转:将绘制的车道线坐标转换回标准地理坐标系

1.3 局限

1.本文主要验证数据换转是否正确,其它配套模块均未实现(如生成apollo hdmap格式的地图,道路元素绘制工具)

二、相关截图

1、生成的底图

请添加图片描述

2、底图上的坐标点

请添加图片描述

3、在地图上绘制

请添加图片描述

三、操作步骤

1、进入Apollo开发环境

cd /apollo/workspace/apollo-park-generic/
aem enter

2、创建工作目录

mkdir /apollo_workspace/temp
cd /apollo_workspace/temp

3、设置环境变量

export PROFILE_NAME=<车辆的profile名>
  export RECORD_PATH=<record路径>

变量说明:

  • PROFILE_NAME:指定使用的车辆配置方案
  • RECORD_PATH:指定包含传感器数据的record文件

4、配置车辆参数

cd /apollo_workspace
aem profile use $PROFILE_NAME
cd -

5、启动核心服务

cd /apollo_workspace
bash kill_all.sh
export GLOG_minloglevel=1
export GLOG_v=1
export GLOG_alsologtostderr=1
aem bootstrap start --plus
# 启动坐标变换服务
mainboard -d /apollo/modules/transform/dag/static_transform.dag

6、播放传感器数据

cd /apollo_workspace
cyber_recorder play -f $RECORD_PATH -l -c /tf

关键参数说明:

  • -l:循环播放
  • -c /tf:只播放tf话题,减少资源占用

7、坐标系分析

7.1、TF树可视化

TF树显示了所有坐标系间的层级关系,这对于理解传感器布局至关重要。

cd /apollo_workspace/temp
cat > 0_print_tf_tree.py << 'EOF'
import sys
sys.path.append("/opt/apollo//neo/python/cyber/python")
sys.path.append("/opt/apollo/neo/python")
from cyber_py3 import cyber
from modules.common_msgs.transform_msgs import transform_pb2
import time
tf_static_received = False
tf_received = False
links = set()
def tf_static_callback(msg):
global tf_static_received, links
tf_static_received = True
for transform in msg.transforms:
link = f"{transform.child_frame_id}-->{transform.header.frame_id}"
links.add(link)
def tf_callback(msg):
global tf_received, links
tf_received = True
for transform in msg.transforms:
link = f"{transform.child_frame_id}-->{transform.header.frame_id}"
links.add(link)
def print_mermaid_graph():
print("graph TD")
for link in links:
print(f"    {link}")
def main():
cyber.init()
node = cyber.Node("test")
node.create_reader("/tf_static",transform_pb2.TransformStampeds,tf_static_callback)
node.create_reader("/tf",transform_pb2.TransformStampeds,tf_callback)
while cyber.ok():
if tf_static_received and tf_received:
break
time.sleep(1)
if links:
print_mermaid_graph()
cyber.shutdown()
if __name__ == "__main__":
main()
EOF
python3 0_print_tf_tree.py

输出