手眼标定笔记

news2024/11/22 15:19:08

文章目录

    • 基本介绍:
    • 坐标系变换运算规则:
      • 关系运算说明:
      • 坐标系运算规则一:
      • 坐标系运算规则二:
      • 齐次坐标系:
      • 齐次坐标系下的坐标变换:
    • 眼在手外:
    • 眼在手内:
    • 解方程:
      • - Tais方法
    • 使用opencv完成手眼标定
      • 欧拉角变换为旋转矩阵:
      • 旋转矩阵变成欧拉角:
    • 易错点:

基本介绍:

  • 眼在手外(eye to hand):

    相机固定在机械臂以外的地方,主要标定相机和基底坐标系的转换矩阵。

  • 眼在手上(eye in hand):

    相机固定在机械臂末端,主要标定相机和机械臂末端的转换矩阵。

坐标系变换运算规则:

e n d b a s e R _{end}^{base}R endbaseR:机械臂末端坐标系到机械臂基底坐标系的旋转矩阵

e n d b a s e T _{end}^{base}T endbaseT:机械臂末端坐标系到机械臂基底坐标系的平移矩阵

e n d b a s e M = [ e n d b a s e R e n d b a s e T 0 1 ] _{end}^{base}M = \begin{bmatrix} _{end}^{base}R & _{end}^{base}T \\ 0 & 1 \end{bmatrix} endbaseM=[endbaseR0endbaseT1]:机械臂末端坐标系到机械臂基底坐标系变换矩阵

以上等价于:机械臂末端坐标系在基底坐标系下的描述

关系运算说明:

