搜索
bottom↓
回复: 22

做四轴定高,在有外力情况下,如何计算重力方向的加速...

[复制链接]

出0入0汤圆

发表于 2015-1-28 23:45:36 | 显示全部楼层 |阅读模式
打算用ms5611和加速度计进行四轴定高,现在发现重力方向的加速度不知道怎么求,想到的方法是将加速度计三个轴取平方和开根号得到,但是如果有外力时就不准了,看了mwc的代码是讲加速度计的测到的机体向量旋转到重力场然后取Z轴的值来得到这个加速度,然后融合ms5611做定高,但是我用了他的方法依然得不到垂直方向的加速度,主要是没有理解到他的算法原理,求助大神帮忙解释下这个该怎么做?我用的是4元数做的姿态解算。

出0入0汤圆

发表于 2015-1-29 09:54:14 | 显示全部楼层
你的意思是?
1)若原本传感器数据如何得到的 姿态是基本准确的,记为世界坐标系下的 A姿态矩阵
2)那么,加速度计在4轴中的姿态是已知的(一般都正交垂直嘛,装的时候),那加速度计在4轴上的姿态记为E,
3)那么,要求加速度矢量在世界坐标系下的姿态,只需B=AEG,(其中G为直接测得的加速度矢量,B记为世界坐标系下的加速度矢量)
4)要取垂直方向的加速度,只需取B[z]

出0入0汤圆

 楼主| 发表于 2015-1-29 12:46:41 | 显示全部楼层
嗯,mwc的方法基本思路的确是楼上解释的这样,当机体保持水平静止得出来的加速度为0没有问题,但是机体倾斜静止时,计算出来有加速度了,这就不对了,是否公式不对?

出0入0汤圆

 楼主| 发表于 2015-1-29 12:50:09 | 显示全部楼层
本帖最后由 cw628 于 2015-1-29 12:51 编辑

我用的下面的这个方法来旋转矢量的:*delta这个是姿态角(单位是弧度),*v这个是加速度计测到的3轴的值(这个就直接是加计读取的16进制数据),最后用v->Z作为垂直方向的 加速度

出0入0汤圆

发表于 2015-1-29 13:32:04 | 显示全部楼层
cw628 发表于 2015-1-29 12:46
嗯,mwc的方法基本思路的确是楼上解释的这样,当机体保持水平静止得出来的加速度为0没有问题,但是机体倾斜 ...

公式是没有问题的,
你电机停机,手拿Body旋转姿态 测试下,看看,
PS:上诉公式依赖较高精度的姿态求解结果

出0入0汤圆

