机载视频流回传+编解码方案

无线网络,低带宽场景。不能直接转发ROS raw image(10MB/s+),而要压缩(编码)后再传输。可以用rtsp的udp传输或者直接传输话题,压缩方法有theora(ROS image_transport默认支持,软件编解码)或者h264(自己用gstreamer/ffmpeg/opencv写,并结合实际可用的硬件编码器进行编码)

|------------------------|---------------------------------------------------------------|---------------------------------------------------------------|----------------------|------------|
| 视频流来源 | 发送方案 | 接收方案 | 优点 | 缺点 |
| rtsp + h264已编码 (IP摄像头) | 转发rtsp推流 | rtsp拉流 + h264解码 (gstreamer/ffmpeg) | 无额外开销 | 无法再压缩、修改画面 |
| rtsp + h264已编码 (IP摄像头) | rtsp拉流 + h264解码 (此处应有ROS image话题)+ h264编码(gstreamer) + rtsp推流 | rtsp拉流 + h264解码 (gstreamer/ffmpeg) | 在原rtsp h264流基础上可以再压缩 | 需要额外编码 |
| ROS话题 | image_transport republish (已经是的可省略) + 传输theora话题 | 接收theora话题 + image_transport解码 + republish image话题(仅rqt查看可省略) | 通用 | 软件编码;无硬件加速 |
| ROS话题 | h264编码(gstreamer) + rtsp推流 | rtsp拉流 + h264解码 (gstreamer/ffmpeg) | 硬件加速 | 专用 |

image_transport republish:输入话题是sensor_msgs/Image类型的,输出压缩的各类话题(compressed和theora默认),适用于image_raw话题不是由image_transport产生的情况。

bash 复制代码
rosrun image_transport republish raw in:=/usb_cam/image_raw out:=/usb_cam/image_raw/theora

image_transport republish:输入话题是theora压缩过的,输出解压的raw话题

bash 复制代码
rosrun image_transport republish theora in:=camera/image raw out:=camera/image_decompressed

相关资源:

一些推流方案合集rtsp_除了ffmpeg推流-CSDN博客

rocon_rtsp_camera_relay:读取rtsp流,发布ROS图像话题(网络摄像头ROS驱动、拉流)

rocon_rtsp_camera_relay - ROS Wiki

第八章.ROS-RTSP流相机功能包 - HOMER图数传

这个包比较老了,拉流效果如何,能否用硬件解码器有待验证

gscam:gstramer读取usb/web camera,发布ROS图像话题(网络摄像头ROS驱动、拉流)

GitHub - ros-drivers/gscam: ROS Camera driver for GStreamer-based video streams.
gscam - ROS Wiki

可以用gscam,这是一个gstreamer框架的ROS包,读取的视频流来源可以是网络摄像头(rtspsrc)或者usb摄像头(v4lc),反正都是gstreamer框架的,可以选择解码器(比如jetson支持的nvv4l2decoder解码器),解码发布到sensor_msg/Image话题。

rtsp拉流+nvv4l2decoder解码+发布ROS图像话题(网络摄像头ROS驱动、拉流)

src/amov_gimbal_image_node.cpp · AMOVLAB/Gimbal-SDK-ROS - Gitee.com

这里是opencv拉rtsp流(h264压缩了的),性能可能不如gstreamer或者ffmpeg?用的是xavier NX上的nvv4l2decoder硬件解码器对h264数据进行解码,appsink sync=false表示没有同步,capture.read(frame);不会阻塞?cpu占用高?

video_stream_opencv 发布ROS图像话题(网络摄像头ROS驱动、拉流)

video_stream_opencv - ROS Wiki

读取ROS图像话题+omxh264enc编码+gstreamer rtsp推流(发送方案)低延时

Prometheus/Modules/object_detection/py_nodes/rtsp_stream/gstreamer_rtsp_stream.py at main · amov-lab/Prometheus · GitHub

在xavier NX上测试过。读取ROS图像话题,然后用xavier NX自带的omxh264enc硬件编码器(老旧,现在应该换成nvv4l2encoder)编码成h264的rtp udp数据包发送,然后用gstreamer启动rtsp server。async=false仍然是关闭了同步。 用rtsp动态改变推流参数?

ros_rtsp读取ROS话题+gstreamer rtsp推流(发送方案)

https://blog.csdn.net/qq_42257666/article/details/130559000

ffmpeg_image_transport(ROS image和ffmpeg压缩解压的转换)

GitHub - daniilidis-group/ffmpeg_image_transport: image transport that uses libavcodec for compression

可以用到硬件加速,ffmpeg自带的,支持的硬件编解码器可能是PC端的,orin NX上还是用gstreamer的nvv4l2编解码器比较好。

rtsp_image_transport(ROS image和rtsp流的转换,拉流、推流)

