问题背景:在根据《机器人导论》这本书的Z-Y-X欧拉角原理用Matlab实现旋转矩阵求解时,发现与直接调用机器人工具箱中的rpy2tr()函数得出的结果并不相同。

首先:先检查自己写的函数是否有错。根据其原理:坐标系B可以用如下方式表示——先将坐标系B和一个已知参考坐标系A重合,先将B绕B的Z轴转afa角,再绕B的Y轴转beta角,最后绕B的X轴转gama角。所以得到的旋转矩阵就是R=Rz*Ry*Rx。

代码如下:

 %afa:绕着z轴的旋转角——yaw;beta:绕着y轴的旋转角——pitch;gama:绕着x轴的旋转角——roll(都是角度制)
%机器人工具箱里面提供的函数是rpy2tr()(是弧度制)——且对应的角度是:roll—pitch—yaw function R=EularToR(afa, beta,gama) Rz=[cosd(afa), -sind(afa), 0; sind(afa), cosd(afa), 0; 0, 0, 1]; %afa是绕z轴旋转,偏航角——yaw
Ry=[cosd(beta),0, sind(beta);0, 1, 0; -sind(beta), 0, cosd(beta)];%beta是绕y轴旋转,俯仰角——pitch
Rx=[1, 0, 0; 0, cosd(gama), -sind(gama); 0, sind(gama), cosd(gama)];%gama是绕x轴旋转,翻滚角——roll R=Rz*Ry*Rx;

发现应该没有什么问题。

再次:理解Matlab中rpy2tr函数的实现方式

function T = rpy2tr(roll, varargin)

    R = rpy2r(roll, varargin{:});
T = r2t(R);

转入rpy2r(roll, varargin{:})函数继续查看

function R = rpy2r(roll, varargin) 
%varargin提供了一种函数可变参数列表机制,
%允许调用者调用该函数时根据需要来改变输入参数的个数 %设置默认参数
opt.zyx = false;
opt.deg = false;
[opt,args] = tb_optparse(opt, varargin); % unpack the arguments
if numcols(roll) ==
pitch = roll(:,);%pitch(y)应该是输入参数的第二个值
yaw = roll(:,);%yaw(z)应该是输入参数的第三个值
roll = roll(:,);%roll(x)应该是输入参数的第一个值
elseif nargin >= 3%还不太理解这一段的意思
pitch = args{};
yaw = args{};
else
error('RTB:rpy2r:badarg', 'bad arguments')
end % optionally convert from degrees考虑如果输入的参数是角度,且已经将"deg"作为选项输入函数,需将角度转化为弧度
if opt.deg
d2r = pi/180.0;
roll = roll * d2r;
pitch = pitch * d2r;
yaw = yaw * d2r;
end if ~opt.zyx
% XYZ order如果是先绕着X轴,再Y轴,最后Z轴旋转的话,是如下的矩阵相乘顺序
if numrows(roll) ==
R = rotx(roll) * roty(pitch) * rotz(yaw);
else
R = zeros(,,numrows(roll));
for i=:numrows(roll)
R(:,:,i) = rotx(roll(i)) * roty(pitch(i)) * rotz(yaw(i));
end
end
else
% old ZYX order (as per Paul book)如果是先绕着Z轴,再Y轴,再X轴旋转的话,又将是不同的相乘顺序
if numrows(roll) ==
R = rotz(roll) * roty(pitch) * rotx(yaw);
else
R = zeros(,,numrows(roll));
for i=:numrows(roll)
R(:,:,i) = rotz(roll(i)) * roty(pitch(i)) * rotx(yaw(i));
end
end
end

结论:理解完rpy2tr函数,我们发现了问题所在,这是因为存在两种不同的旋转顺序,导致不一样的矩阵相乘顺序,所以最终得出的旋转矩阵也不一样。

感悟:要多去读源代码!才能彻底领会这些函数的使用方法和实现原理。

Matlab练习——rpy2tr函数与自己实现的ZYX欧拉角的结果不同的问题的更多相关文章

  1. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  2. Matlab基本函数-conj函数

    Matlab基本函数-conj函数 1.conj函数:用于计算复数的共轭值 2.用法说明:y=conj(x)函数计算复数x的共轭值.输出结果y的维数跟输入x的维数一致,返回值为:real(y)-i*i ...

  3. 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...

  4. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  5. matlab画图形函数 semilogx

    matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...

  6. 【matlab】设定函数默认参数

    C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发 ...

  7. matlab中subplot函数的功能

    转载自http://wenku.baidu.com/link?url=UkbSbQd3cxpT7sFrDw7_BO8zJDCUvPKrmsrbITk-7n7fP8g0Vhvq3QTC0DrwwrXfa ...

  8. Matlab:max函数

    Matlab中max函数在矩阵中求函数大小的实例如下: C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的每一 ...

  9. 【原创】Matlab中plot函数全功能解析

    [原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...

随机推荐

  1. call与apply简单介绍

    var pet={ word:'...', speak:function(say){ console.log(say+' '+this.word) } } //pet.speak('speak')// ...

  2. POJ2311 Cutting Game 博弈 SG函数

    Cutting Game Description Urej loves to play various types of dull games. He usually asks other peopl ...

  3. 使用Maven创建(eclipse)Java项目

    1. 构建项目目录: 命令行方式: mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} \ ...

  4. python中from __future__ import division

    ppython2.7版本中整数相除得出的结果不显示小数 a = 9 / 2 print(a) 输出结果: 4 此时就需要调用from __future__ import division 1 from ...

  5. Apache-Axis小结

    以前用过axis, 不过好久不弄, 有忘记了.很多很多东西放在收藏夹里面, 但是长时间不去看,结果就是还是不熟悉!现在再简单总结一下吧. Axis开发服务器端webservice其实很简单. 1 下载 ...

  6. unzip

    中文乱码问题: unzip -O CP936 filename

  7. python大法好——

    1.字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. Python的字符串内建函数 Python 的字符串常用内建函数如下: 1.大小写转换: & ...

  8. leetcode1020

    class Solution(object): def __init__(self): self.cons = 0 self.S = list() def dfs(self,m,n,v,A): whi ...

  9. Ubuntu12.04 内核树建立

    先查看自己使用的内核版本 lin@lin-virtual-machine:~$ uname -r --generic 如果安装系统时,自动安装了源码.在 /usr/src 目录下有对应的使用的版本目录 ...

  10. Vue.js——60分钟组件快速入门(下篇)

    转自:https://www.cnblogs.com/keepfool/p/5637834.html 概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子 ...