当前位置: 首页 > news >正文

【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角

专栏系列文章如下:
【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍
【视觉SLAM十四讲学习笔记】第二讲——初识SLAM
【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵

本章将介绍视觉SLAM的基本问题之一:如何描述刚体在三维空间中的运动

旋转向量

矩阵表示方式至少有一下两个缺点:

  1. SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度。因此这种表达方式是冗余的。同理,变换矩阵用16个量表达了6自由度的变换。
  2. 旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为 1。变换矩阵也是如此。当想要估计或优化一个旋转矩阵/变换矩阵时,这些约束会使得求解变得更困难。

因此,我们希望有一种方式能够紧凑地描述旋转和平移。例如,用一个三维向量表达旋转,用六维向量表达变换。事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角/角轴,Axis-Angle),只需一个三维向量即可描述旋转。同样,对于变换矩阵,我们使用一个旋转向量和一个平移向量即可表达一次变换。这时的变量维数正好是六维。

考虑某个用R表示的旋转。如果用旋转向量来描述,假设旋转轴为一个单位长度的向量n,角度为 θ,那么向量 θn也可以描述这个旋转。

从旋转向量到旋转矩阵的转换过程由罗德里格斯公式(Rodrigues’s Formula )表明,转换的结果 :

img

符号∧是向量到反对称矩阵的转换符。反之,我们也可以计算从一个旋转矩阵到旋转向量的转换。对于转角 θ,取两边的(矩阵对角线元素之和),有

在这里插入图片描述

因此:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于转轴n,由于旋转轴上的向量在旋转后不发生改变,说明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,转轴n是矩阵R特征值1对应的特征向量。求解此方程,再归一化,就得到了旋转轴。也可以从“旋转轴经过旋转之后不变”的几何角度看待这个方程。

欧拉角

无论是旋转矩阵、旋转向量,它们虽然能描述旋转,但对我们人类是非常不直观的。当我们看到一个旋转矩阵或旋转向量时,很难想象出这个旋转究竟是什么样的。当它们变换时,我们也不知道物体是向哪个方向在转动。而欧拉角则提供了一种非常直观的方式来描述旋转——它使用了3个分离的转角,把一个旋转分解成 3 次绕不同轴的旋转。而人类很容易理解绕单个轴旋转的过程。

但是,由于分解方式有许多种,所以欧拉角也存在着众多不同的、易于混淆的定义方法。比如说,先绕X轴旋转,再绕Y轴,最后绕Z轴,就得到了一个XYZ轴的旋转。同理,可以定义ZYZ、ZYX等旋转方式。如果讨论得更细一些,还需要区分每次是绕固定轴旋转的,还是绕旋转之后的轴旋转的。这种定义方式上的不确定性带来了很多实用当中的困难。

欧拉角当中比较常用的一种,便是用“偏航−俯仰−滚转”(yaw-pitch-roll)3个角度来描述一个旋转。它等价于ZYX轴的旋转。假设一个刚体的前方(朝向我们的方向)为X轴,右侧为Y轴,上方为Z轴。那么,ZYX转角相当于把任意旋转分解成以下3个轴上的转角:

  1. 绕物体的Z轴旋转,得到偏航角 yaw;

  2. 旋转之后的Y轴旋转,得到俯仰角 pitch;

  3. 旋转之后的 X 轴旋转,得到滚转角 roll。

此时,可以使用 [r,p,y]T 这样一个三维的向量描述任意旋转。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

欧拉角的一个重大缺点是会碰到万向锁问题(Gimbal Lock ):在俯仰角为 ±90◦时,第一次旋转与第三次旋转将使用同一个轴,使得系统丢失了一个自由度(由 3 次旋转变成了 2 次旋转)。这被称为奇异性问题,只要想用3个实数来表达三维旋转时,都会不可避免地碰到奇异性问题(旋转向量也有奇异性,发生在转角θ超过2Π而产生周期性时)。

由于这种问题,欧拉角不适于插值和迭代,往往只用于人机交互中。我们很少在SLAM程序中直接使用欧拉角表达姿态,同样不会在滤波或优化中使用欧拉角表达旋转,因为它具有奇异性。如果想验证自己的算法是否有错,转换成欧拉角能够帮你快速分辨结果是否正确。

相关文章:

【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角

专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 本章将介绍视觉SLAM的基本问题之一:如何描述刚体在三维空间中的运动? 旋转向…...

【UGUI】制作用户注册UI界面

这里面主要的操作思想就是 1.打组 同一个事情里面包含两个UI元素都应该打组便于管理和查找 2.设置锚点位置 每次创建一个UI都应该设置他的锚点以便于跟随画布控制自己的:相对位置 3. 设置尺寸(像素大小) 每一次UI元素哪怕是作为父物体的…...

【UE】透视效果

效果 步骤 1. 新建一个空白工程 2. 添加一个第三人称游戏和初学者内容包到内容浏览器 3. 新建一个材质,这里命名为“M_Perspective” 打开“M_Perspective”,设置材质域为后期处理 添加三个“SceneTexture”节点,场景纹理ID选项分别设置为“…...

