主要内容

ecompass

从磁力计和加速度计读取方向

描述

例子

方向= ecompass (加速度计,magnetometerReading)返回一个四元数可以将数量从父帧(NED)旋转到子帧(sensor)。

例子

方向= ecompass (加速度计,magnetometerReading,orientationFormat)指定方向格式为四元数或旋转矩阵。

方向= ecompass (加速度计,magnetometerReading,orientationFormat,“ReferenceFrame”, RF)也允许您指定参考框架射频方向输出。指定射频作为'ned'(North-East-Down)或'enu'(East-North-Up)。默认值为'ned'

例子

全部折叠

利用已知的磁场强度和波士顿指向正北的设备的适当加速度来确定波士顿的磁偏角。

定义已知的波士顿加速度和磁场强度。

磁场强度= [19.535 -5.109 47.930];properAcceleration = [0 0 9.8];

通过磁场强度并加速到ecompass功能。的ecompass函数返回四元数旋转运算符。将四元数转换为欧拉角度的程度。

q = ecompass (properAcceleration magneticFieldStrength);e = eulerd (q,“ZYX股票”,“帧”);

的角度,e表示波士顿的真北和地磁北之间的夹角。按照惯例,当磁北在真北以西时,磁偏角是负的。消去角度以确定磁偏角。

magneticDeclinationOfBoston = - e (1)
magneticDeclinationOfBoston = -14.6563

ecompass函数融合磁强计和加速度计数据以返回四元数,当在四元数旋转操作符中使用时,可以将数量从父帧(NED)旋转到子帧。的ecompass函数还可以返回作为四元数运算符执行等效旋转的旋转矩阵。

定义一个旋转,该旋转可以使指向磁北的父帧指向指向地理北的子帧。定义旋转为四元数和旋转矩阵。然后,将四元数和旋转矩阵转换为欧拉角的度数进行比较。

定义麻州波士顿的磁场强度,单位为微特斯拉,当指向正北时。

m = [19.535 -5.109 49.930];a = [0 0 9.8];

确定能够将帧从磁北旋转到真北的四元数和旋转矩阵。显示结果进行比较。

q = ecompass (a, m);quaterionEulerAngles = eulerd (q,“ZYX股票”,“帧”)
quaterionEulerAngles =1×314.6563 0 0
r = ecompass (a, m,“rotmat”);θ=最佳(r(1、3));ψ=量化(r(2、3)/ cos(θ)、r (3,3) / cos(θ));ρ=量化(r(1、2)/ cos(θ)、r (1,1) / cos(θ));rotmatEulerAngles = rad2deg((ρ,θ,psi))
rotmatEulerAngles =1×314.6563 0 0

使用ecompass基于来自旋转IMU的数据来确定重力矢量。

加载惯性测量单元(IMU)数据。

负载“rpy_9axis.mat”Sensoldata.Fs

随着时间的推移,确定传感器体相对于局部内德帧的方向。

取向= ecompass (sensorData.Acceleration sensorData.MagneticField);

要估计重力矢量,首先使用方向四元数向量。

gravityVectors = rotatepoint(定位、sensorData.Acceleration);

确定重力矢量作为恢复重力矢量随时间的平均值。

gravityVectorEstimate =意味着(gravityVectors, 1)
gravityVectorEstimate =1×30.0000 -0.0000 10.2102

融合建模的加速度计和陀螺仪数据,以使用理想的和现实的数据跟踪旋转平台。

生成真实轨迹

描述平台随时间变化的真实方位。使用kinematictrajectory.System object™为没有平移和旋转的平台创建一个轨迹z-轴。

时间= 12;fs = 100;numSamples = f *时间;accelerationBody = 0 (numSamples, 3);angularVelocityBody = 0 (numSamples, 3);zAxisAngularVelocity = [linspace(4 0 4 *π* fs), 4 *π* (1,4 * fs), linspace(4 *π,0,4 * fs)] ';angularVelocityBody (:, 3) = zAxisAngularVelocity;轨迹= kinematicTrajectory (“SampleRate”fs);[取向,~ ~,加速度,angularVelocityNED] =轨迹(accelerationBody angularVelocityBody);

接收IMU数据的模型

使用一个imuSensor系统对象模拟从IMU接收到的数据,该IMU包含一个理想的磁强计和一个理想的加速度计。

IMU = imuSensor (“accel-mag”,“SampleRate”fs);[accelerometerData, magnetometerData] = IMU(加速度,angularVelocityNED,取向);

融合IMU数据以估算方位

将加速度计数据和磁力计数据传递给ecompass函数随时间估计方向。将方向转换为欧拉角的角度,并绘制结果。

取向= ecompass (accelerometerData magnetometerData);orientationEuler = eulerd(取向,“ZYX股票”,“帧”);TimeVector =(0:NumSamples-1)。'/ FS;图(1)绘图(TimeVector,Orientationeuler)图例(z轴的,“轴”,“轴”)包含(“时间(s)”) ylabel ('旋转(度)') 标题("来自理想IMU的定向")

图中包含一个轴。具有来自理想IMU的标题方向的轴包含3个类型的线路。这些对象代表z轴,y轴,x轴。

用真实的IMU传感器模型进行重复实验

