Skip to content

3D 视觉与机器人

3D 视觉是机器人从”看到二维像素”到”理解三维空间”的关键飞跃。传统的 2D 视觉只能处理图像平面上的颜色与纹理信息,而 3D 视觉引入了深度 (Depth) 维度,使得机器人能够感知物体的大小、距离、朝向以及在空间中的位姿 (Pose)。对于工业场景中的机械臂抓取、自主导航、质量检测等任务,3D 视觉是不可或缺的基础能力。

本页聚焦于 3D 视觉与机器人感知中的核心算法链路——从相机标定到位姿估计,从 RGB-D 传感到多传感器融合,从坐标变换到 ROS 通信框架。如果你对深度估计的深度学习方法感兴趣,可以先阅读 深度估计 了解单目深度预测的神经网络方法;本页更侧重于经典几何方法与工程实践。在系统层面,这些技术最终会被集成到完整的 工业 AI 系统 中。

理解 3D 视觉的关键,是抓住一条主线:现实世界中的三维点,经过相机投射后变成二维像素;反过来,从二维像素恢复三维信息,就是 3D 视觉算法的核心任务。

这条链路的前半段(世界→图像)由相机模型和标定解决;后半段(图像→世界→机器人)则是 PnP、深度重建、坐标变换等算法的舞台。

针孔相机模型 (Pinhole Model) 是最基础也是最常用的相机成像模型。它将相机简化为一个理想的针孔:光线穿过一个极小的孔,在背后的像平面上形成倒立的图像。

针孔相机模型:展示焦距、主点、像平面与投影射线

在针孔模型下,三维空间中的点 P=(X,Y,Z)P = (X, Y, Z) 投影到图像平面上的像素坐标 (u,v)(u, v) 由以下公式描述:

u=fx⋅XZ+cxu = f_x \cdot \frac{X}{Z} + c_x v=fy⋅YZ+cyv = f_y \cdot \frac{Y}{Z} + c_y

其中 fx,fyf_x, f_y 是以像素为单位的焦距 (Focal Length),cx,cyc_x, c_y 是主点 (Principal Point)——即光轴与像平面的交点,通常接近图像中心。用矩阵形式表示:

s[uv1]=[fx0cx0fycy001]⏟K[XYZ]s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \underbrace{\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}}_{K} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}

矩阵 KK 称为相机内参矩阵 (Intrinsic Matrix),它只与相机本身有关,不随相机移动而变化。

💡 关键区分:内参 (Intrinsic) 描述的是相机内部的光学特性(焦距、主点、畸变),出厂后基本固定;外参 (Extrinsic) 描述的是相机在世界坐标系中的位置和朝向(旋转 RR 和平移 tt),每次相机移动都会变化。

张正友标定法 (Zhang’s Method) 是目前最广泛使用的相机标定方法,由张正友于 2000 年提出。它使用一块打印的棋盘格标定板 (Chessboard),从不同角度拍摄多张照片(通常 10-20 张),通过检测棋盘格角点的像素坐标和已知的物理坐标,求解内参矩阵 KK 和畸变系数。

实际镜头并非理想针孔,存在两类主要畸变:

畸变类型英文系数特征
径向畸变Radial Distortionk1,k2,k3k_1, k_2, k_3直线变弯曲,鱼眼效果
切向畸变Tangential Distortionp1,p2p_1, p_2图像平面与镜头不平行导致

径向畸变的数学模型:

xcorrected=x(1+k1r2+k2r4+k3r6)x_{corrected} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6)

其中 r=x2+y2r = \sqrt{x^2 + y^2} 是像素到主点的距离。

