MATLAB - 浮动基座机器人的逆运动学

news2024/10/8 19:22:52

系列文章目录


前言

        本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。

        请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。但是,基于梯度下降的逆运动学求解器(如 inverseKinematics 函数)不支持包含 “浮动 ”类型刚体关节的刚体树对象。这是因为 IK 求解器依赖于运动学方程 Jq=˙q,该方程使用几何雅各布因子将关节位置与机器人的瞬时关节速度联系起来。由于雅各布矩阵的列数是速度自由度,因此位置自由度和速度自由度的数量必须相等才能使该方程保持有效。在这里使用浮动关节会带来差异,因为浮动关节使用四元数来表示旋转,它有四个元素,而相应的角速度只有三个元素。本示例演示了如何为浮动基座建模,以便与逆运动学函数配合使用。

        有关使用浮动关节为浮动底座机器人建模的更多信息,请参阅使用浮动关节为浮动底座机器人建模。


一、浮动基座机器人建模

        要对浮动基座机器人使用逆运动学求解器,必须建立一个浮动基座刚体模型,并使用六个连续的一自由度 (DOF) 关节将其连接到机器人机械手刚体树的固定基座上。这六个关节由三个棱柱关节和三个旋回关节组成,可实现沿 x、y 和 z 轴的平移和旋转。在原点构型中,它们彼此重合。

        加载 ABB IRB 120 的刚体模型,将其用作浮动基座系统的机器人操纵器。

abbirb = loadrobot("abbIrb120",DataFormat="row");

        辅助函数 floatingBaseHelper 创建了一个刚体树,其中包含六个没有惯性或质量的刚体。该函数将每个刚体串联起来,每个刚体都可以围绕世界中的某个轴自由平移或旋转。floatingBaseHelper 将浮动基底创建为一个刚体树,该刚体树可在世界中自由旋转和平移,并具有六个自由度。

function robot = floatingBaseHelper(df)
    arguments
        df = "column"
    end
robot = rigidBodyTree(DataFormat=df);
robot.BaseName = 'world';
jointaxname = {'PX','PY','PZ','RX','RY','RZ'};
jointaxval = [eye(3); eye(3)];
parentname = robot.BaseName;
for i = 1:numel(jointaxname)
    bname = ['floating_base_',jointaxname{i}];
    jname = ['floating_base_',jointaxname{i}];
    rb = rigidBody(bname);
    rb.Mass = 0;
    rb.Inertia = zeros(1,6);
    rbjnt = rigidBodyJoint(jname,jointaxname{i}(1));
    rbjnt.JointAxis = jointaxval(i,:);
    rbjnt.PositionLimits = [-inf inf];
    rb.Joint = rbjnt;
    robot.addBody(rb,parentname);
    parentname = rb.Name;
end
end

1.1 将机械臂安装到浮动底座上

        将机械臂 abbirb 的刚体树添加到浮动底座上。组合成浮动ABBIrb 后,系统共有 12 个自由度 -- 其中 6 个是浮动底座的自由度,6 个是原机械臂的自由度(每个反卷关节一个自由度)。

floatingABBIrb = floatingBaseHelper("row");
addSubtree(floatingABBIrb,"floating_base_RZ",abbirb,ReplaceBase=false);

        为了证明刚体树既能在空间自由平移,又能自由旋转,请将机械臂的底座置于 xyz 坐标[1.0 0.5 0.75]处,方向为[pi/4 pi/3 pi],机械臂的关节角度为零。

baseOrientation = [pi/4 pi/3 pi]; % ZYX Euler rotation order
basePosition = [1.0 0.5 0.75];
robotZeroConfig = zeros(1,6);
q = [basePosition baseOrientation zeros(1,6)];
show(floatingABBIrb,q);
axis equal;
title("Robot Base ''Floating'' at Desired Position and Orientation")

二、求解达到目标末端执行器姿势的关节构型

        为了找到给定末端执行器姿势的关节值,请使用 inverseKinematics 函数。指定末端执行器主体和浮动机械臂所需的末端执行器姿势。

