C++无人机摄影测量——OMEGA、Phi、kappa转换为YAW,Pitch,Roll

1 概述

任何处理三维旋转的人都需要熟悉欧拉角和旋转矩阵。欧拉角有助于以人类可以理解的方式描述三维旋转,因此在交互界面中很常见。另一方面,当涉及到在软件中实现高效旋转时,旋转矩阵是常用的表示。

不幸的是,在欧拉角和旋转矩阵之间来回转换是一个长期以来的混乱来源。原因并不是数学特别复杂,而是有几十种不同定义欧拉角的方法。不同的作者可能使用不同的约定,通常又不加以明确说明。这使得很难将来自多个源的公式和代码组合在一起。

欧拉角是Leonhard Euler引入的角度,用于描述刚体相对于固定坐标系的方向。也可以表示物理学中移动参考系的方向,或者表示三维线性代数中一般基的方向。经典欧拉角通常采用0度表示垂直方向的倾斜角度。后来Peter Guthrie Tait和George H.Bryan引入了Tait-Bryan形式,用于航空和工程,其中0度表示水平位置。

欧拉角是一组三角度,用于指定对象在三维空间中的方向。欧拉角三元组中的三个角中的每一个都指定了围绕三维笛卡尔坐标系中的一个轴的基本旋转(见图1)。

图 1:欧拉角轴、名称和符号约定旋转顺序为:(1) 偏航,(2) 俯仰,(3) 滚转。

2.Omega, Phi, Kappa 

OMEGA、phi、kappa角被定义为用于相对于大地坐标系(X、Y、Z)的旋转,并将其与图像坐标系对齐的角度。旋转按以下顺序应用:

  • Kappa(κ),围绕Z轴旋转
  • Phi(φ),绕Y轴旋转
  • Omega(ω),绕Χ轴的旋转

图2 ω、φ、kappa角旋转(X、Y、Z)大地坐标系

3.代码实现:OMEGA、Phi、kappa转换为YAW,Pitch,Roll

(1)本代码需使用Eigen库确保已正确安装Eigen

可以通过以下方式安装:https://eigen.tuxfamily.org/dox/GettingStarted.html

如果您有vcpkg,可按照如下操作完成。

在vcpkg根目录,打开powershell,输入“./vcpkg install eigen3”安装完成后,vcpkg 会将 Eigen 库的头文件和库文件安装到默认的位置。

(2)OMEGA、Phi、kappa转换为YAW,Pitch,Roll

#include <iostream>
#include <cmath>
#include <Eigen/Dense>



Eigen::Matrix3d eulerToRotationMatrix(double omega, double phi, double kappa) {
	Eigen::Matrix3d rotationMatrix;

	rotationMatrix(0, 0) = std::cos(phi) * std::cos(kappa);
	rotationMatrix(0, 1) = std::cos(omega) * std::sin(kappa) + std::sin(omega) * std::sin(phi) * std::cos(kappa);
	rotationMatrix(0, 2) = std::sin(omega) * std::sin(kappa) - std::cos(omega) * std::sin(phi) * std::cos(kappa);

	rotationMatrix(1, 0) = -std::cos(phi) * std::sin(kappa);
	rotationMatrix(1, 1) = std::cos(omega) * std::cos(kappa) - std::sin(omega) * std::sin(phi) * std::sin(kappa);
	rotationMatrix(1, 2) = std::sin(omega) * std::cos(kappa) + std::cos(omega) * std::sin(phi) * std::sin(kappa);

	rotationMatrix(2, 0) = std::sin(phi);
	rotationMatrix(2, 1) = -std::sin(omega) * std::cos(phi);
	rotationMatrix(2, 2) = std::cos(omega) * std::cos(phi);

	return rotationMatrix;
}

Eigen::Vector3d rotationMatrixToEulerAngles(const Eigen::Matrix3d& rotationMatrix) {
	Eigen::Vector3d euler;

	euler(1) = std::asin(-rotationMatrix(2, 0)); // Pitch

	if (std::cos(euler(1)) != 0) {
		euler(0) = std::atan2(rotationMatrix(2, 1), rotationMatrix(2, 2)); // Yaw
		euler(2) = std::atan2(rotationMatrix(1, 0), rotationMatrix(0, 0)); // Roll
	}
	else {
		euler(0) = 0;
		euler(2) = std::atan2(-rotationMatrix(0, 1), rotationMatrix(1, 1));
	}

	return euler;
}

int main() {
	double omega = 1.4922692413517904;  //在这里输入OMEGA、Phi、kappa的值
	double phi = -9.6371902267087872;
	double kappa = -80.2008829248658799;

	Eigen::Matrix3d rotationMatrix = eulerToRotationMatrix(omega, phi, kappa);
	Eigen::Vector3d euler = rotationMatrixToEulerAngles(rotationMatrix);

	std::cout << "Yaw: " << euler(0) << std::endl;
	std::cout << "Pitch: " << euler(1) << std::endl;
	std::cout << "Roll: " << euler(2) << std::endl;

	return 0;
}

本文内容参考:欧拉角简介

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Phi Kappa 旋转矩阵是一种常用的数学工具,用于描述平面或三维空间中的旋转变换。它是由一个二维或三维的正交矩阵表示的,该矩阵可以通过沿着某个轴旋转一定的角度来实现旋转操作。 Phi Kappa 旋转矩阵可以用来解决许多几何和物理问题。在计算机图形学中,它被广泛应用于三维模型的变换和渲染,通过将模型和相机进行旋转变换,可以实现视图的切换和场景的渲染。此外,在物理学中,Phi Kappa 旋转矩阵也可以用于描述刚体的旋转运动。 Phi Kappa 旋转矩阵具有多个特性和性质。其中一个重要的性质是它们是正交矩阵,即其转置等于其逆。这个特性保证了旋转操作的保持长度和角度不变,使得Phi Kappa 旋转矩阵可以作为无失真旋转的理想工具。 另一个重要的特性是Phi Kappa 旋转矩阵可以通过将旋转轴上的单位向量与旋转角度相乘来计算。这意味着我们可以通过指定旋转轴和旋转角度来构造一个Phi Kappa 旋转矩阵。例如,在二维空间中,我们可以通过将x轴上的单位向量与角度θ相乘得到一个2x2的Phi Kappa 旋转矩阵。 总的来说,Phi Kappa 旋转矩阵是一个重要的数学工具,用于描述和实现平面或三维空间中的旋转变换。它具有保持长度和角度不变的性质,可以通过指定旋转轴和旋转角度来构造。在计算机图形学和物理学等领域中,Phi Kappa 旋转矩阵有着广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值