本系列博客旨在记录自己在学习百度无人驾驶开源框架Apollo的心得和体会,欢迎大家阅读和点赞,并提出宝贵意见,大家相互学习,如需转载,请注明出处,谢谢!
在上一篇文章Apollo 5.0 源码学习笔记(六) | Apollo 5.0与Apollo 5.5安装及测试中,我们已经基本上了解并实践了如何在自己的电脑上安装、编译并运行Apollo项目了。但还存在一个很现实的问题,那就是假如我们没有和Apollo项目要求一致的试验车,我们如何能够离线测试Apollo各个模块的代码呢?我们又如何能够知道每个模块的性能呢?
Apollo官方提供的离线数据包包含的消息种类和时长都非常有限,我们有没有什么办法自己准备Apollo需要的数据话题,然后对Apollo代码进行测试呢?
答案是肯定的,方法就是使用仿真数据。LGSVL就是一个非常方便的无人驾驶仿真平台。
其能够模拟真实交通环境,能够自定义传感器类型、数量和位置,包括激光雷达(支持128线)、毫米波雷达、摄像头等,并且可以模拟晴天、雨天、雪天、雾天等不同天气状态,可以自定义交通流和交通参与者的行为,可以说是非常的全能,最重要的一点是目前LGSVL支持与Apollo项目联合仿真,即LGSVL仿真平台可以发布Apollo中所需要的消息类型数据,从而可以直接仿真测试Apollo各模块算法的性能。
虽然官方有比较详细的文档指导如何进行Apollo和LGSVL的联合仿真,但在我实际使用过程中,可以说是非常的坎坷,遇到了很多困难,也走了很多弯路,因此这篇博文主要记录自己最终成功的方案以及各种注意事项,供大家参考,也方便自己后面查询。
LGSVL仿真器既可以在Windows下运行,也可以在Linux下运行,官方的意思好像是Windows下支持的更好,所以建议你可以使用Windows版本。并且由于该仿真器占用的GPU比较多,所以强烈建议你使用两台电脑,一台Windows用来跑仿真器,另一台Ubuntu用来跑Apollo,这样能够避免很多问题。
LGSVL仿真器的安装下载网址为:https://www.lgsvlsimulator.com/,如下图所示选择最新版本的安装包。
由于我的Windows电脑性能实在太差,因此我是同一台Ubuntu电脑上运行仿真器和Apollo代码的,我下载的版本是lgsvlsimulator-linux64-2020.03。
启动过程也非常简单,只需要解压后进到安装包文件夹路径,执行./simulator
即可打开一个界面:
然后单击Open Browser,就会在你的浏览器中打开http://localhost:8080/
网址,进入到仿真器配置界面:
在该配置界面中你可以设置需要仿真的场景地图Maps,仿真的车辆Vehicles和最终组合的仿真实例Simulations。首次打开这个界面时这些资源应该都是null或其他字样,表示这些资源还没有下载,需要进行联网自动下载,下载成功之后就会显示Valid。
这里需要注意一下如果你连不上网络或者网络条件不佳下载不了这些资源时,你可以进到这个网站进行手动下载,此时你只需要下载BorregasAve地图和Lincoln MKZ 2017车辆这两个资源即可,下载得到离线文件之后,将其放到一个固定路径,然后安装如下方式进行加载:
将其中的Map URL
路径改为你的本地路径即可。
还是在LGSVL打开的网页上,点击Simulations,然后点击如下的BorregasAve, noninteractive (with Apollo 5.0),然后点击右下角的箭头开始播放,此时你就能在你的仿真器软件上看到仿真界面。
你可以通过键盘的方向键控制仿真环境中的车辆进行移动。
为了能够将Apollo和LGSVL仿真器进行联合仿真,就需要一个桥接的途径,因此直接使用Apollo官方提供的那些Apollo 5.0和Apollo 5.5都是不行的,其中没有和LGSVL仿真器进行连接的操作。因此我们需要使用LGSVL官方提供的Apollo 5.0代码,其实是LGSVL在Apollo 5.0的基础上进行修改得到的版本。
但是,在这一部分我需要特别说明的是在我使用LGSVL提供的lgsvl/apollo-5.0代码进行仿真时,遇到了很多问题,经过一番折腾虽然能够在Dreamview界面上看到本车,在LGSVL界面上使用键盘移动本车,也能够在Dreamview界面上看到车辆运动,但是仍然无法实现调用Apollo中的感知模块如激光雷达感知模块对LGSVL仿真提供的点云进行检测,得到目标检测结果。
就这样纠结了很久,最终让我在最新版Apollo master代码中看到了Apollo官方已经包含了部分LGSVL的脚本代码,当时我就想是不是Apollo官方已经很好的支持了LGSVL?抱着试一试的态度,我下载了Apollo master最新的代码,最终也验证了我的想法。
因此,我强烈建议你下载最新版本的Apollo master分支的代码进行编译安装,编译安装过程与我的上一篇博客中Apollo 5.5的安装过程基本相同。下面的仿真过程也是基于最新版Apollo代码进行介绍的。
假设你已经编译好了Apollo最新版代码,此时你需要进入到容器后,依次执行:
bash scripts/bootstrap_lgsvl.sh
bash scripts/bridge.sh
注意执行bash scripts/bridge.sh
不会有任何输出,但是必须要执行这一句,不然无法和仿真器进行连接。
然后在浏览器中打开网站http://localhost:8888/,将右上角的配置设置为如下图所示:
然后选择Modules Controller选项,打开Modules面板中的Localization和Transform选项:
按照第一部分操作成功打开LGSVL仿真器之后,此时关键是需要检查一下Bridge选项中的Bridge Status状态是否是Connected,以及Address是否正确,由于我是在同一台电脑上进行仿真,因此IP是localhost,如果你是两台电脑,需要设置正确IP地址。
此时你如果在LGSVL仿真器界面上通过键盘方向键控制车辆运动,你应该能够看到Apollo的Dreamview界面上的车辆也在移动,这就说明仿真器工作正常了。
接下来需要进行几个仿真任务。
在终端中进入到Apollo容器中后,执行:
cyber_launch start modules/perception/production/launch/perception.launch
此时如果顺利的话你就能在Dreamview界面中看到如下激光雷达感知检测结果:
一般在这个步骤可能会遇到几个问题:
1、获取不到全局位姿错误
[lidar_perception] E0525 18:12:21.484632 129204 transform_wrapper.cc:222] [mainboard]Can not find transform. 1.59039e+09
frame_id: novatel child_frame_id: velodyne128
Error info: Lookup would require extrapolation into the future.
Requested time 1590389648474930176 but the latest data is at time 1513640028950000128,
when looking up transform from frame [velodyne128] to frame [novatel]
此时你可能需要更改一下/home/zhanghm/Apollo_Auto/apollo/modules/perception/onboard/transform_wrapper/transform_wrapper.cc
中Line218行代码,将
cyber::Time query_time(timestamp);
修改为:
cyber::Time query_time(0);
然后重新编译一下,再运行。
2、死活看不到检测目标
修改了上述代码后,如果运行还是看不到目标,你可能需要确认一下你的电脑GPU是不是真的够,电脑仿真界面是不是很流畅,因为如果电脑带不起来的话,仿真消息和Apollo接收到的消息会有很大的延迟,导致出现各种问题,我每次需要仿真的时候都是将其他所有程序都关掉,只进行仿真,毕竟仿真消耗的资源确实大。
并且你还可以通过cyber_monitor
命令查看消息/apollo/perception/obstacles
是不是正常,是否有帧率。