实验截图:C++读取传感器数据
实验截图: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