0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

磁力計LIS2MDL開發(fā)(3)----九軸姿態(tài)解算

嵌入式單片機(jī)MCU開發(fā) ? 來源:嵌入式單片機(jī)MCU開發(fā) ? 作者:嵌入式單片機(jī)MCU開 ? 2023-12-18 11:07 ? 次閱讀

概述

LIS2MDL 包含三軸磁力計。
lsm6ds3trc包含三軸陀螺儀與三軸加速度計。
姿態(tài)有多種數(shù)學(xué)表示方式,常見的是四元數(shù),歐拉角,矩陣和軸角。他們各自有其自身的優(yōu)點(diǎn),在不同的領(lǐng)域使用不同的表示方式。在四軸飛行器中使用到了四元數(shù)和歐拉角。

姿態(tài)解算選用的旋轉(zhuǎn)順序?yàn)閆YX,即IMU坐標(biāo)系初始時刻與大地坐標(biāo)系重合,然后依次繞自己的Z、Y、X軸進(jìn)行旋轉(zhuǎn):

繞IMU的Z軸旋轉(zhuǎn):航向角yaw

繞IMU的Y軸旋轉(zhuǎn):俯仰角pitch

繞IMU的X軸旋轉(zhuǎn):橫滾角row

橫滾roll,俯仰pitch,偏航y(tǒng)aw的實(shí)際含義如下圖:

由于需要解析姿態(tài)角,故將陀螺儀速度修改快一點(diǎn)。

視頻教學(xué)

https://www.bilibili.com/video/BV13j411W7F5/

樣品申請

https://www.wjx.top/vm/OhcKxJk.aspx#

完整代碼下載

https://download.csdn.net/download/qq_24312945/88639256

使用硬件

歐拉角

橫滾角φ:機(jī)體繞OBXB轉(zhuǎn)動,軸Y'B與平面OBXBYB構(gòu)成的夾角。

俯仰角θ:機(jī)體繞OBYB轉(zhuǎn)動,軸Z'B與平面OBYBZB構(gòu)成的夾角。

偏航角ψ:機(jī)體繞OBZB轉(zhuǎn)動,軸X'B與平面OBXBZB構(gòu)成的夾角。

將姿態(tài)角從機(jī)體坐標(biāo)系轉(zhuǎn)換到慣性坐標(biāo)系中是為了便于分析無人機(jī)狀態(tài),反映無人機(jī)在慣性坐標(biāo)系下的姿態(tài)運(yùn)動狀態(tài),利用齊次線性變換可實(shí)現(xiàn)坐標(biāo)系的轉(zhuǎn)換,旋轉(zhuǎn)矩陣就是在線性變化中產(chǎn)生的,用REB表示慣性坐標(biāo)系{E}到機(jī)體坐標(biāo)系{B}的變換。

例如,繞OBXB旋轉(zhuǎn)必角,此時兩個坐標(biāo)系存在必的角度差,不再重合。點(diǎn)(x, y, z)的轉(zhuǎn)換方程為:

可提取轉(zhuǎn)換矩陣:

同理,繞口OBYB旋轉(zhuǎn)θ角得:

而繞OBZB旋轉(zhuǎn)ψ角得:

不同旋轉(zhuǎn)順序有不同的旋轉(zhuǎn)矩陣,按照偏航,俯仰,橫滾的順序,即分別繞X-Y-Z旋轉(zhuǎn),就可計算出旋轉(zhuǎn)矩陣REB,REB等于依次旋轉(zhuǎn)所得的矩陣連乘,且順序?yàn)閺挠蚁蜃笈帕小?/p>

萬向節(jié)死鎖

當(dāng)俯仰角θ=±Π/2時,橫滾運(yùn)動與偏航運(yùn)動的旋轉(zhuǎn)軸重合,出現(xiàn)萬向節(jié)死鎖現(xiàn)象,在空間失去了一個自由度。如式所示,φ或ψ的變化具有相同的效果,因此不再具有唯一性啊。

四元數(shù)法

