兩種智能小車的構造簡介
在市面上常見的兩種智能小車都是基于輪式的,在某寶上面賣的最多的,各位在學生時代拿來應付課程設計和畢業設計用的各種小車分為兩種。
1.后輪驅動,前輪阿克曼轉向的,通常后軸通過有刷直流電機驅動,前軸通過舵機帶動連桿轉向。英文通常稱為Car-like Model.
2.差速驅動,這種最為多見,可以做成輪式的,也可以做成履帶式的。通過每個輪子都有電機,當然你可以說成為輪轂電機驅動。這種通常稱為Tank-like Model.
通過在分析控制問題的時候,第一步就是需要對被控對象進行數學模型的建立。
這里我們不強調模型的復雜性,因為大多數都在低速情況行駛,所以可以只考慮運動學模。
如果您需要參加XXX智能車比賽,這類競速類的項目,就必須考慮動力學模型,且需要通過大量的試驗對模型進行參數估計和辨識。
本次只談論簡易的運動學模型,并且進行Simulink環境的模型搭建,最后通過一個仿真環境來驗證模型的可用性!
需要的軟件與硬件
1.電腦一臺
2.裝有Matlab/Simulink的軟件本次只在仿真環境中建模,不需要小車的硬件和控制器硬件。
Car-like小車建模與仿真
1.模型推導
先給大家一個直觀的印象,如在我的上一篇博客中的小車就屬于Car-like 小車。您可以跳回上一篇文章進行查看小車圖片。
那么對于小車研究運動學模型,是需要對其簡化的,可以簡化成如下圖所示的模型。如果您不想看數學推導,可以直接看最后的推導結果。
其中v是小車軸向速度,x,y代表小車后軸中心點的大地坐標。
2.Simulink模型搭建
首先,根據上節中的內容搭建仿真模型,具體模型如下圖所示,如果您才入門Simulink,可以按照我的模型自己動手建一遍。
您會問我為什么會報錯呢,原因很簡單,我并沒有在Baseworkspace或者數據字典定義參數的具體數值,所示編譯器無法識別具體參數,為什么我這么做呢,因為會將這部分模型封裝成子系統。
在子系統封裝界面輸入參數。
具體報錯原因我點進去幾個模塊給您看一下。例如這個積分模塊
這個模塊輸出值代表小車的大地坐標中的橫坐標,在Initial Condition中是定義小車的初始值,這里通過參數定義小車的初始橫坐標,采樣時間用參數表示方便自定義采樣時間,不用每次都打開模型輸入。
其他方位角,縱坐標,軸距其實都是一樣的。輸出模塊我用了Bus模塊,也是方便我們查看自己感興趣的輸出信號。接下來封裝子系統。全選界面,右鍵選擇Create Subsystem from Selection。
如下圖所示,可以看到,還是存在報錯情況,不過沒關系,稍后會進行解決。
車身系統目前就建立完了。
然后我們將進行轉向系統和驅動系統的建立,驅動系統的建立我就不用示意了,這時只需要把上次的模型拿過來,接入速度接口就可以了。
輸入:期望車速。輸出:實際速度。當然控制器不屬于系統本身的模型,這里我為了后期方便仿真,就放在一起了。
那么轉向系統的模型如何建立呢?
小車使用的是一個舵機,舵機具有非常大的慣性,如果用過的同學肯定都知道,這里我使用一個一階慣性環節來表示轉向系統,一階慣性環節的滯后這里我就不做詳細的數學推導了,從bode圖上可以看相位有90度的滯后。
這里就用一個開環控制,因為轉向舵機我目前無法通過傳感器進行反饋控制。時間常數tao的選取決定了系統滯后時間。
不過注意不要將慣性環節和延遲環節進行混淆,千萬需要注意!其中Saturation模塊是對小車的期望轉角做一個限制的,限制最大轉角,在模塊中輸入參數MaxSteerAngle,后期進行封裝使用。
如果您不確定滯后參數,可以加個Scope看一下滯后的時間,從而選定時間常數tao。這時我們將整個系統表示為如下圖所示。
軟件的架構一定要清晰,這是最基本的!
接下來創建一個整體的子系統。
在VehicleBody子系統里,參數沒有定義還是處于報錯狀態。那么右鍵子系統,選擇Mask->Create Mask,出現下圖界面:
先選中Parameters,再點擊左側的Edit。編輯成如下圖所示:
其中name對應您設置的參數名字,Prompt對應您在封裝界面顯示的名字。
并且您可以在Documentation條目中進行子系統的描述。最后點擊Ok。
再次點擊您的子系統,可見已經封裝完成。
當然您也可以右鍵子系統Mask->Add Icon Image選擇您小車的圖片,我也將自己的小車圖片加上去了。
并且您可以在Library中將您的模型生成自定義庫。
3.Car-like小車模型仿真
本次的仿真環境我使用Mathworks培訓視頻提供的一個demo,在此demo上進行修改。
這個demo的需求是:通過規劃好路徑,設計純追蹤控制器,使小車能夠良好的跟蹤軌跡。
emo中分為三個部分:
第一個部分是尋找預瞄點,通過對車輛反饋的當前位置和參考路徑位置進行計算。
第二部分就是控制器算法,具體算法這里我就不解釋了,在CSDN搜索純跟蹤您可以看到關于此類車輛模型詳細的控制器數學推導。
第三部分就是車輛模型部分了。
從圖可以看到這個demo使用的Powertrain Blockset工具箱中的3dof自行車動力學模型。
我們需要將此模型替換成我們剛剛建立好的模型用我們的模型進行仿真,其他參數一律不進行修改。
已經替換完成,設置小車參數以及車輛在坐標系初始位置。其中SignalProcess子系統里是信號的處理。
這時點擊仿真。紅色點是小車的實際路徑,參考路徑是藍色的,可以明顯看到,小車在預瞄距離0.3米的情況下,跟蹤的很好。
和官方的二自由度小車動力學模型結果幾乎誤差,這里我就沒有把兩者的誤差進行對比了,大家可以看下軌跡效果。
說明基于運動學建立的模型在低速環境下使用是沒有問題的。
前輪轉角也十分平穩,這里我用的離散模型,采用時間是5e3秒,官方提供的模型是連續的,只不過它在后面的信號處理用了RateTransition模塊。
Tank-like小車建模與仿真
1.模型推導
Tank-like小車模型較前者簡單,并且在某寶的普及率是遠遠高于帶前輪轉向的小車的,因為價格相對便宜很多,通過用兩塊亞克力板和四個輪子加香蕉電機就可以完成組裝。下圖即為小車簡化后的模型。
運動學關系就非常清晰了,可以通過速度和角速度求解出x與y的位置,也可以求解出左右的速度分別是多少。那么下一步就可以在Simulink中建模了。
2.Simulink模型搭建
建模也十分簡單,將上面推導的公式代入,就可以得到一系列的輸出了,這里我輸出了8個值,分別是小車的x和y的位置信息,x和y的速度信息,方位角和角速度信息和兩個車輛不同的前進速度!
注意在高亮的模塊中,是需要和上個模型一樣在模塊中定義初始值和采樣時間的,最后用總線信號輸出。然后按照上一個模型類似步驟的簡單封裝,就可以做成如下圖所示的樣子。
當您需要輸出什么信號的時候,后接一個Bus Selector即可選擇您想要的任何信號。
3.控制器推導
當然您可以發現我們需要的距離 x xx是在小車坐標系下的,而預瞄距離是在大地坐標系下的,所以在求出預瞄點坐標的時候,您需要將預瞄點坐標轉換到小車的坐標系中,而坐標系按如下方法進行轉換的:
(1)首先將預瞄點坐標平移到以小車坐標為原點的坐標系中。
(2)將平移后的坐標系旋轉小車的方位角θ ,得到最終的小車坐標系。
4.仿真環境搭建
參考軌跡按照上個模型的仿真環境不變,計算預瞄點距離的算法子系統不變,我們需要改變的是控制器子系統和車輛模型子系統。
再看控制器如何設計的,最重要的就是坐標系的轉換(藍色區域),建議有興趣的同學可以自己推算一遍,十分簡單的數學幾何關系。
這里就沒有使用參考軌跡的方位角信息了!
整體模型架構如下:
本次仿真設置的是預瞄距離20cm,車速0.5m/s,開始仿真。看一下期望軌跡。
這是差速小車,當然您可以將左輪速度和右輪速度輸出看一下。總體來說弄懂原理十分簡單。參數的具體值就不對比了。
如果您有興趣可以從頭自己搭建一個您自己期望的參考軌跡,根據已經設計好的控制器進行仿真看一下效果。將x和y坐標接入xyGraph模塊一樣可以看到實際軌跡。
總結
本次進行了兩種常見的小車模型推導,建模與仿真,其中Tank-like小車您也可以沿用成履帶式的小車,在低速有約束的情況下都是模型都是通用的。
當您從某寶等電商平臺購買回一臺小車,我建議您從小車的構造本質進行入手,才能最其進行更好的控制,控制首先需要對被控對象進行深入的了解,無論是正向原則和數據驅動的方式建模,都需要對模型進行搭建,才能展開后續控制器的設計。
如果您使用的是Matlab2019b,那您可以在機器人工具箱中找到我今天做的兩種小車模型和差速小車純跟蹤控制器,區別在于工具箱中的模塊是基于面向對象編程的方法,沒有用Simulink模塊搭建,底層代碼是不可見的。
您可以驗證下本次教程的模型搭建是否和官方的模型有出入。
審核編輯:劉清
評論
查看更多