CoppeliaSim(原V-REP)新手上路

目录

一、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 sim
sim.simxFinish(-1) # just in case, close all opened connections
clientID=sim.simxStart('127.0.0.1',19999,True,True,5000,5) # Connect to CoppeliaSim
if 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 sim
except:
    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 time
import math

print ('Program started')
sim.simxFinish(-1) # just in case, close all opened connections
clientID=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实现强化学习的过程!

  • 92
    点赞
  • 332
    收藏
    觉得还不错? 一键收藏
  • 44
    评论
V-REP用户手册是指V-REP仿真软件的用户指南,该软件是一款功能强大的机器人仿真平台。V-REP用户手册提供了关于如何使用V-REP软件的详细指导和说明。用户手册分为多个章节,涵盖了V-REP软件的各个方面。 首先,V-REP用户手册介绍了软件的安装和启动过程,包括了适用于不同操作系统的操作说明。然后,手册详细介绍了软件界面的各个组件和功能,如场景层次结构、物体和模型管理、相机设置等。对于初学者来说,这些内容对于了解软件的基本操作非常有帮助。 此外,V-REP用户手册还提供了关于物理引擎的说明,解释了如何设置和模拟不同类型的物理对象。手册还介绍了如何添加传感器、控制器和动作规划算法,以实现更复杂的仿真任务。手册还提供了关于远程API接口的说明,这使得用户可以通过编程来控制和监控仿真实验。 除了基本功能的介绍,V-REP用户手册还包含了一些高级功能的使用教程,如路径规划、机器人学习和视觉传感器。用户手册还提供了一些常见问题和故障排除的解决方案,以帮助用户解决在使用软件过程中遇到的问题。 总之,V-REP用户手册是一本全面指导用户如何使用V-REP软件的重要参考资料,可以帮助用户快速上手并实现各种机器人仿真任务。无论是对于学生、研究人员还是工程师来说,V-REP用户手册都是一本不可或缺的工具书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值