Skip to content
Permalink
Branch: master
Find file Copy path
233 lines (171 sloc) 15.6 KB

Apollo 2.5版导航模式的使用方法

Apollo项目以其优异的系统架构、完整的模块功能、良好的开源生态及规范的代码风格,受到众多开发者的喜爱和好评。不过在Apollo之前的版本中,感知、预测、导航、规划模块均依赖于高精地图,而高精地图的制作方法繁琐且不透明,对于很多开发者而言,这是一个难以逾越的障碍。因为没有高精地图,很多人只能使用Apollo提供的模拟数据包进行走马观花式的观赏,而无法在测试道路上完成真枪实弹式的实车调试,这极大降低了Apollo项目带来的便利,也不利于自动驾驶开源社区的发展和壮大。显然,Apollo项目组已注意到该问题,经过他们几个月的艰苦努力,终于在2.5版开发了一种新的基于相对地图(relative map)的导航模式(navigation mode),利用该模式可顺利实施测试道路上的实车调试。

相对地图是Apollo2.5引入的新特性。从架构层面,相对地图模块是连接高精地图(HD Map)、感知(Perception)模块和规划(Planning)模块的中间层。相对地图模块会实时生成基于车身坐标系的地图(格式与高精地图一致),并且输出供规划模块使用的参考线。更多信息,可以参考相对地图的说明文档。从开发者友好性角度看,基于相对地图的导航模式,让开发者可以不依赖高精地图便可实施测试道路的实车调试,极大降低了开发者的使用门槛。

导航模式的基本思路是:

  1. 通过人工驾驶方式录制测试道路上的行驶轨迹;
  2. 利用Apollo工具对原始轨迹进行处理得到平滑轨迹,该轨迹既用于替代路由(routing)模块输出的导航路径,也是规划(planning)模块用到的参考线(或称指引线、中心线,reference line),还是生成相对地图(relative map)的基准线。此外,平滑轨迹还可用于替换高精地图内某些车道的参考线(默认情况下,高精地图将车道中心线作为参考线,在道路临时施工等特殊情形下该方式很不合适,需使用人工录制并平滑处理的轨迹替换特殊路段的车道参考线,当然本文不讨论该项内容);
  3. 驾驶员将车辆行驶到测试道路起点,在Dreamview中打开导航(Navigation)选项及相关功能模块,切换到自动驾驶模式并启动车辆;
  4. 自动驾驶过程中,感知(perception)模块的相机(camera)动态检测道路边界及障碍物,地图(map)模块下的相对地图(relative map)子模块基于参考线及道路边界实时地生成相对地图(使用以车辆当前位置为原点的相对坐标系),规划(planning)模块依据地图模块输出的相对地图和感知模块输出的障碍物信息,动态输出局部行驶路径给控制(control)模块执行。
  5. 目前,导航模式仅支持单车道行驶,可完成加减速、跟车、遇障碍物减速停车或在车道宽度允许的情形下对障碍物绕行等功能,后续版本的导航模式将会进一步完善以支持多车道行驶、交通标志和红绿灯检测等。

本文对Apollo2.5版的构建、参考线数据采集与制作、Dreamview前端编译配置、导航模式使用等内容进行全面阐述,希望能给各位开发者正常使用Apollo 2.5版带来一定的便利。

一、Apollo 2.5版的构建

首先从GitHub网站下载Apollo2.5版源代码,可以使用git命令下载,也可以直接通过网页下载压缩包。源代码下载完成并放置到合适的目录后,可以使用两种方法构建:1.在Visual Studio Code中构建(推荐);2.使用命令行构建。当然,两种方法都有一个前提,就是在你的机器上已经顺利安装了Docker。你可以使用Apollo提供的脚本文件install_docker.sh安装Docker

1.1 在Visual Studio Code中构建

打开Visual Studio Code,执行菜单命令文件->打开文件夹,在弹出的对话框中,选择Apollo项目源文件夹,点击“确定”,如下图所示:

img

img

之后,执行菜单命令任务->运行生成任务或直接按快捷键Ctrl+Shift+B(与Visual StudioQT的快捷键一致)构建工程,若之前没有启动过Docker,则编译时会启动Docker,需在底部终端窗口输入超级用户密码。命令执行完毕,若在底部终端窗口出现终端将被任务重用,按任意键关闭。信息(如下图所示),则表示构建成功。整个过程一定要保持网络畅通,否则无法下载依赖包。构建过程可能会遇到一些问题,解决方法可参见我写的一篇博客 ,也可直接查看GitHub网站的帮助文档

img

1.2 在命令行中构建

按快捷键Ctrl + Alt + T打开命令行终端,输入如下命令启动Docker

