目前,传感器被广泛应用于智能手机、工业控制、汽车系统、气候监测、医疗保健和石油勘探等领域。一般来说,单个传感器既有优点也有缺点。为了克服单个传感器的局限性,通过收集来自不同传感器的信息,以较少的犹豫生成更一致的数据,使用了传感器融合。因此,这些稳健的数据可以用来采取某些行动和做出决策。让我们讨论一下传感器融合以及与工作相关的类型。


什么是传感器融合?

传感器融合定义:来自不同传感器的数据合并过程,以对物体或目标进行更精确的概念化,这一过程被称为传感器融合。因此,这个过程只允许您合并来自多个传感器的输入,以更准确、完整地了解目标方向、周围环境和位置。

ding="async" class="wp-image-42352 size-full" src="https://uploads.9icnet.com/images/aritcle/20230518/Sensor-Fusion.jpg" alt="Sensor Fusion" width="471" height="312" sizes="(max-width: 471px) 100vw, 471px">
传感器融合

传感器融合主要用于解决不同传感器之间的挑战、传感器同步、预测未来物体的位置、利用异构传感器的优势、传感器的故障检测和实现自动驾驶安全要求。

传感器融合是如何工作的?

传感器融合的工作原理是将许多传感器的所有输入汇集在一起,形成平台周围环境的单个图像或模型。因此,输出非常准确,因为它平衡了各种传感器的强度。传感器融合过程使用软件算法来提供更全面、更精确的环境模型。这是一种收集、过滤和聚合传感器信息的复杂方法,以保持智能决策所需的环境意识:

传感器融合的类型

传感器融合有三种类型——竞争型、互补型和合作型,每种类型将在下文中讨论。

Types of Sensor Fusion
传感器融合的类型

然而,在互补传感器融合中,如果传感器不直接相互依赖,则可以将它们合并,以提供所观察现象的完整图像。这决定了传感器信息的不完整性。

这种配置的最好例子是使用了几个摄像头,每个人都可以监控房间的不同元素。通常,互补数据融合非常简单,而传感器的数据可以相互添加。

在竞争性的融合传感器中,每种类型的传感器都提供具有相似特性的独立测量。这些类型的融合传感器主要用于鲁棒和容错系统。这方面最好的例子是通过合并两个重叠的相机图像来减少噪声。

协作融合传感器网络利用由两个单独的传感器提供的数据来导出不能仅从传感器获得的信息。这方面最好的例子是使用两个相机混合二维图像的立体视觉。在几乎不相似的视点处,可以导出三维观察到的场景图像。

传感器融合算法

传感器融合算法主要由数据科学家用于在传感器融合应用中组合数据。因此,这些算法将处理所有传感器输入,并通过高可靠性和准确性产生输出,即使个别测量有缺陷。下面将讨论不同类型的传感器融合算法。

中心极限定理

CLT或中心极限定理是一个算术概念,指出在数学和统计学中,平均值的抽样分布是一个重要的概念。一般来说,平均值是指除原始种群分布形状外,当样本大小增加时,一组方法中最常见的或平均值,即正态分布。

Central Limit Theorem
中心极限定理

例如:如果我们有两种类型的传感器,如超声波和红外传感器。一旦我们从他们的读数中获得更多的样本,样本平均值分布就会更接近钟形曲线,因此,它会接近集合的准确平均值。一旦我们接近精确的平均值,那么低噪声将导致传感器融合算法。

卡尔曼滤波器

卡尔曼滤波器是一种传感器融合算法,它使用来自不同来源的数据输入来估计导航和控制技术中经常使用的未知值。与使用单一测量技术的单个预测相比,这些滤波器能够非常准确地计算未知值。

Kalman Filter
卡尔曼滤波器

卡尔曼滤波算法是最常用的传感器融合应用,为理解理论本身提供了基础。卡尔曼滤波器最常见的应用是,它适用于定位和导航技术。由于卡尔曼滤波是重复的,然后我们需要知道汽车最后识别的位置及其速度能够预测其当前和未来的状况。

