RM3100智能停车场地磁传感器工作原理算法种类及优点PNI

发布时间:2019/11/22 10:51:47

   以前很多车主会觉得停车收费计时不准确,停车场管理人员登记时间出现不及时,但自从采用地磁传感器后,停车收费变得更为精准。每当有车辆进入停车泊位,地磁传感器会在十秒钟内将车辆入场的时间、停车泊位编号等内容,传送至停车管理员的手持终端机。停车管理员可以根据停车泊位编号找到车辆,完成车辆的信息录入。下面一起来了解下停车场地磁传感器工作原理、算法、种类及优点。


RM3100磁传感器套件是由2个X/Y轴磁传感器Sen-XY-f(13104),1个Z轴磁传感器Sen-Z-f(13101)和1个ASIC控制器MagI2C(13156)组成。10倍于霍尔传感器的分辨率和低于20倍的噪音,使得RM3100成为了同类产品中性能的磁传感器,保证了航向和方位测量的性。基于磁感技术的PNI传感器不仅具备超低噪音下的高分辨率和重复性数据输出,而且采样率高、无磁滞现象,也不需要进行温度校准。



地球磁场的强度在0.5至0.6高斯,地球磁场在很广阔的区域内(大约几公里)其强度是一定的。磁传感器的工作原理是当一个铁磁性物体,也就是汽车,置身于磁场中,会使磁场产生扰动,数据收集仪器能测量出磁场强度的变化,从而对铁磁性物体的存在性进行判断。地磁传感器可用于检测车辆的存在和车型识别,便是利用车辆通过道路时对地球磁场的影响来完成车辆检测的。

轿车经过时Z轴的曲线,该曲线的特点是:当传感器与车辆平行时出现峰值。当在车辆距传感器1英尺的情形下,对该曲线进行平滑处理后,可用来指示车辆的存在。通过建立合适的阀值,可以滤掉旁边车道的车辆或远距离车辆带来的干扰信号。



除了上述沿着向上方向的Z轴检测到磁场变化可用来检测车辆的存在,检测车辆存在的另一方法是观察磁场变化的大小,也就是计算出整个地磁场在汽车经过时的磁场强度变化情况,从面判断出有无汽车经过:磁场的大小=(X^2+Y^2+Z^2)^1/2。



磁传感器距车辆1英尺、5英尺、10英尺和21英尺时,一辆轿车通过所产生的曲线。在不同距离下,Z轴的曲线形状很相似,但是信号强度却大不相同。从1英尺到5英尺,信号强度衰减得非常快。距离越远,数值快速衰减。当传感器只检测单一车道车辆,而忽略其他车道车辆的存在时,这种特点非常有用。

从检测原理看其实非常简单,通过磁传感器检测磁场的变化,在没车时标定一个基准磁场值,当磁场远离基准磁场时就判断为有车,磁场恢复到基准磁场时就判断为无车,逻辑上非常简单,设定一个阀值,阀值表示灵敏度,基本上就是一个简单地磁检测器算法。





停车场地磁传感器算法

车辆检测算法是地磁传感器的,脱离了算法谈地磁传感器就是耍流氓。

每家地磁传感器最的差异是算法,算法的异同表现出来就是准确率、反应速度完全不一样。算法的设计一方面基于原理性的磁常识,在实验室就可以完成简单算法的测试工作;但更重要的是算法需要经过实际项目,而且是真正收费项目的检验,并且是要单个项目成千上万个泊位,且覆盖过城镇、县城、地市及大城市的环境。

为什么要那么多条件呢?因为小城镇和大城市差别太大,地下环境差异巨大,大城市地下都挖空了,到处是地铁、电力线等干扰,大家都知道电和磁的关系,电可以影响磁。很多厂家在介绍自身产品时会说在某某小城市,小县城做过项目,说实话完全没任何参考价值,因为他们的测试根本没覆盖到真正的干扰。另外一些厂家会说他们产品在某个城市做过诱导,那还好意思出来说,诱导根本不需要准确率,哪怕80%安装的是尸体都没人关心。

前面提到停车地磁检测原理是很简单,但是要做一个的算法怎么那么难?主要原因有一下几点:

1.大部分设备厂家定位就是卖地磁产品。卖设备,然后对接数据给平台方,平台方根据设备方的数据进行业务流程,那么问题来了。一旦出现不准的问题时,平台方说设备方的设备不行,设备方说平台方平台不行,还会扯到说运营商网络不行等,大家相互扯皮。因为平台不是自己,设备方根本毫无能力做数据分析和算法优化,多做一个项目也不会有任何算法上的进步和优化,只会给自己多挖坑而已。

