每次遇见复杂的事情总是在先寻找一种简单明了的方式进行研究,用一种浅显易懂的方式来表达。
今天继续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