但是,还需要六个变量:
传感器X轴对Y轴输入的灵敏度($ M_ {xy} $)
传感器X轴对Z轴输入的灵敏度($ M_ {xz} $)
传感器Y轴对X轴输入的灵敏度($ M_ {yx} $)
传感器Y轴对Z轴输入的灵敏度($ M_ {yz} $)
Z轴到X轴输入($ M_ {zx} $)的灵敏度
Z轴到Y轴输入的传感器($ M_ {zy} $)的灵敏度
下面还应指出:
IEEE-STD-1293-1998 [...]提供了详细的测试程序,用于确定每个校准参数
,在搜索1293-1998标准(尤其是Google文档中的第201页)之后,我没有找到有关如何计算$ M $值的任何线索。另外,Vectornav方程中的$ B_ {d} $和$ V_x $值在任何地方都没有说明。有人可以指点我吗?
#1 楼
好。我懒得阅读文档,但是总的来说,您可以将传感器响应建模为$ brn $$ \ alpha_m = S \ alpha + b $$
其中$ \ alpha $是相对于加速度计主体的三个维度上的实际加速度(包括由于重力引起的加速度),$ \ alpha_m $是从加速度计测得的加速度,$ b $是偏移量,$ S $是$ 3 \ times3 $敏感度矩阵。
$ S $和$ b $可以从您在上面的问题中给出的方程式得出:$ S $是两个$ 3 \ times3 $矩阵的乘积,而$ b $是$ S $及其$ B $和$ V $向量的乘积。我们都在说同样的话;我只是稍微压缩一下数学。
如果您知道$ S $,$ b $和$ \ alpha_m $,则可以对$ \ alpha $求解上面的等式以获得
$$ \ hat {\ alpha} = S ^ {-1} \ left(\ alpha_m-b \ right)$$
所以如果您不假设$ S $是对称的(我认为不是必须的),那么您有12个未知数($ S $中有9个,$ b $中有3个)。
如果将加速度计安装到侧面比要校准的精度更高的立方体中,然后将其放在与立方体一样精确的桌子上,然后测量加速度在多维数据集的六个面的每一个上,您将得到18个方程,三个轴的三个方程式乘以多维数据集的六个面。那里应该有足够的信息来通过线性代数提取您的12个未知数。
许多航空航天公司使用旋转工作台来完成这项工作,但是这会花费很多。
评论
$ \ begingroup $
$ M $系数如何?还有$ B_d $?
$ \ endgroup $
–Primož Kralj
13年7月11日在5:23
$ \ begingroup $
还有$ V_x $? (无法编辑最新评论)。
$ \ endgroup $
–Primož Kralj
13年7月11日在6:02
$ \ begingroup $
现在,问题已更新为Tim,因此您可能要考虑修改答案。谢谢,
$ \ endgroup $
– Mark Booth♦
13年7月11日在11:08
#2 楼
我知道这个问题已经2岁了,但是我对此有直接的经验。我这样做的方法是在6个旋转的多维数据集位置上每个位置有1000个点,因此共有6000个样本。我假设使用Matlab / numpy命名法,其中NxM表示N行,M列。
我假设一个方程像Ax = B,其中B是测量值矩阵(6000x4,右列全为1),A是“实际”值矩阵(也是6000x4,其中有六个1000值的节,每个节有[1,0,0,1],[-1,0,0,1],[0,1,0,1],[0,-1,0,1] 1000个副本,[0,0,1,1],[0,0,-1,1],分别对应于Xup,Xdown,Yup,Ydown,Zup,Zdown。x是一个4x4矩阵,其中左上3x3分量是增益和横轴灵敏度,右边的3x1分量是偏移量;最下面的行都是零。通过使用4x4矩阵,我们可以进行线性数学中的所有操作,并且避免了单独的偏移量计算。然后让numpy计算x作为B / A的最小二乘除法。我认为在Matlab中它将是B \ A。我不确定在这种情况下最小二乘如何工作,但是r结果是一个4x4的矩阵,该矩阵可以最大程度地减少误差并平均所有样本。可以想象,您也可以仅在两个位置上执行此操作,每个轴与重力成对角线,然后从上向下颠倒,然后相应地调整预期的“理想”值。
结果是4x4矩阵可以修复比例,偏移和横轴误差,这也意味着它可以纠正传感器和参考边缘硬件之间的任何旋转误差。
这是python代码,假定为numpy:
def least_squares_fit(A, B):
"""Does least squares fit to find x of Ax = B. Returns best guess of original distortion
matrix x and its inverse. A is ideal values. B is distorted values. Use inverse to
correct real data back to ideal data."""
# Need to extend A and B
A = np.hstack((A, np.ones(len(A)).reshape(-1, 1)))
B = np.hstack((B, np.ones(len(B)).reshape(-1, 1)))
X, res, rank, s = np.linalg.lstsq(A, B)
X = X.T # Not sure why we need T
Xi = np.linalg.inv(X)
return (np.asmatrix(X), np.asmatrix(Xi), np.sum(res))
评论
$ \ begingroup $
“ X = X.T#不知道为什么我们需要T” Yikes!当您不确定为什么要进行移调时,很难将此作为权威性答案!如果您之后已找到答案,也许添加更新?同时,这可能是一个很好的答案。 +1
$ \ endgroup $
– uhoh
17-09-24在5:33
$ \ begingroup $
哈...那是几年前的事。我认为我从来没有想过。我让自己相信这要么是numpy的怪癖,要么是我不太了解矩阵乘法的方式。该代码有效,所以我不理会它。 :)
$ \ endgroup $
– Sonicsmooth
17年9月25日在22:59
$ \ begingroup $
如果行得通,那就行了,那就是最终的授权!好吧,我会努力的,谢谢!
$ \ endgroup $
– uhoh
17年9月26日在0:10
$ \ begingroup $
我发现自己自己在这里和那里扔了一些.T,现在我可以开心地相信我也在校准。我很高兴找到这个答案,了解了如何将.linalg()用作副产品。
$ \ endgroup $
– uhoh
17-10-3在11:12
$ \ begingroup $
很高兴我的帖子对您有所帮助:)
$ \ endgroup $
– Sonicsmooth
17-10-4在18:26
评论
添加了一些摘录,但未摘录自1293-1998标准,因为我不知道解释在哪里。很棒的东西,谢谢@PrimožKralj,这使问题变得更加独立。