ardupilot开发 --- 坐标变换 篇

Good Morning, and in case I don't see you, good afternoon, good evening, and good night!
- 0. 一些概念
- 1. 坐标系的旋转
- 1.1 轴角法
- 1.2 四元素
- 1.3 基于欧拉角的旋转矩阵
- 1.3.1 单轴旋转矩阵
- 1.3.2 多轴旋转矩阵
- 1.3.3 其他
- 2. 齐次变换矩阵
- 3. visp实践
0. 一些概念
- 相关概念:旋转矩阵、平移矩阵、单应矩阵、齐次变换矩阵。
- 坐标变换包括旋转变换和平移变换。
- 为什么要坐标变换?引入坐标变换可以解决哪些问题?应用场景?
- 已知一点p在坐标系A中的坐标,计算p在坐标系B中的坐标。
- 已知一向量v在坐标系A中的值,计算v在坐标系B中的值。
- 描述坐标系A和坐标系B之间的位姿关系(姿态和位置)。
- 一向量v绕坐标系A的xyz轴旋转 θ ϕ ψ \theta \phi \psi θϕψ角度并进行一定平移后在坐标系A中的新坐标。
- 在数学建模过程中,往往需要将不同的物量量表示在同一个坐标系内才能列出等式。
- 刚体运动学。
- 图像的投影。
1. 坐标系的旋转
描述坐标系的旋转常用的方法包括:
- 轴角法
- 旋转矩阵
- 欧拉角
- 四元数
这几种旋转表示方法有各自的优缺点和应用场景,这里不作赘叙。
1.1 轴角法
不常用,略…
1.2 四元素
待续…
1.3 基于欧拉角的旋转矩阵
轴角法和四元数,这两个可以归纳为用一次旋转来表示两个坐标系间的姿态。欧拉角则是用三次旋转来表示姿态。

