Autoware—使用TIER IV绘制Lanelet2高精地图

之前我们尝试了使用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地图文件。

lanelet2_map.zip

四、地图验证

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

 

参考:

TIER IV 的矢量地图生成器工具

Autoware.universe部署02:高精Lanelet2地图的绘制

【教程】【Autoware】【Lanelet2】利用Vector Map Buider绘制Lanelet2高精度地图

Autoware—Universe初探_2.启动Autoware仿真

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。