Изолируйте логику перехода для ввода и выхода из атомарной субдиаграммы

В этом примере показано, как использовать порты входа и выхода, чтобы создать многочисленные связи в и из соединенных атомарных субдиаграмм. Порты входа и выхода включают ваш график к переходу через контуры в иерархии 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 $m$-by-3 матрица, которая задает горизонтальную координату, вертикальную координату и радиус каждого кругового препятствия, где$m$ количество круговых препятствий.

  • boxes $n$-by-4 матрица, которая задает горизонтальную координату, вертикальную координату, ширину и высоту каждого прямоугольного препятствия, где$n$ количество прямоугольных препятствий.

Курс препятствия может содержать произвольно много препятствий, но он должен содержать по крайней мере один проспект и одно прямоугольное препятствие. По умолчанию, 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

Смотрите также

| | (Simulink)

Похожие темы

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