Matlab 机器人工具箱 例程:运动学+动力学+路径规划+可视化

文章目录

  • 1 创建机器人
  • 2 机器人显示
  • 3 机器人示教
  • 4 机器人路径规划:给定关节角路径
  • 5 机器人路径规划:给定末端位姿,求关节角路径
  • 6 工作空间可视化
  • 参考链接

1 创建机器人

clc;clear;close all;
deg = pi/180;L1= Revolute('d', 0, 'a', 0, 'alpha', 0,'modified', ...'I', [0.1183 -0.0001 0.0001;-0.0001 0.1182 0.0001;0.0001 0.0001 0.0140], ...'r', [0.0002 0.0002 0.1264], ...'m', 5.6431, ...'Jm', 2.2e-4, ...'G', 81, ...'B', 1.48e-3, ...'Tc', [0.395 -0.435], ...'qlim', [-180 180]*deg );L2 = Revolute('d', 0.06, 'a', 0, 'alpha', -pi/2,'modified', ...'I', [0.0723,0.0000,-0.0051;0.0000,0.0784,0.0000;-0.0051,0.0000,0.0169;], ...'r', [-0.0062,0.0001,0.1080], ...'m', 5.0478, ...'Jm', 2.2e-4, ...'G', 121, ...'B', .817e-3, ...'Tc', [0.126 -0.071], ...'qlim', [-105 105]*deg );
L3 = Revolute('d', -0.004, 'a', 0.332, 'alpha', 0, 'modified', ...'I', [0.4263,0.0000,-0.0072;0.0000,0.4334,0.0001;-0.0072,0.0001,0.0191], ...'r', [-0.0131,0.0001,0.2402], ...'m', 5.7542, ...'Jm', 2.2e-4, ...'G', 81, ...'B', 1.38e-3, ...'Tc', [0.132, -0.105], ...'qlim', [-225 45]*deg );L4 = Revolute('d', -0.056, 'a', 0, 'alpha', pi/2, 'modified', ...'I', [0.0821,0.0000,-0.0314;0.0000,0.1257,0.0001;-0.0314,0.0001,0.0451], ...'r', [-0.0850,0.0003,0.1540], ...'m', 3.0870, ...'Jm', 2.2e-4, ...'G', 81, ...'B', 71.2e-6, ...'Tc', [11.2e-3, -16.9e-3], ...'qlim', [-110 110]*deg);
L5 = Revolute('d', 0.050, 'a', 0, 'alpha', -pi/2, 'modified', ...'I', [0.0235,0.0000,-0.0002;0.0000,0.0253,0.0000;-0.0002,0.0000,0.0045], ...'r', [0.0001,0.0002,0.0982], ...'m', 2.0459, ...'Jm', 2.2e-4, ...'G', 81, ...'B', 82.6e-6, ...'Tc', [9.26e-3, -14.5e-3], ...'qlim', [-115 115]*deg );
L6 = Revolute('d', -0.050, 'a', 0, 'alpha', pi/2, 'modified', ...'I', [0.0684,0.0000,0.0001;0.0000,0.0696,-0.0001;0.0001,-0.0001,0.0047], ...'r', [-0.0111,-0.0003,0.1366], ...'m', 2.6317, ...'Jm', 2.2e-4, ...'G', 51, ...'B', 36.7e-6, ...'Tc', [3.96e-3, -10.5e-3], ...'qlim', [-180 180]*deg );
% SerialLink类函数
robot=SerialLink([L1,L2,L3,L4,L5,L6],'name','VIPER7','comment','LL');
% Link类函数,显示建立机器人DH参数 
robot.display();

输出:

robot = 
VIPER7:: 6 axis, RRRRRR, modDH, slowRNE                          - LL;                                                           
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|          0|          0|          0|          0|
|  2|         q2|       0.06|          0|    -1.5708|          0|
|  3|         q3|     -0.004|      0.332|          0|          0|
|  4|         q4|     -0.056|          0|     1.5708|          0|
|  5|         q5|       0.05|          0|    -1.5708|          0|
|  6|         q6|      -0.05|          0|     1.5708|          0|
+---+-----------+-----------+-----------+-----------+-----------+