2.做的项目不多,单个项目数量不多,没做过大项目。很多厂家的设备基本上都是实验室产品,单个项目上百个泊位都没做过,就出去吹牛,不够脚踏实地,最终导致一旦单个项目泊位数量上千时,暴露出一堆问题,此时还怎么去收场,哪有时间去优化算法,最终就是坑死业主,害死自己。

3.客观的研发水平差异,产品靠研发,研发水平差,那产品肯定做不好。

目前在地磁算法布局上有2种类别,一是前置算法,二是后台算法。

前置算法是把算法做在地磁传感器中,属于硬件层面的算法。地磁传感器通过一定的频率采样数据,经过算法计算出结果,并通过无线方式上报结果值,套用流行语就是边缘计算。但是要做好前置算法是非常不容易的,特别是在调测阶段,如果算法需要优化,就要去现场一个一个更新地磁传感器的程序,在前期非常痛苦;一旦算法稳定成熟后,前置算法就凸显出巨大的优势:准确率高、反应速度快、流量极小、同样服务器可以支撑更大规模的数量等。

后置算法是把算法做在后台服务器,属于软件层面的集中式算法。地磁传感器高频率的采样数据,并且也是高频率的通过网络把原始数据发给后台,网络压力巨大,传输的都是一些无用的原始数据而不是结果值。大家都知道要计算出一个结果肯定需要很多一定采样频率下的原始数据,前置算法前段采样后直接给结果,传输的是一个结果(数据量极小);而后置算法需要传输大量原始数据到后台后才能在后台计算结果,既浪费流量,反应又不实时,如果网络差,数据还要排队等候。的优势是修改算法方便,直接后台修改,但出问题的几率随着泊位数量增加而大大增加,百来个泊位可能没问题,千把个泊位立即瘫痪都有可能。

做个简单计算,后置算法中有部分厂家地磁传感器做的最没技术含量了,设计就是每分钟采集1条原始数据发给后台,一天需要发送1440条,也就是说反应速度至少要1分钟,如果要30秒反应速度,他就得一天发2880条数据;

后置算法中还有部分厂家的的地磁传感器设计有磁场变化时采样频率提高到1-5秒内的,连续发送10-20条数据,平时可能5-60分钟采样一条数据给后台,按照一天换车20次,就得达到500-1000条数据;而前置算法,按照一天换车20次,每次换车只发送驶入和驶离,加上平时心跳,一天大概只要100条数据以内,大概只要后置算法的1/10流量,甚至更少,一般一月只要1M流量即可满足。

推荐选择采用前置算法的地磁传感器,前期辛苦点,后期就轻松多了,增加系统可靠性,也节省流量费。

地磁传感器的种类

带有检测磁信号功能的仪器叫做磁性传感器。虽然有很多种使用物理现象的磁传感器,但是都是选择性使用各次的特性。下面图中展示的就是各种磁传感器。大家都知道的有指南针能指示方向,自古以来使用最多的就是这样磁传感器。联动(鎖交)线圈的磁通量时间变化与产生的电压成正比,采用这种基本物理现象即是线圈式磁传感器。利用固体物理性质磁场的依赖性,这种叫做固体磁传感器,由于它的形状小而且还廉价,很多地方都在被使用。磁核共振传感器被用于测量磁场,它是根据原子核的磁矩和磁场使用独立的原子能级。磁传感器不仅仅是用于测量磁场的,也被用测量电流,各种机械量等。

地磁传感器的优点:

在智慧停车系统中,地磁传感器的优点包括安装、维修方便,对路面破坏小,维修时只需检查地磁传感器即可;检测点不易遭破坏,不受路面移动影响;利用地球磁场在铁磁物体通过时的变化来检测,不受气候影响;通过对灵敏度设置,可识别铁磁性物体大小,并大致判断出车辆类型;对非铁磁性物体没有反应,可有效地减少误检。

以上就是关于停车场地磁传感器原理、算法、、种类及优点的知识介绍,停车管理员打印出的小票上记录车辆入场的时间,是地磁传感器感应到的时间。当车辆离开停车泊位时,地磁传感器也会自动停止计时。由此可以体现出停车场地磁传感器算法中检测准确率和反应速度。


/**

*

Driver developed in HERMES project

*/

