将一个3D坐标系旋转到另一个 -- python 领域 和 python-3.x 领域 和 3d 领域 和 linear-algebra 领域 和 coordinate-transformation 领域 相关 的问题

Rotate one 3D coordinate system to another


0
vote

问题

中文

我在一个坐标系中有一组点,我想将它们旋转到Python中的另一个坐标系。基于此答案我写下以下python函数:

  def change_of_basis(points, initial, final):     '''     rotate points/vectors in a 3D coordinate system to a new coordinate system          input: m x 3 array of points or vectors that have to be transformed from the initial to the final csys         initial: sequence of sequences of floats representing the normalized axis of the csys that has to be transformed         final: sequence of sequences of floats representing the normalized axis of the csys to which has to be transformed          return: the points/vectors in the new coordinate system     '''     x1, y1, z1 = initial     x2, y2, z2 = final      M11, M12, M13 = np.dot(x1, x2), np.dot(x1, y2), np.dot(x1, z2)     M21, M22, M23 = np.dot(y1, x2), np.dot(y1, y2), np.dot(y1, z2)     M31, M32, M33 = np.dot(z1, x2), np.dot(z1, y2), np.dot(z1, z2)      # set up rotation matrix     R = np.array([[M11, M12, M13],                   [M21, M22, M23],                   [M31, M32, M33]])      return np.linalg.inv(R).dot(points)   

运行示例:

    initial =  [[ 0.98078528  0.         -0.19509032]              [-0.19509032  0.         -0.98078528]              [ 0.          1.          0.        ]]    final =  [[ 0.83335824 -0.08626633 -0.54595986]             [-0.55273325 -0.13005679 -0.82314712]             [ 0.          0.98774564 -0.15607226]]      new_cys = change_of_basis(initial, initial, final )   

绘制它给出了下面可现在下面的结果。目的是将红色/橙色坐标系转换为黄色,但结果是蓝色坐标系。任何人都可以看到我正在制作什么错误以及如何解决这个问题?

在此处输入图像说明

编辑: 它努力改变坐标系。我改为上面的函数到我现在拥有的东西。它允许我将红色转换为黄色坐标系。现在我需要的是将第一(红色)坐标系中的一组点转换为第二(黄色)坐标系中的一组点。我以为这个功能会起作用,但它没有,是一组点的转换不同?

英文原文

I have a set of points in one coordinate system and I want to rotate them to another coordinate system in Python. Based on this answer I wrote the following Python function:

def change_of_basis(points, initial, final):     '''     rotate points/vectors in a 3D coordinate system to a new coordinate system          input: m x 3 array of points or vectors that have to be transformed from the initial to the final csys         initial: sequence of sequences of floats representing the normalized axis of the csys that has to be transformed         final: sequence of sequences of floats representing the normalized axis of the csys to which has to be transformed          return: the points/vectors in the new coordinate system     '''     x1, y1, z1 = initial     x2, y2, z2 = final      M11, M12, M13 = np.dot(x1, x2), np.dot(x1, y2), np.dot(x1, z2)     M21, M22, M23 = np.dot(y1, x2), np.dot(y1, y2), np.dot(y1, z2)     M31, M32, M33 = np.dot(z1, x2), np.dot(z1, y2), np.dot(z1, z2)      # set up rotation matrix     R = np.array([[M11, M12, M13],                   [M21, M22, M23],                   [M31, M32, M33]])      return np.linalg.inv(R).dot(points) 

Running example:

  initial =  [[ 0.98078528  0.         -0.19509032]              [-0.19509032  0.         -0.98078528]              [ 0.          1.          0.        ]]    final =  [[ 0.83335824 -0.08626633 -0.54595986]             [-0.55273325 -0.13005679 -0.82314712]             [ 0.          0.98774564 -0.15607226]]      new_cys = change_of_basis(initial, initial, final ) 

Plotting this gives the result visualized below. The intention is to transform the red/orange coordinate system to the yellow one but the result is the blue coordinate system. Can anyone see what mistake I am making and how to fix this?

enter image description here

EDIT: It worked to transform the coordinate system. I changed to the function above to what I have now. It allows me to transform the red to the yellow coordinate system. Now what I need is to transform a set of points in the first (red) coordinate system to a set of points in the second (yellow) coordinate system. I thought that this function would work but it does not, is the transformation different for a set of points?

              

回答列表

0
 
vote

我在线性代数没有专家,但我认为你的错误在没有反转初始坐标系。

