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

标定完成!!!!!!

相关推荐
应用市场8 小时前
Qt C++ 图形绘制完全指南:从基础到进阶实战
开发语言·c++·qt
青草地溪水旁8 小时前
设计模式(C++)详解—单例模式(2)
c++·单例模式
bkspiderx9 小时前
C++时区操作全版本指南(含C++03/C++11-17/C++20)
linux·开发语言·c++·c++20·时区
连合机器人9 小时前
智能清洁是未来趋势?机器人协作更便捷
科技·机器人
序属秋秋秋9 小时前
《C++进阶之STL》【哈希表】
数据结构·c++·stl·哈希算法·散列表·哈希表·哈希
青草地溪水旁10 小时前
设计模式(C++)详解——建造者模式(1)
c++·设计模式·建造者模式
自动驾驶小卡14 小时前
boost::circular_buffer的使用方法简介
c++·boost·circular_buffer
睡不醒的kun16 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
乔宕一18 小时前
stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常
c++·stm32·嵌入式硬件
SuperCandyXu18 小时前
P3205 [HNOI2010] 合唱队-普及+/提高
c++·算法·洛谷