自己動手寫全套無人駕駛演算法系列(三)機械人控制

2021-10-05 16:11:21 字數 3122 閱讀 8891

自己動手寫全套無人駕駛演算法系列(三)機械人控制

目錄一、概述

1.1 系列整體概述

1.2 控制演算法實際運用問題

二、演算法介紹

2.1 pid_diff

2.2 pid_acm

2.3 mpc_acm

一、概述

1.1 系列整體概述

1.2 控制演算法實際運用問題

實際運用控制演算法不像**那麼簡單,時間上還需要如下步驟:

1.時間同步:設定乙個可信時間區間,對早到的時間,要按運動學補償,遲到超過一定時間的資料,直接按運動學推算,見我的github。

2.倒車邏輯:如航向角為負的trick,steer問題

3.換檔邏輯:如何停下來,如何判斷停穩再換檔,換檔如何判斷換檔成功

4.底盤邏輯:如usb不允許方向盤一次轉超過25度,加速度不能變化超過5m/s2等,要在mpc的凸優化裡開盒函式,輸出的時候也要限制。

5.軌跡處理邏輯:讀取軌跡的時間同步,軌跡如果不符合三次曲線怎麼辦,終點前最後一段軌跡點不足怎麼辦,軌跡雜訊太大怎麼辦。

6.臨時停車邏輯:如何臨時停車而不完全停下

7.緊急制動邏輯:突發情況處理

8.其他忘記說的邏輯。

二、演算法介紹

主要運用於如掃地機械人的差分驅動模型,實際上很多人說要雙環pid,但是就實際測試情況來說,單環這種對大部分機械人夠了,而雙環機械人,大部分廠家的生產標準不能到大公司的標準,換了機械人要重除錯很麻煩,實際過程中對大型機械人,pid需要一些trick,比如停止時,軌跡處理這些,這些不屬於演算法內容,可以自己去探索。

演算法核心在於如下**:

d[2]

= d[1]

; d[1]

= d[0]

; d[0]

= dis;

y[2]= y[1]

; y[1]

= y[0]

; y[0]

= yaw_d;

v = pv*

(d[0])

+ iv*

(d[0

]+d[1]

+d[2])

+ dv*

(d[0

]-d[2]

);w = pw*

(y[0])

+ iw*

(y[0

]+y[1]

+y[2])

+ dw*

(y[0

]-y[2]

);

選取距離為當前最近點索引為k的點作為target點,以對其的距離,角度差為誤差進行pid控制

控制v,w,pid是利用比列,積分,微分進行控制的演算法,演算法本身具體可以見一文讀懂pid控制

2.2 pid_acm

主要運用於如無人車等阿克曼轉向模型,阿克曼轉向模型見我系列第二篇的介紹,

老實說實際過程中,做成雙環效果似乎不如單環,但大家可以自行設定再加一環,會單環加環也很容易,對無人車,需要一些trick才能實際執行,比如時間不同,停車處理,各種邏輯的處理,這些不屬於演算法了,可以自行加上。

本演算法利用了預瞄(preview)技巧,預瞄前面n個點的航向角,可以讓無人車控制更穩定:

核心**如下:

r8 lat_loss =

-v_dis;

i4 end_i =

(min_i+param.review_num)

; end_i = end_i>=line_size?line_size-

1:end_i;

r8 yaw_loss =0;

r8 dis_loss =0;

for(i4 i = min_i +

1;i<=end_i;i++

) r8 angle_loss = param.ag*lat_loss + param.bg*yaw_loss;

d[2]

= d[1]

; d[1]

= d[0]

; d[0]

= dis_loss;

y[2]

= y[1]

; y[1]

= y[0]

; y[0]

= angle_loss;

pida = p_lon*

(d[0])

+ i_lon*

(d[0

]+d[1]

+d[2])

+ d_lon*

(d[0

]-d[2]

);steer = p_lat*

(y[0])

+ i_lat*

(y[0

]+y[1]

+y[2])

+ d_lat*

(y[0

]-y[2]

);

採用角度差和預瞄作為角度差,其他和上個pid一樣。

主要運用於如無人車等阿克曼轉向模型,我曾經有一段時間就是專門做mpc,可以實現下停車場並倒車入庫,上旋轉的坡,車道保持跟隨各種,但是mpc運用時是要考慮時間同步的,時間對mpc特別重要,因為mpc是等時間間隔**的,另外需要一些軌跡處理,很多停車,倒車邏輯,處理規劃路線邏輯,這些根據不同車有不同處理方法,不屬於演算法本身,可以自己探索。

全稱是模型**控制,就是給定車前方軌跡n個點,時間間隔為dt,故總時間是n×dt,那麼我們按運動學方程,以不同的a[n]和steer[n] (表示a和steer的陣列,a[6]就是表示t=6×dt時刻的給的加速度)推算出到相應時間的x,y,橫向誤差,縱向誤差,a,航向角等狀態,那麼計算x,y,橫向等與軌跡相應點的差,得到乙個cost function,其中a[n]和steer[n]都是待優化量,之後我們便可以按ipopt進行凸優化迭代即可,當然了,我們要對a的變化率,steer變化率,速度大小,加速度大小等進行約束。

最後我們就得到乙個最優的a,steer序列,取a[0],steer[0]作為當前輸出即可。正常行駛效果是各大控制演算法最好。具體見mpc分析。

自己動手寫bootloader

原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...

自己動手寫CMS

簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...

自己動手寫SpringMVC 四

本文將主要實現dispatcherservlet!之前已經分析過dispatcherservlet主要的任務,分為五個任務,我們從任務一開始開始實現!任務1 把專案中所有的bean掃瞄,進行維護 實現 如下 private void scanpackage string basepackage el...