前言, 遇到乙個小專案,要實現上位機手繪一條線條軌跡,傳送給智慧型小車,讓智慧型小車能按照手繪軌跡運動。要求不高,運動起來有那麼個意思就行了,當然要做得好,還需要位置反饋這才運動準確,本文不涉及位置控制,就討論實現這個意圖的開環控制。
看了很多某寶上大片的智慧型小車,都是只能巡線和避障,或者由手柄(包括手機上的按鍵控制前後左右移動)。沒有我想要的功能。
搜各種技術貼,各種車輛路徑規劃,大片的積分微分方程序,到最後也只是個matlab**結尾,頭都大了,還是沒有頭緒。算了,我用種簡單的方法來實現它,避免高深的知識。我來寫一篇,有高中的知識就足夠了。
說明: 智慧型小車一般有2種, 轉彎用舵機控制的,這個比較簡單,在此不表。
另外一種是靠左右輪差速控制的,本文以這種智慧型小車來說明解決思路。
首先,我們用倒推法來分析, 看下整個架構。
倒推法:
上位機, 智慧型小車(下位機)需要軌跡的資料,
那我們就取軌跡上每隔一段距離(這個距離你可以自己程式設計控制)取乙個點,把各點的座標(x,y)取出來,依次存在陣列裡,這就是一種資料。
對這些座標點,不做任何處理,就把這些資料傳送給下位機,至於下位機怎麼處理,上位機不管了,各人自掃門前雪。這是一種思路,但是並不好,因為(x,y)座標點資料,對下位機不友好,stm32微控制器是無法和上位機運算能力好比的,要弱很多,你把繁重的資料計算工作(這我後面說時會解釋)給微控制器,不厚道吧。
稍好的做法是,你把軌跡上各點的座標值資料,處理成相鄰點之間的距離l,和相鄰點之間的方位角變化值θ,比如下圖,會對下位機友好很多,以下重點解釋。
還有更好的,在上一段的基礎上,資料再做處理,讓下位機運算量更小(其實你看到本文結尾就知道,把軌跡資料處理成智慧型小車在各軌跡點的轉彎時間,和直行時間資料,再發給下位機,下位機就吃得更舒心了)。但這需要上位機和下位機約定乙個統一的軌跡長度單位對映關係,就是說,你除錯時,要同時修改上位機和下位機**來協調,這種處理我只是在這裡提出來,並不做詳細討論。
a, b, c, d,e, 分別是手繪軌跡上抽取的相鄰點。
l1, l2, l3,
l4 , l5 分別是相鄰點間的距離
θ1,θ2,, θ3,, θ4,θ5 分別是後一段軌跡,相對前一段軌跡的方位角度變化值。
上位機傳送資料時,把
各點的l 和 θ值 傳送給下位機,這樣,相當於上位機送了一程,下位機處理起來運算量會小很多。
上位機的實現, 看你個人程式設計習慣用什麼軟體了,vc,qt 等等, 反正我知道,qt程式設計,使用其中的畫圖功能,在滑鼠繪畫線條時,有個函式,可以把線條按任意等分,可以取得各點的座標值。
你拿到各點座標值了,想處理各點距離和角度就是數學問題。
又要畫圖,又要寫字麻煩,我就手寫了一張數學過程,字不好,湊合著看吧。
方位角變化值θ=α2-α1,這個公式的正確性,大家可以自己多畫一下, 把軌跡往第二,第三,第四象限去畫,並且多畫些接近極限的位置,驗證一下,反正我也是愚鈍,在網上看到一些文章說這樣算方位角變化值,我很懷疑,就自己想啊畫啊弄了半天,畫了各種角度位置驗證,發現的確是對的。這才寫出來。
方位角變化值θ=α2-α1, 這個計算結果也應該是在-1/2л~ 1/2л 範圍內, 如果超範圍了,要修正。修正的原因是,大於1/2л,意味著車輛向某個方向轉彎超過180度,可你想啊,要是朝這個方向轉彎超過180度了,那我問什麼不向另外乙個方向轉,因為那樣轉過的角度會是小於180度,同樣能到達規定的角度方位。小於-1/2л也是這麼個道理吧?所以要修正。
若α2-α1大於1/2л, 則修正為 θ=α2-α1-1/2л; 若α2-α1小於-1/2л, 則修正為 θ=α2-α1+1/2л。這個修正和α2-α1的結果,你也可以畫些極限位置來驗證的。反正我是通過自己畫,才得出這樣修正結論的。
方位角變化值θ=α2-α1, 其值可正可負(範圍在-1/2л~ 1/2л),那麼 , 正值和負值的意義是什麼?
若為正值,說明如上圖座標系的話,是下一段軌跡相對上一段軌跡要逆時針旋轉θ方位(即小車應該向左轉彎);若為負值,說明如上圖座標系的話,是下一段軌跡相對上一段軌跡要順時針旋轉θ方位(即小車應該向右轉彎)。
這點非常重要,因為後面說到要控制小車轉彎, 你得知道遇到正負值的方位角變化值θ,你該怎麼控制小車左右輪的轉動方向。
經過這樣處理,上位機就可以傳送 軌跡長度l,方位角變化值θ的資料給下位機了。
回應一下,前文說過,如果只發座標陣列(x,y), 各位看以上可知,如果下位機接收到的是座標數字(x,y), 微控制器要進行開方, 和三角函式運算,這會降低智慧型小車的反應能力的。
再說下位機(微控制器智慧型小車), 倒推法。
下位機運動演算法思路:
1
轉彎,當左輪以某個角速度向前轉動,右輪以同樣的角速度向後轉動,小車就原地轉彎,如下圖
轉彎的演算法問題,實際就是,計算在每個軌跡點上,小車的車輛應該以某個設定的車輪角速度(兩輪轉動方向相反)轉動時間δt 的問題。
2直行, 就更簡單了, 已知相鄰兩點間距離l, 同樣直行的車輪轉動角速度可以程式設計給出某個設定值,相當於直行時的車輪角速度時已知量。只要求出直行所需的時間δt即可。δt=l/(ω*d)
最後,寫一下下位機的程式設計思路
1對智慧型小車通過pwm脈衝頻率設定,來設定轉彎時的車輪角速度,和直行的車輪角速度,或者設定為一樣大小都是可以的,請隨意。
2取出接收到的相鄰段軌跡,方位角變化陣列【l, θ】中的第乙個數值。
3用θ解算出對應點轉彎車輪需要轉動的時間t轉彎。
4用l解算出對應直線軌跡段直行車輪需要轉動的時間t直行。
5程式設計實現,讓小車以t轉彎長的時間左右車輪轉動**速相等,但轉動方向相反),實現轉彎;
6接著,程式設計實現,程式設計實現,讓小車以t直行長的時間左右車輪以相同速度前進,實現直行;
7然後,再取陣列中下一組【l, θ】,重複4,5步驟,知道陣列的末尾,小車就能實現按上位機手繪軌跡運動了。
寫在最後的補充,也許有人會說,小車運動的軌跡長度是多少,因為小車實際行駛的軌跡長度是可測量的。
這就是個對映關係了。上位機手繪軌跡,取出來的座標點是沒有單位的(就是繪圖視窗定義的座標系,單位是畫素),你可以對此資料比例對映為公釐,或者公尺都是可以的,讓智慧型小車按相同的單位換算就可以了。
兩輪自平衡小車總結
時光荏苒,大學四年的最後一項任務兩輪自平衡小車完工了。之前自己幾乎沒有做過嵌入式相關的事情,51也沒學過,為了給自己在大學四年六個幾年選擇了邊學stm32邊做就做還是比較刺激過癮的。兩輪自平衡小車如果剛到5年前還是乙個比較新穎的概念,那時候還沒有那麼多成熟的解決方案。當前伴隨著載人兩輪自平衡車的大規...
python turtle 畫單車兩輪
draw bicycle.py coding cp936 已知單車的車輪直徑約長60cm,兩車輪的圓心距約為100cm,輪胎徑長為4cm或5cm 用turtle 畫出單車的兩個輪子,要求圖形幾何相似 draw bicycle.py 18 20 import os,sys import turtle ...
輪椅的兩輪差速轉向控制策略(智慧型輪椅)
手柄訊號說明 目前輪椅上使用的速度轉向二維搖桿輸出與位置成線性比例的二維電壓訊號,將這兩個訊號作為車速和轉角的指令集合。使用者前 後推動可以連續調節輪椅的車速,左 右推動可以連續控制輪椅的轉角。通過操作手柄訊號處理演算法把乙個二維訊號轉換為速度和轉向控制指令。速度轉向二維搖桿輸出的訊號可由下圖來表示...