您的位置:首页 > 其它

高频率数据采集、解析和存储(结合项目写的小论文)

2012-07-17 15:00 225 查看

1、引言

近年来,车载导航系统已经由单一GPS数据采集转向到同时采集车辆信息、道路信息、人体生命信息等综合信息发展。为了保证数据的准确性,数据的采集频率越来越高,例如人体生命信息(心跳、血压等)频率高达5000Hz以上,车辆CAN信息也高达2000Hz,如何处理这些高频数据成了实际开发中迫切需要解决的问题。

在发现问题、寻找解决方案、解决问题到最后总结的过程中,自己解决问题的能力得到提升。

2、问题的提出

2.1、实时采集数据:

采集遇到的问题:

1、 采集数据必须一直进行,不能中断。

2、 它必须能接受到所有的高频数据,不能出现丢失数据情况;

2.2、采集到的数据解析以及存储

解析以及存储数据遇到的问题:

1、 数据以二进制文本格式保存,需要在回放数据时候与GPS数据同步,模拟实车环境

3、寻找解决方案

3.1、方法介绍

3.1.1、观察者模式

什么是观察者模式

Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。

“观察”不是“直接调用”

实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

实现观察者模式的形式

实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。

3.1.2、生产者、消费者模式

什么是生产者消费者模式

在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,生产者负责往仓库了进商品,而消费者负责从仓库里拿商品,这就构成了生产者消费者模式。结构图如下:

图1 生产组消费者关系图

生产者消费者模式的优点

1、解耦

假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那 么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化, 可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也 就相应降低了。

举个例子,我们去邮局投递信件,如果不使用邮筒(也就是缓冲区),你必须得把 信直接交给邮递员。有同学会说,直接给邮递员不是挺简单的嘛?其实不简单,你必须 得认识谁是邮递员,才能把信给他(光凭身上穿的制服,万一有人假冒,就惨了)。这 就产生和你和邮递员之间的依赖(相当于生产者和消费者的强耦合)。万一哪天邮递员 换人了,你还要重新认识一下(相当于消费者变化导致修改生产者代码)。而邮筒相对 来说比较固定,你依赖它的成本就比较低(相当于和缓冲区之间的弱耦合)。

2、支持并发

由于生产者与消费者是两个独立的并发体,他们之间是用缓冲区作为桥梁连接,生产者只需要往缓冲区里丢数据,就可以继续生产下一个数据,而消费者只需要从缓冲区了拿数据即可,这样就不会因为彼此的处理速度而发生阻塞。

接上面的例子,如果我们不使用邮筒,我们就得在邮局等邮递员,直到他回来,我们把信件交给他,这期间我们啥事儿都不能干(也就是生产者阻塞),或者邮递员得挨家挨户问,谁要寄信(相当于消费者轮询)。

3、支持忙闲不均

缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来 了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。 等生产者的制造速度慢下来,消费者再慢慢处理掉。

为了充分复用,我们再拿寄信的例子来说事。假设邮递员一次只能带走1000封信。 万一某次碰上情人节(也可能是圣诞节)送贺卡,需要寄出去的信超过1000封,这时 候邮筒这个缓冲区就派上用场了。邮递员把来不及带走的信暂存在邮筒中,等下次过来 时再拿走。

3.1.3、利用缓存降低频率

在2000Hz的信息中,我们可以通过缓存来降低频率。例如CAN信号里面的车灯信号是50Hz,可以通过缓存1s里面的50个数据,遍历这50个车灯状态,最后给出1s内车灯状态,想到于将频率降低到1Hz。其他的数据都可以通过相同的方法降低频率,这里面还有一些处理数据的方法,例如滑动窗口平均等方法。

3.2、实际应用

3.2.1、数据采集使用

定义IObserver 和ISubjecter,CAN数据解析类(CCANParse)继承于IObserver,覆盖基类的Attach,Detach和Notify方法。需要获取CAN数据的类可以将类对象通过Attach注册到CCANParse类里面,每次数据来了,通过Notify方法更新数据。

3.2.2、数据的解析与存储

在解析的数据里面添加系统时间戳,用于回放CAN数据和GPS数据同步的基准。

解析的数据经过缓存区,降低频率后在存入二进制文本,方便回放同步。

4、结论

本文给出了在实际开放过程中遇到问题,寻找解决方案,最后到解决问题的全过程。

实践证明,通过查询资料和寻求帮助,可以克服各种不同的困难。

参考文献

[1] Head First 设计模式(中文版)(美)弗里曼(Freeman,E.) 等著,Oreily Taiwan公司 译,UML China 改编

[2] 设计模式--可复用面向对象软件的基础 伽玛 等著,李英军 等译 机械工业出版社

[3] 大话设计模式 程杰 著 清华大学出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