Bootstrap

#Easy Handeye配置

一,配置环境

硬件:
UR5工业机器人
Kinect V2

1.ROS安装

参考 https://blog.csdn.net/qq_32618327/article/details/89736314

2.ROS创建工作空间

#创建src文件,放置功能包源码:

mkdir -p ~/handeye/src
#进入src文件夹: 

cd ~/handeye/src
#初始化文件夹:

 catkin_init_workspace
#这样就在src文件中创建了一个 CMakeLists.txt 的文件,目的是告诉系统,这个是ROS的工作空间。

3.安装ur_robot_driver

sudo apt-get install ros-melodic-moveit   # 安装MoveIt 此步可忽略
cd handeye  #进入ros工作空间的文件夹

# 复制驱动
$ git clone https://github.com/UniversalRobots/Universal_Robots_ROS_Driver.git src/Universal_Robots_ROS_Driver
# 
$ git clone -b calibration_devel https://github.com/fmauch/universal_robot.git src/fmauch_universal_robot
# 全部都在handeye/src目录下

#安装依赖
$ sudo apt update 
$ rosdep update # 有的时候会访问超时
$ rosdep install --from-path src --ignore-src -y  #-y 表示[yes/no]的问题选择yes

# build the workspace
$ catkin_make

# activate the workspace (ie: source it)
$ source devel/setup.bash

4.仿真测试

#打开终端,启动
roslaunch ur_gazebo ur5.launch
#打开新终端
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
#再打开一个新终端
roslaunch ur5_moveit_config moveit_rviz.launch config:=true

5.驱动真实的ur机器人

5.1 安装externalcontrol

参考:Universal_Robots_ROS_Driver/ur_robot_driver/doc/install_urcap_cb3.md

要在真正的机器人上使用ur_robot_driver,需要在ur机器人上安装externalcontrol-1.0.urcap,该文件位于Universal_Robots_ROS_Driver/ur_robot_driver的resources文件夹内。注意:要安装此URCap,要求PolyScope的版本不得低于3.7。

安装步骤:

用U盘将此文件拷贝至机器人示教器的programs文件夹。

在欢迎屏幕上,选择Setup Robot,然后选择URCaps进入URCaps安装屏幕。
在这里插入图片描述

单击底部的小加号以打开文件选择器。 在此处,可以看到存储在机器人程序文件夹或插入的USB驱动器中的所有urcap文件。 选择并打开externalcontrol-1.0.urcap文件,然后单击打开。 现在,您的URCaps视图应在活动的URCaps列表中显示External Control,点击右下角重启机器人。
在这里插入图片描述

重新启动后,选择为机器人编程,在安装设置部分中找到External Control 。 然后设置外部PC的IP地址,本文设置为192.168.1.101 。请注意,机器人和外部PC必须位于同一网络中,理想情况下,彼此之间应直接连接,以最大程度地减少网络干扰。 自定义端口现在应该保持不变。

在这里插入图片描述

要使用新的URCap,请创建一个新程序并将External Control程序节点插入到程序树中。
在这里插入图片描述

重新点击命令按钮,则会看到在安装中输入的设置。 检查它们是否正确,然后将程序保存,可以将程序命名为external_control.urp。 现在机器人可以与此驱动程序一起使用了。(注,图中 Host IP 应为前文设置的 192.168.1.101)

在这里插入图片描述

5.2 网络配置

设置机器人静态IP. 设置机器人 ——> 设置网络菜单:
IP地址: 192.168.1.2
子网掩码:255.255.255.0
如果机器人似乎没有正确获取网络配置,请尝试重启控制器。

测试网络连接:

ping 192.168.1.2  #IP_OF_THE_ROBOT

会看到如下输出:
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.518 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.259 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.282 ms

5.3 用ros驱动真实的ur5机器人

参考:Getting Started with a Universal Robot and ROS-Industrial
警告:请将手放在急停按钮旁边,以防发生意外。

网线连接机器人和电脑,启动机器人。
打开电脑终端,启动机器人驱动程序。

roslaunch ur_robot_driver ur5_bringup.launch limited:=true robot_ip:=192.168.1.2 
# [reverse_port=REVERSE_PORT] "reverse_port" default="50001" 
#  limited:=true限制机器人关节运动范围 [-pi,pi],否则为 [-2pi, 2pi]