import cv2
import numpy as np
import glob
# --- Step 1: 准备棋盘格的 3D 世界坐标 ---
# 假设棋盘格内角点为 9x6,每个格子的物理尺寸为 25mm
chessboard_size = (9, 6) # (内角点列数, 内角点行数)
square_size = 0.025 # 每个格子的边长(米)
# 生成理想棋盘格角点的世界坐标 (Z=0 平面上)
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
objp *= square_size # 乘以物理尺寸
objpoints = [] # 3D 世界坐标
imgpoints = [] # 2D 图像像素坐标
# --- Step 2: 读取标定图像并检测角点 ---
images = glob.glob('calibration_images/*.jpg')
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 棋盘格角点检测
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
if ret:
objpoints.append(objp)
# 亚像素级角点精化,提高精度
corners_refined = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
imgpoints.append(corners_refined)
print(f"成功检测 {len(objpoints)} 张标定图像")
# --- Step 3: 执行标定 ---
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], None, None
)
print("=== 标定结果 ===")
print(f"内参矩阵 K:\n{K}")
print(f"焦距: fx={K[0,0]:.2f}, fy={K[1,1]:.2f}")
print(f"主点: cx={K[0,2]:.2f}, cy={K[1,2]:.2f}")
print(f"畸变系数 [k1, k2, p1, p2, k3]: {dist.ravel()}")
# --- Step 4: 去畸变 ---
img = cv2.imread(images[0])
undistorted = cv2.undistort(img, K, dist, None, K)
cv2.imwrite('undistorted.jpg', undistorted)

💡 标定质量检查:标定后应计算重投影误差 (Reprojection Error)——将 3D 点重新投影到图像上,与检测到的角点比较。优秀标定的平均误差应小于 0.5 像素。

PnP (Perspective-n-Point) 是 3D 视觉中最核心的位姿估计问题之一:已知一组 3D 点在世界坐标系中的坐标 Pi=(Xi,Yi,Zi)P_i = (X_i, Y_i, Z_i),以及它们在图像上的 2D 投影 (ui,vi)(u_i, v_i),求解相机的旋转矩阵 RR 和平移向量 tt。

简单来说,PnP 回答的问题是:“我的相机(或物体)相对于已知标志物在哪里、朝哪个方向?”

算法全称特点最少点数
EPnPEfficient PnP速度快,稳定性好,工业界最常用4
DLSDirect Least-Squares对噪声鲁棒4
UPnPUniversal PnP可同时估计焦距4
P3PPerspective-3-Point经典解析解,需第 4 点消歧3+1

solvePnP 代码示例:机械臂抓取定位

Section titled “solvePnP 代码示例:机械臂抓取定位”
import cv2
import numpy as np
# === 场景:机械臂需要抓取一个已知尺寸的零件 ===
# 已知零件上 4 个标记点的物理坐标(零件坐标系,单位:米)
object_points = np.array([
[0.00, 0.00, 0.00], # 左上角标记
[0.10, 0.00, 0.00], # 右上角标记
[0.10, 0.08, 0.00], # 右下角标记
[0.00, 0.08, 0.00], # 左下角标记
], dtype=np.float64)
# 在相机图像中检测到的对应像素坐标
image_points = np.array([
[320, 240],
[420, 245],
[418, 340],
[315, 335],
], dtype=np.float64)
# 相机内参(来自标定)
K = np.array([
[800.0, 0.0, 320.0],
[ 0.0, 800.0, 240.0],
[ 0.0, 0.0, 1.0],
], dtype=np.float64)
# 畸变系数(来自标定,此处假设无畸变)
dist_coeffs = np.zeros((5, 1), dtype=np.float64)
# === 使用 EPnP 求解相机位姿 ===
success, rvec, tvec = cv2.solvePnP(
object_points, image_points, K, dist_coeffs,
flags=cv2.SOLVEPNP_EPNP
)
if success:
# 将旋转向量转换为旋转矩阵
R, _ = cv2.Rodrigues(rvec)
print("零件相对于相机的位姿:")
print(f" 平移 t = [{tvec[0,0]:.4f}, {tvec[1,0]:.4f}, {tvec[2,0]:.4f}] 米")
print(f" 旋转矩阵 R:\n{R}")
# 将位姿转换为 4x4 齐次变换矩阵
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = tvec.ravel()
print(f" 齐次变换矩阵 T:\n{T}")

单应性矩阵 (Homography Matrix) HH 描述的是两个平面之间的投影变换关系。给定一个平面上的点 (x1,y1)(x_1, y_1) 和另一个平面上对应点 (x2,y2)(x_2, y_2),它们之间的关系为:

s[x2y21]=H[x1y11],H=[h11h12h13h21h22h23h31h32h33]s \begin{bmatrix} x_2 \\ y_2 \\ 1 \end{bmatrix} = H \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}, \quad H = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix}

