当前位置: 首页>編程日記>正文

vrep_Nao控制_学习记录

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 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 


https://www.fengoutiyan.com/post/14748.html

相关文章:

  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機