apollo代码学习2.4——深度解析(control)

本文深入探讨了Apollo自动驾驶系统的control模块,重点关注纵向、横向控制器的初始化和使用。文章解释了控制器的注册过程,如何通过工厂模式创建并初始化控制器,以及ControllerAgent类在算法接口中的作用。通过对ComputeControlCommand()函数的分析,揭示了控制命令的生成流程,为理解Apollo控制算法的实现提供了详细指导。
摘要由CSDN通过智能技术生成

 前段时间总结了一下control模块工作的大致流程,但是还有很多遗留的问题,上次博客也有提及到,像单独模块的具体算法实现,消息主题的订阅与发布(ros如何进行改进)这两个问题。

 那么今天就来总结下第一个问题,具体算法的实现。

 从百度apollo开源的代码来看,控制模块的控制器有纵向控制器,横向控制器和mpc控制器三个,默认情况使用纵向和横向控制器,mpc没使用。下面是控制器的注册代码段。在之前介绍初始化流程中,提起到注册控制器函数接口。再次回顾一下。

1.控制器的初始化。

 

 // set controller
  if (!controller_agent_.Init(&control_conf_).ok()) {
    std::string error_msg = "Control init controller failed! Stopping...";
    buffer.ERROR(error_msg);
    return Status(ErrorCode::CONTROL_INIT_ERROR, error_msg);
  }                    ///生成一个控制器代理,这个接口实现注册control算法,并传入信号,实现模块功能的入口。

 函数controller_agent_.Init()开启了接入控制器的流程。然后找到具体代码就可以看到它的庐山真面目了。顺便提一下,apollo的control模块下的算法添加说明实际主要讲就是这部分的内容。好了,代码如下:

 

Status ControllerAgent::Init(const ControlConf *control_conf) {
  RegisterControllers();                                     ///注册控制器(这里使用了软件设计中的工厂模式)
  CHECK(InitializeConf(control_conf).ok()) << "Fail to initialize config.";      ///通过工厂模式进行生成所需要的控制器。
  for (auto &controller : controller_list_) {
    if (controller == NULL || !controller->Init(control_conf_).ok()) {       ///具体控制器的初始化接口(设定一些具体控制器参数)
      if (controller != NULL) {
        AERROR << "Controller <" << controller->Name() << "> init failed!";
  
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值