求解AX=XB 方法

一、简介

一文浅谈旋转变换:旋转矩阵、旋转向量、欧拉角、四元数-CSDN博客

在机器人学、计算机视觉和几何学中,经常会遇到求解矩阵方程 AX=XB 的问题。这种方程通常出现在坐标系变换、手眼标定(Hand-Eye Calibration)等场景中。理解如何求解这个方程对于正确建立坐标系之间的关系至关重要。本文将详细讲解 AX=XB的求解方法,包括其几何意义、数学推导以及具体的求解步骤。

二、方程 AX=XB的几何意义

矩阵 A, B, X 的结构

通常,AA, BB, XX 是齐次变换矩阵(Homogeneous Transformation Matrices),形式如下:

三、旋转的表示方式

分别是    1 、旋转矩阵

               2、欧拉角

               3、旋转向量(Rotation Vector)

旋转矩阵

  • 用 9 个量描述旋转的3个自由度,有冗余
  • 9 个量是有约束的:必须是正交矩阵,且行列式为 1

_{Rxyz}=_{Rz}*_{Ry}*_{Rx}

注意点:

如果我们按照 X->Y ->Z的顺序来选择的话,我们的旋转矩阵要写成:

_{Rxyz}=_{Rz}*_{Ry}*_{Rx}

旋转向量(Rotation Vector)

  • 任意的旋转都可以用一个旋转轴和绕轴的旋转角来描述,简称“轴角”(Axis-Angle);
  • 旋转向量,是一个三维向量,其方向与旋转轴一致,长度等于旋转角

刚体绕旋转轴旋转

r表示的是旋转轴的方向,r的长度表示刚体绕轴旋转的角度。

旋转向量转旋转矩阵:

import numpy as np
def rodrigues_rotation(r, theta):# n旋转轴[3x1]# theta为旋转角度# 旋转是过原点的,n是旋转轴r = np.array(r).reshape(3, 1)rx, ry, rz = r[:, 0]M = np.array([[0, -rz, ry],[rz, 0, -rx],[-ry, rx, 0]])R = np.eye(4)R[:3, :3] = np.cos(theta) * np.eye(3) +        \(1 - np.cos(theta)) * r @ r.T +    \np.sin(theta) * Mreturn R

 

旋转矩阵转旋转向量

J = (R - R.T) / 2
t = [-J[1, 2], J[0, 2], -J[0, 1]]
t_norm = np.linalg.norm(t)
theta = np.math.asin(t_norm)
angle = theta / np.pi * 180
r = t / t_norm
v = r * theta

缺陷:

①存在奇异性(当\theta =0^{\circ} \ or \ \theta =180^{\circ}时???)

 ②不方便直观理解。

欧拉角

定义

绕三轴旋转的角度(α,β,γ),分别对应(x,y,z)三个坐标轴。也可用 yaw-偏航、pitch-俯仰、roll-横滚 表示(旋转方向默认按右手螺旋方向,即从旋转轴正半轴向坐标原点看,逆时针方向为正,顺时针方向为负。)

分类

旋转顺序。一般有两类排序系列,一类是X-Z-X系列(经典欧拉角),一类是X-Z-Y系列(泰特布莱恩角):
        Proper Euler angles: X-Z-X, X-Y-X, Y-X-Y, Y-Z-Y, Z-Y-Z, Z-X-Z
        Tait–Bryan angles: X-Z-Y, X-Y-Z, Y-X-Z, Y-Z-X, Z-Y-X, Z-X-Y(SLAM中常使用)

转换

外旋的旋转矩阵,是按照旋转次序,依次左乘各轴分量。内旋的旋转矩阵,是按照旋转次序,依次右乘各轴分量。

欧拉角与旋转矩阵
欧拉角->旋转矩阵

def eulerAnglesToRotationMatrix(theta) :R_x = np.array([[1,         0,                  0                   ],[0,         math.cos(theta[0]), -math.sin(theta[0]) ],[0,         math.sin(theta[0]), math.cos(theta[0])  ]])R_y = np.array([[math.cos(theta[1]),    0,      math.sin(theta[1])  ],[0,                     1,      0                   ],[-math.sin(theta[1]),   0,      math.cos(theta[1])  ]])R_z = np.array([[math.cos(theta[2]),    -math.sin(theta[2]),    0],[math.sin(theta[2]),    math.cos(theta[2]),     0],[0,                     0,                      1]])R = np.dot(R_z, np.dot( R_y, R_x ))return R
旋转矩阵->欧拉角

