3、 ROS+Opencv基础

3.1、概述

Wiki:http://wiki.ros.org/cv_bridge/

教学:http://wiki.ros.org/cv_bridge/Tutorials

源码:https://github.com/ros-perception/vision_opencv.git

功能包位置:~/yahboomcar_ws/src/yahboomcar_visual

ROS在安装的过程中就已经集成了Opencv3.0以上的版本,所以安装配置几乎不需要过多考虑,ROS 以自己的sensor_msgs/Image消息格式传递图像,无法直接进行图像处理,但是提供的【CvBridge】可以完美转换和被转换图像数据格式。【CvBridge】是一个 ROS 库,相当于ROS和Opencv之间的桥梁。

Opencv和ROS图像数据转换如下图所示:

image-20210903091159912

虽然安装配置不需要过多考虑,但是使用环境还是需要配置的,主要是【package.xml】和【CMakeLists.txt】这两个文件。该功能包不仅仅是使用【CvBridge】,还需要【Opencv】和【PCL】,所以一起配置完毕。

添加如下内容

【cv_bridge】:图像转换依赖包。

该文件配置内容较多,具体内容请查看源文件。

3.2、单目相机/树莓派CSI相机

3.2.1、启动单目相机/树莓派CSI相机

查看话题

可以看到话题很多,本节常用的就几个

话题名数据类型
/usb_cam/image_rawsensor_msgs/Image
/usb_cam/image_raw/compressedDepthsensor_msgs/CompressedImage
/usb_cam/image_raw/compressedsensor_msgs/CompressedImage

查看话题的编码格式:rostopic echo +【topic】+encoding,例如

image-20210903120844654

话题后面带有【compressed】或【compressedDepth】属于压缩过的话题,ROS在图像传输时,由于网络、主控运行速度、主控运行内存、视频流数据庞大等因素可能会导致数据丢包,获取不到话题。所以没办法,我只能订阅压缩过的话题。同时打开两个图像订阅不同话题测试,如果设备性能很好,网络也很好的话,看不出什么变化,否则,会发现图像压缩后的话题会流畅很多。

查看图片

image-20210903140543123

3.2.2、启动彩色图像反转

图像查看

image-20210903105043487

这里创建了两个订阅者和两个发布者,一个处理一般图像数据,一个处理压缩图像数据。

1)创建订阅者

订阅的话题是【"/usb_cam/image_raw"】,数据类型【Image】,回调函数【topic()】。

订阅的话题是【"/usb_cam/image_raw/compressed"】,数据类型【CompressedImage】,回调函数【compressed_topic()】。

2)创建发布者

发布的话题是【"/usb_cam/image_flip"】,数据类型【Image】,队列大小【10】。

发布的话题是【"/usb_cam/image_flip/compressed"】,数据类型【CompressedImage】,队列大小【10】。

3)回调函数

3.3、Jetson CSI相机

3.3.1、启动Jetson CSI相机

查看话题

可以看到话题很多,本节常用的就几个

话题名数据类型
/csi_cam_0/image_rawsensor_msgs/Image
/csi_cam_0/image_raw/compressedsensor_msgs/CompressedImage

查看话题的编码格式:rostopic echo +【topic】+encoding,例如

image-20210903120844654

话题后面带有【compressed】或【compressedDepth】属于压缩过的话题,ROS在图像传输时,由于网络、主控运行速度、主控运行内存、视频流数据庞大等因素可能会导致数据丢包,获取不到话题。所以没办法,我只能订阅压缩过的话题。同时打开两个图像订阅不同话题测试,如果设备性能很好,网络也很好的话,看不出什么变化,否则,会发现图像压缩后的话题会流畅很多。

查看图片

image-20210903140543123

3.2.2、启动彩色图像反转

image-20230908155850397

图像查看

image-20210903105043487

这里创建了两个订阅者和两个发布者,一个处理一般图像数据,一个处理压缩图像数据。

1)创建订阅者

订阅的话题是【"/csi_cam_0/image_raw"】,数据类型【Image】,回调函数【topic()】。

订阅的话题是【"/csi_cam_0/image_raw/compressed"】,数据类型【CompressedImage】,回调函数【compressed_topic()】。

2)创建发布者

发布的话题是【"/csi_cam_0/image_flip"】,数据类型【Image】,队列大小【10】。

发布的话题是【"/csi_cam_0/image_flip/compressed"】,数据类型【CompressedImage】,队列大小【10】。

3)回调函数