vrep_Nao控制_学习记录

因为在学校里要学习vrep控制nao,但网上资源较少,找起来很费力,我也试试写写自己博客。我引用了一些大佬对vrep使用的探索,侵删。
Vrep 控制 nao
一、 关节参数表:
我们以nao的左臂中LElbowRoll3为例,它的作用是来控制左边小臂的左右摆动

  1. 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,这就是我们上面注意提到的。此时手臂已经转动。
图2图二
我们在回到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
图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值很关键,不能重复。
结果
图4
simUI.create(xml) 按照xml创建UI
simUI.setSliderValue(ui,1,0) 设置滑条的初始值,中间的参数是id号
simUI.getSliderValue(ui,1) 获取滑条的值,最后一个值是id号
关于这个UI控制其实对我们来讲作用不大。最后肯定是让nao自动抓取的。
sim.setJointTargetPosition(lElbowRoll3,-position) 这个函数就是控制nao的关键,第一个参数是句柄指针,第二个参数是目标位置。当运行该函数时,关节就会以某一速度转动到目标位置。

具体代码见最后。

Vrep属性部分翻译:

  1. 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 对其他模型的边界框不可见

  2. 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 无法删除

  3. Object Special properties 对象特殊属性
    Collidable 可碰撞的
    Measurable 可测量的
    Detectable 可检测
    Renderable 可渲染

代码:(我的代码在JointRecorder中)

function sysCall_init()
    nao=sim.getObjectHandle("NAO")
    --Set deg
    minDeg={0,-math.pi,-math.pi/2,0}
    maxDeg={math.pi/2,math.pi,math.pi/2,math.pi/2}
    --left
    lShoulderPitch3=sim.getObjectHandle("LShoulderPitch3")
    lShoulderRoll3=sim.getObjectHandle("LShoulderRoll3")
    lElbowYaw3=sim.getObjectHandle("LElbowYaw3")
    lElbowRoll3=sim.getObjectHandle("LElbowRoll3")
    lThumbBase=sim.getObjectHandle("NAO_LThumbBase")
    --right
    rShoulderPitch3=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)/2
    simUI.setSliderValue(ui,4,0)
end

function 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)) then
        sim.setJointTargetVelocity(lThumbBase,1)
    end
end

修改ui界面以后

function sysCall_init() 
    nao=sim.getObjectHandle("NAO")
    --Set deg
    minDeg={0,-math.pi,-math.pi/2,0}
    maxDeg={math.pi/2,math.pi,math.pi/2,math.pi/2}
    --left arm
    lShoulderPitch3=sim.getObjectHandle("LShoulderPitch3")
    lShoulderRoll3=sim.getObjectHandle("LShoulderRoll3")
    lElbowYaw3=sim.getObjectHandle("LElbowYaw3")
    lElbowRoll3=sim.getObjectHandle("LElbowRoll3")
    --finger in left arm
        --fist
    lThumbBase=sim.getObjectHandle("NAO_LThumbBase")
    lLFingerBase=sim.getObjectHandle("NAO_LLFingerBase")
    lRFingerBase=sim.getObjectHandle("NAO_LRFingerBase")
        --second
    revolute_joint8=sim.getObjectHandle("Revolute_joint8")
    revolute_joint12=sim.getObjectHandle("Revolute_joint12")
    revolute_joint11=sim.getObjectHandle("Revolute_joint11")
        --third
    revolute_joint14=sim.getObjectHandle("Revolute_joint14")
    revolute_joint13=sim.getObjectHandle("Revolute_joint13")
    
    --right arm
    rShoulderPitch3=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)/2
    simUI.setSliderValue(ui,4,0)
    simUI.setButtonPressed(ui,5,false)
end

function sysCall_actuation()
    grasping=simUI.getWidgetVisibility(ui,5)
    --[[if(grasping) then
        sim.setJointTargetPosition(lThumbBase,0)
        sim.setJointTargetPosition(lLFingerBase,20)
        sim.setJointTargetPosition(lRFingerBase,30)
    else
        sim.setJointTargetPosition(lThumbBase,0)
        sim.setJointTargetPosition(lLFingerBase,0)
        sim.setJointTargetPosition(lRFingerBase,0)
    end--]]
    if(grasping) then
        sim.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)
    else
        sim.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)
    end
    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)) then
        --sim.setJointTargetVelocity(lThumbBase,1)
    --end
end 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值