手眼标定——使用 easy_handeye 和 aruco

2023-05-16

整个过程分为以下三步

  1. aruco_ros 的配置使用
  2. easy_handeye 的配置使用
  3. 标定过程

aruco 的配置使用

  1. clone aruco 项目 到 ros 工作空间。
  2. 前往 aruco marker 生成网站 打印 marker,注意:一定要选择original,其它版本的检测不出
  3. 修改 single.launch 文件(如果要使用多 marker,请自行配置)。下面是我的 single.launch 文件,可做参考,我会将每个参数说明。
<launch>

    <arg name="markerId"        default="582"/>
    <arg name="markerSize"      default="0.1"/>    <!-- in m -->
    <arg name="eye"             default="left"/>
    <arg name="marker_frame"    default="camera_marker"/>
    <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="/camera_info" />
        <remap from="/image" to="/image_raw" />
        <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="stereo_gazebo_left_camera_optical_frame"/>   <!-- frame in which the marker pose will be refered -->
        <param name="camera_frame"       value="stereo_gazebo_left_camera_optical_frame"/>
        <param name="marker_frame"       value="$(arg marker_frame)" />
        <param name="corner_refinement"  value="$(arg corner_refinement)" />
    </node>

</launch>
  • /camera_info: 填入相机的内参 topic,这个topic一般由启动相机的节点发布,例如我用的是 uvc_camera 启动相机,他就会发布相机内参 topic。
  • /image: 图片 topic,同样我的也是由 uvc_camera 发布的,要填什么具体看你这个节点的名字。
  • reference_frame: marker 坐标系的参考坐标系,我们要获得的是marker 和相机的相对位姿,所以这里设置为相机坐标系,即和 camera_frame 一样。
  • camera_frame: 相机坐标系,随便写个名字
  • marker_frame:marker 坐标系,随便写个名字

easy_handeye的配置使用

  1. clone easy_handeye项目 到 ros 工作空间。
  2. 在 easy_handeye/docs/example_launch 文件夹下复制一份 launch 文件到 easy_handeye/easy_handeye/launch 文件夹下。这里注意一下,你可以将启动机械臂、相机、aruco、easy_handey的程序放到一个launch文件下一起启动(如 easy_handey 给的 example),也可以分别启动。为了清晰,我选择分开启动。所以这个复制的 launch 文件中我删去了启动机械臂和 aruco 的部分,只剩下启动手眼标定的部分。
  3. 修改复制的 launch 文件。下面是我的该 launch 文件的配置
<launch>
    <arg name="namespace_prefix" default="aubo_kinect_handeyecalibration" />

    <!-- 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="stereo_gazebo_left_camera_optical_frame" />
        <!-- camera_marker -->
        <arg name="tracking_marker_frame" value="camera_marker" /> 
        <arg name="robot_base_frame" value="base_link" />
        <arg name="robot_effector_frame" value="wrist3_Link" />

        <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>
  • eye_on_hand: true 时相机在机械臂上,marker固定。反之相反。
  • tracking_base_frame: marker的坐标系的参考坐标系,这里写相机坐标系的参考坐标系,也就是相机坐标系。
  • tracking_marker_frame: marker 坐标系,即 aruco 设置的 marker_frame

注意: 看似这些坐标系设置的挺乱,他的原则就是,这些坐标系放在一起组成一个集合,其中每个坐标系要能通过其他坐标系,得到每个坐标系之间的相互转换关系。所以上述两个launch文件提到的坐标系写法可以有很多,我选择了比较简单的。

标定过程

依次启动机械臂、相机、aruco、easy_hand。没问题就会出现三个在启动 easy_handeye 后会出现三个窗口。

  1. 将机械臂移动至 marker 在相机中出现(你可以使用rqt_image_view image:=(image的topic),rqt窗口里选择 aruco_ros/result–好像是这个名字…),就能看见图片和检测结果。
  2. 点击 check starting pose ,这步是确定marker 相对于相机的位姿。
  3. 你可以使用 easy_handeye 的自动化程序来移动机械臂标定,即点击next_pose…。但是这个自动移动机械臂经常时相机照不到marker,我建议手动移动机械臂,移动到哪?后面我会写出注意点。移动到合适的位置后,点击 take_sample
  4. 获得一些sample后,点击 compute 就能看到标定结果了。

如何移动机械臂获取sample

