星火自动驾驶大赛赛事集锦--交汇路口减速慢行场景(方法二)
2024-06-14 13:441055770
场景描述:
主车在城市道路行驶时,行驶至交汇路口时为了保证行驶安全需降低速度至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,其主要流程为:
- 判断主车是否已经接近交汇路口
- 确认交汇路口重叠后,开始限制车速
- 当主车完全通过交汇路口后,取消速度限制
生成插件文件模版
输入下述指令,在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.hbuildtool 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.0backward_buffer: 2.0limit_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: truetask {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 加入新增插件至配置参数中