def rotation_to_euler_radian(R):x = np.math.atan2(R[2,1] , R[2,2])y = np.math.atan2(-R[2,0], np.linalg.norm([R[2, 1], R[2, 2]]))z = np.math.atan2(R[1,0], R[0,0])return x, y, zstatic Eigen::Vector3d R2ypr(const Eigen::Matrix3d &R){Eigen::Vector3d n = R.col(0);Eigen::Vector3d o = R.col(1);Eigen::Vector3d a = R.col(2);Eigen::Vector3d ypr(3);double y = atan2(n(1), n(0));double p = atan2(-n(2), n(0) * cos(y) + n(1) * sin(y));double r = atan2(a(0) * sin(y) - a(1) * cos(y), -o(0) * sin(y) + o(1) * cos(y));ypr(0) = y;ypr(1) = p;ypr(2) = r;return ypr / M_PI * 180.0;}

 

欧拉角与旋转向量
欧拉角转旋转向量

① 欧拉角 \rightarrow 旋转矩阵 \rightarrow 旋转向量 

② 欧拉角 \rightarrow 四元数 \rightarrow 旋转向量,

//code
{Eigen::AngleAxisd E2V(Eigen::AngleAxisd(gamma, Eigen::Vector3d::UnitZ()) *Eigen::AngleAxisd(alpha, Eigen::Vector3d::UnitX()) *Eigen::AngleAxisd(beta, Eigen::Vector3d::UnitY())); std::cout << "Euler Angles to Axis-Angle: " << E2V.axis().norm() << std::endl << "angle=" << E2V.angle() << ", axis=" << E2V.axis().transpose() << std::endl << std::endl;
}//print
Euler Angles to Axis-Angle: 1.000000000
angle=1.817567592, axis=-0.015311407  0.009690003  0.999835819
旋转向量转欧拉角

① 旋转向量 \rightarrow 旋转矩阵 \rightarrow 欧拉角

//code
{const auto V2E_zxy = V2R.eulerAngles(2, 0, 1);const Eigen::Vector3d V2E(V2E_zxy(1), V2E_zxy(2), V2E_zxy(0));std::cout << "Axis-Angle to Euler Angles: " << std::endl << V2E.transpose() << std::endl << std::endl;
}//print
Axis-Angle to Euler Angles: 
-0.002792527  0.028448866  1.817448093

缺陷

四元数

定义

四元数(Quaternion)既是紧凑的,又没有奇异性,又无奇异性,且无论是求逆、串联等操作,相比矩阵更加高效,缺点是不够直观。

四元数 q 有一个实部和三个虚部,如下所示:

推导:

 

转换

缺陷

四、解方程-Tais法

分解旋转和平移部分

AX=XB

A, B, X 都是变换矩阵,那么A, B, X 表示为

注意:

我们需要先求解 旋转Rx ,然后求解平移Tx

旋转Rx

平移Tx

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AnimateCC基础教学:随机抽取获奖名单及奖品-V1.0原型版

舞台界面设计: 主轴第一帧代码&#xff1a; this.btnObj.addEventListener("click", updateStage.bind(this)); createjs.Ticker.addEventListener("tick", updateRandom.bind(this)) var _this this; var bPlaying false; var nameList ["张三…

深入了解Linux内核:task_struct结构详解

Linux 操作系统的广袤世界里&#xff0c;进程管理宛如一座大厦的基石&#xff0c;支撑着整个系统的稳定运行与高效运转 。而task_struct结构体&#xff0c;无疑是进程管理这座大厦的核心支柱&#xff0c;它承载着进程的关键信息&#xff0c;贯穿于进程从诞生到消亡的整个生命周…

IsaacLab最新2025教程(7)-引入IK solver控制机器人

机器人控制可以直接给定关节角进行驱动实现功能&#xff0c;完成任务&#xff0c;但是关节角不是很直观而且做teleoperation或者是结合VLA模型时候&#xff0c;用eef pose会更符合直觉一些&#xff0c;isaacsim用的是LulaKinematics&#xff0c;因为IsaacLab现在是ETHZ的团队在…

Vue——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs

文章目录 一、概念理解二、指令1. 常用内置指令总结2. 常用指令修饰符3. 自定义指令4. v-model原理表单类组件封装 三、补充1. computed计算属性2. watch监视器3. ref和$refs 一、概念理解 【事件处理函数】 事件处理函数应该写到一个跟data同级的配置项&#xff08;methods&a…

求职笔试题

PDD 最长公共子序列 1143-最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二维动态规划"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 这种写法错误&#xff0c;m1行…

【Ragflow】6. Ragflow-plus重磅更新:增加用户后台管理系统

概述 Ragflow本身并不包含用户管理的功能&#xff0c;我在系列前文中&#xff0c;写过一个脚本&#xff0c;用来批量插入用户&#xff0c;并自动加入团队&#xff0c;配置默认模型设置。然而&#xff0c;此方式需要用户安装对应环境&#xff0c;对普通用户并不友好。 因此我开…

什么是贴源库

