先给出结论:齐次变换矩阵在进行坐标变换时,先进行旋转操作,再进行平移操作。
#include <eigen3/Eigen/Geometry>
#include <iostream>
int main()
{
using Transform3d = Eigen::Transform<double, 3, Eigen::Isometry>;
Eigen::Vector3d vec(1,1,1);
Transform3d trans=Transform3d::Identity();
trans.translation()=Eigen::Vector3d(1,2,3);
Transform3d rot(Eigen::AngleAxisd(M_PI_2,Eigen::Vector3d(1,2,3)));
Transform3d tf(rot);
tf.translation()=Eigen::Vector3d(1,2,3);
std::cout<<"---------------first rotate then translate-------------"<<std::endl;
std::cout<< trans*rot*vec<<std::endl;
std::cout<<"---------------first translate then rotate-------------"<<std::endl;
std::cout<< rot*trans*vec<<std::endl;
std::cout<<"---------------transform-------------"<<std::endl;
std::cout<< tf*vec<<std::endl;
return 0;
}
运行结果:
从数学计算角度解释:
令
t
r
a
n
s
=
(
1
0
0
x
0
1
0
y
0
0
1
z
0
0
0
1
)
trans=\left(\begin{array}{cccc} 1 & 0 & 0 & x\\ 0 & 1 & 0 & y\\ 0 & 0 & 1 & z\\ 0 & 0 & 0 & 1 \end{array}\right)
trans=
100001000010xyz1
(
r
11
r
11
r
13
0
r
21
r
22
r
23
0
r
31
r
32
r
33
0
0
0
0
1
)
\left(\begin{array}{cccc} r_{11} & r_{11} & r_{13} & 0\\ r_{21} & r_{22} & r_{23} & 0\\ r_{31} & r_{32} & r_{33} & 0\\ 0 & 0 & 0 & 1 \end{array}\right)
r11r21r310r11r22r320r13r23r3300001
先平移后旋转
r
o
t
a
t
e
∗
t
r
a
n
s
=
(
r
11
r
11
r
13
r
11
x
+
r
11
y
+
r
13
z
r
21
r
22
r
23
r
21
x
+
r
22
y
+
r
23
z
r
31
r
32
r
33
r
31
x
+
r
32
y
+
r
33
z
0
0
0
1
)
rotate*trans=\left(\begin{array}{cccc} r_{11} & r_{11} & r_{13} & r_{11}\,x+r_{11}\,y+r_{13}\,z\\ r_{21} & r_{22} & r_{23} & r_{21}\,x+r_{22}\,y+r_{23}\,z\\ r_{31} & r_{32} & r_{33} & r_{31}\,x+r_{32}\,y+r_{33}\,z\\ 0 & 0 & 0 & 1 \end{array}\right)
rotate∗trans=
r11r21r310r11r22r320r13r23r330r11x+r11y+r13zr21x+r22y+r23zr31x+r32y+r33z1
先旋转后平移
t
r
a
n
s
∗
r
o
t
a
t
e
=
(
r
11
r
11
r
13
x
r
21
r
22
r
23
y
r
31
r
32
r
33
z
0
0
0
1
)
trans*rotate=\left(\begin{array}{cccc} r_{11} & r_{11} & r_{13} & x\\ r_{21} & r_{22} & r_{23} & y\\ r_{31} & r_{32} & r_{33} & z\\ 0 & 0 & 0 & 1 \end{array}\right)
trans∗rotate=
r11r21r310r11r22r320r13r23r330xyz1
可以看出先旋转时,旋转操作并不会影响旋转前的平移坐标。
如果先平移再旋转的话,平移操作会改变旋转轴的坐标。