机械臂控制 第一部分
- 预习--案例
- 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) – [设置电机角度]