4、平移向量与齐次坐标:平移向量的物理意义、齐次坐标的引入、4x4外参矩阵的构成
好,咱们接着聊。上一节我们把旋转聊透了,这一节该聊聊“平移”了。你想想看,一个刚体在三维空间里,不光要转,还得挪地方。摄像头装在车上,车往前开,摄像头的位置就在变。这个“位置变化”,就是平移向量要干的事。
4.1 平移向量的物理意义
平移向量,说白了就是告诉你:从坐标系A的原点,走到坐标系B的原点,该怎么走。
举个例子。我车上装了个摄像头,摄像头坐标系的原点,相对于车体坐标系的原点,可能偏左10厘米、偏上5厘米、往前20厘米。那这个平移向量就是 (0.1, 0.05, 0.2),单位是米。就这么简单。
但这里有个坑,我当年刚入行时踩过。平移向量的方向,取决于你从谁到谁。从车体到摄像头,和从摄像头到车体,方向是反的。你写代码时一旦搞反,整个标定结果就全乱了。嗯,这个一定要注意。
4.2 为什么要引入齐次坐标?
好,问题来了。我们之前有旋转矩阵R(3x3),现在又有平移向量t(3x1)。想把一个点从摄像头坐标系变换到车体坐标系,公式是:
P_车体 = R * P_摄像头 + t
这个公式本身没问题。但你想过没有,如果我们有一连串的变换呢?比如从摄像头到车体,再从车体到世界,再从世界到另一个传感器。每次都要写一个“旋转+平移”的式子,代码写起来很啰嗦,而且不好合并。
为什么会这样?因为旋转是乘法,平移是加法,两种运算混在一起,没法用一个矩阵统一表达。
那怎么办?数学家们想了个办法:给坐标多加一个维度。
原本三维点 (x, y, z),变成四维 (x, y, z, 1)。这个“1”就是齐次坐标的最后一个分量。有了它,平移就能写成乘法了。
4.3 4x4外参矩阵的构成
好了,现在我们把旋转矩阵R(3x3)和平移向量t(3x1)拼到一起,再加一行 [0 0 0 1],就得到了一个4x4的矩阵。这就是外参矩阵的完整形态:
外参矩阵 = [ R t ]
[ 0 1 ]
展开写就是:
| r11 r12 r13 tx |
| r21 r22 r23 ty |
| r31 r32 r33 tz |
| 0 0 0 1 |
这个矩阵,就是摄像头坐标系到车体坐标系的“桥梁”。你拿摄像头看到的一个点,左乘这个矩阵,就得到了它在车体坐标系下的位置。
我个人习惯把这个矩阵叫做“刚体变换矩阵”。因为它只包含旋转和平移,不包含缩放或剪切,保持了物体的形状不变。
4.4 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张图,把平移向量、齐次坐标、外参矩阵的关系串起来:
4.5 代码示例:构建外参矩阵
光说不练假把式。我给你写一段Python代码,演示怎么用旋转矩阵和平移向量拼出4x4外参矩阵:
import numpy as np
# 假设旋转矩阵R(单位矩阵,表示没有旋转)
R = np.eye(3)
# 平移向量t:摄像头在车体坐标系中的位置
# 假设摄像头装在车顶,偏左0.1米,偏高0.05米,往前0.2米
t = np.array([[0.1],
[0.05],
[0.2]])
# 构建4x4外参矩阵
T = np.vstack([
np.hstack([R, t]),
np.array([0, 0, 0, 1])
])
print("外参矩阵:")
print(T)
# 测试:将摄像头坐标系原点变换到车体坐标系
P_cam = np.array([0, 0, 0, 1]) # 齐次坐标
P_vehicle = T @ P_cam
print(f"摄像头原点在车体坐标系中的位置:{P_vehicle[:3].flatten()}")
# 输出应该是 [0.1, 0.05, 0.2]
这段代码跑出来,你会看到摄像头原点被准确地映射到了平移向量的位置。嗯,这就是外参矩阵的魔力。
4.6 本章小结
- 平移向量:描述两个坐标系原点之间的偏移,方向要搞对。
- 齐次坐标:给三维点加一个维度,让平移也能用乘法表达。
- 4x4外参矩阵:旋转+平移的完美统一,是传感器标定的核心工具。
下一节我们会聊到“内参矩阵”,那是摄像头自己内部的参数。但别急,先把外参吃透。外参搞不明白,后面全是白搭。我当年就是吃了这个亏,标定出来的数据怎么看怎么不对,最后发现是外参矩阵里平移向量的符号写反了。嗯,你记住这个教训就好。