上位机和下位机通讯
通讯方式
串行异步通讯
实现原理
串行异步通讯(Asynchronous Data Communication)以字符为单位进行传输,其协议是起止式异步通讯协议,传输字符格式如下图:
实现方式
上位机
通过调用Linux系统的/dev/ttyUSB0文件,实现对串口的读写操作。
- 设置串口属性
- 波特率 115200
- 无奇偶校验
- 一个停止位
- 将需要发送的数据转换成二进制字符串。包括两个字节,一个为距离,另一个为角度,均用用
-128~127表示。 - 将转化完成的字符串,通过串口的
write方法,写入串口。
下位机
启动一个线程,不断监听串口活动。
当串口监听到起始符号时,通过接收移位寄存器接收串口信息,当接收信息达到1个字节时,将触发串口接收寄存器满事件。
程序对串口接收到的数据进行处理,获取上位机传输的距离和角度信息,并根据信息进行相应的调整机器人的运动姿态。
当串口监听到停止位时,停止接收串口信息,结束本次传输。
视频传输
方案一: 自己实现视频传输模块
实现原理
通过程序调用摄像头,每隔一段时间(为保证画面的连续性,应保证每秒获取24副图像),获取当前摄像头的画面,并将数据转换成二进制字符串,通过TCP的Stream方式,将图片发送出去。
服务器端不断监听某个端口,当收socket时,将二进制字符串还原成图片,并显示出来。
优点
- 方案简单,容易实现。
- 可以得到摄像头的原图画质。
缺点
- 需要较大的带宽,当摄像头分辨率较大时,对带宽的要求极高。
- 由于TCP连接需要IP地址,因此,在没有动态域名解析的情况下,只能适用于局域网。
- 容错性较差,容易出现不确定的错误,导致视频传输失败。
- 暂时只支持一对一传输。
方案二:使用RTMP协议
协议简介
RTMP(Real Time Messaging Protocol)是一种设计用来进行实时数据通信的网络协议,
主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。
支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。
RTMP是目前直播平台主要的视频传输协议。
实现方法
在Linux环境下,通过使用FFmpeg获取摄像头图像,然后将图像转码,直接推向rtmp服务器。
具体命令如下:
1 | ffmpeg -re -i ./test.flv -vcodec copy -acodec copy -f flv -y rtmp://cuplayer:1935/live2/livestream |
优点
- 使用rtmp协议,可以支持多种视频格式,可以对视频进行压缩,因此只需要较低的网络带宽
- 容错性好,支持掉线重连。
- 支持一对一传输和一对多传输。
缺点
- 进行一对多传输时,需要RTMP服务器。
- 在公网传输时,需要一台有公网IP或域名的RTMP服务器。
方案三:使用现成的网络摄像头
优点
- 学习成本低,使用方便。
- 可以在公网传输视频。
缺点
- 成本较高