本文選擇的是四元數(shù)法進(jìn)行姿態(tài)解算。無人機(jī)姿態(tài)解算方法主要有四種,它們各自的優(yōu)缺點(diǎn)如下圖所示。歐拉角法不能用于計算飛行器的全姿態(tài)角,且難以實(shí)時計算而不易于工程應(yīng)用。方向余弦法不會出現(xiàn)“奇點(diǎn)”現(xiàn)象,但計算量大,效率低。四元數(shù)法避免了復(fù)雜的三角函數(shù)運(yùn)算,變?yōu)榍蠼饩€性微分方程,算法簡單易操作,且不存在角度奇異性問題,可以更好的線性化系統(tǒng),是一種更實(shí)用的工程方法。

四元數(shù)的概念誕生在1843年的愛爾蘭,是數(shù)學(xué)家哈密頓研究空間幾何時提出。在如今的導(dǎo)航技術(shù)領(lǐng)域,四元數(shù)的優(yōu)勢逐漸被發(fā)現(xiàn),得到了研究者們的廣泛關(guān)注,并逐漸應(yīng)用在姿態(tài)解算領(lǐng)域。

四元數(shù)是由四個元構(gòu)成的數(shù)Q(q0,q1,q2,q3) = q0 + q1i + q2j + q3k;其中,q0,q1,q2,q3是實(shí)數(shù),i,j,k既是互相正交的單位向量,又是虛單位根號-1。四元數(shù)即可看作四維空間中的一個向量,又可以看做一個超復(fù)數(shù)。對于后續(xù)有一個重要的變化需要記?。?/p>

Q=q0 + q1i + q2j + q3k

可視為一個超復(fù)數(shù),Q 的共軛復(fù)數(shù)記為

Q'=q0 - q1i - q2j - q3k

Q°稱為Q的共軛四元數(shù)。

同時,有

ij=k,jk=i,ki=j,ji=-k,kj=-i,ik=-j

i2 = j2 = k2 =ijk=-1

其中,i、j、k是相互正交的單位向量,其幾何意義可理解為分別繞三個坐標(biāo)軸的旋轉(zhuǎn),q0、q1、q2、q3為常數(shù),有

通過四元數(shù)進(jìn)行歐拉角求解,可以減少芯片運(yùn)算負(fù)擔(dān),提高運(yùn)算速度。

一個矢量V相對于坐標(biāo)系OXYZ固定:V = xi + yj + zk;坐標(biāo)系OXYZ轉(zhuǎn)動了Q得到一個新坐標(biāo)系OX’Y’Z’:V = x’i’ + y’j‘ + z’k’;設(shè)四元數(shù)Ve、Ve‘

Ve = xi + yj + zk;

Ve’ = x’i + y’j + z’k;

則Ve’ = Q* Ve * Q';

設(shè)Q = q0 + q1i + q2j + q3k;則Q' = q0 - q1i - q2j - q3k;

則Ve’ = Q* Ve * Q'=(q0 + q1i + q2j + q3k) * (0+xi + yj + zk) + (q0 - q1i - q2j - q3k)

可以算出

x’=(q0 ^2+q1 ^2-q2 ^2-q3 ^2)x+2(q1q2+ q1q3)y+2(q1q3-q0q2)z

y’ = 2(q1q2-q0q3)x+(q0 ^2-q1 ^2+q2 ^2-q3 ^2)y+2(q2q3+q0q1)z

z’ = 2(q1q3+q0q2)x+2(q2q3-q0q1)y+(q0 ^2-q1 ^2-q2 ^2+q3 ^2)z

結(jié)合 可以反推

Pitch  = asin(2 * q2 * q3 + 2 * q0* q1)* 57.3; // pitch ,轉(zhuǎn)換為度數(shù)
        Roll = atan2(-2 * q1 * q3 + 2 * q0 * q2, q0*q0-q1*q1-q2*q2+q3*q3)* 57.3; // rollv
        Yaw = atan2(2*(q1*q2 - q0*q3),q0*q0-q1*q1+q2*q2-q3*q3) * 57.3;   //偏移太大,

將加速度的三維向量轉(zhuǎn)為單位向量

