真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何進(jìn)行Planning模塊源代碼分析

本篇文章給大家分享的是有關(guān)如何進(jìn)行Planning 模塊源代碼分析,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。

虎林網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),虎林網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為虎林?jǐn)?shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的虎林做網(wǎng)站的公司定做!

規(guī)劃(Planning)模塊位于命名空間:apollo::planning,其作用在于構(gòu)建無(wú)人車(chē)從起點(diǎn)到終點(diǎn)的局部行駛路徑,具體而言,就是給定導(dǎo)航地圖、導(dǎo)航路徑、當(dāng)前定位點(diǎn)、車(chē)輛狀態(tài)、 周邊目標(biāo)的感知及預(yù)測(cè)信息,規(guī)劃模塊計(jì)算出可供控制模塊執(zhí)行的一條安全且舒適的行駛路徑。

規(guī)劃模塊輸出的路徑是局部路徑而非全局路徑。舉例,如無(wú)人車(chē)需從長(zhǎng)沙智能駕駛研究院行駛至長(zhǎng)沙高鐵南站,首先需借助Routing模塊輸出全局導(dǎo)航路徑,接下來(lái)才是規(guī)劃模塊基于全局導(dǎo)航路徑進(jìn)行一小段、一小段具體行駛路徑的規(guī)劃。

規(guī)劃模塊的作用是根據(jù)感知預(yù)測(cè)的結(jié)果,當(dāng)前的車(chē)輛信息和路況規(guī)劃出一條車(chē)輛能夠行駛的軌跡,這個(gè)軌跡會(huì)交給控制模塊,控制模塊通過(guò)油門(mén),剎車(chē)和方向盤(pán)使得車(chē)輛按照規(guī)劃的軌跡運(yùn)行。

前言

規(guī)劃模塊的軌跡是短期軌跡,即車(chē)輛短期內(nèi)行駛的軌跡,長(zhǎng)期軌跡是Routing模塊規(guī)劃出的導(dǎo)航軌跡,即起點(diǎn)到目的地的軌跡,規(guī)劃模塊會(huì)先生成導(dǎo)航軌跡,然后根據(jù)導(dǎo)航軌跡和路況的情況,沿著短期軌跡行駛,直到目的地。

規(guī)劃模塊內(nèi)部結(jié)構(gòu)及其與其他模塊的交互示意如下圖所示。

如何進(jìn)行Planning 模塊源代碼分析

模塊主入口

根據(jù)各功能模塊的啟動(dòng)過(guò)程的分析,Planning模塊的主入口為:

int main(int argc, char** argv) {
 2  google::SetUsageMessage("we use this program to load dag and run user apps.");
 3
 4  // parse the argument
 5  ModuleArgument module_args;
 6  module_args.ParseArgument(argc, argv);
 7
 8  // initialize cyber
 9  apollo::cyber::Init(argv[0]);
10
11  // start module
12  ModuleController controller(module_args);
13  if (!controller.Init()) {
14    controller.Clear();
15    AERROR << "module start error.";
16    return -1;
17  }
18
19  apollo::cyber::WaitForShutdown();
20  controller.Clear();
21  AINFO << "exit mainboard.";
22
23  return 0;
24}

Main函數(shù)十分簡(jiǎn)單,首先是解析參數(shù),初始化Cyber環(huán)境,接下來(lái)創(chuàng)建一個(gè)ModuleController類(lèi)對(duì)象controller,之后調(diào)用controller.Init()啟動(dòng)相關(guān)功能模塊。進(jìn)入Cyber RT的消息循環(huán),等待cyber::WaitForShutdown()返回,清理資源并退出Main函數(shù)。ModuleController::Init()函數(shù)內(nèi)部調(diào)用了ModuleController::LoadAll()函數(shù):


