问题标签 [slam]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
localization - 如何理解马尔可夫定位算法?
在我的论文项目中,我需要实现蒙特卡洛定位算法(它基于马尔可夫定位)。我有整整一个月的时间来理解和实现这个算法。我了解概率和贝叶斯定理的基础知识。现在我应该熟悉哪些主题才能理解马尔可夫算法?我已经阅读了几篇研究论文 3-4 次,但我仍然无法理解所有内容。
我试着用谷歌搜索我不理解的任何术语,但我无法理解算法的本质。我想系统地理解。我知道它做了什么,但我不完全理解它是如何做的或为什么会做的。
例如,在一篇研究论文中写道,马尔可夫算法可用于全球室内定位系统或当您具有多模态高斯分布时。而卡尔曼滤波器由于同样的原因不能使用。现在,我完全不明白。
第二个例子,马尔可夫算法假设地图是静态的,并考虑马尔可夫假设,其中测量是独立的并且不依赖于先前的测量。但是当环境是动态的(物体在移动)时,马尔可夫假设不成立,我们需要修改马尔可夫算法以融入动态环境。现在,我不明白为什么?
如果有人指出我应该学习哪些主题来理解算法,那就太好了。请记住,我只有一个月的时间。
slam - MRPT SLAM MRPT::slam::CMetricMapBuilderICP 警告 姿势外推失败
我正在使用 MRPT 库的 Map Builder ICP 通过使用 Sick LMS151 获取 CObservation2DRangeScan 在 C++ 上实现 2D slam。每当我向地图生成器提供 2D 范围扫描时,它都会生成姿势外推失败的警告。我如何知道代码中的错误在哪里?
预期的输出是 ICP-slam 算法预测的 2D 姿势,但事实并非如此。
但是,输出如下:
[x, y, 偏航, 协方差]
intel - 3D 扫描室内位置
我知道有一些方法可以使用英特尔 realsense 对物体或人进行 3d 扫描,我想问一下是否有任何方法可以 3d 扫描和映射室内位置,例如房间?
computer-vision - 如何使用对极约束推断 l' = Ex 或 l' = Fx?
如何 使用极线约束推导出l' = Ex ?
其中l'是核线,E是基本矩阵,x是图像平面中的投影点。
我知道根据极线约束(所有 3 个向量都位于同一平面上)我们可以写:
x .[ T x] R x ' = 0
E = [ T x] R
x。E x ' = 0
但我还没有在文献中找到如何证明 Ex' 等于核线方程以便推导出以下内容:
l ' = E x。
先感谢您。
c++ - 如何评估 KITTI 里程计数据集中的结果
我正在尝试使用 KITTI 开放数据集来做一些关于视觉里程计或视觉 INS 里程计的测试。但我无法理解 KITTI 里程计提供的代码。
我已经在 KITTI 网站上下载了里程计数据集的开发工具包(我认为它包含一些 C++ 代码)。(访问http://www.cvlibs.net/datasets/kitti/eval_odometry.php)
它提供了基准来评估与它提供的基本事实姿势相比的其他结果。我曾尝试cmake
在 Ubuntu 16.04 LTS 上构建代码,但它似乎不起作用。
开发包文件夹中有四个文件,分别是matrix.h
、matrix.cpp
、。我担心文件中可能缺少一些班级成员。如下图所示:evaluate_odometry.cpp
mail.h
evaluate_odometry.cpp
mail->finalize()
在工具包提供的任何文件中都找不到类成员。但是,我在网上搜索了这个问题,但它通常与JAVA有关。我认为这不是 JAVA 的问题。
也许我在工具包中遗漏了一些东西,我会检查一下。有人可以帮助我吗?接下来我能做什么?
更新:我再次从 KITTI 网站下载了 KITTI Odometry 开发套件,以确保它是完整的。但是,上面的问题仍然存在。
c++ - 是否有可能在单眼 ORB-SLAM2 中获得距离缩放?
我正在尝试使用单眼 ORB SLAM2 找到从相机到 ORB 特征点的真实世界距离。
我计算了每个 ORB 特征点的世界坐标与当前关键帧相机位置的世界坐标之间的欧几里得距离。对所有帧重复此过程。这样就得到了当前帧中每个ORB点的距离。
在 Viewer.cc 中
在 FrameDrawer.cc 中
然而,这个计算出的距离既不等于也不可以缩放到实际距离。同样的方法在 RGBD ORB SLAM2 中给出了相对准确的距离。
有没有什么方法可以在单眼 ORB SLAM 中缩放距离?
python - 如何改进由旋转和平移构建的相机轨迹?
我正在尝试使用一系列 2D 图像和 OpenCV 来恢复 2D 相机的轨迹。但我得到的轨迹并不像我希望的那么好。它来回走动,而不是向前走。
我在 2D 相机移动时拍摄了一系列照片(KITTI 数据集,即户外部分)。对于每两个连续的帧,我用 和 计算旋转矩阵(R)和平移向量(t) ,E = cv2.findEssentialMat()
然后cv2.recoverPose(E, ...)
我估计轨迹,假设每个平移向量的坐标在局部坐标系中给出,该位置由相应的设置旋转矩阵。
upd:每个恢复的位置看起来像 [X,Y,Z],我为每个 i 分散 (X_i, Y_i)(这些点被认为是 2D 位置),所以下面的图表是我估计的轨迹。
这是我得到的,而不是直线(相机直线向前移动)。以前的结果更糟。
绿点是开始的地方,红点是结束的地方。所以大多数时候它甚至会倒退。不过,这可能是因为一开始的一个错误,这是一切都好转的原因(对吧?)
这就是我所做的:
在我看来,recoverPose
不知何故选择了错误R
并t
在某些步骤上签名。因此,本应前进的轨迹又回到了原点。然后再往前走。
我为改善这种情况所做的工作是:
1)跳过有太多异常值的帧(我在使用后findEssentialMat
和使用后都检查过recoverPose
)
2) 将 RANSAC 方法的阈值设置为findEssentialMat
0.1
3) 将每幅图像上的特征点数量从 8 个增加到 24 个。
这并没有真正帮助。
这里需要注意的是:我知道在实践中,用于计算本质矩阵的5点算法需要的点数比8个甚至24个要多得多。也许这实际上是问题所在。
所以问题是:
1) 特征点的数量(大约 8-24 个)是否会成为恢复姿势错误的原因?
2)如果检查异常值的数量是否正确,那么我应该将异常值的百分比设置为限制?
3)我估计这样的职位(而不是简单的p[i+1] = R*p[i]+t
):
这是因为我不禁将t
其视为局部坐标中的向量,C
变换矩阵也是如此,它在每一步都更新以总结旋转。这是对还是不对?
4)我真的有可能遗漏了一些东西,因为我对该主题的了解似乎很少。有什么(任何东西!)你可以推荐的吗?
非常感谢您的宝贵时间!我会很感激任何建议。
upd:例如,这是我得到的前六个旋转矩阵、平移向量和恢复的位置。的迹象t
似乎有点疯狂。
更新:这是我的代码。(我还不是一个真正好的程序员)。主要思想是我的特征点是静态对象边界框的角,我用 Faster R-CNN 检测到(我使用了这个实现)。所以代码的第一部分检测物体,第二部分使用检测到的特征点来恢复轨迹。
c++ - 一段时间后 SolvePNP 返回错误的 rvec 和 tvec
我正在尝试使用来自 KITTI 数据集的立体相机对来估计相机轨迹。该程序在某些时候使用 cv::SolvePNP() 并且对于前 1500 帧它返回了相当好的结果,但之后它就完全疯狂了。
这是我目前正在做的事情:
- 加载 2 帧,将它们称为 P 和 Q(一帧是来自立体对的左右图片)
- 使用 SIFT/SURF/ORB 获取功能(尝试了所有这些)
- 匹配 P 中的特征,以及 P.left 和 Q.left 之间的匹配
- 根据匹配,我过滤掉匹配中不存在的关键点。
- 我对帧 P 上的点进行三角测量(请注意,我已经有 KITTI 数据集提供的相机矩阵)
- 我从 Homogeneous 转换点
现在是最重要的部分,我正在尝试实现我自己的 RANSAC,它将利用 solvePNP 以便从标准 cv::solvePNP 中获得更好的 rvec 和 tvec(请注意,我尝试使用 cv::solvePNPRansac 并且它工作正常但开始一段时间后也失败了)。所以 Ransac 流程是这样的:
7.1 我随机化 3D 空间(P 上的三角点)和 Q.left 上的相应关键点
7.2 我将它们 N 个点(N 是我的 RANSAC 参数)放入 cv::SolvePNP() 以获得在 2 帧之间移动了多少相机(注意我的 dist Coefs 是零矩阵),它返回给我一些 tvec 和 rvec我使用 cv::Rodrigues() 转换为 Matrix
7.3 我连接这些向量
7.4 我尝试使用以下公式将所有三角点(不仅仅是在solvePNP中使用的点)投影回2D图像:
https://i.imgur.com/aMlZw9z.png
(请注意,我没有在左侧得到 1,而是得到了一些 x、y、z 值,因此我将 x 和 y 与 z 分开)。
7.5 我发现 P.left 上的投影点和关键点之间的差异
7.6 现在我的 RANSAC 有一些阈值,我用它来过滤异常值,而不是在 RANSAC 的下一次迭代中使用它们。
7.7 我用新的(过滤的)点重复这个过程 K 次(K 也是 RANSAC 参数)
现在这适用于 80% 的帧,一段时间后它就失败了,因为 solvePNP 收到的分数太少。发生这种情况是因为没有一个投影点实际上超过了距离阈值。所以问题出在前帧的 rvec 和 tvec 中。
真的不知道我将显示代码的哪一部分,请求并编写它。
我预计 rvec 和 tvec 会出现小错误,但错误太高了。
robotics - SLAM中机器人如何进行姿态估计?
我知道在粒子过滤算法中,机器人可以在给定地图的情况下选择最佳姿势。但是机器人如何在没有给出地图的情况下预测 SLAM 中的位姿。我们是否从 IMU 获取数据?