如果a和b是您的基矩阵,则计算a * b,但您需要计算的是^ { - 1} * b。

这是一个有道理的 - 你乘以^ { - 1}乘以从a转换为标准的基础,然后乘以b乘以从标准依据转换为b。

这是另一个所以回答关于实现这一目标的答案:在numpy 的基础上的变化

编辑:特有的该版本为坐标系工作。它不是你需要逆变的r。您正在计算r = a * b,所以通过反转r,您得到了一个^ { - 1} * b ^ { - 1}。您需要反转第一个,然后乘以。

 

I'm no expert in linear algebra, but I think your mistake is in not inverting the initial coordinate system.

If A and B are your basis matrices, you are computing A * B, but what you need to compute is A^{-1} * B.

Which makes sense - you multiply by A^{-1} to convert to the standard basis from A, then multiply by B to convert to from the standard basis to B.

Here's another SO answer that talks about implementing this: Change of basis in numpy

EDIT: Peculiar that this version worked for the coordinate system. It's not R you need to invert. You are computing R = A * B, so so by inverting R you get A^{-1} * B^{-1}. You need to invert A first, then multiply.

 
 
 
 
-1
 
vote

也许尝试使用矩阵的转置来旋转您的点云。请参阅旋转矩阵,这表明用于旋转坐标系的矩阵和用于旋转物体的矩阵是彼此的转座。该链接还具有关于在两个坐标系之间定义一般变换矩阵的有用信息: 常规变换矩阵的图片 和旋转矩阵(即翻转): 一般旋转矩阵的图片 "其中(x',x)表示x'和x轴之间的角度,(x',y)是x'和y轴之间的角度等。"

如何获取旋转矩阵在两个3d笛卡尔坐标系之间转换?谈论使用身份转换为a两个坐标系之间的参考,当坐标系都没有坐标系是由正交向量定义的坐标系:(1,0,0); (0,1,0); (0,0,1)

 

Perhaps try using the transpose of the matrix to rotate your point cloud. See Rotation Matrix, which suggests that the matrix used to rotate the coordinate system and the matrix used to rotate an object are transposes of each other. The link also has useful information about defining a general transform matrix between two coordinate systems: picture of general transform matrix and the rotation matrix (which is the transpose): picture of general rotation matrix "wherexc2xa0(xxe2x80xb2,x)xc2xa0represents the angle between thexc2xa0xxe2x80xb2xc2xa0andxc2xa0xxc2xa0axes,xc2xa0(xxe2x80xb2,y)xc2xa0is the angle between thexc2xa0xxe2x80xb2xc2xa0andxc2xa0yxc2xa0axes, etc."

How to get the rotation matrix to transform between two 3d cartesian coordinate systems? talks about using the identity transform as a reference between two coordinate systems when neither coordinate system is the coordinate system defined by the orthonormal vectors: (1,0,0); (0,1,0); (0,0,1)

 
 
 
 

相关问题

0  服务兼容性意外退出。状态代码是:-9  ( Service chromedriver unexpectedly exited status code was 9 ) 
我对 9988876612 进行了诸多问题,用于使用solemiumings。 $http.get()3 已安装并将其放在与Python文件相同的文件夹中。似乎加载jupyter小区几秒钟的所有建议都被拒绝了以下消息: $http.get()4 其中我使用 $http.get()5 下载它们。在这里我的代码: ...