2 机器人显示

%通过手动输入各个连杆转角,模型会自动运动到相应位置
theta1=[0 -pi/2 -pi/2 0 0 0];
% SerialLink类函数,显示机器人图像
robot.plot(theta1);
title('机器人plot显示')

在这里插入图片描述

3 机器人示教

robot.teach();
title('机器人teach示教')

在这里插入图片描述

4 机器人路径规划:给定关节角路径

% 初始角
theta1=[0 -pi/2 -pi/2 0 0 0];
% 目标关节角
theta2=[-pi/2 0 -pi/4 -pi/3 pi/4 pi/2];
% 时间
t=[0:0.01:2];
% 关节空间路径规划
% 相当于具有tpoly插值的mtraj,但是对多轴情况进行了优化,还允许使用额外参数设置初始和最终速度
g=jtraj(theta1,theta2,t);
% 通过可选的输出参数,获得随时间变化的关节速度加速度向量
[q,qd,qdd]=jtraj(theta1,theta2,t);
figure
i=1:6;
%绘制动画
subplot(2,3,1);
robot.plot(g)
%绘制每个关节位置
subplot(2,3,2);
qplot(q(:,i));
grid on;title('位置');
%绘制每个关节速度
subplot(2,3,3);
qplot(qd(:,i));
grid on;title('速度');
%绘制每个关节加速度
subplot(2,3,4);
qplot(qdd(:,i));
grid on;title('加速度');
% 获得每个时间点所需要的关节力矩
Q = robot.rne(q,qd,qdd);
%绘制每个关节的力矩
subplot(2,3,5)
qplot(t,Q);
grid on;title('关节力矩');

在这里插入图片描述

5 机器人路径规划:给定末端位姿,求关节角路径

%% 已知机械臂初始和目标的关节角度,利用五次多项式进行轨迹规划
T1=transl(0.3,0.1,0);						%根据给定起始点,得到起始点位姿
T2=transl(0,0.3,0.1);						%根据给定终止点,得到终止点位姿
init_ang=robot.ikine(T1);				%根据起始点位姿,得到起始点关节角
targ_ang=robot.ikine(T2);				%根据终止点位姿,得到终止点关节角
step = 20;%轨迹规划方法
figure
%关节空间轨迹规划
%五次多项式轨迹,得到关节角度,角速度,角加速度,20为采样点个数
[q, qd, qdd]=jtraj(init_ang,targ_ang,step); 
grid on
%根据插值,得到末端执行器位姿
T=robot.fkine(q);		
% 
nT=T.T;
%输出末端轨迹
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));
title('根据运动学求正解得到目标轨迹');
%动画演示 
robot.plot(q);	
%robot.plot(q,'trail','b');  %运行后在命令行窗口再复制运行一次,trail轨迹,b蓝色

在这里插入图片描述

%% 求解上述运行过程中的位置、速度、加速度的变化曲线
figure
subplot(3,2,[1,3]); 					%subplot 对画面分区 三行两列 占用1到3的位置
plot3(squeeze(nT(1,4,:)),squeeze(nT(2,4,:)),squeeze(nT(3,4,:)));%输出末端轨迹
robot.plot(q);							%动画演示subplot(3, 2, 2);
i = 1:6;
plot(q(:,i));
title('位置');
grid on;subplot(3, 2, 4);
i = 1:6;
plot(qd(:,i));
title('速度');
grid on;subplot(3, 2, 6);
i = 1:6;
plot(qdd(:,i));
title('加速度');
grid on;

在这里插入图片描述

6 工作空间可视化

