日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Baidu Apollo代码解析之Planning的结构与调用流程(1)

發布時間:2023/12/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Baidu Apollo代码解析之Planning的结构与调用流程(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我已經把CSDN上的博客遷移到了知乎上,歡迎大家在知乎關注我的專欄慢慢悠悠小馬車(https://zhuanlan.zhihu.com/duangduangduang)。希望大家可以多多交流,互相學習。


本文主要圍繞 apollo/modules/planning/ 模塊分析Apollo5.0是如何組織軌跡規劃的實現的。

1. Planner

在?apollo/modules/planning/planner/planner.h 文件中,定義了2個類:Planner類和 PlannerWithReferenceLine類。其中,Planner類是所有規劃器的基類,重要函數有Init() 和 Plan()。PlannerWithReferenceLine類?也是繼承自 Planner類,重要函數有PlanOnReferenceLine()。

planning 模塊中有4種規劃器,分別為:RTKReplayPlanner,PublicRoadPlanner,NaviPlanner,LatticePlanner。每個規劃器針對不同的場景和問題。在這4個規劃器中,都實現了繼承自Planner類的Plan()函數和繼承自PlannerWithReferenceLine類的PlanOnReferenceLine()函數。在執行具體的規劃任務時,都是在Plan()中調用PlanOnReferenceLine(),從而獲得規劃的軌跡結果。也就是說,最底層的規劃方法,是在各規劃器的PlanOnReferenceLine()中實現。

/*** @class NaviPlanner* @brief NaviPlanner is a planner based on real-time relative maps. It uses the* vehicle's FLU (Front-Left-Up) coordinate system to accomplish tasks such as* cruising, following, overtaking, nudging, changing lanes and stopping.* Note that NaviPlanner is only used in navigation mode (turn on navigation* mode by setting "FLAGS_use_navigation_mode" to "true") and do not use it in* standard mode.*/ class NaviPlanner : public PlannerWithReferenceLine { ... } /*** @class PublicRoadPlanner* @brief PublicRoadPlanner is an expectation maximization planner.*/ class PublicRoadPlanner : public PlannerWithReferenceLine { ... } /*** @class RTKReplayPlanner* @brief RTKReplayPlanner is a derived class of Planner.* It reads a recorded trajectory from a trajectory file and* outputs proper segment of the trajectory according to vehicle* position.*/ class RTKReplayPlanner : public PlannerWithReferenceLine { ... }

2. PlannerDispatcher

在 apollo\modules\planning\planner\planner_dispatcher.h 文件中定義了PlannerDispatcher類,用來根據預先設定的配置文件,選擇合適的planner。該類中重要的函數是DispatchPlanner()。

NaviPlannerDispatcher類繼承自PlannerDispatcher類,實現了DispatchPlanner()。由下面的代碼可知,其從config文件(apollo\modules\planning\conf\planning_config_navi.pb.txt)中讀取planner_type,然后創建對應類型的planner。而配置文件中設定planner_type為“NAVI”,對應NaviPlanner。

std::unique_ptr<Planner> NaviPlannerDispatcher::DispatchPlanner() {PlanningConfig planning_config;if (!apollo::cyber::common::GetProtoFromFile(FLAGS_planning_config_file,&planning_config)) {return nullptr;}auto planner_type = PlannerType::NAVI;if (planning_config.has_navigation_planning_config()) {planner_type = planning_config.navigation_planning_config().planner_type(0);}return planner_factory_.CreateObject(planner_type); }

與NaviPlannerDispatcher類相似,OnLanePlannerDispatcher類也是繼承自PlannerDispatcher類,實現了DispatchPlanner()。不同的是其config文件(apollo\modules\planning\conf\planning_config.pb.txt)設定了planner_type為“PUBLIC_ROAD”,對應PublicRoadPlanner。

3.?PlanningBase

在 apollo\modules\planning\planning_base.h 文件中,定義了PlanningBase類。該類有2個重要的函數:RunOnce()和Plan(),還有幾個重要的成員變量,這里暫時只關注2個:

std::unique_ptr<Planner> planner_; std::unique_ptr<PlannerDispatcher> planner_dispatcher_;

PlanningBase類用來描述規劃的執行過程,這樣就可以把通用的規劃過程(planning)和具體的規劃算法(planner)解耦,具有非常強的魯棒性。

NaviPlanning類繼承自PlanningBase類,實現了RunOnce()和Plan() 2個函數。在NaviPlanning類的構造函數中,planner_dispatcher_(從PlanningBase類繼承而來)被初始化為了NaviPlannerDispatcher類型的unique_ptr。然后,在NaviPlanning::Init()中,調用DispatchPlanner() 指定要使用的規劃器。RunOnce()被計時器周期性的觸發和運行,在其中調用了NaviPlanning::Plan(),而NaviPlanning::Plan()中又調用了NaviPlanner::Plan()。

//NaviPlanning類的構造函數中設定PlannerDispatcher NaviPlanning() {planner_dispatcher_ = std::make_unique<NaviPlannerDispatcher>(); } //NaviPlanning::Init()中設定Planner planner_ = planner_dispatcher_->DispatchPlanner();

與NaviPlanning類相似,OnLanePlanning類也是繼承自PlanningBase類,實現了RunOnce()和Plan() 2個函數。在OnLanePlanning類的構造函數中,planner_dispatcher_被初始化為了OnLanePlannerDispatcher類型的unique_ptr。然后,在OnLanePlanning::Init()中,調用DispatchPlanner() 指定要使用的規劃器。RunOnce()被計時器周期性的觸發和運行,在其中調用了OnLanePlanning::Plan(),而OnLanePlanning::Plan()中又調用了PublicRoadPlanner::Plan()。

4. PlanningComponent

在apollo\modules\planning\planning_component.h?文件中定義了PlanningComponent類,該類包含一個PlanningBase類型的unique_ptr成員變量。

class PlanningComponent final: public cyber::Component<prediction::PredictionObstacles, canbus::Chassis,localization::LocalizationEstimate> { public:bool Init() override;bool Proc(const std::shared_ptr<prediction::PredictionObstacles>&prediction_obstacles,const std::shared_ptr<canbus::Chassis>& chassis,const std::shared_ptr<localization::LocalizationEstimate>&localization_estimate) override; private:std::unique_ptr<PlanningBase> planning_base_;... }

在PlanningComponent::Proc()中,調用了PlanningBase類的RunOnce函數。根據繼承與虛函數的多態特性,相對應的planning流程和planner會執行具體的規劃任務。

ADCTrajectory adc_trajectory_pb; planning_base_->RunOnce(local_view_, &adc_trajectory_pb);

總結

以上是生活随笔為你收集整理的Baidu Apollo代码解析之Planning的结构与调用流程(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。