cd your_apollo_project_root_dir
# 从中国大陆访问,最好加上“-C”选项,直接访问中国大陆镜像服务器以获取更快的下载速度
bash docker/scripts/dev_start.sh -C

输入如下命令进入Docker

bash docker/scripts/dev_into.sh

Docker内部,执行如下命令构建Apollo项目:

bash apollo.sh build

整个操作如下图所示:

img

1.3 修改定位模块UTM区域ID

Apollo项目定位(localization)模块默认使用美国西部UTM坐标,在国内需要修改该值。在Docker外部,使用vi或其他文本编辑器,打开文件[apollo项目根目录]/modules/localization/conf/localization.conf,将下述内容:

--local_utm_zone_id=10

修改为下述内容(这是长沙地区的UTM区域ID,中国UTM分区可参考该网页):

--local_utm_zone_id=49

**注意:**如果录制数据时未修改上述内容,则线下模拟测试回放数据包时只能将错就错,千万不能再修改该值,否则地图上的参考线定位会出错!有一次我采集数据时,忘了修改该值,回放数据时又进行修改,结果导致参考线定位到了美国西海岸!我取消修改,按F5键刷新浏览器后显示就恢复正常了。

1.4 配置Dreamview使用的UTM区域ID

打开文件[apollo项目根目录]/modules/common/data/global_flagfile.txt,在最后一行添加如下语句(这是长沙地区的UTM区域ID,中国UTM分区可参考该网页):

--local_utm_zone_id=49

二、参考线原始数据的采集

将构建好的Apollo项目文件导入车内工控机,并按照步骤1.2的方法进入Docker,再执行如下命令,启动Dreamview服务端程序:

bash scripts/bootstrap.sh

在浏览器中打开网页http://localhost:8888(注意不要使用代理),进入Dreamview界面,如下图所示:

img

1 驾驶员将车辆驶入待测试路段起点;

2 操作员点击Dreamview界面左侧工具栏中的Module Controller按钮,进入模块控制页面,选中GPSLocalizationRecord Bag选项,注意:如果采集的数据包需用于线下模拟测试,还需加上CAN Bus选项。

img

3 驾驶员从起点启动车辆并按预定路线行驶至终点;

4 操作员关闭Dreamview界面中的Record Bag选项,此时会在/apollo/data/bag目录(这是Docker中的目录,宿主机上对应的目录为[你的apollo根目录]/data/bag)中生成一个类似于2018-04-01-09-58-00的目录,该目录中保存着类似于2018-04-01-09-58-00.bag的数据包。这就是我们所需的数据包,请记住它的路径及名称。**注意:**单个数据包文件的默认录制时长为1分钟,默认文件大小为2048MB,可通过修改文件/apollo/scripts/record_bag.sh来改变默认值。

为后文阐述方便起见,我假设数据包2018-04-01-09-58-00.bag直接存放于/apollo/data/bag目录。

三、参考线的制作

参考线的制作既可在车内工控机内完成,也可在其他计算机上实施。无论在哪台计算机上制作,我们首先假定已按步骤1.2的方法进入Docker,并按照步骤二中录制的数据包放置在/apollo/data/bag目录中,且假定该文件名为2018-04-01-09-58-00.bag(在你的机器上并非如此,这样做只是为了后文阐述方便而已)。

3.1 从原始数据包提取裸数据

Docker内部,使用如下命令从原始数据包提取裸数据:

cd /apollo/modules/tools/navigator
python extractor.py /apollo/data/bag/2018-04-01-09-58-00.bag

上述命令会在当前目录(易知我们在/apollo/modules/tools/navigator目录中)生成一个提取后的裸数据文件:path_2018-04-01-09-58-00.bag.txt

为了验证裸数据的正确性,可以使用如下命令查看:

python viewer_raw.py ./path_2018-04-01-09-58-00.bag.txt

会显示类似下图的路径图:

img

3.2 对裸数据进行平滑处理

如果录制数据时,车辆行驶不够平顺,提取的裸轨迹数据可能会不光滑,有必要对其进行平滑处理。继续在Docker内部使用如下命令完成平滑处理:

bash smooth.sh ./path_2018-04-01-09-58-00.bag.txt 200

注意:上述命令中200是平滑处理的长度,该值一般为150-200,如果执行失败,可尝试调整该参数,再次进行平滑。

为了验证平滑结果的正确性,可以使用如下命令查看:

python viewer_smooth.py ./path_2018-04-01-09-58-00.bag.txt ./path_2018-04-01-09-58-00.bag.txt.smoothed

其中,第一个参数./path_2018-04-01-09-58-00.bag.txt是裸数据,第二个参数./path_2018-04-01-09-58-00.bag.txt.smoothed是平滑结果,显示效果类似下图:

img

四、Dreamview前端的编译

