本页介绍了结合模块导航方案添加深度摄像头的用法, 主要包含对深度摄像头参数的配置以及的publishDepthCamFrame接口的调用。



本页内容


概述

结合模块导航方案,使用深度摄像头时,应该将深度摄像头安装在上位机上。用户自行编写摄像头的驱动程序,在获取其深度数据后,再通过我们SDK中提供的publishDepthCamFrame接口将传输给模块,至此Slamware Core才能将深度数据用于避障。



配置

同添加其它传感器类似,在安装深度摄像头后,需通过RoboStudio中的Slamware配置工具将深度摄像头的具体安装位姿等相关信息进行配置,然后将配置好的文件导出,重新放到底盘MCU中进行Make,再将生成的新的hex文件烧录至底盘。

开启滤波:高度滤波开关,只处理相应高度范围内的障碍物测距信息,主要应用于滤除地面噪声和高于机器人高度的障碍物信息。
开启形态学滤波:利用形态学运算主要采用态学开、闭运算进行滤波操作,用来过滤孤立噪点。(可能会影响性能,客户自行取舍是否勾选)
倒装:摄像头是否倒置,一般不勾选。
最小滤波高度:以地面为基准,高度小于该值的障碍物测距信息将被忽略,单位为m。
最大滤波高度:以地面为基准,高度大于该值的障碍物测距信息将被忽略,单位为m。

相关文档:KBSW180147 机器人底盘传感器位置坐标及底盘配置工具的使用 

                  KBSW180158 Breakout kit 烧写固件

配置深度摄像头前,请先确保使用的固件版本至少需要2.6.7及以上,否则配置的滤波相关信息无法被读出。


接口调用

sensorId:使用Slamware配置工具配置时,设置的Id.
DepthCameraFrame:需要传入一个DepthCameraFrame类型的结构体变量,代表的是一帧数据。
DepthCameraFrame的成员:

深度摄像头有自己的属性参数,如分辨率,深度视角(FOV)等。定义DepthCameraFrame类型的结构体变量时,可以把深度摄像头的属性参数赋值给成员。另外,请注意如下几点:

  1. 注意各个成员的单位,距离为米,角度为弧度。
  2. maxValidDistance建议在2米,否则可能存在噪点。
  3. cols和rows,建议为320x240,不要大于这个值。如果一定要设置为更小的分辨率,需先确认所用的摄像头是否支持。
  4. minFovPitch和maxFovPitch涉及到深度摄像头的VFOV(垂直视角)。假设VFOV=a(rad),则minFovPitch=-a/2,maxFovPitch=a/2。
  5. minFovYaw和maxFovYaw涉及到深度摄像头的HFOV(水平视角)。假设HFOV=b(rad),则minFovPitch=-b/2,maxFovPitch=b/2。
  6. data就是具体的一帧里面每个像素的值,需要把完整的一帧的深度数据全传进去。



代码描述

#include <rpos/robot_platforms/slamware_core_platform.h>

struct CamAttr
{ 
    float minValidDistance;
    float maxValidDistance;
    float minFovPitch;
    float maxFovPitch;
    float minFovYaw;
    float maxFovYaw;
    int cols;
    int rows;
};

int main(int argc, char* argv[])
{ 
    try 
    { 
        rpos::robot_platforms::SlamwareCorePlatform platform = rpos::robot_platforms::SlamwareCorePlatform::connect("192.168.11.1", 1445); 

        CamAttr camera_attr; 
        getAttrFromDevice(camera_attr);        // TODO: Get attr from device doc maybe

        rpos::message::depth_camera::DepthCameraFrame frame;
        frame.minValidDistance = camera_attr.minValidDistance;
        frame.maxValidDistance = camera_attr.maxValidDistance;
        frame.minFovPitch = camera_attr.minFovPitch;
        frame.maxFovPitch = camera_attr.maxFovPitch;
        frame.minFovYaw = camera_attr.minFovYaw;
        frame.maxFovYaw = camera_attr.maxFovYaw;
        frame.cols = camera_attr.cols;
        frame.rows = camera_attr.rows;

        std::vector<float> frame_buffer;
        getFrameFromDepthCam(frame_buffer);    // TODO: Get Frame buffer from DepthCam Device
        

        int sensorId = 1; //TODO: Config your own SensorId 
        platform.publishDepthCamFrame(sensorId, frame); 
    } 
    catch(const std::exception& ex)
    { 
        std::string ex_str(ex.what()); 
    }
    return 0;
}

上述代码仅传输了一帧数据。实际在调用接口传递数据时,需要注意以下几点:

1.深度摄像头的数据是要持续发送的。为了防止数据传输堵塞,调用publishDepthCamFrame的频率不要超过一秒钟10次。

2.得到深度数据后,模式是实时处理的,为了防止有延迟,请选择性能好的上位机,获取一帧深度数据到调用publishDepthCamFrame接口总的时长应该在100ms以下。

3.对于深度摄像头的规格型号,并无特殊要求,只需要在调用接口时传送符合要求的数据即可。注意,需要的深度信息单位是米,如果您的摄像头的单位与此不同,需要转换。

4.对于不同品牌型号的深度摄像头,驱动摄像头的SDK不同,若对此需要帮助,建议您咨询摄像头品牌的支持工程师以获得专业的支持。



检验效果

当成功传输了正确符合要求的深度数据后,如果深度摄像头测距范围内有障碍物,可以通过RoboStudio或者Web portal看到深度信息。

depthcam是一个非常简单的示例文件,DepthCameraFrame中用到的data是人为构造填充的一个vector,用户可以自行下载,在VS2010中打开,查看检测到深度数据的效果。

1. 通过RoboStudio查看

在此之前,需先获取下载Slamware Sensor Map插件(参考RoboStudio用户手册)。点击工作区的显示设置图标,在弹出的图层面板中选中传感器视野(深度摄像头)

2. 通过Web Portal查看

访问Web portal,开启Slamware Core诊断模式,具体步骤请参考KBSW180153 SLAMWARE Web Portal Function Overview