// 測量正?;?/span>
        norm = sqrt(ax*ax + ay*ay + az*az);      
        ax = ax / norm;                   //單位化
        ay = ay / norm;
        az = az / norm;

世界坐標(biāo)系重力分向量是通過方向旋轉(zhuǎn)矩陣的最后一列的三個元素乘上加速度就可以算出機(jī)體坐標(biāo)系中的重力向量。

// 估計方向的重力
        vx = 2*(q1*q3 - q0*q2);//由下向上方向的加速度在加速度計X分量 
        vy = 2*(q0*q1 + q2*q3);//由下向上方向的加速度在加速度計X分量 
        vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;//由下向上方向的加速度在加速度計Z分量

將磁力計的三維向量轉(zhuǎn)為單位向量。

norm = sqrt(mx*mx + my*my + mz*mz);         
        mx = mx / norm;
        my = my / norm;
        mz = mz / norm;

計算地磁計在理論地磁坐標(biāo)系下的機(jī)體上三個軸的分量:

● hx, hy, hz 分別表示地磁計測量值在機(jī)體坐標(biāo)系下的x、y、z軸分量。

● 這一步通過方向余弦矩陣(DCM)將地磁計測量值從地磁坐標(biāo)系轉(zhuǎn)換到機(jī)體坐標(biāo)系。

// 這里計算得到的是地磁計在理論地磁坐標(biāo)系下的機(jī)體上三個軸的分量
        hx = 2*mx*(0.5 - q2*q2 - q3*q3) + 2*my*(q1*q2 - q0*q3) + 2*mz*(q1*q3 + q0*q2);
        hy = 2*mx*(q1*q2 + q0*q3) + 2*my*(0.5 - q1*q1 - q3*q3) + 2*mz*(q2*q3 - q0*q1);
        hz = 2*mx*(q1*q3 - q0*q2) + 2*my*(q2*q3 + q0*q1) + 2*mz*(0.5 - q1*q1 - q2*q2);

計算磁北方向與當(dāng)前航向角的夾角:

● bx 表示地磁計測量值與磁北方向的夾角,也即當(dāng)前航向角。

● bx 的計算使用了地磁計在機(jī)體坐標(biāo)系下的x和z軸分量,通過計算角度來表示航向角。

//bx計算的是當(dāng)前航向角和磁北的夾角,也就是北天東坐標(biāo)下的航向角
                //當(dāng)羅盤水平旋轉(zhuǎn)的時候,航向角在0-360之間變化
                bx = sqrt((hx*hx) + (hy*hy));
        bz = hz;

將地磁計在機(jī)體坐標(biāo)系下的磁向量轉(zhuǎn)換到機(jī)體坐標(biāo)系:

● 類似之前的步驟,使用方向余弦矩陣(DCM)將地磁計測量值從機(jī)體坐標(biāo)系轉(zhuǎn)換到地磁坐標(biāo)系。

● 得到角速度分量 wx, wy, wz,這些值在姿態(tài)融合中用于更新四元數(shù)。

//地磁計在n系下磁向量轉(zhuǎn)換到b系下,反向使用DCM得到
        wx = 2*bx*(0.5 - q2*q2 - q3*q3) + 2*bz*(q1*q3 - q0*q2);
        wy = 2*bx*(q1*q2 - q0*q3) + 2*bz*(q0*q1 + q2*q3);
        wz = 2*bx*(q0*q2 + q1*q3) + 2*bz*(0.5 - q1*q1 - q2*q2);

這些步驟的目的是將地磁計測量值轉(zhuǎn)換到機(jī)體坐標(biāo)系中,并結(jié)合加速度計的測量值估計機(jī)體坐標(biāo)系中的方向和重力向量。這樣的處理是為了在姿態(tài)融合算法中使用這些數(shù)據(jù),以更準(zhǔn)確地估計設(shè)備的方向。請確保在使用這段代碼時,四元數(shù)和傳感器數(shù)據(jù)的值都已經(jīng)被正確更新。

姿態(tài)解算

雙環(huán)PI控制器

