一种智能农机载高光谱采集方法

文档序号:6386248阅读:557来源:国知局

专利名称::一种智能农机载高光谱采集方法
技术领域
:本发明基于一种的智能农机载高光谱采集方法,属于基于GPS的高密度获取农田信息的技术方法,专用于精确农业生产技术的动态监测。二、技术背景“精确农业”是近年来国际上农业科学研究的热点领域,它是现有农业生产措施与现代高新技术的有机结合,核心是地理信息系统、全球卫星定位系统、遥感和计算机自动控制系统。精确农业就是通过地理信息系统、全球卫星定位系统、遥感技术等自动化控制技术的应用,按照田间每一操作单元的具体条件,精细准确地调整土壤和作物的各项管理措施,最大限度地优化使用各项农业投入,调动土壤生产力,以最少的或最节省的投入达到同等收入或更高的收入,改善环境,高效地利用各类农业资源,取得良好的经济效益和环境效益。精确农业需要尽可能高密度的、全面的农田信息作为依据。目前,遥感以其独特的信息获取优势正逐渐成为农田信息获取的主要手段。用遥感获取土壤和植物参数已经比较普遍,遥感数据是属于面数据,可覆盖整个农田,不象常规的采样分析手段所获取的只是点数据。高光谱遥感是遥感发展的一个重要趋势,高光谱遥感以其高光谱分辨率特性所携带的丰富光谱信息为遥感应用带来了强大的活力。国内外许多学者已经涉足高光谱遥感在植被生物物理信息和生物化学信息提取方面的研究。在卫星和航空遥感技术进一步发展和成熟前,高光谱遥感正在被发展为高密度获取农田信息的技术手段。随着高光谱遥感应用的不断深入,在“动态监测”越来越成为人们共识的情况下,发展高效率的快速遥感技术就成为必须考虑的问题。为此,利用高光谱仪光谱识别能力很强的同时,快速实现光谱数据的同步“定位”,赋予三维坐标,形成“定性”、“定位”一体化快速遥感技术迫在眉睫。基于GPS的智能农机载高光谱采集系统正是在这种背景下开展研究的。三、发明方案技术问题本发明的目的在于提供一种基于GPS的智能农机载高光谱采集方法,能够实时获取具有空间属性的作物冠层光谱特征,同时在已知农田信息的各图层上定位,并获取对应点的属性,如土壤养分信息等,计算出光谱植被指数NDVI等作物生长状况一些重要指标,获得一一对应的地理定位信息、土壤属性数据和光谱数据,为实现精准施肥等提供可靠的作物参数。技术方案本发明一种智能农机载高光谱采集方法,包括用GPS确定农机的位置,用传感器实时获得作物和农田各种信息,用微型计算机记录、分析信息,发送相应的控制指令,从而驱动农机产生相应的动作,其特征在于1)采用差分GPS25-lvsOEM板定位,差分GPS25-lvsOEM板通过RS-232口或RS-232&amp;USB转换器与微型计算机或笔记本电脑相连,在采集土壤样品时,利用GPS接收机在计算机栅格地图内定位,记录采集点的准确位置,样品采集完后,在实验室对样品进行分析化验,得到相应的土壤属性数据,并添加到该栅格图层中;2)利用拖拉机悬挂光谱仪,采用MSR16R型便携式光谱仪实现作物冠层高光谱实时监测,光谱仪通过RS-232或RS-232&amp;USB转换器与微型计算机或笔记本电脑相连,利用VisualBasic6.0和pccomm.dll动态链接库,设计串行通讯程序,计算机从光谱仪中读取采集到的作物冠层目标光谱多波段信息,同时从GPS中读取该光谱数据的空间时间信息,并完成相关数据的解析,软件设计中采用事件触发方式监视计算机串口缓冲区,当缓冲区有数据时,会自动触发该事件读取数据,接收光谱仪和GPS传来的实时数据,实时传送设备控制指令。MSR16R便携式光谱仪的原始数据按照CropScanINC提供的算式进行转换获得作物冠顶光谱反射率R;3)利用MapObjectsOCX控件实现农田地理信息系统GIS管理模块用SQL语句查找相应的地图要素,将DGPS接受的位置信息投影到平面坐标系统上,或图层在不同投影和坐标系之间相互转换;利用MapObjects的Trackinglayer动态显示农机具运动轨迹和各图层上与定位点相对应的点的属性数据;利用Maplay.AddRelate自动完成具有定位信息的光谱数据表与图层的关联;利用“GPS电子地图坐标转换算法,把动点坐标从WGS-84坐标系转换到北京1954_GK坐标下;利用MapObjects把图层原始坐标系转换为WGS-84坐标系,在外部数据库与图层关联中,首先将GPS传递的定位信息在图层中定位,并读取FeatureId值,并把FeatureId值、转换后的光谱数据和定位信息存储到数据库中,获得一一对应的地理定位信息、土壤属性数据和光谱数据。有益效果本发明是精确农业信息采集技术集成研究成果。目前,计算机与单独高光谱仪或与单独GPS相连比较普遍,但无法在厂商提供的通讯程序基础上扩展自己的应用程序,为了满足精准农业对光谱数据的特殊要求(具有地理属性的光谱数据)必须把这两个设备同时和计算机相连,开发可以控制采样频率和串行传输速率等参数的通讯程序,以适应光谱仪和不同的GPS,同时在此基础上,开发基于GPS,GIS的农机载高光谱采集系统软件平台。利用VisualBasic和MapObjects对GPS、GIS和MSR16R型便携式光谱仪进行有机集成,具有以下特点(1)系统通过集成GPS,能为采集到的光谱数据提供高精度的空间位置属性,并录入数据库,实现光谱数据采集、定位、存储一体化;(2)通过集成GIS,实现了具有空间属性的光谱数据可视化管理和分析处理,同时能实时地显示动点轨迹;(3)实现了采样田块的栅格化;(4)可实时显示各图层对应点地理属性和通过光谱数据计算作物生理参数等功能。本发明可为今后实现精准施肥,特别是氮肥的追施,提供及时、可靠的信息。四、说明书附1硬件系统结构2软件系统结构五具体实施方式(一)系统硬件结构在典型的体现精细农业思想的自动化农机硬件系统中,一般体现实时性,用GPS确定农机的位置,用传感器实时获得作物和农田各种信息,用微型计算机记录、分析位置信息、相应传感器的信息和其它已知的信息,根据分析结果,发送相应的控制指令,从而驱动农机产生相应的动作。这就需要GPS、RS、GIS与ES紧密结合,并使整个系统具有移动性、实时性。(见图1)1拖拉机悬挂机构该系统利用拖拉机悬挂农机具的液压悬挂升降机构,利用三节套管实现伸缩功能,长度为8米,利用液压千斤顶实现升降功能,这样不仅可使光谱仪随农机具移动,同时实现去除边际效应的作物监测。为了保证光谱仪受光面与地面平行,我们在光谱仪悬挂机构中采用了万向头、十字配重等平衡方式,使光谱仪在失去水平后能迅速回位,且可调节万向头的阻尼和限位弹片,减少大幅度摆动。2DGPS系统GPS技术为土壤类型、土壤肥力特性、水分、作物生长发育状况、病虫草害及农作物产量等田间信息采样和决策方案的田间实施提供准确的空间位置信息。在该系统中,全球定位系统采用广泛用于精确农业的GARMIN公司生产的差分GPS25-lvsOEM板,性能稳定,运行可靠;具有快速捕获、快速重捕和极强的抗遮蔽能力,以及优越的EMC、EMI电磁兼容能力,能够很好的适应复杂多变的应用环境。其作用主要有三点(1)智能化农业机械作业的动态定位。(2)农业信息采集样点定位。即在农田设置的数据采集点、人工数据采集点定位均需GPS定位数据,以便形成信息层进入GIS。(3)遥感信息GPS定位。即对遥感信息中的特征点用GPS采集定位数据,以便于与GIS配准。3RS系统地面遥感系统采用美国CROPSCINC生产的MSR16R型便携式光谱仪实现作物冠层高光谱实时监测。该仪器视场角为31度。该仪器的光谱分辨率已经达到高光谱的光谱分辨率范围,且基本覆盖了大部分作物生物物理信息和生物化学信息敏感的波段(波段特征见表1)。其主要作用是监测作物个体生长状况、作物冠顶光谱,从而了解作物的养分状况等生理生化参数。表1CropscanMSR16R波段的中心波长和带宽波段Band460510560610660680710760中心波长(nm)461.3510.5561.6609.9659.1680.9711.8759.5带宽(nm)8.38.18.510.010.811.39.29.8波段Band81087095011001220148015001650中心波长(nm)810.1871.6951.01101.91222.81481.11500.91669.0带宽(nm)10.712.511.016.311.513.513.2195.04智能控制系统它是以微型计算机为核心,利用计算机串行通讯技术实时传送设备控制指令,接收光谱仪和GPS传来的实时数据等。系统软件设计精细农业的关键在于变量作业,而变量作业需要有GPS、RS与GIS紧密结合。适用于农业机械的GIS应当在具有通用的空间分析功能,同时还必须与数据采集系统、决策支持系统相结合,从而实现各硬件设备的有机集成。目前通用的GIS系统,还不能同时满足这些要求。因此,目前急需研究适用于精细农业的GPS、GIS和RS集成技术和系统。我们采用集成二次开发,以面向对象的可视化开发工具VisualBasic6.0为开发平台,利用GIS工具软件MapObjects2.2实现GIS基本功能。既可以充分利用可视化软件开发工具的高效方便的编程功能,实现各种专用的、复杂的分析方法,并充分利用GIS工具软件完备的空间数据可视化分析处理功能,大大提高应用系统的开发效率,使用面向对象的可视化软件开发出来的应用程序具有良好的外观、完善的功能、较好的可靠性、便于维护等优点。该软件系统包括5个模块,如图2所示。4.1串行通讯模块硬件系统集成了MSR16R型便携式光谱仪和GPS25-lvs差分GPS。这两个设备通过两个RS-232(或RS-232&amp;USB转换器)与微型计算机(笔记本电脑)相连,计算机从光谱仪中读取采集到的目标(作物冠层)光谱多波段信息,同时从GPS中读取该光谱数据的空间时间信息,并完成相关数据的解析。为了能够准确及时处理外设传送到计算机串行端口的数据,我们利用VisualBasic6.0和pccomm.dll动态链接库,并采用事件触发方式监视计算机串口缓冲区,当缓冲区有数据时,会自动触发该事件读取数据。一般的GPS接收机都提供了向计算机串口发送NMEA格式数据的功能。NMEA格式的数据是一系列变长的字符串,每一字符串以‘$’开头,以ODOA结尾,字符串内以‘,’分隔各个不同的数据项。为了同步GPS和光谱仪,在起动光谱仪时,利用GPS的‘$’字符启动光谱仪的A/D转换,这样有效地解决了GPS和光谱反射仪的同步问题。该模块有两种工作模式(1)手动模式,按SPACE键接收一次数据。(2)自动模式,每隔3秒接收一次数据。4.2MSR16R光谱数据转换模块MSR16R便携式光谱仪的原始数据是各通道光敏元件的电压值而不是作物冠顶光谱反射率,所以必须按照下面的算式进行转换,以满足决策模块的要求。(1)计算传感器在实际温度时的暗电平。(2)利用暗电平校正(3)利用温度校正(4)利用校准系数校正(5)利用太阳角的余弦校正UpmVreading=UpmVreading*COSINECOR(SUNANGLE)………………(5)(6)计算太阳角SUNANGLE=90-ATN([SIN(LA*RA)*SIN(DY*RA)+COS(LA*RA)*COS(DY*RA)*COS(HA*RA)]/[SQR(1-Z^2)*57.29578]其中GTGreenwichtimeHHHourMMMinuteGMTDIFFdifferenceinhoursfromyourtimezonetoGreenwichtimeLOLongitudeLALatitudeJDJulianDayRA0.745329E-02(7)计算光谱反射率PERCENTREFL=100*DnmVreading/UpmVreading………………(7)(8)利用白标准校准因素校正PERCENTREFL=PERCENTREFL*2PTCF………………(8)上述公式由CropScanINC提供。4.3农田GIS管理模块地理信息系统(GIS)在精确农业技术体系中的地位是举足轻重的,它出现在从规划、田间信息采集、信息处理与管理、信息分析,到田间决策方案实施的整个过程,这要归因于精确农业实施对空间信息的依赖性。农田信息具有多源性,具体表现在存储格式多样性、多尺度性、获取方式多样性,另外还包括系统或数据库数据组织的复杂性。通过GIS平台,融合多源数据的基础上建立农田管理系统实现对多源、多时相农田信息的有序管理和分析,这是精确农业实施的基础,其作用表现在数据组织和集成管理、空间分析查询、空间数据更新与综合处理、可视化分析与表达。GIS为田间信息采集提供基础信息,也为田间变量实施决策分析提供信息源。利用MapObjectsOCX控件实现(1)多图层显示;(2)对图层进行放大、缩小、移动等操作;(3)计算选定的矢量数据的一些统计值;(4)在图层上绘制点、线、椭圆、矩形、多边形等图形;(5)显示和更新选定的矢量数据的属性值;(6)用SQL语句查找相应的地图要素;(7)坐标投影变换,将DGPS接受的位置信息投影到平面坐标系统上,或图层在不同投影和坐标系之间相互转换;(8)利用MapObjects的Trackinglayer动态显示农机具运动轨迹和各图层上与定位点相对应的点的属性数据;(9)利用Maplay.AddRelate自动完成具有定位信息的光谱数据表与图层的关联。在动点定位导航中,由于从GPS得到的位置信息是WGS-84坐标下的经、纬度,我国的电子地图常用北京1954坐标,采用高斯-克吕格投影。因此,在动点定位导航前必须进行坐标投影变换。转换方法(1)利用“GPS电子地图坐标转换算法与实现”一文中的简化算法,把动点坐标从WGS-84坐标系转换到北京1954_GK坐标下。(2)利用MapObjects把图层原始坐标系转换为WGS-84坐标系。在外部数据库与图层关联中,我们首先将GPS传递的定位信息在图层中定位,并读取FeatureId值,并把FeatureId值、转换后的光谱数据和定位信息存储到数据库中,完成作业后,系统依据ID值完成图层与数据库的关联。4.4农田采样栅格化模块目前,一般农田都不具备大比例尺图,所以通过数字化来获得农田基础信息地图的方法不太适用;对于小面积区域利用GPS采点测绘农田基本信息图层则是一种相对成本较低、速度较快的方法。在采样前,可以利用GPS获得田块边界的点,然后在图层上生成多边形,利用WGS_1984_UTM_Zone_50N[32650](以江苏仪征为例),把多边形投影到WGS_1984平面直角坐标系上,生成采样栅格,并给每个多边形编号,依照行列顺序用MapObjects提供的Intersect语句把每个小矩形与生成的多边形进行相交运算,并计算每个地块周长、面积,当面积小于栅格面积的四分之一时与同行相邻的多边形合并。在采集土壤样品时,利用GPS接收机在栅格内进行取样,记录采集点的准确位置,样品采集完后,根据具体要求可以在实验室对样品进行分析化验,得到相应的土壤属性数据,并添加到该图层中,实现采样点空间定位、属性记录和导航实施过程有机结合。4.5信息处理模块光谱反射仪所测得光谱(波谱)是众多地物吸收光谱和散射光谱的混合光谱,一般是以反射率表达。为了正确地解译遥感数据,从中提取目标物的特征信息,并且减小背景的影响,人们构造了多种植被指数,也使用微分光谱技术。4.5.1微分光谱研究表明植物的反射光谱曲线具有显著的特征,同一种植物的不同生长发育阶段以及施肥条件的不同都会引起植物反射光谱曲线的变化。因此,可以利用植被光谱的这一特征,使用野外光谱仪在一定条件下测定它们对各种波段的一阶微分反射光谱,来研究植物的生长状况。一阶微分光谱R&prime;(&lambda;)=R(&lambda;i+1)-R(&lambda;i-1)&lambda;i+1-&lambda;i-1]]>其中R为光谱反射率4.5.2归一化植指数NDVINDVI与植株中的氮含量存在高度相关性,在分蘖盛期、孕穗期和抽穗期,通过光谱测定,用NDVI推算植株的氮含量效果较好,这为将来直接利用光谱来控制作物氮肥追施发挥重要作用。光谱植被指数NDVI=NIR-RNIR+R]]>其中R,NIR分别表示所取的红光波段和近红外光波段的光谱反射率。通过计算机运行操作获得具有地理属性的土壤养分数据N、P、K、微量元素等和具有地理属性的光谱数据光谱反射率R、一阶微分光谱、归一化植指数NDVI等,从而指导施肥、播种、灌溉等变量机械作业。计算机与GPS和光谱仪串行通讯部分源程序<prelisting-type="program-listing"><![CDATA[Form1Option3(0).Value=FalseOption3(1).Value=FalsePrivateSubCheck1_Click()Command3.Visible=FalseIfCheck1.Value=1AndOption2(0).Value=TrueThensf=0dwxx.Visible=Truewm=0Elsepn=0dwxx.Visible=Falsecommand2.Visible=FalseEndIfEndSubOption1(0).Enabled=TrueOption1(1).Enabled=True″″″″″″″″″″″″″″″Option1(2).Enabled=True′结束按钮Option2(0).Enabled=True′以sio_close(2)将COM2关闭Option2(1).Enabled=True′再使用End执行结束系统Option3(0).Enabled=True″″″″″″″″″″″″″″″Option3(1).Enabled=TruePrivateSubCommand2_Click()UpDown1.Enabled=TrueTimer1.Enabled=FalseIfsm=2ThenTimer2.Enabled=FalsegbEndIfsio_close(pn)EndSubCommand4.Visible=FalseCommand1.Visible=TrueOption1(0).Value=FalsePrivateSubCommand3_Click()Option1(1).Value=FalseDimret%Option1(2).Value=Falseret=sio_open(pn)Option2(0).Value=FalseIfret<>SIO_OKThenOption2(1).Value=FalseMsgBox″打开通信端口错误″,vbCritical+vbOKOnly,″系统警告″UpDown1.Enabled=Falsesio_close(pn)EndSubExitSubPrivateSubCommand4_Click()(接收gps,和光谱仪)EndIfIfbuf(0)36ThenExitSubIfPortSet()=FalseThenFori=0To128sio_close(pn)txtReceive.Text=txtReceive.Text+MsgBox″通信端口参数设置发生错误″,Chr$(buf(i))vbCritical+vbOKOnly,″系统警告″NextExitSuba=jwd()EndIfText2.Text=jdret=sio_DTR(pn,0)Text3.Text=wdret=sio_RTS(pn,0)Text4.Text=ztIfwm=1ThenTemer2.Enabled=TrueIfsm=2ThenIfwm=2ThenTimer1.Enabled=Truedwxx=dwxx.TextCommand1.Visible=Falsetjjlcommand2.Visible=TrueEndIfIfwm=1ThenEndSubCommand4.Visible=TrueEndIf″″″″″″″″″″″″″″″Ifwm=2Then′窗体的加载事件Command4.Visible=False′执行打开、设置等工作EndIf′并将DTR、RTS电位降低Command3.Visible=False″″″″″″″″″″″″″″″Option1(0).Enabled=FalseSubForm_Load()Option1(1).Enabled=Falsesf=1Option1(2).Enabled=FalseEndSubOption2(0).Enabled=FalseOption2(1).Enabled=False″″″″″″″″″″″″″″″Option3(0).Enabled=False′参数设置子程序Option3(1).Enabled=False′设置流量、速度、Parity、DataBut等项目″″″″″″″″″″″″″″″′接收按钮PrivateFunctionPortSet()AsBoolean′以sio_Read函数读取传入的数据′参数设置子程序′再以返回值决定返回的字节数,将其显示到窗体上DimPortAsLong″″″″″″″″″″″″″″″DimmodeAsLongPrivateSubCommand1_Click()DimHwAsLong,SwAsLongEndDimretAsLongEndSubDimtoutAsLongPort=pn  mode=P_NONEOrBIT_8OrSTOP_1PrivateSubOption1_Click(IndexAsInteger)  Hw=0′没有硬件流量控制IfOption1(0).ValueThenpn=1  Sw=0′没有软件流量控制IfOption1(1).ValueThenpn=2 PortSet=FalseIfOption1(2).ValueThenpn=3  ret=sio_ioctl(Port,B4800,mode)′设置Ifpn0Andwm<>0Andsm<>0Then  Ifret<>SIO_OKThenCommand3.Visible=True  MsgBox″设置时发生错误″,vbCritical+EndSubvbOKOnly,″系统警告″  ExitFunction  EndIfPrivateSubOption2_Click(IndexAsInteger)  ret=sio_flowctrl(Port,HwOrSw)IfOption2(0).ValueThen′流量控制wm=1  Ifret<>SIO_OKThen′Command4.Visible=True  MsgBox″流量设置时发生错误″,vbCritical+EndIfvbOKOnly,″系统警告″IfOption2(1).ValueThen  ExitFunctionwm=2  EndIf′Command4.Visible=False  PortSet=TrueEndIfEndFunctionIfpn<>0Andwm<>0Andsm<>0Then  Command3.Visible=True″″″″″″″″″″″″″″″IfCheck1.Value=1AndOption2(0).Value=TrueThendwxx.Visible=Truea=jwd()ElseText2.Text=jddwxx.Visible=FalseText3.Text=wdEndIfText4.Text=ztEndSubIfzt=″0″Then  Forj=1To10  BeepPrivateSubOption3_Click(IndexAsInteger)NextIfOption3(0).ValueThensm=1EndIfIfOption3(1).ValueThensm=2cs=0Ifpn<>0Andwm<>0Andsm<>0ThenIfsm=2ThenCommand3.Visible=Truedwxx=dwxx.TextIfsm=2AndForm2.Visible=FalseThenForm2.ShowtjjlIfsm=1AndForm2.Visible=TrueThenUnloadForm2EndIfEndSubElse  ExitSub  EndIfPrivateSubTimer1_Timer()Fori=1To130  rlen=sio_read(pn,buf(0),1)′EndIf  Ifbuf(0)=36ThenExitForEndSub  Next  Fori=1To128  rlen=sio_read(pn,buf(i),1)PrivateSubTimer2_Timer()  NextiFori=1To130  Ifcs=sfThenrlen=sio_read(pn,buf(0),1)  Fori=0To128Ifbuf(0)=36ThenExitFor  txtReceive.Text=txtReceive.Text+NextChr$(buf(i))Fori=1To128  Nextrlen=sio_read(ph,buf(i),1)NextiPrivateSubtjjl()′向数据库添加记录EndSubgpsRec.AddNew  gpsRec.Fields(0)=Val(jd)  gpsRec.Fields(1)=Val(wd)″″″″″″″″″″″″″″″Ifdwxx=″″Thendwxx=″″′接收文本框Click事件gpsRec.Fields(2)=dwxx′使用按一下后会将接收的数据清空gpsRec.Update″″″″″″″″″″″″″″″dwxx=″″PrivateSubtxtReceive_Click()EndSubtxtReceive.Text=″″EndSub  PrivateSubgb()′关闭PrivateSubUpDown1_Change()gpsRec.Closesf=UpDown1.Valuedb.CloseEndSubEndSubPrivateFunctionjwd()AsSingleForm2jdt=″″PrivateSubCommand1_Click()jd=″″dkysjkFori=0To128UnloadMejdt=jdt+Chr$(buf(i))EndSubNextq=InStr(jdt,″$GPGGA″)jd=Mid$(jdt,q+14,9)PublicSubxjsjk()′新建数据库wd=Mid$(jdt,q+26,10)CommonDialog1.ShowOpenzt=Mid$(jdt,q+39,1)newdatabasename=CommonDialog1.FileNameEndFunctionOnErrorGoToaa  Setws=DBEngine.Workspaces(0)  Setdb=ws.CreateDatabase(newdatabasename,dbLangChineseSimplified,dbVersion35)sjkdkbz=1′Setdb=OpenDatabase(newdatabasename,ture,False)ddEndSubSetnewtable=db.CreateTableDef(″gps″)Setnewfield=newtable.CreateField(″经度″,dbDouble)PrivateSubCommand2_Click()newtable.Fields.AppendnewfieldxjsjkSetnewfield=newtable.CreateField(″纬度″,dbDouble)OnErrorGoToaa1newtable.Fields.AppendnewfieldSetws=DBEngine.Workspaces(0)Setnewfield=newtable.CreateField(″地物信息″,dbText,Setdb=OpenDatabase(newdatabasename)255)SetgpsRec=db.OpenRecordset(″gps″,newtable.Fields.AppendnewfielddbOpenDynaset)db.TableDefs.Appendnewtablesjkdkbz=0sjkdkbz=0GoTodd1GoToddaa1aasjkdkbz=1sjkdkbz=1dddd1UnloadMeCloseEndSubEndSubPublicSubdkysjk()′打开已有数据库GlobalCommonDialog1.ShowOpen′*************************************************newdatabasename=CommonDialog1.FileName***********OnErrorGoToaa′ExGlobal.bas  Setws=DBEngine.Workspaces(0)′--Globalvariable&amp;Comportrecorddefinedfor  Setdb=OpenDatabase(newdatabasename)′exampleprogram.  SetgpsRec=db.OpenRecordset(″gps″,′dbOpenDynaset)′  sjkdkbz=0′1999/4/2TOMModifiedGoTodd′**********************************************aa***********OptionExplicitGlobalGstrBaudTable(0To19)AsString′通信参数结构GlobalGstrParityTable(0To4)AsStringPublicTypeCOMMDATAGlobalGstrByteSizeTable(0To3)AsString  PortAsLongGlobalGstrStopBitsTable(0To1)AsString  BaudRateAsInteger′以下四项如PublicSubInitTable()9600,n,8,1,以常数表示GstrBaudTable(0)=″50″  ParityAsIntegerGstrBaudTable(1)=″75″  ByteSizeAsIntegerGstrBaudTable(2)=″110″  StopBitsAsIntegerGstrBaudTable(3)=″134″  ibaudrateAsInteger′以下四项如GstrBaudTable(4)=″150″9600,n,8,1,以整数表示GstrBaudTable(5)=″300″  iparityAsIntegerGstrBaudTable(6)=″600″  ibytesizeAsIntegerGstrBaudTable(7)=″1200″  istopbitsAsIntegerGstrBaudTable(8)=″1800″  HwAsInteger′硬件流量控制GstrBaudTable(9)=″2400″  SwAsInteger′软件流量控制GstrBaudTable(10)=″4800″  DTRAsInteger′DTR线路状态GstrBaudTable(11)=″7200″  RTSAsInteger′RTS线路状态GstrBaudTable(12)=″9600″EndTypeGstrBaudTable(13)=″19200″  GstrBaudTable(14)=″38400″PublicGCommDataAsCOMMDATAGstrBaudTable(15)=″57600″PublicGhFormAsFormGstrBaudTable(16)=″115200″PublicGhExitAsBooleanGstrBaudTable(17)=″230400″ GstrBaudTable(18)=″460800″GlobalGBaudTable(0To19)AsIntegerGstrBaudTable(19)=″921600″GlobalGParityTable(0To4)AsIntegerGlobalGByteSizeTable(0To3)AsIntegerGstrParityTable(0)=″None″GlobalGStopBitsTable(0To1)AsIntegerGstrParityTable(1)=″Even″  GstrParityTable(2)=″Odd″GstrParityTable(3)=″Mark″GBaudTable(19)=B921600GstrParityTable(4)=″Space″GParityTable(0)=P_NONEGstrByteSizeTable(0)=″5″GParityTable(1)=P_EVENGstrByteSizeTable(1)=″6″GParityTable(2)=P_ODDGstrByteSizeTable(2)=″7″GParityTable(3)=P_MRKGstrByteSizeTable(3)=″8″GParityTable(4)=P_SPCGstrStopBitsTable(0)=″1″GByteSizeTable(0)=BIT_5GstrStopBitsTable(1)=″2″GByteSizeTable(1)=BIT_6  GByteSizeTable(2)=BIT_7GBaudTable(0)=B50GByteSizeTable(3)=BIT_8GBaudTable(1)=B75GBaudTable(2)=B110GStopBitsTable(0)=STOP_1GBaudTable(3)=B134GStopBitsTable(1)=STOP_2GBaudTable(4)=B150EndSubGBaudTable(5)=B300GBaudTable(6)=B600PublicSubRxIrq(ByValPortAsLong)GBaudTable(7)=B1200′接收的中断子程序GBaudTable(8)=B1800DimrlenAsLongGBaudTable(9)=B2400Dimbuf(0To511)AsByteGBaudTable(10)=B4800GBaudTable(11)=B7200DoGBaudTable(12)=B9600rlen=sio_read(GCommData.Port,buf(0),512)GBaudTable(13)=B19200Ifrlen>0ThenGBaudTable(14)=B38400CallGhForm.ShowData(GhForm.Term,GBaudTable(15)=B57600buf,rlen)GBaudTable(16)=B115200ElseGBaudTable(17)=B230400Ifrlen=0ThenGBaudTable(18)=B460800ExitDoEndIfPublicsjkdkbzAsInteger′打开数据库标志  EndIf  LoopUntilGhExitEndSubMxtool  ′*********************************************Model**************  ′Mxtool.basPublicpnAsInteger′端口号′--ProcessPCommLibfunctionreturnvaluePublicsfAsInteger′采样频率′PublicwmAsInteger′工作方式′PublicsmAsInteger′存储方式″1999/4/2TOMModified  ′*********************************************Publicrlen&amp;.i&amp;*************Publicbuf(0To511)AsByteOptionExplicitPublicjdtAsStringPublicjdAsStringPublicConstFORMAT_MESSAGE_FROM_SYSTEM=PublicwdtAsString&amp;H1000PublicwdAsStringPublicConstLANG_NEUTRAL=&amp;H0PublicztAsStringPublicConstSUBLANG_DEFAULT=&amp;H1PubliccsAsInteger′采样次数PublicxshAsInteger′xianshihangDeclareFunctionGetLastErrorLib″kernel32″()AsLong  DeclareFunctionFormatMessageLib″kernel32″AliasGlobalwsAsWorkspace″FormatMessageA″_GlobaldbAsDatabase(ByValdwFlagsAsLong,lpSourceAsAny,ByValPublicnewdatabasenameAsStringdwMessageIdAsLong,_PublicnewtableAsTableDef,newfieldAsFieldByValdwLanguageIdAsLong,ByVallpBufferAsPublicgpsRecAsRecordsetString,_PublicdwxxAsStringByValnSizeAsLong,ArgumentsAsLong)AsLong PublicSubShowSysErr(titleAsString,syserrAsLong)DimlpMsgBufAsString*80buf=″启动硬件流量控制时不可控制DimlangAsIntegerRTS状态″ CaseSIO_BADPARM  ′lang={MAKELANGID(LANG_NEUTRAL,buf=″参数错误″SUBLANG_DEFAULT)}CaseSIO_BOARDNOTSUPPORT  lang=SUBLANG_DEFAULT*2^10+buf=″接口未支持此函数″LANG_NEUTRALCaseSIO_ABORT_WRITE  Callbuf=″用户中断写出动作″FormatMessage(FORMAT_MESSAGE_FROM_SYSTECaseSIO_WRITETIMEOUM,_buf=″输出逾时″  0,syserr,lang,lpMsgBuf,80,0)CaseElse  CallMsgBox(lpMsgBuf,vbOKOnlyOrbuf=″不可预测的错误″&amp;errcodevbExclamation,title)EndSelectEndSubCallMsgBox(buf,vbOKOnlyOr  vbExclamation,title)PublicSubMxShowError(titleAsString,errcodeAsElse′系统错误的信息Long,syserrAsLong)CallShowSysErr(title,syserr)DimbufAsStringEndIf  EndSub  Iferrcode<>SIO_WIN32FAILThen  SelectCaseerrcodePccom  CaseSIO_BADPORT′*********************************************  buf=″通讯端口错误或未打开″**********  CaseSIO_OUTCONTROL′PComm.bas  buf=″未支持此功能″′--PCommmoduleforVisualBasic(5.0above)  CaseSIO_NODATA′  buf=″未有数据被读取″′Description  CaseSIO_OPENFAIL′WhenyouwanttodeveloponeVBapplication  buf=″打开错误″withPComm,  CaseSIO_RTS_BY_HW′youshouldaddthismoduletoyourproject.′GlobalConstBIT_6=&amp;H1′GlobalConstBIT_7=&amp;H2′1999/4/2TOMModifiedGlobalConstBIT_8=&amp;H3′********************************************************GlobalConstSTOP_1=&amp;H0′Stop′BaudRateSettingbitsdefineGlobalConstB50=&amp;H0GlobalConstSTOP_2=&amp;H4GlobalConstB75=&amp;H1GlobalConstB110=&amp;H2GlobalConstP_EVEN=&amp;H18′ParityGlobalConstB134=&amp;H3defineGlobalConstB150=&amp;H4GlobalConstP_ODD=&amp;H8GlobalConstB300=&amp;H5GlobalConstP_SPC=&amp;H38GlobalConstB600=&amp;H6GlobalConstP_MRK=&amp;H28GlobalConstB1200=&amp;H7GlobalConstP_NONE=&amp;H0GlobalConstB1800=&amp;H8GlobalConstB2400=&amp;H9′ModemControlsettingGlobalConstB4800=&amp;HAGlobalConstC_DTR=&amp;H1GlobalConstB7200=&amp;HBGlobalConstC_RTS=&amp;H2GlobalConstB9600=&amp;HCGlobalConstB19200=&amp;HD′ModemLineStatusGlobalConstB38400=&amp;HEGlobalConstS_CTS=&amp;H1GlobalConstB57600=&amp;HFGlobalConstS_DSR=&amp;H2GlobalConstB115200=&amp;H10GlobalConstS_RI=&amp;H4GlobalConstB230400=&amp;H11GlobalConstS_CD=&amp;H8GlobalConstB460800=&amp;H12GlobalConstB921600=&amp;H13′Errorcode  GlobalConstSIO_OK=0′ModesettingGlobalConstSIO_BADPORT=-1′NosuchportGlobalConstBIT_5=&amp;H0′DataorportnotopenedbitsdefineGlobalConstSIO_OUTCONTROL=-2′Can′tcontrolboardGlobalConstSIOFT_FUNC=-4′FuncGlobalConstSIO_NODATA=-4′NodatatoreturnabortreadornobuffertowriteGlobalConstSIOFT_FOPEN=-5′CannotGlobalConstSIO_OPENFAIL=-5′NosuchportopenfilesorporthasopenedGlobalConstSIOFT_CANABORT=-6′YmodemGlobalConstSIO_RTS_BY_HW=-6′RTScan′tCANsignalabortsetbyH/WflowctrlGlobalConstSIOFT_PROTOCOL=-7′ProtocolGlobalConstSIO_BADPARM=-7′BadcheckingerrorabortparameterGlobalConstSIOFT_SKIP=-8′ZmodemGlobalConstSIO_WIN32FAIL=-8′Callwin32remoteskipthissendfilefunctionfail,pleasecallGlobalConstSIOFT_LACKRBUF=-9′Zmodem  ′Recv-Buffsizemust>=2KbytesGetLastErrortogettheerrorcodeGlobalConstSIOFT_WIN32FAIL=-10′OSfailGlobalConstSIO_BOARDNOTSUPPORT=-9′′BoarddoesnotsupportthisfunctionGetLastErrortogettheerrorcodeGlobalConstSIO_FAIL=-10′PCommGlobalConstSIOFT_BOARDNOTSUPPORT=-11functionrunresultfail′BoarddoesnotsupportthisfunctionGlobalConstSIO_ABORT_WRITE=-11′Writehasblocked,anduserabortwriteDeclareFunctionsio_openLib″PComm.dll″(ByValPortGlobalConstSIO_WRITETIMEOUT=-12′WriteAsLong)AsLongtimeouehashappenedDeclareFunctionsio_closeLib″PComm.dll″(ByValPort  AsLong)AsLong′FiletransfererrorcodeDeclareFunctionsio_ioctlLib″PComm.dll″(ByValPortGlobalConstSIOFT_OK=0AsLong,ByValbaudAsLong,ByValmodeAsLong)AsGlobalConstSIOFT_BADPORT=-1′NosuchLongportorportnotopenDeclareFunctionsio_flowetrlLib″PComm.dll″(ByValGlobalConstSIOFT_TIMEOUT=-2′ProtocolPortAsLong,ByValmodeAsLong)AsLongtimeoutDeclareFunctionsio_flushLib″PComm.dll″(ByValPortGlobalConstSIOFT_ABORT=-3′UserkeyAsLong,ByValfuncAsLong)AsLongabortDeclareFunctionsio_DTRLib″PComm.dll″(ByValPortAsLong,ByValmodeAsLong)AsLongPortAsLong)AsLongDeclareFunctionsio_RTSLib″PComm.dll″(ByValPortDeclareFunctionsio_iqueueLib″PComm.dll″(ByValAsLong,ByValmodeAsLong)AsLongPortAsLong)AsLongDeclareFunctionsio_lctrlLib″PComm.dll″(ByValPortDeclareFunctionsio_oqueueLib″PComm.dll″(ByValAsLong,ByValmodeAsLong)AsLongPortAsLong)AsLongDeclareFunctionsio_baudLib″PComm.dll″(ByValPortDeclareFunctionsio_Tx_holdLib″PComm.dll″(ByValAsLong,ByValspeedAsLong)AsLongPortAsLong)AsLongDeclareFunctionsio_getchLib″PComm.dll″(ByValPortDeclareFunctionsio_getbaudLib″PComm.dll″(ByValAsLong)AsLongPortAsLong)AsLongDeclareFunctionsio_readLib″PComm.dll″(ByValPortDeclareFunctionsio_getmodeLib″PComm.dll″(ByValAsLong,ByRefbufAsByte,ByVallengthAsLong)AsPortAsLong)AsLongLongDeclareFunctionsio_getflowLib″PComm.dll″(ByValDeclareFunctionsio_linputLib″PComm.dll″(ByValPortAsLong)AsLongPortAsLong,ByRefbufAsByte,ByVallengthAsLong,DeclareFunctionsio_data_statusLib″PComm.dll″ByValTermAsLong)AsLong(ByValPortAsLong)AsLongDeclareFunctionsio_putchLib″PComm.dll″(ByValPortDeclareFunctionsio_term_irqLib″PComm.dll″(ByValAsLong,ByValTermAsLong)AsLongPortAsLong,ByValfuncAsLong,ByValcodeAsByte)DeclareFunctionsio_putbLib″PComm.dll″AliasAsLong″sio_write″(ByValPortAsLong,ByRefbufAsByte,DeclareFunctionsio_cnt_irqLib″PComm.dll″(ByValByVallengthAsLong)AsLongPortAsLong,ByValfuncAsLong,ByValcountAsLong)DeclareFunctionsio_writeLib″PComm.dll″(ByValPortAsLongAsLong,ByRefbufAsByte,ByVallengthAsLong)AsDeclareFunctionsio_modem_irqLib″PComm.dll″Long(ByValPortAsLong,ByValfuncAsLong)AsLongDeclareFunctionsio_putb_xLib″PComm.dll″(ByValDeclareFunctionsio_break_irqLib″PComm.dll″(ByValPortAsLong,ByRefbufAsByte,ByVallengthAsLong,PortAsLong,ByValfuncAsLong)AsLongByValtickAsLong)AsLongDeclareFunctionsio_Tx_empty_irqLib″PComm.dll″DeclareFunctionsio_putb_x_exLib″PComm.dll″(ByValPortAsLong,ByValfuncAsLong)AsLong(ByValPortAsLong,ByRefbufAsByte,ByVallengthDeclareFunctionsio_breakLib″PComm.dll″(ByValPortAsLong,ByValtmsAsLong)AsLongAsLong,ByValtimeAsLong)AsLongDeclareFunctionsio_lstatusLib″PComm.dll″(ByValDeclareFunctionsio_viewLib″PComm.dll″(ByValPortAsLong,ByRefbufAsByte,ByVallengthAsLong)AsDeclareFunctionsio_FtXmodemCheckSumTxLibLong″PComm.dll″(_DeclareFunctionsio_TxLowWaterLib″PComm.dll″ByValPortAsLong,ByValfnameAsString,ByVal(ByValPortAsLong,ByValsizeAsLong)AsLongfuncAsLong,ByValkeyAsLong_DeclareFunctionsio_AbortWriteLib″PComm.dll″)AsLong(ByValPortAsLong)AsLongDeclareFunctionsio_AbortReadLib″PComm.dll″DeclareFunctionsio_FtXmodemCheckSumRxLib(ByValPortAsLong)AsLong″PComm.dll″(_DeclareFunctionsio_SetWriteTimeoutsLib″PComm.dll″ByValPortAsLong,ByValfnameAsString,ByVal(ByValPortAsLong,ByValtimeoutsAsLong)AsLongfuncAsLong,ByValkeyAsLong_DeclareFunctionsio_GetWriteTimeoutsLib)AsLong″PComm.dll″(ByValPortAsLong,ByRefTotalTimeoutsAsLong)AsLongDeclareFunctionsio_FtXmodemCRCTxLibDeclareFunctionsio_SetReadTimeoutsLib″PComm.dll″″PComm.dll″(_(ByValPortAsLong,ByValTotalTimeoutsAsLong,ByValPortAsLong,ByValfnameAsString,ByValByValIntervalTimeoutsAsLong)AsLongfuncAsLong,ByValkeyAsLong_DeclareFunctionsio_GetReadTimeoutsLib″PComm.dll″)AsLong(ByValPortAsLong,ByRefTotalTimeoutsAsLong,ByRefInterfalTimeoutsAsLong)AsLongDeclareFunctionsio_FtXmodemCRCRxLib  ″PComm.dll″(_DeclareFunctionsio_FtASCIITxLib″PComm.dll″(_ByValPortAsLong,ByValfnameAsString,ByVal  ByValPortAsLong,ByValfnameAsString,ByValfuncAsLong,ByValkeyAsLong_funcAsLong,ByValkeyAsLong_)AsLong)AsLong  DeclareFunctionsio_FtXmodemlKCRCTxLibDeclareFunctionsio_FtASCIIRxLib″PComm.dll″(_″PComm.dll″(_  ByValPortAsLong,ByValfnameAsString,ByValByValPortAsLong,ByValfnameAsString,ByValfuncAsLong,ByValkeyAsLong,ByValsecAsLong_funcAsLong,ByValkeyAsLong_)AsLong)AsLongDeclareFunctionsio_FtXmodemlKCRCRxLibByValPortAsLong,ByReffnameAsLong,ByVal″PComm.dll″(_fnoAsLong,ByValfuncAsLong,ByValkeyAsLong_  ByValPortAsLong,ByValfnameAsString,ByVal)AsLongfuncAsLong,ByValkeyAsLong_)AsLongDeclareFunctionsio_FtYmodemTxLib″PComm.dll″(_  ByValPortAsLong,ByValfnameAsString,ByValfuncAsLong,ByValkeyAsLong)AsLongDeclareFunctionsio_FtYmodemRxLib″PComm.dll″(_  ByValPortAsLong,ByReffnameAsLong,ByValfnoAsLong,ByValfuncAsLong,ByValkeyAsLong_)AsLongDeclareFunctionsio_FtZmodemTxLib″PComm.dll″(_  ByValPortAsLong,ByValfnameAsString,ByValfuncAsLong,ByValkeyAsLong_)AsLongDeclareFunctionsio_FtZmodemRxLib″PComm.dll″(_  ByValPortAsLong,ByReffnameAsLong,ByValfnoAsLong,ByValfuncAsLong,ByValkeyAsLong_)AsLongDeclareFunctionsio_FtKermitTxLib″PComm.dll″(_  ByValPortAsLong,ByValfnameAsString,ByValfuncAsLong,ByValkeyAsLong_)AsLongDeclareFunctionsio_FtKermitRxLib″PComm.dll″(_]]></pre>权利要求1.一种智能农机载高光谱采集方法,包括用GPS确定农机的位置,用传感器实时获得作物和农田各种信息,用微型计算机记录、分析信息,发送相应的控制指令,其特征在于1)采用差分GPS25-lvsOEM板定位,差分GPS25-lvsOEM板通过RS-232口或RS-232&amp;USB转换器与微型计算机或笔记本电脑相连,在采集土壤样品时,利用GPS接收机在计算机栅格地图内定位,记录采集点的准确位置,样品采集完后,在实验室对样品进行分析化验,得到相应的土壤属性数据,并添加到该栅格图层中;2)利用拖拉机悬挂光谱仪,采用MSR16R型便携式光谱仪实现作物冠层高光谱实时监测,光谱仪通过RS-232或RS-232&amp;USB转换器与微型计算机或笔记本电脑相连,利用VisualBasic6.0和pccomm.dll动态链接库,设计串行通讯程序,计算机从光谱仪中读取采集到的作物冠层目标光谱多波段信息,同时从GPS中读取该光谱数据的空间时间信息,并完成相关数据的解析,软件设计中采用事件触发方式监视计算机串口缓冲区,当缓冲区有数据时,会自动触发该事件读取数据,接收光谱仪和GPS传来的实时数据,实时传送设备控制指令,MSR16R便携式光谱仪的原始数据按照CropScanINC提供的算式进行转换获得作物冠顶光谱反射率R;3)利用MapObjectsOCX控件实现农田地理信息系统GIS管理模块用SQL语句查找相应的地图要素,将DGPS接受的位置信息投影到平面坐标系统上;实现图层在不同投影和坐标系之间相互转换;利用MapObjects的Trackinglayer动态显示农机具运动轨迹和各图层上与定位点相对应的点的属性数据;利用Maplay.AddRelate自动完成具有定位信息的光谱数据表与图层的关联;利用GPS电子地图坐标转换算法,把动点坐标从WGS-84坐标系转换到北京1954_GK坐标下;利用MapObjects把图层原始坐标系转换为WGS-84坐标系,在外部数据库与图层关联中,首先将GPS传递的定位信息在图层中定位,并读取FeatureId值,并把FeatureId值、转换后的光谱数据和定位信息存储到数据库中,获得一一对应的地理定位信息、土壤属性数据和光谱数据。全文摘要本发明基于GPS的智能农机载高光谱采集方法,属于高密度获取农田信息的技术方法,专用于精确农业生产技术的动态监测。本系统利用VisualBasic和MapObjects对GPS、GIS和RS进行有机集成,一方面系统通过集成GPS,能为采集到的光谱数据提供高精度的空间位置属性,实现光谱数据采集、定位和存储一体化;另一方面通过集成GIS,实现了具有空间属性的光谱数据可视化管理和分析处理,实时地显示动点轨迹、各图层对应点属性,计算作物微分光谱和植被指数NDVI等功能,为专家系统和决策支持系统提供充足的信息。文档编号G06F19/00GK1614392SQ20041000991公开日2005年5月11日申请日期2004年11月30日优先权日2004年11月30日发明者潘剑君,李志伟,张佳宝,吕雄杰,陈坤杰申请人:南京农业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1