HH 是一个 3×33 \times 3 矩阵(8 个自由度),只需 4 对非共线的对应点即可求解。

import cv2
import numpy as np
# === 应用:透视矫正(将倾斜拍摄的文档拉平)===
src_pts = np.array([[120, 80], [520, 50], [580, 400], [100, 420]], dtype=np.float32)
dst_pts = np.array([[0, 0], [600, 0], [600, 800], [0, 800]], dtype=np.float32)
# 4 点求 Homography
H, _ = cv2.findHomography(src_pts, dst_pts)
# 应用透视变换
img = cv2.imread('slanted_document.jpg')
corrected = cv2.warpPerspective(img, H, (600, 800))
cv2.imwrite('corrected_document.jpg', corrected)

💡 常见应用:透视矫正 (Document Scanning)、图像拼接 (Image Stitching)、AR 标记定位 (ArUco / AprilTag)、车牌识别预处理。

RGB-D 相机(又称深度相机)能同时输出彩色图像 (RGB) 和深度图 (Depth Map)。深度图中每个像素的值代表该点到相机的物理距离(通常以毫米为单位)。目前主流的深度感知技术有三种:

技术英文全称代表产品原理有效范围
结构光Structured LightKinect v1, RealSense F200投射已知红外图案,根据变形推算深度0.5–5 m
飞行时间Time of Flight (ToF)Kinect v2, RealSense L515测量光脉冲往返时间 Δt\Delta t0.5–10 m
双目立体视觉Stereo VisionRealSense D435, ZED两摄像头视差 (Disparity) 计算深度1–20 m

ToF 的深度计算公式:

d=c⋅Δt2d = \frac{c \cdot \Delta t}{2}

其中 cc 为光速,Δt\Delta t 为光脉冲往返时间。

有了深度图后,可以将每个像素 (u,v)(u, v) 反投影回 3D 空间,生成点云 (Point Cloud):

X=(u−cx)⋅Zfx,Y=(v−cy)⋅Zfy,Z=depth[v][u]X = \frac{(u - c_x) \cdot Z}{f_x}, \quad Y = \frac{(v - c_y) \cdot Z}{f_y}, \quad Z = \text{depth}[v][u]
# === 从深度图 + 内参生成点云 ===
def depth_to_pointcloud(depth_map, K):
"""
将深度图转换为 3D 点云
depth_map: (H, W) 深度图,单位毫米
K: 3x3 内参矩阵
"""
h, w = depth_map.shape
fx, fy = K[0, 0], K[1, 1]
cx, cy = K[0, 2], K[1, 2]
# 生成像素坐标网格
u, v = np.meshgrid(np.arange(w), np.arange(h))
# 反投影
z = depth_map.astype(np.float64) / 1000.0 # mm -> m
x = (u - cx) * z / fx
y = (v - cy) * z / fy
# 过滤无效深度(depth=0 通常是无效值)
valid = z > 0
points = np.stack([x[valid], y[valid], z[valid]], axis=-1)
return points
# point_cloud = depth_to_pointcloud(depth, K)
# print(f"生成 {len(point_cloud)} 个有效 3D 点")
import pyrealsense2 as rs
import numpy as np
import cv2
# === 配置 RealSense 管道 ===
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) # 深度流
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) # 彩色流
pipeline.start(config)
try:
while True:
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
color_frame = frames.get_color_frame()
if not depth_frame or not color_frame:
continue
# 转换为 numpy 数组
depth_image = np.asanyarray(depth_frame.get_data())
color_image = np.asanyarray(color_frame.get_data())
# 深度图可视化(伪彩色)
depth_colormap = cv2.applyColorMap(
cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET
)
# 读取中心点深度
center_dist = depth_frame.get_distance(320, 240)
print(f"中心点距离: {center_dist:.3f} m")
cv2.imshow('RGB', color_image)
cv2.imshow('Depth', depth_colormap)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
pipeline.stop()
cv2.destroyAllWindows()

ROS (Robot Operating System) 是目前机器人领域最广泛使用的中间件框架。它本身不是操作系统,而是运行在 Linux 之上的一组通信协议和工具集,提供了进程间通信、硬件抽象、包管理、可视化等功能。

