惊了,webots自带视觉识别
ubuntu版本:20.04
webots版本:2021a
控制器:C语言
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接
1. 识别效果
2. 普通相机及识别
在节点树下先添加一个Robot
节点,在其节点下添加Camera
节点。如下所示:
在控制器中输入如下代码可以对相机始能。
WbDeviceTag CAMERA = wb_robot_get_device("camera");
wb_camera_enable(CAMERA,TIME_STEP);
重新启动世界后相机就能成功运行了。
2.1 普通相机
添加通用的Camera节点已经足够我们去开发了。通用相机可以自定义分辨率、视野、噪点等参数,一般情况下也支持相机的变焦和聚焦机制。在特殊情况下还提供了运动模糊、各种噪声模型、镜头畸变、球型投影等参数供我们去设置。
Camera {
SFFloat fieldOfView 0.7854 # 视野 [0, pi]
SFInt32 width 64 # 图像宽度 [0, inf)
SFInt32 height 64 # 图像高度 [0, inf)
SFBool spherical FALSE # 球型投影 {TRUE, FALSE}
SFFloat near 0.01 # 相机到近剪裁平面的距离 [0, inf)
SFFloat far 0.0 # 相机到远剪裁平面的距离 [0, inf)
SFFloat exposure 1.0 # 暴光度 [near, inf)
SFBool antiAliasing FALSE # 抗拒齿 {TRUE, FALSE}
SFFloat ambientOcclusionRadius 0 # 环境光遮挡半径 [0, inf)
SFFloat bloomThreshold -1.0 # 泛光阈值 [-1, inf)
SFFloat motionBlur 0.0 # 运动模糊 [0, inf)
SFFloat noise 0.0 # 噪声 [0, 1]
SFString noiseMaskUrl "" # 噪声遮蔽图 any string
SFNode lens NULL # 可以定义图像失真 {Lens, PROTO}
SFNode focus NULL # 焦点 {Focus, PROTO}
SFNode zoom NULL # 镜头缩放 {Zoom, PROTO}
SFNode recognition NULL # 识别 {Recognition, PROTO}
SFNode lensFlare NULL # 镜头光晕 {LensFlare, PROTO}
}
2.2 Webots下的视觉识别介绍
Camera
节点通过Recognition
节点实现了对象识别功能。通过设置物体的recognitionColors
参数可以让相机识别。
此外,识别还提供了图像分割功能,效果如下图所示,左侧是相机图像,右侧是分割图像。如果物体的identificationColors
参数为空,分割时以黑色显示,反则以设置的颜色进行着色
Recognition
节点下的参数:
Recognition {
SFFloat maxRange 100 # 最大值范围 [0, inf)
SFInt32 maxObjects -1 # 物体数量最大值 {-1, [0, inf)}
SFBool occlusion TRUE # 遮挡 {TRUE, FALSE}
SFColor frameColor 1 0 0 # 方框颜色 any color
SFInt32 frameThickness 1 # 方框线粗细 [0, inf)
SFBool segmentation FALSE # 分割 {TRUE, FALSE}
}
3. 设置图像识别
- 在
camera
节点下找到Recognition
参数,并且在Recognition
节点下添加识别实例。如下图所示。
使用如下代码始能识别:
wb_camera_recognition_enable(CAMERA,TIME_STEP);
重新运行世界,就可以看到如下情景。可以看到苹果和玩具鸭可以被识别出来了。
- 既然上面介绍到识别功能可以获取在相机中物体的位置。那我们可以通过printf将所有信息输出出来。代码如下所示
//获取识别出来的物体
int number_of_objects = wb_camera_recognition_get_number_of_objects(CAMERA);
printf("\nRecognized %d objects.\n", number_of_objects);
for (i = 0; i < number_of_objects; ++i) {
//输出物体的名称
printf("Model of object %d: %s\n", i, objects[i].model);
//输出物体的ID
printf("Id of object %d: %d\n", i, objects[i].id);
//输出物体的位置
printf("Relative position of object %d: %lf %lf %lf\n", i, objects[i].position[0], objects[i].position[1],objects[i].position[2]);
//输出物体的旋转角
printf("Relative orientation of object %d: %lf %lf %lf %lf\n", i, objects[i].orientation[0], objects[i].orientation[1],objects[i].orientation[2], objects[i].orientation[3]);
//输出物体的大小
printf("Size of object %d: %lf %lf\n", i, objects[i].size[0], objects[i].size[1]);
//输出物体在相机中的位置
printf("Position of the object %d on the camera image: %d %d\n", i, objects[i].position_on_image[0],objects[i].position_on_image[1]);
//输出物体在相机中的大小
printf("Size of the object %d on the camera image: %d %d\n", i, objects[i].size_on_image[0], objects[i].size_on_image[1]);
//输出颜色
for (j = 0; j < objects[i].number_of_colors; ++j)
printf("- Color %d/%d: %lf %lf %lf\n", j + 1, objects[i].number_of_colors, objects[i].colors[3 * j],objects[i].colors[3 * j + 1], objects[i].colors[3 * j + 2]);
}
4. 设置物体的可识别性
选中啤酒瓶,在节点树中右击它,然后选择Convert to Base Node
,啤酒瓶的在节点树中变成了solid,而且我们可以双击recognitionColors
参数。
可以看到啤酒瓶也能被正确识别出来了。
结语
本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
这个教程能手把手带领大家解决webots和ROS联合仿真的问题,我也是摸爬滚打完成的,希望能帮助到大家。
✌Bye
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接