【Simulink】使用简化机械臂系统动力学的抓取和放置任务及轨迹调度

news2024/11/14 21:22:00

abbSavedConfigs.mat 文件中的配置

在这里插入图片描述
文件中保存了多个关节角度配置,每个配置对应不同的机器人操作步骤。这些配置通常用于控制机器人在执行任务时的各个关键姿态和动作。

各个配置的功能解释:

configSequence (18x7 double):

  • 功能: 包含了机器人执行任务的关节角度序列。这是一个 18 行 7 列的矩阵,每列对应于机器人的一个特定姿态或操作步骤。通常用于定义从开始到结束的完整动作路径,如从初始位置到抓取位置、放置位置等。
  1. startingConfig (18x1 double):

    • 功能: 表示机器人的初始关节配置。这个配置是机器人在执行任务前的默认姿态,通常是所有操作的起点。
      在这里插入图片描述
  2. graspApproachConfig (18x1 double):

    • 功能: 表示机器人在接近抓取位置时的关节配置。这个配置用于将机器人移动到接近物体的姿态,准备进行抓取操作。

在这里插入图片描述

  1. graspPoseConfig (18x1 double):

    • 功能: 表示机器人在实际抓取物体时的关节配置。这是一个非常关键的配置,确保机器人准确地抓住目标物体。
      在这里插入图片描述
  2. graspDepartConfig (18x1 double):

    • 功能: 表示机器人在抓取物体后离开抓取位置的关节配置。这个配置用于控制机器人抓住物体后从抓取位置移开的动作。

在这里插入图片描述

  1. placeApproachConfig (18x1 double):

    • 功能: 表示机器人在接近放置位置时的关节配置。这个配置用于将机器人移动到放置物体的姿态,准备放下物体。
      在这里插入图片描述
  2. placeConfig (18x1 double):

    • 功能: 表示机器人在实际放置物体时的关节配置。这个配置确保机器人将物体准确地放置在目标位置。
      在这里插入图片描述
  3. placeDepartConfig (18x1 double):

    • 功能: 表示机器人在放置物体后离开放置位置的关节配置。这个配置用于控制机器人放下物体后从放置位置移开的动作。
      在这里插入图片描述

commandLogic的功能是控制机器人执行一系列动作,涉及抓取和放置物体的操作。

通过 motionState 控制机器人的动作序列,并在每个状态下输出相应的关节角度和抓取器状态。代码还包括一个检测机器人是否到达目标状态的辅助函数。
在这里插入图片描述
在这里插入图片描述

function [state, closeGripper, t, wpts] = commandLogic(inputTime, configSequence, robotConfig, gripperStateReached)

% 持久化变量,用于保存运动状态和时间重置值
persistent motionState
persistent resetTimeValue

% 设置变量
posTgtThreshold = 0.015; % 位置目标的阈值,表示误差允许范围

% 初始化持久化变量
if isempty(motionState)
    motionState = 0; % 初始运动状态
end
if isempty(resetTimeValue)
    resetTimeValue = 0; % 初始时间重置值
end

% 输出状态和时间
state = motionState; % 当前运动状态
t = inputTime - resetTimeValue; % 从重置时间开始的相对时间

% 初始化输出到初始状态
wpts = configSequence(:,1:2); % 设置初始的关节角度路径
closeGripper = false; % 初始抓取器状态为打开

% 根据当前运动状态执行不同的动作
switch motionState
    case 1
        % 抓取:从接近位置移动到抓取位置,并打开抓取器
        wpts = configSequence(:,2:3);
        closeGripper = false;
    case 2
        % 关闭抓取器
        wpts = [configSequence(:,3) configSequence(:,3)];
        closeGripper = true;
    case 3
        % 抓取后移开
        wpts = configSequence(:,3:4);
        closeGripper = true;
    case 4
        % 移动到放置前的位置
        wpts = configSequence(:,4:5);
        closeGripper = true;
    case 5
        % 移动到放置位置
        wpts = configSequence(:,5:6);
        closeGripper = true;
    case 6
        % 打开抓取器
        wpts = [configSequence(:,6) configSequence(:,6)];
        closeGripper = false;
    case 7
        % 放置后移开
        wpts = configSequence(:,6:7);
        closeGripper = false;
    case 8
        % 循环回到抓取接近位置
        wpts = configSequence(:,[7 2]);
        closeGripper = false;
end
   
% 获取当前状态
trajEndConfigReached = endStateReached(robotConfig, wpts, posTgtThreshold);

