首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三轴IMU重力补偿

三轴IMU重力补偿
EN

Stack Overflow用户
提问于 2015-02-26 00:45:46
回答 1查看 1.4K关注 0票数 1

我有加速度(x,y,z)和三轴IMU的滚动,俯仰,航向数据.我想根据陀螺仪测量的角度(r,p,h)来补偿加速度数据。例如,当IMU是平的和静止的(z轴向上)时,加速度读取ax,ay,az=0,0,-1。当IMU是平的和静止的(x轴向上)时,加速度为ax,ay,az=-1,0,0。最后,当IMU是平的和静止的(y轴向上)时,加速度是ax,耶,az=0,-1,0。

由于数据是用IMU 而不是收集的,所以我需要从加速数据中删除g组件。

下面是我在删除g-组件方面的第一步。我可以使用的另一种方法是什么,因为我已经可以知道,随着数据文件大小的增加,这是计算密集型的。

代码语言:javascript
复制
%% Remove gravity from X, Y, Z components 
refPlane = [r0 p0 h0]; % [2deg 4deg 60deg] IMU was not level during data collection. 

for i = 1:length(time)
    deltaAngleX = roll(i) - refPlane(1); %degrees
    deltaAngleY = pitch(i) - refPlane(2); %degrees

    if ( deltaAngleX > 0) % roll ++, ay --, az ++
        cX_X = 0;
        cY_X = -sind ( deltaAngleX ) ;
        cZ_X = cosd ( deltaAngleX ) ;
    elseif ( deltaAngleX < 0 )
        cX_X = 0;
        cY_X = sind ( deltaAngleX ) ;
        cZ_X = cosd ( deltaAngleX ) ;
    end

    if ( deltaAngleY > 0 ) % roll ++, ay --, az ++
        cX_Y = sind ( deltaAngleY ) ;
        cY_Y = 0 ;
        cZ_Y = sind ( deltaAngleY ) ;
    elseif ( deltaAngleY < 0 )
        cX_Y = -sind ( deltaAngleY ) ;
        cY_Y = 0 ;
        cZ_Y = sind ( deltaAngleY ) ;
    end

    ax(i) = ax(i) + cX_X + cX_Y;
    ay(i) = ay(i) + cY_X + cY_Y;
    az(i) = az(i) + cZ_X + cZ_Y;

end
EN

回答 1

Stack Overflow用户

发布于 2015-02-26 04:09:44

您可以使用旋转矩阵(matrix)。目前,您的大部分代码都在编写矩阵乘法,一次只写一个部件。Matlab在矩阵乘法方面速度很快,所以它可能会加速一些事情。

为了更进一步,您可以将代码向量化。这是一个很大的话题,所以我只想给出一个大致的想法。关键是,Matlab特别适合于处理大型矩阵上的操作,并将运行比运行for循环快得多的操作。

例如,在Matlab中,只需编写sin,就可以将M函数应用于矩阵M的每个元素。使用像repmat这样的操作,尝试构建一个大的矩阵,按长度(时间)为2乘2,编码所有的旋转操作。同样,构建一个大的向量,维2的长度(时间),编码所有的加速向量。然后,在适当的维度上,一个矩阵乘法和sum操作将同时给出所有的数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28732547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档