apollo_logo
7
0

星火自动驾驶大赛赛事集锦--交汇路口减速慢行场景(方法二)

场景描述:

主车在城市道路行驶时,行驶至交汇路口时为了保证行驶安全需降低速度至5米/秒,并在过后恢复正常速度。

评判标准:

  • 当车辆途经交汇路口时,速度每超出1m/s,将扣除20分。
  • 若车辆越过停车线或在红灯状态下未能停车,则此场景得分为0分。

技术详解

参考减速带(speed_bump)的处理方式:

.aem/envroot/opt/apollo/neo/src/modules/planning/planning_base/common/reference_line_info.cc

const auto& map_path = reference_line_.map_path();
for (const auto& speed_bump : map_path.speed_bump_overlaps()) {
// -1 and + 1.0 are added to make sure it can be sampled.
reference_line_.AddSpeedLimit(speed_bump.start_s - 1.0,
speed_bump.end_s + 1.0,
FLAGS_speed_bump_speed_limit);
}

在循环中,代码遍历了地图路径中的每个减速带,然后将减速带的起始位置(start_s)减去1.0,并将终止位置(end_s)加上1.0,然后将这个范围内的速度限制设置为FLAGS_speed_bump_speed_limit。这样做是为了确保在减速带的前后都能够适用减速限制,以增加安全性。

交汇路口场景解析

交汇路口减速策略:

交汇路口减速策略的实现

添加一个新的task,其主要流程为:

  1. 判断主车是否已经接近交汇路口
  2. 确认交汇路口重叠后,开始限制车速
  3. 当主车完全通过交汇路口后,取消速度限制

生成插件文件模版

输入下述指令,在modules/planning/tasks/下新建插件文件夹junction_speed_limit。

输入下述指令,在模块/计划/任务/下新建插件文件夹junction_speed_limit。

buildtool create --template plugin \
--namespaces planning \
--name junction-speed-limit \
--base_class_name Task \
modules/planning/tasks/junction_speed_limit \
--includes modules/common/status/status.h \
modules/planning/tasks/junction_speed_limit/proto/junction_speed_limit.pb.h \
modules/planning/planning_base/task_base/task.h
buildtool profile config init --package planning-scenario-lane-follow --profile=default && aem profile use default

3.2 写JunctionSpeedLimit类代码文件以及配置相应BUILD文件

3.2写JunctionSpeedLimit类代码文件以及配置相应BUILD文件

junction_speed_limit.cc

#include <memory>
#include <unordered_map>
#include "modules/planning/tasks/junction_speed_limit/junction_speed_limit.h"
#include "modules/planning/planning_base/gflags/planning_gflags.h"
namespace apollo {
namespace planning {
using apollo::common::Status;
using apollo::hdmap::PathOverlap;
bool JunctionSpeedLimit::Init(
const std::string& config_dir,
const std::string& LaneWaypointname,
const std::shared_ptr<DependencyInjector>& injector) {
if (!Task::Init(config_dir, LaneWaypointname, injector)) {
return false;
}
return Task::LoadConfig<JunctionSpeedLimitConfig>(&config_);
}
apollo::common::Status JunctionSpeedLimit::Process(Frame* const frame, ReferenceLineInfo* const reference_line_info) {
AINFO << "JunctionSpeedLimit::Process";
ReferenceLine* reference_line = reference_line_info->mutable_reference_line();
const std::vector<PathOverlap>& pnc_junction_overlaps
= reference_line_info->reference_line().map_path().pnc_junction_overlaps();
for (const auto& pnc_junction_overlap : pnc_junction_overlaps) {
reference_line->AddSpeedLimit(
pnc_junction_overlap.start_s - config_.forward_buffer(),
pnc_junction_overlap.end_s + config_.backward_buffer(),
config_.limit_speed());
}
return Status::OK();
}
} // namespace planning
} // namespace apollo

junction_speed_limit.h

#pragma once
#include <memory>
#include "cyber/plugin_manager/plugin_manager.h"
#include <vector>
#include "modules/planning/planning_interface_base/task_base/task.h"
#include "modules/planning/planning_interface_base/task_base/common/path_generation.h"
// proto
#include "modules/planning/tasks/junction_speed_limit/proto/junction_speed_limit.pb.h"
#include "modules/map/pnc_map/path.h"
#include "modules/common_msgs/routing_msgs/routing.pb.h"
#include "modules/common/status/status.h"
#include "modules/planning/planning_interface_base/task_base/task.h"
#include "modules/planning/planning_interface_base/task_base/common/path_generation.h"
namespace apollo {
namespace planning {
class JunctionSpeedLimit : public PathGeneration {
public:
bool Init(
const std::string& config_dir,
const std::string& LaneWaypointname,
const std::shared_ptr<DependencyInjector>& injector);
apollo::common::Status Process(Frame* const frame, ReferenceLineInfo* const reference_line_info);
JunctionSpeedLimitConfig config_;
};
CYBER_PLUGIN_MANAGER_REGISTER_PLUGIN(apollo::planning::JunctionSpeedLimit, Task)
} // namespace planning
} // namespace apollo