示教器,运行程序 —> 文件 —> 加载程序 —> 选择3.1 节保存的external_control.urp程序,打开—>运行。
可以看到终端显示:
[ INFO] : Robot mode is now POWER_ON
[ INFO] : Robot mode is now IDLE
[ INFO] : Robot mode is now RUNNING
[ INFO]: Robot requested program
[ INFO]: Sent program to robot
[ INFO]: Robot ready to receive control commands.

启动moveit和rviz,注意启动顺序不能变

5.4 补充内容

可能出现错误的地方:
https://blog.csdn.net/zxxxiazai/article/details/103568577?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161940749716780262561071%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161940749716780262561071&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-5-103568577.first_rank_v2_pc_rank_v29&utm_term=%E9%A9%B1%E5%8A%A8%E7%9C%9F%E5%AE%9E%E7%9A%84ur5%E6%9C%BA%E5%99%A8%E4%BA%BA

6.Kinect

6.1 安装iai——kinect2

参考网址:https://blog.csdn.net/u012424737/article/details/80609451
首先对libfreenect2 驱动配置,我是将libfreenect2 安装在home目录下,按照文章操作即可,知道在build文件夹下运行./bin/Protonect显示以下图像,便安装完驱动,下一步便是安装kinect v2的节点包,步骤如下:

在这里插入图片描述
2-1在ROS中配置Kinect的是通过 IAI Kinect2 包的安装实现的

cd ~/catkin_ws/src/  #进行ROS的工作目录下的源文件目录
git clone https://github.com/code-iai/iai_kinect2.git  
cd iai_kinect2 
rosdep install -r --from-paths . 
cd ~/handeye
catkin_make
# 由于这里我是直接修改了bashrc,所以不用每次都source

# 通过运行验证是否成功,成功后显示如下图像:
roslaunch kinect2_bridge kinect2_bridge.launch
rosrun kinect2_viewer kinect2_viewer

7. ros-melodic-visp

sudo apt-get install ros-melodic-visp

8. vision_visp

cd ~/handeye/src
git clone -b kinetic-devel https://github.com/lagadic/vision_visp.git
catkin_make --pkg visp_hand2eye_calibration

针对编译会卡住的情况,把下面两个包删掉,因为这两个包编译时需要下载文件,但是文件现在不存在了,而且这两个是用于跟踪,不影响手眼标定。
在这里插入图片描述

9.aruco_ros

cd ~/handeye/src
 git clone -b kinetic-devel https://github.com/pal-robotics/aruco_ros
 catkin_make

10.easy_handeye

cd ~/handeye/src
 git clone https://github.com/IFL-CAMP/easy_handeye
catkin_ws$ catkin_make

二,验证

注意由于不能直接编写大的完整的roslaunch启动文件(由于ur需要握手),所以我重新对其进行拆分
我的aruco_ros/aruco_ros/launch/single.launch文件如下,这里我修改了几个参数,582和0.067分别对应的ID号和标签尺寸,这是根据我选择并打印出来的标签实际决定的:

<?xml version="1.0"?>
<launch>

    <arg name="markerId"        default="582"/>
    <arg name="markerSize"      default="0.067"/>    <!-- in m -->
    <arg name="eye"             default="left"/>
    <arg name="marker_frame"    default="aruco_marker_frame"/>
    <arg name="ref_frame"       default=""/>  <!-- leave empty and the pose will be published wrt param parent_name -->
    <arg name="corner_refinement" default="LINES" /> <!-- NONE, HARRIS, LINES, SUBPIX -->


    <node pkg="aruco_ros" type="single" name="aruco_single">
        <remap from="/camera_info" to="/kinect2/hd/camera_info" />
        <remap from="/image" to="/kinect2/hd/image_color_rect" />
          <param name="image_is_rectified" value="true"/>
        <param name="marker_size"        value="0.067"/>
        <param name="marker_id"          value="582"/>
        <param name="reference_frame"    value="kinect2_rgb_optical_frame"/>
        <param name="camera_frame"       value="kinect2_rgb_optical_frame"/>
        <param name="marker_frame"       value="camera_marker" />
    </node>

    <!--node pkg="aruco_ros" type="single" name="aruco_single">
        <remap from="/camera_info" to="/stereo/$(arg eye)/camera_info" />
        <remap from="/image" to="/stereo/$(arg eye)/image_rect_color" />
        <param name="image_is_rectified" value="True"/>
        <param name="marker_size"        value="$(arg markerSize)"/>
        <param name="marker_id"          value="$(arg markerId)"/>
        <param name="reference_frame"    value="$(arg ref_frame)"/> 
        <param name="camera_frame"       value="stereo_gazebo_$(arg eye)_camera_optical_frame"/>
        <param name="marker_frame"       value="$(arg marker_frame)" />
        <param name="corner_refinement"  value="$(arg corner_refinement)" />
    </node-->

