CoppeliaSim(原V-REP)新手上路

发布时间 2024-01-03 14:48:43作者: xiondun

目录

一、CoppeliaSim简介

二、CoppeliaSim初入门

三、CoppeliaSim与python的连接

连接之前要做的事!!!

用python程序去连接CoppeliaSim并控制机器人

我遇到的问题

四、控制效果与代码

控制效果

代码

五、总结


后来就不做这个啦,不太了解你们遇到的问题

一、CoppeliaSim简介

CoppeliaSim(原V-REP)是一个机器人仿真平台,里面有很多来自别的公司的机器人模型以及完备的物理引擎,我们可以通过python,c++,matlab等语言控制里面的机器人。

CoppeliaSim的官网是:Robot simulator CoppeliaSim: create, compose, simulate, any robot - Coppelia Robotics

CoppeliaSim V4.1.0的下载网址:https://www.coppeliarobotics.com/files/CoppeliaSim_Edu_V4_1_0_Setup.exe,您也可以在官网中Downloads里找您需要的版本,一般只需要下载EDU版本就可以了,我下载的是v4.1.0 windows EDU版本。

在版本V4之前,CoppeliaSim叫V-REP,在官网可以下载到之前的V-REP版本。旧版本与新版本的代码相差不是特别大,python中只需将vrep改成sim就行,V-REP创建的scene在CoppeliaSim也能正常运行。

CoppeliaSim的官方资料网址:CoppeliaSim User Manual,在上面可以查找函数的使用说明,个人认为函数说明是足够的,但缺乏实例,新手上路还是不方便。

CoppeliaSim资料页面

二、CoppeliaSim初入门

CoppeliaSim操作界面

简单介绍一下,上图就是CoppeliaSim的操作界面,从model browser中拖出底板、围墙、机器人等物件,然后可以设置他们的position和Rotation,这个大家自己摸索一下就可以建立自己的世界了!

三、CoppeliaSim与python的连接

连接之前要做的事!!!

①新建一个文件夹,这个文件夹将包括您未来写的函数,然后要将3个重要文件复制到这个文件夹里,分别是:sim.py,simConst.py以及remoteApi.dll

sim.py和simConst.py在:..\CoppeliaRobotics\CoppeliaSimEdu\programming\remoteApiBindings\python\python\下

remoteApi.dll在:..\CoppeliaRobotics\CoppeliaSimEdu\programming\remoteApiBindings\lib\lib\Windows\下

直接将这3个复制到您的文件夹中即可。

②打开CoppeliaSim,点开场景右边的代码,添加一句:

simRemoteApi.start(19999)

这个代码是建立连接必须的

python程序去连接CoppeliaSim并控制机器人

直接贴代码,这段代码在:..\CoppeliaRobotics\CoppeliaSimEdu\programming\remoteApiBindings\python\python\simpleTest.py中有

这个代码的功能是一个基础的连接功能,大家刚入门的时候可以先跑这个代码,在跑代码之前需要在CoppeliaSim运行仿真,这样才能连接上!

import simsim.simxFinish(-1) # just in case, close all opened connectionsclientID=sim.simxStart('127.0.0.1',19999,True,True,5000,5) # Connect to CoppeliaSimif clientID !=-1:    print ('Connected to remote API server')else:    print ('Failed connecting to remote API server')sim.simxGetPingTime(clientID)sim.simxFinish(clientID)

代码讲解:sim.simxFinish(-1)是断开一切可能的连接,sim.simxStart就是python和CoppeliaSim建立连接的代码,返回的clientID是建立连接的ID,可以理解为指向你的scene,后续一切的操控都需要用到这个ID,sim.simxFinish(clientID)用在程序的结尾断开连接。

能够成功连接上CoppeliaSim之后我们就可以读取或者控制CoppeliaSim中的物件了。

ret, targetObj = sim.simxGetObjectHandle(clientID, 'Quadricopter_target',                   sim.simx_opmode_blocking)ret, arr = sim.simxGetObjectPosition(clientID, targetObj, -1, sim.simx_opmode_blocking)if ret==sim.simx_return_ok:    print (arr)sim.simxSetObjectPosition(clientID, targetObj,-1,(arr[0],arr[1] + 0.5,arr[2]),                   sim.simx_opmode_blocking)

代码讲解,sim.simxGetObjectHandle就是获取你目标物体的ID,'Quadricopter_target'可以在你的scene中找到,如下图所示,这上面的名字就可以在代码中调用。Quadricopter_target是无人机的目标位置,无人机会飞到目标位置然后悬空不动。

sim.simxGetObjectPosition可以获取CoppeliaSim中物体的坐标,返回的arr是x,y,z三维坐标。sim.simxSetObjectPosition就是设置物体的坐标,当改变无人机的目标位置时,无人机就会朝着新的目标位置运动,从而控制无人机的飞行。如果设置步长太大的话,会导致无人机飞炸,说明默认的无人机控制程序并不好,所以要么每次控制的步长小点,要么在设置完之后来一个time.sleep(0.5),让无人机飞到目标位置后再进行下一步。