陀螺儀能夠迅速響應(yīng)設(shè)備的旋轉(zhuǎn),在短時間內(nèi)誤差較小且可靠。然而,因?yàn)闇囟绕?、零漂移和積分誤差會隨時間累積,陀螺儀的長時間精度受到影響。在靜止?fàn)顟B(tài)下,加速度計的漂移很小,其傾角求解過程中不存在積分誤差,但在飛行過程中,加速度計受到發(fā)動機(jī)和機(jī)架振動以及轉(zhuǎn)動和運(yùn)動加速度的干擾。磁羅盤測量的地磁向量在特定地理范圍內(nèi)可視為不變,但磁羅盤易受硬磁場和軟磁場干擾。

因此,若系統(tǒng)外環(huán)采用九軸姿態(tài)傳感器(包括三軸加速度計、三軸磁羅盤和三軸陀螺儀)進(jìn)行數(shù)據(jù)融合,磁羅盤易受干擾可能導(dǎo)致融合后的數(shù)據(jù)仍有較大誤差。為此,在內(nèi)環(huán)使用六軸姿態(tài)傳感器(包括三軸加速度計和三軸陀螺儀)進(jìn)行數(shù)據(jù)融合,對融合后的傳感器姿態(tài)偏差進(jìn)行二次修正,以提高整體精度。

外環(huán)九軸姿態(tài)傳感器數(shù)據(jù)融合,記在飛行器機(jī)體坐標(biāo)系下an=[ax ay az]T和mn=[mx my mz]T分別為加速度計和磁羅盤實(shí)際測量得到的重力向量和地磁向量。

記vn=[vx vy vz]T和wn=[mx my mz]T是將地理坐標(biāo)系下重力向量kb=[0 0 1g]T和地磁向量nb=[nx 0 nz]T(不考慮地理磁偏角因素,將機(jī)頭固定向北)通過四元數(shù)坐標(biāo)換算成機(jī)體坐標(biāo)系下的重力向量和地磁向量。向量之間的誤差為坐標(biāo)軸的旋轉(zhuǎn)誤差,可以用向量的叉積en=[ex ey ez]T表示,如下所示。

由于我的LSM6DS3TR-C為六軸,不帶三軸陀螺儀,故代碼如下。

//這個叉積向量仍舊是位于機(jī)體坐標(biāo)系上的,而陀螺積分誤差也是在機(jī)體坐標(biāo)系,而且叉積的大小與陀螺積分誤差成正比,正好拿來糾正陀螺。
//(你可以自己拿東西想象一下)由于陀螺是對機(jī)體直接積分,所以對陀螺的糾正量會直接體現(xiàn)在對機(jī)體坐標(biāo)系的糾正。

        ex = (ay*vz - az*vy);
        ey = (az*vx - ax*vz);
        ez = (ax*vy - ay*vx);

添加磁力計之后代碼如下所示。

//這個叉積向量仍舊是位于機(jī)體坐標(biāo)系上的,而陀螺積分誤差也是在機(jī)體坐標(biāo)系,而且叉積的大小與陀螺積分誤差成正比,正好拿來糾正陀螺。
//(你可以自己拿東西想象一下)由于陀螺是對機(jī)體直接積分,所以對陀螺的糾正量會直接體現(xiàn)在對機(jī)體坐標(biāo)系的糾正。

//                ex = (ay*vz - az*vy);
//        ey = (az*vx - ax*vz);
//        ez = (ax*vy - ay*vx);
        ex = (ay*vz - az*vy) + (my*wz - mz*wy);
        ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
        ez = (ax*vy - ay*vx) + (mx*wy - my*wx);

由于陀螺儀是對機(jī)體直接積分,所以,陀螺儀的誤差可以體現(xiàn)為機(jī)體坐標(biāo)的誤差。因此修正坐標(biāo)軸的誤差可以達(dá)到修正陀螺儀誤差的目的,從而將加速度計和磁羅盤進(jìn)行修正陀螺儀,實(shí)現(xiàn)了九軸的數(shù)據(jù)融合。即如果陀螺儀按照叉積誤差的軸,轉(zhuǎn)動叉積誤差的角度,就可以消除機(jī)體坐標(biāo)上實(shí)際測量的重力向量和地磁向量和坐標(biāo)換算后的重力向量和地磁向量之間的誤差。