BUILD

load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("//tools:apollo.bzl", "cyber_plugin_description")
load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_plugin")
load("//tools/proto:proto.bzl", "proto_library")
load("//tools:cpplint.bzl", "cpplint")
package(default_visibility = ["//visibility:public"])
filegroup(
name = "junction_speed_limit_files",
srcs = glob([
"conf/**",
]),
)
apollo_plugin(
name = "libjunction_speed_limit.so",
srcs = [
"junction_speed_limit.cc",
],
hdrs = [
"junction_speed_limit.h",
],
description = ":plugins.xml",
copts = ["-DMODULE_NAME=\\\"planning\\\""],
deps = [
"//modules/common_msgs/planning_msgs:planning_cc_proto",
"//modules/map:apollo_map",
"//cyber",
"//modules/planning/tasks/junction_speed_limit/proto:junction_speed_limit_proto",
"//modules/planning/planning_interface_base:apollo_planning_planning_interface_base",
],
)
apollo_package()
cpplint()

3.3 配置参数文件

修改proto文件的junction_speed_limit.proto

syntax = "proto2";
package apollo.planning;
message JunctionSpeedLimitConfig {
// 声明RegionSpeedLimitConfig中的数据结构
optional double forward_buffer = 1 [default = 3];
optional double backward_buffer = 2 [default = 2];
optional double limit_speed = 3 [default = 5];
}

3.4 写插件参数文件

在conf文件夹中将junction_speed_limit.pb.txt修改成default_conf.pb.txt

forward_buffer: 3.0
backward_buffer: 2.0
limit_speed: 15.0

3.5 配置cyberfile.xml

<package format="2">
<name>junction-speed-limit</name>
<version>local</version>
<description>
This is a demo package
</description>
<maintainer email="sample@sample.com">Apollo Developer</maintainer>
<license>Apache License 2.0</license>
<url type="website">https://www.apollo.auto/</url>
<url type="repository">https://github.com/ApolloAuto/apollo</url>
<url type="bugtracker">https://github.com/ApolloAuto/apollo/issues</url>
<type>module</type>
<src_path>//modules/planning/tasks/junction_speed_limit</src_path>
<builder>bazel</builder>
<depend type="binary" repo_name="planning-interface-base">planning-interface-base</depend>
<depend>bazel-extend-tools</depend>
</package>

3.7 配置plugin.xml

将plugin_junction_speed_limit_description.xml文件修改成plugins.xml文件

<library path="modules/planning/tasks/junction_speed_limit/libjunction_speed_limit.so">
<class type="apollo::planning::JunctionSpeedLimit" base_class="apollo::planning::Task"></class>
</library>

3.7 加入新增插件至配置参数中

modules/planning/scenarios/lane_follow/conf/pipeline.pb.txt

模块/规划/场景/lane_follow/conf/pipeline. pb.txt

stage: {
name: "LANE_FOLLOW_STAGE"
type: "LaneFollowStage"
enabled: true
task {
name: "LANE_CHANGE_PATH"
type: "LaneChangePath"
}
task {
name: "LANE_FOLLOW_PATH"
type: "LaneFollowPath"
}
task {
name: "JUNCTION_SPEED_LIMIT"
type: "JunctionSpeedLimit"
}
task {
name: "LANE_BORROW_PATH"
type: "LaneBorrowPath"
}
task {
name: "FALLBACK_PATH"
type: "FallbackPath"
}
task {
name: "PATH_DECIDER"
type: "PathDecider"
}
task {
name: "RULE_BASED_STOP_DECIDER"
type: "RuleBasedStopDecider"
}
task {
name: "SPEED_BOUNDS_PRIORI_DECIDER"
type: "SpeedBoundsDecider"
}
task {
name: "SPEED_HEURISTIC_OPTIMIZER"
type: "PathTimeHeuristicOptimizer"
}
task {
name: "SPEED_DECIDER"
type: "SpeedDecider"
}
task {
name: "SPEED_BOUNDS_FINAL_DECIDER"
type: "SpeedBoundsDecider"
}
task {
name: "PIECEWISE_JERK_SPEED"
type: "PiecewiseJerkSpeedOptimizer"
}
# task {
# name: "PIECEWISE_JERK_SPEED_NONLINEAR"
# type: "PiecewiseJerkSpeedNonlinearOptimizer"
# }
}

3.8 编译插件

buildtool build -p modules/planning/

原创声明,本文由作者授权发布于Apollo开发者社区,未经许可,不得转载。
发表评论已发表 0 条评论
登录后可评论,请前往 登录
暂无评论~快去发表自己的独特见解吧!
目录
场景描述:
评判标准:
技术详解
交汇路口场景解析
交汇路口减速策略:
生成插件文件模版
3.2 写JunctionSpeedLimit类代码文件以及配置相应BUILD文件
3.2写JunctionSpeedLimit类代码文件以及配置相应BUILD文件
3.3 配置参数文件
3.4 写插件参数文件
3.5 配置cyberfile.xml
3.7 配置plugin.xml
3.7 加入新增插件至配置参数中