赞
踩
在安装完Apollo的环境之后如何使用Apollo系统进行调试运行是了解该系统的基础,网上以及官方说明文档也有,主要是下载Apollo提供的数据包,看看数据效果,本文主要是针对代码调试自己需要了解的模块,这里主要以规划控制模块为例,其他模块与之类似。本文主要对规划中的全局路径规划(Routing)模块、决策规划(Planning)模块的运行过程进行说明,并介绍了如何在planning中添加障碍物,以及planning中对障碍物的决策进行说明。
调试Apollo的环境需要先启动Apollo的运行环境,对Apollo安装有不懂的可以参考Apollo无人驾驶平台的离线搭建与使用。启动Apollo环境过程如下:
// 切换到docker目录下
~$ cd apollo-3.0.0/docker/scripts/
// start(可能需要联网,然后将--local去掉)
~$ ./dev_start.sh --local
// 进入
~$ ./dev_into.sh
//run system
~$ ./scripts/bootstrap.sh start
在浏览器中打开 http://localhost:8888 进入界面,车辆型号选择 MkzExample,Apollo给了三个区域的高精度地图,地图可以任意选择一个,这里选择 Sunnyvale Loop,并在Tasks里面选择 simcontrol,即可进入仿真模拟控制,如下图所示:
在选择好配置参数启动仿真模拟后,在ModuleControl中选择你需要调试的模块如下图所示:
由于这是模拟环境下启动的,没有雷达摄像头等硬件设备,因此很难直接在这个模拟平台上调试感知的参数,当然如果有摄像头激光雷达的数据包也可以使用感知模块。感知与预测模块得到的障碍物数据是给planning中使用的,当然如果需要测试planning中对障碍物的决策情况,还是可以手动添加的障碍物,会在后续文档进行介绍。因此,这里就很多情景中,无人车的轨迹跟随的场景进行模拟,这里启动routing(全局规划),planning(决策规划),control(控制模块的进程),启动完成后,可以进入routing Editing发送请求,如下图,第一张图表示Apollo给出的一张地图,其地图的详细数据存储在base_map.xml中,设置请求即在如下地图中设置起点-途经点-终点,如下第二张图所示:
可以在整张地图上,拖动点击鼠标可以在地图上任意选择两个点,然后选择send routing request可以发送请求,routing模块就会在地图中搜索出可行的路径,planning模块将指导车进行决策和局部规划,进而指导车进行运动,其效果如下:
图中可了解到,红线就是routing规划的,蓝色的亮线为planning规划的。
在Apollo系统的代码中因为没有感知和预测的数据,所以除了高精度地图中的一些标志,是没有其他车辆和障碍物的约束,要想了解在planning模块中对障碍物的决策过程,可以在程序中添加障碍物,planning中将预测得到的结果添加到frame中得到障碍物的轨迹,因此可以按照预测的结果直接添加到frame函数中,具体过程如下:
在这个目录下按照这个文件格式添加障碍物
"modules/planning/common/testdata/sample_prediction.pb.txt"
其数据格式如下:
header { timestamp_sec: 1487029724.22 module_name: "prediction" sequence_num: 9338 } prediction_obstacle { perception_obstacle { id: 2161 position { x: 585868.39 y: 4139982.16 z: 0 } theta: 0.0249947936189 velocity { x: 0 y: 0 z: 0 } length: 0.357469637533 width: 1.513933358 height: 0.514804840088 polygon_point { x: 97.2893624333 y: 347.796489884 z: -31.6976950117 } polygon_point { x: 97.2902582356 y: 347.923750521 z: -31.6948381206 } polygon_point { x: 97.3307050201 y: 348.052103216 z: -31.6921948431 } polygon_point { x: 97.5875120205 y: 348.394845337 z: -31.6860325399 } polygon_point { x: 97.6613368321 y: 346.921045429 z: -31.7196251173 } polygon_point { x: 97.33956867 y: 346.945560842 z: -31.7171360436 } polygon_point { x: 97.3009911378 y: 347.136420518 z: -31.7126110052 } tracking_time: 0 type: UNKNOWN timestamp: 0 } }
Header是数据头包括时间戳、标签名、序列号等,prediction_obstacle是具体的数据,包括障碍物的id、位置(该位置可以设置到地图中,是全局坐标)、航向角、速度,以及障碍物的尺寸(长宽高),polygon_point用来描述障碍物的的形状,这里采用多边形来进行描述,type表示障碍物的类型,与感知的标签有关,当然如果是unknown,planning会根据尺寸和为位置进行判断,考虑前车或者其他的交通进行决策,具体过程见planning的tasks中,这里没有加障碍物预测的轨迹,如有需要可自行添加。
然后在frame.cc中在 **Frame::CreateReferenceLineInfo()**函数中这行
bool has_valid_reference_line = false ;前添加如下代码:
//添加一个静态的障碍物
PredictionObstacles prediction_obstacle;
common::util::GetProtoFromFile(
"modules/planning/common/testdata/sample_prediction.pb.txt",
&prediction_obstacle);
auto obstacles = Obstacle::CreateObstacles(prediction_obstacle);
//AddObstacle(*obstacles1);
for (auto& obstacle : obstacles) {
AddObstacle(*obstacle);
}
这里在车前设置一个障碍物,车认为是静止的前车,然后进行决策,采取stop,其效果如下所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。