ROS 有四种核心通信机制:

机制模式特点典型用途
Topic (话题)发布/订阅 (Pub/Sub)异步、连续、多对多传感器数据流、控制指令
Service (服务)请求/响应 (Req/Res)同步、一次性查询状态、触发快照
Action (动作)目标/反馈/结果异步、长时、可取消自主导航、机械臂运动规划
Parameter (参数)全局变量启动时加载、运行时可改配置参数、PID 增益

TF (Transform Library) 是 ROS 中管理多坐标系间变换关系的核心组件。它维护一棵坐标变换树 (Transform Tree),自动处理坐标系之间的链式变换:

每个箭头代表一个刚体变换 (R,t)(R, t),TF 树实时广播各坐标系之间的关系,任何节点都可以查询”坐标系 A 下的点在坐标系 B 中的坐标是什么”。

特性ROS1ROS2
中间件自研 TCPROSDDS (Data Distribution Service)
实时性不支持硬实时支持 QoS (Quality of Service) 配置
Master 节点需要 roscore 中心节点去中心化,无 Master
安全性无认证机制支持 DDS-Security
多机器人困难原生支持
操作系统主要 LinuxLinux / Windows / RTOS
生命周期管理无有节点生命周期 (Node Lifecycle)

💡 DDS (Data Distribution Service) 是 OMG 标准的分布式发布/订阅中间件,ROS2 基于它实现了去中心化通信,支持 QoS 策略(可靠性、持久性、 deadline),更适合工业级实时机器人系统。

在机器人系统中,同一个点在不同坐标系下有不同的坐标。使用齐次变换矩阵 (Homogeneous Transformation Matrix) TT 可以将旋转和平移统一为一个 4×44 \times 4 矩阵:

T=[R3×3t3×101×31]=[r11r12r13txr21r22r23tyr31r32r33tz0001]T = \begin{bmatrix} R_{3 \times 3} & t_{3 \times 1} \\ 0_{1 \times 3} & 1 \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix}

将一个点 PP 从坐标系 B 变换到坐标系 A:

PA=ATB⋅PBP^A = {}^A T_B \cdot P^B

当坐标变换经过多个中间坐标系时,变换矩阵可以链式相乘:

坐标系变换链:World→Robot→Camera→Tool 的链式变换

worldTtool=worldTrobot⋅robotTcamera⋅cameraTtool{}^{world} T_{tool} = {}^{world} T_{robot} \cdot {}^{robot} T_{camera} \cdot {}^{camera} T_{tool}
import numpy as np
def make_transform(R, t):
"""构建 4x4 齐次变换矩阵"""
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = t
return T
def rot_z(angle_deg):
"""绕 Z 轴旋转的 3x3 旋转矩阵"""
theta = np.radians(angle_deg)
return np.array([
[np.cos(theta), -np.sin(theta), 0],
[np.sin(theta), np.cos(theta), 0],
[0, 0, 1],
])
# 示例:计算末端工具在世界坐标系中的位姿
# 1. 机器人基座在世界的位姿
T_world_robot = make_transform(rot_z(45), [2.0, 1.0, 0.0])
# 2. 相机在机器人上的安装位姿(手眼标定结果)
T_robot_camera = make_transform(rot_z(-90), [0.3, 0.0, 0.5])
# 3. 工具(夹爪)在相机视野中的位姿(PnP 求解)
T_camera_tool = make_transform(np.eye(3), [0.5, -0.1, 0.8])
# 链式相乘:得到工具在世界坐标系的最终位姿
T_world_tool = T_world_robot @ T_robot_camera @ T_camera_tool
print(f"末端工具在世界坐标系中的位置: {T_world_tool[:3, 3]}")
print(f"末端工具的旋转矩阵:\n{T_world_tool[:3, :3]}")

⚠️ 注意矩阵乘法顺序:变换矩阵的乘法是不可交换的。T1⋅T2≠T2⋅T1T_1 \cdot T_2 \neq T_2 \cdot T_1。链式乘法中,右边的变换先执行。务必按从左到右”父→子”的顺序相乘。

