Управляйте и симулируйте несколько складских роботов

В этом примере показано, как управлять и симулировать несколько роботов, работающих на складе или центре дистрибуции. Роботы управляют вокруг пакетов берущего средства и поставки их к станциям для того, чтобы сохранить или обработать. Этот пример создает сверх Выполнить Задач для Складского примера Робота, который управляет одним роботом вокруг того же средства.

Этот сортирующий пакет сценарий может быть смоделирован в Simulink® с помощью диаграмм Stateflow и блоков алгоритма Robotics System Toolbox™. Центральный Планировщик отправляет команды в роботов, чтобы поднять пакеты со станции загрузки и поставить им определенной станции разгрузки. Диспетчер Робота планирует траекторию на основе местоположений станций загрузки и разгрузки и генерирует скоростные команды для робота. Эти команды питаются Объект, который содержит модель робота с дифференциальным приводом для выполнения скоростных команд и возврата положений основной истины робота. Положения возвращены к планировщику и контроллеру для отслеживания состояния робота. Этот рабочий процесс сделан для группы из 5 роботов, которые все запланированы, прослежены и смоделированы одновременно.

Предоставленная модель Simulink, multiRobotExampleModel, моделирует вышеупомянутый описанный сценарий.

Центральный планировщик

Центральный Планировщик использует диаграмму Stateflow, чтобы обработать выделение пакета к роботам от Фармацевта Пакета. Каждый робот может нести один пакет за один раз и проинструктирован, чтобы пойти от загрузки до разгружающейся станции на основе необходимого местоположения для каждого пакета. Планировщик также отслеживает состояние пакетов и роботов и обновляет Инструментальную панель Состояния. На основе положений робота планировщик также отправляет команды остановки в одного робота, когда это обнаруживает неизбежное столкновение. Это поведение может позволить роботам запускать локальное предотвращение препятствия при наличии.

Для Каждой подсистемы состояния Робота и Пакета Для Каждой Подсистемы (Simulink), который обрабатывает массив шин для отслеживания робота и состояний пакета как RobotPackageStatus объект шины. Это дает возможность обновлять эту модель для различного количества роботов. Для получения дополнительной информации об обработке массивов шин с помощью Для - Каждая Подсистема, смотрите работу с Массивами Шин (Simulink).

Планировщик

Следующие схематические детали значения сигналов диаграммы Stateflow Планировщика.

Контроллер робота

Диспетчер Робота использует Для Каждой Подсистемы (Simulink), чтобы сгенерировать массив контроллеров робота для ваших 5 роботов.

Следующие схематические детали тип значений сигналов, сопоставленных с Для Каждого Контроллера Робота.

У каждого контроллера робота есть следующие вводы и выводы.

Контроллер берет команды доставки, который содержит информацию о пакете и планирует путь поставку его кто-то на складе с помощью mobileRobotPRM. Блок Pure Pursuit выбирает это путь и генерирует скоростные команды для посещения каждого waypoint. Кроме того, состояние робота и пакетов обновляется, когда робот достигает своей цели. Каждый робот также имеет свой собственный внутренний планировщик, который говорит им местоположение о разгрузке станций на основе информации о пакете и передает обратно их в станцию загрузки, когда они привозят пакет.

Модели контроллеров робота используют ту же модель, warehouseTasksRobotSimulationModel, показанный в Выполняют Задачи для Складского Робота.

Объект

Подсистема Объекта использует Дифференциальный Диск Кинематический блок Model, чтобы смоделировать движение роботов.

Setup модели

Начните устанавливать различные переменные в 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);

Figure Warehouse Setting contains an axes object. The axes object with title Warehouse Map contains 46 objects of type patch, line, image, text.

Проверка заполнения в станциях

Убедитесь, что станции не заняты в карте.

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 (Navigation Toolbox).

Достигнутое целью условие происходит, если робот в пороге расстояния, awayFromGoalThresh, от целевого местоположения.

load exampleMultiRobotParams.mat awayFromGoalThresh collisionThresh

Соедините шиной объекты

RobotDeliverCommand и RobotPackageStatus объекты шины используются, чтобы передать выделения пакета робота между Центральным Планировщиком и Контроллером Робота.

load warehouseRobotBusObjects.mat RobotDeliverCommand RobotPackageStatus

Симуляция

Откройте Simulink model.

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 1m 49.112s

Figure contains an axes object. The axes object with title Binary Occupancy Grid contains 46 objects of type patch, line, image, text.

Метрики и инструментальная панель состояния

Для каждого из пакетов инструментальная панель в модели показывает, является ли пакет "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];

Дополнительные Дифференциальные Кинематические блоки 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');
### 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 52.303s

Figure contains an axes object. The axes object with title Binary Occupancy Grid contains 61 objects of type patch, line, image, text.

Визуализация

Помощник Визуализации предлагает некоторые опции для изменения представления склада. Откройте маску блока, чтобы переключиться между различными Предварительно установленными Представлениями различных станций. Переключите типы mesh робота визуализации или обновления пути. Настройте Шаг расчета, чтобы изменить уровень визуализации, которая не влияет на выполнение фактической симуляции робота.