四元数与旋转矩阵之间的转换

news2024/11/28 12:34:07

      在https://blog.csdn.net/fengbingchun/article/details/130039337 中介绍了相机外参及相机的位姿R,t,其中R为3*3旋转矩阵(R的逆矩阵与R的转置矩阵相同),t为3*1平移向量,R,t组合成3*4的矩阵。
      在instant-ngp中执行scripts/colmap2nerf.py过程中,colmap会生成colmap_text/images.txt文件,此文件包含相机的外参信息,每两行定义一幅图像的信息:

IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
POINTS2D[] as (X, Y, POINT3D_ID)

      其中,QW, QX, QY, QZ, TX, TY, TZ为相机的外参,四元数(QW, QX, QY, QZ)和平移向量(TX, TY, TZ)四元数(quaternion)是使用Hamilton约定来定义的。
      注:以下内容来自网络整理
      在空间中准确定位、移动和旋转物体可以通过多种方式完成。更熟悉和更容易可视化的欧拉角(roll, pitch, yaw)是有限的,在某些情况下应该用更强大的四元数代替。
      四元数是用于旋转和拉伸(stretch)向量的数学运算符。
      威廉·汉密尔顿(William Rowan Hamilton)在1843年发明了四元数,作为一种方法,允许他对向量进行乘法和除法,旋转和拉伸它们。
      四元数的两种表示:一个四元数q拥有一个实部和三个虚部;q0,q1,q2,q3为实数;i,j,k为虚部的三个基;其实部可能位于第一位,也可能位于最后一位

      (1).Hamilton: ijk=-1 
      (2).JPL: ijk=1 

      四元数Hamilton形式转旋转矩阵:

      旋转矩阵转四元数Hamilton形式,参考: matrixToQuaternion

      以下分别调用opencv, eigen, pyquaternion接口的实现:

      1.opencv的实现:

void quaternion_to_rotate_matrix(double qvec[4])
{
	double m11 = 1 - 2 * std::pow(qvec[2], 2) - 2 * std::pow(qvec[3], 2);
	double m12 = 2 * qvec[1] * qvec[2] - 2 * qvec[0] * qvec[3];
	double m13 = 2 * qvec[3] * qvec[1] + 2 * qvec[0] * qvec[2];

	double m21 = 2 * qvec[1] * qvec[2] + 2 * qvec[0] * qvec[3];
	double m22 = 1 - 2 * std::pow(qvec[1], 2) - 2 * std::pow(qvec[3], 2);
	double m23 = 2 * qvec[2] * qvec[3] - 2 * qvec[0] * qvec[1];

	double m31 = 2 * qvec[3] * qvec[1] - 2 * qvec[0] * qvec[2];
	double m32 = 2 * qvec[2] * qvec[3] + 2 * qvec[0] * qvec[1];
	double m33 = 1 - 2 * std::pow(qvec[1], 2) - 2 * std::pow(qvec[2], 2);

	std::cout << "result:" << "\n";
	std::cout << "[" << m11 << ", " << m12 << ", " << m13 << ";" << "\n";
	std::cout << m21 << ", " << m22 << ", " << m23 << ";" << "\n";
	std::cout << m31 << ", " << m32 << ", " << m33 << "]" << "\n";
}

int test_quaternion()
{
	std::vector<double> data = {
		2.044289726145588e-004, -0.2587487517264626, -0.9659446369688031,
		-0.9993063898830017, -3.602307923217642e-002, 9.438056030485108e-003,
		-3.723838540803551e-002, 0.9652727185840433, -0.2585766451355823
	};

	// 1. rotate matrix to quaternion(Hamilton)
	cv::Mat mat(3, 3, CV_64FC1, data.data());
	cv::Quatd q1 = cv::Quatd::createFromRotMat(mat);
	std::cout.precision(16);
	std::cout << "w:" << q1.w << ", x:" << q1.x << ", y:" << q1.y << ", z:" << q1.z << "\n";

	// 2. quaternion(Hamilton) to rotate matrix
	cv::Quatd q2 = cv::Quatd(q1.w, q1.x, q1.y, q1.z);
	cv::Matx<double, 3, 3> R = q2.toRotMat3x3();
	std::cout << R << "\n";

	double arr[4] = { q1.w, q1.x, q1.y, q1.z };
	quaternion_to_rotate_matrix(arr);

	return 0;
}

      执行结果如下所示:

      2.Eigen的实现:

int test_quaternion()
{
	Eigen::Matrix3d matrix3d;
	matrix3d << 2.044289726145588e-004, -0.2587487517264626, -0.9659446369688031,
		-0.9993063898830017, -3.602307923217642e-002, 9.438056030485108e-003,
		-3.723838540803551e-002, 0.9652727185840433, -0.2585766451355823;

	// 1. rotate matrix to quaternion(Hamilton)
	Eigen::Quaterniond q;
	q = matrix3d;
	std::cout.precision(16);
	std::cout << "w:" << q.w() << ", x:" << q.x() << ", y:" << q.y() << ", z:" << q.z() << "\n";

	// 2. quaternion(Hamilton) to rotate matrix
	Eigen::Quaterniond q2(q.w(), q.x(), q.y(), q.z());
	Eigen::Matrix3d R = q2.toRotationMatrix();
	std::cout << "R:\n" << R << "\n";

	return 0;
}

      执行结果如下图所示:

      3.Python的pyquaternion实现:

import numpy as np
from pyquaternion import Quaternion

def calculate_quaternion(R):
	q = Quaternion(matrix=np.array(R))

	return q

def calculate_rotate_matrix(q):
	R = q.rotation_matrix

	return R

def qvec2rotmat(qvec):
	# from instant-ngp/scripts/colmap2nerf.py
	return np.array([
		[
			1 - 2 * qvec[2]**2 - 2 * qvec[3]**2,
			2 * qvec[1] * qvec[2] - 2 * qvec[0] * qvec[3],
			2 * qvec[3] * qvec[1] + 2 * qvec[0] * qvec[2]
		], [
			2 * qvec[1] * qvec[2] + 2 * qvec[0] * qvec[3],
			1 - 2 * qvec[1]**2 - 2 * qvec[3]**2,
			2 * qvec[2] * qvec[3] - 2 * qvec[0] * qvec[1]
		], [
			2 * qvec[3] * qvec[1] - 2 * qvec[0] * qvec[2],
			2 * qvec[2] * qvec[3] + 2 * qvec[0] * qvec[1],
			1 - 2 * qvec[1]**2 - 2 * qvec[2]**2
		]
	])

if __name__ == "__main__":
	R = [[2.044289726145588e-004, -0.2587487517264626, -0.9659446369688031],
		[-0.9993063898830017, -3.602307923217642e-002, 9.438056030485108e-003],
		[-3.723838540803551e-002, 0.9652727185840433, -0.2585766451355823]]
	q = calculate_quaternion(R)
	print(f"quaternion:\n{q}")

	R2 = calculate_rotate_matrix(q)
	print(f"R2:\n{R2}")

	R3 = qvec2rotmat([q[0], q[1], q[2], q[3]])
	print(f"R3:\n{R3}")

	print("test finish")

      执行结果如下图所示:

      由以上输出结果可知:

      (1).旋转矩阵转四元数:pyquaternion和eigen结果一致;opencv与其它两者w,x和y,z只是符号相反,数值相同;还不清楚原因

      (2).四元数转旋转矩阵:pyquaternion和eigen结果一致;opencv由四元数结果同样能转回到之前的原旋转矩阵

      GitHub

            https://github.com/fengbingchun/NN_Test

            https://github.com/fengbingchun/CUDA_Test

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

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

相关文章

DHT11温湿度传感器

1.认识DHT11 1、概述&#xff1a; DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;应用领域&#xff1a;暖通空调&#xff1b;汽车&#xff1b;消费品&#xff1b;气象站&#xff1b;湿度调节器&#xff1b;除湿器&#xff1b;家电&#x…

通过cloudflare创建openai api的代理

一、前言 首先你要有一个域名&#xff0c;其次这个域名要托管到cloudfare&#xff0c;所以&#xff1a; 直接在cloudfare购买域名&#xff0c;方便省事!找其他免费域名&#xff0c;再托管到cloudfare&#xff0c;本着一分钱不花的目的&#xff0c;这里提供一个顶级免费公益域…

005 - STM32启动代码

常用汇编指令 指令名称作用EQU给数字常量取一个符号名&#xff0c;相当于C语言中的#define&#xff1b;AREA汇编一个新的代码段或者数据段&#xff1b;SPACE分配内存空间&#xff1b;PRESERVE8当前文件栈需要按照8字节对齐&#xff1b;EXPORT声明一个具有全局属性的标号&#…

聚观早报 | 小冰启动GPT克隆人计划;ofo创始人在美创业改做咖啡

今日要闻&#xff1a;小冰启动“GPT克隆人计划”&#xff1b;ofo创始人在美创业改做咖啡&#xff1b;OpenAI正准备新的开源AI模型&#xff1b;青年失业率首破20&#xff05;创新高&#xff1b;微软收购动视暴雪获批 小冰启动“GPT克隆人计划” 5 月 16 日&#xff0c;小冰公司…

Spring Boot + Mybtis-plus集成

目录 需求分析Maven 相关依赖配置文件相关流程MybatisPlus配置自动补全参数配置逻辑删除注解乐观锁注解 需求分析 Spring Boot和MyBatis-Plus是目前使用最广泛的Java web开发框架和ORM框架&#xff0c;它们可以很好地协同工作&#xff0c;提供高效和稳定的系统开发和数据操作。…

[答疑]UML精粹里和你视频里说的不太一样

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 第五元素 2023-4-14 20:32 这是是UML精粹里的。潘老师&#xff0c;这个跟你视频里讲的是不是不太一样&#xff1f;还是我理解错了&#xff1f; UMLChina潘加宇 这个&#…

软件最后一步------打包