卡尔曼滤波 (Kalman Filter, KF) 是最经典的传感器融合算法,用于从含有噪声的多源观测中最优估计系统状态。它有两个核心步骤:

Step 1 — 预测 (Predict):根据系统运动模型预测下一时刻的状态和不确定度:

x^k∣k−1=F⋅x^k−1∣k−1+B⋅uk\hat{x}_{k|k-1} = F \cdot \hat{x}_{k-1|k-1} + B \cdot u_k Pk∣k−1=F⋅Pk−1∣k−1⋅FT+QP_{k|k-1} = F \cdot P_{k-1|k-1} \cdot F^T + Q

其中 FF 是状态转移矩阵,PP 是估计不确定度的协方差,QQ 是过程噪声协方差。

Step 2 — 更新 (Update):用新观测数据修正预测值:

Kk=Pk∣k−1⋅HT⋅(H⋅Pk∣k−1⋅HT+R)−1K_k = P_{k|k-1} \cdot H^T \cdot (H \cdot P_{k|k-1} \cdot H^T + R)^{-1} x^k∣k=x^k∣k−1+Kk⋅(zk−H⋅x^k∣k−1)\hat{x}_{k|k} = \hat{x}_{k|k-1} + K_k \cdot (z_k - H \cdot \hat{x}_{k|k-1})

其中 KkK_k 是卡尔曼增益 (Kalman Gain),决定了观测与预测之间的信任权重。

import numpy as np
class KalmanFilter1D:
"""一维卡尔曼滤波器:融合位置估计"""
def __init__(self, process_var, measure_var, est_init):
self.Q = process_var # 过程噪声方差(运动模型不确定性)
self.R = measure_var # 测量噪声方差(传感器精度)
self.x = est_init # 状态估计
self.P = 1.0 # 估计不确定度
def update(self, measurement):
"""预测 + 更新"""
# Predict
self.P = self.P + self.Q
# Update
K = self.P / (self.P + self.R) # 卡尔曼增益
self.x = self.x + K * (measurement - self.x)
self.P = (1 - K) * self.P
return self.x
# 示例:融合相机(高噪声)和激光雷达(低噪声)的距离测量
kf = KalmanFilter1D(process_var=0.01, measure_var=0.1, est_init=0.0)
# 模拟 10 个时刻的传感器读数
camera_readings = [1.05, 0.98, 1.02, 0.99, 1.03, 1.01, 0.97, 1.04, 1.00, 1.02]
lidar_readings = [1.001, 1.002, 0.999, 1.000, 1.001, 1.002, 0.998, 1.001, 1.000, 1.001]
for cam, lidar in zip(camera_readings, lidar_readings):
fused = kf.update(lidar) # 用高精度传感器更新
print(f"相机: {cam:.3f}, 激光雷达: {lidar:.3f}, 融合估计: {fused:.4f}")

标准卡尔曼滤波假设系统是线性的。但实际机器人运动(如转弯、旋转)往往是非线性的。扩展卡尔曼滤波 (Extended Kalman Filter, EKF) 通过对非线性模型做一阶泰勒展开(雅可比矩阵线性化),将问题转化为近似的线性问题:

Fk=∂f∂x∣x^k−1∣k−1F_k = \left. \frac{\partial f}{\partial x} \right|_{\hat{x}_{k-1|k-1}}

EKF 广泛应用于 SLAM (Simultaneous Localization and Mapping)、GPS/IMU 融合导航等场景。

💡 多传感器融合策略:相机提供丰富的纹理和语义信息但深度精度差;激光雷达 (LiDAR) 提供精确的 3D 点云但缺乏颜色;IMU 提供高频运动估计但存在累积漂移。三者互补——相机+LiDAR 用于建图定位,IMU 填充高频运动间隙。

神经辐射场与 3D 高斯溅射 (NeRF & 3DGS)

Section titled “神经辐射场与 3D 高斯溅射 (NeRF & 3DGS)”

NeRF (Neural Radiance Field) 和 3D Gaussian Splatting (3DGS) 将 3D 重建从传统几何方法推进到了神经表征时代。2024–2025 年间,3DGS 因其实时渲染能力(100+ FPS)成为机器人仿真环境构建的热门方案,被广泛用于训练数据生成和 Sim-to-Real 迁移。

