首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-26 21:21
  • 3435
  • 11814
blog.csdn.net

文章目录

  • 引言
    • Lanelet基础元素
    • Lanelet2项目各个模块
  • 一、安装Lanelet2项目
    • 1.1 安装依赖
    • 1.2 编译
    • 1.3 在ROS中使用lanelet2地图完成routing
  • 二、Autoware Vector Map Builder绘制高精地图
    • 2.1 创建地图
    • 2.2 绘制车道
      • 2.2.1 Linestring合成
      • 2.2.2 Lanelet工具直接绘制
      • 2.2.3 绘制变道车道
    • 2.3 绘制路沿
    • 2.4 绘制停止线和交通灯
    • 2.5 绘制人行道
    • 2.6 绘制路边停靠车道
    • 2.7 绘制禁停区
    • 2.8 绘制停车场以及停车位
    • 2.9 地图拓扑验证(可以跳过)
    • 2.10 Universe的使用
  • 三、JOSM可视化和编辑Lanelet2地图
    • 3.1 配置Java环境
    • 3.2 配置Lanelet2格式


本文介绍如何绘制Autoware.universe使用的高精地图并验证地图,本系列其他文章:
Autoware.universe部署01:Ubuntu20.04安装Autoware.universe并与Awsim联调
Autoware.universe部署03:与Carla(二进制版)联调
Autoware.universe部署04:universe传感器ROS2驱动

引言

目前行业并没有通用的标准(OpenDrive并不是为自动驾驶设计的),Autoware自动驾驶系统的矢量地图和地图引擎计划使用Lanelet2,本文我们就来了解并且上手一下Lanelet2高精度地图框架。Lanelet2架构可以划分为:

  • lanelet2称可以被观测到的要素为地图的物理层(physical layer) ,诸如路标、红绿灯、交通标志、防撞栏等等,其他的所有地图元素,比如车道(lane),是这些物理元素的一种抽象表示。
  • 同样地,交通规则是规则源(例如交通信号灯)与其所应用的车道之间的关联。根据这些物理元素我们可以追踪这些关联信息,我们称这些元素为地图的关联层(relational layer)。
  • 然而,并非地图的所有元素都可以与物理层相关联,因为道路交通中往往会包含隐含的规则,比如说在路口内,车道线和车道边缘并没有画出来,但是它们是存在的,HAD map必须包含这些隐含的元素以保证路网拓扑的连通性,这些元素都是我们的行为“常识”引入的,不和实际的可观测元素关联,即拓扑层(topological layer)。

创建与Autoware兼容的矢量地图最简单的方法是使用TIER IV公司提供的基于Web的免费工具Vector Map Builder。Vector map builder是Autoware官方提供的一个在线lanelet2地图绘制工具矢量地图生成器,允许您创建车道,并使用点云地图作为参考添加额外的管制元素,如停止标志或交通灯。

对于开源软件选项,MapToolbox是专门为Unity设计的插件,用于为Autoware创建Lanelet2地图。虽然JOSM是另一个可以用来创建Lanelet2地图的开源工具,但是需要注意的是,为了使地图与Autoware兼容,必须进行大量的手工修改。这个过程可能是繁琐和耗时的,因此不建议使用JOSM。

Lanelet2默认的格式为XML形式的OSM地图格式,可以使用OSM地图编辑器进行编辑和可视化。Lanelet2假定地图中的所有元素均能投射到平面,不过元素的高度信息也会被保存,以避免将立交桥处理成十字路口的情况。当加载地图的时候,为了方便地图的使用,会采用通用莫卡托投射(UTM,Universal Transverse Mercator)将地图投射到笛卡尔坐标系。

Lanelet基础元素

Lanelet2地图主要包含6类基元:

  • Points:点
  • Linestrings: 由点前后连接构成的折线序列
  • Polygons:多边形
  • Lanelets:车道的原子单元,或者说对车道的最小划分
  • Areas:区域,类似与lanelet,但是它一般用于描述建筑、停车区等独立区域
  • Regulatory elements:控制元素,能产生交通规则的元素,如信号灯、限速牌等

前三类为物理层,其余为关联层,每一个元素都有自己唯一的ID

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:教程和示例

一、安装Lanelet2项目

注意:如果不需要额外的地图验证工具,可以直接到下一章节开始学习绘制Lanelet2地图

1.1 安装依赖

环境是Ubuntu18.04,依赖于ROS melodic

sudo apt-get install ros-melodic-rospack ros-melodic-catkin ros-melodic-mrt-cmake-modules ros-melodic-unique-id
sudo apt-get install libboost-dev libeigen3-dev libgeographic-dev libpugixml-dev libpython-dev libboost-python-dev python-catkin-tools
  • 1
  • 2

1.2 编译

