【学习记录】普朗克坐标 Plücker coordinates
一、普朗克坐标的表示方法
普朗克坐标是表示空间直线的一种方法,相较于用只存储空间直线上两个点的方法,普朗克坐标能够更好地表示空间直线。普朗克坐标采用六自由度的表示方法,用六个量进行表示,其中六个量可以分为两组,每组为一个三维向量,一般记为m和d,其中d表示空间直线的方向向量,直接用端点的三维坐标相减即可得到,而m表示的是反投影平面的法向量,这里的反投影平面,指的是相机光心出发,分别指向图像上线段的两个端点,由此形成的一个反向延长平面,普朗克坐标在这里一般用的是两条射线的叉乘来表示。
考虑到叉乘的几何意义,这里m的模,表示的实际上就是空间线段、相机光心围成三角形的面积的两倍,所以我们可以这样去理解普朗克坐标,我们首先用d锁死了空间直线的方向和截取线段的长度,用m的模确定了围成三角形的面积,三角形底确定,那么可以顺势得到高,也就是相机光心到线段的距离,而m的方向又确定了反投影平面的方向,由此直接确定出我们要表示的空间直线。
普朗克坐标存在的一个问题是自由度的冗余,高中就学过的空间直线表示方法里,一条空间直线需要四个参数,也就是ax+by+cz+d=0中的abcd,所以普朗克坐标在优化时会因为冗余的问题导致优化的不方便,在PL-VIO中采用的是坐标转换的方法,当需要计算相交或者求误差时,就是用普朗克坐标来计算,而涉及优化时,就用单独的函数转换为正交坐标,优化完再转换回去,这种方法虽然麻烦,但确实很好地解决了优化时的复杂。
二、普朗克坐标的应用
三角化
线段的三角化是一个很重要的问题,在单目SLAM中,深度的恢复基本使用的都是三角化的策略,对于点,三角化的策略已经十分稳定,但是线段的三角化使用的缺不多,PLSLAM中使用的方法是对线段的两个端点进行三角化,空间两点的连线就成为了空间线段的表示方法,这种方法虽然可以完成线段三角化的任务,但是显然对线段的利用程度不高,只取两个端点进行深度的恢复,而剩下的点根本没有起到什么约束作用,当然也可以用采样点的方法,采样出许多个点然后三角化,对恢复深度的点进行直线的拟合从而得到空间信息。从这个角度来看,我们为了线段的空间表示付出了太多,又是采样点又是多个三角化,还要再次剔除离散点拟合。
使用普朗克坐标一个很大优势在于,我们可以用普朗克坐标直接计算出空间线段的表示。PL-VIO使用的就是这个方法,其本质还是利用光心、2d线段的端点形成的反向延长平面相交来快速计算,简单来说就是联立两个空间平面方程,解出一个空间直线方程。
所以我们需要的就是用π1和π2两个平面方程,解出直线l的方程,参考PL-VIO,这里我们使用两个平面方程,可以直接解出直线L的空间方程的普朗克坐标形式:
在这个式子中,左侧的4×4矩阵,左上角3×3矩阵为普朗克坐标中方向向量的反对称矩阵形式,左下角的1×3向量为平面法向量的转置,所以这个4×4矩阵中就已经包含了普朗克坐标需要的两个内容。再看式子右侧,需要的是两个平面的方程形式,这里的平面方程是一个1×4的向量形式,其定义为:
这个量其实就是空间平面的方程里的四个量,具体来说就是xyz的系数以及常数项:
上面的式子展开,得到的常数项进行整合:
由于采用了点法式的写法,所以前三个量可以直接用向量叉乘的方法得到:
这样看,在线段三角化的过程中,我们可以用两个平面的空间方程直接解出线的普朗克坐标形式。
坐标系的转换
点的转换我们可以直接使用点坐标乘变换矩阵实现坐标系的移动,使用普朗克坐标的线段也可以实现类似的变换,参考DPLVO:
这样我们就可以直接利用变换矩阵,将R和t变换一下形成H矩阵,之后就可以直接投影实现坐标系的变换。
投影到成像平面
如果我们已经有空间直线的三角化后的普朗克坐标,我们可以使用普朗克坐标直接实现空间到成像平面的转换,参考PL-VIO,nc为普朗克坐标中前面三个数,也就是延长平面法向量的部分,k为相机的内参矩阵变形:
当成像平面为单位化平面时,内参矩阵变形为单位矩阵,这个时候直接取普朗克坐标的前三位即为投影直线的三个描述。
角度表示
在DPLVO里还提到了一种用夹角来转换出普朗克坐标的方法,这种方法里面使用反向延长平面以及端点的反向延长线来进行表示,反向延长平面的法向量记为:
端点的反向延长方向记为:
α与方向向量之间的夹角记为θL,τL记为线到到光心的距离,那么线段的普朗克坐标也可以表示为:
点到线的距离的衡量
在EDPLVO中,作者使用普朗克坐标来快速计算点到直线的距离,本身上还是利用普朗克坐标的含义,也就是确定面积和底的长度,从而找出三角形的高。
在这种情况下,计算点到直线的距离需要知道点在相机坐标系下的坐标:
【学习记录】普朗克坐标 Plücker coordinates相关推荐
- 大创学习记录(四)之yolov3代码学习
PyTorch-YOLOv3项目训练与代码学习 借助从零开始的PyTorch项目理解YOLOv3目标检测的实现 PyTorch 对于PyTorch就不用多说了,目前最灵活.最容易掌握的深度学习库,它有 ...
- Redis的学习记录
Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...
- 架构与设计 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)的学习记录
唉 时至今日,已经不知道在嵌入式的道路上到底挣扎了多少个岁月,总感觉要"病入膏肓"了.此间总是不时出现一些疑惑:人家搞 Java.搞 C# 的动不动就是什么架构 / 框架的,搞 ...
- java 工程文件改名后显示绿色加号_Gradle学习记录018 构建java JVM工程 part1
详细学习如何用Gradle构建标准的java项目.第一部分.该学习记录基于Gradle官方网站资料.本篇参考链接如下: https://docs.gradle.org/current/userguid ...
- Unity学习记录——模型与动画
Unity学习记录--模型与动画 前言 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业7 编程题:智能巡逻兵 1.学习参考 除去老师在课堂上讲的内容,本次作业代码与操作主要参考了 ...
- JavaScript-WebAPIs学习记录
JavaScript-WebAPIs学习记录 浏览器交互效果 console.dir(); // 更好地查看里面的属性和方法 javascript:void(0); 或者 javascript:; 可 ...
- Opencv 入门篇学习记录(图片)
title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...
- 【按键精灵学习记录】以DOTA2人机为例
[按键精灵学习记录]以DOTA2人机为例 一.写在前面 二.准备工作 1.环境准备 2.需求分析 3.流程图 三.代码实现 1.命令分析 2.代码实现 状态判断 主循环 英雄选择 游戏中 3.实测 四 ...
- DAB-Deformable-DETR代码学习记录之模型构建
DAB-DETR的作者在Deformable-DETR基础上,将DAB-DETR的思想融入到了Deformable-DETR中,取得了不错的成绩.今天博主通过源码来学习下DAB-Deformable- ...
最新文章
- 产品经理其实是一种能力,而非职业
- SevOne将SD-WAN监控扩展到VMware NSX
- Same Sum Blocks
- Java知识系统回顾整理01基础05控制流程07结束外部循环
- 【牛客 - 1080C】tokitsukaze and Soldier(思维,偏序问题)
- 4.Transfer Learning
- python时间格式转换time模块
- Android 应用性能优化(4)---Android App性能评测分析-启动时间篇
- vim删除多行_vim文本编辑器
- 计算机应用基础任务化教程试题及答案,计算机应用基础任务化教程windows7office2010试卷(带操作题)及答案.doc...
- [App Store Connect帮助]二、 添加、编辑和删除用户(5)创建一个沙盒测试员帐户...
- Unicode 汉字内码表
- FFmpeg 和 MP4Box 几个命令
- 手机浏览器一键跳转微信加好友和公众号关注的方法
- offer和面经分享(内含offer截图)
- 如何用Matlab在极坐标系下绘图并调整极坐标初始角位置
- linux删除指定的行
- 深入浅出解答hero刷rom的各种问题
- 剑灵哪个服务器人最多2017,剑灵2017职业排行榜
- Kmeans(C/C++实现,以足球队聚类为例)