【从零开始进行高精度手眼标定 eye in hand(小白向)1 原理推导】

news2024/11/22 21:38:32

从零开始进行高精度手眼标定 eye in hand(小白向)1 原理推导

  • 前言
  • 原理推导
    • 公式推导
    • 为什么在数据采集中至少需要两个位姿信息
  • MATLAB编程计算
    • A矩阵的计算和获取
    • matlab计算代码
    • B矩阵的计算和获取
    • matlab计算矩阵B

前言

最近由于组内的相关工作需求,需要进行机器人的高精度标定。原始的标定精度在6mm左右,虽然听起来是非常微小的偏差,但是由于研究方向手术机器人对精度要求极高。且在运动过程中,深度信息误差、畸变误差、机械误差、坐标系转换等一系列误差累积环节,将导致误差放大,因此远不能达到要求。

在经过了为其两周的研究和编程探索,最后成功将标定精度提升到0.5mm,达到了任务要求。

在研究和标定中,查阅了很多博客和相关资料,也踩了很多坑,作为也是小白的自己在研究和学习中发现当前的研究文献和博客最重要的问题是,没有从Tsai方法中AX=XB中,对A矩阵和B矩阵进行详细描述,也没有给出具体的计算代码和过程。默认读者已经搞清楚矩阵AB的物理意义和计算方式,对小白并不友好,笔者在进行手眼标定的过程中也经常由于计算错误A矩阵和B矩阵的左乘或右乘,得到错误的AB矩阵的输入数据,耽误了一些时间,因此在此记录

本系列的重点有三个:

  1. 原理中A,B矩阵的推导和代码计算
  2. Tsai轴角方法和四元数等二步计算方法的实现
  3. 基于非线性优化的高精度手眼标定方法的原理与代码实现

原理推导

公式推导

在这里插入图片描述

如图所示,这是一个使用标定板进行机械臂手眼标定的原理示意图

在其中存在着四个重要的坐标系:机械臂基点坐标系,末端坐标系,相机坐标系,标定板坐标系

这四个坐标系可以确定四个变换关系(矩阵)(在此默认读者已经知道坐标系和变换矩阵的相关基础知识),Tsai算法的核心思想:由于四个变换关系(矩阵)存在闭环因此可得乘积为单位矩阵:

在这里插入图片描述

在整个标定过程中机械臂末端和相机会在世界坐标系中运动,这也就意味着与机械臂末端和相机所在的变换关系将进行动态变化,因此**四个变换关系(矩阵)**中只有机械臂基点和标定板在世界坐标系中始终固定不变,因此在世界坐标系中不同的两个机械臂位姿,位姿1和位姿2中存在如下等式:

在这里插入图片描述

为什么在数据采集中至少需要两个位姿信息

在很多的文章和博客中会提到一个增量的概念,用于去除cal_H_base在计算中的影响。

刚看的时候很容易迷糊,但是实际原理非常易于理解,由于标定板到机械臂基点的变换矩阵cal_H_base无法精密测量属于未知量,而等式中end_H_cam为所求值也属于未知数,使用增量的核心思想可以转化为:一个等式无法求得两个未知数,因此需要两个不同的位姿状态得到两个等式,将变换矩阵cal_H_base消除。

即使用两个不同位姿之间的增量变换矩阵用于求解手眼变换矩阵。

核心思想:通过两个不同的位姿表示cal_H_base进行消除,从而建立等式,从而通过唯一一个等式得到标定矩阵end_H_cam:

在这里插入图片描述
至此完成对TSAI标定方法中的A,B矩阵的推导。

MATLAB编程计算

A矩阵的计算和获取

如核心公式中的计算,在手眼标定的运算过程中矩阵A实际上是机械臂两次位姿之间的变换矩阵,由机械臂自身的参数和DH方法可以知道由机械臂在不同位姿状态时末端到基座标系的变化矩阵。

自研机械臂这是最重要的运动学搭建部分,在购买的机械臂中绝大部分可以直接通过API进行获取,在此不多做赘述,等有空可能会补上。

在机械臂运行矩阵的获取中一般可以直接获取关于机械臂基点到末端执行器的变换矩阵,本系列的数据计算中,将每个机械臂位姿的静态变换矩阵Ta储存于txt文档内,命名为pos,储存格式如下图:
在这里插入图片描述
但是需要注意的是,以上数据并不是实际带入手眼标定矩阵中的实际运算数据这一点需要额外注意

matlab计算代码

部分代码,可单独使用直接计算

img_num = 10;
x = load("E:\研究生学习\手眼标定\IMG_20230516_5\pos.txt");  
pos = zeros(4,4,img_num);
% 各个点机械臂位姿变化矩阵
for i=1:1:img_num
    pos(:,:,i) = x(((4*(i-1)+1):4*i),:);
end
% 相邻机械臂位姿变化增量 
for i=1:1:img_num-1
    A_add(:,:,i)= pos(:,:,i)\pos(:,:,i+1);