% 根据状态和时间重置情况推进运动状态
if trajEndConfigReached && gripperStateReached
    % 推进状态并重置时间
    motionState = mod(motionState, 7) + 1;
    resetTimeValue = inputTime;
end

end

% 辅助函数:判断机器人是否到达目标状态
function isReached = endStateReached(config, wpts, tgtThreshold)
    
    % 初始化输出
    isReached = false;
    
    % 标记不包括抓取器的关节状态索引
    armStateExclGripperIdx = 10:16;
    
    % 提取关节配置(忽略抓取器位置)
    armConfig = config(armStateExclGripperIdx,:);
    armTarget = wpts(armStateExclGripperIdx,2);% 提取第2列,代表该关节在目标路径点中的目标位置
    
    % 检查机械臂状态是否达到目标路径点
    diffWpts = zeros(length(armStateExclGripperIdx),1);
    diffWpts(:,:) = abs(armConfig - armTarget);
    errorStatus = diffWpts < tgtThreshold; % 判断误差是否在阈值范围内
    if all(errorStatus)
        isReached = true; % 如果所有关节都在误差范围内,则认为到达目标
    end
end

代码功能解释:

  1. commandLogic 函数

    • 这个函数根据机器人当前的运动状态和时间来确定机器人下一步的动作。动作包括抓取、移动、放置等操作。motionState 保存当前的运动阶段,resetTimeValue 用于跟踪时间的重置。
    • 函数返回当前的运动状态(state)、抓取器的状态(closeGripper)、相对时间(t),以及关节角度路径(wpts)。
  2. endStateReached 函数

    • 这是一个辅助函数,用于检查机器人当前的关节角度配置是否到达了目标状态。通过计算配置和目标之间的差异,并与阈值进行比较,判断是否到达目标。

主要流程:

  • 机器人在各个状态间切换,依次执行抓取、移动和放置的动作。
  • 在每个状态中,根据 motionState 确定机器人应该执行的具体动作,并生成对应的关节角度路径。
  • 使用 endStateReached 函数判断当前动作是否完成,并在完成后推进到下一个状态。

场景描述

机器人的任务是从桌子上抓取一个物体,然后将其移动到另一个位置并放下。

在这个例子中,我们的 configSequence 包含了一系列的关节角度配置,每个配置对应于机器人的一个特定姿态。

代码执行流程

  1. 初始状态(motionState = 0)初始位置->抓取前的接近位置

    • 机器人开始时处于初始状态。代码会输出初始的 wptscloseGripper 状态。
    • 此时,wptsconfigSequence 的第1列和第2列,对应于初始位置到抓取前的接近位置。
  2. 状态1:抓取前的接近位置->抓取位置

    • 当机器人接近物体时,motionState 被设置为1。
    • 代码中的 wpts 被设置为 configSequence 的第2列和第3列,这表示机器人从接近位置移动到抓取位置。
    • closeGripper = false 表示抓取器保持打开状态。
  3. 状态2:闭合夹爪抓取物体

    • 机器人到达抓取位置后,motionState 被设置为2。
    • 代码中的 wpts 被设置为 configSequence 的第3列(抓取位置),并且 closeGripper = true,表示抓取器闭合抓住物体。
  4. 状态3:抬起物体:抓取位置->抓取后的离开位置-

    • 抓取完成后,motionState 被设置为3。
    • wpts 被设置为 configSequence 的第3列和第4列,这表示机器人从抓取位置抬起物体并移动到中间位置。
    • closeGripper = true 表示抓取器保持闭合状态。
  5. 状态4:抓取后的离开位置->放置前的位置

    • 机器人开始移动物体,motionState 被设置为4。
    • wpts 被设置为 configSequence 的第4列和第5列,表示机器人移动到放置前的位置。
    • closeGripper = true 表示抓取器继续保持闭合状态。
  6. 状态5:放置前的位置->放置位置

    • 机器人移动到最终放置位置,motionState 被设置为5。
    • wpts 被设置为 configSequence 的第5列和第6列,表示机器人移动到放置位置。
    • closeGripper = true 表示抓取器仍然闭合。
  7. 状态6:打开夹爪放下物体

    • 机器人放下物体,motionState 被设置为6。
    • wpts 被设置为 configSequence 的第6列(放置位置),并且 closeGripper = false,表示抓取器打开,物体被放下。
  8. 状态7:放置位置->放置后的位置

    • 放置完成后,motionState 被设置为7。
    • wpts 被设置为 configSequence 的第6列和第7列,表示机器人离开放置位置。
    • closeGripper = false,表示抓取器保持打开状态。
  9. 状态8:循环回到抓取前的接近位置

    • 机器人完成一次循环操作,motionState 被设置为8。
    • wpts 被设置为 configSequence第7列和第2列,表示机器人回到抓取前的接近位置,为下一次抓取做准备。
    • closeGripper = false 表示抓取器继续保持打开状态。

