Управление движением мобильного робота по сложным траекториям




Методические указания по выполнению лабораторной работы № 2

по дисциплине

«Проектирование мехатронных систем »

для студентов направления 05.03.06 «Мехатроника и робототехника»

 

 

Ижевск 2017

УДК 621.865.8(07)

Н-62

 

 

Рассмотрено и одобрено на заседании кафедры «Мехатронные системы» (протокол № 5 от 7 декабря 2016 г.)

 

 

Рецензент: канд. техн. наук, заведующий кафедрой «Мехатронные системы» А. И. Абрамов

 

 

Ю. Р. Никитин

Управление движением мобильного робота по сложным траекториям: Методические указания по выполнению лабораторной работы № 2 по дисциплине «Проектирование мехатронных систем» для студентов направления 05.03.06 «Мехатроника и робототехника». – Ижевск: ИжГТУ имени М.Т.Калашникова, 2017. – 11 с.

 

 

Данные методические указания по выполнению лабораторной работы по дисциплине «Проектирование мехатронных систем» предназначены для студентов направления 05.03.06 «Мехатроника и робототехника». В методических указаниях рассматривается управление движением мобильного робота по сложным траекториям в среде Microsoft Robotics Developer Studio с помощью джойстика с использованием программы Microsoft Visual Programming Language.

 

 

ã Ю. Р. Никитин, 2017

 


Цель – приобретение навыков моделирования и управления роботом в среде Microsoft Robotics Developer Studio (MRDS) с использованием программы Microsoft Visual Programming Language (VPL). Требуется написать программу управления движением мобильного робота на VPL по дуге и более сложным траекториям. Требуется изучить переменные, значения по умолчанию, таймеры и конкурентный контроль потоков с помощью объединений и слияний.

 

Порядок выполнения работы

 

Шаг 1. Движение по окружности.

Сначала необходимо определить напряжение, подаваемое на двигатели колес. Если напряжение, подаваемое на двигатели колес, будет отличаться, то робот поедет по дуге. Если робот будет долго ехать по дуге, то она замкнется в круг.

Вычисление разности питания на двигателях колес.

Начнем с создания сервиса, который назовем TurningRadiusToWheelPowers. Для этого перетянем блок Activity из панели инструментов на диаграмму. На панели Properties измените имя блока на TurningRadiusToWheelPowers. Дважды кликнете на блоке, чтобы открыть его в редакторе.

В меню Edit выберите Actions and Notifications. Измените имя Action на CalculateWheelPowers. В правой части диалогового окна, добавьте два входных параметра TurningRadius (double) и TurnRight (boolean). Также добавьте два выходных параметра Left (double) и Right (double), как на рисунке 1.

 

 

Рисунок 1 – Диалоговое окно Actions and Notifications

 

Окно Actions and Notifications.

Добавьте на схему два блока Calculate и блок Data, как показано на следующем рисунке. Соедините их с входной шиной. Добавьте блок Join. Первый блок Calculate просто транслирует значение TurnRight в блок Join. Блок Data устанавливает питание для левого колеса в 1.0. Второй блок Calculate выполняет вычисления (см. рисунок 2) для определения питания на правом колесе.

 

 

Рисунок 2 – Блок Calculate

 

Вычисление питания подаваемого на колеса.

Все три значения передаются в блоке Join, который объединяет все полученные значения в одну шину. Вам необходимо установить названия для каждого потока данных (TurnRight, Left и Right) так, как показано на рисунке. Пара важных замечаний о Join:

Вы можете объединять столько значении сколько захотите, просто протяните новое соединение к блоку Join и появиться новое поле для ввода имени переменной.

Join не срабатывает пока не придут данные со всех входящих каналов.

Добавьте блок If для проверки значения TurnRight. Соедините выход Join с входом If. Если значение TurnRight истинно, то питание на левый и правый двигатель передаются без изменений. Добавьте два блока Calculate, которые будут ретранслировать эти значения и еще один Join. В противном случае значения должны поменяться местами. Это простая схема изображена на рисунке 3.

 

Рисунок 3 – Схема

 

Вывод результатов.

В конце два блока Join должны соединяться с выходной шиной. Для объединения двух шин используется блок Merge. Присоедините блок Merge к выходной шине. В появившемся окне поставьте галочку Edit values directly и установите соответствие вычисляемых переменных к выходным (Left – Left, Right – Right). Таким образом, мы разработали свою activity. Для возращения нажмите на закладку Diagram.

Добавьте сервис GenericDifferentialDrive, соедините исходящий порт результатов TurningRadiusToWheelPowers с входным портом GenericDifferentialDrive (привязав Left к LeftWheelPower и Right к RightWheelPower). TurningRadiusToWheelPower имеет два аргумента: TurningRadius (double) и TurnRight (boolean), который кодирует поворачивать ли направо (или на лево).