e n d b a s e R = b a s e e n d R − 1 e n d b a s e M = b a s e e n d M − 1 e n d b a s e T = { = − b a s e e n d T i f e n d b a s e R = b a s e e n d R = I ≠ − b a s e e n d T i f e n d b a s e R ≠ b a s e e n d R ≠ I _{end}^{base}R = ^{end}_{base}R^{-1} \\ _{end}^{base}M = ^{end}_{base}M^{-1} \\ _{end}^{base}T=\left\{ \begin{aligned} = & -^{end}_{base}T\quad if \quad_{end}^{base}R = ^{end}_{base}R = I \\ \neq & -^{end}_{base}T\quad if \quad _{end}^{base}R \neq ^{end}_{base}R \neq I \end{aligned} \right. endbaseR=baseendR1endbaseM=baseendM1endbaseT={==baseendTifendbaseR=baseendR=IbaseendTifendbaseR=baseendR=I
由于R是正交矩阵,正交矩阵的逆=正交矩阵的转置,所以有时候也会写为 e n d b a s e R = b a s e e n d R T ^{base}_{end}R = ^{end}_{base}R^T endbaseR=baseendRT

坐标系运算规则一:

假设有两个坐标系A,B,其中坐标系B中的点b是由坐标系A中的点a转换来的,则点a和点b之间有如下等式
a = B A R ∗ b + B A T b = A B R ∗ a + A B T a = {^A_B}R * b + {^A_B}T \\ b = {^B_A}R * a + {^B_A}T a=BARb+BATb=ABRa+ABT
由以上等式可以看出:
a = A B R − 1 ( b − A B T )     = A B R − 1 b − A B R − 1 A B T   = A B R − 1 b + B A T B A T = − A B R − 1 A B T a = {^B_A}R^{-1}(b-{^B_A}T) \\ \quad\quad\;\,= {^B_A}R^{-1}b-{^B_A}R^{-1}{^B_A}T\\ \,= {^B_A}R^{-1}b+{^A_B}T \\ {^A_B}T = -{^B_A}R^{-1}{^B_A}T a=ABR1(bABT)=ABR1bABR1ABT=ABR1b+BATBAT=ABR1ABT

坐标系运算规则二:

假设由三个坐标系A,B,C,已知如下关系: B A R , B A T , C B R , C B T {^A_B}R,{^A_B}T,{^B_C}R,{^B_C}T BAR,BAT,CBR,CBT,求 C A R , C A T {^A_C}R,{^A_C}T CAR,CAT

对于旋转矩阵 R R R: C A R = B A R ∗ C B R {^A_C}R = {^A_B}R*{^B_C}R CAR=BARCBR

对于平移矩阵 T T T: C A T = B A T + B A R    C B T {^A_C}T = {^A_B}T+{^A_B}R\;{^B_C}T CAT=BAT+BARCBT 形式麻烦!

齐次坐标系:

  1. 已知坐标系A下的点 a = ( x a , y a , z a ) T a = (x_a,y_a,z_a)^T a=(xa,ya,za)T,则点 a a a的齐次坐标系可以写成 a = ( x a , y a , z a , 1 ) T a = (x_a,y_a,z_a,1)^T a=(xa,ya,za,1)T
  2. 已知齐次坐标系下一点 p = ( a , b , c , d ) T p = (a,b,c,d)^T p=(a,b,c,d)T,则点 p p p的真实三维坐标为 p = ( a d , b d , c d ) T p = (\frac ad,\frac bd,\frac cd)^T p=(da,db,dc)T
  3. 齐次坐标系下的变换矩阵: B A M = [ B A R B A T 0 1 ] {^A_B}M = \begin{bmatrix} {^A_B}R & {^A_B}T \\ 0 & 1 \end{bmatrix} BAM=[BAR0BAT1]
  4. B A M = A B M − 1 {^A_B}M = {^B_A}M^{-1} BAM=ABM1

齐次坐标系下的坐标变换:

  1. 已知a,b,c分别为坐标系A,B,C下的齐次坐标,则有如下关系:
    a = B A M ∗ b b = C B M ∗ c a = B A M ∗ C B M ∗ c a = {^A_B}M * b\\ b = {^B_C}M * c\\ a = {^A_B}M * {^B_C}M *c a=BAMbb=CBMca=BAMCBMc

眼在手外:

求解目标:机械臂基底坐标系相机坐标系的变换矩阵 b a s e c a m e r a M ^{camera}_{base}M basecameraM

手眼标定坐标系表示:

  • 机械臂基底坐标系 – base
  • 机械臂末端坐标系 – end
  • 相机坐标系 – camera
  • 标定板坐标系 – board

image-20221112102012293

实现方法:

  1. 把标定板固定在机械臂末端
  2. 使用相机拍摄不同机械臂姿态下的标定板图片n张,n>3

则对每张图片可知: b a s e c a m e r a M =    b o a r d c a m e r a M ∗    e n d b o a r d M ∗    b a s e e n d M ^{camera}_{base}M = \;^{camera}_{board}M * \; ^{board}_{end}M * \;^{end}_{base}M basecameraM=boardcameraMendboardMbaseendM

变形得:

e n d b o a r d M =    b o a r d c a m e r a M − 1 ∗    b a s e c a m e r a M ∗    b a s e e n d M − 1 ^{board}_{end}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{base}M * \;^{end}_{base}M^{-1} endboardM=boardcameraM1basecameraMbaseendM1

其中:

b o a r d c a m e r a M : ^{camera}_{board}M: boardcameraM: 可由通过拍摄的标定板图片直接求解

b a s e e n d M : ^{end}_{base}M: baseendM: 可由机械臂末端位姿参数求得

e n d b o a r d M : ^{board}_{end}M: endboardM: 未知量,由于标定板固定在机械臂末端,所以对每组图片,该转换矩阵都相同

已知对每张图片:
e n d b o a r d M =    b o a r d c a m e r a M − 1 ∗    b a s e c a m e r a M ∗    b a s e e n d M − 1 ^{board}_{end}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{base}M * \;^{end}_{base}M^{-1} endboardM=boardcameraM1basecameraMbaseendM1
**则可以得到如下等式:**左乘 b o a r d c a m e r a M 2 ^{camera}_{board}M_2 boardcameraM2 右乘 b a s e e n d M 1 ^{end}_{base}M_1 baseendM1

image-20221016095850264

眼在手内:

求解目标:机械臂末端坐标系相机坐标系的变换矩阵 e n d c a m e r a M ^{camera}_{end}M endcameraM

手眼标定坐标系表示:

  • 机械臂基底坐标系 – base
  • 机械臂末端坐标系 – end
  • 相机坐标系 – camera
  • 标定板坐标系 – board

image-20221112102035770

实现方法:

  1. 把标定板放在固定位置不动
  2. 移动机械臂末端,从不同角度拍摄n张标定板图片

则对每张图片可知: e n d c a m e r a M =    b o a r d c a m e r a M ∗    b a s e b o a r d M ∗    e n d b a s e M ^{camera}_{end}M = \;^{camera}_{board}M * \; ^{board}_{base}M * \;^{base}_{end}M endcameraM=boardcameraMbaseboardMendbaseM

变形得:

b a s e b o a r d M =    b o a r d c a m e r a M − 1 ∗    e n d c a m e r a M ∗    e n d b a s e M − 1 ^{board}_{base}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{end}M * \;^{base}_{end}M^{-1} baseboardM=boardcameraM1endcameraMendbaseM1

其中:

b o a r d c a m e r a M : ^{camera}_{board}M: boardcameraM: 可由通过拍摄的标定板图片直接求解

b a s e e n d M : ^{end}_{base}M: baseendM: 可由机械臂末端位姿参数求得

b a s e b o a r d M : ^{board}_{base}M: baseboardM: 未知量,由于标定板全程固定在一个位置不动,所以对每组图片,该转换矩阵都相同

已知对每张图片:
b a s e b o a r d M =    b o a r d c a m e r a M − 1 ∗    e n d c a m e r a M ∗    e n d b a s e M − 1 ^{board}_{base}M = \;^{camera}_{board}M^{-1} * \;^{camera}_{end}M * \;^{base}_{end}M^{-1} baseboardM=boardcameraM1endcameraMendbaseM1
**则可以得到如下等式:**左乘 b o a r d c a m e r a M 2 ^{camera}_{board}M_2 boardcameraM2 右乘 e n d b a s e M 1 ^{base}_{end}M_1 endbaseM1

image-20221016102449883

解方程:

​ 无论是眼在手外还是眼在手内,都可以得到一个经典的方程组 A X = X B AX=XB AX=XB,这个方程组有n-1个方程 (n是拍摄的图片数量)

​ 其中X是我们要求得的手眼矩阵,里面有6个线性无关的变量,其中旋转3个自由度,平移3个自由度

- Tais方法

**形式变换:**由于A,B,X均为变换矩阵
A = [ R A T A 0 1 ] B = [ R B T B 0 1 ] X = [ R X T X 0 1 ] A = \begin{bmatrix} R_A & T_A \\ 0 & 1 \end{bmatrix} \qquad B = \begin{bmatrix} R_B & T_B \\ 0 & 1 \end{bmatrix} \qquad X = \begin{bmatrix} R_X & T_X \\ 0 & 1 \end{bmatrix} A=[RA0TA1]B=[RB0TB1]X=[RX0TX1]
A X = X B AX=XB AX=XB可以拆解成如下两个等式
{ R A R X = R X R B ( R A − 1 ) T X = R X T B − T A \left\{ \begin{aligned} R_AR_X & =R_XR_B \\ (R_A-1)T_X & =R_XT_B-T_A \\ \end{aligned} \right. {RARX(RA1)TX=RXRB=RXTBTA
Tais方法:先求解Rx,再求解Tx

旋转的表示:

​ **旋转矩阵:**3*3矩阵 R = R z R y R x R = R_zR_yR_x R=RzRyRx

旋转向量: r = ( x    y    z ) θ = n o r m ( r ) r = (x\;y\;z) \quad \theta = norm(r) r=(xyz)θ=norm(r)

​ 刚体绕旋转轴旋转, r r r表示的是旋转轴的方向, r r r的长度表示刚体绕旋转轴的角度

旋转角: θ = ( θ x    θ y    θ z ) \theta = (\theta_x \; \theta_y \; \theta_z) θ=(θxθyθz)

​ 旋转角又称欧拉角,一般情况下旋转角指的是坐标系绕x轴旋转后,再绕y轴旋转后,再绕z轴旋转分别的角度

使用opencv完成手眼标定

image-20221017164215645

image-20221017195838739

欧拉角变换为旋转矩阵:

R x ( θ x ) = [ 1 0 0 0 c o s θ x − s i n θ x 0 s i n θ x c o s θ x ] R y ( θ y ) = [ c o s θ y 0 s i n θ y 0 1 0 − s i n θ y 0 c o s θ y ] R z ( θ z ) = [ c o s θ z − s i n θ z 0 s i n θ z c o s θ z 0 0 0 1 ] R = R z R y R x R_x(\theta_x) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos\theta_x & -sin\theta_x \\ 0 & sin\theta_x & cos\theta_x\end{bmatrix} \\R_y(\theta_y) = \begin{bmatrix} cos\theta_y & 0 & sin\theta_y \\ 0 & 1 & 0 \\ -sin\theta_y & 0 & cos\theta_y\end{bmatrix} \\ R_z(\theta_z) = \begin{bmatrix} cos\theta_z & -sin\theta_z & 0 \\ sin\theta_z & cos\theta_z & 0 \\ 0 & 0 & 1\end{bmatrix}\\R = R_zR_yR_x Rx(θx)=1000cosθxsinθx0sinθxcosθxRy(θy)=cosθy0sinθy010sinθy0cosθyRz(θz)=cosθzsinθz0sinθzcosθz0001R=RzRyRx

旋转矩阵变成欧拉角:

R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] R = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33}\end{bmatrix} R=r11r21r31r12r22r32r13r23r33

θ Z = a t a n 2 ( r 21 , r 11 ) θ Y = a t a n 2 ( − r 31 , r 31 2 + r 33 2 ) θ X = a t a n 2 ( r 32 , r 33 ) \theta_Z = atan2(r_{21},r_{11}) \\ \theta_Y = atan2(-r_{31},\sqrt{r^2_{31}+r^2_{33}}) \\ \theta_X = atan2(r_{32},r_{33}) θZ=atan2(r21,r11)θY=atan2(r31,r312+r332 )θX=atan2(r32,r33)

solvePnP()

bool cv::solvePnP(InputArray	objectPoints,
				  InputArray	imagePoints,
				  InputArray	cameraMatrix,	// 相机内参
				  InputArray	distCoeffs,		// 相机畸变系数
				  OutputArray	rvec,			// R
				  OutputArray	objectPoints,	// T
				  bool			useExtrinsicGuess = false,
				  int			flags = SOLVEPNP_ITERATIVE)

易错点:

1. 利用calibrateCamera函数中计算的R、T,来作为标定板坐标系到相机坐标系的输入

​ 问题分析:对手眼标定来说,这个R、T没有问题。但是由于后续的抓取来说,使用的物体三维坐标是相机重建的点云,即相机之前标定的内参下的点云。此时手眼标定的相机坐标系和实际抓取使用的相机坐标系轻微的不一致,导致抓取总是有轻微误差。

2. 识别标定板角点方向反了!

​ 由于在建立棋盘格上的三维坐标系的时候,我们默认是从棋盘格左上角到右下角建立的,如果识别反了,则会有个别图片棋盘格识别的角点和输入的棋盘格三维坐标对应不上!

image-20221017205255737

本篇为观看b站视频的笔记
在此附上原视频地址:
手眼标定–原理与实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring学习第4篇:Spring 的依赖注入

大家家好,我是一名网络怪咖,北漂五年。相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也是经常会问到&…

数据结构 | 单链表

… 🌳🌲🌱本文已收录至:数据结构 | C语言 更多知识尽在此专栏中!文章目录🌳前言🌳正文🌲链表打印与销毁🪴打印🪴销毁🌲尾部插入与删除🪴节点申请&…

javaweb JAVA JSP销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上在线销售

JSP销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上在线销售

Linux基础 - 虚拟化介绍(KVM)

‍‍🏡博客主页: Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主 🌐所属专栏:『Linux基础』 🌌上期文章: Linux基础 - 服务管理(systemd) 📰如觉得博…

爬取医药卫生知识服务系统的药品数据——超详细流程

爬取医药卫生知识服务系统的药品数据——超详细流程 文章目录爬取医药卫生知识服务系统的药品数据——超详细流程前言一、寻找药品数据二、爬取药品ID1.资源获取2.数据提取3.资源保存4.主函数5.总体代码三、爬取药品信息1.加载资源ID2.获取数据3.数据提取4.保存信息5.主函数6.总…

SpringBoot-属性绑定和bean属性校验

目录 属性绑定 自定义类属性绑定 第三方bean属性匹配 规则:松散绑定(宽松绑定) Bean属性校验 属性绑定 属性绑定:我们可以使用配置文件对类的属性进行赋值绑定。 自定义类属性绑定 我们自定义一个类,在此使用yml文件进行类…

【滤波器】基于matlab实现微波带低通高通带通滤波器设计

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

python科研做图系列之雷达图

文章目录参考资料matplotlib库画的复现一个 pyecharts的雷达图尝试在上面的基础上,把pyecharts 导出存为一般的png图尝试在上面的基础上,把pyecharts 导出存为一般的矢量图用pygal画雷达图参考资料 参考知乎 CSDN给出了一些参数 matplotbib库雷达图官网 …

Python实现九九乘法表的几种方式,入门必备案例~超级简单~

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 们在学习Python的过程中需要不断的积累和练习,这样才能够走的更远, 今天一起来学习怎么用Python写九九乘法表~ 第一种方法:for-for 代码: for i in range(1, 10):for j in…

数据挖掘面试经总结【私人版,仅供参考】

1特征归一化 1.1为什么需要对数值类型的特征做归一化? 线性函数归一化零均值归一化 1.2在对数据进行预处理时,应该怎样处理类别型特征? 序号编码独热编码二进制编码 1.3什么是组合特征?如何处理高维组合特征? 例…

【python】云打印实现

这两天为了实现云打印功能找了很多相关的文章 记录一下这一篇,python云打印实现-朝花夕拾,代码通过监听文件夹有无产生新文件来判断是否执行,我尝试运行了下没问题,于是打算转载一下 程序运行结果 由于对方的代码和我实现的有点出…

【Maven】你好,Maven >>> 与Maven的初次见面~

个人主页:.29.的博客 学习社区:进去逛一逛~ 个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的道路上摸爬滚打,记录学习的过程~ 与Maven的初次见面~一、了解Maven二、Maven的…

Flink双流join导致数据重复

大家都知道flink sql 中 left join 数据不会互相等待,存在 retract 问题,会导致写入 kafka 的数据量变大,就会导致出现数据重复的问题。 举例:即常见的曝光日志流(show_log)通过 log_id 关联点击日志流&am…

SQL:数据去重的三种方法

1、使用distinct去重 distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数。用法注意: distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;只能在SELECT 语句中使用&#…

spring整合fastdfs客户端

解决Dependency ‘com.github.tobato:fastdfs-client:1.27.2’ not found 错误问题。 一、 将fastdfs客户端git下来 git https://github.com/happyfish100/fastdfs-client-java.gitcd fastdfs-client-java然后将fastdfs-client-java构建到本地maven仓库 mvn clean install&…

Pandas的数据结构

Pandas的数据结构 处理CSV 文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 Pan…

【强化学习】深入浅出强化学习--机器人找金币

文章目录Grid_mdp.py定义和初始化从环境状态构建观测值ResetStepRenderingClose注册环境参考文章Grid_mdp.py 定义和初始化 首先自定义环境,自定义的环境将继承gym.env环境。在初始化的时候,可以指定环境支持的渲染模式(例如human,rgb_arra…

项目实战 | YOLOv5 + Tesseract-OCR 实现车牌号文本识别

项目实战 | YOLOv5 Tesseract-OCR 实现车牌号文本识别 最近看到了各种各样的车牌识别,觉得挺有意思,自己也简单搞一个玩玩😼。 传统的图像处理算法我也不太会,就直接用深度学习的方法实现吧。 文章目录项目实战 | YOLOv5 Tesser…

docker基础篇——万字解读小鲸鱼

目录 前言 为什么会出现docker? 背景 docker理念 容器和虚拟机比较 容器发展简史 容器虚拟化技术 Why Docker docker的基本组成 镜像(image) 容器(container) 仓库(repository) 总结 第一个docker镜像——hello-world run干了什么 …

Spring Boot与Shiro实现权限管理04

1.实现用户管理 1.1 用户列表 首先创建dto,用于请求与响应数据的传输。在common包下创建dto包,在该包下创建UserDto.java类。 Data AllArgsConstructor NoArgsConstructor public class UserDto implements Serializable {private Integer id;private…