- 本次學(xué)習(xí)的Apollo版本為6.0版本,因?yàn)閺?.0開始軌跡規(guī)劃算法主要使用的就是public road,所以本次主要學(xué)習(xí)該算法,該算法的核心思想是PV解耦,即Path-Velocity的解耦,其主要包含兩個(gè)過程:1.路徑規(guī)劃,2.速度規(guī)劃。
- 路徑規(guī)劃其實(shí)已經(jīng)發(fā)展很多年,從早期的機(jī)器人到現(xiàn)在的無人駕駛,主要的方法包括 采樣法,圖搜索法,數(shù)值優(yōu)化法等,具體可以查閱相關(guān)文獻(xiàn)閱讀。本篇文章主要講述apollo軌跡規(guī)劃模塊里面的路徑規(guī)劃,之后在更新學(xué)習(xí)速度規(guī)劃的文章。
- 與之前EM規(guī)劃和Lattice規(guī)劃不同,當(dāng)前6.0版本使用的路徑規(guī)劃,更加的靈活方便,原因主要是采用了數(shù)值優(yōu)化的思想,通過邊界約束等,保證了密集障礙物場(chǎng)景的靈活性,也同時(shí)避免了EM規(guī)劃中DP消耗大量時(shí)間的缺點(diǎn)。
- 在之前的學(xué)習(xí)中了解到PublicRoadPlanner::Plan()中注冊(cè)了,創(chuàng)建,更新了場(chǎng)景再根據(jù)不同的場(chǎng)景對(duì)應(yīng)的不同的stage去完成相應(yīng)階段下的tasks。由于場(chǎng)景的差異性,task與stage也有所不同,因此本文只講述默認(rèn)情況下的lane follow scenario,其他場(chǎng)景的分析方式大同小異。
關(guān)于Apollo6.0處理路徑規(guī)劃的算法原理,百度已經(jīng)發(fā)表在《Optimal Vehicle Path Planning Using Quadratic Optimization for Baidu Apollo Open Platform》?;趨⒖季€將規(guī)劃問題解耦為SL坐標(biāo)系中的路徑規(guī)劃和ST坐標(biāo)系中的速度規(guī)劃。
主要代碼的梳理學(xué)習(xí)從LaneFollowStage::PlanOnReferenceLine這個(gè)函數(shù)展開
Status LaneFollowStage::PlanOnReferenceLine(
const TrajectoryPoint& planning_start_point, Frame* frame, ReferenceLineInfo* reference_line_info) {
// 當(dāng)前先驗(yàn)信息判斷是否當(dāng)前參考線是可換道的車道,如果不是那么增加cost。
if (!reference_line_info->IsChangeLanePath()) {
reference_line_info->AddCost(kStraightForwardLineCost);
}
auto ret = Status::OK();
// 隨后,開始了task的process過程,不同的stage有不同的task,具體可通過 conf/scenario文件夾下的pb.txt
for (auto* task : task_list_) {
ret = task->Execute(frame, reference_line_info);
RecordDebugInfo(reference_line_info, task->Name(), time_diff_ms);
if (!ret.ok()) {
AERROR << "Failed to run tasks[" << task->Name()
<< "], Error message: " << ret.error_message();
break;
}
}
RecordObstacleDebugInfo(reference_line_info);
// check path and speed results for path or speed fallback
reference_line_info->set_trajectory_type(ADCTrajectory::NORMAL);
// 如果執(zhí)行失敗,則規(guī)劃fallback軌跡
if (!ret.ok()) {
PlanFallbackTrajectory(planning_start_point, frame, reference_line_info);
}
// 本次只學(xué)習(xí)路徑規(guī)劃部分,后面的以后再學(xué)
...
}
在路徑規(guī)劃中我們主要關(guān)注lane follow場(chǎng)景,配置文件為modules\planning\conf\scenario\lane_follow_config.pb.txt
scenario_type: LANE_FOLLOW
stage_type: LANE_FOLLOW_DEFAULT_STAGE
stage_config: {
stage_type: LANE_FOLLOW_DEFAULT_STAGE
enabled: true
task_type: LANE_CHANGE_DECIDER
task_type: PATH_REUSE_DECIDER
task_type: PATH_LANE_BORROW_DECIDER
task_type: PATH_BOUNDS_DECIDER
task_type: PIECEWISE_JERK_PATH_OPTIMIZER
task_type: PATH_ASSESSMENT_DECIDER
task_type: PATH_DECIDER
task_type: RULE_BASED_STOP_DECIDER
task_type: ST_BOUNDS_DECIDER
task_type: SPEED_BOUNDS_PRIORI_DECIDER
task_type: SPEED_HEURISTIC_OPTIMIZER
task_type: SPEED_DECIDER
task_type: SPEED_BOUNDS_FINAL_DECIDER
# task_type: PIECEWISE_JERK_SPEED_OPTIMIZER
task_type: PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER
task_type: RSS_DECIDER
......
上述task中,根據(jù)名稱可以看出,path都是與路徑相關(guān),從rule_based之后則是與速度規(guī)劃相關(guān)。故本節(jié)主要關(guān)注:
stage_type: LANE_FOLLOW_DEFAULT_STAGE
enabled: true
task_type: LANE_CHANGE_DECIDER
task_type: PATH_REUSE_DECIDER
task_type: PATH_LANE_BORROW_DECIDER
task_type: PATH_BOUNDS_DECIDER
task_type: PIECEWISE_JERK_PATH_OPTIMIZER
task_type: PATH_ASSESSMENT_DECIDER
task_type: PATH_DECIDER
上面的task按照任務(wù)順序執(zhí)行:
1.lane change decider:
該決策器主要是用來處理refer_line_info,內(nèi)部有個(gè)狀態(tài)機(jī),根據(jù)換道成功時(shí)間與換道失敗時(shí)間以及當(dāng)前位置與目標(biāo)位置來切換狀態(tài),以此來處理refer_line_info的changelane信息,主要就是更新?lián)Q道狀態(tài)。
這一部分也影響到了path bound decider :如果最終的結(jié)果是不換道,在PathBoundsDecider中會(huì)將L的邊界限制在本車道內(nèi)(如果不借道);反之在PathBoundsDecider中會(huì)將L的邊界向目標(biāo)車道一側(cè)進(jìn)行拓展。
具體細(xì)節(jié)上的處理見Apollo Planning學(xué)習(xí)(3)-------LANE_CHANGE_DECIDER
2.path reuse decider:
該決策器主要是用來處理路徑是否可以重用,提高幀之間的平滑性。
如果感知模塊對(duì)障礙物的感應(yīng)不穩(wěn)定(上下跳動(dòng))導(dǎo)致路徑規(guī)劃模塊不穩(wěn)定(也同樣上下跳動(dòng)),所以Apollo設(shè)計(jì)了路徑重用的決策,如果上一幀的路徑?jīng)]有與障礙物發(fā)生碰撞,則采用上一幀的路徑。
3.path lane borrow decider:
ADC在借道工況中:判斷本車道可通過性,如果在連續(xù)n(參數(shù)配置)幀規(guī)劃中本車道可以通行,則取消借道。
ADC不在借道工況中:ADC需要同時(shí)滿足必要條件才可以進(jìn)入借道工況。
具體細(xì)節(jié)上的處理見:Apollo Planning學(xué)習(xí)(4)-------PATH_LANE_BORROW_DECIDER
這里同lanechangedecider一樣,借道還是不借道也會(huì)影響到后面的PathBoundsDecider,如果借道,在PathBoundsDecider中會(huì)將l ll的邊界借道方向一側(cè)進(jìn)行拓展。
4.path bounds decider:
該決策器主要是用來處理根據(jù)前面的決策器更新的狀態(tài)信息(例如,換道情況,借道情況)來生成相應(yīng)的L的邊界。
在該決策器中分為四個(gè)場(chǎng)景進(jìn)行處理,按處理的順序分別是fallback、pull over、lane change、regular,不同的boundary對(duì)應(yīng)不同的應(yīng)用場(chǎng)景,其中fallback對(duì)應(yīng)的path bound一定會(huì)生成,其余3個(gè)只有一個(gè)被激活,即按照順序一旦有有效的boundary生成,就結(jié)束該task。
FallbackBound+PullOverBound;
FallbackBound+LaneChangeBound;
FallbackBound+NoBorrow/LeftBorrow/RightBorrow;
不管在何種決策下,PathBoundsDecider都會(huì)生成一條FallbackBound,其與NoBorrow的區(qū)別是,不會(huì)刪除Block Obstacle后道路邊界。
具體細(xì)節(jié)上的處理見:Apollo Planning學(xué)習(xí)(5)-------PATH_BOUNDS_DECIDER
5.piecewise jerk path optimize:
該決策器主要是基于二次規(guī)劃算法,對(duì)每個(gè)邊界規(guī)劃出最優(yōu)路徑。
這里推薦聽一下b站老王講的十分透徹B站老王—二次規(guī)劃
6.path assessment decider:
該決策器主要處理是會(huì)依據(jù)設(shè)計(jì)好的規(guī)則篩選處最終的path,并在規(guī)劃路徑上的采樣點(diǎn)添加標(biāo)簽(IN_LANE、OUT_ON_FORWARD_LANE、OUT_ON_REVERSE_LANE等),作為路徑篩選的依據(jù),并為速度規(guī)劃提供限制。
具體細(xì)節(jié)上的處理見:Apollo Planning學(xué)習(xí)(6)-------PATH_ASSESSMENT_DECIDER
7.path decider:
該決策器主要處理是遍歷每個(gè)障礙物, 根據(jù)規(guī)則判斷前面優(yōu)化并篩選出來的path生成對(duì)應(yīng)的decisions(GNORE, STOP, LEFT NUDGE, RIGHT NUDGE等)。文章來源:http://www.zghlxwxcb.cn/news/detail-488917.html
對(duì)以有IGNORE/STOP/KEEP_CLEAR決策的obstacle不做處理;
如果是block obstacle,并且不是借道工況,設(shè)為STOP決策;
不在path縱向范圍內(nèi)的障礙物設(shè)為IGNORE決策;
對(duì)于碰撞的obstacle,設(shè)為STOP決策;
根據(jù)位置關(guān)系設(shè)置LEFT NUDGE或者RIGHT NUDGE的決策;
具體細(xì)節(jié)上的處理見:Apollo Planning學(xué)習(xí)(7)-------PATH_DECIDER文章來源地址http://www.zghlxwxcb.cn/news/detail-488917.html
到了這里,關(guān)于Apollo Planning學(xué)習(xí)(2)-------路徑規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!