卷积神经网络

这种类型的融合算法可以同时处理各种传感器数据通道。通过组合这些数据,它们可以根据图像识别产生分类结果。例如,机器人使用传感器数据来通知远处的交通标志,这取决于基于卷积神经网络的算法。具有卷积神经网络(CNN)的传感器融合系统用于监测医疗保健应用中的过渡运动。

Convolutional Neural Networks
卷积神经网络

贝叶斯网络

在传感器融合中,贝叶斯网络算法是一种图形模型,通过有向无环图表示一组变量及其条件依赖关系。例如,贝叶斯网络表示疾病和症状之间的主要概率关系。因此,该网络可以简单地用于计算不同疾病存在的概率。

Bayesian Network
贝叶斯网络

高效的算法可以在贝叶斯网络中执行推理和学习。这些形成一系列变量(如蛋白质序列或语音信号)的网络被称为动态贝叶斯网络。这些网络的简化可以表示和解决不确定性中的决策问题,称为影响图。

MPU6050传感器与Arduino Uno接口

下面讨论MPU6050传感器与Arduino UNO板的接口。

MPU6050 Sensor Interfacing with Arduino Uno
MPU6050传感器与Arduino Uno接口

MPU6050是一种惯性测量单元传感器(IMU),在芯片上包括MEMS加速计和MEMS陀螺仪。IMU包括三个传感器,如加速度计、陀螺仪和磁力计。IMU传感器的主要功能是在加速度计的帮助下测量特定的力,使用陀螺仪测量角速率,使用磁力计测量磁场。

这些传感器适用于飞机、自平衡机器人、航天器、卫星、无人机、平板电脑、手机、无人机,用于位置检测、制导、方位检测、飞行控制和跟踪运动。

常见的IMU传感器是MPU 6050和ADXL 335加速计。ADXL 335 IMU传感器包括3轴加速度计,而MPU-6050传感器是一种6轴运动跟踪设备,将三轴加速度计和陀螺仪集成在芯片上。

Arduino UNO与MPU6050传感器接口所需的组件主要包括MPU 6050传感器、连接线和Arduino UNO板。该接口的连接如下:;

  • 将MPU6050传感器的VCC引脚连接到Arduino的VCC。
  • 将MPU6050传感器的SDA引脚连接到Arduino的IN(A4)引脚。
  • 将MPU6050传感器的SCL引脚连接到Arduino的模拟输入(A5)引脚。
  • 将MPU6050传感器的GND引脚连接到Arduino的GND针脚。
  • 将MPU6050传感器的INT引脚连接到Arduino的数字PWM(引脚2)。

之后,可以通过安装wire.h库来获得来自MPU6050传感器的数据。这两个图书馆可以通过互联网下载。

从这个库代码中,我们可以获得三个主要参数,如滚转、俯仰和偏航。当你开车旅行时,运动可以测量为向右、向左、向前和向后。然而,对于飞行车辆或无人机来说,情况就不一样了。因为飞行控制板的术语是不同的,比如俯仰、偏航和滚转。

俯仰轴可以定义为从无人机的左侧延伸到右侧的轴。所以围绕这个轴的旋转被称为俯仰运动。

滚转轴可以定义为从无人机正面到背面的轴。所以围绕这个轴的旋转被称为滚转运动。

偏航轴可以定义为从无人机顶部到底部的轴。所以围绕这个轴的旋转被称为偏航运动。

项目代码

#包括<Wire.h>

const int MPU=0x68;//MPU6050 I2C地址

浮动AccX、AccY、AccZ;

浮动陀螺仪X、陀螺仪Y、陀螺仪Z;

浮动accAngleX、accAngleY、gyroAngleX,gyroAngle Y、gyro AngleZ;
浮动滚转、俯仰、偏航;

float AccErrorX、AccErrorY、GyroErrorX、GyroError Y、Gyro ErrorZ;
float elapsedTime,currentTime,previousTime;

int c=0;