Теперь возьмите два блока Data с панели Basic Activities. Блок Data устанавливает исходные данные. Установите для одного из блоков тип данных boolean и значение истина, для второго тип double и значение 1.0. Это будут входные значения дляTurningRadiusToWheelPower. Однако, этот сервис имеет лишь одно входное соединение. Для объединения двух частей данных необходимо добавить блок Join из Basic Activies. Он может хранить два значения в словаре, позволяя вам определять имена переменных. Соедините блоки с данными с блоком Join, назвав двоичную переменную TurnRight, а переменную double TurningRadius.

 

Рисунок 4 – VPL диаграмма для езды по кругу

 

В конце вы должны получить диаграмму как на рисунке 4. Как и в лабораторной работе 1 укажите манифест робота согласно варианту индивидуального задания и запустите вашу программу. Изменяя значения в блоках Data попробуйте въехать в группу предметов.

 

Шаг 2. Езда по дуге.

Наш робот ездит по кругу из-за настроек подачи энергии в мотор. Для езды по дуге нам необходимо остановить моторы после некоторого промежутка времени.

Для этого нам необходимо использовать сервис Timer, добавьте один блок на вашу диаграмму и соедините его входы с выходами GenericDifferentialDrive (соединив порт SetDrivePowerSuccess с портом SetTimer). В окне Data Connections выберите Edit Values Directly и введите 1500 (единицы измерения – миллисекунды) как показано на рисунке 4.

 

 

Рисунок 4 – Окно Data Connections

 

Прямой ввод значений

Теперь необходимо сказать роботу, когда таймер остановиться. Перетащите новый таймер из Services и в окне Add Activity выберите уже существующий таймер, вместо создания нового. Соедините порт сообщений (красный круг) таймера с новым блоком Data (тип данных double, значение 0.0) используя операцию TimerComplete. Это позволит установить исполнение операции на время срабатывания таймера. Мы используем петлю вместо двух блоков таймеров, этот путь четко следует асинхронной парадигме программирования.

Для того чтобы остановить робота необходимо отключить подачу энергии на оба двигателя – левый и правый. Добавьте Join с именамиLeft и Right и присоедините выход Data к их входам. Перетащите новое GenericDifferentialDrive. Снова выберите созданное устройство, вместо добавления нового. Соедините выход Join с входами GenericDifferentialDrive и установите LeftWheelPower для Left и RightWheelPowerдля Right.

Теперь нам необходимо соединить выход GenericDifferentialDrive с таймером, но он уже подключен к другому блоку. Поместите в серединуMerge, который принимает потоки данных как логическое ИЛИ (значение с каждого входа пересылается сразу по готовности). Тем не менее необходимо для входов Merge точно определить как имя, так и тип данных.

 

 

Рисунок 5 – VPL диаграмма для езды по дуге

 

Теперь ваш робот может ездить по дуге, снова попробуйте изменять значения переменных и установки таймера для управления поведением робота.

 

Шаг 3. Езда по 8.

