前言
因为毕业设计做的是机械臂电机驱动相关,用到了V-REP这一款机器人仿真器软件,然而除了官方手册,其他方面可供参考的资料是少之又少。所以主要参考官方的使用手册、其他各方的资料以及结合自己实际使用的经历,在此进行记录。(更新中)
官方下载
下载和安装
V-REP提供了Windows Mac Linux版本的安装包下载,其中EDU版本的下载和使用是免费的,软件本身体积较小。
Windows环境的安装直接执行所下载的exe文件。
Linux系统其实是免安装的,直接执行对应的vrep.sh脚本文件即可以正常启动。这一点相对于其他运动仿真软件(如Gazebo)要友好的多。
启动和模型导入
windows平台下直接点击相应.exe文件可以启动,Linux系统下需要进入软件安装文件夹,然后执行vrep.sh脚本文件进行启动。
RemoteAPI Python
下面是我使用VREP的python接口控制一个六自由度机械臂的示例代码:
vrep.simxFinish(-1)
clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)#start connect
if clientID!=-1:
print 'Connected to remote API server'
vrep.simxLoadScene(clientID,'poppy_ergo_jr02.ttt',1,vrep.simx_opmode_oneshot_wait)
vrep.simxStartSimulation(clientID,vrep.simx_opmode_oneshot_wait) #start simulation
res,target = vrep.simxGetObjectHandle(clientID, "target", vrep.simx_opmode_oneshot_wait)
res,base = vrep.simxGetObjectHandle(clientID, "base", vrep.simx_opmode_oneshot_wait)
res,targetPosition = vrep.simxGetObjectPosition(clientID, target,base, vrep.simx_opmode_streaming)
print targetPosition
targetPosition[0]= 0.1
targetPosition[1]= -0.04
targetPosition[2]= 0.04
res = vrep.simxSetObjectPosition(clientID, target,base,targetPosition,vrep.simx_opmode_streaming)
res,m1Dyn = vrep.simxGetObjectHandle(clientID, "m1", vrep.simx_opmode_oneshot_wait)
res,m2Dyn = vrep.simxGetObjectHandle(clientID, "m2", vrep.simx_opmode_oneshot_wait)
res,m3Dyn = vrep.simxGetObjectHandle(clientID, "m3", vrep.simx_opmode_oneshot_wait)
res,m4Dyn = vrep.simxGetObjectHandle(clientID, "m4", vrep.simx_opmode_oneshot_wait)
res,m5Dyn = vrep.simxGetObjectHandle(clientID, "m5", vrep.simx_opmode_oneshot_wait)
res,m6Dyn = vrep.simxGetObjectHandle(clientID, "m6", vrep.simx_opmode_oneshot_wait)
res,m1Position = vrep.simxGetJointPosition(clientID, m1Dyn, vrep.simx_opmode_oneshot_wait)
res,m2Position = vrep.simxGetJointPosition(clientID, m2Dyn, vrep.simx_opmode_oneshot_wait)
res,m3Position = vrep.simxGetJointPosition(clientID, m3Dyn, vrep.simx_opmode_oneshot_wait)
res,m4Position = vrep.simxGetJointPosition(clientID, m4Dyn, vrep.simx_opmode_oneshot_wait)
res,m5Position = vrep.simxGetJointPosition(clientID, m5Dyn, vrep.simx_opmode_oneshot_wait)
res,m6Position = vrep.simxGetJointPosition(clientID, m6Dyn, vrep.simx_opmode_oneshot_wait)
try:
while 1:
res,m1Position = vrep.simxGetJointPosition(clientID, m1Dyn, vrep.simx_opmode_streaming)
res,m2Position = vrep.simxGetJointPosition(clientID, m2Dyn, vrep.simx_opmode_streaming)
res,m3Position = vrep.simxGetJointPosition(clientID, m3Dyn, vrep.simx_opmode_streaming)
res,m4Position = vrep.simxGetJointPosition(clientID, m4Dyn, vrep.simx_opmode_streaming)
res,m5Position = vrep.simxGetJointPosition(clientID, m5Dyn, vrep.simx_opmode_streaming)
res,m6Position = vrep.simxGetJointPosition(clientID, m6Dyn, vrep.simx_opmode_streaming)
angle2_comp = 0.95 - data1[1]*0.1/1080 - abs(683-abs(data1[0] - 960))*0.08/683
angle3_comp = 0.95 - data1[1]*0.1/1080 - abs(683-abs(data1[0] - 960))*0.08/683
motor_angle[0] = angle1a + m1Position*180/3.14
motor_angle[1] = angle2a + m2Position*180*angle2_comp/3.14
motor_angle[2] = angle3a + m3Position*180*angle3_comp/3.14
motor_angle[3] = angle4a - m4Position*180/3.14
motor_angle[4] = angle5a + m5Position*180*1/3.14
motor_angle[5] = angle6a - m6Position*180*1/3.14
print motor_angle
Motion(ser,motor_angle,packet)
print data1[0],data1[1]
print "Wheel"
print data2
if data2 == -1:
targetPosition[2] = 0.04
elif data2 == 0:
print " "
else:
targetPosition[2] = 0.1
targetPosition[0]= -0.1 + data1[0]/6800.0
targetPosition[1]= -0.04 - data1[1]/6800.0
res = vrep.simxSetObjectPosition(clientID, target,base,targetPosition,vrep.simx_opmode_streaming)
#res,targetPosition = vrep.simxGetObjectPosition(clientID, target,base, vrep.simx_opmode_streaming)
print targetPosition
time.sleep(0.05)
pass
except KeyboardInterrupt:
ser.close()
vrep.simxStopSimulation(clientID,vrep.simx_opmode_oneshot_wait)
vrep.simxFinish(clientID)
print "Simulation Finish"
print "Serial Closed"
pass