V-REP教程(七)API function

浏览Regular API function list (by category)


1.文件操作类的 simSaveScene(“a.ttt”)
2.General object handle retrieval 通用对象句柄检索
ex.simGetObjectHandle

MotorHandle_Left=simGetObjectHandle('LeftMotor')
//LeftMotor是在场景中设置的joint名字,后面对它的控制用MotorHandle_Left

simGetIkGroupHandle 获得逆解组的句柄
逆解组的名字通过如下查看:
这里写图片描述

 simGetObjects
这里写图片描述

  对函数进行解释:用于获得同类型的0~所有的对象的句柄,比如控制四个电机,用 Motor=simGetObjects(4,sim_object_joint_type)。

3.General functionality handling 通用功能处理

e.g simulationTime=simGetSimulationTime()+simGetSimulationTimeStep()// result=simHandleGraph(graphHandle,simulationTime)//记录从开始到结束的全部数据
4.Collision detection functionality 碰撞检测功能
simGetCollisionHandle //句柄
simIsHandleValid //判断是否有效
simHandleCollision //处理
simReadCollision //读取
simResetCollision //重置
simCheckCollision //检查是否有碰撞
5.Minimum distance calculation functionality 计算物体间最小距离
   和上面类似。

6.IK and geometric constraint solver functionalities 逆解和集合约束求解器函数
eg.这里写图片描述

simComputeJacobian 计算雅可比

simGetIkGroupMatrix 得到逆运动学矩阵
table matrix , table_2 matrixSize=simGetIkGroupMatrix(number ikGroupHandle,number options) //matrixSize是矩阵的行列
有必要看一看矩阵输出的实现:
这里写图片描述

7.Path/Motion planning functionality 轨迹和移动规划
e.g simGetConfigForTipPose
随机搜索与给定的末端执行器位置/空间方向匹配的机械手configuration。
simGenerateIkPath
生成一条路径,将机器人从当前位置驱动到目标dummy的直线上。

table path=simGenerateIkPath(number ikGroupHandle,table jointHandles,number ptCnt,table collisionPairs=nil,table jointOptions=nil)

8.Dynamics functionality 动力学功能
e.g 设置关节力矩number result=simSetJointForce(number objectHandle,number forceOrTorque)


9.Proximity,Vision ,Force 三大传感器
另写文章

10.Joint object functionality 关节对象函数
simSetJointPosition
simGetJointPosition //设置和读取位置
simSetJointTargetPosition
simGetJointTargetPosition //设置和读取目标位置,先设置后读取
simSetJointTargetVelocity
simGetJointTargetVelocity//速度
simSetJointForce//设置关节力
simGetJointMatrix//获得关节的本征变换矩阵

11.………………………………
12.Simulation functionality
simGetSimulationState//获取仿真状态
simGetSimulationTime//获取仿真时间
simGetSimulationTimeStep//获取仿真时间间隔
simGetRealTimeSimulation//是否是实时的仿真
13.Matrix operations & transformations 矩阵操作方面
14.Signals 信号
simSetIntegerSignal//设置整型信号 number result=simSetIntegerSignal(string signalName,number signalValue)
simGetIntegerSignal//获取信号值 number signalValue=simGetIntegerSignal(string signalName)
simClearIntegerSignal//清除
simWaitForSignal//等待一个信号
……

浏览完毕


**实例**UR5

-- This is a threaded script, and is just an example!

jointHandles={-1,-1,-1,-1,-1,-1}
for i=1,6,1 do
    jointHandles[i]=simGetObjectHandle('UR5_joint'..i)//..连接两个字符串
end
//用一个六维数组存储六个关节的句柄
-- Set-up some of the RML vectors:
vel=180
accel=40
jerk=80
currentVel={0,0,0,0,0,0,0}
currentAccel={0,0,0,0,0,0,0}
maxVel={vel*math.pi/180,vel*math.pi/180,vel*math.pi/180,vel*math.pi/180,vel*math.pi/180,vel*math.pi/180}
maxAccel={accel*math.pi/180,accel*math.pi/180,accel*math.pi/180,accel*math.pi/180,accel*math.pi/180,accel*math.pi/180}
maxJerk={jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180,jerk*math.pi/180}
targetVel={0,0,0,0,0,0}
//参数
targetPos1={90*math.pi/180,90*math.pi/180,-90*math.pi/180,90*math.pi/180,90*math.pi/180,90*math.pi/180}
simRMLMoveToJointPositions(jointHandles,-1,currentVel,currentAccel,maxVel,maxAccel,maxJerk,targetPos1,targetVel)

targetPos2={-90*math.pi/180,45*math.pi/180,90*math.pi/180,135*math.pi/180,90*math.pi/180,90*math.pi/180}
simRMLMoveToJointPositions(jointHandles,-1,currentVel,currentAccel,maxVel,maxAccel,maxJerk,targetPos2,targetVel)

targetPos3={0,0,0,0,0,0}
simRMLMoveToJointPositions(jointHandles,-1,currentVel,currentAccel,maxVel,maxAccel,maxJerk,targetPos3,targetVel)

simRMLMoveToJointPositions 查表理解该函数

