|
本贴是分享帖也是求助帖,望各位大佬前辈指点!
小弟最近在用磁力计来弥补陀螺仪解算出的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代码,做磁力计椭球拟合,但拟合后补偿,出来的还是椭球,这个就不是很明白了,按照理论来说不是应该是个球心在原点的单位球吗?我用的是下面函数拟合的
- function [scale, offset, cali_data] = func_lms_calibrate(data)
-
- x = data(:,1);
- y = data(:,2);
- z = data(:,3);
-
- figure;
- plot3(x,y,z,'*');
- title('原始数据');
-
- %% 最小二乘法参数估计
- N = length(data);
- M = zeros(N, 6);
- p = zeros(N, 1);
-
- for k = 1:N
- M(k,:) = [y(k)^2 z(k)^2 x(k) y(k) z(k) 1]; % 矩阵M
- p(k) = -x(k)^2; % 向量p
- end
-
- v = inv(M'*M) * M' * p; % 计算最优解
-
- x0 = -v(3) / 2; % 拟合出的x0
- y0 = -v(4) / (2*v(1)); % 拟合出的y0
- z0 = -v(5) / (2*v(2)); % 拟合出的z0
-
- A = sqrt(x0*x0 + v(1)*y0*y0 + v(2)*z0*z0 - v(6)); % 拟合出的x方向上的轴半径A
- B = A/sqrt(v(1)); % 拟合出的y方向上的轴半径B
- C = A/sqrt(v(2)); % 拟合出的z方向上的轴半径C
-
- cali_data = zeros(size(data));
- scale = [A, B, C]; % 尺度因子
- offset = [x0, y0, z0]; % 偏移
- for k = 1:N
- cali_data(k,:) = 1 ./ scale .* (data(k,:) - offset); % 校准结果
- end
-
- % hold on;
- figure;
- plot3(cali_data(:,1),cali_data(:,2),cali_data(:,3),'.');
- title('拟合数据');
-
- end
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛21周年了!感谢大家的支持与爱护!!
特朗普正在重复当年希特勒的冒险,好在今天的世界有中国。这次如果没有中国,特朗普向全世界进行关税讹诈就会得逞,这个世界就任由这个疯子宰割!
|