Matlab - Solidworks 机器人建模(6)——使用rigidBodyTree构建机器人模型

2023-11-09

前言

本文适用对象:

  • 没有机器人的Solidworks模型自己又懒得画的童鞋
  • 没有机器人URDF模型的童鞋

如果你在Matlab帮助里面搜索rigidBody,你大概率会看到matlab自带的例程 链接在这里 教你怎么用rigidBody建立机器人模型,里面有一小节告诉我们怎么用自己推导的DH参数表来建立操作臂模型。
在这里插入图片描述
它这里用的例程是PUMA560 机械臂
在这里插入图片描述
然后建出来的坐标系模型长这样在这里插入图片描述
就怎么说呢,很TM不直观。。。一是因为重叠的坐标系显示不出来,二是我们很难把这个坐标系跟我们的机器人模型对应。图像显示的目的是让复杂模型简化更为直观,而不是让你更懵逼,因此本文讲解怎么不通过导入URDF的方法直接建立rigidBodyTree机器人模型。

正文

考虑如下的结构的机器人(我特意挑了个特殊的结构,检验一下自己的DH建模水平)
在这里插入图片描述
该结构有四个旋转关节,再加上tool frame一共有5个坐标系。经过手动DH建系结果如下:
在这里插入图片描述

1.其实你根本不需要DH参数表,直接把坐标系放在关节上,定义好不同坐标系之间的转换就可以跑通仿真了

2.要注意的是,这个结构Tool frame之前需要额外增加一个坐标系满足DH默认条件才能无脑代公式得到正运动学矩阵

简单分析一下这个模型,他有4个连杆(连杆0在地面上了,这里不考虑),4个关节,加上Tool frame的话就有5个坐标系。另外,各个连杆的长度分别定义成L1=0.3 L2=0.3 L3=0.3 L4=0.2。额外添加的坐标系只是为了方便我们代入公式求正运动学转换矩阵,实现仿真演示的话只需要坐标系0~4即可。

OK,开始撸代码,rigidBody代码如下

1. 新建一个rigidBodyTree模型,定义各个连杆长度
%% 
% Start with a blank rigid body tree model.
robot = rigidBodyTree('DataFormat','column','MaxNumBodies',4);
%%
% Specify arm lengths for the robot arm.
L1 = 0.3;
L2 = 0.3;
L3 = 0.3;
L4 = 0.2;
2. 定义四个连杆和关节

连杆1是依附在base上的,初始条件下0号坐标系与Matlab的基坐标系重合,因此此时没有相对基坐标系的旋转和平移,且有一个旋转关节在Z0轴

%%
% Add |'link1'| body with |'joint1'| joint.
body = rigidBody('link1');
joint = rigidBodyJoint('joint1', 'revolute');
%定义0号坐标系与基坐标系的相对位置(这里没有旋转与平移)
setFixedTransform(joint,trvec2tform([0 0 0]));
%定义旋转轴方向
joint.JointAxis = [0 0 1];
body.Joint = joint;
addBody(robot, body, 'base');

连杆2依附在连杆1上,有相对转动和平移,为了简化代码这里我们偷了懒(不然需要添加几个旋转矩阵,有兴趣的可以自己尝试),直接换了关节2的方向表达,我们定义了x1为2号关节的转动方向

%%
% Add |'link2'| body with |'joint2'| joint.
body = rigidBody('link2');
joint = rigidBodyJoint('joint2','revolute');
setFixedTransform(joint, trvec2tform([0,0,L1]));
joint.JointAxis = [1 0 0];
body.Joint = joint;
addBody(robot, body, 'link1');

完成后面的几个连杆关节的定义

%%
% Add |'link3'| body with |'joint3'| joint.
body = rigidBody('link3');
joint = rigidBodyJoint('joint3','revolute');
setFixedTransform(joint, trvec2tform([0,L2,0]));
joint.JointAxis = [1 0 0];
body.Joint = joint;
addBody(robot, body, 'link2');
%%
% Add |'link4'| body with |'joint4'| joint.
body = rigidBody('link4');
joint = rigidBodyJoint('joint4','revolute');
setFixedTransform(joint, trvec2tform([0,L3,0]));
joint.JointAxis = [1 0 0];
body.Joint = joint;
addBody(robot, body, 'link3');
%%
% Add |'tool'| end effector with |'fix1'| fixed joint.
body = rigidBody('tool');
joint = rigidBodyJoint('fix1','fixed');
setFixedTransform(joint, trvec2tform([0, L4, 0]));
body.Joint = joint;
addBody(robot, body, 'link4');

至此,建模算是结束了。

3. 检查建模结果

看一下我们的模型

