/****************Apollo源码分析****************************
Copyright 2018 The File Authors & zouyu. All Rights Reserved.
Contact with: 1746430162@qq.com 181663309504
源码主要是c++实现的,也有少量python,git下载几百兆,其实代码不太多,主要是地图和数据了大量空间,主要程序
在apollo/modules目录中,
在apollo/modules目录中,
我们把它分成以下几部分(具体说明见各目录下的modules):
感知:感知当前位置,速度,障碍物等等
Apollo/modules/perception
预测:对场景下一步的变化做出预测
Apollo/modules/prediction
规划:
(1) 全局路径规划:通过起点终点计算行驶路径
Apollo/modules/routing
(2) 规划当前轨道:通过感知,预测,路径规划等信息计算轨道
Apollo/modules/planning
(3) 规划转换成命令:将轨道转换成控制汽车的命令(加速,制动,转向等)
Apollo/modules/control
其它
(1) 输入输出
i. Apollo/modules/drivers 设备驱动
ii. Apollo/modules/localization 位置信息
iii. Apollo/modules/monitor 监控模块
iv. Apollo/modules/canbus 与汽车硬件交互
v. Apollo/modules/map 地图数据
vi. Apollo/modules/third_party_perception 三方感知器支持
(2) 交互
i. Apollo/modules/dreamview 可视化模块
ii. Apollo/modules/hmi 把汽车当前状态显示给用户
(3) 工具
i. Apollo/modules/calibration 标注工具
ii. Apollo/modules/common 支持其它模块的公共工具
iii. Apollo/modules/data 数据工具
iv. Apollo/modules/tools 一些Python工具
(4) 其它
i. Apollo/modules/elo 高精度定位系统,无源码,但有文档
ii. Apollo/modules/e2e 收集传感器数据给PX2,ROS
自动驾驶系统先通过起点终点规划出整体路径(routing);然后在行驶过程中感知(perception)当前环境
(识别车辆行人路况标志等),并预测下一步发展;然后把已知信息都传入规划模块(planning),规划出之后的轨道;
控制模块(control)将轨道数据转换成对车辆的控制信号,通过汽车交互模块(canbus)控制汽车.
(识别车辆行人路况标志等),并预测下一步发展;然后把已知信息都传入规划模块(planning),规划出之后的轨道;
控制模块(control)将轨道数据转换成对车辆的控制信号,通过汽车交互模块(canbus)控制汽车.
我觉得这里面算法技术含量最高的是感知perception和规划planning,具体请见本博客中各模块的分析代码。
/****************************************************************************************
/******************************************************************************
* Copyright 2017 The Apollo Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*****************************************************************************/
#include "modules/perception/perception.h"
#include "ros/include/ros/ros.h"
#include "modules/common/adapters/adapter_manager.h"
#include "modules/common/log.h"
#include "modules/perception/common/perception_gflags.h"
#include "modules/perception/lib/config_manager/config_manager.h"
#include "modules/perception/obstacle/base/object.h"
#include "modules/perception/obstacle/onboard/fusion_subnode.h"
#include "modules/perception/obstacle/onboard/lidar_process_subnode.h"
#include "modules/perception/obstacle/onboard/object_shared_data.h"
#include "modules/perception/obstacle/onboard/radar_process_subnode.h"
#include "modules/perception/traffic_light/onboard/tl_preprocessor_subnode.h"
#include "modules/perception/traffic_light/onboard/tl_proc_subnode.h"
namespace apollo {
namespace perception {
using apollo::common::adapter::AdapterManager;
using apollo::common::Status;
using apollo::common::ErrorCode;
std::string Perception::Name() const { return "perception"; }
Status Perception::Init() {
AdapterManager::Init(FLAGS_perception_adapter_config_filename);
RegistAllOnboardClass();
/// init config manager
ConfigManager* config_manager = ConfigManager::instance();
if (!config_manager->Init()) {
AERROR << "failed to Init ConfigManager";
return Status(ErrorCode::PERCEPTION_ERROR, "failed to Init ConfigManager.");
}
AINFO << "Init config manager successfully, work_root: "
<< config_manager->WorkRoot();
const std::string dag_config_path = apollo::common::util::GetAbsolutePath(
FLAGS_work_root, FLAGS_dag_config_path);
if (!dag_streaming_.Init(dag_config_path)) {
AERROR << "failed to Init DAGStreaming. dag_config_path:"
<< dag_config_path;
return Status(ErrorCode::PERCEPTION_ERROR, "failed to Init DAGStreaming.");
}
callback_thread_num_ = 5;
return Status::OK();
}
void Perception::RegistAllOnboardClass() {
/// regist sharedata
RegisterFactoryLidarObjectData();
RegisterFactoryRadarObjectData();
traffic_light::RegisterFactoryTLPreprocessingData();
/// regist subnode
RegisterFactoryLidarProcessSubnode();
RegisterFactoryRadarProcessSubnode();
RegisterFactoryFusionSubnode();
traffic_light::RegisterFactoryTLPreprocessorSubnode();
traffic_light::RegisterFactoryTLProcSubnode();
}
Status Perception::Start() {
dag_streaming_.Start();
return Status::OK();
}
void Perception::Stop() {
dag_streaming_.Stop();
dag_streaming_.Join();
}
} // namespace perception
} // namespace apollo
/******************************************************************************
* Copyright 2017 The Apollo Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*****************************************************************************/
#include "modules/perception/perception.h"
#include "ros/include/ros/ros.h"
#include "modules/common/adapters/adapter_manager.h"
#include "modules/common/log.h"
#include "modules/perception/common/perception_gflags.h"
#include "modules/perception/lib/config_manager/config_manager.h"
#include "modules/perception/obstacle/base/object.h"
#include "modules/perception/obstacle/onboard/fusion_subnode.h"
#include "modules/perception/obstacle/onboard/lidar_process_subnode.h"
#include "modules/perception/obstacle/onboard/object_shared_data.h"
#include "modules/perception/obstacle/onboard/radar_process_subnode.h"
#include "modules/perception/traffic_light/onboard/tl_preprocessor_subnode.h"
#include "modules/perception/traffic_light/onboard/tl_proc_subnode.h"
//上面的头文件就不一一介绍了,在前面的分析中大部分都有所涉及。可以说这都是为了感知模的运行,进行的先行定义。
namespace apollo {
namespace perception {
using apollo::common::adapter::AdapterManager;//适配器管理
using apollo::common::Status;//状态定义
using apollo::common::ErrorCode;//错误码定义
std::string Perception::Name() const { return "perception"; }
Status Perception::Init() {//感知模块初始化
//void AdapterManager::Init(const std::string &adapter_config_filename) {
// Parse config file
// AdapterManagerConfig configs;
// CHECK(util::GetProtoFromFile(adapter_config_filename, &configs))
/// << "Unable to parse adapter config file " << adapter_config_filename;
// AINFO << "Init AdapterManger config:" << configs.DebugString();
// Init(configs);
//}这里被注释的是“adapter_manager.h adapter_manager.cc”中的一个函数,在这里就被用到了
AdapterManager::Init(FLAGS_perception_adapter_config_filename);
RegistAllOnboardClass();
/// init config manager 初始化所有配置管理
ConfigManager* config_manager = ConfigManager::instance();
if (!config_manager->Init()) {//这里的编程手法,有点像UNIX高级编程里的写法,有研究过这本书的朋友应该有同感
AERROR << "failed to Init ConfigManager";
return Status(ErrorCode::PERCEPTION_ERROR, "failed to Init ConfigManager.");
}
AINFO << "Init config manager successfully, work_root: "
<< config_manager->WorkRoot();
const std::string dag_config_path = apollo::common::util::GetAbsolutePath(//获得配置包的绝对路径
FLAGS_work_root, FLAGS_dag_config_path);
if (!dag_streaming_.Init(dag_config_path)) {
AERROR << "failed to Init DAGStreaming. dag_config_path:"
<< dag_config_path;
return Status(ErrorCode::PERCEPTION_ERROR, "failed to Init DAGStreaming.");
}
callback_thread_num_ = 5;
return Status::OK();
}
void Perception::RegistAllOnboardClass() {
/// regist sharedata
RegisterFactoryLidarObjectData();
RegisterFactoryRadarObjectData();
traffic_light::RegisterFactoryTLPreprocessingData();
/// regist subnode
RegisterFactoryLidarProcessSubnode();
RegisterFactoryRadarProcessSubnode();
RegisterFactoryFusionSubnode();
traffic_light::RegisterFactoryTLPreprocessorSubnode();
traffic_light::RegisterFactoryTLProcSubnode();
}
Status Perception::Start() {//开始感知,我的理解是所有的感知数据为变成ROS数据包的流形式发送出来,然后开始感知过程
dag_streaming_.Start();
return Status::OK();
}
void Perception::Stop() {//停止感知
dag_streaming_.Stop();
dag_streaming_.Join();
}
} // namespace perception
} // namespace apollo