基于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

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep