zoukankan      html  css  js  c++  java
  • 儿童节特刊 | 如何练好手眼协调能力(手眼标定详解,附源码)

    当婴幼儿看到物体时,首先通过眼睛获取信息,传输到大脑进行理解,最终通过手来操作完成玩具的抓取、放置。手、眼、脑协同是人类和少数动物的一项特殊技能,通过经常玩一些简单的益智玩具,可以逐渐锻炼增强孩子的手眼协调能力,同时可以作用到大脑,促进孩子的智力发育。

    商家们也看到了这块领域,设计出很多益智玩具和游戏,如图1中所示。孩子需要把玩具抓起并放入车里。孩子的空间思维能力、协调能力在游戏中得到了锻炼。

    ![图1](https://img2018.cnblogs.com/blog/15064/201906/15064-20190603193041238-1882889500.png) 图1

    在智能机器人领域,机器人需要完成高效、复杂的工作,否则无法称之为“智能”。然而,机器人要想获得同人类一样的协调能力并不容易。如何才能实现像人一样的手眼协同能力呢?

    再回到这个游戏。孩子在玩玩具时,大脑中有一个坐标系,可看做是基础坐标系;灵活的手在运动中形成一个轨迹,称之为手的坐标系;玩具要放置的点又有一个目标坐标系。三个坐标系协同,游戏才能顺利地玩下去。如果为此游戏场景加入坐标,会是这个样子,如图2所示。

    ![](https://img2018.cnblogs.com/blog/15064/201906/15064-20190603193138042-2112692536.png) 图2

    智能机器人领域,四轴、六轴、并联等机械臂可认为是机器人的手臂(虽然自由度较高、速度快,但相比人手的灵活性还远远不如)。机器人的眼睛,一般指摄像机(包括2D和3D)。目前智能机器人的主流是使用3D视觉相机。机器人的大脑一般指进行核心控制和计算的工控机或嵌入式芯片。
    一般而言,机器人的“手眼协调”需要一个“手眼标定”(Hand-eye calibration)的过程。手眼标定是机器人领域的一个经典的问题,其核心是计算出相机坐标系在机器人坐标系下的转移矩阵。转移矩阵是4×4的矩阵,一般用齐次坐标表示。其中最重要的两个分量是旋转矩阵(R)和平移矢量(t),分别表示旋转分量和平移分量。得到转移矩阵后,可将相机下的坐标转换到机械臂坐标系下,从而完成工作。如图3所示。

    ![](https://img2018.cnblogs.com/blog/15064/201906/15064-20190603193200436-1641014925.png) 图3

    两个坐标系,如何建立关系?这是手眼标定要解决的核心问题。
    手眼标定和核心是解决一个(AX=XB)的矩阵。解此矩阵的算法就是手眼标定算法。
    小蓝( 杭州蓝芯科技有限公司简称)公司依赖Eigen库实现了经典Tsai的方法并且开源,不想进行理论推导的读者可直接用此代码:https://github.com/zjulion/handeyecat

    如何进行手眼标定

    注意:以下涉及公式推导,不想推数学公式的可跳过。
    理解手眼标定的核心是如何将机器人的手眼关系代入(AX=XB)的公式中。
    首先要理解(A)(B)(X)分别代表什么含义。
    (X),表示未知量,即手眼标定的转移矩阵。
    (A)(B)呢?
    先看机器人手眼分离的示意图。

    ![](https://img2018.cnblogs.com/blog/15064/201906/15064-20190603193245567-1710079019.png) 图 4

    图4中,机器人底座一般认为是世界坐标系的原点。摄像机(眼睛)识别的位置通过转移矩阵,可以转换到机器人坐标系(同时也是世界坐标系)下。在手眼标定的过程中,需要连续移动机械臂终端,采集一组末端执行器的位姿;与此同时,相机采集挂在末端执行器的标记(例如,棋盘格)的位姿,组成另一组数据。
    预警:下面是一些真正的数学推导。
    假设采集的数据有(N)对,根据图中的几何关系,未知量有两个,分别是标记在末端执行器下的位姿(H_{grid})和相机在世界坐标系下的坐标(H_{camera})
    其中(H_{camera})是我们手眼标定的目标,(H_{grid})是多少我们并不关心。
    根据标记是空间中的位姿,我们可以得到(两边都是标记的位姿)

    [H_{camera} ast H_{grid\_in\_c}=H_{end} ast H_{grid} ]

    观察上面公式,

    • (H_{camera})未知,是目标矩阵,不变量;
    • (H_{grid\_in\_c})已知,是可以通过相机读到的数据,变量;
    • (H_{end})已知,是机械臂末端读数,变量;
    • (H_{grid})未知,我们很不喜欢它,不变量。
      故此方程有两个已知量,两个未知量,一组数据不可解!
      一组数据不行,那就多来几组吧!
      假设我们有两组数据,分别是第(i)组合第(j)组,两组坐标在公式里的括号内表示。
      回想初中代数,我们可以通过类似方程组的解法,消去我们不喜欢的(H_{grid})
      有如下两组方程,

    [{H_{camera} ast H}_{grid\_in\_c(i)}=H_{end(i)} ast H_{grid},\ {H_{camera} ast H}_{grid\_in\_c(j)}=H_{end(j)} ast H_{grid} ]

    联立方程,消去(H_{grid}),最终我们得到,

    [H_{end(j)}ast H_{end(i)}^{-1}*H_{camera}=H_{camera}ast H_{grid\_in\_c(j)}ast H_{grid\_in\_c(i)}^{-1} ]

    至此,回想矩阵乘法的结合律,我们惊喜的发现,方程的形式正是AX=XB!
    其中(A)(B)分别已知,(X=H_{camera})。什么?(A)(B)是什么?自己观察一下!
    数学推导结束。


    小朋友们,不对,工程师们,可以用此数据带入标准算法计算了!
    一般来说,采集的数据越多,标定的结果越准确。采集时,为防止陷入局部陷阱,需尽可能多的采集机器人姿态,同时,要保证标记在机械臂末端位姿固定,相机和机械臂的相对位姿也要保持固定。
    有人说,不对,我用的相机不是这样装的。我把相机装在了机械臂上,同其一起移动,可以用这种方法吗?
    答案当然是可以。
    这涉及到手眼协同机器人的两种模式,分别是eye-in-handeye-to-hand。刚刚我们一直研究的是eye-to-hand的模式。对于eye-in-hand模式,可以采用类似方法,消去我们不喜欢的中间变量,最终归结到(AX=XB)的形式,就可以解了。
    两种模式在公开的源码中都可以找到。

    总结

    1、孩子的手眼协调能力会在游戏中得到锻炼,只要给玩具让她/他玩,基因会逐渐教会她/他灵活的手眼协同能力。
    2、智能机器人的手眼协调,需要工程师们的认真调教!一般来说,数据越多,误差越小。手眼协调能力,是机器人完成分拣、抓取、放货工作的前提。

    ![](https://img2018.cnblogs.com/blog/15064/201906/15064-20190604082027530-322595697.gif) 手眼协同作业

    源码地址

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/zjulion/p/10969576.html
Copyright © 2011-2022 走看看