本系统使用的嵌入式Linux系统如图5-18所示,在Mini2440开发板中移植了嵌入式Linux2.6.29,并在此基础上进行了Qt图形界面开发、视频监控、网络通信和串口通信,它与PIC系统一起构成了机器人的控制系统。
图5-18 Mini2440系统设计框图
1.嵌入式Linux开发环境搭建
(1)Qt开发环境搭建
本系统中所用到的开发环境包括PC和ARM开发板两部分,PC主要是搭建嵌入式软件编程调试开发环境,ARM开发板主要是搭建嵌入式软件移植运行环境。
PC的开发环境搭建主要包括Ubuntu操作系统安装、交叉编译器安装及配置、Qt Creator安装。
1)Ubuntu操作系统安装。
第一步,安装Vmware虚拟机,搭建安装平台。
第二步,下载Ubuntu桌面版(Desktop Edition)。
第三步,新建虚拟机,在CD-ROM中导入Ubuntu安装文件ISO的路径。
第四步,启动虚拟机,根据安装向导提示进行安装即可。
第五步,重启即可使用Ubuntu操作系统。
2)交叉编译器安装及配置。
第一步,下载arm-linux-gcc-4.3.2.tgz,放在software目录下。
第二步,使用如下命令进行解压安装即可:
fang@robot:~/software$tar zxvf arm-linux-gcc-4.3.2.tgz-C/
执行后,将这个交叉编译器安装到/usr/local/arm目录下。
第三步,配置分两种情况,一种是暂时性的,在当前终端有效,另一种是永久性的,在所有终端有效。命令分别如下:
①暂时性。
export PATH=/usr/local/arm/3.4.1/bin:$PATH
②永久性。
fang@robot:~/software$sudo gedit/etc/bash.bashrc
[sudo]password for fang:
在打开的bash.bashrc文件的末尾加入“PATH=/usr/local/arm/3.4.1/bin:$PATH”
fang@robot:~/software$source/etc/bash.bashrc
重启终端后生效。
第四步,查看是否可用及版本号。
fang@robot:~/software$arm-linux-gcc-v
3)Qt Creator安装。
第一步,安装一些工具
安装g++:
sudo apt-get g++
安装编译X11用到的库:
sudo apt-get-y install x-dev libx11-dev xlibs-static-dev x11proto-xext-dev
libxext-dev libqt3-mt-dev
安装libxtst-dev:
sudo apt-get install libxtst-dev,
第二步,安装
ARM开发板的开发环境搭建主要包括Linux内核配置、编译及移植,QtEmbedded-4.5.3-arm配置、编译及移植,触摸屏tslib1.4配置、编译及移植,文泉驿中文字体移植。
1)Linux内核配置、编译及移植。
板载的Linux内核绝大部分满足需求,所以这块仅是根据一些自己设置进行简单的配置,然后进行编译和移植。值得注意的是2.6版本的内核最好使用arm-linux-gcc4.3.2进行编译,低版本的交叉编译器不支持EABI,所以会有一些问题。
2)触摸屏tslib1.4配置、编译及移植。
将/usr/local/QtEmbedded-4.5.3-arm中的lib文件夹中所有内容复制到ARM板上的usr/local/中的新建目录QtEmbedded-4.5.3-arm,即复制完毕。
注:上述步骤必须按照这顺序来写,否则会出现错误。PC目录和ARM目录中放置这些库文件的位置要一致,否则找不到文件。
4)文泉驿中文字体移植。
将wenquanyi_120_50.qpf文件发送到文件夹:
usr/local/QtEmbedded-4.5.3-arm/lib/fonts/
更改权限使其可用:
chmod+xwenquanyi_120_50.qpf
其中120代表字号为12pt,50代表字体宽度为Normal。为了使上述
QtEmbedded-4.5.3-arm和触摸屏有效使用,需设置一些环境变量,具体如下:
①更改etc/profile文件,在profile文件末尾加入:
②更改etc/init.d/rcS文件,在rcS文件中加入:
(2)WebService开发环境搭建
Web Service架构实质上是一个类似远程功能调用的架构,对于服务的使用方来说,远端的服务就像是一个个实现特殊功能的函数一样,不同的不过是这些函数是在异地罢了,对于这些服务的使用就是按照标准来使用调用函数。而函数的功能、调用方法都已经有了规范的协议方法来描述。
本系统在嵌入式Linux平台下,结合gSOAP开发包开发Web Service客户端。实现与服务器与之间通信。
1)gSOAP的安装。
在http://sourceforge.net/projects/gSOAP2/下载gsoap_2.7.17.zip或更新的,解压到自己的目录:$unzip gSOAP_2.7.17.zip,简单安装。
$./configure--prefix=/usr/local/gSOAP
make
make install
2)将源代码目录下gSOAP子目录中的import目录复制到gSOAP目录下来。
$cd gSOAP-2.7/gSOAP
$sudo cp-rf import//usr/local/gSOAP/
3)gSOAP目录下建一个src目录,将源代码目录下gSOAP子目录中的stdsoap*.*复制过来。
$sudo cp stdsoap*.*/usr/local/gSOAP/src/
4)开发gSOAP应用程序。
写一个函数声明文件来定义所有要实现的接口函数,该文件还应该包含有命名空间的相关信息。
创建Makefile文件,以利用soapcpp2工具生成代码框架。
创建服务端程序,其中应该实现第一步中声明文件里的接口函数。
创建客户端程序,接受输入的各参数,连接服务器端。
5)gSOAP工具包中提供了两个可执行文件:wsdl2h和soapcpp2
wsdl2h用来解析WSDL文档,生成描述服务的C/C++头文件。
$./wsdl2h-o outputfile.h inputfile.wsdl
生成一个纯C语言的头文件,用如下命令:
$./wsdl2h-c-o outputfile.h inputfile.wsdl
soapcpp2用来解析上面生成的头文件并生成框架代码,这些框架代码是:soapStub.h(从输入头文件生成的经过修改且带命名空间前缀的头文件),soapH.h(主头文件,所有客户机和服务器源代码都要将其包括在内),soapC.c(指定数据结构的序列化器和反序列化器),soapClient.c(客户机存根例程),soapServer.c(服务器端存根例程)。
用如下命令生成上面的框架代码C文件:
$./soapcpp2-c outputfile.h
stdsoap2.h stdsoap2.c stdsoap2.cpp是运行时C/C++库。
6)ARM-Linux下利用DHCP自动获取IP地址。
在内核中添加以下选项:
若busybox没编译相应选项,也可从网上下载相应文件,用arm-linux交叉编译得到udhcpd,udhcpc命令,copy到usr/sbin下就可以了。
建相关配置文件:从busybox的examples/udhcp/下copy simple.script文件到开发板/usr/share/udhcpc/下,并重命名为default.script。
重启开发板,执行udhcpc就可自动获取IP地址了。(www.xing528.com)
如果是双网卡必须用参数指明
例:udhcpc-i eth1
2.Video4Linux视频采集与处理
(1)Video4Linux简介
Video4Linux是在Linux内核中关于视频设备的API,包括开关视频设备、采集并处理视频图像信息,它为USB接口摄像头提供了统一的编程接口,同时也为无线电通信及电视广播提供了解码接口。本文主要利用Video4Linux提供的API来操作网眼2000 USB摄像头。
在Linux系统中,硬件设备被抽象成设备文件,开发人员可以像访问普通文件一样,在用户空间通过标准的I/O系统调用函数操作设备文件,以达到与设备交互的目的,USB摄像头对应的设备文件是/dev/video0。
(2)Video4Linux编程基础
Video4Linux下视频编程的流程为:①打开视频设备;②读取设备信息;③更改当前设备设置(可以省略);④进行视频采集,两种方法:内存映射和直接从设备读取;⑤对采集的视频进行处理;⑥关闭视频设备。
本文用到的Video4Linux支持的数据结构如下所示。
1)video_capability包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等),包含的分量:
·name[32]//设备名称
·maxwidth,maxheight,minwidth,minheight
·Channels//信号源个数
·type//是否能capture,彩色还是黑白,是否能裁剪等。
2)video_picture设备采集的图像的各种属性。
·brightness 0~65535//亮度
·hue//色调
·colour
·contrast//对比度
·whiteness
·depth//24深度
·palette//VIDEO_PALETTE_RGB24调色板
3)video_mbuf//利用mmap进行映射的帧的信息。
size//每帧大小
frames//最多支持的帧数
offsets//每帧相对基址的偏移
4)video_mmap//用于mmap。
本文为应用程序定义的数据结构为
(3)视频采集实现过程
Video 4Linux提供了两种视频采集方法。
1)基于mmap的视频截取方式。
mmap()系统调用使得进程之间通过映射同一个普通文件实现内存共享。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,而不必调用read()、write()等操作。对于不同进程,共享内存指相同的物理内存被映射到各自的进程地址空间,进程1可以看见进程2对共享内存数据的修改。具体方法如下:
①设置picture属性,初始化video_mbuf,获取摄像头存储缓冲区的帧信息,以得到
所映射的buffer的信息如:每帧大小、最多支持的帧数,每帧相对基址的偏移。代码如下:
②将mmap与video_mbuf绑定,使用void*mmap(void*addr,size_t len,int port,int flag,int fd,off_t offset)函数,其中addr是共享内存的起始地址,一般设置为0即系统分配,len为映射到进程地址空间的字节数,它从被映射文件开头的offset个字节开始算,port指定共享内存的访问权限,flags是MAP_SHARED和MAP_PRIVATE中的一个。代码如下:
③视频截取,使用ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->mmap)做视频截取,调用成功则开始一帧的截取,本函数是非阻塞的,是否截取完毕则通过调用函数ioctl(vd->fd,VIDIOCSYNC,&(vd->frame_current)判断。调用成功,表明一帧截取完毕,可以开始下一次视频捕获。代码如下:
int v4l_grab_frame(v4l_device*vd,int frame)
2)直接读取设备
在Linux中读取设备文件,使用read函数,函数定义如下:int read(文件描述符,指向要读写的信息的指针,需要读写的字节数),函数返回实际读写的字节数。
本章研究的视频采集与处理选择第一种方法,如图5-19所示。
通过网眼2000采集到的图像数据是YUV格式的,通过图像的YUV分量可以方便地进行颜色识别,但Qt的QPixmap控件支持的是“bmp”、“jpg”等格式的图片,所以需要将采集到原始图像数据转化成RGB格式,再转换成bmp格式的图像,才能在Qt里显示。
3.Web Service应用程序开发
本章设计的终端机器人在物联网中作为一个节点,通过在Linux下开发Web Service客户端程序如图5-20所示,向服务器端传送机器人采集到的信息,如当前环境的温度、湿度,安防状态以及视频信息,通过开发Web Service服务端程序如图5-21所示,可以接受来自远程的服务请求。
图5-19 视频采集与处理流程图
图5-20 客户端程序流程图
图5-21 服务端程序流程图
4.Qt图像用户界面开发
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架,它的API在所有的平台上是相同的,因而Qt的应用程序开发和平台无关。本文使用Qt Creator开发Qt GUI人机交互界面,并加之串口程序,使得用户可以通过简单的按钮与机器人进行交互,达到控制机器人、家电设备和获取传感器信息的功能。
主界面使用QTabWidget控件进行不同页面的选取、在不同页面下使用QListWidget、QStackedWidget进行不同子页面的选取,通过connect方法将不同对象的信号连接到响应的槽函数,如connect(HouseServiceList,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(on_HouseServiceList_currentItemChanged(QListWidgetItem*))),使得QListWidget列表的改变时,QStackedWidget跳转到相应的页面。本书开发的主界面包括以下4种不同的页面显示,每一个页面又包含次界面。
(1)机器人应用
该页面包括机器人控制、安防控制以及物体识别3个子页面,不同子页面通过QList-Widget、QStackedWidget控件进行切换。在每一个子页面上主要使用QPushButton按钮控件来接收用户的输入信息,当某一按钮被按下时,系统调用相应的槽函数来进行处理,如按下“启动识别”按钮时,系统执行on_startasr_clicked()槽函数,在槽函数里通过串口向PIC单片机发送控制命令,以达到控制机器人的目的,如图5-22所示。
在安防控制界面,按下“布防”按钮启动布防功能后,机器人会把传感器采集的信息通过串口返回给该页面,并在“室内状况”下的QLabel控件里显示安防信息。单击“温度”按钮则会向单片机索取当前温度信息,并在“温度”按钮下使用QLabel显示当前温度。如图5-23所示。
图5-22 机器人控制界面
图5-23 安防控制界面
图5-24 视频监控界面
在物体识别界面,如图5-24所示,机器人可以将摄像头采集到的图像在QLabel控件里实时地显示出来,以达到视频监控的目的。另外,本机器人系统还能对监控到的物体做出简单的颜色识别和移动方向的判别,并且让机器人的头跟随物体的移动方向转动。当环境有异常发生时,如有陌生人闯入,机器人可以将其采集到的图像保存到服务器。
视频获取与处理函数如下:
void capturedialog::On_capture()
图5-25 家电控制界面
(2)家电服务
该页面包括电视、电灯、空调三个控制子界面,如图5-25所示,界面主要由QPushBut-ton按钮控件构成,当用户单击某一按钮时,系统调用槽函数发送控制命令到万能遥控器,从而达到控制家电设备的功能。
(3)高级服务
该页面由一个QListWidget控件组成,单击QListWidget里的每一个成员,将会弹出相应的子页面。远程服务页面用于设置Web Service调用时相应的服务端的IP地址和端口,并控制服务的开启与关闭,在本书的研究中,通过Web Service主要向PC端或物联网其他节点发送环境信息如温度值、有陌生人闯入和实时监控图像等。教育学习子页面包含几首简单的唐诗,通过QListWidget、QStackedWidget控件选择不同唐诗内容,机器人可以朗读出这些唐诗,以便于儿童学习和科技展示。进入MP3播放子页面,用户可以聆听机器人的歌声。各界面如图5-26所示。
图5-26 高级服务控制界面及子界面
在MP3播放界面,开发了2种方式来选择需要播放的音乐,即通过列表菜单和通过选择按钮,在播放槽函数里使用madplay命令实现MP3的播放功能。部分代码如下:
(4)系统服务
该界面通过单击相应的QPushButton按钮控件,实现Linux系统的关机、重启以及自动获取IP地址,由于命令的差异,这3个项按钮只能在ARM开发板运行,在PC上不能达到期望的结果。如图5-27所示。
图5-27 系统服务控制界面
由于QDateTime::currentDateTime()获取的是系统时间,而Mini2440在出厂时的时间不准确,所以需要设置硬件时钟RTC,通过备份电池可以保存设置后的时间,系统启动时自动将系统时钟恢复成硬件时钟。时钟设置命令为:
date-s 2011.04.18-21:21:30//设置系统时钟
hwclock-w//把刚刚设置的时间存入CPU的硬件时钟RTC
hwclock-s//恢复系统时钟为RTC,把该语句加入rcS文件自动执行
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。