坐标变换实际上是通过矩阵乘法实现的。
单位矩阵与其他的矩阵相乘不改变矩阵形态。如果把一个空间坐标
写成列向量
。
那么
是否可以简单把这个单位矩阵EEE
理解为坐标系呢?代表轴,
代表轴,代表轴。
那么基本坐标系就是这样的矩阵
在坐标系下做就很简单了(代表旋转)
绕旋转
绕旋转
绕旋转
那么平移是怎么实现的呢?仅通过这样的矩阵实现不了,加一列。
在CALYPSO通过PCM调用坐标系原点的数值,可以通过函数:
getActual("Alignment1").x
getActual("Alignment1").y
getActual("Alignment1").z
在特性栏中加入坐标系,等同于基础坐标系,是
的单位矩阵,
是一个平移了
然后绕轴旋转了°的坐标系。按照上面绕轴旋转的矩阵公式可得到
那么AzA_zAz
应该为:
这个的矩阵并没有把平移值体现在上面,可以通过函数
writeDiffCoordSysToFile()
写出坐标系与
坐标系之间的差异
writeDiffCoordSysToFile("BaseAlignment", "TransAlignment","coord_diff.txt")
使用Python去读取生成的文本文件,带入一个圆的圆心坐标
# -*- 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}')
运行程序,经过坐标系将转变为
Trans Alignment coord:
[[-22.17690407]
[ 43.97567539]
[-10.0821 ]]
BASE Alignment coord:
[[-40.1936]
[ 31.9956]
[ -3.0821]]
这和CALYPSO计算结果是一致的。