Теперь попробуем немного усложнить задачу: изменим направление движения на полпути по кругу для движения по 8. Удалите только что добавленные блоки Data и Join, но оставьте таймер (измените время ожидания таймера на 6000 мс, приблизительно столько времени необходимо роботу Create для прохождения круга с единичным радиусом. Также освободите блок Merge и заново подсоедините TurningRadiusToWheelPower к GenericDifferentialDrive.

Теперь добавим блок Variable к нашей программе. В VPL Variable(Переменная) это именованное значение с глобальной областью видимости (вы можете использовать блоки Get или Set с ней в любом месте диаграммы). Значения всех переменных отражают состояние вашего приложения. Вы можете получить доступ к переменной из различных потоков данных в диаграмме, таким образом обеспечивая совместное использование информации.

Перетащите новый блок Variable из Basic Activities. Кликните на троеточии для вызова окна Define Variables.

 

Рисунок 6 – Определение переменной

 

Добавьте новую, логическую переменную TurnRight и нажмите OK. Эта переменная определяет поворачивать ли роботу направо или налево. Измените выход логического блока Data присоединив к нему вход новой Variable. Выберите событие Set Value. Теперь вы инициализировали переменную.

 

 

Рисунок 7 – Определение переменной

 

Вы можете получить значение переменной используя другой блок Variable, указав имя переменной и выбрав событие Get. Выходное значение этого события пара название-значение. Добавим блок Calculate и введем имя переменной в него. Простейший путь для получения значения переменной -ключевое слово state. Вы можете использовать его где бы не вводилось выражение. Добавьте блокCalculate и соедините его с выходом Timer. Введите выражение state. TurnRight. На выходе мы получим значение переменной TurnRight. Для изменения значения изменим выражение на!state.TurnRight. Еще раз добавьте блок Variable и укажите переменную TurnRight. Соедините выход блока Calculate с новым блоком Variable и выберите событие Set. Также соедините блок Calculate с полем TurnRight блока Join, предварительно удалив блокData.

Обратим внимание на одну деталь: блок Join ожидает пока на оба его входа не придут значения. Диаграмма посылает значение TurningRadius на Join только один раз, при старте. Нам необходимо посылать его каждый раз через некий промежуток времени. Таким образом необходимо добавить соединение между выходом Timer и входом блока Data.

Если вы запустите эту диаграмму, то ничего не произойдет. Таймер никогда не запустится. Мы должны удостоверится, что сообщениеSetTimer отправлено на Timer. К тому же мы хотим удостовериться, что мы начали движение так скоро, как программа стартовала и не хотим ждать пока таймер сработает первый раз. Скопируйте Join и double Data туда где мы уже инициализировали переменную TurnRight. Соедините boolean Data с Join. Наконец соедините выходы Join с TurningRadiusToWheelPowers через CalculateWheelPowers. Поскольку эта activity уже имеет соединение, добавьте Merge.

 

Рисунок 8 – VPL диаграмма для езды по 8

 

Выше вы видите диаграмму для траектории движения по «восьмёрке». Проверьте данную диаграмму.

 

Шаг 4. Движение по изменяющейся спирали.

Для движения по изменяющейся спирали необходимо всего лишь изменять радиус поворота в каждом цикле выполнения кода. Для выполнения этой модификации добавьте новую переменную с названием TurningRadius и создайте необходимые блоки по аналогии сTurnRight. Однако, в отличии от переключения логического значения TurnRight вам необходимо умножать значение TurningRadius на некоторое число больше 1 (например, 1.1).

 

 

Рисунок 9 – VPL диаграмма для движения по изменяющейся, расширяющейся спирали

 

Выше изображена диаграмма для движения по спирали. Испытайте ее. Вы заметили, что робот не возвращается назад. Причина в жестко заданном времени поворота – 6000 мс. Попытайтесь исправить эту ошибку, вводя новую Variable для значения времени поворота и увеличивая ее на некоторую величину одновременно с радиусом поворота. Этот подход к программированию основан на вычислениях.

Индивидуальные задания студентам приведены в приложении А.

Контрольные вопросы

  1. Microsoft Robotics Developer Studio (MRDS)
  2. Microsoft Visual Programming Language (VPL)
  3. Concurrency and Coordination Runtime (CCR)
  4. Decentralized Software Services (DSS)
  5. Visual Simulation Environment (VSE)
  6. Activities (Активности)
  7. Services (Службы или Сервисы)
  8. Переменные VPL
  9. Значения по умолчанию VPL
  10. Таймеры VPL
  11. Конкурентный контроль потоков с помощью объединений и слияний VPL
  12. Движение по дуге
  13. Движение по 8
  14. Движение по изменяющейся, расширяющейся спирали

 

Список литературы

 

  1. Сайт MICROSOFT [электронный ресурс]: Режим доступа URL:https://www.microsoft.com/en-us/download/details.aspx?id=29081 (дата обращения 05.01.2017)
  2. Сайт MICROSOFT: VPL Hands On Labs [электронный ресурс]: Режим доступа URL:https://msdn.microsoft.com/en-us/library/dd772008.aspx (дата обращения 05.01.2017)
  3. Сайт SLIDEBOOM: Презентация Microsoft Robotics Studio [электронный ресурс]: Режим доступа URL:https://www.slideboom.com/presentations/35149/Microsoft-Robotics-Studio (дата обращения 05.01.2017)
  4. Сайт LEGO MINDSTORMS NXT [электронный ресурс]: Режим доступа URL:https://msdn.microsoft.com/en-us/library/bb905443.aspx (дата обращения 05.01.2017)
  5. Гай В.Е. Microsoft Robotics Developer Studio. Программирование алгоритмов управления роботами.‒ М.: ЭКОМ Паблишерз, 2012. ‒ 184 с.
  6. Сайт Студопедия: В контексте робототехники приложение — это композиция слабосвязанных параллельно выполняющихся компонентов [электронный ресурс]: Режим доступа URL:https://studopedia.org/10-61887.html (дата обращения 05.01.2017)

 


Приложение А

Варианты индивидуальных заданий

1. MobileRobots

2. LEGO NXT

3. Pioneer 3DX

4. iRobot Create



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-03-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: