变换矩阵左乘与右乘的区别和应用
变换矩阵左乘和右乘应用与实际意义
一,变换矩阵左乘的应用
点P在坐标系A下进行了两次位姿变换。第一次变换矩阵为T1,第二次变换矩阵为T2。求点P两次连续变换矩阵的结果,以及最终位置。
要计算点 P 在坐标系 A 下经过两次位姿变换后的最终位置,可以按照以下步骤进行:
- 计算两次变换矩阵的组合变换矩阵。
- 将组合变换矩阵应用于点 P。
假设点 P 的初始位置为 P
,第一次变换矩阵为 T1
,第二次变换矩阵为 T2
,最终位置可以通过以下步骤计算:
- 计算组合变换矩阵:
T_combined = np.dot(T2, T1)
- 将组合变换矩阵应用于点 P:
P_final = np.dot(T_combined, P)
注意这里的组合变换矩阵的计算,第二次变换T2左乘第一次变换T1。这里的关键是,点P在“同一坐标系”下进行了两次连续的变换,将后一次的变换左乘前一次的变换。如果还有第三次的变换,则第三次先左乘第二次变换,输出结果再左乘第一次变换。
以下是示例代码:
import numpy as np
# 定义初始位置 P (假设 P 是一个齐次坐标)
P = np.array([x, y, z, 1]) # 请替换 x, y, z 为实际坐标
# 定义变换矩阵 T1 和 T2
T1 = np.array([
[-0.992543, -0.0985432, -0.0717491, 1.81161],
[0.0928758, -0.992582, 0.0784536, 4.71046],
[-0.078948, 0.0712048, 0.994332, 0.126783],
[0, 0, 0, 1]
])
T2 = np.array([
[1.002, 0.005, -0.005, -0.034],
[-0.005, 1.002, -0.013, -0.039],
[0.005, 0.013, 1.002, -0.041],
[0, 0, 0, 1]
])
# 计算组合变换矩阵
T_combined = np.dot(T2, T1)
# 计算 P 在 A 坐标系下的最终位置
P_final = np.dot(T_combined, P)
print("点 P 在 A 坐标系下的最终位置:")
print(P_final)
请将 P
的初始坐标 x, y, z
替换为实际的坐标值。
如果连续三次变换
点P在坐标系A下进行了两次位姿变换。第一次变换矩阵为T1,第二次变换矩阵为T2,第三次变换矩阵为T3。求点P三次连续变换矩阵的结果,以及最终位置。
要计算点 P 在坐标系 A 下经过三次位姿变换后的最终位置,可以按照以下步骤进行:
- 计算三次变换矩阵的组合变换矩阵。
- 将组合变换矩阵应用于点 P。
假设点 P 的初始位置为 P
,三次变换矩阵分别为
T1
、T2
和 T3
,最终位置可以通过以下步骤计算:
- 计算组合变换矩阵:
T_combined = np.dot(np.dot(T3, T2), T1)
- 将组合变换矩阵应用于点 P:
P_final = np.dot(T_combined, P)
以下是示例代码:
import numpy as np
# 定义初始位置 P (假设 P 是一个齐次坐标)
P = np.array([x, y, z, 1]) # 请替换 x, y, z 为实际坐标
# 定义变换矩阵 T1, T2 和 T3
T1 = np.array([
[-0.992543, -0.0985432, -0.0717491, 1.81161],
[0.0928758, -0.992582, 0.0784536, 4.71046],
[-0.078948, 0.0712048, 0.994332, 0.126783],
[0, 0, 0, 1]
])
T2 = np.array([
[1.002, 0.005, -0.005, -0.034],
[-0.005, 1.002, -0.013, -0.039],
[0.005, 0.013, 1.002, -0.041],
[0, 0, 0, 1]
])
T3 = np.array([
[0.999, -0.010, 0.020, 0.050],
[0.010, 0.999, -0.030, 0.060],
[-0.020, 0.030, 0.999, 0.070],
[0, 0, 0, 1]
])
# 计算组合变换矩阵
T_combined = np.dot(np.dot(T3, T2), T1)
# 计算 P 在 A 坐标系下的最终位置
P_final = np.dot(T_combined, P)
print("点 P 在 A 坐标系下的最终位置:")
print(P_final)
请将 P
的初始坐标 x, y, z
替换为实际的坐标值。
二,变换矩阵右乘应用
以多传感器标定为例,激光A相对于激光O的变换矩阵为TA->O,激光B相对于激光A的变换矩阵为TB->A,求激光B相对于激光O的变换矩阵为多少?
要计算激光 B 相对于激光 O 的变换矩阵,可以将两个变换矩阵相乘。假设激光 A 相对于激光 O 的变换矩阵为 TA->O
,激光 B 相对于激光 A 的变换矩阵为 TB->A
,那么激光 B 相对于激光 O 的变换矩阵 TB->O
可以通过以下步骤计算:
- 计算组合变换矩阵:
TB->O = np.dot(TA->O, TB->A)
注意这里每个变换矩阵的参考坐标系都不一样。TA->O
是以激光O为参考系,TB->A
是以A为参考系, TB->O
是以O为参考系。计算 TB->O
本质是激光B在O参考系下的变换矩阵。为了求激光B相对于激光O变换矩阵,需要在O参考系下,以激光A为过渡,计算TB->A
右乘 TA->O
,实现B激光参考坐标系转换的计算。
以下是示例代码:
import numpy as np
# 定义变换矩阵 TA->O 和 TB->A
TA_O = np.array([
[a11, a12, a13, a14],
[a21, a22, a23, a24],
[a31, a32, a33, a34],
[0, 0, 0, 1]
])
TB_A = np.array([
[b11, b12, b13, b14],
[b21, b22, b23, b24],
[b31, b32, b33, b34],
[0, 0, 0, 1]
])
# 计算激光 B 相对于激光 O 的变换矩阵
TB_O = np.dot(TA_O, TB_A)
print("激光 B 相对于激光 O 的变换矩阵:")
print(TB_O)
请将 TA_O
和 TB_A
替换为实际的变换矩阵值。
四元数位姿变换
目前有一个位姿pose是一个四元数,需要对这个位姿进行一定角度的变换,已知变换是四元数q2。请问这个pose和q2应该如何计算才能得到正确的变换后位姿pose2;
要将一个位姿(以四元数 pose
表示)进行额外的角度变换(通过已知的四元数 q2
表示),可以通过四元数相乘的方式实现。下面是如何进行此操作的步骤:
四元数乘法
四元数乘法用于组合旋转。在几何意义上,乘法顺序很重要,因为它决定哪个旋转先被应用。
-
顺序考虑:
- 通常的惯例是:如果
pose
表示一个当前的旋转状态,而q2
是一个需要增加的旋转,则你应使用右乘(pose
被增加旋转q2
),即:
[
\text{pose2} = q2 \times \text{pose}
]上述公式表示先应用当前位姿
pose
的旋转,然后再应用q2
的旋转变换。 - 通常的惯例是:如果
实现步骤
-
定义现有位姿四元数和增量四元数:
- 现有的四元数
pose
表示当前位姿。 q2
表示需要施加的额外旋转。
- 现有的四元数
-
组合旋转:
- 计算新的位姿
pose2
:
Eigen::Quaternionf pose; // 当前位姿四元数 Eigen::Quaternionf q2; // 额外旋转四元数 Eigen::Quaternionf pose2 = q2 * pose; // 先施加pose的旋转,再施加q2的旋转
- 计算新的位姿
注意事项
-
四元数规范化:在计算过程中,为避免累积数值误差,通常需要确保四元数是规范化的。特别是在经过多次运算与变换后,确保四元数的模为1是一个好习惯。
-
旋转顺序与参考系:上述乘法顺序适用于一般的惯例,即额外的旋转
q2
应该是在现有旋转pose
之后应用的。如果应用的上下文不同(例如希望先应用q2
再应用pose
的旋转),则乘法顺序需要反过来。
通过这种方式,可以获得应用额外旋转后新的位姿 pose2
。这种操作广泛应用于航迹推算、机械臂操作与计算机动画等领域。
更多推荐
所有评论(0)