В этом примере показано, как управлять и симулировать несколько роботов, работающих на складе или центре дистрибуции. Роботы управляют вокруг пакетов берущего средства и поставки их к станциям для того, чтобы сохранить или обработать. Этот пример создает сверх Выполнить Задач для Складского примера Робота, который управляет одним роботом вокруг того же средства.
Этот сортирующий пакет сценарий может быть смоделирован в Simulink® с помощью диаграмм Stateflow и блоков алгоритма Robotics System Toolbox™. Центральный Планировщик отправляет команды в роботов, чтобы поднять пакеты со станции загрузки и поставить им определенной станции разгрузки. Диспетчер Робота планирует траекторию на основе местоположений станций загрузки и разгрузки и генерирует скоростные команды для робота. Эти команды питаются Объект, который содержит модель робота с дифференциальным приводом для выполнения скоростных команд и возврата положений основной истины робота. Положения возвращены к планировщику и контроллеру для отслеживания состояния робота. Этот рабочий процесс сделан для группы из 5 роботов, которые все запланированы, прослежены и смоделированы одновременно.
Предоставленная модель Simulink, multiRobotExampleModel
, моделирует вышеупомянутый описанный сценарий.
Центральный Планировщик использует диаграмму Stateflow, чтобы обработать выделение пакета к роботам от Фармацевта Пакета. Каждый робот может нести один пакет за один раз и проинструктирован, чтобы пойти от загрузки до разгружающейся станции на основе необходимого местоположения для каждого пакета. Планировщик также отслеживает состояние пакетов и роботов и обновляет Инструментальную панель Состояния. На основе положений робота планировщик также отправляет команды остановки в одного робота, когда это обнаруживает неизбежное столкновение. Это поведение может позволить роботам запускать локальное предотвращение препятствия при наличии.
Для Каждой подсистемы состояния Робота и Пакета Для Каждой Подсистемы, которая обрабатывает массив шин для отслеживания робота и состояний пакета как RobotPackageStatus
объект шины. Это дает возможность обновлять эту модель для различного количества роботов. Для получения дополнительной информации об обработке массивов шин с помощью Для - Каждая Подсистема, смотрите работу с Массивами Шин (Simulink).
Следующие схематические детали значения сигналов диаграммы Stateflow Планировщика.
Диспетчер Робота использует В Каждой Подсистеме, чтобы сгенерировать массив контроллеров робота для ваших 5 роботов.
Следующие схематические детали тип значений сигналов, сопоставленных с Для Каждого Контроллера Робота.
У каждого контроллера робота есть следующие вводы и выводы.
Контроллер берет команды доставки, который содержит информацию о пакете и планирует путь поставку его кто-то на складе с помощью mobileRobotPRM
. Блок Pure Pursuit выбирает это путь и генерирует скоростные команды для посещения каждого waypoint. Кроме того, состояние робота и пакетов обновляется, когда робот достигает своей цели. Каждый робот также имеет свой собственный внутренний планировщик, который говорит им местоположение о разгрузке станций на основе информации о пакете и передает обратно их в станцию загрузки, когда они привозят пакет.
Модели контроллеров робота используют ту же модель, warehouseTasksRobotSimulationModel,
показанный в Выполняют Задачи для Складского Робота.
Подсистема Объекта использует Дифференциальный Диск Кинематический блок 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
Количество роботов используется, чтобы определить размеры различных сигналов в инициализации диаграммы Stateflow Планировщика
numRobots = size(chargingStations, 1); % Each robot has its own charging station;
Центральный Планировщик и Контроллер Робота используют определенные пороги в обнаружении столкновений, collisionThresh
, и достигнутое целью условие, awayFromGoalThresh
.
Обнаружение столкновений гарантирует, что для любой пары роботов в определенном пороге расстояния, роботу с более низким индексом нужно позволить переместиться, в то время как другой робот должен остановиться (команда нулевой скорости). Все еще движущийся робот должен смочь избежать локальных статических препятствий в их пути. Вы могли достигнуть этого с другим низкоуровневым контроллером как блок Vector Field Histogram.
Достигнутое целью условие происходит, если робот в пороге расстояния, awayFromGoalThresh
, от целевого местоположения.
load exampleMultiRobotParams.mat awayFromGoalThresh collisionThresh
RobotDeliverCommand
и RobotPackageStatus
объекты шины используются, чтобы передать выделения пакета робота между Центральным Планировщиком и Контроллером Робота.
load warehouseRobotBusObjects.mat RobotDeliverCommand RobotPackageStatus
Откройте Simulink model.
open_system("multiRobotExampleModel.slx")
Запустите симуляцию. Необходимо видеть пути к плану диска роботов и поставить пакеты.
sim('multiRobotExampleModel');
### Successfully updated the model reference simulation target for model: robotController
Для каждого из пакетов инструментальная панель в модели показывает, является ли пакет "InProgress", "Неприсвоенным", или "Поставленным". Состояние робота отображается, расстояние переместилось, местоположение пакета и ID пакета.
Эта модель является настройкой, чтобы обработать изменение количества роботов на складе на основе доступности. Добавление большего количества роботов требует задающих дополнительных заряженных станций.
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, 3 1];
Дополнительные Дифференциальные Кинематические блоки Model также требуются, чтобы совпадать с количеством роботов. 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');
### Successfully updated the model reference simulation target for model: robotController
Помощник Визуализации предлагает некоторые опции для изменения представления склада. Откройте маску блока, чтобы переключиться между различными Предварительно установленными Представлениями различных станций. Переключите типы mesh робота визуализации или обновления пути. Настройте Шаг расчета, чтобы изменить уровень визуализации, которая не влияет на выполнение фактической симуляции робота.