使用eigen计算空间坐标变换

机器人经常涉及不同坐标系之间的坐标变换,这里总结下使用eigen来计算坐标变换的方法。

常见的描述旋转的方式:四元数、RPY(roll、pitch、yaw)、旋转矩阵、旋转向量。

先看一个二维情况下的例子:
假设坐标系1(frame_1)在世界坐标系(world_frame)下旋转为:θθθ,平移t1=(t1x,t1y)t1 = (t_1x,t_1y)t1=(t1​x,t1​y)。
一个在坐标系1下的点p1=(p1x,p1y)p_1 = (p_1x,p_1y)p1​=(p1​x,p1​y)在世界坐标系下的坐标由旋转+平移的变换可得:
pw=Rθ∗p1+t1p_w = R_θ * p_1 +t_1pw​=Rθ​∗p1​+t1​
(pwxpwy)\begin{pmatrix}p_wx \\ p_wy \\ \end{pmatrix}(pw​xpw​y​) = (cosθ−sinθsinθcosθ)\begin{pmatrix}cosθ & -sinθ \\ sinθ & cosθ\\ \end{pmatrix}(cosθsinθ​−sinθcosθ​) * (p1xp1y)\begin{pmatrix}p_1x \\ p_1y \\ \end{pmatrix}(p1​xp1​y​) + (t1xt1y)\begin{pmatrix}t_1x \\ t_1y \\ \end{pmatrix}(t1​xt1​y​)

可以带入值进行简单的验证:
假设点p在frame_1下的坐标为(1,0),frame_1相对于世界系的旋转为90°(π/2),frame_1相对于世界系的平移为(2,2)。
(23)\begin{pmatrix}2 \\ 3 \\ \end{pmatrix}(23​) = (0−110)\begin{pmatrix}0 & -1 \\ 1 & 0\\ \end{pmatrix}(01​−10​) * (10)\begin{pmatrix}1 \\ 0 \\ \end{pmatrix}(10​) + (22)\begin{pmatrix}2 \\ 2 \\ \end{pmatrix}(22​)

三维的情况同理,当我们用eigen使用四元数来计算:
pw=q1∗p1+t1p_w = q_1* p_1 +t_1pw​=q1​∗p1​+t1​
q1q_1q1​是旋转矩阵对应的四元数


Eigen::Quaterniond q1 = Eigen::AngleAxisd(3.141593/2.0, Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitX());
Eigen::Vector3d t1 = Eigen::Vector3d(2, 2, 0.0);
Eigen::Vector3d p1 = Eigen::Vector3d(1, 0.0, 0.0);
Eigen::Vector3d pw;
pw = q1 * p1 + t1;

也可以用欧氏变换矩阵来计算:
p2 = q2.inverse() * (q1 * p1 + t1 - t2)
p2 = T2.inverse() * T1 * p1
[Rt0T1]\begin{bmatrix}R & t \\ 0^T & 1\\ \end{bmatrix}[R0T​t1​]
TE=[R0Tt1]TE=[Rt0T1]

  1. 旋转矩阵 RR 是正交矩阵正交矩阵;
#include <iostream>
#include <string>
#include <Eigen/Eigen>
using namespace std;
//this test show how to use eigen to compute coordinate transform
int main(int argc, char *argv[])
{// Eigen::Quaterniond q1 = Eigen::Quaterniond(1.0, 0.0, 0.0, 0.0).normalized();Eigen::Quaterniond q1 = Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitX());// Eigen::Quaterniond q2 = Eigen::Quaterniond(0.92388, 0.0, 0.0, 0.382683).normalized();Eigen::Quaterniond q2 = Eigen::AngleAxisd(3.141593, Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitX());Eigen::Quaterniond q3 = Eigen::AngleAxisd(3.141593/4.0, Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitX());Eigen::Quaterniond qe = q1 * q2 * q3;Eigen::Vector3d eulerAngle_e = qe.matrix().eulerAngles(0,1,2);cout <<"qe: \n"<< qe.coeffs() << "\n";cout <<"eulerAngle_e: \n"<< eulerAngle_e.transpose() << "\n";//平移向量Eigen::Vector3d t1 = Eigen::Vector3d(1, 1, 0.0);Eigen::Vector3d t2 = Eigen::Vector3d(2, 2, 0.0);Eigen::Vector3d t3 = Eigen::Vector3d(2, 2, 0.0);Eigen::Vector3d p0 = Eigen::Vector3d(1, 0.0, 0.0);Eigen::Vector3d pe;pe = q1 * (q2 * (q3 * p0 + t3) + t2) + t1;cout <<"pe: \n"<< pe.transpose() << "\n";//目标向量Eigen::Vector3d p1 = Eigen::Vector3d(2, 2, 0.0);Eigen::Vector3d p2;Eigen::Vector3d pw;//打印输出cout <<"q1: \n"<< q1.coeffs() << "\n"<<"q2: \n"<< q2.coeffs() << "\n"<<"t1: \n"<< t1.transpose() << "\n"<<"t2: \n"<< t2.transpose() << endl;pw = q1 * p1 + t1;cout <<"pw: \n"<< pw.transpose() << endl;//pw = q2 * p2 + t2; => q2 * p2 + t2 = q1 * p1 + t1  =>  p2 = q2^-1*(q1 * p1 + t1 - t2)//四元数求解p2 = q2.inverse() * (q1 * p1 + t1 - t2);cout << "四元数求解" << endl;cout <<"p2: \n"<< p2.transpose() << endl;//欧拉矩阵Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity();Eigen::Isometry3d T2 = Eigen::Isometry3d::Identity();T1.rotate(q1.toRotationMatrix());T1.pretranslate(t1);T2.rotate(q2.toRotationMatrix());T2.pretranslate(t2);// cout << T1.matrix() << endl;// cout << T2.matrix() << endl;//欧拉矩阵求解p2 = T2.inverse() * T1 * p1;cout << "欧拉矩阵求解" << endl;cout <<"p2: \n"<< p2.transpose() << endl;return 0;
}

