当前位置: 首页 > news >正文

菜鸟专学:Eigen--Sophus--CV--三种不同库对矩阵的操作方式

RobotSlamApplication(4): SLAM中对向量和矩阵的多种不同表达方式

SLAM 中对点、向量以及矩阵存在着多种不同的表达方式,甚至在使用过程中涉及到多种不同表达方式转换(如,OpenCV、Eigen, Sophus等库之间的转换),因此,本文针对常用几种不同矩阵、向量的表达式进行了讨论和相互转换分析。

/*
	 * 旋转向量可通过罗德里格斯公式将 3*1向量--revc 转化为 3*3矩阵--R
	 * 		cv::Rodrigues( result.rvec, R );
	 *	
	 *旋转矩阵:								旋转向量: 第一个参数为旋转角度,第二个参数哪个为1就绕哪轴旋转
	 * 		3*3 Eigen::Matrix3d (double)			3*1 Eigen::AngleAxisd(M_PI, Vector3d(0,0,1))
	 * 	
	 *四元数:								欧拉角:角度顺序(ZYX), yaw, pitch roll  
	 * 		4*1 Eigen::Quaterniond 					3*1 Vector3d
	 * 	
	 *欧式变换: 表达式是3d, 实际上是4*4矩阵		放射变换	表达式是3d, 实际上是4*4矩阵
	 * 		4*4 Eigen::Isometry3d					4*4 Eigen::Affine3d
*/

1. Eigen3

	// Eigen -- Matrix
	#include <Eigen/Core>
	#include <Eigen/Dense>
	#include <Eigen/Geometry>

2. OpenCV


	// opencv -- Mat
	#include <opencv2/opencv.hpp>
	
	 * OpenCV 中有模板类 Vec,可以表示一个向量
		typedef Vec<uchar, 2> Vec2b;
		typedef Vec<uchar, 3> Vec3b;
		typedef Vec<uchar, 4> Vec4b;
		typedef Vec<short, 2> Vec2s;
		typedef Vec<short, 3> Vec3s;
		typedef Vec<short, 4> Vec4s;
		typedef Vec<int, 2> Vec2i;
		typedef Vec<int, 3> Vec3i;
		typedef Vec<int, 4> Vec4i;
		typedef Vec<float, 2> Vec2f;
		typedef Vec<float, 3> Vec3f;
		typedef Vec<float, 4> Vec4f;
		typedef Vec<float, 6> Vec6f;
		typedef Vec<double, 2> Vec2d;
		typedef Vec<double, 3> Vec3d;
		typedef Vec<double, 4> Vec4d;
		typedef Vec<double, 6> Vec6d;

3. Sophus

	// Sophus -- SO3 SE3d
	#include <sophus/se3.hpp>
	#include <sophus/so3.hpp>

4.代码分别测试

	int main(int argc, char **argv)
	{	
	
		Eigen::Matrix4d R_0;
		Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();  // z-axis rotation
	
		cv::Vec3b recv = {0,0,1};
	
	   //Eigen::Vector3d revc = {0,0,1};
	/****************************************************************
	 * cv::Mat R;     Eigen::Matrix3d
	 * cv::Vec3b;	  Eigen::Vector3d
	 * opencv中将向量转为旋转矩阵R
	   cv::Rodrigues( revc, R );
	******************************************************************/	
		Eigen::Isometry3d T = Eigen::Isometry3d::Identity();  // T.matrix 4*4
		Eigen::Quaterniond q(R); 
	
	// 	std::cout<<"Eigen::Test \n"<<T.matrix()<<std::endl;
	// 	std::cout<<"Eigen::Test \n"<<q.coeffs()<<std::endl;

	/**********************************************************************
	 *  pose.txt 一般以位置(三维向量)+四元数组成, 假设其为 vector<float>
	 * 
	 **********************************************************************/	
		float data[7]= {0};
		Eigen::Vector3d trans = {0,1,2};
	
		Eigen::Quaterniond q_d(data[6], data[3], data[4], data[5]);
	// 	Eigen::Quaterniond q_d(R);
		Eigen::Isometry3d T_d(q_d); // Change into 4*4 Matrix
		T_d.pretranslate(trans);   // get the Final Transformation Matrix
	
		std::cout<<"Eigen::Test \n"<<T_d.matrix()<<std::endl;
	/***********************************************************************
	 * SE(3)  SO(3) == Sophus
	 * SE3 SO3 与 Eigen中的矩阵可相关交叉变换;
	 * 
	 * 		原型					李代数
	 * SE3--(4*4)=="T"  	  --> se3  (6*1)
	 * 
	 * SO3--(3*3)=="R"		  --> so3 (3*3)
	 ***********************************************************************/
		Sophus::SE3d SE3R_4(R,trans);

		Sophus::SO3d SO3R_3(R);
	
		Eigen::Vector3d so3 = SO3R_3.log();
	
		// 李代数se(3) 是一个六维向量,方便起见先typedef一下
	    typedef Eigen::Matrix<double,6,1> Vector6d;
	    Vector6d se3 = SE3R_4.log();
	}

相关文章:

  • ROS回顾学习(7):ubuntu下设置(ROS)程序开机自启动
  • RTAB-Map学习和测试详解
  • ROS回顾学习(8): 项目研究中遇到问题和难点记录
  • 菜鸟专学:明确自己编程习惯的变量命名法
  • OpenCV第一讲: 常规函数和类的使用 -- HighGui Core模块
  • kinect V2 驱动安装说明
  • C++11回顾学习(2): 一些常用的函数和小技巧
  • ROS回顾学习(9): 单通道深度图像转化为彩色图发布
  • C++11回顾学习(3): CPU多核与多线程、并行与并发
  • OpenCV第二讲:图像滤波及几何变换
  • OpenCV第三讲: 方框滤波、均值滤波、高斯滤波
  • 机器学习第一课:基础概念扫盲
  • 机器学习第二课:神经网络结构和专业术语
  • OpenCV第四讲: 非线性滤波
  • OpenCV第五讲: 形态学滤波
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [译]如何构建服务器端web组件,为何要构建?
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • angular2 简述
  • Laravel 中的一个后期静态绑定
  • October CMS - 快速入门 9 Images And Galleries
  • OSS Web直传 (文件图片)
  • PHP CLI应用的调试原理
  • swift基础之_对象 实例方法 对象方法。
  • 阿里云购买磁盘后挂载
  • 收藏好这篇,别再只说“数据劫持”了
  • 正则与JS中的正则
  • 走向全栈之MongoDB的使用
  • 《码出高效》学习笔记与书中错误记录
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $L^p$ 调和函数恒为零
  • (1)Nginx简介和安装教程
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (转)C#调用WebService 基础
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET构架之我见
  • .NET命名规范和开发约定
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .sys文件乱码_python vscode输出乱码
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??eclipse的安装配置问题!??
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [C++][基础]1_变量、常量和基本类型
  • [ffmpeg] x264 配置参数解析
  • [hdu 1247]Hat’s Words [Trie 图]
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [js]- 两个对象的合并(Object.assign)
  • [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...
  • [NodeJS]NodeJS基于WebSocket的多用户点对点即时通讯聊天
  • [NOI2005]月下柠檬树[计算几何(simpson)]