当婴幼儿看到物体时, 首先通过眼睛获取信息, 传输到大脑进行理解, 最终通过手来操作完成玩具的抓取, 放置. 手, 眼, 脑协同是人类和少数动物的一项特殊技能, 通过经常玩一些简单的益智玩具, 可以逐渐锻炼增强孩子的手眼协调能力, 同时可以作用到大脑, 促进孩子的智力发育.
商家们也看到了这块领域, 设计出很多益智玩具和游戏, 如图 1 中所示. 孩子需要把玩具抓起并放入车里. 孩子的空间思维能力, 协调能力在游戏中得到了锻炼.
图 1
在智能机器人领域, 机器人需要完成高效, 复杂的工作, 否则无法称之为 "智能". 然而, 机器人要想获得同人类一样的协调能力并不容易. 如何才能实现像人一样的手眼协同能力呢?
再回到这个游戏. 孩子在玩玩具时, 大脑中有一个坐标系, 可看做是基础坐标系; 灵活的手在运动中形成一个轨迹, 称之为手的坐标系; 玩具要放置的点又有一个目标坐标系. 三个坐标系协同, 游戏才能顺利地玩下去. 如果为此游戏场景加入坐标, 会是这个样子, 如图 2 所示.
图 2
智能机器人领域, 四轴, 六轴, 并联等机械臂可认为是机器人的手臂(虽然自由度较高, 速度快, 但相比人手的灵活性还远远不如). 机器人的眼睛, 一般指摄像机(包括 2D 和 3D). 目前智能机器人的主流是使用 3D 视觉相机. 机器人的大脑一般指进行核心控制和计算的工控机或嵌入式芯片.
一般而言, 机器人的 "手眼协调" 需要一个 "手眼标定"(Hand-eye calibration)的过程. 手眼标定是机器人领域的一个经典的问题, 其核心是计算出相机坐标系在机器人坐标系下的转移矩阵. 转移矩阵是 4*4 的矩阵, 一般用齐次坐标表示. 其中最重要的两个分量是旋转矩阵 \(R\)和平移矢量 \(t\), 分别表示旋转分量和平移分量. 得到转移矩阵后, 可将相机下的坐标转换到机械臂坐标系下, 从而完成工作. 如图 3 所示.
图 3
两个坐标系, 如何建立关系? 这是手眼标定要解决的核心问题.
手眼标定和核心是解决一个 \(AX=XB\)的矩阵. 解此矩阵的算法就是手眼标定算法.
小蓝 ( 杭州蓝芯科技有限公司简称) 公司依赖 Eigen 库实现了经典 Tsai 的方法并且开源, 不想进行理论推导的读者可直接用此代码: https://github.com/zjulion/handeyecat .
如何进行手眼标定
注意: 以下涉及公式推导, 不想推数学公式的可跳过.
理解手眼标定的核心是如何将机器人的手眼关系代入 \(AX=XB\)的公式中.
首先要理解 \(A\),\(B\),\(X\)分别代表什么含义.
\(X\), 表示未知量, 即手眼标定的转移矩阵.
\(A\)和 \(B\)呢?
先看机器人手眼分离的示意图.
图 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-hand 和 eye-to-hand. 刚刚我们一直研究的是 eye-to-hand 的模式. 对于 eye-in-hand 模式, 可以采用类似方法, 消去我们不喜欢的中间变量, 最终归结到 \(AX=XB\)的形式, 就可以解了.
两种模式在公开的源码中都可以找到.
总结
1, 孩子的手眼协调能力会在游戏中得到锻炼, 只要给玩具让她 / 他玩, 基因会逐渐教会她 / 他灵活的手眼协同能力.
2, 智能机器人的手眼协调, 需要工程师们的认真调教! 一般来说, 数据越多, 误差越小. 手眼协调能力, 是机器人完成分拣, 抓取, 放货工作的前提.
手眼系统作业
源码地址
https://github.com/zjulion/handeyecat
来源: https://www.cnblogs.com/zjulion/p/10969576.html