end
% 矩阵拼接
A = [];
for i=1:1:img_num-1
    A(:,:,i) =  A_add(:,:,i);
end

在以上代码中会对两次的位姿矩阵进行一次矩阵除法,实际上就是n-1点位姿矩阵的逆于n点位姿矩阵的进行乘法

B矩阵的计算和获取

矩阵B是公式计算中的相机标定矩阵B,在此需要重点注意的是使用的变换矩阵是矩阵的外参矩阵,不需要再进行内参和畸变参数的左乘(鱼眼镜头除外)
像素坐标系到世界坐标系的关系如下:

像素坐标点x相机内参矩阵x相机畸变矫正矩阵x相机外参矩阵 = 世界坐标系实际位姿坐标

相机坐标系到世界坐标系的变换关系如下:

相机坐标系坐标x相机外参矩阵 = 世界坐标系实际坐标点

matlab标定的过程在此默认读者都会不在赘述,后面可能会填坑(很有可能不会)

而在实际的采集和计算系统之中,将对检测目标即标定板进行识别,标定板中的识别角点于相机中计算得到的变换矩阵即是由相机到世界的变换矩阵。

而在世界坐标系中的唯一变化量为两次变换中的外参矩阵变化量,其余的矩阵将由于增量变化不被考虑在计算中,将标定完成后的标定参数命名为calibrationSession进行保存,通过matlab的load函数直接进行读取并获取相关参数,计算增量矩阵B:

matlab计算矩阵B

%% 相机标定数据导入
load('calibrationSession0516_5.mat')
for i=1:1:img_num-1
    Rr1 = calibrationSession.CameraParameters.RotationMatrices(:,:,i);
    Rr2 = calibrationSession.CameraParameters.RotationMatrices(:,:,i+1);
    Tr1 = calibrationSession.CameraParameters.TranslationVectors(i,:);
    Tr2 = calibrationSession.CameraParameters.TranslationVectors(i+1,:);
    B_add = [Rr1' (Tr1/1000)';0,0,0,1]/[Rr2' (Tr2/1000)';0,0,0,1];
    B(:,:,i) = B_add;
end

传送门:
1.【从零开始进行高精度手眼标定 eye in hand(小白向)1 原理推导】
2.【从零开始进行高精度手眼标定 eye in hand(小白向)2 Tsai轴角法与四元数法编程实现】
3.【从零开始进行高精度手眼标定 eye in hand(小白向)3 非线性高精度标定法编程实现】

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

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

相关文章

pytorch中Dataset、Dataloader、Sampler、collate_fn相互关系和使用说明

参考: https://blog.csdn.net/Chinesischguy/article/details/103198921 参考: https://zhuanlan.zhihu.com/p/76893455 参考:https://blog.csdn.net/lilai619/article/details/118784730 参考:https://pytorch.org/docs/stabl…

06 【Vue数据监视 v-model双向绑定】

1.Vue数据监视 1.1 问题演示 先来个案例引入一下&#xff1a; <!-- 准备好一个容器--> <div id"root"><h2>人员列表</h2><button click"updateMei">更新马冬梅的信息</button><ul><li v-for"(p,inde…

Markdown笔记应用程序Note Mark

什么是 Note Mark Note Mark 是一种轻量、快速、简约&#xff0c;基于网络的 Markdown 笔记应用程序。具有时尚且响应迅速的网络用户界面。 安装 在群晖上以 Docker 方式安装。 ghcr.io 镜像下载 官方的镜像没有发布在 docker hub&#xff0c;而是在 ghcr.io&#xff0c;所以…

总结了几百个ChatGPT模型的调教经验,确定不来看看?

目录 前言 chatgpt调教指南 提示词 1.清晰的问题或请求&#xff1a; 2.上下文设置&#xff1a; 3.具体的主题或领域&#xff1a; 4.陈述性问题&#xff1a; 5.追问和澄清&#xff1a; 6.限定问题范围&#xff1a; 角色扮演 充当 Linux 终端 担任产品经理 充当 SQL…

技术帖——飞凌嵌入式RK3588开发板推理模型转换及测试

RKNN&#xff08;Rockchip Neural Network&#xff09;是一种用于嵌入式设备的深度学习推理框架&#xff0c;它提供了一个端到端的解决方案&#xff0c;用于将训练好的深度学习模型转换为在嵌入式设备上运行的可执行文件。使用RKNN框架可以在嵌入式设备上高效地运行深度学习模型…

易基因:DNA羟甲基化和TET酶在胎盘发育和妊娠结局中的作用 | 深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 胎盘是支持哺乳动物胚胎和胎儿发育所必需的临时器官。了解滋养层细胞分化和胎盘功能的分子机制可能有助于改善产科并发症的诊断和治疗。印迹基因是调控胎盘发育的基础&#xff0c;表观遗…

chatgpt赋能python:使用Python编写数据接口:如何让您的网站更具吸引力和效率