PI調(diào)節(jié)器的比例部分用于迅速糾正陀螺儀誤差,積分部分用于消除穩(wěn)態(tài)偏差。PI調(diào)節(jié)器的比例系數(shù)和積分系數(shù)自己去修正。陀螺儀經(jīng)過外環(huán)PI控制器修正姿態(tài)誤差后輸出值為了gn =[gx gy gz]T

// 積分誤差比例積分增益,計算陀螺儀測量的重力向量與估計方向的重力向量之間的誤差。
//        exInt = exInt + ex*Ki;
//        eyInt = eyInt + ey*Ki;
//        ezInt = ezInt + ez*Ki;
    /* PI */
    if(ex != 0.0f && ey != 0.0f && ez != 0.0f)
    {                
        exInt = exInt + ex*Ki*halfT;
        eyInt = eyInt + ey*Ki*halfT;
        ezInt = ezInt + ez*Ki*halfT;                

        // 調(diào)整后的陀螺儀測量,使用叉積誤差來進(jìn)行比例-積分(PI)修正陀螺儀的零偏。將修正量乘以比例增益Kp,并加上之前計算的積分誤差exInt、eyInt和ezInt。
//        gx = gx + Kp*ex + exInt;
//        gy = gy + Kp*ey + eyInt;
//        gz = gz + Kp*ez + ezInt;

        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt; 
 }

內(nèi)環(huán)的六軸姿態(tài)傳感器數(shù)據(jù)融合是將地理坐標(biāo)系下的重力場向量與加速度計在機(jī)體坐標(biāo)系下采集到的重力向量進(jìn)行叉乘,求出兩者向量誤差。并通過PI控制器修正向量誤差,從而達(dá)到修正外環(huán)九軸數(shù)據(jù)融合后的陀螺儀的偏差的目的。在每個姿態(tài)解算周期讀取出機(jī)體坐標(biāo)系下雙環(huán)PI控制后的陀螺儀的角速率

整合四元數(shù)率和正常化,根據(jù)陀螺儀的測量值和比例-積分修正值,對四元數(shù)進(jìn)行更新。

// 整合四元數(shù)率和正?;?根據(jù)陀螺儀的測量值和比例-積分修正值,對四元數(shù)進(jìn)行更新。根據(jù)微分方程的離散化形式,將四元數(shù)的每個分量加上相應(yīng)的微分項(xiàng)乘以采樣周期的一半(halfT)。
        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  

        // 正?;脑獢?shù)
        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;

偏航角

六軸傳感器(包括三軸加速度計和三軸陀螺儀)可以用于估算設(shè)備在空間中的姿態(tài),包括俯仰角(Pitch)、橫滾角(Roll)和偏航角(Yaw)。然而,六軸傳感器僅依賴陀螺儀和加速度計數(shù)據(jù),可能無法準(zhǔn)確測量偏航角(Yaw),原因如下:

無磁場參考:六軸傳感器缺少磁羅盤,沒有固定的參考方向。因此,在長時間內(nèi),陀螺儀的積分誤差可能導(dǎo)致偏航角估計漂移。 陀螺儀誤差累積:陀螺儀測量的是角速度,要得到偏航角,需要將角速度積分。由于陀螺儀存在零漂、噪聲和溫度漂移等誤差,這些誤差在積分過程中會累積,使得偏航角估計產(chǎn)生較大的漂移。

雖然六軸傳感器可能無法準(zhǔn)確測量偏航角,但可以通過將其與磁羅盤(三軸磁場傳感器)結(jié)合,形成九軸傳感器(包括三軸加速度計、三軸磁羅盤和三軸陀螺儀),以提高偏航角估計的準(zhǔn)確性。九軸傳感器融合了磁場信息,為偏航角提供了一個穩(wěn)定的參考方向,有助于減小陀螺儀誤差對偏航角估計的影響。

陀螺儀解析代碼

