一步步製作下棋機器人之 coppeliasim進行機械臂簡單XY座標控制

人間四月芳菲盡,山寺桃花始盛開。
最近天氣不錯,但是想到同學都開始收二胎的份子錢了,頓感壓力。
唉.....
由於搬家,本該上週就完成的,鴿了一週後還沒完成。最近搬家,加上每天下班後還想忙點別的,真的是覺得時間不夠用了,即使還是個單身狗。

簡介

  • 之前完成了簡單的python驅動【coppeliasim】環境下搭建的機械臂。臂長是隨便畫的,所以這次在之前的基礎上進一步優化機械臂,將臂長等參數確定下來,然後實現簡單的界面控制。

實現

繪製機械臂:

如圖,簡單繪製長度準確的機械臂,臂長皆定義爲:圖中臂兩端的圓心的距離。
image
將【支架】的高度定義爲50cm
將【支撐短臂】的長度定爲5cm
將【第一長臂】的長度定義爲30cm
將【第二短臂】的長度定義爲20cm
此次,增加了一個簡單的夾爪,只添加了旋轉功能。
image

注意:爲了避免與公司產品相同,此處建模都做簡單的繪製處理用於示例;後面我還會修改機械臂類型或是關節數,使其與公司產品產生明顯區別,後續的硬件、軟件等內容也會盡可能的區別於公司方案,也會盡可能的從頭實現。因爲機械臂也是我一直想要實現的東西,而公司之前又有過這個項目,雖然暫時擱置,但我也不想因此有任何剽竊公司資源的嫌疑從而帶來不必要的麻煩。

導入coppeliasim

導入【coppeliasim】,添加並移動好Joint後,放置對應的順序關係,然後重命名。
因爲本次增加了一個旋轉夾爪,所以要多增加一個Joint。
在【Edit】中簡化模型。此次加了字體,所以我簡化爲80%,太小字體就簡化的看不到了。
名稱修改和上一次的一致後,添加程序文件並添加遠程端口函數,之前的程序就能直接用,若想控制夾爪旋轉,只需要增加對應的關節名稱即可操控。
image

爲了美觀,可以將Joint隱藏。選中Joint,雙擊或是【Tools->Scene Object Properties】,轉到【Common】,將【Visibility】中的勾去掉即可:
image
因爲物理仿真相關的設置比較複雜,需要深入理解各選項和含義,所以本次模擬也不涉及物理屬性。

PyQT界面

PyQT是QT框架的python綁定版本,目前支持到PyQT6,但PyQT5還比較常用。PyQT5提供GPL版和商業版證書,自由開發者可以使用免費的GPL許可,如果需要將PyQt用於商業應用,則必須購買商業許可。
實際上,比較推薦PySider6,使用LGPL協議,開源程度更友善,代碼幾乎完全兼容PyQT6.但是由於我習慣使用的是Anaconda的Spyder開發環境,其只支持PyQT開發(使用PySider會報錯),所以後面都使用PyQT5開發。
使用【QTCreater】來繪製簡單的操控界面:
image

X Y座標的實現

  • 推薦書籍:《機器人學導論--分析、控制及應用》,《機器人學中的狀態估計》
  • 常用方法是將機械臂抽象成數學座標矩陣,然後對應不同的參考座標系,利用矩陣運算實現機器人的正逆運動學解算,然後轉換回機械運動即可。
  • 而我們目前的機械臂只是個最簡單的運動模型,也因爲時間關係,我先用簡單的方法實現運動,矩陣實現的運動學解算放到後面實現。
  • 另外,需要了解座標系的知識,不同的參考座標系之間座標的轉換等。本次測試使用固定座標系,在俯視圖中,以機械臂向下爲默認方向,以【支撐短臂】與【第一長臂】的交點,即【ArmJoint1】爲座標原點,水平方向爲X軸,豎直方向爲Y軸,機械臂只在三四象限運動,即運動座標範圍爲以50cm爲半徑,過(-50,0),(0,50),(50,0)三點的半圓範圍:
    image
    由於臂長不對等,所以原點周圍的臂長差距範圍也是移動不到的,就是以(0,0)爲圓心,臂長差10cm爲半徑的圓。

簡單實現的原理

我們要想機械臂運動到目標的X,Y座標點,最終的目的就是要兩個機械臂轉到指定的角度。臂長已知,兩個端點座標已知。所以第一長臂的起點與第二短臂的末點,加上兩個臂的交點,三個點,求出三角形的角度,就能得到兩個臂需要轉的角度,進而就能實現簡單的座標控制了。示意圖如下:
image