SAM (Segment Anything Model) 的 3D 扩展版本(如 SAM3D、OpenScene)实现了零样本 3D 场景理解——无需针对新场景重新训练即可分割和识别 3D 点云中的物体。这大幅降低了工业部署的定制化成本。

受 Vision-Language-Action (VLA) 模型(如 Google RT-2、Octo、OpenVLA)驱动,2025 年出现了从RGB 图像直接到机器人动作的端到端策略,绕过了传统”感知→规划→控制”的分步管线。但这些方法在精确位姿控制方面仍不及经典几何方法。

ROS2 在 2025 年已成为新工业机器人项目的默认选择。DDS 中间件的 QoS 保障使其满足工业实时性要求,Apollo、Autoliv 等公司已在量产系统中采用。ROS2 Jazzy Jalisco(2024 LTS)和 2025 年的 Rolling 版本进一步强化了对实时以太网 (EtherCAT) 的支持。

  1. 标定是第一性原理:所有 3D 视觉算法的精度上限取决于标定质量。工业场景建议每 3-6 个月重新标定一次,更换镜头或相机后必须立即重标。
  2. 手眼标定 (Hand-Eye Calibration):当相机安装在机械臂上(眼在手上, Eye-in-Hand)时,需要额外标定相机与机械臂末端的固定变换关系。OpenCV 的 cv2.calibrateHandEye() 提供了完整接口。
  3. 深度图的有效范围:结构光相机的有效深度通常在 0.5–5 m,超出范围深度值为 0 或噪声极大。点云生成时务必过滤无效点。
  4. TF 树的频率:TF 广播频率建议不低于 30 Hz,否则下游节点可能查询到过时的变换。使用 tf2_ros.TransformListener 而非手动管理变换缓存。
  5. 单位统一:工业代码中最常见的 bug 是单位混淆——深度图以毫米为单位,但很多算法要求米。务必在数据进入算法前统一转换单位。
术语英文释义
针孔模型Pinhole Model将相机简化为理想针孔的成像模型
内参矩阵Intrinsic Matrix (K)描述相机内部光学特性的 3×3 矩阵(焦距、主点)
外参Extrinsic Parameters相机在世界坐标系中的旋转 R 和平移 t
焦距Focal Length (fx,fyf_x, f_y)以像素为单位的相机光学焦距
主点Principal Point (cx,cyc_x, c_y)光轴与像平面的交点
径向畸变Radial Distortion (k1,k2,k3k_1,k_2,k_3)镜头弯曲导致的直线变弯
切向畸变Tangential Distortion (p1,p2p_1,p_2)镜头与传感器不平行导致的偏移
张正友标定法Zhang’s Method使用棋盘格的平面标定方法
PnPPerspective-n-Point已知 3D 点与 2D 投影求位姿
单应性矩阵Homography Matrix (H)平面到平面的 3×3 投影变换矩阵
深度图Depth Map每个像素存储深度值的图像
点云Point Cloud3D 点的集合,通常为 (x,y,z) + 可选颜色
结构光Structured Light投射已知图案,根据变形推算深度
飞行时间Time of Flight (ToF)测量光脉冲往返时间计算距离
视差Disparity立体视觉中同一点在左右图的像素差
齐次变换矩阵Homogeneous Transform Matrix (T)统一表示旋转和平移的 4×4 矩阵
卡尔曼滤波Kalman Filter (KF)线性高斯系统的最优状态估计器
扩展卡尔曼滤波Extended Kalman Filter (EKF)通过雅可比线性化处理非线性系统的 KF
卡尔曼增益Kalman Gain (K)观测与预测之间的信任权重
TF 变换树Transform TreeROS 中管理多坐标系间变换关系的数据结构
DDSData Distribution ServiceROS2 使用的分布式发布/订阅中间件标准
手眼标定Hand-Eye Calibration标定相机与机械臂末端坐标系关系
SLAMSimultaneous Localization and Mapping同步定位与建图
NeRFNeural Radiance Field用神经网络表征 3D 场景的辐射场方法
3DGS3D Gaussian Splatting用 3D 高斯椭球体表征场景的可实时渲染方法