基于嵌入式Linux平台视频传输与控制系统的构建
扫描二维码
随时随地手机看文章
本文介绍了基于嵌入式Linux平台视频传输与控制系统的构建,给出了跨客户端通过3G网络进行远程视频传输的技术实现,并总结了在实现过程中遇到的难点以及对应的解决方案。
3G是第三代移动通信技术,结合了无线通信技术和互联网等多媒体技术。随着3G技术的发展,它在声音和数据的传输速度上有很大提升,并能够在全球范围内实现无线漫游。其数据传输高速、永远在线、覆盖范围广等优点,有效地解决了移动机器人采用有线或者无线远程控制所带来的信息传输和控制距离等方面的瓶颈问题,使远程救援机器人、仿真机器人、家庭保姆机器人等移动机器人技术在大数据量实时传输方面多了一种可利用的解决方案。
1 系统总体架构
本系统主要用来将移动机器人所采集到的视频数据通过3G网络传给服务器,再将服务器的控制信号传给电机驱动板,以驱动移动机器人平台运动,总体架构如图1所示。摄像头OV9650采集的视频图像经过JPEG压缩后,存入缓存区,当服务器监听到客户端的接入请求后,再将缓存区的数据通过网络传输给客户端的监控界面进行显示;当需要控制机器人行动时,客户端的控制按钮发送控制信息给服务器,服务器通过程序解析后控制底层电机驱动器,驱动机器人平台运动。
系统硬件平台核心处理器采用S3C6410,它基于ARM1176JZF—S内核,是一个16/32位RISC微处理器,其内部集成了强大的硬件加速器,包括音视频处理、2D加速等,为2.5G和3G通信服务提供了优化的硬件性能,工作频率最高可达677 MHz;采用2 GB NAND Flash,主要用于存放内核代码、应用程序、文件系统和数据资料;DDRSDRAM采用两片128 MB K4X51163PE芯片;摄像头采用CMOS图像传感器OV9650,最高输出130万像素(1300×1 024),具有高敏感度、低功耗、支持多种常用的图像格式输出、支持自动图像控制等优点。
Linux作为一种类Unix操作系统,具有稳定健壮、低成本、高性能、互操作性好和源代码开放等特点。而其良好的内核结构,以及可裁剪的特性,满足了嵌入式应用的差异性需求,使其在嵌入式系统领域占有一席之地。本系统中采用的Linux内核为3.0.1版本,文件系统采用YAFFS2,Bootloader选用uboot。
2 系统软件设计
2.1 视频数据的采集与传输
视频数据的采集通过Linux中视频设备OV9650的驱动以及Video for Linux提供的相应接口完成。为了方便,将视频采集的相关信息封装到以下结构体中:
采集程序通过函数init_s3c6410(struct vdIn*vd,char*devICe,int width,int height)来完成对摄像头以及采集参数的初始化,并通过函数s3c6410_Grab(struetvdIn*vd)完成对图像的抓取,用JPEG压缩算法对采集到的图像进行压缩,图像格式为RGB565。
视频数据传输通过Socket实现,且直接在服务器设备端与Web客户端之间进行传输,通过视频流服务器实现对视频的开关控制。由于视频传输是连续的过程,所以客户端和服务器端都通过线程来实现发送与接收。接收线程由函数pthread_create(&(servers[id].threadID),NULL,server thread,&(servers[id]))创建。
视频的采集和传输是在两个线程中实现的,它们共享一个缓冲池。这两个线程都是在视频采集服务器端的程序启动时创建并运行的。其中采集视频图像的线程不断通过摄像头采集现场图像,经过JPEG压缩后存放到缓冲池中,而传输视频数据的线程创建一个Socket来监听等待远程客户的连接请求。当有客户发送连接请求并建立连接后,就通过该连接向远程客户发送视频数据,而发送的视频数据就是从缓冲池中获取的。也就是说,在视频采集服务器端,视频数据传输所需要的一切都已经准备好,就等着客户的请求,一旦建立连接,就可以发送视频数据,从而实现较快的速度和较高的效率。
视频采集和传输的工作流程图如图2所示。
2.2 远程控制的实现
为了监控界面能被通用浏览器打开,需要移植Web服务器Boa。Boa服务器是一款小型开源的嵌入式Web服务器,交叉编译后的可执行代码大小约为60 KB,在Linux3.0.1内核下运行时占用的内存大小约为1.7 MB。其功能较为强大,支持身份认证、CGI动态Web技术等。它不像传统的Web服务器那样为每个访问连接开启一个进程,只能依次完成用户的请求,即单进程响应多路请求,因此,Boa在同等硬件条件下相对于其他Web服务器表现出更快的速度,节省更多的资源。
通用网关接口(CGI)是用于Web服务器与外部应用程序之间信息交互的标准接口。CGI可以使外部程序处理客户端传来的表单和数据,并对此作出某种反应。这种反应可以是HTML文件、图片等可以在浏览器窗体上出现的任何数据,也可以是对服务器端硬件资源的控制。
调用CGI程序的方法主要有两种:
①GET方法,CGI程序从环境变量QUERY_STRING中获得数据;
②POST方法,Web服务器通过STDIN向CGI程序传输数据,数据量超过1024字节时采用此方法。
本系统采用GET方法。
在串口应用程序中,数据的获取通过以下代码实现:
……
char*data;
data=getenv(“QUERY STRING”);
……
3 监控界面的实现
监控界面用网贞实现,如图3所示。
为了使页面呈现出动态效果,如显示当前时间、视频数据传输速率等,页面将嵌入Javascript代码。整个界面分为两个区:视频显示区和控制面板区。视频显示区显示视频流服务器传输上来的视频数据,控制面板区通过按钮与CGI串口应用程序交互控制电机驱动板。
Javascript是一种流行的通用脚本语言,基于Javascript可以实现用户与页面的交互,并响应页面上发生的事件。
HTML表单是Web文档的一部分,用来将信息从浏览器传递到服务器,它提供多种接收输入的方法,包括单选按钮、多选框、文本框等,表单以