坐标系变换中的矩阵表示

标准坐标系变换的公式为:

\begin{bmatrix} a1 & a2 & a3\\ b1& b2 & b3\\ c1& c2 & c3 \end{bmatrix} \begin{bmatrix} x\\ y\\ z \end{bmatrix} + \begin{bmatrix} T1\\ T2\\ T3 \end{bmatrix} = \begin{bmatrix} X\\ Y\\ Z \end{bmatrix}

x,y,z为初始坐标,XYZ为变换后坐标。

a1,a2,a3,b1,b2,b3,c1,c2,c3为旋转矩阵R

T1,T2,T3为平移量T

将旋转矩阵和平移量放在一起,组成4*4矩阵为

\begin{bmatrix} a1 & a2 & a3 &T1 \\ b1& b2 & b3 &T2 \\ c1& c2 &c3 &T3 \\ 0& 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} = \begin{bmatrix} X\\ Y\\ Z\\ 1 \end{bmatrix}

这样将坐标系的变换就可以转换为矩阵的计算。

比如,变换关系为: R1*R2 = R3

坐标值即经过R2 变换后,再经过R1变换,得到的结果和坐标值直接经过R3变换的值是相同的。就有了这样的转换关系。

如果已知其中两种变换关系,就可以计算第三个变换关系。如:R2 = R1^{-1} * R3

注意4*4的矩阵并不是正交矩阵,3*3的旋转矩阵是正交矩阵。对4*4矩阵求逆,可以参考以下资料:

对原来的矩阵进行分块,分成一个3x3方阵A,一个3x1的列阵B,3个0的行阵C和一个1个元素的单位阵D
原来矩阵变为
A B
C D

假定它的逆矩阵为
A' B'
C' D'

则:
A * A' + B * C' = I(三阶单位阵)
A * B' + B * D' = 0 (3x1零矩阵)
C * A' + D * C' = 0 (1x3零矩阵)
C * B' + D * D' = 1 (一阶单位阵)
考虑C为0矩阵和D为1,根据表达式3,4很容易得到
D' = 1(一阶单位阵) 
C' = 0(1x3零矩阵)
根据表达式1,A'是A的逆矩阵
而根据表达式2,可以得到A*B'=-B

 

计算得到的旋转矩阵,转换为旋转角时,注意区分是固定轴角度还是随动轴角度(欧拉角)。同时注意旋转顺序,XYZ和ZYX计算得到的值是不一样的。

计算固定轴XYZ的角度为:

//旋转矩阵 计算 固定轴XYZ 旋转角
//计算角度的时候,输出的是°,不需要在外部进行弧度转°计算了
void RotMatrixToFixXYZ(CShotStation& rot,double& dRx,double &dRy,double &dRz)
{
	double dPi = 4*atan(1.0);

	//欧拉角XYZ 到 欧拉角 ZYX(此旋转系统就是固定轴XYZ)
	dRz = atan2(rot.b1,rot.a1) * 180 / dPi;
	dRy = atan2f(-rot.c1,sqrtf(powf(rot.c2,2)+powf(rot.c3,2)))*180/dPi;
	dRx = atan2(rot.c2,rot.c3) * 180 /dPi;
}

 

 

你可能感兴趣的:(C++/VC,数学,矩阵)