В этом примере показано, как использовать порты входа и выхода, чтобы создать многочисленные связи в и из соединенных атомарных субдиаграмм. Порты входа и выхода включают ваш график к переходу через контуры в иерархии Stateflow® при изоляции логики для ввода и выхода из атомарных субдиаграмм. Для получения дополнительной информации о портах входа и выхода, смотрите, Создают Связи Входа и выхода Через Государственные границы.
В этом примере модель Simulink® симулирует робота, который маневрирует через курс препятствия в поисках базового блока. Модель содержит три диаграммы Stateflow:
Route Control
задает стратегию, используемую роботом, чтобы искать прикрепление и переместиться по курсу препятствия.
Robot
задает физические характеристики робота, такие как положение и направление движения, относительно прикрепления и препятствий, которые окружают его.
Plot Trajectory
создает визуальное представление пути, который берет робот, когда это избегает препятствий и ищет прикрепление.
Route Control
график задает стратегию что использование робота, чтобы искать базовый блок. График состоит из комбинации соединенных атомарных субдиаграмм из модели sfRobotExampleLib.slx
Библиотеки Simulink. Соединенные атомарные субдиаграммы ведут себя как макросы, которые дают роботу команду продвигаться, вращаться левый или правый, и делать радиосвязь с прикреплением. Можно объединить один или несколько экземпляров этих субдиаграмм, чтобы программировать собственную поисковую стратегию.
В этом примере робот перемещается в прямую линию и делает радиосвязь с прикреплением равномерно. Если смыслы робота, которые это отодвигает от прикрепления, это вращает 45 градусов направо и продолжает искать. Если робот сталкивается с препятствием, он вращает 45 градусов налево и продолжает искать. Первоначально, робот перемещается со скоростью 0,5 метров в секунду. Когда робот прибывает в 2 метрах прикрепления, он замедляется к скорости 0,1 метров в секунду. Когда робот близко подходит к базовому блоку, остановкам симуляции. В противном случае, после tMax
секунды, симуляция останавливает и возвращает предупреждение.
В Route Control
стройте диаграмму, соединенная атомарная субдиаграмма Rotate
содержит два порта записи, пометил Left
и Right
. В процессе моделирования, Rotate
субдиаграмма становится активной, когда график берет переход, который приводит к одному из этих портов записи.
В субдиаграмме каждый порт записи имеет соответствующее соединение записи. Переходы, которые соединяются от этих соединений записи до Rotate
состояния установите значение локального объекта данных
direction
к 1
или -1
. Это значение говорит робота, повернуться ли по часовой стрелке или против часовой стрелки. Затем entry
состояния действие вызывает
rotate
функция в Robot
график. Эта функция изменяет направление движения для робота углом direction*angle
. Параметр angle
задан как pi/4
во вкладке Mappings диалогового окна свойств для субдиаграммы. Для получения дополнительной информации смотрите Переменные Карты для Атомарных Субдиаграмм и Полей.
Соединенная атомарная субдиаграмма Move
содержит два выходных порта, пометил Done
и HIT
. В субдиаграмме каждый выходной порт имеет соответствующее выходное соединение. В процессе моделирования, состояния активности в Forward
подсостояния вызовите
move
функция в Robot
график. Эта функция меняет положение робота расстоянием step
, который задан как 0.1
во вкладке Mappings диалогового окна свойств для субдиаграммы. Если функциональный obstacle
указывает, что робот столкнулся с препятствием, робот возвращается к последнему безопасному положению и переходам графика из субдиаграммы при помощи выходного порта HIT
. В противном случае робот продолжает продвигаться в течение целой секунды и переходов графика из субдиаграммы при помощи выходного порта Done
.
Точно так же соединенная атомарная субдиаграмма ContactDock
содержит два выходных порта, CloserToDock
и FartherFromDock
. В субдиаграмме каждый выходной порт имеет соответствующее выходное соединение. В процессе моделирования, состояния активности в ContactDock
подсостояния вызовите
distanceToDock
функция в Robot
график. Эта функция определяет расстояние с робота на базовый блок. Если это расстояние, уменьшенное в последнем временном шаге, переходах графика из субдиаграммы при помощи выходного порта CloserToDock
. В противном случае, переходы графика из субдиаграммы при помощи выходного порта FartherFromDock
.
Robot
график поддерживает положение и направление робота. График также экспортирует несколько функций, чтобы переместить и вращать робота, определить расстояние от робота до прикрепления и обнаружить препятствия. Путем вызывания этих функций, Route Control
график никогда не взаимодействует непосредственно с положением и направлением робота.
Стартовая позиция параметров маски (x, y) и Стартовое направление (час) задает значения startPos
и startDir
. Чтобы изменить эти значения, откройте диалоговое окно Block Parameters путем двойного клика по Robot
график. Для получения дополнительной информации смотрите, Создают Маску, чтобы Совместно использовать Параметры с Simulink.
Переменные dock
рабочей области,
dockWidth
, circles
, и boxes
задайте положение и размер базового блока и препятствий вокруг этого.
dock
двухэлементный вектор, который задает горизонтальные и вертикальные координаты прикрепления.
dockWidth
скаляр, который задает ширину прикрепления.
circles
-by-3 матрица, которая задает горизонтальную координату, вертикальную координату и радиус каждого кругового препятствия, где количество круговых препятствий.
boxes
-by-4 матрица, которая задает горизонтальную координату, вертикальную координату, ширину и высоту каждого прямоугольного препятствия, где количество прямоугольных препятствий.
Курс препятствия может содержать произвольно много препятствий, но он должен содержать по крайней мере один проспект и одно прямоугольное препятствие. По умолчанию, PreLoadFcn
коллбэк для модели в этом примере задает курс препятствия с тремя круговыми препятствиями и тремя прямоугольными препятствиями.
Robot
график является графиком библиотеки, который соединяется из модели sfRobotExampleLib.slx
Библиотеки Simulink. Эта библиотека включает единый инструментарий, который задает этот график, а также соединенные атомарные субдиаграммы для программирования вашей собственной симуляции робота. Для получения дополнительной информации смотрите Пользовательские Библиотеки (Simulink).
График Plot Trajectory
читает переменные dock
рабочей области,
dockWidth
, circles
, и boxes
, а также выходные сигналы x
и y
от Robot
график и done
от Route Control
стройте диаграмму, чтобы произвести визуальное представление курса препятствия и пути, который берет робот, когда это ищет прикрепление.
Когда вы запускаете симуляцию, график вызывает функцию помощника sfRobotScene
создать фигуру MATLAB®, которая отображает базовый блок зеленым и препятствия красного цвета. Код для этой функции появляется в конце этого примера. Затем на каждом шаге симуляции график строит местоположение робота при помощи синего круга. Когда входной сигнал done
указывает на конец симуляции, график отключает состояние удержания для фигуры и устанавливает значение выходного сигнала stop
к true
, порождение Stop
блокируйтесь, чтобы закончить симуляцию.
Вызывать sfRobotScene
график
, и hold
когда значение внешних параметров функционирует, график использует coder.extrinsic
(Simulink) функция. Для получения дополнительной информации смотрите функции MATLAB Значения внешних параметров Вызова в диаграммах Stateflow.
Функция помощника sfRobotScene
создает фигуру MATLAB, которая отображает базовый блок зеленым и препятствия красного цвета.
function sfRobotScene(dock,width,boxes,circles) plot(nsidedpoly(8,Center=dock,Radius=2*width),FaceColor="green"); daspect([1 1 1]) hold on for i = 1:height(circles) center = circles(i,1:2); radius = circles(i,3); plot(nsidedpoly(20,Center=center,Radius=radius),FaceColor="red"); end for i = 1:height(boxes) box = boxes(i,:); X = [box(1) box(1)+box(3) box(1)+box(3) box(1)]; Y = [box(2) box(2) box(2)-box(4) box(2)-box(4)]; plot(polyshape(X,Y),FaceColor="red"); end fig = gcf; fig.Name = "Robot Obstacle Course"; fig.NumberTitle = 'off'; figure(fig) end
plot
| hold
| coder.extrinsic
(Simulink)