搜索
bottom↓
回复: 14

磁力计椭球拟合

[复制链接]

出0入0汤圆

发表于 2024-9-18 19:09:27 | 显示全部楼层 |阅读模式
本贴是分享帖也是求助帖,望各位大佬前辈指点!
小弟最近在用磁力计来弥补陀螺仪解算出的yaw轴飘逸情况,但是呀,事情没有那么容易,再理解了问题和解决方法后自行实现了下,但是有些问题,故特来分享我知道的,和请教我不懂的,希望能够一起讨论解决。
一、磁力计在使用的问题
1. 容易受到干扰,导致解算出来的方向总是和真实的方向对不准。
2. 保持磁力计指向不变,改变其倾角后,解算出来的方向突变。
下面对这两个问题进行分析。
二、磁力计的干扰
1. 干扰的来源
        干扰主要来自两个方面:
(1)软磁干扰:
                由软磁材料产生(eg: 金属、硅钢片、铸钢等),这种干扰会导致磁场走向被扭曲。
(2)硬磁干扰
                由硬磁材料产生(eg:永磁体、磁化的钢等),这种干扰是恒定的,比较友善。

2. 干扰会带来什么影响
        磁力计在不受干扰的情况下,各个方向转一周后,3轴数据绘制出来应该是一个球体,这个很好理解,因为磁力计在理想条件下只采集到地球磁场,也就是3轴的矢量合是个定值,也就是x^2+y^2+z^2=A(A是恒定的地球磁场,不考虑磁偏角等因素的影响),根据球的定义,这个绘制出来就是原点在(0,0,0),半径为sqrt(A)的球体。
        在受到硬磁干扰后,因为干扰是恒定的,因此这种干扰只是把球体的球心搬移了。在受到软磁干扰后,因为会导致磁场走向被扭曲,经过测试,这会导致球体变成椭球。因此干扰最终会让本应在(0,0,0)的球体变成一个偏心的椭球

3. 如何校正
查了下主要可以用两种方案:
(1)简单找球心方案
        将磁力计分别绕xy平面和xz平面旋转一周,然后找到各轴的最大最小值,从而得到球心。这种方案不考虑软磁干扰,同时旋转时尽量要和各平面平行,不然无法得到准确的最大最小值。

