В этом примере показов, как управлять и моделировать несколько роботов, работающих на складском объекте или в распределение центре. Роботы ездят по объекту, забирая пакеты и доставляя их на станции для хранения или обработки. Этот пример основан на верхней части «Выполнение задач для робота-склада», который управляет одним роботом вокруг того же объекта.
Этот сценарий сортировки пакетов может быть смоделирован в Simulink ® с помощью диаграмм Stateflow и Robotics System Toolbox™. Центральный Планировщик отправляет команды роботам, чтобы забрать пакеты с загрузочной станции и доставить их на конкретную разгрузочную станцию. Контроллер Робота планирует траекторию на основе местоположений станций загрузки и разгрузки и генерирует команды скорости для робота. Эти команды подаются на Объект, который содержит модель робота с дифференциальным приводом для выполнения команд скорости и возврата основной истины положений робота. Положения передаются обратно в планировщик и контроллер для отслеживания состояния робота. Этот процесс выполняется для группы из 5 роботов, которые планируются, отслеживаются и моделируются одновременно.
Предоставленная модель Simulink, multiRobotExampleModel
, моделирует вышеописанный сценарий.
Центральный планировщик использует диаграмму Stateflow, чтобы обработать распределение пакетов роботам из диспенсера пакетов. Каждый робот может нести по одной упаковке за раз и получает указание отправиться от погрузочной станции к разгрузочной станции на основе необходимого места для каждой упаковки. Планировщик также отслеживает состояние пакетов и роботов и обновляет панель мониторинга состояния. Основываясь на положениях робота, планировщик также отправляет команды stop одному роботу, когда он обнаруживает скорое столкновение. Это поведение может позволить роботам запускать локальные препятствия, избегая при наличии.
Подсистема For Each Robot and Package State является Подсистемой For Each (Simulink), которая обрабатывает массив шин для отслеживания состояний робота и пакета как RobotPackageStatus
шинный объект. Это облегчает обновление этой модели для различного количества роботов. Для получения дополнительной информации об обработке массивов шин с помощью Подсистемы For-Each, смотрите Работа с массивами шин (Simulink).
Следующая схема детализирует значения сигналов диаграммы Scheduler Stateflow.
Контроллер Робота использует For Each Subsystem (Simulink), чтобы сгенерировать массив контроллеров роботов для ваших 5 роботов.
Следующая схема описывает тип значений сигналов, сопоставленных с контроллером For Each Robot.
Каждый контроллер робота имеет следующие входы и выходы.
Контроллер принимает команды доставки, содержащие информацию о пакете, и планирует путь для доставки его на склад с помощью mobileRobotPRM
. Блок Pure Pursuit берёт этот путь и генерирует команды скорости для посещения каждой путевой точки. Также статус робота и пакетов обновляется, когда робот достигает своей цели. Каждый робот также имеет свой собственный внутренний планировщик, который сообщает им местоположение разгрузочных станций на основе информации о пакете и отправляет их обратно на загрузочную станцию, когда они сбрасывают пакет.
Модели контроллеров робота используют ту же модель, warehouseTasksRobotSimulationModel
, показанный в разделе «Выполнение задач для складского Робота».
Подсистема Объекта использует блок Differential Drive Kinematic Model, чтобы смоделировать движение роботов.
Начните настраивать различные переменные в MATLAB ® для модели.
Матрица логического типа, logicalMap
представляет карту заполнения склада. Склад содержит препятствия, представляющие стенки, полки и другие станции обработки. Загрузка, разгрузка и зарядные станции также приведены в координатах xy.
load multiRobotWarehouseMap.mat logicalMap loadingStation unloadingStations chargingStations warehouseFig = figure('Name', 'Warehouse Setting', 'Units',"normalized", 'OuterPosition',[0 0 1 1]); visualizeWarehouse(warehouseFig, logicalMap, chargingStations, unloadingStations, loadingStation);
Убедитесь, что станции не заняты на карте.
map = binaryOccupancyMap(logicalMap); if(any(checkOccupancy(map, [chargingStations; loadingStation; unloadingStations]))) error("At least one of the station locations is occupied in the map.") end
Центральный планировщик требует знать пакеты, которые должны быть доставлены, чтобы отправить команды доставки контроллерам роботов.
Пакеты приводятся как массив индекса номеров различных разгрузочных станций, которые предполагается доставить пакетам. Поскольку этот пример имеет три станции разгрузки, допустимый пакет может иметь значение 1, 2 или 3.
load packages.mat packages packages
packages = 1×11
3 2 1 2 3 1 1 1 2 3 1
Количество роботов используется, чтобы определить размеры различных сигналов в инициализации диаграммы Scheduler Stateflow
numRobots = size(chargingStations, 1); % Each robot has its own charging station;
Центральный Планировщик и Контроллер Робота используют определенные пороги для обнаружения столкновения, collisionThresh
и условие достижения цели, awayFromGoalThresh
.
Обнаружение столкновения гарантирует, что для любой пары роботов в пределах определенного расстояния-порога, робот с более низким индексом должен быть разрешен к движению, в то время как другой робот должен остановиться (команда нулевой скорости). Все еще движущийся робот должен быть в состоянии избегать локальных статических препятствий на своем пути. Этого можно достичь с помощью другого низкоуровневого контроллера, такого как блок Векторное Поле Histogram (Navigation Toolbox).
Условие достижения цели возникает, если робот находится в пределах дистанционного порога, awayFromGoalThresh
, из местоположения цели.
load exampleMultiRobotParams.mat awayFromGoalThresh collisionThresh
The RobotDeliverCommand
и RobotPackageStatus
объекты шины используются для прохождения выделений пакетов роботов между Центральным Планировщиком и Контроллером Робота.
load warehouseRobotBusObjects.mat RobotDeliverCommand RobotPackageStatus
Откройте модель Simulink .
open_system("multiRobotExampleModel.slx")
Запустите симуляцию. Вы должны увидеть роботы управляют путями и доставляют пакеты.
sim('multiRobotExampleModel');
### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: robotController Build Summary Simulation targets built: Model Action Rebuild Reason ========================================================================================== robotController Code generated and compiled robotController_msf.mexa64 does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 2m 13.842s
Для каждого из пакетов инструментальная панель в модели показывает, является ли пакет «InProgress», «Unassigned» или «Delivered». Robot Status отображает пройденное расстояние, местоположение пакета и идентификатор пакета.
Эта модель настройки для изменения количества роботов на складе в зависимости от доступности. Добавление большего количества роботов требует определения дополнительных зарядных станций.
chargingStations(6, :) = [10, 15]; % Charging Station for the additional 6th robot chargingStations(7, :) = [10, 17]; % Charging Station for the additional 7th robot
Можно также добавить больше пикетов разгрузки и назначить им пакеты.
unloadingStations(4, :) = [30, 50]; packages = [packages, 4, 4];
Дополнительные блоки дифференциальной кинематической модели также требуются, чтобы соответствовать количеству роботов. The exampleHelperReplacePlantSubsystem
добавляет их путем обновления numRobots
.
numRobots = size(chargingStations, 1) % As before, each robot has its own charging station
numRobots = 7
exampleHelperReplacePlantSubsystem('multiRobotExampleModel/Robots', numRobots);
Можно также переопределить любые существующие местоположения. Измените расположение пикета загрузки.
loadingStation = [35, 20];
После внесения изменений еще раз запустите симуляцию. Вы должны увидеть обновленные местоположения станций и увеличенное количество роботов.
sim('multiRobotExampleModel');
### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: robotController Build Summary Simulation targets built: Model Action Rebuild Reason ============================================================================================== robotController Code generated and compiled Global variable unloadingStations has changed. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 59.874s
Помощник по визуализации предлагает некоторые опции для изменения представления склада. Откройте маску блока, чтобы переключаться между различными предустановленными видами различных станций. Включите визуализацию пути или обновите типы mesh робота. Настройте шаг расчета, чтобы изменить скорость визуализации, которая не влияет на выполнение фактической симуляции робота.