TASK02【datawhale组队学习】视觉感知与手眼协调,计算机视觉在机器人中应用,手眼标定算法实现,深度估计与3D重建

发布于:2025-07-23 ⋅ 阅读:(31) ⋅ 点赞:(0)

参考教程AI硬件与机器人技术教程:https://github.com/datawhalechina/ai-hardware-robotics

视觉感知与手眼协调,计算机视觉在机器人中应用,手眼标定算法实现,深度估计与3D重建
单目深度估计 (Monocular Depth Estimation)
DPT 的全称是 Dense Prediction Transformer。

手眼协调教程

学习路径:

  1. 首先学习 [手眼标定教程](6.1 Hand-Eye Calibration.md) 理解基本概念
  2. 掌握相机内参和外参标定方法
  3. 学习机器人坐标系与相机坐标系的转换
  4. 掌握视觉反馈控制原理
  5. 实践手眼协调任务,如视觉引导抓取

技术背景:
手眼协调是机器人视觉与控制结合的关键技术,通过建立机器人末端执行器与相机之间的空间关系,实现基于视觉的精确操作。典型应用包括:

  • 视觉引导抓取
  • 装配操作
  • 视觉检测与质量控制
  • 自动化生产线

常用库:
OpenCV - 计算机视觉库
ROS/ROS2 - 机器人操作系统
MoveIt - 机器人运动规划框架
PCL - 点云处理库

手眼标定

手眼标定分为两种形式:
1.摄像头安装在机械手末端,称之为眼在手上(Eye in hand)
2.摄像头安装在机械臂外的机器人底座上,则称之为眼在手外(Eye to hand)

在这里插入图片描述

手眼标定的数学模型

不管是眼在手上还是眼在手外,它们求解的数学方程是一样的,都为 𝐴𝐻=𝐻𝐵 ,首先定义如下坐标系:

F b F_b Fb: 基座坐标系(Base Frame),固定在机械臂的底座上,是机械臂运动的全局参考坐标系。

F e F_e Fe: 末端执行器坐标系(End-Effector Frame)固定在机械臂末端执行器(例如夹爪或工具)上。

F c F_c Fc: 相机坐标系(Camera Frame),固定在相机光心的位置,是视觉感知的参考系。

F t F_t Ft: 标定目标坐标系(Calibration Target Frame):固定在标定目标(如棋盘格、圆点板)上。

坐标系之间的关系通常用齐次变换矩阵(刚体变换)T表示:

T j i = [ R j i t j i 0 1 ] T^i_j=\left[\begin{array}{cc} R^i_j & t^i_j \\ 0 & 1 \end{array}\right] Tji=[Rji0tji1]

其中 R ∈ S O ( 3 ) R ∈ SO(3) RSO(3), t ∈ R 3 t ∈ \R^{3} tR3,分别对应旋转变换与平移变换。T的上下标表示变换是对于哪两个坐标系,例如:

T c e T^e_c Tce:将相机坐标系转换到末端执行器坐标系的变换,也表示相机在末端执行器坐标系下的位姿,在眼在手上这种情形下,就是我们要求的目标矩阵。

Eye In Hand

当相机固定在机械臂末端时,相机与末端执行器之间的变换是固定的,此时称为眼在手上,进行该类手眼标定时,会将标定板固定在一处,然后控制机械臂移动到不同位置,使用机械臂上固定的相机,在不同位置对标定板拍照,拍摄多组不同位置下标定板的照片。
在这里插入图片描述
由于标定板与机器人底座是固定的,二者之间相对位姿关系不变,则有:

T t b = T e 1 b T e 1 c 1 T c 1 t = T e 2 b T e 2 c 2 T c 2 t T^b_t = T^b_{e1}T^{e1}{c1}T^{c1}{t} = T^b_{e2}T^{e2}{c2}T^{c2}{t} Ttb=Te1bTe1c1Tc1t=Te2bTe2c2Tc2t

对上述等式进行变换

