当前位置: 首页 > news >正文

【matlab】机器人工具箱快速上手-正运动学仿真(代码直接复制可用)

安装好机器人工具箱,代码复制可用,按需修改参数

1.建模

%%%%%%%%SCARA机器人仿真模型
l=[0.457 0.325];
L(1)= Link('d',0,'a',l(1),'alpha',0,'standard','qlim',[-130 130]*pi/180);%连杆1
L(2)=Link('d',0,'a',l(2),'alpha',pi,'standard','qlim',[-145 145]*pi/180);%连杆2
L(3)=Link('theta',0,'a',0,'alpha',0,'standard','qlim',[0 0.3]);%连杆3
L(4)= Link('d',0,'a',0,'alpha',0,'standard','qlim',[-360 360]*pi/180);%连杆4
scara=SerialLink(L,'name','SCARA Robot');%建立 SCARA 机器人模型
q0=[0 0 0 0];%初始关节变量
scara.plot(q0);%绘制机器人结构
scara.teach(q0);%驱动机器人

2.工作空间

%%%%%%%%工作空间绘制
qL=scara.qlim;%关节运动范围
N=10000;%随机数数量
ws_q=zeros(N,4);%定义N个关节变量向量组成的关节变量矩阵q
a=rand(size(ws_q)); %生成元素数值在0~1之间的与q同维度的随机矩阵for j=1:Nfor i=1:4ws_q(j,i)=qL(i,1)+(qL(i,2)-qL(i,1))*a(j,i);%给矩阵q赋q范围内的随机值,以得到足够多的给定范围(矩阵ql)内的机器人的关节变量(矩阵q)值end
end
%求机器人位置坐标
ws_x=l(1)*cos(ws_q(:,1))+l(2)*cos(ws_q(:,1)+ ws_q(:,2));%机器人末端x坐标值
ws_y=l(1)*sin(ws_q(:,1))+l(2)*sin(ws_q(:,1)+ws_q(:,2));%机器人末端了坐标值
ws_z=- ws_q(:,3);%机器人末端z坐标值
figure('Name','Scara机器人工作空间')
plot3(ws_x,ws_y,ws_z,'r.')
grid;
xlabel('x');
ylabel('y');
zlabel('z');

旋转一下:

3.运动轨迹:

%%%%%%%%轨迹规划
qA=[0 0 0 0];%起始点关节变量值
qB=[0.7 1.2 0.15 2];%终止点关节变量值
t=0:0.05:2;%产生时间向量
[q,qd,qdd]=jtraj(qA,qB,t);%jtraj()为构建轨迹命令,得到各关节的位移、速度和加速度
%%%%%%%%正运动学仿真
T=double(scara.fkine(q));%正运动学仿真函数
[x,y,z]=transl(T);%机器人末端x、y、z坐标值
%%%%%%%%绘制曲线图
figure('Name','"SCARA Robot"机器人正运动学演示');
plot(scara,q)
figure('Name','机器人末端运动轨迹')
plot3(x,y,z,'r-o','MarkerFaceColor','r');
grid;
xlabel('x');ylabel('y');zlabel('z');

4.各关节位移、速度、加速度:

