项目需要做一个安全装置盒,防止人为移动,破坏。选用一款数字式3轴加速度传感器,原思路是通过加速度传感器的3轴加速度值进行二次积分获取设备的移动位置,通过位置判断设备是否被移动;通过瞬时加速度值来判断设备是否为强力破坏;
经过测试发现加速度本身噪声很大,二次积分累计误差很大,重力加速度值会根据位置不同3轴有偏差等诸多问题,不得不根据实际情况进行简化模型,加速度进行10次平均滤波(采样时间为100ms);
将整个运动分成2种状态,稳定态与移动态,通过连续n次3个方向加速度微分值进行判断当前状态,假定n为5次判定,连续5次3个方向加速度微分值都小于设定阈值,则认为当前处于稳定状态,将最后一次加速度值作为当前重力加速度,随后进行重力加速度平均,若出现3个方向加速度微分值大于阈值,则当前处于移动态,使用以前重力加速度进行计算,开始进行两次积分,获取位置信息。
移动态时加速度与重力加速度进行比较,将两次变化小于3的值强制变成0,进一步滤掉微小误差。在人为移动装置时候很难出现人为匀速运动的情况,故在加速度为0的时候,将速度置为0。
最后根据位置变化输出设备被人为移动报警信息。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include"libfahw.h"
#define BUF_SIZE 32
#define WEND_MAX 5
#define PWEND_MAX 5
#define WEND_CI 5
void stringtoxyz(char st[],int *a,int *b,int *c);
//基本思路 判断处于动态还是稳态 5次加速度值很接近表示稳态 稳态下累计计算g值 出现动态时以g值作为基本参考 计算二次积分 过程中计算稳态,稳态判定成功重新累计g值
//计算平均值时加速度
int ax2=0,ay2=0,az2=0;
//重力加速度
int gx=0,gy=0,gz=0;
//累计位置信息
int px=0,py=0,pz=0;
//累计速度信息
int vx=0,vy=0,vz=0;
//前一次加速度信息
int preax=0,preay=0,preaz=0