磁罗盘传感器资料分享
磁组传感器资料分享HMC5883Lourdev_593715Y5H0A0.pdf(文件大小:411K) (原文件名:HMC5883L.pdf) 先下载下来学习!谢谢楼主! 这是三轴的,数字量输出且是I2C串行总线接口,很方便使用:) 请教个问题:5883L楼主用过吗?想问问您是如何校准它的(硬磁、软磁)。
电子罗盘的校准困扰我。还望得到解答。谢谢! 回复【3楼】nuli
-----------------------------------------------------------------------
我有用过该产品,对于校准的含义其实很简单;
就相当于把5883L的基准线转换到你所设备上的环境(Sensor所贴片的产品);
目前我所见比较多的是,硬磁;
修正offset的值方式如下(以X轴说明为例):
第一步:是用需校准的sample平放,这样sensor会在各个轴采集到一个max 和min
把其这定义为Xmax(1)和Xmin(1),其它轴类似;同时将该数据作为初始化的值;
第二步:进行360degree旋转,会得到另外的Xmax(2)和Xmin(2);
然后将Xmax(1)和Xmax(2)进行比较,从而选择Xmax=Xmax(1)(while the Xmax(1)>Xmax(2)),Xmin也进行同样的比较;
Last:then the Xoffset:Xoffset=(Xmax(1)+Xmin(1))/2;
该模块主要是考虑校正设备本身磁场的干扰,从而使测量数据更为准确。当然这只是对于要求精度不高的情况下进行设置的;但对于高精度的话,Honeywell 应该也会给你提供一些计算方式的,这你可以询问你买产品的地方,
希望上述能对你有所帮助。 非常感谢楼主的解答!
修正offset的值方式如下(以X轴说明为例):
“第一步:是用需校准的sample平放,这样sensor会在各个轴采集到一个max 和min 把其这定义为Xmax(1)和Xmin(1)”
是把X Y Z每个轴的max和min定义为Xmax(1)和Xmin(1)吗?
是否每个轴都要旋转360度,然后将得到的MAX和MIN平均,然后实际测量时得到的值减去这个偏置?
另外平放时,各轴不是只输出一个值吗,如何得到一个max 和min ?
楼主是否可以发个校准部分的程序例子上来,比较容易理解。 回复【5楼】nuli
-----------------------------------------------------------------------
从你所问的问题上来看,可能你还没了解Offset的计算方式,
Offset其实就是一个补偿校准值,而对于补偿校准值的得出,就是通过我上一个贴所说的步骤来进行计算的;
如果你能对每个轴都旋转360度的话,效果更好;而你提高的Max和Min,不是平均后的值,如果平均后那就不存在Max和Min一说,
这两个值,是实际你在旋转过程中传感器所采集的数据,通过这样你就可以大概的计算出offset的值(这动作是在calibration时做),在得到offset的值后,后面你所测量的数据就用实际测量的减去offset,那才是你所测量环境的比较准确的磁场值.
你可以通过设定5883L和你的MCU,“单一测量模式”确实只采集一个数据,但是“连续测量模式”就可以进行多个数据的采集,因此在calibration的时候,Honeywell datasheet上有进行说明,使用“连续测量模式”进行校准;
希望上述能对你有所帮助。 非常谢谢楼主!
我的程序除去效准没有,后面的计算都写好了,急切想把效准加进去。呵呵。资料我看的不够仔细所以问题多多。
我说说理解,请帮我看看对不对。
以X轴为例:罗盘水平旋转一周(连续测量模式),不断比较采样值,最终得到X轴输出的最大和最小值,然后(Xmax+Xmin)/2,就是Xoffset
还有一点没明白的:“第一步:是用需校准的sample平放,这样sensor会在各个轴采集到一个max 和min
把其这定义为Xmax(1)和Xmin(1)” 是每一点罗盘都输出一大一小两个数据吗?还是其实只有输出一个数据,然后旋转,将这一个数据与下一个数据比较,这样就有一大一小。把这一大一小数据再与下个数据比较,取大和小中间值丢掉,依次下去360度后得到MAX和MIN? 回复【7楼】nuli
-----------------------------------------------------------------------
这就要看你自己在MCU所设定的单位时间内的采样频率,因为你平放置的时候采集数据的模式也是“连续测量模式”,
而你可以通过你的MCU设定单位时间内的采样频率,这样收集的数据就是你所设定的,因此输出的数据
就不会是你所猜想的一个数据,最终你可以将平放时所收集的数据进行比较,就可以输出Xmax(1)和Xmin(1);
而你通过不停的采集数据比较的话,这样就对周围环境磁场就比较精确点,校准性能就相对要高点; 我目前的理解如下:
5883水平放置,以Z轴为参考旋转轴,旋转360度。期间MCU不断采样X轴和Y轴数据,将得到的数据筛选出Xmax Xmin Ymax Ymin.
Xoffset=(Xmax+Xmin)/2
Yoffset=(Ymax+Ymin)/2
请楼主校正。 回复【9楼】nuli
-----------------------------------------------------------------------
Yeah, that is correct. Good Luck 谢谢!解决了我比较迷糊的问题。
今后再遇到不懂的地方,免不了再向您请教。还望不吝赐教啊:) 各位,请问以下是那引起的?
在生产时发现HMC5883L很不稳定,有的机器要多次校准才可以报出正确的方向,有的报错方向,有的角度偏差大10~30度等,只有50%是可以正确报出方向的 都说过很多遍了,HMC5883L bug 很多,还没量产呢,没人敢用的.哈哈哈 回复【13楼】downseng
都说过很多遍了,hmc5883l bug 很多,还没量产呢,没人敢用的.哈哈哈
-----------------------------------------------------------------------
不会吧,还正想想买它做电子磁盘呢。
HMC5883跟HMC5883L有什么区别? HMC5883 有bug, 很多问题,才出了个HMC5883L,但是不知道能不能用了。 回复【12楼】Liang-f
-----------------------------------------------------------------------
其存在的原因,很有可能是因为你的校准方面出现了一些误差,相信在计算到
好的校准值后,对于该问题应该是可以解决的. 回复【15楼】downseng
-----------------------------------------------------------------------
HMC588L确实是升级产品,我想不是和你所说的因为Bug而升级的吧?L系列的在灵敏度上,可是有很大的提高咯;
而且Bug本来是程序上的问题,这和IC又存在什么关系呢?
要好好应用这产品,还是需要好好了解这产品,要不确实会和你所说的,Bug超级多,呵呵 问题终于搞好了,是我没有对HMC5883L消磁引起的,现在HMC5883L使用很正常,我用50台机器做数据,每台机分别校准三次测量,每次测量的角度一致性很好. Liang-f
我的5883读的数据也是跳变很大,不知道是不是没有消磁?能说说具体如何消磁和为啥消磁么? 回复【18楼】Liang-f
问题终于搞好了,是我没有对hmc5883l消磁引起的,现在hmc5883l使用很正常,我用50台机器做数据,每台机分别校准三次测量,每次测量的角度一致性很好.
-----------------------------------------------------------------------
恭喜你,把问题解决了,而且想到了消磁的动作,但是针对于5883L来说被磁化的现象是比较困难的,
因为在那上面的还有Honeywell的一个专利Set/Reset的回路,这是可以对IC自动消磁的,是不是该回路的电平信号不足才引起了磁化的现象呀;
还有一个最大引起该现象的,就是在sensor板上位置的周边存在很大的铁磁物质,而校准补偿方面不是很完善才引起该问题出现的;
因此还要多注意板材以及sensor周边的布局咯,这样对你在量产的时候就比较方便了; 回复【19楼】lihua
liang-f
我的5883读的数据也是跳变很大,不知道是不是没有消磁?能说说具体如何消磁和为啥消磁么?
-----------------------------------------------------------------------
这样的问题我也有遇到过,很大的原因就是因为sensor周边的环境磁场干扰很大,因而造成了这么大的不稳定因素,
最大的关联,就是因为板材含有比较多的铁磁物质或者是大电流的线路,从而造成了读数不稳定的现象,因此才需进行一个
消磁的动作,该动作主要就是消除板上磁场对于sensor的数据采集的影响;
用一个消磁器就可以消磁了,很简单的;也可以用一个线圈通电流来消磁也是可以的,但那需要尝试,具体我也没有用过,呵呵,
希望对你有所帮助; mark mark 请问下HMC5883L在画板时的放置位置有什么要求吗?
我现在做的东西因为正面用来放液晶,只能把HMC5883L放在板子的背面了,就是Z轴向下,这样会不会有影响啊???
急啊,请知道的说下咯 回复【24楼】lghtjpu 艳阳高照
-----------------------------------------------------------------------
对于该传感器主要注意在周边没有大电流的线以及扩音器等干扰的就可以了,
但是因为你的Z轴是向下的,那么在编程处理数据的时候就需要注意其方向就可以了 回复【25楼】COMPASS1
-----------------------------------------------------------------------
好的,谢谢COMPASS1 的回答。
还要请教你下气压传感器反过来安装也会不会有影响呢? 回复【26楼】lghtjpu 艳阳高照
-----------------------------------------------------------------------
不客气,气压传感器反过来安装不会有影响的,我有用过这款,给大家分享:)
点击此处下载 ourdev_601845Z9SZNI.pdf(文件大小:667K) (原文件名:DA5561_002.pdf) HMC5883L按装是有方向,详细见规格书,与零件也要保持距离,在HMC5883的周边不距铁的零件近,会引起角度不均衡,请注意!
IC的下面不要走大电流的线路,最好不走线,在IC位置背面线路板最好不放零件,HMC5883L部分电路划出单点接地,规格书内是说明4.7UF与0.22UF电容是要用低阻抗,请注意!
HMC5883L的消磁很重要,我们做的产品,这一部分没加上,试产300台,就有150台不良率,
HMC5883L的较准也很重要,在手动校准时转的快慢,报出来的角度也有偏差,在校准时,要均匀转动,规格书有讲到要三轴校准,实际一轴也是可以的.IC校准出来的不是一个圆,而是像个鹅蛋圆! HMC5883L内部是有消磁 记号 回复【29楼】Liang-f
-----------------------------------------------------------------------
恩,这样的内部消磁主要是保证传感器每次测量前的状态是“纯净的” 回复【31楼】COMPASS1
-----------------------------------------------------------------------
能说说内部消磁怎么使用么?还是自动不需要程序干预的? 标记。之前在研究双轴的HMC1052。比较便宜。 回复【32楼】lihua
-----------------------------------------------------------------------
28楼的已经说清楚了嘛,那两个电容构成的回路就是让IC内部在每次测量之前产生一个磁场,从而消除外部磁的干扰,
这回路是不需要你用软件去驱动的,在每次测量数据前会自动运行 罗盘校正是个问题。。 跟地球磁场有关系的东东,现在怎么总感觉不可靠呢……2012
呵呵,纯属玩笑~ 回复【35楼】paul_guo
-----------------------------------------------------------------------
是呀,看似简单的东西,搞的时候问题一大把 mark! 回复【12楼】Liang-f
各位,请问以下是那引起的?
在生产时发现hmc5883l很不稳定,有的机器要多次校准才可以报出正确的方向,有的报错方向,有的角度偏差大10~30度等,只有50%是可以正确报出方向的
-----------------------------------------------------------------------
我的 HMC5883L 静止时读数很稳定(变化 <1度), 但转动过程中总有30度的角度偏差(与地理方向).
周边没有其它电器, 只有距离半米的笔记本电脑.
Calibrate能解决吗? 还是要消磁? (不是说 HMC5883L 内部可以自动消磁的吗?) 回复【39楼】MAPGPS
-----------------------------------------------------------------------
Calibration需要Sensor和产品一起旋转才有效果,因此现在你说用那去做,是没多大的用处,
消磁也是一样,我想可能的原因还是你周围环境在该方向的磁场干扰比较大才引起的;
建议你在“纯净”磁场下测量,如空旷的场地 回复【40楼】COMPASS1
-----------------------------------------------------------------------
我抱着笔记本PC到外面走了一圈, 找“纯净”的环境. 结果是一样, 看来不是磁场干扰问题.
从旋转HMC5883L过程中读出的(X, Y, Z)来看, 感觉我的HMC5883L的XYZ轴不正, 是斜着的.
因为我在某个地心斜面上读到了最大值与最小值. 从别人那儿拿了个带指南针的iPhone4试了一下, 偏得更离谱: 在附近走动, 大多时候偏30度, 有时偏45度, 有时偏3度.
不过iPhone4的指南针有个特性: 保持所指方向而转动机身, 其读数不变.
操作: 把iPhone4平放在桌面上, 用手按住机身一侧作为转轴而翻起另一侧.
这个特性用在四轴飞行器上很合适, 前飞时机身是前倾的.
是不是要对(X, Y)作地面投影呀? 回复【42楼】MAPGPS
-----------------------------------------------------------------------
我用的是LSM303DLH, 试试这个方法求水平下的方位值。
1.360度旋转X,Y,Z轴,用校正程式取得x,y,z 轴的最大及最小值。 (若看到4096,表示超出测量范围,要加大测量范围,如果原先是设1改设2高斯)
2.取得x,y,z 轴的最大范围后,将取样值[单元化],再用[单元化]后的值做方位计算。
//====[校正程式]============================
while(1){
MX_MAX = 0.0;
MY_MAX = 0.0;
MZ_MAX = 0.0;
MX_MIN = 0.0;
MY_MIN = 0.0;
MZ_MIN = 0.0;
GET_MEG_XYZ(M_XI,M_YI,M_ZI);
if (M_XI > 32768) M_XI = (M_XI - 65536);
if (M_YI > 32768) M_YI = (M_YI - 65536);
if (M_ZI > 32768) M_ZI = (M_ZI - 65536);
if (M_X < MX_MIN) MX_MIN = M_XI;
if (M_Y < MY_MIN) MY_MIN = M_YI;
if (M_Z < MZ_MIN) MZ_MIN = M_ZI;
if (M_X > MX_MAX) MX_MAX = M_XI;
if (M_Y > MY_MAX) MY_MAX = M_YI;
if (M_Z > MZ_MAX) MZ_MAX = M_ZI;
}
//====[单元化程式]============================
while(1){
MX_MAX = 127.0;
MY_MAX = 234.0;
MZ_MAX = 174.0;
MX_MIN = -367.0;
MY_MIN = -255.0;
MZ_MIN = -271.0;
GET_MEG_XYZ(M_XI,M_YI,M_ZI);
if (M_XI > 32768) M_XI = (M_XI - 65536);
if (M_YI > 32768) M_YI = (M_YI - 65536);
if (M_ZI > 32768) M_ZI = (M_ZI - 65536);
M_X = (M_XI - MX_MIN) / (MX_MAX - MX_MIN) * 2.0 - 1.0;
M_Y = (M_YI - MY_MIN) / (MY_MAX - MY_MIN) * 2.0 - 1.0;
M_Z = (M_ZI - MZ_MIN) / (MZ_MAX - MZ_MIN) * 2.0 - 1.0;
HEADING = atan2(M_Y,M_X); //===[+-180度,0度指向磁北]===========
} 回复【43楼】TADLAW
-----------------------------------------------------------------------
我的HMC5883L的XYZ轴不正, 有点斜.
要"360度旋转X,Y,Z轴, 取得X,Y,Z轴的最大及最小值", 有点困难.
是否可以随机转动, 取一堆样本值, 再线性方程插值? 回复【44楼】MAPGPS
-----------------------------------------------------------------------
1.三轴磁力计的设计,似乎故意做成是斜的,说明资料没找到。
2.由于是斜的,所以x,y,z分量相对于,在360度下转出的总范围值,才有线性可言。否则只转某圈画出的都是椭圆!
3.当x,y分量值与其总范围值的比值,转成+-1范围中的某值后,才能用atan2转成角度。
4.校正方法的参考资料: http://www.dzsc.com/data/html/2010-11-29/87454.html 回复【45楼】TADLAW
-----------------------------------------------------------------------
非常感谢TADLAW.
你推荐的那片文章很好, 读后解释我的很多疑团.
在atan2时, XYZ修偏(找到圆心)及归1很重要.
我按你的方法, 修改了程序. 现在HMC5883L在水平面上的0度已可以接近于磁正北了. 回复【45楼】TADLAW
-----------------------------------------------------------------------
这篇文章我也看过,确实六轴集成,很不错的!价钱应该也不便宜吧?
这六轴的适合三维运动的,
其校准的方式是三维空间中的补偿吧;
回复【41楼】MAPGPS
-----------------------------------------------------------------------
你在使用你的模块的时候,没有确保那模块是水平旋转吗?AMR的三轴内部制作的时候是不会存在什么倾斜的,
如果存在倾斜,那么你角度的补偿就需要加入Gsensor进行补偿了,当然如果你已知机械的倾斜角度的话,那就不需要增加Gsensor 回复【47楼】COMPASS1
-----------------------------------------------------------------------
1.LSM303DLH 台幣 460,另一家賣1100
2.HMC5883L台幣 710,1600(帶板) 回复【47楼】COMPASS1
你在使用你的模块的时候,没有确保那模块是水平旋转吗?amr的三轴内部制作的时候是不会存在什么倾斜的,
如果存在倾斜,那么你角度的补偿就需要加入gsensor进行补偿了,当然如果你已知机械的倾斜角度的话,那就不需要增加gsensor
-----------------------------------------------------------------------
我的HMC5883L经校准后, 水平旋转时, 偏差很小了.
但四轴飞行时, 机身是有倾斜角度的. 比如前飞时, 机身就要前倾.
Pitch和Roll倾角是知道的(由机上其它Sensors得到).
要用那个著名的倾角补偿公式了. 回复【49楼】MAPGPS
-----------------------------------------------------------------------
哦,原来是那样,在空间运动的话,磁场传感器是应该用一个Gsensor来计算Pitch和Roll角来进行补偿的,
如果没有一个补偿,那是会出现你所说的偏差 回复【48楼】TADLAW
-----------------------------------------------------------------------
有那么贵吗?是不是那数字写错了呀; 回复【51楼】COMPASS1
-----------------------------------------------------------------------
金额数字没错, 很羡慕你们的电子天堂, 既买得到又便宜。台湾的电子DIY环境以及DIY风气很不好。流行成品都有人卖,冷门零件只能碰运气。而论坛少又限制多,很喜欢[友好交流气氛,乐于开源共享,“这里远比混乱的现实世界美好”] 这一句话。 回复【52楼】TADLAW
-----------------------------------------------------------------------
这是不一样的,可能主要的原因是国内产权意识还不太深入,台湾就深入点吧;
在台湾那边登录国内服务器不受限制吗? 回复【53楼】COMPASS1
-----------------------------------------------------------------------
到ourdev都通, 其他处我就不知道了。
台湾是[海盗王国]国际知名, 而MS当初盗APPLE也是公开的秘密, 中国山寨无可厚非, 成者为王败者为寇, 这些成王者当然鼓吹盗来的[智产]不可被侵犯, 所以MS 敢要EPSON 不可以支援LINUX ,就不敢要APPLE 的也一起并封_杀。APPLE 及LINUX 都是在[文化]层次上, MS 则是停在[技术]层次上。 APPLE 重创新,可推动潮流(有生意做)。 LINUX 重分享既经济又环保(没利润,但可长存)。 MS 重封锁,容易壮大,但是强中更有强中手,最后是红海一片(SUN与MS在服务器与OFFICE的厮杀)。十几年看来,LINUX 的[跟新]已经不输APPLE。只有MS原地踏步,像FOXPRO技术比不过就收购,然后打入冷宫,终结其技术的精进。在看其推出的系统软体肿胀到外行人都知道,内部各软体部门的斗争炽热化,每人留一手,盖一招,最后整体将失去竞争力。到时一百多个工程师的私宝也将一文不值。
APPLE 的成功是建立在,透过整合所有的科技, 来满足人性的需求。 APPLE 的形象是创新、专业、人性化, 群众跟随APPLE 已经是在[文化]层次上的了。新的APPLE 产品出现,就有人跟随, 和年到了就是要过年, 节庆到了就是要放烟火, 是一样的意思。但细究APPEL 成功的底层, 是杀到血流成河的代工厂。亚洲四小龙成了亚洲四小奴。在这[代工厂]的环境下,用智产是保不了你我的未来的。
LINUX 为何追得到APPLE 呢? 因为INTERNET串连了全世界,用40亿人中的精英在跟,当然可以办到。再来就是拥有12亿人口的中国, 最有可能追得上。若是12亿人,每人留一手,盖一招,那就吃不到苹果反被K头了。满头包痛也得忍了。 APPLE 能持续是因为[人性需求]尚未被完全满足, 肚子饿时当然吃的下,等饱时自然就不吃了,到时LINUX 自然会取代APPLE, 系统将会融合,变的既好又开放又经济。
当什么都没有时,用[资本]才能推动,而当什么都有时,用[共_产]才能延续,这就是中国的[中]字正解, 灵活运用才会有活路。 (真是配服先人的智慧啊!)
以四轴为例,如何从[技术]层次跳至[文化]层次呢?
四轴首先是德国人发明的, 以[航模技术]做推广, 是[技术]层级的, 再来是APPLE透过法国以[科技玩具]做推广,是[文化]层次的, 前者属于孤芳自赏,后者则是流行文化。
四轴特点是新奇有趣, 多数人没看过, 很适合做表演的题材也是好的吸睛卖点。流行文化说穿了就是凑热闹, 有人玩AR.Drone 我也要玩玩看。假日运动场都有人在做四轴的表演飞行, 我也邀朋友去看看。四轴比起其他航模更适合做百台以上的集体空中表演, 不管是用烟火或是LED 灯, 镭射,组字或图形或是做队型变换, 再耍耍特技,空战, 两队PK ....等等, 可让玩的人尽兴, 看的人高兴,是老少咸宜的表演活动。当看四轴表演变成是流行文化后, 12亿人都要看的表演, 可以养活一大群人了。公家机关节日办活动, 总希望搞点特别的, 四轴正好切入此一商机, 一百个网友的四轴不再是奢恀品,而是会赚钱的金鸡母了, 偶而用四轴做个表演也可以赚个外快, 不缺钱的就当做聚会同乐了, 也很有出风头的成就感!
目前看来要达成此一目标的软硬体都已经成熟了, 接下来只要一步一步的将它们整合同步并且开放所有的资料, 让有相同理念的人,能一起加入同步合作。
(能赚的,大家一起赚, 想独吞的人总是先噎死, 刚温合十) 回复【54楼】TADLAW
-----------------------------------------------------------------------
恩,很佩服你!不过也确实需要这样来弄,生在国内,感觉国内的互联网上共享的资料很多,也很方便;
在国内要是公家想推广四轴,那确实很方便; 真是好贴,这几天在看电子罗盘,暂徘徊于LSM303DLH及HMC5883L。 mark 下载收藏,感谢分享! MARK 学习! mark 我的用了几个月好好的 现在读数就不行了 硬件软件都没动还是不太明白 消磁怎么消呢?不是说内部就有消磁吗?我应该怎么消磁?用什么消磁器? mark 单片机怎么算正切啊?传感器附近30cm有个24V250W的永磁直流电机,和传感器一起转动,这会不会有什么影响啊? 谢谢分享 做个标记 以后学习 不错!
这个要标记! 回复【63楼】rapbbit
-----------------------------------------------------------------------
能把你具体的问题现象描述一下吗? 回复【65楼】aishiqi1992小鸡
-----------------------------------------------------------------------
C语言的数据库里面就包含该函数了;
那电机的功率多大,在传感器位置产生的磁场大吗?
建议尽量远离传感器,不过后续校准也是可以降低误差的 mark 回复【4楼】COMPASS1 航纬
回复【3楼】nuli
-----------------------------------------------------------------------
我有用过该产品,对于校准的含义其实很简单;
就相当于把5883l的基准线转换到你所设备上的环境(sensor所贴片的产品);
目前我所见比较多的是,硬磁;
修正offset的值方式如下(以x轴说明为例):
第一步:是用需校准的sample平放,这样sensor会在各个轴采集到一个max 和min
把其这定义为xmax(1)和xmin(1),其它轴类似;同时将该数据作为初始化的值;
第二步:进行360degree旋转,会得到另外的xmax(2)和xmin(2);
然后将xmax(1)和xmax(2)进行比较,从而选择xmax=xmax(1)(while the xmax(1)>xmax(2)),xmi......
-----------------------------------------------------------------------
你好,我用了传感器了,也能你的椭圆补偿的原理的,但是假如这个椭圆的长轴不和坐标轴重合怎么办?就像一个写着的椭圆,要是这样还能用这种算法补偿吗?我觉得不能吧?不知道这个传感器会不会出现这种情况?
http://cache.amobbs.com/bbs_upload782111/files_48/ourdev_699552CILV3G.jpg
(原文件名:Image00000.jpg)
就像这一个椭圆,不管我是做平移(相当于偏移),还是做X,Y轴的缩放(相当于定标),都无法完全和红色的重合!! MARK 正好需要这方面资料,先谢过了 谢谢 顶一下,好东西. 回复【43楼】TADLAW
-----------------------------------------------------------------------
你好,这个校准用平面校准法可以么?
M_X = (M_XI - MX_MIN) / (MX_MAX - MX_MIN) * 2.0 - 1.0;
这个公式的含义可以给出么?
http://www.dzsc.com/data/html/2010-11-29/87454.html这个网页的校准我看了,但是最后程式化这步公式我不太理解。麻烦讲解一下谢谢了。
您用的也是LSM303? MX_MAX = 127.0;
MY_MAX = 234.0;
MZ_MAX = 174.0;
MX_MIN = -367.0;
MY_MIN = -255.0;
MZ_MIN = -271.0;
GET_MEG_XYZ(M_XI,M_YI,M_ZI);
if (M_XI > 32768) M_XI = (M_XI - 65536);
if (M_YI > 32768) M_YI = (M_YI - 65536);
if (M_ZI > 32768) M_ZI = (M_ZI - 65536);
M_X = (M_XI - MX_MIN) / (MX_MAX - MX_MIN) * 2.0 - 1.0;
M_Y = (M_YI - MY_MIN) / (MY_MAX - MY_MIN) * 2.0 - 1.0;
M_Z = (M_ZI - MZ_MIN) / (MZ_MAX - MZ_MIN) * 2.0 - 1.0;
HEADING = atan2(M_Y,M_X); //===[+-180度,0度指向磁北]===========
这是因为程式HEADING = atan2(M_Y,M_X) 中的M_X 变数值必须在+1与-1 的范围里,atan2()函式才能计算岀正确的角度值
,所以必须用M_X = (M_XI - MX_MIN) / (MX_MAX - MX_MIN) * 2.0 - 1.0; 这条程式做转换
当我们用八字校正法,旋转模块时,可收集到X 轴的真实资料
最大值 MX_MAX = 127.0 以及
最小值 MX_MIN = -367.0
当你用M_XI = 127.0 ,MX_MAX = 127.0, MX_MIN = -367.0 代入程式
, 会得到M_X = (127 + 367) / (127 + 367) * 2 - 1 = +1
当你用M_XI = -367.0 ,MX_MAX = 127.0, MX_MIN = -367.0 代入程式
, 会得到M_X = (-367 + 367) / (127 + 367) * 2 - 1 = -1 顶一下,好东西 回复【70楼】COMPASS1 航纬
-----------------------------------------------------------------------
哈 看您经常回复 关于HMC5883L 芯片的问题 我最近也在用 您用这块芯片做项目了吧 在您的回复中 我受益匪浅 ~~~
补充内容 (2012-3-25 15:18):
多谢您资料的帮助基本解决三维陀螺的问题主要是轴向定义的问题 Mark! mark 回复【78楼】TADLAW
-----------------------------------------------------------------------
您好能否加我QQ:2314343016
请教一下LSM303地磁的校准,标准化的一些问题。
我目前也在做,谢谢了 回复【78楼】TADLAW
-----------------------------------------------------------------------
这个转换我理解了,我用了你的代码,pitch和roll角度都比较准确不过head我还是没有弄好。
在你的另一篇帖子里,http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4534949&bbs_id=1025&bbs_page_no=2
#==============================
cos_roll= math.cos(roll)
sin_roll= math.sin(roll)
cos_pitch = math.cos(pitch)
sin_pitch = math.sin(pitch)
# Tilt compensated Magnetic filed X:
MH_X = M_X*cos_pitch - M_Z*sin_pitch
# Tilt compensated Magnetic filed Y:
MH_Y = M_X*sin_roll*sin_pitch + M_Y*cos_roll - M_Z*sin_roll*cos_pitch
# Magnetic Heading
yaw = math.atan2(MH_Y,MH_X)
而你的 # Tilt compensated Magnetic filed X:
MH_X = M_X*cos_pitch - M_Z*sin_pitch
在你的之前回复参考的一个地磁校准帖子http://www.dzsc.com/data/html/2010-11-29/87454.html
MH_X = M_X*cos_pitch + M_Z*sin_pitch中间符合有所不同。
我作出后不管怎么转动都没有head变化。我只在水平面先做的测试。
MX_MAX = 326.0;
MY_MAX = 266.0;
MZ_MAX = 253.0;
MX_MIN = -300.0;
MY_MIN = -213.0;
MZ_MIN = -357.0;
get_mag_data();
dis=cdis;
dis=cdis;
dis=cdis;
dis=cdis;
dis=cdis;
dis=cdis;
mx=(int)(dis<<8)+dis;
my=(int)(dis<<8)+dis;
mz=(int)(dis<<8)+dis;
M_X = (mx - MX_MIN) / (MX_MAX - MX_MIN) * 2.0 - 1.0 ; //校准后地磁
M_Y = (my - MY_MIN) / (MY_MAX - MY_MIN) * 2.0 - 1.0;
M_Z = (mz - MZ_MIN) / (MZ_MAX - MZ_MIN) * 2.0 - 1.0 ;
cos_roll= cos(roll2*3.1415/180);
sin_roll= sin(roll2*3.1415/180) ;
cos_pitch = cos(pitch2*3.1415/180) ;
sin_pitch = sin(pitch2*3.1415/180) ;
m_x=M_X*cos_pitch - M_Z*sin_pitch ;
m_y=M_X*sin_roll*sin_pitch + M_Y*cos_roll - M_Z*sin_roll*cos_pitch;
head1=atan2(m_y,m_x)*180/3.1415;
这是我的程序代码,不知道哪里有问题,在水平面转动读数不变,都是-137度左右。
校准我是三个轴三百六十度转了几圈之后采集的那六个数。
首先我想会不会是我的地磁问题呢?数据没有溢出之类,但是如何来看地磁数据正确的,您有什么经验么?
我的pitch和roll倒是都还蛮准的。
我也用的LSM303。 回复【78楼】TADLAW
-----------------------------------------------------------------------
pitch2=atan2(a_x,sqrt(a_y*a_y+a_z*a_z))*180/3.1415 ;
roll2=atan2(a_y,sqrt(a_x*a_x+a_z*a_z))*180/3.1415 ;
准成度数了,显示时候方便呵呵。
这两个值我用量角器试了试还挺准的 回复【78楼】TADLAW
-----------------------------------------------------------------------
m_y=M_X*sin_roll*sin_pitch + M_Y*cos_roll - M_Z*sin_roll*cos_pitch
M_X,M_Y 与M_Z的sensitivity不同这里不需要换算一下么?
还是这里的M_X,M_Y 与M_Z本来就是gauss单位的啊?
请教一下呵呵 最近木人来了? 回复【83楼】wwjdwy
-----------------------------------------------------------------------
抱歉!年纪有点大,不知道什么是QQ! 呵呵! 回复【84楼】wwjdwy
-----------------------------------------------------------------------
要测试模块时,应该分二个阶段,一是模块在水平面上,二是考虑到模块处于倾斜状态
1.当模块是在水平面做0至360度转动时,只须用底下的程式,就可以算出方位
HEADING = atan2(M_Y,M_X); //===[+-180度,0度指向磁北]===========
2.当模块不在水平面上时,会影响到方位测量的准度,于是加入由加速计取得的Roll及Pitch,用来补正方位的偏差
A_X = A_XI / 32768.0
A_Y = A_YI / 32768.0
A_Z = A_ZI / 32768.0
roll = math.atan2(A_Y,math.sqrt(A_X*A_X+A_Z*A_Z))
pitch = math.atan2(A_X,math.sqrt(A_Y*A_Y+A_Z*A_Z))
if A_Z < 0:
if A_Y > 0:
roll = pi - roll
else:
roll = -(roll + pi)
#==============================
cos_roll = math.cos(roll)
sin_roll = math.sin(roll)
cos_pitch = math.cos(pitch)
sin_pitch = math.sin(pitch)
# Tilt compensated Magnetic filed X:
MH_X = M_X*cos_pitch - M_Z*sin_pitch
# Tilt compensated Magnetic filed Y:
MH_Y = M_X*sin_roll*sin_pitch + M_Y*cos_roll - M_Z*sin_roll*cos_pitch
# Magnetic Heading
yaw = math.atan2(MH_Y,MH_X)
3.你的程式没有交待清楚roll2 及pitch2 是从那里来的? 并且不可以加上[*3.1415/180] 这段程式
cos_roll = cos(roll2*3.1415/180) ;
sin_roll = sin(roll2*3.1415/180) ;
cos_pitch = cos(pitch2*3.1415/180) ;
sin_pitch = sin(pitch2*3.1415/180) ; 回复【89楼】TADLAW
-----------------------------------------------------------------------
你好,谢谢,我会把“3.你的程式没有交待清楚roll2 及pitch2 是从那里来的? 并且不可以加上[*3.1415/180] 这段程式
”这个地方改掉的。
我还有几个问题:
1,MH_Y = M_X*sin_roll*sin_pitch + M_Y*cos_roll - M_Z*sin_roll*cos_pitch
M_X,M_Y 与M_Z的sensitivity不同这里不需要换算一下么?
2,八面校准法我看了几遍,我觉得就是拿在空中,传感器XYZ每个轴都转360度记录下最大最小是么?
我想先测试放在水平桌面上的电子罗盘准确性,是不是应该先只测得XY平面内的最大最小带入单元化程式?
3,LSM303应用手册中有 MH_X = M_X*cos_pitch + M_Z*sin_pitch
而您的公式是 MH_X = M_X*cos_pitch - M_Z*sin_pitch
这样也可以么?还是方向选择的问题。那个LSM303应用文档我在您的一篇帖子看您贴出过呵呵。
又要麻烦您了。 回复【90楼】wwjdwy
-----------------------------------------------------------------------
1. 所问的问题交待不明确
a. ---,是从那里知道的?
b.[这里不需要换算一下么? ]---,换算什么?
2.
a.不是各别xyz轴转360度,而是模块的头扫向立体的各个象限,前后者是有差异的
b.是的,重点在收集最大及最小值时的模块绕法要正确
c.要注意浮点计算的问题, 我的程式是用python程式语言
3.两个公式都正确,手册有手册的道理,我转载的公式是用电脑画立体图的逻辑,有点像方位可以用0~360度或是+-180度来表示 回复【91楼】TADLAW
-----------------------------------------------------------------------
不好意思我的表述问题,我的意思是M_X,M_Y 与M_Z并没有单位此时。只是一个数值。
LSM303-SPEC中Sensitivity:x,y 670(LSB/Gauss); z 600 (LSB/Gauss); 我的想表达意思是,这里计算时候不用将M_X,M_Y 与M_Z换算成Gauss单位么?
感谢你的耐心指导 谢谢 回复【92楼】wwjdwy
-----------------------------------------------------------------------
要纳入考量,予以计算也可以,忽略也可以,类似的议题有温度,震动,磁场干扰...等等,初次实验应以简单为宜! 回复【94楼】TADLAW
-----------------------------------------------------------------------
谢谢,我再实验几次看看结果 回复【94楼】TADLAW
-----------------------------------------------------------------------
发现一个问题,我在水平面转了一圈测试磁场强度,Y一直是负值,这样数据不对的吧 学习了~~ 好贴,谢谢分享 最近我也在玩这个,发现测出来,用ATAN2计算出来的角度很崩溃啊。0度和180度居然不是对角的。。如何修正呢?{:dizzy:} 学习了!!
页:
[1]
2