Apollo星火自动驾驶比赛思路及代码
一、代码调试和Dreamview使用1.1 打开Dreamview修改代码本地测试1.2 编译代码提交测评1.3 赛事编译缓存提高编译速度
二、赛题解析2.1 人行横道赛题2.2 红绿灯场景赛题2.3-2.4 借道绕行、慢速车绕行赛题2.5施工区域减速慢行赛题
总结
一、代码调试和Dreamview使用
1.1 打开Dreamview修改代码本地测试
cd pnc-competition/ # 进入pnc-competition目录
aem start # 启动 docker 环境指令
aem enter # 启动docker环境成功后,执行进入docker 环境指令
aem bootstrap # 在docker环境中执行启动dreamview指令
aem bootstrap stop # 若出现『Moduledreamview is already running - skipping.
aem bootstrap restart # 上面的指令和这一条是类似的,执行二者中的一个即可
buildtool build -p modules/planning/ # 修改Planing代码中的参数后,编译planning模块指令
exit # 退出Docker环境
1.2 编译代码提交测评
#### ctrl + alt + t 打开终端
cd pnc-competition/ # 进入pnc-competition目录
tar -zcvf 自己定义名字.tar.gz modules/planning/ # 代码压缩包制作
1.3 赛事编译缓存提高编译速度
aem enter # 该命令在宿主机执行,如果已在容器内,可以忽略这一步
cd /apollo_workspace/
wget https://apollo-pkg-beta.bj.bcebos.com/archive/planning_cache.tar.gz
sudo rm -rf .cache
tar -xzvf planning_cache.tar.gz
buildtool build -p modules/planning/
二、赛题解析
2.1 人行横道赛题
主⻋靠近⼈⾏道有几个步骤: 1)是否有⾏⼈通过⼈⾏道是否; 2)构建crosswalk的STOP墙; 3)停⽌时间⾏⼈通过⼈⾏道主⻋通过⼈⾏道; lane follow场景代码的解读: ⼀、是否有⾏⼈通过⼈⾏道:⾸先,通过调⽤reference_line.IsOnRoad(obstacle.PerceptionSLBoundary())来判断障碍物是否在道路上;如果障碍物在道路上(is_on_road为true),则需要进⼀步检查障碍物的SL坐标中的s值(obstacle_sl_point.s())是否⼤于⻋辆⾏驶结束边界的s值(adc_end_edge_s),如果是则判定需要停⻋(stop设为true),否则不需要停⻋; 二、构建crosswalk的STOP墙:根据⼈⾏横道的位置和配置的停⽌距离,⽣成停⻋决策,并将其应⽤于规划框架中的参考线信息; 三、主⻋停⽌时⻓:如果障碍物的速度⼩于等于预设的停⽌速度(kMaxStopSpeed),则判断为需要停⻋。代码⾸先检查是否已经记录了该障碍物的停⻋时间戳,如果没有,则添加当前时间戳;如果已经存在停⻋时间戳,则计算当前时间与之前记录的时间戳之间的停⻋时间,如果停⻋时间超过了配置⽂件中设置的停⽌超时时间(config_.crosswalk().stop_timeout()),则将停⻋状态设为false,即⻋辆启动; 讲完lane follow场景的步骤后,来说一说怎么实现在人行横道指定的距离停车; traffic_rule_config.pb.txt中找到"CROSSWALK“场景的配置参数,参数stop_distance修改距离,stop_timeout修改停车的时间即可。 config: { rule_id: CROSSWALK enabled: true crosswalk { stop_distance: 2.1 max_stop_deceleration: 6.0 min_pass_s_distance: 1.0 max_valid_stop_distance: 3.5 expand_s_distance: 2.0 stop_strict_l_distance: 5.0 stop_loose_l_distance: 8.0 stop_timeout: 40.0
} }
2.2 红绿灯场景赛题
红绿灯路口场景的赛题有三个stage:lane follow、TRAFFIC_LIGHT_PROTECTED_APPROACH、TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE;在traffic_light_protected_config.pb.txt中我们可以看到配置参数,距离交通灯路口停止线小于5m时,进入TRAFFIC_LIGHT_PROTECTED阶段,从停止线开始行驶到驶出红绿灯路口进入了TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE阶段; 我们可以看到参数的配置文件如下: 这段代码的作⽤是检查是否需要进⼊交通灯保护场景,⾸先获取交通灯保护场景(TRAFFIC_LIGHT_PROTECTED)的配置参数,然后将当前⻋辆距离最近的交通灯与start_traffic_light_scenario_distance进⾏⽐较,如果当前⻋辆距离最近的交通灯⼩于start_traffic_light_scenario_distance,那么设置变量traffic_light_protected_scenario为true,表示需要进⼊交通灯保护场景;
lane follow阶段不是该赛题的重点,主要来说TRAFFIC_LIGHT_PROTECTED_APPROACH、TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE两个阶段; 1)受保护的交通灯靠近阶段: 从下面的代码中可以看出在靠近阶段的处理函数中,它会遍历当前交通灯重叠区域的ID列表,并检查每个交通灯的颜⾊是否为绿灯,如果存在任何⼀个交通灯不是绿灯,那么设置变量traffic_light_all_done为false,然后退出循环;否则,将变量traffic_light_all_done设置为true;如果所有交通灯都是绿灯,那么函数调⽤FinishStage()来结束该阶段,然后返回Stage::FINISHED状态;否则,返回Stage::RUNNING状态,表示该阶段仍在运⾏中。交通灯靠近阶段的任务完成后,该函数会将next_stage_设置为ScenarioConfig::TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE,表示进⼊交通灯保护阶段的下⼀个阶段TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE,然后它返回Stage::FINISHED状态,表示该阶段已经完成;
进入受保护的交通灯靠近阶段上面没有说一个问题:如果检测到红灯的话需要停止,这时候就需要生成停止墙了,下面这个函数的作⽤是⽣成⼀条停⻋决策,并将其添加到参考线信息中,当交通规则需要控制⻋辆停⽌时,例如信号灯指示红灯时,就会⽣成这样的停⻋决策;
2)受保护的交通灯巡航阶段:交通灯保护交叉路⼝阶段(TrafficLightProtectedStageIntersectionCruise)的处理函数(Process)首先调⽤stage_impl_.CheckDone()函数,检查是否已经通过了交叉路⼝,如果已经通过了交叉路⼝,那么将返回true,表示该阶段已经完成;如果该阶段已经完成,那么函数调⽤FinishStage()来结束该阶段,然后返回Stage::FINISHED状态;否则,返回Stage::RUNNING状态,表示该阶段仍在运⾏中;如果该阶段完成后就会重新进入lane follow阶段。 讲完了原理来看一看这道题怎么解,我的思路是在受保护的交通灯巡航阶段增加一个参数,在这个阶段的配置文件里给这个参数赋值,然后在速度限速的逻辑里来判断这个参数是否为特定的值,如果是的话那就给一个限速,下面来看代码实现:首先在速度边界决策里加入一个新的参数flag_traffic_light_protected_intersection_cruise,其次在traffic_light_protected_config.pb.txt中给这个变量一个值1.0,最后一步在Status SpeedLimitDecider::GetSpeedLimits中在定义完curr_speed_limit之后,对是否进入了受保护的交通灯巡航阶段进行判断,进入了就给一个限速值5.5(题目要求是6m/s)。
2.3-2.4 借道绕行、慢速车绕行赛题
借道绕行、慢速车绕行赛题都是一直在lane follow阶段,我们来看lane follow阶段的task有哪些: 借道绕行赛题要求30米内完成绕行,慢速车绕行赛题要求前方慢速车速度小于3m/s的时候绕行,我们可以通过piecewise_jerk_path_optimizer的增大100倍的l_weight,减小10倍dl_weight,减小10倍ddl_weight,减小10倍 dddl_weight使得曲线更加陡峭、曲率更大从而能够在30m内完成绕行,但是慢速车绕行需要原先未经修改的参数,这就需要我们加逻辑判断障碍物的速度了,我的思路是如果障碍物速度在3m/s左右,那就减小100倍的l_weight,增大10倍dl_weight,增大10倍ddl_weight,增大10倍 dddl_weight,那么问题就来了怎么实现借道绕行、慢速车绕行赛题使用不同的参数呢?
我的思路是在reference_line_info里面有障碍物的信息,如果判断当前车道前方障碍物的速度在2.9-3.1之间,就是慢速车绕行场景,此时我们把分段加加速度优化器的参数乘以一个系数得到我们想要的慢速车绕行的参数就可以了。
2.5施工区域减速慢行赛题
我的解题思路和3、4题类似,通过找到感知传递过来的障碍物的信息,在这个ReferenceLineInfo::IsIrrelevantObstacle中添加逻辑,在感知到障碍物时,在它前方几米内就限制⻋辆的速度,这样因为施工区域一直都是障碍物所以速度降到指定的速度后就不会增加速度了,因为一直有障碍物,所以限速一直存在,当前方没有障碍物也就是驶出施工区域后限速自然就失效了,这样就可以了。
总结
以上就是Apollo星火自动驾驶比赛的思路以及代码实现。
科隆 比分、赛程、积分榜和球员数据
申花对建业足协杯比分结果,申花和建业的比赛直播