欧拉角指:横滚角 ϕ \phi ϕ,俯仰角 θ \theta θ,偏航角 ψ \psi ψ。
ϕ , θ , ψ \phi, \theta, \psi ϕ,θ,ψ在不同的领域有不同的定义规则:主要的区别是旋转顺序的不同,绕原始(固定)坐标轴轴旋转还是绕新(运动)坐标轴的不同(也称外旋或内旋)。
在航天航空领域的欧拉角:
- 内旋
绕运动轴旋转得到新坐标系。 - Z–>Y–>X
原始坐标系经过Z–>Y–>X顺序旋转一定的角度得到新坐标系。 - 右手系
涉及的坐标系都遵循右手定则。
1.3.1 单轴旋转矩阵
前提:右手系
这里只给出结论,不作推导。
坐标系A分别单独绕 x , y , z x,y,z x,y,z轴旋转 ϕ , θ , ψ \phi, \theta, \psi ϕ,θ,ψ角度,欧拉旋转矩阵表达式如下:
T B A = R x ( ϕ ) = [ 1 0 0 0 c o s ϕ − s i n ϕ 0 s i n ϕ c o s ϕ ] (式 1 ) T B A = R y ( θ ) = [ c o s θ 0 s i n θ 0 1 0 − s i n θ 0 c o s θ ] (式 2 ) T B A = R z ( ψ ) = [ c o s ψ − s i n ψ 0 s i n ψ c o s ψ 0 0 0 1 ] (式 3 ) T_B^A=R_x(\phi)= \begin{bmatrix} 1&0&0\\ 0&cos{\phi}&-sin{\phi}\\ 0&sin{\phi}&cos{\phi} \end{bmatrix}(式1)\\[3mm] T_B^A=R_y(\theta)= \begin{bmatrix} cos{\theta}&0&sin{\theta}\\ 0&1&0\\ -sin{\theta}&0&cos{\theta} \end{bmatrix}(式2)\\[3mm] T_B^A=R_z(\psi)= \begin{bmatrix} cos{\psi}&-sin{\psi}&0\\ sin{\psi}&cos{\psi}&0\\ 0&0&1 \end{bmatrix}(式3) TBA=Rx(ϕ)= 1000cosϕsinϕ0−sinϕcosϕ (式1)TBA=Ry(θ)= cosθ0−sinθ010sinθ0cosθ (式2)TBA=Rz(ψ)= cosψsinψ0−sinψcosψ0001 (式3)
这些旋转矩阵的意义是:新坐标系到原始坐标系的变换矩阵,即:
[ x A y A z A ] = T B A [ x B y B z B ] \begin{bmatrix} x_A\\ y_A\\ z_A \end{bmatrix}=T_B^A \begin{bmatrix} x_B\\ y_B\\ z_B \end{bmatrix} xAyAzA =TBA xByBzB
注意:
- ϕ , θ , ψ \phi, \theta, \psi ϕ,θ,ψ满足右手定则,绕右手坐标系的正方向旋转时为正。
- ϕ , θ , ψ \phi, \theta, \psi ϕ,θ,ψ是系A旋转运动到系B的旋转量,但是得到的旋转矩阵 R x , R y , R z R_x,R_y,R_z Rx,Ry,Rz却是系B到系A的坐标变换矩阵!
即:
ϕ , θ , ψ \phi, \theta, \psi ϕ,θ,ψ:A ~> B
R x , R y , R z R_x,R_y,R_z Rx,Ry,Rz:B ~> A - 系B到系A的变换矩阵可以有多种符号表示方式,通常有:
T B A T_B^A TBA
A T B ^AT_B ATB
T A B T_{AB} TAB
都表示 B ~> A 的变换关系矩阵!注意上下标的位置!! - 旋转矩阵是正交的,因此有:
[ x B y B z B ] = T A B [ x A y A z A ] = ( T B A ) − 1 [ x A y A z A ] = ( T B A ) T [ x A y A z A ] \begin{bmatrix} x_B\\ y_B\\ z_B \end{bmatrix}=T_A^B \begin{bmatrix} x_A\\ y_A\\ z_A \end{bmatrix}=(T_B^A)^{-1} \begin{bmatrix} x_A\\ y_A\\ z_A \end{bmatrix}=(T_B^A)^{T} \begin{bmatrix} x_A\\ y_A\\ z_A \end{bmatrix} xByBzB =TAB xAyAzA =(TBA)−1 xAyAzA =(TBA)T xAyAzA
即: T A B = ( T B A ) − 1 = ( T B A ) T T_A^B=(T_B^A)^{-1}=(T_B^A)^{T} TAB=(TBA)−1=(TBA)T.
1.3.2 多轴旋转矩阵
12种常用的内旋欧拉角又可分为两个类别:
- 常规欧拉角
- 泰特 - 布赖恩角
注意: 下表中如 X 1 Y 2 Z 3 X_1Y_2Z_3 X1Y2Z3表示的是矩阵相乘顺序,相当于本文的 R x R y R z R_xR_yR_z RxRyRz,表示旋转顺序是 Z ~>Y ~>X !其中的123表示绕该轴旋转的角度代称!

