最近做了一个基于ARM9的智能小车无线视觉操控系统,顺便也把具体的实现步骤写下来,希望对有兴趣于智能模式识别技术有兴趣的童鞋们有所帮助。
1 构建ARM下位机的OpenWRT系统
1.1 配置开发环境
以Ubuntu11.04为例,首先安装好编译所需要的开发环境。
打开一个终端,执行以下命令:
#sudoapt-getinstallbuild-essentialasciidocbinutilsbzip2gawkgettextgitlibncurses5-devlibz-devpatchunzipzlib1g-devsubversiongit-core
如果使用的是64位系统,执行以下命令:
#sudoapt-getinstallbuild-essentialasciidocbinutilsbzip2gawkgettextgitlibncurses5-devlibz-devpatchunzipzlib1g-devia32-libslib32gcc1libc6-dev-i386subversiongit-core
1.2 编译OpenWRT开发环境
首先从谷歌Google Project SVN服务器下载OpenWRT系统的源码,输入以下命令($不包括在内):
$cd~
$svncosvncosvn://svn.openwrt.org.cn/dreambox/backfireopenwrt-arm
稍等十几分钟,即可下载完毕。然后进入OpenWRT的源代码目录:
$cdopenwrt-arm
$cdopenwrt
接着升级软件包源码:
$ ./scripts/feedsupdate–a
$ ./scripts/feedsinstall–a
升级完毕后,输入以下命令进行内核编译,配置参数:
$makemenuconfig
然后就会出现上面这样的界面 , 您在Targetsystem选择S3C24xx ,若您的板子是6410的CPU则选择s3c64xx,Subtarget根据您的板子型号选择mini2440、mini6410,TargetProfile选择Mini2440(Full)或mini6410(Full),即可载入一个最简配置,当然您可以再进行其他的定制,例如加点软件包进去一起编译等,根据需求添加所需要的软件包。(可直接采用之前我已经配置好的conifg文件作为导入,里面已经包括对摄像头、无线网卡等底层驱动的配置)
参数配置完毕后,推出保存menuconfig。然后执行:
$make V=99
如果是双核,可以执行:
$make –j2 V=99
这里的-j是线程数,可以加快编译。等上一个多小时,第一次编译就搞定了。
1.3 更新OpenWRT系统到开发板中
在编译成功的OpenWRT系统代码的bin文件夹中,会有生成的内核以及文件系统。但要下载到开发板中,需要一个uboot启动bootloader。
其中,OpenWRT的uboot可以上网下载。
下面以supervivi为例。
从norflash启动,并进入vivi的命令模式,通过USB下载UBOOT到NAND
>partadduboot0x000000000x00060000
>loadflashubootusb
通过dnw下载uboot.bin
下载uboot完毕后,通过nand启动uboot,进行配置
进入菜单,按s键选择Setttingsystemparamter,进入U-BOOT配置,选项。
再次安3键选择MatchType, 根据你的实际情况选择板子。 并按S保存设置。
重启开发板并进入主菜单, 根据需要下载相关的zImage以及squashfs。
下载完毕后,重启开发板,从此进入了OpenWRT的系统开发当中了!!
2 OpenWRT系统的底层驱动及上层应用程序开发
2.1 LUCI界面的配置
启动ARM9开发板进入OpenWRT系统,将网线连接好开发板与PC机的以太接口,设置PC机的IP地址以及DNS均为自动获取,输入192.168.1.1(这与etc/config的br-lan中的IP地址设置有关),从而进入了OpenWRT的LUCI界面。
设置无线网络,选择无线信号为接入点(WPS)模式,即主站发射点,密钥WP2-PSK,配置完毕后保存应用并重启系统。
重启后,PC机无线网络搜索得到刚才建立的无线网后,LUCI界面显示如上图所示。至此,LUCI界面的无线网络配置完毕。
2.2 视频mjpg_streamer开机启动配置
启动系统后,在minicom串口终端输入:
mjpg_streamer –i “input_uvc.so –y –f 20 –r320*240 –q 100 –d /dev/video0”-o “output_http.so –p 8080 –w /www/camwww” &
其中,&代表后台工作。
通过启动mjpg_streamer图像数据流,如果摄像头驱动配置正常的话,在192.168.1.1:8080/?action=stream可以观察到视频。
开机自启动mjpg_streamer,可以进入/etc/修改rc.local文件,输入指令并后台执行即可。当然也可以在LUCI界面配置相关参数。
2.3 智能小车底层驱动开发
智能小车底层驱动可以在OpenWRT系统源代码中的char/driver符号设备文件夹中添加自己编写的wifi_car_driver.c文件,并修改相应的Kconfig与Makefile文件,最后在makemenuconfig中添加底层驱动配置并重新编译。
重启系统后可以发现在/etc/device中发现有自命名的设备名称,通过上层应用程序调用该设备便可以实现底层驱动的调用。
2.4 上层应用程序启动配置
编写上层应用程序,调用/dev/wifi_car设备,控制小车行驶,应用程序的开机自启动可在/etc/init.d中添加初始化init文件,开机运行/usr/run/wifi_car_server(该文件可以为wifi_car_server.c文件交叉编译得到的可执行文件,通过U盘拷贝过去)。
注意:OpenWRT的交叉编译环境不能采用Linux的arm-linux-gcc来编译,必须使用OpenWRT系统专用的交叉编译器arm-openwrt-linux-gcc来编译才能成功编译出可执行文件。
2.5 交叉编译环境的配置使用
首先,在ARM9之家下载好我们发布的gcc的tar包,然后键入命令以解压:
tar jxvf XXXX –C ~/.openwrtgcc (XXX为文件名,该交叉编译器可在网上下载)。
解压完毕后,修改bashrc,键入命令:
vim ~/.bashrc
在文件末尾添加
export
PATH=$PATH:~/.openwrtgcc/OpenWrt-Toolchain-s3c64xx-for-arm-gcc-4.3.3+cs_uClibc-0.9.30.1_eabi/to
olchain-arm_gcc-4.3.3+cs_uClibc-0.9.30.1_eabi/usr/bin然后保存。
再输入:source~/.bashrc并执行,即可。
交叉编译时用arm-openwrt-linux-gcc就行了。
其实具体的设置于Linux中的交叉编译环境设置是一样的。
至此,智能小车的ARM嵌入式开发板软件开发已经完全完毕,再与上位机的客户端操控软件一起配合使用便完成了无线视觉操控系统的整体开发设计。