( T e 2 b ) − 1 T e 1 b T e 1 c 1 T c 1 t = T e 2 c 2 T c 2 t   ( T e 2 b ) − 1 T e 1 b T e 1 c 1 = T e 2 c 2 T c 2 t ( T c 1 t ) − 1   T e 2 e 1 T e 1 c 1 = T e 2 c 2 T c 2 c 1   T e 2 e 1 T e c = T e c T c 2 c 1   A H = H B (T^b_{e2})^{-1}T^b_{e1}T^{e1}{c1}T^{c1}{t} =T^{e2}{c2}T^{c2}{t} \ (T^b_{e2})^{-1}T^b_{e1}T^{e1}{c1} =T^{e2}{c2}T^{c2}{t}(T^{c1}{t})^{-1} \ T^{e2}{e1}T^{e1}{c1} =T^{e2}{c2}T^{c2}{c1} \ T^{e2}{e1}T^{e}{c} =T^{e}{c}T^{c2}{c1} \ AH = HB (Te2b)1Te1bTe1c1Tc1t=Te2c2Tc2t (Te2b)1Te1bTe1c1=Te2c2Tc2t(Tc1t)1 Te2e1Te1c1=Te2c2Tc2c1 Te2e1Tec=TecTc2c1 AH=HB

其中 T c e T^e_c Tce就是最终需要求解的 H H H

Eye To Hand

当相机固定在机械臂以外时,相机与末端执行器的相对位置会随着机械臂的运动而改变,此时称为眼在手外。进行该类手眼标定时,会将标定板固定在机械臂末端,然后控制机械臂拿着标定板,围绕着固定的相机拍照。为了求解的准确性,一般需要拍摄多于10组的照片。
在这里插入图片描述
由于此时标定板是固定在机械臂末端的,二者相对位置在拍摄不同照片时值不变,所以有:

T t e = T e 1 b T b c T c t 1 = T e 2 b T b c T c t 2 T^e_t = T^{e1}bT^{b}{c}T^{c}{t1} = T^{e2}bT^{b}{c}T^{c}{t2} Tte=Te1bTbcTct1=Te2bTbcTct2

T e 1 b T b c T c t 1 = T e 2 b T b c T c t 2   ( T e 2 b ) − 1 T e 1 b T b c T c t 1 = T b c T c t 2   ( T e 2 b ) − 1 T e 1 b T b c = T b c T c t 2 ( T c t 1 ) − 1   ( T e 2 b T e 1 b ) T b c = T b c ( T c t 2 T c t 1 )   A H = H B T^{e1}bT^{b}{c}T^{c}{t1} = T^{e2}bT^{b}{c}T^{c}{t2} \ (T^{e2}b)^{-1}T^{e1}bT^{b}{c}T^{c}{t1} = T^{b}{c}T^{c}{t2} \ (T^{e2}b)^{-1}T^{e1}bT^{b}{c} = T^{b}{c}T^{c}{t2}(T^{c}{t1})^{-1} \ (T^b_{e2}T^{e1}b)T^{b}{c} = T^{b}{c}(T^{c}{t2}T^{t1}_c) \ AH = HB Te1bTbcTct1=Te2bTbcTct2 (Te2b)1Te1bTbcTct1=TbcTct2 (Te2b)1Te1bTbc=TbcTct2(Tct1)1 (Te2bTe1b)Tbc=Tbc(Tct2Tct1) AH=HB

求解 A H = H B AH = HB AH=HB

作为机器人学的重要内容,从上世纪80年代起学术界就对手眼标定进行了大量研究,产生了许多 A H = H B AH = HB AH=HB求解方法,目前比较常用的是分步解法,即将方程组进行分解,然后利用旋转矩阵的性质,先求解出旋转,然后将旋转的解代入平移求解中,再求出平移部分。

常见的两步经典算法有将旋转矩阵转为旋转向量求解的Tsai-Lenz方法,基于旋转矩阵李群性质(李群的伴随性质)进行求解的Park方法等,接下来介绍Park方法。

Park方法求解旋转

原方程三个变量均为齐次变换矩阵(homogeneous transformation:将旋转和平移变换写在一个4x4的矩阵中),表示两个坐标系之间的变换,其基本结构为:

