MATLAB机器人工具箱使用

2023-10-27

MATLAB机器人工具箱(一)

前言:

    在开始做机器人仿真之前,我了解了一系列机器人仿真软件(包括Matlab、Webots、Gazebo、V-rep、Adams、Simbad、Morse等)的适用场景、使用方法等资料,决定从最经典的Matlab入手,快速搭建机器人平台进行路径规划与控制。
    这里记录一下我的学习和使用过程,以及遇到的坑。我的版本是R2018a。


一、添加机器人工具箱——RTB工具箱:

方法一:
    1.下载rvctools文件包,放在一个自己知道的目录下(任意路径都是可以的,但是为了方便管理,一般都安装在toolbox),然后“设置路径”里面添加并保存。
在这里插入图片描述
    2.在命令中输入statrup_rvc,之后会看到机器人工具箱启动成功。
在这里插入图片描述
    3.最后在命令行中输入rtbdemo命令,会跳出一个操作界面。
在这里插入图片描述
    但是这么做也有一个问题,就是每次打开都要重新通过statrup_rvc命令运行rvctools文件包,目前还没找到好的解决方法,欢迎大家提点。
    如图所示:左边一列是通用函数的例子(如:旋转,平移,轨迹等);中间主要是机械臂的基础函数,可以快速构建一个机器人;右边为移动机器人的一些历程。大家可以自己试试看。

方法二:
    这里我看到别人直接下载RTB工具箱(注意版本号)并安装,然后输入rbtdemo命令运行,但我试了不太行,大家也可以试试看。
在这里插入图片描述


错误合集:

1.“错误使用 eval,未定义…”:

    在导入多体物理库时通过“设置路径”添加了toolbox里面的“Simscape-Multibody-Contact-Forces-Library-18.1.4.1”,结果就出现了如下错误:
在这里插入图片描述
    甚至有的人安装好Matlab以后,什么操作也不做,仅仅是将软件打开就会有这样的报错。

解决方法一:(很多人用这种方法奏效了)
    但对我来说似乎没什么用。

解决方法二:
    先把“设置路径”恢复成默认(之前设置的就没有了,不知道有没有更好的方法),把新的工具箱a解压到toolbox目录下,然后用addpath把toolbox的路径添加到matlab的搜索路径中,最后用which xxx.m来检验是否可以访问里面的xxx.m文件。如果能够显示新设置的路径,则表明报错解决,该工具箱可以使用了。示例如下:

>> addpath E:\MATLAB\R2018a\toolbox

%输入工具箱名称,此时一般会返回该工具箱的说明,也就是mathmodl 
>> help mathmodl路径下content.m中的内容
%在命令行中输入如下,此时会返回mathmodl路径下所有的文件
>> what mathmodl
%再到mathmodl中随便找一个不与Matlab中重名的函数,比如xxx.m,在命令行中输入
>> which xxx.m
E:\MATLAB\rvctools\xxx.m

2.Matlab启动过慢:

    这绝对是困扰我很久的一个问题,一度让我怀疑自己设备有问题(虽然确实慢)。
    如果你的matlab停留在“正在初始化…”这个界面长达几分钟甚至更久,试试下面的方法(据说是最近几代新版本的共性问题):
    启动慢的原因是软件查找授权文件时间太长,我们定位到license文件,找到license文件的绝对路径(我的就在一级安装文件下),删除这个文件license_server.lic(不同版本的名字是不一样的!大家试一下)。
    剩下的文件如图:
在这里插入图片描述
    然后速度瞬间提升了hhh。

3.Matlab启动的时候给出警告:

Warning: MATLAB Toolbox Path Cache is out of date and is not being used. Type 'help toolbox_path_cache' for more info.To get started, select MATLAB Help or Demos from the Help menu.

    这个问题式因为安装工具箱之后没有更新缓存,解决方法:
    File——>Preferences——>General——>选中enable toolbox path cache——>点击updata toolbox path cache

在这里插入图片描述


二、使用机器人工具箱创建双足机器人:

1.复现双足机器人:

    原博:JianRobSim
在这里插入图片描述

%% 主代码
%% 说明:我用了原博的代码腿的位置不对,troty(-pi/2)改成了troty(pi/2)对了
%% creat walking robot model
clear all
%leg length 
L1=0.15;L2=0.25;
%form a leg 
leg=SerialLink([0, 0, 0, pi/2; 0, 0, L1, 0; 0, 0, -L2, 0 ],...
    'name', 'leg', 'base', eye(4,4),'tool', ...
    troty(pi/2)*trotx(-pi/2)*trotz(-pi/2),'offset', [pi/2  0  -pi/2]);
