四、達爾文機器人開發指南(針對中國機器人比賽、華北五省機器人比賽)-----達爾文官方框架解讀

這是我開發過程中,參考的第二個博客,同樣爲了好理解,這裏我在歸納一下。以下是達爾文的各模塊圖:


一、DARwin 機器人Frame代碼簡析(一)

1. CM730.cpp

主要定義了一些和控制板CM730(OP2實際使用的控制板是740)相關的函數,在頭文件(CM730.h)中主要聲明瞭三個類,BulkReadData、PlatformCM730、CM730。

BulkReadData類主要作用就是讀取指定地址中的值int ReadByte(int address);int ReadWord(int address);參數address必須在start_address和start_address + length之間(start_address  length均爲成員變量)

CM730類主要是用來實現控制板相關的功能,比如:

開啓各個電機的電源(DXLPowerOn()),對指定接口進行寫操作(CM730::WriteByte())等

PlatformCM730類比較關鍵,在官方的架構圖中也可以看出來這個類主要作用就是用作接口。

也可以發現,這個類中定義的所有成員函數都是虛函數(virtual),而我們可以發現在LinuxCM730.h頭文件中(在Linux/include路徑下),實際上LinuxCM730繼承了(可能這個說法不嚴謹)PlatformCM730類(實際上從名字也可以看出來,linux屬於一種platform),並且將成員函數重寫,而LinuxCM730實際上和CM730控制板進行通信(不太確定,個人推測),這樣就實現了CM730類中的函數可以直接對控制板進行控制或者讀取。

2. MX28.cpp

主要是電機相關的信息,定義大量枚舉類型,並根據電機的型號不同(OP2使用的電機分辨率是0.88,但另一種電機型號分辨率是0.293),定義不同的枚舉類型值。

3. JointData.cpp

JointData類中定義了一些枚舉類型,主要是將各個電機編號命名,除掉手部的電機(OP2原廠不提供),共有20個電機,正好和枚舉類型一一對應。

同時也定義了一些枚舉類型用來儲存PID默認值。

還有一些前綴爲SLOPE的枚舉類型,個人猜測和路徑規劃的插值方式相關(逆運動學求解出的運動軌跡),值越大可能表示路徑點越少,運動越“僵硬”。

除此之外,還有一些成員函數被定義,可以主要分爲以下幾個部分:

(1) SetEnable,設定哪一個關節(或者哪一個手臂或腿部)可以進行移動。

(2) GetEnable,獲取某個關節是否可以動。

(3) SetValue(Angle、Radian、Slope),設置對某個電機發出的脈衝數量(角度值、弧度值、Slope猜測是和軌跡規劃有關,尚不清楚)Get+名字對應相應的get函數,比如獲取當前的角度。

(4) PID相關的set和get函數,主要用來設置電機的PID值。

4. Kinematics.cpp

主要用來存貯機器人形狀,各個關節之間的位置關係等信息(腿長,腳踝寬等)


————————————————


二、DARwin 機器人Frame代碼簡析(二)Motion Manager/Status

從官方的結構圖中可以看出,而實際上從頭文件中可以看出,MotionManager充當的是一個管理器的角色,在MotionManager的類中,定義了一些成員變量,其中就包括一個指向CM730類的指針用來對CM730實例對象進行相應的操作,比如開啓電機電源,對相應的控制板接口進行一些讀寫操作等等。

其次,成員變量中還定義了一個MotionModule指針的列表,MotionModule主要有三個部分,如開始的圖片中所示,包含Head、action、walking三個組件,而在成員函數中,也有加載或卸載制定組建的成員函數:

除此之外,MotionManager還有一些其他的成員函數,主要功能有:

(1)初始化MotionManager,初始化必須指定CM730實例對象,初始化中主要進行的工作就是調用我們之前提到過的CM730的成員函數Connect(),開啓通信接口,將電機上電。之後將對各個電機進行遍歷,使用CM730中的成員函數讀取電機的關節信息(角度值),

之後我們會發現如果讀取關節角度成功,會將MotionStatus中的JointData(實例對象m_CurrentJoints)的各個關節的信息進行賦值(達到更新關節值的效果),其實在這裏我們就已經可以推測出MotionStatus的具體作用了,那就是儲存當前的關節值,打開MotionStatus頭文件,我們會發現這個類沒有定義任何成員函數,只定義了一些整型常量,以及我們剛剛提到的JointData類。

此時,我們再回顧一下JointData類,可能會有更深的理解,JointData類並不是用來直接控制各個關節的角度的,而是用來存貯信息的,因爲我們可以看到成員變量中有三個非常重要的變量:

這三個數組實際上是一一對應的,每一位存貯的信息就是相應的電機序號的 Enable(是否激活),脈衝值以及角度值。

再回到MotionManager中,Initialize函數的功能就很清晰了,就是打開電機的電源,更新當前電機或者關節的角度等信息。

(2) 記錄信息(StartLogging、Process函數),這個函數主要用來將當前的陀螺儀等傳感器信息寫入到一個文件中,用來記錄數據。

總結來說,MotionManager可以看作是一個容器,其中包含了MotionStatus用來記錄關節信息(JointData類),其次還有三個MotionModule(Head,Walk,Action),還有CM730類用來對硬件進行控制,如圖所示:


 

三、DARwin 機器人Frame代碼簡析(三)MotionModule

MotionModule本身並沒有功能的實現,而是作爲基類被繼承,其中頭文件中定義了兩個虛函數可以被重寫:

其次還定義了一個JointData類用來儲存關節信息:

由MotionModule可以衍生出三個模塊:Action,Head以及Walking。

(1)Head。Head模塊比較簡單,主要是對機器人頭部的控制,從頭文件中就可以大概看出可以實現的功能:

上方的成員函數主要是獲取上下左右四個方向角度限值,下部的函數主要用來設置頭部移動,比如移動到Home點,按照給定的角度移動等(中間部分暫時清楚功能)

(2)Walking。Walking主要用來控制行走,主要會用到的功能就是Start和Stop,即開始行走,停止,行走過程中的步幅,擺動等細節幾乎都可以進行設置。

(3)Action
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章