IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 通过PCM去理解坐标系及Python实现 -> 正文阅读

[Python知识库]通过PCM去理解坐标系及Python实现

作者:TransAlignment

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

单位矩阵\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}

在坐标系下做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}

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

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知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:04:55  更:2022-12-25 11:05:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 2:41:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计