机械臂与Realsense D435 相机的手眼标定ROS包

本教程主要介绍机械臂与 Realsense D435 相机手眼标定的配置及方法。

系统:Ubuntu 20.0.4
◼ ROS:Noetic
◼ OpenCV 库:OpenCV 4.2.0
◼ Realsense D435:librealsense sdk(2.50.0)、realsense-ros 功能包(2.3.2)
◼ Marker 标记识别:Aruco 功能包
◼ 手眼标定:easy_handeye 功能包
◼ Moveit!
◼ 机械臂 ROS 功能包(根据不同型号机械臂提供配套的 ROS 包,使用方法基本相同)

一、概述

手眼标定分两种情况:
        Eye-to-hand 眼在手外:标定的是相机坐标系相对于机器人基座坐标系的位姿。
        Eye-in-hand 眼在手上:标定的是相机坐标系相对于机器人工具坐标系的位姿
本教程主要介绍 Realsense D435 相机安装在机械臂外部即眼在手外的标定方法。

二、下载标定需要的ros包

1、aruco_ros包

mkdir eye_out_hand/src && cd eye_out_hand/src
//下载noetic版本的
git clone https://github.com/pal-robotics/aruco_ros.git

2、easy_handeye包

git clone https://github.com/IFL-CAMP/easy_handeye.git

3、realsense-ros包

//下载ros1版本的
git clone https://github.com/IntelRealSense/realsense-ros.git

4、机械臂控制包

 用自己对应的机械臂控制ros包就可以了。

3f7738b6bd9b430c92fa658624a63b6e.png

三、打印 Marker 标签

        标定需要使用到的 Marker 标签,可以在 aruco_ros 包中找到提供好的 marker 标签进
行打印,如图:

017f05d751604912a155c9246492f48e.png

         也可以到下面的网站下载maker标签并打印出来:  Online ArUco markers generator

46ed286726c5440581f8f5d3a665e486.png     注意:打印时,要选择原始大小,否则要测量一下打印出来的真实大小。

 四、修改ros包的配置

 1、配置 aruco_ros 的 launch 文件

        在 aruco_ros 功能包的 launch 目录下拷贝一份原有的 single.launch 文件,自己命一个名字,按下面的步骤修改里面的内容:

21a3c50b8e2946f39dc7344cad3d60eb.png

markerId:使用的 Marker 标签的 ID,这里在准备时打印的 Marker 标签 ID 为 582
markerSize:Marker 标签的实际大小,单位为 m,这里在准备时打印的 Marker 标签实际大小为 5 厘米即 0.05m
ref_frame:参考坐标系名称,这里选择 Realsense 的 camera_color_frame 作为参考坐标系
<remap from="/camera_info" to="/camera/color/camera_info" />:将/camera_info 重映射为对应 Realsense实际发布的相应的 Topic 即/camera/color/camera_info
<remap from="/image" to="/camera/color/image_raw" />:将/image 重映射为对应 Realsense 实际发布的相应的 Topic 即/camera/color/image_raw
camera_frame:相机坐标系,修改为实际的相机坐标系 camera_color_frame

2、配置 easy_handeye 标定的 launch 文件

        在 easy_handeye 功能包的 launch 目录下新建一个eye_in_hand_calibrate.launch文件。在里面添加

<?xml version="1.0" ?>
<launch>
    <!-- 生成标定文件的名称 -->
    <arg name="namespace_prefix" default="rm_rs_d435" />
    <!-- 机械臂 MoveIt!配置的 move_group 为 arm,所以修改为 arm -->
    <arg name="move_group" default="arm" /> 
    <!-- start easy_handeye -->
    <include file="$(find easy_handeye)/launch/calibrate.launch" >
        <arg name="namespace_prefix" value="$(arg namespace_prefix)" />
        <arg name="move_group" value="$(arg move_group)" />
        <!-- 这里使用眼在手上的方式进行标定,所以此处改成 true -->
        <arg name="eye_on_hand" value="true" />
        <!--tracking_base_frame 为 realsense 的相机坐标系-->
        <arg name="tracking_base_frame" value="camera_color_frame" />
        <!--tracking_marker_frame 对应 aruco_ros 包中 single_realsense.launch 中的     marker_frame 的值-->
        <arg name="tracking_marker_frame" value="aruco_marker_frame" />
        <!--robot_base_frame 为机器人基座坐标系-->
        <arg name="robot_base_frame" value="base_link" />
        <!--robot_effector_frame 为工具坐标系,如夹爪,吸盘等-->
        <arg name="robot_effector_frame" value="Link6" />
        <arg name="freehand_robot_movement" value="false" />
        <arg name="robot_velocity_scaling" value="0.5" />
        <arg name="robot_acceleration_scaling" value="0.2" />
    </include>
