我已经在这里问过一个有关机器人技术的相关问题(消除加速度计偏差),并且在校正后的加速度计输出上得到了更好的结果。为了获得更好的结果,我发现Vectornav的校准方程式(第7和第8段)比链接问题中的解决方案略有增强:

但是,还需要六个变量:

传感器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 $值在任何地方都没有说明。有人可以指点我吗?

评论

添加了一些摘录,但未摘录自1293-1998标准,因为我不知道解释在哪里。

很棒的东西,谢谢@PrimožKralj,这使问题变得更加独立。

#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