不同坐标系之间的刚性转换以及实现:
坐标系转换原理如下,使用了仿射变换实现了旋转平移:
[
r
11
r
12
t
x
r
21
r
22
t
y
0
0
]
∗
[
x
y
1
]
=
[
x
′
y
′
1
]
\begin{bmatrix} r_{11} & r_{12}& t_x\\ r_{21}& r_{22}& t_y\\ 0 & 0& \end{bmatrix}* \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}= \begin{bmatrix} x^{'} \\ y^{'} \\ 1 \end{bmatrix}
r11r210r12r220txty
∗
xy1
=
x′y′1
但是在eigen中求取方程式
A
∗
x
=
b
A*x=b
A∗x=b,所以前面可以将
[
x
y
z
]
\begin{bmatrix} x \\ y \\ z \end{bmatrix}
xyz
看成是A,把
[
x
′
y
′
z
′
]
\begin{bmatrix} x^{'} \\ y^{'} \\ z^{'} \end{bmatrix}
x′y′z′
看成是
b
b
b。不过这样公式就需要一定的变形才能和前面的对应起来,前后做一个转置,如下所示:
[
[
r
11
r
12
t
x
r
21
r
22
t
y
0
0
]
∗
[
x
y
1
]
]
T
=
[
x
′
y
′
1
]
T
\left [ \begin{bmatrix} r_{11} & r_{12}& t_x\\ r_{21}& r_{22}& t_y\\ 0 & 0& \end{bmatrix}*\\ \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\\ \right ] ^{T}= \begin{bmatrix} x^{'} \\ y^{'} \\ 1 \end{bmatrix}^{T}
r11r210r12r220txty
∗
xy1
T=
x′y′1
T
那么就会转换成如下所示:
[
x
y
1
]
∗
[
r
11
r
21
0
r
12
r
22
0
t
x
t
y
1
]
=
[
x
′
y
′
1
]
\begin{bmatrix} x &y &1 \end{bmatrix} *\begin{bmatrix} r_{11} & r_{21}& 0\\ r_{12}& r_{22}& 0\\ t_x & t_y&1 \end{bmatrix}=\begin{bmatrix} x^{'} & y^{'} & 1 \end{bmatrix}
[xy1]∗
r11r12txr21r22ty001
=[x′y′1]
所以最终在程序里使用的是上面的公式,调用A.fullPivLu().solve(B)
计算的时候也是A对应
[
x
y
1
]
\begin{bmatrix} x &y &1 \end{bmatrix}
[xy1],B对应的就是
[
x
′
y
′
1
]
\begin{bmatrix} x^{'} & y^{'} & 1 \end{bmatrix}
[x′y′1]。所以得出来的结果也是
[
r
11
r
21
0
r
12
r
22
0
t
x
t
y
1
]
\begin{bmatrix} r_{11} & r_{21}& 0\\ r_{12}& r_{22}& 0\\ t_x & t_y&1 \end{bmatrix}
r11r12txr21r22ty001
。看自己需求是否对其转置
A << -4.93374, -0.056378, 1, 0.397714, -0.126519, 1, 2.63284, -0.0925265, 1;
B << 109995, 8318, 1, 110066, 13650, 1, 110032, 15885, 1;
Eigen::Matrix3d T = TransMatrix(A, B);
cout << "transform matrix is: " << "\n";
cout << T.transpose() << endl;//显示出A*T=B,但是实际计算的是(T的转置*A的转置)的转置=B的转置
cout << A*T << endl;
转换矩阵结果如下所示: