slam十四讲 03 Eigen实践之不同坐标系下的坐标转换

news2024/11/25 2:21:49

目录

1. 题目

2. 使用欧式变换

3. 使用四元素


1. 题目

已知

(1) 世界坐标系到相机1坐标系变换关系为T_{(R_{1},W)},即相机1的位姿q1=[0.35,0.2,0.3,0.1]^T, t1=[0.3,0.1,0.1]^T.

(2) 世界坐标系到相机2坐标系变换关系为T_{(R_{2},W)},即相机2的位姿q1=[-0.5,0.4,-0.1,0.2]^T, t2=[-0.1,0.5,0.3]^T.

(3) 相机1下的某点观测坐标是P_{R_{1}}

求该点在相机2坐标系下的坐标。假设该点的世界坐标是P_W,则有

2. 使用欧式变换

世界坐标系下的坐标到相机1坐标系下的坐标变换(利用欧式变换公式

P_{R_{1}} = T_{(R_{1},W)} P_{W}

世界坐标系下的坐标到相机2坐标系下的坐标变换

P_{R_{2}} = T_{(R_{2},W)}P_{W}

第一个公式两边左乘以T的逆,求得P_W再带入第二个公式,求得该点在相机2坐标系下的坐标

P_{R_{2}} = T_{(R_{2},W)}T_{(R_{1},W)}^{-1}P_{R_{1}} = T_{(R_{2},W)}T_{(W,R_{1})}P_{R_{1}}

书上的公式如下。

:在SLAM中,位姿是世界坐标系到相机坐标系的变换,包括旋转与平移。

3. 使用四元素

同样,假设该点的世界坐标是P_W 

世界坐标系下的坐标到相机1坐标系下的坐标变换(四元素变换公式

P_{R_{1}} = q_{1}P_{W}q_{1}^{-1} + t_{1}   ---------------公式1

世界坐标系下的坐标到相机2坐标系下的坐标变换

P_{R_{2}} = q_{2}P_{W}q_{2}^{-1} + t_{2}  ---------------公式2

变换第一个公式,两边左乘q_1逆,如下。

q_1^{-1}P_{R_1}=P_Wq_1^{-1}+q_1^{-1}t_1

再两边右乘q_1,如下。

q_1^{-1}P_{R_1}q_1=P_W+q_1^{-1}t_1q_1 

P_W带入公式2中,数学公式如下

P_{R_2} = q_2(q_1^{-1}P_{R_1}q_1 - q_1^{-1}t_1q_1)q_2^{-1} + t_2 = q_2q_1^{-1}(P_{R_1}-t_1)q_1q_2^{-1}+t_2 = q_2q_1^{-1}(P_{R_1}-t_1)(q_2q_1^{-1})^{-1}+t_2

eigen特点是qpq^{-1} 写成qp,即省了后面取逆操作,所以上面的公式eigen形式如下。

P_{R_2} = q_2q_1^{-1}(P_{R_1}-t_1)+t_2

#include <iostream>
#include <vector>
#include <algorithm>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Geometry>
 
using namespace std;
using namespace Eigen;
 
int main(int argc, char** argv) {
  // 已知两个相机的位姿
  // 即p1的位姿是q1 = [0.35,0.2,0.3,0.1]^T, t1 = [0.3,0.1,0.1]^T
  // 即p2的位姿是q2 = [-0.5,0.4,-0.1,0.2]^T, t2 = [-0.1,0.5,0.3]^T    
  Quaterniond q1(0.35, 0.2, 0.3, 0.1), q2(-0.5, 0.4, -0.1, 0.2);  // 旋转。coeffs的顺序是(x,y,z,w),w为实部,前三者为虚部
  q1.normalize();  // 注意,四元素使用之前需要归一化。
  q2.normalize();
  Vector3d t1(0.3, 0.1, 0.1), t2(-0.1, 0.5, 0.3);  // 平移

  // 已知p1在相机1坐标系下的坐标
  Vector3d p1(0.5, 0, 0.2);
 
  // 1, 利用四元素变换
  Vector3d p2;
  p2 = q2 * q1.inverse() * (p1 - t1) + t2;
  cout << endl << p2.transpose() << endl;
  
  // 2, 利用欧式变换矩阵
  Isometry3d T1w(q1), T2w(q2);  // 用四元素,初始化欧式变换矩阵
  T1w.pretranslate(t1);
  T2w.pretranslate(t2);
  // 求p1在相机2坐标系下的坐标
  p2 = T2w * T1w.inverse() * p1;  // 公式
  cout << endl << p2.transpose() << endl;

  return 0;
}

-0.0309731 0.73499 0.296108

-0.0309731 0.73499 0.296108

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

影响无线状态监控系统质量的关键:如何选择MEMS传感器?

随着工业领域对设备状态监测的需求不断增加&#xff0c;智能无线监测器成为一种重要的技术工具。其中&#xff0c;MEMS&#xff08;微机电系统&#xff09;传感器作为无线状态监控系统中的核心组件&#xff0c;发挥着关键的作用。本文将介绍如何为无线状态监控系统选择最佳的ME…

端午将至,VR全景奉上别开生面的“云上”端午节

端午将至&#xff0c;街上早已飘溢着粽子的香气&#xff0c;大家知道端午习俗有哪些吗&#xff1f;除了吃粽子&#xff0c;还有赛龙舟、悬艾蒿、踩露水、佩香囊等。搭乘端午假期的“顺风车”&#xff0c;多地都在推出活动吸引游客&#xff0c;各地文旅期望打造集文化、传承、艺…

在Linux中部署Flask+Gunicorn+Nginx

flask是一个轻量级的基于Werkzeug和Jinja2模板引擎的Web应用框架。gunicorn能与很多Web框架兼容&#xff0c;执行起来很简单&#xff0c;资源消耗很少&#xff0c;并且运行速度很快。 flaskgunicornnginx部署在公网IP为x.x.x.x的服务器上。 flask需要部署在Python3的环境中。…

KingIOServer采集杰控OPC UA服务器数据测试

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 上一篇测试了同一台电脑上&#xff0c;KingIOServer采集杰控OPC DA服务器数据&#xff0c;本篇测试用KingIOServer采集杰控OPC UA服务器数据。 以下记录测试过程。 一、 KingIOServer的OPC UA数据采集介绍 KingIOSer…

少儿英语-思维导图学语法-特殊名词变复数

“通过思维导图&#xff0c;轻松学语法” 正文&#xff1a; 今天我们将一起探索英语中那些特殊的名词复数形式。学习特殊名词的复数变换可以让我们的英语更加地道和流利。让我们来看看一些有趣的例子吧&#xff01; "Man" 变成 "Men" 你可能已经知道 &q…

【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

目录 一、什么是数据结构(1) 概念(2) 分类 二、线性表三、数组&#xff08;Array&#xff09;(1) 数组的底层结构(2) 数组缺点 四、动态数组&#xff08;Dynamic Array&#xff09;接口设计五、动态数组的设计和基本代码实现(1) 成员变量(2) 代码① get ()② indexOf ()③ clea…

嵌入式实时操作系统的设计与开发New(二)

轮询系统 轮询系统也称为简单循环控制系统&#xff0c;是一种最简单嵌入式实时软件体系结构模型。 在单个微处理情况下&#xff0c;系统由多个函数完成&#xff0c;每个函数负责该系统的一部分功能。 这些函数被循环调用执行&#xff0c;即它们按照一个执行顺序构成一个单向的…

nand flash 介绍

flash名称由来 Flash的擦除操作是以block块为单位的&#xff0c;与此相对应的是其他很多存储设备&#xff0c;是以bit位为最小读取/写入的单位&#xff0c;Flash是一次性地擦除整个块&#xff1a;在发送一个擦除命令后&#xff0c;一次性地将一个block&#xff0c;常见的块的大…

如何在VMware Workstation虚拟机上快速部署AntDB社区版

AntDB社区版采用了一键部署架构&#xff0c;步骤简单&#xff0c;耗时短&#xff0c;部署快&#xff0c;为大家的快速体验提供了极大便利。 这里将通过环境准备、下载AntDB社区版、部署AntDB社区版三个部分跟大家一起体验如何快速完成AntDB社区版在VMware Workstation虚拟机上…

(十二)反射与特性 -反射与预定义特性(1)

一、反射 1、什么是反射 了解反射之前&#xff0c;要先了解一下元数据。元数据指保存在程序集中的一些有关程序及其类型的数据&#xff0c;包括类、结构、委托、接口和枚举等&#xff09;的成员和成员的信息。 程序在运行时&#xff0c;可以查看程序集以及其本身的元数据&…

babycrypt 自己出的第一道逆向题目 WP

Patch掉反调试 先进行了Base32解密&#xff0c;之后是RC4加密 Base32编码表是RC4加密后存储的&#xff0c;动调得到 动调可以看出&#xff0c;经过base32编码密文会在首部添加M7WGC76B 之后密文进行RC4加密 动调得到第二处RC4加密的密钥 解密过程 def rc4(data, key): S l…

面试题:分布式事务有哪些方案及运用场景

一、分布式事务概述 分布式事务是指涉及多个不同资源或数据库的事务处理&#xff0c;这些资源或数据库分布在不同的网络节点上&#xff0c;通过协调器将多个事务组合成一个分布式事务。分布式事务的目的是确保多个事务操作要么全部成功&#xff0c;要么全部失败&#xff0c;保…

白嫖Tesla T4 GPU玩转Stable Diffusion Webui

想要玩stable diffusion&#xff0c;算力不可少&#xff0c;白嫖google colab Tesla T4 GPU 玩转Stable Diffusion Webui 1、google colab上安装stable diffusion webui https://colab.research.google.com/drive/1qL5eD2VESnop8mrbFcHzMmfzqzmRMMF4?uspsharing 在google col…

提高代码调试能力——IDEA debug技巧

一、文章概述 idea debug调试的一些方法 二、按键简单介绍 如上如是debug时的按钮&#xff0c;标上序号便于说明。 1、重新开始调试 图中是已开是debug模式&#xff0c;不管你此时调试到哪个地方&#xff0c;此时点击1就可以重新开始运行程序调试&#xff1a;等价于&#x…

vue配置反向代理的使用

反向代理&#xff1a;常用于生产环境&#xff0c;项目部署时服务器的配置。 反向代理&#xff1a;同样创建一个代理服务器&#xff0c;用于接收客户端发送的请求&#xff0c;再将请求转发给内部网络上的服务器&#xff0c;从服务器中获取数据并返回给客户端。也就是 代理服务端…

一文了解:计算机视觉领域下自监督学习方法原理

计算机视觉领域下自监督学习方法原理 导语为什么在计算机视觉领域中进行自我监督学习&#xff1f; 自监督学习方法Generative methodsBEiT 架构 Predictive methodsContrastive methodsBootstraping methodsSimply Extra Regularization methods 导语 自监督学习是一种机器学习…

【NLP】从双曲面到双曲几何庞加莱盘

一、说明 在研究双曲空间的时候,不能不遇到双曲面的问题。双曲几何在什么样的双曲面建立?其它几何元素在双曲面的表现。庞加莱盘不是双曲几何的一部分,而是一个投影平面,自然语言处理中,图网络不是卷积神经网络。本篇从双曲方程开始,展开双曲空间的探讨。 二、双曲面总论…

数据库系统概述——第四章 数据库安全性(知识点复习+练习题)

&#x1f31f;博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&am…

【汤4操作系统】深入掌握操作系统-输入输出系统篇

第五章 输入输出系统 I/O系统简介 设备管理对象&#xff1a;主要是IO设备 设备管理的基本任务&#xff1a;完成用户提出的IO请求&#xff0c;提高IO速率以及改善IO设备的利用率 主要功能有&#xff1a; 隐藏物理设备细节。IO系统对IO设备进行适当的抽象&#xff0c;以隐藏掉物…

selenium 要点击的元素被其他元素遮挡 or 无法找到非可视范围内的元素

selenium 无法找到非可视范围内的元素 org.openqa.selenium.StaleElementReferenceException: The element reference of is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed se…