使用Python编写数据接口&#xff1a;如何让您的网站更具吸引力和效率 在当今数字时代&#xff0c;大多数公司都希望能够从用户生成的数据中收集和分析信息&#xff0c;以了解他们的客户群体并提高他们的营销策略。为此&#xff0c;开发数据接口成为了一项对于互联网公司不可或…

新文本检测算法TextFuseNet

TextFuseNet: Scene Text Detection with Richer Fused Features 自然场景中任意形状文本检测是一项极具挑战性的任务&#xff0c;与现有的仅基于有限特征表示感知文本的文本检测方法不同&#xff0c;本文提出了一种新的框架&#xff0c;即 TextFuseNet &#xff0c;以利用融合…

网络开发过程详细知识点

网络生命周期至少包括系统构思与计划、分析和设计、运行和维护的过程。 常见的迭代周期分为四阶段周期、五阶段周期、六阶段周期。 网络开发过程根据五阶段迭代周期模型可被分为五个阶段&#xff1a; 需求分析、现有网络分析、确定网络逻辑结构、确定网络物理结构、安装与维护。…

linux实践php8.2加laravel-cotane和swoole服务器

php8.2 composer -v 报错&#xff1a; Deprecation Notice: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in phar:///usr/bin/composer/vendor/symfony/console/Descriptor/TextDescriptor.php:290 解决方法可以升级下composer&#xff1…

计算机中小数的存储

十进制小数怎么转成二进制小数&#xff1f;怎么在计算机中存储float&#xff1f; 计算机中存储的二进制小数&#xff08;float&#xff09;怎么转成十进制小数&#xff1f;

法规标准-ISO 20900标准解读

ISO 20900是做什么的&#xff1f; ISO 20900全名为智能交通系统-部分自动泊车系统(PAPS)-性能要求和试验程序&#xff0c;其中主要是对PAPS系统的功能要求、性能要求及测试步骤进行了介绍 PAPS类型 I类型PAPS系统反应 II类型PAPS系统反应 一般要求 运行期间的最大速度 系统…

05 【绑定样式 条件渲染 列表渲染】

1.绑定样式 1.1 class样式 写法 :classxxx xxx可以是字符串、对象、数组。 所以分为三种写法:字符串写法、对象写法、数组写法。 1.1.1 字符串写法 字符串写法适用于: 类名不确定,要动态获取 <style>.normal{background-color: skyblue;} </style><!-- 准备…

DeSTSeg:用于异常检测的分割网络引导去噪学生教师模型(CVPR2023)

文章目录 DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection摘要本文方法Synthetic Anomaly GenerationDenoising Student-Teacher Network分割网络推理 实验结果消融实验 DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly D…

倾斜摄影三维模型数据的几何坐标变换与点云重建并行计算技术探讨

倾斜摄影三维模型数据的几何坐标变换与点云重建并行计算技术探讨 倾斜摄影三维模型数据的几何坐标变换和点云重建是一项大规模计算密集型任务&#xff0c;需要消耗大量的计算资源。并行计算技术可以将这些任务分解为多个子任务&#xff0c;并在多个CPU或GPU上同时运行&#xff…

一起学SF框架系列4.6-模块context-AbstractApplicationContext

org.springframework.context.ApplicationContext接口表示Spring IoC容器&#xff0c;负责实例化、配置和组装bean。容器通过读取配置元数据来获取关于实例化、配置和组装哪些对象的指令。配置元数据以XML、Java注释或Java代码表示。它允许您表达组成应用程序的对象以及这些对象…

微信小程序的登录流程

一、背景 传统的web开发实现登陆功能&#xff0c;一般的做法是输入账号密码、或者输入手机号及短信验证码进行登录。 服务端校验用户信息通过之后&#xff0c;下发一个代表登录态的 token 给客户端&#xff0c;以便进行后续的交互,每当token过期&#xff0c;用户都需要重新登…

深度学习训练营N1周:Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 NLP的功能&#xff1a; 本周使用AG News数据集进行文本分类。实现过程分为前期准备、代码实战、使用测试数据集评估模型和总结四个部分。…

chatgpt赋能python:Python冒泡排序详解

Python冒泡排序详解 介绍 Python是一门强大的编程语言&#xff0c;它在数据科学、机器学习、Web开发等领域都有广泛的应用。其中&#xff0c;排序算法是编程中一个重要的话题&#xff0c;冒泡排序也是最基本的排序算法之一。本文将详解Python冒泡排序的实现方法和优化技巧&am…

chatgpt赋能python:利用Python编写模拟器:一种循序渐进的方法

利用Python编写模拟器&#xff1a;一种循序渐进的方法 模拟器是一种用于模拟计算机硬件或软件的程序。它模拟了真实设备的功能&#xff0c;可以帮助开发人员进行测试和调试&#xff0c;以及提供一种环境来设计和验证新的算法和协议。Python是一种广泛使用的编程语言&#xff0…