主要内容

使用ROS在凉亭中拾取和放置工作流程

本示例展示了如何为KINOVA®Gen3等机器人操作器设置端到端拾取和放置工作流程,并在Gazebo物理模拟器中模拟机器人。

概述

本例使用KINOVA Gen3操作器将对象识别并回收到两个箱子中。这个例子使用了五个工具箱中的工具:

  • 机器人系统工具箱™用于对机械手进行建模和仿真。

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

  • ROS工具箱™使用用于将MATLAB连接到Gazebo。

  • 计算机视觉工具箱而且深度学习工具箱™用于凉亭内模拟摄像机的目标检测。

本例基于以下相关示例中的关键概念:

凉亭机器人仿真与控制

为KINOVA Gen3机器人启动基于ros的模拟器,并配置与机器人模拟器的MATLAB®连接。

本例使用一个可下载的虚拟机(VM)。如果您以前从未使用过它,请参见开始与凉亭和模拟乌龟机器人(ROS工具箱)

  • 启动Ubuntu®虚拟机桌面。

  • 在Ubuntu桌面上,单击凉亭回收世界图标开始为这个例子建造凉亭世界。

  • 在Gazebo中指定ROS主机的IP地址和端口号,以便MATLAB®可以与机器人模拟器通信。本例中,Gazebo中的ROS主机使用的IP地址为192.168.203.131显示在桌面上。调整rosIP变量。

  • 使用启动ROS 1网络rosinit

rosIP =“192.168.203.131”%启用ros的机器的IP地址rosinit (rosIP, 11311);初始化ROS连接
ROS_IP环境变量的值192.168.31.1将用于为ROS节点设置发布的地址。使用NodeURI http://192.168.31.1:51073/初始化全局节点/matlab_global_node_36570

通过单击图标初始化凉亭世界后,虚拟机将一个KINOVA Gen3机器人手臂加载在一个桌子上,两边各有一个回收箱。为了模拟和控制Gazebo中的机械臂,虚拟机包含ros_kortexROS包,由KINOVA提供。

这些包使用ros_control控制关节到所需的关节位置。有关使用虚拟机的其他详细信息,请参见开始与凉亭和模拟乌龟机器人(ROS工具箱)

Stateflow图表

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

编辑exampleHelperFlowChartPickPlaceROSGazebo.sfx

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

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

  • 执行取放工作流

有关拾取放置步骤的高级描述,请参见使用MATLAB的状态流

打开和关闭夹手

激活夹持器的命令,exampleCommandActivateGripperROSGazebo,发送一个动作请求来打开和关闭Gazebo中实现的夹持器。要发送打开夹持器的请求,使用以下代码。注意:所显示的示例代码只是说明了该命令的功能。不要跑。

[grpact,gripGoal] = rosactionclient(' / my_gen3 / custom_gripper_controller / gripper_cmd ');gripperCommand = rosmessage(“control_msgs / GripperCommand”);gripperCommand。位置= 0.0;gripGoal。Command = gripperCommand;sendGoal (gripAct gripGoal);

将操作器移动到指定的姿态

commandMoveToTaskConfig命令功能用于将机械手移动到指定的姿态。

规划

路径规划使用生成从初始到所需任务配置的简单任务空间轨迹trapveltraj而且transformtraj.有关计划和执行轨迹的详细信息,请参见使用KINOVA Gen3机械手计划和执行任务和关节空间轨迹

ROS中的关节轨迹控制器

在生成机器人要遵循的关节轨迹后,commandMoveToTaskConfig以期望的采样率对轨迹进行采样,将其打包到联合轨迹ROS消息中,并向KINOVA ROS包中实现的联合轨迹控制器发送动作请求。

检测和分类场景中的物体

的函数commandDetectParts而且commandClassifyParts使用机器人的模拟末端执行器摄像机馈送,并应用预先训练好的深度学习模型来检测可回收部件。该模型以相机帧作为输入,并输出对象的2D位置(像素位置)和它所需的回收类型(蓝色或绿色垃圾箱)。图像帧上的2D位置映射到机器人基帧。

深度学习模型训练:凉亭图像的获取和标记

检测模型使用在凉亭世界的模拟环境中获得的一组图像进行训练,两类物体(瓶子,罐头)放置在桌子的不同位置。这些图像是从机器人上的模拟摄像头获取的,该摄像头沿着水平和垂直平面移动,以从许多不同的摄像头角度获得物体的图像。

然后使用图片标志(计算机视觉工具箱)app,为YOLO v2检测模型创建训练数据集。trainYOLOv2ObjectDetector(计算机视觉工具箱)训练模型。要了解如何在MATLAB中训练YOLO v2网络,请参见训练YOLO v2车辆检测网络(计算机视觉工具箱)

当机器人处于主位置时,将训练好的模型部署到机载摄像机获取的单幅图像上进行在线推理。的检测(计算机视觉工具箱)函数返回检测到的对象的包围框的图像位置,以及它们的类,然后用于查找对象顶部部分的中心位置。使用简单的相机投影方法,假设物体的高度已知,将物体的位置投影到世界中,最后作为选择物体的参考位置。与边界框关联的类决定放置对象的bin。

开始选择和放置任务

本仿真使用KINOVA Gen3机械手Robotiq夹附呈。加载机器人模型.mat文件作为rigidBodyTree对象。

负载(“exampleHelperKINOVAGen3GripperROSGazebo.mat”);

初始化拾取和放置协调器

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

initialRobotJConfig = [3.5797 -0.6562 -1.2507 -0.7008 0.7303 -2.0500 -1.9053];endEffectorFrame =“爪”

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

coordinator = exampleHelperCoordinatorPickPlaceROSGazebo(机器人,initialRobotJConfig, endEffectorFrame);

指定主配置和放置对象的两个姿势。

协调员。HomeRobotTaskConfig = getTransform(robot, initialRobotJConfig, endEffectorFrame);协调员。PlacingPose{1} = trvec2tform([[0.2 0.55 0.26]])*axang2tform([0 0 1 pi/2])*axang2tform([0 1 0 pi]);协调员。PlacingPose{2} = trvec2tform([[0.2 -0.55 0.26]])*axang2tform([0 0 1 pi/2])*axang2tform([0 1 0 pi]);

运行并可视化模拟

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

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

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

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

结束拾取和放置任务

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

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

观察模拟状态

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

想象一下在凉亭里的拾取和放置动作

凉亭世界展示了机器人在工作区域移动零件到回收箱。机器人继续工作,直到所有部件都放置好。当检测步骤四次都没有找到任何部件时,状态流图退出。

如果比较字符串(答案,“是的”协调员。NumDetectionRuns < 4%等待未检测到部件。结束结束

完成示例后关闭ROS网络。

rosshutdown
使用NodeURI http://192.168.31.1:51073/关闭全局节点/matlab_global_node_36570

The MathWorks, Inc.版权所有