前段时间总结了一下control模块工作的大致流程,但是还有很多遗留的问题,上次博客也有提及到,像单独模块的具体算法实现,消息主题的订阅与发布(ros如何进行改进)这两个问题。
那么今天就来总结下第一个问题,具体算法的实现。
从百度apollo开源的代码来看,控制模块的控制器有纵向控制器,横向控制器和mpc控制器三个,默认情况使用纵向和横向控制器,mpc没使用。下面是控制器的注册代码段。在之前介绍初始化流程中,提起到注册控制器函数接口。再次回顾一下。
1.控制器的初始化。
// set controller
if (!controller_agent_.Init(&control_conf_).ok()) {
std::string error_msg = "Control init controller failed! Stopping...";
buffer.ERROR(error_msg);
return Status(ErrorCode::CONTROL_INIT_ERROR, error_msg);
} ///生成一个控制器代理,这个接口实现注册control算法,并传入信号,实现模块功能的入口。
函数controller_agent_.Init()开启了接入控制器的流程。然后找到具体代码就可以看到它的庐山真面目了。顺便提一下,apollo的control模块下的算法添加说明实际主要讲就是这部分的内容。好了,代码如下:
Status ControllerAgent::Init(const ControlConf *control_conf) {
RegisterControllers(); ///注册控制器(这里使用了软件设计中的工厂模式)
CHECK(InitializeConf(control_conf).ok()) << "Fail to initialize config."; ///通过工厂模式进行生成所需要的控制器。
for (auto &controller : controller_list_) {
if (controller == NULL || !controller->Init(control_conf_).ok()) { ///具体控制器的初始化接口(设定一些具体控制器参数)
if (controller != NULL) {
AERROR << "Controller <" << controller->Name() << "> init failed!";