%% diplay the leg 
%body wide and length
W = 0.2; L = 0.2;
%form a body
legs(1) = SerialLink(leg, 'name', 'leg1','base', transl(0, 0, -0.05)*trotz(pi/2));  %*trotz(pi/2)
legs(2) = SerialLink(leg, 'name', '.', 'base', transl(0, -W, -0.05)*trotz(pi/2));
% create a fixed size axis for the robot, and set z positive downward
clf;
axis([-0.3 0.25 -0.6 0.4 -0.19 0.45]); set(gca,'Zdir', 'reverse')
hold on
legs(1).plot([0 pi/3 -pi/2.5],'nobase','noshadow','nowrist');%leg pose
legs(2).plot([0 pi/1.8 -pi/2.5],'nobase','noshadow','nowrist');
%plot body
plotcube([0.1 0.2 -0.12],[ -0.05  -0.2  0],1,[1 1 0]);
%% simulate moving
for i=0.01:0.02:0.4
legs(1).plot([0   pi/3+i    -pi/2.5-i],'nobase','noshadow');%leg pose
legs(2).plot([0   pi/1.8-i  -pi/2.5+i],'nobase','noshadow');
end
% 身体控制器
function plotcube(varargin)
% PLOTCUBE - Display a 3D-cube in the current axes
%
%   PLOTCUBE(EDGES,ORIGIN,ALPHA,COLOR) displays a 3D-cube in the current axes
%   with the following properties:
%   * EDGES : 3-elements vector that defines the length of cube edges
%   * ORIGIN: 3-elements vector that defines the start point of the cube
%   * ALPHA : scalar that defines the transparency of the cube faces (from 0
%             to 1)
%   * COLOR : 3-elements vector that defines the faces color of the cube
%
% Example:
%   >> plotcube([5 5 5],[ 2  2  2],.8,[1 0 0]);
%   >> plotcube([5 5 5],[10 10 10],.8,[0 1 0]);
%   >> plotcube([5 5 5],[20 20 20],.8,[0 0 1]);
%% plotcube函数 长宽高  三维空间起点  颜色属性
% Default input arguments
inArgs = { ...
  [10 56 100] , ... % Default edge sizes (x,y and z)
  [10 10  10] , ... % Default coordinates of the origin point of the cube
  .7          , ... % Default alpha value for the cube's faces
  [1 0 0]       ... % Default Color for the cube
  };
 
% Replace default input arguments by input values
inArgs(1:nargin) = varargin;
 
% Create all variables
[edges,origin,alpha,clr] = deal(inArgs{:});
 
XYZ = { ...
  [0 0 0 0]  [0 0 1 1]  [0 1 1 0] ; ...
  [1 1 1 1]  [0 0 1 1]  [0 1 1 0] ; ...
  [0 1 1 0]  [0 0 0 0]  [0 0 1 1] ; ...
  [0 1 1 0]  [1 1 1 1]  [0 0 1 1] ; ...
  [0 1 1 0]  [0 0 1 1]  [0 0 0 0] ; ...
  [0 1 1 0]  [0 0 1 1]  [1 1 1 1]   ...
  };
 
XYZ = mat2cell(...
  cellfun( @(x,y,z) x*y+z , ...
    XYZ , ...
    repmat(mat2cell(edges,1,[1 1 1]),6,1) , ...
    repmat(mat2cell(origin,1,[1 1 1]),6,1) , ...
    'UniformOutput',false), ...
  6,[1 1 1]);
 
 
cellfun(@patch,XYZ{1},XYZ{2},XYZ{3},...
  repmat({clr},6,1),...
  repmat({'FaceAlpha'},6,1),...
  repmat({alpha},6,1)...
  );
 
% view(3);

    在这个项目的最后,博主贴了一个simscape的仿真结果,确实流畅度高了很多。所以我的下一步学习计划就是simscape~
在这里插入图片描述

2.复现机械臂:

    参考博主,具体讲解可以点进去看。

clear ; clc; close all;
% 机器人各连杆DH参数
d1 = 0;
d2 = 86;
d3 = -92;

% 由于关节4为移动关节,故d4为变量,theta4为常量
theta4 = 0;
a1 = 400;
a2 = 250;
a3 = 0;
a4 = 0;

