通过PCM去理解坐标系及Python实现

坐标变换实际上是通过矩阵乘法实现的。

单位矩阵\begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix}与其他的矩阵相乘不改变矩阵形态。如果把一个空间坐标 (x_1,y_1,z_1)写成列向量\begin{bmatrix} a\\ d\\ g\\ \end{bmatrix}

那么

\begin{bmatrix} a\\ d\\ g\\ \end{bmatrix} \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix}=\begin{bmatrix} a\\ d\\ g\\ \end{bmatrix}

是否可以简单把这个单位矩阵EEE理解为坐标系呢?\begin{bmatrix} 1\\ 0\\ 0\\ \end{bmatrix}代表X轴,\begin{bmatrix} 0\\ 1\\ 0\\ \end{bmatrix}代表Y轴,\begin{bmatrix} 0\\ 0\\ 1\\ \end{bmatrix}代表Z轴。

那么基本坐标系就是这样的3 \times 3矩阵

\begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix}

通过PCM去理解坐标系及Python实现_第1张图片

在坐标系下做R就很简单了(R代表旋转)

X旋转

A_x= \begin{bmatrix} 1&0&0\\ 0&cos(\theta)&sin(\theta)\\ 0&-sin(\theta)&cos(\theta)\\ \end{bmatrix}

Y旋转

A_y= \begin{bmatrix} cos(\theta)&0&-sin(\theta)\\ 0&1&0\\ sin(\theta)&0&cos(\theta) \\ \end{bmatrix}

Z旋转

A_z= \begin{bmatrix} cos(\theta)&sin(\theta)&0\\ -sin(\theta)&cos(\theta)&0\\ 0&0&1 \\ \end{bmatrix}

那么平移是怎么实现的呢?仅通过这样的3 \times 3矩阵实现不了,加一列。

A_T= \begin{bmatrix} 1&0&0 &a\\ 0&1&0&b\\ 0&0&1&c \\ 0&0&0&1 \end{bmatrix}

在CALYPSO通过PCM调用坐标系原点x_0,y_0,z_0的数值,可以通过函数:

getActual("Alignment1").x
getActual("Alignment1").y
getActual("Alignment1").z

在特性栏中加入BaseAlignment坐标系,等同于基础坐标系,是3 \times 3的单位矩阵,TransAlignment是一个平移了(1,5,7)然后绕Z轴旋转了30°的坐标系。按照上面绕Z轴旋转的矩阵公式可得到

A_z= \begin{bmatrix} cos(30)&sin(30)&0\\ -sin(30)&cos(30)&0\\ 0&0&1 \\ \end{bmatrix}

那么AzA_zAz​应该为:

A_z= \begin{bmatrix} 0.86602540378&0.5&0\\ -0.5&0.86602540378&0\\ 0&0&1 \\ \end{bmatrix}

通过PCM去理解坐标系及Python实现_第2张图片

这个3 \times 3的矩阵并没有把平移值体现在上面,可以通过函数writeDiffCoordSysToFile()写出BaseAlignment坐标系与TransAlignment坐标系之间的差异

通过PCM去理解坐标系及Python实现_第3张图片

writeDiffCoordSysToFile("BaseAlignment", "TransAlignment","coord_diff.txt")

使用Python去读取生成的文本文件,带入一个圆的圆心坐标(-40.1936,31.9956,-3.0821)

# -*- coding: utf-8 -*-
"""
Created on Thurs Dec 22 12:39:48 2022

@author: ZCJOHNLV
"""

import numpy as np

def get_transformation(filename):
    diff = np.genfromtxt(filename)
    r = diff[:9].reshape((3,3))
    t = diff[9:].reshape((3,1))
    # print(r)
    # print(t)
    return r, t

r, t = get_transformation('coord_diff.txt')
# example point in BaseAlignment
point = np.array([ -40.1936,31.9956,-3.0821]).reshape((3,1))

# change reference frame to TransAlignment
point_trans = r@point + t

# Back to BASE
point_base = np.linalg.inv(r)@(point_trans - t)

print(f'Trans Alignment coord: \n{point_trans}')
print(f'BASE Alignment coord: \n{point_base}')

运行程序,经过坐标系TransAlignment将转变为(-22.17690407,43.97567539,-10.0821)

Trans Alignment coord: 
[[-22.17690407]
 [ 43.97567539]
 [-10.0821    ]]
BASE Alignment coord:
[[-40.1936]
 [ 31.9956]
 [ -3.0821]]

这和CALYPSO计算结果是一致的。

你可能感兴趣的:(python,numpy,开发语言)