无效设置(){

序列号开始(19200);

Wire.begin();//初始化通信

导线开始传输(MPU);//启动与MPU6050//MPU的通信=0x68

有线写入(0x6B);//与寄存器通话6B

有线写入(0x00);//重置–将0放入6B寄存器

线端传输(真)//结束传输

/*

//配置加速计灵敏度-满量程(默认值+/-2g)

导线开始传输(MPU);

有线写入(0x1C)//与ACCEL_CONFIG寄存器通话(1C十六进制)

有线写入(0x10)//将寄存器位设置为00010000(+/-8g满量程)

线端传输(真);

//配置陀螺仪灵敏度-满标度范围(默认+/-250deg/s)

导线开始传输(MPU);

有线写入(0x1B);//与GYRO_CONFIG寄存器对话(1B十六进制)

有线写入(0x10);//将寄存器位设置为00010000(1000deg/s满刻度)

线端传输(真);

延迟(20);

*/

//如果需要获取模块的IMU错误值,请调用此函数

calculate_IMU_error();

延迟(20);

}

空心环(){

//===读取加速度计数据===//

导线开始传输(MPU);

有线写入(0x3B);//从寄存器0x3B开始(ACCEL_XOUT_H)

Wire.endTransmission(错误);

Wire.requestFrom(MPU,6,true);//共读取6个寄存器,每个轴值存储在2个寄存器中

//根据数据表,对于+-2g的范围,我们需要将原始值除以16384

AccX=(Wire.read()<<8|Wire.red())/16384.0;//X轴值

AccY=(Wire.read()<<8|Wire.red())/16384.0;//Y轴值

AccZ=(Wire.read()<<8|Wire.red())/16384.0;//Z轴值

//根据加速度计数据计算滚转和俯仰

accAngleX=(atan(AccY/sqrt(pow(AccX,2)+pow(AccZ,2))*180/PI)–0.58;//AccErrorX~(0.58)有关更多详细信息,请参阅calculate_IMU_error()自定义函数
accAngleY=(atan(-1*AccX/sqrt(pow(AccY,2)+pow(AccZ,2)))*180/PI)+1.58;//加速度误差Y~(-1.58)

//===读取陀螺仪数据===//

previousTime=当前时间;//上次时间存储在实际读取时间之前

currentTime=毫秒();//当前时间实际读取时间

逝去的时间=(currentTime–previousTime)/1000;//除以1000得到秒

导线开始传输(MPU);

有线写入(0x43);//陀螺仪数据第一寄存器地址0x43

Wire.endTransmission(错误);

Wire.requestFrom(MPU,6,true);//总共读取4个寄存器,每个轴值存储在2个寄存器中

GyroX=(导线读取()<<8|导线读取(())/131.0;//根据数据表,对于250deg/s的范围,我们必须首先将原始值除以131.0

GyroY=(导线读取()<<8|导线读取(())/131.0;

GyroZ=(导线读取()<<8|导线读取(())/131.0;

//用计算的误差值校正输出

陀螺仪X=陀螺仪X+0.56;//陀螺仪错误X~(-0.56)

陀螺仪Y=陀螺仪Y–2;//陀螺仪错误Y~(2)

陀螺仪Z=陀螺仪Z+0.79;//陀螺仪误差Z~(-0.8)

//目前,原始值以度/秒为单位,因此我们需要乘以sendonds(s)来获得以度为单位的角度

陀螺角度X=陀螺角度X+陀螺X*经过的时间;//度/s*s=度

陀螺角度Y=陀螺角度Y+陀螺Y*经过的时间;

偏航=偏航+陀螺仪Z*经过的时间;

//互补滤波器-组合加速度计和陀螺仪角度值

滚转=0.96*陀螺角度X+0.04*加速度角度X;

俯仰=0.96*回转角度Y+0.04*加速度角度Y;

//在串行监视器上打印值

序列打印(卷);

序列号打印(“/”);

序列打印(间距);

序列号打印(“/”);

Serial.println(偏航);

}

无效计算_IMU_error(){

//我们可以在设置部分调用此函数来计算加速度计和陀螺仪数据误差。从这里,我们将获得打印在串行监视器上的上述公式中使用的错误值。

//请注意,为了获得正确的值,我们应该将IMU放平,这样我们就可以获得正确的数值

//读取加速度计值200次

而(c<200){

导线开始传输(MPU);

有线写入(0x3B);

Wire.endTransmission(错误);

Wire.requestFrom(MPU,6,true);

AccX=(Wire.read()<<8|Wire.red())/16384.0;

AccY=(Wire.read()<8|Wire.read))/16384.0;
AccZ=(Wire.read()<<8|Wire.red())/16384.0;

//对所有读数求和

AccErrorX=AccErrorX+(atan((AccY)/sqrt(pow((AccX),2)+pow((AckZ),2()))*180/PI));

AccErrorY=AccErrorY+(atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AcmZ),2()))*180/PI));

c++;

}

