1.文件操作类的 simSaveScene(“a.ttt”)
2.General object handle retrieval 通用对象句柄检索
ex.simGetObjectHandle
MotorHandle_Left=simGetObjectHandle('LeftMotor')
//LeftMotor是在场景中设置的joint名字,后面对它的控制用MotorHandle_Left
simGetIkGroupHandle 获得逆解组的句柄
逆解组的名字通过如下查看:
对函数进行解释:用于获得同类型的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度刚好画出了一个圆。