✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。

🍎 往期回顾关注个人主页:Matlab科研工作室

 👇 关注我领取海量matlab电子书和数学建模资料 

🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。

🔥 内容介绍

一、引言

在众多导航与定位应用中,准确获取物体的航向角至关重要。磁罗盘作为一种常用的航向测量设备,利用地球磁场来确定方向。然而,磁罗盘的测量容易受到各种干扰的影响,如周围环境中的铁磁物质、电磁干扰等,导致测量结果存在噪声和偏差,难以直接满足高精度航向角估计的需求。扩展卡尔曼滤波(EKF)作为一种经典的非线性滤波算法,能够有效处理这类问题,通过融合磁罗盘的测量数据与系统的动态模型,实现对航向角的精确估计。

二、磁罗盘工作原理

(一)地球磁场与磁罗盘测量

地球本身是一个巨大的磁体,其磁场近似为一个偶极子磁场。磁罗盘利用磁敏元件(如霍尔传感器、磁通门传感器等)来检测地球磁场的方向。当磁罗盘处于地球磁场中时,磁敏元件会感应出与磁场方向相关的电信号,通过对这些信号的处理,可以得到磁罗盘相对于地球磁场的角度信息,即磁航向角。

(二)测量误差来源

  1. 环境干扰:周围环境中的铁磁物质会干扰地球磁场,使磁罗盘感受到的磁场发生畸变。例如,在汽车、飞机等交通工具内部,存在大量的金属部件,这些金属会产生局部磁场,影响磁罗盘的测量精度。此外,附近的电磁设备,如电动机、变压器等产生的电磁场,也可能对磁罗盘造成干扰。

  2. 磁罗盘自身误差:磁罗盘的制造工艺和材料特性会导致其存在一定的固有误差。例如,磁敏元件的灵敏度不均匀、零点漂移等问题,都会使测量结果产生偏差。而且,磁罗盘在长期使用过程中,由于温度、湿度等环境因素的变化,其性能可能会发生改变,进一步影响测量精度。

三、扩展卡尔曼滤波(EKF)原理

(一)卡尔曼滤波基础

卡尔曼滤波是一种最优线性递推滤波算法,适用于线性系统且噪声服从高斯分布的情况。它通过预测和更新两个步骤,不断地根据系统的测量值来估计系统的状态。在预测步骤中,利用系统的状态转移方程和噪声模型,预测下一时刻系统的状态和协方差。在更新步骤中,将预测值与实际测量值进行融合,通过卡尔曼增益来调整预测值,得到更准确的状态估计值,并更新协方差。

(二)扩展卡尔曼滤波对非线性系统的处理

实际中的许多系统,包括涉及磁罗盘航向角估计的系统,往往是非线性的。扩展卡尔曼滤波是卡尔曼滤波在非线性系统中的扩展。其核心思想是对非线性系统的状态转移函数和观测函数在当前估计值附近进行一阶泰勒展开,将非线性系统近似为线性系统,然后应用卡尔曼滤波的框架进行处理。

⛳️ 运行结果

正在上传…重新上传取消

📣 部分代码

%%%%%%%%% subscribe cust_imu magnetometer readings and convert to a compass heading %%%%%%%%%%%%

rosshutdown;

setenv('ROS_HOSTNAME','172.17.21.12');

setenv('ROS_IP','172.17.21.12');

setenv('ROS_MASTER_URI','http://172.16.143.85');

rosinit('172.16.143.85');

% rosinit('192.168.154.131', 'NodeHost','192.168.1.1','NodeName','/test_node')

close all;

%clear;

%clc;

% read pose and vicon topics

scanMagne = rossubscriber('/cust_imu0');

test = rossubscriber('/cam0/camera_info');

rostopic info cust_imu0

%rostopic echo cam0/camera_info

%pause

% calibration matrix

U = [2.3291    0.2930    0.0387;

         0    5.5205   -0.7942;

         0         0    2.4020;];

     

c = [-0.2653; 0.1058; 0.0843];

% create figure

figure;

PI     = 3.1415926535897;

Azimuth = 0.0;

% loop to display

while(1)

    

    % receive vision pose messages

    poseMagData = receive(scanMagne);

%     accx = poseMagData.LinearAcceleration.X;

%     accy = poseMagData.LinearAcceleration.Y + 9.81;

%     accz = poseMagData.LinearAcceleration.Z;

    

    magrx = poseMagData.Magnetometer.X;

    magry = poseMagData.Magnetometer.Y;

    magrz = poseMagData.Magnetometer.Z;

    

    rawData = [magrx; magry; magrz];

    

    calibData = U*(rawData-c);

    magx = calibData(1);

    magy = calibData(2);

    magz = calibData(3);

    

    

%     pitch = 180 * atan2(accz, sqrt(accx*accx + accy*accy)) / PI;

%     roll = 180 * atan2(accx, accy) / PI;

    

    % Xh = magz*cos(pitch) + magx*sin(roll)*sin(pitch) - magy*cos(roll)*sin(pitch);

    % Yh = magx*cos(roll) + magy*sin(roll);

    

    % Azimuth = atan2(Yh, Xh);

    % magx = Yh;

    % magz = Xh;

    if (magz == 0 && magx < 0)

        Azimuth = 90.0;

    end

    

    if (magz == 0 && magx > 0)

        Azimuth = 270.0;

    end

    

    if (magz < 0)

        Azimuth = 180 - atan(magx/magz)*180/PI;

    end

    

    if (magz > 0 && magx < 0)

        Azimuth = - atan(magx/magz)*180/PI;

    end

    

    if (magz > 0 && magx > 0)

        Azimuth = 360 - atan(magx/magz)*180/PI;

    end

    

    [x,y] = pol2cart(Azimuth/180.0*PI, 1);

    compass(x,y)

    view([90 -90])

    

    pause(0); refresh;

    

end

🔗 参考文献

[1]宗长富,潘钊,胡丹,等.基于扩展卡尔曼滤波的信息融合技术在车辆状态估计中的应用[J].机械工程学报, 2009, 45(10):6.DOI:10.3901/JME.2009.10.272.

🍅往期回顾扫扫下方二维码

天天Matlab推荐搜索

完整代码程序定制

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