0  Boketh Plot隐藏HTML网站并仅在Jupyter中显示输出?  ( Boketh plot hide html site and show output only in jupyter ) 
使用散景包,我创建了一个图形可视化,并使用 WaitForMultipleObjects(...)2 输出显示在jupyter中,但也同时使用输出打开浏览器中的新选项卡。我只想将它绘制在Jupyter单元格中,而不将绘图打开作为新的HTML文件。这是不可分割的吗? WaitForMultipleObjects(....

0  使用Pandas将对象(数值)转换为DateTime  ( Convert object numeric value to datetime using pandas ) 
我的数据具有时间表,如下所示,如何将其转换为使用Pandas 的日期和时间 ...

1  根据条件平等查找DataFrame中的匹配对或链条  ( Find matching pairs or chains of persons in dataframe based on equality of cond ) 
我是Python的初学者 - 首先我想为我相当长的问题而道歉,我写的可能非常丑陋的程序来解决我的"问题" 。 问题如下:想象一下房屋的交换。人们可以互相交换他们的房子。 1人从"A" 想要去"B" ,从"B" 的人2想要去"A" 。然后实现了匹配或易货物,并且两者都不再可用于进一步匹配。此外,应涵盖案例,该人1希望从...

1  为什么PIP显示包未安装到当前公共区域环境的网站包装?  ( Why does pip show packages which were not installed to the site packages of the ) 
我有Anaconda(带有Python 2版本的公共4.5.11),我始终使用PIP在我的环境中安装包(我不知道这是早些时候的次优)。然而,一些包装,例如,模拟,意外地在: 位置:$ HOME / .local / lib / python3.6 / site-packages (基于Pip Show Mock) ...

0  从HTML元素下载图像  ( Download image from html element ) 
我需要下载包含图像的SRC文件。我们可以在下一个选项卡上复制源并粘贴它,以便我们可以下载图像。但是我需要下载图像递归i.e 1000图像。此外,我正在使用的网站包含CAPTCHA的登录。是否有任何方法可以通过dev控制台或任何可能的方式 ...

9  在Python中线性拟合,在x和y坐标中具有不确定性[关闭]  ( Linear fitting in python with uncertainty in both x and y coordinates ) 
关闭。这个问题不符合堆栈溢出指南。它目前不接受答案。 想要改进这个问题?更新问题,所以它是关于堆栈溢出的主题。 closed 1年前。 ...

0  在Django管理员内联的Autofill FookeKey  ( Autofill foreignkey in django admin inline ) 
我有 Employee 内联显示 Company 。 Employee 属于 Company 和一个公司特定的 Department 。 我必须自动填充当前公司到新的部门表格。 #models.py class Company(models.Model): name = models.CharF...

0  int函数及其参数  ( The int function and its parameters ) 
我正在研究这个系列问题。 我不了解问题11,使用 int() 的方式。我理解,将 x 直接转换为 int 导致一些零的丢失,所以这样做是不可能的,但我不理解什么 intp = int(p,2) 假设要做。打印出 intp 我得到以下值 4,3,10,9 。如何与 0100,0011,1010,1001 相...

2  rq工作人员扔“valueerror”  ( Rq worker throwing valueerror ) 
我试图在我的烧瓶申请上获取RQ / RQ工作者。我试图将其缩至一个非常简单的测试用例。这是一般的想法: 用户访问 /test 页面。触发要排队的作业并返回排队作业的 job_key 工人( worker.py )处理排队的作业。 用户可以访问 /retrieve/<job_key> 页面来检索结果。 [这未显示...

5  Python中的群集计算快速JSON序列化(和与泡块的比较)?  ( Fast json serialization and comparison with pickle for cluster computing in py ) 
我有一组数据点,每个数据点由字典描述。每个数据点的处理是独立的,我将每个数据作为单独作业提交给群集。每个数据点都有一个唯一的名称,我的群集提交包装器只需调用脚本,该脚本采用数据点的名称和描述所有数据点的文件。然后,该脚本从文件中访问数据点并执行计算。 由于每个作业必须加载所有点的集合,只能检索要运行的点,我想通过序列...

0  KIVY - 如何将滚动视图拖放到另一个布局的项目?  ( Kivy how to drag and drop items from scrollview to another layout ) 
我试图拖动排列在GridLayout(确实在滚动视图内)的一些图像到外布局。 要拖动的图像具有其 on_touch_down 事件定义,当单击映像时,父父级将从 WidgetMenu 更改为 MainLayout 所以它可以是拖动在这些小部件之间。当前问题是当我触摸图像时,拖船丢失了。 完整代码: import...

0  使用多处理嵌套并行进程  ( Nesting parallel processes using multiprocessing ) 
是否有一种方法在已经并行化的函数中并行运行函数?我知道使用multiprocessing.pool()这是不可能作为守护进程无法创建子进程。我相当新的并行计算,并努力找到解决方法。 我目前有几千个计算,需要使用其他一些商业上可用的量子机械码I接口并行运行。每个计算,有三个后续计算,需要在父计算的正常终止时并行执行,如...

0  将通用路径设置为Python中的文件(没有循环)  ( Setting universal path to file in python without for loop ) 
我正在尝试设置我的工作目录,以便它将在所有机器上是通用的 - 但没有循环。我正在使用以下代码,基于此线程:在目录中查找特定路径在Python import os try: ...

1  如何用两组重新表达URL?  ( How to regex url with two groups ) 
我收到这个网址: private void playSound(String location) { try { Uri mp3 = Uri.parse("android.resource://" + getPackageName() + "/raw/" + l...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.