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

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

 

 

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

还是老样子为了与前面文章衔接,先看下总框架图吧:

 对于control模块,前面的已将其流程大致梳理,依旧先看下spin函数。

 

 

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;
}

 

 包括:开消息线程---->初始化模块---->开启---->输出flag参数---->消息处理开启---->循环处理并检测关闭---->关闭。其实对于其中最为复杂重要的步骤已经梳理完毕(初始化和开启),接着的输出flags参数就是类似文件流的功能,把control所设置好的参数放在一个control.flags文件中,熟悉apollo代码的人方便后续查看,排错。代码贴在下面。

 

/**
 * @brief:将模块的flags设置进行输出。
 * --log_dir=/apollo/data/log。
 * 对于control模块,具体可以直接去运行出来的目录中查看,/apollo/data/log/control.flags文件中查看。
 */
void ApolloApp::ExportFlags() const {
  const auto export_file = util::StrCat(FLAGS_log_dir, "/", Name(), ".flags");
  std::ofstream fout(export_file);
  CHECK(fout) << "Cannot open file " << export_file;

  std::vector<gflags::CommandLineFlagInfo> flags;
  gflags::GetAllFlags(&flags);
  for (const auto &flag : flags) {
    fout << "# " << flag.type << ", default=" << flag.default_value << "\n"
         << "# " << flag.description << "\n"
         << "--" << flag.name << "=" << flag.current_value << "\n"
         << std::endl;
  }
}

 

 后面的代码就是ros下的处理了,apollo使用ros::AsyncSpinner这个类来开线程,对于spinner.start就是其中的函数,最后的stop函数具体应该由模块子类中进行实现(有些模块为空)。

这样,control模块的大致流程就算是梳理好了,但是倘若想深入理解ros机制在apollo中的封装,模块里面具体

算法的实现与调用方式,仅仅靠这几篇博文就显得远远不够详细,其实际上还没有涉及到这些内容的梳理,那么后面我还将继续在这两方面进行总结,加深对apollo代码的理解。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值