高清地图转换(xord转apollo的bin文件)

2022-10-20,,,,

目标

将carla中的OpenDrive地图(carla\Unreal\CarlaUE4\Content\Carla\Maps\OpenDrive)转换为Apollo中可识别的地图格式(bin与txt文件)

用到的软件

python的imap_box包、apollov5、unity、 SVL SIMULATOR

安装

Unity

    Download and Install Unity Hub(需要代理)

    Ubuntu: You may need to allow the downloaded AppImage to be run as an executable

    Right-click the AppImage
    Select Properties
    Go to the Permissions tab
    Check Allow executing file as program
    Alternatively, in the terminal run sudo chmod +x UnityHub.AppImage
    Download and Install Unity 2020.3.3f1 from the Unity Download Archive: (需要代理)

SVL SIMULATOR

安装文档地址:https://www.svlsimulator.com/docs/installation-guide/build-instructions/

Installing Git LFS top

Make sure you have git-lfs installed before cloning the Simulator repository.

Instructions for installation are here
Verify installation
In a terminal enter git lfs install
Git LFS initialized. should print out
Building a standalone executable

    Clone simulator project from GitHub (open-source) release branch.

    Open a terminal and navigate to where you want the Simulator to be downloaded to

    If you want the Simulator in your Documents folder, use cd in the terminal so that the input for the terminal is similar to /Documents$
    Open-source user: git clone https://github.com/lgsvl/simulator.git
    Verify download
    Above clone will create a Simulator folder
    Open a File Explorer and navigate to where the Simulator folder is
    Navigate to Simulator/Assets/Materials/EnvironmentMaterials/
    There should be a EnvironmentDamageAlbedo.png in this folder
    Open the image, it should look like the image below
    If the image cannot be opened, Git LFS was not installed before cloning the repository
    Install Git LFS following step 4
    In a terminal, navigate to the Simulator folder so that the terminal is similar to /Simulator$
    git lfs pull
    Check the image again

    Note: Please checkout the "release-*" branches or release tags for stable (ready features) and "master" branch for unstable (preview of work in progress).

    Run Unity Hub

    In the Projects tab, click Add and select the Simulator folder that was created by git clone in Step 5

    In the Projects tab, verify that the Simulator is using Unity Version 2020.3.3f1 from the dropdown

    Double-click the name of the project to launch Unity Editor

    Note: On Ubuntu 18.04, create an empty sample project before adding an existing project as mentioned in step 1.

    Open the Simulator menu from the top toolbar and select Build... to open the build window (shown below with a red outline)

    Select the target OS for the build using the Executable Platform dropdown menu

    Verify Build Simulator is checked for the Simulator to be built

    Select a folder that the simulator will be built in

    (Optional) Check Development Build to create a Development Build that includes debug symbols and enables the Profiler

    Click Build

    Once the build process is complete a simulator executable will be available at the specified location.

imap_box

imap_box包用于读取转换出来的bin文件,导出txt文件,git地址:https://github.com/daohu527/imap

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  imap_box

在windows中安装时要使用powershell命令行安装,否则会报错

使用

将carla地图导出apollo的bin文件

点击上方simulator-> Import HD Map,在弹出的HD Map Import中Import 选择carla地图路径,导入地图(这里以carla\Unreal\CarlaUE4\Content\Carla\Maps\OpenDrive\Town01.xodr为例)

[图片]
单击左边界面中新出现的MapOrigin,在右边出现的设置中,将Origin Easting设置为0,Origin Northing设置为0

鼠标左键按住MapTown01,将其拖拽到MapOrigin上,成为其子节点。拖拽后点击MapTown01,将右边属性中的Rotation->Y设置为0

选择simulator->Build HD Map Mesh, 在弹出的HD Map Mesh Builder中点击Build Mesh

选择simulator->Export HD Map, 在弹出的HD Map Export中选择Apollo 5 HD Map格式,选择路径后点击Export,成功时可以看到左下界面提示(Carla地图1-10中,只有Town03没有导出成功)

使用imap_box包从bin文件导出txt文件

创建新的工程,python环境选择的是python3.9.12(理论上3.6以上都可以).
创建文件convert_bin_to_txt.py文件,内容为

from modules.map.proto import map_pb2

from imap.lib.proto_utils import get_pb_from_bin_file
from imap.lib.proto_utils import write_pb_to_text_file def convert_bin_to_txt(input_file: str):
map = map_pb2.Map()
pb = get_pb_from_bin_file(filename=input_file, pb_value=map)
write_pb_to_text_file(pb, input_file.split('.')[0]) if __name__ == '__main__':
convert_bin_to_txt(r"D:\tmp\base_map.bin")

执行convert_bin_to_txt.py, 查看到D:\tmp下会出现base_map.txt。里面有可读的地图信息

生成sim_map与routing_map

将base_map.bin拷贝到安装了apollov5的容器内,在 /apollo/modules/map/data内创建新的文件夹,并将base_map.bin移动到新创建的文件夹中;然后运行脚本生成文件

# 将文件拷贝到docker容器的/apollo目录下
docker cp base_map.bin apollo_dev_ubuntu:/apollo
# 进入docker容器
/apollo/docker/scripts/dev_into.sh
# 创建文件夹
mkdir /apollo/modules/map/data/town01_example
# 移动文件
mv /apollo/base_map.bin /apollo/modules/map/data/town01_example/
# 执行脚本生成文件
/apollo/scripts/generate_maps.sh /apollo/modules/map/data/town01_example/

最后一步时执行会有两处报错,那是通过xml生成bin和txt的脚本命令,不影响直接用bin生成sim_map与routing_map

