技术标签: matlab 机器人(MATLAB)
三维情况是上一节的二维情况(二维空间位姿描述)的延伸。在二维坐标系上增加一个额外的坐标轴即可,通常用z表示,它同时与x轴和y轴正交。z轴的方向服从右手规则,并构成右手坐标系。与各坐标轴平行的单位向量记作 x ^ \hat{x} x^、 y ^ \hat{y} y^和 z ^ \hat{z} z^:
z ^ = x ^ × y ^ , x ^ = y ^ × z ^ , y ^ = z ^ × x ^ \hat{z}=\hat{x}\times\hat{y},\hat{x}=\hat{y}\times\hat{z},\hat{y}=\hat{z}\times\hat{x} z^=x^×y^,x^=y^×z^,y^=z^×x^
坐标系中的一个点P可用其x,y和z的坐标值(x,y,z)或者一个约束向量表示:
P = x x ^ + y y ^ + z z ^ P=x\hat{x}+y\hat{y}+z\hat{z} P=xx^+yy^+zz^
图1 展示了一个相对于参考坐标系{A}的坐标系{B}。显然,{B}的原点通过向量t=(x,y,z)进行平移,然后再通过某种复杂的方式进行旋转。做法还是同前面一样,从任意一点P出发,然后再确定 A p {^A}p Ap和 B p {^B}p Bp之间的关系。仍然是两方面考虑:旋转和平移。
图1中显示了两个右手坐标系,其方向差异很大,将坐标系{A}旋转,直到与坐标系{B}方向一致。首先考虑绕单个坐标轴的旋转。下图所示显示了一个右手坐标系,以及它绕不同坐标轴旋转不同角度的情形。
但绕坐标轴连续旋转就没那么简单了,下图演示了一个坐标系按不同的顺序旋转的情形,可以看到虽然旋转角度相同,但最终的坐标系完全不同,它取决于旋转的顺序。
目前有很多种表示旋转的方法,后面将会介绍几种:正交旋转矩阵,欧拉和卡尔丹角,旋转轴与角度,以及单元四位数。他们都可以表示为向量或矩阵,即MATLAB的自然数据类型,或者表示为一个工具箱自定义的类。
用相对于参考坐标系的坐标轴单位向量表示它们所在坐标系的方向。每个单位向量有三个元素,他们组成了 3 × 3 3\times3 3×3阶正交矩阵 A R B {^A}R_B ARB:
( A x A y A z ) = A R B ( B x B y B z ) \begin{pmatrix} {^A}x \\ {^A}y \\ {^A}z\\ \end{pmatrix}={^A}R_B\begin{pmatrix} {^B}x \\ {^B}y \\ {^B}z\\ \end{pmatrix} ⎝⎛AxAyAz⎠⎞=ARB⎝⎛BxByBz⎠⎞
上式将一个相对坐标系{B}的向量旋转为相对于坐标系{A}的向量。矩阵R属于属于特殊三维正交群。它具有正交矩阵的性质,如 R T = R − 1 R^T=R^{-1} RT=R−1以及 d e t ( R ) = 1 det(R)=1 det(R)=1。
分别绕x,y,z轴旋转 θ \theta θ角后的标准正交矩阵可表示为:
R x ( θ ) = ( 1 0 0 0 cos θ − sin θ 0 sin θ cos θ ) R_x(\theta)=\begin{pmatrix} 1&0&0\\0&\cos\theta&-\sin\theta\\0&\sin\theta&\cos\theta \end{pmatrix} Rx(θ)=⎝⎛1000cosθsinθ0−sinθcosθ⎠⎞
R y ( θ ) = ( cos θ 0 sin θ 0 1 0 − sin θ 0 cos θ ) R_y(\theta)=\begin{pmatrix}\cos\theta &0 &\sin\theta\\0&1&0\\-\sin\theta&0&\cos\theta\end{pmatrix} Ry(θ)=⎝⎛cosθ0−sinθ010sinθ0cosθ⎠⎞
R y ( θ ) = ( cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ) R_y(\theta)=\begin{pmatrix}\cos\theta&-\sin\theta&0\\\sin\theta&\cos\theta&0\\0&0&1&\end{pmatrix} Ry(θ)=⎝⎛cosθsinθ0−sinθcosθ0001⎠⎞
>>R = rotx(pi/2); #绕x轴旋转π/2
>>trplot(R); #绘制相应的坐标系
>>tranimate(R); #旋转动画,展示了世界坐标系旋转到指定坐标系的过程
R =
1.0000 0 0
0 0.0000 -1.0000
0 1.0000 0.0000
2. 先绕x轴旋转,再绕y轴旋转。
>>R = rotx(pi/2) * roty(pi/2)
>>trplot(R)
R =
0.0000 0 1.0000
1.0000 0.0000 -0.0000
-0.0000 1.0000 0.0000
3. 如果颠倒以上旋转顺序,可以看出旋转的不可交换性
>>R = roty(pi/2) * rotx(pi/2)
R =
0.0000 1.0000 0.0000
0 0.0000 -1.0000
-1.0000 0.0000 0.0000
得到的结果完全不同
欧拉旋转定理要求绕3个轴依次旋转,但不能绕同一轴连续旋转两次。旋转顺序分为两种:欧拉式和卡尔丹式。
ZYZ序列的欧拉角表示为
R = R z ( ϕ ) R y ( θ ) R z ( ψ ) (1) R=R_z(\phi)R_y(\theta)R_z(\psi)\tag1 R=Rz(ϕ)Ry(θ)Rz(ψ)(1)
欧拉角是一个三维向量 Γ = ( ϕ , θ , ψ ) \Gamma=(\phi,\theta,\psi) Γ=(ϕ,θ,ψ)。
例 1:要计算 Γ = ( 0.1 , 0.2 , 0.3 ) \Gamma=(0.1,0.2,0.3) Γ=(0.1,0.2,0.3)的等价旋转矩阵,可以表示为:
>>R = rotz(0.1) * roty(0.2) * rotz(0.3)
>>R = eu12r(0.1, 0.2, 0.3) #两个表达都可
R =
0.9021 -0.3836 0.1977
0.3875 0.9216 0.0198
-0.1898 0.0587 0.9801
上述问题的逆命题就是找到给定旋转矩阵的欧拉角:
>>gamma = tr2eul(R)
gamma =
0.1000 0.2000 0.3000
但是,如果 θ \theta θ为负时,其反函数结果与原来的数值不同,它返回了一个正的 θ \theta θ值和两个不同的 ϕ 、 ψ \phi、\psi ϕ、ψ值,但这一组欧拉角对应的旋转矩阵仍与前一组是相同的,两组不同的欧拉角对应同一个旋转矩阵,说明从旋转矩阵到欧拉角的映射不是唯一的,而工具箱函数返回的角度始终为正。
>>R = eu12r(0.1, -0.2, 0.3)
R =
0.9021 -0.3836 -0.1977
0.3875 0.9216 -0.0198
0.1898 -0.0587 0.9801
#反函数结果为
>>tr2eul(R)
ans =
-3.0416 0.2000 -2.8416
>>eu12r(ans)
ans =
0.9021 -0.3836 -0.1977
0.3875 0.9216 -0.0198
0.1898 -0.0587 0.9801
>>R = eul2r(0.1, 0, 0.3)
R =
0.9211 -0.3894 0
0.3894 0.9211 0
0 0 1.0000
>>tr2eul(R)
ans =
0 0 0.4000
对于 θ = 0 \theta=0 θ=0的情况,反函数返回的角度值与原值完全不同。在这种情况下,从式(1)得出的旋转矩阵是
R = R z ( ϕ ) R z ( ψ ) = R z ( ϕ + ψ ) R=R_z(\phi)R_z(\psi)=R_z(\phi+\psi) R=Rz(ϕ)Rz(ψ)=Rz(ϕ+ψ)
由于 R y = I R_y=I Ry=I,所以可简化为只是 ϕ + ψ \phi+\psi ϕ+ψ的一个函数。对于逆运算而言,只能确定这个和的值。要想得到其中每个值,只能按惯例取 ϕ = 0 \phi=0 ϕ=0。 θ = 0 \theta=0 θ=0的情况实际上是一个奇异点。
另一种广泛使用的旋转角顺序是横滚-俯仰-偏航角,即
R = R x ( θ r ) R y ( θ p ) R z ( θ y ) R=R_x(\theta_r)R_y(\theta_p)R_z(\theta_y) R=Rx(θr)Ry(θp)Rz(θy)
它用于描述船舶、飞机和车辆的姿态时非常直观。横滚、俯仰和偏航(也称为倾斜、姿态和航向)是指分别绕x、y、z轴的旋转。这个xyz角序列,即专业上的卡尔丹角,也被称为泰特-布莱恩角或导航角。
例2:对于航空及地面车辆而言,通常定义x轴为前进的方向、z轴垂直向下、y轴指向右手方向。
>>R = rpy2r(0.1, 0.2, 0.3)
R =
0.9363 -0.2751 0.2184
0.2896 0.9564 -0.0370
-0.1987 0.0978 0.9752
>>gamma = tr2rpy(R) #反函数结果
gamma =
0.1000 0.2000 0.3000
对于空间中的两个任意姿态的坐标系,总是可以找到一个旋转轴,使其中一个坐标系绕这个轴旋转可以和另一个坐标系的姿态重合。
>>R = rpy2r(0.1, 0.2, 0.3)
R =
0.9363 -0.2751 0.2184
0.2896 0.9564 -0.0370
-0.1987 0.0978 0.9752
>>[theta, v] = tr2angvec(R) #theta是旋转的角度大小,v是绕其旋转的向量
theta =
0.3655
v =
0.1886 0.5834 0.7900
>>[v, lambda] = eig(R) #求取R矩阵的特征值和特征向量
v =
0.6944 + 0.0000i 0.6944 + 0.0000i 0.1886 + 0.0000i
-0.0792 - 0.5688i -0.0792 + 0.5688i 0.5834 + 0.0000i
-0.1073 + 0.4200i -0.1073 - 0.4200i 0.7900 + 0.0000i
lambda =
0.9339 + 0.3574i 0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.9339 - 0.3574i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 + 0.0000i
一个正交矩阵总有一个实特征值 λ = 1 \lambda=1 λ=1,以及一对共轭复特征值 λ = cos θ ± i sin θ \lambda=\cos\theta\pm{i}\sin\theta λ=cosθ±isinθ,其中 θ \theta θ代表旋转的角度。根据特征值和特征向量的定义有
R v = λ v Rv=\lambda{v} Rv=λv
其中, v v v是对应于 λ \lambda λ的特征向量。当 λ = 1 \lambda=1 λ=1时:
R v = v Rv=v Rv=v
意味着对应的这个特征向量 v v v是不随旋转而改变的。这样的向量只有一个,而旋转就是以这个轴为向量发生的。上面的例子中第三个特征值等于1,所以旋转轴应是矩阵v中的第三列。
文章浏览阅读120次。如果Server段没有安装X界面,如何来安装Oracle呢?我们可以使用Oracle提供的静默安装来实现提示符下的Oracle安装。安装前的系统环境变量及内核参数的设置这里就不重复了,可以查看安装光盘中的安装文档。假设Oracle安装文件已经解压至/u02 。 su - oraclemkdir -p /u01/app/oracle/1. 建立静默安装的配置文件cd /u02/..._oracle 没有安装界面影不影响
文章浏览阅读4.6k次,点赞3次,收藏4次。问题:VS解决error C2664: “DWORD GetCurrentDirectoryW(DWORD,LPWSTR)”: 无法将参数 2 从“char [260]”转换为“LPWSTR环境:系统:Win10环境:VS2015 64bit问题原因:项目配置字符集选择问题错误。 解决方法:将当前项目的字符集选项改为使用多字节字符集。_word[260]转换为lpwstr
文章浏览阅读1.3k次。一、 在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.” 解决办法: Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。 二、 编译工程时提示如下信息: main.axf: Error: L6218E: Undefined symbol _undefined symbol __set_faultmask
文章浏览阅读7.3k次,点赞8次,收藏32次。前言在这里我就不再一一介绍每个步骤的具体操作了,因为在上一次爬取今日头条数据的时候都已经讲的非常清楚了,所以在这里我只会在重点上讲述这个是这么实现的,如果想要看具体步骤请先去看我今日头条的文章内容,里面有非常详细的介绍以及是怎么找到加密js代码和api接口。Python3爬取今日头条文章视频数据,完美解决as、cp、_signature的加密方法分析淘宝网这次选择的是淘宝网热卖而不是淘宝网,二者虽然名字有不同,但是数据还是一样的,区别就在于前者把后者的所有店铺和商品的海量数据按照销售量、好评度、信誉__m_h5_tk
文章浏览阅读289次,点赞9次,收藏6次。这种算法的设计灵感来源于灰狼群体的捕食行为,其核心思想在于模仿灰狼社会的结构和行为模式。结果可视化:通过绘制GWO寻优过程收敛曲线、训练集、验证集和测试集的真实标签与预测标签的曲线对比图,直观地展示了模型的预测效果,便于用户理解算法和模型的性能。数据处理流程清晰:对数据进行了标准化处理,包括Zscore标准化,将数据分为训练集、验证集和测试集,有助于保证模型训练的准确性和可靠性。模块化结构:代码按照功能模块进行划分,清晰地分为数据准备、参数设置、算法处理块和结果展示等部分,提高了代码的可读性和可维护性。
文章浏览阅读542次。文章目录1、引言1、引言_c语言函数和c++函数学习方法
文章浏览阅读528次。IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持..._idea 根据注释写代码插件
文章浏览阅读8k次,点赞7次,收藏48次。NAS Definition基于搜索策略,并结合约束条件 (如accuracy、latency),在搜索空间内 (set of candidate operations or blocks)探索最优网络结构、或组件结构 (如detector的backbone、FPN); 高效的NAS算法,通常是Trade-off between data-driven and experience-driv..._network architecture search
文章浏览阅读1.3k次,点赞2次,收藏2次。文章目录引言I 从公众号引流到小程序1.1 获取小程序路径1.2 公众号自动回复小程序消息see also引言经常有小程序的朋友问我公众号是如何回复小程序消息的问题,今天就总结分享下。I 从公众号引流到小程序从公众号文章直接跳转小程序的指定路径公众号自动回复小程序消息1.1 获取小程序路径获取小程序路径的用途:从公众号文章直接跳转小程序的指定路径扫码跳转指定页面小程序链接的两种形式形式1: pages开通的格式,比如我小程序的下面这些路径,常常用于文章和聊天窗口的挑战。_公众号回复小程序
文章浏览阅读462次。最近两天在跟着莫烦大神修炼TensorFlow,今天学到的是TensorFlow 可视化,是Tensorboard下显示的。现附上莫烦大神的代码,和本机运行的可视化结果和操作。学习视频:Tensorflow 搭建自己的神经网络 (莫烦 Python 教程)https://www.bilibili.com/video/av16001891系统环境:Win7 64位 ..._pycharm tensorflow 运行状态
文章浏览阅读2w次,点赞7次,收藏46次。最近遇到一个特别占内存的需求。使用STL map/unordered_map,内存无法得到正确释放。再次响应请求,会出现内存溢出的情况。[6453149.107435] Memory cgroup out of memory: Kill process 54949 (******) score 1001 or sacrifice child[6453149.117193] Killed p..._c++ map 手动释放
文章浏览阅读768次。Qt小例子学习75 - 把QGraphicsItem 保存到文本然后读出来显示#include "utils.h"#include <QApplication>#include <QDebug>#include <QFile>#include <QGraphicsLineItem>#include <QGraphicsScene>#include <QGraphicsView>#include <QTimer&g_qt qgraphicspathitem 保存 读取saveitem