惊了,webots自带视觉识别

ubuntu版本:20.04
webots版本:2021a
控制器:C语言

1. 识别效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-meAvN1jk-1615813857436)(1.png)]

2. 普通相机及识别

在节点树下先添加一个Robot节点,在其节点下添加Camera节点。如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqGyAZ9x-1615813857439)(2.png)]

在控制器中输入如下代码可以对相机始能。

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参数为空,分割时以黑色显示,反则以设置的颜色进行着色
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mUIF43LW-1615813857440)(3.png)]

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. 设置图像识别

  1. camera节点下找到Recognition参数,并且在Recognition节点下添加识别实例。如下图所示。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CktrCxe0-1615813857443)(4.png)]

使用如下代码始能识别:

wb_camera_recognition_enable(CAMERA,TIME_STEP);

重新运行世界,就可以看到如下情景。可以看到苹果和玩具鸭可以被识别出来了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZEGNhvX-1615813857445)(5.png)]

  1. 既然上面介绍到识别功能可以获取在相机中物体的位置。那我们可以通过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]);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYAxGiO8-1615813857447)(6.png)]

4. 设置物体的可识别性

选中啤酒瓶,在节点树中右击它,然后选择Convert to Base Node,啤酒瓶的在节点树中变成了solid,而且我们可以双击recognitionColors参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2PD3huO-1615813857448)(7.png)]

可以看到啤酒瓶也能被正确识别出来了。

结语

本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
这个教程能手把手带领大家解决webots和ROS联合仿真的问题,我也是摸爬滚打完成的,希望能帮助到大家。

✌Bye

为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiaokai1999/article/details/114852008