Apollo自动驾驶项目:限速区域场景仿真调试实践指南
apollo An open autonomous driving platform 项目地址: https://gitcode.com/gh_mirrors/apo/apollo
概述
在自动驾驶系统中,规划模块(Planning)负责生成安全、舒适且符合交通规则的行驶轨迹。本文将详细介绍如何在Apollo自动驾驶系统中实现限速区域场景的仿真调试,重点讲解如何开发一个自定义的交通规则(traffic rule)插件来实现特定区域的限速功能。
交通规则插件基础
规划模块插件分类
Apollo规划模块中的插件主要分为三类:
- Scenario插件:判断车辆当前所处的驾驶场景
- Task插件:执行具体的规划任务
- Traffic Rule插件:处理各类交通规则
Traffic Rule插件工作原理
Traffic Rule插件的主要作用是将各种交通规则转化为两种输出类型:
- 停车(通过生成虚拟障碍物实现)
- 限速(设置特定区域的速度限制)
这些插件继承自TrafficRule基类,由planning_base中的traffic_decider负责创建和调用。每次规划周期中,traffic_decider都会调用所有已注册的traffic rule插件。
限速区域插件开发实践
开发目标
我们将开发一个名为region_speed_limit
的插件,实现在交汇路口区域的自动限速功能。当车辆驶入指定区域时,系统会自动降低车速至预设值。
开发步骤
1. 创建插件模板
使用以下命令创建插件基础结构:
buildtool create --template plugin \
--namespaces planning \
--name region-speed-limit \
--base_class_name TrafficRule modules/planning/traffic_rules/region_speed_limit \
--config_message_name RegionSpeedLimitConfig
生成的目录结构如下:
region_speed_limit/
├── region_speed_limit.cc
├── region_speed_limit.h
├── conf/
│ └── default_conf.pb.txt
├── proto/
│ ├── region_speed_limit.proto
│ └── BUILD
├── BUILD
├── plugin_region_speed_limit_description.xml
└── cyberfile.xml
2. 实现核心功能代码
region_speed_limit.h 头文件定义:
#pragma once
#include <memory>
#include "cyber/plugin_manager/plugin_manager.h"
#include "modules/common/status/status.h"
#include "modules/planning/traffic_rules/region_speed_limit/proto/region_speed_limit.pb.h"
#include "modules/planning/planning_base/traffic_rules_base/traffic_rule.h"
namespace apollo {
namespace planning {
class RegionSpeedLimit : public TrafficRule {
public:
bool Init(const std::string& name, const std::shared_ptr<DependencyInjector>& injector) override;
virtual ~RegionSpeedLimit() = default;
common::Status ApplyRule(Frame* const frame, ReferenceLineInfo* const reference_line_info);
void Reset() override {}
private:
RegionSpeedLimitConfig config_;
};
CYBER_PLUGIN_MANAGER_REGISTER_PLUGIN(apollo::planning::RegionSpeedLimit, TrafficRule)
} // namespace planning
} // namespace apollo
region_speed_limit.cc 实现文件:
#include <memory>
#include "modules/planning/traffic_rules/region_speed_limit/region_speed_limit.h"
namespace apollo {
namespace planning {
using apollo::common::Status;
using apollo::hdmap::PathOverlap;
bool RegionSpeedLimit::Init(const std::string& name, const std::shared_ptr<DependencyInjector>& injector) {
if (!TrafficRule::Init(name, injector)) {
return false;
}
return TrafficRule::LoadConfig<RegionSpeedLimitConfig>(&config_);
}
Status RegionSpeedLimit::ApplyRule(Frame* const frame, ReferenceLineInfo* const reference_line_info) {
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
3. 配置参数文件
region_speed_limit.proto 定义配置参数结构:
syntax = "proto2";
package apollo.planning;
message RegionSpeedLimitConfig {
optional double forward_buffer = 1 [default = 3]; // 区域前缓冲距离(米)
optional double backward_buffer = 2 [default = 2]; // 区域后缓冲距离(米)
optional double limit_speed = 3 [default = 5]; // 限速值(米/秒)
}
default_conf.pb.txt 设置具体参数值:
forward_buffer: 3.0
backward_buffer: 2.0
limit_speed: 15.0
4. 配置编译规则
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"])
apollo_plugin(
name = "libregion_speed_limit.so",
srcs = ["region_speed_limit.cc"],
hdrs = ["region_speed_limit.h"],
description = ":plugin_region_speed_limit_description.xml",
deps = [
"//cyber",
"//modules/map/pnc_map:path",
"//modules/planning/planning_base/common:frame",
"//modules/planning/planning_base/common:reference_line_info",
"//modules/planning/planning_base/traffic_rules_base:traffic_rules",
"//modules/planning/traffic_rules/region_speed_limit/proto:region_speed_limit_proto",
],
)
5. 注册插件
在traffic_rule_config.pb.txt
中添加新插件配置:
rule {
name: "REGION_SPEED_SETTING"
type: "RegionSpeedLimit"
}
6. 编译与测试
编译插件:
buildtool build -p modules/planning/traffic_rules/region_speed_limit/
启动仿真环境:
aem bootstrap start
效果验证
在仿真环境中,可以观察到:
- 正常行驶时,车辆保持原速(如23km/h)
- 进入交汇路口区域时,速度自动降至设定值(如10km/h)
通过调整default_conf.pb.txt
中的参数,可以灵活控制限速区域的范围和限速值。
总结
本文详细介绍了在Apollo自动驾驶系统中开发限速区域插件的完整流程。通过这个实践,开发者可以掌握:
- Traffic Rule插件的工作原理
- 如何创建和配置自定义插件
- 限速功能的实现方法
- 插件调试和验证过程
这种模块化的设计使得交通规则的扩展和维护变得简单高效,为自动驾驶系统应对复杂交通场景提供了灵活的技术方案。
apollo An open autonomous driving platform 项目地址: https://gitcode.com/gh_mirrors/apo/apollo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考