GitHub - fkie/rtsp_image_transport: RTSP streaming for ROS image topics

解压和压缩用的是ffmpeg,支持硬件加速。既能拉流成ROS图像,也能推流ROS图像,比较全面。但由于是用的ffmpeg进行编解码,支持的硬件编解码器可能是PC端的,orin NX上还是用gstreamer的nvv4l2编解码器比较好。

rtsp拉流方法(地面端、rtsp拉流ROS驱动)

  1. 程序VLC Media Player直接播放

  2. opencv,解码还是调用的ffmpeg,如何设置解码器为硬件解码器?

  3. gstreamer,默认是通过设置 decodebin 元素,GStreamer 会自动选择解码器,也可以设置硬件解码器nvv4l2decoder。

  4. ffmpeg,自动调用H.264 解码器(libx264libavcodec),如何设置解码器为硬件解码器?

发送端:RTSP 流重新封装并转发

如果你的发送端需要从 RTSP 流获取视频数据并转发,可以使用以下 GStreamer 管道接收 RTSP 流并通过 UDP 传输 H.264 流:

bash 复制代码
gst-launch-1.0 rtspsrc location=rtsp://<rtsp-url> ! rtph264depay ! rtph264pay ! udpsink host=127.0.0.1 port=5000

适用于转发rtsp推流到地面端的情况,不用编码解码。

结论

1. 读取摄像头方案

  • 如果是usb/csi摄像头,一般会有驱动,realsense driver或者usb_cam或者gscam,最好有用到硬件解码的,发布出ROS话题。
  • 如果是rtsp流且h264压缩了的网络摄像头(吊舱),需要用opencv / gstreamer / ffmpeg读取rtsp流,解码,再发布出ROS话题。最好解码用到硬件解码器。

2. 机载推流(发送)方案

  • 最推荐:读取ROS话题,用opencv / gstreamer / ffmpeg进行h264编码,最好用硬件编码器。然后用gstreamer推送rtsp流。需要自己写程序。
  • 最简单:如果摄像头是rtsp流的且h264压缩的合适,可以不经过解码编码,直接转发这路rtsp流到地面端。之所以要转发而不是直接用这路rtsp流,是因为这路rtsp应该是用于机载读取发布ROS话题,可能不能再给地面端拉流。这种方法缺点是无法控制压缩参数,而且无法显示程序处理后的图像(比如加上一些识别框的图)。
  • 方便调试(此法注意theora话题刚订阅时会发送header一次,必须要传输到接收端):读取ROS话题,用image_transport republish产生theora话题(已经有的不需要),然后用swarm_ros_bridge转发theora话题到地面站。问题是theora编码是软件cpu的,用不了硬件加速,地面站看到的视频可能延迟比较大,同时swarm_ros_bridge建立连接后暂时不支持取消,地面端只能杀掉swarm_ros_bridge节点来停止传输。 关于theora,可以查看:usb_cam ros包话题说明,image transport包使用-CSDN博客

3. 地面端拉流(接收)方案

  • 最推荐:ubuntu上apt安装vlc播放器,直接可以看rtsp流。
  • 方便调试:rqt_image_view或者rviz查看theora话题。 关于theora,可以查看:usb_cam ros包话题说明,image transport包使用-CSDN博客
  • 用opencv / gstreamer / ffmpeg读取rtsp流,解码,写QT显示窗口,可以加入点选等功能。
相关推荐
Small___ming2 小时前
【Linux基础学习】Linux Ubuntu 权限管理:从入门到精通
linux·学习·ubuntu
yalipf3 小时前
忘记密码更改ubuntu18.08的密码--前提是要知道用户名work
linux·运维·ubuntu
清静诗意5 小时前
Ubuntu 系统下 MySQL 8.0 安装与远程访问完整教程
mysql·ubuntu·adb
fruge11 小时前
Ubuntu服务器已下载Nginx安装包的安装指南
服务器·nginx·ubuntu
Do_GH11 小时前
【Linux】07.Ubuntu开发环境部署
linux·运维·ubuntu
sulikey13 小时前
从实验出发深入理解Linux目录权限:r、w、x分别控制什么?能否进入目录到底由谁决定?
linux·运维·服务器·ubuntu·centos
叶凡要飞13 小时前
RTX5060Ti安装双系统ubuntu22.04各种踩坑点(黑屏,引导区修复、装驱动、server版本安装)
人工智能·python·yolo·ubuntu·机器学习·操作系统
lzyuuuu20 小时前
Ubuntu22.04 VMware虚拟机文件拖放问题:文字复制正常但文件拖放失效
ubuntu
一匹电信狗1 天前
【MySQL】数据库的相关操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
小猫挖掘机(绝版)1 天前
kalibr进行相机内参以及相机imu的融合标定
ubuntu·无人机·slam·标定·vinsfusion