mkdir catkin_ws_lanelet2_mapping && cd catkin_ws_lanelet2_mapping && mkdir src
catkin init
# build in release mode (or whatever you prefer)
catkin config --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo 
cd src
git clone https://github.com/AbangLZU/ad_with_lanelet2.git
cd ..
catkin build
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 编译报错:
error: ‘::memset’ has not been declared
  • 1

在这里插入图片描述
可能是boost版本的问题。memset是C 库函数,void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。如果是C++编译,需要调用的是cstring。报错是因为在C++环境下使用了memset却没有导入cstring,所以解决办法很简单,修改boost头文件

sudo gedit /usr/local/include/boost/geometry/algorithms/detail/relate/result.hpp
  • 1

打开报错的源码,添加以下头文件:

#include 
  • 1
  • 报错:
    在这里插入图片描述
/home/autoware/catkin_ws_lanelet2_mapping/devel/.private/lanelet2_extension/lib/liblanelet2_extension_lib.so: 
    undefined reference to `lanelet::routing::RoutingCostTravelTime::travelTime(lanelet::traffic_rules::TrafficRules const&, lanelet::ConstLanelet const&) const'
  • 1
  • 2

这是由于我们之前安装Autoware1.15时安装了与当前项目同名的ROS包(lanelets一系列),导致现在找到了对应的老版本的ROS包,把它们卸载就行了:

sudo apt-get remove ros-melodic-lanelet2-core ros-melodic-lanelet2-validation ros-melodic-lanelet2-io ros-melodic-lanelet2-maps ros-melodic-lanelet2-projection ros-melodic-lanelet2-routing ros-melodic-lanelet2-traffic-rules
  • 1

编译成功:
在这里插入图片描述

1.3 在ROS中使用lanelet2地图完成routing

在你的ros workspace中,运行本项目:

cd your_ros_workspace
source devel/setup.bash
roslaunch src/ad_with_lanelet2/run_map_simulator.launch
  • 1
  • 2
  • 3

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并使用预先设置的配置参数

如图,map被加载与Rviz中:
在这里插入图片描述
点击Rviz中的2D Pose Estimate在图中设置当前位置,仿真节点根据这个init pose发一个base_link 到world坐标系的tf,设置完成后如下图所示:
在这里插入图片描述

接着使用Rviz中的2D Nav Goal设置routing的终点,如图中所示,mission planner会根据设置的目标位姿动态生成routing路线(图中深绿色路线):
在这里插入图片描述

注:该样例地图为Tier 4公司(Autoware的主要维护者)开源的地图,在日本,所以是靠左行驶,routing的时候需要按照靠左行驶的规则设定起终点。

二、Autoware Vector Map Builder绘制高精地图

Vector map builder需要多次练习熟练理解才能绘制出正确且美观的地图
Vector map builder是Autoware官方提供的一个在线lanelet2地图绘制工具,地址为:http://iyenn.com/index/link?url=https://tools.tier4.jp/feature/vector_map_builder_ll2/,需要注册账号:
在这里插入图片描述
注册后选择v1.13~,地图数据格式为.osm
在这里插入图片描述
在这里插入图片描述

2.1 创建地图

(1)进入后选择右上角文件导入PCD点云地图
在这里插入图片描述
这里导入官方的点云数据
在这里插入图片描述
鼠标右键拖动点云,左键旋转点云,滚轮放大缩小点云,左上角可以切换3D视角
(2)创建矢量地图
创建Lanelet2新地图需要输入MGRS(横轴莫卡托投影UTM坐标系网格),查询地理位置对应的MGRS网站:http://iyenn.com/index/link?url=https://mgrs-mapper.com/app。如果是局部坐标系(没有绝对坐标),可以填(31N,AA),即经纬度(0,0)
在这里插入图片描述

2.2 绘制车道

有两种方法,一种是先绘制Linestring,再合成Lanelet,另一种方法是直接利用工具绘制Lanelet

2.2.1 Linestring合成

(1)选择Lanelet2Map工具,开始绘制
打开Linestring,点选车道线边缘绘制车道线,绘制完一侧之后关闭Linestring完成绘制,同样的方法绘制另一侧车道线边缘
在这里插入图片描述
绘制完一条车道的两条车道线之后,按住shift键,鼠标选择两条车道线,点击右上角Action中的Add Lanelet,生成Lanelet元素(生成后界面如果无法控制,按一下shift有奇效,如果不能旋转就点击左上角rotate on)
在这里插入图片描述
在这里插入图片描述
选中端点(出现坐标系,选不中试一下shift按键),再打开Linestring,按照上述方法可以绘制前继与后继车道的Linestring,再合成前继与后继车道Lanelet(车道方向可以根据Next Lanelet属性判断),我在绘制弯道的时候比较糙,实际绘制的时候点可以给密集一点,而且不能太窄,否则后面Autoware自动驾驶时无法转弯(Drivable Area)
在这里插入图片描述
使用Reverse Direction功能对Lanelet方向进行调整,Lanelet标红为报错,绿色为正确,标红的原因是拓扑关系不正确(Next Lanelet is empty),改变方向使拓扑关系正确,会变成绿色见右下角:
在这里插入图片描述
在这里插入图片描述
选中Lanelet在右侧属性表可以编辑属性,比如:车道最大限速,车道转弯方向(左转、直行、右转),一定要编辑,否则后面Universe无法获得车道信息
右上角Action工具可以生成中心线,掉转方向,聚焦,伸直和改变宽度
在这里插入图片描述
画完一条车道之后,可以选中然后打开工具栏的Copy Lanelet按钮,然后点击与旁边车道共用的边,即可自动生成(与当前车道一样)旁边车道,生成后再手动微调(选中端点拖动可以改变形状,坐标轴是按照坐标方向移动,选中方块可以任意方向移动)
在这里插入图片描述同样的方法绘制后继车道,出现车道链接点断开的情况:
在这里插入图片描述
这时可以按住shift,选择前后两条车道线,点击join Lanelet,使其相连,之后再调整形状(注意要先把方向换对,否则就乱了):
在这里插入图片描述

2.2.2 Lanelet工具直接绘制

使用Lanelet工具直接绘制车道线,打开Lanelet工具,然后鼠标直接根据车道中心线绘制车道线,再使用Join Lanelet连接车道,但宽度不对需要再微调,再用copy绘制相邻车道:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述填写属性,上方Problem报错,点开看到车道限速超过了最大速度,将其最大速度增加就可解决
在这里插入图片描述

2.2.3 绘制变道车道

多向变道:在有节点的Lanelet端(从这里可以看出,尽量不要绘制一条到底的长直车道,尤其是路口一定要断,事实上,绘制太长也会导致规划的时候不够精确)绘制新的Lanelet,然后使用join Lanelet连接车道,最后微调节点位置即可:
在这里插入图片描述
同向变道:需要设置Linestring可变道,选中同向车道之间的Linestring,线型选择虚线(dashed),添加属性lane_change,值为yes,添加属性width,值为0.0
在这里插入图片描述

2.3 绘制路沿

打开Linestring,绘制路沿边线,然后在右侧属性表的type中选择road_boder即可:
在这里插入图片描述

2.4 绘制停止线和交通灯

选中要绘制停止线的车道,打开停止线工具,点击停止线位置即可生成
在这里插入图片描述
选中要绘制红绿灯的车道,再打开交通灯工具,然后在等红绿灯的位置点击,即可生成停车线,并在对面生成红绿灯(注意车道方向),生成之后可以调整停车线以及红绿灯位置(按住shift可以划定区域多选)
在这里插入图片描述在这里插入图片描述

2.5 绘制人行道

选中车道,然后打开Abstraction下的Crosswalk,点击人行道两端自动生成人行道,选中人行道,在右侧的participants属性下填写pedestrian:
在这里插入图片描述在这里插入图片描述

2.6 绘制路边停靠车道

选中路边停靠停靠车道对应的正常车道,然后点击右上角CopyLanelet(先画一条lanestring再与以有车道边合成也行,即必须与车道有一条公共边),再点击车道边线,即可自动生成并列车道,再把生成的车道的subtype属性修改为road_shoulder,即绘制了停靠车道(调整形状可以)
在这里插入图片描述
在这里插入图片描述

2.7 绘制禁停区

如下图在某建筑门前绘制禁停区,首先选中车道,然后打开上方东的NoParkingArea,即可绘制禁停区域,选中角点调整形状:
在这里插入图片描述
在这里插入图片描述

2.8 绘制停车场以及停车位

选中车道,打开上方的NoParkingArea,绘制Area,调整大小,然后在属性表中修改属性为parking_lot
在这里插入图片描述
绘制一条Linestring,然后选中在属性表中修改type为parking_space,添加属性width,值为3,即绘制了一个停车位,然后可以直接复制几条
在这里插入图片描述在这里插入图片描述

2.9 地图拓扑验证(可以跳过)

绘制完成之后,确定右上角Problem项没有报错,即可点击File导出Lanelet2地图
然后使用第二节的功能包验证,将导出的地图复制到catkin_ws_lanelet2_mapping/src/ad_with_lanelet2/map/map_loader/data路径下,修改文件名称为lanelet2_map.osm
然后运行规划节点:

source devel/setup.bash
roslaunch src/ad_with_lanelet2/run_map_simulator.launch
  • 1
  • 2

即可加载自己绘制的地图,按照第二节的方法可以验证地图,如果有问题方便及时修改
在这里插入图片描述
路径规划也没问题:
在这里插入图片描述

2.10 Universe的使用

将生成的地图(命名为lanelet2_map.osm)与点云地图(命名为pointcloud_map.pcd)放在一个新建文件夹下,并创建一个yaml文件(map_config.yaml),填入以下内容:

/**:
  ros__parameters:
    map_origin:
      latitude: 0.0
      longitude: 0.0
      elevation: 0.0
      roll: 0.0
      pitch: 0.0
      yaw: 0.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

运行Autoware.universe,路径换成你自己的:

source install/setup.bash
ros2 launch autoware_launch planning_simulator.launch.xml map_path:=${You_map_path} vehicle_model:=sample_vehicle sensor_model:=sample_sensor_kit
  • 1
  • 2

可以planning
在这里插入图片描述
加了一条到停车场的路线(需要有经过停车场的车道,才能驶入停车场,并准备入库),倒车入库也是没有问题的,其他地图元素的测试参考Autoware.universe部署01:Ubuntu20.04安装Autoware.universe并与Awsim联调
在这里插入图片描述

三、JOSM可视化和编辑Lanelet2地图

因为采用了OSM的地图格式定义,Lanelet2地图可以很方便地使用OSM的工具链进行查看和编辑,下面我们使用JOSM工具对项目内的lanelet2_map.osm地图进行可视化和编辑(不建议,但是JOSM事实上功能更多,只是不容易)。JOSM是一个Java实现的对OSM进行编辑的工具,因其为Java程序,所以可以跨平台使用,官网下载最新版本的JOSM,本文采用的是jar包的形式运行,jar下载链接:https://josm.openstreetmap.de/josm-tested.jar

3.1 配置Java环境

参照教程:https://josm.openstreetmap.de/wiki/Download#Java
编辑源文件列表/etc/apt/sources.list.d/josm.list:

sudo  /etc/apt/sources.list.d/josm.list
  • 1

根据你的ubuntu版本选择填入下列源:

# 22.04
deb [signed-by=/usr/local/share/keyrings/josm-apt.gpg] https://josm.openstreetmap.de/apt jammy universe
# 20.04
deb [signed-by=/usr/local/share/keyrings/josm-apt.gpg] https://josm.openstreetmap.de/apt focal universe
# 18.04
deb [signed-by=/usr/local/share/keyrings/josm-apt.gpg] https://josm.openstreetmap.de/apt bionic universe
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下载公钥:

# Create the directory for manually downloaded keys if it was not already created
sudo mkdir -p /usr/local/share/keyrings
# Download the key
wget -q https://josm.openstreetmap.de/josm-apt.key -O- | sudo gpg --dearmor -o /usr/local/share/keyrings/josm-apt.gpg
  • 1
  • 2
  • 3
  • 4

然后更新源:

# You may need to install ssl support for apt in advance:
sudo apt-get install apt-transport-https
# Refresh sources
sudo apt-get update
  • 1
  • 2
  • 3
  • 4

然后安装:

# You can skip this first line if these packages were not installed before.
sudo apt-get remove josm josm-plugins

# 测试版(稳定版)
sudo apt-get install josm
# 最新版
sudo apt-get install josm-latest
通过java --version检查系统中安装的Java,我的环境如下(我装的版本可能有点低):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过java --version检查系统中安装的Java,我的环境如下(我装的版本可能有点低):
在这里插入图片描述
下载好josm-tested.jar包后,在同目录下使用以下命令运行JOSM:

java -jar josm-tested.jar
  • 1

在这里插入图片描述
报网络链接错误错不用管(科学上网之后就不会再报了),在JOSM中选择presets->preset preferences可以改变语言

3.2 配置Lanelet2格式

在JOSM中添加lanelet2的地图样式和预设组合标签,在JOSM中选择预设组合->预设首选项->地图样式->+,分别将ROS项目中lanelet2_maps/josm/目录下的lanelets.mapcss和lines.mapcss添加为地图样式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在添加预设组合标签下,添加lanelet2_maps/josm/目录下的laneletpresets.xml文件:
在这里插入图片描述
在JOSM中,选择文件->打开,选择项目中map/map_loader/data/目录下的lanelet2_map.osm文件,得到如下地图:
在这里插入图片描述
可在JOSM中查看和编辑地图中的各个元素,地图编辑教程可以参考https://learnosm.org/en/josm/josm-tools/。可以在菜单栏的影像中加载(全球)遥感图像作为底图绘制(国内的影像分辨率可能比较低,并且没有测绘资质进行高精地图的绘制可能存在较高的技术壁垒和法规风险):
在这里插入图片描述

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux35048 人正在系统学习中
注:本文转载自blog.csdn.net的ZARD帧心的文章"https://blog.csdn.net/zardforever123/article/details/132528899"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top