作为无人机方面做嵌入式编写的飞控总结5-磁力计对航向角yaw的校准1(磁力计如何校正航向)

文档参考:上海丙寅电子有限公司 技术文档

导语:磁力计传感器取自于大地磁感应的强度hx,hy,hz;

1如何得到罗盘的方位角:怎么才能够从简单的 3 轴数据得到罗盘的方位角

   1)当 3 轴磁力计工作时可以读到 XYZ 三轴的磁场强度hx,hy,hz,此时的数值并不能直接用作方位角的计算!                    因为此时的读数可能受到器件版面上其他一些含磁材料的影响,形成圆心坐标的 硬铁漂移;

  2)去除漂移误差

1,水平匀速旋转,收集 XY轴的数据
2,转动器材90度(此时Z轴水平)匀速旋转以收集 Z轴数据

3,将读取到的各轴数据的最大值加上最小值除以 2,就得到一个各轴的 offset值

        Xoffset= (Xmax+Xmin )/2
        Yoffset= (Ymax+Ymin )/2

        Zoffset= (Zmax+Zmin )/2

4,然后将磁力计读取的各轴的裸值减去前面计算所得的 offset值,就可以得到用作角度计算的 Heading值
        X H =X 裸 -Xoffset
        Y H =Y 裸 -Yoffset

        Z H =Z 裸 -Zoffset

5.如果只用作水平测量,则此时的方位角为   方位角=arctanY H /X H

6.加速度传感器对磁力计进行倾角补偿: 


    如果在测量时,我们的器件不是处在水平位置,套用以上公式,罗盘的方位角将出现偏差(比如在斜坡对无人机作起飞操作的时候),此时就需要使用加速度传感器对磁力计进行倾角补偿。要对电子罗盘进行倾角的补偿,首先要计算出横滚角( θ)Roll以及俯仰角( φ)Pitch代入以下公式 , 计算Heading值

        Xh= X*cos(φ)+Y*sin(θ)*sin(φ)-Z*cos(θ)*sin(φ)
        Yh= Y*cos(θ)+Z*sin(θ)
考虑到角度的4个象限(-180,-90,0,90,180),航向角的计算公式可变为以下公式
        for(Xh<0)=180-[arctan(Yh/Xh)*180/π]
        for(Xh>0,Yh<0)=-[arctan(Yh/Xh)*180/π]
        for(Xh>0,Yh>0)=360-arctan(Yh/Xh)*180/π
        for(Xh=0,Yh<0)=90

        πfor(Xh=0,Yh>0)=270

===========================================

7.

处理 1:方法介绍如上


    =========缩小象限的处理:========


处理2 :

见图分析:这个校准使用的是互补滤波融合;这个比较简单的操作(只能根据符号校准)

接下来讲述基于旋转矩阵校yaw的较为复杂的融合算法;(跟加计基于旋转举证校准陀螺仪的类似),

见:作为无人机方面做嵌入式编写的飞控总结5-磁力计对航向角yaw的校准2(磁力计如何校正航向)



好的,以下是一份基于磁力计和陀螺仪的航向代码,供您参考: ``` #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_LSM303_Accel.h> #include <Adafruit_LSM303DLH_Mag.h> #include <Adafruit_L3GD20.h> // 创建磁力计和陀螺仪对象 Adafruit_LSM303DLH_Mag mag = Adafruit_LSM303DLH_Mag(); Adafruit_L3GD20 gyro; // 定义变量 float heading; float gyro_heading = 0; float prev_time = 0; void setup() { // 初始化串口 Serial.begin(9600); // 初始化磁力计和陀螺仪 if (!mag.begin() || !gyro.begin()) { Serial.println("Failed to initialize sensors"); while (1); } } void loop() { // 读取磁力计数据 sensors_event_t event; mag.getEvent(&event); // 计算航向 heading = atan2(event.magnetic.y, event.magnetic.x); if (heading < 0) { heading += 2 * PI; } // 读取陀螺仪数据 gyro.read(); // 计算陀螺仪航向 float dt = (millis() - prev_time) / 1000.0; gyro_heading += gyro.rotationSpeed(Z_AXIS) * dt; prev_time = millis(); // 综合航向 float heading_degrees = heading * 180 / PI; float gyro_heading_degrees = gyro_heading * 180 / PI; float fused_heading = 0.98 * gyro_heading_degrees + 0.02 * heading_degrees; // 输出航向 Serial.print("Fused Heading: "); Serial.println(fused_heading); } ``` 上面的代码使用了 Adafruit 公司的 LSM303DLH 磁力计和 L3GD20 陀螺仪模块,分别读取磁场和速度数据,并根据数据计算航向。其中,综合航向使用了加权平均的方式,将陀螺仪测量得到的度和磁力计测量得到的度进行加权平均,从而得到更准确的航向
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxilang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值