我遇到的问题

使用CoppeliaSim环境来做强化学习的训练,需要在训练完一个epoch后,需要环境从头开始,很简单,就是reset一下。

然后我找来了两句相关代码:

stop = sim.simxStopSimulation(clientID, sim.simx_opmode_blocking)time.sleep(4)#需要反应时间start = sim.simxStartSimulation(clientID, sim.simx_opmode_blocking)

sim.simxStopSimulation就是结束仿真,sim.simxStartSimulation就是开始仿真。我整了一晚上,只能做到Stop,Stop完就无法重启,查阅很多资料没法查到解决方案,最后是在看了很多别人的代码后,对一个地方作出了一个小改动就成功了。

将代码中的19999改为19997:

clientID=sim.simxStart('127.0.0.1',19999,True,True,5000,5)

改为

clientID=sim.simxStart('127.0.0.1',19997,True,True,5000,5)

改成19997后就可以成功的关闭和开启了,改成19995也不行,我也不知道是为什么,可能19997有什么特殊含义吧。或许有知道的大佬可以在评论区告诉我,万分感谢!!!

四、控制效果与代码

完整的代码包括场景已上传Github

GitHub - lzw0515/CoppeliaSim_python: CoppeliaSim introduction 入门

控制效果

代码

# Make sure to have the server side running in CoppeliaSim: # in a child script of a CoppeliaSim scene, add following command# to be executed just once, at simulation start:## simRemoteApi.start(19999)## then start simulation, and run this program.## IMPORTANT: for each successful call to simxStart, there# should be a corresponding call to simxFinish at the end! try:    import simexcept:    print ('--------------------------------------------------------------')    print ('"sim.py" could not be imported. This means very probably that')    print ('either "sim.py" or the remoteApi library could not be found.')    print ('Make sure both are in the same folder as this file,')    print ('or appropriately adjust the file "sim.py"')    print ('--------------------------------------------------------------')    print ('') import timeimport math print ('Program started')sim.simxFinish(-1) # just in case, close all opened connectionsclientID=sim.simxStart('127.0.0.1',19997,True,True,5000,5) # Connect to CoppeliaSim#print(clientID)#0 if clientID != -1:    print ('Connected to remote API server')    # Now try to retrieve data in a blocking fashion (i.e. a service call):    res,objs=sim.simxGetObjects(clientID,sim.sim_handle_all,sim.simx_opmode_blocking)    if res==sim.simx_return_ok:        print ('Number of objects in the scene: ',len(objs))    else:        print ('Remote API function call returned with error code: ',res)        ret, targetObj = sim.simxGetObjectHandle(clientID, 'Quadricopter_target', sim.simx_opmode_blocking)    if ret != sim.simx_return_ok:        print("!!!")     ret, arr = sim.simxGetObjectPosition(clientID, targetObj, -1, sim.simx_opmode_blocking)    if ret==sim.simx_return_ok:        print (arr)    time.sleep(1)     # Now retrieve streaming data (i.e. in a non-blocking fashion):    startTime=time.time()    #sim.simxGetIntegerParameter(clientID,sim.sim_intparam_mouse_x,sim.simx_opmode_streaming) # Initialize streaming    while time.time()-startTime < 5:     #returnCode,data=sim.simxGetIntegerParameter(clientID,sim.sim_intparam_mouse_x,sim.simx_opmode_buffer) # Try to retrieve the streamed data          ret, arr = sim.simxGetObjectPosition(clientID, targetObj, -1, sim.simx_opmode_blocking)        if ret==sim.simx_return_ok:            print (arr)                sim.simxSetObjectPosition(clientID, targetObj,-1,(arr[0],arr[1] + 0.5,arr[2]), sim.simx_opmode_blocking)         time.sleep(0.5)      # Before closing the connection to CoppeliaSim, make sure that the last command sent out had time to arrive. You can guarantee this with (for example):    sim.simxGetPingTime(clientID)     sim.simxStopSimulation(clientID, sim.simx_opmode_oneshot)     # Now close the connection to CoppeliaSim:    sim.simxFinish(clientID)else:    print ('Failed connecting to remote API server')print ('Program ended')

五、总结

因为我最近在学习强化学习(RL),而强化学习需要一个科学的实验环境,于是选择了CoppeliaSim平台。这个平台的资料也不是特别多,遇到了问题查阅了很久的资料没有解决我遇到的问题,而在跌跌撞撞之中恰巧解决了,所以我也是将这个经验分享出来,如果您遇到同样的问题,或许对您有帮助,后续我会继续更新在CoppeliaSim实现强化学习的过程!