前端下载文件或者图片方式,window.open或者a标签形式

首先分别讲一下下载文件的方式都有哪些 1.通过a标签的方式下载文件 <a href"http://www.baidu.com" download"baidu.html">下载</a> 我们点击下载&#xff0c;发现是跳转到了百度的首页&#xff0c;并没有真的下载文件。 因为a标签下载只能…...

webpack配置scss loader

国内GPT站点&#xff1a;https://www.atalk-ai.com 在 Webpack 中配置 sass-loader 用于处理 .scss 文件通常涉及以下步骤&#xff1a; 安装必要的依赖&#xff1a; 你需要安装 sass-loader&#xff0c;以及 sass 本身&#xff08;sass 是 node-sass 的替代品&#xff0c;更快且…...

k8s有状态部署mysql主从(local pv持久化)

1、修改自己对应的命名空间 2、local pv的方式必须先创建好目录在给权限 3、sts部署文件密码都要修改好在部署 yaml资源文件如下&#xff1a; #配置mysql的root密码再部署&#xff0c;如果部署了在修改root密码就会失败&#xff0c;必须在初始化就把root密码修改好 #部署采…...

下载并安装anaconda和VScode,配置虚拟环境,并使用VScode运行代码

文章目录 前言软件下载Anaconda下载VScode下载 软件安装Anaconda安装Vscod安装 配置虚拟环境并运行代码Anaconda创建环境VScode使用&#xff0c;运行代码1. 打开代码所在文件夹2. 选择解释器3. 运行代码 总结 前言 运行python代码&#xff0c;需要2个软件如下&#xff1a; Ana…...

拼图 游戏

运行出的游戏界面如下&#xff1a;按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password;p…...

python循环语句和函数

1.使用for循环打印9*9乘法表 for i in range(1, 10):for j in range(1, i1):print(i, "*", j, "", i*j, end"\t")print()结果&#xff1a; 2.使用while循环打印9*9乘法表 i 1 while i < 10:j 1while j < i1:print(i, "*", j…...

php框架dcat-admin速查笔记

要想灵活的使用dcat-admin框架开发,必须知道框架有哪些类提供给我们使用. 每一个自定义的按钮,弹框,信息展示,小组件都用到特定的类和接口. 常用核心类 Dcat\Admin\Http\Controllers\AdminController 需要继承的公共控制器 Dcat\Admin\Layout\Content 布局核心 Dcat\Admin\Gr…...

【Java】文件I/O-文件内容操作-输入输出流-Reader/Writer/InputStream/OutputStream四种流

导读 在文件I/O这一节的知识里&#xff0c;对文件的操作主要分为两大类&#xff1a; ☑️针对文件系统进行的操作 ☑️针对文件内容进行的操作 上文已经讲了针对文件系统即File类的操作&#xff0c;这篇文章里博主就来带了解针对文件内容的操作&#xff0c;即输入输出流&am…...

rocky8.9配置K8S集群kubernetes,centos同理

注意&#xff01;&#xff01;&#xff01; 虚拟机实验环境不要使用’克隆’&#xff01;&#xff01;&#xff01; 唯一标识冲突&#xff1a;K8S集群中的每个节点都需要具有唯一的标识符&#xff0c;例如节点名称、IP地址、MAC地址等。当克隆虚拟机时&#xff0c;这些唯一标识…...

Linux下的文件IO之系统IO

1. 知识点 读入写出&#xff0c;切记以我们程序为中心向文件或者别的什么东西读入写出&#xff08;输入流输出流&#xff09; 人话就是 文件向我们程序就是读入 程序向文件或者别的什么就是写出 2. open打开文件 open.c /****************************************************…...

iptables防火墙之SNAT与DNAT

1. SNAT SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) SNAT原理:源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射。 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由私网IP…...

Python与设计模式--命令模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…...

uni-app 自带返回方法onBackPress,返回上一级并且刷新页面内容获取最新的数据

onBackPress 返回上一级并且刷新页面内容获取最新的数据 onBackPress 方法是uinapp自带返回键方法&#xff0c;也就是在app和H5返回键 onBackPress() {setTimeout(() > {uni.switchTab({url: /pages/Users/index,})}, 300)return true}, methods: {}在这里 uni.switchTab…...

python用YOLOv8对图片进行分类

用yolov8的模型进行分类 先上效果图 图片资源 模型下载地址 https://github.com/ultralytics/ultralytics 代码 import matplotlib.pyplot as plt from ultralytics import YOLO from PIL import Image import cv2model YOLO(../ultralytics/yolov8n.pt)# print(model…...

Spring中@DependsOn 使用详解

一、注解源码 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented public interface DependsOn {String[] value() default {}; } 二、基础概念 DependsOn是Spring框架用来指定bean之间依赖关系的注解之一&#xff0c;即可用户类…...

android笔记 SELinux

