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

本文详细解析了Apollo自动驾驶系统中control模块的启动流程,重点介绍了Start()函数,包括创建定时器、检查数据通道、计算控制命令等关键步骤。通过分析代码,展示了如何调用ComputeControlCommand接口进行控制计算,并对异常情况进行处理。文章为控制模块的初步理解提供了清晰的指引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每次遇见复杂的事情总是在先寻找一种简单明了的方式进行研究,用一种浅显易懂的方式来表达。

 

 今天继续apollo代码中control模块的总结。

 好了,还是先看下总框架图吧:

回忆下上次的代码总结。如下:

 

int ApolloApp::Spin() {
  ros::AsyncSpinner spinner(callback_thread_num_);         ///开消息线程
  auto status = Init();                                    ///模块初始化(由子类具体重写的)
  if (!status.ok()) {
    AERROR << Name() << " Init failed: " << status;
    return -1;
  }
  status = Start();                                        ///模块开启(由子类具体重写的)
  if (!status.ok()) {
    AERROR << Name() << " Start failed: " << status;
    return -2;
  }
  ExportFlags();                                           ///输出一些flag参数
  spinner.start();                                         ///消息线程开启
  ros::waitForShutdown();                                  ///消息循环处理并检测关闭
  Stop();                                                  ///退出(由子类具体重写的)
  AINFO << Name() << " exited.";
  return 0;
}

 

 可以说百度的apollo代码框架非常规范,从上面的代码结构来看,control模块就是包括:开消息线程---->初始化模块---->开启---->输出flag参数---->消息处理开启---->循环处理并检测关闭---->关闭。但是有些步骤是比较复杂的,上次总结仅仅针对初始化,那么今天,开始总结下开始模块。

 开始模块主要的流程在文件control.cc中。下面来看。

 

///control模块开启
Status Control::Start() {
  // set initial vehicle state by cmd
  // need to sleep, because advertised channel is not ready immediately
  // simple test shows a short delay of 80 ms or so
  AINFO << "Control resetting vehicle state, sleeping for 1000 ms ...";                      
  usleep
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值