我想用python製作一個程序,它將採用點座標(XYZ-ABC),例如: POINT = X 100,Y 200,Z 120, A -90,B 0,CO 相對於基準: B = X 0,Y 200,Z 0,A 0,B 0,C 0 並找出相同點相對於另一點的座標基礎: A = X 100,Y 200,Z 0,A 0,B 0,C 0。我發現了很多關於3D轉換的信息,但我不知道從哪裏開始。我也有transformation.py庫。我需要一些關於如何去做這件事的提示,我必須用數學術語來說明哪些步驟。針對2種不同的基礎改變點表示
-1
A
回答
0
這些點是機器人位置的笛卡爾座標。 XYZ(平移)和ABC(Rz,Ry,Rx旋轉)歐拉角,相對於基礎或框架。我需要(我認爲)找到這個位置的單位矢量矩陣。這是我迄今所做的:
C(b)C(a) S(c)S(b)C(a)-C(c)S(a) C(c)S(b)C(a)+S(c)S(a) x
C(b)S(a) C(c)C(a)+S(c)S(b)S(a) C(c)S(b)S(a)-S(c)C(a) y
-S(b) S(c)C(b) C(c)C(b) z
0 0 0 1
//For example point P= [X -534.884033,Y -825.747070, Z 1037.32373,
A -165.214142,B -3.16937923,C -178.672119]
我已經閱讀了這個問題太[3D Camera coordinates to world coordinates (change of basis?),但我不明白我必須做的。目前,我正在Excel工作表中進行一些計算,試圖弄清楚該怎麼做。 另外,我不得不說這個位置是關於一個框架,而這個框架又相對於世界座標系統有座標。在這種情況下,該框架的值是:
Fa= [X 571.16217, Y -1168.71704, Z 372.404694000000, A -179.72329, B -0.2066, C 0.8562]
現在,如果我有第二個框FB:
Fb= [X 0, Y -1168.71704, Z 372.404694000000, A -179.72329, B -0.2066, C 0.8562]
我知道,我的點P相對於Fb的應該是:
Pfb =[X -1106.036,Y -822.9583, Z 1039.342,A -165.2141, B -3.169379,C -178.6721]
我知道這個結果,因爲我使用了一個程序來做這個計算自動地,但我不知道它是如何做到的。
1
鑑於原矢量O=(X, Y, Z)
和旋轉矩陣R
,你可以從Euler angles計算(注意,有很多變體),由
P = R p + O.
給出相對座標p=(x, y, z)
點的絕對座標與第二幀
P = R'p'+ O',
給予從在第一幀本地座標的方程組到第二
p' = R'*(P - O') = R'*(R p + O - O')
其中*
表示轉置(它也是旋轉矩陣的逆)。
0
我已經到了。 查找相對於幀B的點Pfa的變換,即相對於幀A的變換。Pfb ?? 這個例子在Kuka工業機器人中將一個位置或一個點從一個框架轉換到另一個框架是有用的。此外,對於基礎或框架的任何類型的仿射變換,我們只需要考慮齊次變換矩陣的旋轉次序。
A = Rz
B = Ry
C = Rx
Fa_mat --> Homogeneous transformation matrix(HTM) of Frame A, relative to World CS(coordinate system).
Fb_mat --> HTM of Frame B, relative to World CS.
Pfa_mat --> HTM of point A in Frame A.
Pfb_mat --> HTM of point B in Frame B.
Pwa_mat --> HTM of point A in World CS.
Pwb_mat --> HTM of point B in World CS.
If Pwa == Pwb then:
Pwa = Fa_mat · Pfa_mat
Pwb = Fb_mat · Pfb_mat
Fa_mat · Pfa_mat = Fb_mat · Pfb_mat
Pfb_mat = Pwa · Fb_mat' (Fb_mat' is the inverse)
我用泰特 - 布賴恩ZYX角度的旋轉矩陣,euler angles - Wikipedia. 這是我的Python代碼:
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 18 08:54:16 2017
@author: xabier fernandez
"""
import math
import numpy as np
def point_rotation(point_mat):
decpl = 7
sy = math.sqrt(math.pow(point_mat[0,0],2) + math.pow(point_mat[1,0],2))
singularity = sy < 1e-6
if not singularity :
A = math.atan2(point_mat[1,0], point_mat[0,0])
B = math.atan2(-point_mat[2,0], sy)
C = math.atan2(point_mat[2,1] , point_mat[2,2])
else :
A = 0
B = math.atan2(-point_mat[2,0], sy)
C = math.atan2(-point_mat[1,2], point_mat[1,1])
A = round(math.degrees(A),decpl)
B = round(math.degrees(B),decpl)
C = round(math.degrees(C),decpl)
return np.array([A,B,C])
def point_translation(point_mat):
decpl = 5
X = round(point_mat[0,3],decpl)
Y = round(point_mat[1,3],decpl)
Z = round(point_mat[2,3],decpl)
return np.array([X,Y,Z])
def point_to_mat(posX,posY,posZ,degA,degB,degC):
t=np.zeros((4,4))
radA=math.radians(degA)
radB=math.radians(degB)
radC=math.radians(degC)
cos_a=math.cos(radA)
sin_a=math.sin(radA)
cos_b=math.cos(radB)
sin_b=math.sin(radB)
cos_c=math.cos(radC)
sin_c=math.sin(radC)
t[0,0] = cos_a*cos_b
t[0,1] = -sin_a*cos_c + cos_a*sin_b*sin_c
t[0,2] = sin_a*sin_c + cos_a*sin_b*cos_c
t[1,0] = sin_a*cos_b
t[1,1] = cos_a*cos_c + sin_a*sin_b*sin_c
t[1,2] = -cos_a*sin_c + sin_a*sin_b*cos_c
t[2,0] = -sin_b
t[2,1] = cos_b*sin_c
t[2,2] = cos_b*cos_c
t[0,3] = posX
t[1,3] = posY
t[2,3] = posZ
t[3,0] = 0
t[3,1] = 0
t[3,2] = 0
t[3,3] = 1
return t
def test1():
"""
-----------------------------------
Rotational matrix 'zyx'
-----------------------------------
Fa--> Frame A relative to world c.s
Fb--> Frame B relative to world c.s
-----------------------------------
Pwa--> Point A in world c.s
Pwb--> Point B in world c.s
-----------------------------------
Pfa--> Point in frame A c.s
Pfb--> Point in frame B c.s
-----------------------------------
Pwa == Pwb
Pw = Fa x Pfa
Pw = Fb x Pfb
Pfb = Fb' x Pw
-----------------------------------
"""
frameA_mat = point_to_mat(571.162170,-1168.71704,372.404694,-179.723297,-0.206600,0.856200)
frameB_mat = point_to_mat(1493.90100, 209.460, 735.007, 179.572, -0.0880000, 0.130000)
Pfa_mat = point_to_mat(-534.884033, -825.747070,1037.32373, -165.214142, -3.16937923, -178.672119)
inverse_frameB_mat = np.linalg.inv(frameB_mat)
#--------------------------------------------------------------------------
#Point A in World coordinate system
Pwa_mat = np.dot(frameA_mat,Pfa_mat)
Pwa_Trans = point_translation(Pwa_mat)
Pwa_Rot = point_rotation(Pwa_mat)
print('\n')
print('Point A in World C.S.: ')
print(('Translation--> X = {0} , Y = {1} , Z = {2} ').format(Pwa_Trans[0],Pwa_Trans[1],Pwa_Trans[2]))
print(('Rotation(Euler angles)--> : A = {0} , B = {1} , C = {2} ').format(Pwa_Rot[0],Pwa_Rot[1],Pwa_Rot[2]))
print('\n')
#--------------------------------------------------------------------------
#Point A affine transformation
#Point A in Frame B coordinate system
Pfb_mat= np.dot(inverse_frameB_mat,Pwa_mat)
Pfb_Trans = point_translation(Pfb_mat)
Pfb_Rot = point_rotation(Pfb_mat)
print('Point A in Frame B C.S.: ')
print(('Translation--> X = {0} , Y = {1} , Z = {2} ').format(Pfb_Trans[0],Pfb_Trans[1],Pfb_Trans[2]))
print(('Rotation(Euler angles)--> : A = {0} , B = {1} , C = {2} ').format(Pfb_Rot[0],Pfb_Rot[1],Pfb_Rot[2]))
#--------------------------------------------------------------------------
#Point B in World coordinate system
Pwb_mat = np.dot(frameB_mat,Pfb_mat)
Pwb_Trans = point_translation(Pwb_mat)
Pwb_Rot = point_rotation(Pwb_mat)
print('\n')
print('Point B in World C.S.: ')
print(('Translation--> X = {0} , Y = {1} , Z = {2} ').format(Pwb_Trans[0],Pwb_Trans[1],Pwb_Trans[2]))
print(('Rotation(Euler angles)--> : A = {0} , B = {1} , C = {2} ').format(Pwb_Rot[0],Pwb_Rot[1],Pwb_Rot[2]))
print('\n')
if __name__ == "__main__":
test1()
相關問題
- 1. 2個具有相同基礎對象的不同服務
- 2. Object.toString()如何針對不同的基礎類型工作?
- 3. Gnuplotting改變軸的基礎
- 4. 改變基礎系列dynamicilly
- 5. CSS:同一div,2種不同的樣式(針對不同的子div)
- 6. 用不同的方法創建2個其他對象的javascript基礎對象
- 7. 針對兩種不同變體處理的庫的Wformat
- 8. 改變這種不顯示
- 9. 針對不同入口點的各種插件
- 10. 針對2種不同情況重用Selenium方法
- 11. 同步2基礎軌道滑塊
- 12. 使用屬性動畫改變2種不同的顏色
- 13. 如何以這種方式更改iPad的基礎點座標空間,即1點等於2個像素?
- 14. 上表中的值JQuery的改變顏色的基礎
- 15. 正則表達式 - 針對兩種不同模式的測試
- 16. JavaScript - 將多個變量設置爲對象屬性不會改變基礎值
- 17. 基礎 - 如何改變導入庫
- 18. 從表2除去表1的基礎上,2場
- 19. 的UITableView&UICollectionView表示2種不同的情況下
- 20. 基礎對象沒有方法基礎
- 21. 在運行時改變註冊表值的可視化基礎
- 22. 列表大小的基礎上改變CSS類
- 23. 流利的NHibernate針對不同基類型的不同約定
- 24. iPhone - 嘗試在表格視圖中顯示2種不同的對象類型
- 25. 基礎表不走了
- 26. 在您點擊鏈接的DIV基礎上顯示不同內容
- 27. 試圖讓2點不同的形式與2種不同的動作
- 28. 使用2種不同的對象類型列表
- 29. 基礎上可變
- 30. 同步CoreData基礎?
恐怕你的信息就沒有意義了 - 什麼是' XYZABC'?它們看起來並不像標準基礎的任何標準方式。 – meowgoesthedog
也許,這不是表示基礎或框架的合適數學方法。但在許多工業機器人中,這是正確的。實際上,它是從庫卡機器人字面上獲取的。 –