使用eigen计算空间坐标变换相关推荐

  1. pcl::lineToLineSegment() 计算空间直线的交点和最小公垂线

    对于两空间直线来说,计算交点和最小公垂线是一码事,交点即最小公垂线两个垂足的中心.PCL中源码中包含计算空间直线最小公垂线的函数 PCL_EXPORTS void pcl::lineToLineSeg ...

  2. R 计算 空间基尼系数

    空间基尼系数主要用于衡量地理要素的空间分布差异,是地理学研究中一个常见指标.本文主要介绍如何利用R语言计算空间基尼系数. setwd("C:\\Users\\Acer\\Desktop&qu ...

  3. 计算空间中两个向量的夹角

    1,直接计算空间夹角 //计算α转角  var p1 = new THREE.Vector3(13.77,0.7,37.55);// 点v坐标 var p2 = new THREE.Vector3(- ...

  4. mysql空间计算_MySQL 空间计算 空间查询

    一.前言 MySQL实施了OGC建议的具有Geometry类型的SQL环境的一个子集.该术语指的是用一组集合类型扩展的环境.具有几何值的SQL列是作为拥有集合类型的列实施的.该规范描述了SQL几何类型 ...

  5. Python计算空间二面角

    定义代表三维笛卡尔坐标系上某个点的Point 类(包括x .y .z 三个属性),为该类定义一个方法,可接收second .third .forth 三个参数,用于计算当前点.second .thir ...

  6. 计算空间中两线段之间的距离

    最近在建立气凝胶的有限元模型中需要计算每两根纤维(线段)之间的距离,最初参考的两篇文章确实提供了关于一些数值方法的计算思路(文章1 && 文章2),但忽略了线段距离问题的理论推导,导致 ...

  7. matlab计算空间桁架,基于matlab的空间三维桁架结构受力分析通用程序设计

    第 26 卷第 3 期 喀什师范学院学报 Vol. 26 No. 3 2005 年 5 月 Journal of Kashgar Teachers College May 2005 基于 matlab ...

  8. 计算空间内三个基站定位坐标

    如果O.A.B基站三个基站处在空间的高处,距离地面3米,基站的测距差距在10cm,标签在地面. 那么,如果计算到平面上则可以肯定3个圆是相交的状态.而且交点一定是在两个圆交点的连线上称之为[根轴]. ...

  9. c++计算空间向量的夹角

    代码 void UtilsClass::normalization(double unnorm_array[3]) {// 归一化double max_val = std::max(abs(unnor ...

最新文章

  1. log4j2动态修改日志级别及拓展性使用
  2. 莫比乌斯,欧拉函数题目练习(完结)
  3. Java, C#, Swift语法对比速查表
  4. 精通 ASP.NET MVC 4 学习笔记(一)
  5. 比尔•盖茨当选中国工程院外籍院士!(附名单)
  6. C++ 常用设计模式
  7. this关键字实现串联构造函数调用
  8. 《图解Http》8: 用户身份认证Cookie管理session; 9:HTTP的追加协议(websoket, webDAV)...
  9. 如何把Sql Server2005 数据库转换成Access
  10. Android开发人员不得不收集的代码(持续更新中)
  11. Apache + svn 服务搭建
  12. 代码比较工具DiffMerge的下载和使用(转)
  13. 苏宁易购开放平台_苏宁易购半年报解读:业态场景与零售服务的“两手抓”
  14. vue中如何引入公共样式的的styl文件
  15. 杀毒软件工作原理 及 现在主要杀毒技术
  16. 服务器可不可以选择ssd硬盘
  17. 转发:神了,Fly_by结构原来就这么回事儿!
  18. 40篇最受网友欢迎的web前端HTML精选文章合集
  19. linux 查看文件 可翻页,Linux如何读取文件,如何翻页
  20. 使用eNSP搭建的小型校园网

热门文章

  1. HTTP请求服务器 statuscode的状态码说明 (statuscode==500)
  2. 解决雷电模拟器上Xposed框架不能用的问题。
  3. 正点原子 Linux驱动开发学习笔记-06 chrdevbase虚拟设备驱动的完善
  4. 如何建立Multi-Step(多步预测)的LSTM时间序列模型(以对家庭用电预测为例)
  5. 数控机床是什么编程php吗,数控车床编程实例
  6. 使用python完成简单的批量信息发送
  7. rgb到yuv的转换
  8. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释
  9. 机器学习第一章:简介和概括
  10. html静态页面作业——海贼王中乔巴漫画(5页) 学生动漫网页设计模板下载 海贼王大学生HTML网页制作作品 简单漫画网页设计成品