1bool ModuleController::LoadAll() {
 2  const std::string work_root = common::WorkRoot();
 3  const std::string current_path = common::GetCurrentPath();
 4  const std::string dag_root_path = common::GetAbsolutePath(work_root, "dag");
 5
 6  for (auto& dag_conf : args_.GetDAGConfList()) {
 7    std::string module_path = "";
 8    if (dag_conf == common::GetFileName(dag_conf)) {
 9      // case dag conf argument var is a filename
10      module_path = common::GetAbsolutePath(dag_root_path, dag_conf);
11    } else if (dag_conf[0] == '/') {
12      // case dag conf argument var is an absolute path
13      module_path = dag_conf;
14    } else {
15      // case dag conf argument var is a relative path
16      module_path = common::GetAbsolutePath(current_path, dag_conf);
17      if (!common::PathExists(module_path)) {
18        module_path = common::GetAbsolutePath(work_root, dag_conf);
19      }
20    }
21    AINFO << "Start initialize dag: ">
 

上述函數(shù)處理一個(gè)dag_conf配置文件循環(huán),讀取配置文件中的所有dag_conf,并逐一調(diào)用bool ModuleController::LoadModule(const std::string& path)函數(shù)加載功能模塊。

對(duì)象的創(chuàng)建過(guò)程如何進(jìn)行Planning 模塊源代碼分析

進(jìn)一步展開(kāi):

 1#define CLASS_LOADER_REGISTER_CLASS_INTERNAL(Derived, Base, UniqueID)         \
 2  namespace {                                                                 \
 3  struct ProxyType##UniqueID {                                                \
 4    ProxyType##UniqueID() {                                                   \
 5      apollo::cyber::class_loader::utility::RegisterClass(     \
 6          #Derived, #Base);                                                   \
 7    }                                                                         \
 8  };                                                                          \
 9  static ProxyType##UniqueID g_register_class_##UniqueID;                     \
10  }

將PlanningComponent代入,最終得到:

1  namespace {                                                                 
2  struct ProxyType__COUNTER__ {                                                
3    ProxyType__COUNTER__() {                                                   
4      apollo::cyber::class_loader::utility::RegisterClass( 
5          "PlanningComponent", "apollo::cyber::ComponentBase");                                                   
6    }                                                                         
7  };                                                                          
8  static ProxyType__COUNTER__ g_register_class___COUNTER__;                     
9  }

創(chuàng)建一個(gè)模板類(lèi)utility::ClassFactory對(duì)象new_class_factrory_obj,為其添加類(lèi)加載器,設(shè)置加載庫(kù)的路徑,將工廠類(lèi)對(duì)象加入到ClassClassFactoryMap對(duì)象factory_map統(tǒng)一管理。通過(guò)該函數(shù),Cyber使用工廠方法模式完成產(chǎn)品類(lèi)對(duì)象的創(chuàng)建:

如何進(jìn)行Planning 模塊源代碼分析

動(dòng)態(tài)創(chuàng)建過(guò)程

第一部分介紹模塊主入口時(shí),提及bool ModuleController::LoadModule(const std::string& path)函數(shù),正是該函數(shù)動(dòng)態(tài)創(chuàng)建出了apollo::planning::PlanningComponent類(lèi)對(duì)象。

函數(shù)內(nèi)部調(diào)用分析如下:

1bool ModuleController::LoadModule(const std::string& path) {
2  DagConfig dag_config;
3  if (!common::GetProtoFromFile(path, &dag_config)) {
4    AERROR << "Get proto failed, file: ">

上述函數(shù)從磁盤(pán)配置文件讀取配置信息,并調(diào)用bool ModuleController::LoadModule(const DagConfig& dag_config)函數(shù)加載功能模塊:


 1bool ModuleController::LoadModule(const DagConfig& dag_config) {
 2  const std::string work_root = common::WorkRoot();
 3
 4  for (auto module_config : dag_config.module_config()) {
 5    std::string load_path;
 6    // ...
 7    class_loader_manager_.LoadLibrary(load_path);
 8    for (auto& component : module_config.components()) {
 9      const std::string& class_name = component.class_name();
10      std::shared_ptr base =
11          class_loader_manager_.CreateClassObj(class_name);
12      if (base == nullptr) {
13        return false;
14      }
15
16      if (!base->Initialize(component.config())) {
17        return false;
18      }
19      component_list_.emplace_back(std::move(base));
20    }
21
22    // ...
23  }
24  return true;
25}
 

工廠類(lèi)對(duì)象指針找到后,使用classobj = factory->CreateObj();就順理成章地將PlanningComponent類(lèi)對(duì)象創(chuàng)建出來(lái)了。

具體規(guī)劃算法分析如何進(jìn)行Planning 模塊源代碼分析

PublicRoadPlanner規(guī)劃算法

PublicRoadPlanner算法從Routing模塊輸出的高精地圖Lane序列獲得全局導(dǎo)航路徑。

如何進(jìn)行Planning 模塊源代碼分析

基于場(chǎng)景、階段和任務(wù)的理念進(jìn)行規(guī)劃,優(yōu)點(diǎn)是能合理有效地應(yīng)對(duì)每種場(chǎng)景,易于擴(kuò)充,并且基于配置文件動(dòng)態(tài)增減場(chǎng)景、階段及使用的任務(wù),靈活性強(qiáng);缺點(diǎn)是可能會(huì)遺漏一些特殊場(chǎng)景,但可通過(guò)不斷擴(kuò)充新的場(chǎng)景加以解決。

該算法的主要執(zhí)行流程如下:

如何進(jìn)行Planning 模塊源代碼分析

可借助GDB調(diào)試命令對(duì)上述執(zhí)行流程進(jìn)行更為深入的理解,例如TrafficLightProtectedStageApproach階段的PathLaneBorrowDecider任務(wù)的調(diào)用堆棧,從下往上看,對(duì)于任意一個(gè)任務(wù)的調(diào)用流程一目了然:

#0  apollo::planning::PathLaneBorrowDecider::Process (this=0x7f8c28294460, frame=0x7f8c38029f70, 
 2    reference_line_info=0x7f8c3802b140) at modules/planning/tasks/deciders/path_lane_borrow_decider/path_lane_borrow_decider.cc:39
 3#1  0x00007f8c0468b7c8 in apollo::planning::Decider::Execute (this=0x7f8c28294460, frame=0x7f8c38029f70, 
 4    reference_line_info=0x7f8c3802b140) at modules/planning/tasks/deciders/decider.cc:31
 5#2  0x00007f8c065c4a01 in apollo::planning::scenario::Stage::ExecuteTaskOnReferenceLine (this=0x7f8c28293eb0, 
 6    planning_start_point=..., frame=0x7f8c38029f70) at modules/planning/scenarios/stage.cc:96
 7#3  0x00007f8c06e721da in apollo::planning::scenario::traffic_light::TrafficLightProtectedStageApproach::Process (
 8    this=0x7f8c28293eb0, planning_init_point=..., frame=0x7f8c38029f70) at 
 9    modules/planning/scenarios/traffic_light/protected/stage_approach.cc:48
