机械臂与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

标定完成!!!!!!

 

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

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

相关文章

Kafka-文件存储机制

Kafka概述 Kafka-文件存储机制 1. 分区&#xff1a; Kafka中的每个主题&#xff08;topic&#xff09;都可以分成一个或多个分区。 Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。 分区是消息的基本单元&#xff0c;每个分区都是一个有序的log日志文件。 Pr…

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux网络配置全攻略&#xff1a;解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

整理好了!2024年最常见 20 道 Redis面试题(三)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Redis面试题&#xff08;二&#xff09;-CSDN博客 五、Redis 的持久化机制有哪些&#xff1f; Redis 是一个内存中的数据结构存储系统&#xff0c;它支持多种类型的数据结构&#xff0c;如字符串、哈希、列表、…

Kylin系列

Kylin是一个开源的分布式分析引擎&#xff0c;主要用于在Hadoop/Spark等大数据平台上提供高性能的SQL查询接口和OLAP&#xff08;联机分析处理&#xff09;能力&#xff0c;以支持超大规模数据的查询和分析。以下是关于Kylin系列的详细解释&#xff1a; 基本概念与原理&#x…

基于springboot实现的校园博客系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时&#xff0c;使用的用户名&#xff0c;可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…

c语言如何向文件读取字符串

如何在c语言中&#xff0c;读取文件&#xff0c;不用一个字符一个字符的读取&#xff0c;而是整个读取字符串 这里就用到fgets语句 fgets(str,n,fp) 它的功能是从fp指向的文件里读取一个长度为n-1的字符串&#xff0c;并一次性存入到str字符数组里&#xff0c;如果成功就返回…

Java Memorandum

Java Memorandum 1 定义安全的集合2 collection集合用迭代器删除元素时避免并发修改异常3 异常捕获4 RequestBody和RequestParam和Parameter区别4.1 RequestBody4.2 RequestParam4.3 Parameter 1 定义安全的集合 void old() {ArrayList<Apple> apples new ArrayList<…

无线网络安全技术基础

无线网络安全技术基础 无线网络安全风险和隐患 随着无线网络技术广泛应用,其安全性越来越引起关注.无线网络的安全主要有访问控制和数据加密,访问控制保证机密数据只能由授权用户访问,而数据加密则要求发送的数据只能被授权用户所接受和使用。 无线网络在数据传输时以微波进…

解决:git每次push or pull都要输入用户名和密码

到git工作目录执行以下命令 git config --global credential.helper store 然后再重新执行一次git pull,这次它还是提示你输入账号和密码&#xff0c;这次之后&#xff0c;它就会记录下账号和密码。以后再pull 或者push的时候&#xff0c;再也不用输入账户和密码了&#xff0…

数据访问层设计_6.连接对象管理设计

1.数据库连接管理 在基于JDBC的数据库应用开发中&#xff0c;数据库连接的管理是一个难点&#xff0c;因为它是决定该应用性能的一个重要因素。 对于共享资源&#xff0c;有一个很著名的设计模式——资源池。该模式正是为了解决资源频繁分配、释放所造成的问题。把该模式应用到…

Centos7.9安装卸载Docker

文章目录 1、官网安装1.1、卸载旧版本Docker1.2、通过rpm仓库安装1.2.1、设置仓库1.2.2、安装Docker Engine1.2.3、启动Docker1.2.4、验证安装 1.3、通过rpm软件包安装1.4、通过便捷脚本安装 2、yum安装2.1、安装docker-ce以及客户端2.2、启动docker2.3、配置镜像加速 3、卸载D…

Dubbo的发展历程与项目背景

项目背景 Dubbo起源于阿里巴巴内部&#xff0c;最初是为了解决日益增长的分布式服务调用需求而诞生的。在2011年前后&#xff0c;随着阿里巴巴集团业务的快速扩张&#xff0c;系统规模不断增大&#xff0c;传统的单体架构难以满足高并发、高可用的服务需求。因此&#xff0c;阿…

Linux安装刻录软件

在工作场景经常使用光盘和刻录机&#xff0c;在windows系统下有nero软件&#xff0c;在linux下有k3b,但是原始的k3b只能一次刻录&#xff0c;十分浪费光盘&#xff0c;这里我们使用经优麒麟优化过的刻录软件&#xff0c;实现多次追加刻录。 进入优麒麟软件仓库&#xff0c;需要…

vue3 watch里面可以await 么

在 Vue 3 中&#xff0c;watch 选项中的 handler 函数不支持 await 关键字。watch 用于监听数据的变化&#xff0c;并在变化时执行相应的回调函数。await 关键字只能在异步函数中使用&#xff0c;而 watch 中的 handler 函数默认不是异步函数。 如果你需要在 watch 中处理异步…

WorkManager使用技巧及各Android版本适配

WorkManager使用技巧及各Android版本适配 WorkManager是Android Jetpack中用于处理异步任务的库&#xff0c;它能够保证任务即使在应用关闭或设备重启后也能被执行。以下是WorkManager的使用技巧和代码示例&#xff0c;以及不同Android版本的适配方法。 1. 初始化WorkManager…

js前端---超级简单的版本号排序

问题&#xff1a; 封装一个函数进行版本号排序处理 思路&#xff1a; 1.使用数组自带sort方法&#xff1b; 2.需要将sort里面的只以点分割成数组&#xff1b; 3.判断数组长度&#xff0c;进行排序&#xff1b; 4.如果数组长度相同&#xff0c;在进行循环&#xff0c;两个数组…

项目管理—需求管理规程(软件研发过程标准,管理标准,标书技术编写,资质评审,安全管理体系,项目交付,实施运维,各类建设方案)

软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c;技术解…

30.包名的修改和新建后端模块

权限和第三方登录确实令人头疼,我们来学一点简单一点的。 另外,如果各位有属于自己的域名和ICP/IP备案,布置一个作业,自行实现第三方QQ登录。 我们所说的包名修改,是一次性修改ruoyi的全部包名,因为发现很多人有这样的需求,下载别人的代码,想要改成自己公司的包名,结…