//加速度單位g,陀螺儀rad/s
void IMUupdate1(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz)
{

        float norm;
        float vx, vy, vz;
        float ex, ey, ez;  

        float hx, hy, hz, bx, bz;    
          float wx, wy, wz;
                float  halfT;
                now_update  = HAL_GetTick(); //ms
                halfT       = ((float)(now_update - last_update) / 2000.0f);
                last_update = now_update;    
        // 測量正?;?把加計的三維向量轉(zhuǎn)成單位向量。
        norm = sqrt(ax*ax + ay*ay + az*az);      
        ax = ax / norm;                   //單位化
        ay = ay / norm;
        az = az / norm; 

        norm = sqrt(mx*mx + my*my + mz*mz);         
        mx = mx / norm;
        my = my / norm;
        mz = mz / norm; 
        // 這里計算得到的是地磁計在理論地磁坐標(biāo)系下的機(jī)體上三個軸的分量
        hx = 2*mx*(0.5 - q2*q2 - q3*q3) + 2*my*(q1*q2 - q0*q3) + 2*mz*(q1*q3 + q0*q2);
        hy = 2*mx*(q1*q2 + q0*q3) + 2*my*(0.5 - q1*q1 - q3*q3) + 2*mz*(q2*q3 - q0*q1);
        hz = 2*mx*(q1*q3 - q0*q2) + 2*my*(q2*q3 + q0*q1) + 2*mz*(0.5 - q1*q1 - q2*q2);         


                //bx計算的是當(dāng)前航向角和磁北的夾角,也就是北天東坐標(biāo)下的航向角
                //當(dāng)羅盤水平旋轉(zhuǎn)的時候,航向角在0-360之間變化
                bx = sqrt((hx*hx) + (hy*hy));
        bz = hz;   

        //地磁計在n系下磁向量轉(zhuǎn)換到b系下,反向使用DCM得到
        wx = 2*bx*(0.5 - q2*q2 - q3*q3) + 2*bz*(q1*q3 - q0*q2);
        wy = 2*bx*(q1*q2 - q0*q3) + 2*bz*(q0*q1 + q2*q3);
        wz = 2*bx*(q0*q2 + q1*q3) + 2*bz*(0.5 - q1*q1 - q2*q2);      

        // 估計方向的重力,世界坐標(biāo)系重力分向量是通過方向旋轉(zhuǎn)矩陣的最后一列的三個元素乘上加速度就可以算出機(jī)體坐標(biāo)系中的重力向量。
        vx = 2*(q1*q3 - q0*q2);//由下向上方向的加速度在加速度計X分量 
        vy = 2*(q0*q1 + q2*q3);//由下向上方向的加速度在加速度計X分量 
        vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;//由下向上方向的加速度在加速度計Z分量


//這個叉積向量仍舊是位于機(jī)體坐標(biāo)系上的,而陀螺積分誤差也是在機(jī)體坐標(biāo)系,而且叉積的大小與陀螺積分誤差成正比,正好拿來糾正陀螺。
//(你可以自己拿東西想象一下)由于陀螺是對機(jī)體直接積分,所以對陀螺的糾正量會直接體現(xiàn)在對機(jī)體坐標(biāo)系的糾正。

//                ex = (ay*vz - az*vy);
//        ey = (az*vx - ax*vz);
//        ez = (ax*vy - ay*vx);
        ex = (ay*vz - az*vy) + (my*wz - mz*wy);
        ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
        ez = (ax*vy - ay*vx) + (mx*wy - my*wx);




        // 積分誤差比例積分增益,計算陀螺儀測量的重力向量與估計方向的重力向量之間的誤差。
//        exInt = exInt + ex*Ki;
//        eyInt = eyInt + ey*Ki;
//        ezInt = ezInt + ez*Ki;
    /* PI */
    if(ex != 0.0f && ey != 0.0f && ez != 0.0f)
    {                
        exInt = exInt + ex*Ki*halfT;
        eyInt = eyInt + ey*Ki*halfT;
        ezInt = ezInt + ez*Ki*halfT;                

        // 調(diào)整后的陀螺儀測量,使用叉積誤差來進(jìn)行比例-積分(PI)修正陀螺儀的零偏。將修正量乘以比例增益Kp,并加上之前計算的積分誤差exInt、eyInt和ezInt。
//        gx = gx + Kp*ex + exInt;
//        gy = gy + Kp*ey + eyInt;
//        gz = gz + Kp*ez + ezInt;

        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt; 
 }
        // 整合四元數(shù)率和正常化,根據(jù)陀螺儀的測量值和比例-積分修正值,對四元數(shù)進(jìn)行更新。根據(jù)微分方程的離散化形式,將四元數(shù)的每個分量加上相應(yīng)的微分項(xiàng)乘以采樣周期的一半(halfT)。
        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  

        // 正?;脑獢?shù)
        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;

//        Pitch  = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch ,轉(zhuǎn)換為度數(shù)
//        Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // rollv
//        Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;   //偏移太大,等我找一個好用的

        Pitch  = asin(2 * q2 * q3 + 2 * q0* q1)* 57.3; // pitch ,轉(zhuǎn)換為度數(shù)
        Roll = atan2(-2 * q1 * q3 + 2 * q0 * q2, q0*q0-q1*q1-q2*q2+q3*q3)* 57.3; // rollv
        Yaw = atan2(2*(q1*q2 - q0*q3),q0*q0-q1*q1+q2*q2-q3*q3) * 57.3;   //偏移太大,等我找一個好用的



}

