Apollo控制部分2-- ControllerAgent 控制器管理

news2024/11/25 23:44:35

Apollo控制部分2-- ControllerAgent 控制器管理

    • 摘要
    • 一、预备知识
      • 1、控制模块预备知识
      • 2、多态
    • 二、控制器管理解析
      • 1、初始化函数(配置文件参数决定控制器)
        • 1)配置文件:"/apollo/modules/control/conf/control_conf.pb.txt"
        • 2)控制器管理器初始化
        • 3)控制器初始化
      • 2、计算控制命令
    • 三、总结

@author:Wutong
@time:2023-03-06 23:48

在这里插入图片描述

摘要

本文介绍了Apollo控制模块所使用的控制方式,包括横向控制器+纵向控制器MPC控制器两种方式。

  1. 横向控制器(LatController) +纵向控制器(LonController)
  2. MPC控制器(MPCController)

之后通过代码介绍了控制器初始化方式、控制器管理方式以及如何通过c++多态特性创建不同控制器对象。

一、预备知识

1、控制模块预备知识

上一讲的知识需要掌握:
Apollo控制部分1-- ControlComponent组件介绍

2、多态

c++多态教程
在c++多态教程中有这样一句话:“有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的”。这正对应我们的控制器模块,我们有LatController、LonController和MPCController三个不同的类,都带有函数名称相同、函数参数相同、但实现方式不同的函数,比如控制器初始化Init(),计算控制命令ComputeControlCommand()函数。

  // 三个控制器初始化均通过
  virtual common::Status Init(std::shared_ptr<DependencyInjector> injector,
                              const ControlConf *control_conf) = 0;
  
  // 三个控制器均采用相同的函数参数,如定位信息、底盘信息、轨迹信息
  // 输出结果不同:MPC控制器->转角,油门
  // 			Lon控制器->油门		
  // 			Lat控制器->转角
  virtual common::Status ComputeControlCommand(
      const localization::LocalizationEstimate *localization,
      const canbus::Chassis *chassis, const planning::ADCTrajectory *trajectory,
      control::ControlCommand *cmd) = 0;

二、控制器管理解析

1、初始化函数(配置文件参数决定控制器)

1)配置文件:“/apollo/modules/control/conf/control_conf.pb.txt”

功能:active_controllers为控制模块使用的控制器,示例中配置的是横向控制器LAT_CONTROLLER和纵向控制器LON_CONTROLLER,使用横向控制器的转角等结果和纵向控制器的油门等结果作为最终输出。

active_controllers: LAT_CONTROLLER
active_controllers: LON_CONTROLLER

2)控制器管理器初始化

// 此容器保存控制器指针
std::vector<std::unique_ptr<Controller>> controller_list_;
/*
(1)横向控制器+纵向控制器
参数配置文件如下:
active_controllers: LAT_CONTROLLER
active_controllers: LON_CONTROLLER
controller_list_经过上面两个函数处理结果为两个指针(指向横向控制器和指向纵向控制器)

(2)MPC控制器
参数配置文件如下:
active_controllers: MPC_CONTROLLER
controller_list_经过上面两个函数处理结果为一个指针(指向MPC控制器)
*/

通过如下两个函数使用工厂方法创建多态继承类,即创建纵向控制器和横向控制器,并将创建的控制器结果存储在controller_list_

// 注册控制器,根据此配置文件声明两个控制器:LAT_CONTROLLER和LON_CONTROLLER
void ControllerAgent::RegisterControllers(const ControlConf *control_conf){};

// 创建LAT_CONTROLLER和LON_CONTROLLER对象,便于后续使用
Status ControllerAgent::InitializeConf(const ControlConf *control_conf){};

注释:根据配置文件创建控制器对象,代码中通过工厂方式注册和创建多态类较难,如果阅读困难可以直接跳过上面两个函数阅读,直接记住controller_list_结果。

3)控制器初始化

初始化controller_list_中的所有控制器,控制器初始化函数会在之后分析各个控制器时具体分析

for (auto &controller : controller_list_) {
    if (controller == nullptr) {
      return Status(ErrorCode::CONTROL_INIT_ERROR, "Controller is null.");
    }
    if (!controller->Init(injector, control_conf_).ok()) {
      AERROR << "Controller <" << controller->Name() << "> init failed!";
      return Status(ErrorCode::CONTROL_INIT_ERROR,
                    "Failed to init Controller:" + controller->Name());
    }
    AINFO << "Controller <" << controller->Name() << "> init done!";
  }