//将总和除以200得到误差值

AccErrorX=AccErrorX/200;

AccErrorY=AccErrorY/200;

c=0;

//读取陀螺仪值200次

而(c<200){

导线开始传输(MPU);

有线写入(0x43);

Wire.endTransmission(错误);

Wire.requestFrom(MPU,6,true);

GyroX=Wire.read()<<8|Wire.read);

GyroY=导线读取()<<8|Wire.read();

GyroZ=Wire.read()<<8|Wire.read);

//对所有读数求和

GyroErrorX=GyroErrorX+(GyroX/131.0);

GyroErrorY=GyroErrorY+(GyroY/131.0);

GyroErrorZ=GyroErrorZ+(GyroZ/131.0);

c++;

}

//将总和除以200得到误差值

GyroErrorX=GyroErrorX/200;

GyroErrorY=GyroErrorY/200;

GyroErrorZ=GyroErrorZ/200;

//在串行监视器上打印错误值

串行打印(“AccErrorX:”);

串行.println(AccErrorX);

串行打印(“AccErrorY:”);

串行.println(AccErrorY);

串行打印(“GyroErrorX:”);

Serial.println(陀螺仪错误X);

串行打印(“GyroErrorY:”);

Serial.println(陀螺仪错误Y);

串行打印(“GyroErrorZ:”);

Serial.println(陀螺仪错误Z);

}

输出

通过以上编程,我们可以获得滚转、俯仰或偏航的数据。这些是通过MPU6050陀螺仪角度获得的操纵数据。

MPU6050传感器的应用主要包括3D鼠标控制器、3D遥控器、机械臂控制、手势控制设备、自平衡机器人等。

优势

这个传感器融合的优势包括以下内容。

  • 聚变传感器用于在广泛的操作条件范围内提供精度。
  • 集成的感官数据提供了多边、可靠和高水平的识别设备。
  • 传感器融合能够将多个激光雷达、相机和雷达的输入结合起来,形成车辆区域环境的单一模型。所得到的模型更加准确,因为它平衡了不同传感器的强度。
  • 与单个传感器相比,传感器融合提供了更全面、更可靠的数据
    传感器融合将通过扩大包括自主功能在内的无人机和机器人等不同设备的范围来降低运营成本。
  • 传感器融合的主要目标是克服单个传感器的局限性。
  • 传感器融合系统增强了车道检测系统的强度,使系统更加一致。

应用

这个传感器融合的应用包括以下内容。

  • 传感器融合用于全球定位系统(GPS)和惯性导航系统(INS),这些系统的数据可以通过不同的技术进行融合。例如,扩展卡尔曼滤波器用于使用低成本传感器确定飞机的姿态。
  • 传感器融合允许感知上下文,这对物联网(IoT)具有巨大的潜力。
  • 当使用大量传感器并提高感知能力时,它显著提高了车道检测的性能。

因此,这一切都是关于传感器融合的概述,其中包括不同的算法以及用于设计、测试和模拟系统的工具,这些系统结合了来自多个传感器的信息,以保持定位和态势感知,如主动、被动雷达、激光雷达、EO/IR、声纳、GPS和IMU。这里有一个问题要问你,传感器融合的缺点是什么?