Apollo自动驾驶项目:限速区域场景仿真调试实践指南

Apollo自动驾驶项目:限速区域场景仿真调试实践指南

apollo An open autonomous driving platform apollo 项目地址: https://gitcode.com/gh_mirrors/apo/apollo

概述

在自动驾驶系统中,规划模块(Planning)负责生成安全、舒适且符合交通规则的行驶轨迹。本文将详细介绍如何在Apollo自动驾驶系统中实现限速区域场景的仿真调试,重点讲解如何开发一个自定义的交通规则(traffic rule)插件来实现特定区域的限速功能。

交通规则插件基础

规划模块插件分类

Apollo规划模块中的插件主要分为三类:

  1. Scenario插件:判断车辆当前所处的驾驶场景
  2. Task插件:执行具体的规划任务
  3. 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

效果验证

在仿真环境中,可以观察到:

  1. 正常行驶时,车辆保持原速(如23km/h)
  2. 进入交汇路口区域时,速度自动降至设定值(如10km/h)

通过调整default_conf.pb.txt中的参数,可以灵活控制限速区域的范围和限速值。

总结

本文详细介绍了在Apollo自动驾驶系统中开发限速区域插件的完整流程。通过这个实践,开发者可以掌握:

  1. Traffic Rule插件的工作原理
  2. 如何创建和配置自定义插件
  3. 限速功能的实现方法
  4. 插件调试和验证过程

这种模块化的设计使得交通规则的扩展和维护变得简单高效,为自动驾驶系统应对复杂交通场景提供了灵活的技术方案。

apollo An open autonomous driving platform apollo 项目地址: https://gitcode.com/gh_mirrors/apo/apollo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郝钰程Kacey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值