/**

*

@addtogroup  I2C

*

@brief       My I2C lib.

*  @{

*

@file       i2c.c

*

@brief      An I2C lib for i2c

operations.

*

@details    Change History:

*

************************************************************************

*                  | VERSION      | DATE         | AUTHORS    | DESCRIPTION            |

*

|:------------:|:--------------:|:------------|:-----------------------|

*                  | 1.0          |

25/8/2014    | MR          | First Release          |

*                  \n\n

*/

#include "i2c.h"

#include "hardware.h"

#include

/**

*

@brief  Initialize i2c module:

*  I2C

clock is BRG

*  If

mode parameter is SLAVE, uses address to set slave address for the module

*

Enable module

*

@param[in]  I2C_MODULE i2cnum

(use I2C1 otherwise is necessary to modify the functions)

*

@param[in]  i2cmode mode (MASTER

or SLAVE)

*

@param[in]  BYTE address for

SLAVE mode

*

@return     none

*/

void i2c_init(I2C_MODULE i2cnum, i2cmode

mode, BYTE address) {

//enabling

i2c module doesnt need changing port

//direction/value

etc, and is not a pin muxed peripheral

I2CConfigure ( i2cnum,

I2C_ENABLE_SLAVE_CLOCK_STRETCHING);

I2CSetFrequency ( i2cnum, GetPeripheralClock(), BRG);

if(mode == SLAVE)

{

//address

mask is set to 0

I2CSetSlaveAddress ( i2cnum, address&0x7f, 0, I2C_USE_7BIT_ADDRESS );

}

I2CEnable(i2cnum, TRUE);

}

/**

*

@brief  Write to device using

generic i2c protocol

*

@param[in]  slave_addr - slave

address

*

@param[in]  reg_addr   - register address

*

@param[in]  length     - number of bytes to write

*

@param[in]  *data      - pointer for data to write

*

@return     0 if sucessfull, 1

otherwise

*/

int i2c_write(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char const *data) {

BYTE i;

StartI2C1();                                    //Send the

Start Bit

IdleI2C1();                                         //Wait to

complete

if (MasterWriteI2C1(((slave_addr<<1)|(0x00))))

return 1;

IdleI2C1();

if (MasterWriteI2C1(reg_addr))

return 1;

IdleI2C1();

for(i=0;i

if (MasterWriteI2C1(data[i]))

return 1;

}

StopI2C1();                                  //Send the

Stop condition

IdleI2C1();                                  //Wait to

complete

return 0;

}

/**

*

@brief  Write to device using

generic i2c protocol

*

@param[in]  slave_addr - slave

address

*

@param[in]  reg_addr   - register address

*

@param[in]  length     - number of bytes to read

*

@param[in]  *data      - pointer to where register data is to

be transfered

*

@return     0 if sucessfull, 1

otherwise

*/

int i2c_read(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data) {

BYTE i=2;

StartI2C1();                                    //Send the

Start Bit

IdleI2C1();

if (MasterWriteI2C1(((slave_addr<<1)|(0x00))))

return 1;

IdleI2C1();

if (MasterWriteI2C1(reg_addr))

return 1;

IdleI2C1();

StartI2C1();                        //Send the

Start Bit

IdleI2C1();                         //Wait to

complete

if (MasterWriteI2C1(((slave_addr<<1)|(0x01))))

return 1;

IdleI2C1();

I2CReceiverEnable ( I2C1, TRUE);

for(i=0;i

data[i] = MasterReadI2C1();

if(i<(length-1)) {

I2CAcknowledgeByte(MPU_I2C, TRUE);

IdleI2C1();

}

else {

I2CAcknowledgeByte(MPU_I2C, FALSE);

IdleI2C1();

}

}

StopI2C1();                                  //Send the

Stop condition

IdleI2C1();                                  //Wait to

complete

return 0;

}

Normal

0

7.8 磅

0

2

false

false

false

MicrosoftInternetExplorer4

/* Style Definitions */

table.MsoNormalTable

{mso-style-name:普通表格;

mso-tstyle-rowband-size:0;

mso-tstyle-colband-size:0;

mso-style-noshow:yes;

mso-style-parent:"";

mso-padding-alt:0cm 5.4pt 0cm 5.4pt;

mso-para-margin:0cm;

mso-para-margin-bottom:.0001pt;

mso-pagination:widow-orphan;

font-size:10.0pt;

font-family:"Times New Roman";

mso-fareast-font-family:"Times New Roman";

mso-ansi-language:#0400;

mso-fareast-language:#0400;

mso-bidi-language:#0400;}

下一篇:压力传感器的稳定性 ——线性和综合