修改的参数IMU.系统对象近似现实的IMU传感器数据。重置IMU.然后用与地面相同的加速度,角速度和方向。使用ecompass融合IMU数据并绘制结果。

imu.accelerometer = Accelparams(“MeasurementRange”, 20岁,“决议”, 0.0006,“ConstantBias”, 0.5,“AxesMisalignment”2,“NoiseDensity”, 0.004,“BiasInstability”,0.5);imu.magnetometer = Magparams(“MeasurementRange”, 200,“决议”, 0.01);reset(IMU) [accelerometerData,magnetometerData] = IMU(accelerationNED,angularVelocityNED,orientationNED);取向= ecompass (accelerometerData magnetometerData);orientationEuler = eulerd(取向,“ZYX股票”,“帧”);图(2)情节(timeVector orientationEuler)传说(z轴的,“轴”,“轴”)包含(“时间(s)”) ylabel ('旋转(度)') 标题(“来自现实IMU的定位”)

图中包含一个轴。来自现实IMU的标题方向轴包含3个类型为line的对象。这些对象代表z轴,y轴,x轴。

输入参数

全部折叠

M / S中传感器体坐标系中的加速度计读数2,指定为N-By-3矩阵。矩阵的列对应于x- - - - - -,y- - - - - -,z-传感器体轴。矩阵中的行数,N,对应于单个样本。在功能使用之前,加速度计读数是标准化的。

数据类型:|双倍的

磁强计读数在传感器体坐标系µT,指定为N-By-3矩阵。矩阵的列对应于x- - - - - -,y- - - - - -,z-传感器体轴。矩阵中的行数,N,对应于单个样本。在功能使用之前,磁力计读数是标准化的。

数据类型:|双倍的

用于描述方向的格式,指定为“四元数”“rotmat”

数据类型:char|字符串

输出参数

全部折叠

可将量从全局坐标系旋转到体坐标系的方向,以四元数矢量或数组的形式返回。尺寸和类型方向取决于用于描述方向的格式:

  • “四元数”- - -N-1与输入相同的底层数据类型的1向量

  • “rotmat”——3-by-3-byN数组与输入相同的数据类型

数据类型:四元数||双倍的

算法

ecompass函数返回一个四元数或旋转矩阵,它可以将数量从父帧(例如内德帧)旋转到子帧(传感器帧)。对于这两种输出方向格式,旋转操作符都是通过计算旋转矩阵来确定的。

旋转矩阵首先用一个中间物来计算:

R = ( ( 一个 × ) × 一个 一个 × 一个 ]

然后按列归一化。一个加速度计输入和magnetometerReading分别输入。

为了理解旋转矩阵的计算,考虑地球上任意一点及其相应的局部NED框架。假设传感器车身框架,[x,y,z],具有相同的起源。

回想一下,传感器体的方向被定义为旋转操作符(旋转矩阵或四元数),将一个量从父帧(NED)旋转到子帧(传感器体):

( R ] ( p ] = ( p 孩子 ]

在哪里

  • R是一个3 × 3的旋转矩阵,它可以解释为子帧的方向。

  • p是父框架中的一个3乘1向量。

  • p孩子是儿童框架中的3×1矢量。

对于稳定的传感器主体,加速度计由于重力而返回加速度。如果传感器主体与NED坐标系完全对齐,则引起的所有加速度沿着z-AXIS,加速度计读取[0 0 1]。考虑旋转矩阵所需的旋转矩阵从NED坐标系旋转到加速度计指示的量。

( r 11 r 21 r 31 r 12 r 22 r 32 r 13 r 23 r 33 ] ( 0 0 1 ] = ( 一个 1 一个 2 一个 3. ]

旋转矩阵的第三列对应于加速度计读数:

( r 31 r 32 r 33 ] = ( 一个 1 一个 2 一个 3. ]

磁力计的读数指向磁北,并在N-D飞机。同样,考虑与NED坐标系对齐的传感器车身框架。

根据定义,E-axis垂直于N-D平面上,因此ND=E,在一定的振幅缩放范围内。若传感器主体框架与内NED对齐,则加速度计的加速度矢量和磁强计的磁场矢量均位于N-D飞机。因此一个=y还是有一些振幅缩放。

考虑旋转矩阵需要旋转到儿童框架,[xyz]。

( r 11 r 21 r 31 r 12 r 22 r 32 r 13 r 23 r 33 ] ( 0 1 0 ] = ( 一个 1 一个 2 一个 3. ] × ( 1 2 3. ]

旋转矩阵的第二列对应于加速度计读数和磁力计读数的横向产品:

( r 21 r 22 r 23 ] = ( 一个 1 一个 2 一个 3. ] × ( 1 2 3. ]

根据旋转矩阵的定义,第1列是第2列和第3列的叉乘:

( r 11 r 12 r 13 ] = ( r 21 r 22 r 23 ] × ( r 31 r 32 r 33 ] = ( 一个 × ) × 一个

最后,旋转矩阵按列归一化:

R j = R j = 1 3. R j 2 , j

请注意

ecompass算法使用磁北,而不是真北,为NED坐标系。

扩展功能

C / C ++代码生成
使用MATLAB®编码器™生成C和c++代码。

介绍了R2018b