如何使用usb_cam和image_transport_plugins插件进行usb摄像头的视频获取和实时图像传输
- 前言
- 一、使用usb_cam驱动进行usb摄像头的图像获取
- 二、使用image_transport_plugins插件进行图像压缩传输
- 1.安装image-transport-plugins插件
- 2.重新运行usb_cam驱动程序
- 3.在另外的电脑上面查看topic并且显示画面
前言
最近因为项目驱动需要进行一套多机无人系统的搭建,由于需要实现多机系统信息交互,所以选择使用ROS2(这里我使用的是foxy版本),在这套无人系统中设计到多无人机和多无人车的图传问题,这就需要使用ros2的通讯机制(ros2相比于ros1取消了master的节点形式,通信起来会很容易),同时还需要将主机上的摄像头画面通过usb_cam这个驱动程序获得,并通过image_transport_plugins插件压缩后进行实时传输(这里不进行压缩的话传输所占用的带宽太大了,可能会有卡顿)。
一、使用usb_cam驱动进行usb摄像头的图像获取
这里先新建自己的工作空间,然后将usb_cam的驱动包源码下载下来
下载地址:
https://github.com/ros-drivers/usb_cam/tree/ros2
下载以后编译,然后在图示界面开终端执行 . install/setup.bash
然后执行ros2 run usb_cam usb_cam_node_exe
这时会提示无法打开和找到某个yaml文件的错误和警告,可以忽略,没影响。
这时开一个终端,使用ros2 topic list
命令查看topic可以看到有image_raw的topic
然后可以有两种方式查看摄像头的画面
1.在终端执行ros2 run usb_cam demo_launch.py
就会有一个image的窗口出现,显示摄像头的图像界面
2.打开rviz2,add topic,然后选择image,左下角会显示no image,此时只需要把Fixed Frame改为default_cam即可(需要手动输入),然后image窗口就有图像了。
注意:这里可能会出现有些同学执行完上面的步骤以后打开的图像很模糊,不清晰的情况,这是因为像素没有调整对,如果有请按下面的步骤调整一下
1.执行完ros2 run usb_cam usb_cam_node_exe
命令后都会有推荐的像素格式,这里我用的摄像头是1920*1080,进入如图所示的文件目录,打开图中的代码:
2.找到62.63行
修改为你的相机最佳的像素规格。
3.然后重新编译,执行. install/setup.bash
,然后重新打开相机驱动,获取图像,这个时候就是清晰的画面了。
二、使用image_transport_plugins插件进行图像压缩传输
1.安装image-transport-plugins插件
sudo apt install ros-galactic-image-transport-plugins
2.重新运行usb_cam驱动程序
ros2 run usb_cam usb_cam_node_exe
这个时候在使用ros2 topic list
查看topic可以看到image_raw/compressed这个topic
但是可惜的是还没有rviz2使用image_transport。我确定有人可能正在某个地方从事这项工作。
你可以通过rqt来查看这个topic下的图像
通过rqt可以清晰的看出压缩后的画质变差了一点点,但是完全不影响观感。重要的是压缩后该topic的传输所占的带宽下降了很多。
3.在另外的电脑上面查看topic并且显示画面
通过ros2的通信机制进行通信以后,就可以在其他电脑上面通过ros2 topic list
也查看到上面image_raw和image_raw/compressed这两个topic,后续可以通过rqt的方式查看摄像头端的实时视频传输画面。
这里附上查看压缩前和压缩后所占用的带宽
可以看到压缩后该topic所占的带宽比原来未压缩的topic小的多的多,传输起来会流畅很多,多机传输也不成问题。