算法思路
在大地坐标系中,刚体上任意点A的位置可以下式表示:
R=R0+r(1)
其中 R0 表示刚体上的基点O在大地坐标系的位置, r 表示向量
假设刚体上有个固连坐标系,那么 R 也可以表示为
其中 T 表示固连坐标系相对于大地坐标系的方向余弦矩阵。
a=a0+T¨⋅ρ(3)
假设 a0 和 T¨ 都是未知的,就有12个未知量。只需要知道4个点的坐标以及它们的加速度,利用方程(3),就可以完全确定这12个未知量。
样例
在ADAMS中建立了一个刚体,上面有6个标记点,其中5个用于计算(多余4个点,可以做最小二乘拟合),剩下的一个点作为验证
程序
% 点的坐标,需要4个点(任意坐标系,可以是固连或者大地坐标系)
% 对于有多于4个点的情况,利用伪逆,计算得到最小二乘解
% 在ADAMS中建立样例,取坐标和加速度
point1 = [
% 103.6157 340.1818 28.9743
-46.2203 347.0594 30.3414
38.3051 231.4121 -104.823
-5.4705 159.0944 -43.8787
-64.2436 225.1557 96.2762];
point = [
% 100 350 0
-50 350 0
40.97 196.67 -83.69
0 150 0
-63 260.32 106.40
-150 250 0];
% 每个点的加速度,相对于大地坐标系
acc = [
% -0.3808 -276.9834 142.8849
5.1513 -256.189 172.1333
38.5448 398.8363 123.7429
-3.5535 393.7675 -232.1496
-50.8528 -168.3864 -347.8126
5.409 86.118 -5.6344];
%%
syms a11 a12 a13 a21 a22 a23 a31 a32 a33;
A = [a11 a12 a13
a21 a22 a23
a31 a32 a33];
syms ax ay az;
a0 = [ax
ay
az];
a0 = repmat(a0, 1, 5);
f1 = a0 + A * point' - acc';
vars = [
a11
a12
a13
a21
a22
a23
a31
a32
a33
ax
ay
az];
[A0, b0] = equationsToMatrix(f1, vars);
rlt = pinv(A0) * b0;
rlt = eval(rlt);
a11 = rlt(1);
a12 = rlt(2);
a13 = rlt(3);
a21 = rlt(4);
a22 = rlt(5);
a23 = rlt(6);
a31 = rlt(7);
a32 = rlt(8);
a33 = rlt(9);
ax = rlt(10);
ay = rlt(11);
az = rlt(12);
A = [a11 a12 a13
a21 a22 a23
a31 a32 a33];
a0 = [ax
ay
az];
% 样例
p_e = [100 350 0];
% a_e = [-0.3808 -276.9834 142.8849];
a_e = a0 + A * p_e';
运行结果
a_e =
-0.3806
-276.9849
142.8870