在航空航天领域,常用 Z ~>Y ~>X 旋转顺序的内旋欧拉角旋转矩阵。
例如,系A分别先后绕 Z , Y , X Z,Y,X Z,Y,X轴旋转 ψ , θ , ϕ \psi,\theta,\phi ψ,θ,ϕ角度,得到新的坐标系B,则有以下等式成立:
[ x A y A z A ] = T B A [ x B y B z B ] T B A = R x ( ϕ ) R y ( θ ) R z ( ψ ) = [ c o s θ c o s ψ − c o s θ s i n ψ s i n θ c o s ϕ s i n ψ + c o s ψ s i n ϕ s i n θ c o s ϕ c o s ψ − s i n ϕ s i n θ s i n ψ − c o s θ s i n ϕ s i n ϕ s i n ψ − c o s ϕ c o s ψ s i n θ c o s ψ s i n ϕ + c o s ϕ s i n θ s i n ψ c o s ϕ c o s θ ] (式 4 ) 首旋:绕系 A 的 Z 轴旋转 ψ 角度 次旋:绕首旋得到的坐标系 A ′ 的 Y 轴旋转 θ 角度 终旋:绕次旋得到的坐标系 A ′ ′ 的 X 轴旋转 ϕ 角度 系 A → 首旋 → 系 A ′ → 次旋 → 系 A ′ ′ → 终旋 → 系 B \begin{bmatrix} x_A\\ y_A\\ z_A \end{bmatrix}=T_B^A \begin{bmatrix} x_B\\ y_B\\ z_B \end{bmatrix} \\[5mm] T_B^A=R_x(\phi)R_y(\theta)R_z(\psi)=\begin{bmatrix} cos{\theta}cos{\psi}&-cos{\theta}sin{\psi}&sin{\theta}\\ cos{\phi}sin{\psi}+cos{\psi}sin{\phi}sin{\theta}&cos{\phi}cos{\psi}-sin{\phi}sin{\theta}sin{\psi}&-cos{\theta}sin{\phi}\\ sin{\phi}sin{\psi}-cos{\phi}cos{\psi}sin{\theta}&cos{\psi}sin{\phi}+cos{\phi}sin{\theta}sin{\psi}&cos{\phi}cos{\theta} \end{bmatrix}(式4)\\[5mm] 首旋:绕系A的Z轴旋转\psi角度\\[5mm] 次旋:绕首旋得到的坐标系A'的Y轴旋转\theta角度\\[5mm] 终旋:绕次旋得到的坐标系A''的X轴旋转\phi角度\\[5mm] 系A\to 首旋 \to 系A' \to 次旋 \to 系A'' \to 终旋 \to 系B xAyAzA =TBA xByBzB TBA=Rx(ϕ)Ry(θ)Rz(ψ)= cosθcosψcosϕsinψ+cosψsinϕsinθsinϕsinψ−cosϕcosψsinθ−cosθsinψcosϕcosψ−sinϕsinθsinψcosψsinϕ+cosϕsinθsinψsinθ−cosθsinϕcosϕcosθ (式4)首旋:绕系A的Z轴旋转ψ角度次旋:绕首旋得到的坐标系A′的Y轴旋转θ角度终旋:绕次旋得到的坐标系A′′的X轴旋转ϕ角度系A→首旋→系A′→次旋→系A′′→终旋→系B
旋转矩阵是正交的,因此有:
T A B = ( T B A ) − 1 = ( T B A ) T T_A^B=(T_B^A)^{-1}=(T_B^A)^{T} TAB=(TBA)−1=(TBA)T
实质上,可以自行根据(式1)(式2)(式3)进行不同顺序的相乘,以得到特定的欧拉旋转矩阵,(式4)就是下面相乘顺序得到的结果:
T B A = R x ( ϕ ) R y ( θ ) R z ( ψ ) T_B^A=R_x(\phi)R_y(\theta)R_z(\psi) TBA=Rx(ϕ)Ry(θ)Rz(ψ)
注意,越靠右边旋转顺序越优先!!
1.3.3 其他
- 优点:简洁直观。
- 缺点:万向节死锁,意思是在某些姿态下,欧拉角的三自由度失去了一个自由度。
- 扩展结论:
- 欧拉角旋转矩阵是正交的,有 R T = R − 1 R^T=R^{-1} RT=R−1
- 三次绕固定轴旋转的最终姿态和以相反顺序三次绕运动轴旋转的最终姿态相同。
- 欧拉角+旋转矩阵才能 VS 轴角法+四元数
- 外旋欧拉旋转矩阵请自行查阅其他资料。
2. 齐次变换矩阵
将两个坐标系的旋转关系和平移关系整合成一个4x4的矩阵。
[ x b y b z b 1 ] = b T a [ x a y a z a 1 ] = [ b R a O a b 0 1 ] [ x a y a z a 1 ] \begin{bmatrix} x_b \\ y_b \\ z_b \\ 1 \end{bmatrix}={^bT_a} \begin{bmatrix} x_a \\ y_a \\ z_a \\ 1 \end{bmatrix}= \begin{bmatrix} ^bR_a&O_a^b \\ 0&1 \\ \end{bmatrix} \begin{bmatrix} x_a \\ y_a \\ z_a \\ 1 \end{bmatrix} xbybzb1 =bTa xayaza1 =[bRa0Oab1] xayaza1
b T a = [ b R a O a b 0 1 ] {^bT_a} = \begin{bmatrix} ^bR_a&O_a^b \\ 0&1 \\ \end{bmatrix} bTa=[bRa0Oab1]
其中:
b T a ^bT_a bTa称为坐标系 a 到坐标系 b 的齐次变换矩阵;
b R a ^bR_a bRa是系a到系b的旋转矩阵;
O a b O_a^b Oab是系a原点在系b中的坐标;
坐标系 a 到坐标系 b 的齐次变换矩阵为 b T a ^bT_a bTa,那么坐标系 b 到坐标系 a 的齐次变换矩阵为 a T b = ( b T a ) − 1 ^aT_b=(^bT_a)^{-1} aTb=(bTa)−1,根据齐次矩阵的性质,可知:
a T b = ( b T a ) − 1 = [ a R b − a R b O a b 0 1 ] ^aT_b=(^bT_a)^{-1}= \begin{bmatrix} ^aR_b&-^aR_bO_a^b \\ 0&1 \\ \end{bmatrix} aTb=(bTa)−1=[aRb0−aRbOab1]
3. visp实践
//! [compute cMe]
vpRxyzVector c1TOc_xyz(vpMath::rad(-10.0), vpMath::rad(0), 0); // c1 ~> c 的xyz轴旋转量 !
vpRotationMatrix c1Rc(c1TOc_xyz); // 旋转矩阵:c -> c1
vpRotationMatrix cRc1 = c1Rc.inverse(); // 旋转矩阵:c1 -> c, 旋转矩阵是正交的,因此 c1Rc^-1==c1Rc^T
vpHomogeneousMatrix cMc1(vpTranslationVector(), cRc1); // 齐次变换矩阵:c1 -> c
vpRotationMatrix c1Re { 1, 0, 0, 0, 0, 1, 0, -1, 0 }; // 旋转矩阵:e -> c1 !
vpTranslationVector e0_c1(0, -0.03, -0.07); // 平移关系:e系原点在c1系中的坐标 !
vpHomogeneousMatrix c1Me(e0_c1, c1Re); // 齐次变换矩阵:e -> c1
vpHomogeneousMatrix cMe = cMc1 * c1Me; // 齐次变换矩阵:e -> c
vpVelocityTwistMatrix cVe(cMe); // 伺服系统控制量Vc=[vx,vy,vz,wx,wy,wz]的坐标变换矩阵:e -> c,从飞机机体系FRD到相机系RDF
//! [compute cMe]
相关文章:
ardupilot开发 --- 坐标变换 篇
Good Morning, and in case I dont see you, good afternoon, good evening, and good night! 0. 一些概念1. 坐标系的旋转1.1 轴角法1.2 四元素1.3 基于欧拉角的旋转矩阵1.3.1 单轴旋转矩阵1.3.2 多轴旋转矩阵1.3.3 其他 2. 齐次变换矩阵3. visp实践 0. 一些概念 相关概念&am…...
git clone 别人项目后正确的修改和同步操作
简介 git clone主要是克隆别人的开源项目。但更高端的操作是实现本地修改的同时,能同步别人的在线修改,并且不相互干扰: 克隆原始项目:从远程仓库克隆项目到本地。添加上游仓库:将原始项目的远程仓库添加为上游仓库。…...
JAVA连接FastGPT实现流式请求SSE效果
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 一、先看效果 真正实流式请求,SSE效果,SSE解释&am…...
二分查找1
1. 二分查找(704) 题目描述: 算法原理: 暴力解法就是遍历数组来找到相应的元素,使用二分查找的解法就是每次在数组中选定一个元素来将数组划分为两部分,然后因为数组有序,所以通过大小关系舍弃…...
什么美业门店管理系统好用?2024美业收银系统软件排名分享
美业SAAS系统在美容、美发、美甲等行业中十分重要,这种系统为美业提供了一种数字化解决方案,帮助企业更高效地管理业务和客户关系。 美业门店管理系统通常提供预约管理、客户管理、库存管理、报表生成等一系列功能,以满足美容院、美发沙龙等…...
【文件上传】
文件上传漏洞 FileUpload 0x01 定义 服务端未对客户端上传文件进行严格的 验证和过滤造成可上传任意文件情况;0x02 攻击满足条件: 1. 上传文件能够被Web容器解释执行 2. 找到文件位置 3.上传文件未被改变内容。(躲避安全检查&#…...
Golang 单引号、双引号和反引号的概念、用法以及区别
在 Golang(Go 语言)中,单引号 ()、双引号 (") 和反引号 () 用于不同类型的字符串和字符表示。以下是它们的概念、用法和区别: 1. 单引号 () 概念 单引号用于表示 字符(rune 类型)。一个字符表示一个…...
linux和mysql基础指令
Linux中nano和vim读可以打开记事文件。 ifdown ens33 ifup ens33 关闭,开启网络 rm -r lesson1 gcc -o code1 code1.c 编译c语言代码 ./code1 执行c语言代码 rm -r dir 删除文件夹 mysql> show databases-> ^C mysql> show databases; -------…...
JDK 为什么需要配置环境变量
前言 首先,我们要知道 Java 程序的执行过程。首先将 xxx.java 文件(使用 javac 编译指令)编译成 xxx.class 文件(字节码文件),再将字节码文件(使用 java 执行指令)解释成电脑所能认识…...
ViewBinding的使用(因为kotlin-android-extensions插件的淘汰)
书籍: 《第一行代码 Android》第三版 开发环境: Android Studio Jellyfish | 2023.3.1 问题: 3.2.4在Activity中使用Toast章节中使用到了kotlin-android-extensions插件,但是该插件已经淘汰,根据网上了解,目前使用了新的技术VewBinding替…...
IOS Swift 从入门到精通:ios 连接数据库 安装 Firebase 和 Firestore
创建 Firebase 项目 导航到Firebase 控制台并创建一个新项目。为项目指定任意名称。 在这里插入图片描述 下一步,启用 Google Analytics,因为我们稍后会用到它来发送推送通知。 在这里插入图片描述 在下一个屏幕上,选择您的 Google Analytics 帐户(如果已创建)。如果没…...
QT4-QT5(6)-const char* QString 乱码转换
我简单粗暴的给出个结论: QString GBK编码正常,可以转UTF-8编码,但会有少量乱码。 const char* 编码就不要转编码,转哪个都是乱码。 UTF-8.cpp 下 1.QString GBK->UTF-8 2.const char * GBK->UTF-8 const char *…...
报错:RuntimeError_ cuDNN error_ CUDNN_STATUS_EXECUTION_FAILED
原因:pytorch与cuda版本不对 也有可能是内存空间不足,可以更改虚拟空间大小,参考:解决电脑内存不足问题:Win10虚拟内存设置指南...
黑马点评项目总结1-使用Session发送验证码和登录login和 使用Redis存储验证码和Redis的token登录
黑马先是总结了从session实现登录,然后是因为如果使用了集群方式的服务器的话,存在集群共享session互相拷贝效率低下的问题,接着引出了速度更快的内存型的kv数据库Redis, 使用Session发送验证码和登录login 举个例子:…...
【大模型】Vllm基础学习
前言:vllm是一个大语言模型高速推理框架,旨在提高大模型的服务效率。优势是内存管理,实现的核心是pageattetion算法。仅在gpu上加速,不在cpu加速。 目录 1. PageAttention2. 实践2.1 安装2.2 离线推理2.3 适配OpenAI的api 1. Page…...
使用vue动态给同一个a标签添加内容 并给a标签设置hover,悬浮文字变色,结果鼠标悬浮有的字上面不变色
如果Vue的虚拟DOM更新机制导致样式更新不及时,你可以尝试以下几种方法来解决这个问题: 确保使用响应式数据: 确保你使用的数据是响应式的,并且任何对这些数据的更改都会触发视图的更新。在Vue中,你应该使用data对象中的…...
【ajax实战06】进行文章发布
本文章目标:收集文章内容,并提交服务器保存 一:基于form-serialize插件收集表单数据 form-serialize插件仅能收集到表单数据,除此之外的数据无法收集到 二:基于axios提交到服务器保存 三:调用alert警告…...
Codeforces Round 954 (Div. 3)(A~E)
目录 A. X Axis B. Matrix Stabilization C. Update Queries D. Mathematical Problem A. X Axis Problem - A - Codeforces 直接找到第二大的数,答案就是这个数与其他两个数的差值的和。 void solve() {vector<ll>a;for (int i 1; i < 3; i){int x;…...
基于Java微信小程序同城家政服务系统设计和实现(源码+LW+调试文档+讲解等)
💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还…...
[21] Opencv_CUDA应用之使用Haar级联的对象检测
Opencv_CUDA应用之使用Haar级联的对象检测 Haar级联使用矩形特征来检测对象,它使用不同大小的矩形来计算不同的线和边缘特征。矩形包含一些黑色和白色区域,如下图所示,它们在图像的不同位置居中 类Haar特征检测算法的思想是计算矩形内白色像素和黑色像素之间的差异这个方法的…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