H = [ R t   0 1 ] H=\left[\begin{array}{cc} R & t \ 0 & 1 \end{array}\right] H=[Rt 01]

其中 R ∈ S O ( 3 ) R ∈ SO(3) RSO(3), t ∈ R 3 t ∈ \R^{3} tR3,分别对应旋转变换与平移变换。

原方程进行变换:

A H = H B   [ θ A b A   0 1 ] [ θ X b X   0 1 ] = [ θ X b X   0 1 ] [ θ B b B   0 1 ]   AH = HB \ \begin{array}{l} \left[\begin{array}{cc} \theta_{A} & b_{A} \ 0 & 1 \end{array}\right]\left[\begin{array}{cc} \theta_{X} & b_{X} \ 0 & 1 \end{array}\right] =\left[\begin{array}{cc} \theta_{X} & b_{X} \ 0 & 1 \end{array}\right]\left[\begin{array}{cc} \theta_{B} & b_{B} \ 0 & 1 \end{array}\right]\ \end{array} AH=HB [θAbA 01][θXbX 01]=[θXbX 01][θBbB 01] 

所以有(乘积结果旋转与平移部分对应位置相等):

θ A θ X = θ X θ B   θ A b X + b A = θ X b B + b X \begin{aligned} \theta_{A} \theta_{X} & =\theta_{X} \theta_{B} \ \theta_{A} b_{X}+b_{A} & =\theta_{X} b_{B}+b_{X} \end{aligned} θAθX=θXθB θAbX+bA=θXbB+bX

首先求解第一个只包含旋转矩阵的方程。

θ A θ X = θ X θ B   θ A = θ X θ B θ X T \begin{aligned} \theta_{A} \theta_{X} =\theta_{X} \theta_{B} \ \theta_{A} =\theta_{X} \theta_{B} \theta_{X}^T \end{aligned} θAθX=θXθB θA=θXθBθXT

旋转矩阵为SO3群,SO3群为李群,每一个李群都有对应的李代数,其李代数处于低维的欧式空间(线性空间),是李群局部开域的切空间表示,李群与李代数可以通过指数映射与对数映射相互转换:
在这里插入图片描述
对于旋转矩阵R,与对应的李代数**Φ **变换关系可以如下表示:

R = exp ⁡ ( Φ ∧ ) = exp ⁡ [ Φ ] R = \exp(Φ^{\wedge}) = \exp [Φ] R=exp(Φ)=exp[Φ]

其中[]符号表示^操作,及转为反对称矩阵,或者说叉积。

对于SO(3),其伴随性质为:

S O ( 3 ) SO(3) SO(3)伴随性质: R exp ⁡ ( ϕ ∧ ) R T = exp ⁡ ( ( R ϕ ) ∧ ) R\exp(\boldsymbol{\phi}^\wedge)R^T = \exp((R\boldsymbol{\phi})^\wedge) Rexp(ϕ)RT=exp((Rϕ))

θ A = θ X θ B θ X T exp ⁡ [ α ] = θ X exp ⁡ [ β ] θ X T exp ⁡ [ α ] = exp ⁡ [ θ X β ] α = θ X β \begin{aligned} \theta_{A} & =\theta_{X} \theta_{B} \theta_{X}^T \\ \exp [\alpha] & = \theta_{X}\exp [\beta]\theta_{X}^T \\ \exp [\alpha] & = \exp [\theta_{X}\beta] \\ \alpha &= \theta_{X}\beta \end{aligned} θAexp[α]exp[α]α=θXθBθXT=θXexp[β]θXT=exp[θXβ]=θXβ

当存在多组观测时,上述问题可以转化为如下最小二乘问题:

min ⁡ ∑ i = 1 k ∥ θ x / β i − α i ∥ 2 \min \sum_{i=1}^{k} \left\| \theta_{x/\beta_i} - \alpha_i \right\|^2 mini=1k θx/βiαi 2

