V-rep(CoppeliaSim)添加相机,与python联合仿真,并使用python读取V-rep中的RGB图与深度图

目录

前言

本文主要介绍了如何使用python与V-rep联合仿真,并用OpenCV可视化V-rep中视觉传感器所能看到的 RGB图深度图 ,效果图如下。

在V-rep中构建场景

本文使用的V-rep版本是3.5:

  1. 打开V-rep,并将任意一个目标(如机械臂)拖入到场景中。
  2. 添加视觉传感器 ,在场景的空白处点击右键 -->Add -->Vision Sensor --> Perspective projection ,并将相机旋转合适的角度,使其能够看到机械臂,此时视觉传感器的名称为Vision_sensor
  3. 点击最右侧竖直工具栏图标按钮的脚本配置 按钮,点击右上角Insert new script 按钮,点击Child script(non-threaded)按钮创建脚本。点击Scripts 中的Associated object ,在下拉菜单中选择Vision_sensor ,将脚本与相机关联。

  4. 双击场景层次结构菜单栏中Vision_sensor 的图标,注意不要点击文字。在弹窗中设计图像分辨率大小,如512*512(一定要是2的幂次方)。

  5. 点击Vision_sensor 后面的书签按钮,弹出Lua脚本,添加simRemoteApi.start(19997) ,此处的19997 为端口号。

建立python与V-rep通信

  1. sim.py , simConst.py , remoteApi.dll(Windows) ,或 remoteApi.dylib(Mac os)remoteApi.so(Linux) 复制到python项目文件夹中。

其中,sim.py , simConst.py在vrep的安装目录中,具体在"programming/remoteApiBindings/python"下。 **remoteApi.dll(Windows)**在"programming/remoteApiBindings/lib/lib/Windows"下。

  1. python与vrep通信

    ① 调用import sim加载库;
    ② 利用sim.simxStart()建立客户端;
    ③ 调用以"simx"为前缀的vrep远程API函数;
    ④ 停止仿真:sim.simxFinish().

  2. 下面是以上面场景为例,写的python脚本,该脚本实现了与vrep的通信,并用OpenCV将vrep相机数据的RGB图和depth图进行了可视化显示:

python 复制代码
import sim
import time
import sys
import cv2
import numpy as np

#关闭之前的连接
sim.simxFinish(-1)

# 获得客户端ID
clientID = sim.simxStart('127.0.0.1',19997,True,True,5000,5)
print("Connection success!!!")

if clientID != -1:
    print('Connected to remote API server')
else:
    print('Connection not successful')
    sys.exit('Could not connect')

# 启动仿真
sim.simxStartSimulation(clientID,sim.simx_opmode_blocking)
print("Simulation start")

# 使能同步模式
sim.simxSynchronous(clientID,True)

# 获得对象的句柄
ret, targetObj = sim.simxGetObjectHandle(clientID,'target',sim.simx_opmode_blocking)
errorCode,visionSensorHandle = sim.simxGetObjectHandle(clientID,'Vision_sensor',sim.simx_opmode_oneshot_wait)
errprCode,resolution,rawimage = sim.simxGetVisionSensorImage(clientID,visionSensorHandle,0,sim.simx_opmode_streaming)



def readVisionSensor():
    global resolution
    errprCode, resolution, rawimage = sim.simxGetVisionSensorImage(clientID, visionSensorHandle, 0, sim.simx_opmode_buffer)
    sensorImage = []
    sensorImage = np.array(rawimage, dtype=np.uint8)    #transform the raw image to uint8
    sensorImage.resize([resolution[1], resolution[0], 3])        # Process the image to the format (256,128,3)
    cv2.flip(sensorImage, 0, sensorImage)  # image upside down
    image = sensorImage
    # print("image.shape: ", image.shape)
    return image

def readDepthSensor():
    global resolution
    # 获取 Depth Info
    sim_ret, resolution, depth_buffer = sim.simxGetVisionSensorDepthBuffer(clientID, visionSensorHandle, sim.simx_opmode_blocking)
    depth_img = np.asarray(depth_buffer)
    depth_img.shape = (resolution[1], resolution[0])
    zNear = 0.01
    zFar = 2
    depth_img = depth_img * (zFar - zNear) + zNear
    depth_img = cv2.flip(depth_img, 0)
    return depth_img

while True:
    # 获得对象的位置,并输出
    ret, arr = sim.simxGetObjectPosition(clientID,targetObj,-1,sim.simx_opmode_blocking)

    image = readVisionSensor()
    depth = readDepthSensor()
    print(depth)
    cv2.imshow("image", image)
    cv2.imshow("depth", depth)
    cv2.waitKey(1)
    saveFile = ".\image.jpg"  # 保存文件的路径
    cv2.imwrite(saveFile, depth)  # 保存图像文件


    if ret == sim.simx_return_ok:
        print(arr)

    # time.sleep(2)

# 退出
sim.simxFinish(clientID)
print('Program end')
  1. 先运行vrep仿真,再运行python脚本,即可进行显示。
相关推荐
CryptoPP17 分钟前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
树叶@18 分钟前
Python数据分析7
开发语言·python
wydaicls21 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地1 小时前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹1 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
奇树谦1 小时前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点2 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
浠寒AI2 小时前
智能体模式篇(上)- 深入 ReAct:LangGraph构建能自主思考与行动的 AI
人工智能·python