主要内容

使用Matlab的StateFlow挑选工作流程

此示例显示了如何设置端到端的选择和将工作流放置为像Kinova®Gen3这样的机器人机械手。

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

概述

此示例使用KINOVA Gen3操作器对检测到的物体进行分类,并将它们放在长凳上。该示例使用了来自四个工具箱的工具:

  • 机器人系统工具箱™用于模拟,模拟和可视化操纵器,以及用于碰撞检查。

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

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

此示例构建了两个相关示例的关键概念:

Stateflow图表

此示例使用StateFlow图表在示例中计划任务。打开图表以检查内容并在图表执行期间遵循状态转换。

编辑exampleHelperFlowChartPickPlace.sfx

图表说明了操纵器如何与物体或部件相互作用。它包括基本的初始化步骤,然后是两个主要部分:

  • 识别零件并确定放置它们的位置

  • 执行挑选工作流程

初始化机器人和环境

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

识别零件并确定放置它们的位置

在识别阶段的第一步,必须对部件进行检测。的exampleCommand探测器函数直接给出对象姿势。使用自己的对象检测算法替换此类基于传感器或对象。

接下来,必须对部件进行分类。的exampleCommandClassifyparts.函数将部件分类为两种类型,以确定放置它们的位置(顶层或底层)。同样,您可以使用任何对部件进行分类的方法来替换此函数。

执行挑选工作流程

一旦识别了零件并分配了目的地,操纵器必须迭代部分并将它们移动到相应的表中。

拿起物体

拣选相将机器人移动到对象,拾取它,并移动到安全位置,如下图所示:

的exampleCommandcomputegraspospospospose.函数计算抓握姿势。这个类为每个部分计算一个任务空间抓取位置。接近和达到该部分的中间步骤也相对于该对象定义。

这个机器人使用模拟的抓手抓取物体。当抓手被激活时,exampleCommandActivateGripper添加零件的碰撞网格到刚性小组细胞机器人的表示,模拟抓住它。碰撞检测在附加时包括此对象。然后,机器人移动到远离其他部件的缩回位置。

放置物体

然后机器人将物体放在适当的架子上。

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

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

大多数任务执行包括指示机器人在不同指定的姿势之间移动。这examplehelperplanexecutetraject atoptorypickplace函数使用非线性模型预测控制器定义求解器(参见非线性MPC(模型预测控制工具箱))计算可行,无碰撞的优化参考轨迹使用nlmpcmove(模型预测控制工具箱)核对机构障碍物被表示为球体,以确保非线性模型预测控制算法的确定中约束雅加诺的准确近似(见[1])。然后,辅助功能在计算 - 转矩控制下模拟操纵器的运动,因为它跟踪使用的参考轨迹关节训练局对象,并更新可视化。通过从状态流程图调用helper函数examplecommandmovetottaskconfig.,它定义了正确的输入。

此工作流程将详细介绍使用Kinova Gen3操纵器计划和执行无碰撞轨迹.控制器用于确保无碰撞运动。对于已知路径是无障碍物的更简单的轨迹,可以使用轨迹生成工具来执行轨迹,并使用操纵器运动模型进行模拟。看使用KINOVA Gen3机械手规划和执行任务和关节空间轨迹

StateFlow Chart中的任务计划

此示例使用StateFlow图表将工作流程指向MATLAB®中的工作流程。有关创建状态流图的更多信息,请参阅创建状态流图的执行作为MATLAB对象(Stateflow)

stateflow图表通过使用命令函数指导MATLAB中的任务执行。当命令完成执行时,它会发送一个输入事件若要唤醒图表并继续任务执行的下一步,请参见执行独立图表(Stateflow)

运行并可视化模拟

这个模拟使用了带有Robotiq夹持器的KINOVA Gen3机械手。从.mat文件作为刚性小组细胞目的。

负载('examplehelperkinovagen3grippercoll.mat');

初始化选择和放置协调员

设置初始机器人配置。通过提供机器人模型,初始配置和结束效应名称,创建处理机器人控制的协调器。

currentrobotjconfig = homeconfiguration(机器人);协调员= examplehelpercoordinatorpickplace(Robot,currentrobotjconfig,“夹子”);

指定home配置和放置不同类型对象的两种姿态。

coordinator.homerobottaskconfig = trvec2tform([0.4,0,0.6])* AXANG2TFORM([0 1 0 PI]);coordinator.placingpose {1} = trvec2tform([0.23 0.62 0.33])* AXANG2TFORM([0 1 0 PI]);coordinator.placingpose {2} = trvec2tform([0.23-0.62 0.33])* AXANG2TFORM([0 1 0 PI]);

运行并可视化模拟

将协调器连接到状态流程图。一旦开始,状态流程图负责不断地检查检测对象的状态,将它们取出并将它们放置在正确的暂存区域。

coordinator.flowchart = examplehelperflowchartpickplace(“协调员”协调员);

使用一个对话框来开始拾取放置任务的执行。点击是的在对话框中开始模拟。

答案= questdlg(“你想现在开始挑选挑选工作吗?”...'开始工作'“是的”“不”“不”);转变回答案件“是的”%触发事件开始选择和放置状态流图表coordinator.flowchart.startpickplace;案件“不”%结束挑选coordinator.flowchart.endpickplace;删除(Coordinator.FlowChart);删除(协调员);结尾

结束Pick-and-Place任务

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

%coordinator.flowchart.endpickplace;%删除(coordinator.FlowChart);%删除(协调);

观察模拟状态

在执行期间,每个时间点处的活动状态在状态流图中以蓝色突出显示。这有助于跟踪机器人的何时何时。您可以单击“子系统”以查看状态的状态。

想象取放动作

示例使用InteractiveIgidododtree.用于机器人可视化。可视化显示工作区域中的机器人,因为它在周围移动部分。机器人避免了环境(蓝色圆筒)中的障碍物,并根据其分类将物体放在顶部或底架上。机器人继续工作,直到放置所有部件。

参考

[1] Schulman,J.等人。“具有顺序凸优化和凸碰撞检查的运动规划。”国际机器人研究杂志33.9(2014):1251-1270。