%%
% Show details of the robot 
showdetails(robot)
show(robot)

在这里插入图片描述
看起来是这么回事,我们试下换不同的关节位置看看。

configuration1 = [0;0.8;-0.6;0];
show(robot,configuration1)

在这里插入图片描述
检查无误,建模结束。

4. 完整代码
% Create a |rigidBodyTree| object and rigid bodies with their
% associated joints. Specify the geometric properties of each rigid body
% and add it to the robot.

%% 
% Start with a blank rigid body tree model.
robot = rigidBodyTree('DataFormat','column','MaxNumBodies',4);
%%
% Specify arm lengths for the robot arm.
L1 = 0.3;
L2 = 0.3;
L3 = 0.3;
L4 = 0.2;
%%
% Add |'link1'| body with |'joint1'| joint.
body = rigidBody('link1');
joint = rigidBodyJoint('joint1', 'revolute');
setFixedTransform(joint,trvec2tform([0 0 0]));
joint.JointAxis = [0 0 1];
body.Joint = joint;
addBody(robot, body, 'base');
%%
% Add |'link2'| body with |'joint2'| joint.
body = rigidBody('link2');
joint = rigidBodyJoint('joint2','revolute');
setFixedTransform(joint, trvec2tform([0,0,L1]));
joint.JointAxis = [1 0 0];
body.Joint = joint;
addBody(robot, body, 'link1');
%%
% Add |'link3'| body with |'joint3'| joint.
body = rigidBody('link3');
joint = rigidBodyJoint('joint3','revolute');
setFixedTransform(joint, trvec2tform([0,L2,0]));
joint.JointAxis = [1 0 0];
body.Joint = joint;
addBody(robot, body, 'link2');
%%
% Add |'link2'| body with |'joint2'| joint.
body = rigidBody('link4');
joint = rigidBodyJoint('joint4','revolute');
setFixedTransform(joint, trvec2tform([0,L3,0]));
joint.JointAxis = [1 0 0];
body.Joint = joint;
addBody(robot, body, 'link3');
%%
% Add |'tool'| end effector with |'fix1'| fixed joint.
body = rigidBody('tool');
joint = rigidBodyJoint('fix1','fixed');
setFixedTransform(joint, trvec2tform([0, L4, 0]));
body.Joint = joint;
addBody(robot, body, 'link4');

%%
% Show details of the robot 
showdetails(robot)
show(robot)