alpha1 = 0 / 180 * pi;
alpha2 = 0 / 180 * pi;
alpha3 = 180 / 180 * pi;
alpha4 = 0 / 180 * pi;

% 定义各个连杆,默认为转动关节
%           theta      d        a        alpha 
L(1)=Link([  0         d1      a1      alpha1]); L(1).qlim=[-pi,pi];
L(2)=Link([  0         d2      a2      alpha2]); L(2).qlim=[-pi,pi]; L(2).offset=pi/2;
L(3)=Link([  0         d3      a3      alpha3]); L(3).qlim=[-pi,pi];

% 移动关节需要特别指定关节类型--jointtype
L(4)=Link([theta4       0      a4      alpha4]); L(4).qlim=[0,180]; L(4).jointtype='P';

% 把上述连杆“串起来”
Scara=SerialLink(L,'name','Scara');

% 定义机器人基坐标和工具坐标的变换
Scara.base = transl(0 ,0 ,305);
Scara.tool = transl(0 ,0 ,100);   
Scara.teach();   %机器人示教界面

% 绘制动画
figure
joint(: , 1) = linspace(pi/6,pi/2,100);
joint(: , 2) = linspace(0,pi/4,100);
joint(: , 3) = linspace(pi/3,pi/2,100);
joint(: , 4) = linspace(0,160,100);
filename = 'demo.gif';
for i = 1:length(joint)
    pause(0.01)
    Scara.plot(joint(i,:));
    f = getframe(gcf);  
    imind = frame2im(f);
    [imind,cm] = rgb2ind(imind,256);
    if i == 1
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
    else      imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
    end
end

    接下来有一个改进DH方法的代码,其实主要是 'modified’参数的改变:

clear ; clc; close all;
% 机器人各连杆参数值
d1 = 670;
d2 = 0;
d3 = 0;
d4 = 1280;
d5 = 0;
d6 = 215;

a1 = 0;
a2 = 312;
a3 = 1075;
a4 = 225;
a5 = 0;
a6 = 0;

alpha1 = 0 / 180 * pi;
alpha2 = -90 / 180 * pi;
alpha3 = 0 / 180 * pi;
alpha4 = -90 / 180 * pi;
alpha5 = 90 / 180 * pi;
alpha6 = -90 / 180 * pi;
% 建立连杆DH参数(修正的DH)
L(1)=Link([0 d1 a1 alpha1], 'modified'); L(1).qlim=[-pi,pi];
L(2)=Link([0 d2 a2 alpha2], 'modified');  L(2).qlim=[-pi,pi];L(2).offset = -pi/2;
L(3)=Link([0 d3 a3 alpha3], 'modified'); L(3).qlim=[-pi,pi];
L(4)=Link([0 d4 a4 alpha4], 'modified'); L(4).qlim=[-pi,pi];
L(5)=Link([0 d5 a5 alpha5], 'modified'); L(5).qlim=[-pi,pi];
L(6)=Link([0 d6 a6 alpha6], 'modified'); L(6).qlim=[-pi,pi];
% 定义机器人
FANUC=SerialLink(L(1:6),'name','FANUC');
FANUC.tool = transl(0,0,100);
FANUC.teach();

    为了搞清楚standard DH和modified DH,我看了好久的资料,简单谈一下我的理解。
在这里插入图片描述
    以这张图(来源)为例,标准DH方法是在传动轴上(远端,如图)建立坐标系的,所以 z 轴(为了避免麻烦,只画z轴)建立在连杆远离基座一侧的那个轴上;改进DH方法则会把坐标系建立在固定轴上(近端)。
    这两种建系方法对于平常的普通机械臂是没有区别的,在matlab里的体现也只是修改“modified”参数的问题,最多是得到的转换矩阵结果不同。但是对于delta、Atrias这样的并联机器人,或者树状、轮式结构机器人来说,在进行逆运算时,如果回推原点大于1个,就会出现混乱。

在这里插入图片描述

delta机器人

在这里插入图片描述

Atrias机器人
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB机器人工具箱使用 的相关文章

  • MATLAB 在 MATLAB 7.10.0 学生版中似乎找不到 csaps()

    我有一些代码使用csaps Matlab的三次平滑样条拟合函数 http www mathworks com help toolbox curvefit csaps html我想将其提供给使用 MATLAB 7 10 0 R2010a 的学
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt

随机推荐