ubuntu@in_dev_docker:/apollo$ /apollo/scripts/generate_maps.sh /apollo/modules/map/data/town01_example/
I0906 10:10:26.932503 2935423 topo_creator.cc:32] [routing] Conf file: /apollo/modules/routing/conf/routing_config.pb.txt is loaded.
I0906 10:10:26.941069 2935423 graph_creator.cc:78] [routing] Number of lanes: 124
I0906 10:10:26.942127 2935423 graph_creator.cc:111] [routing] Current lane id: lane_0
.....
.....
I0906 10:10:26.983175 2935423 graph_creator.cc:158] [routing] Txt file is dumped successfully. Path: /apollo/modules/map/data/town01_example//routing_map.txt
I0906 10:10:26.984313 2935423 graph_creator.cc:163] [routing] Bin file is dumped successfully. Path: /apollo/modules/map/data/town01_example//routing_map.bin
I0906 10:10:26.984656 2935423 topo_creator.cc:40] [routing] Create routing topo successfully from /apollo/modules/map/data/town01_example//base_map.bin to /apollo/modules/map/data/town01_example//routing_map.bin
I0906 10:10:27.100512 2935439 sim_map_generator.cc:86] [] Downsampling lane lane_0
I0906 10:10:27.100884 2935439 sim_map_generator.cc:74] [] Lane curve downsampled from 8 points to 2 points
I0906 10:10:27.100904 2935439 sim_map_generator.cc:74] [] Lane curve downsampled from 8 points to 2 points
I0906 10:10:27.100915 2935439 sim_map_generator.cc:74] [] Lane curve downsampled from 8 points to 2 points
.....
.....
I0906 10:10:27.112815 2935439 sim_map_generator.cc:74] [] Lane curve downsampled from 5 points to 2 points.
I0906 10:10:27.164212 2935439 sim_map_generator.cc:122] [] sim_map generated at:/apollo/modules/map/data/town01_example/
# 下面的报错并不影响
E0906 10:10:27.247184 2935455 opendrive_adapter.cc:33] [] fail to load file /apollo/modules/map/data/town01_example//base_map.xml
F0906 10:10:27.247690 2935455 proto_map_generator.cc:39] Check failed: apollo::hdmap::adapter::OpendriveAdapter::LoadData(map_filename, &pb_map) fail to load data from : /apollo/modules/map/data/town01_example//base_map.xml
*** Check failure stack trace: ***
@ 0x7fb3a918aec0 google::LogMessage::Fail()
@ 0x7fb3a918ae07 google::LogMessage::SendToLog()
@ 0x7fb3a918a7de google::LogMessage::Flush()
@ 0x7fb3a918d83b google::LogMessageFatal::~LogMessageFatal()
@ 0x45d1a9 main
@ 0x7fb3a6b09f45 __libc_start_main
@ 0x45cf89 (unknown)
/apollo/scripts/generate_maps.sh: line 8: 2935455 Aborted (core dumped) bazel-bin/modules/map/tools/proto_map_generator --map_dir=$1 --output_dir=$1
E0906 10:10:28.046296 2935471 file.cc:73] [] Failed to open file /apollo/modules/map/data/town01_example//base_map.txt in text mode.
E0906 10:10:28.051890 2935471 file.cc:99] [] Failed to open file /apollo/modules/map/data/town01_example//base_map.txt in binary mode.
F0906 10:10:28.051970 2935471 bin_map_generator.cc:38] Check failed: apollo::cyber::common::GetProtoFromFile(map_filename, &pb_map) fail to load data from : /apollo/modules/map/data/town01_example//base_map.txt
*** Check failure stack trace: ***
@ 0x7f1fed03fec0 google::LogMessage::Fail()
@ 0x7f1fed03fe07 google::LogMessage::SendToLog()
@ 0x7f1fed03f7de google::LogMessage::Flush()
@ 0x7f1fed04283b google::LogMessageFatal::~LogMessageFatal()
@ 0x45bd29 main
@ 0x7f1fea9bef45 __libc_start_main
@ 0x45bb09 (unknown)
/apollo/scripts/generate_maps.sh: line 9: 2935471 Aborted (core dumped) bazel-bin/modules/map/tools/bin_map_generator --map_dir=$1 --output_dir=$1

查看生成的文件

ubuntu@in_dev_docker:/apollo$ ls /apollo/modules/map/data/town01_example/
base_map.bin routing_map.bin routing_map.txt sim_map.bin sim_map.txt

其他

使用SVL SIMULATOR而放弃RoadRunner的原因

在使用SVL SIMULATOR前首先调研的是使用RoadRunner导出地图。使用过程中遇到的主要问题有:

地图中心点的设置问题

在设置SVL SIMULATOR与RoadRunner中都有MapOrigin设置的能力,但是RoadRunner中将MapOrigin设置为0后,导出的文件坐标依然不是以地图中心为原点的坐标系,这样就需要将MapOrigin中的参数设置为负数来抵消坐标系带来的影响,这需要反复试验
红绿灯和停止线的问题

在生成的场景中,能够看到场景中的红绿灯高度不足,停止线缺失的现象,需要手动进行调整
红绿灯id不对应问题

生成的txt文件中可以看出,生成的信号灯的id并不能与carla中的灯的id对应上,这样就无法用carla进行模拟

结论:

RoadRunner可以在自定义场景时使用,如果想将已经完成的地图转换成apollo地图,考虑SVL SIMULATOR更合适一些

高清地图转换(xord转apollo的bin文件)的相关教程结束。

《高清地图转换(xord转apollo的bin文件).doc》

下载本文的Word格式文档,以方便收藏与打印。