Arduino六足機器人第二部分-程式設計

演算法

現在,我們對於機器人有了足夠簡單的數學表達,但是還沒有用它來做任何事。下一步就是研究如何透過僅僅修改該模型來實現伺服系統的運轉。我們需要完成的程式是將輸入作為一組點座標,並將其轉換為伺服系統的運行。

 

這時候另一個問題就出現了,而這次,僅僅替換成另一個Arduino無法解決。當啟動伺服系統時,我們可能需要使大部分伺服系統同時運轉。但是,Arduino(以及所有與此相關的AVRs)一次只能執行一項任務。這意味著如果我們如果想平穩地運轉伺服系統,就需要一個一個進行啟動。如果僅僅將伺服系統從一端直接運轉到另一端,整個過程將非常不穩定。

 

解決該問題的一種方法是事先計算好所有伺服系統的位置,然後反覆運算這些資料,並對所有伺服系統進行設定。因為Arduino MEGA的時脈頻率是16MHz,所以所有伺服系統雖然在實際過程中以很小的增量進行離散化運轉,但是整體表現出來的運行過程是連續流暢的。儘管它們只是靜態圖像的集合,但是這和視訊中所產生的連續運動的效果一致。人腦無法對視覺資訊進行快速處理。如果我們在每一次位置變換之後添加一個50毫秒的延遲,則很明顯,伺服系統運轉實際上是由小的增量所組成的。

 

這也是我們必須更換Arduino的原因。如果我們想要運行每一個伺服系統,那麼我們需要大量的記憶體來存儲剛剛所計算出的座標。如果我們運轉所有的伺服系統,我們將需要600個浮點數來存儲運動座標,因為每個伺服系統都至少需要50個位置才能產生平滑連續的運轉效果。600個浮點數大約是 2.3 kB的RAM—這已經超過了UNO的容量。

 

在AP_Utils程式館中,將位置轉換為伺服系統運轉狀況的是traceLeg()setLegs() 函數。traceLeg()函數僅進行計算:當提供了目標末端的phi z座標時,它將以座標陣列的形式創建一個路徑。路徑可以具有多種形狀,當前支援的是線形(從一個點到另一個點的簡單直線)、圓弧和橢圓弧。後兩種路徑可以使步行變得更加容易。第二種函數setLegs() 將根據traceLeg的結果來行動所有指定的支腿,但是,所有這些對常規用戶是隱藏的。整個方案的重點是盡可能地方便用戶使用。最終用戶將無需直接設定setLegs(),而僅需調用與行走直接相關的函數即可。

 

現在我們開始進入IK程式設計的最後一步,即真正的行走。我們已經完成了所有基礎工作:我們創建了一個模型來對所有事物進行追蹤,我們可以運行多個伺服系統,甚至可以使伺服系統的運轉變得相對平滑連續。在以下內容中,支腿的編號與下圖中的編號相對應:

 

arduino hexapod

圖5:支腿編號

該編號系統同時與您在程式館中找到的代碼一致。

我們先從簡單的操作開始:在場地上轉向。通常,在為支腿設定新的位置時,您必須保證其中三條腿在地面上。這背後的原因很明顯—除非您可以非常快地行動支腿,不然機器人將失去穩定性並跌倒。我們可以分幾步使機器人轉向: