简介
本文使用 Ubuntu 系统,用 Python 开发 ROS 2 ,用 camera_calibration 功能包标定相机,用 OpenCV 读取视频帧和转换 ROS 2 图像话题,用 MediaMTX 搭建流媒体服务器, 用 FFmpeg 将视频帧输出为视频流。
最终效果:
环境准备
虚拟机 VMware Workstation 安装 Ubuntu 桌面版
使用最新版的 VMware Workstation 安装 Ubuntu 22.04.2 LTS ,安装步骤略。
安装过程中最大磁盘大小建议 >= 50GB。默认的建议大小 20GB,在安装 ROS 2 时会不够。
Ubuntu 换源
华为开源镜像站_软件开发服务_华为云 (huaweicloud.com)
安装 ROS 2
ROS(英语:Robot Operating System,一般译为机器人操作系统),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。
官方安装文档:Ubuntu (Debian) — ROS 2 Documentation: Humble documentation
也可以使用小鱼的一键安装系列 | 鱼香 ROS。
- 设置语言环境
- 添加安装源
- 安装 ROS 2 包
- 设置终端环境
- 安装 colcon,用于 ROS 2 开发功能包的构建、测试和安装。
- 安装 rosdepc(rosdep 国内源),用于 ROS 2 安装功能包时自动安装依赖。
安装 Visual Studio Code
不需要二次开发直接用代码的话可以先不装。
-
dpkg 安装 deb 包。
-
安装扩展。
确定摄像头 RTSP 流
关于摄像头的配置,比如如何配置 IP 地址等略。
RTSP 格式
格式 1
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
- username:用户名。
- password:密码。
- ip:设备 IP。
- port:端口号,默认为 554,若为默认可以为空。
- codec:视频编码格式。例如 h264、MPEG-4、mpeg4 等。
- channel:通道号,从 1 开始。例如通道 1 是 ch1。
- subtype:码流类型,主码流为 main,辅码流为 sub。
格式 2
rtsp://username:password@ip:port/cam/realmonitor?channel=1&subtype=0
- username:用户名。
- password:密码。
- ip:设备 IP。
- port:端口号,默认为 554,若为默认可以为空。
- channel:通道号,从 1 开始。例如通道 1 是 channel=1。
- subtype:码流类型,主码流为 0,子码流为 1。例如 subtype=0。
不同品牌的摄像头
USB 摄像头
使用 usb_cam 功能包连接,本文章主要是通过网络摄像头连接,USB 摄像头有机会再测试。
海康威视
主码流:
rtsp://admin:12345@192.168.1.64:554/h264/ch1/main/av_stream
rtsp://admin:12345@192.168.1.64:554/MPEG-4/ch1/main/av_stream
子码流:
rtsp://admin:12345@192.168.1.64/mpeg4/ch1/sub/av_stream
rtsp://admin:12345@192.168.1.64/h264/ch1/sub/av_stream
是主码流还是子码流可以在海康威视的后台的配置 - 视音频 - 视频
中查看。
大华
rtsp://admin:123456@192.168.1.64:554/cam/realmonitor?channel=2&subtype=1
TP-LINK
主码流:rtsp://admin:123456@192.168.1.60:554/stream1
子码流:rtsp://admin:123456@192.168.1.60:554/stream2
播放测试可用性
VLC media player
- 安装。
VLC media player for Ubuntu - VideoLAN - 打开网络串流(Ctrl + N),输入地址后 Play,有画面正常播放即可。
PotPlayer(不支持 Linux)
左键单击 PotPlayer 左上角或在主界面右键打开 - 打开链接(Ctrl + U)
,输入地址后确定,有画面正常播放即可。
开发测试
将 RTSP 视频流转换为图片话题的 ROS 2 功能包
参考:ros2+opencv抓取rtsp视频流_sensor_msgs::image::sharedptr_casiaros的博客-CSDN博客
-
创建项目。
-
编写节点
src/stream_to_topic/stream_to_topic/main.py
。 -
将节点添加到``src/stream_to_topic/setup.py`
-
编译节点。
-
添加环境。
-
运行节点。
-
查看节点和话题。
标定相机获取参数文件 ost.yaml
-
确定标定板
相机标定中各种标定板介绍以及优缺点分析 | Jakob W、ronghuaiyang
根据经验,当正面观察时,标定板的面积至少应该是可用像素面积的一半。
标定板生成:Camera Calibration Pattern Generator – calib.io
此处使用的是 A4 纸打印,打印时比例为原比例,DPI 调到最高,最后贴在一个平面的板上。打印的缺点在于打印机的精度有限,粘贴时无法做到完全平整,会对标定结果有影响。
-
安装 camera_calibration 功能包并启动。
-
将标定板左右上下前后倾斜移动,直到 X、Y、Size(大小)、Skew(倾斜)这几项都变成绿色,点击 CALIBRATE(校准)按钮可以看到矫正效果。
如果虚拟机的配置不够,可能会提示如下,不用点 Wait,等待一段时间。
-
再将标定板放在相机视野内,右上角会显示标定结果的 lin.(线性误差),这个值越低越好,低于 0.1 最好,但是我这里是 A4 纸,所以数值比较大。
-
也可以调节 Camera type 来选择相机类型,调节 scale 来控制显示多少画面。
-
最后点击 SAVE 按钮可以保存参数文件到
/tmp/calibrationdata.tar.gz
,其中的ost.txt
和ost.yaml
就是参数文件。
OpenCV 读取参数文件输出畸变纠正后的新视频流
理论上来说,ROS 2 应该可以 launch 使用参数文件,但是应该还要开发一个新的功能包,将ost.yaml
发布为一个话题,然后再怎么使用,待研究。
- 安装 MediaMTX。
- 安装 FFmpeg 。
- 创建项目。可以创建项目在其他目录,也可以直接建在 ROS 2 功能包的工作空间中。
- 编写下列文件,将视频流纠正后输出为文件,再调用 FFmpeg 输出为视频流。
~/camera_correction/ost_to_stream/config/mediamtx.yml
,参考 sample configuration file。~/camera_correction/ost_to_stream/config.yml
~/camera_correction/ost_to_stream/main.py
: - 使用 VLC 测试播放。
- 如果卡顿的话,还可以使用 FFmpeg 的硬件加速(Intel、AMD、NVIDIA)。
评论区