Matlab练习——rpy2tr函数与自己实现的ZYX欧拉角的结果不同的问题
问题背景:在根据《机器人导论》这本书的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欧拉角的结果不同的问题的更多相关文章
- matlab中patch函数的用法
http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...
- Matlab基本函数-conj函数
Matlab基本函数-conj函数 1.conj函数:用于计算复数的共轭值 2.用法说明:y=conj(x)函数计算复数x的共轭值.输出结果y的维数跟输入x的维数一致,返回值为:real(y)-i*i ...
- 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- matlab画图形函数 semilogx
matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...
- 【matlab】设定函数默认参数
C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发 ...
- matlab中subplot函数的功能
转载自http://wenku.baidu.com/link?url=UkbSbQd3cxpT7sFrDw7_BO8zJDCUvPKrmsrbITk-7n7fP8g0Vhvq3QTC0DrwwrXfa ...
- Matlab:max函数
Matlab中max函数在矩阵中求函数大小的实例如下: C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的每一 ...
- 【原创】Matlab中plot函数全功能解析
[原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...
随机推荐
- Motherboard Chipsets and the Memory Map.主板芯片组与内存映射
原文标题:Motherboard Chipsets and the Memory Map 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外 ...
- Windows Server 2012R2 网络地址转换NAT
一.NAT概述 网络地址转换NAT(Network Address Translation)可以动态改变通过路由器的IP报文的内容(修改报文的源IP地址和/或目的IP地址).离开路由器的报文的源地址或 ...
- Guava实现 过滤文本,排序,转换内容,分组计数转换map 等等
重要点 :看注释 从access.log中统计数据 对healthcheck.html的请求不计入统计 输出请求总量,以及GET和POST分别的总量 输出请求最频繁的10个接口及其次数,按次数降序 输 ...
- python调用c的方法
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...
- uva-321-暴力枚举-隐式图搜索
题意:给你n个房间,有许多灯的控制开关,i房间灯的开关在j房间,未开灯的房间不能进,i房间和j房间之间如果没有门,也不能从i进入到j,开始房间是1,并且灯是开着的,问你是否能够走到最后一个房间n,并且 ...
- mysql 替代Oracle instr
在迁移项目时遇到的,原项目的数据库使用的Oracle,现在要迁移到MySQL中,而项目中用到了Oracle的instr函数,而MySQL只能查找子串是否在父串中,没法按照出现的次数进行查找. 先来介绍 ...
- 阿里云实现putty私钥登录全过程
阿里云实现putty私钥登录全过程 1 putty生成公钥和私钥 1)putty生成公钥和私钥 记得在空白区域 滑动 2 公钥上传到阿里云 1)公钥上传 私钥存到本地 3 公钥绑定要登录的实例 4 ...
- 关于微信支付接口,curl错误代码58
微信支付接口,curl错误代码58 之前的微信付款到用户零钱都是好好的,今天运营来找我, 我想了了下,就是进行了网站搬家 看了下 微信支付相关的证书配置文件 知道了,在这个 要改下证书的路径 WxPa ...
- IBeacon协议分析
IBeacon协议分析 跳转至: 导航. 搜索 对于一个UUID是E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, major是0, minjor是0的iBeacon,此时的 ...
- snmp安装,及测试
https://www.cnblogs.com/xdp-gacl/p/4016524.html