1. 程式人生 > >在unity中實現機械臂的模擬操作的方法

在unity中實現機械臂的模擬操作的方法

最近需要在專案中用unity3D實現一個多自由度機械臂的模擬,由於是模擬而不是做遊戲,所以對位置、速度還有時間控制方面的要求比較嚴格,本文中機械臂的實現只涉及運動學而不考慮動力學等。

傳統方法中實現機械臂可以採用hingejoint(鉸鏈關節)來實現,鉸鏈關節的具體方法詳見unity指令碼手冊,用鉸鏈關節有其侷限性。

鉸鏈關節是靠給關節一個力以及一個關節要達到的轉動速度來進行轉動,靠給定鉸鏈轉動的最大值與最小值來使關節停止轉動,也可以給鉸鏈一個反方向力使其速度達到0來實現停止轉動的目的。為實現速度的瞬時變化,可以將鉸鏈關節的質量屬性(慣性屬性)設定為0,則速度的變化可以瞬間達到。

雖然這樣也可以實現類似機械臂中轉動關節的效果,但是這隻能進行粗略模擬,對要求速度實時變化可控,例如速度變化與正弦曲線類似的情況下,鉸鏈關節就極為不方便了。

而且鉸鏈關節相當於把兩個物體固定在了一起,在某些情況下會發生我們不希望看到的結果。

下面給出我在專案中實現機械臂關節轉動的方法。

一、機械臂聯動

為實現機械臂的末端隨之前的關節轉動而轉動的效果,這裡採用父子關係實現這種父臂帶動子臂動的效果。

採用這種方式的結果大概就是這樣,所有物體依次成父子關係排列。在hierarchy欄裡排成一大長串。

可以直接在hierarchy欄中拖動,也可以在指令碼中實現父子關係。

joint4.transform.parent=joint5.transform;

二、聯體座標變換

由於要採用4×4的位姿轉換矩陣約束每次轉動後的位姿,所以最好我們每個關節的轉動都是基於聯體座標系進行的變換(即每個關節的轉動角度都是相對於其上一個關節的
座標系)。在這裡我實現的是三自由度的球關節,其他正常關節與這個類似。這裡我用了三個空物體來實現球關節的效果,三個空物體依次成父子關係。每個空物體控制一個自由度的轉動,每個空物體的轉動都是相對於其父物體座標系的。具體的角度控制使用了transform.localrotation,localrotation是物體相對於父物體的姿態引數,能夠很好地控制子物體相對於父物體的相對姿態。
transform.localRotation = Quaternion.Euler(temp_angle[0], 0, 0);
//例如我要這個空物體控制x軸方向的轉動,那麼我就在這個空物體中改變temp_angle[0]的值,如果我要讓這個關節轉60度,你可以讓它在update裡每次轉1度,分60次轉完,這樣就實現了動畫的效果,當然如果要控制具體的時間,還要採用其他方法。

同理,如果要控制繞當前y軸和z軸的轉動只需要把temp_angle的位置換一下就好。

三、時間的控制

做模擬對時間的要求還是比較高的,最開始想用unity中的協程來做,但是後來發現用協程控制的時間不夠精確,有一定誤差,累積起來就無法忽視了。

於是採用了另一種方法,即把角度變化的程式碼放在FixedUpdate裡執行,在設定裡把時間間隔設成你需要的值,就可以控制物體角度等時間間隔變化了。

就不附具體程式碼了,總之大體的思路就是這樣~~~~~~

---------------------分割線--------------------------------------------

簡單做了個小demo,感興趣的同學可以去看看~~~

https://github.com/JinghanSun/armSimulationByUnity3D