发表于 2015-1-29 13:33:25 | 显示全部楼层
cw628 发表于 2015-1-29 12:50
我用的下面的这个方法来旋转矢量的:*delta这个是姿态角(单位是弧度),*v这个是加速度计测到的3轴的值( ...

不明白 你想描述什么? 建议先用MATLAB 仿真验证下公式

出0入0汤圆

发表于 2015-1-29 13:43:08 | 显示全部楼层
mark,做个记号

出0入0汤圆

发表于 2015-1-29 16:08:45 | 显示全部楼层
我目前用的是加计姿态矩阵旋转+气压计互补滤波,效果还行

出0入0汤圆

 楼主| 发表于 2015-1-29 18:42:53 | 显示全部楼层
本帖最后由 cw628 于 2015-1-29 18:44 编辑
qiaorz123 发表于 2015-1-29 16:08
我目前用的是加计姿态矩阵旋转+气压计互补滤波,效果还行


现在是加计姿态矩阵旋转搞不定,楼上怎么做的?

出105入79汤圆

发表于 2015-1-29 20:25:30 | 显示全部楼层
我就是这样做的,mwc里面融合高度估计算法粗糙了一点,使用多重互补。 楼主你的加速度计没有校准好,所以倾斜几度就出来10mg以上的加速度误差,足以毁坏你的速度估计了。

出0入0汤圆

 楼主| 发表于 2015-1-29 21:59:58 | 显示全部楼层
本帖最后由 cw628 于 2015-1-29 22:01 编辑

我还没到估计速度这里,还在重力方向的加速度估计就有问题,我用的这个旋转方法:(*delta这个是姿态角(单位是弧度),*v这个是加速度计测到的3轴的值) ,v->Z = v_tmp.X * mat[0][2] + v_tmp.Y * mat[1][2] + v_tmp.Z * mat[2][2];这个作为计算的输出的重力方向的加速度
void rotateV(struct fp_vector *v, float *delta)
{
    struct fp_vector v_tmp = *v;

    // This does a  "proper" matrix rotation using gyro deltas without small-angle approximation
    float mat[3][3];
    float cosx, sinx, cosy, siny, cosz, sinz;
    float coszcosx, sinzcosx, coszsinx, sinzsinx;

    cosx = cosf(delta[ROLL]);
    sinx = sinf(delta[ROLL]);
    cosy = cosf(delta[PITCH]);
    siny = sinf(delta[PITCH]);
    cosz = cosf(delta[YAW]);
    sinz = sinf(delta[YAW]);

    coszcosx = cosz * cosx;
    sinzcosx = sinz * cosx;
    coszsinx = sinx * cosz;
    sinzsinx = sinx * sinz;

    mat[0][0] = cosz * cosy;
    mat[0][1] = -cosy * sinz;
    mat[0][2] = siny;
    mat[1][0] = sinzcosx + (coszsinx * siny);
    mat[1][1] = coszcosx - (sinzsinx * siny);
    mat[1][2] = -sinx * cosy;
    mat[2][0] = (sinzsinx) - (coszcosx * siny);
    mat[2][1] = (coszsinx) + (sinzcosx * siny);
    mat[2][2] = cosy * cosx;

    v->X = v_tmp.X * mat[0][0] + v_tmp.Y * mat[1][0] + v_tmp.Z * mat[2][0];
    v->Y = v_tmp.X * mat[0][1] + v_tmp.Y * mat[1][1] + v_tmp.Z * mat[2][1];
    v->Z = v_tmp.X * mat[0][2] + v_tmp.Y * mat[1][2] + v_tmp.Z * mat[2][2];
}

出0入0汤圆

发表于 2015-1-30 09:17:43 | 显示全部楼层
cw628 发表于 2015-1-29 21:59
我还没到估计速度这里,还在重力方向的加速度估计就有问题,我用的这个旋转方法:(*delta这个是姿态角(单 ...

你 roll-pitch-yaw(Z-Y-X欧拉角)描述姿态到旋转矩阵描述的变换公式弄错了

出0入0汤圆

 楼主| 发表于 2015-1-31 00:31:28 | 显示全部楼层
没搞明白哪里错了?楼上指点下

出0入0汤圆

发表于 2015-1-31 09:25:26 | 显示全部楼层
Euler angles wiki

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-31 09:27:53 | 显示全部楼层
其中 的 1 2 3 角度分别对应Z轴Y轴X轴的旋转角度(Yaw  Pitch Roll)

出0入0汤圆

 楼主| 发表于 2015-2-3 23:41:22 | 显示全部楼层
还是不行,我尝试了XYZ、ZYX两种旋转矩阵,以及将ROLL-PITCH-YAW角度取反、旋转矩阵转置等组合都不行,结果是垂直静止时,重力方向加速度正常,倾斜静止时,重力方向加速度变小(应该和垂直静止是一样的才对)

出0入0汤圆

 楼主| 发表于 2015-2-3 23:44:42 | 显示全部楼层
void RotateVector(float *pAccVal, float *Delta)
{
    // This does a  "proper" matrix rotation using gyro deltas without small-angle approximation
    float Matrix[3][3];
    float cosx, sinx, cosy, siny, cosz, sinz;

    cosx = cosf(-Delta[2]);        //yaw
    sinx = sinf(-Delta[2]);
    cosy = cosf(-Delta[1]);//pitch
    siny = sinf(-Delta[1]);
    cosz = cosf(-Delta[0]);//roll
    sinz = sinf(-Delta[0]);

        Matrix[0][0] = cosx*cosy;
    Matrix[0][1] = cosx*siny*sinz-cosz*sinx;
    Matrix[0][2] = sinx*sinz + cosx*cosz*siny;
    Matrix[1][0] = cosy*sinx;
    Matrix[1][1] = cosx*cosz+sinx*siny*sinz;
    Matrix[1][2] = cosz*sinx*siny-cosx*sinz;
    Matrix[2][0] = -siny;
    Matrix[2][1] = cosy*sinz;
    Matrix[2][2] = cosy*cosz;

    *(pAccVal+0) = *(pAccVal+0) * Matrix[0][0] + *(pAccVal+1) * Matrix[1][0] + *(pAccVal+2) * Matrix[2][0];
    *(pAccVal+1) = *(pAccVal+0) * Matrix[0][1] + *(pAccVal+1) * Matrix[1][1] + *(pAccVal+2) * Matrix[2][1];
    *(pAccVal+2) = *(pAccVal+0) * Matrix[0][2] + *(pAccVal+1) * Matrix[1][2] + *(pAccVal+2) * Matrix[2][2];
}

出0入0汤圆

发表于 2015-2-4 13:17:43 | 显示全部楼层
Yaw  Pitch Roll 就是单只指ZYX这种旋转方式,公式不会有问题的(MATLAB我自己仿双足的动力学模型,一大堆矩阵都没问题)
会不会是你坐标系定义弄混了?
还是建议 先MATLAB仿真下, 自己建个虚拟重力及飞行器姿态描述矩阵,再反求下

出0入0汤圆

发表于 2015-5-21 15:32:18 | 显示全部楼层
qwe2231695 发表于 2015-1-29 20:25
我就是这样做的,mwc里面融合高度估计算法粗糙了一点,使用多重互补。 楼主你的加速度计没有校准好,所以倾 ...

你好,能具体讲讲吗?

出0入0汤圆

发表于 2015-5-21 15:33:20 | 显示全部楼层
qiaorz123 发表于 2015-1-29 16:08
我目前用的是加计姿态矩阵旋转+气压计互补滤波,效果还行

楼主能详细讲讲吗?

出0入0汤圆

发表于 2015-5-23 15:42:35 | 显示全部楼层
这里采用旋转矩阵的方法不知道是否适用。用向量点乘计算重力加速度世界坐标系Z方向投影的值来做Z方向可能更合适吧,在MWC的算法中有实现的。

出0入0汤圆

发表于 2015-7-21 23:37:50 | 显示全部楼层
本帖最后由 随影 于 2015-7-21 23:40 编辑

楼主,我按照你的思路理了一下.并在matlab上进行了大量各种角度 静止的仿真..出不来结果..分析后发现..这与yaw 轴有很大联系...保证输入yaw轴为0...就可以得到稳定效果...

出0入0汤圆

发表于 2015-7-23 16:51:39 | 显示全部楼层
首先加速度计测量的是机体的加速度,因此你想得到高度的话,首先需要将加速度计测得的机体加速度转化成NED坐标系下的加速度值,然后在减去重力加速度,最后通过D轴的加速度积分得到位置,然后在与气压计的高度值做一个滤波处理,得到高度
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表