# Apollo 系统架构代码分析 以localization模块为例,其余模块节点类似。 ## 代码分析 主要文件: main.cc,apollo_app.cc,apollo_app.h。 ### mian.c文件 文件中只有一行代码:APOLLO_MAIN(apollo::localization::Localization) ,使用宏APOLLO_MAIN,开启了Localization节点,这里localization节点开始运行,这里的的节点与ros中的node概念一致,相当于一个进程。 ### APOLLO_MAIN宏解析: * APOLLO_MAIN宏定义位于"modules/common/apollo_app.h"文件。 * 设置log和SIGINT信号处理程序,收到信号,关闭本节点。 * 创建模块类对象,设置节点名字,调用基类(ApolloApp)的Spin()函数。 ### ApolloApp类: * Spin()函数属于类ApolloApp public成员函数,类ApolloApp是所有模块类的基类。 * Public成员有name()函数,用于获取模块名字。Spin()函数用于初始化、启动、当ros关闭时关闭模块节点。还有一个析构函数。 * Protected成员都是vritual接口,子类都会重写,在Spin()函数中调用,其实现实在具体各个模块内部。Init()函数完成加载模块的配置文件,创建订阅话题。Start()函数:注册回调函数,回调函数负责节点核心任务,通常由上游话题或者timer触发。Stop()函数,结束节点,正常时不会执行到。ReportModuleStatus()返回模块状态。apollo_app_sigint_handler()函数,信号处理函数。 * Spin()函数使用init(),start()和stop()函数完成模块节点的实现。此函数一般不会被重写,也就是使用ApolloApp的实现。