2、计算控制命令

计算控制命令

  • (1)横向控制器计算转角等信息,纵向控制器计算油门等信息(二者分别计算)
  • (2)MPC控制器对油门和转角信息等信息都计算

此示例中controller_list_包含横向控制器和纵向控制器,通过for循环调用两个控制器计算相应的命令。

  // 每个控制器均计算命令
  for (auto &controller : controller_list_) {
    ADEBUG << "controller:" << controller->Name() << " processing ...";
    double start_timestamp = Clock::NowInSeconds();

	// 调用控制器计算控制命令
    controller->ComputeControlCommand(localization, chassis, trajectory, cmd);
    double end_timestamp = Clock::NowInSeconds();
    const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;

    ADEBUG << "controller: " << controller->Name()
           << " calculation time is: " << time_diff_ms << " ms.";
    
    // 计算时延赋值 
    cmd->mutable_latency_stats()->add_controller_time_ms(time_diff_ms);
  }

三、总结

本文介绍了Apollo控制模块所使用的控制方式,包括横向控制器+纵向控制器MPC控制器两种方式。通过代码介绍了控制器初始化方式、控制器管理方式以及如何通过c++多态特性创建不同控制器对象。之后将分别讲解横向、纵向、MPC控制器。

有任何意见或者任何问题都可以联系我!我会尽全力解决的!谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

借助Spire.PDF,这家企业低成本实现在线文档签名和量打印

“公司主要是做跨国运输业务的&#xff0c;我们的客户在邮寄过程中需要提交和下载的确认材料非常多&#xff0c;这些材料大多需要客户分别下载后再手写签字确认上传&#xff0c;这导致我们订单操作效率非常低&#xff0c;还容易导致系统卡顿&#xff0c;我们一直在寻找合性能稳…

【C++】BloomFilter——布隆过滤器

文章目录一、布隆过滤器概念二、布隆过滤器应用三、布隆过滤器实现1.插入2.查找3.删除四、布隆过滤器优缺五、结语一、布隆过滤器概念 布隆过滤器是由布隆&#xff08;Burton Howard Bloom&#xff09;在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构&#xff0c;特点是…

从互联网科技到手机厂商,谁能扮演好孩子们的“辅导老师”?

【潮汐商业评论/ 原创】“ 没想到现在小孩子的学习机花样这么多&#xff0c;从配置到内容&#xff0c;挑得我是眼花缭乱&#xff0c;跟咱们那会儿一台复读机就能搞定学习完全不一样&#xff01;”80后的Gavin最近苦于为自己要上小学的孩子选购一台合适的学习机。本想是一件很容…

Process Monitor工具使用实验(23)

实验目的 学习Process Monitor实用小工具的使用&#xff0c;学会利用Process Monitor工具观察程序进程/线程、文件系统、注册表、网络连接等的活动。预备知识 Process Monitor是一个Windows系统下先进的监视工具&#xff0c;它可以显示文件系统、注册表、网络连接、进程…

操作系统基础知识介绍之Mixed CriticalitySystems——混合关键系统

一、发展背景 在嵌入式场景中&#xff0c;虽然Linux已经得到了广泛应用&#xff0c;但并不能覆盖所有需求&#xff0c;例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统 的用武之地。有些应用场景既需要Linux的管理能力、丰富的生态又需要实时操作系统的高实时、…

spring加载bean流程解析

spring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典、优秀的框架&#xff0c;它的复杂程度往往令人望而却步。不过作为朝夕相处的框架&#xff0c;我们必须得明白一个问题就是spring是如何加载bean的&#xff0c;我们常在开发中使用的注解…

机器人工程专业师生的第二张名片

课堂上多次提及第二张名片。什么是CatGPT-使用效果如何-专业感性非理性总结如下&#xff1a;机器人工程的工作与考研之困惑→汇总篇←其中包括&#xff1a;☞ 机器人工程的工作与考研之困惑“卷”☞ 机器人工程的工作与考研之困惑“歧视”☞ 机器人工程的工作与考研之困惑“取舍…

