【手眼标定】ros/easy_handeye+ur5e+realsense D435i(eye on/to hand)

2023-10-18 04:20

本文主要是介绍【手眼标定】ros/easy_handeye+ur5e+realsense D435i(eye on/to hand),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

此前有尝试过使用Matlab Tsai原理标定珞石工业机械臂,效果不是很好,也没有找到原因在哪里。终于来了北京实验室可以用UR5e在ROS框架下使用easy_handeye标定了,十分简洁哈哈哈哈哈


提示:以下是内容严重参考链接:https://zhuanlan.zhihu.com/p/92339362
十分感谢前人大佬的分享

0. 手眼标定原理

参考大佬深入浅出的解释

重点:

  • Eye-to-hand 眼在手外:标定的是相机坐标系相对于机器人基座坐标系的位姿
  • Eye-in-hand 眼在手上:标定的是相机坐标系相对于机器人工具坐标系的位姿
  • 自己总结的标定原则
    • 确定哪些是已知的?哪些是未知的?哪些是变化的?哪些是不变的?哪些是需要求解的?哪些是不需要求解的?
    • 标定的是未知且不变的 TF(Transformation)
    • 恒等式关系
      • eye-to-hand:相机坐标系 <> 机器人基座坐标系(未知,不变,需要求解)
      • eye-in-hand:Marker坐标系 <> 机器人基座坐标系(未知,不变,不需要求解)

1. 安装相应依赖驱动库

# 创建catkin_workspace
mkdir calibration_catkin_workspace
cd calibration_catkin_workspace
mkdir src
cd src# 下载机械臂驱动
git clone https://github.com/UniversalRobots/Universal_Robots_ROS_Driver.git Universal_Robots_ROS_Driver
git clone -b calibration_devel https://github.com/fmauch/universal_robot.git fmauch_universal_robot
# aruco
git clone -b noetic-devel https://github.com/pal-robotics/aruco_ros.git
# vision_visp
git clone -b noetic-devel https://github.com/lagadic/vision_visp.git
# easy_hand_eye
git clone https://github.com/IFL-CAMP/easy_handeye# 下载依赖
cd ..
sudo apt update
rosdep update
rosdep install --from-paths src --ignore-src -y
# empy
pip install empy
# pyqt
pip install PyQt5# 编译
catkin_make
# 切换环境
source ./devel/setup.bash

2. 开始标定(eye on/to hand)

2.1 标定Launch文件设置

标定过程需启动 ur5 机械臂的相关节点,realsense 节点,aruco 节点,easy_handeye 节点,可以写一个 launch 文件同时启动上述节点,也可以分别启动。easy_handeye 包中给出了用一个 launch 文件实现的示例,在如下的目录中:
xxx/easy_handeye/docs/example_launch/ur5_kinect_calibration.launch
在示例下修改,easy_handeye/easy_handeye/launch/中新建launch文件eye_on_hand_calibration.launch,内容如下:


```cpp
```cpp
<launch><arg name="namespace_prefix" default="ur5_realsense_handeyecalibration" /><arg name="robot_ip" doc="The IP address of the UR5 robot" /><arg name="marker_size" doc="Size of the ArUco marker used, in meters" default="0.1" /><arg name="marker_id" doc="The ID of the ArUco marker used" default="571"/><!-- 1. start the Realsense435 --><include file="$(find realsense2_camera)/launch/rs_camera.launch" /><!-- 2. start ArUco --><node name="aruco_tracker" pkg="aruco_ros" type="single"><remap from="/camera_info" to="/camera/color/camera_info" /><remap from="/image" to="/camera/color/image_raw" /><param name="image_is_rectified" value="true"/><param name="marker_size"        value="$(arg marker_size)"/><param name="marker_id"          value="$(arg marker_id)"/><param name="reference_frame"    value="camera_color_frame"/><param name="camera_frame"       value="camera_color_frame"/><param name="marker_frame"       value="camera_marker" /></node><!-- 3. start the robot --><include file="$(find ur_robot_driver)/launch/ur5e_bringup.launch"><arg name="robot_ip" value="101.6.64.35" /></include><include file="$(find ur5e_moveit_config)/launch/ur5e_moveit_planning_execution.launch"></include><!-- 4. start easy_handeye --><include file="$(find easy_handeye)/launch/calibrate.launch" ><arg name="namespace_prefix" value="$(arg namespace_prefix)" /><arg name="eye_on_hand" value="true" /><arg name="tracking_base_frame" value="camera_color_frame" /><arg name="tracking_marker_frame" value="camera_marker" /><arg name="robot_base_frame" value="base" /><arg name="robot_effector_frame" value="tool0_controller" /><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>为启动相机节点
  • <2>启动aruco_ros节点,需要提前打印标定纸,网站
    • 注:Dictionary 一定要选 Original ArUco;Marker ID 和 Marker size 自选,在launch 文件中做相应的修改;打印时,要选择原始大小,否则要测量一下打印出来的真实大小。
  • <3>UR5e节点,设计连接IP并开启moveit路径规划
  • <4>easy_handeye节点
    • eye_on_hand的参数值为true则代表眼在手上
    • tracking_base_frame为相机坐标系camera_color_frame
    • robot_base_frame为机器人基坐标系,示例中为base_link,前辈避坑改为了base【未验证】
    • robot_effector_frame是工具坐标系,使用了robotiq,在示教器中定义了该夹具,为tool0_controller

2.2 开始标定

  1. 启动launch文件,如果正常会弹出三个界面(rviz和两个弹窗)
roslaunch easy_handeye eye_on_hand_calibration.launch
  1. 在rviz中添加image,topic选择result方便观察标定板位置
  2. 手动调节机械臂,使 aruco 二维码移动至相机视野中心处附近,作为 home config。在界面 3 中,点击 check starting pose,若检查成功,界面会出现: 0/17,ready to start
  3. 界面 3 中依次点击 Next Pose,Plan,Execute,机械臂会移动至新的位置,若二维码在相机视野范围内,且能检测成功,则进行下一步
  4. 界面 2 中点击 Take Sample,若 Samples 对话框中出现有效信息,说明第一个点标定成功
  5. 重复执行步骤 2 和步骤 3,直至 17 个点全部标定完毕
  6. 界面 2 中点击 Compute,则 Result 对话框中会出现结果
  7. 界面 2 中 Save,会将结果保存为一个 YAML 文件,路径为 ~/.ros/easy_handeye

2.3 发布tf验证

easy_handeye 功能包提供了 publish.launch 文件,可以将标定好的 TF 发布出
注:要修改 “namespace_prefix” 参数,与眼在手外标定 launch 文件中的 “namespace_prefix” 一致,这样才能找到标定好的 YAML 文件,并且同样修改eye_on_hand为True

<?xml version="1.0"?>
<launch><arg name="eye_on_hand" doc="eye-on-hand instead of eye-on-base" default="true"/><arg name="namespace_prefix" default="ur5_realsense_handeyecalibration" /><arg if="$(arg eye_on_hand)" name="namespace" value="$(arg namespace_prefix)_eye_on_hand" /><arg unless="$(arg eye_on_hand)" name="namespace" value="$(arg namespace_prefix)_eye_on_base" /><!--it is possible to override the link names saved in the yaml file in case of name clashes, for example--><arg if="$(arg eye_on_hand)" name="robot_effector_frame" default="" /><arg unless="$(arg eye_on_hand)" name="robot_base_frame" default="" /><arg name="tracking_base_frame" default="" /><arg name="inverse" default="false" /><!--publish hand-eye calibration--><group ns="$(arg namespace)"><param name="eye_on_hand" value="$(arg eye_on_hand)" /><param unless="$(arg eye_on_hand)" name="robot_base_frame" value="$(arg robot_base_frame)" /><param if="$(arg eye_on_hand)" name="robot_effector_frame" value="$(arg robot_effector_frame)" /><param name="tracking_base_frame" value="$(arg tracking_base_frame)" /><param name="inverse" value="$(arg inverse)" /><node name="$(anon handeye_publisher)" pkg="easy_handeye" type="publish.py" output="screen"/></group>
</launch>

