利用Eigen求解不同坐标系的旋转矩阵

news/2024/11/7 12:32:36/

不同坐标系之间的刚性转换以及实现:

坐标系转换原理如下,使用了仿射变换实现了旋转平移:
[ r 11 r 12 t x r 21 r 22 t y 0 0 ] ∗ [ x y 1 ] = [ x ′ y ′ 1 ] \begin{bmatrix} r_{11} & r_{12}& t_x\\ r_{21}& r_{22}& t_y\\ 0 & 0& \end{bmatrix}* \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}= \begin{bmatrix} x^{'} \\ y^{'} \\ 1 \end{bmatrix} r11r210r12r220txty xy1 = xy1
但是在eigen中求取方程式 A ∗ x = b A*x=b Ax=b,所以前面可以将 [ x y z ] \begin{bmatrix} x \\ y \\ z \end{bmatrix} xyz 看成是A,把 [ x ′ y ′ z ′ ] \begin{bmatrix} x^{'} \\ y^{'} \\ z^{'} \end{bmatrix} xyz 看成是 b b b。不过这样公式就需要一定的变形才能和前面的对应起来,前后做一个转置,如下所示:
[ [ r 11 r 12 t x r 21 r 22 t y 0 0 ] ∗ [ x y 1 ] ] T = [ x ′ y ′ 1 ] T \left [ \begin{bmatrix} r_{11} & r_{12}& t_x\\ r_{21}& r_{22}& t_y\\ 0 & 0& \end{bmatrix}*\\ \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\\ \right ] ^{T}= \begin{bmatrix} x^{'} \\ y^{'} \\ 1 \end{bmatrix}^{T} r11r210r12r220txty xy1 T= xy1 T
那么就会转换成如下所示:
[ x y 1 ] ∗ [ r 11 r 21 0 r 12 r 22 0 t x t y 1 ] = [ x ′ y ′ 1 ] \begin{bmatrix} x &y &1 \end{bmatrix} *\begin{bmatrix} r_{11} & r_{21}& 0\\ r_{12}& r_{22}& 0\\ t_x & t_y&1 \end{bmatrix}=\begin{bmatrix} x^{'} & y^{'} & 1 \end{bmatrix} [xy1] r11r12txr21r22ty001 =[xy1]
所以最终在程序里使用的是上面的公式,调用A.fullPivLu().solve(B)计算的时候也是A对应 [ x y 1 ] \begin{bmatrix} x &y &1 \end{bmatrix} [xy1],B对应的就是 [ x ′ y ′ 1 ] \begin{bmatrix} x^{'} & y^{'} & 1 \end{bmatrix} [xy1]。所以得出来的结果也是 [ r 11 r 21 0 r 12 r 22 0 t x t y 1 ] \begin{bmatrix} r_{11} & r_{21}& 0\\ r_{12}& r_{22}& 0\\ t_x & t_y&1 \end{bmatrix} r11r12txr21r22ty001 。看自己需求是否对其转置

A << -4.93374, -0.056378, 1, 0.397714, -0.126519, 1, 2.63284, -0.0925265, 1;B << 109995, 8318, 1, 110066, 13650, 1, 110032, 15885, 1;
Eigen::Matrix3d T = TransMatrix(A, B);
cout << "transform matrix is: " << "\n";
cout << T.transpose() << endl;//显示出A*T=B,但是实际计算的是(T的转置*A的转置)的转置=B的转置
cout << A*T << endl;

转换矩阵结果如下所示:

在这里插入图片描述


http://www.ppmy.cn/news/64157.html

相关文章

IDEA创建接口类和接口实现类

IDEA创建接口类和接口实现类 IDEA创建接口类IDEA创建接口实现类 以创建Dao包下的代码为例。 IDEA创建接口类 选中要创建接口类的package&#xff0c;右键菜单依次选择New——Java Class。 在弹出的界面中&#xff0c;将创建的对象类型由Class改为Interface&#xff0c;如下图…

JUC(十二)-线程中断相关问题(LockSupport,sleep,InterruptException)

JUC线程中断相关问题总结 线程中断相关问题总结 JUC线程中断相关问题总结一、 sleep 和线程中断之间的关系和特点结论测试验证代码如下 二、 LockSupport 和线程中断之间的关系结论测试验证代码如下 一、 sleep 和线程中断之间的关系和特点 结论 线程调用 Thread.sleep之后会进…

【设计模式】装饰器模式篇

Decorator Pattern 1、定义 装饰器模式是一种结构型设计模式&#xff0c;它允许我们在不改变对象自身的基础上&#xff0c;动态地给对象添加新的行为。 在装饰器模式中&#xff0c;我们定义一个装饰器类&#xff0c;该类实现了与被装饰对象相同的接口&#xff0c;并持有一个…

基于Vue CLI搭建vue3项目

前言 使用vue官方的脚手架进行搭建Vue CLI 注意&#xff1a;create-vue是基于Vite搭建项目&#xff0c;今天我们还是基于webpack搭建使用vue create 项目名称这个命令 一、步骤 1、 使用默认配置项还是自定义配置 这里我选择自定义 2、 选择需要配置的选项 根据个人进行…

flutter的环境搭建步骤(MacBook Pro)

1.下载Flutter SDK包 地址&#xff1a;https://docs.flutter.dev/get-started/install/macos 2.配置环境变量 vim ~/.bash_profile //在打开的文件里增加一行代码&#xff0c;意思是配置flutter命令在任何地方都可以使用。 export PATH/app/flutter/bin:$PATH // 从新加载 sou…

day29_jdbc

今日内容 零、 复习昨日 一、JDBC 二、登录 三、ORM 零、 复习昨日 DDL (针对结构,库,表,列,索引) 最重要建表语句 create table emp(empno int primary key auto_increment,ename varchar(10) not null,sal double(10,2) default 3000,hiredate date unique )DML 增删改 inser…

计算机毕业论文选题推荐|软件工程|系列三

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言) 一体化智慧停车…

css中常用伪类表单验证:invalid、:valid、:required、以及:not 、:lang、:empty的使用

MDN文档关于伪类的相关介绍 1、 :invalid :invalid 是 CSS 伪类选择器&#xff0c;用来选择任何未通过验证的 <form>、<fieldset>、<input> 或其他表单元素。 <form class"form"><label for"email">邮箱地址:</label>…