MATLAB坐标系变换(2)---逃不过的四元数

1、前记:我是来恶补基础知识的。

       时隔写下人生中第一篇博客MATLAB下坐标系变换(1)已有十个月之久。发现自己到现在还不是真正的搞研究的样子。一方面看往期所留下的博文大多数可看成是搬砖的成分(我只是个老实本分的搬砖人 ^-^//),再有就是自己理论知识太欠缺了,特别是数学方面。苦于挣扎,但实际又做不出太大的改变,只能继往开来拿大神们的文章在这里站位‘作威作福’。

2、参看文章:四篇大同小异,看--理解

    (1)http://mini.eastday.com/mobile/180306210610472.html#

    (2)https://www.cnblogs.com/21207-iHome/p/6894128.html

    (3)https://blog.csdn.net/xiaoma_bk/article/details/79082629

    (4)https://blog.csdn.net/lql0716/article/details/72597719

3、以下函数方便运行时对照理解(函数来自Peter教授的机器人工具箱)

     ---使用过程----复制到脚本编辑器中,按小结运行。

%% 平移与旋转的组合 书---机器人学、视觉与控制
%% (1)rotx函数,关于x轴做旋转
R=rotx(0)%左手坐标系下,中指对着自己为x轴,z轴为拇指
%% 
%  角度
R1=rotx(45,'deg')
%  弧度
R2=rotx(pi/2)
%% 绘制 从R原坐标到R1绕x轴转45度,再到R2绕x轴转90度
trplot(R)
pause(3);
hold on
trplot(R1,'color','r')
pause(3);
trplot(R2,'color','g')
%% 或者如在
% 绘制所有动画过程
tranimate(R2) %初始坐标绕x轴旋转90度
%% (2)tr2eul函数,齐次变换矩阵--欧拉角;对应的ZYZ欧拉角(1x3)齐次变换T(4×4)的旋转部分。
%  These correspond to rotations about the Z,Y, Z axes respectively
T=transl(1,0,0)*trotx(pi/2)*transl(0,1,0)
tranimate(T)
%% 绘制对应坐标系
trplot(T)
Eul = tr2eul(T)
%% 提取矩阵T中的旋转部分、平移部分
t2r(T)
transl(T)'
%% (3)eul2tr函数:onvert Euler angles to homogeneous transform欧拉-齐次矩阵
%  These correspond to rotations about the Z,Y, Z axes respectively
T0=eul2tr(0,0,0) %左手坐标系下,中指对着自己为x轴,z轴为拇指
T1=eul2tr(pi/6,0,0) % z轴
T2=eul2tr(pi/4,0,0)
T3=eul2tr(pi/2,0,0)
trplot(T0)
pause(2);
hold on
trplot(T1,'color','r')
pause(2);
trplot(T2,'color','g')
pause(2);
trplot(T3,'color','r')
%% z---y---z ????绕z绕y绕z???
T01=eul2tr(pi/2,0,0)
T02=eul2tr(0,0,pi/2)
figure
trplot(T0)
hold on
pause(2);
trplot(T01,'color','r')%绕z
pause(2);
trplot(T02,'color','g')%绕z
%% (4)tr2rpy函数: Convert a homogeneous transform to roll-pitch-yaw angles齐次---rpy
% 格式 RPY = tr2rpy(T, options) 
%   Options::
%    'deg'   Compute angles in degrees (radians default)
%    'xyz'      Return solution for sequential rotations about X, Y, Z axes
%    'zyx'      Return solution for sequential rotations about Z, Y, X axes (default)
%    'yxz'      Return solution for sequential rotations about Y, X, Z axes
%    'arm'      Return solution for sequential rotations about X, Y, Z axes
%    'vehicle'  Return solution for sequential rotations about Z, Y, X axes
%    'camera'   Return solution for sequential rotations about Y, X, Z axes
rpy=tr2rpy(T0)%默认z,y,x
rpy1=tr2rpy(T2)
rpy2=tr2rpy(T3)
 figure
trplot(T0) %左手坐标系下,中指对着自己为x轴,z轴为拇指,作为初始坐标系
pause(2);
hold on
trplot(T2,'color','g')
pause(2);
trplot(T3,'color','r')
%% 
trplot(T0) %左手坐标系下,中指对着自己为x轴,z轴为拇指,作为初始坐标系

%% (5) rpy2tr Roll-pitch-yaw angles to homogeneous transform,rpy--齐次
 %格式:T = rpy2tr(ROLL, PITCH, YAW, OPTIONS) 
 %Options::同上
 Ta=rpy2tr(pi/6,0,0)%30度
 Tb=rpy2tr(pi/3,0,0) %60度
 Tc=rpy2tr(pi/2,0,0) %90度
  figure
 %T0开始--Ta--Tb--Tc,默认zyx则旋转次序为先X--Y---Z
trplot(T0) %左手坐标系下,中指对着自己为x轴,z轴为拇指,作为初始坐标系
pause(2);
hold on
trplot(Ta,'color','g')
pause(2);
trplot(Tb,'color','r') 
pause(2);
trplot(Tc,'color','g') 
% tranimate(Ta) %整个动画过程
% tranimate(Tb)
% tranimate(Tc)
%%
Tz1=Ta% 因为T0是单位矩阵所以T0*Ta就是Ta
Tz2=Tz1*Tb
Tz3=Tz2*Tc
figure
trplot(T0)%从初始坐标开始
hold on
pause(2);
trplot(Tz1,'color','r')
pause(3);
trplot(Tz2,'color','g')
pause(2);
trplot(Tz3,'color','r') 
tranimate(Tz1)
tranimate(Tz2)
tranimate(Tz3)
%% 默认zyx则旋转次序为先X--Y---Z
 Ta1=rpy2tr(pi/2,0,0)%绕x90度
 Tb1=rpy2tr(0,pi/2,0) %绕y
 Tc1=rpy2tr(0,0,pi/2)%raoz
 %T0开始--Ta--Tb--Tc
trplot(T0) %左手坐标系下,中指对着自己为x轴,z轴为拇指,作为初始坐标系
figure
trplot(Ta1,'color','g')%初始坐标绕x轴旋转90度
figure
trplot(Tb1,'color','r')%初始坐标绕y轴旋转90度
figure
trplot(Tc1,'color','g')%初始坐标绕z轴旋转90度  
tranimate(Ta1)
tranimate(Tb1)
tranimate(Tc1)
%% 选项为xyz则旋转次序为先z--Y---x
 Ta2=rpy2tr(pi/2,0,0,'xyz')
 Tb2=rpy2tr(0,pi/2,0,'xyz') 
 Tc2=rpy2tr(0,0,pi/2,'xyz')
 %T0开始--Ta--Tb--Tc
trplot(T0) %左手坐标系下,中指对着自己为x轴,z轴为拇指,作为初始坐标系
figure
trplot(Ta2,'color','g')%初始坐标绕x轴旋转90度
figure
trplot(Tb2,'color','r')%初始坐标绕y轴旋转90度
figure
trplot(Tc2,'color','g')%初始坐标绕z轴旋转90度  
%% (6)quaternion - quaternion array四元数组
% 四元数是四部分超复数,可用于表示三维旋转。
% 四元数是一个数字
% a + b * i + c * j + d * k
% 其中i * i = j * j = k * k = i * j * k = -1
%       格式:
%        Q = quaternion(A,B,C,D)创建一个四元数组四元数部分取自阵列A,B,C和D.
%        所有的输入必须具有相同的大小并且属于同一类
%        Q = quaternion(M)从N-by-4创建N-by-1四元数阵列矩阵M,其中每列成为四元数的一部分。
%        Q = quaternion(RV, 'rotvec') 从中创建一个N乘1的四元数阵列N-by-3矩阵RV。 
%        RV的每一行代表[X Y Z]元素旋转矢量。旋转矢量表示三维轴旋转,其中幅度对应于旋转角度弧度。
%        Q = quaternion(R, 'rotmat', PF) 创建N×1四元数阵列来自旋转矩阵的数组R. R可以是3乘3或3乘3N
%        如果欧拉角代表点,PF可以是“point”用于框架旋转的旋转或“frame”。
%        Q = quaternion(E, 'euler', CV, PF) 
Q=[0.1461 0.9889 0.30125 0.4026];%分别表示四元数的实部与虚部
Rq= quaternion(Q)  
Rq1= quaternion([0 0 1 0])  
%% (7)rotmat函数:将四元数转换为旋转矩阵或方向余弦矩阵
% %格式:
%         R = rotmat(Q,'frame')将标量四元数Q转换为3乘3
% ???? 的等效旋转矩阵,适用于框架旋转。
% ?
% ???? R = rotmat(Q,'point')将标量四元数Q转换为3乘3
% ???? 的等效旋转矩阵,适用于点旋转。
Q2R= rotmat(Rq,'frame')
Q2R1= rotmat(Rq1,'point')
tranimate(Q2R)
figure
tranimate(Q2R1)
%% 将四元数转换成欧拉角???
% 有工具箱函数可调用quat2angle等
               %-----己亥年二月初五

4、在Robotics System Toolbox中的有关坐标转换的函数参看一下:

       https://au.mathworks.com/help/robotics/coordinate-system-transformations.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JianRobSim

嘤嘤其名,求其友声!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值