标定结果TF发布如下:可以看出二者还是有一些旋转角度,平移自不用说,至于精度如何,后面有时间看能不能测试一下。
在这里插入图片描述

# 开启 publish.luanch 文件,以眼在手上为例
roslaunch easy_handeye publish.launch# 查看 TF(改成自己的工具坐标系与相机坐标系)
rosrun tf tf_echo /tool0_controller /camera_color_frame

在这里插入图片描述

Question

尝试标定相机和tool0(而非tool0_controller),tool0即末端法兰,结果误差很大,在旋转角度上明显不对,不知道原因

在这里插入图片描述在这里插入图片描述

参考:
https://zhuanlan.zhihu.com/p/33441113
https://zhuanlan.zhihu.com/p/63757762
https://blog.csdn.net/txy12029047/article/details/99323620
https://blog.csdn.net/ecH0o0/article/details/95245858
https://zhuanlan.zhihu.com/p/92339362

这篇关于【手眼标定】ros/easy_handeye+ur5e+realsense D435i(eye on/to hand)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230152

相关文章

ROS - C++实现RosBag包回放/提取

文章目录 1. 回放原理2. 回放/提取 多个话题3. 回放/提取数据包,并实时发布 1. 回放原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv,

LibSVM学习(六)——easy.py和grid.py的使用

我们在“LibSVM学习(一)”中,讲到libSVM有一个tools文件夹,里面包含有四个python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。其实,网上也有相应的说明,但很不系统,下面结合本人的经验,对使用方法做个说明。        这两个文件都要用python(可以在http://www.python.org上下载到,需要安装)和绘图工具gnup

ROS - C++实现RosBag包录制

文章目录 1. 录制原理2. 录制多个话题3. 订阅ROS消息,实时录制 1. 录制原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv, "reco

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本 基于Ubuntu 16.04 LTS系统所用ROS版本为 Kinetic hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 1.安装依赖库 所需系统及依赖库 Ubuntu 16.04|ros-kinetic|Gazebo|gazebo_ros_pkgs|ge

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本 基于Ubuntu 14.04 LTS系统所用ROS版本为 Indigo hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 备注:两种安装方式可选:install the binary packages | install the source files

解析apollo纵向控制标定表程序

百度apollo采用标定表描述车辆速度、加速度与油门/刹车之间的关系。该表可使无人车根据当前车速与期望加速度得到合适的油门/刹车开合度。除了文献《Baidu Apollo Auto-Calibration System - An Industry-Level Data-Driven and Learning based Vehicle Longitude Dynamic Calibrating

11991 - Easy Problem from Rujia Liu?

题意: 输入一串整型数列,再输入两个数k,v,输出第k个v的序号。不存在则输出0,如第一个样例 8 41 3 2 2 4 3 2 11 3 //第1个3,序号为2,输出22 4 //第2个4,不存在,输出03 2 //第3个2,序号为7,输出74 2 思路: struct num {

Ubuntu20.04+ros-noetic配置Cartographer

一、概述         因为要配置激光SLAM,Cartographer属于激光雷达SLAM 中比较经典的一款,在学习之前先将其在Ubuntu20.04首先配置出来并成功运行demo。 二、具体操作 (一)概述         使用平台是Windows的wsl2上的Ubuntu20.04子系统,双系统与虚拟机的安装原理与这个相同。主要依照的安装操作是官方文档,链接如下所示。 Runni

【开发工具】开发过程中,怎么通过Easy JavaDoc快速生成注释。

文章目录 引言什么是Easy JavaDoc?Easy JavaDoc用来干什么?如何使用Easy JavaDoc?安装Easy JavaDoc配置Easy JavaDoc使用Easy JavaDoc生成注释 Easy JavaDoc与IDEA自带注释的区别IDEA自带注释Easy JavaDoc Easy JavaDoc的优缺点优点缺点 步骤 1:打开设置步骤 2:找到Easy JavaD