</launch>

五、开始标定

1、编译

cd ~/catkin_ws
catkin build

2、启动 Realsense 节点

cd ~/catkin_ws
source devel/setup.bash
roslaunch realsense2_camera rs_camera.launch

 62a2b9761d364ed19f8b86abd4bd4912.png

 3、启动aruco_ros节点识别maker标签

cd ~/catkin_ws
source dev/setup.bash
roslaunch aruco_ros single.launch

bc2a28398a814f7091bc0188d9b5e753.png

         你可以打开一个新的终端,执行以下命令启动 image_view 订阅/aruco_single/result 显示图像:

cd ~/catkin_ws
source dev/setup.bash
rosrun image_view image_view image:=/aruco_single/result

4、启动你的机械臂控制节点 

        根据你自己的机械臂控制功能包,运行就可以了。

5、启动 easy_handeye 手眼标定节点

cd ~/catkin_ws
source dev/setup.bash
roslaunch easy_handeye eye_in_hand_calibrate.launch

        成功运行后,会同时打开三个界面: 5c159ed1974c4c58ae3c077e96f8dabe.png

737e99a5fce94010b93a320be9a666a4.png

75781a0475a341e2b2c73c72eacc11fc.png

 标定步骤:

a、在图3 中,点击 Check starting pose,稍微等待,若检查成功,界面会出现:0/17,Ready to start,如下图所示(如果检测失败或者没有出现 0/17,则说明当前机械臂的姿态不合适,可能有规划不可达,需要关闭标定节点然后调节机械臂到一个合适姿态并将 aruco 二维码移动至相机视野中心处附近再重启启动标定节点继续标定):

7c33b4385b204e6e8005a3b114a0c455.png

 b、在图3中依次点击 Next Pose,Plan,Execute,机械臂会移动至新的位置,若二维码完全的在相机视野范围内,且能检测成功,则进行下一步,若二维码不在相机视野范围内或部分在视野外,检测不到,则再次依次点击 Next Pose,Plan,Execute,直到二维码完全在相机视野范围内,且能检测成功,再进行下一步,如下图所示:

abc4744475784db9b0f8cc4dd106509c.png

 c、在图2 中点击 Take Sample,若 Samples 对话框中出现有效信息,说明第一个点标定成功 1d3197543d184f34826a9cd36a575393.png

d、重复执行步骤 2 和步骤 3,直至 17 个点全部标定完毕

e、在图2 中点击 Compute,则 Result 对话框中会出现结果,点击Save,会将结果保存为一个 YAML 文件,路径为 ~/.ros/easy_handeye

250ccf0227e84630835c7bf4adbe28cd.png

标定完成!!!!!!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【map、set】C++用红黑树来封装map、set容器

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解map和set之用红黑树来封装map、set容器的相关内容。 如果看到最后您…

资料防拷贝该如何实现?数据防拷贝的方法有哪些

数据安全和隐私保护成为企业和个人关注的重点。电脑中存储的资料往往包含了重要的商业机密、个人隐私或其他敏感信息。 因此&#xff0c;如何有效防止他人非法拷贝电脑资料&#xff0c;成为了一个亟待解决的问题。 本文将探讨数据防拷贝的方法&#xff0c;以帮助企业和个人保护…

22-LINUX--多线程and多进程TCP连接

一.TCP连接基础知识 1.套接字 所谓套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程…

Map遍历、反射、GC

