機械臂控制 第一部分
- 預習--案例
- demo1 -singleIkGroupWithSingleIkElement-undamped(單關節逆運動學 - 無阻尼)
- demo2 -singleIkGroupWithSingleIkElement-damped(單關節逆運動學 - 有阻尼)
- demo 3-twoIkGroupsWithEachOneIkElement-resolutionOrderIsNotRelevant
- demo4-twoIkGroupsWithEachOneIkElement-resolutionOrderIsRelevant
- demo5-singleIkGroupWithTwoIkElements
- demo6-singleIkGroupWithTwoIkElements-weightedAndDampedResolution
- 小結
本案例主要講解多自由度機械臂的逆運動學,在開始之前先看一下,scenes/ik_fk_simple_examples.這些案例
第一類案例:1~~6
預習–案例
demo1 -singleIkGroupWithSingleIkElement-undamped(單關節逆運動學 - 無阻尼)
- 功能:雙關節機械臂將執行器末端從A(綠色)移動到B(紅色),採用逆運動學算法
- 說明:
- 如果B點在運動範圍內可得出關節角度,並正確移動
- 如果B點不在運動範圍內則會出現不唯一解,運動失常
- 演示:
- 代碼
初始化
function sysCall_init()
ui=simGetUIHandle('UI')
--不明白這裏的‘ik’在哪裏設置的
ik=sim.getIkGroupHandle('ik')
print(ik) -- 這裏打印輸出2030003,就是Handle編號
end
等待動作
function sysCall_actuation()
local a=simGetUIEventButton(ui)
if a==1 then
sim.handleIkGroup(ik)
end
end
demo2 -singleIkGroupWithSingleIkElement-damped(單關節逆運動學 - 有阻尼)
- 功能:實現和demo1一樣的功能,但是解算添加了最小二乘法的解法
- 說明:
- 如果B點在範圍內,則兩種解法效果一致
- 如果B點在範圍外,逆運動學解法不穩定,而最小二乘法可得出穩定解
- PS:這裏將兩種方法做了比較
- 代碼:備註了疑問,找不到按鈕設置
function sysCall_init()
ui=simGetUIHandle('UI')--點擊按鈕1使用逆運動學解算
ik=sim.getIkGroupHandle('ik')
這個按鈕不知道如何對應上去的
uiDamped=simGetUIHandle('UI_damped') --點擊按鈕2使用二乘法解算
ikDamped=sim.getIkGroupHandle('ik_damped')
end
function sysCall_actuation()
解法1
local a=simGetUIEventButton(ui)
if a==1 then
sim.handleIkGroup(ik)
end
解法2
a=simGetUIEventButton(uiDamped)
if a==1 then
sim.handleIkGroup(ikDamped)
end
end
demo 3-twoIkGroupsWithEachOneIkElement-resolutionOrderIsNotRelevant
- 功能:兩組機械臂分別控制
- 說明:就是兩個demo1拼到了一起
- 演示:
- 代碼:問題依舊如上
第一套線程
function sysCall_init()
ui=simGetUIHandle('UI_1')
ik=sim.getIkGroupHandle('ik_1')
end
第二套線程同第一套,標號爲2
demo4-twoIkGroupsWithEachOneIkElement-resolutionOrderIsRelevant
- 功能:依舊是跟隨
- 說明:實際還是兩部分,只是一個會是另一個的隨動
- 演示:依次點擊按鍵1,2
- 代碼:基本和demo3一樣
function sysCall_init()
ui1=simGetUIHandle('UI_1')
ik1=sim.getIkGroupHandle('ik_1')
ui2=simGetUIHandle('UI_2')
ik2=sim.getIkGroupHandle('ik_2')
end
function sysCall_actuation()
local a=s的GetUIEventButton(ui1)
if a==1 then
sim.handleIkGroup(ik1)
end
a=simGetUIEventButton(ui2)
if a==1 then
sim.handleIkGroup(ik2)
end
end
demo5-singleIkGroupWithTwoIkElements
- 功能:實現三種運動方式,1,2各自單獨運動。1,2一起運動
- 說明:
- 按鍵1,右邊移動
- 按鍵2,左邊移動
- 按鍵3,左右分別移動
- 演示:
e - 代碼:基本同上
自行腦補,基本同上
demo6-singleIkGroupWithTwoIkElements-weightedAndDampedResolution
- 功能:目標點不在範圍內的處理方式
原狀態:
向右:
向左:
兩邊:
- 代碼基本一致
小結
這部分講解了組和和元素的關係和逆運動學控制方式,代碼控制方式
重點函數
- 關於逆運動學
- ikGroup=sim.getIkGroupHandle(‘ik’) – [取handle]
- sim.setIkElementProperties(ikGroup,tipDummy,0) – [設置組參數]
- sim.handleIkGroup(ikGroup) – [逆運動計算]
- 關於電機
- motorJoint1=sim.getObjectHandle(‘fk_motor1’) – [取得電機handle]
- sim.setJointMode(motorJoint1,sim.jointmode_passive,0) – [設置電機模式]
- angle=sim.getJointPosition(motorJoint1) – [讀取電機角度]
- sim.setJointMode(motorJoint1,sim.jointmode_ik,0) – [設置電機角度]