肖志远,杜启亮,田联房,秦传波,张勤
(华南理工大学自动化科学与工程学院,广东广州510640)
水田除草机器人是指具备人工智能识别功能、能够通过图像或者其他传感器对杂草的具体情况进行识别并能够通过推理判断以产生具体的指令来指示机械除草机构进行除草的一种智能装置[1]。
随着工业机器人的发展,一些发达国家(如日本、美国等)纷纷展开农业机器人的研究和开发并已经取得了一些阶段性成果。但由于一些经济特殊性的问题,还没有达到实用化的程度。日本发明了一种小型水田除草机器人,它体积很小,由电池供电,完成一次除草作业后,可通过转弯的方式换到另一除草位置进行下一轮除草作业[2]。我国也开始了农业机器人的研究,南京林业大学的陈勇等发明了一种高效除草机器人,它是由自动导航和杂草识别摄像装置、行间切割涂抹与行内除草机构以及控制系统组成[2]的。
根据除草机器人所要完成的功能可将系统划分为如图1所示的控制框图。由图可以看出,控制系统主要分为三大部分:第一部分为上位机监控部分;第二部分为运动控制部分;第三部分为视频采集及识别部分。
(1)上位机监控部分:此部分主要实现对机器人的实时控制和合理操作。上位机要与运动控制部分进行数据通信[3]。
(2)运动控制部分:此部分主要负责接收上位机命令,并负责将这些数据进行判断解析,将其转换为电机控制信号来完成机器人的运行。
(3)视频采集方案:此部分要实时采集水田秧苗图像,并将图像实时传到PC,从而可以在PC上用浏览器来实时观察图像。因此,这里采用WiFi是非常合适的。
图1 机器人控制方案
本设计采用Zynq-7000平台,Zynq-7000实现了双核Cortex-A9 MPcore和最新的28 nm 7系列可编程逻辑的紧密集成。Zynq芯片内部可以分为PS(Processing System)和PL(Programmable Logic)两部分,ZedBoard是基于Xilinx ZynqTM-7000扩展式处理平台的低成本开发板。它的可扩展接口使得用户可以方便访问处理系统和可编程逻辑,创建独特而强大的设计[4-5]。
利用VC++6.0开发了除草机器人的人机交互界面,开发类库是基于MFC的对话框设计的,通过ZigBee实现了上位机与Zedboard的通信。人机交互界面如图2所示,主要分为3部分来控制。通过手柄和界面上的按钮发送指令和数据。
图2 人机交互界面
行走电机是通过M0和M1编辑框中的数值设置速度大小,运动方向可由Up和Down来控制,注意这里不选择Select按钮。
在图2所示界面中,选中Select,这时,为控制4个推杆电机,钩选R1、R2、1、2、3、4、L1、L2、Up、Down、Left、Right选项,每两个选项控制一个推杆电机,如R1控制一号推杆的前进,R2控制一号推杆的后退,推杆复位、设置p参数、解除复位这3个按钮用于4个推杆电机初始化的设置。
2.2.1 运动控制部分结构框图
运动控制部分结构框图如图3所示。
图3 运动控制部分结构框图
Zedboard通过ZigBee接收从上位机来的数据,通过增量式PID算法整定控制PWM波形。Zedboard作为带FPGA的处理器,利用FPGA的逻辑资源十分有意义。本文将介绍产生一路PWM发生器的IP核,如果要产生多路PWM发生器,对FPGA来说仅仅是多消耗一些逻辑资源而已,其过程是一样的。
在Zedboard中运行Linux系统,要使用本设计FPGA的IP核,必须为这个IP核开发Linux系统上的设备驱动,使得运行在Linux系统上的应用程序可以使用这个驱动程序与FPGA端进行通信,从而控制PWM的输出。
2.2.2 增量式PID算法
PID算法广泛应用于控制系统中,本系统使用增量式PID算法,即:
增量式PID的输出只与当前拍和前两拍的误差有关,因此累积误差相对更小。上式中,e(n)对应给定和反馈的偏差,u(n)对应着输出。增量式PID输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如电机等[6]。由于增量式PID输出的是控制量增量,当控制板出现故障时,误动作影响较小,而执行机构本身有记忆功能,可保持原位,不会严重影响系统的工作。
2.2.3 PWM模块的IP核设计
在Zynq上制作用户IP核需要考虑如何与PS交换数据。有两种方案,一种是EMIO交换数据,一种是制作满足AXI协议的IP核。通常采用第二种方案。Xilinx为用户提供了Wizard,它会自动生成总线(AXI)相关的代码,做好地址译码逻辑、读写控制逻辑,并在用户工作区生成一些寄存器。本设计中的PL逻辑通过读写这些寄存器与PS交互[4]。
由于Zedboard运行的系统使用了FPGA资源,因此所开发的IP核必须在原有的工程里加入新的IP核,重新生成新的bit流文件,打开适合自己ise版本的官方demo,xps系统工程位于hwxps_proj文件夹下,打开这个xps工程。在xps中单击Hardware->Create or Import Periphera进入欢迎界面,按照自己的要求定制IP核,完成IP核制作的向导[4]。
接下来把这个IP核添加进xps工程,在IP Catalog中的USER选项中找到它,双击添加到系统中,然后在Bus Interface中,分别修改MPD、添加接口、修改HDL sources[7-8]。修改完毕后,在project菜单中选择Rescan User Repositories,从port中可以看到新添加的引脚,选择为External Ports把引脚引出去。分配地址,修改ucf约束文件,产生bit流文件。导入到SDK中,新建一个fsbl工程,重新生成BOOT.BIN文件。这样用户IP核的部分就完成了。
2.2.4 Linux下PWM模块驱动程序的开发
Linux提供了内核模块机制,模块本身不被编译入内核映像,从而控制了内核的大小,模块一旦被加载,它就和内核中的其他部分完全一样。驱动程序是从来不主动运行的程序,而且等待应用程序来调用。应用程序通过内核来调用驱动程序[9],实现与实际硬件设备的通信。一般分为字符设备、块设备和网络设备3种类型[10]。需为上面生成的IP核进行字符设备驱动的开发。
PWM模块驱动程序主要分为4个部分:加载函数,卸载函数,设置PWM的周期函数,设置PWM的占空比函数[4]。
(1)加载函数,主要完成以下几项工作:内核注册设备驱动,创建PWM设备类,利用利用PWM设备类创建一个PWM设备,在PWM设备中创建周期和占空比两个文件,将PWM模块的物理地址映射到虚拟地址上[4]。
(2)卸载函数,这个主要是在rmmod模块时完成清除的工作,注销设备。
(3)设置pwm的周期函数,修改前关闭pwm模块,将数值写入到寄存器中。
(4)设置pwm的占空比函数,修改前关闭pwm模块,将数值写入到寄存器中。
完成了pwm驱动程序的编写后,需要对驱动程序进行编译,驱动程序的编译依赖于内核,这就和一般的应用程序不同了。因此除了要在Linux主机下安装交叉编译工具之外,还要编译和运行与Zedboard板子上的内核版本一样的内核,然后编写Makefile。Makefile中必须指定内核所在的路径,在这个Makefile的帮助下运行make即可生成编译模块。
2.3.1 搭建嵌入式Web服务器
Web服务器是连接在网络上提供Web访问服务的一种设备/程序。在Zedboard上运行一个提供Web服务的程序,使得Zedboard成为一个可以提供Web访问服务的设备,这里选择Boa服务器。
下载与移植Boa服务器,这里需要修改源码目录下的一些文件以及已经发现的一些bug。
配置Boa服务器,在源码目录下找到boa.conf,在其基础上做出自己的修改,配置Boa服务器。
在编译配置完Boa服务器后,就需要在Zedboard上进行部署,完成相关的设置,保证与boa.conf中的配置相符。
2.3.2 网络摄像机的移植和搭建
网络摄像机可以提供实时捕获的图像。摄像头捕获的图像数据很大,因此需要将其压缩后进行网络传输,接收端将接收到的压缩数据进行解码后播放。利用网络摄像头实时采集图像的工作原理如图4所示。
图4 网络摄像机工作原理
在安装编码软件mjpg-streamer之前,需要安装libtool工具盒移植JPEG编码库,移植mjpg-streamer需要修改源码目录中plugins/input_uvc目录下的Makefile,然后使用交叉编译。编译完成后可以找到input_uvc.so、output_http.so,使用这两个库,将JPEG编码库生成的libjpg库拷贝到Zedboard文件系统,最好是/usr/lib/下。
在视频采集方案中,将mjpg-streamer与Boa结合使用,结合Web服务器一起将实时图像嵌入到网页中,这样就可以通过浏览器输入Zedboard的IP地址来观看传回来的实时图像。
测试:imsmodpwm_driver.ko
cd/sys/class/pwm_driver/pwm_device
echo1000>pwm_frequency
echo50>pwm_duty
产生频率为10 kHz、占空比分别为50%和30%的PWM波,如图5(a)、(b)所示。
图5 占空比波形图
打开火狐浏览器,输入开发板的IP地址192.168.1.10,这时可以观察到机器人传回的实时图像。
本设计是在Xilinx的Zynq平台上进行实验的。通过在机器人车身上安装摄像头可以实现对机器人的远程控制。实验结果表明,电机控制调节响应快,电机驱动器运行稳定可靠,实现了增量式PID闭环控制。通过WiFi接入机器人的无线路由,就可以获取实时的图像,能够实现对机器人的准确控制,很好地满足了实际的工程应用。
[1]张滨,杜启亮,田联房.基于FPGA的步进电动机加减速控制器[J].微特电机,2012(08):71-74.
[2]夏欢.水田用除草机器人的结构与实现[D].广州:华南理工大学,2012.
[3]吕常智,姚志科.基于无线通信的移动机器人远程控制系统[J].煤矿机械,2012,33(3):239-241.
[4]陆佳华,江舟,马岷.嵌入式系统软硬件协同设计实战指南基于Xilinx Zynq[M].北京:机械工业出版社,2013.
[5]何宾.Xilinx All Programmable Zynq-7000 Soc设计指南[M].北京:清华大学出版社,2013.
[6]杭启乐,司宾强,朱纪洪,等.基于DSP和CPLD的四相容错电机控制系统硬件设计[J].计算机测量与控制,2012,20(9):2413-2415.
[7]吴厚航.深入浅出玩转FPGA[M].北京:北京航空航天大学出版社,2010.
[8]夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2003.
[9]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.
[10]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.