eename = "tool0";
eepose = se3([0 pi/2 1.25],"eul",[-0.25 0.45 0.25]);

        创建逆运动学求解器对象,为浮动刚体树上的 eename 末端执行器找到与所需 eepose 相对应的关节值。权重为 ones(1,6),指定求解器应考虑末端执行器的期望位置和方向。关节构型的初始假设是浮动机械臂的原点构型。

ik = inverseKinematics(RigidBodyTree=floatingABBIrb);
[qsoln,solninfo] = ik(eename,eepose.tform,ones(1,6),homeConfiguration(floatingABBIrb));

        请注意,姿势误差规范非常小,这意味着解法足够精确。

disp(solninfo.Status)

三、验证关节构型

        绘制所需的 eepose 和已解决的关节构型,以直观地验证末端执行器的坐标系是否与姿势一致。请注意该关节构型中的末端执行器坐标系与所需的 eepose 坐标系是一致的。

figure
plotTransforms(eepose,FrameSize=0.25,FrameLabel="eepose");
hold on
show(floatingABBIrb,qsoln);
hold off
axis equal
title("End Effector Reaches Desired Pose")

[v1,v2] = view

v1 = 
-37.5000
v2 = 
30

        逆运动学解法可使机器人实现所需的末端执行器姿势,但由于底座的旋转不受制约,因此底座可以有任何方向。显示求解关节构型中浮动底座的方向。请注意,浮动底座的方向不为零。

disp(qsoln(4:6))

   -0.0005    0.2667   -0.2702

        如果基座可以自由移动,那么这个问题就有无数个解决方案。如果基座姿态已知,而所需的末端执行器姿态可以达到,那么就有可能找到满足所需末端执行器姿态的唯一真实关节构型。另一种方法是对基本姿态进行约束,根据系统要求指定位置和方向约束。例如,在只允许底座平移的龙门系统中,必须对浮动底座的方向进行约束。

四、求解受约束浮动基座的 IK

        要约束浮动底座的方向,可设置关节的关节位置限制(JointPositionLimits)属性,将其在世界坐标系中绕 x、y 和 z 轴的旋转限制为接近于零。逆运动学求解器要求零的公差值很小,以避免出现运动学奇点。因此,与其将关节限值设置为 [0 0],不如将关节限值设置为非零的最小双精度值 [-eps eps]。

fb = getBody(floatingABBIrb,"floating_base_RX");
fb.Joint.PositionLimits = [-eps eps];
fb = getBody(floatingABBIrb,"floating_base_RY");
fb.Joint.PositionLimits = [-eps eps];
fb = getBody(floatingABBIrb,"floating_base_RZ");
fb.Joint.PositionLimits = [-eps eps];

        为该刚体树重新创建逆运动学求解器,并求解关节构型。

ik = inverseKinematics(RigidBodyTree=floatingABBIrb);
[qsoln,solninfo] = ik(eename,eepose.tform,ones(1,6),homeConfiguration(floatingABBIrb));

        请注意,逆运动学求解器成功找到了一个几乎没有底座方向的关节构型。

        显示求解器的成功状态和浮动基座的方向。

disp(solninfo.Status)

success
disp(qsoln(4:6)) 

   1.0e-15 *

    0.2220    0.2220   -0.2220

        可视化关节构型解决方案。请注意,在浮动基座旋转受限的情况下,机器人达到了预期姿态。

figure
plotTransforms(eepose,FrameSize=0.25,FrameLabel="eepose");
hold on
show(floatingABBIrb,qsoln);
hold off
title(["Robot Reaches Desired Pose with","Constrained Floating Base Rotation"])
view([v1 v2])

五、解决指定基座姿态的 IK 问题

        如前所述,浮动基座系统的 IK 问题有无数种解决方案,因为基座可以在任何地方,而且对于每个基座姿态,都可能存在满足末端执行器姿态的机械臂关节构型。如果基座姿态固定且已知,另一种方法是在指定基座姿态下求解关节构型。本质上是将浮动基座视为固定基座。

        首先,从机械臂的原始基座开始,获取浮动基座系统的机械臂子树。然后为该子树创建 IK 求解器。

