planning模組的初始化見planning::init()
(apollo/modules/planning/planning.cc)。
planning模組的業務邏輯見planning::runonce()
(apollo/modules/planning/planning.cc),該函式每隔一段時間執行一次(100ms?),由定時器planning::ontimer
定時呼叫。
定時任務planning::runonce()大體步驟如下:
計算拼接軌跡trajectorystitcher::computestitchingtrajectory
根據拼接軌跡進行決策planning::plan()
決策planning::plan()大體步驟:
apollo::planning::planner
apollo::planning::emplanner
apollo::planning::latticeplanner
apollo::planning::rtkreplayplanner
子模組planner
的基類是planner
類,其包括3個具體實現類(如上)。planner會載入若干task,如以emplanner
為例,主要載入decider
、optimizer
兩類:
優化器optimizer
emplanner::plan()
方法中會呼叫emplanner::planonreferenceline()
,然後這些註冊了的tasks均會被執行,各task負責各自業務。比如***olypathoptimizer
通過動態規劃來進行路徑規劃。
apollo::planning::task
apollo::planning::pathdecider
apollo::planning::pathoptimizer
apollo::planning::***olypathoptimizer
apollo::planning::qpsplinepathoptimizer
apollo::planning::speeddecider
apollo::planning::speedoptimizer
apollo::planning::dpstspeedoptimizer
apollo::planning::polystspeedoptimizer
apollo::planning::qpsplinestspeedoptimizer
apollo::planning::trafficdecider
以***olypathoptimizer
為例,***olypathoptimizer
類繼承自pathoptimizer
類,pathoptimizer::execute()
方法中呼叫pathoptimizer::process()
虛方法,***olypathoptimizer::process()
方法具體實現如下:
status ***olypathoptimizer::process(const speeddata &speed_data,
const referenceline &,
const common::trajectorypoint &init_point,
pathdata *const path_data)
check_notnull(path_data);
dproadgraph dp_road_graph(config_, *reference_line_info_, speed_data);
dp_road_graph.setdebuglogger(reference_line_info_->mutable_debug());
if (!dp_road_graph.findpathtunnel(
init_point,
reference_line_info_->path_decision()->path_obstacles().items(),
path_data))
return status::ok();
}bool dproadgraph::findpathtunnel(
const common::trajectorypoint &init_point,
const std::vector&obstacles,
pathdata *const path_data) ,
&init_sl_point_))
if (!calculatefrenetpoint(init_point_, &init_frenet_frame_point_))
std::vectormin_cost_path;
if (!generatemincostpath(obstacles, &min_cost_path))
std::vectorfrenet_path;
double accumulated_s = init_sl_point_.s();
const double path_resolution = config_.path_resolution();
for (std::size_t i = 1; i < min_cost_path.size(); ++i)
if (i == min_cost_path.size() - 1) else
} frenetframepath tunnel(frenet_path);
path_data->setreferenceline(&reference_line_);
path_data->setfrenetpath(tunnel);
return true;
}
這就是Apollo 5 規劃
這個問題怎麼解答呢,為什麼要規劃,就好像開車的時候要知道怎麼才能去到目的地,這是駕駛過程中所必須要進行的行為。無人車也是如此 apollo通過搜尋來查詢路線,但它使用了更智慧型的搜尋演算法。在進行智慧型搜尋演算法以前,我們需要將地圖資料重新格式化為 圖形 的資料結構。該圖形由 節點 node 和 邊...
第五章 百度Apollo規劃技術介紹(3)
約束問題的核心有三點 1.目標函式的定義 2.約束。如路網約束 交規 動態約束等 3.約束問題的優化。如動態規劃 二次規劃等 牛頓迭代法 研究導數變化,一階導 二階導 考慮斜率變化率,然後再用binary search去逼近。核心思想 泰勒展開 收斂次數 指數平方,二次收斂 求解全域性最優解 分塊,...
決策單調性的動態規劃 noi2009詩人小G
關於決策單調性在網上有一篇非常好的 1d1d動態規劃優化初步 那麼我們的任務就是證明決策單調性在直接套用模板即可,所謂決策單調性,就是我們要證明這樣乙個命題 如果 f k 的最優決策是j,f k 1 的最優決策是i,ik 使用j轉移都會比使用i轉移優,對於所有f l l k 使用i轉移都會比使用j轉...