figure
num = 30000;
p = zeros(num,3);%先声明0矩阵可加快运行速度
for i=1:numq1 = L1.qlim(1) + rand * (L1.qlim(2) - L1.qlim(1));q2 = L2.qlim(1) + rand * (L2.qlim(2) - L2.qlim(1));q3 = L3.qlim(1) + rand * (L3.qlim(2) - L3.qlim(1));q4 = L4.qlim(1) + rand * (L4.qlim(2) - L4.qlim(1));q5 = L5.qlim(1) + rand * (L5.qlim(2) - L5.qlim(1));q6 = L6.qlim(1) + rand * (L6.qlim(2) - L6.qlim(1));q = [q1 q2 q3 q4 q5 q6];Ts = robot.fkine(q);  % SerialLink.fkine正向运动学, 给一个关节变量,可以求出变换矩阵P(i,:) = transl(Ts);
end
plot3( P(:,1), P(:,2), P(:,3),'b.','markersize',1); %在三维空间内绘制30000个点hold on; %添加新绘图的时候保留当前绘图
grid on; %在画图的时候添加网格线view([45 45]);
robot.plot([0 0 0 0 0 0]);

在这里插入图片描述

参考链接

Matlab机械臂建模:机器人工具箱的使用&&导入自己的机械臂模型
Matlab机器人工具箱——动力学
MATLAB机器人工具箱学习(一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】快速入门Python一天学完基础语法

文章目录 前言1. HelloWorld2. 变量与数据类型2.1 变量2.2 数据类型2.2.1 String 字符串类型2.2.2 基本类型转换2.2.2 元组2.2.3 字典2.2.4 拆包 2.3 运算2.3.1 双除号/双乘号2.3.2 常见运算函数举例2.3.3 布尔运算 3. 控制流程3.1 if-else 语句3.2 while 循环3.3 for 循环 4. …

逆变器专题(14)-弱电网下的LCL逆变器控制以及谐振峰问题(1)

相应仿真原件请移步资源下载 LCL滤波器 LCL滤波器因其本身为一个二阶系统,其本身就会引发谐振,导致相应谐振频率处的增益得到放大,进而产生谐波等问题;另一方面,在弱电网下,逆变器会与电网阻抗发生耦合&am…

ARM总结and复习

安装交叉编译工具链 a. 为什么安装 因为arm公司的指令集在不断迭代升级,指令集日益增多,而架构是基于指令集研发的,所以架构不一样,指令集也不一样 eg:arm架构使用的是arm指令集 x86架构使用的是x86指令集 而我们日常开发环境中linux的架构…

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

大家好我是苏麟 , 今天开始又一个专栏开始了(又一个坑 哈哈) . 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编…

Java进阶-测试方法

来学习一下软件测试相关的方法,了解一下黑盒测试和白盒测试,以及后面要用到的JUnit单元测试。JUnit单元测试也属于白盒测试,这次内容较少且相对简单。 一、软件测试方法 1、黑盒测试 不需要写代码,给输入值,看程序…

分付在哪些商户可以使用消费,微信分付怎么提取出来到余额上面来?

分付是一款信用支付产品,用户可以使用分付进行线上线下的消费支付。下面是使用分付的一些方法: - 开通分付:在微信中搜索并开通分付服务,按照提示完成实名认证和绑定银行卡等操作。 - 线上支付:在支持分付的线上商户…

【Web - 框架 - Vue】随笔 - 通过CDN的方式使用VUE 2.0和Element UI

通过CDN的方式使用VUE 2.0和Element UI - 快速上手 VUE 网址 https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js源码 https://download.csdn.net/download/HIGK_365/88815507测试 代码 <!DOCTYPE html> <html lang"en"> <head><meta …

剑指offer》15--二进制中1的个数[C++]

1. 题目描述 输入一个整数&#xff0c;输出该数二进制表示中 1 的个数。 2. 解题思路 如果对负数直接右移&#xff0c;会导致最高位一直补1&#xff0c;最终变成0xFFFF死循环。 常规做法&#xff1a; 3. 代码实现 #include<iostream> #include<vector> using…

Leetcoder Day38| 动态规划part05 背包问题

1049.最后一块石头的重量II 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那…

012集—二维轻量多线段LWpolyline设置凸度bulge——vba实现

本文主要讲LightweightPolyline ,即轻量多段线。 ObjectARX 中提供了三种多段线的相关类:AcDbPolyline&#xff08;对应vba中lightweightpolyline&#xff09; 、AcDb2dPolyline (对应vba中polyline)和 AcDb3dPolyline Polyline就是&#xff08;轻量&#xff09;多段线&…

蓝牙BLE 5.0、5.1、5.2和5.3区别

随着科技的不断发展&#xff0c;蓝牙技术也在不断进步&#xff0c;其中蓝牙BLE&#xff08;Bluetooth Low Energy&#xff09;是目前应用广泛的一种蓝牙技术&#xff0c;而BLE 5.0、5.1、5.2和5.3则是其不断升级的版本。本文将对这四个版本的区别进行详细的比较。 一、BLE 5.0…

【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作

文章目录 我们正常的mysql插入数据语句加个前提完结 我们正常的mysql插入数据语句 INSERT INTO guild_nakadai.admin_role_permission (role_id, permission_id, type) VALUES ((SELECT id FROM guild_nakadai.admin_roles WHERE name"员工"),(SELECT id FROM guil…

Unity UGUI之Slider基本了解

在Unity中&#xff0c;Slider&#xff08;滑动条&#xff09;是一种常用的用户界面控件之一&#xff0c;允许用户通过拖动滑块来选择一个数值。常常应用于调节数值&#xff08;如调节音量、亮度、游戏难度等&#xff09;、设置选项等。 以下是Slider的基本信息和用法: 1、创建…

快速幂(求解原理+例题)

目录 反复平方法&#xff08;快速幂&#xff09;&#xff1a; 代码&#xff1a; 例题&#xff1a;快速幂求逆元 作用&#xff1a; 快速求出 的结果。 时间复杂度&#xff1a; O(logk) 如果使用一般做法&#xff0c;从1循环到k&#xff0c;时间复杂度是O(k) 反复平方法&am…

低代码流程引擎实战:让表单字段成为流程节点审批人的得力助手!

在现代企业的日常运营中&#xff0c;流程审批是保障工作高效、规范进行的关键环节。随着企业对于灵活性和高效性的需求不断增长&#xff0c;传统的固定审批人设置已无法满足多变的业务场景。在JVS低代码中“设置流程节点审批人为表单字段”这一功能&#xff0c;旨在通过动态配置…

C#入门:简单数据类型和强制类型转换

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 本期来讲讲 unity 的脚本语言 —C#&#xff0c;C# 的简单数据类型及范围和强制类型转化的方法。这可是 unity 游戏开发必备技能。 1. 简单数据类型 各个类型的范围&#xff1a; byte -> System.Byte (字节…

黑马点评-短信登录业务

原理 模型如下 nginx nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡到下游tomcat服务器&#xff0c;打散流量。 我们都知道一台4核8G的tomca…

网络问题排查必备利器:Pingmesh

背景 当今的数字化世界离不开无处不在的网络连接。无论是日常生活中的社交媒体、电子商务&#xff0c;还是企业级应用程序和云服务&#xff0c;我们对网络的依赖程度越来越高。然而&#xff0c;网络的可靠性和性能往往是一个复杂的问题&#xff0c;尤其是在具有大规模分布式架…

lanqiao:42点

题解&#xff1a; 1.首先&#xff0c;把字符转成数字。 2.创建二维数组存放枚举的结果&#xff0c;第一行一个数字13&#xff1b;第二行4个数字&#xff0c;分别是13和1的加减乘除&#xff1b;第三行16个数字&#xff0c;分别是第二行的每个数和12加减乘除的结果&#xff1b;…