在目标跟踪时,摄像头提供实时的图片信息,我们需要识别出图片目标,且输出目标在图片中的位置,为后续的控制提供条件。在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即为上文提及的摄像头端口号。 得到如下图所示,摄像头支持的分别率很容易看出:
我们执行cabin_cam.launch,启动摄像头,图片数据随topic:usb_cam/image_raw发布。 我们可以通过rqt的image_view工具(http://wiki.ros.org/image_view)查看:
rosrun rqt_image_view rqt_image_view