基于Apollo激光雷达点云数据的车道线绘制实践
一、背景及方案
1.1 背景
高精度地图(High-Definition Map)是自动驾驶系统中的关键基础设施,它提供了厘米级的道路信息,包括车道线、交通标志等。然而,Apollo园区版高精地图生成功能按区域收费。
1.2 方案概述
本文尝试替代Apollo平台的方案,通过激光雷达点云数据生成基础地图并绘制车道线,核心思路如下:
- 数据采集:利用车载激光雷达获取环境点云数据
- 坐标转换:将局部坐标系下的点云转换为全局坐标系
- 地图生成:从点云数据生成底图
- 车道标注:在底图上手动或自动绘制车道线
- 坐标回转:将绘制的车道线坐标转换回标准地理坐标系
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
输出
浙公网安备 33010602011771号