1.SELinux解错步骤 log信息&#xff1a; 11-20 02:25:12.526 8976 8976 W om.jzzh.setting: type1400 audit(0.0:1316): avc: denied { write } for name"com.jzzh.setting-IWLR9dkz8TWizbNujdTpWw" dev"mmcblk2p15" ino2661 scontextu:r:system_app:s0…...

vue3 keep-alive页面切换报错:parentComponent.ctx.deactivate is not a function

问题&#xff1a; <router-view v-slot"{ Component }"><keep-alive ><component :is"Component" v-if"$route.meta.keepAlive" /></keep-alive><component :is"Component" v-if"!$route.meta.keepA…...

新手入门Windows驱动开发:从快马生成ahflt.sys示例代码开始

今天想和大家分享一下我最近学习Windows驱动开发的小心得。作为一个刚接触系统编程的新手&#xff0c;我发现ahflt.sys这个系统文件是个不错的切入点。通过InsCode(快马)平台&#xff0c;我快速生成了一个简单的驱动示例&#xff0c;下面就把这个学习过程记录下来。 驱动开发基…...

利用快马平台快速生成ffmpeg视频裁剪与滤镜添加原型

最近在做一个短视频处理的小工具&#xff0c;需要快速验证ffmpeg的视频裁剪和滤镜功能。传统方式要自己搭建环境、查文档、写代码&#xff0c;整个过程特别耗时。后来发现用InsCode(快马)平台可以省去这些麻烦&#xff0c;直接输入需求就能生成可运行的原型代码&#xff0c;特别…...

实测有效!Yi-Coder-1.5B生成高质量代码案例分享

实测有效&#xff01;Yi-Coder-1.5B生成高质量代码案例分享 1. 引言&#xff1a;一个轻量级但强大的编程伙伴 最近在尝试各种代码生成模型时&#xff0c;我发现了Yi-Coder-1.5B这个宝藏。说实话&#xff0c;一开始看到“1.5B”这个参数规模&#xff0c;我并没有抱太高期望——…...

反向传播:责任追溯大法——梯度如何“回流“

反向传播:责任追溯大法——梯度如何"回流"(Version B) 📚 《从零到一造大脑:AI架构入门之旅》专栏 专栏定位:面向中学生、大学生和 AI 初学者的科普专栏,用大白话和生活化比喻带你从零理解人工智能 本系列共 42 篇,分为八大模块: 📖 模块一【AI 基础概念…...

别再手动算Offset了!Vector DaVinci里这样配置AUTOSAR OS Alarm,让任务调度更丝滑

Vector DaVinci实战&#xff1a;AUTOSAR OS Alarm智能配置与任务调度优化 在汽车电子系统开发中&#xff0c;任务调度就像交响乐团的指挥&#xff0c;需要精确协调各个执行单元的时间节奏。传统手动计算Alarm Offset的方式&#xff0c;不仅效率低下&#xff0c;还容易引入人为错…...

Phi-4-mini-reasoning应用场景:AI竞赛教练系统自动出题与解析

Phi-4-mini-reasoning应用场景&#xff1a;AI竞赛教练系统自动出题与解析 1. 引言&#xff1a;当AI遇见竞赛训练 想象一下&#xff0c;一位数学竞赛教练每天需要&#xff1a; 设计不同难度的题目准备详细的解题步骤针对学生错误提供个性化解析不断更新题库保持新鲜度 传统方…...

GLM-4.1V-9B-Base实战教程:批量图片队列处理与异步结果回调机制实现

GLM-4.1V-9B-Base实战教程&#xff1a;批量图片队列处理与异步结果回调机制实现 1. 引言 在实际业务场景中&#xff0c;我们经常需要处理大量图片的分析任务。GLM-4.1V-9B-Base作为一款强大的视觉多模态理解模型&#xff0c;虽然提供了便捷的Web界面&#xff0c;但面对批量图…...

cv_resnet18_ocr-detection保姆级教程:从安装到批量处理图片文字

cv_resnet18_ocr-detection保姆级教程&#xff1a;从安装到批量处理图片文字 1. 快速上手&#xff1a;5分钟搞定OCR文字检测 你是不是经常需要从图片里提取文字&#xff1f;比如整理扫描的文档、识别截图里的信息&#xff0c;或者处理一堆商品图片上的标签。手动打字太慢&…...

qt模块学习记录

qt模块学习记录一、Qt Core其他模块都用到的核心非图形类二、Qt GUI 设计 GUI 界面的基础类&#xff0c;包括 OpenGL三、功能模块Qt Network 使网络编程更简单和轻便的类Qt SQL 使用 SQL 用于数据库操作的类Qt Multimedia 音频、视频、摄像头和广播功能的类四、老式界面Qt Widg…...

Oak安全最佳实践:10个防范常见Web攻击的终极指南

Oak安全最佳实践&#xff1a;10个防范常见Web攻击的终极指南 【免费下载链接】oak A middleware framework for handling HTTP with Deno &#x1f43f;️ &#x1f995; 项目地址: https://gitcode.com/gh_mirrors/oa/oak Oak是一个基于Deno的现代化中间件框架&#xf…...