easy_handeye 作者给出建议:

  • Maximize rotation between poses.
  • Minimize the distance from the target to the camera of the tracking system.
  • Minimize the translation between poses.
  • Use redundant poses.
  • Calibrate the camera intrinsics if necessary / applicable.
  • Calibrate the robot if necessary / applicable.

这就好了吗??
如果真这么容易就好了!

问题即解决方案

  • ’module’ object has no attribute 'CALIB_HAND_EYE_TSAI’

handeye_calibration_backend_opencv.py 文件中 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 调用时出问题,具体什么问题?我不知道。出处
如果还不行,卸载掉opencv相关包,重新安装opencv_contrib_python。如python版本也是2.7的话,将其版本指定 “==4.2.0.32”,具体支持见 opencv-python版本对应

  • xxx and xxx not part of the same tree.Tf has two or more unconnected trees.

这个问题是这两个坐标系不能联系起来,即一个坐标系通过已知的坐标系,求得另一个坐标系。一般是 aruco 中 reference_frame 和 camera_frame 设置不对,把这两个设为一样通常可解决。同时easy_hanyeye 里复制的launch文件中要参考 single.launch 设置对。

  • Requested time xxx but the latest data is at time xxx…

代码问题,将easy_handeye 中文件 handeye_sample.py 65行(左右)time = Time.now() 改为 time=Time(0)

可能有些问题忘了,一些细节没说清楚,请大家评论区批评指正。有问题评论我会回复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手眼标定——使用 easy_handeye 和 aruco 的相关文章

  • ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

    ROS服务通信具体实现流程 demo xff1a 实现两个整型数相加求和 xff0c 客户端发送两个整型数 xff0c 服务端对其求和 服务通信也需要自定义服务数据类型 xff0c 即自定义srv文件 xff0c 该过程和自定义msg文件非
  • ROS TF静态坐标变换实现

    ROS TF静态坐标变换实现 法一 xff1a 编码实现 发布方代码实现 xff1a 创建功能包并添加依赖 catkin create pkg tf static roscpp rospy std msgs tf2 tf2 ros tf2
  • ROS:Gazebo导入自定义环境

    Gazebo导入自定义环境 之前的案例gazebo中导入的是一个空世界empty world xff0c 这里会介绍如何导入房屋数目等自定义的环境 xff08 1 xff09 启动 gazebo 打开构建面板 xff0c 绘制仿真环境 xf
  • ROS导航实现:SLAM建图(slam_gmapping)与保存(map_server)

    导航实现 xff1a SLAM建图 先安装相关的ROS功能包 安装 gmapping 包 用于构建地图 sudo apt install ros lt ROS版本 gt gmapping 安装地图服务包 用于保存与读取地图 sudo apt
  • ROS导航实现:amcl定位

    ROS导航实现 xff1a amcl定位 xff08 1 xff09 首先编写启动amcl的launch文件 xff0c 这里建议复制粘贴模板 xff0c 再修改相关的参数即可 xff0c 步骤如下 xff1a 主目录下进入amcl文件 r
  • ROS导航实现之路径规划

    导航实现之路径规划 move base 功能包提供了基于动作 action 的路径规划实现 xff0c move base 可以根据给定的目标点 xff0c 控制机器人底盘运动至目标位置 xff0c 并且在运动过程中会连续反馈机器人自身的姿
  • 创建个人网站(github pages)并将站点一键托管到Github

    创建个人网站 xff08 github pages xff09 并将站点一键托管到Github 内容 xff1a 使用网站生成器mkdocs将markdown文件生成wiki站点并挂载到github的流程总结 亮点 xff1a 个人网站一键
  • 视觉SLAM十四讲(第2版)总结

    最近看完了 视觉SLAM十四讲 xff08 第2版 xff09 xff1a 从理论到实践 xff08 高翔等著 xff09 xff0c 原书分两部分 xff0c 先介绍了数学基础 xff0c 然后介绍了具体的SLAM实践 xff0c 非常适
  • 我的公众号 - 豆芽儿 软件研发人才生长社区

    为你系统分享敏捷开发 项目管理 需求分析 软件设计 UML 中层领导力 CMMI IT职场 ACP 软考 PMP等 高大上 的实用知识 xff0c 帮助你进阶为高端人才 xff01
  • Openblas 下载和使用方法

    Openblas 下载及使用 环境 xff1a 平台 xff1a Ubuntu 20 04 xff0c Orin xff1a Arm Cortex A78AE v8 2 64 bit 步骤 xff1a 1 去github 下载openbla
  • FreeRTOS学习记录

    FreeRTOS学习记录 前言FreeRTOS学习记录在STM32CubeMX中配置FreeRTOS 前言 本人小白 xff0c 最近学习了FreeRTOS操作系统 xff0c 打算做一点记录 学习的过程中虽然做了点练习 xff0c 不过都
  • 如何给华三交换机恢复出厂设置及命令

    如何给华三交换机恢复出厂设置及命令 在前几天 xff0c 上级单位线路重新规划 xff0c 需要我们将单位的线路进行改造 xff0c 这就涉及到了网络设备的重新配置 经查看 xff0c 上级接入交换机的业务端口配置为access xff0c
  • 解决Linux下Docker下载安装太慢

    卸载先前版本 yum remove docker docker span class token operator span client docker span class token operator span client span
  • sqlyong连接docker中的mysql 失败can‘t connect to MySQL server on (*******:3306)

    解决sqlyong连接docker中myslq失败 xff1a 一 查看mysql是否运行docker ps 二 查看mysql端口映射是否与连接相符 三 进入mysql容器查看是否能够进行本地连接docker exec it mysql
  • 解决springboot+webSocket出现404错误

    这是因为websocket创建的bean是由自己来管理的 需要将其创建的bean交给spring管理 创建websocketconfig span class token keyword package span com span clas
  • Bytebuffer源码剖析及实现原理

    Bytebuffer 官方解释A byte buffer xff0c 一个字节缓冲区 一 使用方法 ByteBuffer 初始状态是写模式 使用IO流即可写入数据 如 channel read 如果需要读取ByteBuffer中的数据调用f
  • Linux下安装并配置FTP文件服务器

    一 安装vsftpd 1 运行如下代码安装vsftpd yum install span class token operator span y vsftpd 2 运行以下命令设置FTP服务开机自启动 systemctl enable vs
  • Java 实现 图片OCR文字识别

    Java 实现图片OCR文字识别功能 前言 由于网上很多算法 以及语言库无法做到精准识别 所以综合条件下 使用了一款 space OCR API 的产品进行使用 每个月有25000条的 使用额度 日常使用或开发绰绰有余 网址链接 一 注册
  • js实现表单的校验

    js实现表单校验 CV即用 1 效果图 当每个输入框失去焦点时会通过正则表达式来验证输入的格式是否正确 点击登录按钮后 xff0c 如果有格式不正确的将无法登录 当校验全部通过以后才可以登录 2 源代码 xff1a HTML代码 xff1a
  • 你和国际项目经理(PMP),一步之遥?-张传波-专题视频课程

    你和国际项目经理 PMP xff0c 一步之遥 xff1f 913人已学习 课程介绍 项目管理是门实战性超强的大学问 xff0c 项目经理是一位能把控全局的 狠 角色 xff01 你距离这样的 狠 角色有多远呢 xff0c 你应该如何规划自

