齐次变换矩阵、欧拉角

server/2024/11/14 11:52:59/

目录

齐次变换矩阵

因为老是忘记齐次变换矩阵的含义以及方向,每次推导公式都很费劲,写下这篇文章用于快速回顾齐次变换矩阵

在这里插入图片描述

表示的是:坐标系A到坐标系B的齐次变换矩阵,也是坐标系B在坐标系A下的位姿。

对于这个矩阵,有三个物理意义:

(1)坐标变换:通过变换矩阵可以获得{B}坐标系下的向量(坐标)在{A}坐标系下的描述(坐标)。(2)坐标系的描述:描述了坐标系{B}在{A}下的位姿(位置和姿态)(3)可以作为算子,将{B}中的矢量或物体变换到{A}中,描述了某个刚体的运动情况。

将B坐标系下的点或者向量左乘这个齐次变换矩阵,能够得到坐标系A下的坐标描述

后续的讲解均以这个齐次变换矩阵进行描述。

旋转矩阵如何计算

常用右手系。首先要确定旋转的正反方向,用右手的大拇指指向旋转轴的正方向,弯曲手指手指。手指方向即是轴的正旋转方向。

那么绕各个坐标轴的旋转θ角可以用如下的旋转矩阵R(注意是左乘)表示:

在这里插入图片描述

平移矩阵如何计算

坐标系A是固定坐标系,坐标系B进行移动。

其实就是坐标系原点的偏移,平移部分其实就是坐标系B的原点在坐标系A下的坐标

实例

一开始坐标系B和坐标系A重合,首先**B相对于A的Z轴逆时针(视线沿着z轴正方向)旋转90°(此时旋转方向为负,应该取-90°),然后沿着A的x轴移动-3.75个单位,沿着A的y轴移动26.25个方向,**那么最终的齐次变换矩阵

在这里插入图片描述

欧拉角和齐次变换矩阵互相转换

欧拉角以ZYX顺序,输入为弧度

Eigen::Matrix3d rpy2R(const Eigen::Vector3d& rpy) // 单位为弧度
{double roll = rpy[0]; // A - Roll (绕X轴旋转)double pitch = rpy[1];// B - Pitch (绕Y轴旋转)double yaw = rpy[2];// C - Yaw (绕Z轴旋转)Eigen::Matrix3d rotation_matrix; // 按照ZYX 即yaw pitch roll顺序计算得到rotation_matrix = Eigen::AngleAxisd(yaw, Eigen::Vector3d::UnitZ())* Eigen::AngleAxisd(pitch, Eigen::Vector3d::UnitY())* Eigen::AngleAxisd(roll, Eigen::Vector3d::UnitX());return rotation_matrix; // 输出单位为mm}
Eigen::Vector3d R2ypr(const Eigen::Matrix3d& rotation_matrix) // 旋转矩阵必须严格按照ZYX顺序得到的,且单位为mm
{double roll, pitch, yaw;if (rotation_matrix(2, 0) < 1) {if (rotation_matrix(2, 0) > -1) {pitch = asin(-rotation_matrix(2, 0));yaw = atan2(rotation_matrix(1, 0), rotation_matrix(0, 0));roll = atan2(rotation_matrix(2, 1), rotation_matrix(2, 2));}else { // 仰角为 -90 度pitch = -M_PI / 2.0;yaw = -atan2(-rotation_matrix(1, 2), rotation_matrix(1, 1));roll = 0;}}else { // 俯角为 90 度pitch = M_PI / 2.0;yaw = atan2(-rotation_matrix(1, 2), rotation_matrix(1, 1));roll = 0;}// 将弧度转换为度数roll = roll * 180.0 / M_PI;pitch = pitch * 180.0 / M_PI;yaw = yaw * 180.0 / M_PI;Eigen::Vector3d rpy;rpy[0] = roll, rpy[1] = pitch, rpy[2] = yaw;return rpy; // 输出单位为度数
}

http://www.ppmy.cn/server/11480.html

相关文章

OPTEE RUST支持构建并运行支持RUST的CA和TA

目录 一、RUST环境及代码准备 二、RUST构建演示 三、RUST运行演示 RUST语言,由于其更安全的编程语言特性,OPTEE作为可信执行环境的开源实现也增加了对RUST的支持。那么如何构建并运行支持RUST的CA和TA呢,本博客来探讨并进行qemu环境的实际演示。 一、RUST环境及代码准备…

LeetCode热题Hot100 - 最长有效括号

一刷~ 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 思路&#xff1a; 用栈保存最近的一个非有效括号子串的位置&#xff0c;当遇到(时&#xff0c;把当前下标入栈。遇到)时&#xff0c;出栈&#xff0c;出…

javaScript数组-(进阶算法)-计算正整数各个位数上的数字之和

基础 javaScript数组-(进阶算法)-计算正整数各个位数上的数字之和 function sumDigits(num) {// 检查输入是否为数字&#xff0c;增强代码健壮性if (typeof num ! number || isNaN(num) || !isFinite(num)) {throw new Error(Input must be a finite number);}let sum 0;let…

08 JavaScript学习:数据类型

JavaScript 数据类型 值类型(基本类型)&#xff1a;字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol。 引用数据类型&#xff08;对象类型&#xff09;&#xff1a;对…

设计模式之过滤器模式

1、详细介绍 过滤器模式&#xff08;Filter Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许用户使用不同的标准&#xff08;过滤条件&#xff09;对一组对象进行过滤操作&#xff0c;得到满足特定条件的对象子集。这种模式通过定义一系列可重用的过滤器&#xff0…

授人以渔 选购EX篇:网购App选择

文章目录 系列文章京东&#xff1a;品质和快速配送、电子产品和家电注意点 拼多多&#xff1a;低价注意点 天猫&#xff1a;品质&#xff08;备选&#xff09;、品牌服装和美妆注意点 淘宝&#xff1a;多样性注意点 直播购物&#xff1a;已经成为历史&#xff0c;不再推荐历史价…

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…

MariaDB简介

MariaDB是一个关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;是MySQL的一个分支&#xff0c;主要由开源社区维护和开发。 一&#xff0c; MariaDB的来历 1. **起源**&#xff1a;MariaDB的诞生与MySQL的所有权变更有关。MySQL最初由MySQL AB公司开发&#xff…