基于ROS搭建简易软件框架实现ROV水下目标跟踪(十一)--USB摄像头使用

        项目链接:https://github.com/cabinx/cabin_auv_ws

        在目标跟踪时,摄像头提供实时的图片信息,我们需要识别出图片目标,且输出目标在图片中的位置,为后续的控制提供条件。在demo中,我是借助darknet_ros实现这一目标。当然,这一模块可以替换成性能更优秀的识别算法。

        darknet_ros为yolov3在ros下的一个工具包(https://github.com/leggedrobotics/darknet_ros)。需要对yolov3的使用有所了解(https://pjreddie.com/darknet/yolo/)。例程我就不介绍了,可以在网上搜索。在此主要基于demo测试介绍我个人的使用情况,主要包括摄像头驱动、数据集制作、模型训练、模型部署。

        本文主要介绍ROS下USB摄像头的使用。

        ros下usb摄像头驱动支持非常丰富,工具包有usb-cam、uvc-camera、cv-camera等等。在此,我选择usb-cam(http://wiki.ros.org/usb_cam)。

        在使用时,我遇到摄像头的分辨率调整时会报错的情况。在github找到一个暂时的解决方法,需要编译前需要对代码略微修改。将usb_cam.cpp中的AV_PIX_FMT_YUV422P改为AV_PIX_FMT_YUV420P。

        我们来看cabin_cam.launch文件。


  
  
    
    
    
    
    
    
    
  

        其中:

        video_device为摄像头的端口号;

        pixel_format选择mjpeg即可;

        io_method选择mmap即可;

        image_width与image_height可以修改分辨率,但是鉴于后续视觉处理模块计算图片中心时亦需要分辨率数据,故我将分辨率配置于usb_cam/cfg/camera.yaml中;

        properties_file即为camera.yaml的路径,程序会根据该路径读取分辨率的配置。

        因此,程序中添加了分辨率配置模块的代码,位于usb_cam_node.cpp中。

// added by cabin for loading paraments from .yaml files
string properties_file;
node_.param("properties_file", properties_file, std::string(""));
if(properties_file.size() != 0){
    if(access(properties_file.c_str(),F_OK) == -1){
        std::cout<<""<();
        image_height_ = properties["image_height"].as();
    }
}

        在设定分辨率时,我们应该确定摄像头支持的分辨率:

v4l2-ctl --device=0 --list-formats-ext

        device即为上文提及的摄像头端口号。

        得到如下图所示,摄像头支持的分别率很容易看出:基于ROS搭建简易软件框架实现ROV水下目标跟踪(十一)--USB摄像头使用_第1张图片

        我们执行cabin_cam.launch,启动摄像头,图片数据随topic:usb_cam/image_raw发布。

        我们可以通过rqt的image_view工具(http://wiki.ros.org/image_view)查看:

rosrun rqt_image_view rqt_image_view

 

你可能感兴趣的:(水下机器人,水下机器人,ROS)