</launch>

注意:aruco标签在~/catkin_ws/src/aruco_ros/aruco_ros/etc有打印出的标签才可以被检测到,这里我直接打印的里面存在的标签号582
然后我先判断用kinect v2能否检测到aruco标签,如果显示坐标,便可以检测,注意修改image_View左边订阅的节点为 /aruco_single/result
下方为/aruco_single/result_mouse_left

运行程序:

roslaunch kinect2_bridge kinect2_bridge.launch
roslaunch aruco_ros single.launch
rqt_image_view

弹出下面三个窗口:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意一定要在第一个图中打开image_view,显示采集到的标签图像
直到窗口顶部会出现选项目录plugins->Visualization->image_View;
图3中点击check_starting pose应该为0/17,连接成功后。

image_View下左边订阅的节点为 /aruco_single/result
下方为/aruco_single/result_mouse_left,显示如下:
在这里插入图片描述

可能出现的错误

错误1-缺少库transforms3d

解决方案

pip install transforms3d

错误2-cv2.CALIB_HAND_EYE_TSAI

解决方案

#1.首先安装opencv-contrib
python -m pip install opencv-contrib-python
#2.在cv2.CALIB_HAND_EYE_TSAI报错的文件中作如下修改
#将import cv2修改为

import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import cv2
sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')

#ros使用的python库的位置与计算机的Python库位置不一样,所以import cv2是从ros的python库环境中导入,而我们的cv2是安装在计算机的python库中,所以需要先屏蔽掉默认的ros库导入,此时python的库已经切换到了计算机的python库。

错误3-Cannot calibrate from current position

这一个错误是由于未能调出image-view,无法采样,但是在rqt中我始终无法找到plugin菜单栏,报错Cannot calibrate from current position最后,不得已,我只能重新开启一个rqt(只需要运行rqt即可),选择空的rqt中的plugin栏目,选择image-view,topic选择**/aruco_track/result**,此时,只要相机视野中有坐标系,就可以进行采样操作了。

三,进行手眼标定

具体操作步骤,
1,为了安全流畅地操作,我们先在rviz的Motion Planning界面中将机械臂的速度和加速度都设为0.1。
在这里插入图片描述
2,图3中是否显示0/17,如果不是就按check starting pose
3,在图1中点击take sample,采样完后点击在图3界面点击next pose,再点击plan,最后点击excute后机械臂会运动到新的位置,再点击take sample,这样反复进行17次,便可以进行采集17点后,点击compute后,再点击save后,便可以在.ros隐藏文件下(在home目录下按ctrl+h便可以显示隐藏文件)看到easy_handeye的文件下的ur5_kinect_handeyecalibration_eye_on_base.yaml文件,文件内容如下:

eye_on_hand: false
robot_base_frame: base_link
tracking_base_frame: kinect2_rgb_optical_frame
transformation:
  qw: 0.1434016682482555
  qx: -0.16165056534351638
  qy: 0.7128775670495471
  qz: -0.6671661192426197
  x: -0.4258619055680306
  y: -0.03867852023257894
  z: 0.68036831927051

参考文献链接

图片好多图省事直接使用链接原文
https://blog.csdn.net/qq_32618327/article/details/89736314
https://blog.csdn.net/harrycomeon/article/details/102600957
https://blog.csdn.net/harrycomeon/article/details/107521715

;