A Pose-Only Solution to Visual Reconstruction and Navigation 推导过程
数学记号定义 假设相机已标定(intrinsics已知),图像坐标已归一化。论文中涉及的符号: XW=(xW,yW,zW)T\mathbf{X}_W = (x_W, y_W, z_W)^TXW=(xW,yW,zW)T :世界坐标系中的3D点(上标T表示转置)。 XCi=(xCi,yCi,zCi)T\mathbf{X}^{C_i} = (x^{C_i}, y^{C_i}, z^{C_i})^TXCi=(xCi,yCi,zCi)T :第i个相机坐标系中的3D点(上标T表示转置)。 Xi=(xi,yi,1)T\mathbf{X}_i = (x_i, y_i, 1)^TXi=(xi,yi,1)T :第i个视图中的归一化图像坐标。 RiW\mathbf{R}_{iW}RiW :第i个相机的旋转矩阵(正交矩阵,满足 RiTRi=I\mathbf{R}_i^T \mathbf{R}_i = \mathbf{I}RiTRi=I ,其中 I\mathbf{I}I 是单位矩阵)。 tWi∈R3\mathbf{t}_{Wi} \in \mathbb{R}^3tWi∈R3...
新一代的导航算法研究思路
传统的导航算法介绍 传统定位方法通常依赖于先验全局地图和外部传感器的结合来实现。 系统首先利用外部传感器(如GPS、激光雷达、摄像头或里程计)进行感知输入。 当有先验全局地图时,传感器信息与全局地图进行匹配,从而得到全局定位结果。 在缺乏全局定位或精度不足的情况下,传感器数据还会用于构建局部地图。局部地图与传感器观测不断更新,并通过局部定位模块进行实时位置估计。 局部定位和局部地图之间形成闭环:局部定位依赖地图进行匹配,而地图的更新也基于局部定位的结果。 传统路径规划与控制通常分为全局路径规划和局部路径规划两个层次: 在全局层面,系统依赖先验全局地图和全局定位,通过路径搜索算法(如A*、Dijkstra或基于图的优化方法)生成一条从起点到目标点的可行路径。 在局部层面,系统结合局部定位和局部地图,实时进行局部路径规划。局部规划能够在已有全局路径的指导下,动态避障、修正轨迹,使机器人适应实际环境中的局部变化。 最终,规划出的路径由本体感知(如速度、姿态、动力学状态反馈)驱动的反馈控制模块来执行,确保机器人按照预期轨迹稳定运行。 这种架构实现了“全局目标导向 + 局部动态...
Theseus-教程0
Theseus Theseus 是一个基于 PyTorch 的可微分非线性优化库。 Theseus 的动机来源于机器人学和计算机视觉中的一些问题,这些问题可以被表述为可微分的非线性最小二乘优化问题,例如同时定位与建图(SLAM)、运动规划以及捆绑调整(bundle adjustment)。这些问题可以被广泛归类为结构化学习(structured learning):在这种学习方式中,神经网络组件可以与已知的先验以模块化的方式结合,从而在传统方法的基础上发挥深度学习的优势。虽然这一领域的兴趣正在迅速增加,但现有的工作仍然是零散的,并且大多基于特定应用的代码库。Theseus 通过提供一个与问题无关的结构化学习平台来填补这一空白,使用户能够轻松地将神经网络与表示为可微分模块的非线性优化先验相结合,并对其进行端到端训练。 本教程将介绍在 Theseus 中解决此类优化问题的基本构建模块;在接下来的教程中,我们将展示如何将这些构建模块组合起来,逐步解决不同方面和复杂度的优化问题。本教程涵盖六个核心概念模块: 变量(Variables):对 torch 张量的命名封装,是在 Theseu...
Theseus-教程1
Theseus 最小二乘优化 本教程演示了如何使用 Theseus 解决曲线拟合问题。 本教程中的示例灵感来源于 Ceres 的 教程,并按照 Ceres 中的 曲线拟合示例 和 鲁棒曲线拟合示例 的结构进行设计。 二次曲线拟合 在本教程中,我们将展示如何拟合一个二次函数: y=ax2+by = ax^2 + b y=ax2+b 步骤 0:生成数据 我们首先从二次函数 x2+0.5x^2 + 0.5x2+0.5 中采样点来生成数据。 在这些数据上,我们添加高斯噪声,标准差 σ=0.01\sigma = 0.01σ=0.01。 12345678910111213141516171819import torchtorch.manual_seed(0)def generate_data(num_points=100, a=1, b=0.5, noise_factor=0.01): # 生成数据:从上面提到的二次曲线中采样 100 个点 data_x = torch.rand((1, num_points)) noise = torch.randn((1, num_po...
Theseus-教程2
通过 Theseus 层进行微分 本教程展示了如何通过 Theseus 层进行微分,以求解一组相关的最小二乘优化问题。 教程 1 中的优化问题都是通过 Theseus 非线性最小二乘优化器 各应用一次完成的,因为它们是简单的曲线拟合问题。 Theseus 也可以用于解决更复杂的优化问题,例如被优化量之间存在依赖关系的情况。 在本教程中,我们将解决一组共享一个公共参数的曲线拟合问题。 和教程 1 类似,为了简单起见,我们选择二次函数:我们希望拟合 y=ax2+by = ax^2 + b y=ax2+b 其中 a 对所有问题固定,而 b 对每个问题不同。 从高层次来看,我们通过 torch 自动微分 优化 a 的值,并使用 Theseus 的非线性最小二乘优化器在给定 a 的情况下优化 b。 本笔记本的其余部分将详细讲解实现该方法的必要步骤。 步骤 0:数据生成 与之前一样,我们首先通过从一组二次函数 3x2+b3x^2 + b3x2+b 中采样点来生成数据,其中 b=3,5,…,21b = 3, 5, \dots, 21b=3,5,…,21。在此基础上,我们加入标准差为 σ=0.0...
Theseus-教程3
创建自定义代价函数 在本教程中,我们将展示如何创建一个自定义的代价函数,以满足特定应用的需求。虽然我们始终可以通过编写误差函数来使用 AutoDiffCostFunction,但对于计算量较大的应用,派生一个新的 CostFunction 子类并使用解析形式的雅可比矩阵通常会更高效。 在本教程中,我们将演示如何编写一个自定义的 VectorDifference 代价函数。该代价函数的误差是两个向量之间的差值。 注意:VectorDifference 是 Theseus 库中已提供的 Difference 代价函数的简化版本(见教程 0)。Difference 可以用于任意 LieGroup,而 VectorDifference 只能用于向量。 初始化 任何 CostFunction 子类在初始化时,都应当接收一个 CostWeight 以及计算代价函数所需的所有参数。 在这个示例中,我们为 VectorDifference 设置了 __init__ 函数,它需要输入两个向量来计算差值: 需要被优化的向量 var, 作为比较基准的向量 target。 此外,__init__ 函...
Theseus-教程4
运动规划 第 1 部分:将运动规划建模为非线性最小二乘优化 在本教程中,我们将学习如何实现 GPMP2(Mukadam 等人,2018)运动规划算法,应用于一个在二维平面环境中的机器人。 目标是:在给定起点位姿和目标位姿以及环境表示的情况下,找到机器人的轨迹(位姿和速度)。这个问题可以建模为一个优化问题,其优化变量为机器人在一段总时间步长轨迹上的二维位姿和二维速度(在固定的时间间隔上)。 在本例中,我们将优化的目标函数定义为以下代价项的加权组合: 边界条件:轨迹应从起始位姿以零速度出发,并在目标位姿以零速度结束。 避障约束:轨迹应避免与环境中的障碍物发生碰撞(我们使用带符号距离场 signed distance fields)。 平滑性约束:轨迹应当平滑(我们使用零加速度先验 zero acceleration prior)。 1234567891011121314151617181920212223import randomimport matplotlib as mplimport numpy as npimport torchimport torch.utils.dat...
Theseus-教程5
运动规划 第 2 部分:可微分运动规划 在本教程中,我们将在第一部分的基础上,展示如何对使用 Theseus 实现的运动规划器进行求导。特别地,我们将演示如何在 PyTorch 中设置一个模仿学习(imitation learning)循环,为 TheseusLayer 提供初始化值,从而使其更快收敛到高质量轨迹。如果你还没有看过第一部分的运动规划教程,建议先回顾第一部分再继续本部分内容。 12345678910111213141516171819202122232425import random import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport torchimport torch.nn.functional as Fimport torch.utils.datafrom IPython.display import clear_outputimport theseus as thimport theseus.utils.examples as theg%load_ext...
科研总结(七)论文写作的层次感
前言 论文写作的核心在于站在大领域读者的角度,循序渐进地展开背景与动机,引导读者理解研究工作的价值。如果过早、过度强调创新点,往往因为专业术语密集而让读者难以跟进;而如果仅仅停留在基础知识的工程化描述,又会显得缺乏创新性。 因此,论文的写作应当由浅入深,从背景到问题,再到方法和创新点,逐步递进,帮助读者自然理解本文的贡献。 一、确定论文的层次 论文的逻辑结构可以分为几个层次: 大领域的研究目标 例:利用视觉传感器估计机器人的里程计;机器人导航。 大领域的研究方法 例:基于特征的视觉里程计;基于直接法的视觉里程计。 子领域的研究目标 例:相对位姿估计;目标导航。 子领域的研究方法 例:基于直接图像对齐的相对位姿估计;基于特征关联匹配并求解几何关系的相对位姿估计;基于模块化的目标导航;端到端的目标导航。 科学问题 例:直接图像对齐难以应对光照变化;特征关联匹配的误差分布难以建模。 本文的研究方法 针对上述科学问题,本文提出了相应的解决方案。 简而言之: 目标层次:从大到小逐步收缩; 方法层次:与目标一一对应,展示多种解决思路;...
从传统光流到端到端的光流
一、从直觉出发——光流该如何估计 什么是光流? 光流(optical flow)是「像素运动」的场。 直观来说,就是相邻两帧之间「每个像素往哪里跑了」。 想象: 你看一段视频,盯住一块特征花纹,它从第1帧的 (x, y) 移动到第2帧的 (x+u, y+v)。那么光流就是 (u, v)。 🌟 观点1:从像素层面估计光流 1️⃣ 假设亮度和纹理在运动中保持大致不变 想象你看到视频里的一个小花纹块,它虽然动了,但形状和亮度大体没变。 也就是说,它只是位置发生了变化。 2️⃣ 在两张相邻帧之间寻找最相似的位置 直觉上,我们可以在第二张图片上「到处找」,看如果把这个块「平移」过去,哪里和原来最像。 ✅ 我们试着往一个方向挪一点,看相似度好不好; ✅ 如果不够像,就换个方向继续试; ✅ 最后找到一个相似性最高的位置,就说它运动了这么远。 3️⃣ 多次迭代、精细调整位置 由于一次挪动可能找不准,常常需要多次「微调」。 就好像你在人群里找朋友,你先大概看一圈,然后慢慢走近对上细节。 4️⃣ 全局约束:让运动场平滑 但只靠局部相似会出错,比如纯色区域、模糊区域信息不...



