控制和模拟多个仓库机器人
这个例子展示了如何控制和模拟在仓库设施或配送中心工作的多个机器人。机器人在设施周围开车,取下包裹,并将它们送到车站进行存储或处理。的基础上构建此示例为仓库机器人执行任务例如,驱动单个机器人在同一设施周围运行。
这个包排序场景可以在Simulink®中使用状态流程图和Robotics System Tool金宝appbox™算法块进行建模。一个中央调度器发送命令给机器人从装载站然后把它们送到一个特定的地方卸载站.的机器人控制器根据装卸站的位置规划轨迹,并为机器人生成速度指令。这些命令被提供给植物,其中包含一个差动驱动机器人模型,用于执行速度命令并返回机器人的真实姿态。姿态反馈给调度器和控制器,用于跟踪机器人状态。这个工作流是为一组5个机器人完成的,它们都是同时调度、跟踪和建模的。
所提供的Simulink模金宝app型,multiRobotExampleModel
,模拟上述场景。
中央调度器
中央调度器使用状态流图来处理包分配给机器人包分发器.每个机器人每次可以携带一个包裹,并根据每个包裹所需的位置指示从装载站到卸载站。调度器还跟踪包和机器人的状态并更新状态指示板.根据机器人的姿势,当调度程序检测到即将发生碰撞时,它还会向一个机器人发送停止命令。这种行为可以让机器人在可能的情况下进行局部避障。
的对于每个机器人和包状态子系统是每个子系统(金宝app模型)哪个处理跟踪机器人和包状态的总线数组RobotPackageStatus
总线对象。这使得该模型很容易针对不同数量的机器人进行更新。有关使用For- each子系统处理总线阵列的更多信息,请参见使用总线数组(金宝app模型).
调度器
下面的原理图详细说明的信号值调度器Stateflow图表。
机器人控制器
的机器人控制器使用一个每个子系统(金宝app模型)为你的5个机器人生成一个机器人控制器数组。
方法相关的信号值的类型的原理图如下每个机器人控制器.
每个机器人控制器都有以下输入和输出。
控制器接受包含包信息的交付命令,并为仓库中使用该命令的人规划交付路径mobileRobotPRM
.的单纯的追求Block获取该路径并生成访问每个路径点的速度命令。此外,当机器人达到目标时,机器人和包裹的状态将得到更新。每个机器人都有自己的内部调度程序,根据包裹信息告诉它们卸载站的位置,并在它们放下包裹时将它们送回装载站。
机器人控制器模型使用相同的模型,warehouseTasksRobotSimulationModel
,显示于为仓库机器人执行任务.
植物
的植物子系统使用微分传动运动学模型块来模拟机器人的运动。
模型设置
开始在MATLAB®中为模型设置各种变量。
定义仓库环境
逻辑类型矩阵,logicalMap
表示仓库的占用图。仓库包含代表墙壁、货架和其他处理站的障碍物。装载、卸载和充电站也给出了xy坐标。
负载multiRobotWarehouseMap.matlogicalMaploadingStationunloadingStationschargingStations图= figure(“名字”,“仓库设置”,“单位”,“归一化”,“OuterPosition”,[0 0 1 1]);visualizeWarehouse(仓库图,logicalMap,充电站,卸载站,装载站);
检查车站的占用率
确保站点在地图上没有被占用。
map = binaryoccuancymap (logicalMap);如果(任何(checkOccupancy(地图,[chargingStations;loadingStation;unloadingStations])))错误(“地图上至少有一个车站的位置被占用了。”)结束
中央调度器
的中央调度器需要了解要递送的包裹,以便向机器人控制器发送递送命令。
定义包
包裹以一个索引号数组的形式给出,这些索引号是包裹应该被送到的各个卸货站的索引号。因为这个例子有三个卸载站,所以一个有效的包的值可以是1、2或3。
负载packages.mat包包
包=1×113 2 1 2 3 1 1 1 2 3 1
机器人数量
机器人的数量是用来确定初始化中各种信号的大小的调度器Stateflow图表
numRobots = size(充电站,1);%每个机器人都有自己的充电站;
碰撞检测与达到目标阈值
的中央调度器和机器人控制器使用一定的阈值进行碰撞检测,collisionThresh
,以及达到目标的条件,awayFromGoalThresh
.
碰撞检测确保在一定距离阈值内的任意一对机器人,允许指数较低的机器人移动,而另一个机器人应停止(零速度命令)。静止移动的机器人应该能够避开路径上的局部静态障碍物。您可以使用另一个低级控制器来实现这一点,例如向量场直方图(导航工具箱)块。
如果机器人在距离阈值内,则发生目标达到条件,awayFromGoalThresh
,从目标位置。
负载exampleMultiRobotParams.matawayFromGoalThreshcollisionThresh
总线对象
的RobotDeliverCommand
而且RobotPackageStatus
总线对象用于在节点之间传递机器人包分配中央调度器和机器人控制器.
负载warehouseRobotBusObjects.matRobotDeliverCommandRobotPackageStatus
模拟
打开Simulin金宝appk模型.
open_system (“multiRobotExampleModel.slx”)
运行模拟。你应该能看到机器人驾驶规划路径和递送包裹。
sim卡(“multiRobotExampleModel”);
###启动串行模型参考仿真构建。# # #成功更新了模型参考模拟目标:robotController构建总结模拟目标构建:模型重建行动的理由 =========================================================================================== robotController代码生成和编译。robotController_msf。Mexa64不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 2m 27.84s
指标和状态仪表板
对于每个包,模型中的仪表板会显示该包是“InProgress”、“Unassigned”还是“Delivered”。机器人状态显示旅行距离、包裹位置和包裹ID。
扩展模型
该模型的设置是为了根据可用性来处理修改仓库中机器人的数量。增加更多的机器人需要定义更多的充电站。
charingstations (6,:) = [10,15];%充电站为额外的第6个机器人charingstations (7,:) = [10,17];%充电站为额外的第7个机器人
您还可以添加更多的卸货站,并将包裹分配给它。
unload stations (4,:) = [30,50];Packages = [Packages, 4,4];
额外的微分运动学模型块也需要匹配机器人的数量。的exampleHelperReplacePlantSubsystem
通过更新添加这些numRobots
.
numRobots = size(充电站,1)和以前一样,每个机器人都有自己的充电站
numRobots = 7
exampleHelperReplacePlantSubsystem (“multiRobotExampleModel /机器人”, numRobots);
您还可以重新定义任何现有位置。修改装货站位置。
loadingStation = [35,20];
模拟
进行修改后,再次运行模拟。您应该看到更新后的站点位置和增加的机器人数量。
sim卡(“multiRobotExampleModel”);
###启动串行模型参考仿真构建。# # #成功更新了模型参考模拟目标:robotController构建总结模拟目标构建:模型重建行动的理由 =========================================================================================== robotController代码生成和编译。全局变量unloadingStations更改。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 1m 7.3066s
可视化
的可视化辅助提供一些更改仓库视图的选项。打开块掩码,在各种掩码之间切换预设的观点不同的车站。切换路径可视化或更新机器人网格类型。调整样品时间改变可视化的速率,不影响实际机器人仿真的执行。