vrep_Nao控制_学习记录
vrep_Nao控制_学习记录
因为在学校里要学习vrep控制nao,但网上资源较少,找起来很费力,我也试试写写自己博客。我引用了一些大佬对vrep使用的探索,侵删。
Vrep 控制 nao
一、 关节参数表:
我们以nao的左臂中LElbowRoll3为例,它的作用是来控制左边小臂的左右摆动
- Joint栏
Pos. min. 位置最小值;位置的最小值,单位是度。
Pos. range位置范围;位置的可变换值,单位是度。
Position:默认位置的旋转角度,初始位姿用这个调整。
!!!注意:Position值的范围为[Pos. min. , Pos. min. + Pos. range]
所以,如果你输入的Position的值超出了这个范围,你输入的值就会变化,但是通过关节参数表或者代码设置目标位置时,就好像不用在意这个范围内,这点后面在介绍。
(1)现在我来补充一下Position这个参数
我们以LShoulderRoll3为例(为什么要换一个关节举例呢?因为当我修改LElbowRoll3的Position参数值后,它又重新恢复到原来的值。)
修改前LShoulderRoll3的Position值为0,如图1所示,注意此时nao的胳膊。
图一
然后我们将Position的值改为90(单位度)结果如图2所示,虽然我输入的是90,但是值变为了76.01,这就是我们上面注意提到的。此时手臂已经转动。
图二
我们在回到LElbowRoll3例子中
(2)我们进入Dynamic properties(动态特性),如图3所示。
Motor enabled(电机已启用) 打勾后关节可以转动
Target velocity(目标速度 单位度/秒) 当nao开始运动后,这个关节最终会达到该速度。
Maximum torque(最大扭矩) 可以看作加速度,它的值越大,关节到达Target velocity越快。
Target position(目标位置) 当nao开始运动后,这个关节最终会到达该位置。与上面的Position相似。
Upper velocity limit(速度上限)
Target velocity和Target position可以通过程序来控制,这两个属性也是nao运动的关键。velocity一般nao不用,nao主要是用Target position,我们第一次做的小车是使用Target velocity的。
图3
!!!注意:我主要写了这些常用的(只能看懂这些),关节属性表的详细参数见此链接https://blog.csdn.net/DanielDingshengli/article/details/80536342
二、程序控制
脚本简介:vrep的脚本代码分为四部分,如图4所示。详情请见链接https://blog.csdn.net/DanielDingshengli/article/details/80547400
其语言为lua,语言学习见菜鸟教程。
脚本编程的函数有很多,具体见vrep的官方文档,下面我只介绍我用到的。
sim.getObjectHandle(“物体名称”) 获得句柄,和c语言中的文件句柄差不多,也可以理解为指针。
minDeg和maxDeg是两个表(可以理解为lua语言中的数组),他们分别记录了关节转动的最小角度和最大角度。
sim.getObjectName(句柄指针) 获得该句柄的名字。
xml的用法见官方文档,这个具体我也不是很清楚,但是应该和html差不多。举例简单说一下:
tile 名称,就是我们的例子LElbowRoll3。
hslider 表明这是个滑条。
minimum 滑条最小值。
maximum 滑条最大值
id值很关键,不能重复。
结果
simUI.create(xml) 按照xml创建UI
simUI.setSliderValue(ui,1,0) 设置滑条的初始值,中间的参数是id号
simUI.getSliderValue(ui,1) 获取滑条的值,最后一个值是id号
关于这个UI控制其实对我们来讲作用不大。最后肯定是让nao自动抓取的。
sim.setJointTargetPosition(lElbowRoll3,-position) 这个函数就是控制nao的关键,第一个参数是句柄指针,第二个参数是目标位置。当运行该函数时,关节就会以某一速度转动到目标位置。
具体代码见最后。
Vrep属性部分翻译:
-
Model definition 模型定义
Object is model base
Edit model properties 编辑模型参数
Select model thumbnail 选择模型缩略图
Override properties 覆盖参数
Model is not visible 模型不可见
Model is not collidable 模型不可碰撞
Model is not measurable 模型不可测量
Model is not renderable 模型不可渲染
Model is not detectable 模型无法检测
Model is not dynamic 模型不是动态的
Model is not respondable 模型不响映
Model scripts are inactive(child scripts and customization scripts)
模型脚本处于非活动状态(子脚本和自定义脚本)
Invisible to other model` s bounding boxes 对其他模型的边界框不可见 -
General properties 常规属性
Selectable 可选
Invisible during selection 选择期间不可见
Select base of model instead 选择模型的基础
Ignored by depth pass 被深度传递忽略
Ignored by model bounding box 被模型边界框忽略
Ignored for view-fitting 忽略视图拟合
Cannot be deleted during simul 不能在模拟过程中删除
Cannot be deleted 无法删除 -
Object Special properties 对象特殊属性
Collidable 可碰撞的
Measurable 可测量的
Detectable 可检测
Renderable 可渲染
代码:(我的代码在JointRecorder中)
function sysCall_init()nao=sim.getObjectHandle("NAO")--Set degminDeg={0,-math.pi,-math.pi/2,0}maxDeg={math.pi/2,math.pi,math.pi/2,math.pi/2}--leftlShoulderPitch3=sim.getObjectHandle("LShoulderPitch3")lShoulderRoll3=sim.getObjectHandle("LShoulderRoll3")lElbowYaw3=sim.getObjectHandle("LElbowYaw3")lElbowRoll3=sim.getObjectHandle("LElbowRoll3")lThumbBase=sim.getObjectHandle("NAO_LThumbBase")--rightrShoulderPitch3=sim.getObjectHandle("RShoulderPitch3")rShoulderRoll3=sim.getObjectHandle("RShoulderRoll3")rElbowYaw3=sim.getObjectHandle("RElbowYaw3")rElbowRoll3=sim.getObjectHandle("RElbowRoll3")naoName=sim.getObjectName(nao)xml='<ui title="'..naoName..' Control Grasp" closeable="true" resizable="true" layout="vbox" >'..[[<tabs><tab title="LElbowRoll3"><hslider minimum="0" maximum="100" id="1"/></tab><tab title="LElbowYaw3"><hslider minimum="0" maximum="100" id="2"/></tab><tab title="LShoulderPitch3"><hslider minimum="0" maximum="100" id="3"/></tab><tab title="LShoulderRoll3"><hslider minimum="0" maximum="100" id="4"/></tab><tab title="NAO_LThumbBase"><button text="grasp" id="5"/></tab></tabs></ui>]]ui=simUI.create(xml)simUI.setSliderValue(ui,1,0)simUI.setSliderValue(ui,2,50)simUI.setSliderValue(ui,3,50)-- 50=(100-0)/2simUI.setSliderValue(ui,4,0)
endfunction sysCall_actuation()position=minDeg[1]+simUI.getSliderValue(ui,1)/100*(maxDeg[1]-minDeg[1])sim.setJointTargetPosition(lElbowRoll3,-position) position=minDeg[2]+simUI.getSliderValue(ui,2)/100*(maxDeg[2]-minDeg[2])sim.setJointTargetPosition(lElbowYaw3,-position)position=minDeg[3]+simUI.getSliderValue(ui,3)/100*(maxDeg[3]-minDeg[3])sim.setJointTargetPosition(lShoulderPitch3,position)position=minDeg[4]+simUI.getSliderValue(ui,4)/100*(maxDeg[4]-minDeg[4])sim.setJointTargetPosition(lShoulderRoll3,position)if(simUI.getWidgetVisibility(ui,5)) thensim.setJointTargetVelocity(lThumbBase,1)end
end
修改ui界面以后
function sysCall_init() nao=sim.getObjectHandle("NAO")--Set degminDeg={0,-math.pi,-math.pi/2,0}maxDeg={math.pi/2,math.pi,math.pi/2,math.pi/2}--left armlShoulderPitch3=sim.getObjectHandle("LShoulderPitch3")lShoulderRoll3=sim.getObjectHandle("LShoulderRoll3")lElbowYaw3=sim.getObjectHandle("LElbowYaw3")lElbowRoll3=sim.getObjectHandle("LElbowRoll3")--finger in left arm--fistlThumbBase=sim.getObjectHandle("NAO_LThumbBase")lLFingerBase=sim.getObjectHandle("NAO_LLFingerBase")lRFingerBase=sim.getObjectHandle("NAO_LRFingerBase")--secondrevolute_joint8=sim.getObjectHandle("Revolute_joint8")revolute_joint12=sim.getObjectHandle("Revolute_joint12")revolute_joint11=sim.getObjectHandle("Revolute_joint11")--thirdrevolute_joint14=sim.getObjectHandle("Revolute_joint14")revolute_joint13=sim.getObjectHandle("Revolute_joint13")--right armrShoulderPitch3=sim.getObjectHandle("RShoulderPitch3")rShoulderRoll3=sim.getObjectHandle("RShoulderRoll3")rElbowYaw3=sim.getObjectHandle("RElbowYaw3")rElbowRoll3=sim.getObjectHandle("RElbowRoll3")naoName=sim.getObjectName(nao)--[[xml='<ui title="'..naoName..' Control Grasp" closeable="true" resizable="true" layout="vbox" >'..[[<tabs><tab title="LElbowRoll3"><hslider minimum="0" maximum="100" id="1"/> </tab><tab title="LElbowYaw3"><hslider minimum="0" maximum="100" id="2"/></tab><tab title="LShoulderPitch3"><hslider minimum="0" maximum="100" id="3"/></tab><tab title="LShoulderRoll3"><hslider minimum="0" maximum="100" id="4"/></tab><tab title="NAO_LThumbBase"><button text="grasp" checkable="true" id="5"/></tab></tabs></ui>]]--]]xml='<ui title="'..naoName..' Control Grasp" closeable="true" resizable="true" layout="vbox" >'..[[<group><hslider minimum="0" maximum="100" id="1"/> </group><group><hslider minimum="0" maximum="100" id="2"/></group><group><hslider minimum="0" maximum="100" id="3"/></group><group><hslider minimum="0" maximum="100" id="4"/></group><group><button text="grasp" checkable="true" id="5"/></group></ui>]]ui=simUI.create(xml)simUI.setSliderValue(ui,1,0)simUI.setSliderValue(ui,2,50)simUI.setSliderValue(ui,3,50)-- 50=(100-0)/2simUI.setSliderValue(ui,4,0)simUI.setButtonPressed(ui,5,false)
endfunction sysCall_actuation()grasping=simUI.getWidgetVisibility(ui,5)--[[if(grasping) thensim.setJointTargetPosition(lThumbBase,0)sim.setJointTargetPosition(lLFingerBase,20)sim.setJointTargetPosition(lRFingerBase,30)elsesim.setJointTargetPosition(lThumbBase,0)sim.setJointTargetPosition(lLFingerBase,0)sim.setJointTargetPosition(lRFingerBase,0)end--]]if(grasping) thensim.setJointTargetVelocity(lThumbBase,0.2)sim.setJointTargetVelocity(lLFingerBase,0.2)sim.setJointTargetVelocity(lRFingerBase,0.2)sim.setJointTargetVelocity(revolute_joint8,0.2)sim.setJointTargetVelocity(revolute_joint12,0.2)sim.setJointTargetVelocity(revolute_joint11,0.2)sim.setJointTargetVelocity(revolute_joint14,0.2)sim.setJointTargetVelocity(revolute_joint13,0.2)elsesim.setJointTargetVelocity(lThumbBase,0)sim.setJointTargetVelocity(lLFingerBase,0)sim.setJointTargetVelocity(lRFingerBase,0)sim.setJointTargetVelocity(revolute_joint8,0)sim.setJointTargetVelocity(revolute_joint12,0)sim.setJointTargetVelocity(revolute_joint11,0)sim.setJointTargetVelocity(revolute_joint14,0)sim.setJointTargetVelocity(revolute_joint13,0)endposition=minDeg[1]+simUI.getSliderValue(ui,1)/100*(maxDeg[1]-minDeg[1])sim.setJointTargetPosition(lElbowRoll3,-position) position=minDeg[2]+simUI.getSliderValue(ui,2)/100*(maxDeg[2]-minDeg[2])sim.setJointTargetPosition(lElbowYaw3,-position)position=minDeg[3]+simUI.getSliderValue(ui,3)/100*(maxDeg[3]-minDeg[3])sim.setJointTargetPosition(lShoulderPitch3,position)position=minDeg[4]+simUI.getSliderValue(ui,4)/100*(maxDeg[4]-minDeg[4])sim.setJointTargetPosition(lShoulderRoll3,position)--if(simUI.getWidgetVisibility(ui,5)) then--sim.setJointTargetVelocity(lThumbBase,1)--end
end