问题背景:在根据《机器人导论》这本书的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. elasticsearch License 到期后更新步骤

    ELK下载安装后有一个月试用期,到期后需要更新License,且每个License有效期为 1 年,License过期前10天里相关log会一直出现,提醒用户更新,支持实时更新无需重启服务. 步骤: ...

  2. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  3. day6--面向对象初识

    一面向过程与面向对象 面向过程: 流水线式的思维,顺着流程进行下去,类似于代码的堆叠,重视步骤 优点:不需要考虑太多东西,想到一个功能就写一个功能,堆叠代码 缺点:过程往往是先后执行的,要想变换功能或 ...

  4. File Input Features

    文件输入功能 1.该插件将将一个简单的 HTML 文件输入转换为高级文件选取器控件.将有助于对不支持 JQuery 或 Javascript 的浏览器的正常 HTML 文件输入进行回退. 2.文件输入 ...

  5. Elasticsearch5.5.2安装和启动遇到哪些问题

    最近学习Elasticsearch,顺便记录下操作步骤,供日后参考 安装环境 CentOS release 6.6 1.因Elasticsearch是基于java写的,所以它的运行环境中需要java的 ...

  6. t default] Failed to discover available identity versions when contacting http://ahswj-cloud-controller:35357. Attempting to parse version from URL.: ConnectFailure

    2018-09-13 21:39:20.778 80758 WARNING keystoneauth.identity.generic.base [req-ea24b7ad-5aee-44b2-b68 ...

  7. OpenGL Hello World

    ▶ OpenGL 的环境配置与第一个程序 ● CUDA 中自带 OpenGL 需要的头文件和库,直接拉进项目里边去就行 ● VS项目属性右键,属性,C/C++ 目录,包含目录,添加 CUDA 的头文件 ...

  8. spring+mybatis 配置双数据源

    配置好后,发现网上已经做好的了, 不过,跟我的稍有不同, 我这里再拿出来现个丑: properties 文件自不必说,关键是这里的xml: <?xml version="1.0&quo ...

  9. Centos7 下搭建SVN + Apache 服务器

    1. 安装httpd 安装httpd服务: $ sudo yum install httpd 检查httpd是否安装成功: $ httpd -version Server version: Apach ...

  10. Android开发中常见的设计模式(一)——单例模式

    首先了解一些单例模式的概念. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这样做有以下几个优点 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中. 保持 ...