【Apollo源码分析】系列的第四部分【decision】
decision模块目前依然处于待完善的状态,代码大概有500行左右。
decision的输入:
- 障碍物信息。包括障碍物位置(x,y,z),障碍物移动速度(v),障碍物加速度(av),预测的障碍物移动轨迹节点。
- 车辆状态。包括车辆位置(x,y,z),车辆速度(v),加速度(v)
- 交通信号灯。状态(红/蓝/绿)
- 地图信息。
- 路径选择信息。
decision模块的主要作用是在上述的输入参数下根据决策算法产生decision 控制命令,向车辆发出控制命令。在可能的情况下,decision模块也会基于高精度地图,输出【预测障碍物移动】的结果。
decision的输出:
- Decision command ,针对车辆的控制信息,(车辆本身速度等)
- virtual obstacles ,预测的障碍物
- Decision command ,应付障碍物而发出的控制信息
decision/main.cc
先看main.cc的内容,只有一行代码。
APOLLO_MAIN(apollo::decision::Decision);
注册decision模块,并执行该模块的内容。
decision/decision.h
class Decision : public apollo::common::ApolloApp {
public:
std::string Name() const override;//模块名称
apollo::common::Status Init() override; //初始化操作
apollo::common::Status Start() override;//模块的内容
void Stop() override; //清理函数
virtual ~Decision() = default;
private:
void OnTimer(const ros::TimerEvent &event);//时间回调函数
void PublishDecision();//发布 Decision command 决策命令
private:
ros::Timer timer_;//时间
};
.cc文件:
std::string Decision::Name() const { return FLAGS_decision_module_name; }
///模块名称
// Decision command 模块的具体内容
common::Status Decision::Start() {
AdapterManager::Init();
const double duration = 1.0 / FLAGS_decision_publish_freq;// Decision command 模块发布决策的频率
timer_ = AdapterManager::CreateTimer(ros::Duration(duration), &Decision::OnTimer,this);
//定时回调Decision::OnTimer函数
return common::Status::OK();
}
//回调函数,该模块会按照设定好的频率定时回调此函数。
void Decision::OnTimer(const ros::TimerEvent &) { PublishDecision(); }
//发布决策命令Decision command
//通过下面可以看出,目前没有任何的命令发布出去。
void Decision::PublishDecision() {
DecisionResult decision_result;//空内容。
AdapterManager::FillDecisionHeader(Name(), decision_result.mutable_header());
AdapterManager::PublishDecision(decision_result);
//发布决策结果,但是并没有具体内容,还有待完善...
//也就是说目前只有一个框架,但是Decision command 是一片空白的。Apollo 1.0 目前的Decision 模块暂时没有发挥作用。
}
decision/common/decision_gflags.h
DECLARE_string(decision_module_name);
DECLARE_double(decision_publish_freq);
.cc文件
DEFINE_string(decision_module_name, "decision", "decision module name");//模块名称
DEFINE_double(decision_publish_freq, 10, "decision publishing frequency.");//决策频率
decision.proto
决策内容。挺长的,建议直接看decision.proto源码。下面是简单的注释。
syntax = "proto2";
package apollo.decision;
import "modules/common/proto/header.proto";
import "modules/common/proto/geometry.proto";
import "modules/prediction/proto/prediction_obstacle.proto";