平移 旋转 齐次坐标变换 欧拉角 旋转矩阵 坐标系间的旋转 外参 Matlab

平移齐次坐标变换: 

空间某点由矢量 a\boldsymbol{i}+b\boldsymbol{j}+c\boldsymbol{k} 描述。其中,\boldsymbol{i,j,k} 为轴 x,y,z 上的单位矢量。此点可用平移齐次变换表示为: 

Trans(a,b,c)=\begin{bmatrix} 1 & 0 & 0 & a \\ 0 & 1 & 0 & b\\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{bmatrix}

旋转齐次坐标变换: 

s  sinc 表 cos ,非齐次去掉第四行第四列就行了。

绕x轴作转角为\theta的旋转变换:

Rot(x,\theta )=\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & c\theta & -s\theta & 0 \\ 0 & s\theta & c\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

绕y轴作转角为\theta的旋转变换: 

Rot(y,\theta )=\begin{bmatrix} c\theta & 0 & s\theta & 0 \\ 0 & 1 &0 & 0 \\ -s\theta & 0 & c\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

绕z轴作转角为\theta的旋转变换: 

Rot(z,\theta )=\begin{bmatrix} c\theta & -s\theta & 0 & 0 \\ s\theta & c\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

如果先让物体绕z轴旋转90°,接着绕y轴旋转90°,再沿x轴方向平移4个单位,则: 

T=Trans(4,0,0)Rot(y,90)Rot(z,90)

eul2rotm()      (MatlabR2016a)

eul=[angle1 angle2 angle3]

eul2rotm(eul,'ZYX') 是先绕X旋转angle3再绕Y旋转angle2再绕Z旋转angle1。( eul2rotm中为弧度)

如:

eul = [pi pi/2 pi/2];
rotm = eul2rotm(eul,'ZYX');   a=rotm*[0 1 0]'

eul = [pi pi/2 pi/2];
rotm = eul2rotm(eul,'ZYX');   a=rotm*[0 1 0]'

表示  [0;1;0] 即y轴单位向量,先绕X旋转90°,再绕Y旋转90°,最后绕Z旋转180°,结果 a=[-1;0;0]。

也可以:

eul2 = rad2deg([pi pi/2 pi/2]);
rotm2 = rotz(eul2(1)) * roty(eul2(2)) * rotx(eul2(3));   b=rotm2*[0 1 0]'

eul2 = rad2deg([pi pi/2 pi/2]);
rotm2 = rotz(eul2(1)) * roty(eul2(2)) * rotx(eul2(3));   b=rotm2*[0 1 0]'

b也为[-1;0;0](rotx,y,z 中为角度)。

坐标系间的旋转

P_{c1}: P在c1坐标系下的坐标(列向量)

P_{c2}: P在c2坐标系下的坐标(列向量)

_{c2}^{c1}\textrm{R}: c2坐标系相对于c1坐标系的方位,即 c1坐标系到c2坐标系的旋转

(若此时还有c3坐标系,且知道 _{c2}^{c1}\textrm{R}_{c3}^{c1}\textrm{R},则 _{c3}^{c2}\textrm{R} = _{c2}^{c1}\textrm{R}^{-1} * _{c3}^{c1}\textrm{R}

则:

P_{c1}=_{c2}^{c1}\textrm{R}* P_{c2}

若还有 t: c1坐标系到c2坐标系的平移(如 t=[1,0,0]' 表示c1坐标系沿x轴向前移动一个单位即为c2坐标系),则

_{c2}^{c1}\textrm{T}=\begin{bmatrix} _{c2}^{c1}\textrm{R} &t \\ 0& 1 \end{bmatrix}

P_{c1}= _{c2}^{c1}\textrm{T} * P_{c2}

(此时Pc1,Pc2皆为齐次坐标)

例:假设坐标系c1和坐标系c2(右手坐标系,右手定则旋转), c1坐标系下的点 Pc1 (0,1,0) ,经  R=rotz(90°),t=[1;0;0]  变换后在c2坐标系下的坐标是 Pc2 (1,1,0) 。
Matlab(R2016a) 程序如下:

>> pc1=[0;1;0];
R=rotz(90);
t=[1;0;0];
T=[R,t;0,0,0,1];
pc2=inv(T)*[pc1;1]

pc2 =

     1
     1
     0
     1

T表示 c1坐标系先 绕z轴旋转90°  再在原c1坐标系下沿x轴平移一个单位 到c2坐标系; 

也可表示为 c1坐标系 先沿x轴平移一个单位 再绕z轴旋转90° 到c2坐标系。

那么 _{c2}^{c1}\textrm{R} *P_{c1} 是什么呢?
Pc1 此时可以理解为c1坐标系下的y轴方向向量。
\dpi{100} rotz(90^{\circ})*\left [ 0,1,0 \right ]'=\left [ -1,0,0 \right ]'

这个结果表示:c1坐标系的y轴方向向量 经旋转后 在c1坐标系下的新坐标。

注:

右手坐标系:右手拇指、食指和中指分别代表x,y,z轴的正方向。

右手定则:右手的大拇指指向轴的正方向,弯曲其余手指,那么手指所指示的方向即是轴的正旋转方向。

猜你喜欢

转载自blog.csdn.net/a476918486/article/details/86690618
今日推荐