|
我用磁阻传感器HMC5843 与重力加速度MMA7455 做数字罗盘,
资料里写着
公式2,θ 是横滚角,ϕ 是俯仰角,再加上X,Y,Z 三轴磁分量,可得到(Xh,Yh)。若没有用此公式,会有大的误差输出。
Xh=X * cos(ϕ)+Y * sin(θ) * sin(ϕ)-z * cos(θ) * sin(ϕ)
Yh=Y * cos(θ)+z * sin(θ)
请问在公式里的cos 与 sin 要怎么用,我现在是这样用的,我这样用有没有错误呢
现在是当指南针度数为0时,改变θ ϕ 是俯仰角 -90~90度数时,指南针的会有180度的误差
改变横滚角 -90~90度时,指南针会有+- 45度的误差,
是我sin/cos 函数 用的有问题还是怎样呢? 请求帮助谢谢了
程序是用GCC写的
// moutx 俯仰角
// mouty 横滚角
//xa x轴
//ya x轴
//za x轴
//outx_s转换后的 X轴
//outy_s转换后的 y轴
//outz_s转换后的 z轴
outx_s=moxin(1000,-1000,xk_h,xk_l,xa);//把采集来的数转换成-1000~1000的数
outy_s=moxin(1000,-1000,yk_h,yk_l,ya);
outz_s=moxin(1000,-1000,zk_h,zk_l,za);
//横滚角与俯仰角 转成-90~90度
moutx=moxin(90,-90,mx_h,mx_l,mx);//把
mouty=moxin(90,-90,my_h,my_l,my);
//先计算好COS 与SIN
ctpx=cos((float)moutx*pi/180);
stpx=sin((float)moutx*pi/180);
ctpy=cos((float)mouty*pi/180);
stpy=sin((float)mouty*pi/180);
计算xh,yh
outx=(int)((float)outx_s*ctpx+(float)outy_s*stpy*stpx-(float)outz_s*ctpy*stpx);
outy=(int)((float)outy_s*ctpy+(float)outz_s*stpy);
// ls2 为输出0~359的度数
ac=(float)outx/(float)outy;
if(outy<0)ls2=180-atan(ac)*90/1.570796326794897;
if((outy>0)&&(outx<0))ls2=-atan(ac)*90/1.570796326794897;
if((outy>0)&&(outx>0))ls2=360-atan(ac)*90/1.570796326794897;
if((outy==0)&&(outx<0))ls2=90;
if((outy==0)&&(outx>0))ls2=270; |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|