贴源库的定义与核心概念 贴源库&#xff08;Operational Data Store, ODS&#xff09;是数据架构中的基础层&#xff0c;通常作为数据仓库或数据中台的第一层&#xff0c;负责从业务系统直接抽取、存储原始数据&#xff0c;并保持与源系统的高度一致性。其核心在于“贴近源头”…

MSTP+VRRP三层架构综合实验

一、实验目的 掌握VLAN、VRRP、STP和Eth-Trunk的基本配置方法。 实现内网与外网的通信&#xff0c;并确保网络的高可用性和冗余性。 理解DHCP、OSPF和NAT在网络中的应用。 二、实验环境 网络拓扑&#xff1a;如图所示&#xff0c;包含两台三层交换机&#xff08;SW1、SW2&a…

未来村庄智慧灯杆:点亮乡村智慧生活​

在乡村振兴与数字乡村建设的时代进程中&#xff0c;未来村庄智慧灯杆凭借其多功能集成与智能化特性&#xff0c;已成为乡村基础设施建设领域的崭新焦点&#xff0c;为乡村生活带来了前所未有的便利&#xff0c;推动着乡村生活模式的深刻变革。​ 多功能集成&#xff1a;一杆多能…

RedHatLinux(2025.3.22)

1、创建/www目录&#xff0c;在/www目录下新建name和https目录&#xff0c;在name和https目录下分别创建一个index.htm1文件&#xff0c;name下面的index.html 文件中包含当前主机的主机名&#xff0c;https目录下的index.htm1文件中包含当前主机的ip地址。 &#xff08;1&…

第十五章:Python的Pandas库详解及常见用法

在数据分析领域&#xff0c;Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具&#xff0c;使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法&#xff0c;并通过示例代码演示如何使用Pandas进行数据处理。最后&#xff0c;…

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…

[Raspberry Pi]如何將看門狗(WatchDog)服務建置在樹莓派的Ubuntu作業系統中?

看門狗(WatchDog)服務常應用於連網的嵌入式邊緣設備等IOT裝置和實體伺服器&#xff0c;主要是若這些連網裝置分散在各個應用環境中執行對應任務&#xff0c;例如感測物理數據&#xff0c;監控影像數據或執行各式Docker服務&#xff0c;當連網裝置因故異常&#xff0c;同時又處於…

Linux进程状态补充(10)

文章目录 前言一、阻塞二、挂起三、运行R四、休眠D五、四个重要概念总结 前言 上篇内容大家看的云里雾里&#xff0c;这实在是正常不过&#xff0c;因为例如 写实拷贝 等一些概念的深层原理我还没有讲解&#xff0c;大家不用紧张&#xff0c;我们继续往下学习就行&#xff01;&…

RPCGC阅读

24年的MM 创新 现有点云压缩工作主要集中在保真度优化上。 而在实际应用中&#xff0c;压缩的目的是促进机器分析。例如&#xff0c;在自动驾驶中&#xff0c;有损压缩会显着丢失户外场景的详细信息。在三维重建中&#xff0c;压缩过程也会导致场景数据中语义信息(Contour)的…

keil中文注释出现乱码怎么解决

keil中文注释出现乱码怎么解决 在keil–edit–configuration中encoding改为chinese-GB2312

Linux的进程优先级调度学习笔记

Linux的进程优先级数值范围 范围 -20 到 19&#xff0c;数值越大优先级越低 示例代码 下面是一个简单的 C 语言示例&#xff0c;它演示了如何在 Linux 下修改进程的优先级并观察调度影响。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> …

YOLOv8+ Deepsort+Pyqt5车速检测系统

该系统通过YOLOv8进行高效的目标检测与分割&#xff0c;结合DeepSORT算法完成目标的实时跟踪&#xff0c;并利用GPU加速技术提升处理速度。系统支持模块化设计&#xff0c;可导入其他权重文件以适应不同场景需求&#xff0c;同时提供自定义配置选项&#xff0c;如显示标签和保存…

权限提升—Windows权限提升进程注入令牌窃取服务启动

前言 依旧是提权的内容啦&#xff0c;上次讲的是利用漏洞来进行提权&#xff0c;今天我们主要讲的是利用Windows中的服务、进程等东西进行权限提升。 服务启动 首先要知道一点&#xff0c;就是windows中服务是以system权限运行的&#xff0c;假如我们创建一个运行后门的服务…

数据结构与算法——顺序表之手撕OJ题

文章目录 一、前言二、拿捏OJ题2.1移除元素2.2删除有序数组中的重复项2.3合并两个有序数组 三、总结 一、前言 Do you study today?up在上一次已经讲解完毕了有关顺序表的所有知识&#xff0c;不知道大家是否已经沉淀完毕了呢&#xff1f;有一句老话说得好啊——光看不练假把…