之前我们尝试了使用Unity的MapToolBox插件来绘制VectorMap地图,并在Autoware.ai版本中正常用于导航。由于Autoware.universe版本里有不少不错的能力,但是它只支持Lanelet2地图,另外MapToolBox插件缺乏红绿灯等交通标识的支持,因此本文尝试使用TIER IV绘制Lanelet2的高精地图。
一、概述
1. Lanelet2简介
Lanelet2默认的格式为XML形式的OSM地图格式,可以使用OSM地图编辑器进行编辑和可视化。Lanelet2假定地图中的所有元素均能投射到平面,不过元素的高度信息也会被保存,以避免将立交桥处理成十字路口的情况。当加载地图的时候,为了方便地图的使用,会采用通用莫卡托投射(UTM,Universal Transverse Mercator)将地图投射到笛卡尔坐标系。
Lanelet2高精度地图架构可以划分为3层:
- 物理层(physical layer):可以被观测到的要素为地图的物理层,诸如路标、红绿灯、交通标志、防撞栏等等。其他的所有地图元素,比如车道(lane),是这些物理元素的一种抽象表示。
- 关联层(relational layer):交通规则是规则源(例如交通信号灯)与其所应用的车道之间的关联。根据这些物理元素我们可以追踪这些关联信息,我们称这些元素为地图的关联层。
- 拓扑层(topological layer):然而,并非地图的所有元素都可以与物理层相关联,因为道路交通中往往会包含隐含的规则,比如说在路口内,车道线和车道边缘并没有画出来,但是它们是存在的,HAD map必须包含这些隐含的元素以保证路网拓扑的连通性,这些元素都是我们的行为“常识”引入的,不和实际的可观测元素关联,即拓扑层。
2. Lanelet2基础元素
Lanelet2地图主要包含6类基元:
- Points:点
- Linestrings: 由点前后连接构成的折线序列
- Polygons:多边形
- Lanelets:车道的原子单元,或者说对车道的最小划分
- Areas:区域,类似与lanelet,但是它一般用于描述建筑、停车区等独立区域
- Regulatory elements:控制元素,能产生交通规则的元素,如信号灯、限速牌等
前三类为物理层,其余为关联层,每一个元素都有自己唯一的ID。
3. Lanelet2项目各个模块
Lanelet2论文的另外一个工作就是基于以上设计理念和基本要素开源了一套C++编写的地图框架,lanelet2项目依靠catkin编译,所以每个模块都是以ros package的形式进行管理,各个模块内容如下:
- lanelet2:基础模块,没有具体实现
- lanelet2_core:实现了基元、地理计算等核心库
- lanelet2_io:lanelet地图的IO库
- lanelet2_traffic_rules:提供地图交通规则的支持
- lanelet2_projection:提供WGS84坐标系到指定坐标系下的投影的实现
- lanelet2_routing:提供基于lanelet地图的routing功能
- lanelet2_maps:lanelet2官方提供的示例地图
- lanelet2_python:lanelet2的python接口
- lanelet2_validation:验证Lanelet2地图
- lanelet2_examples:教程和示例
二、环境准备
1. lanelet2库编译安装
建议在ubuntu18 ros1或ubuntu22 ros2下的autoware环境下运行lanelet2。
# depend
sudo apt-get install ros-$ROS_DISTRO-rospack ros-$ROS_DISTRO-catkin ros-$ROS_DISTRO-mrt-cmake-modules ros-$ROS_DISTRO-unique-id
sudo apt-get install libboost-dev libeigen3-dev libgeographic-dev libpugixml-dev libpython3-dev libboost-python-dev python3-catkin-tools
# install
sudo apt-get install ros-$ROS_DISTRO-lanelet2-core ros-$ROS_DISTRO-lanelet2-validation ros-$ROS_DISTRO-lanelet2-io ros-$ROS_DISTRO-lanelet2-maps ros-$ROS_DISTRO-lanelet2-projection ros-$ROS_DISTRO-lanelet2-routing ros-$ROS_DISTRO-lanelet2-traffic-rules
# build
mkdir ~/catkin_lanelet2 && cd ~/catkin_lanelet2 && mkdir src
catkin init
# build in release mode (or whatever you prefer)
catkin config --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo
cd src
git clone git@github.com:yanjingang/ad_with_lanelet2.git
cd ..
catkin build
2. 仿真测试
cd ~/catkin_lanelet2
source devel/setup.bash
roslaunch src/ad_with_lanelet2/run_map_simulator.launch
run_map_simulator.launch内容如下,一共会启动4个ros node:
- planning仿真节点:来自Autoware的简单planning仿真
- map loader:加载Autoware扩展版lanelet2地图,发送用于可视化的Rviz marker,以ros msg的形式发送map
- mission planning模块:来自Autoware的任务规划模块,在本例中主要使用了Routing路线生成
- Rviz:启动Rviz并使用预先设置的配置参数
注:该样例地图为Tier 4公司(Autoware的主要维护者)开源的地图,在日本,所以是靠左行驶,routing的时候需要按照靠左行驶的规则设定起终点。
三、地图绘制
1. 注册账号
Vector map builder是Autoware官方提供的一个在线lanelet2地图绘制工具,地址为:https://tools.tier4.jp/feature/vector_map_builder_ll2/,第一次使用需要先注册账号。
2. 加载点云PCD
点击File – Import PCD导入点云。点云比较大时,建议降采样设置为1.0,否则会长时间无法加载成功。
鼠标右键拖动点云,左键旋转点云,滚轮放大缩小点云,左上角可以切换3D视角。
3. 创建Lanelet2矢量地图
创建Lanelet2新地图需要输入MGRS(横轴莫卡托投影UTM坐标系网格),查询地理位置对应的MGRS网站:https://mgrs-mapper.com/app。
北京北部基本是50T,南部为50S:
具体主要分布在(50T,MK),(50S,MK),(50S,MJ):
如果是局部坐标系(没有绝对坐标),可以填(31N,AA),即经纬度(0,0)。
我这里根据西北旺位置填写的(50T,MK)。
4. 绘制车道
4.1 使用Linestring绘制车道
打开Linestring,点选车道线边缘绘制车道线,绘制完一侧之后关闭Linestring,并点击地图空白处(取消原Linestring的选装中台)完成绘制,同样的方法绘制另一侧车道线边缘。
绘制完一条车道的两条车道线之后,按住shift键,鼠标选择两条车道线,点击右上角Action中的Add Lanelet,生成Lanelet车道。
绘制弯道的时候比较糙,实际绘制的时候点可以给密集一点,而且不能太窄,否则后面Autoware自动驾驶时无法转弯(Drivable Area)
4.2 复制Lane车道
画完一条车道之后,可以选中然后打开工具栏的Copy Lanelet按钮,然后点击与旁边车道共用的边,即可自动生成(与当前车道一样)旁边车道,生成后再手动微调(选中端点拖动可以改变形状,坐标轴是按照坐标方向移动,选中方块可以任意方向移动)
4.3 使用Lane绘制车道
4.4 车道属性与编辑工具
右上角Action工具可以生成中心线,掉转方向,聚焦,伸直和改变宽度。
- Change Lanelet Width:修改道路宽度,这个比改linestring要方便很多。
- Join Lanelets:连接两条Lane。如果Jone后路线关系出现混乱,通常为两条Lane方向不一致,可通过Reverse Direction修改一致后再Join连接。
- Reverse Direction:对Lanelet行驶方向进行调整,Lanelet标红为报错,绿色为正确。标红的原因是拓扑关系不正确(Next Lanelet is empty),改变方向使拓扑关系正确,会变成绿色。
- Change to dashed:修改Linestring为可变车道(虚线),这里不同车道间必须共用一条可变车道,不能画两条线(在使用Lane画车道时需要注意,建议画一条lane后,通过点击一条边copy lanelet来绘制相邻车道)。
通过Reverse Direction+Join Lanelets连接两条Lane:
选中Lanelet在右侧属性表可以编辑属性,比如车道最大限速,车道转弯方向(左转、直行、右转),一定要编辑,否则后面Universe无法获得车道信息。如下图把turn direction修改为right,限速10:
5. 绘制路沿
使用linestring绘制路沿边线,然后在右侧属性表的type中选择road_border即可:
6. 绘制停止线和交通灯
选中要绘制红绿灯的Lane车道,再打开上方TrafficLight交通灯工具,然后在等红绿灯的位置点击,即可在点击位置生成停车线,并在对面生成红绿灯(注意车道方向),生成之后可以调整停车线以及红绿灯位置(按住shift可以划定区域多选):
如果要单独绘制停止线,可以选中要绘制停止线的车道,打开停止线工具,点击停止线位置即可生成。
7. 绘制人性横道
选中Lane车道,然后点击Abstraction菜单下的Crosswalk,点击人行道两端自动生成人行道,选中人行道,在右侧的participants属性下填写pedestrian:
8. 绘制停车场以及停车位
选中车道,打开上方的NoStoppingArea,绘制Area,调整大小,然后在属性表中修改属性为parking_lot
绘制一条Linestring,然后选中在属性表中修改type为parking_space,添加属性width,值为3,即绘制了一个停车位,然后可以直接复制几条
9. 保存地图
点击File – Export Lanelet2Maps导出osm地图文件。
四、地图验证
1. 地图配置
cd ~/autoware_map/park-map
vim map_projector_info.yaml
projector_type: MGRS
vertical_datum: WGS84
mgrs_grid: 50TMK
vim map_config.yaml
/**:
ros__parameters:
map_origin:
latitude: 40.0485731350446
longitude: 116.26018734007
elevation: 37.6409964934858
roll: 0.0
pitch: 0.0
yaw: 0.0
ll
lanelet2_map.osm
pointcloud_map.pcd
map_projector_info.yaml
map_config.yaml
2. 仿真
参考Autoware—Universe初探_2.启动Autoware仿真
yan 25.1.1
参考:
Autoware.universe部署02:高精Lanelet2地图的绘制
【教程】【Autoware】【Lanelet2】利用Vector Map Buider绘制Lanelet2高精度地图
Autoware—Universe初探_2.启动Autoware仿真