随机推荐

  • RTOS任务切换原理与实现

    曾今只是使用过移植好的RTOS进行任务开发 xff0c 对其实现的底层原理一直一知半解 xff0c 正好接触到了李述桐老师的课程以及一些网上的资料 xff0c 让我对实时操作系统的原理有了更深的理解 xff0c 特此把一些原理和思考记录下来
  • python报错:Process finished with exit code -1066598274 (0xC06D007E) 解决方法

    1 在运行Mask RCNN项目时 xff0c 导入官网下载的代码和数据集 xff0c 准备运行时报此错误 2 原因 官网要求python版本是3 4 xff0c 但是我python编译器版本为3 9 3 解决 将编译器版本更换为3 7试试
  • OpenCV4学习笔记(72)——ArUco模块之aruco标记的创建与检测

    今天要整理记录的是OpenCV中ArUco模块的基础内容 xff0c 包含aruco标记的创建与检测 要注意的是ArUco模块是包含在OpenCV的contrib拓展库中的 xff0c 需要自行下载OpenCV基础库和contrib拓展库进
  • OpenCV4学习笔记(74)——ArUco模块之对aruco标记进行实时姿态估计

    在之前的笔记 OpenCV4学习笔记 xff08 72 xff09 中 xff0c 记录了在OpenCV中关于aruco标记的创建和检测这方面的内容 xff0c 今天就基于aruco标记检测来进一步实现对aruco标记的实时姿态估计 首先我
  • OpenCV4学习笔记(75)——ArUco模块之实现AR(增强现实)效果

    今天要整理记录的是利用OpenCV中ArUco模块的aruco标记实现一个增强现实的小应用 xff0c 当然了本次笔记的内容也是需要建立在之前的 OpenCV4学习笔记 xff08 72 xff09 基础上的 所谓增强现实 Augmente
  • Ubuntu18.04配置orb-slam2+ROS,一次性通过./build_ros.sh

    1 换源 建议采用清华的源 xff0c 如果采用阿里的源后面很多依赖会报错 xff0c 换源之后记得更新 xff0c 建议勾选源代码 sudo apt get update 1 1 报错error 解决 xff1a sudo apt get
  • process has died 报错

    报错提示 UnicodeEncodeError 39 ascii 39 codec can 39 t encode characters in position 345 350 ordinal not in range 128 spawn
  • Mysql问题Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    java sql SQLSyntaxErrorException Expression 2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
  • 【SAP-FI】承诺项目(Commitment item)详解

    定义 xff1a 承诺项目表示组织在财务管理区域 xff08 FM区域 xff09 内的功能分组 用途 xff1a 承诺项目将影响流动性的预算交易和商业交易分类为收入 xff0c 支出和现金余额项目 您可以将特定责任区域 xff08 资金中
  • 操作系统--03内存管理

    内存管理 第三章 xff1a 内存管理 xff08 存储器管理 xff09 3 内存保护的两种办法 xff1a 3 1 覆盖与交换3 2 连续分配管理方式3 3 动态分区分配算法1 首次适应算法 xff1a 2 最佳适应算法 xff1a 3
  • SCRUM敏捷项目管理实战(深圳站)

    1 内容提要 SCRUM是目前各互联网公司普遍采用的敏捷项目管理模式 xff0c 与传统的项目管理十大知识领域相比 xff0c 敏捷更加直击要害 xff0c 更加强调自组织和跨职能团队 xff0c 更能帮助企业高效率交付和盈利 xff01
  • 2021年最新gitee使用教程

    gitee简介 Gitee com xff08 码云 xff09 是 OSCHINA NET 推出的代码托管平台 xff0c 支持 Git 和 SVN xff0c 提供免费的私有仓库托管 目前已有超过 600 万的开发者选择 Gitee 为
  • 在vscode中运行c、c++(超级简单)

    第一 下载安装vscode 第二 下载插件 链接 xff1a https pan baidu com s 1mLdKbQWxkZJYhwH0ToD9oQ 提取码 xff1a 3kxe 复制这段内容后打开百度网盘手机App xff0c 操作更
  • flameshot安装并配置插入文字描述、设置默认保存路径、将截图内容添加到粘贴板中

    flameshot配置插入文字描述 设置默认保存路径 将截图内容添加到粘贴板中 安装 xff1a https github com flameshot org flameshot releases 下载相应rpm包 xff0c 安装即可 以
  • 静态域[详解]

    不知道静态域是什么 目前有两种想法 1是代表static修饰的属性 方法等的集合 即所有static修饰的都算 2是认为仅仅代表静态代码块 即 static 下面正式研究 34 何为静态域 34 查到的文章基本分静态域 静态常量 静态方法这
  • OpenFlow 流表

    流规则组成 xff1a 每条流规则由一系列字段组成 xff0c 分为基本字段 条件字段和动作字段三部分 一 xff1a 基本字段 duration sec xff1a 表示流表项的生效时间 xff0c 以秒为单位 可以用来控制流表项的生命周
  • Gittee的使用

    Git Linus用C写的分布式版本控制系统 Git官网 xff1a https git scm com Gittee 国内代码托管和协作开发的平台 xff0c 可以看作为中文版的 GitHub 官网 xff1a Gitee 基于 Git
  • 使用VsCode管理Gitee仓库中的项目

    使用VsCode管理Gitee仓库中的项目的大致流程如下 1 首先得下载安装 git xff0c 详见 Git 详细安装教程详解 Git 安装过程的每一个步骤 mukes的博文 xff09 2 为 git 配置 username和email
  • Linux嵌入式开发之内存占用

    一 引言 内存是嵌入式系统中的关键资源 xff0c 内存占用主要是指软件系统的内存使用情况 本篇博客将介绍如何分析内存使用以便进行进一步优化内存占用相关的基础概念和相关工具 二 内存占用 内存占用是应用程序运行时内存的使用或引用数量 对于开
  • 手眼标定——使用 easy_handeye 和 aruco

    整个过程分为以下三步 aruco ros 的配置使用easy handeye 的配置使用标定过程 aruco 的配置使用 clone aruco 项目 到 ros 工作空间 前往 aruco marker 生成网站 打印 marker xf