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

63
0
5天前

 

在目标跟踪时,摄像头提供实时的图片信息,我们需要识别出图片目标,且输出目标在图片中的位置,为后续的控制提供条件。在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文件。

 

<launch>
  <arg name="properties_file_" value="$(find usb_cam)/cfg/camera.yaml" />
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <!--param name="image_width" value="800" /-->
    <!--param name="image_height" value="600" /-->
    <param name="pixel_format" value="mjpeg" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
    <param name="properties_file" type="string" value="$(arg properties_file_)" />
  </node>
</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<<""<<std::endl;
        std::cout<<RED<<"\""<<properties_file<<"\""<<" does not exist!!!!"<<std::endl;
        std::cout<<""<<std::endl;
        ros::shutdown();
    }
    else{
        YAML::Node properties;
        properties = YAML::LoadFile(properties_file);
        image_width_ = properties["image_width"].as<int>();
        image_height_ = properties["image_height"].as<int>();
    }
}

 

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

 

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

 

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

得到如下图所示,摄像头支持的分别率很容易看出:

 

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

发表评论

后才能评论