上報匿名助手能正常進(jìn)行解析。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2551

    文章

    51097

    瀏覽量

    753527
  • 陀螺儀
    +關(guān)注

    關(guān)注

    44

    文章

    784

    瀏覽量

    98709
  • 三軸加速度計
    +關(guān)注

    關(guān)注

    1

    文章

    29

    瀏覽量

    13350
  • 磁力計
    +關(guān)注

    關(guān)注

    1

    文章

    71

    瀏覽量

    20857
收藏 人收藏

    評論

    相關(guān)推薦

    e2studio開發(fā)磁力計LIS2MDL(1)----輪詢獲取磁力計數(shù)據(jù)

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗(yàn)證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取磁力數(shù)據(jù)和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)會被轉(zhuǎn)換
    的頭像 發(fā)表于 08-09 15:14 ?1822次閱讀
    e<b class='flag-5'>2</b>studio<b class='flag-5'>開發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(1)----輪詢獲取<b class='flag-5'>磁力計</b>數(shù)據(jù)

    磁力計LIS2MDL開發(fā)(1)----輪詢獲取磁力計數(shù)據(jù)

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗(yàn)證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取磁力數(shù)據(jù)和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)會被轉(zhuǎn)換為適當(dāng)?shù)膯挝徊⑼ㄟ^串行通信輸出。
    的頭像 發(fā)表于 12-18 10:56 ?1488次閱讀
    <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發(fā)</b>(1)----輪詢獲取<b class='flag-5'>磁力計</b>數(shù)據(jù)

    磁力計LIS2MDL開發(fā)(2)----電子羅盤

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)來轉(zhuǎn)化為指南針。
    的頭像 發(fā)表于 12-18 11:01 ?1371次閱讀
    <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發(fā)</b>(<b class='flag-5'>2</b>)----電子羅盤

    e2studio開發(fā)磁力計LIS2MDL(1)----輪詢獲取磁力計數(shù)據(jù)

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗(yàn)證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取磁力數(shù)據(jù)和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)會被轉(zhuǎn)換
    的頭像 發(fā)表于 05-16 16:54 ?1227次閱讀
    e<b class='flag-5'>2</b>studio<b class='flag-5'>開發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(1)----輪詢獲取<b class='flag-5'>磁力計</b>數(shù)據(jù)

    磁力計LIS2MDL開發(fā)(4)----MotionMC 執(zhí)行磁力計校準(zhǔn)

    運(yùn)行的輕量級算法,能夠在系統(tǒng)運(yùn)行期間進(jìn)行動態(tài)校準(zhǔn),確保磁力計的輸出數(shù)據(jù)始終準(zhǔn)確可靠。 在本文中,將介紹如何使用LIS2MDL磁力計與MotionMC庫執(zhí)行磁力計校準(zhǔn)。我們將探討從傳感
    的頭像 發(fā)表于 08-26 10:56 ?1459次閱讀
    <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發(fā)</b>(4)----MotionMC 執(zhí)行<b class='flag-5'>磁力計</b>校準(zhǔn)

    【CANNON申請】姿態(tài)

    申請理由:這款開發(fā)板的硬件非常適合我現(xiàn)在在做姿態(tài)設(shè)計,再加上自有的mpu6050 gps,可以用來測試姿態(tài)
    發(fā)表于 01-26 13:58

    LSM9DS1磁力計的自檢是否與LIS3MDL相同

    我正在嘗試在LSM9DS1傳感器上測試磁力計。我可以應(yīng)用與LIS3MDL指南針相同的自測范圍值來檢查LSM9DS1嗎?事實(shí)是LSM9DS1中的磁力計似乎是LIS3MDL(寄存器的相同文
    發(fā)表于 10-09 11:43

    如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出

    你好,如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出。 #lis3mdl以上來自于谷歌翻譯以下為原文 Hello,How to disable DRDY and INT outputs in
    發(fā)表于 04-17 14:17

    LIS3MDL磁力計能滿足磁通密度為0.23高斯的應(yīng)用程序嗎

    我正在研究在具有高頻振蕩磁場的應(yīng)用中使用 LIS3MDL 3 磁力計。我查看了 LIS3MDL 的數(shù)據(jù)表,它似乎滿足我檢查過的大多數(shù)要求。
    發(fā)表于 12-14 08:31

    用于生成每個輸出樣本的樣本數(shù)量而言LIS3mdl磁力計的操作模式有何不同?

    就用于生成每個輸出樣本的樣本數(shù)量而言,LIS3mdl 磁力計的操作模式有何不同?例如,我發(fā)現(xiàn)在 ISM303DAC 中,用于生成的樣本數(shù)輸出樣本在低功耗模式下比在低功耗模式下使用的數(shù)量少四倍高分辨率
    發(fā)表于 01-06 07:31

    LIS2MDL標(biāo)簽是否指示正軸方向?

    LIS2MDL 數(shù)據(jù)表的圖 2 顯示了磁力計方向的下圖。但是,完全不清楚它們是否標(biāo)記了的正方向。如果他們確實(shí)用 X/Y/Z 標(biāo)簽標(biāo)記了正
    發(fā)表于 01-09 08:56

    STLIS2MDL磁力計傳感器相關(guān)的使用信息和應(yīng)用提示

    LIS2MDL是系統(tǒng)級封裝的3D數(shù)字磁力計,具有數(shù)字I2C和3線SPI串口標(biāo)準(zhǔn)輸出,在高分辨率模式下功耗200 μA,在低功耗模式下功耗不超過50 μA(在20 Hz輸出數(shù)據(jù)速率下)。
    發(fā)表于 09-06 08:24

    LIS2MDL磁力計傳感器相關(guān)資料

    本文檔旨在提供STLIS2MDL磁力計傳感器相關(guān)的使用信息和應(yīng)用提示。LIS2MDL是系統(tǒng)級封裝的3D數(shù)字磁力計,具有數(shù)字I2C和
    發(fā)表于 09-13 07:48

    LIS2MDL 3D數(shù)字磁力計應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《LIS2MDL 3D數(shù)字磁力計應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 07-31 10:12 ?5次下載
    <b class='flag-5'>LIS2MDL</b> <b class='flag-5'>3</b>D數(shù)字<b class='flag-5'>磁力計</b>應(yīng)用筆記

    e2studio開發(fā)磁力計LIS2MDL(2)----電子羅盤

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)來轉(zhuǎn)化為指南針。 地磁場強(qiáng)度范圍約為 23,000 至 66,000 nT ,并且可以建模為磁偶極子,其場線起源于地球地理南部附近的點(diǎn),并終止
    的頭像 發(fā)表于 05-16 17:00 ?479次閱讀
    e<b class='flag-5'>2</b>studio<b class='flag-5'>開發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(<b class='flag-5'>2</b>)----電子羅盤