? ? 本文只是對(duì)于初學(xué)者的一種直觀普及,以及對(duì)于規(guī)劃路徑可視化的另外一種體會(huì)。對(duì)于做規(guī)劃控制的工程師來(lái)說(shuō)太簡(jiǎn)單。只是本人初學(xué)者,在學(xué)習(xí)控制模塊時(shí)候?qū)τ谀K輸入?yún)?shù)有所迷惑。所以記錄一下。
? ? 首先明確軌跡表達(dá)的方式,以及對(duì)于控制模塊輸入的軌跡表達(dá)方式:
message ADCTrajectory
{
.......
repeated apollo.common.TrajectoryPoint trajectory_point;
repeated apollo.common.PathPoint path_point;
.......
}
message TrajectoryPoint
{
? ? // path point
? ? optional PathPoint path_point = 1;
? ? // linear velocity
? ? optional double v = 2;? // in [m/s]
? ? // linear acceleration
? ? optional double a = 3;
? ? // relative time from beginning of the trajectory
? ? optional double relative_time = 4;
? ? // longitudinal jerk
? ? optional double da = 5;
? ? // The angle between vehicle front wheel and vehicle longitudinal axis
? ? optional double steer = 6;
}
message PathPoint
{
? ? // coordinates
? ? optional double x = 1;
? ? optional double y = 2;
? ? optional double z = 3;
? ? // direction on the x-y plane
? ? optional double theta = 4;
? ? // curvature on the x-y planning
? ? optional double kappa = 5;
? ? // accumulated distance from beginning of the path
? ? optional double s = 6;
? ? // derivative of kappa w.r.t s.
? ? optional double dkappa = 7;
? ? // derivative of derivative of kappa w.r.t s.
? ? optional double ddkappa = 8;
? ? // The lane ID where the path point is on
? ? optional string lane_id = 9;
? ? // derivative of x and y w.r.t parametric parameter t in CosThetareferenceline
? ? optional double x_derivative = 10;
? ? optional double y_derivative = 11;
}
? ? 可以看到ADCTrajectory表示一次規(guī)劃的結(jié)果,其中的repeated字段表示數(shù)組。有多個(gè)軌跡點(diǎn)和路徑點(diǎn)組成一段規(guī)劃的路徑。
1,這里有個(gè)理解的誤區(qū):ADCTrajectory也可以用來(lái)表示參考線,也可以用來(lái)表示EGO的實(shí)際運(yùn)行路徑。
2,TrajectoryPoint中既有Frenet坐標(biāo)系下的參數(shù):方位角以及曲率也有實(shí)際的笛卡爾坐標(biāo)系下的位置。以上所有信息都來(lái)自上游的規(guī)劃模塊。
3,這些軌跡點(diǎn)中包含該點(diǎn)的速度加速度以及在該點(diǎn)的距離信息。這個(gè)距離后面會(huì)分析。
? ? 有了以上信息后,發(fā)現(xiàn)控制模塊的很多參數(shù)是已知的,比如速度,距離等信息。所有后端的控制模塊的邏輯只需要更具這些軌跡中的要求去執(zhí)行。至于規(guī)劃的路徑中各個(gè)點(diǎn)的速度,距離,方位角信息就是規(guī)劃模塊計(jì)算處理的結(jié)果。在做模擬測(cè)試的時(shí)候可以模擬路徑,按照設(shè)計(jì)來(lái)規(guī)劃,同時(shí)預(yù)期的結(jié)果可以通過(guò)數(shù)值分析看看是不是正確。
? ? 分析一下control中的
? ? apollo_baidu-master/modules/control/testdata/lateral_controller_test/1_planning.pb.txt文件。
? ? 這個(gè)文件是測(cè)試文件,記錄了一段完整的規(guī)劃路徑。這個(gè)文件是txt文件格式,可以通過(guò)protobuf的API解析?!?strong>Apollo中的proto消息太多,又相互include。所以編譯的時(shí)候發(fā)現(xiàn)proto轉(zhuǎn)換后的.cc文件太多,編譯太費(fèi)事。其實(shí)可以學(xué)習(xí)百度使用Bazel的編譯方式,每個(gè)最小化模塊都編譯為動(dòng)態(tài)庫(kù)。只要做增量編譯就行,縮短了后續(xù)編譯的時(shí)間。】
? ? 首先解析的X,Y的笛卡爾坐標(biāo):
? ? ?發(fā)現(xiàn)是一條近似的直線,也驗(yàn)證了這條規(guī)劃軌跡是做縱向控制的。這個(gè)圖的坐標(biāo)單位沒(méi)有統(tǒng)一,所以無(wú)法從圖片中獲取斜率。斜率的計(jì)算比較粗略。應(yīng)為認(rèn)為是直線,在線上任取三個(gè)點(diǎn),三個(gè)點(diǎn)分別和前一個(gè)點(diǎn)(path_point)做delt(x)和delt(y),隨后求出delt(y)/delt(x)。計(jì)算出斜率:3.681。
? ? 其次看一下速度:
? ? 速度從0時(shí)刻到424時(shí)刻也為線性增加,后面趨于平穩(wěn)??梢院竺娴募铀俣茸鲆幌陆Y(jié)合分析。
? ? 加速度:
? ? ?V= a(t)的速度公式可以看出:隨著時(shí)間的增加,只要a>0,么V是增加的。在0-104區(qū)間 加速度減小,128-250區(qū)間加速度增加。粗略看下速度的變化圖:速度變化變得平緩。從區(qū)間 410開(kāi)始到結(jié)束,加速度又波動(dòng),但是基本在沒(méi)有加速的數(shù)值間震蕩。通過(guò)速度圖我們看到速度區(qū)域平緩,沒(méi)有明顯增加。
? ? 這里有兩個(gè)問(wèn)題:
? ? (1)加速度抖動(dòng)會(huì)不會(huì)影響直接的控車(chē)效果,車(chē)輛會(huì)不會(huì)出現(xiàn)抖動(dòng)。
? ? (2)加速度數(shù)值和V的計(jì)算關(guān)系不能完全安V = a(t)來(lái)獲取??赡芤禂?shù)用來(lái)矯正,或者采樣的精度不夠。
? ? 最后看下距離圖:
? ? 這應(yīng)該就是S-T,距離的累加呈線性增加關(guān)系。表示車(chē)輛在坐標(biāo)系的運(yùn)動(dòng)沒(méi)有橫向的的分量。做的直線運(yùn)動(dòng)。隨著時(shí)間的增加,距離在增加。
? ? ?最后講一下Frenet坐標(biāo)系的理解。公式不推了網(wǎng)上很多。問(wèn)題在為什么用這個(gè)笛卡爾和Frenet轉(zhuǎn)換的公式,以及什么地方使用。
? ? SL坐標(biāo)和frenet坐標(biāo)系沒(méi)有直接關(guān)系。frenet是自然坐標(biāo)系的一種表示,就是把物體的運(yùn)動(dòng)做切向和法線方向的兩個(gè)分解。在空間中還有第三個(gè)分量,垂直于平面的一個(gè)分量。和笛卡爾坐標(biāo)系的關(guān)系如圖:
? ??給定一個(gè)點(diǎn),就可以判斷這個(gè)點(diǎn)在參考線上的投影點(diǎn)之間的距離(法線方向),至于路程距離(S),其實(shí)沒(méi)明白為什么可以通過(guò)參考線的frenet坐標(biāo)推算出車(chē)輛行駛距離(S)。車(chē)輛完全可以不按照參考路徑來(lái)行駛。
? ? XYZ就是笛卡爾坐標(biāo)系,xyz就是運(yùn)動(dòng)軌跡上一點(diǎn)的切線和法線以及垂直這個(gè)平面的z向量。這個(gè)坐標(biāo)系通過(guò)積分可以計(jì)算出曲線上兩個(gè)點(diǎn)的距離。就是我們說(shuō)的S。對(duì)于S求導(dǎo)可以得到速度,在對(duì)于S求二階導(dǎo)可以得到加速度。
? ? 我們經(jīng)??吹絊L坐標(biāo)系,這個(gè)坐標(biāo)系僅僅只是和frenet的計(jì)算結(jié)果有關(guān)系(距離)。這里推薦一篇“古月居”的博客,其中的效果圖演示了SL的關(guān)系。
Frenet坐標(biāo)系下的無(wú)人車(chē)軌跡規(guī)劃詳細(xì)講解與ROS實(shí)現(xiàn) - 古月居 (guyuehome.com)
? ?S代表了路程的的累加,如同前文分析的情況:當(dāng)車(chē)輛直線勻速運(yùn)動(dòng)時(shí),S會(huì)隨時(shí)間的增加呈線性增加的關(guān)系。這里其實(shí)還有一點(diǎn)當(dāng)車(chē)輛沿直線變加速度后,雖然法線方向沒(méi)有分量,但是單位時(shí)間內(nèi)行駛的距離一定會(huì)變化,因此S的斜率會(huì)改變。SL坐標(biāo)中的S變換不能體現(xiàn)出車(chē)輛的實(shí)際運(yùn)行情況。只能判斷行駛距離。應(yīng)為ST的橫坐標(biāo)是時(shí)間,而SL的橫坐標(biāo)是參考點(diǎn)法線方向的距離。
? ?L代表了法線方向的位移距離,當(dāng)法線方向有加速度后。L就會(huì)有數(shù)值(橫向距離)。 這里開(kāi)始疑惑了:參考線SL的坐標(biāo)形式是曲線還是直線?希望知道的老師可以回答一下,謝謝。任意一個(gè)參考線上的點(diǎn)L的位移是0。
? ?可以看下這個(gè)函數(shù)內(nèi)部如何使用公式。目睹其實(shí)求出S L?以及SL各自的導(dǎo)數(shù)。
void TrajectoryAnalyzer::ToTrajectoryFrame(const double x, const double y,
const double theta, const double v,
const PathPoint &ref_point,
double *ptr_s, double *ptr_s_dot,
double *ptr_d,
double *ptr_d_dot) const
? ? 文章很多知識(shí)點(diǎn)還沒(méi)有徹底說(shuō)明白,如果有誤歡迎指正交流,謝謝。
? ? 隨后推薦一篇文章:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-637116.html
? ??Frenet坐標(biāo)系及其與笛卡爾坐標(biāo)轉(zhuǎn)換(1)原理 - 知乎 (zhihu.com)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-637116.html
到了這里,關(guān)于百度Apollo中軌跡的表示方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!