configuration1 = [0;0.8;-0.6;0];
show(robot,configuration1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab - Solidworks 机器人建模(6)——使用rigidBodyTree构建机器人模型 的相关文章

  • JUST技术:时空轨迹挖掘助力物流小哥减负增效

    电商的发展需要依赖高效而可靠的物流服务 如何通过大数据和人工智能技术提升物流小哥的配送效率是我们一直在深入研究的问题 在刚刚结束的数据挖掘顶会KDD2020中 这篇 Doing in One Go Delivery Time Inferen
  • 31岁拿了阿里P6的offer,还有必要去吗?

    前几天看到一个非常现实且扎心的提问 31岁拿了阿里P6的offer 要去吗 首先给大家简单普及一下 估计很多小伙伴对阿里P6的概念比较模糊 甚至不少人觉得阿里P几啊什么的 就都很牛b 其实不然 P级只是阿里现行的职级划分体系 校招生进入阿里
  • sbt入门

    sbt入门 sbt 介绍 sbt 下载 sbt 安装 sbt 入门 helloworld sbt 目录结构 sbt 命令 总结 sbt 介绍 sbt是什么 sbt到底是什么 在网上找找 似乎找不到一个非常准确 而且大家都认可的定义 我自己对
  • FASTJSON和JACKSON基本使用

    Json是一种轻量级的数据交换格式 采用一种 键 值 对的文本格式来存储和表示数据 在系统交换数据过程中常常被使用 是一种理想的数据交换语言 在使用Java做Web开发时 不可避免的会遇到Json的使用 JSON形式与语法 JSON对象 我
  • linux使用xe命令管理远程xenserver机器

    1 linux下安装xe工具 xenserver6 2的dom0是32位centos5系统 xenserver6 5是64位centos系统 xe工具都是以rpm包形式提供 在ubuntu下安装时 先要用alien转换rpm包为deb包 注
  • group by的使用场景

    group by的使用场景 自我理解 一般配合sum使用 用来分组统计总 量 面试的时候最好说我们当时用的group 加sum查询每个sku的销量 group by 分组 查询 就是把记录集中的记录按一定规则进行 分组统计 假设一个学生名单
  • Android 关于inflate

    通俗的说 inflate就相当于将一个xml中定义的布局找出来 因为在一个Activity里如果直接用findViewById 的话 对应的是setConentView 的那个layout里的组件 因此如果你的Activity里如果用到别的
  • AWK入门到精通系列——awk快速入门

    简介 AWK是一个优良的文本处理工具 Linux及Unix环境中现有的功能最强大的数据处理引擎之一 这种编程及数据操作语言 其名称得自于它的创始人阿尔佛雷德 艾侯 彼得 温伯格和布莱恩 柯林汉姓氏的首个字母 的最大功能取决于一个人所拥有的知
  • nrm下载报错(C:\Users\16500\AppData\Roaming\npm\node_modules\nrm\cli.js:9const open = require(‘open‘)问题解决

    问题报错 建议大家下载nrm的时候尽量在node js 16版本之上 不然会造成很多报错问题无法解决 node 16版本下载地址 node js 16 问题原因是应该使用 open 的 CommonJs规范的包 现在 open v9 0 0
  • 华为云计算01——虚拟化技术

    云计算概述 云计算不是一个新的技术 它是通过虚拟化技术 将物理硬件资源虚拟化成为多个能独立运行且相同的 能为多个虚拟机提供服务 最开始云计算由亚马逊提出 并完成了云计算的初步架构 但是 亚马逊云是私有的 未公布其代码与实现原理 而后来开源社
  • Flutter drawer 侧滑实现二(通过点击现实显示侧滑栏)

    1 首先在需要使用的页面加入下方代码 GlobalKey
  • FreeRTOS(1):任务

    目录 一 FreeRTOS 介绍 什么是 FreeRTOS 为什么选择 FreeRTOS FreeRTOS 资料与源码下载 FreeRTOS 实现多任务的原理 二 移植 FreeRTOS 到STM32 手动移植 使用CubeMX快速移植 快
  • printf() 函数不加 \n 无法及时输出

    for printf worker进程休息1秒 sleep 1 printf 函数末尾不加 n 就无法及时地将信息显示到屏幕上 这是因为行缓存 Windows上一般没有 类Unix上才有 行缓存 需要输出的数据不直接显示到终端 而是首先缓存
  • 关于详解Java的对象创建

    前言 在 还不清楚怎样面向对象 和 面向对象再探究 两篇文章中 都介绍了关于面向对象程序设计的概念和特点 其中也涉及到了许多代码 比如 Dog dog new Dog 这篇文章就主要来谈谈创建对象时的具体操作 2 引入例子 下面是一个Dog
  • 洛谷 P5710 数的性质

    题目描述 一些数字可能拥有以下的性质 性质 1 是偶数 性质 2 大于 4 且不大于 12 小A 喜欢这两个性质同时成立的数字 Uim 喜欢这至少符合其中一种性质的数字 八尾勇喜欢刚好有符合其中一个性质的数字 正妹喜欢不符合这两个性质的数字
  • VR开发——Unity中导入常用的VR开发插件及简单使用

    VR开发 Unity中导入VIVE的VR开发插件及简单使用 V客学院 今天我们来讲解如何进行简单的htc vive设备的软体开发 今天的教程主要讲解从插件的导入到基本的设置以及场景搭建 小白向 首先 我们需要进入Unity中的AssetsS

随机推荐

  • MySQL explain 、explain extended用法

    explain显示了mysql如何使用索引来处理select语句以及连接表 可以帮助选择更好的索引和写出更优化的查询语句 使用方法 在select语句前加上explain就可以了 如 explain select from statuses
  • Unity基础之Vuforia

    Vuforia官网 https developer vuforia com Vuforia Agumented Reality SDK Vuforia增强现实扩展工具包 所属公司 高通 支持平台 Android IOS UWP 支持设备 前
  • 基于langChain 的privateGPT 文档问答 研究

    参考 gihtub代码 https github com imartinez privateGPT 官网 privateGPT可以在断网的情况下 借助GPT和文档进行交互 有利于保护数据隐私 privateGPT可以有四个用处 1 增强知识
  • [nodejs]解决mysql和连接池(pool)自动断开问题

    最近在做一个个人项目 数据库尝试使用了mongodb sqlite和mysql 分享一下关于mysql的连接池用法 项目部署于appfog 项目中我使用连接池链接数据库 本地测试一切正常 上线以后 经过几次请求两个数据接口总是报503 一直
  • stm32_acs712电流采集计算思路

    Acs712数据手册地址 https item szlcsc com 45473 html 需要测量的参数 0 实际电流值 ACS712 A 1 acs712供电电压 Vin 2 ACS 输出电压 712 OUT V 3 ACS 输出电压
  • ps命令查看具体进程的所有线程

    ps p PID t
  • 【Java数据结构】——详解优先级队列-(堆)

    文章目录 一 堆的概念 二 向下调整 1 建初堆 2 建堆 三 优先级队列 1 什么是优先队列 2 入队列 3 出队列 4 返回队首元素 5 堆的其他TopK问题 总结 一 堆的概念 堆的定义 n个元素的序列 k1 k2 kn 称之为堆 当
  • Hyperledger Fabric架构详解

    Fabric是一个模块化和可扩展的开源系统 用于部署和操作许可的区块链 也是Linux基金会 www hyperledger org 主持的Hyperledger项目之一 Hyperledger Fabric是一个较为典型的联盟链结构 1
  • Kubernetes 映射外部服务到集群内部的场景

    0x04 Kubernetes 映射外部服务到集群内部的场景 场景 1 集群外的数据库映射到集群内部 IP地址 描述 如果您在 Kubernetes 内部和外部分别运行一些服务应用 此时应用如果分别依赖集群内部和外部应用时 通过采用将集群外
  • 游标循环loop,while和for的性能比较

    利用游标循环取大量数据时 性能显得十分重要 现在对三种循环进行一下性能的比较 一 测试环境配置 硬件 HP笔记本 intel core TM 2 主频2 0GHz 3G内存 win7操作系统 工具 PL SQL 数据库 oracle 我的数
  • 深入浅出python系列(三):逻辑判断语句

    深入浅出python系列 深入浅出python系列 一 基本数据类型 深入浅出python系列 二 运算符 版权申明 未经博主同意 谢绝转载 请尊重原创 博主保留追究权 本博客的内容来自于 深入浅出python系列 三 逻辑判断语句 学习
  • 如何基于 Git 设计合理的多人开发模式

    本文转自 Java高性能架构 一个企业级项目是由多人合作完成的 不同开发者在本地开发完代码之后 可能提交到同一个代码仓库 同一个开发者也可能同时开发几个功能特性 这种多人合作开发 多功能并行开发的特性如果处理不好 就会带来诸如丢失代码 合错
  • 信安大佬真的用kali吗?

    Kali只是现在网络安全和kali比较火的一个操作系统 下面我为大家讲讲kali系统都有那些优点 Kali介绍Kali Linux是基于Debian的Linux发行版 设计用于数字取证操作系统 面向专业的渗透测试和安全审计 集成化 预装超过
  • 【Linux】2、systemd、journalctl 超详细介绍

    文章目录 一 背景 二 系统管理 2 1 systemctl 2 1 1 State degraded 2 2 systemd analyze 2 3 hostnamectl 2 4 localectl 2 5 timedatectl 2
  • 微信小程序项目实战-电影票订票系统的毕业设计(附源码+论文)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 微信小程序毕业设计 精彩专栏推荐 安卓app毕业设计 Java毕业设计 电影票订票小程序软件 java 演示 源码下载地址 https download csdn net d
  • 电工学习笔记——示波器交直流耦合的区别

    一 概述 示波器的输入耦合方式的意思是输入信号的传输方式 耦合是指两个或两个以上的电路元件或电网络等的输入与输出之间存在紧密配合与相互影响 并通过相互作用从一侧向另一侧传输能量的现象 示波器的输入耦合属于信号直接耦合 一般有两种方式 分别是
  • spark报错:The current account does not have the permission of database

    异常信息 22 01 18 20 21 34 main WARN HiveSessionCatalog The current account does not have the permission of database adm It
  • 关于软件产品化的几点思考【转】

    关于软件产品化的几点思考 转自 汉捷咨询 国内很多软件企业尤其是行业软件企业是从开发一 二个软件项目起家的 而且项目规模和复杂度也不大 依赖其中一两个高手 他们能够在客户适度满意的状态下成功完成项目 基于以往研究 成功的主要因素是项目具备以
  • 各种语言的简写代码

    中文 zh CN 英语 en 中文 繁体 zh TW 越南语 vi 阿尔巴尼亚语 sq 阿拉伯语 ar 阿塞拜疆语 az 爱尔兰语 ga 爱沙尼亚语 et 白俄罗斯语 be 保加利亚语 bg 冰岛语 is 波兰语 pl 波斯语 fa 布尔文
  • Matlab - Solidworks 机器人建模(6)——使用rigidBodyTree构建机器人模型

    前言 本文适用对象 没有机器人的Solidworks模型自己又懒得画的童鞋 没有机器人URDF模型的童鞋 如果你在Matlab帮助里面搜索rigidBody 你大概率会看到matlab自带的例程 链接在这里 教你怎么用rigidBody建立