apollo代码学习2.3——深度解析(control)
2018-01-29 11:31
351 查看
每次遇见复杂的事情总是在先寻找一种简单明了的方式进行研究,用一种浅显易懂的方式来表达。
今天继续apollo代码中control模块的总结。
还是老样子为了与前面文章衔接,先看下总框架图吧:
![](https://img-blog.csdn.net/20180129111613159?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2xhbmd3ag==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对于control模块,前面的已将其流程大致梳理,依旧先看下spin函数。
包括:开消息线程---->初始化模块---->开启---->输出flag参数---->消息处理开启---->循环处理并检测关闭---->关闭。其实对于其中最为复杂重要的步骤已经梳理完毕(初始化和开启),接着的输出flags参数就是类似文件流的功能,把control所设置好的参数放在一个control.flags文件中,熟悉apollo代码的人方便后续查看,排错。代码贴在下面。
后面的代码就是ros下的处理了,apollo使用ros::AsyncSpinner这个类来开线程,对于spinner.start就是其中的函数,最后的stop函数具体应该由模块子类中进行实现(有些模块为空)。
这样,control模块的大致流程就算是梳理好了,但是倘若想深入理解ros机制在apollo中的封装,模块里面具体
算法的实现与调用方式,仅仅靠这几篇博文就显得远远不够详细,其实际上还没有涉及到这些内容的梳理,那么后面我还将继续在这两方面进行总结,加深对apollo代码的理解。
今天继续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代码的理解。
相关文章推荐
- apollo代码学习2.4——深度解析(control)
- apollo代码学习2.1——深度解析(control)
- 十种深度学习算法要点及代码解析
- matlab:深度学习CNN matlab代码解析
- 代码解析深度学习系统编程模型:TensorFlow vs. CNTK
- 十种深度学习算法要点及代码解析
- 简易的深度学习框架Keras代码解析与应用
- 十种深度学习算法要点及代码解析
- 十种深度学习算法要点及代码解析
- Spring MVC学习总结(16)——SpringMVC运行流程深度解析(含代码)
- 深度学习框架caffe代码解析一:主要类的关系说明
- 简易的深度学习框架Keras代码解析与应用
- 搭积木般构建深度学习网络——Xception完整代码解析
- 代码解析深度学习系统编程模型:TensorFlow vs. CNTK
- Coursera deeplearning.ai 深度学习笔记2-2-Optimization algorithms-优化算法与代码实现
- 深度学习笔记1:end-to-end、anchor box解释、人体检测代码
- 10 大深度学习架构:计算机视觉优秀从业者必备(附代码实现)
- 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析学习笔记
- JUnit学习笔记2---解析controller实例代码
- 工程师必备,最好的九张机器学习&深度学习代码速查表