关键词:空间旋转、旋转轴、刚体旋转

用途:相机位姿估计、无人机位姿估计

文章类型:概念、公式总结(本文不带推倒过程,若想了解公式是如何推出来的请自习搜索文献),C++函数展示

@Author:VShawn(singlex@foxmail.com)

@Date:2016-11-04

@Lab: CvLab202@CSU

本文接上一篇《空间点绕轴旋转公式&程序(C++)》,继续讨论空间内的旋转问题,可能会用到上一篇中定义的函数。

问题四:空间内的坐标系旋转(相机坐标系在世界坐标系中的旋转)

好了,现在问题越来越复杂了,这次的问题涉及两个坐标系:世界坐标系W相机坐标系C。

做过相机标定或者研究过相机模型的人对这两个坐标系应该是相当熟悉的了,对于不了解这方面的同学可以这样理解:

  1. 世界坐标系就是前文一直在用着的坐标系,它规定了所有东西的绝对坐标。
  2. 相机坐标系是人眼或者是相机看物体的一个坐标系,它能够表示我观测的这个物体距离我有多远,方向角是多少。(其z轴为视线正中线)

下图中的O即为相机坐标系原点,也就是人眼的位置,OZc表示的是当前视线的方向,

Ow则是世界坐标系原点。

于是我们的问题就是,人站在某点拍摄世界坐标系的原点Ow下标w表示该坐标是在世界坐标系中的),拍摄出的原点正好落在图像中心,现在我通过某种方法(解PNP问题)计算出Ow在相机坐标系下的坐标为(下标c表示该坐标定义在相机坐标系内),求相机或者说是人位于世界坐标系的哪里。

这个问题,当相机坐标系跟世界坐标系完全平行(指两对坐标系的三个轴都相互对应平行)的时候很简单,无需考虑旋转,相机的位置就是。实际上,只要相机坐标系的三根轴与世界的三轴平行(这种平行不需要保证一一对应),这个问题都很好解决。比如下面几幅图的情况(黄点为世界坐标系原点Ow),只要知道世界坐标系的原点Ow在相机坐标系中的坐标,就可以很容易计算出相机的位置。

然而,一旦出现了下面的情况,那么问题就不那么好解决了。

比如说相机的状态是这样:

你就很难通过相机坐标系下的Ow坐标,计算出相机在世界坐标系下的位置。因为其中涉及到了相机坐标系在世界坐标系中的旋转问题。

那么如何求解这个问题呢,事实上,在上文中通过某种方法(解PNP问题)求出原点Ow在相机坐标系下的坐标的同时,我们也获得了相机坐标系的旋转矩阵(没错,就是求相机的外参数矩阵:旋转矩阵r&平移矩阵t),这个"某种方法"我将在其他文章中给大家展示。平移矩阵t可以告诉世界坐标系原点Ow在相机坐标系中的坐标,我们暂且假设为点P=(x0,y0,z0),向量OcP为Oc指向Ow的向量。而旋转矩阵r,可以求出三个欧拉角【具体如何计算参考《根据相机旋转矩阵求解三个轴的旋转角/欧拉角》】。当相机坐标系C按照z轴、y轴、x轴的顺序旋转以上角度后变成坐标系C3,C3将与世界坐标系W完全平行。此时如果知道Ow在C3系中的坐标,自然就知道了Oc在世界坐标系W中的坐标。

显然,相机坐标系经历了三次旋转后,原点Oc位置会保持不变,而点P跟随坐标系进行了三次旋转,那么向量OcP不再指向Ow

为了抵消旋转的作用,每次对坐标轴旋转后,我们需要对点P进行反向旋转,使得坐标系C3中的向量OcP依然能指向Ow

于是得到解决问题的步骤:

第一次旋转:

原始相机坐标系C绕z轴旋转了变为C1系,此时P=P0=(x0,y0,z0),那么单独将P点绕z轴旋转,得到P1=(x1,y1,z1),为C1系中Ow的坐标。

第二次旋转:

C1绕y轴旋转了变为C2系,此时P1=(x1,y1,z1),那么将P1点绕y轴旋转,得到P2=(x2,y2,z2),为C2系中Ow的坐标。

第三次旋转:

C2绕x轴旋转了变为C3系,此时P2=(x2,y2,z2),那么将P2点绕x轴旋转,得到P3=(x3,y3,z3),为C3系中Ow的坐标。

于是世界坐标系中,相机的位置坐标为(-x3,-y3,-z3)。

至于程序就很简单了,只需要调用几次《空间点绕轴旋转公式&程序(C++)》中的函数即可。

最后,本文的成果用在了《相机位姿估计1:根据四个特征点估计相机姿态》中。

子坐标系C在父坐标系W中的旋转问题的更多相关文章

  1. Repeater 嵌套,子级Repeater获取 父级Repeater 中的值

    第一种方法,子级Repeater中绑定父级的某个字段: <%# DataBinder.Eval((Container.NamingContainer.NamingContainer as Rep ...

  2. ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

    convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中.重点说明:基于...   不一定要是真实的,  convertToWorldSpace 的结果也只是一个新 ...

  3. 子窗口访问父页面iframe中的iframe,top打开的子窗口访问父页面中的iframe中的iframe

    子窗口访问父页面iframe中的iframe 子窗口访问最顶层页面中的iframe中的iframe top打开的子窗口访问父页面中的iframe中的iframe top打开的子窗口访问最顶层页面中的i ...

  4. 在idea中创建maven父子工程,子工程无法导入父工程依赖的问题

    创建maven父子工程时遇到一个问题,当子工程的名称前缀和父工程的名称一样时,子工程会出现一系列的问题.比如我的父工程名称是microservicecloud,子工程名称是microservicecl ...

  5. WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问

    原文:WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问 1,在菜单中访问 弹出菜单的控件 var mi = sender as MenuItem;//菜单条目 MenuItem ...

  6. spring 中<ref parent="">标签是什么意思;ref标签与ref属性有什么不同;子容器如何引用父容器的bean

    spring的配置文件可能会有多个<property name="a" ref="b" />就是找当前配置文件里的bean 也就是id为b的 < ...

  7. JS子元素oumouseover触发父元素onmouseout

    原文:JS子元素oumouseover触发父元素onmouseout JavaScript中,父元素包含子元素: 当父级设置onmouseover及onmouseout时,鼠标从父级移入子级,则触发父 ...

  8. uni-app 子组件如何调用父组件的方法

    1.在父组件methods中定义一个方法: changeType:function(type){ this.typeActive = type; alert(type); } 2.在父组件引用子组件时 ...

  9. 二、vue学习--父元素如何获取子元素的值,子元素如何获取父元素的值

      下图是父元素: 下图是子元素,获取父元素的值,使用props定义属性,这样就可以获取到父元素上传过来的set .place.type,拿到值就可以做一些自己的逻辑处理 二.子元素给父元素传值? 下 ...

随机推荐

  1. 编写第一个MapReduce程序—— 统计气温

    摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...

  2. SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色 SP2-0611: 启用 STATISTICS 报告时出错

    援引: SP2-0618: 无法找到会话标识符.启用检查 PLUSTRACE 角色 SP2-0611: 启用 STATISTICS 报告时出错 问题描述及解决方法: SQL*Plus: Release ...

  3. 拼接LINQ动态表达式

    using System; using System.Linq; using System.Linq.Expressions; public static class LinqBuilder { // ...

  4. SQL 数据分页查询

    最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...

  5. JS新API标准 地理定位(navigator.geolocation)/////////zzzzzzzzzzz

    在新的API标准中,可以通过navigator.geolocation来获取设备的当前位置,返回一个位置对象,用户可以从这个对象中得到一些经纬度的相关信息. navigator.geolocation ...

  6. c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)

    c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...

  7. 基于webpack使用ES6新特性(转载)

    本文转载自: http://www.tuicool.com/articles/vye2ea6

  8. 前端开发--面试题整理(JS篇)

    1.截取字符串abcdace的acealert('abcdace'.substring(4)); 2.规避javascript多人开发函数重名问题命名空间封闭空间js模块化mvc(数据层.表现层.控制 ...

  9. WCF、Net remoting、Web service概念及区别

    Windows通信基础(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit ...

  10. 【转】mysql对large page的支持

    昨天同事问我关于大页内存的事,我也只是有个模糊的概念,从别的博客转过来的,先记录下 在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TL ...