Bootstrap

基于4G网卡和树莓派zero实现低延时数字图传(250-300ms左右)

方案本身并不复杂,都是采用成熟的产品,只需要几个命令行就能解决问题

0、准备工作

硬件:
树莓派zero
4G网卡
linux台式机/笔记本/虚拟机
软件:
raspivid
netcat / nc
mplayer
ZeroTier


1、树莓派+4G网卡实现连接互联网

首先:树莓派通过4G网卡先要连接互联网,这一步详见我之前写的一篇文章

树莓派zero使用合宙Air724UG作为USB上网卡_梦想家的专栏-CSDN博客


2、构建虚拟局域网实现树莓派和台式机IP互通

由于4G网卡获取的IP和你的电脑肯定不是一个局域网网络,相互之间是无法直接通过IP地址访问的,因此需要构建一个虚拟的局域网实现互联。
ZeroTier是一个很好的网站,可以非常简单的构建免费的虚拟局域网
注册一个账号即可使用,支持linux,windows,android等各类平台,非常好用。
在树莓派和linux电脑上,通过安装ZeroTier客户端,能够虚拟出一个网卡,分配的IP地址可以直接访问。
安装很简单,输入命令行

curl -s https://install.zerotier.com | sudo bash

安装成功后,通过执行命令行,即可加入你自己的网络

sudo zerotier-cli join 你的network ID

network ID可以通过你在ZeroTier的账号自己查到,具体操作可以看其他文章,不再赘述,可以查看这个文章 ubuntu配置ZeroTier - 简书 

在你的树莓派和linux台式机上都安装好之后,使用ping相互试试IP是否能通。
这样就建立好了连接,为后面的图传打下了基础。


3、安装测试你的树莓派摄像头

树莓派连接好摄像头,使用命令行可以测试一下是否有效。
将树莓派的HDMI口连接到显示器上,通过串口连接到树莓派的命令行,输入以下指令

raspivid -t 0 -w 640 -h 360

如果显示器上能显示出摄像头内容,表示连接正常了
如果不行,可能是你没有配置好摄像头
可以通过 sudo raspi-config 里面有相关选项,可以打开摄像头

4、通过netcat来转发摄像头数据流(raw H.264)

摄像头可以捕获数据后,可以使用netcat或nc命令,将数据转发到地面站(linux台式机/笔记本/虚拟机)
在树莓派上执行

raspivid -t 0 -w 640 -h 360 -o - | netcat -ul 5000

-w -h 用来设置图像宽度和高度
-t 0 表示一直开着摄像头,不限时
-o 表示输出
- 表示输出到标准输出
| 将标准输出通过管道输入到下一个指令
netcat是强大的网络工具
-u表示使用udp
-l 表示监听,后面的5000表示监听的端口号

因此,通过这个命令实现了在5000端口号上监听连接,一旦连接上了,就将摄像头的raw h.264数据流通过UDP转发出去

在linux电脑上,通过图形界面打开命令行(否则无法查看视频)
执行以下命令

netcat -vu 10.243.155.167 5000 | mplayer -fps 60 -cache 2048 -

-v表示显示详情
-u表示udp
后面的IP地址和端口号是树莓派的地址和端口,其中IP地址是刚才在第二节说的虚拟IP
使用mplayer进行播放 指定fps为60
一定要设置缓存,否则播放有问题
mplayer可以通过   sudo apt install mplayer   直接安装

当然,你也可以使用TCP来转发视频流,但是由于TCP在网络稳定的时候,会进行重传,可能导致视频延迟,因此为了确保实时性,建议还是使用UDP协议,虽然可能中间丢包,但是不会造成较大的延迟。

5、测试结果

延迟:

延迟大概在250-300ms左右,应该来讲是比较低了,可以接受

流量:

在640*360分辨率下,流量通过iftop查看,
如果画面是在激烈的晃动和变化下,树莓派网卡峰值流量250kB/s
一般情况下流量消耗在100kB/s ~200kB/s之间徘徊
以最大消耗250kB/s计算,1分钟最大流量15MB,10分钟150MB,20分钟300MB,1小时900MB
流量消耗可以接受。

丢包率测试:

通过虚拟机,设置丢包率在0.1%时,大概5秒左右马赛克一次,但不影响画面的实时性和流畅性

;