figure('Name','各关节的位移、速度和加速度曲线');
subplot(3,4,1);
plot(t,q(:,1)); %得到关节1的位移曲线
title('关节1'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,5);
plot(t,qd(:,1)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,9);
plot(t,qdd(:,1)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');subplot(3,4,2);
plot(t,q(:,2)); %得到关节1的位移曲线
title('关节2'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,6);
plot(t,qd(:,2)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,10);
plot(t,qdd(:,2)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');subplot(3,4,3);
plot(t,q(:,3)); %得到关节1的位移曲线
title('关节3'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,7);
plot(t,qd(:,3)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,11);
plot(t,qdd(:,3)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');subplot(3,4,4);
plot(t,q(:,4)); %得到关节1的位移曲线
title('关节4'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,8);
plot(t,qd(:,4)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,12);
plot(t,qdd(:,4)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');

汇总:

%%%%%%%%SCARA机器人仿真模型
l=[0.457 0.325];
L(1)= Link('d',0,'a',l(1),'alpha',0,'standard','qlim',[-130 130]*pi/180);%连杆1
L(2)=Link('d',0,'a',l(2),'alpha',pi,'standard','qlim',[-145 145]*pi/180);%连杆2
L(3)=Link('theta',0,'a',0,'alpha',0,'standard','qlim',[0 0.3]);%连杆3
L(4)= Link('d',0,'a',0,'alpha',0,'standard','qlim',[-360 360]*pi/180);%连杆4
scara=SerialLink(L,'name','SCARA Robot');%建立 SCARA 机器人模型
q0=[0 0 0 0];%初始关节变量
scara.plot(q0);%绘制机器人结构
scara.teach(q0);%驱动机器人%%%%%%%%工作空间绘制
qL=scara.qlim;%关节运动范围
N=10000;%随机数数量
ws_q=zeros(N,4);%定义N个关节变量向量组成的关节变量矩阵q
a=rand(size(ws_q)); %生成元素数值在0~1之间的与q同维度的随机矩阵for j=1:Nfor i=1:4ws_q(j,i)=qL(i,1)+(qL(i,2)-qL(i,1))*a(j,i);%给矩阵q赋q范围内的随机值,以得到足够多的给定范围(矩阵ql)内的机器人的关节变量(矩阵q)值end
end
%求机器人位置坐标
ws_x=l(1)*cos(ws_q(:,1))+l(2)*cos(ws_q(:,1)+ ws_q(:,2));%机器人末端x坐标值
ws_y=l(1)*sin(ws_q(:,1))+l(2)*sin(ws_q(:,1)+ws_q(:,2));%机器人末端了坐标值
ws_z=- ws_q(:,3);%机器人末端z坐标值
figure('Name','Scara机器人工作空间')
plot3(ws_x,ws_y,ws_z,'r.')
grid;
xlabel('x');
ylabel('y');
zlabel('z');
%%%%%%%%轨迹规划
qA=[0 0 0 0];%起始点关节变量值
qB=[0.7 1.2 0.15 2];%终止点关节变量值
t=0:0.05:2;%产生时间向量
[q,qd,qdd]=jtraj(qA,qB,t);%jtraj()为构建轨迹命令,得到各关节的位移、速度和加速度
%%%%%%%%正运动学仿真
T=double(scara.fkine(q));%正运动学仿真函数
[x,y,z]=transl(T);%机器人末端x、y、z坐标值
%%%%%%%%绘制曲线图
figure('Name','"SCARA Robot"机器人正运动学演示');
plot(scara,q)
figure('Name','机器人末端运动轨迹')
plot3(x,y,z,'r-o','MarkerFaceColor','r');
grid;
xlabel('x');ylabel('y');zlabel('z');
figure('Name','各关节的位移、速度和加速度曲线');
subplot(3,4,1);
plot(t,q(:,1)); %得到关节1的位移曲线
title('关节1'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,5);
plot(t,qd(:,1)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,9);
plot(t,qdd(:,1)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');subplot(3,4,2);
plot(t,q(:,2)); %得到关节1的位移曲线
title('关节2'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,6);
plot(t,qd(:,2)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,10);
plot(t,qdd(:,2)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');subplot(3,4,3);
plot(t,q(:,3)); %得到关节1的位移曲线
title('关节3'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,7);
plot(t,qd(:,3)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,11);
plot(t,qdd(:,3)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');subplot(3,4,4);
plot(t,q(:,4)); %得到关节1的位移曲线
title('关节4'); %命名
grid;
hold on;
ylabel('位移(rad)');
subplot(3,4,8);
plot(t,qd(:,4)); %得到关节1的速度曲线
grid;
ylabel('速度(rad/s)');
subplot(3,4,12);
plot(t,qdd(:,4)); %得到关节1的加速度曲线
grid;
xlabel('时间(s)');
ylabel('加速度(rad/s^2)');

相关文章:

【matlab】机器人工具箱快速上手-正运动学仿真(代码直接复制可用)

安装好机器人工具箱,代码复制可用,按需修改参数 1.建模 %%%%%%%%SCARA机器人仿真模型 l[0.457 0.325]; L(1) Link(d,0,a,l(1),alpha,0,standard,qlim,[-130 130]*pi/180);%连杆1 L(2)Link(d,0,a,l(2),alpha,pi,standard,qlim,[-145 145]*pi/180);%连杆…...

论文解读|PF-Net:用于 3D 点云补全的点分形网络

原创 | 文 BFT机器人 01 背景 从激光雷达等设备中获取的点云往往有所缺失(反光、遮挡等),这给点云的后续处理带来了一定的困难,也凸显出点云补全作为点云预处理方法的重要性。 点云补全(Point Cloud Completion&#x…...

网络安全(零基础)自学

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识,可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题,可以帮助您更好地解决网络安全的原理和技术…...

Spring Security 身份验证的基本类/架构

目录 1、SecurityContextHolder 核心类 2、SecurityContext 接口 3、Authentication 用户认证信息接口 4、GrantedAuthority 拥有权限接口 5、AuthenticationManager 身份认证管理器接口 6、ProviderManager 身份认证管理器的实现 7、AuthenticationProvider 特定类型的…...

市值超300亿美金,SaaS独角兽Veeva如何讲好中国故事?

“全球前50的药企,有47家正在使用Veeva。” 提到Veeva Systems(以下简称“Veeva”),可能很多人并不熟悉。但是生命科学业内人士都知道,Veeva是全球头部的行业SaaS服务商。以“为生命科学行业构建行业云”为使命&#x…...

编译内联导致内存泄漏的问题定位修复

作者:0x264 问题 线上长时间存在一个跟异步 inflate 相关的量级较大的内存泄漏,如下所示: 第一次分析 从内存泄漏粗略看有几个信息: 被泄漏的Activity有很多,所以可能跟某个具体业务的关系不大引用链特别短&#xf…...

基于WebSocket实现的后台服务

基于WebSocket实现的后台服务,用于接收客户端的心跳消息,并根据心跳消息来维护客户端连接。 具体实现中,服务启动后会创建一个HttpListener对象,用于监听客户端的WebSocket连接请求。当客户端连接成功后,服务会为每个…...

Go语言中的结构体详解

关于 Golang 结构体 Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们…...

pytest自动化测试指定执行测试用例

1、在控制台执行 打开cmd,进入项目目录 指定执行某个模块 pytest testcases\Logistics\Platform\CarSource\test_CarSourceList.py 指定执行某个目录及其子目录的所有测试文件 pytest testcases\Logistics\Platform\CarSource 指定执行某个模块的某个类的某个测试用例 pyte…...

英伟达 H100 vs. 苹果M2,大模型训练,哪款性价比更高?

M1芯片 | Uitra | AMD | A100 M2芯片 | ARM | A800 | H100 关键词:M2芯片;Ultra;M1芯片;UltraFusion;ULTRAMAN;RTX4090、A800;A100;H100;LLAMA、LM、AIGC、CHATGLM、LLVM、LLM、LLM…...

var、let和const的区别

先简单了解一下 var声明的变量会挂载在window上,而let和const声明的变量不会: var a 100; console.log(a,window.a); // 100 100let b 10; console.log(b,window.b); // 10 undefinedconst c 1; console.log(c,window.c); // 1 undefined v…...

(css)AI智能问答页面布局

(css)AI智能问答页面布局 效果&#xff1a; html <!-- AI框 --><div class"chat-top"><div class"chat-main" ref"chatList"><div v-if"!chatList.length" class"no-message"><span>欢迎使…...

【Pytorch学习】pytorch中的isinstance() 函数

描述 isinstance() 函数来判断一个对象是否是一个已知的类型&#xff0c;类似 type()。 isinstance() 与 type() 区别&#xff1a; type() 不会认为子类是一种父类类型&#xff0c;不考虑继承关系。 isinstance() 会认为子类是一种父类类型&#xff0c;考虑继承关系。 如果要判…...

(树) 剑指 Offer 07. 重建二叉树 ——【Leetcode每日一题】

❓剑指 Offer 07. 重建二叉树 难度&#xff1a;中等 输入某二叉树的 前序遍历 和 中序遍历 的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] …...

Gitlab 合并分支与请求合并

合并分支 方式一&#xff1a;图形界面 使用 GitGUI&#xff0c;右键菜单“GitExt Browse” - 菜单“命令” - 合并分支 方式二&#xff1a;命令行 在项目根目录下打开控制台&#xff0c;注意是本地 dev 与远程 master 的合并 // 1.查看本地分支&#xff0c;确认当前分支是否…...

【Matter】基于Ubuntu 22.04 编译chip-tool工具

前言 编译过程有点曲折&#xff0c;做下记录&#xff0c;过程中&#xff0c;有参考别人写的博客&#xff0c;也看github 官方介绍&#xff0c;终于跑通了~ 环境说明&#xff1a; 首先需要稳定的梯子&#xff0c;可以访问“外网”ubuntu 环境&#xff0c;最终成功实验在Ubunt…...

将 MongoDB 的 List<Document> 转换为对象列表

当我们使用 MongoDB 存储数据时&#xff0c;经常会涉及到将 MongoDB 的文档对象转换为对象列表的需求。在 Java 中&#xff0c;我们可以使用 MongoDB 的 Java 驱动程序和自定义类来实现这一转换过程。 本篇博客将介绍如何将 MongoDB 中的 List<Document> 转换为对象列表。…...

【Linux下6818开发板(ARM)】SecureCRT串口和交叉编译工具(巨细版!)

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…...

应届生如何快速找Java开发工程师,先学会这17个基础问题

一、Java 基础 JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;java 开发工具包&#xff0c;提供了 java 的开发环境和运行环境。 JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;java 运行环境&#xff0c;为 java 的…...

数学建模学习(5):数学建模各类题型及解题方案

一、数学建模常见的题型 总体来说&#xff0c;数学建模赛题类型主要分为&#xff1a;评价类、预测类和优化类三种&#xff0c;其中优化类是最常见的赛题类 型&#xff0c;几乎每年的地区赛或国赛美赛等均有出题&#xff0c;必须要掌握并且熟悉。 二、评价类赛题 综合评价是数学…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...