本文章主要是记将源代码打包成程序 Python 一、安装Pyinstaller (用于打包的库) pip install pyinstaller二、使用参数 参数介绍 选项参数参数解释-hhelp(帮助信息)-vversion(版本号)-c显示命令行窗口-w不显示命令行窗口-F生成结果是一个exe程序&#xff0c;所有依赖项被打…

计算机的基本工作原理

参考资料&#xff1a; L-1.6: Common Bus system| How basic computer works - YouTube 准备好内存单元、不同类型的寄存器&#xff0c;内存和寄存器、寄存器和寄存器之间都是通过总线连接(假设是直接把数据总线、控制总线、地址总线变成一条总线)。 使用多路复用器实现的总线&…

C语言—通讯录

通讯录 通讯录的创建通讯录的初始化通讯录添加联系人信息通讯录删除特定联系人信息通讯录查找特定联系人信息通讯录修改特定联系人信息通讯录排序联系人信息通讯录打印联系人信息通讯录整体代码 通讯录的创建 通讯录中是存放人的信息的&#xff0c;人的信息包括&#xff1a;姓…

数据结构—排序算法交换排序(冒泡快排)

目录 1.交换排序—冒泡排序 1.1冒泡排序基本思想 1.2冒泡排序的实现 2.交换排序—快速排序 1.1快速排序基本思想 1.2基准值划分—分析 1. hoare版&#xff1a; 2. 挖坑法&#xff1a; 3. 前后指针版本 1.3 hoare快排的具体实现 1.4 挖坑法快排的具体实现 1.5 前后指…

【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI

文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…

Python中的集合介绍

集合set是一个无序的、不可重复的元素集合。 集合的创建 大括号 {} set() a {1, 2, 3, 4, 5} print(type(a))b set([1,2,3,4,5,6,7]) print(type(b),b)c set((1,2,3)) print(c) 运行结果&#xff1a;<class set> <class set> {1, 2, 3, 4, 5, 6, 7} {1, 2, 3} 集…

诺贝尔化学奖:酶分子“定向进化”

2018年&#xff0c;诺贝尔化学奖迎来了历史上第五位女性得主——加州理工学院的Frances H. Arnold教授&#xff0c;以表彰她在“酶的定向进化”这一领域的贡献。 1、“酶的定向进化”到底是什么&#xff1f; 这里有三个点&#xff0c;“酶”、“进化”还有“定向”&#xff1a…

windows10安装Qt

一、下载安装包 1、安装包下载路径调整 由于Qt公司的调整&#xff0c;从5.15版本开始原本下载的路径不再提供安装包 Index of /archive/qt 新安装包放在了official_releases里面了 Index of /official_releases/online_installers 2、安装方式调整 从5.9.0开始安装方式开始…

streamlit应用部署和streamcloud发布APP

文章目录 streamlit应用创建streamcloud创建APP注册streamcloud账号设置StreamLit许可发布APPstreamlit应用创建 streamcloud创建APP StreamCloud是一个用于部署StreamLit App 的平台。 注册streamcloud账号 点击https://share.streamlit.io/ ,进入StreamCloud 注册界面。…

在四维轻云平台中如何使用场景搭建功能?

四维轻云是一款轻量化的地理空间数据管理云平台&#xff0c;能够实现多种地理空间数据的在线管理、编辑及分享。目前&#xff0c;平台具有项目管理、成员管理、场景搭建、在线分享、素材库等功能&#xff0c;支持多用户在线协作管理&#xff0c;实现了轻量化、便捷化的空间数据…

chatgpt赋能Python-pythonda

Python在SEO优化中的作用 简介 SEO&#xff08;Search Engine Optimization&#xff09;即搜索引擎优化&#xff0c;是指通过优化网站目标关键词的排名来提高网站的曝光率和流量。Python是一种高级编程语言&#xff0c;在SEO领域中有着广泛的应用。 Python在SEO中的应用 网…

AudioGPT推出!音频领域都不放过,ChatGPT这是杀疯了!

大家好&#xff0c;我是千与千寻&#xff0c;你们可以叫我千寻哥&#xff0c;算一算写ChatGPT的技术文章已经写到第四篇了&#xff01; 今天和大家介绍的一个项目属于音频领域的ChatGPT的应用实践。真没想不到&#xff0c;在音频领域&#xff0c;ChatGPT都没有放过&#xff0c…

maven聚合工程详解

目录 一、Maven继承二、idea搭建父子工程三、可继承的 POM 元素四、Maven聚合五、idea搭建聚合工程六、继承和聚合的关系七、dependencyManagement八、pluginManagement 本篇文章重点针对这几个问题进行讲解&#xff1a; Maven继承使用IDEA搭建Maven父子工程使用IDEA搭建Maven…

【建议收藏】Python自动化必不可少的测试框架 — pytest

每天进步一点点&#xff0c;关注我哦&#xff0c;每天分享测试技术文章 Python在测试圈的应用非常广泛&#xff0c;特别是在自动化测试以及测试开发的领域&#xff0c;其中在自动化测试中我们常用的测试框架是uniitest和pytest&#xff0c;本文将带领大家搭建以及熟悉pytest的使…