陶新成 发表于 2015-12-14 16:27:47

罗盘算法问题请教

我在做一个电子罗盘,航向角已经算出,在罗盘水平转动时航向角能正常指示,现在的问题是航向角按一个角度固定不变做横滚变动,发现横滚变动时航向角也有较大变化!不知道什么原因,我把公司给大家,希望能给点指点意见!
还有就是用加表如何补偿磁罗盘?

void calc_azi(float x,float y)
{
    long int valu_buf;
        if(x > 0)
        {
                if(y > 0)                                  
                        heading = 360 - atan(y/x)*180/pi;        //四象限      
                else
                        heading = -atan(y/x)*180/pi;        //一象限
    }
   else if(x < 0)
   {
        heading = 180 - atan(y/x)*180/pi;        //二、三象限
    }
        else
        {
                if(y < 0 )               
                        heading = 90;               
                else               
                        heading = 270;               
        }       
        system.Azimuth = (long int)(heading*100);//方位
}

e1ki0lp 发表于 2015-12-14 17:21:51

百度百科"电子罗盘"摘录

仅用地磁场在X和Y的两个分矢量值便可确定方位值:
Azimuth=arcTan(Y/X) (楼主的算法)
该关系式是在检测仪器与地表面平行时才成立。
当仪器发生倾斜时,方位值的准确性将要受到很大的影响,该误差的大小取决于仪器所处的位置和倾斜角的大小。为减少该误差的影响,采用双轴倾角传感器来测量俯仰和侧倾角,这个俯仰角被定义为由前向后方向的角度变化;而侧倾角则为由左到右方向的角度变化。电子罗盘将俯仰和侧倾角的数据经过转换计算,将磁力仪在三个轴向上的矢量在原来的位置“拉”回到水平的位置。
标准的转换计算式如下:
Xr=Xcosα+Ysinαsinβ-Zcosβsinα
Yr=Ycosβ+Zsinβ
这里Xr和Yr为要转换到水平位置的值
α为俯仰角
β为侧倾角
从以上这三个计算公式可以看出,在整个补偿技术中Z轴向的矢量扮演一个非常重要的角色。要正确运用这些值,俯仰和侧倾角的数字必须时刻更新。采用双轴宽线性量程范围、高分辨率、温漂系数低的陶瓷基体电解质传感器来测量俯仰角和侧倾角,倾角数值经过电路板上的温度传感器补偿后得出的。
---------------------------
没做过这方面,不过大致意思应该是得配陀螺仪用,要用陀螺仪的俯仰角和翻滚(侧倾)角数据.

我想到的一个情景是这样:机身水平朝北偏西45度航行,然后机身右侧向下横滚45度,那得到的航向角就是正北了吧.然而实际还是在向北偏西45度航行.

帮楼主顶贴

陶新成 发表于 2015-12-14 17:28:34

e1ki0lp 发表于 2015-12-14 17:21
百度百科"电子罗盘"摘录

仅用地磁场在X和Y的两个分矢量值便可确定方位值:


非常感谢!!!马上测试

陶新成 发表于 2015-12-15 09:25:15

e1ki0lp 发表于 2015-12-14 17:21
百度百科"电子罗盘"摘录

仅用地磁场在X和Y的两个分矢量值便可确定方位值:


你好,你给的加速度计补偿磁方位角公式加入程序后方位角显示不正常!是什么原因,你有相关资料吗给我一份!
//Xr=Xcosα+Ysinαsinβ-Zcosβsinα
//Yr=Ycosβ+Zsinβ
//α为俯仰角
//β为侧倾角
页: [1]
查看完整版本: 罗盘算法问题请教