在静止状态下根据IMU(加速度计)计算姿态角

   一、 姿态角定义:

   1. 滚转角的定义:机体Z轴与过机体x轴的垂面的夹角。向右滚转为正,范围【-180deg-180deg】。

    2.俯仰角的定义:机体x轴与水平面的夹角。向上为正,范围【-90deg-90deg】。

   二、根据重力加速度 计算姿态角的原理:

    1.滚转角计算,首先通过机体x轴与重力加速度的外积,计算出“过机体x轴的垂面”的法向量。然后通过计算内积的方法,求该法向量与机体z轴的夹角,这个夹角与滚转角互余。

    2.俯仰角计算:通过计算内积的方法,求机体x轴与重力加速度的夹角,这个夹角与俯仰角互余。

    三、代码实现:

    本人亲自测试,计算结果合格。使用方法是调用makekam_gacc_to_att函数,第一个参数是三轴重力加速度,第二和第三个参数是计算出的滚转俯仰角。

extern void makekam_gacc_to_att(float gravity_acc[3]/*输入静止状态下的机体系加速度*/,float *ret_roll/*计算结果*/,float *ret_pitch);

/*计算向量的长度,用于判定pitch为90deg时的特殊情况*/
float get_vector_mod(const float vector[3])
{
    return sqrtf(vector[0]*vector[0] + vector[1]*vector[1] + vector[2]*vector[2]);
}

/*通过内积法,求两个向量的夹角*/
float makekam_vec_ang(const float vec_a[3],const float vec_b[3])/*return 0~180deg*/
{
    float angle = 0.0f;
    float mod_of_vec_a = 0.0f;
    float mod_of_vec_b = 0.0f;
    mod_of_vec_a = get_vector_mod(vec_a);
    mod_of_vec_b = get_vector_mod(vec_b);
    if((0.001f >= mod_of_vec_a) || (0.001f >= mod_of_vec_b)){
        angle = 0.0f;/*无法计算某向量与零向量的夹角,返回0*/
    }else{
        float cos_value = (vec_a[0]*vec_b[0] + vec_a[1]*vec_b[1] + vec_a[2]*vec_b[2]) / (mod_of_vec_a * mod_of_vec_b);
        if(cos_value > 1.0f){
            cos_value=1.0f;
        }
        if(cos_value < -1.0f){
            cos_value=-1.0f;
        }
        angle = acos(cos_value);
        angle = angle * 180.0f / 3.1415f;
    }
    return angle;
}

/*通过外积法,求平面两个非同向向量所在平面的法向量*/
inline void makekam_outer_product(const float vec1[3],const float vec2[3],float vecDst[3])
{
    vecDst[0] = vec1[1]*vec2[2] - vec2[1]*vec1[2];/*y1z2-y2z1*/
    vecDst[1] = vec2[0]*vec1[2] - vec1[0]*vec2[2];/*x2z1-x1z2*/
    vecDst[2] = vec1[0]*vec2[1] - vec2[0]*vec1[1];/*x1y2-x2y1*/
}

/*根据重力加速度,计算姿态角*/
void makekam_gacc_to_att(float gravity_acc[3],float *ret_roll,float *ret_pitch)
{
    float roll = 0.0f;
    float pitch = 0.0f;
    float flight_z_acc[3] = {0.0f,0.0f,10.0f};
    float flight_x_acc[3] = {10.0f,0.0f,0.0f};
    float plane_xog_normal_vec[3] ={0};

    pitch = 90.0f - makekam_vec_ang(flight_x_acc,gravity_acc);/*pitch处于-90°到+90°之间*/
    if((90.0f - fabsf(pitch)) > 0.1f){/*pitch与±90度相差大于0.1°*/
        makekam_outer_product(flight_x_acc,gravity_acc,plane_xog_normal_vec);
        roll = makekam_vec_ang(flight_z_acc,plane_xog_normal_vec) - 90.0f;
        if(gravity_acc[2] > 0.0f){
            if(roll < 0.0f){
                roll = -180.0f - roll;
            }else{
                roll = 180 - roll;
            }
        }
    }else{
        roll = 0.0f;/*判定x轴与重力方向处于一条直线,此为特殊情况,滚转角设定为0°*/
    }
    *ret_roll = roll;
    *ret_pitch = pitch;
}

 

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
IMU是指惯性测量单元(Inertial Measurement Unit),它可以通过测量加速度速度来估计物体的姿态。在IMU中,加速度传感器是关键的组成部分之一。 加速度传感器是通过测量物体在三个空间方向上的加速度来工作的。当物体发生加速度变化时,传感器会输出相应的电信号,并将其转化为数字信号供计算机进行处理。通过分析这些数字信号,我们可以得到物体在各个方向上的加速度信息。 在姿态解算中,加速度传感器起着至关重要的作用。通常,我们可以通过重力矢量的方向来确定物体的朝向。在静止状态下,重力与加速度在相反方向,所以通过测量重力加速度,可以推断出物体相对于地球的姿态。根据物体的倾斜度,我们可以计算出物体相对于水平面的欧拉角(即俯仰、滚转和偏航)。 然而,在实际应用中,受到环境干扰和传感器误差等因素的影响,加速度传感器的输出可能存在一定的误差。为了提高姿态解算的精度,通常需要对传感器输出进行滤波和校正,以减小误差和提高准确性。 总结起来,IMU姿态解算中的加速度传感器是用于测量物体在各个方向上的加速度,通过分析加速度信号,可以推断出物体的倾斜度,从而得到物体的姿态。但为了提高解算精度,还需要对传感器输出进行滤波和校正处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值