(2)椭球拟合方案
        这个就比较高级了,先利用椭球方程和最小二乘法,根据采集到的各个方向磁力计的数值拟合出椭球的方程,从而知道这个椭球的球心(x_offset,y_offset,z_offset)和轴半径a,b,c,这样后面我们在采集到的磁力计数据拿这两个数据进行补偿就行,补偿后会将偏心椭球拟合成球心在原点的单位球。
        x = (x-x_offset)/a;
        y = (y-y_offset)/b;
        z = (z-z_offset)/c;
        其中,x,y,z就是直接读取到的磁力计数据

        具体推导见这个大佬的博文:[IMU标定——椭球拟合-CSDN博客](https://blog.csdn.net/lightningw ... 7-blog-87008583.235^v43^pc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~Rate-1-127499017-blog-87008583.235^v43^pc_blog_bottom_relevance_base5&utm_relevant_index=1)

三、倾角误差
        这个主要是因为磁力计在抬起后,其采集到的磁场是会改变的,因此我们得利用旋转矩阵将当前机体坐标系下的磁力计数据变成地理坐标系下,这个也叫倾角补偿。具体推导见附件中的《磁罗盘误差分析及校准.pdf》

四、想请教的问题
        我按照上面分享的那个大佬的博文中的matlab代码,做磁力计椭球拟合,但拟合后补偿,出来的还是椭球,这个就不是很明白了,按照理论来说不是应该是个球心在原点的单位球吗?我用的是下面函数拟合的
  1. function [scale, offset, cali_data] = func_lms_calibrate(data)

  2.     x = data(:,1);
  3.     y = data(:,2);
  4.     z = data(:,3);
  5.    
  6.     figure;
  7.     plot3(x,y,z,'*');
  8.     title('原始数据');

  9.     %% 最小二乘法参数估计
  10.     N = length(data);
  11.     M = zeros(N, 6);
  12.     p = zeros(N, 1);

  13.     for k = 1:N
  14.         M(k,:) = [y(k)^2 z(k)^2 x(k) y(k) z(k) 1];          % 矩阵M
  15.         p(k) = -x(k)^2;                                     % 向量p
  16.     end

  17.     v = inv(M'*M) * M' * p;                                 % 计算最优解

  18.     x0 = -v(3) / 2;                                         % 拟合出的x0
  19.     y0 = -v(4) / (2*v(1));                                  % 拟合出的y0
  20.     z0 = -v(5) / (2*v(2));                                  % 拟合出的z0

  21.     A = sqrt(x0*x0 + v(1)*y0*y0 + v(2)*z0*z0 - v(6));       % 拟合出的x方向上的轴半径A
  22.     B = A/sqrt(v(1));                                       % 拟合出的y方向上的轴半径B
  23.     C = A/sqrt(v(2));                                       % 拟合出的z方向上的轴半径C

  24.     cali_data = zeros(size(data));
  25.     scale = [A, B, C];                               % 尺度因子
  26.     offset = [x0, y0, z0];                                  % 偏移
  27.     for k = 1:N
  28.         cali_data(k,:) = 1 ./ scale .* (data(k,:) - offset);         % 校准结果
  29.     end
  30.    
  31. %     hold on;
  32.     figure;
  33.     plot3(cali_data(:,1),cali_data(:,2),cali_data(:,3),'.');
  34.     title('拟合数据');
  35.    
  36. end
复制代码


本帖子中包含更多资源

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

x

阿莫论坛21周年了!感谢大家的支持与爱护!!

特朗普正在重复当年希特勒的冒险,好在今天的世界有中国。这次如果没有中国,特朗普向全世界进行关税讹诈就会得逞,这个世界就任由这个疯子宰割!

出40入536汤圆

发表于 2024-9-18 19:46:17 | 显示全部楼层
有没有可能,只是垂直坐标的比例有点问题?

出0入10汤圆

发表于 2024-9-18 21:19:39 | 显示全部楼层
  这个明显不对吧  我椭球拟合的效果很好

出0入0汤圆

 楼主| 发表于 2024-9-18 23:09:28 | 显示全部楼层
智涅 发表于 2024-9-18 19:46
有没有可能,只是垂直坐标的比例有点问题?
(引用自2楼)

大佬,这是什么意思,哈哈哈哈

出0入0汤圆

 楼主| 发表于 2024-9-18 23:10:03 | 显示全部楼层
jaywen 发表于 2024-9-18 21:19
这个明显不对吧  我椭球拟合的效果很好
(引用自3楼)

大佬,可否分享下您的代码

出1450入328汤圆

发表于 2024-9-18 23:56:32 来自手机 | 显示全部楼层
jaywen 发表于 2024-9-18 21:19
这个明显不对吧  我椭球拟合的效果很好
(引用自3楼)

前任技术经理在此😆😆😆😆

出105入79汤圆

发表于 2024-9-19 01:17:25 | 显示全部楼层
用模长检测一下,模长在拟合修正后,各个方向应该为1,也就是正圆,

代码有bug,用gpt4以上的高级模型检测一下

出0入0汤圆

 楼主| 发表于 2024-9-19 15:52:37 | 显示全部楼层
qwe2231695 发表于 2024-9-19 01:17
用模长检测一下,模长在拟合修正后,各个方向应该为1,也就是正圆,

代码有bug,用gpt4以上的高级模型检测 ...
(引用自7楼)

用了gpt4o mini 它只把
v = inv(M'*M) * M' * p;   
换成了      
v = (M'*M) \ (M' * p);   
其他部分没有动,但是这还是不行,哈哈哈哈                     

出0入0汤圆

 楼主| 发表于 2024-9-19 15:53:49 | 显示全部楼层
lb0857 发表于 2024-9-18 23:56
前任技术经理在此😆😆😆😆
(引用自6楼)

技术经理好呀,能否给小弟指点下,哈哈哈

出0入0汤圆

 楼主| 发表于 2024-9-19 15:55:30 | 显示全部楼层
各位有没有可能我磁力计采集的数据太椭了,导致它无法拟合成球,我看别人的原始数据都接近球体

出0入0汤圆

发表于 2024-9-19 19:20:09 | 显示全部楼层
先顶贴,  最近 我也在做 磁力 YAW偏移等问题。

另一个思路: IMU中自带的DMP  据说硬件解码能解决YAW漂移。  是吗?

出0入10汤圆

发表于 2024-9-19 20:54:27 | 显示全部楼层
耀风居士 发表于 2024-9-18 23:10
大佬,可否分享下您的代码
(引用自5楼)

收费的喔

出0入0汤圆

 楼主| 发表于 2024-9-19 23:21:03 | 显示全部楼层
liuxiangyub 发表于 2024-9-19 19:20
先顶贴,  最近 我也在做 磁力 YAW偏移等问题。

另一个思路: IMU中自带的DMP  据说硬件解码能解决YAW漂移 ...
(引用自11楼)

原来试过解决不了,还是会飘,只要温度一变化立马飘

出0入0汤圆

 楼主| 发表于 2024-9-19 23:22:13 | 显示全部楼层

好,怎么联系你

出0入10汤圆

发表于 2024-9-20 14:20:04 | 显示全部楼层

微:dfwenjie
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 01:17

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

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