fixedBaseTree = subtree(floatingABBIrb,abbirb.BaseName);
ikFixedBaseTree = inverseKinematics("RigidBodyTree",fixedBaseTree);

        指定基座位于 xyz 位置 [-0.2 0.2 0.3],相对于世界坐标系的欧拉 XYZ 方向为 [0.0 0.0 pi]。

basePosition = [0.3 0.3 0.1];
baseEulXYZ = [0 0 pi]; %[-pi/4 0.0 -pi/3];

        由于逆运动学(inverseKinematics)函数计算的是末端执行器姿态相对于刚体树固定基座的关节值,因此在计算 IK 解决方案之前,必须将末端执行器姿态转换为基座坐标系。

eePoseWrtFixedBase = se3(baseEulXYZ,"eul","XYZ",basePosition)\eepose;

        将关节位置 qjoint 与给定的固定基座位置和基座方向结合起来进行可视化,以验证末端执行器是否达到所需的姿势。

plotTransforms(eepose,FrameLabel="eepose",FrameSize=0.25);
hold on
[qjoint,solninfo] = ikFixedBaseTree(eename,eePoseWrtFixedBase.tform,ones(1,6),homeConfiguration(fixedBaseTree));
show(floatingABBIrb,[basePosition,baseEulXYZ,qjoint]);
title(["Robot Reaches Desired Pose","with Specified Base Pose"])
view([v1,v2])
hold off

        请注意,IK 求解器能够找到解决方案。

disp(solninfo.Status)

success

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

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

相关文章

鸿蒙开发之ArkUI 界面篇 二十二 层叠布局 Stack

Stack语法格式如下,其实鸿蒙的容器组件的语法都是一样的,只是实现效果和和容器组件的名字不一样而已。 与绝对定位相比,实现更简单些,绝地定位更灵活,如果需要调整子组件的对其方式,需要这样添 加&#xf…

如何使用 WSL 在 Windows 上安装 Linux

如何使用 WSL 在 Windows 上安装 Linux 文章目录 如何使用 WSL 在 Windows 上安装 Linux前言安装WSL命令修改DNS网络右键打开网络和internet设置更改适配器选项属性 前言 在Windows计算机上同时访问Windows和Linux系统的功能,有利于大家学习Linux系统。 版本要求Wi…

Rethinking the Localization in Weakly Supervised ObjectLocalization