10#4  0x00007f8c067f1732 in apollo::planning::scenario::Scenario::Process (
11    this=0x7f8c2801bf20, planning_init_point=..., frame=0x7f8c38029f70) 
12    at modules/planning/scenarios/scenario.cc:76
13#5  0x00007f8c186e153a in apollo::planning::PublicRoadPlanner::Plan (
14    this=0x23093de0, planning_start_point=..., frame=0x7f8c38029f70, 
15    ptr_computed_trajectory=0x7f8b9a5fbed0) at modules/planning/planner/public_road/public_road_planner.cc:51
16#6  0x00007f8c19ee5937 in apollo::planning::OnLanePlanning::Plan (
17    this=0x237f3b0, current_time_stamp=1557133995.3679764, stitching_trajectory=std::vector of length 1, 
18    capacity 1 = {...}, ptr_trajectory_pb=0x7f8b9a5fbed0)  at modules/planning/on_lane_planning.cc:436
19#7  0x00007f8c19ee40fa in apollo::planning::OnLanePlanning::RunOnce (
20    this=0x237f3b0, local_view=..., ptr_trajectory_pb=0x7f8b9a5fbed0) at modules/planning/on_lane_planning.cc:304
21#8  0x00007f8c1ab0d494 in apollo::planning::PlanningComponent::Proc (
22    this=0x1d0f310, prediction_obstacles=std::shared_ptr (count 4, weak 0) 0x7f8b840164f8, 
23    chassis=std::shared_ptr (count 4, weak 0) 0x7f8b84018a08, 
24    localization_estimate=std::shared_ptr (count 4, weak 0) 0x7f8b8400d3b8) at modules/planning/planning_component.cc:134
25#9  0x00007f8c1abb46c4 in apollo::cyber::Component
26    apollo::canbus::Chassis, apollo::localization::LocalizationEstimate, apollo::cyber::NullType>::Process (this=0x1d0f310, 
27    msg0=std::shared_ptr (count 4, weak 0) 0x7f8b840164f8, msg1=std::shared_ptr (count 4, weak 0) 0x7f8b84018a08, 
28    msg2=std::shared_ptr (count 4, weak 0) 0x7f8b8400d3b8) at ./cyber/component/component.h:291
29#10 0x00007f8c1aba2698 in apollo::cyber::Component
30    apollo::canbus::Chassis, apollo::localization::LocalizationEstimate, apollo::cyber::NullType>::Initialize(
31    apollo::cyber::proto::ComponentConfig const&)::{lambda(std::shared_ptr const&,     
32    std::shared_ptr const&, std::shared_ptr const&)#2}::operator()
33    (std::shared_ptr const&, std::shared_ptr const&, 
34    std::shared_ptr const&) const (__closure=0x2059a430, 
35    msg0=std::shared_ptr (count 4, weak 0) 0x7f8b840164f8, msg1=std::shared_ptr (count 4, weak 0) 0x7f8b84018a08,     
36    msg2=std::shared_ptr (count 4, weak 0) 0x7f8b8400d3b8) at ./cyber/component/component.h:378
37#11 0x00007f8c1abb4ad2 in apollo::cyber::croutine::RoutineFactory apollo::cyber::croutine::CreateRoutineFactory
38    ::Initialize(
41    apollo::cyber::proto::ComponentConfig const&)::{lambda(std::shared_ptr const&, 
42    std::shared_ptr const&, std::shared_ptr const&)#2}&>
43    (apollo::cyber::Component::Initialize(apollo::cyber::proto::ComponentConfig const&)::
45    {lambda(std::shared_ptr const&, std::shared_ptr const&, 
46    std::shared_ptr const&)#2}&, 
47    std::shared_ptr > const&)::
49    {lambda()#1}::operator()() const::{lambda()#1}::operator()() const (__closure=0x2059a420) at ./cyber/croutine/routine_factory.h:108
50#12 0x00007f8c1ac0466a in std::_Function_handler
51apollo::cyber::croutine::CreateRoutineFactory::Initialize(apollo::cyber::proto::ComponentConfig const&)::{lambda(std::shared_ptr const&, 
54std::shared_ptr const&, std::shared_ptr const&)#2}&>
55(apollo::cyber::Component::Initialize(apollo::cyber::proto::ComponentConfig const&)::{lambda(std::shared_ptr const&, 
57std::shared_ptr const&, std::shared_ptr const&)#2}&, 
58std::shared_ptr > const&)::{lambda()#1}::operator()() const::{lambda()#1}>::_M_invoke(std::_Any_data const&) (__functor=...) at 
60/usr/include/c++/4.8/functional:2071
61#13 0x00007f8c5f5b86e8 in std::function::operator()() const (this=0x205f1160) at /usr/include/c++/4.8/functional:2471
62#14 0x00007f8c57560cbc in apollo::cyber::croutine::CRoutine::Run (this=0x205f1148) at ./cyber/croutine/croutine.h:143
63#15 0x00007f8c5755ff55 in apollo::cyber::croutine::(anonymous namespace)::CRoutineEntry (arg=0x205f1148) at cyber/croutine/croutine.cc:43

所有規(guī)劃算法共用的流程略去不表,與PublicRoadPlanner規(guī)劃算法相關(guān)的有兩處,一處是PublicRoadPlanner::Init,另一處是PublicRoadPlanner::Plan。

下面來(lái)看場(chǎng)景更新函數(shù)ScenarioManager::Update的代碼:

1void ScenarioManager::Update(const common::TrajectoryPoint& ego_point,
2                             const Frame& frame) {
3  CHECK(!frame.reference_line_info().empty());
4  Observe(frame);
5  ScenarioDispatch(ego_point, frame);
6}

該函數(shù)包含兩個(gè)子函數(shù):ScenarioManager::Observe和ScenarioManager::ScenarioDispatch,其中前者用于更新first_encountered_overlap_map_,代碼如下所示:

 
 1void ScenarioManager::Observe(const Frame& frame) {
 2  // init first_encountered_overlap_map_
 3  first_encountered_overlap_map_.clear();
 4  const auto& reference_line_info = frame.reference_line_info().front();
 5  const auto& first_encountered_overlaps =
 6      reference_line_info.FirstEncounteredOverlaps();
 7  for (const auto& overlap : first_encountered_overlaps) {
 8    if (overlap.first == ReferenceLineInfo::PNC_JUNCTION ||
 9        overlap.first == ReferenceLineInfo::SIGNAL ||
10        overlap.first == ReferenceLineInfo::STOP_SIGN ||
11        overlap.first == ReferenceLineInfo::YIELD_SIGN) {
12      first_encountered_overlap_map_[overlap.first] = overlap.second;
13    }
14  }
15}

以上就是如何進(jìn)行Planning 模塊源代碼分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:如何進(jìn)行Planning模塊源代碼分析
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/jhpipg.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部