apollo_logo
10
0

赛事技术培训第一期——交通灯通行

一、关于报名:

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_PROTECTED
traffic_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_APPROACH
stage_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_CRUISE
return 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_LIGHT
enabled: true
traffic_light {
stop_distance: 1.0
#停止距离为1.0 单位 m
max_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_LIGHT
enabled: true
traffic_light {
stop_distance: 1.7
#停止距离为1.0 单位 m
}
}

限速方案:

方案一(简单可行,但需要多次调试):

通过降低车辆的最大加速度,使车辆在通过交叉路口时的速度不超过6m/s。

方案二(复杂但有效,需要通读代码):

可以参考减速带(speed bump)的方式进行调试,通过在限制通行区域内设置类似减速带的措施,来限制车辆的速度。

原创声明,本文由作者授权发布于Apollo开发者社区,未经许可,不得转载。
发表评论已发表 0 条评论
登录后可评论,请前往 登录
暂无评论~快去发表自己的独特见解吧!
目录
一、关于报名:
二、培训内容:红绿灯通行场景仿真调试
场景描述:
场景图示:
评判标准
运行视频回放
技术详解
交通灯场景运行流程框图
任务实现:
限速方案: