天天看點

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作

同樣,該Stanley算法也是用于Coursera self driving car Part1 FinalProject裡得橫向控制,縱向采用PID控制不贅述。

1.Stanley算法原理

Stanley算法原理相對比較簡單,可以處理初始橫向誤差,航向誤差較大得情況。

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

Stanley控制量前輪轉角得産生由兩部分構成:

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

為了消除車輛航向與參考航向之間得角度差所需得前輪轉角,參考航向即為參考點得切線方向

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

為了消除橫向距離需要得前輪轉角

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

 為 我們給定的距離,但如果設定為一個常值,越小,車子就越快接近參考路徑,轉向角就越大。低速時可能适用,高速時就使車輛變得非常激進,使得系統出現振蕩,是以我們通常将其設定為一個與v正比的值

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

這個比例系數k越大,

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

 就越小,車輛就越激進。k作為Stanley控制器的一個參數,類似與PID的比例控制,還可以進行改造加入微分積分環節,這裡不再贅述。

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

原理就是這樣,很簡單。

2.Coursera self driving car Part1 FinalProject介紹

Part1 FinalProject參見我得另一篇部落格裡的2.1小節

Coursera self-driving car Part1 Final Project——無人車軌迹跟蹤之MPC模型預測控制原理推導及Python實作

3.Python實作

這裡隻介紹關鍵代碼的實作.

這個Final project裡的設定是提供的waypoints是一個點集,每個時刻都會更新,詳見本部落格第2小節。waypoints了解為接下來racetrack_waypoints.txt裡的幾個參考點進行線性插值後的點集。

算法代碼實作大緻流程:

參數初始化→找到目前最近點與最近距離(橫向誤差)→計算參考航向→判斷橫向誤差符号→計算

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

→下發控制量

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

3.1 找到附近小段軌迹中的距離車輛的最近點

思路就是周遊waypoints小段軌迹點集,依次求出距離,初始最近距離設定為無窮大,最近點索引為0,然後後面若發現有更小的距離,則更新最近距離min_dist和最近點索引 min_idx。

#找到最近的路徑點索引
            min_idx       = 0
            min_dist      = float("inf")
            for i in range(len(self._waypoints)):          
               dist = np.linalg.norm(np.array([
                    self._waypoints[i][0] - x_f,
                    self._waypoints[i][1] - y_f]))   #出現“Unexpected indent”原因可能之一,可能是你的函數或哪一行的縮進出了問題,if 跟dist縮進一樣的屬于for循環下
               if dist < min_dist:               #每個i比較是否比min_dist要小,将if放錯位置縮進不對頂格導緻每次都取了最後一個i,因為無論距離多少肯定比inf小導緻控制量很大原地轉圈
                        min_dist = dist
                        min_idx = i 
           

3.2 參考航向的計算

Final project的設定是車輛的實際狀态x,y,phi,v都會由傳感器給出數值,實際航向角(車速方向與x軸所成角,-pi-pi)為yaw,但是如上原理所述Stanley算法中要用到參考航向角。

參考航向角的計算思路:

程式中跟蹤路徑橫向控制時是将路徑距車輛最近點作為參考點,這裡将最近點與其下一個點的連線方向作為參考航向(若最近點是點集中的最後一個點,則采用最近點上一個點與最近點的連線作為參考航向),代碼如下:

atan2計算出來的角度會自動轉換到-pi到pi,航向角的設定就是-pi到pi

#設定目标點
            tx=waypoints[min_idx][0]
            ty=waypoints[min_idx][1]
            #判斷用下一個點還是上一個點與目前目标點的連線作為參考航向
            ##重要!!!因為yaw 這裡定義的範圍是有負值的而不是0-2pi,是-pi到pi,那麼th也-pi到Pi即可,否則有問題
            if min_idx<len(self._waypoints)-1:
                #不是最後一個點就用下一個點計算參考航向
                th=math.atan2(waypoints[min_idx+1][1]-waypoints[min_idx][1],waypoints[min_idx+1][0]-waypoints[min_idx][0])
            else:
                th=math.atan2(waypoints[min_idx][1]-waypoints[min_idx-1][1],waypoints[min_idx][0]-waypoints[min_idx-1][0])
           

3.3 判斷橫向誤差的符号

看了幾個CSDN上的排在前面的答案,移植到python中做這個FinalProject時,發現都是有漏洞的,用來做這個project經常沖出跑道。看的幾個部落格常見的一種思路,就是:

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

簡單的把車在參考點切線的右側(Axr+Byr+C>0)作為負(Coursera Finalproject裡定義向左轉為負的轉向角),車子在在參考點切線的左側(Axr+Byr+C<0)作為正,簡單的這樣判斷方向,當同一段軌迹,小車是向右上方運動時,Ax+By+C>0左轉還沒錯,

當小車是反向向左下方跟蹤軌迹時,Ax+By+C>0左轉就有問題了,反而偏離了軌迹。

下面介紹一種在Github上看到的新方法。

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

用參考路徑的第一個參考點P0與小車位置P的連線與x軸所成角

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

,最近參考點的切線方向的航向角

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

,這種角度均在-pi到pi之間,航向角是-pi-pi,atan2計算出來的角度也是-pi到pi。

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

上圖如果小車向右上方運動

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

,左拐沒問題,橫向誤差為負。

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

如果小車向左下方運動,

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

小車需向右拐,則橫向誤差為正,也正确。

在Finalproject裡坐标系是反的,則上述規則剛好反過來即可。

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

代碼如下:

#判斷error的符号
            #計算第一個參考點到目前位置的連線與x軸所成角
            yaw_cross_track = np.arctan2(y_f-waypoints[0][1], x_f-waypoints[0][0])
            #waypoints裡的第一個點到目前位置連線角度與參考航向之間的夾角計算
            yaw_path2ct = th - yaw_cross_track
            if yaw_path2ct > np.pi:
                yaw_path2ct -= 2 * np.pi
            if yaw_path2ct < -np.pi:
                yaw_path2ct += 2 * np.pi
            # yaw_path2ct>0就是正的
            if yaw_path2ct > 0:
               error = abs(error)
            else:
               error = - abs(error)
            #
           

3.4 角度加減後範圍的限制

整個程式裡的角度範圍都是-pi到pi,無論是航向角還是求反正切出來的值,

但是兩個角度加減後可能超出範圍,都要轉化到這個範圍内。代碼如下:

#waypoints裡的第一個點到目前位置連線角度與參考航向之間的夾角計算
            yaw_path2ct = th - yaw_cross_track
            if yaw_path2ct > np.pi:
                yaw_path2ct -= 2 * np.pi
            if yaw_path2ct < -np.pi:
                yaw_path2ct += 2 * np.pi
           

3.5 運作結果

Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作
Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作Coursera self-driving car Part1 Final Project——自動駕駛軌迹跟蹤之Stanley算法推導及Python實作1.Stanley算法原理2.Coursera self driving car Part1 FinalProject介紹3.Python實作

與我另外兩篇部落格介紹的Pure Pursuit純跟蹤, MPC橫向控制并沒有看出明顯優劣,因為參數的設定相對都比較随意。但是都能夠很好的完成軌迹跟蹤的任務。

運作視訊連結

https://www.bilibili.com/video/BV1kB4y1F7sU

源碼連結

https://download.csdn.net/download/weixin_39199083/18814608