交通标志场景解析
相关练习赛:
https://apollo.baidu.com/community/competition/49
赛事题目:交通标志场景
主车在交汇路口处如遇到停止标志,主车须完全停止,主车停车在停止线前2.0-2.5米处,不得超过停止线,待确定安全后方可通行。
评判标准
主车在交汇路口处如遇到停止标志,主车须完全停止,主车停车在停止线前2.0-2.5米处,不得超过停止线,待确定安全后方可通行。
操作步骤:
下载交通标志场景相关配置参数和源码
buildtool profile config init --package planning-traffic-rules-stop-sign --profile=defaultbuildtool profile config init --package planning-scenario-stop-sign-unprotected --profile=defaultbuildtool profile config init --package planning-task-lane-follow-path --profile=defaultbuildtool install planning-traffic-rules-stop-sign
使用配置参数
aem profile use default
仿真
- 选择pnc模式和scenario sim
- 选择场景
- 启动所有模块
- 开始仿真
- 查看实际停车距离
参数修改
修改停车距离
profiles/default/modules/planning/traffic_rules/stop_sign/conf/default_conf.pb.txt
#原enabled: truestop_distance: 1.0#修改后enabled: truestop_distance: 2.50
重启planning模块,可以发现车辆停止在停止线后2.5m左右了,但是我们车辆不会向前移动
因此我们需要修改有效停车范围判定
profiles/default/modules/planning/scenarios/stop_sign_unprotected/conf/scenario_conf.pb.txt
#原max_valid_stop_distance: 2.0#修改后max_valid_stop_distance: 3.0
可以发现车辆停止在停止线后2.5m左右了,且车辆可以顺利进入路口了,但又出现了新问题
进入路口后问题,车辆会卡在这里,这里是路径优化的不是很平滑导致,需要优化路径
路径优化:profiles/default/modules/planning/tasks/lane_follow_path/conf/default_conf.pb.txt
#原l_weight: 1.0#修l_weight: 10.0
重启planning模块后重新仿真即可完成该任务
代码打包&代码提交
可查看该教程
https://apollo.baidu.com/community/article/1045
代码提交
https://apollo.baidu.com/community/competition/49
停车距离日志输出
下载源码
buildtool install planning-traffic-rules-stop-sign
插入日志代码代码
路径modules/planning/traffic_rules/stop_sign/stop_sign.cc
AINFO << "stop_sign_distance: "<< config_.stop_distance();
编译代码:
buildtool build -p modules/planning/
其他插件代码可以访问如下连接
https://apollo.baidu.com/docs/apollo/latest/md_collection_2planning_2README__cn.html
标志场景处理技术文档
整体流程图
一、场景概述
场景定义
主车在行驶中检测到停止标志时,需根据交通规则执行完整停车流程。场景处理分为两个核心模块:
- StopSign:交通规则判断模块
- StopSignUnprotectedScenario:无保护路口场景执行模块
处理流程
完整处理流程包含4个阶段:
PRE_STOP → STOP → CREEP → INTERSECTION_CRUISE
核心参数速查表
交通规则配置(StopSignConfig)
参数 | 作用阶段 | 实际影响 |
stop_distance | PRE_STOP阶段 | 车辆到停止线的距离 |
场景配置(ScenarioStopSignUnprotectedConfig)
参数 | 作用阶段 | 实际影响 |
start_stop_sign_scenario_distance | 场景触发 | 进入该场景的距离 |
max_valid_stop_distance | PRE_STOP阶段 | 有效停车范围判定 |
stop_duration_sec | STOP阶段 | 最低停车持续时间 |
stop_timeout_sec | STOP阶段 | 最大等待时间 |
creep_timeout_sec | CREEP阶段 | 最大缓行时间 |
配置参数关联流程图
二、核心插件解析
2.1 StopSign 交通规则模块
2.1.1 代码结构
class StopSign : public TrafficRule {public:bool Init(...) override;Status ApplyRule(...) override;private:void MakeDecisions(...);StopSignConfig config_;};
2.1.2 关键逻辑
- 触发条件判断:
const std::vector<PathOverlap>& stop_sign_overlaps =reference_line->map_path().stop_sign_overlaps();
- 决策生成逻辑:
// 关键代码段:检测停止标志const std::vector<PathOverlap>& stop_sign_overlaps =reference_line_info->reference_line().map_path().stop_sign_overlaps();for (const auto& stop_sign_overlap : stop_sign_overlaps) {if (stop_sign_overlap.end_s <= adc_back_edge_s) continue;// 创建虚拟障碍物util::BuildStopDecision(virtual_obstacle_id,stop_sign_overlap.start_s,config_.stop_distance(), // 配置参数StopReasonCode::STOP_REASON_STOP_SIGN,wait_for_obstacle_ids,Getname(),frame,reference_line_info);}
- 状态管理:
// 使用PlanningContext保持场景状态auto& stop_sign_status =injector_->planning_context()->mutable_planning_status()->mutable_stop_sign();
2.2 StopSignUnprotectedScenario 场景插件
2.2.1 阶段状态机
阶段 | 类名 | 行为描述 |
PRE_STOP | StopSignUnprotectedStagePreStop | 减速至停止线前 |
STOP | StopSignUnprotectedStageStop | 完全停止并观察 |
CREEP | StopSignUnprotectedStageCreep | 低速接近路口 |
INTERSECTION_CRUISE | StopSignUnprotectedStageIntersectionCruise | 安全通过路口 |
2.2.2 状态转换条件
PLANTUML[*] --> PRE_STOP: 检测到停止标志
PRE_STOP --> STOP: 到达停止距离
STOP --> CREEP: 完成3秒停车+环境安全
CREEP --> INTERSECTION_CRUISE: 进入路口区域
INTERSECTION_CRUISE --> [*]: 完全通过路口
三、协同工作机制
3.1 模块交互流程
TEXT[感知层]检测停止标志
↓
[StopSign]生成虚拟障碍物/停车决策
↓
[场景管理器]激活StopSignUnprotectedScenario
↓
[阶段控制器]执行各阶段行为