机械臂与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包就可以了。

三、打印 Marker 标签

标定需要使用到的 Marker 标签,可以在 aruco_ros 包中找到提供好的 marker 标签进

行打印,如图:

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

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

四、修改ros包的配置

1、配置 aruco_ros 的 launch 文件

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

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

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

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

你可以打开一个新的终端,执行以下命令启动 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

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

标定步骤:

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

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

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

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

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

标定完成!!!!!!

相关推荐
sukalot15 分钟前
windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(二)
c++·windows
qianbo_insist37 分钟前
simple c++ 无锁队列
开发语言·c++
zengy538 分钟前
Effective C++中文版学习记录(三)
数据结构·c++·学习·stl
星汇极客1 小时前
【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)
stm32·单片机·嵌入式硬件·机器人
MinBadGuy1 小时前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
QuantumStack4 小时前
【C++ 真题】B2037 奇偶数判断
数据结构·c++·算法
结衣结衣.5 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐5 小时前
C++:静态成员
开发语言·c++
心怀花木5 小时前
【C++】多态
c++·多态
风清扬_jd5 小时前
Chromium 添加书签功能浅析c++
c++·chrome