Apollo星火自动驾驶比赛思路以及代码实现

Apollo星火自动驾驶比赛思路以及代码实现





主⻋靠近⼈⾏道有几个步骤:
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 {

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

红绿灯路口场景的赛题有三个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)。

在这里插入图片描述
在这里插入图片描述

借道绕行、慢速车绕行赛题都是一直在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,

我的思路是

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


以上就是Apollo星火自动驾驶比赛的思路以及代码实现。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/280143.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月14日 下午2:09
下一篇 2026年3月14日 下午2:09


相关推荐

关注全栈程序员社区公众号