map的遍历 用foreach遍历 HashMap<Character,Integer> map new HashMap<>();map.put(A,2);map.put(B,3);map.put(C,3);for (Map.Entry<Character,Integer> entry: map.entrySet()) {char key entry.getKey();int value entry.getValue();System.out.prin…

CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

题目截图 题目翻译 题目分析 正难则反&#xff0c;考虑所有不符合的例子 由于n很小&#xff0c;所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子&#xff0c;假设其中第i个不符合&#xff0c;那么就消耗掉fi 1个球 以此类推&#xff0c;减剩下s2个球 这时…

Android正向开发实现客户端证书认证

前言 如果第三方模块被混淆,那hook方式均不能生效。这时就需要根据系统包去定位校验的函数,因此需要对安卓开发者是如何实现客户端证书校验的有一定了解,接下来就介绍这部分内容。 开发者实现客户端证书校验的本质是:证书/密钥 + 代码。 在形式上有:证书校验、公钥校验和…

Anthropic绘制出了大型语言模型的思维图:大型语言模型到底是如何工作

今天&#xff0c;我们报告了在理解人工智能模型的内部运作方面取得的重大进展。我们已经确定了如何在 Claude Sonnet&#xff08;我们部署的大型语言模型之一&#xff09;中表示数百万个概念。这是对现代生产级大型语言模型的首次详细了解。这种可解释性的发现将来可以帮助我们…

Hadoop 客户端 FileSystem加载过程

如何使用hadoop客户端 public class testCreate {public static void main(String[] args) throws IOException {System.setProperty("HADOOP_USER_NAME", "hdfs");String pathStr "/home/hdp/shanshajia";Path path new Path(pathStr);Confi…

AWS安全性身份和合规性之Artifact

AWS Artifact是对您很重要的与合规性相关的信息的首选中央资源。AWS Artifact是一项服务&#xff0c;提供了一系列用于安全合规的文档、报告和资源&#xff0c;以帮助用户满足其合规性和监管要求。它允许按需访问来自AWS和在AWS Marketplace上销售产品的ISV的安全性和合规性报告…

当他们在说业务的时候,到底在说什么

业务就是通过提供产品和服务给客户&#xff0c;以获取某种价值&#xff0c;形成业务闭环&#xff0c;并能自负盈亏。 文章会以生动形象的比喻来介绍业务到底是什么。 什么是业务&#xff1f; 业务&#xff0c;就像一场精彩的舞台剧&#xff0c;每个角色都有自己的任务和目标…

PHP生成二维码+二维码包含logo图片展示

composer require chillerlan/php-qrcode 用到的扩展自己安装&#xff08;注&#xff1a;只生成二维码只要开gd扩展就行&#xff09; 仅生成二维码看这个&#xff1a; use chillerlan\QRCode\QRCode;public function QRCode(){$qrcode new QRCode();$url "http://ww…

新建项目上传gitee

1.在项目根目录下打开黑窗口执行初始化 git init2.复制码云上新建仓库地址 3.本地仓库和远程仓库建立连接 远程仓库地址是之前复制的仓库地址&#xff0c;复制后直接在命令窗口中鼠标右键Paste即可在命令窗口粘贴出来 git remote add origin 远程仓库地址4.每次上传之前先更…

工厂模式(简单工厂模式+工厂模式)

工厂模式的目的就是将对象的创建过程隐藏起来&#xff0c;从而达到很高的灵活性&#xff0c;工厂模式分为三类&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 在没有工厂模式的时候就是&#xff0c;客户需要一辆马车&#xff0c;需要客户亲自去创建一辆马车&#xff0c;…

uniapp-自定义navigationBar

封装导航栏自定义组件 创建 nav-bar.vue <script setup>import {onReady} from dcloudio/uni-appimport {ref} from vue;const propsdefineProps([navBackgroundColor])const statusBarHeight ref()const navHeight ref()onReady(() > {uni.getSystemInfo({success…

Qt---录音

1.获取麦克风阵列&#xff1a; QList<QAudioDeviceInfo> infos QAudioDeviceInfo::availableDevices(QAudio::AudioInput);for (int i 0; i < infos.count(); i){qDebug() << infos.at(i).deviceName();} "麦克风阵列 (Realtek(R) Audio)" 2.QAudio…

利用开源工具创建WEBGIS应用

在本文中&#xff0c;我们将大致说明利用开源工具如何与服务器交互以构建交互式或动态 Web GIS。 WebGIS 应用程序已成为展示地理数据的重要模式。我们现在拥有允许用户交互的机制&#xff0c;以便用户可以选择数据&#xff0c;甚至修改或添加新数据。 什么是WEBGIS? 通过网络…

大创项目推荐 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

用markdown(typora)画系统框图或系统结构图

markdown本身是不支持画系统框图或系统结构图的&#xff1b;但是可以参考excel的语法格式&#xff0c;用合并单元格填充背景色&#xff0c;来实现我们预期的效果&#xff1b; 源代码是html语法&#xff0c;如果有其它需求也可以自己搜索html语法&#xff0c;进行优化 <ta…

netcat一键开始瑞士军刀模式(KALI工具系列五)

目录 1、KALI LINUX简介 2、netcat工具简介 3、在KALI中使用netcat 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 测试某IP的端口是否打开 4.2 TCP扫描 4.3 UDP扫描 4.4 端口刺探 4.5 直接扫描 5、即时通信 5.1 单击对话互联 5.2 传…

单向无头链表实现

目录 1. 为什么要有链表&#xff1f; 2. 链表的种类 3. 具体功能实现 &#xff08;1&#xff09;节点结构体定义 &#xff08;2&#xff09;申请节点 &#xff08;3&#xff09;尾插 &#xff08;4&#xff09;尾删 &#xff08;5&#xff09;头插 &#xff08;6&#…