主要内容

MATLAB中使用Stateflow的拾取和放置工作流

这个例子展示了如何为KINOVA®Gen3这样的机器人机械手设置端到端挑选和放置工作流。

在本例中实现的拾取和放置工作流可以适用于不同的场景、规划者、模拟平台和对象检测选项。本文给出的例子采用模型预测控制进行规划和控制,并在MATLAB中对机器人进行仿真。其他用途,请参阅:

概述

本例使用KINOVA Gen3操作器对检测到的对象进行排序,并将它们放置在工作台上。该示例使用了来自四个工具箱的工具:

  • 机器人系统工具箱™用于对机械手建模、仿真和可视化,并用于碰撞检查。

  • 模型预测控制工具箱优化工具箱™用于生成优化的、无碰撞的轨迹供机械手跟随。

  • Stateflow®用于调度示例中的高级任务,并从一个任务到另一个任务。

这个例子建立在两个相关例子的关键概念之上:

Stateflow图表

本示例使用状态流图来调度示例中的任务。在图表执行期间,打开图表检查内容并跟踪状态转换。

编辑exampleHelperFlowChartPickPlace.sfx

该图表说明了机械手如何与物体或部件相互作用。它由基本的初始化步骤组成,接下来是两个主要部分:

  • 识别部件并确定放置位置

  • 拾起并定位执行工作流

初始化机器人和环境

首先,该图表创建了一个由Kinova Gen3操作机、要分类的三个部分、用于分类的货架和一个蓝色障碍物组成的环境。接下来,机器人移动到主位置。

识别零件并确定其放置位置

在识别阶段的第一步中,必须对部件进行检测。的exampleCommandDetectParts函数直接给出对象的姿态。用您自己的基于传感器或对象的对象检测算法替换这个类。

接下来,零件必须分类。的exampleCommandClassifyParts功能将部件分为两种类型,以确定在哪里放置它们(顶部或底部货架)。同样,您可以使用任何分类部件的方法来替换此函数。

拾起并定位执行工作流

一旦识别了部件并分配了它们的目的地,操纵器必须遍历这些部件并将它们移动到适当的表中。

拾起对象

拾取阶段将机器人移动到物体,拾取物体,移动到安全位置,如下图所示:

的exampleCommandComputeGraspPose函数计算抓握姿势。该类计算每个部分的任务空间抓取位置。接近和接近零件的中间步骤也相对于对象定义。

这个机器人用一个模拟的抓手抓取物体。当抓取器被激活时,使用exampleCommandActivateGripper将碰撞网格添加到rigidBodyTree机器人的表示,它模拟抓取它。碰撞检测包括这个物体,而它是附加的。然后,机器人移动到远离其他部分的缩回位置。

将对象

然后机器人将物体放在相应的架子上。

与拣选工作流一样,相对于已知的期望放置位置计算放置方法和缩回位置。抓取器使用exampleCommand去激活ActivateGripper,从机器人身上移除零件。

将机械手移动到指定的姿势

大部分的任务执行包括指令机器人在不同的指定姿态之间移动。的exampleHelperPlanExecuteTrajectoryPickPlace函数使用非线性模型预测控制器定义求解器(见非线性MPC(模型预测控制工具箱))来计算一个可行的、无碰撞的优化参考轨迹nlmpcmove(模型预测控制工具箱)checkCollision在非线性模型预测控制算法的定义中,将障碍表示为球体,以确保约束雅可比矩阵的精确逼近(见[1])。辅助函数然后模拟在计算扭矩控制下的机械手运动,因为它使用的是参考轨迹jointSpaceMotionModel对象,并更新可视化。通过从状态流图调用helper函数exampleCommandMoveToTaskConfig,它定义了正确的输入。

详细介绍了这个工作流KINOVA Gen3机械手无碰撞轨迹规划与执行.控制器用于确保无碰撞运动。对于已知无障碍物的更简单的轨迹,可以使用轨迹生成工具执行轨迹,并使用机械手运动模型进行仿真。看到使用KINOVA Gen3机械手规划和执行任务和关节空间轨迹

状态流程图中的任务调度

这个例子使用状态流程图来指导MATLAB®中的工作流。有关创建状态流程图的更多信息,请参见创建用于执行的状态流图作为MATLAB对象(Stateflow)

状态流程图在MATLAB中通过命令函数指导任务的执行。当命令执行完毕时,它发送一个输入事件要唤醒图表并继续执行任务的下一步,请参见执行独立图表(Stateflow)

运行并可视化模拟

该模拟使用KINOVA Gen3机械手与Robotiq夹持器。加载机器人模型从.mat文件作为rigidBodyTree对象。

负载(“exampleHelperKINOVAGen3GripperColl.mat”);

初始化拣选和放置协调器

设置机器人的初始配置。通过给出机器人模型、初始配置和末端执行器名称,创建处理机器人控制的协调器。

currentRobotJConfig = homeConfiguration(机器人);协调员= exampleHelperCoordinatorPickPlace (currentRobotJConfig的机器人“爪”);

指定放置不同类型物体的主配置和两个姿势。

协调员。HomeRobotTaskConfig = trvec2tform([0.4, 0, 0.6])*axang2tform([0 1 0 pi]); / /点击这里协调员。PlacingPose{1} = trvec2tform([0.23 0.62 0.33])*axang2tform([0 1 0 pi]);协调员。PlacingPose{2} = trvec2tform([0.23 -0.62 0.33])*axang2tform([0 1 0 pi]);

运行并可视化模拟

将协调器连接到状态流图。一旦启动,状态流程图负责连续检查检测对象的状态,将它们提取出来并将它们放置在正确的暂存区域。

协调员。流程图= exampleHelperFlowChartPickPlace (“协调员”协调员);

使用对话框来启动取放任务执行。点击是的在对话框中开始模拟。

回答= questdlg (“你想现在就开始找工作吗?”...“开始工作”“是的”“不”“不”);开关回答情况下“是的”%触发事件以启动状态流程图中的选择和放置coordinator.FlowChart.startPickPlace;情况下“不”%结束挑选和放置coordinator.FlowChart.endPickPlace;删除(coordinator.FlowChart);删除(协调);结束

结束pickand - place任务

在尝试检测新对象3次失败后,状态流程图将自动完成执行。要提前结束拾取和放置任务,取消注释并执行以下代码行,或者在命令窗口中按Ctrl+C。

% coordinator.FlowChart.endPickPlace;%删除(coordinator.FlowChart);%删除(协调);

观察模拟状态

在执行期间,状态流图中每个时间点的活动状态以蓝色突出显示。这有助于跟踪机器人的动作和时间。您可以单击子系统来查看运行状态的详细信息。

可视化挑选和放置动作

本例使用interactiveRigidBodyTree对机器人可视化。可视化显示机器人在工作区域移动部件。机器人避开环境中的障碍物(蓝色圆柱体),并根据物体的分类将其放置在顶部或底部的架子上。机器人继续工作,直到所有的部件都被放置好。

参考文献

舒尔曼等。带有顺序凸优化和凸碰撞检查的运动规划国际机器人研究杂志33.9(2014): 1251 - 1270。