apollo_logo
4
0

动态避障场景解析

赛事题目:动态避障场景--场景一

遇到有人通过人行道, 主车需要停止在人行道前2m~2.5m内停车,待行人完全通过马路后才能继续行驶。

场景图示:

评判标准

遇到行人通过人行横道时,主车未停止在人行道前2~2.5m内, 本场景分扣20分, 若未避让行人或超出停止线停车, 本场景计0分;动前车变道时,若主车与前车的距离小于10米,扣20分;主车如果与障碍物发生碰撞,该场景得0分。

实验步骤:

启动dreamview并观察默认代码下车辆通过施工区域的仿真效果。

(1)在终端中,执行DreamView启动指令,执行成功后,打开浏览器输入(http://localhost:8888/)进入dremview中。

aem bootstrap start --plus

当出现如下,即表示dreamview启动成功了。

(2)左侧导航栏打开Mode Setting面板,模式选择PnC Mode,操作选择Scenario_sim,进入仿真模式。

人行道(crosswalk)

输入人行道配置参数同步指令,系统将自动将人行道配置参数复制到profile的default目录中,然后就可以在profile目录上轻松修改配置参数。

#人行道(crosswalk)
buildtool profile config init --package planning-traffic-rules-crosswalk --profile=default

使用default目录这份配置

# 使用名字叫default的这份配置
aem profile use default

查看profile插件目录结构:

tree profiles/default/modules/planning/traffic_rules/

目录结构:

profiles/default/modules/planning/traffic_rules
|-- crosswalk
| `-- conf
| `-- default_conf.pb.txt

人行道(crosswalk)默认参数:

stop_distance: 1.0
max_stop_deceleration: 4.0
min_pass_s_distance: 1.0
expand_s_distance: 2.0
stop_strict_l_distance: 5.0
stop_loose_l_distance: 5.0
stop_timeout: 10.0

交通灯(traffilclight)默认参数:

enabled: true
stop_distance: 1.0
max_stop_deceleration: 4.0

修改配置参数

人行道(crosswalk)

stop_distance: 1.2
stop_strict_l_distance: 1.0
stop_loose_l_distance: 6.5
stop_timeout: 80.0

交通灯(traffilclight)

stop_distance: 1.2

【注意】:因每人调整的代码可能不一样,如若出现不避让行人的情况,可自由修改这三个配置参数

配置参数解释:https://apollo.baidu.com/community/Apollo-Homepage-Document?doc=BYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0KyYqk58ATOFYA7KXikBzcSABOCAGZq8pPn2VERkcaWXJIkAO4JUAa3EAlAKIBBACIBZBztJTMoCqiA

【科普环节】SL坐标系详解:

SL坐标系将道路分解为沿道路方向的S轴和垂直于道路方向的L轴

  1. S坐标
    • S坐标代表的是沿道路长度的位置,可以理解为沿道路中心线的行驶距离。从道路的起始点开始计算,沿车道中心向前延伸。这个值通常用于表示对象在道路上前进的多远,类似于道路上的里程标。
  1. L坐标
    • L坐标表示的是横向位置,即对象相对于车道中心线的侧向距离。正值通常表示障碍物位于车道中心线的右侧,负值则表示在左侧。这个参数对于判断车辆是否需要变道或者调整车道位置以避免障碍物非常有用。

修改之后保存代码后进行仿真。

修改好代码参数后,保存这个文件,在dreamview中重启planning模块(必须步骤)

重新选择场景,观察调整前有何变化

不避让行人解决方式:

如果出现行人通过人行横道时,无法通过配置文件限制行人还在人行横道上时车辆就启动的情况,你可以按照以下方式进行修改参考

下载crosswalk的包

buildtool install planning-traffic-rules-crosswalk

修改源码modules/planning/traffic_rules/crosswalk/crosswalk.cc:

将该处源码进行修改

原始

else {
// (4) when l_distance is between loose_l and strict_l
// use history decision of this crosswalk to smooth unsteadiness
// TODO(all): replace this temp implementation
if (is_path_cross) {
stop = true;
}
ADEBUG << "need_stop(between l1 & l2): obstacle_id[" << obstacle_id
<< "] type[" << obstacle_type_name << "] obstacle_l_distance["
<< obstacle_l_distance << "] crosswalk_id[" << crosswalk_id
<< "] USE_PREVIOUS_DECISION";
}

修改后

else {
// (4) when l_distance is between loose_l and strict_l
// use history decision of this crosswalk to smooth unsteadiness
// TODO(all): replace this temp implementation
if (is_path_cross) {
stop = true;
}
ADEBUG << "need_stop(between l1 & l2): obstacle_id[" << obstacle_id
<< "] type[" << obstacle_type_name << "] obstacle_l_distance["
<< obstacle_l_distance << "] crosswalk_id[" << crosswalk_id
<< "] USE_PREVIOUS_DECISION";
stop = true;
}

修改完成后

编译代码

buildtool build -p modules/planning/

注:教程还没完,请详看下方技术详解

技术详解

人行横到场景运行流程框图

场景代码解读:

人行道配置文件:

该配置用于定义人行横道交通规则的参数,包括停车距离、减速度、通过距离等。这些参数用于判断在人行横道上是否需要停车以及停车的具体条件。

执行下述命令,在profile文件夹生成人行道配置参数并使用。

buildtool profile config init --package planning-traffic-rules-crosswalk --profile=default && aem profile use default
stop_distance: 1.0
max_stop_deceleration: 4.0
min_pass_s_distance: 1.0
expand_s_distance: 2.0
stop_strict_l_distance: 4.0
stop_loose_l_distance: 5.0
stop_timeout: 10.0

一、是否有行人通过人行道:

步骤1:行人检测逻辑(CheckStopForObstacle)

步骤2:生成决策(MakeDecisions)

代码段用于检查障碍物是否在道路上并判断是否需要停车。首先,通过调用reference_line.IsOnRoad(obstacle.PerceptionSLBoundary())来判断障碍物是否在道路上。如果障碍物在道路上(is_on_road为true),则进一步检查障碍物的SL坐标中的s值(obstacle_sl_point.s())是否大于车辆行驶结束边界的s值(adc_end_edge_s)。如果是,则判定需要停车(stop设为true),否则不需要停车。

const bool is_on_road =
reference_line.IsOnRoad(obstacle.PerceptionSLBoundary());
if (is_on_road) {
if (obstacle_sl_point.s() > adc_end_edge_s) {
stop = true;
}

当我们的行人不在人行道时,STOP 消失,主车通过人形道

二、构建crosswalk的STOP墙:

计时器工作原理

此函数,可以根据人行横道的位置和配置的停止距离,生成停车决策,并将其应用于规划框架中的参考线信息。

util::BuildStopDecision(virtual_obstacle_id, crosswalk_overlap->start_s,
util::BuildStopDecision(
virtual_obstacle_id, crosswalk_overlap->start_s,
//人行道停止距离配置文件
config_.stop_distance(),
//停止原因:人行道
StopReasonCode::STOP_REASON_CROSSWALK,
crosswalk_to_stop.second, Getname(), frame, reference_line_info);

三、主车停止时长:

行人检测逻辑(CheckStopForObstacle)

如果障碍物的速度小于等于预设的停止速度(kMaxStopSpeed),则判断为需要停车。代码首先检查是否已经记录了该障碍物的停车时间戳,如果没有,则添加当前时间戳。如果已经存在停车时间戳,则计算当前时间与之前记录的时间戳之间的停车时间。如果停车时间超过了配置文件中设置的停止超时时间(config_.crosswalk().stop_timeout()),则将停车状态设为false,即车辆启动。

if (obstacle_speed <= kMaxStopSpeed) {
//当速度小于默认值的停止速度时时判为STOP
if (crosswalk_stop_timer[crosswalk_id].count(obstacle_id) < 1) {
// add timestamp
ADEBUG << "add timestamp: obstacle_id[" << obstacle_id
<< "] timestamp[" << Clock::NowInSeconds() << "]";
crosswalk_stop_timer[crosswalk_id].insert(
{obstacle_id, Clock::NowInSeconds()});
} else {
double stop_time = Clock::NowInSeconds() -
crosswalk_stop_timer[crosswalk_id][obstacle_id];
ADEBUG << "stop_time: obstacle_id[" << obstacle_id << "] stop_time["
<< stop_time << "]";
//当停止时间大于配置文件的停止超时时,车辆启动
if (stop_time >= config_.stop_timeout()) {
stop = false;
}
}
}

实现场景代码(修改参数的部分):

停止距离部分

我们仅仅需要将配置文件CROSSWALK的stop_distance值改为2.0-2.5即可。
因为存在误差值,尽量取中间值。

stop_distance: 2.0 #不同配置参数调整的距离不一样
stop_strict_l_distance: 8.0
stop_loose_l_distance: 8.0
stop_timeout: 50.0

原创声明,本文由作者授权发布于Apollo开发者社区,未经许可,不得转载。
发表评论已发表 0 条评论
登录后可评论,请前往 登录
暂无评论~快去发表自己的独特见解吧!
目录
赛事题目:动态避障场景--场景一
场景图示:
评判标准
实验步骤:
启动dreamview并观察默认代码下车辆通过施工区域的仿真效果。
技术详解
人行横到场景运行流程框图
场景代码解读:
实现场景代码(修改参数的部分):