α与β为对应旋转的李代数,它们都是三维向量,可以看作一个三维点,那么上述问题等同于一个点云配准问题:
η = ∑ i = 1 p ∥ Θ x i + b − y i ∥ 2 \eta = \sum_{i=1}^{p} \|\Theta x_i + b - y_i\|^2 η=i=1p∥Θxi+byi2
该问题有最小二乘解为:
θ X = ( M T M ) − 1 2 M T \theta_X = (M^T M)^{-\frac{1}{2}} M^T θX=(MTM)21MT
其中:
M = ∑ i = 1 k β i α i T M = \sum_{i=1}^{k} \beta_i \alpha_i^T M=i=1kβiαiT

Park方法求解平移

在求解得到旋转矩阵后,将旋转矩阵值代入第二个方程:

θ A b X + b A = θ X b B + b X θ A b X − b X = θ X b B − b A ( θ A − I ) b X = θ X b B − b A C b X = D \begin{aligned} \theta_{A} b_{X}+b_{A} & =\theta_{X} b_{B}+b_{X} \\ \theta_{A} b_{X} - b_{X} & =\theta_{X} b_{B}- b_{A} \\ (\theta_{A} - I)b_{X} & =\theta_{X} b_{B}- b_{A} \\ Cb_{X} &= D \end{aligned} θAbX+bAθAbXbX(θAI)bXCbX=θXbB+bX=θXbBbA=θXbBbA=D

其中C与D均为已知值,由于C不一定可逆,原方程做如下变换:
C b X = D C T C b X = C T D b X = ( C T C X ) − 1 C T D \begin{aligned} Cb_{X} &= D \\ C^TCb_{X} &= C^TD \\ b_{X} &= (C^TCX)^{-1}C^TD \end{aligned} CbXCTCbXbX=D=CTD=(CTCX)1CTD

即可求得平移部分。

当有多组观测值时
X = ( c 1 T c 1 + c 2 T c 2 + ⋯ + c n T c n ) − 1 ( c 1 T d 1 + c 2 T d 2 + ⋯ + c n T d n ) X = (c_1^T c_1 + c_2^T c_2 + \dots + c_n^T c_n)^{-1} (c_1^T d_1 + c_2^T d_2 + \dots + c_n^T d_n) X=(c1Tc1+c2Tc2++cnTcn)1(c1Td1+c2Td2++cnTdn)

α i = R i α i w + t i \alpha_i = R_i \alpha_i^w + t_i αi=Riαiw+ti

最终的解为:
H = [ θ X b X 0 1 ] \begin{aligned} H = \left[\begin{array}{cc} \theta_{X} & b_{X} \\ 0 & 1 \end{array}\right] \end{aligned} H=[θX0bX1]

OpenCV中的手眼标定方法及标定注意事项

手眼标定算法按照实现原理可以将所有方法分为三类:独立闭式解,同时闭式解,迭代方法

a.独立闭式解 (seperable closed-form solutions): 与位移分量分开求解旋转分量。

缺点: 旋转分量Rx的计算误差会被带入位移分量tx的计算中。

b.同时闭式解 (simultaneous closed-form solutions): 同时求解位移分量和旋转分量

缺点: 由于噪声的影响,旋转分量Rx的求解可能不一定是正交矩阵。因此,必须对旋转分量采取正交化步骤。然而,相应的位移分量没有被重新计算,这会导致求解错误。

c.迭代方法 (iterative solutions): 使用优化技术迭代求解旋转分量和平移分量。

缺点: 这种方式计算量可能很大,因为这些方法通常包含复杂的优化程序。此外,随着方程数量(n)变大,迭代解与封闭式解之间的差异通常会变小。因此,使用此方法前必须决定迭代解决方案的准确性是否值得计算成本。

OpenCV中的手眼标定接口

OpenCV主要实现了前两类方法,其中默认方法为TSAI。PARK,HORAUD也是独立解方法。ANDREFF,DANIILIDIS是同时闭式解,(从同一组数据实验中得到结论,认为独立解中TSAI方法求得解的误差较大)。

采集多组标定数据,传入相应的机械臂数据与摄像头标定板定位数据,就可以获得标定结果。
在这里插入图片描述