总结

这个流程展示了机器人如何通过状态机逐步执行抓取和放置操作。每个状态对应于机器人的一个动作步骤,状态的推进是通过检查机器人是否到达了目标姿态(endStateReached 函数)以及抓取器状态是否达成来实现的。整个过程是自动化的,机器人可以根据预设的 configSequence 依次完成复杂的操作任务。

初始状态 (motionState = 0)

motionState 的初始值为 0 时,代码逻辑在 motionState 为 0 时并没有定义任何具体的动作(即 switch 语句中没有对 motionState = 0 的处理)。这意味着,在初始状态 motionState = 0 下,机器人不会执行任何特定的运动。

示例流程更新

假设机器人在 motionState = 0 的初始状态下开始任务,然后任务流程如下:

步骤 0: 初始状态(motionState = 0

  • 机器人状态: 在这个状态下,机器人可能处于待机或初始化状态,等待接收到执行任务的命令。
  • 输出:
  • wpts = configSequence(:,1:2),表示机器人在 configSequence 的第1列到第2列的关节角度配置之间进行移动。
  • closeGripper = false,表示抓取器保持打开状态。
状态0:仿真时间1s

在这里插入图片描述

状态0(+状态1):仿真时间2s

在这里插入图片描述

状态0+状态1:仿真时间3s

在这里插入图片描述

状态0+状态1:仿真时间3.9s

在这里插入图片描述
在这里插入图片描述

状态0+状态1+状态2(+状态3):仿真时间4s

在这里插入图片描述
在这里插入图片描述

状态0+状态1+状态2+状态3:仿真时间5s

在这里插入图片描述

状态0+状态1+状态2+状态3:仿真时间6s//状态0+状态1+状态2+状态3+(状态4):仿真时间6.1s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4:仿真时间7s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4:仿真时间8s//状态0+状态1+状态2+状态3+状态4(+状态5):仿真时间8.1s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4+状态5:仿真时间9s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4+状态5:仿真时间10s//状态0+状态1+状态2+状态3+状态4+状态5+(状态6):仿真时间10.1s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4+状态5+状态6+状态7:仿真时间11s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4+状态5+状态6+状态7:仿真时间12s//状态0+状态1+状态2+状态3+状态4+状态5+状态6+状态7(+状态8):仿真时间12.2s

在这里插入图片描述

状态0+状态1+状态2+状态3+状态4+状态5+状态6+状态7+状态8:仿真时间13s

检查是否到达初始目标

  • 逻辑: 函数 endStateReached 检查机器人是否已经到达初始位置。
  • 动作: 一旦机器人到达 configSequence 的第2列位置且抓取器状态符合要求 (gripperStateReached = true),则 motionState 从 0 递增到 1,并且 resetTimeValue 被重置为当前时间。这将启动实际的任务序列。
步骤 1: 接近抓取位置(motionState = 1
  • 动作: 机器人将其关节角度调整到 configSequence 的第2列到第3列之间的位置,开始接近抓取位置。
  • 抓取器状态: 抓取器保持打开状态 (closeGripper = false)。
后续任务
  • 随着任务的进行,motionState 从 1 到 7 逐步递增,每个状态对应一个任务步骤,如抓取、移动、放置等。
  • 在每个状态下,机器人检查是否到达目标位置,并根据需要执行相应的动作。

总结

  • motionState = 0: 机器人处于初始化状态,等待进入任务流程。当机器人到达初始位置时,状态会递增到 1,开始任务。
  • 这种设计使得机器人在启动时有一个准备阶段,可以用于初始化系统,确保在进入实际任务前一切就绪。

Trapezoidal Velocity Profile Trajectory模块

在这里插入图片描述
在这里插入图片描述
该截图显示的是 Simulink 中 “Trapezoidal Velocity Profile Trajectory” 模块的参数设置窗口。这个模块用于生成通过多个路径点(waypoints)的轨迹,并使用梯形速度曲线来进行运动规划。以下是这个模块的详细功能解释:

模块功能

Trapezoidal Velocity Profile Trajectory 模块生成通过多个路径点的轨迹,使用梯形速度曲线来控制运动。梯形速度曲线具有加速、恒速和减速三个阶段,在这种曲线下,系统能够平稳地从一个路径点过渡到下一个路径点。

参数解释

  1. Waypoint source (路径点来源)

    • External (外部):此选项表示路径点将从模块的输入端口提供,允许用户动态地传递路径点到模块中。
    • 当选择 “External” 时,用户需要在外部为模块提供一个路径点矩阵,路径点的矩阵大小为 N*P,其中N是轴的数量,P 是路径点的数量。
  2. Parameters (参数)

    • Number of parameters (参数数量):这个下拉菜单用于设置梯形速度曲线的参数数量。用户可以选择一到多个参数,这些参数用于控制速度曲线的形状,例如结束时间、最大速度、最大加速度等。
    • Parameter 1: End Time (参数1:结束时间):此参数指定每段轨迹的结束时间。
      • Parameter source (参数来源):设置参数值的来源,可以是 Internal(内部),即由用户在模块中手动指定参数,或者是 External(外部),由外部输入端口提供参数值。
      • End time (结束时间):指定内部结束时间,单位为秒。
  3. 仿真方式 (Simulation mode)

    • 解译执行 (Interpreted Execution):表示模块将在 MATLAB 环境下解释执行,这通常比生成代码执行要快,但在硬件实时执行或代码生成场景下可能需要切换为生成代码的模式。

总结

这个模块通过生成梯形速度曲线来控制运动系统的路径跟踪,确保系统在加速、恒速和减速过程中的速度平滑变化。路径点可以从外部输入提供,而速度曲线的形状可以通过内部或外部参数来控制。

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

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

相关文章

外卖系统开发:如何打造一个无缝衔接的用户体验?

在如今高度竞争的外卖市场中&#xff0c;用户体验决定了一个外卖平台的成败。为了打造一个无缝衔接的用户体验&#xff0c;外卖系统的每一个环节都需要精心设计和优化&#xff0c;从用户下单到订单配送&#xff0c;每一步都必须顺畅无阻。本文将探讨如何通过技术手段和代码实现…

使用Python+os+fnmatch搜索文件和目录

一、搜索/home/Download目录下的zip压缩文件 import os from fnmatch import fnmatch# 搜索与pattern匹配的文件和目录 def find_file(pattern, path):result []for root, dirs, files in os.walk(path):for name in files:if fnmatch(name, pattern):result.append(os.path.…

R语言function快速掌握-自定义函数

R语言在生物学中运用的比较多的还是吊包然后使用内置函数进行一次性工作&#xff0c;但是生物信息与计算生物学领域确实低估和忽视了R语言在循环和自定义函数方面的优势。 在R语言中&#xff0c;function 是一个核心概念&#xff0c;它允许用户创建可重用的代码块来执行特定的…

【PHP报错已解决】‘/www/wwwroot/xxxxxx/public/../thinkphp/start.php‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 作为开发者&#xff0c;遇到报错信息是在所难免的。然而&#xff0c;有些报错信息可能会让我们感到困惑&…

每日OJ_牛客_淘宝网店(日期模拟)

目录 牛客_淘宝网店&#xff08;日期模拟&#xff09; 解析代码 牛客_淘宝网店&#xff08;日期模拟&#xff09; 淘宝网店__牛客网 解析代码 这是一个变相的日期计算器。只不过2、3、5、7、11月算1天&#xff0c;其他7个月算2天。 既然是一个变相的日期计算器&#xff0c;那…

24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III

目录 198. 打家劫舍题目描述题解 213. 打家劫舍 II题目描述题解 337. 打家劫舍 III题目描述题解 打家劫舍的一天 &#x1f608; 198. 打家劫舍 点此跳转题目链接 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷…

初出茅庐:怎样获得实习机会——之找到一份工作

如果你刚开始工作&#xff0c;找到工作的最好和最简单的方法之一就是【实习】&#xff1b;许多技术类公司只雇佣实习生或者经验丰富的软件开发者&#xff0c;实习为公司提供了一个独一无二的机会&#xff0c;使其可以在雇用潜在员工之前对他们进行充分的评估。但实习的机会不是…

Pytorch升级之旅——基础概念

目录 一、人工智能简史 三次浪潮 DL,ML,AI三者之间的关系 二、模型评价指标 混淆矩阵 Overall Accuracy ​编辑 Average accuracy Kappa系数 Recall Precision F1 PR曲线 置信度 IOU AP mAP 三、常用包Numpy、pandas、matplotlib Numpy pandas matplotlib…

二叉树【2】遍历

先中后序 先序遍历&#xff1a;根左右 中序遍历&#xff1a;左跟右 后序遍历&#xff1a;左右跟 例图 先序性质 中序性质 后序性质 先序中序确定二叉树 后序中序确定二叉树 先序后序不能确定。 层序&#xff1a;广度优先搜索 如果需要修改树的元素&#xff0c;则需no…

机器学习(第六关--文本特征抽取)

以下内容&#xff0c;皆为原创&#xff0c;制作实属不易&#xff0c;感谢大家的观看和关注。 在此真诚的祝愿大家&#xff0c;生活顺顺利利&#xff0c;身体健健康康&#xff0c;前途似锦。 第一关&#xff1a;机器学习概念和流程http://t.csdnimg.cn/IuHh4第二关&#xff1a;…

【功能实现】Vue3中导航栏效果实现

功能需求&#xff1a; 点击导航后会跳转到相应的页面当页面在顶部时&#xff0c;导航栏模块背景是透明的当页面向下滚动超过150px时&#xff0c;导航栏背景为白色 效果实现&#xff1a; 1.准备列表 将导航栏区域的类名设置为动态&#xff0c;即通过判断isTransparent是否存在…

浅谈【数据结构】链表之其他形态

目录 1、带头结点的链表 2、创建步骤 3、循环链表 3.1创建循环链表 3.2循环链表的遍历 3.3链表中的闭环 4、静态链表 4.1静态链表初始化 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#…

在群晖上安装Git客户端

什么是 Git &#xff1f; Git 是一个分布式版本控制系统&#xff0c;提供了命令行界面&#xff08;CLI&#xff09;以及图形用户界面&#xff08;GUI&#xff09;两种方式进行操作。与 CVS、Subversion 一类的集中式版本控制工具不同&#xff0c;它采用了分布式版本库的作法&am…

LinkedList添加和删除方法的源码分析超详细

我们基于下面这段代码进行分析 进入add方法后调用的是linkLast方法 这是add方法真正的底层逻辑&#xff0c;首先将last值赋给l节点&#xff0c;此时的l为null&#xff0c;然后再创建新节点的时候将l作为前向指针传入&#xff0c;将节点中的next指针也赋值为null&#xff0c;之后…

PHP反序列化二

1.反序列化基础利用 2.pop链 POP链: POP(面向属性编程&#xff09;链是指从现有运行环境中寻找一系列的代码或指令调用&#xff0c;然后根据需求构造出一组连续的调用链。 反序列化利用就是要找到合适的POP链。其实就是构造一条符合原代码需求的链条&#xff0c;去找到可以控…

基于YOLOv8的无人机高空红外(HIT-UAV)检测算法,新的混合型扩张型残差注意力(HDRAB)助力涨点(二)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的无人机高空红外&#xff08;HIT-UAV&#xff09;检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 &#x1f4a1;&#x1f4a1;&#x1f4a1;一种新的混合型扩张型残差注意力(HDRAB…

Springboot基础------控制器、过滤器、拦截器、监视器

控制器 控制器用于接收和响应用户发送的请求&#xff0c;一个控制器类需要被Controller注解&#xff1a;&#xff08;即controller层&#xff09; Controller class TestController { }注&#xff1a; RestController实际上是Controller和ResponseBody的简化版&#xff0c;被…

数据仓库系列 3:数据仓库的主要组成部分有哪些?

你是否曾经好奇过,当你在网上购物或使用手机应用时,背后的数据是如何被存储和分析的?答案就在数据仓库中。本文将为你揭开数据仓库的神秘面纱,深入探讨其核心组成部分,以及这些组件如何协同工作,将海量数据转化为有价值的商业洞察。 目录 引言:数据仓库的魔力1. 数据源和数据…

STM32 | STM32 FLASH第十二天(实现代码STM32CUBEMX)

点击上方"蓝字"关注我们 01、FLASH >>> 1、STM32 FLASH Flash内部存储器,内存器件的一种,是一种非易失性( Non-Volatile )内存。 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元…

mac 虚拟机PD19运行E-prime实验遇到E-prime unable to set display mode:0*80004001问题解决

作者&#xff1a;50% unable to set display mode问题 总结&#xff1a; 1. 修改该Experiment的Devices中的Dispaly为640*680,或800*600。 2. 右键开始菜单中的E-Studio程序&#xff0c;打开文件所在位置&#xff0c;然后右键该文件&#xff0c;选择属性-兼容性&#xff0c;勾选…