机器守门员-感知部分

对应上一章最后的系统框架图, 感知部分的工作有三部分:

 

 

 

 

 

 

 

感知这部分的工作是由我的队友俊君来完成的, 感知的三大块内容主要包括:

1. 获取传感器数据: 就是通过intel realsense传感器提供的sdk源源不断的获取图像, 要求要尽量快速, 减少迟滞。 最终我们的更新频率为50fps。

2. 在rgb图上检测球在图像中的坐标: 就是利用传统的计算机视觉方法, 以最快的速度在图像中找到球的位置, 要求误检率尽可能的少, 噪声尽可能小, 实时性要尽可能高。最终我们整个控制周期为20ms。

3. 获取对应的深度, 并借此获取三维坐标: 就是利用深度信息和球在rgb图上的像素坐标, 反求出球在三维世界中制定坐标系下的三维坐标, 这就是感知系统的最终输出了。

一、 获取传感器数据:

俊君同学非常给力, 在短短的一天内就布置完成了intel提供的sdk以及opencv 的开发环境, 很快就能够获取深度图并用opencv进行基本的显示处理了。

这部分不深入介绍了, 因为具体的过程我没有参与, 有空由俊君来发文介绍一下sdk的安装和环境配置吧。

关于50fps: realsense的rgb图像输出最高支持60fps, 但是并不稳定, 常常在62, 58区间震荡。 为了获取等间距稳定的图像流, 我们决定降低帧数获取稳定的数据流。 这部分俊君同学做了很多工程上的处理, 在这里不讨论。

 

 

 

 

 

 

 

二、 在rgb图像寻找球的坐标:

由于能解决这个问题的方法非常之多, 因此如何选取最合适的方法就是一个技巧性很强的问题。 根据我们的要求, 要尽可能稳定,还要尽可能快速, 俊君抛弃了什么模版匹配、 运动检测各种高级方法, 使用了最最简单最最基础的颜色空间加形状的办法。 足球的颜色是橘黄色, 在数字图像中用颜色向量非常容易提取出来, 加上判断物色块形状, 能滤去很多颜色相近的物体。 最棒的是, 这种最简单的方法运算量非常小, 可以说是完美解决了这个问题。

如视频所示, 橙色足球所在位置被打上了蓝色方框, 并且在运动中蓝色框也能追踪到足球的位置。

 

三、 三维坐标的计算

这是感知部分的一个理论性比较强的问题, 牵涉到一些线性代数和空间几何的知识。 说是理论性较强, 实际上用的数学原理都非常简单, 比较考验空间想象能力, 看不懂可以跳过, 不影响后面章节的阅读。 大致思路如下:

三维物体成像到照片上, 其实就是三维投影到二维的过程

´设空间中有一点P,若世界坐标系与相机坐标系重合,则该点在空间中的坐标为(X, Y, Z),其中Z为该点到相机光心的垂直距离。设该点在像面上的像为点p,像素坐标为(x, y)。

f是相机的焦距, Z就是深度。

´由上图可知,这是一个简单的相似三角形关系,从而得到描述投影的公式:

´但是,图像的像素坐标系原点在左上角,而上面公式假定原点在图像中心,为了处理这一偏移,设光心在图像上对应的像素坐标为(cx,cy),则

焦距f, cx cy都属于相机内参, 可以通过标定获取。 而x和y就是球在图像上的坐标, 因此从这个公式我们就可以求取球在三维空间中的坐标了。

等式右边那个矩阵就是常说的相机内参矩阵。 其中cx和cy一般是图像尺寸的1/2,  而f可以通过大概粗略的估计求取。 当然最准确的方法还是通过标定获取。

关于相机的标定, 在另一个项目教程: 微缩自动驾驶小车中有提及到, 想要了解这块的可以去翻看。 这里就不详细解释相机标定的内容了。

 

用以上公式计算得到的三维坐标XYZ是以相机为原点, 相机中轴为Z轴的坐标系, 而我们为了计算方便, 应该把求取的坐标转换为另一种坐标系, 如图所示。

图左边的坐标系是用以上公式计算得出的坐标所在坐标系, 而我们需要将坐标转换到新的坐标系下。 可以看出, 新坐标系经过了一个俯仰角旋转, 以及一个垂直的平移。 因此, 转换坐标的方法为:

世界坐标系与相机坐标系之间的相对旋转为矩阵R(R是一个三行三列的旋转矩阵),相对位移为向量T(三行一列),

 

坐标转换: 只需乘上旋转矩阵, 加上转移矩阵即可转换坐标系

在这个场景下, 我选择坐标原点为球门正中的地面位置, 因此偏移量为: 摄像头的安装高度。

摄像头为俯视25度, 无横滚和偏航角。 旋转矩阵为一个俯仰旋转矩阵

 

最终, 将这个方法和运用起来, 就可以获取球的三维坐标点了。

说点什么

avatar
  Subscribe  
提醒
error: Content is protected !!