标定注意事项

标定注意事项
当新手进行第一次标定时,需要注意如下事项:
一:用calibrateCamera求标定板到相机的R,t,跟抓取用的内参不同,造成误差
二:标定板角点方向反了。默认从左到右,有时会出现从右到左,导致不在统一坐标系。
三:标定板面积过小,而且只在中心移动。会导致边缘不准。
四:标定时要旋转
五:图片太少。要10张以上
六。某些相机有问题,rgbd的变换矩阵要注意

评价手眼标定效果

通过测量几组不同位置的目标点,我们可以比较:

测量值:

P measure P_{\text{measure}} Pmeasure

和预测值:

P predict = T camera robot P camera P_{\text{predict}} = T_{\text{camera}}^{\text{robot}} P_{\text{camera}} Ppredict=TcamerarobotPcamera

之间的距离误差:

e r r = P measure − T camera robot P camera err = P_{\text{measure}} - T_{\text{camera}}^{\text{robot}} P_{\text{camera}} err=PmeasureTcamerarobotPcamera

通过计算各个点的误差的均值和标准差,最终我们可以计算出标定结果的系统误差(均值)和随机误差(标准差)。

SAM (Segment Anything Model)原理讲解

核心思想:从“分割什么”到“分割万物”
在 SAM 出现之前,图像分割模型通常是“专家模型”,它们被训练来分割特定的类别,比如“人”、“车”、“猫”等。如果你想分割一个训练时没见过的物体,它们通常会失败。

SAM 的核心思想是创建一个通用的、可提示的分割模型。它不关心物体 是 什么,只关心 在哪里。它的目标是,只要用户给出任何形式的提示(点、框、文本等),它就能准确地分割出对应的物体或区域。这被称为“提示分割” (Promptable Segmentation)。SAM 的强大通用性来自于其海量的训练数据 Meta AI 创建了一个名为 SA-1B 的数据集,其中包含 1100 万张图片和超过 10 亿个高质量的分割掩码。通过在这个庞大的数据集上进行训练,SAM 学会了识别和分割各种各样、闻所未闻的物体和结构,实现了“分割万物”的能力。

SAM 的架构可以看作由三个部分组成:图像编码器 (Image Encoder),提示编码器 (Prompt Encoder),掩码解码器 (Mask Decoder)

图像编码器 (Image Encoder)

  • 作用:这是 SAM 中最“重”的部分,负责“理解”整个图像。它采用了一个非常强大的视觉 Transformer (Vision Transformer, ViT) 模型(在您下载的模型中是 ViT-H)。
  • 过程:当输入一张图像时,图像编码器会对其进行复杂的计算,将其转换成一个包含丰富空间和语义信息的数字表示(称为特征嵌入)。这个过程只需要对每张图片执行一次,然后结果可以被重复使用。
  • 类比:可以把它想象成一位艺术家在绘画前对整个场景进行的彻底观察和构思,将所有细节和关系都记在脑子里。

提示编码器 (Prompt Encoder)

  • 作用:负责将用户的各种提示转换成模型能理解的数字表示(同样是特征嵌入)。
  • 支持的提示类型:
    - 点 (Points):在物体上点击一个或多个点(前景/背景)。
    - 框 (Bounding Boxes):在物体周围画一个大致的方框。
    - 掩码 (Masks):提供一个粗略的分割区域。
    - 文本 (Text):虽然原始 SAM 论文主要关注几何提示,但其架构可以扩展,通过与其他模型(如 CLIP)结合来理解文本提示。
  • 类比:如果图像编码器是艺术家,提示编码器就是翻译官,它把你用“点”或“框”下达的简单指令,翻译成艺术家能听懂的语言。

