赛事技术培训第一期——交通灯通行
一、关于报名:
1、关于报名注意事项:双平台报名,注意两个平台报名的时候所有信息务必填写一致,团队名称,指导老师名称,指导老师电话等信息,在百度Apollo赛事官网报名的时候一定要写清楚院校,队长信息(名字,电话),否则将视为无效赛队!
2、关于修改报名信息:
组委会官网—请到赛事QQ群,找到群公告,扫描问卷星二维码,反馈信息;
百度Apollo—请在百度Apollo赛事官网后台自行修改
3、关于附件:
百度Apollo赛项无需提交附件
4、关于报名、比赛时间安排
5、关于发票:
单位名称:学校
纳税人识别号:学校
(纳税人识别号填写学校名称即可在网上或者购物软件搜到)
二、培训内容:红绿灯通行场景仿真调试
场景描述:
当主车在监测到前方的红灯时, 主车停车在停止线前1.5-2.0米处,不得超过停止线。当红灯变为绿灯后,主车可以通过该路段,在通过交通灯区域时,主车的速度不得超过 6 m/s。
场景图示:
在交通规则中,当我们的车辆遇到红灯或者黄灯时就需要停车等待。在Apollo中设置的交通规则中也满足了这点。当我们的主车检测到前方为红或者黄灯时 (代码如下),在dreamview中的会显示以下界面:如图1 所示;同时也会在实线前多少米(看具体设置的距离,默认值为1米)外生成一道停止墙如图2所示:
图1:红灯显示 图2:停止墙
评判标准
主车未停车在停止线1.5-2.0米之间, 本场景分扣20分; 速度每超速1m/s, 本场景分扣20分, 超过停止线或者红灯状态未停止, 本场景计0分;
运行视频回放
【百度Apollo星火自动驾驶大赛城市道路预选赛——交通灯路口赛题】
技术详解
交通灯场景运行流程框图
一、进入TRAFFIC_LIGHT_PROTECTED场景
代码以及代码路径(节选):
scenario_type: TRAFFIC_LIGHT_PROTECTEDtraffic_light_protected_config: {start_traffic_light_scenario_distance: 5.0#当距离红绿灯的停车道5.0米时进入TRAFFIC_LIGHT_PROTECTED场景}
代码以及代码路径(节选):
这段代码的作用是检查是否需要进入交通灯保护场景。具体来说,它首先获取交通灯保护场景(TRAFFIC_LIGHT_PROTECTED)的配置参数,然后将当前车辆距离最近的交通灯与start_traffic_light_scenario_distance进行比较。
如果当前车辆距离最近的交通灯小于start_traffic_light_scenario_distance,那么设置变量traffic_light_protected_scenario为true,表示需要进入交通灯保护场景。
const auto& scenario_config =config_map_[ScenarioConfig::TRAFFIC_LIGHT_PROTECTED].traffic_light_protected_config();if (adc_distance_to_traffic_light <scenario_config.start_traffic_light_scenario_distance())//当我们的主车离停车道小于start_traffic_light_scenario_distance的值时//就进入TRAFFIC_LIGHT_PROTECTED场景{traffic_light_protected_scenario = true;}
交通灯场景TRAFFIC_LIGHT_PROTECTED定义了两个stage
stage_type: TRAFFIC_LIGHT_PROTECTED_APPROACHstage_type: TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE
TRAFFIC_LIGHT_PROTECTED_APPROACH和TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE的注册
代码以及代码路径(节选):
s_stage_factory_.Register(ScenarioConfig::TRAFFIC_LIGHT_PROTECTED_APPROACH,[](const ScenarioConfig::StageConfig& config,const std::shared_ptr<DependencyInjector>& injector) -> Stage* {return new TrafficLightProtectedStageApproach(config, injector);});s_stage_factory_.Register(ScenarioConfig::TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE,[](const ScenarioConfig::StageConfig& config,const std::shared_ptr<DependencyInjector>& injector) -> Stage* {return new TrafficLightProtectedStageIntersectionCruise(config,injector);});
如果自动驾驶车辆遇到交通灯为红灯
二、红绿灯检测:
代码以及代码路径(节选):
这段代码的作用是检查交通灯是否已经完成。它遍历已完成的交通灯重叠区域的ID列表,然后将当前交通灯的ID与这些ID进行比较。如果当前交通灯的ID在已完成的交通灯重叠区域的ID列表中,那么设置变量traffic_light_done为true,然后退出循环。
bool traffic_light_done = false;for (const auto& done_traffic_light_overlap_id :traffic_light_status.done_traffic_light_overlap_id()) {if (traffic_light_overlap.object_id == done_traffic_light_overlap_id) {traffic_light_done = true;break;}}if (traffic_light_done) {continue;}
2.1停止墙生成源码:
可能有小伙伴会问停止墙是如何生成的呢?停止墙的标志是什么?
首先当我们的主车确认前方交通灯不为绿灯时时,会生成停止墙,停止原因为黄/红信号灯,
代码以及代码路径(节选):
函数的作用是生成一条停车决策,并将其添加到参考线信息中。当交通规则需要控制车辆停止时,例如信号灯指示红灯时,就会生成这样的停车决策。
util::BuildStopDecision(virtual_obstacle_id, traffic_light_overlap.start_s,config_.traffic_light().stop_distance(),StopReasonCode::STOP_REASON_SIGNAL,wait_for_obstacles,TrafficRuleConfig::RuleId_Name(config_.rule_id()),frame, reference_line_info);
2.2信号灯停止源码:
代码以及代码路径(节选):
这段代码是一个交通灯保护阶段(TrafficLightProtectedStage)中的交通灯靠近阶段
(TrafficLightProtectedStageApproach)的处理函数(Process)。
首先,它遍历当前交通灯重叠区域的ID列表,并检查每个交通灯的颜色是否为绿灯。
如果存在任何一个交通灯不是绿灯,那么设置变量traffic_light_all_done为false,然后退出循环。
否则,将变量traffic_light_all_done设置为true。
如果所有交通灯都是绿灯,那么函数调用FinishStage()来结束该阶段,然后返回Stage::FINISHED状态。
否则,返回Stage::RUNNING状态,表示该阶段仍在运行中。
Stage::StageStatus TrafficLightProtectedStageApproach::Process(const TrajectoryPoint& planning_init_point, Frame* frame) {bool traffic_light_all_done = true;for (const auto& traffic_light_overlap_id :GetContext()->current_traffic_light_overlap_ids) {//如果不为绿灯if (signal_color != TrafficLight::GREEN) {traffic_light_all_done = false;break;//进入TrafficLightProtectedStageApproach::RUNNING}}if (traffic_light_all_done) {return FinishStage();}return Stage::RUNNING;}
当主车靠近红绿灯场景时,会进入Scenario 为TRAFFIC_LIGHT_PROTECTED的红绿灯场景
自动驾驶车辆接近交通信号灯
三、进入APPROACH的stage定义
代码以及代码路径(节选):
这段代码是交通灯保护阶段(TrafficLightProtectedStage)中的交通灯靠近阶段(TrafficLightProtectedStageApproach)的处理函数(Process)
Stage::StageStatus TrafficLightProtectedStageApproach::Process()//APPROACHstage 正在运行{return Stage::RUNNING;}
这段代码是交通灯保护阶段(TrafficLightProtectedStage)中的交通灯靠近阶段(TrafficLightProtectedStageApproach)的结束函数(FinishStage)。
当交通灯靠近阶段的任务完成后,该函数会将next_stage_设置为ScenarioConfig::TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE,表示进入交通灯保护阶段的下一个阶段TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE。
然后,它返回Stage::FINISHED状态,表示该阶段已经完成。
Stage::StageStatus TrafficLightProtectedStageApproach::FinishStage()//APPROACHstage 正在完成{//省略next_stage_ = ScenarioConfig::TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE;//进入下一个stage TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISEreturn Stage::FINISHED;//APPROACH的stage完成}
自动驾驶车辆进入红绿灯交叉路口区域
四、进入INTERSECTION_CRUISE的stage定义
代码以及代码路径(节选):
这段代码是交通灯保护阶段(TrafficLightProtectedStage)中的交通灯保护交叉路口阶段(TrafficLightProtectedStageIntersectionCruise)的处理函数(Process)。
首先,它调用stage_impl_.CheckDone()函数,检查是否已经通过了交叉路口。如果已经通过了交叉路口,那么将返回true,表示该阶段已经完成。
如果该阶段已经完成,那么函数调用FinishStage()来结束该阶段,然后返回Stage::FINISHED状态。
否则,返回Stage::RUNNING状态,表示该阶段仍在运行中。
Stage::StageStatus TrafficLightProtectedStageIntersectionCruise::Process(const common::TrajectoryPoint& planning_init_point, Frame* frame) {bool stage_done =stage_impl_.CheckDone(*frame, ScenarioConfig::TRAFFIC_LIGHT_PROTECTED,config_, injector_->planning_context(), true);//定义交叉路口if (stage_done)//如果通过交叉路口{return FinishStage();//INTERSECTION_CRUISE的stage完成}return Stage::RUNNING;//进入INTERSECTION_CRUISE的RUNNING}
该函数调用FinishScenario()函数,结束整个交通灯保护阶段(TrafficLightProtectedStage),并返回Stage::FINISHED状态,表示该阶段已经完成。
Stage::StageStatus TrafficLightProtectedStageIntersectionCruise::FinishStage() {return FinishScenario();//INTERSECTION_CRUISE的stage完成}
交通灯场景代码修改部分
任务实现:
停车距离:
config: {rule_id: TRAFFIC_LIGHTenabled: truetraffic_light {stop_distance: 1.0#停止距离为1.0 单位 mmax_stop_deceleration: 4.0}}
代码实现(节选):
ObjectDecisionType stop;//定义一个停止墙auto* stop_decision = stop.mutable_stop();//stop决策的停车原因stop_decision->set_reason_code(stop_reason_code);stop_decision->set_distance_s(-stop_distance);//stop决策的停车安全距离
实现场景代码(修改参数的部分):
我们仅仅需要将配置文件TRAFFIC_LIGHT的stop_distance值改为1.5-2.0即可。
因为存在误差值,尽量取中间值。
config: {rule_id: TRAFFIC_LIGHTenabled: truetraffic_light {stop_distance: 1.7#停止距离为1.0 单位 m}}
限速方案:
方案一(简单可行,但需要多次调试):
通过降低车辆的最大加速度,使车辆在通过交叉路口时的速度不超过6m/s。
方案二(复杂但有效,需要通读代码):
可以参考减速带(speed bump)的方式进行调试,通过在限制通行区域内设置类似减速带的措施,来限制车辆的速度。