这里写图片描述

可知:该函数是控制几个关节同时转动,只能在线程脚本中使用。

动作如下:
这里写图片描述
这里写图片描述

实例 IRB4600

setIkMode=function()
    simSetExplicitHandling(ikGroup,0) -- that enables implicit IK handling
    //设置显式处理ikGroup
    simSwitchThread()
end

setFkMode=function()
    simSetExplicitHandling(ikGroup,1) -- that disables implicit IK handling
    simSwitchThread()
    simSetObjectParent(ikTarget,ikTip,true)
    simSetObjectPosition(ikTarget,ikTip,{0,0,0})
    simSetObjectPosition(ikTarget,ikTip,{0,0,0})
    //设置对象位置,第一个参数是要设置的,第二个参数是参考坐标系,第三个是在参考坐标系中的坐标;
end

moveToJointPositions=function(newPos,velF)
    if not velF then velF=1 end
    local accel=40*math.pi/180
    local jerk=20*math.pi/180
    local currentVel={0,0,0,0,0,0}
    local currentAccel={0,0,0,0,0,0}
    local maxVel={velF*175*math.pi/180,velF*175*math.pi/180,velF*175*math.pi/180,velF*250*math.pi/180,velF*250*math.pi/180,velF*360*math.pi/180}
    local maxAccel={accel,accel,accel,accel,accel,accel}
    local maxJerk={jerk,jerk,jerk,jerk,jerk,jerk}
    local targetVel={0,0,0,0,0,0,0}
    simRMLMoveToJointPositions(jointHandles,-1,currentVel,currentAccel,maxVel,maxAccel,maxJerk,newPos,targetVel)
end

moveToAuxJointPosition=function(newPos,velF)//AUX是辅助的意思
    if not velF then velF=1 end
    local vel=40*math.pi/180
    local accel=10*math.pi/180
    local jerk=30*math.pi/180
    local currentVel={0}
    local currentAccel={0}
    local maxVel={vel*velF}
    local maxAccel={accel}
    local maxJerk={jerk}
    local targetVel={0}
    simRMLMoveToJointPositions({auxJoint},-1,currentVel,currentAccel,maxVel,maxAccel,maxJerk,{newPos},targetVel)
end
//到达两个位置的函数
threadFunction=function()
    -- Main loop:
    while simGetSimulationState()~=sim_simulation_advancing_abouttostop do

        setFkMode()
        moveToJointPositions({90*math.pi/180,-30*math.pi/180,60*math.pi/180,0*math.pi/180,60*math.pi/180,0*math.pi/180})

        setIkMode()
        simSetObjectPosition(auxJoint,model,{0,1.5,0})
        simSetJointPosition(auxJoint,0)
        simSetObjectParent(ikTarget,auxJoint,true)
        moveToAuxJointPosition(360*math.pi/180)


        setFkMode()
        moveToJointPositions({0*math.pi/180,-30*math.pi/180,60*math.pi/180,0*math.pi/180,60*math.pi/180,0*math.pi/180})

        setIkMode()
        simSetObjectPosition(auxJoint,model,{1.5,0,0})
        simSetJointPosition(auxJoint,0)
        simSetObjectParent(ikTarget,auxJoint,true)
        moveToAuxJointPosition(360*math.pi/180)


        setFkMode()
        moveToJointPositions({-90*math.pi/180,-30*math.pi/180,60*math.pi/180,0*math.pi/180,60*math.pi/180,0*math.pi/180})

        setIkMode()
        simSetObjectPosition(auxJoint,model,{0,-1.5,0})
        simSetJointPosition(auxJoint,0)
        simSetObjectParent(ikTarget,auxJoint,true)
        moveToAuxJointPosition(360*math.pi/180)


        setFkMode()
        moveToJointPositions({0*math.pi/180,0*math.pi/180,0*math.pi/180,0*math.pi/180,0*math.pi/180,0*math.pi/180})

    end
end

-- Initialization:
jointHandles={}
for i=1,6,1 do
    jointHandles[i]=simGetObjectHandle('IRB4600_joint'..i)
end
model=simGetObjectAssociatedWithScript(sim_handle_self)
ikGroup=simGetIkGroupHandle('IRB4600')
ikTip=simGetObjectHandle('IRB4600_IkTip')
ikTarget=simGetObjectHandle('IRB4600_IkTarget')
auxJoint=simGetObjectHandle('IRB4600_auxJoint')
//初始化,并且设置ikGroup
-- Main function:
res,err=xpcall(threadFunction,function(err) return debug.traceback(err) end)//执行线程函数,追踪错误
if not res then
    simAddStatusbarMessage('Lua runtime error: '..err)
end//如果发生错误显示……

结果:
这里写图片描述
解释:
这里写图片描述
这里写图片描述
注意看图中的auxjoint,它通过simSetObjectParent(ikTarget,auxJoint,true)函数在仿真过程中成了target的parent,moveToAuxJointPosition(360*math.pi/180)让辅助关节转了360度,此时target也转了360度刚好画出了一个圆。

猜你喜欢

转载自blog.csdn.net/danieldingshengli/article/details/80642307
今日推荐