掩码解码器 (Mask Decoder)

  • 作用:这是 SAM 实现实时交互的关键。它非常轻量且高效。
  • 过程:解码器接收来自图像编码器的“大脑记忆”(图像特征)和来自提示编码器的“指令”(提示特征),然后迅速地计算出最终的、高质量的分割掩码(Mask)。
  • 优势:由于解码器非常快(毫秒级),它可以让你在图像上移动鼠标点或调整框时,实时地看到分割结果的变化,提供了极佳的交互体验。
  • 类比:艺术家(图像编码器)已经构思好了整个画面,当你(用户)通过翻译官(提示编码器)指出“我要这个杯子”时,艺术家(掩码解码器)几乎瞬间就能用画笔精确地勾勒出杯子的轮廓。

单目深度估计 (Monocular Depth Estimation) 原理讲解

  1. . 核心问题:从 2D 图像中恢复 3D 信息
    一张普通的照片是三维世界在二维平面上的投影。在这个过程中,一个至关重要的维度——深度(即物体离相机的远近)——丢失了。单目深度估计(Monocular Depth Estimation)就是利用人工智能,仅从单张 RGB 图像中,推断出这个丢失的深度信息。

  2. AI 如何“看见”深度:模仿人脑的视觉线索
    人脑可以很自然地从 2D 图像中感知深度,因为它利用了许多视觉线索。深度学习模型正是通过学习这些线索来完成任务的:

  • 相对大小 (Relative Size):同类物体,在视野中看起来越小,通常离得越远。
  • 遮挡 (Occlusion):如果物体 A 挡住了物体 B,那么 A 比 B 更近。
  • 纹理梯度 (Texture Gradient):远处的物体表面纹理(如草地、砖墙)会显得更加密集和模糊。
  • 线性透视 (Linear Perspective):平行的线条(如公路、铁轨)在远处会汇聚到一点。
  • 光影和阴影 (Shading and Shadows):光照在物体上形成的光影可以揭示物体的形状和相对位置。
  1. 深度学习模型的实现方法
    目前主流的深度估计模型通常采用有监督学习和编码器-解码器架构。
  • 训练数据:模型需要在一个大型数据集上进行训练。这个数据集包含成对的RGB 图像和它们对应的真实深度图。这些真实的深度图通常是用专业设备(如 LiDAR 激光雷达、立体相机)采集的。
  • 编码器-解码器架构 (Encoder-Decoder Architecture):
    • 编码器 (Encoder):与 SAM 类似,编码器负责从输入的 RGB 图像中提取特征。它像一个信息漏斗,逐层压缩图像,同时提取出从低级(边缘、角点)到高级(物体部件、纹理)的各种特征。正是在这个过程中,模型学会了识别上述提到的各种深度线索。
    • 解码器 (Decoder):解码器则与编码器相反。它接收编码器提取出的浓缩特征,然后逐层地将它们放大,最终“绘制”出一张与原图大小相同的深度图。解码器的每一层都会融合编码器对应层的特征,以确保最终的深度图既有丰富的细节,又有准确的全局结构。
  • 我们代码中使用的 DPT 模型:
    • 在之前的代码中,我们使用了 Intel/dpt-large 模型。DPT 的全称是 Dense Prediction Transformer。
    • 它的独特之处在于其编码器采用了强大的 Vision Transformer (ViT)。相比于传统的卷积网络(CNN),Transformer 更擅长捕捉图像中的全局依赖关系。例如,它能更好地理解整个场景的透视结构,从而对远处的物体做出更准确的深度判断。这使得 DPT 在深度估计任务上表现非常出色。
  1. 相对深度 vs. 绝对深度
    需要特别注意的是,大多数从单张图像进行深度估计的模型,输出的是相对深度图。
  • 什么是相对深度?:输出的深度图中,像素值的大小(或颜色)只表示“远近关系”。例如,一个像素值为 0.8 的点比像素值为 0.2 的点更远,但你不能直接说它就远 10 米。整个场景的深度被归一化到一个固定的范围(如 0 到 1)。
  • 为什么不是绝对深度?:从单张图片无法确定场景的真实尺度。一张小房子的照片和一张大房子的照片可能看起来完全一样。要获得以“米”为单位的绝对深度,通常需要额外的尺度信息或使用立体相机等硬件。

网站公告

今日签到

点亮在社区的每一天
去签到