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

系列文章目录


前言

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

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

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


一、浮动基座机器人建模

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

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

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

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

function robot = floatingBaseHelper(df)argumentsdf = "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] = viewv1 = 
-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.mzph.cn/news/881279.shtml

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

相关文章

ubuntu添加 SSH 密钥到 GitHub

好的,以下是详细的步骤,帮助你在 Ubuntu 上生成并添加 SSH 密钥到 GitHub: 1. 检查是否已有 SSH 密钥 首先,检查你是否已经有 SSH 密钥: ls -al ~/.ssh如果看到 id_rsa 或 id_ed25519 文件,则表示你已有…

kubernetes笔记(七)

一、service管理 1.clusterIP 1)创建服务 # 资源对象模板 [rootmaster ~]# kubectl create service clusterip mysvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim mysvc.yaml --- kind: Service apiVersion: v1 metadata:name: mysvc spec:type: Cl…

从编程视角看生命、爱、自由、生活的排列顺序

从编程视角看生命、爱、自由、生活的排列顺序 离开大学校园,踏入大厂成为一名算法工程师后,我常以编程思维看待生活中的事物。在思考生命、爱、自由和生活的排列顺序时,发现从编程角度分析这些概念会有独特见解。 一、生命——程序的核心代…

k8s 中的金丝雀发布(灰度发布)

目录 1 什么是金丝雀发布 2 Canary 发布方式 3 Canary 两种发布方式实操 3.1 准备工作 3.1.1 将 nginx 命名两个版本 v1 与 v2 3.1.2 暴露端口并指定微服务类型 3.1.3 进入 pod 修改默认发布文件 3.1.4 测试 service 是否正常 3.2 基于权重的灰度发布 3.2.1 创建 Igress 资源类…

数据分析 | 热度编码和标签编码

热度编码(One-Hot Encoding)和标签编码(Label Encoding)是两种常用的将分类变量转换为数值型变量的方法。下面是对这两种编码 方式的详细解释及Python代码示例。 1. 热度编码(One-Hot Encoding) 定义&…

MS SQL Server 实战 统计与汇总重复记录

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 分组统计 SQL 语句 分组汇总 SQL 语句 having 语句过滤最终统计结果 小结 需求 在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统…

谢希仁计算机网络 (四)—— 网络层

计算机网络(四)—— 网络层(1、2):网络层概述、网络层提供的两种服务 计算机网络(四)—— 网络层(1、2):网络层概述、网络层提供的两种服务_以下属于网络层范…

IntelliJ IDEA 2024.2 新特性概览

文章目录 1、重点特性:1.1 改进的 Spring Data JPA 支持1.2 改进的 cron 表达式支持1.3 使用 GraalJS 作为 HTTP 客户端的执行引擎1.4 更快的编码时间1.5 K2 模式下的 Kotlin 性能和稳定性改进 2、用户体验2.1 改进的全行代码补全2.2 新 UI 成为所有用户的默认界面2.3 Search E…

传感器模块编程实践(二)W5500 SPI转以太网模块简介及驱动源码

文章目录 一.概要二.W5500芯片介绍W5500通讯协议介绍 三.W5500模块介绍四.W5500模块原理图五.W5500以太网模通讯实验六.CubeMX工程源代码下载七.小结 一.概要 我们介绍过单片机的以太网系统一般是由:单片机MACPHYRJ45。有些单片机比如STM32F407VET6芯片内部自带MAC…

深度学习:GAN图像生成

GAN的诞生背景 诞生: 2014年由Ian Goodfellow提出 创新性: 无监督学习:GAN 提供了一种新的方法来进行无监督学习,即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练:通过引入对抗机制,G…

pygame--超级马里奥(万字详细版)

超级马里奥点我下载https://github.com/marblexu/PythonSuperMario 1.游戏介绍 小时候的经典游戏,代码参考了github上的项目Mario-Level-1,使用pygame来实现,从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小…

iSTFT 完美重构的条件详解

目录 引言1. 短时傅里叶变换(STFT)与逆变换(iSTFT)概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域,短时傅里叶变换(Short-Time Fourier Transform,简…

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题

【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发,均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…

SpringBoot中使用Redis实现排行榜功能,并考虑到 当用户积分相同时,要求按最后更新时间升序

Redis 实现排行榜主要依赖于其有序集合zset(Sorted Set)数据结构。 zset中可以存储不重复的元素集合,并为每个元素关联一个浮点数分数(score),Redis 会根据这个分数自动对集合中的元素进行排序。 可以使用 …

栈与队列面试题(Java数据结构)

前言: 这里举两个典型的例子,实际上该类型的面试题是不确定的! 用栈实现队列: 232. 用栈实现队列 - 力扣(LeetCode) 方法一:双栈 思路 将一个栈当作输入栈,用于压入 push 传入的数…

淘宝/天猫平台淘宝商品评论 API 技术文档分享

一、获得淘宝商品评论 API 的步骤与配置 注册淘宝开放平台账号: 访问淘宝开放平台 官网,注册并登录账号(私信博主获得测试详情)。完成企业或个人实名认证,确保账号具备开发应用的资质。创建应用: 在淘宝开…

初始爬虫12(反爬与反反爬)

学到这里,已经可以开始实战项目了,多去爬虫,了解熟悉反爬,然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结: 1.爬虫占总PV较高,浪费资源 2.资源被批量抓走,丧失竞争力…

动态规划10:174. 地下城游戏

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:174.…

小米路由器ax1500+DDNS+公网IP+花生壳实现远程访问

有远程办公的需求,以及一些其他东西。 为什么写? ax1500路由器好像没搜到相关信息。以及其中有一点坑。 前置 公网ip Xiaomi路由器 AX1500 MiWiFi 稳定版 1.0.54 实现流程 花生壳申请壳域名https://console.hsk.oray.com/ 这里需要为域名实名认证 …

Linux:进程调度算法和进程地址空间

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 进程调度算法 1.1 进程队列数据结构 1.2 优先级 ​编辑 1.3 活动队列 ​编辑 1.4 过期队列 1.5 active指针和expired指针 1.6 进程连接 二 进程地址空间 2.1 …