62-63-64 - 进程互斥锁Mutex的初步实现

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题2. 系统调用重设计2.1 互斥锁系统调用功能设计2.2 整体调用流程2.3 编程实验&#xff1a;互斥锁模块的创建2.4 思考3. 在内核态实现互斥锁功能的考虑3.1 互斥锁内核数据结构及接口实现3.1.1 创建互斥锁3.1.2 销毁互斥锁3.1.3…

Java 字符串String 在堆,栈,常量池中

一、Java程序的运行会涉及以下的内存区域: 寄存器&#xff1a;JVM内部虚拟寄存器&#xff0c;存取速度非常快&#xff0c;程序不可控制。 栈&#xff1a;存放基本类型的数据和对象的引用&#xff0c;但对象本身不存放在栈中&#xff0c;而是存放在堆中。 堆&#xff1a;存放n…

全同态加密:FHEW

参考资料&#xff1a; Micciancio D, Peikert C. Trapdoors for Lattices: Simpler, Tighter, Faster, Smaller[C]//Eurocrypt. 2012, 7237: 700-718.Alperin-Sheriff J, Peikert C. Faster bootstrapping with polynomial error[C]//Advances in Cryptology–CRYPTO 2014: 34…

css盒模型详解

一、引言 盒模型是网页开发中的一个基本概念&#xff0c;它描述了网页元素的外观和大小。盒模型由内容区域、内边距、边框和外边距四个部分组成&#xff0c;这些部分的大小和位置都可以通过CSS进行控制。在本文中&#xff0c;我们将介绍盒模型的概念和作用&#xff0c;并提出本…

一、SpringMVC概述

1.什么是SpringMVC 基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP. 什么是MVC?   一种开发模式,模型视图控制器的简称.所有的web应用都是基于MVC开发.   M:模型层,包含实体类,业务逻辑层,数据访问层   V:视图层,html,javaScript,vue等都…

MySQL安装和配置

下载官网下载mysql解压版本&#xff1a;配置环境变量下载完成后直接解压到需要放的文件夹&#xff0c;根据文件夹来配置环境变量&#xff1b;新建系统变量&#xff0c;变量名自取&#xff0c;值是MySQL的目录编辑path环境变量&#xff0c;加上MySQL的bin目录 %MYSQL_HOME%\bin配…

【python】序列(列表、元组)、字典、集合的初步认识

一、序列 序列类型(sequence)&#xff1a;一组有序的数据集&#xff0c;特点是数据之间存在先后关系&#xff0c;通过序号访问 序列包含以下三种类型&#xff1a; 1.字符串&#xff08;str&#xff09;不可修改 2.列表&#xff08;list&#xff09;可修改 3.元组&#xff08;t…

基于java的高校辅导员工作管理系统

摘 要网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于高校辅导员工作管理将是又一个传统管理到智能化信息管理的改革&#xff0c;设计高校辅导员工作管理系统的目的就是借助计算机让复杂的班级信息、学籍信息等管…

如何使用JSR 303 进行后台数据校验?

文章目录一、JSR 3031、什么是 JSR 303&#xff1f;2、为什么使用 JSR 303&#xff1f;3、JSR 303 常见操作&#xff1f;二、使用 JSR 303 相关注解处理逻辑1、JSR 303 注解处理逻辑1.1 使用步骤1.2 实际应用2 、JSR 303 分组校验2.1 为什么使用 分组校验&#xff1f;2.2 使用步…

软件设计师教程(八)计算机系统知识-软件工程基础知识

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;…

【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)

早点睡兄弟&#xff0c;别一天到晚就熬夜。 文章目录一、通过list迭代器来感受类和对象以及类封装的思想1.迭代器的特征和本质是什么&#xff1f;&#xff08;两大特征&#xff1a;类的内嵌类型&#xff0c;行为像指针。本质&#xff1a;内置类型定义的变量或自定义类型实例化…

Linux命令·less

less 工具也是对文件或其它输出进行分页显示的工具&#xff0c;应该说是linux正统查看文件内容的工具&#xff0c;功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候&#xff0c;我们并没有办法向前面翻&#xff0c; 只能往后面看&#xff0c;但若使用了 less …

Java Stream 如何提高遍历集合效率?

目录什么是 Stream&#xff1f;Stream 如何优化遍历&#xff1f;Stream 源码实现内部实现Stream 并行处理什么是 Stream&#xff1f; Stream 的聚合操作与数据库 SQL 的聚合操作 sorted、filter、map 等类似。我们在应用层就可以高效地实现类似数据库 SQL 的聚合操作了&#x…