基于Matlab机器人系统工具箱(Robotics System Toolbox)对库卡LBR Med 7 R800进行建模分析(一)

本文主要是介绍基于Matlab机器人系统工具箱(Robotics System Toolbox)对库卡LBR Med 7 R800进行建模分析(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要讲解利用机器人系统工具箱(Robotics System Toolbox)对库卡LBR Med 7 R800进行建模,以及利用模型对其进行正、逆解运算分析,库卡LBR Med 7 R800本体图如下:

 首先利用Matlab机器人系统工具箱(Robotics System Toolbox)中的刚体树(rigidbodytree)对机器人进行建模,代码如下:

%创建一个机器人刚体树对象,取名为robot
robot=robotics.RigidBodyTree("MaxNumBodies",9,"DataFormat","row");
%创建九个关节和九个刚体
body0=robotics.RigidBody("body0");
jnt0=robotics.Joint("jnt0","fixed");
body1=robotics.RigidBody("body1");
jnt1=robotics.Joint("jnt1","revolute");
body2=robotics.RigidBody("body2");
jnt2=robotics.Joint("jnt2","revolute");
body3=robotics.RigidBody("body3");
jnt3=robotics.Joint("jnt3","revolute");
body4=robotics.RigidBody("body4");
jnt4=robotics.Joint("jnt4","revolute");
body5=robotics.RigidBody("body5");
jnt5=robotics.Joint("jnt5","revolute");
body6=robotics.RigidBody("body6");
jnt6=robotics.Joint("jnt6","revolute");
body7=robotics.RigidBody("body7");
jnt7=robotics.Joint("jnt7","revolute");
body8=robotics.RigidBody("body8");
jnt8=robotics.Joint("jnt8","fixed");
%对七个旋转关节做角度限制
jnt1.PositionLimits=[-170*((2*pi)/360) 170*((2*pi)/360)];
jnt2.PositionLimits=[-120*((2*pi)/360) 120*((2*pi)/360)];
jnt3.PositionLimits=[-170*((2*pi)/360) 170*((2*pi)/360)];
jnt4.PositionLimits=[-120*((2*pi)/360) 120*((2*pi)/360)];
jnt5.PositionLimits=[-170*((2*pi)/360) 170*((2*pi)/360)];
jnt6.PositionLimits=[-120*((2*pi)/360) 120*((2*pi)/360)];
jnt7.PositionLimits=[-175*((2*pi)/360) 175*((2*pi)/360)];
%定义各个关节之间的旋转和平移
setFixedTransform(jnt1,[1 0 0 0;0 1 0 0;0 0 1 0.157;0 0 0 1]);
setFixedTransform(jnt2,[-1 0 0 0;0 0 1 0;0 1 0 0.183;0 0 0 1]);
setFixedTransform(jnt3,[-1 0 0 0;0 0 1 0.217;0 1 0 0;0 0 0 1]);
setFixedTransform(jnt4,[1 0 0 0;0 0 -1 0;0 1 0 0.183;0 0 0 1]);
setFixedTransform(jnt5,[-1 0 0 0;0 0 1 0.217;0 1 0 0;0 0 0 1]);
setFixedTransform(jnt6,[1 0 0 0;0 0 -1 0;0 1 0 0.183;0 0 0 1]);
setFixedTransform(jnt7,[-1 0 0 0;0 0 1 0.091;0 1 0 0;0 0 0 1]);
setFixedTransform(jnt8,[1 0 0 0;0 1 0 0;0 0 1 0.035;0 0 0 1]);
%把各个关节附着到各个刚体上
body0.Joint=jnt0;
body1.Joint=jnt1;
body2.Joint=jnt2;
body3.Joint=jnt3;
body4.Joint=jnt4;
body5.Joint=jnt5;
body6.Joint=jnt6;
body7.Joint=jnt7;
body8.Joint=jnt8;
%把各个刚体"安装"到刚体树(robot)上
addBody(robot,body0,"base");
addBody(robot,body1,"body0");
addBody(robot,body2,"body1");
addBody(robot,body3,"body2");
addBody(robot,body4,"body3");
addBody(robot,body5,"body4");
addBody(robot,body6,"body5");
addBody(robot,body7,"body6");
addBody(robot,body8,"body7");
show(robot);
showdetails(robot);

运行上述代码,可以看到:图一所示的机器人模型图(命令:show(robot)),图二中在命令行窗口显示的该机器人的详细组成信息(命令:showdetails(robot)),图三中工作区显示的机器人(robot)、关节(joint)、连杆(body)的属性数值。

图一 

 图二

图三 

然后,我们做机器人的逆解运算,代码如下:

%给定末端的位置和欧拉角姿态
weizhi=[500 200 300];%单位 mm
zitai=[0 0 0];%单位 °
tform=trvec2tform(weizhi./1000)*eul2tform(zitai.*(pi/180));%根据位置和姿态,将其转换为齐次矩阵
%定义一个逆解求解器
ik=robotics.InverseKinematics("RigidBodyTree",robot);
%设置求解各个量的权重,前三个是欧拉角、后三个是位置
weights=[0.25 0.25 0.25 1 1 1];
%定义求解器的初始参考位置
initialguess=robot.homeConfiguration;
%开始求解,其中逆解求解结果存放在configSoln中
[configSoln,solnInfo]=ik("body8",tform,weights,initialguess);
%判断求解是否成功,如果成功,打印显示逆解数值(单位是°)
if(solnInfo.Status=="success")fprintf("逆解是:")nijie=configSoln.*(180/pi);disp(nijie)
elsefprintf("所求无解")
end

运行上诉代码后,在命令行窗口可以看到如图四所示的逆解结果(注意,逆解数值不唯一)。

 图四

最后,我们可以对机器人求解正解,代码如下:

%给定各个关节的角度数值
q=[30 30 30 30 30 30 30];%单位是°
transform=getTransform(robot,q.*(pi/180),"body8","body0");
moduanweizhi=tform2eul(transform).*(180/pi);%末端角度数值
moduanzitai=tform2trvec(transform).*1000;%位置数值
fprintf("\n位置是:")
disp(moduanweizhi)
fprintf("\n姿态是:")
disp(moduanzitai)

 运行上诉代码后,可以在命令行窗口中查看其结果,如图五所示。

 图五

此模型已经利用库卡LBR Med 7 R800真机对其正逆解进行了准确性验证,完全ok!

我们如果想看机器人在特定关节角度下机器人的位姿,可以运行如下代码:

q=[50 30 30 30 40 21 34];%输入各个关节角度,单位式°
q=q*(pi/180);%角度转弧度
show(robot,q);

运行上诉代码后,可看到特定关节角度下机器人的位姿,如图六所示。

 图六

这篇关于基于Matlab机器人系统工具箱(Robotics System Toolbox)对库卡LBR Med 7 R800进行建模分析(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398932

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An