Dreamview前端默认使用Baidu地图,也可修改为Google地图,但需重新编译Dreamview前端,具体方法如下(注意:如不需修改地图设置,可忽略该节内容):

4.1 更改导航地图

打开文件[apollo项目根目录]/modules/dreamview/frontend/src/store/config/ parameters.yml,根据需要将下述内容替换为Google地图或Baidu地图:

navigation:
  # possible options: BaiduMap or GoogleMap
  map: "BaiduMap"

  # Google Map API: "https://maps.google.com/maps/api/js"
  # Baidu Map API: "https://api.map.baidu.com/api?v=3.0&ak=0kKZnWWhXEPfzIkklmzAa3dZ&callback=initMap"
  mapAPiUrl: "https://api.map.baidu.com/api?v=3.0&ak=0kKZnWWhXEPfzIkklmzAa3dZ&callback=initMap"

4.2 重新编译Dreamview前端

按照步骤1.2的方法进入Docker,运行如下命令编译Dreamview前端:

# 安装Dreamview前端依赖包,注意:该步骤只需执行一次,不必每次执行
cd /apollo/modules/dreamview/frontend/
yarn install
# 编译Dreamview前端
cd /apollo
bash apollo.sh build_fe

编译过程可能会出现如下错误:

ERROR in ../~/css-loader!../~/sass-loader/lib/loader.js?{"includePaths":["./node_modules"]}!./styles/main.scss*
*Module build failed: Error: ENOENT: no such file or directory, scandir '/apollo/modules/dreamview/frontend/node_modules/node-sass/vendor'*
...
(后面还有一长串,不再一一列出)

这是内部依赖包不一致造成的,解决方法如下:

Docker内部,运行如下命令(注意:一定要保持网络畅通,否则无法重新下载依赖包):

cd /apollo/modules/dreamview/frontend/
rm -rf node_modules
yarn install
cd /apollo
bash apollo.sh build_fe

五、导航模式的使用

5.1. 打开Dreamview并开启导航模式

进入Docker,启动Dreamview,命令如下:

cd your_apollo_project_root_dir
# 如果没有启动Docker,首先启动,否则忽略该步
bash docker/scripts/dev_start.sh -C
# 进入Docker
bash docker/scripts/dev_into.sh
# 启动Dreamview后台服务
bash scripts/bootstrap.sh

若是线下模拟测试,则将步骤二中录制好的数据包/apollo/data/bag/2018-04-01-09-58-00.bag(这是我机器上的录制数据)循环播放;若是实车调试,则忽略该步骤

# 模拟测试情形下,循环播放录制数据;实车调试情形忽略该步骤
rosbag play -l /apollo/data/bag/2018-04-01-09-58-00.bag

在浏览器中打开网页http://localhost:8888(注意不要使用代理),进入Dreamview界面,点击右上方下拉框,将模式设置为Navigation(导航模式),如下图所示:

img

5.2 启用导航模式下的相关功能模块

点击Dreamview界面左侧工具栏中的Module Controller按钮,进入模块控制页面。若是线下模拟测试,选中Relative MapNavi Planning选项,其他模块根据需要开启,如下图所示(图中显示空白文本的模块是Mobileye模块,需安装配置好相关硬件后才可见)):

img

若是实车调试,建议除Record BagMobileye(若Mobileye硬件未安装,则会显示为空白文本)和Third Party Perception模块外,其余模块全部开启,如下图所示:

img

5.3 发送参考线数据

Docker内部,使用如下命令发送步骤三中制作的参考线数据:

cd /apollo/modules/tools/navigator
python navigator.py ./path_2018-04-01-09-58-00.bag.txt.smoothed

下图是线下模拟测试情形下Dreamview接收到参考线后的界面,注意界面左上角已出现了百度地图界面,我们发送的参考线在百度地图中以红线方式、在主界面中以白色车道线的方式展现。

img

下图是实车调试情形下的Dreamview接收到参考线后的界面,注意界面左上角已出现了百度地图界面,我们发送的参考线在百度地图中以红线方式、在主界面中以黄色车道线的方式展现。

img

需注意以下几点:

(1) 如果发送参考线数据后,Dreamview界面不能正确显示参考线,可能有以下方面的原因:一是参考线数据未正确发送,解决办法是再次执行发送命令;二是浏览器缓存不一致,解决办法是按Ctrl + RF5键刷新显示,或者清理浏览器缓存;三是Dreamview后台服务程序运行异常,解决办法是在Docker内部重启Dreamview后台服务,命令如下:

# 停止Dreamview后台服务
bash scripts/bootstrap.sh stop
# 重新启动Dreamview后台服务
bash scripts/bootstrap.sh 

(2) 每次车辆重新回到起点后,无论是线下模拟测试还是实车调试情形,均需再次发送参考线数据

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.