论文名称:Rethinking the Localization in Weakly Supervised Object Localization 论文地址:Rethinking the Localization in Weakly Supervised Object Localization (arxiv.org) 1.背景 最近,将WSOL分成两部分(与类无关的对象定位和对象…

Ansible 工具从入门到使用

1. Ansible概述 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…

恶意软件基础知识——恶意软件命名

计算机病毒(Computer Virus)指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码。 ——《中华人民共和国计算机信息系统安全保护条例》 恶意软件的定义 恶意软件是一个用来描述恶意应用程序…

SQL进阶技巧:如何优化NULL值引发的数据倾斜问题?

目录 0 场景描述 1 问题分析 1.1 问题剖析 1.2 解决方案 2 小结 0 场景描述 实际业务中有些大量的null值或者一些无意义的数据参与到计算作业中,表中有大量的null值,如果表之间进行join操作,就会有shuffle产生,这样所有的null值都会被分配到一个reduce中,必然产生数…

动态代理有用吗?一文了解靠谱的动态代理有哪些标准

在当今互联网时代中,从网络安全、隐私保护、市场调研和互联网营销到软件测试、缓存管理和数据库连接,用户为了更好地完成此类工作,往往会使用动态代理,那么进一步了解动态代理、明确动态代理的使用场景和选择标准则是十分有必要的…

MatrixVT: Efficient Multi-Camera to BEV Transformation for 3D Perception

本文提出了一种高效的多摄像头到鸟瞰图 (BEV) 视图转换方法,用于 3D 感知,称为 MatrixVT。现有的视图转换器要么转换效率低下,要么依赖于特定于设备的操作符,阻碍了 BEV 模型的广泛应用。相比之下,我们的方法仅使用卷积…

QT-空窗口主窗口对话框

1. QMainWindow QMainWindow 用来创建主窗口 主窗口包含: 标题栏(Window title)、菜单栏(MenuBar)、工具栏(ToolBar)、状态栏(StatusBar)、停靠部件(DockWid…

你真的了解ChatGPT吗?深度解读Chat GPT背后的数据风险

随着人工智能技术的快速发展,像ChatGPT这样的语言模型已经成为了我们生活和工作的得力助手。从撰写文章、回答问题到辅助编程,ChatGPT正逐渐改变着人们与科技互动的方式。然而,随着AI的广泛应用,数据安全也成为了不可忽视的重要议…

Maven 父子模块的 pom.xml 文件编写

今天在写课内的实验作业的时候&#xff0c;三个内容要使用的依赖是一样的&#xff0c;于是想使用父子模块来玩玩。 父模块 pom.xml 书写 打包方式 <packaging>pom</packaging> 聚合子模块 <!-- 聚合子模块 --> <modules><module>../one</…

双十一即将来临,希喂、有哈、安德迈宠物空气净化器攻略赶快收好

国庆长假结束&#xff0c;也就告别了今年最后一个法定节假日。不过&#xff0c;随之而来的就是购物狂欢节双十一&#xff01;想想还有点小激动&#xff0c;这是我工作以来第一个双十一。以前在大学靠生活费根本买不了什么&#xff0c;现在工作了有点小钱&#xff0c;准备大买特…

全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!

博客主页&#xff1a;长风清留扬-CSDN博客系列专栏&#xff1a;Python基础专栏每天更新大数据相关方面的技术&#xff0c;分享自己的实战工作经验和学习总结&#xff0c;尽量帮助大家解决更多问题和学习更多新知识&#xff0c;欢迎评论区分享自己的看法感谢大家点赞&#x1f44…

【漏洞复现】网动统一通信平台/网动统一通信平台ActiveUC存在任意文件下载

》》》产品描述《《《 网动统一通信平台是采用统一的通信界面&#xff0c;将VoIP电话系统、电子邮件等多种沟通方式融合的企业IT平台。 》》》漏洞描述《《《 网动统一通信平台是采用统一的通信界面&#xff0c;将VoIP电话系统、电子邮件等多种沟通方式融合的企业IT平台。网动统…

OXO:一款针对Orchestration框架的安全扫描引擎

关于OXO OXO是一款针对Orchestration框架的安全扫描引擎&#xff0c;该工具可以帮助广大研究人员检测Orchestration安全问题&#xff0c;并执行网络侦查、 枚举和指纹识别等操作。 值得一提的是&#xff0c;OXO还提供了数十种其他的协同工具&#xff0c;包括网络扫描代理&…

js拼接html代码在线工具

具体请前往&#xff1a;在线Html转Js--将Html代码转成javascript动态拼接代码并保持原有格式

【基础篇】一个键值数据库包含什么?

背景 今天&#xff0c;在构造这个简单的键值数据库时&#xff0c;我们只需要关注整体架构和核心模块。这就相当于医学上在正式解剖人体之前&#xff0c;会先解剖一只小白鼠。我们通过剖析这个最简单的键值数据库&#xff0c;来迅速抓住学习和调优 Redis 的关键。 我们把这个简…

python中字符串操作

1、遍历字符串&#xff1a; pystr"HelloPython!" for i in pystr:print(i) 结果&#xff1a; 2、字符串索引 pystr"HelloPython!" print(pystr[0],pystr[-1]) 结果&#xff1a; 3、字符串切片 pystr"HelloPython!" # 切片[start:stop:step] p…

父组件向子组件传值props

父组件 <template><child :list"list" /><h4>{{ title }}</h4> </template> <script> // 引用子组件 import child from ./child.vue export default {data() {return {title: APP根组件,list: [a1, a2, a3]}},// 组件注册compo…

2024电动车新国标是什么标准

9月19日&#xff0c;工业和信息化部会同多部门&#xff0c;对最新修订的《电动自行车安全技术规范》进行公开征求意见&#xff0c;将持续1个月。与现行标准相比&#xff0c;这次的“新国标”做了哪些方面的改进和提升&#xff1f;事关你出行自由顺畅的“小电驴”&#xff0c;快…