基于激光雷达的方量自动测量系统


一、系统设计背景:


露天煤矿开采在铲装运输作业过程中, 由于缺乏装车计量设备,对电铲和汽车司机的工作量考核只能以车次计量,车辆运输过程中吨位不足现象时有发生。


 

卡车空载情况.jpg

图1卡车空载情况


二、系统设计目的:


方量统计系统可以对装车量进行有效监督,降低运输成本,改善采场配矿精度,提高露天煤矿经济效益。根据激光雷达每次扫描形成的装煤截面在获得速度的情况下,获得卡车的空余体积。在已知卡车车厢体积的情况可计算获得卡车装煤体积,即获得卡车的装载量。系统对经过检测点的车辆采集轮廓、图像等各种信息,并将这些信息汇总至调度楼等办公室,工作人员通过计算机屏幕可以实时监测/回放查看货物装载状态。


三、核心技术:


(1)激光雷达通过激光的往返时间来测定距离,不需要人的参与,根据激光雷达的返回数据实现非接触自动快速测量运煤卡车的装载体积。


(2)方量统计系统硬件部分包括激光雷达、雷达安装支架、系统服务器、通信线路等组成。


(3)对激光雷达扫描数据进行实时接收和传输,实现激光雷达扫描数据的实时接收,转化计算和存储。


(4)装载量计算软件通过获取激光雷达单个扫描面数据,识别和剔除噪声数据和异常数据,自动计算卡车的装载量。


(5)对卡车装载量数据设计数据库进行存储,在数据库基础上实现装载量存储、查询、统计、备份、导出。


四、硬件设施: 


雷达参数


型号:LMS111-10100


光源:红外线


扫描范围:270度


扫描频率:50Hz


角度分辨率:0.5度


 

激光雷达示意图.jpg

                              图2激光雷达示意图



设备安装:


 设备安装示意图.jpg

图3设备安装示意图


 


五、系统技术实现


设备安装示意图.jpg

图4系统总体框架图


本系统将雷达放置在车辆通过的上方,当车辆通过时,本系统可以通过雷达测量,获取大约60~70帧的测量高度,可以将车辆划分为60~70个平面,接下来通过微积分,将体积计算出来。整个项目一共分为4个部分:


(1)网络通信:


http协议:HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。


Socket套接字:应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。生成套接字,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。通过将这3个参数结合起来,与一个Socket绑定,应用层就可以和传输 层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。


与雷达数据的通信使用的是http协议,雷达数据通过网络端口传输出来,本系统使用厂家自带的上位机软件给雷达配置好IP地址,然后利用socket套接字连接雷达获取数据。由于网桥很不稳定,所以本系统要解决在网络不稳定时,保证程序继续运行获取数据的问题,本系统通过将recv函数超时异常抛出以及循环请求建立连接来实现。


(2)数据预处理


数据预处理流程图.jpg

图5数据预处理流程图


多线程技术:多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要快,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。


进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。


线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。


每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,到2015年为止,大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。


雷达的数据格式为16进制。在一帧数据中,本系统首先8个0的标志位,在8个0后依次存储着起始角度-45度,角度分辨率0.5度和540个点的距离(对应着270度)。一帧大小大约为2MB,一个小时大概是250MB,如果存成文件后处理,需求的存储空间太大并且无法做到实时。因此,本系统采用消息队列和多进程来对数据进行预处理,扔掉绝大部分没有车时的数据包。在消息队列中,第一个线程就是使用socket套接字将获取到的数据包扔进队列中,第二个线程是从消息队列中取数据包并解析数据包中70~90度范围的垂直距离,若距离明显小于雷达到地面高度,则认为是包含车的数据包,将这个包后300个数据包都写入一个文件,这样本系统将一辆车的数据存成了一个文件。这样一个小时大概30MB,大大节省了存储空间。在实时性方面,本系统通过另一个进程处理文件进行体积计算并写入数据库。


(3)体积计算与三维图绘制:


因为在雷达原始数据中,保存的是极坐标系下的信息,首先将极坐标系转换成直角坐标系,XY轴为车截面方向。第一步,判断每一帧中距离小于雷达到地面高度的点的个数,若大于设定个数,则为有用帧。第二步将有用帧中非卡车高度的点清洗掉。第三步,因为他们那里的卡车驾驶室上方有一个很大的平面,所以本系统通过每一帧高度的方差波动找到平面的第一帧。第四步,根据平面帧,找到一个坐标基点,根据这个基点,和车的参数,构建出车厢。


第五步,利用车厢两侧的边界对所有帧进行修剪,去除越界点,并且根据点高度的分布对缺失点进行补齐。第五步,根据车厢的长度和帧数,增加Z轴维度(车辆行驶方向),拓展到三维。第五步,将卡车高度帧和车厢闭合绘制三维图(利用Python中matplotlib包的三角面片规则)并计算出体积。


这样获得车号,时间,体积,三维图片,将车号,时间,体积,和三维图片的路径实时写入数据库。


(4)前端界面显示:


服务器使用Tomcat,前端界面的交互通过http协议来完成。前端通过http协议向服务器发送请求,请求格式为服务器IP地址+端口+Servlet名称+参数值,后端通过指定Servlet解析参数,然后将参数传入查询数据库的方法,连接数据库使用的是JDBC的包,然后将查询到的结果封装成gson返回。


六、成果


(1)实现了激光雷达距离数据的实时获取、传输、预处理、存储和转化计算,对每帧数据进行有效解析,获取各个角度的距离数据。


(2)实现了激光雷达异常距离数据的自动剔除和过滤,实现了获取特定时间特定角度范围内的数据,通过剔除无用数据减少计算量,提高了实时计算的速度。


(3)成功绘制出运煤车满载经过雷达时,雷达获取到的每帧数据的各个角度对应的距离,在极坐标中进行直观显示。


 

雷达距离示意图.jpg

图6雷达距离示意图


(4)成功建立了运煤车空载时的三维模型,从各个角度观察到运煤车的空载时的车厢情况。


 

车厢三维数据图.jpg

图7  885和875车厢三维数据图


(5)成功绘制出满载运煤车经过激光雷达时的装载量三维图,并与空载运煤车图像进行匹配,直观观察到运煤车的装载情况。


 装载卡车三维正视图.jpg

图8装载卡车三维正视图


 

装载卡车三维俯视图.jpg

图9装载卡车三维俯视图


 

装载卡车三维左视图.jpg

图10装载卡车三维左视图


(6)实现了运煤车运载体积的实时计算。满载运煤车经过雷达后,自动计算出该运煤车的运载体积并实时显示。


 

卡车方量实时显示.jpg

图11 卡车方量实时显示


(7)根据卡车计算方量,完成统计。


卡车方量统计.jpg

图12 卡车方量统计


七、客户案例

客户案例.jpg