【发布时间】:2012-04-12 14:29:25
【问题描述】:
最近我一直在尝试实现一个系统来识别和三角测量机器人系统中物体的 3D 位置。该过程的总体概要如下:
- 使用 SURF 匹配识别对象,从一组“训练”图像到相机的实际实时馈送;这也给了我一个仅包含已识别对象的裁剪矩形图像
- 移动/旋转机器人一定量
- 将起始视图中对象的特征与此视图中的相机进行匹配
- 现在我有:一组对应的 2D 点(来自两个不同视图的相同对象)、世界框架中的两个里程计位置(位置 + 方向)和相机内在函数(焦距、主点等),因为它已经预先校准,所以我应该能够创建 2 个投影矩阵并使用 Hartley & Zissermann 的书 Multiple View Geometry pg 中的基本线性三角测量方法进行三角测量。 312.
- 求解每个对应二维点的 AX = 0 方程,然后取平均值
实际上,三角测量仅在旋转几乎没有变化时才有效;如果机器人在移动时甚至稍微旋转了一点(例如由于车轮打滑),那么估计就大错特错了。这也适用于模拟。由于我只能发布两个超链接,here's a link 到带有模拟图像的页面(在地图上,红色方块是模拟机器人的位置和方向,黄色方块是使用线性三角测量估计的对象位置。)
因此,您可以看到,即使稍微旋转一下,估计值也会被抛出,就像该页面上的位置 2(那是 15 度;如果我再旋转它,那么估计值完全不在地图上),甚至在已知完美校准矩阵的模拟环境中。在真实环境中,当我实际使用机器人四处走动时,情况会更糟。
在计算 A 矩阵后,获得点对应关系以及实际求解 AX = 0 方程也没有任何问题,所以我认为这可能与我如何设置两个相机投影矩阵有关,特别是我如何根据相对于世界框架的位置/方向信息计算平移和旋转矩阵。我现在的做法是:
- 旋转矩阵是通过创建一个 1x3 矩阵 [0,(方向角变化),0] 然后使用 OpenCV 的 Rodrigues 函数将其转换为 3x3 矩阵组成的
- 平移矩阵是通过旋转两个点(起始角度)度数,然后从初始位置减去最终位置,得到机器人相对于起始方向的直线和横向运动
这导致第一个投影矩阵为 K [I | 0],第二个是 K [R | T],R 和 T 的计算如上所述。
我在这里做错了什么吗?还是可能是其他问题?任何帮助将不胜感激。
【问题讨论】: