Загрузил Кирилл Кротов

УМП Основы программирования НРП на языке Python Савельев А.И. Черноусова П.М. и др.

реклама
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное учреждение науки
«Санкт-Петербургский Федеральный исследовательский центр
Российской академии наук» (СПб ФИЦ РАН)
А.И. Савельев, П.М. Черноусова, Д.Б. Асфар,
Е.О. Черских, М.А. Летенков
ОСНОВЫ ПРОГРАММИРОВАНИЯ НАЗЕМНЫХ
РОБОТОТЕХНИЧЕСКИХ ПЛАТФОРМ НА
ЯЗЫКЕ PYTHON
Учебно-методическое пособие
Санкт-Петербург
2023
УДК 007.52
ББК 32.816–04
Рецензенты:
Федеральное государственное автономное образовательное учреждение
высшего образования «Санкт-Петербургский политехнический университет
Петра Великого», доцент, канд. техн. наук, В.В. Потехин
Федеральное государственное автономное образовательное учреждение
высшего образования «Санкт-Петербургский государственный университет
аэрокосмического приборостроения», доцент, канд. техн. наук, С.В. Солёный
Рекомендовано Ученым советом СПб ФИЦ РАН
в качестве учебно-методического пособия по специальности
2.3.5. Математическое и программное обеспечение вычислительных систем,
комплексов и компьютерных сетей
Савельев А.И., Черноусова П.М., Асфар Д.Б., Черских Е.О.,
Летенков М.А.
Основы программирования наземных робототехнических платформ на
языке Python. Учеб.-метод. пособие / СПб ФИЦ РАН. СПб., 2023. 102 с.:
ил. 70
ISBN 978-5-6047036-3-2
Учебно-методическое пособие способствует освоению базовых
понятий и знаний о программировании на языке Python
многофункциональных наземных роботов с распределенной системой
управления. В пособии приводятся теоретические сведения о базовых
принципах функционирования наземных роботов, их механической,
сенсорной, вычислительной системах и рекомендации по разработке
программного
обеспечения
для
управления
наземной
робототехнической платформой на языке Python.
Предназначено для студентов технических ССУЗов и ВУЗов,
аспирантов, обучающихся по специальностям 09.06.01 «Информатика и
вычислительная техника», 09.03.03 «Прикладная информатика»,
13.03.02
«Электроэнергетика
и
электротехника»,
13.04.02
«Электроэнергетика и электротехника», 15.03.04 «Автоматизация
технологических процессов и производств», 15.03.06 «Мехатроника и
робототехника», а также для всех читателей, интересующихся
современными технологиями систем управления, техническим зрением,
наземной
робототехникой,
разработкой
высокоуровневого
программного обеспечения.
©Авторы, 2023
©СПб ФИЦ РАН, 2023
ISBN 978-5-6047036-3-2
2
ОГЛАВЛЕНИЕ
ПРЕДИСЛОВИЕ............................................................................. 6
1
АППАРАТНОЕ ОБЕСПЕЧЕНИЕ НАЗЕМНОЙ
РОБОТОТЕХНИЧЕСКОЙ ПЛАТФОРМЫ .............................. 7
1.1
Колесная база .................................................................. 9
1.2
Вычислительные устройства ..................................... 11
1.3
Периферийные устройства ......................................... 20
Контрольные вопросы............................................................. 24
2
ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ
PYTHON ......................................................................................... 26
2.1
Переменные ................................................................... 26
2.2
Числа ............................................................................... 26
2.3
Строки ............................................................................ 29
2.4
Списки ............................................................................ 30
2.5
Словари .......................................................................... 32
2.6
Кортежи .......................................................................... 33
2.7
Операторы ..................................................................... 34
2.8
Оператор if ..................................................................... 36
2.9
Циклы while ................................................................... 38
2.10
Циклы for ....................................................................... 38
2.11
Функции ......................................................................... 39
Контрольные вопросы............................................................. 41
3
ПРОГРАММИРОВАНИЕ ДВИЖЕНИЯ НАЗЕМНОЙ
РОБОТОТЕХНИЧЕСКОЙ ПЛАТФОРМЫ ............................ 42
3.1
Управление электродвигателями ............................. 42
3.2
Программирование движения вперед и назад,
поворотов направо и налево................................................... 45
3
3.2
Программирование движения на определенное
расстояние .................................................................................. 47
3.3
Программирование поворотов различного радиуса
49
Контрольные вопросы............................................................. 54
4
ПРОГРАММИРОВАНИЕ РАБОТЫ СВЕТОДИОДОВ
ВИДИМОГО И УЛЬТРАФИОЛЕТОВОГО СПЕКТРА ....... 55
Контрольные вопросы............................................................. 59
6
УПРАВЛЕНИЕ СЕРВОПРИВОДОМ ............................... 60
Контрольные вопросы............................................................. 63
7
ПРОГРАММИРОВАНИЕ РАБОТЫ
ИНФРАКРАСНОГО ДАТЧИКА ............................................... 65
Контрольные вопросы............................................................. 70
8
ПРОГРАММИРОВАНИЕ РАБОТЫ
УЛЬТРАЗВУКОВОГО ДАТЧИКА ........................................... 71
Контрольные вопросы............................................................. 76
9
ОСНОВЫ ТЕХНИЧЕСКОГО ЗРЕНИЯ .......................... 77
9.1
Детектирование цветов ............................................... 80
9.2
Разделение изображения на сектора ......................... 83
9.3
Построение траекторий и перемещение
по цветным линиям ................................................................. 85
Контрольные вопросы............................................................. 88
10 ПРОГРАММИРОВАНИЕ ТЕХНИЧЕСКОГО ЗРЕНИЯ
ПРИ ОБРАБОТКЕ ИЗОБРАЖЕНИЙ ARUCO-МАРКЕРОВ
90
Контрольные вопросы............................................................. 93
11 ПРОГРАММИРОВАНИЕ СЧИТЫВАТЕЛЯ RFIDМЕТОК ........................................................................................... 94
4
Контрольные вопросы............................................................. 98
ЗАКЛЮЧЕНИЕ ............................................................................ 99
БИБЛИОГРАФИЧЕСКИЙ СПИСОК.................................... 100
5
ПРЕДИСЛОВИЕ
В настоящее время практико-ориентированная подготовка
является приоритетным направлением во всех областях знаний.
Применение теоретических знаний в практической деятельности,
приобретение
и
закрепление
ключевых
навыков
обучающимися –
способствуют
повышению
качества
образования.
Настоящее учебно-методическое пособие обеспечивает
освоение базовых компетенций в области наземной
робототехники, разработки высокоуровневого программного
обеспечения, технического зрения и социокиберфизических
систем, а также микропроцессорной техники и предназначено
для обучения программированию многофункциональных
роботов с распределенной сенсорной системой на языке Python.
Рассматриваемая наземная робототехническая платформа
представляет собой шасси с четырехколесной кинематикой
дифференциального типа и распределенной трехуровневой
архитектурой системы управления ее электротехническим
оснащением, предназначенной для применения в практической
подготовке студентов технических ССУЗов и ВУЗов.
Кроме того, робототехническая платформа обладает
широкими функциональными возможностями и потенциалом для
его расширения. Управляющий аппаратный комплекс робота
представлен модульной архитектурой и может быть оснащен
дополнительными сенсорными устройствами, электроникой,
мультимедийными или же исполнительными механизмами.
6
1
АППАРАТНОЕ ОБЕСПЕЧЕНИЕ НАЗЕМНОЙ
РОБОТОТЕХНИЧЕСКОЙ ПЛАТФОРМЫ
Развитие
современных
наземных
робототехнических
комплексов (РТК) происходит по принципу увеличения
количества выполняемых в автономном режиме задач с
постепенным снижением функций оператора в процессе
управления роботом. К данному функциональному ряду
относятся технологии локализации и навигации, автономного
управления, группового взаимодействия, а также технического
(машинного) зрения.
Наземная робототехническая платформа (НРП) представляет
собой
шасси
с
четырехколесной
кинематикой
дифференциального типа и распределенной трехуровневой
архитектурой системы управления ее электротехническим
оснащением.
Рассматриваемая НРП (рис. 1.1) предназначена для апробации
базовых
принципов
функционирования
наземных
робототехнических
систем
(РС),
программирования
многофункциональных роботов с распределенной сенсорной
системой и позволяет осуществлять:
− Управление двумя электроприводами колес платформы;
− Управление
светодиодами
видимого
и
ультрафиолетового спектров;
− Обработку данных с инфракрасных датчиков для
движения по линии;
− Обработку данных с RFID-приемника для обеспечения
позиционирования и навигации;
− Обработку данных с ультразвуковых датчиков для
определения расстояния до препятствий, осуществления
локализации и навигации;
− Управление сервоприводом камеры технического зрения.
7
9
1
2
8
7
9
3
5
4
Рисунок 1.1 – Наземная робототехническая платформа
Как видно из рисунка 1.1 в состав базовых элементов
конструкции наземной робототехнической платформы входят:
1. Микрокомпьютер Raspberry Pi 4;
2. Ультразвуковой датчик;
3. Электропривод колесной пары;
4. RFID-датчик;
5. Инфракрасные датчики;
6. Светодиоды видимого и ультрафиолетового спектров;
7. Сервопривод USB-камеры технического зрения;
8. USB-камера;
9. Широконаправленная RPi-камера.
Каждый из представленных компонентов выполняет ряд
функций, что при комплексировании и обработке данных из
различных источников позволяет реализовывать сценарии
управления НРП.
8
1.1
Колесная база
При разработке робототехнических платформ одной из
первоочередных задач является проектирование особенностей ее
конструкции. При этом могут быть созданы различные варианты,
каждый из которых обладает преимуществами и недостатками:
колесный, гусеничный и др. Наиболее популярные и
распространённые
в
настоящее
время
–
колесные
робототехнические платформы. Рассмотрим подробнее их
конструктивные особенности.
Базовым компонентом при реализации такой системы
является колесная база – основная несущая часть конструкции, к
которой крепятся колеса и элементы, приводящие робота в
движение. Кроме того, на колесную базу устанавливаются
дополнительные конструктивные блоки, электроника, навесное
оборудование и прочие периферийные устройства системы.
Основными требованиями, предъявляемыми к колесной базе,
являются прочность и жесткость такой конструкции.
Колесо, являясь наиболее популярным механизмом
перемещения, как в робототехнике, так и в транспортных
средствах в целом, обеспечивает достижение высокой
эффективности перемещения при относительно простой
механической реализации. Стоит отметить, что существует
четыре основных типа колес (рис. 1.2):
− Стандартное (неповоротное) колесо – 2 степени свободы;
вращение происходит вокруг моторизованной колесной оси и
точки соприкосновения с поверхностью (рис. 1.2 а);
− Поворотное колесо – две степени свободы; вращение
происходит вокруг смещенного колесного шарнира
(рис. 1.2 б);
− Шведское колесо/колесо Илона – три степени свободы;
вращение происходит вокруг моторизованной колесной оси,
вокруг осей роликов и вокруг точки соприкосновения; ролики
могут быть размещены двумя различными способами: 90° или
же 45° (рис. 1.2 в, г);
− Шаровое колесо – всенаправленное колесо, которое часто
сконструированное таким образом, что оно может активно
вращаться в любом направлении. (рис. 1.2 д).
9
а)
б)
в)
г)
д)
Рисунок 1.2 – Основные типы колес: а) Стандартное колесо;
б) Поворотное колесо; в-г) Шведское колесо; д) Шаровое или
сферическое колесо
Рассматриваемая робототехническая платформа обладает
четырехколесной кинематической схемой с неповоротными
колесами, попарно связанными и приводящимися в движение
двумя отдельными электроприводами, преобразующими
электрическую энергию в механическую и обратно. (рис. 1.3).
1
2
Рисунок 1.3 – Элементы колесной базы НРП:
1. Колесо; 2. Электропривод
Элементами колесной базы являются: электропривод и
колесо, а управление движением робота осуществляется подачей
необходимого значения частоты вращения на каждый из двух
двигателей, которые расположены на колесных парах (слева и
справа соответственно).
10
1.2
Вычислительные устройства
В представленной наземной робототехнической платформе
используется микрокомпьютер Raspberry Pi 4 (рис. 1.4) –
одноплатный компьютер с операционной системой Raspberry Pi
OS на базе Debian, при помощи которого осуществляется
высокоуровневое управление роботом.
Рисунок 1.4 – Микрокомпьютер Raspberry Pi 4
Raspberry Pi 4 обеспечивает производительность настольного
компьютера (ПК), сравнимую с системами начального
уровня x86. Технические характеристики микрокомпьютера
представлены в табл. 1.1.
11
Таблица 1.1 – Технические характеристики Raspberry Pi 4
Наименование
характеристики
Однокристальная система
Центральный процессор
Графический процессор
Оперативная память
Стандарт Wi-Fi
Стандарт Bluetooth
Частотный диапазон
Цифровой
аудио/видеовыход
Максимальное выходное
разрешение
Аналоговый
аудио/видеовыход
Порты для периферии
Порт для камеры
Порт для экрана
Карта памяти
Порты ввода-вывода GPIO
Напряжение питания
Максимальный ток
потребления
Габариты
Значение
SoC Broadcom BCM2711
4-ядерный 64-битный CPU на
ARM Cortex A72 с тактовой
частотой 1,5 ГГц
VideoCore VI GPU с тактовой
частотой 500 МГц
4 ГБ LPDDR4-3200 SDRAM
802.11 b/g/n/ac
v5.0 с BLE
2,4 / 5 ГГц
micro-HDMI версии 2.0, 2 шт.
2160p (60 Гц)
4-контактный мини-джек 3,5
мм
USB 2.0, 2 шт.
USB 3.0, 2 шт.
Camera Serial Interface (MIPI
CSI)
Display Serial Interface (MIPI
DSI)
microSD
40
5В
3А
85×56×17 мм
На лицевой стороне платы Raspberry Pi 4 расположен
40-контактный разъем GPIO (General Purpose Input/Output) для
подключения цифровых датчиков, модулей расширения и другой
периферии. Выходы MIPI DSI и MIPI CSI предназначены для
дисплеев и камер. Рядом с разъемами GPIO размещен
экранированный модуль для Wi-Fi и Bluetooth 5.0. Внизу
12
расположен слот для microSD. Рядом с процессором находится
оперативное запоминающее устройство (ОЗУ) DDR4.
Расположение контактов GPIO на устройстве представлено на
рисунке 1.5.
Центральный
процессор
GPIO
Порты для
периферии
(USB)
Карта
памяти
USB-C
Цифровой
аудио/видеовыход
Порт для
камеры
(CSI)
Рисунок 1.5 – Расположение GPIO на Raspberry Pi 4
Первый ряд выводов включает в себя:
− Питающие (Power) – 1 и 17 штырек;
− Заземляющие (Ground или RND) – 9, 25 и 39;
− Порты (BCM) – все остальные.
Второй ряд (предназначенный для 5-вольтных устройств)
имеет иное назначение:
− Питающие являются смежными – 2, 4 пины;
− Заземляющие – 6, 14, 20, 30 и 34;
− Порты – все остальные.
Нумерация GPIO Raspberry Pi выполняется не сверху вниз по
рядам, а по горизонтали: 1 – 3,3V, 2 – 5V, 3 – порт, 4 – 5V, 5 –
порт, 6 – заземление, 7 – порт, 8 – первый порт для 5-вольтных
устройств и т.д. (рис. 1.6). Также на GPIO есть специальные
порты, которые возможно применять не по прямому назначению,
13
однако – делать это не рекомендуется. К ним относятся BCM 0 и
BCM 1, которые в схеме имеют номера 27 и 28 соответственно.
Эти порты предназначены для поверхностного монтажа – HATустройств (плат расширения).
Рисунок 1.6 – Распиновка GPIO Raspberry Pi 4
Кроме Raspberry Pi в различных модулях НРП используются
микроконтроллеры GD32F103C8T6 (далее GD32) и ESP32 –
вычислительные устройства, выполняющие последовательность
инструкций, т.е. программы. Данные микросхемы отвечают за
все
производимые
вычисления,
коммуникацию,
комплексирование данных и принятие решений на низком
уровне.
14
С точки зрения схемотехники МК представляет собой
однокристальный компьютер, в состав которого входит
процессор, постоянное запоминающее устройство (ПЗУ), ОЗУ и
интерфейсы периферийных устройств. Существует большое
количество различных микроконтроллеров, различающихся по
типу процессора, объему памяти, составу периферийных
интерфейсов и пр.
В состав периферии МК, как правило, включены: цифровые и
аналоговые порты ввода/вывода (GPIO); интерфейсы вводавывода, такие как: UART, I²C, SPI, CAN, USB, IEEE 1394,
Ethernet; широтно-импульсные модуляторы (ШИМ); массивы
встроенной flash-памяти.
Микроконтроллеры серии GD32 (рис. 1.7) являются
аналогами микроконтроллеров STM32, построенных на базе
архитектуры ARM. В основе GD32 – ядро Cortex-M3,
выполненное по гарвардской архитектуре, используемые
регистры являются 32-разрядными. В арифметико-логическом
устройстве, которое входит в состав ядра, возможно аппаратное
деление и умножение 32-разрядных переменных. Доступ к
памяти программ (flash) и память данных (static random access
memory – SRAM) является независимым. Объем flash-памяти
составляет 64 КБ, SRAM – 20 КБ.
Рисунок 1.7 – Микроконтроллер GD32
В микроконтроллере GD32 реализовано 37 входов/выходов
(рис. 1.8), которые можно сконфигурировать под следующие
функции:
− Для
реализации
счетчика
времени,
измерения
длительности импульсов, режима генерации импульсов с
переменной
скважностью
(коэффициент
заполнения
импульса, изменяющийся в диапазоне от 0 до 1), режима
энкодера и пр. можно настроить 4 четырехканальных таймера
– 16 выводов.
15
− Для измерения аналоговых сигналов доступно 10 каналов
аналого-цифрового преобразователя (АЦП) с разрешением 12
бит и максимальной частотой 12 МГц. Также МК обладает
двумя дополнительными каналами, которые позволяют
измерять
напряжение
питания
и
температуру
микроконтроллера. Общий принцип работы аналогоцифровых преобразователей заключается в том, что
непрерывный входной сигнал разбивается по целым
дискретным значениям, количество которых зависит от
разрядности. Для данного МК максимальное количество
равно 4095 или 212-1 (разрядность преобразователя – степень
2),
которое
соответствует
напряжению
питания,
составляющее примерно 3,3 В. Уменьшение входного
напряжения приведет к уменьшению измеренного значения:
например, 1,6 В входного напряжения соответствует значение
1,6/3,3 ∙ 4095 ≈ 1985 единиц.
− Для передачи данных в микроконтроллере реализованы
такие периферийные протоколы, как UART (с возможностью
синхронной передачи) с максимальной скоростью передачи
4,5 Мбит/с, USB со скоростью обмена данными 12 Мбит/с, SPI
с максимальной скоростью 18 Мбит/с, I2С с максимальной
частой тактирования 400 кГц, а также CANbus с возможной
максимальной скоростью передачи 1 Мбит/с.
− Для загрузки программ доступны интерфейсы JTAG и
SWD.
Максимально
частота
тактирования
ядра
микроконтроллера равна 108 МГц, что больше его аналога,
максимальная частота тактирования которого равна 72 МГц.
Микроконтроллеры GD32 установлены в модулях с
ультразвуковыми и инфракрасными датчиками для измерения
сигналов, а также в модуле RFID-приемника.
Взаимодействие микроконтроллера с ультразвуковыми
датчиками реализовано с помощью двух выводов, один из
которых подает сигнал запуска датчика для генерации
ультразвуковой волны, а другой – принимает сигнал от датчика.
С помощью таймера GD32 измеряется длительность импульса на
данном выводе: при запуске датчик поднимает выходное
напряжение до высокого логического уровня (логическая 1,
соответствующая диапазону напряжений 1,88–3,6 В), затем при
получении отраженной ультразвуковой волны на этом выводе
16
устанавливается низкий логический уровень (логический 0,
соответствующий напряжению не больше 1,23 В).
Рисунок 1.8 – Распиновка микроконтроллера GD32F103C8T6
Используя
известную
величину
распространения
испускаемой волны в воздушной среде (≈ 331 м/с), а также
длительность импульса, можно вычислить расстояние до
объекта, от которого была отражена волна.
В модуле инфракрасных датчиков GD32 использует таймер
для генерации импульсов, которые подаются на излучатели
данных датчиков, а также несколько каналов аналого-цифрового
преобразователя для измерения сигналов от инфракрасных
приемников. В модуле RFID-приемника происходит обмен
данными GD32 с микросхемой RFID-считывателя посредством
SPI на скорости 4 Мбит/с для получения данных RFID-метки
(например, идентификатора).
Микроконтроллер ESP32 (рис. 1.9) установлен на отдельном
модуле для управления электродвигателями и сервоприводом
камеры технического зрения, а также для ретрансляции данных с
других модулей на Raspberry Pi 4 через USB-интерфейс.
17
Рисунок 1.9 –Микроконтроллер ESP32
В основе микроконтроллера использован двухъядерный
процессор Tensilica Xtensa LX6 с 32-разрядными инструкциями и
регистрами. Объем SRAM-памяти составляет 520 КБ, flashпамяти – 448 КБ, кроме того, доступно подключение до 16 МБ
внешней flash-памяти по интерфейсу SPI.
В микроконтроллере реализован 21 вывод (рис. 1.10), которые
настраиваются на генерацию и получение сигналов, а также 4
вывода, предназначенные только для приема входных сигналов.
Для измерения аналоговых сигналов возможна настройка 15
каналов АЦП с разрядностью до 12 бит, а также два 8-битных
канала. Возможна настройка 16 каналов генерации импульсов с
переменной скважностью. Для передачи данных реализованы
следующие интерфейсы: UART, SPI, I2C с аналогичными GD32
скоростями передачи данных. Кроме того, отличительной
особенностью данных микроконтроллеров является возможность
передачи данных с помощью беспроводных интерфейсов Wi-Fi
(802.11 b/g/n – 2,4 ГГц) и Bluetooth (BLE v4.2 BR/EDR).
Максимальная
частота
тактирования
микроконтроллера
составляет 240 МГц.
Для управления электродвигателями колес используются две
пары выводов, каждая из которых управляет скоростью
вращения двух колес робототехнической платформы. Один
вывод отвечает за подачу логического сигнала, обозначающего
направление вращения (например, логический 0 – вращение по
часовой стрелке, 1 – против), второй вывод настраивается на
генерацию импульсов с частотой 1 кГц, величина скважности
которых влияет на скорость вращения колес. При скважности,
равной 1 сигнал становится постоянным, если меньше,
то – импульсным.
18
Рисунок 1.10 – Распиновка модуля ESP-WROOM-32 (микроконтроллер ESP32 в составе)
Угловое положение выходного звена сервопривода
изменяется встроенным регулятором, угол задается с помощью
отдельного вывода микроконтроллера, соединенного с
регулятором. Данный вывод настроен на генерацию импульсов,
частота которых составляет 50 Гц (то есть максимальная
длительность импульса 1/50 = 0,02 с). В зависимости от значения
скважности импульсов встроенный регулятор будет изменять
угол поворота – таким образом изменяется наклон камеры
системы технического зрения. Например, для поворота на
камеры на 180° на вход регулятора сервопривода следует
подавать импульсы длительностью 0,0024 с, тогда скважность
импульсов будет равна 0,0024 / 0,02 = 0,12. Максимальная
длительность импульсов, таким образом, составляет 0,0048 с,
поскольку в таком случае выходное звено повернется на 360°.
Все модули на базе микроконтроллеров GD32 и ESP32 имеют
между собой подключение по CAN-шине, через которую
осуществляется обмен данными между микроконтроллерами на
скорости 500 кбит/с. Данная шина представляет собой
двухпроводной интерфейс, не требующий общего провода
(провод, потенциал которого принят за 0) для обмена данными,
поскольку основная логика кодирования и декодирования
сообщений связана с разностью потенциалов между
сигнальными проводами, что имеет аппаратную реализацию на
базе
отдельных
микросхем-трансиверов.
CAN-шина
предполагает параллельное подключение различного числа
устройств, количество которых зависит от длины всей шины, а
также от количества байт передаваемых данных. Поскольку
микроконтроллер ESP32 не имеет встроенного USB-интерфейса,
в наземной робототехнической платформе используется UARTUSB преобразователь CH340 для передачи данных на
микрокомпьютер Raspberry Pi 4, а также для загрузки программ в
память МК.
Периферийные устройства
Измерение
параметров
окружающей
среды
робототехническими системами производится за счет
использования информационно-измерительной системы (ИИС) –
совокупности встроенных датчиков и сенсорных устройств. К
ИИС относятся дальномеры и датчики расстояния, датчики и
1.3
20
измерители освещенности, датчики шума, различные магнитные
датчики, а также системы технического зрения, гирокомпасы,
акселерометры, температурные датчики и др. На представленной
робототехнической платформе установлены ультразвуковые
датчики расстояния, инфракрасные датчики линии, датчики
идентификации меток, система технического зрения.
Рассмотрим элемент платформы – ультразвуковой (УЗ) датчик
расстояния HC-SR04 (рис. 1.11), используемый для обнаружения
объектов, измерения расстояний до них. Для корректного
выполнения всех поставленных пользователем задач на корпусе
робототехнической платформы установлено 5 УЗ-датчиков: один
на фронтальной части и 4 по остальному периметру корпуса.
Следует отметить, что данное сенсорное устройство применяется
при рассмотрении задачи прохождения лабиринта в данном
пособии.
Рисунок 1.11 – Ультразвуковой датчик расстояния HC-SR04
Инфракрасный (ИК) датчик (рис. 1.12), установленный на
робототехнической платформе способен различать градацию
отраженного сигнала в зависимости от попавшей в зону
видимости поверхности.
21
Рисунок 1.12 – Инфракрасный датчик
Принцип работы данного устройства основан на отражении
оптического сигнала и позволяет реализовывать сценарии
движению робота по контрастной обозначенной линии. На
роботе установлено 5 ИК-датчиков.
Поскольку локализация и навигация робототехнической
платформы периодически осуществляется в затемненных
участках трасс, на корпусе робота расположено собственное
устройство для освещения пространства, аналогичное фарам
автомобиля – светодиоды (рис. 1.13).
Робот имеет 2 пары светодиодов: ультрафиолетовые (УФ) и
видимого спектра. Первые используются для обнаружения слабо
различимых человеческим глазом элементов трассы, а вторые
для подсветки затемненных участков трассы.
Для считывания данных с периферийных устройств НРП
используются специализированное программное обеспечение,
которое будет рассмотрено в следующих разделах.
22
1
2
Рисунок 1.13 – Светодиоды в составе НРП расположены
симметрично относительно оси: по краям – УФ-диоды (1),
ближе к центру – светодиоды видимого спектра (2)
Реализацию технического зрения робота обеспечивают
одновременно две камеры, разрешения которых составляет
640x480, установленные на платформе, каждая из которых
охватывает конкретную область для обеспечения локализации,
навигации и позиционирования в пространстве, а также
назначением может служить распознавание объектов по их
контуру, цвету, размерам и генерация траекторий перемещения
для взаимодействия с ними.
На основе используемых сенсоров технического зрения
возможно осуществлять распознавание различных кодов: QR,
ArUco и решение других типов задач данной области.
Сверху на корпусе робота расположена широконаправленная
камера для Raspberry Pi (RPi-камера), ниже – USB-камера
(рис. 1.14).
23
Рисунок 1.14 – Камеры технического зрения:
Широконаправленная RPi-камера (верхняя);
USB-камера (нижняя)
Широконаправленная RPi-камера охватывает большую часть
пространства, что, в свою очередь, облегчает локализацию и
навигацию робота. Благодаря использованию данного устройства
пользователь получает диагональный (160°) и горизонтальный
(120°) углы обзора пространства, находящегося перед
робототехнической платформой.
USB-камера выполняет роль узконаправленной камеры и
предоставляет обзор пространства, находящегося прямо перед
колесами робота. При изучении принципов использования
технического зрения именно с ее помощью реализуется любые
операции, например движение по линии.
Кроме того, функционал робота предусматривает изменение
угла наклона данной камеры при помощи встроенного
сервопривода.
Контрольные вопросы
1 Апробацию
каких
базовых
принципов
функционирования наземных РС позволяет осуществлять робот?
2 Что входит в конструкцию робототехнического средства?
24
3 Какая колесная база использована при реализации
рассматриваемой робототехнической платформы?
4 Перечислите вычислительные устройства в составе
системы.
5 Какие порты GPIO предназначены для поверхностного
монтажа – HAT-устройств? Назовите их номера.
6 Назовите процессор, использованный в основе
микроконтроллера ESP32. Какое количество выводов
реализовано в последнем?
7 Где расположены УЗ-датчики робота? И каким образом
они расположены?
8 Какие визуальные объекты может распознаться
робототехническая платформа посредством технического
зрения?
9 Раскройте аббревиатуру ИИС и дайте определение.
10 Опишите принцип работы ИК-датчика.
25
2
ОСНОВЫ ПРОГРАММИРОВАНИЯ
НА ЯЗЫКЕ PYTHON
Язык программирования Python достаточно популярен в
настоящее время. Это мощный инструмент для создания
программ, используемый при анализе данных, машинном
обучении, веб-разработке и в других сферах, который доступен
даже для начинающего пользователя. За счет простоты
синтаксиса и отсутствия процесса компиляции Python подходит
для обучения программированию, позволяя концентрироваться
на изучении разнообразных принципов разработки ПО и
реализации алгоритмов. Данный раздел посвящен основам языка
программирования Python 3.X, где приводится базовое
представление о типах, операторах и их ролях, а также функциях.
2.1
Переменные
Python имеет несколько встроенных типов объектов.
Встроенными они называются, так как в отличии от других
языков программирования Python не требуется их реализации.
Прежде чем перейти к перечислению типов объектов, следует
дать определение переменной. Переменная – это “ячейка”
памяти, в которой хранятся какие-либо данные. Эти данные
называются значением переменной. Значения переменных в
Python определяются с помощью оператора присваивания =.
>>> x = 15
С помощью оператора присваивания = значение правого
операнда (15) присваивается левому (x).
2.2 Числа
В Python числа представлены двумя типами: int – целые
(англ. integer – целое число), которые могут быть
положительными и отрицательными, и вещественные float
(англ. float number – число с плавающей точкой). Примеры чисел
типа int и float: 12, 3.1415, 2+4j, 0b111, Decimal(), Fraction().
Целое число задается следующим образом:
>>> x = 3
26
Вещественное число:
>>> y = 3.0
Возможна конвертация int в float и float в int. При
конвертировании float в int дробь не округляется. Дробная
часть просто отбрасывается и остается целая составляющая.
>>> float(3)
3.0
>>> int(3.8)
3
Производимые над числами математические операции
представлены в таблице 2.1 операциями выражений,
встроенными математическими функциями и служебными
модулями.
Таблица 2.1 – Виды производимых операций
Вид операции
Сложение
Вычитание
Умножение
Деление
Получение целой части от деления
Остаток от деления
Смена знака числа
Получение модуля числа
Возведение в степень
Генерация случайного числа
Обозначение в Python
x + y
x – y
x * y
x / y
x // y
x % y
– x
abs(x)
x ** y
random
Примеры выполнения некоторых операций:
>>> 3 + 6
9
>>> 16 / 2
8
>>> 14 % 5
4
>>> 3 ** 2
9
27
Кроме оператора = в Python используются и другие операторы
присваивания, перечисленные в таблице 2.2.
Таблица 2.2 – Виды производимых операций
Описание операции
Прибавление к x величины y и
присваивание x полученного
значения
Вычитание из x величины y и
присваивание x полученного
значения
Умножение x на величину y и
присваивание x полученного
значения
Деление x на величину y и
присваивание x полученного
значения
Целочисленное деление x на
величину y и присваивание x
полученного значения
Вычисление остатка от деления x на
величину y и присваивание x
полученного значение
Возведение x в степень y и
присваивание x полученного
значения
Обозначение в Python
x += y
x -= y
x *= y
x /= y
x //= y
x %= y
x **= y
В Python можно производить сравнение чисел. Сравнение
возвращает булевый результат true/false, значение которого
используется для дальнейших операций.
>>> 5 > 4
False
Числа разнородных типов преобразуются в десятичные: 3 в 3.0
>>> 4.3 >=3
True
Равенство значение обозначается следующим образом:
>>> 2.0 == 2.0
28
Неравенство:
>>> 2.0 1= 2.0
2.3
Строки
Строка (англ. string) применяется для записи текстовой
информации. Строки представляют собой последовательности
элементов с порядком сохранения/извлечение слева направо.
Строки выделяются двойными или одинарными кавычками. Все
что помещено внутрь кавычек является элементами строки.
>>> string = “Пример строки”
Вывод данных на экран осуществляется с помощью функции
print():
>>> print(string)
Пример строки
Числа также возможно конвертировать в строку, как и строку
в число, если та содержит только цифры:
>>> str (3)
‘3’
>>> int (‘3’)
3
Ввод данных осуществляется с помощью функции input()
для Python 3.X:
>>> string = raw_input(‘Write something: ’)
Write something: hello!
>>> print (string)
hello!
Каждый элемент строки имеет свой номер, называемый
индексом. Нумерация списка начинается с нуля. Обратиться к iму элементу списка можно, используя квадратные скобки.
>>> string = ‘abcdefg’
>>> string[0]
‘a’
>>> string[5]
‘f’
Также существуют отрицательные индексы. Нумерация идет
с конца строки и начинается с -1.
29
>>> string[-1]
‘g’
>>> string[-4]
‘d’
Используемые для строк методы перечислены в таблице 2.3.
Таблица 2.3 – Методы строк
Описание операции
Сложение строк
Повторение строки n раз
Обращение к элементу строки по
индексу i
Длина строки
Приведение строки к верхнему
регистру
Приведение строки к нижнему
регистру
Проверка, состоит ли строка
только из букв
Проверка, состоит ли строка
только из цифр
Проверка, состоит ли строка
только из цифр и букв
Обозначение в Python
S1 + S2
S1 * n
S[i]
len(s)
S.upper()
S.lower()
S.isalpha()
S.isdigit()
S.isalnum()
Кроме перечисленных методов существуют и другие. Увидеть
полный список доступных методов позволяет встроенная
функция dir, аргументом которой должно быть имя строки. В
случае если функция вызывается без аргументов, она выведет
список переменных, присвоенных в области видимости
вызывающего объекта.
2.4
Списки
Списки являются позиционно упорядоченными коллекциями
объектов произвольных типов. Списки могут быть подвергнуты
изменениями путем присваивания по смещениям и вызова
определенных методов (таблица 2.4).
30
Таблица 2.4 – Методы списков
Описание операции
Добавление элемента x в
конец списка list
Вставка на i-ый элемент
значения x
Удаление первого элемента в
списке, имеющего значение x
Удаление i-го элемента и его
возвращение
Возвращение количества
элементов со значением x
Инвертация списка
Сортировка списка
Обозначение в Python
list.append(x)
list.insert(i, x)
list.remove(x)
list.pop(x)
list.count(x)
list.reverse()
list.sort()
Списки
поддерживают
те
же
операции
над
последовательностями, которые применимы для строк, так как
являются последовательностями. Результатом применения
операции будет список. Ниже показан пример приведенной в
таблице 2.2 операции len(), позволяющей узнать длину списка
(количество его элементов).
>>> List = [123, ‘element’, 3.14]
>>> len(List)
3
Список может быть сформирован из элементов строки
посредством функции list():
>>> string = (‘12345’)
>>> lst = list(string)
>>> print (lst)
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]
Списки не имеют фиксированных размеров. Посредством
специфичных для списков операций list.append(x) и
list.pop(x) их можно увеличивать и уменьшать. При
увеличении списка, добавляемый элемент будет помещен в конец
списка. Удаление элемента происходит по заданному смещению.
При этом нельзя присвоить списку элемент, который будет
находиться за его приделами. Так, если список lst содержит 5
31
элементов, нельзя присвоить добавляемого элементу индекс,
выходящий за допустимые пределы lst[56].
2.5
Словари
Словари, в отличие от строк и списков, не является
последовательностями. Они хранят объекты по ключам, а не по
позициям и являются отображениями. Словари отображают
ключи на связанные значения. Словарь создается следующим
образом:
>>> Dict = {}
Присваивание новому ключу словаря приводит к созданию
этого ключа.
>>> Dict[‘name’] = ‘Michael’
>>> Dict[‘age’] = ‘25’
>>> Dict[‘position’] = ‘programmer’
В результате словарь будет содержать три элемента и
выглядеть так:
>>> print(Dict)
{‘name’: ‘Michael’,
‘programmer’}
‘age’:
‘25’,
‘position’:
При создании словарей также возможно использование
аргументом с ключевыми словами или передачи имени dict.
>>> Info = dict(name = ‘Michael’, age = ‘25’,
position = ‘programmer’)
>>> Info
{'name': 'Michael', 'age': '25', 'position':
'programmer'}
Связывание:
>>> Info = dict(zip([‘name’, ‘age’, ‘position’],
[‘Michael’, ‘25’, ‘programmer’])
>>> Info
{'name': 'Michael', 'age': '25', 'position':
'programmer'}
Словари обеспечивают доступ к элементам только по ключу.
Кроме этого, они поддерживают следующие типы специфичных
для них операций, показанные в таблице 2.5.
32
Таблица 2.5 – Методы словарей
Описание операции
Очистка словаря dict
Возвращение пары (ключ, значение)
Возвращение ключей в словаре в виде
списка
Возвращение значений в словаре в
виде списка
Удаление и возвращение пары (ключ,
значение)
Обновление словаря, добавление
пары (ключ, значение) из items.
Перезапись существующих ключей.
Обозначение в
Python
dict.clear()
dict.items()
dict.keys()
dict.values()
dict.popitem()
dict.update([it
ems])
2.6 Кортежи
Кортежи являются последовательностями и, также, как и
списки, неизменяемы. Кортежи используются для создания
фиксированных коллекций элементов и таким образом
обеспечивают целостность, что удобно при создании больших
программ.
>>> T = (1, 2, 3)
>>> len(T)
3
Конкатенация объектов:
>>> T + (4, 5)
(1, 2, 3, 4, 5)
Индексация объектов кортежа T = (1, 2, 3), (единица
имеет нулевой индекс):
>>> T[2]
3
Так как кортежи не изменяемы попытка изменения второго
элемента вышеприведенного кортежа T приведет к ошибке типа
«объект не поддерживает назначение элемента»:
>>> T[2] = 4
Traceback (most recent call last):
33
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item
assignment
Для создания нового кортежа для нового значения требуется
хвостовая запятая.
>>> T = (2,) +T[1:]
>>> T
(2, 2, 3)
Кортежи поддерживают смешанные типы и вложения, но их
размер при этом не изменяется.
>>> T = ‘pi, 3.14, [15, 92, 65]
>>> T[1]
3.14
>>> T[2][1]
92
Если запросить третий элемент объекта, то возникнет ошибка
атрибута “ объект tuple не имеет атрибута append”, так как T
содержит нулевой, первый и второй элементы:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute
'append'
2.7 Операторы
Операторы в Pyhton имеют специфические назначение и
синтаксис. Они используются для выполнения действий, повтор
задачи, выбора, создания крупных программных структур. В
таблице 2.6 приведены некоторые операторы.
34
Таблица 2.6 – Операторы Python
Оператор
Присваивание
Вызовы print
Описание
Создание
ссылок
Вывод объектов
на экран
if/elif/else
Выбор действий
for/else
Итерация
while/else
pass
Универсальные
циклы
Пустой
заполнитель
break
Выход из цикла
continue
Продолжение
цикла
def
Функции и
методы
return
Результаты
функций
import
from
del
Доступ к
модулям
Доступ к
атрибутам
Удаление
ссылок
Пример
a, b = ’good’,
’bad’
print ('The Code')
if "python" in
text:
print(text)
for x in mylist:
print(x)
while X > Y:
print('hello1)
while True:
pass
while True:
if exittest():
break
while True:
if skiptest ():
continue
def f (a, b, c=l,
*d):
print(a+b+c+d[0J)
def f (a, b, c=l,
*d):
return a+b+c+d[0]
import sys
from sys import
stdin
del data[k]
del data[i:j]
del obj.attr
del variable
Как можно заметить, составные операторы имеют общий
шаблон записи.
Заголовок:
Вложенный блок
35
Здесь важно помнить о наличии двоеточия после заголовка
оператора. Его отсутствие приведет к ошибке. Перед вложенным
блоком имеется отступ равный четырем пробелам или одной
табуляции. Табуляции и пробелы смешивать не рекомендуются.
Использование табуляции более предпочтительно. Отступы
позволяют выравнивать код по столбцам в соответствии с
логической структурой, кроме того, код становится более
удобным для чтения. Они также являются частью синтаксиса,
потому неверная их расстановка или отсутствие приведет к
возникновению ошибок.
2.8 Оператор if
Составной оператор if выбирает действия для дальнейшего
выполнения. Составным он называется, потому что может
включать в себя другие операторы, в том числе и if. Рассмотрим
пример с двумя if. Часть else логически связана с оператором
if, с которым она выравнена по вертикали.
if х:
if у: оператор 1
else:
оператор 2
Оператор if является своего рода проверкой на соответствие
условию или условиям. Проверка, обозначаемая elif (англ. else
if; рус. иначе, если), может быть, одна или их может быть
несколько. Else – это финальный блок, но его наличие не
является обязательным.
Когда оператор if запускается, то каждая проверка начинает
выполняться в соответствии с частями else и вложенными
операторами. Если первая проверка дает истинный результат, то
Python выполняет соответствующий блок кода, если результат
ложный, то Python переходит к запуску блока else.
if проверка 1:
оператор1
elif проверка2:
оператор2
else: оператор3
36
Простейший пример использования оператора if, где “…”
приглашение ко вводу строк от IDLE.
>>> if 1:
...
print(‘True’)
...
True
Пример более сложного оператора if:
>>> x = 1
>>> if x == 1:
...
print('x = 1')
... else:
...
print('x! = 1')
...
x = 1
Пример
использования
необязательных частей:
if
с
содержанием
всех
>>> х = input()
>>> if х == '0’:
...
print("False")
... elif x = ’1’:
...
print("True")
... else:
...
print('The value of x must be equal to 0
or 1!’)
...
The value of x must be equal to 0 or 1!
True это интерпретация числа 1, а False – числа 0. Проверка
может давать булево значение, то есть либо ложь, либо истину;
ноль или единицу. В примере использования if с содержанием
всех необязательных частей, пользователю предлагается ввести
число. Если введен 0, то программа выведет на экран строку
“False”. Если введена 1, то пользователь увидит строку
“True”. Если введено иное значение, то пользователь будет
проинформирован о не допустимых для ввода значениях.
37
2.9 Циклы while
Циклы повторяют действия до тех пор, пока выполняется
заданное условие. Оператор while используется для
универсальных циклов. Общий формат цикла while выглядит
следующим образом:
while проверка
операторы
else:
операторы
Здесь есть заголовок с выражением проверка, тело с
операторами (или с оператором), и необязательная часть else.
Оператор else выполняется в том случае, если управление
покидает цикл – Python продолжает оценивать выражение
проверки и выполняется операторы до тех пор, пока проверка не
вернет ложное значение.
Рассмотрим пример цикла while в его более простой форме:
>>> x = 0; y = 5
>>> while x < y:
... print (x, and = ‘ ‘)
... x += 1
...
0 1 2 3 4 5
До тех пор, пока значение y не превысит значение x цикл
будет выполняться, прибавляя к x единицу.
2.10
Циклы for
Цикл for проходит по элементам итерируемого объекта и
выполняет блок кода для каждого из них. Оператор for работает
со всеми рассмотренными типами объектов. Цикл for, так же,
как и while начинается с заголовка. Затем идет блок операторов.
for цель in объект:
операторы
else:
операторы
Следующий пример вычисляет сумму всех чисел из массива:
>>> sum = 0
>>> for х in [1, 2, 3, 4]:
38
... sum = sum + x
...
>>> sum
10
Здесь целью является x, объектом является набор чисел [1, 2,
3, 4].
2.11 Функции
Функции являются способом группировки операторов в
единое целое, позволяющие многократно выполнять их в
программе. Таким образом можно избежать копирования и
вставки тех частей кода, использование которых требуется
повторно. В рамках данного пособия рассмотрим некоторые
операторы и выражения, необходимые для функций,
представленные в таблице 2.7.
Таблица 2.7 – Операторы и выражения
Оператор или
выражение
Выражения вызовов
def
return
global
yield
Пример использования
Myfunc(‘func1’,
apple=fruit, *rest)
def printer(message):
print(‘Hello “ +
message)
def addler(a, b = 1, *c):
return a + b + с[0]
x = ‘old’
def chanher():
global x; x = ‘new’
def squares(x):
for i in range (x):
yield i ** 2
Функции сводят к минимуму избыточность кода путем
упаковки логики, группировки и преобразования кода.
Оператор def, представленный в таблице 2.7 является
исполняемым кодом. С помощью данного оператора создаются
все функции в Python. Функция не будет существовать для языка
Python пока он не встретит и не выполнит def. Как только это
произойдет, сгенерируется новый объект функции, которому
39
присваивается имя функции, что, в свою очередь, становится
ссылкой на объект функции.
def имя(аргумент1, аргумент2, ... аргументN):
операторы
Оператор return отправляется результирующий объект
коду, который вызвал функцию. Возвращаемое значение — это
результат работы функции, который далее используется в коде.
Если значение отсутствует, то оператор отправляет результат по
умолчанию – None.
def имя {аргумент 1, аргумент2, ... аргументN):
...
return значение
>>> def multi(x, y):
...
return x * y
...
Оператор global объявляет переменные уровня модуля,
предназначенные для присваивания. Имена, присеваемые в
функции, существуют только во время ее выполнения и являются
локальными. Для присвоения значения имени из включаемого
модуля нужно указать его в global внутри функции. Однако
данный оператор не рекомендуется использовать при разработке
программного обеспечения в связи с тем, что он может внести
неоднозначность при использовании локальных и глобальных
переменных и сложности при разработке крупных проектов.
Оператор yield используется для оправки результата
вызывающему коду, но запоминает место остановки. Так что
работа может быть возобновлена позже для получения серии
результатов с течением времени.
Если при создании функции указано определенное количество
передаваемых ей аргументов и их порядок, то и вызывать ее
необходимо с тем же количеством аргументов, заданных в
определенном порядке.
def student(name, age, gender, grade):
...
print(name, ‘is’, age, ‘years old’ gender,
grade)
Student(name=Julia,
age=16,
gender=female,
grade=10)
40
Функция student имеет четыре передаваемых аргумента.
Ключевые аргументы могут использоваться в произвольном
порядке при вызове функции.
Контрольные вопросы
1 Что является переменной в Python?
2 О
каких
встроенных
типах
объектов
программирования вы узнали?
3 Какими типами могут быть представлены числа?
4
Запишите выражение (
10
3
языка
2
∙ (−3)) таким образом, чтобы
результат его вычисления на языке Python был равен 81.
5 Можно ли записать математическую операцию с
переменной так, чтобы затем полученное значение было
присвоено ей?
6 Чем списки отличаются словарей?
7 Что общего у списков и кортежей?
8 Для чего используются операторы? Какие операторы вам
известны?
9 В чем особенность выполнения циклов while и for?
10 Для чего нужны функции и как осуществить их выозов в
языке программирования Python?
41
3
ПРОГРАММИРОВАНИЕ ДВИЖЕНИЯ НАЗЕМНОЙ
РОБОТОТЕХНИЧЕСКОЙ ПЛАТФОРМЫ
Наземная робототехническая платформа является сложной
управляемой электромеханической системой, состоящей из
колесной базы и системы управления движением. В роботе
параллельно
протекают
как
механические,
так
и
информационные процессы.
Отметим, что НРП имеет относительно простую конструкцию
и при этом достаточно высокую скорость перемещения в
пространстве при низких энергозатратах.
3.1
Управление электродвигателями
Движение НРП осуществляется на основе шасси с попарносвязанными колесами (рис. 3.1).
Рисунок 3.1 – Шасси робота с попарно-связанными колесами
Колесо крепиться на вращающемся валу редуктора JGA25-370
(рисунок 3.2) – устройстве, преобразующем и передающем
вращающий момент с одной или несколькими механическими
передачами.
42
Рисунок 3.2 – Внутреннее устройство редуктора JGA25-370
Управление
двигателями
выполняется
представленной ниже программы (рис. 3.3).
посредством
from Cyberbot import print
1
from Cyberbot import Camera
2
from Cyberbot import Robot
3
import time
4
5
robot = Robot()
6
camera = Camera()
7
8
movement = robot.wheels_set(100, 100)
9
time.sleep(4)
10
wheels_state = robot.wheels_get()
11
print(wheels_state)
12
stop_movement = robot.wheels_stop()
13
14
Рисунок 3.3 – Пример кода для управления двигателями
НРП
Специально для данного онлайн-курса реализована
библиотека обучающегося Cyberbot (строка 1), содержащая
классы для передачи видеопотоков, данных телеметрии,
результатов выполнения программ с робота на сервер.
Библиотека Cyberbot включает в себя:
43
− Print – класс, обеспечивающий подключение консоли
для вывода результатов запущенных программ;
− Camera – класс, транслирующий видеопоток с RPiкамеры, во время выполнения скрипта;
− Robot – класс, методы которого позволяют
взаимодействовать с аппаратной частью робота;
− Переменные robot и camera, хранящие классы
Robot() и Camera() соответственно.
В
представленном
выше
коде
(рис.
3.3)
wheels_set()(строка 9), является функцией, принимающей
два аргумента: первый – для левой группы колес, второй – для
правой. Значения аргументов варьируются от -100 до 100 единиц,
где 100 единиц соответствует примерно 2 км/ч реальной скорости
робота.
При помощи вызова метода wheels_set(100, 100) робот
будет
перемещаться
прямо.
В
строке
10
метод
time.sleep(4), вызванный после wheels_set, позволяет
осуществлять движение в течение четырех секунд. В строке 11
wheels_get() – возвращает значения заданных аргументов,
которые записываются в переменную wheels_state. В
строке 13 представлена wheels_stop() – функция,
прерывающая перемещение робота.
Пример движения робота по трассе с использованием
функции вращения правых и левых групп колес изображен на
рисунке 3.4.
44
Рисунок 3.4 – Пример движения НРП вперед
На данной трассе (рис. 3.4) робот осуществляет движение по
периметру прямоугольника, используя код, представленный
ранее на рисунке 3.3.
3.2
Программирование движения вперед и назад,
поворотов направо и налево
Максимальная частота вращения двигателей робота
составляет 60 оборотов в минуту. НРП способна разгоняться
до 2 км/ч. Управление движением робота осуществляется
подачей необходимого значения частоты вращения на каждый из
двух двигателей, расположенных на левой и правой сторонах
робота.
Программный код обеспечивает регулирование значения
частоты вращения колес в диапазоне от -100 до 100 единиц.
Положительные значения соответствуют вращению двигателей
вперед, отрицательные – назад.
Чтобы обеспечить движение робота вправо, необходимо
уменьшить частоту вращения правой группы колес и увеличить
частоту вращения левой группы колес (управление происходит за
счет правого и левого двигателя соответственно). Для движения
налево – частота вращения левых колес должна быть меньше
частоты вращения правых (рис. 3.5). Значение частоты вращения
колес определяет радиус поворота робота.
45
Рисунок 3.5 – Схема движения НРП в зависимости от частоты
вращения левых и правых групп колес
Для осуществления поворота НРП на месте вокруг своей оси
необходимо осуществлять вращение правой/левой группы колес
с одной частотой вращения вперед, и левой/правой группой колес
с такой же частотой вращения назад (рис.3.6).
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4 import time
5
6 robot = Robot()
7 camera = Camera()
8
9 movement = robot.wheels_set(-100, 100)
10 time.sleep(4)
11 wheels_state = robot.wheels_get()
12 print(wheels_state)
13 stop_movement = robot.wheels_stop()
Рисунок 3.6 – Пример кода для осуществления поворота
НРП на месте вокруг своей оси
Чтобы задать частоту вращения правых и левых колес
необходимо использовать функцию wheels_set() из строки 9
(рис. 3.6). В скобках после данной функции необходимо указать
два атрибута. Атрибут — это переменная функции или класса,
которая будет хранить значения, которые ей присвоены в
46
определенный момент времени. Первый атрибут функции
соответствует значению частоты вращения левой группы колес.
Второй – правой группы. Для того, чтобы колеса вращались в
обратную сторону, необходимо установить значение частоты
вращения со знаком «-».
1
from Cyberbot import print
2
from Cyberbot import Camera
3
from Cyberbot import Robot
4
import time
5
6
robot = Robot()
7
camera = Camera()
8
9
movement = robot.wheels_set(100, 100)
10
time.sleep(4)
11
wheels_state = robot.wheels_get()
12
print(wheels_state)
13
stop_movement = robot.wheels_stop()
14
Рисунок 3.7 – Пример кода для осуществления движения
НРП вперед
Для осуществления движения робота вперед или назад
необходимо установить одинаковую частоту вращения на правых
и левых группах колес НРП (рис. 3.7 стр. 9).
Программирование движения на определенное
расстояние
Робот способен преодолеть расстояние в 10 см за ~0.66 с при
максимальной скорости вращения колес (100, 100). Это значение
непостоянное и зависит от различных внутренних и внешних
факторов, например уровня заряда аккумулятора у робота или
трения поверхности, по которой происходит перемещение.
Время, t, которое потребуется роботу, чтобы преодолеть
необходимое расстояние S с любой скоростью можно рассчитать
по формуле (1):
3.2
𝑡 = 0,66 ∙
𝑆
0,1𝑉п%
,
(1)
47
где 𝑉п – заданная скорость робота в процентах, S –
расстояние.
Например, при расчете времени t, для преодоления расстояния
S с максимальной скоростью, можно воспользоваться
формулой (2):
𝑡 = 0,66 ∙
𝑆
10
.
(2)
Время, которое потребуется роботу для того, чтобы
преодолеть расстояние S равное 30 см приведено в
выражении (3):
𝑡 = 0,66 ∙
30
10
=2𝑐.
(3)
Теперь, когда известно время, которое необходимо для
осуществления перемещение робота для преодоления расстояния
30 см, напишем код, который это позволяет (рис. 3.8):
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4 import time
5
6 robot = Robot()
7 camera = Camera()
8
9 movement = robot.wheels_set(100, 100)
10 time.sleep(1.6)
11 wheels_state = robot.wheels_get()
12 print(wheels_state)
13 stop_movement = robot.wheels_stop()
14
Рисунок 3.8 – Код для осуществления движения НРП вперед
на определенное расстояние
Зависимость, представленная в таблице 3.1, показывает какую
дистанцию робот преодолевает за определенное время. Данная
информация необходима для осуществления движения на
определенное расстояние.
48
Таблица 3.1 – Зависимость дистанции от времени при частоте
вращения колес (‘100’, ‘100’)
Дистанция, см
10
20
30
40
Время, с
0,6
1,1
1,6
2
Пример движения робота на определенное расстояние
изображен на рисунке 3.9.
Рисунок 3.9 – Пример движения НРП на определенное
расстояние по трассе
На данной трассе (рис. 3.9) робот осуществляет движение по
линейке на определенное расстояние, используя код с
рисунка 3.8.
3.3 Программирование поворотов различного радиуса
Для перемещения по криволинейным траекториям
робототехническому
средству
требуется
осуществлять
различные типы поворотов. То, каким будет угол поворота
49
платформы определяет модуль разности частоты вращения
правых и левых колес (рис. 3.10). Чем меньше модуль разности,
тем больше радиус поворота, который осуществляется
робототехнической платформой.
Рис. 3.10 – Принцип реализации поворота НРП по радиусу
Для определения угла поворота робота, учитывая исходные
данные скорости и времени, следует воспользоваться формулой
(4):
𝜑 = 𝑡 ∙ 1,33𝑉п% ,
(4)
где 𝑉п% – заданная скорость робота в условных единицах.
В таблице 3.2 приведены некоторые константные значения.
Таблица 3.2 – Зависимость угла поворота от времени при
частоте вращения колес (‘-100’, ‘100’)
Угол поворота, градусы
180
90
45
Время, с
2,3
1,2
0,6
Представленная в таблице 3.2 зависимость отражает на
сколько градусов робот осуществит поворот влево за
50
определенное время в секундах. Эти данные будут полезны при
движении по радиусам.
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4 import time
5
6 robot = Robot()
7 camera = Camera()
8
9 movement = robot.wheels_set(-100, 100)
10 time.sleep(2.3)
11 wheels_state = robot.wheels_get()
12 print(wheels_state)
13 stop_movement = robot.wheels_stop()
14
Рисунок 3.11 – Принцип реализации поворота НРП по радиусу
На рисунке 3.11 функция wheels_set() на строке 9
обеспечивает поворот вокруг своей оси на 180°. Для остановки
перемещения робота через определенное время в строке 10 в
функции time.sleep() указывается необходимое время
перемещения, а в функции wheels_set() нулевые значения
частоты вращения.
Для осуществления поворота на 90° необходимо выполнить
следующие действия (рис. 3.12):
1. Переместиться до места, где необходимо осуществить
поворот;
2. Остановиться на данном месте;
3. Осуществить разворот, остановиться;
4. Продолжить движение по прямой.
Примечание: при прохождении лабиринта, для повышения
точности поворота и предотвращения столкновения с
препятствиями рекомендуется осуществлять повороты на 90°.
51
Рисунок 3.12 – Пример преодоления поворота в 90°
Для упрощения работы можно использовать функцию
set_wheels_movement(). Вместо написания численных
значений скорости, в этой функции достаточно лишь указать
направление движения робота.
Следующий программный код, представленный на
рисунке 3.13 управляет движением НРП с указанием
направления.
1
from Cyberbot import print
2
from Cyberbot import Camera
3
from Cyberbot import Robot
4
import time
5
6
robot = Robot()
7
camera = Camera()
8
9
movement = robot.wheels_direction('forward')
10
time.sleep(2)
11
wheels_state = robot.wheels_get()
12
print(wheels_state)
13
stop_movement = robot.wheels_stop()
14
Рисунок 3.13 – Пример кода для управления двигателями НРП
52
В строке 9 функция wheels_direction()принимает на
вход значение направления движения в формате строки
(‘forward’,
‘backward’,
‘left’,
‘right’).
Последовательность
действий
является
следующей:
робототехническая платформа перемещается вперед в течение
двух секунд, затем в консоли отображаются поданные на колеса
значения и выполняется операция остановки перемещения.
Разница между функциями wheels_set() (рис. 3.11) и
wheels_direction()(рис. 3.13) заключается в принимаемых
аргументах. В первом случае это два целых числа, а во втором
случае – строка. Функция wheels_set() применяется в
случаях, когда требуется движение с определенной скоростью,
wheels_direction() – при перемещении в определенном
направлении. Например, при движении робота по линии
неважно, с какой скоростью он будет двигаться, главной
особенностью является направление движения. В таблице 3.3
представлено соответствие команд направлению движения
робота.
Таблица 3.3 – Соответствие команд направлению движения
НРП
Команда
‘forward’
‘left’
‘right’
‘stop’
Направление движения НРП
Вперед с частотой вращения колес (‘100’,
‘100’)
Поворот НРП вокруг своей оси налево с
частотой вращения колес (‘-100’, ‘100’)
Поворот НРП вокруг своей оси направо с
частотой вращения колес (‘100’, ‘-100’)
Остановка движения колес НРП, подача на
колеса частоты вращения (‘000’, ’000’)
Движениям ‘left’ и ‘right’, как было обозначено выше,
соответствуют значения частоты вращения, на которой робот
вращается вокруг своей оси. Если же необходимо перемещаться
по кругу с большим радиусом, всегда можно перейти к ручному
вводу частоты вращения, используя изученную ранее функцию
wheels_direction().
Пример перемещения робота по траектории определенного
радиуса по трассе представлен на рисунке 3.14.
53
Рисунок 3.14 – Пример движения НРП по траектории с
определенным радиусом на трассе
Робот осуществляет движение по радиусу (рис.3.14) путем
подачи различной частоты вращения на группы колес.
Контрольные вопросы
1 Каким образом осуществляется управление движением?
2 Какие значения частоты вращения колёс НРП
соответствуют движению вперед и назад?
3 За какое время робот осуществляет поворот на 45° при
максимальной частоте вращения колёс?
4 Какая команда осуществляет остановку колес? Какая
частота вращения задается при этом?
5 Какую дистанцию преодолевает робототехническая
платформа за 4 с при максимальной заданной частоте вращения
колёс?
6 Перечислите стандартный порядок действий для
осуществления роботом поворота на 90°.
7 От каких факторов зависит скорость движения робота?
8 Какая
функция
обеспечивает
вращение
робототехнической платформы вокруг собственной оси?
9 В
чем
состоит
разница
между
функциями
wheels_set() и wheels_direction()?
10 Как увеличить радиус поворота робота?
54
4
ПРОГРАММИРОВАНИЕ РАБОТЫ
СВЕТОДИОДОВ ВИДИМОГО И
УЛЬТРАФИОЛЕТОВОГО СПЕКТРА
Диоды, как полупроводниковые устройства, управляющие
током
как
однополюсный
выключатель,
бывают:
выпрямительными, стабилитронами туннельными, сверхвысокой
частоты (СВЧ), обращенными, варикапами, светодиодами и
фотодиодами.
В составе НРП используются светодиоды (диоды Генри
Раунда) – полупроводниковые приборы с электронно-дырочным
переходом, создающие оптическое излучение при пропускании
через них электрического тока в прямом направлении (рис. 4.1).
Рисунок 4.1 – P-n-p переход в полупроводнике
Свечение возникает в момент, когда электроны и дырки в
переходе рекомбинируются. Сам p-n переход создается при
соединении двух полупроводников с электропроводимостью
разного типа: n-тип легируются электронами, p-тип – дырками.
Для пропускания света необходимы следующие условия:
55
− Ширина запрещенной зоны должна быть близка к энергии
кванта света.
− Полупроводниковый кристалл должен иметь минимум
дефектов.
Реализовать подобное в структуре с одним p-n-переходом
невозможно. Ввиду чего создаются многослойные структуры из
нескольких полупроводников – гетероструктуры.
На рисунке 4.2 показано устройство светодиода. Диапазон
излучения зависит от химического состава используемых
полупроводников.
Рисунок 4.2 – Устройство светодиода
По аноду передается положительная полуволна на кристалл,
по катоду – отрицательная.
Нужный цвет светодиода получают посредством покрытия
линзы люминофором (белые светодиоды), за счет применения в
одном кристалле трех светодиодов (RGB-технология), с
применением примесей и различных полупроводников.
Робототехническая
платформа
оснащена
белыми
светодиодами с типом исполнения SMD и мощностью 1 Вт,
расположенными на передней панели (рис. 4.3). Над
светодиодами, на верхней панели платформы, размещена камера,
которая
позволяет
определять
уровень
освещенности
посредством обработки изображения.
56
Рисунок 4.3 – Расположение светодиодов
Светодиоды НРП подсвечивают пространство перед
робототехническим средством. Включение и выключение
светодиодов может быть реализовано как вручную, так и
автоматически. Ниже приведен программный код для
управления светодиодами, расположенными на корпусе НРП
Включение/выключение светодиодов осуществляется с
помощью
функций
flashlight_set()
и
flashlight_turn_off(). Код включения светодиодов
представлен на рисунке 4.4.
57
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4 import time
5
6 robot = Robot()
7 camera = Camera()
8
9 flashlight_on = robot.flashlight_set(100)
10 print(flashlight_on)
11 flashlight_off = robot.flashlight_turn_off()
Рисунок 4.4 – Пример кода для включения и выключения
светодиодов
Аргумент функции flashlight_set() в строке 9
принимает значение от 0 до 100 единиц (что соответствует
яркости свечения светодиодов, при различных значениях
коэффициента заполнения импульсов) и устанавливает уровень
интенсивности освещения, которое записывается в переменную
flashlight_on. Функция flashlight_turn_off()на
строке 11 отключает светодиоды.
Аналогично
включение/выключение
светодиодов
ультрафиолетового спектра осуществляется с помощью функций
uv_flashlight_set() и uv_flashlight_turn_off().
Код включения представлена на рисунке 4.5.
from Cyberbot import print
1
from Cyberbot import Camera
2
from Cyberbot import Robot
3
import time
4
5
robot = Robot()
6
camera = Camera()
7
8
uv_flashlight_on = robot.uv_flashlight_set(100)
9
print(uv_flashlight_on)
10
uv_flashlight_off =
11
robot.uv_flashlight_turn_off()
Рисунок 4.5 – Пример кода для включения и выключения
светодиодов ультрафиолетового спектра
58
Аргумент функции uv_flashlight_set()в строке 9
принимает также значение от 0 до 100, как и у светодиодов
видимого спектра, указывающее интенсивность свечения,
которая записывается в переменную uv_flashlight_on.
Последняя строка 11 отвечает за отключение светодиодов
ультрафиолетового спектра.
Контрольные вопросы
1 Что создает оптическое излучение при пропускании через
него прямого электрического тока?
2 Назовите два условия для пропускания света.
3 Какое значение принимает аргумент функции
uv_flashlight_set()?
4 Каким образом получают требуемый цвет светодиода?
5 С помощью какой функции осуществляется выключение
светодиодов ультрафиолетового спектра?
59
6
УПРАВЛЕНИЕ СЕРВОПРИВОДОМ
Сервоприводы – механизмы, которые обеспечивают
установку положения и фиксацию рабочего орган оборудования
в заданных положениях, а также перемещают его в соответствии
с заданной программой. Кроме того, перемещение не
единственная задача сервоприводов, они могут поддерживать
необходимый момент на валу при нулевой скорости вращения
вала. На робототехнической платформе сервоприводы
используется для удержания исполнительного механизма в
определенном положении под нагрузкой (рисунок 5.1). Основной
решаемой данным устройством задачей является изменение угла
наклона узконаправленной камеры.
Рисунок 5.1 – Сервопривод, управляющий углом наклона камеры
На рассматриваемой платформе используется сервопривод
MG996-180, выбранный исходя из доступности и низкой
стоимости при удовлетворительных для использования
технических характеристиках.
Внутреннее устройство сервопривода показано на рисунке 5.2.
60
Рисунок 5.2 – Устройство сервопривода MG996-180
Сервопривод представляет собой электромеханическое
устройство. Механическая часть сервопривода состоит из
редуктора, корпуса редуктора, и подшипников. Редуктор
является понижающим и снижает частоту вращения выходного
вала и увеличивает крутящий момент малогабаритного
электродвигателя постоянного тока. Электротехническая часть
сервопривода состоит из платы управления, датчика углового
положения выходного вала и электродвигателя. Представленный
сервопривод является системой, замкнутой по положению.
Технические характеристики сервопривода представлены в
таблице 5.1.
Таблица 5.1 – Технические параметры MG996-180
Параметр
Максимальный угол поворота
Скорость вращения без нагрузки
Крутящий момент
Диапазон рабочего напряжения, В
Длина соединительного кабеля, мм
Рабочий ток, мА
Пиковый ток, А
Размер, мм
Вес, г
Значение
180°
60 ° за 0,17 с при 4,8 В
60 ° за 0,14 с при 6 В
9,4 кг/см при 4,8 В
11 кг/см при 6 В
4,8…7,2
300
500–900
2,5
40,7 × 19,7 × 42,9
55
Управление сервоприводом осуществляется посредством
управляющего сигнала, который представляет собой импульсы
61
постоянной частоты и переменной ширины. Положение
сервопривода определяется длиной импульса (рис.5.3).
Рисунок 5.3 – Углы поворота сервопривода
Длина импульса может быть задана вручную или посредством
использования команд библиотеки. Система управления
сервопривода конвертирует длительность импульсов в
управляющем сигнале в угловое положение, а затем сравнивает
полученное значение с данными от потенциометрического
датчика углового положения выходного вала. Разница между
заданным и текущим значением выходного вала сервопривода
является ошибкой, которую система управления компенсирует
посредством управляющих воздействий на электродвигатель.
Описанный функционал устройства по реализации вращения
камеры или удержании ее в статичном положении
осуществляется за счет реализации программного кода,
представленного на рисунке 5.4.
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4
5 robot = Robot()
6 camera = Camera()
7
8 camera_position = robot.camera_servo_set(80)
9 angle_incline_camera = robot.camera_servo_get()
10 print(angle_incline_camera)
Рисунок 5.4 – Пример кода для вращения сервопривода
62
В данной программе на рисунке 5.4 используется изменяющая
положение камеры функция robot.camera_servo_set()
приведенная в строке 8, в аргументе которой указывается угол
наклона
камеры.
В
строке
9
в
переменную
angle_incline_camera записывается положение угла
наклона. В строке 10 выводится значение переменной
angle_incline_camera. Углы наклона, соответствующие
положениям камеры представлены в таблице 5.2.
Таблица 5.2 – Углы наклона камеры
Угол, °
0
50
100
Положение камеры
max вверх
прямо
max вниз
Отсчёт углов наклона камеры начинается с положения max
вверх, что соответствует углу 0°, положению прямо
соответствует поворот сервопривода на 50°, а максимально
смотрящей вниз камере соответствует поворот сервопривода на
100°. Примеры различных положений камеры представлены на
рисунке 5.5
а)
б)
в)
Рисунок 5.5 – Примеры положений камеры: а) max вверх – угол
наклона 0°; б) прямо – угол наклона 50°; в) max вверх – угол
наклона 100°
Контрольные вопросы
1
Дайте определение понятию «сервопривод».
63
2 Для чего используются сервоприводы в рассматриваемой
робототехнической платформе?
3 Посредством какого типа сигнала осуществляется
управление сервоприводом?
4 Чем является разница между заданным и текущим
значением выходного вала сервопривода?
5 Какое положение камеры технического зрения
достигается при угле наклона 50°?
6 Какая функция используется для изменения положения
камеры?
7 В какую переменную записывается положение угла
наклона камеры?
8 С какой позиции начинается отсчет углов наклона камеры
технического зрения?
9 Для каких целей реализовано техническое решение
управления камерой на робототехнической платформе?
10 Перечислите области применения сервоприводов.
64
7
ПРОГРАММИРОВАНИЕ РАБОТЫ
ИНФРАКРАСНОГО ДАТЧИКА
Инфракрасные датчики (ИК) представляют собой устройства,
которые обнаруживают и измеряют уровень инфракрасного
излучения. Данные датчики применяются в охранных и
пожарных
системах,
для
регулировки
температуры,
дистанционного управления различными устройствами, для
подсчета оборотов двигателей и других задачах.
Оптический ИК-датчик представляет собой совокупность ИКсветодиода и фототранзистора (рис. 6.1).
Рисунок 6.1 – Оптический ИК-датчик
Для распознавания линий на рабочем поле платформы
применяется модуль инфракрасных датчиков (рис. 6.2) с CANbus.
CANbus – это простая, экономичная и эффективная технология
передачи данных, которая изначально использовалась в
автомобильной отрасли, но теперь распространилась в других
сферах.
Рисунок 6.2 – Модуль оптических ИК-датчиков с CANbus
Модуль инфракрасных датчиков имеет в составе 5 отдельных
пар фотоприемников и излучателей, чувствительность и
мощность излучения которых может регулироваться (рис. 6.3).
65
Рисунок 6.3 – Модуль оптических ИК-датчиков с CANbus
с внешней стороны
Оптический инфракрасный датчик способен детектировать
поверхности черного и белого, а также определять широкий
диапазон оттенков серого цвета (рис. 6.4). Когда датчик включен,
светодиод излучает волну в инфракрасном спектре (длина волны
950 нм), а фототранзистор принимает отраженный луч света. В
зависимости от интенсивности приходящего излучения
формируются различные значения на выходе фототранзистора.
Рисунок 6.4 – Прием отраженного сигнала датчиком
Чем светлее отражающая поверхность, тем меньше уровень
сигнала на выходе. Чем дальше отражающая поверхность, тем
выше уровень сигнала на выходе.
Модули оптических ИК-датчиков расположены в передней
части днища робототехнической платформы, на расстоянии 1 см
от поверхности, по которой происходит перемещение робота
(рис. 6.5).
66
Рисунок 6.5 – Расположение ИК-датчиков
С помощью ИК-датчика платформа способна перемещаться
вдоль линии, расположенной на полу, черного цвета. Ширину
линии рекомендуется соблюдать в пределах 1,5 см и наносить на
поверхность значительно отличающейся по цвету от цвета линии.
На микроконтроллер с каждого из пяти ИК датчиков
считываются значения в диапазоне от 0 до 230 (значения
0…3,3 В). Сигналы от более светлых поверхностей показывают
значения ближе к 0, от более темных – к 230. Данный принцип
представлен на рисунке 6.6.
Рисунок 6.6 – Показания на датчиках в зависимости от
положения линии
67
Движение по линии происходит следующим образом: если
линия расположена под третьим (центральным) датчиком, то
робот, относительно своего центра, перемещается корректно по
линии. В случае, если линия находится под одним из датчиков (1,
2, 3 или 4), то платформа отклонилась от курса. В такой ситуации
необходимо произвести выравнивание положения робота
относительно линии – совершить поворот в правую или левую
сторону.
Программный код для перемещения робота по черной линии
с помощью ИК-датчика представлен на рисунке 6.7.
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4
5 robot = Robot()
6 camera = Camera()
7
8 while True:
9
10
ir_data = robot.ir_get()
s1, s2, s3, s4, s5 = int(ir_data[0]),
int(ir_data[1]), int(ir_data[2]), \
11
int(ir_data[3]), int(ir_data[4])
12
print(s1, s2, s3, s4, s5)
13
threshold = 40
14
if s2 > threshold and s3 > threshold and s4 > threshold:
15
16
17
18
19
20
21
robot.wheels_set(60, 60)
print('forward')
if s4 > threshold or s5 > threshold:
robot.wheels_set(60, -60)
print('right')
if s1 > threshold or s2 > threshold:
robot.wheels_set(-60, 60)
22
print('left')
23
if s3 > threshold:
24
robot.wheels_set(60, 60)
25
print('forward')
Рисунок 6.7 – Пример кода для перемещения НРП по черной
линии с помощью ИК-датчика
68
После подключения модуля ученика и вызова классов print,
Camera и Robot в цикле while True в строке 8, вызывается
метод ir_get(), обеспечивающий получение данных с ИКдатчиков (строка 9). Данные приходят в виде списка, внутри
которого включено 5 значений (строка 10). В переменные s1, s2,
s3, s4, s5 записываются данные с 5 сенсоров. Отсчет идет слева
направо.
Равное 40 значение threshold в строке 13 является
пороговым
значением,
превышение
которого
будет
сигнализировать о том, что черная линия находится под одним из
установленных на робототехнической платформе датчиков.
Осуществление поворотов платформы и движения вперед
происходит следующим образом: если линия находится под
третьим датчиком, то реализуется движение вперед, если под
первым и вторым – выполняется поворот влево, под четвертым и
пятым – поворот вправо. Для описания условий используется
конструкция if... После введения каждого из условий
необходимо поставить двоеточие «:» и задать функцию для
отправки управляющего воздействия на двигатели робота
wheels_set().
Пример движения робота по линии по трассе с
использованием инфракрасных датчиков приведен на
рисунке 6.8.
Рисунок 6.8 – Пример движения НРП по линии на трассе с
использованием инфракрасных датчиков
В данном случае наземная робототехническая платформа
осуществляет движение по линии на специализированной трассе
с использованием инфракрасных датчиков, определяя цвет линии
и поверхности.
69
Контрольные вопросы
1. Что представляют собой инфракрасные датчики?
2. Где применяются инфракрасные датчики?
3. Что входит в состав модуля ИК-датчика?
4. Что анализирует и определяет оптический ИК-датчик?
5. Сигнал от каких типов поверхностей приближен к
значению 230?
6. Для какой цели применяется модуль инфракрасных
датчиков на робототехнической платформе?
7. Где расположены модули оптических ИК-датчиков на
роботе?
8. Что такое threshold в программном коде?
9. Назовите факторы, затрудняющие получение данных с
ИК-датчиков.
10. Принципиально ли количество ИК-датчиков на роботе
для осуществления корректного движения по линии? Дайте
развернутый ответ.
70
ПРОГРАММИРОВАНИЕ РАБОТЫ
УЛЬТРАЗВУКОВОГО ДАТЧИКА
Ультразвуковой датчик – это устройство, генерирующее и
принимающее ультразвуковые волны. Ультразвуковые (УЗ)
датчики используются для определения расстояния до объектов
в робототехнике, автомобилях, домашней бытовой технике,
медицине, промышленных производствах и других сферах. Их
принцип работы представлен на рисунке 7.1.
8
Рисунок 7.1 – Схема принципа работы УЗ-датчика
Ультразвуковые сигналы, генерируемые передатчиком,
отражаясь от исследуемого объекта, возвращаются к приемнику
через определенный промежуток времени. Временной интервал
возвращения сигналов используется в расчетах для определения
расстояния до объекта.
Существует множество датчиков различных форм и размеров
для применения в различных областях. На борту
рассматриваемой робототехнической платформы используется
обладающей небольшими размерами, высокой доступностью и
качеством работы УЗ-датчик модели HC SR04. Диапазон длины
измерения HC SR04 составляет от 0,02 до 4 м. Размеры и
диаграмма направленности используемого датчика представлены
на рисунке 7.2.
71
Рисунок 7.2 – Размеры и диаграмма направленности датчика
HC SR04
Угол измерения УЗ-дальномера составляет примерно 30°. Для
решения большинства задач детектирования препятствий – это
удовлетворительное значение.
Характеристики УЗ-дальномера HC SR04 представлены в
таблице 7.1.
Таблица 7.1 – Технические параметры HC SR04
Параметр
Питающее напряжение
Рабочий параметр силы тока
Сила тока в пассивном
состоянии
Угол измерения
Ширина импульса
Значение
5В
15 мА
2 мА
30°
10-6 с
На борту робототехнической платформы установлены пять
ультразвуковых датчиков (рисунок 7.3).
На передней панели и на углах верхней площадке для
мониторинга среды перед роботом, слева и справа на верхней
площадке для мониторинга среды по обеим сторонам
платформы.
72
3
2
4
5
1
Рисунок 7.3 – Ультразвуковой датчик расстояния HC SR04 и
расположения датчиков на НРП
Как видно из рисунка 7.3, УЗ-датчик HC SR04 имеет четыре
вывода:
− VCC – питание модуля
− TRIG – входной вывод, инициализирующий генерацию
звуковых импульсов
− ECHO – выходной вывод. Сигнал на этом выводе зависит
от расстояния от датчика до объекта.
− GND – общий вывод, минус питания.
На рисунке 7.4 представлен код для перемещения
робототехнической платформы по лабиринту с ИК-датчиками в
качестве устройств для осуществления навигации в
пространстве.
В цикле while True на строке 9 вызывается метод
us_get(), обеспечивающий получение данных с УЗ-датчиков.
Данные приходят в виде списка, внутри которого имеется пять
значений (в сантиметрах).
73
1 from Cyberbot import print
2 from Cyberbot import Camera
3 from Cyberbot import Robot
4
5 robot = Robot()
6 camera = Camera()
7
8 while True:
9
us_data = robot.us_get()
10
s1, s2, s3, s4, s5 = int(us_data[0]),
int(us_data[1]), int(us_data[2]),
int(us_data[3]), int(us_data[4])
11
print(s2, s3, s4)
12
if s3 > 20:
13
robot.wheels_direction_us('forward')
14
print('forward')
15
if s4 < 20:
16
robot.wheels_direction_us('left')
17
print('left')
18
if s2 < 20:
19
robot.wheels_direction_us('right')
20
print('right')
21
if s2 < 20 and s3 < 20 and s4 < 20:
22
robot.wheels_direction_us('stop')
23
print('stop movement')
24
break
25
Рисунок 7.4 – Пример кода для перемещения НРП по лабиринту
с ИК-датчиками в качестве устройств для осуществления
навигации в пространстве
На строке 10 в переменные s1, s2, s3, s4, s5 записываются
данные с пяти сенсоров соответственно: отсчет идет с бокового
левого до бокового правого, как изображено на рисунке 7.3.
Затем выводятся значения с необходимых датчиков s2, s3, s4
(угловой левый, фронтальный и угловой правый датчики).
Далее рассмотрим логику перемещения:
− Если перед фронтальным датчиком нет препятствий –
перемещаемся вперед.
74
− Если угловой правый датчик обнаружил препятствие –
поворачиваем налево.
− Если угловой левый датчик обнаружил препятствие –
поворачиваем направо.
− Если все три датчика обнаружили препятствия, то
робототехническая платформа останавливается и выходит из
цикла (выполнение программы заканчивается).
Используемая функция в строках 13, 16, 19, 22
wheels_direction_us(), принимает аргумент в виде
строки. В данной функции указывается направление движения
(‘forward’, ‘right’, ‘left’, ‘stop’).
Данный
программный
код
позволяет
автономно
перемещаться НРП по лабиринту.
Пример движения робота в лабиринте с использованием
ультразвуковых датчиков представлен на рисунке 7.5.
Рисунок 7.5 – Пример движения НРП в лабиринте с
использованием ультразвуковых датчиков
Робот, находясь внутри лабиринта (рис. 7.5) исходя из
полученных данных с ультразвуковых датчиков автономно
осуществляет движение внутри лабиринта.
75
Контрольные вопросы
1. В каких целях используются УЗ-датчики?
2. Где расположены УЗ-датчики на используемой
робототехнической платформе?
3. Для чего используется временной интервал возвращения
сигналов?
4. Приведите полноценную логику перемещений робота при
использовании УЗ-датчиков.
5. Какой метод в программном коде обеспечивает
получение данных с УЗ-датчиков?
76
9
ОСНОВЫ ТЕХНИЧЕСКОГО ЗРЕНИЯ
Техническое или компьютерное зрение позволяет получать
информацию
об
окружающей
среде
посредством
детектирования, сегментации, классификации различных типов
объектов и мониторинга их состояния. Камеры, применяемые в
техническом зрении, обладают высокой скоростью съемки и
передают данные в вычислительные блоки для дальнейшей
обработки. Основная задача камеры – это получение
изображения высокого качества для последующего анализа
данных программным обеспечение для обработки изображений.
На рисунке 8.1 показан кадр процесса детектирования
объектов красного цвета в динамической среде.
Рисунок 8.1 – Пример детектирования объектов красного
цвета
Цветовое пространство – модель представления цвета,
основанная на использовании цветовых координат. Цветовое
пространство строится таким образом, чтобы любой цвет был
представлен точкой, имеющей определённые координаты.
Цветовые пространства описываются набором цветовых
координат и правилами построения цветов. К примеру, RGB
является трёхмерным цветовым пространством, где каждый цвет
описан набором из трёх координат – каждая из них отвечает
компоненте цвета в разложении на красный, зелёный и синий
цвета. Количество координат задаёт размерность пространства.
77
OpenCV поддерживает следующие цветовые пространства
(рис. 8.2):
− BGR – стандартное цветовое пространство OpenCV. При
открытии файлов или отображении встроенными средствами
используется
именно
оно.
Является
аналогом RGB пространства, но с другим порядком
компонент.
− RGB – данное цветовое пространство представляет
каждый пиксель в виде красной(red), зеленой(green) или
синей(blue) компоненты со значением от 0 до 255 единиц.
Такое пространство можно представить в виде куба со
стороной 255 единиц.
− HSV – данное цветовое пространство создано для
упрощения представление цвета человеком. Люди в случае
описания цвета редко пользуются компонентами цвета,
обычно они применяют такие слова как тон (hue),
насыщенность (saturation) и значение (value) цвета.
− XYZ – данная модель представления цветового
пространства была выведена в лаборатории CIE для того,
чтобы описать все цвета, которые может видеть глаз человека.
Компоненты X, Y, Z в данной модели описывают
чувствительность среднестатистического наблюдателя к
стандартным возбуждениям, в общем виде они представляют
доработанные R, G, B компоненты.
− LAB – данная модель представления цветового
пространства создана как улучшенная модель XYZ, в которой
решалась нелинейность модели с точки зрения человеческого
глаза. В системе L*a*b координата «L» означает
насыщенность белого (в диапазоне от 0 до 100), а координаты
«a», «b» – означают позицию между зелёным-пурпурным, и
синим-жёлтым цветами.
− GRAY – черно-белое цветовое пространство, где яркость
рассчитывается как средняя яркость всех трех компонент
модели BGR.
− YUV – Данная схема пришла из телевидения, где
компонента
Y
–
значение
яркости,
а UV – двух
цветоразностных сигналов.
78
Рисунок 8.2 – Пример изображений НРП в различных цветовых
пространствах
При проектировании робототехнического средства и выбора
его компонентов необходимо заранее определить для решения
каких конкретных задач будет применяться техническое зрение.
В данном разделе техническое зрение будет использоваться для
детектирования цветов, построения траектории движения
робототехнической платформы на основе сегментации линии и
работы с визуальными маркерами. Для решения поставленных
задач используется USB-камера и широконаправленная
Raspberry Pi (RPi-камера). Каждая из камер охватывает
определенную область видимости. На рисунке 8.3 показано
расположение камер на роботе.
79
Рисунок 8.3 – Расположение камер технического зрения на
корпусе НРП: Широконаправленная RPi-камера (сверху); USBкамера (снизу)
Поле зрения широконаправленной RPi-камеры составляет
170°, что облегчает локализацию и навигацию робота. Благодаря
ее использованию пользователь получает широкий угол обзора
окружающего пространства для осуществления визуальной
ориентации.
USB-камера выполняет роль узконаправленной камеры и
предоставляет обзор пространства, находящегося прямо перед
колесами робота или в другом направлении в зависимости от
положения сервопривода. С ее помощью реализуются задачи
технического зрения.
Подробно решаемые задачи технического зрения будут
рассмотрены далее.
9.1
Детектирование цветов
Одной из важных задач машинного зрения является
детектирование объектов. Например, детектирование цвета
линии при движении НРП по трассе. Для детектирования линий
может быть использована модель цветового пространства HSV.
80
HSV (англ. Hue, Saturation, Value – тон, насыщенность,
значение) – модель, используемая для обозначения необходимого
цвета (рис. 8.4). Координатами цвета в ней являются:
Hue – цветовой тон, (например, красный, зелёный или синеголубой). Варьируется в пределах 0–360°, однако иногда
приводится к диапазону 0–100° или 0–1°.
Saturation – насыщенность. Варьируется в пределах 0–100°
или 0–1°. Чем больше этот параметр, тем «чище» цвет, поэтому
этот параметр иногда называют чистотой цвета. А чем ближе этот
параметр к нулю, тем ближе цвет к нейтральному серому.
Value (значение цвета) или Brightness – яркость. Также
задаётся в пределах 0–100° и 0–1°.
Рисунок 8.4 – Диаграмма цветового пространства HSV
Модель HSV была создана Элви Реем Смитом, одним из
основателей Pixar, в 1978 году.
Эта модель очень удобна для детектирования на изображении
объектов по цвету (и яркости). Например, пятно от лазерной
указки, цветовые маркеры или просто объекты с выделяющимся
цветом.
Более понятный двумерный график (по Х это цветовой тон, по
Y – насыщенность) представлен на рисунке 8.5.
81
Рисунок 8.5 – Двумерный график цветового пространства HSV
Чтобы идентифицировать определенный цвет на изображении
–его нижняя и верхняя границы указывается тремя
координатами. Первая координата – это цветовой тон, вторая
координата – это насыщенность, третья – яркость. Например,
чтобы идентифицировать синий цвет на изображении в
программе задается его нижняя граница – (110, 150, 150) и
верхняя граница – (130, 255, 255).
Любое изображение имеет разрешение (w, h). Центр кадра
(cw, ch) можно определить следующими выражениями (5–6):
𝑤
с𝑤 = ,
2
ℎ
сℎ = .
2
(5)
(6)
На рисунке 8.6 представлен код для определения параметров
HSV в центре кадра. Из модуля Cyberbot в строке 2 происходит
импорт функции get_color_on_frame_center (). Далее в
цикле while True в переменную frame записываем кадры с
камеры (строка 8) и осуществляется проверка на получение
кадров – если видеопоток с камеры поступает, то выполнение
программы продолжается (строка 9).
Функция get_color_on_frame_center() определяет и
возвращает параметры HSV в центре кадра. Затем функция
print на строке 10 выводит данные параметры в консоль.
82
1 from Cyberbot import Camera
2 from Cyberbot import get_color_on_frame_center
3 from Cyberbot import print
4
5 robot_camera = Camera()
6
7 while True:
8
frame = robot_camera.read()
9
if frame is None: continue
10
print(get_color_on_frame_center(frame))
11
Рисунок 8.6 – Пример кода для определения параметров HSV
в центре кадра
Обнаруженные параметры цвета зависят от различных
факторов, среди которых есть ряд основных:
− Освещенность помещения;
− Чувствительность камеры;
− Расстояние до объекта
Для определения нижней и верхней границы цвета
рекомендуется вычесть и прибавить 15 условных единиц
соответственно к каждому из параметров.
9.2
Разделение изображения на сектора
Отсчет системы координат на изображении начинается в
левом верхнем углу, точка 1 с координатами (0,0). Точка 2, с
координатами (w,h), расположена на другом конце изображения
по диагонали относительно точки 1. Параметры w, h являются
разрешением изображения с камеры технического зрения. На
рисунке 8.7 представлена стандартная система координат
изображения с камеры.
83
Рисунок 8.7 – Система координат изображения
Разделение изображения на сектора осуществляется путем
формирования вертикальных асимптот (разбиения оси w на
равные части). Например, разобьём изображение на три сектора
(рис. 8.8).
Рисунок 8.8 – Изображение, разделенное на 3 сектора
При движении по линии робот будет определять направление
движения на основе отдельных секторов.
На программном уровне данное задача реализуется
следующим образом, например, линия находится во втором
секторе, а это значит, что ее координата w больше w/3 и меньше
2w/3 и так далее.
84
На рисунке 8.9 x_point – линия, по которой следует робот.
Если линия находится в секторе 1, то робот осуществляет
движение влево, а если линия находится в секторе 3, то вправо.
1 if (width / 3) < x_point < (2 * width / 3):
2
print('SECTOR 2')
3 elif x_point < (width / 3):
4
print('SECTOR 1')
5 elif x_point > (2 * width / 3):
6
print('SECTOR 3)
7
Рисунок 8.9 – Пример кода для разделения изображения на 3
сектора
9.3
Построение траекторий и перемещение
по цветным линиям
Современные библиотеки технического зрения имеют
множество инструментов для обработки кадров, которые
используются при движении робота по линии. Робот, зная
параметры цвета в формате HSV, на каждый кадр из видеопотока
накладывает маску, которая позволяет отфильтровать
необходимый цвет, определяет координаты линии в кадре, строит
точку маршрута и следует за ней.
Программный код для реализации задачи движения по линии
представлен на рисунке 8.10.
На рисунке 8.10 в строках 1–6 происходит подключение
необходимых модулей и функций. В строке 6 программный код
import cv2 – позволяет подключить одну из наиболее
распространенных библиотек технического зрения под
названием OpenCV. Программный код import numpy
–
импортирует модуль для работы с многомерными массивами.
Метод detect_line_point() обеспечивает обработку
изображения, принимает параметры цвета HSV, находит области
цвета в кадре, в центре области строит точку, за которой едет
робот, и возвращает ее координаты.
1 from Cyberbot import print
2 from Cyberbot import Robot
3 from Cyberbot import Camera
4 from Cyberbot import detect_line_points
85
5 import numpy as np
6 import cv2
7
8 camera = Camera()
9 robot = Robot()
10
11 lower_border = np.array([30, 28, 245])
12 upper_border = np.array([39, 39, 255])
13
14 while True:
15
frame = camera.read()
16
if frame is None:
17
continue
18
19
height, width, _ = np.shape(frame)
20
x_m, y_m = detect_line_points(frame=frame,
min_val=lower_border, max_val=upper_border)
21
if x_m:
22
x_point = x_m[0]
23
y_point = y_m[0]
24
cv2.circle(frame, (y_point, x_point), 10, (0,
255, 0), -1)
25
if (2 * width / 6) < x_point < (4 * width / 6):
robot.wheels_set(50, 50)
26
print('forward')
27
elif x_point < (2 * width / 6):
28
robot.wheels_set(-80, 80)
29
print('left')
30
elif x_point > (3 * width / 6):
31
robot.wheels_set(80, -80)
32
print('right')
33
34
camera.show(frame=frame)
Рисунок 8.10 – Пример кода код для реализации задачи
движения НРП по линии с использованием камеры
технического зрения
После инициализации классов Print, Robot, Camera задаются
параметры цвета HSV, тип данных которых представлен в виде
многомерного массива (np.array).
86
В цикле в переменную frame записываются изображения
пока необработанного видеопотока.
Затем выполняется проверка на то, что в переменную frame
действительно был записан массив данных для дальнейшей
обработки. В переменных height, width записывается
разрешение
текущего
кадра.
Вызывается
функция
detect_line_point(), которая принимает на вход три
параметра: frame – кадры с камеры, lower_border – нижняя
граница параметров цвета в HSV, upper_border - верхняя
граница параметров цвета в HSV. Данная функция используется
для получения координат линии на кадре и записи их в
переменные: x_m в координатах w (ось х), y_m в координатах h
(ось y).
Разделение кадра осуществляется только по оси w. В
переменные x_point и y_point записываются координаты
линии по осям w, h (x, y) из списков x_m и y_m. В координатах
(x_point, y_point) отображается точка маршрута. Ось w
делится на 6 секторов. Если x_point находится в центральном
секторе, то робот движется прямо. Если в левом, то движение
осуществляется влево, если в правом, то движение происходит
вправо.
Функция
camera.show(frame)
отображает
обработанный видеопоток.
Рисунок 8.11 демонстрирует движение НРП по трассе
технического зрения с использованием USB-камеры.
87
Рисунок 8.11 – Пример движения НРП по линии с
использованием камеры технического зрения
На данной трассе робот с помощью камеры технического
зрения детектирует линию под собой и следует по ней, учитывая
параметры цвета данной линии в формате HSV.
Контрольные вопросы
1. Назовите основные предпосылки для использования
камеры, применяемые в техническом зрении.
2. Перечислите поддерживаемые OpenCV основы типы
цветовых пространств.
3. Какая широконаправлення камера установлена на
робототехнической платформе?
4. В какие переменные записывается разрешение текущего
кадра при построении траекторий движения робота и его
перемещении по цветовым линиям?
5. Перечислите основные факторы, от которых зависит
параметры цвета.
6. Для каких целей может применяться машинное зрение на
роботе?
7. Для
чего
используется
функция
get_color_on_frame_center()?
88
8. Каким образом осуществляется разделение изображения
на сектора?
9. Что определяет робот, который получает данные о
параметрах цвета в HSV?
10. Для
чего
используется
функция
camera.show(frame)?
89
10 ПРОГРАММИРОВАНИЕ ТЕХНИЧЕСКОГО ЗРЕНИЯ
ПРИ ОБРАБОТКЕ ИЗОБРАЖЕНИЙ ARUCOМАРКЕРОВ
ArUco-маркеры являются популярной технологией для
позиционирования робототехнических средств с использованием
технического зрения. Навигация по объектам такого типа
используется относительно давно и маркеры могут быть
нанесены на различные участки пространства. Однако при их
использовании существует ряд ограничений:
− Разрешение встроенной в систему камеры;
− Ненадежность детектирования при использовании цвета
как основного источника данных;
− Необходимость определения положения маркера в
пространстве;
− Освещение,
используемое
в
пространстве
функционирования.
слабоконтрастные
метки
удовлетворительно работают исключительно при хорошем
освещении;
− Требовательность
к
вычислительным
ресурсам,
поскольку обработка поступающих кадров зачастую должна
производиться в режиме близкому к реальному времени.
Использование ArUco – маркеров позволяет избежать
большинство из вышеперечисленных проблем. Как правило, все
маркеры для обеспечения локализации двухцветны (чаще всего
черно-белые)
и
определенным
образом
кодируют
идентификатор.
Представленный на рисунке 9.1 ArUco-маркер содержит в
себе заданное заранее определённое, уникальное и
фиксированное число и сравнительно более удобен для
ориентации в пространстве с использованием методов обработки
изображений.
90
Рисунок 9.1 – Пример ArUco-маркера (значение маркера: 11)
Для начала работы с ArUco-маркерами требуется подготовить
оборудование, а именно – откалибровать камеру. Калибровка
проводится для того, чтобы убрать эффекты дисторсии и другие,
получаемые с объектива искажения, которые могут помешать
работоспособности и точности исполнения программных кодов.
Дисторсия – искривление изображения, при котором
нарушается геометрическое подобие между объектом и его
изображением и, как результат – некорректное определение
размеров и расстояния робототехнической системой. Примеры
дисторсий представлены на рисунке 9.2.
а)
б)
Рисунок 9.2 – Примеры вероятных дисторсий:
а) подушкообразная дисторсия; б) бочкообразная дисторсия
В настоящее время для генерации ArUco-маркеров
существует большое количество открытых источников,
доступных в сети Интернет, например, можно использовать
https://chev.me/arucogen/.
91
При выполнении наземной робототехнической платформой
различных
задач
используются
ArUco-маркеры
с
закодированной в них информацией.
С помощью программного обеспечения робот может
произвести
детектирование
маркера
и
определить
закодированный номер (идентификатор), что представлено в
коде ниже:
1
2
3
4
5
6
7
8
from Cyberbot import print
from Cyberbot import Robot
from Cyberbot import Camera
from Cyberbot import ArucoDetector
import cv2
camera = Camera()
aruco = ArucoDetector(aruco_dict_id =
cv2.aruco.DICT_6X6_250)
9 while True:
10
frame = camera.read()
11
if frame is None:
12
continue
13
14
corners, ids =
15 aruco.detect(frame=frame)
print(ids)
16
frame = aruco.draw(frame=frame,
17 corners=corners, ids=ids)
camera.show(frame=frame)
18
Рисунок 9.3 – Пример кода код для обнаружения
ArUco-маркеров в пространстве
Из библиотеки Cyberbot, в строке 4, импортируется класс
ArucoDetector для работы с ArUco. В строке 8 формируется
экземпляр данного класса, где аргументом конструктора класса
является количество ячеек АrUco-маркера.
В строке 10 в цикле while True происходит чтение кадров с
камеры, а затем выполняется проверка их поступления (строки
12–13). Вызывается метод detect(), который на изображении
92
производит поиск маркера и возвращает закодированный
идентификатор (ids), а также положение углов (corners).
Функция print() на строке 16 выводит значение идетефикатора
в консоль. В коде используется метод draw(), который
формирует контуры маркера на изображении (строка 17). Метод
show() на строке 18 отображает обработанный поток
изображений пользователю.
Рисунок 9.4 – Пример изображения, обнаруженного
ArUco-маркера в пространстве
На рисунке 9.4 показано изображение с камеры робота после
программного обнаружения АrUco-маркера. Контур маркера
обведен зеленым прямоугольником.
С помощью АrUco-маркеров НРП способна выполнять
различные действия на усмотрение пользователя, такие как:
вращение вправо/влево, движение вперед/назад на определенное
расстояние, а также комбинацию данных действий. Примером
является осуществление алгоритма парковки с помощью АrUcoмаркера, в ходе которой НРП выполняет сразу комплекс
последовательных действий для стыковки с определенным типом
объектов.
Контрольные вопросы
1 При использовании ArUco-маркеров существует ряд
ограничений, перечислите их.
2 Для чего необходима калибровка камеры?
3 Как можно самостоятельно сгенерировать ArUco-маркер?
4 Что такое дисторсия? Опишите ее особенности.
5 Что реализует метод draw()в программном коде?
93
11 ПРОГРАММИРОВАНИЕ СЧИТЫВАТЕЛЯ
RFID-МЕТОК
В настоящее время RFID- технологии активно используются в
различных областях в таких, как медицина, производственные
сферы, транспортные платежи, системы контроля и управления
доступом.
RFID (англ. Radio Frequency IDentification) – метод
автоматической радиочастотной идентификации объектов.
Основная функция радиочастотной идентификации заключается
в передаче и записи информации на носитель, т.е. данные
записываются на чип путем радиоволнового метода.
RFID-система представляет собой считывающее устройство и
носитель-метку (рисунок 10.1). Такие системы можно
классифицировать по дальности считывания:
− Идентификация на близких дистанциях. Считывание
осуществляется на расстоянии до 0,2 м.
− Идентификация на средней дистанции. Диапазон
считывания варьируется от 0,2 до 5 м.
− Идентификация на дальних дистанциях. Считывание
происходит от 5 до 300 м.
Рисунок 10.1 – RFID-технологии
RFID-метка представляет собой миниатюрное запоминающее
устройство с установленными микрочипом, на который
записывается информация, и принимающей/передающей
сигналы антенной.
94
Принцип работы меток:
− Получение энергии микрочипом от источника питания
(ИП) или радиосигнала считывателя;
− Улавливание
антенной
электромагнитных
волн
считывателя;
− Передача ответного импульса метки.
Носители классифицируются по ряду критериев, в том числе
по источнику питания, рабочей частоте, типу памяти и т.д.
(рисунок 10.2).
Отметим, что RFID-технология, в сравнении с QR-кодом,
обладает следующими преимуществами:
− микросхема вмещает до 64 байт информации об объекте,
при этом интеграция допускается в любую часть конструкции;
− бесперебойная работа сроком от 10 лет;
− групповой учет до 200 движущихся объектов;
− перезапись данных (неограниченное количество раз);
− принятие решений в онлайн-режиме;
− непосредственный
контакт/прямая
видимость не
обязательны для корректной идентификации объекта, что
позволяет проводить ее на расстоянии до 300 м;
− метки практически невозможно подделать, что
обеспечивает безопасность конфиденциальной считываемой
информации;
− допускается использование в агрессивных условиях, а
метки считываются через лакокрасочные покрытия, водную и
воздушную среды, грязь и древесину.
Кроме того, данные на RFID-метке можно установить
скрытно – в таком случае доступ к информации закрывается
полностью или частично.
95
RFID-метки
По типу источника
питания
По типу памяти
По рабочей частоте
По исполнению
Активные
RO (Read Only)
Низкочастотные LF
(125-134 кГц)
Наклейки
Пассивные
WORM (Write
Once Read Many)
Высокочастотные HF
(13,56 МГц)
Интегрированные
Полупассивные
RW (Read and
Write)
Ультравысокочастотные
UHF
(860-960 МГц)
Корпусированные
Радиочастотные
UHF-метки ближнего
поля
Рисунок 10.2 – Классификация RFID-меток
96
В НРП встроен модуль RFID-считывателя RC522 (рис. 10.3),
который позволяет считывать и записывать карты стандартов
MIFARE и NTAG, а на трассах располагаются RFID-метки, при
взаимодействии с которыми пользователь через графический
интерфейс получает сообщение.
Рисунок 10.3 – Модуль RC522
В таблице 10.1 приведены технические характеристики
модуля.
Таблица 10.1 – Технические характеристики модуля RC522
Параметр
Напряжение питания, В
Потребляемый ток, мА
Рабочая частота, МГц
Дальность считывания, мм
Интерфейс
Размер, мм
Значение
3.3
13-26
13.56
До 60
SPI
40х60
Код для получения данных с RFID-считывателя представлен
на рисунке 10.4.
97
1 from Cyberbot import print
2 from Cyberbot import Robot
3
4 robot = Robot()
5
6 while True:
7
rfid_state = robot.rfid_get()
8
print(rfid_state)
9
Рисунок 10.4 – Пример кода для получения данных
с RFID-считывателя
На рисунке 10.4 модуля Cyberbot импортируем и вызываем
классы. В цикле while True в строке 7 вызываем метод
rfid_get()для получения данных с RFID-считывателя.
Полученные данные записываются в переменную rfid_state
(строка 7). Функция print(rfid_state) на строке 8
выводит данные на экран пользователя.
В данном курсе RFID-метки активно используются в процессе
прохождения уроков учеником. На каждой трассе располагается
различное количество RFID-меток с заданиями и подсказками по
прохождению. Благодаря ним возможно отследить процесс
прохождения урока, а при активации метки несут полезную
информацию, которая способствует успешному прохождению
занятия.
Контрольные вопросы
1 Что представляет собой RFID-система?
2 Приведите примеры классификаций RFID-систем.
3 Где в реальной жизни ежедневно встречаются RFIDтехнологии?
4 Перечислите
преимущества
RFID-технологий
в
сравнении с QR-кодами.
5 Для чего используется метод rfid_get?
98
ЗАКЛЮЧЕНИЕ
Материалы, приведенные в данном пособии, позволяют
изучить не только различные аспекты языка программирования
общего назначения – Python, а также вопросы, связанные с
системами управления и обработки сенсорных данных,
формируемых наземными робототехническими средствами.
Описанные особенности сенсорных и исполнительных устройств
могут быть применены при разработке, обслуживании и
эксплуатации различных типов наземных робототехнических
комплексов.
Многофункциональное назначение описанной в пособии
наземной робототехнической платформы позволяет расширить
ее возможности посредством подключения новых модулей по
CAN шине и проводить ряд исследований по апробации
разработанных подходов, методов и алгоритмов в сферах
автоматизации и робототехники.
Полученные знания позволят учащимся различных
специальностей
продолжить
развиваться
в
областях
информатики, автоматизации и робототехники, осваивая такие
направления, как: теория управления, построение траекторий
движения, навигация, локализация и построение карт местности,
техническое зрение для создания различных типов автономных и
беспилотных средств.
99
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Юревич Е.И. Основы робототехники // СПб: БХВ.
Петербург. – 2018.
2. Кутарева М.И.
Мобильные
робототехнические
комплексы // М.: БАКРА. – 2007.
3. Колбан Н. Книга Колбана о ESP32 // М.: Дрофа. – 2019.
4. Документация на микроконтроллер ESP32 [Электронный
ресурс]. – Режим доступа: https://www.espressif.com/en/pr
oducts/socs/esp32/overview.pdf.
5. Градецкий В.Г.,
Вешников В.Б.,
Калиниченко С.В.,
Кравчук Л.Н. Управляемое движение мобильных роботов
по произвольно ориентированным в пространстве
поверхностям // М: Наука. – 2001.
6. Борисов О.И., Громов В.С., Пыркин А.А. Методы
управления робототехническими приложениями // СПб.:
Университет ИТМО. – 2016.
7. Считывание и распознавание меток и маркировок
[Электронный
ресурс].
–
Режим
доступа:
http://www.mkoi.org/366/367/376/.
8. Мошкин В.И., Петров А.А., Титов В.С., Якушенков Ю.Г.
Техническое зрение роботов // Общество с ограниченной
ответственностью Научно-техническое издательство
Машиностроение. – 1990. – С. 272.
9. Абламейко С.В.,
Лагуновский Д.М.
Обработка
изображений: технология, методы, применение //
Учебное пособие. М.: Амалфея. – 2000. – С.18-44.
10. Мартынов А.А. Электрический привод // Учебное
пособие. М-во образования и науки Рос. Федерации,
Федер. гос. авт. образоват. учреждение высш. проф.
образования
С.-Петерб.
гос.
ун-т
аэрокосм.
приборостроения. – Санкт-Петербург: ГУАП. – 2015. – С.
523.
11. Лутц М. Изучаем Python. 5-е изд. // СПб: Диалектика.
– 2019. – С. 832.
12. Монк С. Программируем Arduino // СПб: Питер. – 2017.
– С. 176.
13. Карвинен Т., Карвинен К., Валтокари В. Делаем сенсоры:
проекты сенсорных устройств на базе Arduino и Raspberry
Pi // М.: ООО «ИД Вильямс». – 2015. – С. 448.
100
14. Прокофьев Г.Ф., Микловцик Н.Ю., Кабакова М.Ю.,
Цветкова Т.В. Детали машин и основы конструирования:
учебное
пособие
//
Северный
(Арктический)
федеральный университет имени М. В. Ломоносова.
– 2018. – С. 194.
15. Detecting
ArUco
markers
with
OpenCV
and
Python [Электронный ресурс]. – Режим доступа: https://p
yimagesearch.com/2020/12/21/detecting-aruco-markerswith-opencv-and-python/.
16. Дополненная реальность с маркерами ArUco в OpenCV
[Электронный ресурс]. – Режим доступа: https://waksoft.s
usu.ru/2020/03/25/dopolnennaya-realnost-s-markeramiaruco-v-opencv/.
17. ArUco-markers
with
OpenCV
and
Python
[Электронный ресурс]. – Режим доступа: https://github.co
m/KhairulIzwan/ArUco-markers-with-OpenCV-and-Python.
18. Augmented Reality using Aruco Marker Detection with
Python OpenCV [Электронный ресурс]. – Режим доступа:
https://machinelearningknowledge.ai/augmented-realityusing-aruco-marker-detection-with-python-opencv/.
19. Hough
Transform
with
OpenCV
(C++/Python)
[Электронный ресурс]. – Режим доступа: https://learnopen
cv.com/hough-transform-with-opencv-c-python/.
20. Lines detection with Hough Transform – OpenCV 3.4 with
python 3 Tutorial 21 [Электронный ресурс]. – Режим
доступа: https://pysource.com/2018/03/07/lines-detectionwith-hough-transform-opencv-3-4-with-python-3-tutorial21/.
21. ArduinoMaster [Электронный ресурс]. – Режим доступа:
https://arduinomaster.ru/.
22. Electroinfo [Электронный ресурс]. – Режим доступа:
https://electroinfo.net/.
101
Учебное издание
Савельев Антон Игоревич
Черноусова Полина Михайловна
Асфар Дина Башшаровна
Черских Екатерина Олеговна
Летенков Максим Андреевич
ОСНОВЫ ПРОГРАММИРОВАНИЯ НАЗЕМНЫХ
РОБОТОТЕХНИЧЕСКИХ ПЛАТФОРМ НА
ЯЗЫКЕ PYTHON
Учебно-методическое пособие
Подписано к печати 01.11.21. Формат 60х84 1/16.
Усл. печ. л. 6,45. Уч.-изд. л. 6,93. Тираж 250 экз. Заказ №
Отпечатано с оригинал-макета СПб ФИЦ РАН
199178, Санкт-Петербург, 14-я линия В.О., д. 39
в редакционно-издательском центре ГУАП
190000, Санкт-Петербург, ул. Б. Морская, 67
102
Скачать