由於第一臂的轉動會帶動第二臂的轉動,所以更好的求解示意圖是抽象爲兩個圓。分別以第一臂的固定端點與第二臂的末點爲圓心,以各自臂長爲半徑,抽象出兩個圓,他們至少有一個交點(二者伸直),最多有兩個交點(半徑不同,所以不會重合),而其中一個交點就是轉到指定座標後第一臂與第二臂的交點位置:
image

這樣做的好處是,兩個圓就是對應機械臂的運動範圍,求出交點,就能很快得到第一臂的旋轉角度,然後就能得到第二臂的旋轉角度。

計算過程

已知參數如下:
第一臂長度:R1 = 30cm
第二臂長度:R2 = 20cm
座標原點:(x1,y1)=(0,0),這個也是第一個圓的圓心座標
目標點座標:(x2,y2),這個也是第二個圓的圓心座標
則根據圓心座標可以求出兩個圓的距離爲 :

這個值可以用於判斷有幾個交點。
後面,可以用建立兩個圓的標準方程進行聯合進而求出交點的方法。
根據圓的一般方程:

聯立兩個圓的方程,消掉x2和y2,得到直線的一般方程 y=kx+b,然後迴帶入任一圓的方程,即可解得交點座標。

也可以用簡單的三角形的三角關係來判定。
image
可以參考:【求解兩圓的交點座標

然後根據座標,求出兩個臂的角度,發送給【coppeliasim】進行運動,就完成了。
對於第一個臂,已知斜邊長=R和(x,y)座標,根據三角函數就能求出角度。第二個臂一樣,只不過座標需要使用相對座標來計算。另外要注意,第二臂的旋轉角度是以X,Y軸計算的,所以在第一臂旋轉後,第二臂的參考系也跟着旋轉了,所以需要減去第一臂旋轉的角度

綁定PyQT

完成座標運動的解析後,就可以綁定到pyqt來實現一個簡單的座標控制了。
如圖,實現一個用於獲取座標的界面,實現點擊後,機械臂運動到所點擊的位置:
image
實際座標大小與臂長範圍大小需要換算。圖片比例是660X440按照畫圖的方式進行一定比例的換算,得到圓內的座標最大不超過(50,50)即可。可以自行更改圖案寬比,也可以內部通過獲取圖片大小來設定界面大小,最後反向計算出合理的座標值。此處爲了簡單,都用了固定的值進行計算。
由於時間關係,界面寫的比較簡單,按鈕的功能也沒加。本來計劃在label中實現一個跟隨鼠標移動的機械臂的,也沒完成。後續如果時間充足,會加上。還會加上控制末端夾爪角度的按鍵。
另外,圖內的圓的大小是隨便畫的,所以鼠標移動到內圈顯示超出範圍的點可能和內圈對應不上。

實現數據傳遞

可以在pyqt的代碼中調用之前編寫的機械臂控制相關的代碼,將座標發過去,即可進行機械臂控制。
由於時間關係,此處直接發送目標角度值,所以機械臂會直接運動過去。實際上,應該將運動分割開來,實現連續運動(實際上硬件上只需要發送最終的角度,電機就能直接運動過去,但是仿真軟件只會直接運動到目標值,可能有中間過程的配置方式,我沒找到。)所以後續會實現運動分割,實現連續運動。

總結

綜上,我們就實現了一個最簡單的到目標(x,y)點的運動仿真了,實現了基本的控制流程。後面可以更改爲更加規範的矩陣座標進行計算。
由於時間關係,座標計算和點運動還有BUG沒調試完成,所以點擊獲取座標後,運動的位置並不對,週末再進行完善。
後續就是進行代碼完善和轉爲更加正規的矩陣運算的方式,實現更加規範的代碼邏輯。然後就是開始硬件相關的設計,直到完成機械臂實物。
以上模型和代碼倉庫地址: 【Gitee倉庫

  • 本文水平有限,內容很多詞語由於知識水平問題不嚴謹或很離譜,但主要作爲記錄作用,希望以後的自己和路過的大神對必要的錯誤提出批評與指點,對可笑的錯誤請指出來,我會改正的。

  • 另外,轉載使用請註明作者和出處,不要刪除文檔中的關於作者的註釋。

隨夢,隨心,隨願,恆執念,爲夢執戰,執戰蒼天! ------------------執念執戰

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