在MATLAB中使用Stateflow实现取放工作流

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

概述

本例使用KINOVA Gen3操作器将检测到的对象分类到货架上。这个例子使用了四个工具箱中的工具:

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

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

  • Stateflow®用于调度在实施例和步骤中从任务到任务的高级任务。

这个例子基于两个相关例子中的关键概念:

Stateflow框图

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

编辑exampleHelperFlowChartPickPlace.sfx

图表使然如何与对象或零件的机械手进行交互。它由基本的初始化步骤,后面两个主要部分:

  • 确定零件的位置和位置

  • 拾起并定位执行工作流

初始化机器人和环境

首先,图表创建了一个包含了第3代Kinova操纵的环境中,三个部分进行排序,用来排序的货架,和一个蓝色的障碍。接下来,机器人移动到起始位置。

识别零件并确定将它们

在识别阶段的第一步骤中,所述部件必须被检测到。该exampleCommandDetectParts功能直接给出对象的姿势。根据您的传感器或物体自己的对象检测算法替换此类。

接下来,零件必须分类。该exampleCommandClassifyParts功能进行分类的部件为两种类型,以确定在何处放置它们(顶部或底部货架)。同样,你可以用零件分类的任何方法替换该功能。

拾起并定位执行工作流

一旦确定了部件并分配了它们的目的地,机械手就必须遍历部件并将它们移动到适当的表中。

拿起物体

采摘相位移动机器人的对象,把它捡起,并移动到一安全位置,如图所示,下图中:

该exampleCommandComputeGraspPose函数计算的把握姿势。该类计算每个部分任务空间抓位置。对于接近并到达朝向零件中间步骤也被定义相对于所述对象。

这个机器人用一个模拟的气动夹具来抓取物体。当夹持器被激活时,检查命令ActivateGripper增加了碰撞网格的部分到rigidBodyTree表示机器人,它模拟抓取它。碰撞检测包括这个对象,而它是附加的。然后,机器人移动到一个远离其他部分的缩回位置。

将对象

然后,机器人把适当的货架上的对象。

与拾取工作流程中,放置的方法和缩回位置而计算相对于已知期望的放置位置。夹持器是使用exampleCommand停用ActivateGripper中可除去部从所述机器人。

移动操控器到指定的姿态

大部分的任务执行包括指导机器人在不同的指定姿势之间移动。的exampleHelperPlanExecuteTrajectoryPickPlace函数定义使用非线性模型预测控制器解算器(见非线性MPC(模型预测控制工具箱)),该计算使用是可行的,无碰撞的优化的参考轨迹nlmpcmovecheckCollision碰撞检查计算使用类似的方法操纵和环境检查与机械手的环境碰撞。的障碍被表示为球体,以确保在非线性模型预测控制算法的definiton该限制雅可比的精确的近似值(参看[1])。辅助函数然后仿真计算转矩控制下的操纵器的运动,因为它使用跟踪参考轨迹jointSpaceMotionModel对象,并更新可视化。helper函数通过exampleCommand从Stateflow图表中调用MoveToTaskConfig,它定义了正确的输入。

详细讨论了该工作流计划和使用第3代KINOVA机械臂执行无碰撞轨迹。控制器用于保证无碰撞运动。对于已知无障碍物路径的简单轨迹,可以使用轨迹生成工具执行轨迹,并使用机械手运动模型进行仿真。看到使用第3代KINOVA机械臂计划和执行任务 - 与关节空间轨迹

状态图中的任务调度

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

的状态流图表通过使用命令功能指示的任务执行在MATLAB。当命令执行完毕时,它发送输入事件唤醒图表并进行到任务执行的下一步骤中,看到执行一个独立走势(Stateflow)。

运行和可视化仿真

这个仿真使用了带有Robotiq夹持器的KINOVA Gen3机械手。

加载('exampleHelperKINOVAGen3RobotiqGripper.mat');

初始化Pick和Place协调器

设置初始机器人配置。通过给出机器人模型、初始配置和末端执行器名称来创建协调器。

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

指定拾起并定位属性。

coordinator.HomeRobotTaskConfig = trvec2tform([0.4,0,0.6])* axang2tform([0 1 0π);coordinator.PlacingPose {1} = trvec2tform([[ -  0.2 0.55 0.46]])* axang2tform([1 0 0 -pi / 2]);coordinator.PlacingPose {2} = trvec2tform([[ -  0.2 0.55 0.63]])* axang2tform([1 0 0 -pi / 2]);

运行和可视化仿真

协调员连接到Stateflow的图表。一旦启动,Stateflow框图负责通过检测对象,接他们,并把他们在正确的临时区域的状态持续下去。

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

使用一个对话框,开始挑选和地方执行任务。

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

结束选择-放置任务

该Stateflow框图将完成三次尝试失败后自动执行检测新对象。提前结束拾取和放置任务,取消,并在命令窗口中执行的代码或按下Ctrl + C以下行。

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

观察仿真状态

在执行期间,在每个时间点的活动状态以蓝色突出显示的状态流图表英寸这有助于什么样的机器人呢,当保持跟踪。你可以通过子系统点击查看在行动状态的细节。

可视化的挑选和地方行动

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

参考

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