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

 

逆運動學簡介

可能有些人還記得,在高中的時候,物理課中有一部分內容叫做“運動學”。簡單地說,這是力學領域中對一個目標物件(或一個點)運動的描述。這意味著在運動學中,您將使用數學公式和模型來對單個點的已知運動進行分析。顧名思義,逆運動學(IK)恰恰相反:透過一系列數學公式來反推並創建運動。

 

在機器人領域,通常使用的演算法只能根據相應的端點運動來計算所有關節的運動。現在,您可以清楚地看到逆運動學在伺服系統運動程式設計部分的難題上所具有的優勢——它是可以通用的。從理論上來說,僅一個演算法就可以處理機器人所執行的任何運動。從使用者的角度來說,它非常易於使用—您只需要告訴機器人向左轉90°,然後直行1米就可以了,而不必考慮每個伺服系統的位置。

模型

在以上段落中,一個詞不斷出現:一個(數學)模型。雖然聽起來很難,但是對於六足機器人這個專案來說,模型非常簡單:機器人能夠機械性的所達到的任何位置都可以由一組七個點來定義。一個用於身體,另外六個用於腿部。如果您查看了AP_Utils程式館(可在GitHub上獲取),特別是裡面的AP_Utils.h,就會看到關於這些點的定義(包含在其他內容中):

 


struct body {
float x;
float y;
float z;
float facing;
};


struct leg {
uint8_t number;
bool move;
float phi;
float z;
};

您可以看到在AP_Utils類中它們被聲明為私有結構。

body origin;
leg legs[6];

 

將這些結構私有化有以下兩個原因:

  1. 用戶不應具有隨意修改這些值的許可權。這些結構的存在是為了追蹤機器人的當前位置,因此,只有當機器人真正產生運動的時候這些結構才會發生變化。假如用戶想要更改當前的原點的z座標,會導致IK模型發生不可預測的變化—這顯然是不可取的。
  2. 通常,將共有函數和一個類中的變數數量控制到最低,是一種良好的程式設計習慣(尤其在C++中)。因此這樣做可以提高安全性,並利於API的輕鬆實現。

如果需要,我們可以將這些點視覺化。現在,我們的整個機器人由七個點來表示(圖3)。

arduino hexapod

圖3:IK模型的佈局表示。簡而言之,這就是六足機器人“認為”它所看起來的樣子。紅點是身體,藍點是腿。

這些結構用於追蹤所有腿部的位置以及機器人本身的位置。您可能注意到了,腿部的位置僅由兩個座標來定義:phiz。這是因為每條腿只有兩個自由度,因此只能沿著兩個軸進行行動。現在可以透過身體的xyz座標來對所有位置進行定義。每條腿的 phiz座標的範圍是-1到1,並且僅確定了腿相對於身體的位置。儘管現在來看這種複雜性似乎是不必要的,但是實際上這比每次運動後計算每條腿的xyz座標容易得多。phi座標表示水平運動,z表示垂直運動。

 

arduino hexapod

圖4:帶有phi軸和z軸的腿部細節