【Coppeliasim】C++ 读取Coppeliasim视觉传感器图像数据,winform显示

本文介绍了使用C++在CoppeliaSim环境中读取不同类型的传感器数据的方法,包括视觉传感器图像、接近传感器状态及力传感器的数据。同时展示了如何通过Lua脚本自动生成带有随机颜色的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

54fde641d4c02d136dc186b40b50fd23.png

实验截图:C++读取传感器数据

5c9db41543df5d0b07413509cdaf5f51.png

实验截图:C++读取视觉传感器数据

实验视频

笔记:

一、传感器类:读取传感器数据

//传感器构造函数:类型,名
CoppeliaSensor::CoppeliaSensor(int type, string name) 
{
  sensor_type = type;
  sensor_name = name;
}
//初始化:获取传感器句柄
int CoppeliaSensor::init() 
{
  int ret = simxGetObjectHandle(clientID, sensor_name.c_str(), &sensor_handle, simx_opmode_blocking);
  if (ret != simx_return_ok) return 0;


  if (sensor_handle != 0) {
    if (sensor_type == vision_sensor) { //视觉传感器:获取图像image
      simxGetVisionSensorImage(clientID, sensor_handle, resolution, &image, 0, simx_opmode_streaming);
    }
    else if (sensor_type == proximity_sensor) {//接近传感器:获取状态数据
      simxUChar state;
      float objPoint[3];
      float objNorm[3];
      int objHandle;
      simxReadProximitySensor(clientID, sensor_handle,&state, objPoint, &objHandle, objNorm, simx_opmode_streaming);
    }
    else if (sensor_type == force_sensor) {//力传感器:获取状态数据力和力矩
      simxUChar state;
      float force[3], torque[3];
      simxReadForceSensor(clientID, sensor_handle, &state, force, torque, simx_opmode_streaming);
    }
  }
  else {
    printf("Failed to initialize sensor!!! \n");
  }
  return sensor_handle;
}
//获取视觉传感器图像
void CoppeliaSensor::get_image(simxUChar** img, int res[2]) 
{
  simxGetVisionSensorImage(clientID, sensor_handle, res, img, 0, simx_opmode_buffer);// 
}
//获取接近传感器状态
int CoppeliaSensor::get_state() 
{
  int ret = simxReadProximitySensor(clientID, sensor_handle, &data.state, data.objPoint, &data.objHandle, data.objNorm, simx_opmode_buffer);
  return (int) data.state;
}
//读取力传感器
void CoppeliaSensor::readForce(float dataForce[6]) 
{
  simxReadForceSensor(clientID, sensor_handle, &state, force, torque, simx_opmode_buffer);
  for (int i = 0; i < 3; i++) {
    dataForce[i] = force[i];
    dataForce[i + 3] = torque[i];
  }
}

二、读取视觉传感器图像

// 转换Mat到 Hbitmap 以更新图片框中的图像:
Bitmap^ MatToHbitmap(Mat inputImg) {
  Mat src;
  inputImg.copyTo(src);
  cvtColor(src, src, COLOR_RGB2BGRA);
  HBITMAP hBit = CreateBitmap(src.cols, src.rows, 1, 32, src.data);
  Bitmap^ bmp = Bitmap::FromHbitmap((IntPtr)hBit);
  return bmp;
}


void read_vision_sensor(void*) {
  simxUChar* image = 0;
  int res[2];//分辨率
  while (1) {
    camera.get_image(&image, res);//读取传感器图像数据
    Mat img(res[1], res[0], CV_8UC3, image);//创建图像
    flip(img, img, 0);//反转图像
    imshow("image", img);
    img.copyTo(outputImg);
    if (outputImg.data != nullptr) imgAvailable = true; //在主界面显示图像
    else imgAvailable = false; 
    waitKey(30);
  }
}

三、生成对象Lua脚本

--Infinite_object  生成对象
function sysCall_init()
    corout=coroutine.create(coroutineMain)
end


function sysCall_actuation()
    if coroutine.status(corout)~='dead' then
        local ok,errorMsg=coroutine.resume(corout)
        if errorMsg then
            error(debug.traceback(corout,errorMsg),2)
        end
    end
end


function sysCall_cleanup()
    -- do some clean-up here
end


function coroutineMain()


    -- 初始化随机颜色
    red = {0.7, 0.1, 0.1}
    green={0.1, 0.7, 0.1}
    blue={0.1, 0.1, 0.7}
    
    color={red, green, blue}--颜色数组
    
    local VISIBLE_EDGE=2   --
    local RESPONDABLE_SHAPE=8  --
    local tblSize = {0.06, 0.08, 0.06}--方块尺寸
    
    posHandle=sim.getObject('/object_position')--位置句柄
    pos = sim.getObjectPosition(posHandle, -1)--位置
    while true do
        local hndShape = sim.createPrimitiveShape(sim.primitiveshape_cuboid,tblSize,0)--创建图元:方块
        sim.setObjectPosition(hndShape, -1, pos) --设置位置
        sim.setObjectOrientation(hndShape, -1, {0, 0, math.random(1, 30)})--设置方位
        sim.setObjectSpecialProperty(hndShape,sim.objectspecialproperty_detectable)--设置属性
        sim.setObjectInt32Param(hndShape, sim.shapeintparam_static, 0)--设置静态
        sim.setObjectInt32Param(hndShape, sim.shapeintparam_respondable, 1) --设置反弹
        --sim.setShapeColor(hndShape,nil,sim.colorcomponent_ambient_diffuse,color[math.random(1,3)])
        sim.setShapeColor(hndShape,nil,sim.colorcomponent_ambient_diffuse,color[2])--设置颜色
        sim.setObjectFloatParam(hndShape, sim.shapefloatparam_mass, 0.05) --设置质量
        
        sim.wait(12)
    end
end

The End

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值