Text
                    Ху Чуньсюй

Ли Цяолун

РОЗ 2

Программирование
интеллектуальных

КОБ 2 Программирование интеллектуальных роботов
КОБ 2 % ? 3. к №. *ь- РиЫЫ1т§ Ноизе оГ Е1ес(тошс8 1т1ич1гу • вылмс
КОЗ 2 Программирование интеллектуальных роботов
УДК [004,896+621.865.1:004Л51.9КО8 2 ББК 32.816 Х98 Ху Чуньсюй, Ли Цяолун Х98 ДО 8 2: Программирование интеллектуальных роботов / пер. с кит. И. А. Шевкуна. - М.: ДМК Пресс, 2025. - 544 с.: ил. 18ВХ 978 5 95700-412-3 Книга посвящена основным принципам работы с операционной системой для роботов 808 2 и практике разработки роботов. В ней подробно описаны ключевые концепции, компоненты и инструменты 808 2 и рассмотрены методы построения симуляционных и реальных робототехнических систем, а также способы при- менения 808 2 для задач компьютерного зрения, построения карт и автономной навигации. Большое количество иллюстраций, схем и исходного кода на языках С++ и РуШоп позволит не только освоить базовые функции 808 2, но и глубже по нять методы разработки роботов и применить полученные знания на практике. Издание адресовано как начинающим разработчикам, желающим познакомить- ся с системой 808 2 и применять ее на практике, так и опытным инженерам- робо- тотехникам, которые могут использовать книгу в качестве справочного пособия. УДК [004.896+621.865.]:004.451.9К08 2 ББК 32.816 АП п§ЬГ8 гезегуей. Нгз! риЬКзЬей ш ГНе СЫпезе 1ап$ща§е ипйег ГЬе 1П1е 808 2. 18ВЫ 978-7 121-49173 3 Киззтап 1гап81аИоп п§Н(:8 аггап§ей ипГЬ РиЫ1зЫп§ Ноизе о(' Е1есГгошсз МизГгу Со.,Ыс1 (РНЕ1) ТНгсиДт МесНа 8о1ийоп8, Токуо )арап (тЕо@тесИа8о1и11оп8.|р). Все права защищены. Любая часть этой книги не может быть воспроизведена в ка кой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. 18ВМ 978-7 121-49173-3 (кит.) 18В.Ч 978-5 93700-412-3 (рус.) СоругщИГ © 2025 РиЬИяЫп^ Ноизе о! Е1есГгошс8 ТпбиЫгу Со.,ЬШ (РНЕ1) © Перевод, оформление, издание,
Содержание От издательства..................................................13 Рецензии.........................................................14 Предисловие......................................................18 Глава 1. КО$: душа умных роботов... ........................ 23 1.1. Эра интеллектуальных роботов................................23 1.2. История развития КОЗ........................................24 1.2.1. Создание КОЗ......................................... 25 1.2.2. Развитие КОЗ............................................25 1.2.3. Преимущества КОЗ........................................28 1.3. КОЗ 2 и КОЗ 1...............................................29 1.3.1. Ограничения КОЗ 1...................................... 29 1.3.2, Новая версия КОЗ 2......................................30 1.3.3. Сравнение КОЗ 2 и КОЗ 1.................................32 1.4. Установка КОЗ 2.............................................37 1.4.1. Что такое Ыпих..........................................37 1.4.2. Что такое ЦЪипШ.........................................38 1.4.3. Установка операционной системы ЦЬцпШ....................39 1.4.4. Установка системы КОЗ 2.................................42 1.5. Командная строка КОЗ 2......................................45 1.5.1. Командная строка в Стих.................................45 1.5.2. Симулятор черепахи......................................50 1.5.3. Командная строка в КОЗ 2................................50 1.6. Резюме......................................................57 Гласа 2. Основные принципы НО5> 2. Фундамент для создания роботов..........................................................58 2.1. Процесс разработки роботов с использованием КОЗ 2...........58 2.2. Рабочее пространство: база для разработки роботов...........60 2.2.1. Что такое рабочее пространство..........................60 2.2.2. Создание рабочего пространства..........................62 2.2.3. Компиляция рабочего пространства........................63 2.2.4. Настройка переменных окружения..........................64 2.3. Пакеты: классификация функций робота....................... 65 2.3.1. Что такое пакет.........................................65 2.3.2. Создание пакета.........................................66
2.3.3. Структура функционального пакета......................67 2.3.4. Компиляция пакета.....................................72 2.4. Узлы: рабочие клетки робота...............................73 2.4.1. Что такое узел........................................73 2.4.2. Методика программирования узлов (Ру11юп)..............75 2.4.3. Методика программирования узлов (С++).................77 2.4.4. Команды для работы с узлами...........................79 2.4.5. Пример использования узла: обнаружение объектов.......80 2.5. Тема: мост для передачи данных между узлами....................83 2.5.1. Что такое гема........................................83 2.5.2. Модель коммуникации посредством темы..................84 2.5.3. Пример создания обмена сообщениями....................86 2.5.4. Метод программирования издателя темы (РуГЬоп).........87 2.5.5. Метод программирования подписчика темы (Руйюп)........8$ 2.5.6. Метод программирования издателя гемы (С++)............90 2.5.7. Метод программирования подписчика темы (С++)..........91 2.5.8. Команды для работы с темами...........................93 2.5.9. Пример использования тем: обнаружение объектов (периодическое)...................................................94 2.6. Службы: взаимодействие между узлами в формате «вопрос-ответ»...98 2.6.1. Что такое служба..................................... 98 2.6.2. Модель коммуникации посредством службы................99 2.6.3. Пример программирования коммуникации посредством службы... 101 2.6.4. Программирование клиента (Руйзоп)....................102 2.6.5. Программирование сервера (Ру1поп)....................103 2.6.6 Программирование клиента (С++)........................104 2.6.7. Программирование сервера (С++).......................105 2.6.8. Команды для работы со службами.......................107 2.6.9. Пример использования службы: обнаружение цели (по запросу).107 2.7. Интерфейсы коммуникации: стандартная структура передачи данных.... ПО 2.7.1. Что такое интерфейс коммуникации.....................111 2.7.2. Определение интерфейсов коммуникации............... .113 2.7.3. Команды для работы с интерфейсами коммуникации.......115 2.7.4. Пример использования интерфейса службы: запрос координат обнаруженного объекта................................ .116 2.7.5. Пример использования интерфейса темы: периодическая публикация координат обнаружения объекта..........................120 2.8. Действие: управление процессом выполнения полной единицы поведения...........................................................123 2.8.1. Что такое действие...................................123 2.8.2. Модель коммуникации действия.........................124 2.8.3. Пример программирования коммуникации действия........125 2.8.4. Определение интерфейса действий......................127 2.8.5. Программирование сервера (РуГпоп)....................128 2.8.6. Программирование клиента (Руйгоп)....................130 2.8.7. Программирование клиента (С++).......................132 2.8.8. Программирование сервера (С++).......................134
2.8.9, Команды для работы с действиями........................137 2.9. Параметры: глобальный словарь роботизированной системы.....138 2.9.1. Что такое параметры....................................138 2.9.2, Модель коммуникации параметров.........................139 2.9.3. Работа с параметрами в командной строке................140 2.9.4, Программирование параметров (РуШоп)....................142 2.9.5. Программирование параметров (С++)......................143 2.9.0, Пример использования параметров: установка порога для обнаружения объектов..........................................145 2.10. Служба распределения данных (Г)П8): нейронная сеть робота.147 2.10,1. Что такое ПП8.........................................148 2.10.2. Модель коммуникации ИП8...............................150 2.10,3. Стратегия обеспечения качества........................151 2.10.4. Настройка Оо8 ПП8 в командной строке..................155 2.10.5. Пример программирования с использованием ББЗ..........157 2.11. Распределенная коммуникация...............................159 2.11.1. Что такое распределенная коммуникация.................160 2.11,2. Удаленное сетевое подключение по 88Н..................161 2.11.3. Распределенная передача данных........................162 2.11,4. Группы распределенной коммуникации....................164 2.11,5. Распределенная коммуникация в примере с черепахой.....165 2.12. Резюме............................................... 166 Глава 3. Часто используемые инструменты РОЗ 2: упрощаем разработку роботов..............................................167 3.1. ЬацпсЬ: сценарии запуска и конфигурации нескольких узлов...167 3.1.1. Способы запуска нескольких узлов.......................169 3.1.2, Настройка параметров командной строки..................171 3.1.3. Переназначение ресурсов ...............................172 3.1.4. Настройка параметров КОЗ...............................174 3.1.5. Вложенное включение файлов Ъаипсй......................176 3.2. 11: управление системами координат робота..................177 3.2.1, Системы координат робота...............................177 3.2.2. Работа с И из командной строки.........................179 3.2.3. Статическая трансляция И (Руйтоп)......................182 3.2.4. Статическая трансляция 11 (С++)........................184 3.2.5, Динамическая трансляция 11 (Ру1поп)....................185 3.2.6, Динамическая трансляция 11 (С++).......................188 3.2.7. Прослушивание 11 (Руйюп)...............................190 3.2.8, Прослушивание 11 (С+4).................................192 3.2.9, Пример комплексного применения 11: следование (РуГПоп).196 3.2.10. Пример комплексного применения 11: следование (С++)...201 3.3. СагеЬо: платформа для трехмерного физического моделирования роботов.........................................................204 3.3.1. Введение в СагеЬо......................................204 3.3.2. Пример моделирования робота............................208
33.3. Пример моделирования датчиков..........................210 3.4. КУ1г: платформа визуализации данных........................211 3.4.1. Введение в КУы.........................................211 3.4.2. Процесс визуализации данных............................214 3.4.3. Пример 1: визуализация данных 1Г.......................216 3.4.4. Пример 2: визуализация данных изображений..............219 3.4.5. Взаимосвязь СагеЬо и КУ12..............................220 3.5. гозЬа§: запись и воспроизведение данных....................221 3.5.1. Запись данных..........................................221 3.5.2. Воспроизведение данных.................................223 3.6. гцС: модульный набор инструментов для визуализации........ 224 3.6.1. Введение в щ!..........................................225 3.6.2. Отображение журналов...................................225 3.6.3. Отображение изображений................................227 3.6.4. Публикация данных тем и служб..........................228 3.6.5. Построение графиков данных.............................228 3.6.6. Управление пакетами данных.............................229 3.6.7. Визуализация узлов.....................................229 3.7. Настройка среды разработки КОЗ 2...........................231 3.7.1. Система управления версиями СК.........................231 3.7.2. Интегрированная среда разработки УЗСойе................233 3.8. Резюме.....................................................235 Гласа 4. НО5 2: моделирование роботов без затрат................237 4,1. Понятие робота и его составные части.......................237 4.2. Моделирование робота с использованием ИКПР.................240 4.2.1. Описание связей........................................242 4.2.2. Описание суставов......................................245 4.2.3. Полная модель робота...................................246 4.3. Создание СКОР-модели робота................................247 4.3.1. Пакет функций модели робота.......................... 247 4.3.2. Визуализация модели робота.............................248 4.3.3. Анализ модели робота...................................252 4.4. Оптимизация модели робота с использованием ХАСКО...........256 4.4.1. Основные синтаксические конструкции файлов ХАСКО.......256 4.4.2. Оптимизация модели робота..............................258 4.4.3. Визуализация модели робота.......................... 261 4.5. Совершенствование симуляционной модели робота..............262 4.5.1. Совершенствование физических параметров................262 4.5.2. Добавление модуля контроллера......................... 263 4.6. Симуляция робота в Са/еЬо..................................265 4.6.1. Загрузка модели робота в СагеЬо........................265 4.6.2. Симуляция управления движением робота..................269 4.6.3. Симуляция и визуализация К(1В- камеры.................270 4.6.4. Симуляция и визуализация КПВП-камеры...................274 4.6.5. Симуляция и визуализация лазерного дальномера..........279
4.7. Резюме.....................................................282 Глава 5. Создание робота с КОЗ 2: от симуляции к реальному устройству..........................................284 5.1. От симуляции к реальному роботу............................284 5.1.1. Анализ конкретного примера.............................284 5.1.2. Проектирование робота..................................286 5.1.3. Проектирование программной архитектуры.................288 5.1.4. Настройка среды разработки на компьютере...............289 5.1.5. Тестирование симуляции робота..........................291 5.2. Проектирование приводной системы: робот начинает двигаться.291 5.2.1. Принцип работы привода двигателя: от ШИМ-регулятора до Н-моста....................................................292 5.2.2. Программирование управления прямым и обратным вращениями двигателя..........................................297 5.3. Управление движением шасси: стабильное движение робота.....301 5.3.1. Принцип измерения скорости с помощью энкодера..........302 5.3.2. Программирование измерения скорости с помощью энкодеров.303 5.3.3. Методы замкнутого управления двигателем................307 5.3.4. Программирование замкнутого управления двигателем......315 5.4. Решение прямой и обратной задач кинематики: точное движение робота..........................................................318 5.4.1. Распространенные кинематические модели роботов.........318 5.4.2. Принципы дифференциальной кинематики...................326 5.4.3. Обратная задача дифференциальной кинематики: вычисление скоростей двух колес..........................................328 5.4.4. Прямая задача дифференциальной кинематики: вычисление общей скорости робота.........................................329 5.5. Что еще есть в контроллере движения........................329 5.5.1. Управление питанием: один вход, много выходов..........330 5.5.2. 1МП: контроль положения робота.........................332 5.5.3. Человеко-машинное взаимодействие: ясность состояния на низком уровне..............................................337 5.6. Система управления роботом: от «мышц» к «мозгу»............338 5.6.1. Вычислительная платформа системы управления............338 5.6.2. Прошивка и настройка системы управления................339 5.7. Резюме.....................................................346 Глава 6.Управление и восприятие в ЯО5 2: учим робота д| игаться и видеть.............................................348 6.1. Разработка протокола коммуникации робота...................348 6.1.1. Проектирование протокола коммуникации..................349 6.1.2. Пример анализа протокола коммуникации..................350 6.1.3. Разработка протокола на стороне контроллера движения (нижний уровень)..............................................354
6.1.4. Разработка протокола на стороне прикладного процессора (верхний уровень)...............................................361 6.2. Разработка привода КОЗ 2 для шасси робота.................366 6.2.1. Привод КОЗ 2 для шасси робота............................366 6.2.2. Подписка на тему управления скоростью.................369 6.2.3. Тема одомегрии и поддержка И..........................373 6.2.4. Динамический мониторинг состояния робота..............382 6.3. Программирование и визуализация движения робота...........385 6.3.1. Определение сообщений управления скоростью в КОЗ 2....385 6.3.2. Программирование движения и визуализация..............387 6.4. Драйвер камеры и данные изображения.......................389 6.4.1. Распространенные типы камер..............................389 6.4.2. Драйвер камеры и визуализация............................390 6.4.3. Определение сообщения изображения в КОЗ 2.............393 6.4.4. Драйвер и визуализация трехмерной камеры..............396 6.4.5. Определение сообщений облака точек в КОЗ 2............397 6.5. Драйвер и визуализация лазерного дальномера..................398 6.5.1. Типы лазерных дальномеров.............................398 6.5.2. Определение сообщения дальномера в КОЗ 2..............401 6.5.3. Драйверы лазерного дальномера и визуализация данных...402 6.6. Драйвер 1МП и визуализация данных.........................405 6.6.1. Определение сообщений 1МТГ в КОЗ 2....................405 6.6.2. Драйвер и визуализация 1МИ............................406 6.7. Резюме....................................................408 Гласа 7. Визуальные приложения КОБ 2:учим роботов понимать мир...................................................410 7.1. Введение в принципы машинного зрения......................411 7.2. Калибровка камеры в КОЗ 2.................................414 7.2.1. Установка пакета для калибровки камеры................414 7.2.2. Запуск узла калибровки камеры.........................415 7.2.3. Процесс калибровки камеры.............................416 7.2.5. Калибровка стереокамеры...............................423 7.3. Обработка изображений с помощью ОрепСУ....................424 7.3.1. Установка ОрепСУ......................................425 7.3.2. Использование ОрепСУ в КОЗ 2..........................425 7.4. Визуальное приложение 1. Навигация по линии...............428 7.4.1. Основные принципы и реализация .................... 428 7.4.2. Симуляция визуального следования робота за линией.....430 7.4.3. Визуальное следование по линии реального робота.......435 7.5. Визуальное приложение 2. Распознавание ОК-кодов...........436 7.5.1. Библиотека 2Ьаг для сканирования ОК-кодов.............437 7.5.2. Распознавание ОК-кодов с помощью камеры...............438 7.5.3. Распознавание ОК-кодов с помощью камеры реального робота.441 7.5.4. Следование реального робота за ОК-кодом...............442 7.6. Приложение машинного обучения 1. Визуальное следование по линии с использованием глубокого обучения............................444
7,6.1. Основные принципы и структура реализации..............445 7.6.2. Визуальное движение по линии с использованием глубокого обучения.....................................................446 7.6.3. Сбор данных и обучение модели.........................447 76.4. Оценка эффективности модели...........................451 7.6.5. Развертывание модели на роботе........................452 7.7. Приложение машинного обучения 2. Обнаружение объектов с помощью ТОЮ..................................................455 7.7.1. Основные принципы и структура реализации..............455 7.7.2. Развертывание обнаружения объектов с помощью ТОЮ......458 7.7,3. Сбор данных и обучение модели.........................460 7 74. Обнаружение целей и следование робота за ними.......464 7.8. Резюме........................................................465 Гласа 8. Построение карт с помощью ЙО5 2: роботы понимают окружающую среду________________ ________ _______________ _____466 8.1. Принципы построения карт с помощью 8ЬАМ...................466 8.1.1. Что такое ЗЬАМ........................................467 8.1.2. Основные принципы 8ЬаМ................................469 8.1.3. Оптимизация бэкенда 8ЬАМ..............................471 8.2. Построение карт с помощью 8ЬАМ Тоо1Ьох....................474 8.2.1. Принцип работы алгоритма..............................475 8.2.2. Установка и настройки.................................476 8.2.3, Построение карт с помощью 8ЬАМ Тоо1Ьох в симуляционной среде........................................................476 8.2.4. Построение карт с помощью 8ТАМ Тоо1Ьох и реального робота.478 8.3. Саг1о§гар1тег: построение двумерных карт................. 481 8.3.1. Принцип работы алгоритма..............................481 8.3.2. Установка и настройка.................................482 8.3.3, Построение карты Саг1о§гар1тег в симуляционной среде..484 8.3.4. Реальный робот........................................488 8.4. ОКВ: построение визуальных карт...........................490 8.4.1. Принципы алгоритма....................................491 8.4.2, Установка и настройка.................................493 8.4.3. Построение карты ОКБ на реальном роботе...............495 8.5. КТАВ: построение трехмерной карты.........................497 8.5.1. Принципы алгоритма....................................497 8.5.2. Установка и конфигурация..............................498 8.5.3. Построение карты КТАВ в симуляционной среде...........500 8.5.4. Построение карты КТАВ с реальным роботом..............503 8.6. Резюме....................................................505 Глава 9, Автономная на -игация в ЯО5 2: свобода движения робота.........................................................506 9.1. Принципы автономной навигации робота......................506 9.2. Архитектура автономной навигации Нам2.....................508
9.2.1. Архитектура системы...................................508 9.2.2. Глобальная навигация..................................510 9.2.3. Локальная навигация...................................511 9.2.4. Функция локализации...................................514 9.3. Установка и использование Кау2............................515 9.3.1. Установка №у2.........................................515 9.3.2. Работа с примерами №у2................................516 9.4. Симуляция автономной навигации робота.....................518 9.4.1. Настройка параметров Иау2.............................518 9.4.2. Конфигурация файла запуска ЪаипсН.....................520 9.4.3. Симуляция автономной навигации робота.................522 9.5. Автономная навигация робота на практике...................525 9.5.1. Конфигурация навигационной карты......................525 9.5.2. Конфигурация параметров Иау2 и файла запуска Гаипсй...526 9.5.3. Автономная навигация робота на практике...............528 9,6. Программирование автономной навигации робота..............531 9.6.1. Работа функции........................................531 9.6.2. Методы программирования (С++).........................532 9.6.3. Методы программирования (РуНтоп)......................533 9,7, Применение навигации для автономного исследования робота..534 9.7.1. Автономное исследование с использованием Ктау2 и 8ЕАМ Тоо1Ьох......................................................534 9.7.2. Автономное исследование Мау 2 + СаПо§гар11ег..........537 9.8. Резюме....................................................540 Предметный указатель.. ...................................... 542
От издательства Отзывы и пожелания Мы всегда рады отзывам наших читателей. Расскажите нам, что вы думаете об этой книге - что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые будут для вас максимально полезны. Вы можете написать отзыв на нашем сайте уу\лм.с1ткрге55.сот, зайдя на страницу книги и оставив комментарий в разделе «Отзывы и рецензии». Также можно послать письмо главному редактору по адресу с1ткрге55(д)дтаП. сот; при этом укажите название книги в теме письма. Если вы являетесь экспертом в какой-либо области и заинтересованы в на- писании новой книги, заполните форму на нашем сайте по адресу ИНр.// с1ткрге55.сот/аи1:11ог5/риЫ1511_Ьоок/ или напишите в издательство по адресу б т кр г е55 (о) д та 1 [.со т. Список опечаток Хотя мы приняли все возможные меры для того, чтобы обеспечить высо- кое качество наших текстов, ошибки все равно случаются. Если вы найдете ошибку в одной из наших книг, мы будем очень благодарны, если вы сооб- щите о ней главному редактору по адресу дткрге55@дтай.сот. Сделав это, вы избавите других читателей от недопонимания и поможете нам улучшить последующие издания этой книги. Нарушение авторских прав Пиратство в интернете по-прежнему остается насущной проблемой. Издатель- ство «ДМК Пресс» очень серьезно относится к вопросам защиты авторских прав и лицензирования. Если вы столкнетесь в интернете с незаконной публикацией какой-либо из наших книг, пожалуйста, пришлите нам ссылку на интернет-ре сурс, чтобы мы могли применить санкции. Ссылку на подозрительные материалы можно прислать по адресу элект- ронной почты с1ткрге55@дтай.сот. Мы высоко ценим любую помощь по защите наших авторов, благодаря которой мы можем предоставлять вам качественные материалы.
Рецензии Мы прошли путь от персональных компьютеров до смартфонов, что станет следующей массовой вычислительной платформой? Наиболее вероятный ответ - роботы. Если это предположение верно, необходимо создать для ро- ботов «мозг», то есть разработать подходящую вычислительную платформу и операционную систему. На уровне операционных систем мы наблюдаем интересное явление: хотя создание операционной системы с нуля редко приводит к доминированию в определенной экосистеме (как в случае с АЕГТОЗАК в автомобильной ин- дустрии), разработка операционной системы, стартовавшая с решения задач в конкретной нише, часто оказывается крайне успешной - взять хотя бы МГ1П(1о№ и АпсйоШ. Выйдя за рамки технического мышления и рассматривая вопрос с точки зрения бизнеса и экосистемы, можно заметить, что крупные операционные системы всегда начинают с какого-го основного сценария применения, раз- ворачивая платформу и поддерживая в ней множество приложений. Пред- ставьте, если бы не было М3 ОГйсе, Ш1пс1ожз не была бы столь успешной. Если бы не было СМ3 и ряда специализированных приложений Соо§1е, Апс1го1с1 не обладала бы такой притягательной силой. Экосистема операционной системы роботов КОЗ за десятилетия разви- тия достигла статуса крупной операционной системы. В ней есть множество ключевых приложений, таких какКаУ1§аНоп, МочеН, АьГоздаге, КУ12 и др., ко- торые значительно повышают эффективность разработки роботов и широко используются в области беспилотного вождения. В будущую эпоху интеллек- туальных роботов КОЗ станет важной основой системного уровня. Таким образом, чтобы создать успешную операционную систему, необхо- димо наличие ключевых приложений. Ниже операционной системы находится вычислительная платформа. Сце- нарии использования роботов разнообразны, и работа КОЗ также зависит от различных вычислительных платформ. В большинстве текущих сценариев использования роботов аппаратные платформы не могут удовлетворить по- требности программного обеспечения, поэтому необходимость интеграции программного и аппаратного обеспечения крайне важна. Только при высо- кой координации программного и аппаратного обеспечения можно обеспе- чить эффективные вычисления. Но если программное обеспечение оптими зировано для одной архитектуры, то его будет сложно перенести на другую архитектуру - это закон развития программного и аппаратного обеспечения в информационной отрасли.
С момента своего основания в 2015 году компания Нопгоп КоЬоНсз стре мится стать «\У1п1е1 эпохи роботов», то есть создать популярную операцион- ную систему и вычислительную платформу. Мы последовательно выпустили вычислительные платформы серии 1онгпеу (ЙЕЖ) и Зиппзе (ИЗ), поддержи- вающие приложения в области интеллектуального вождения и робототехни- ки. В 2021 году мы предложили создать на основе КОЗ 2 операционную си- стему реального времени с открытым исходным кодом То^ейгегОЗ, которая будет глубоко адаптирована и оптимизирована. Мы бы хотели, чтобы она стала общедоступным техническим ресурсом, который все могут совместно развивать, создавая экосистему операционной системы. В эпоху искусственного интеллекта и больших языковых моделей буду- щие роботы будут иметь в своей основе ИИ вычисления. При этом ИИ вы числения и операционные системы будут служить связующим звеном для поддержки разнообразных приложений. Это откроет в индустрии эпоху но- вой вычислительной архитектуры и операционной системы. В то время как предыдущие архитектуры и операционные системы были ориентированы на программное обеспечение, современные архитектуры и операционные системы ориентированы на ИИ вычисления и обработку потоков данных. В 2024 году компания Пщна КоЬоНсз отделилась от Нопгоп КоЬоНсз, но сохранила свои первоначальные намерения стать «УУш1е1 эпохи роботов» и ускоряет развитие интеллекта, стремится предоставлять всестороннюю поддержку от чипов, комплектов разработчика, алгоритмических прило- жений до облачных сред, решает проблемы низкой эффективности и вы- сокой стоимости, с которыми сталкивается текущая робототехническая индустрия, и стремится стать компанией, сосредоточенной на базовой ин- фраструктуре. Короче говоря, П1^на КоЬоНсз не занимается производством роботов, а предоставляет полный стек технологий разработки для разра- ботчиков роботов. Автор этой книги Ху Чуньсюй является не только экспертом в области ро бототехники, но и одним из важных популяризаторов КОЗ в Китае. Под его влиянием миллионы разработчиков начали заниматься разработкой робо- тов на базе КОЗ, многие из которых стали основой современной индустрии роботов. Кроме того, автор книги, будучи сам разработчиком, возглавляет команду экосистемы разработки Пцща КоЬоПсз. Он создаст новое поколение комплектов разработчика роботов КПК и развитую экосистему программ- ного обеспечения и приложений на их основе, исследуя новые парадигмы разработки роботов. Содержание книги обширно и доступно, читатели познакомятся не только с богатыми концепциями и операциями КОЗ 2, но и с принципами и эффек- тами от их применения. Начинающие разработчики смогут быстро присту пить к практике, но и опытные разработчики также найдут для себя много полезного. Эпоха роботов неизбежно наступит, и КОЗ является ускорителем этого процесса. Но для создания мира повседневного использования интеллекту- альных роботов требуются усилия множества разработчиков. Нопгоп КоЪо1-
1С8 и В1^иа КоЪоНсз продолжат способствовать тому, чтобы технологии вошли в нашу повседневную жизнь, позволяя каждому человеку наслаждаться цен- ностью новых технологий. Доктор Юй Кай (Уи КД), основатель и генеральный директор Нопгоп КоЬоНся Роботы - эго новый вид на нашей планете,, Человечество, движимое лишь любопытством, без участия бога, используя «глину» и собственноручно соз- данные научные технологии, «слепило» этот новый вид. Роботы переживают беспрецедентную эволюцию, их клетки быстро делятся, одно становится двумя, два - четырьмя, но только когда количество клеток достигает опре- деленного уровня, проявляется их .мощь. В 2006 году группа невероятно любопытных людей объединилась, чтобы создать исследовательскую робототехническую лабораторию \Ю11о\у Сагале. Они использовали открытое программное обеспечение как заманчивую «приманку», чтобы привлечь тысячи людей на планете к участию в этом грандиозном проекте. История робототехники еще не знала такого явления - объединение усилий разработчиков со всего мира для реализации .мечты о роботе. КОЗ является частью этого грандиозного проекта. Система с открытым ис ходным кодом открыла ящик Пандоры, ворота распахнулись, и хлынул поток инноваций. Говорят, «бесплатный сыр бывает только в мышеловке», но как только люди попробовали его, они уже не могли остановиться. Это основная причина, по которой КОЗ так увлекательна. Поскольку во- рога открылись слишком быстро, многие оказались не готовы, Некоторые даже не осознали, что произошло, но все равно оказались вовлечены в этот бурлящий поток. В 2013 году Гу Юэ (Си Уие) (псевдоним автора книги Ху Чуньсюя) опубли- ковал в блоге первую статью о КОЗ, что положило начало быстрой популя- ризации КОЗ в Китае. С 10 тысяч до 100 тысяч, а затем до .миллиона человек. В 2024 году сообщество разработчиков Гу Юэ превысило 2 миллиона участии ков, китайские разработчики стали неотъемлемой частью международного сообщества КОЗ, а Гу Юэ стал одним из важных двигателей этого процесса. Чтобы помочь большему числу разработчиков быстро освоить важный навык разработки роботов на базе КОЗ, в 2015 году я инициировал создание летней школы КОЗ в Восточно-Китайском педагогическом университете, и с тех пор она проводится ежегодно. К 2024 году состоялся уже десятый выпуск этой школы, а Гу Юэ является неизменным преподавателем. За по- следние 10 лет нас сопровождали более 200 компаний и университетов, более 100 тысяч разработчиков продолжали расти в летней школе КОЗ, а затем вошли в индустрию робототехники. Мы также совместно создали несколько учебных баз КОЗ, чтобы как можно больше людей могли изучать КОЗ, а еще чтобы больше людей могли преподавать КОЗ и популяризировать эту техно- логию, В разнообразных сценариях использования роботов КОЗ сталкивается
со все большими вызовами. КОЗ 2 приняла эстафету по созданию универ сальной операционной системы для роботов. Она была впервые предложена в 2014 году, после чего было выпущено несколько тестовых версий, а в конце 2017 года - первая официальная версия. Ожидается, что к 2025 году КОЗ 1 уйдет в историю. С развитием КОЗ 2 публикуются соответствующие материалы и книги. Гу Юэ вместе с сообществом продолжает оставаться на передовой и выпускает популярный видеокурс «Введение в КОЗ 2 за 21 урок» и открытый комплект робота Ог1§1пВо1. Это практически самый полный набор ресурсов для раз- работки на базе КОЗ 2, который может удовлетворить все потребности раз- работчиков от первого знакомства до полного цикла обучения. Содержание этой книги собрало все самое ценное, оно основательное и доступное и яв ляется отличным выбором как для разработчиков, незнакомых с КОЗ 2, так и для опытных инженеров-робототехников. В 2024 году я и Гу Юэ снова объединили усилия, чтобы привезти в Китай крупнейшее событие для разработчиков КОЗ - КОЗСоп. Мы организовали и провели КОЗСоп СЫпа 2024 и теперь проводим его ежегодно. Надеемся, что в будущем в глобальном сообществе КОЗ будет и дальше расти роль ки гайских разработчиков. Гу Юэ продолжает свою работу, как и летняя школа КОЗ. Приглашаем всех разработчиков присоединиться к рядам разработки роботов с помощью КОЗ и надеемся, что каждый читатель сможет насладиться этой книгой, исследуя интересный мир разработки роботов. Доктор Чжан Синъюй (211ап§ Х1пуи), профессор Восточно-Китайского педагогического университета, инициатор летней школы КОЗ
Предисловие Эта книга рассказывает об операционной системе для роботов КОБ, а также о самих роботах. Истоки КОБ В 2007 году группа молодых людей, у которых была мечта, занималась моз говым штурмом в лаборатории робототехники Стэнфордского университета. У них появилась идея создать робота с достаточно мощным оборудованием и удобной программной системой, чтобы функции, разработанные на этой основе, можно было быстро распространять. Например, вы можете исполь- зовать мою функцию автономной навигации, а я могу использовать вашу функцию захвата объектов. Достаточно разработать стандартизированную платформу из программного и аппаратного обеспечения, и приложения на ее основе постепенно станут популярными. Подобный принцип создал эпоху компьютеров с персональным компьютером как платформой и эпоху мобильного интернета с телефоном как платформой. Будет ли следующая эпоха интеллектуальных роботов также следовать этой логике? Почти 20 лет спустя, «задним числом», мы понимаем, что роботы, на разработку которых тогда были потрачены огромные средства, не вошли в каждую семью. Ро- боты, в отличие от компьютеров или телефонов, требуют разнообразного взаимодействия с внешней средой, и унифицировать их аппаратную форму крайне сложно. От медицинских нанороботов и домашних развлекательных роботов до автомобилей с интеллектуальным управлением и гуманоидных роботов - все эти формы роботов будут сосуществовать в будущем. Однако операционная система для роботов КОБ, появившаяся в 2010 году с целью повышения повторного использования программного обеспечения для ро- ботов, быстро развивалась и способствовала бурному развитию индустрии роботов в последнее десятилетие, постепенно становясь основным стандар том разработки интеллектуальных роботов. Быстрое развитие КОБ даже превзошло ожидания тех молодых людей. Система, изначально разработанная для домашнего сервисного робота, по степенно стала использоваться в таких областях, как инспекция, транспор- тировка, сельское хозяйство, и многих других. С увеличением спроса уве- личивалось и количество проблем. Чтобы создать операционную систему, которая могла бы стать универсальной стандартизированной программной платформой для роботов, в 2014 году была впервые предложена новая вер- сия КОБ 2. После чего было выпущено несколько тестовых версий, а в конце
2017 года - первая официальная версия. На момент завершения этой книги был выпущен новый стабильный релиз КОЙ 2 (аггу ТаИясо, что свидетельству- ет о зрелости системы НОЙ 2. Эра интеллектуальных роботов В то время как НОЙ 2 быстро развивается, индустрия искусственного ин- теллекта и робототехники также претерпевает кардинальные изменения. Искусственный интеллект СпаЮРТ стал громом среди ясного неба, который открыл эпоху больших языковых моделей. В отличие от предыдущего этапа глубокого обучения, большие языковые модели имеют больший масштаб, подобно мозгу с большим количеством нейронов, они более умные и ста- бильные. После СЬаТСгРТ в мире появились сотни других больших моделей, которые быстро интегрируются в различные отрасли. В робототехнике, ко- торую ранее часто критиковали за низкий уровень интеллектуализации, от крылись новые возможности. В то же время роботы переходят из заводов в повседневную жизнь: в рес- торанах есть роботы для доставки еды, в гостиницах - роботы для доставки вещей, в домах - роботы-пылесосы, на дорогах - беспилотные автомобили, а также горячая гема - человекоподобные роботы. Индустрия роботов, на- чиная с базового аппаратного обеспечения, программных систем и заканчи- вая интеллектуальными приложениями, постепенно созревает, и завеса эры интеллектуальных роботов постепенно приподнимается. Я начал разрабаты- вать роботов в 2008 году, в 2011 году познакомился с НОЙ, в 2012 году основал сообщество любителей робототехники «Гу Юэ» (Си Уие), в 2022 году начал создавать комплект разработчика роботов КПК и стал свидетелем быстрого роста популярности КОЙ и индустрии роботов, а также имел честь вместе со многими партнерами способствовать распространению и применению КОЙ в Китае. Сегодня сообщество «Гу Юэ» объединяет более 2 миллионов разработчиков, КПК становится предпочтительным комплектом для раз- работки интеллектуальных роботов, а новая эра интеллектуальных роботов как никогда манит нас. Особенности и содержание книги Эта книга объединяет мой более чем десятилетний опыт разработки ро- ботов. Хотя КОЙ является основной темой книги, более важно донести до всех читателей мысль, что КОЙ - это не только программная платформа, но и инструмент. И что при разработке роботов необходимо не только уметь использовать этот инструмент, но и понимать многие принципы разработ- ки. Поэтому в книге не только подробно объясняются основные концепции КОЙ 2, но и демонстрируется, как применять эти концепции в разработке, а также описывается создание полной робототехнической системы с нуля.
Книга состоит из 9 глав, разделенных на три части. Первая часть (главы 1-3) посвящена основам КОЗ 2. В ней рассказывается история развития КОЗ 2, обсуждаются основные принципы и компоненты и предоставляется множество примеров программирования и использова- ния для их лучшего понимания. Вторая часть (главы 4-6) посвящена проектированию роботов на базе КОЗ 2, В ней объясняется, как использовать КОЗ 2 для проектирования симу- ляционных и реальных роботов. Читатели, имеющие необходимые ресурсы, смогут создать собственного робота. Третья часть (главы 7-9) посвящена приложениям роботов на базе функ- ций КОЗ 2. В ней объясняется, как использовать КОЗ 2 для разработки таких приложений, как визуальное распознавание, построение карт и автономная навигация, которые позволяют роботам не только двигаться, но и понимать окружающую среду и взаимодействовать с ней. Книга опирается на самую новую стабильную версию системы КОЗ 2 и но вое поколение платформы симуляции роботов СагеЬо. Большинство функ- ций и исходного кода могут работать на отдельном компьютере и платформе симуляции СагеЬо. Кроме того, в книге описываются методы сборки реаль ных роботов и реализация соответствующих функций на них. Весь исходный код сопровождается подробными комментариями и для удобства читателей имеет версии на языках С++ и РуЦзоп. Таким образом, книга подходит как для начинающих разработчиков, же- лающих изучить и применять КОЗ 2, так и для опытных инженеров-робото техников, которые могут использовать ее в качестве справочника. Благодарности Издание этой книги было бы невозможно без помощи многих «благород- ных людей». Я хотел бы поблагодарить свою жену Сюэ Сяньжу (Хие Хзапги), которая часто была рядом со мной и всегда безусловно поддерживала меня. Благодарю двух любознательных детей Ху Цзиньжан (Ни Пп§гап) и Ху Цзэран (Ни Хегап), которые дали мне мотивацию и источник вдохновения. Благо- дарю Издательство электронной промышленности за поддержку, редактора Чжэн Люцзе (Х1геп$ 1лере) за множество ценных советов и организацию из- дания книги, а также коллегу Чжан Цзина (Х11ап§ Цп^) за значительный вклад в оформление книги. Благодарю соавтора книги Ли Цяолуна (Ы СИао1оп§) за помощь в написании и исправлении книги. Благодарю молодых людей из Стэнфорда, которые создали КОЗ: Моргана Куигли (Мог§ап Ош§1еу), Брайана Герки (ВНап Сегкеу), Талли Футе (Ти11у Роо(е) и других, чьи смелые идеи и по- пытки сделали возможной стандартизацию разработки роботов. Благодарю всех партнеров, сопровождавших меня на пути разработки роботов с ис- пользованием КОЗ, - мы все являемся создателями эпохи интеллектуальных роботов. Слишком много людей, которым я хочу выразить благодарность, невозможно перечислить всех, но я помню каждого из вас.
Пояснение Для удобства чтения и изучения этой книги на сайте сообщества роботов «Гу Юэ» (уууууу.диуиеИоше.сот) создана специальная страница (в навигаци онной панели выберите пункт (Книги)), где можно скачать сопроводи- тельный код, просмотреть инструкции по эксплуэ гации и изучить множество сопутствующих видсоуроков. Робототехнические системы сложны, версии КОЗ часто меняются, и в кни- ге неизбежно будут недочеты и ошибки. Мы приветствуем критику и пред- ложения от читателей - все вопросы можно обсудить в сообществе роботов «Гу Юэ». Закончить введение я хочу словами китайского мыслителя Ху Ши, кото- рые могут стать нашим общим девизом: «Нс бойтесь бесконечности истины, каждый шаг вперед приносит радость». Ху Чуыьсюй (Ни Скипхи) Октябрь 2024 г., Шэньчжэнь, Гуандун, Китай
ЧАСТЬ I Основы работы с КО$ 2
Глава К05: душа умных роботов С конца 1970-х годов благодаря развитию новых технологий в области вы- числительной техники, датчиков и электроники робототехника вступила в период бурного роста. Роботы начали активно внедряться не только в тра диционной промышленности, но и в таких сферах, как домашние услуги, медицинский уход, образование и развлечения, спасательные операции и военная техника. Сегодня, с развитием искусственного интеллекта, ро боты получили новые возможности для развития. Взрывное развитие ин- теллектуальных роботов вот-вот совершит революцию в жизни людей, как когда то сделал интернет. В этой главе мы погрузимся в мир интеллектуальных роботов, раскроем тайны КОЗ и познакомимся с душой умных роботов. 1.1. Эра интеллектуальных роботов Развитие роботов прошло через три важных периода, как это показано на рис. 1.1. 1. Электрическая эра (до 2000 года). Роботы в основном использовались в промышленности и назывались промышленными роботами. Они управлялись с помощью пультов и помогали высвобождать рабочую силу на заводах. Интеллектуальный уровень таких роботов был низ- ким, и они могли выполнять действия только по командам человека. В этот период главное внимание уделялось электрическим компонен- там, таким как приводы, сервомоторы, редукторы и контроллеры, 2. Цифровая эра (2000-2015 годы). С быстрым развитием вычисли- тельных и визуальных технологий увеличилось и разнообразие ро- ботов. включая такие направления, как автоматизированные транс- портные средства и визуальный контроль. Роботы получили большое разнообразие сенсоров, однако они все еще не обладали способностью
к самостоятельному мышлению и имели ограниченный уровень ин- теллекта, способный воспринимать лишь локальную среду. Это было преддверием великой эры роботов. 3, Интеллектуальная эра (с 2015 года по настоящее время), С расцве- том технологий искусственного интеллекта роботы стали идеальной платформой для интеллектуальных технологий Такие направления, как гуманоидные роботы, сервисные роботы, роботы-доставщики, чет- вероногие бионические собаки и беспилотные автомобили, начали стремительно развиваться и официально открыли эру интеллсктуаль ных роботов. Интеллектуальная эра Рис. 1.1 ❖ Три важных периода развития роботов Аппаратное обеспечение является прочной основой для интеллектуаль- ных роботов, а программное обеспечение наделяет их душой. Быстрое раз- витие робототехники предъявляет более высокие требования к разработке программного обеспечения. Чтобы справиться с этой задачей и ускорить разработку и внедрение инноваций в области программного обеспечения для роботов в интеллектуальную эпоху, индустрия остро нуждается в созда нии универсальной операционной системы в качестве единого стандарта. В 2007 году на свет появилась операционная система для роботов (КоЪо! ОрегаНпд Зуз^ст, КОБ). 1.2. История развития АО5 Системы интеллектуальных роботов становятся все более сложными, и их разработка уже не под силу одному человеку и даже одной команде Вопрос
эффективной разработки роботов является крайне важным с технической точки зрения. В ответ на этот вызов молодые энтузиасты из Стэнфордского университета предложили решение - КОЗ. 1.2,1. Создание Н05 В 2007 году группа амбициозных студентов Стэнфордского университета задумалась о создании персонального робота, который мог бы помогать лю- дям с выполнением таких рутинных задач, как стирка, приготовление пищи и уборка, а также выполнять развлекательные функции. В итоге они вонло тили эту идею в жизнь, создав такого робота. Они понимали, что создание подобного робота - задача нелегкая, требую- щая знаний в области механики, электроники и программного обеспечения, и что им не справиться в одиночку. Поэтому они решили объединить усилия с другими специалистами. Если создать стандартную платформу для робо готехники, на которой можно разрабатывать приложения, то все програм- мы будут основаны на одной платформе, что облегчит обмен программным обеспечением. Это похоже на го, как наличие 1Р1топе позволяет использовать любые приложения, разработанные для этой платформы. Первые прототипы робота были собраны из дерева и случайных деталей, найденных в лаборатории. Позже, с появлением достаточного финансиро вания, удалось создать робота с изысканным дизайном и высокой произво- дительностью - РК2 (Регзопа! КоЬо1 второго поколения). Благодаря неустанным усилиям РК2 научился выполнять такие сложные задачи, как складывание полотенец, глажка одежды, игра в бильярд и стриж- ка волос (см. рис. 1.2). Например, складывание полотенец стало важным до снижением в области робототехники, так как это был первый случай, когда робот смог работать с гибкими объектами. Хотя за 100 минут было сложено всего 5 полотенец, это достижение значительно продвинуло научные иссле- дования в данной области. В процессе разработки робота создатели построили относительно уни- версальную программную платформу, чтобы сотни разработчиков могли работать вместе. Это и стало прототипом системы КО8, которая изначально возникла благодаря роботу РК2, но вскоре стала самостоятельным продук- том, используемым многими разработчиками для различных задач робото техники. 1.2.2. Развитие КОБ Проект персонального робота РК2 быстро привлек внимание коммерческой компании \УЧ1оад 6ага§е (аналог современной венчурной инвестиции). XVII- 1омг С1ага§е вложила значительные средства в группу молодых энтузиастов, благодаря чему робот был выпущен ограниченным тиражом.
Рис. 1.2 ❖ Пример возможностей робота РК2 После релиза РК2 в 2010 году программная система получила официаль- ное название - Роботизированная операционная система (КоЬо! ОресаНпу Зуз1ет, КОЗ). В том же году к КОЗ был официально предоставлен общий до ступ, чтобы ее могли использовать как можно больше людей, и с тех пор КОЗ стремительно развивается, как показано на рис. 1.3. 2012 год Первая конференция НОЗСо" 2014 год Выпуск РОЗ 1псНдо 2020 год 2021 год 2024 год Выпуск КОЗ Конференция Выпуск Моейс РОЗ УУогИ РОЗ Оадду 2007 год Создание в Стэнфорде Пооект ЗТА'К Морган Куигли 2010 год Выпуск РОЗ 1.0 2008 год 2011 год Управляет Выпуск ТигИеВо! УМси Оагаде 2013 год Управляет ОЗРГ 2022 год Выпуск РОЗ 2 Нитэ1е ЖШо\лт 2017 год 2020 год Выпуск РОЗ 2.0 Выпуск РОЗ 2.0 Агс1еп( Роху Рис. 1.3 ❖ История развития КОЗ Несмотря на все достоинства РК2, его высокая стоимость в сотни тысяч долларов отпугивала большинство разработчиков. В 2011 году был выпущен
популярный в области КОЗ робот ТигНеВоГ. Этот робот использовал шасси от робота пылесоса и датчик Ктсс1 от игровой консоли ХЬох, мог управляться с помощью ноутбука и поддерживал классические функции КОЗ, такие как зрение и навигация. Но самое главное, он был доступен по цене. Популяр- ность этого робота значительно способствовала росту использования КОЗ. С 2012 года число пользователей КОЗ стало стремительно расти, и сооб- щество начало ежегодно проводить конференции для разработчиков. На конференции КОЗСоп разработчики со всего мира собираются, что- бы поделиться своими достижениями, созданными с использованием КОЗ. Среди участников присутствуют такие крупные компании, какАта/оп, 1п1е1 и МгсгозоП, а количество участников с каждым годом только растет. После нескольких лет бурного и стремительного развития система КОЗ по- степенно стабилизировалась и стала регулярно обновляться. С 2014 года для КОЗ выпускают версии с долгосрочной поддержкой (Ьон^ Ите ЗирроН, ЬТЗ) каждые два года, следуя за операционной системой ЦЬип1и, причем каждая версия поддерживается в течение пяти лет. Это свидетельствует о зрелости КОЗ и ускоряет ее распространение. В 2007 году команда основателей КОЗ изначально стремилась создать персонального сервисного робота, но в итоге разработала широко исполь- зуемую робототехническую программную систему. Однако из-за ограниче- ний дизайна постепенно начали проявляться проблемы КОЗ. Чтобы создать универсальную операционную систему для всех роботов, в конце 2017 года была официально представлена новая версия - КОЗ 2. После нескольких лет улучшений, в конце мая 2022 года, КОЗ 2 получила свою первую долгосроч- ную версию КОЗ 2 НнтЫе, что свидетельствует о технической зрелости КОЗ 2 и знаменует начало новой эпохи. В мае 2024 года был выпущен второй, еще более стабильный и полный, долгосрочный выпуск КОЗ 2 1ах2у. На рис. 1.4 показано быстрое развитие экосистемы КОЗ 2 на временной шкале. 2014 год Проведение КОЗСоп 2016.1219 Выпуск Ве1а 1 2019 05.31 Выпуск ОазЫпд О|ас1ета1а 2015.08.31 Выпуск А1рЬа 1 Выпуск Агоеп! Ара!опе 2018.07 02 Выпуск Воипсу Во!зоп I 2018.12.14 Выпуск Сгуз!а1 С1еттуз 2022.05.23 Выпуск Нитр1е Наи/кзЫН 1 Рис. 1.4 ❖ История разработки ВОЗ 2 I
1,2.3. Преимущества КОЗ Основная цель КОЗ - повысить уровень повторного использования про- граммного обеспечения для роботов. Поэтому КОЗ стремится к модульной структуре и состоит из следующих четырех частей: 1) механизм коммуникации: обеспечивает эффективный и безопасный механизм распределения данных для сложных робототехнических си стем; 2) инструменты разработки: предоставляет удобные инструменты для моделирования, визуализации и отладки роботов в различных сцена риях; 3) функциональные приложения: предлагает открытые интерфейсы и пакеты функций для вторичной разработки разнообразных робото технических приложений; 4) экосистема: объединяет разработчиков роботов со всего мира для соз- дания активного и процветающего сообщества проектов с открытым исходным кодом и робототехнической культуры. Основная идея «не изобретать заново колесо» способствует быстрому раз- витию и процветанию сообщества КОЗ. Сегодня КОЗ широко используется в разработке различных типов роботов, как показано на рис. 1.5. Независи- мо от того, идет ли речь о манипуляторах, мобильных роботах, подводных роботах или гуманоидных и сложных роботах, КОЗ стала общепринятым стандартом в области робототехники. Рис. 1.5 ❖ Способы использования КОЗ Как и автомобильные компании, которые не производят все детали авто- мобилей с нуля, а закупают колеса, двигатели и мультимедийные системы у специализированных поставщиков, разработка интеллектуальных роботов происходит аналогичным образом. В сообществе КОЗ имеется множество программных модулей и инструментов, которые разработчики могут ин- тегрировать для реализации своих идей и приложений для роботов. Такой подход не только повышает эффективность разработки, по и максимально использует коллективные силы и богатый опыт сообщества, делая проекты более зрелыми и надежными.
Одновременно с этим множество разработчиков делятся своими дости- жениями - такая модель сотрудничества на основе открытого исходного кода позволяет каждому участнику извлекать пользу из опыта и инноваций других коллег. Благодаря этому, опираясь на достижения предшественников, можно ускорить прогресс, внести вклад в развитие интеллектуальных робо- тов и накопить при этом ценный опыт и глубокие знания. КОЗ обладает также следующими преимуществами: 1) глобальное сообщество: объединяет знания всего человечества для продвижения развития интеллектуальных роботов, и эти достижения сохраняются в сообществе в виде примеров использования; 2) открытая экосистема: как сама КОЗ, так и множество приложений являются полностью открытыми Компании .могут напрямую использо вагь КОЗ для разработки коммерчес ких роботизированных продуктов, что сокращает время выхода на рынок; 3) кросс-платформенное гь: КОЗ можно использовать на разных плат формах, она способна работать в Ыппх, ААйпйомз и встроенных системах; 4) применение в промышленности: в КОЗ 2 добавлено множество но- вых функций и технологий для поддержки промышленных сценариев использования, что значительно расширяет области применения КОЗ. 1.3. КОЗ 2 и КОЗ 1 Прежде чем изучать КОЗ 2, стоит сказать несколько слов о КОЗ 1. На первый взгляд, КОЗ 2 -- это просто вторая версия КОЗ с не очень значительными из- менениями. Однако это не так - изменения весьма существенны. 1.3,1. Ограничения ГС05 1 В чем была необходимость появления КОЗ 2? Очевидно, из-за каких-то проб- лем в КОЗ 1. Каких именно проблем? Ответ можно найти, изучив историю развития КОЗ. Изначально КОЗ была разработана для создания домашнего сервисного робота РК2, как показано на рис 1.6. Этот робот большую часть времени работал автономно, и для обеспечения его функциональности были пред- приняты следующие действия: 1) оснащение вычислительной платформой уровня рабочей станции и различными современными средствами связи, что исключало проб- лемы с производительностью и позволяло поддерживать сложные вы- числения в реальном времени и работу приложений; 2) поскольку робот функционировал в одиночку, большинство задач свя зи выполнялись внутри самого робота, что позволяло использовать
проводное соединение, которое обеспечивает стабильное подключе- ние без потерь и рисков взлома; 3) несмотря на то что робот все-таки был выпущен ограниченной серией, из-за высокой стоимости он использовался исключительно для науч- ных исследований. Рис. 1.6 ❖ Домашний сервисный робот РК2 По мере распространения КОЗ типы роботов, использующих эту систему, значительно изменились. Условия эксплуатации большинства роботов зна- чительно отличаются от РК2, и программная структура КОЗ столкнулась со следующими проблемами: 1) необходимость работы в условиях ограниченных ресурсов встраивае- мых систем: 2) обеспечение надежности связи в условиях помех; 3) создание продукта для выхода на рынок, включая использование в бес- пилотных автомобилях и космических роботах. Подобные ограничения привели к появлению большого числа сложностей, что и послужило причиной создания нового поколения КОЗ 2, более подхо- дящего для различных сценариев использования роботов 1.3.2. Новая версия К0$ 2 КОЗ 2 призвана изменить эпоху интеллектуальных роботов, и при ее раз- работке учитывались разнообразные потребности индустрии производства роботов.
1. Многороботные системы В будущем роботы не будут изолированными единицами, они должны бу- дут взаимодействовать и сотрудничать друг с другом. КОЗ 2 предоставляет стандартные методы и механизмы связи для применения в многороботных системах. 2. Кросс-платформенность Различные сценарии применения роботов требуют использования различ пых платформ управления. Например, потребности в вычислительных мощ- ностях у человекоподобных роботов обычно выше, чем у логистических. Для работы самых разнообразных типов роботов КОВ 2 поддерживает работу на таких операционных системах, как Ътнх, Мтс1омг5, тасОЗ, КТОВ, и даже на микроконтроллерах (МСН) без операционной системы. Это избавляет разра ботчиков от необходимости беспокоиться о том, совместим ли их контроллер с платформой КОЗ. 3. Реальное время Управление движением робота и многие поведенческие стратегии требуют от робота работы в реальном времени. Например, робот должен надежно обнаруживать пешеходов впереди за 100 мс или стабильно выполнять ки- нематические расчеты за 1 мс. КОЗ 2 предоставляет базовые гарантии для удовлетворения таких требований. 4. Сетевое подключение Независимо от сетевой среды КОЗ 2 стремится обеспечить целостность и безопасность большого объема данных робота. Например, данные должны быть переданы даже при плохом сигнале Уй -Р1, а в условиях риска хакерских атак данные должны шифроваться. 5. Коммерциализация Множество роботов уже вошли в жизнь людей, и в будущем их влияние бу- дет только расти. КОЗ 2 может использоваться не только для разработки роботов, но и непосредственно встраиваться в продукты, выходящие на по- требительский рынок. Это предъявляет высокие требования к стабильности и надежности КОЗ 2. 6. Управление проектами Разработка роботов - это сложный системный процесс, включающий про- ектирование, разработку, отладку, тестирование и развертывание. В КОЗ 2 также реализованы инструменты и механизмы управления проектами на всех этапах, что облегчает создание и управление робототехническими про- дуктами.
Удовлетворение вышеуказанных требований является непростой задачей. Разнообразие роботов делает разработку системы, подходящей для всех из них, гораздо более сложной, чем создание стандартизированной системы для мобильных телефонов или компьютеров. Разработчики КОЗ стояли перед двумя вариантами. Первый - это моди- фикация и оптимизация архитектуры КОЗ 1, подобно выполнению черновой отделки в новом доме для последующего ремонта. Однако это ограничивало бы возможности из-за существующей структуры и в долгосрочной перспек- тиве не было бы лучшим решением. Поэтому они выбрали второй вариант - начать с нуля. Таким образом, КОЗ 2 представляет собой совершенно новую операцион- ную систему для роботов, которая, опираясь на успешный опыт КОЗ 1, была заново спроектирована и реализована с точки зрения архитектуры и про- граммного кода. Была переработана архитектура системы. В КОЗ 1 все узлы должны были работать под управлением диспетчера узлов КОЗ МэЩег, и в случае его сбоя система подвергалась риску остановки. В КОЗ 2 реализована ис- тинная распределенная система, где роль МаЩег отсутствует, а надежная связь между всеми узлами обеспечивается новыми коммуникационными фреймворками ЭВЗ и Хепоп. Был переработан программный интерфейс АР1. Существующий АР1 КОЗ 1 не удовлетворял всем потребностям, поэтому в КОЗ 2 был разработан более универсальный АР1 с учетом новых стандартов С++ и особенностей языка РуГйоп 3. Это привело к тому, что код КОЗ 1 нельзя напрямую запустить в КОЗ 2, но при этом были сохранены аналогичные методы использования, а также предоставлено множество инструкций по миграции. Оптимизация и модернизация системы компиляции. В КОЗ 1 исполь- зовались говЬиЯй и саШп, которые имели множество проблем, особенно при работе с крупными проектами и проектами, написанными на РуШоп. Часто возникали ошибки при компиляции и компоновке. В КОЗ 2 эти проблемы были решены, новая система компиляции называется атеШ и со!соп. Она обеспечивает более стабильный и эффективный процесс компиляции и ком- поновки, снижая вероятность ошибок и делая весь процесс разработки более плавным и управляемым. 1.3.3. Сравнение КОБ 2 и КОБ 1 1. Архитектура системы В КОЗ 1 на уровне приложений (АррПсаНоп Ьауег) роль управляющего узла МаЩег была крайне важна, а все узлы должны были подчиняться его коман- дам (см. рис. 1.7). Это похоже на должность генерального директора в ком- пании: он один, и если он внезапно исчезнет, компания погрузится в хаос. Для повышения устойчивости и масштабируемости в КОЗ 2 была внедрена
инновационная система П1зсоуегу, позволяющая узлам самостоятельно на- ходить друг друга и устанавливать стабильные коммуникационные связи, что устраняет риск возникновения единой точки отказа. Средний уровень (МШШешаге Ъауег) представляет собой стандартизиро- ванный интерфейс связи КОЗ. При написании программ разработчики часто взаимодействуют с этим интерфейсом, например при публикации данных изображения или приеме информации от дальномера. Клиентская часть вы- полняет вызовы сложных драйверов и коммуникационных протоколов ниж- него уровня, что упрощает процесс разработки и делает его более понятным. В КОЗ 1 коммуникация использовала протоколы ТСР и ПОР, тогда как в КОЗ 2 используется более сложный и усовершенствованный механизм си- стемы связи ВОЗ (Ва1а Шз^пЬиНоп Зепчсе). Нижний уровень - это системный уровень (ОЗ Ъауег), который определяет, на каких операционных системах можно установить КОЗ. В КОЗ 1 основная установка происходила на Ьших, в то время как КОЗ 2 поддерживает мно- жество вариантов' Ыпнх, ийпбошз, тасОЗ, КТО8. 2. Система связи Кто-то может задаться вопросом, почему для КОЗ 2 была выбрана система связи ПИЗ? Что такое ППЗ? В КОЗ 1 система связи основана на ТСР/ЛОР, и из- за особенностей этих протоколов в процессе разработки часто возникали задержки, потеря данных и невозможность шифрования. Поэтому в КОЗ 2 была внедрена более сложная и усовершенствованная система ППЗ. ППЗ - это широко используемый в интернете вещей механизм связи, ана- логичный известному всем стандарту 50. ББЗ является международным
стандартом, и программные системы на его основе создаются множеством производителей. Таким образом, можно выбрать систему 1)08 от различных производителей, таких как ОрепВрНсс, ГазгКТРВ и других, каждая из которых обладает своими преимуществами и подходит для различных сценариев. Однако это приводит к проблеме: программные интерфейсы каждого про- изводителя ИОВ различаются. Если программа написана с использованием интерфейсов одного вендора, то для перехода на другую систему ВВВ по- требуется переписывать код. Это, конечно, не соответствует цели КОВ по повышению уровня повторного использования программного кода. Для решения данной проблемы в КОВ 2 была разработана система КОВ ММсПешаге, сокращенно КМ\У (см. рис. 1.8). Это стандартный интерфейс, который определяет, как отправлять и получать данные, а также как настра ивать различные свойства данных и т. д. Если производитель хочет подклю- читься к сообществу КОВ, ему необходимо создать адаптивный интерфейс в соответствии с этим стандартом и адаптировать к нему собственную систе- му ВОВ. Таким образом, задача передается производителю, который хорошо знаком с собственной разработкой. С точки зрения пользователя, если какая- либо БВВ оказывается неудобной, достаточно установить другую, выполнить простую настройку и заменить систему связи, не изменяя приложение. Шег Дрр||са<10П8 Пользовательские приложения Пользова1а1ьский код СНеп( УУгаррег Клиентская обертка гс1срр Клиентская Промежут очное ПО КОЗ библиотека Не зависит от 008 МИс 1етаге Промежуточное ГО °еализация КМУУ Раь1КТРЗ Реализация КМУУ ОрелЗрПсе РлзтТесИ ОрепЗрНсе Сторонняя реализация КМУУ □08 стороннего разработчика еРгоз1та Раз(КТР8 Не зависит от КОЗ ЭСЗ Рис. 1.8 ❖ Обзор архитектуры системы КОВ 2 В целом интеграция ВВВ делает систему КОВ 2 более стабильной, гибкой и универсальной. Разработчикам больше не нужно беспокоиться о стабиль- ности системы связи КОВ и о ее оптимизации, они могут сосредоточиться на реализации функционала роботизированных приложений. 3. Основные концепции КОВ 1 получила широкое распространение, и миллионы разработчиков по всему миру уже познакомились с методами и подходами разработки в КОВ 1.
Для упрощения перехода на новую версию в КОБ 2 сохранили следующие концепции: □ Рабочее пространство (Могкзрасе): основная база для разработки, место для размещения различных файлов разработки; О Пакет (1’аскаде): сборка исходного кода функций, используемая для реализации определенной функции робота; О Узел (Мойе): рабочая единица робота, исполняемый файл, скомпили- рованный из кода; □ Тема (Торге): мост для передачи данных между узлами, периодически передающий информацию между функциями; О Служба (Бегугсе): взаимодействие по формуле «запрос-ответ» между узлами, используемое для настройки некоторых функций и парамст ров робота; □ Коммуникационный интерфейс (1п1еНасе): стандартная структура передачи данных, определяющая различные формы данных робота; □ Параметр (РататеСег): глобальный словарь системы робота, позволяю- щий определять или запрашивать параметры конфигурации робота; О Действие (АсПоп): управление процессом выполнения полного дей ствия, контролирующее выполнение роботом определенных задач; □ Распределенная связь (О181пЬи1:ес1 СоттшнсаНоп): распределение задач на нескольких вычислительных платформах для быстрой сетевой интеграции; □ БВ8 (ВаСа ВшГпЪнпоп Зегуке): нейронная сеть робота, обеспечиваю- щая эффективную и безопасную передачу данных. Если вы работали с К.О8 1,то вам знакомы эти концепции, и в КОБ 2 они со- храняются с почти идентичным смыслом. Если вы незнакомы или не изучали КОБ, не беспокойтесь, в главе 2 будут представлены значения и способы ис- пользования этих концепций. 4. Написание кода Теперь рассмотрим способы написания кода. Ниже приведено сравнение основных функций АР1 в КОБ 1 и КОБ 2. # Импорт библиотеки АР1 РуЬНоп. тгрогб гс1ру # РОБ 2. тррогб гозру # РОЗ 1. # Создание сбъе<та издателя темы. зеИ.риЬ = 5е1Г.сгеаГе_рийЛ5Ьег($1:г1пд, "сбаГСег", 10) # КОЗ 2. рсЬ = гозру .РиЫл5пег( 'сЬаССег, 51гтпд, диеие_зт2е-10) # КОЗ 1. # Создание объе<та подписчика темы. зеИ.зиЬ = 5еИ.сгеа1:е_5иЬ5сг1рНоп($1ггпд, "сбаПег", зеИ 1Лз1епег_са11Ьаск, 10) # РОЗ 2. гозру.ЗиЬьсгъЬег("сбаСсег", 51г1пд, 1лз1:епег_саиЬаск) # КОЗ 1. # Создание объе<та сервера службы. зеИ.згу = 5е1Г.сгеа1:е_зег7тсе(Ас!с1Тыо1п1:з, 'а(М_Що_1пСз', зе1С.ас1с1ег_са11Ьаск) # РОЗ 2.
згу = го5ру.5егугсе('ас1с1_Т:ио_гпб5', ЛббТиоТпГз, абс1ег_са11Ьаск) # К05 1. # Создание объекта клиента службы. зеН.сНепб = 5еИ.сгеабе_с11епб(Ас1 сЦиоГпгз, 'ааб_био_1п15') в К05 2. сИепб = гозру ,5егЛсеРгоху( абб_бт_1пС5', ЛбаТиоШз) # КОЗ 1. # Вывод информации в журнал. 5е1Г.деС_1оддег()Лото( РиЫгзбгпд: "%з" ' % пзд.баГа) в РС5 2. гозру.ТодтпГо( 'РсЬИзЫпд "%з" ", пзд.баТа) # КОЗ 1. В .405 2 функции А1’1 были переопределены, но способы их использования не сильно отличаются от КОЗ 1. Кроме того, в КОЗ 2 используется больше объектно ориентированных методов и языковых особенностей, что с точ- ки зрения программирования действительно повышает сложность. Однако, преодолев этот барьер, вы обнаружите, что написанные программы стано- вятся более читаемыми и переносимыми, а также что этот процесс ближе к процессу разработки программного обеспечения для роботов в реальных компаниях. Что касается непосредственно написания кода, не стоит спешить и хвататься за объ- емные учебники по языкам программирования, изучая их страницу за страницей. Более эффективный подход заключается в том, чтобы учиться в процессе разработки проекта, осваивая материал постепенно. В последующих главах этой книги мы будем шаг за шагом выполнять различные практические задания. 5. Инструменты командной строки Командная строка - .это один из наиболее часто используемых инструментов разработки при работе с КОЗ (см. рис. 1.9). А гоз2(ФдиуиеЬоте: ~ О = - □ х го52@диуиеЬопе:-$ гоз2 эсЬтоп □ад сопропепт дзетой босСог ех1епьгоп_ро1п15 ехтепзтопз ГпСегГасе 1аопсЬ ПГесусХе го52@диуие!юпе:-$ гоя2 глиШсазЦ побе раган ркд гип ьесигНу зегутсе Горте - -озе- руГЪоп-оеГаоНнЬоГГегтпд н1Г Рис. 1.9 ❖ Пример использования командной строки КОЗ 2 По сравнению с КОЗ 1, в КОЗ 2 командная строка стала более интегриро ванной: все команды объединены в одну основную команду КОЗ 2. Напри- мер, гоз2 тип означает запуск определенного узла, а гоз2 юрте - функции, связанные с темами.
Если вы только начинаете работать с КОЗ 2, достаточно иметь общее пред- ставление о командной строке. Следуя материалам этой книги, вы постепен- но поймете ее особенности. Кроме того, командная строка КОЗ 2 обладает множеством функций, которые будут раскрыты в последующих разделах книги. 1.4. Установка КОБ 2 Хотя КОЗ называется «операционной системой», она не является таковой в привычном смысле - ее нельзя установить непосредственно на оборудо- вание. Перед установкой КОЗ необходимо сначала установить на компьютер ЦЪшКи (дистрибутив Ыпих). 1.4.1. Что такое Ыпих В 1991 году увлекающийся компьютерами финский студент Линус Торвальдс после изучения принципов операционных систем и системы ТГМХ решил создать собственную операционную систему. Следуя правилу «практика - единственный критерий истинности», он в соответствии с существующими общими стандартами разработал ядро новой операционной системы, кото- рое не только поддерживало многопользовательский и .многозадачный ре- жимы, но и было совместимо с существующими приложениями ИХIX. Важно отметить, что он поделился этой еще не до конца разработанной операцион- ной системой в интернете и назвал ее своим именем - Ыпих. Операционная система Ыпих быстро распространилась через интернет. Многие энтузиасты, познакомившись с Ыпих, начали делиться своими проб- лемами и методами их решения. Эта система вызвала огромный интерес, и все больше людей стали участвовать в поддержке Ыпих. Первоначально ограниченная по функциональности и содержащая множество ошибок опе- рационная система быстро стала достаточно мощной. Кроме того, Ыпих ста ла локомотивом программного обеспечения с открытым исходным кодом. В отличие от платной Ийпбосуз или привязанной к оборудованию шасОЗ, Ыпих была бесплатной и открытой операционной системой, которую может использовать и улучшать любой желающий. Это привлекло множество раз- работчиков, энтузиастов и даже компаний. Сегодня объем кода, вносимого в систему Ыпих за год, стал важным показателем технической .мощи крупных компаний. Ыпих стремительно развивается и уже стала стабильной многопользова- тельской операционной системой, широко используемой в интернете и в об- ласти искусственного интеллекта. Она также является важной базовой си- стемой КОЗ 2, предоставляя основные функции управления программным и аппаратным обеспечением для разработки роботов.
1.4.2, Что такое 11Ьип1и Перед использованием КОЗ 2 необходимо установить Ыпих, и здесь возни- кает еще одно понятие - дистрибутив. Что такое дистрибутив? Строго говоря, упомянутый ранее Ыпих следует называть лишь ядром операционной системы, которое не имеет визуально- го интерфейса. Дистрибутив -- это оболочка для этого ядра, объединяющая пользовательский интерфейс и различные приложения в один установочный образ системы, как показано на рис. 1.10. Семейс’вс дистрибутивов Отаельные дистрибутивы Рдро Ыпих Рис.1.1.- ❖ Ядро 1;пих и дистрибутивы Наиболее распространенными дистрибутивами Ыпих являются ЦЪипГи, Ребога, Кеб На1 и другие, Каждый из них имеет свои области применения: Кеб На1 подходит для коммерческих приложений, СепЮЗ - для серверов, а НЬип1и и Ребога - для личного использования. Несмотря на различия в ин- терфейсе, ядро у всех дистрибутивов одно - Ыпих, и основные методы работы с системой схожи. Дистрибутив НЬип1и появился в октябре 2004 года и обновляется каждые шесть месяцев. Пользователи могут бесплатно обновлять систему, в которой имеются все необходимые для повседневного использования программы, такие как браузеры, текстовые редакторы и коммуникационные приложе- ния. В области разработки программного обеспечения, будь то интернет- разработка, искусственный интеллект или робототехника, ЦЬип1и занимает важное место. Быстрая смена версий ЪГЬцпШ делает выбор подходящей версии важным этапом, так как различия в версиях могут напрямую влиять на переносимость приложений При выборе версии обратите внимание на номер, следующий за названием, например ЦЬцпШ 24.04: 24 обозначает 2024 год, а 04 - месяц
апрель. Также возможен выпуск в октябре, обозначаемый числом 10, что по- зволяет легко определить порядок выхода версий по их номеру. Для обеспечения стабильной среды для разработчиков ПЬипГи выпускает каждые два года в апреле версию с долгосрочной поддержкой (ЬТ8), кото- рая поддерживается и обновляется в течение пяти лет. Например, ПЬцпШ 22.04ЪТ8 и НЬипГи 24.04 Е.Т8 Все остальные версии поддерживаются только 18 месяцев, поэтому рекомендуется выбирать версии с долгосрочной под- держкой. В книге рассматривается ЦЬип1и 24.04 ЕТ8, но можно использовать и дру гие версии с долгосрочной поддержкой, так как принципы и методы работы в них схожи. ЛЬ Хотя КО.Б 2 псддерживает Штболз и тасОБ, наилучшая поддержка обеспечивается для операционной системы ОЬипСе. Основное внимание в книге уделяется использо- ванию КОБ 2 на ОЬипТо Принципы работы на других системах аналогичны. 1 АЗ. Установка операционной системы 11Ьип1и Многие из вас, вероятно, уже готовы попробовать ЦЬшПц. Существует мно- жество способов установки, как это показано в табл. 1.1. Если вы уже знакомы с Ыпнх, рекомендуется установить ИЬнпШ на жесткий диск компьютера, что- бы максимально использовать возможности оборудования. Если вы впервые сталкиваетесь с Ыпих, лучше установить ЦЬнпШ на виртуальную машину на уже имеющейся ЕУтсИусз, а затем, освоившись, рассмотреть установку на жесткий диск. Таблица 1.1. Способы установки иЬип1и, их преимущества и недостатки Ха рактеристика Установка на виртуальную машину Установка на жесткий диск Простота установки Просто Сложно Поддержка оборудования Средняя Хорошая Скорость работы Медленная Быстрая Резервное копирование Простое Сложнее Подходит для обычных пользователей Для новичков или нерегулярного использования Для опытных разработчиков В книге основное внимание уделяется установке на виртуальную машину, но вы также можете изучить установку на жесткий диск с помощью учебных материалов или информации в интернете. Л\ Виртуальная машина - этс программное обеспечение, которое позволяет создать виртуальную систему поверх сущес_вуюш,ей, обеспечивая одновременную работу не- скольких операционных систем. Б нашем случае используемся программное обеспе- чение УМтуаге, усановка которого аналогична установке других программ. Скачайте и установите его самостоятельно
После установки программного обеспечения виртуализации можно при- ступать к установке операционной системы. Ниже приведены этапы уста- новки. 1. Загрузка образа операционной системы СЪиШи Перейдите на официальный сайт ЪГЬцпШ и найдите страницу загрузки, как показано на рис. 1.11. Нажмите кнопку РоюгПэай (Загрузить), чтобы начать загрузку. Поскольку файл образа довольно большой, потребуется некоторое время. После завершения загрузки можно переходить к следующему шагу. ОЬипШ 24.04.2 И5 Эоюп1оаб ТНе 1аЕезЕ 1_Т5 адегзюп оГ ОЬипЕи, Рог «ЛезкЕор РСз апд 1арЕорз (_Т5 зЕалдз Гог 1опд- Ееггп зиррогЕ—юЬюЬ теапз Г|уе уеагз оГ Ггее зесипЕу апс! татЕепалсе ирс!аЕез, ехЕепс!ес1 ир Ео 12 уеагз ю»ЕЬ иЬипЕц Рго. IлЕе1 ог АМО 64-ЫЕ агсЫЕесЕиге РогоЕЬегуегзюлз оГ ОЬипЕи ЭезкЕор тсккйпд ЕоггепЕз, ЕЬе пеблгогк тзЕаИег, а 1|ЗЕ оЕ 1оса1 ГП1ГГОГ5 апд разЕ ге1еазез сНеск ои1 оиг аЦегпайуе дошп!оас15 УУЬаС’з леи/ 5узЕет гедшгетепЕз Ною Го тзСаИ © 2 СНг <1 иа 1-согергосеззог о г Ье ЕЕег © 4 СВ зузЕет тетогу © 25 СВ оГ Ггее Нагс) дпуе зрасе © Е|ЕЬег а 05В рогЕ ог а 0\/0 с1г1 уе Гог ЕКе тзЕаИег тесЛа © Iл Еегл еЕ ассезз 15 Н е1рГи I Рис.1.11 ❖ Интерфейс загрузки бЬигДи 2. Создание системы в виртуальной машине Откройте программное обеспечение УМшаге и в меню Е11е (Файл) выберите Мею УпДиа) МасЫпе... (Создать виртуальную машину...). Затем выберите I юП1 тзЕаП ЕЬе орега1ш§ зузЕет 1аЕег (Установить операционную систему позже). Появится окно, показанное на рис. 1.12. Выберите Ыпих, версия ЦЪипЕи 64-ЫЕ, и нажмите кнопку ЫехЕ (Далее). 3. Настройка размера жесткого диска виртуальной машины Выделите место на жестком диске для этой виртуальной операционной си- стемы ПЬнпШ, как показано на рис. 1.13. Настройте размер в зависимости от доступного пространства на вашем компьютере. Рекомендуется выделить не менее 20 ГБ, ^тобы удовлетворить базовые потребности в разработке роботов с использованием КОБ. Если позволяет пространство на ком- пьютере, можно выделить около 50 ''Б, чтобы иметь возможность установить различ- ные программы и документацию.
№е*у \<1т1иа1 МасНше УЛгагд X 5е1е<± а ОрегаИпд 5у51ет \А/Н|сЬ орегаЬпд зуз^ет «лнП Ье г>з1а11е д оп <Ыз У1гШа1 тасЬте? Сиез! орегаЬпд зуз1ет О М|СГО5ОЛ УУ|ПС1О'Л/5 ОЦпиЙ О Арр1е Мас 05 X О УМмаге Е5Х Оойгег Уегэоп □Ьип!и 64-ЬФ V Не1р < Васк [ №х! > ] Сапсе! Рис. 1.12 ♦♦♦ Мастер создания новой виртуальной машины Мем 71гк1а1 МасНше МЛгагд X 5ресИу О к к СарасЛу Ном 1агде до уои мал! диз д|эк 1о Ье? ГНе VII-Ша1 гпаЛпе’з Иагд д!зк !з зЬэгед аз опе ог тоге <п1ез оп Йпе Коз! сотри^ег'з рНуяса! д|эк. ТЬезе Й1е(з) з!агТ зта11 апд Ьесоте 1агдег аз уои адд аррЬсаЬопз, Я1ез, апд да (а 1о уоиг У1г1иа1 тасЫпе. Мах!тит д!зк яге (СВ): С 1 Несоттепдед яге Гог 11ЬипШ 64-Ь|Ь 20 СВ О 5<юге У1гйиа1 д!зк аз а зпд1е Й1е О 5р*|^ У)г1иа1 д|эк т1о ти1др1е Яез 5р11Й]пд 1Ье д|зк такез |[ еаяег Ьо тоуе Й1е 71гШа1 тасЬте 1о апоШег сотриЪег Ьи1 тау гедисе рег<Ъгтапсе М1#1 уегу 1агде д1зкз. Не1р к___<^Васк [ №х! > ] Сапсе! Рис. 1.13 ♦♦♦ Параметры жесткого диска виртуальной машины 4. Настройка пути к образу ЦЪипТи После завершения конфигурации нажмите кнопку ЕсН( У1г1иа1 тасЫпе зе!- 1т§5 (Настроить параметры виртуальной машины), как показано на рис. 1.14. В появившемся окне найдите параметр СБ/ОУО, нажмите кнопку Вгоигзе (Обзор) и выберите ранее загруженный образ операционной системы НЬнпШ.
У|г1иа1 МасЫпе 5еЙ1пдз НалЬчаге орйопз □еу|се Ё^Метогу ^Ргосеззогз ЭНагд 01зк (5С51) ®СОЛ)УО(5АТА) Ие^логк А^ар!ег @□58 СопЬ-оЯег Ф Зоипд Саг<1 П0|зр1ау Зиттагу 468 2 20 68 Аи1о Ье1ес1 ЫАТ Ргезеп! АиЬэ де!ес! Аи1о де1ес! Сейлсе зЫнз О Соппес1ес1 О Соппес! а! реплее оп Соппесйоп О изе вЬуз1са1 скп/е: АиЬэ ^еЬес1 о Озе 1501таде Й1е: с: \йолт)1оадзУ1Ьипк1.15о АсЬ/апсей... Рис. 1.14 ❖ Настройка пути к образу 11ЬипШ 5. Запуск виртуальной машины После завершения подготовки нажмите Роадег оп 11т уггШа] тасЫпе (Включить виртуальную машину). Процесс аналогичен установке операцион- ной системы на физический компьютер. Система загрузится с виртуального компакт-диска, и в интерфейсе установки нажмите кнопку 1т1а11 ЦЬип1и (Установить ЦЪипШ). 6. Настройка имени пользователя и пароля Далее настройте имя пользователя и пароль в соответствии с вашими пред- почтениями. 7. Ожидание завершения установки системы Дождитесь завершения установки системы. После автоматической переза- грузки вы увидите новую операционную систему ПЬипЕп, как показано на рис. 1.15. 1.4,4, Установка системы К05 2 После подготовки операционной системы ПЬппСи .можно приступить к уста новке К.О8 2. Для этого потребуется использовать командную строку ИЬипСп, также известную как Тсгтша! (терминал). Ее можно открыть его с помощью сочетания клавиш С1г1+А1Т+Т. После запуска терминала введите следующие команды для установки КОЗ 2. В данной книге рассматривается версия КОЗ 2 под именем (аггу, которая соответствует ЦЬппСи 24.04 ЬТЗ. ®Ниже приведены подробные шаги установки с официального сайта КОБ. Если вы впервые устанавливаете КОБ 2 или хотите воспользоваться более простым способом установки, можно использовать сценарий быстрой установки ГО5ДП5ЩЦ.5Г1 из сопро- водительного кода книги. Введите команду ./гозДпзГаЦ.зИ в терминале а директории, где находится сценарий, и следуйте инструкциям для выполнения установки.
ЛН2 2343 А Ф Рис. 1.15 ❖ Интерфейс операционной системы ШЬипГи 24.04 1_Т5 1, Настройка кодировки Убедитесь, что система использует правильные настройки локали и языко- вую среду, чтобы обеспечить корректное отображение языка и поддержку локализации при установке и запуске программного обеспечения. Откройте терминал и введите следующие команды. $ зис!о ар1 ирбаге && зас!о арЕ гпзгаП 1осэ1ез $ зидс Тоса^е-дел еп_115 еп_1>5.1ЛТ-8 $ зидо ирйаГе-Тоса^е 1С_АП=еп_и5.иТЕ-8 1_АМС=еп_и$.1ЛЕ-8 $ ехрогР 1_АМС=еп_и$.иТЕ-8 2. Добавление источников программного обеспечения Перед установкой КОЗ 2 необходимо указать системе, откуда загружать уста- новочные пакеты КОЗ 2. Серверы, на которых размещены эти пакеты, на- зываются источниками программного обеспечения. Для загрузки пакетов из источников необходимо также настроить ключи, чтобы открыть «дверь» для загрузки. Откройте терминал и введите следующие команды, чтобы подписать ключ подписи КОЗ 2 в системной связке ключей и добавить адрес источника про- граммного обеспечения. Только после этого система сможет установить па- кет КОЗ 2 через менеджер ар1. $ зисо арг гпзгаП. зоНжаге-ргоре^ЕЛез-соппоп $ зисо асУ-арГ-герозПогу ипЩегзе $ зиоо арГ ирйаЬе Ы зийо арГ тпзГаП сиг! -у
$ зис!о сиг! -551 [1ЛП-адрес ключа СИНиЬ Р05] -о /изг/зЬаге/кеуггпдз/гоз-агсЬОе-кеугСпд.двд $ есЬо ''с!еЬ [агсп=$(иркд --ргггД-агсЬгСесЬиге) 51дпес1-Ьу=/и5г/511аге/кеуг1пд5/го5-агсЫуе-кеуг1пд.дрд] [эазсвый адрес источника РОЗ] $(. /е1с/08-ге1еазе && ес1ю $0БиМЩ_СЭ0ЕНАМЕ) патп" | зидо ±ее /еФс/арб/БОигсез. ТЛзС .<1/1052,> / с)еу/пи И ЛЬ Заполнители [11К1-адрес ключа СЩНиЬ КОБ] и [Базовый адрес источника КОБ] несб- ходимо заменить на актуальные ссылки, указанные в разделе IпзСаНаОоп (установка) официального руководства КОБ. 3. Установка КО8 2 После завершения подготовки введите в терминале следующие команды для начала загрузки и установки настольной версии КОЗ 2. Все, что требуется, - это подождать. $ зибо ар! ирс!а1:е $ зийо арт ирдгайе $ зис(о ар! спзСаИ гоз-таггу-СезкГор # Установка РОБ 2 Заггу ОезкСор. 4, Настройка переменных окружения КОЗ 2 успешно установлен на компьютер - по умолчанию в каталоге /орО Поскольку в дальнейшем предстоит часто использовать терминал для ввода команд КОЗ 2, необходимо настроить системные переменные окружения, чтобы система знала, где находятся различные файлы КОЗ 2. Ниже приведе- ны команды для настройки. $ зоигсе /срг/гэз/даггу/зеСчр.ЬазЬ $ есПо "зоигсе /орС/гоз/дагау/зеСир.ЬазЬ" » ~/.Ьаз!агс 5. Тестовый пример После завершения установки можно протестировать корректность установки КОЗ 2 с помощью следующего примера. Запустите первый терминал и выпол- ните следующую команду для запуска узла-публикатора данных (рис. 1.16). $ гоз2 гип аеР1о_по<1е8_срр ГаТкег ГП го52@д иуиепоте: - О = -ах го$2@диуиепопе:~$ гоз2 гип пето. Г|Оае5_срр 1а1кег [СЫРО] [1720269010.722170580] [СаГкег]: РиоПзЫпд: ’НеПо ЫогЫ: 1' [ТЫГО] [1720269011.722232864] [1а1кег]: РиЬИзМпд: 'НеПо ИогЫ: 2 [1ГчРО] [1720269012.722263116] [чаГкег]: РиоИоМпд: 'Не11о ног 1а: 3' [1ГЧГО] [1720269913.722191456] [чаЕкег]. РиЫчгЬчпд. 'НеПо ЫогХО: 4 [1НРО] [ 172026903 4.722034236 ] [ЧаГкег]: РиЬНлМпд: НеПо Но, 10; 5 [1К1Р0] [1720269015.722327464] [чаГкег]: РиМчдМпд- 'НеПо ИогЫ: 6' [1МР0] 11720269016.722071104] [СаТкег]: РиЬПгЬчпд: 'НеПо Ног 10: 7' [1ЙР01 [1720269017.7227325581 [ЧаГкег ]: РирПзЬСпд: 'НеПо НогЫ: 8 Г1ЙЕО1 11720269018.7222561871 ПаГкегТ: РиЬНаЬСпа: 'ИеПл_Ыаг1Щ_4' ________
Запустите второй терминал и выполните следующую команду для запуска узла-подписчика данных (рис. 1.17). $ ГЭ52 гип йепо_поСеЕ_ру ИзГелег го52(®диуиейоте: - го52@диуие11ог1е:~$ гоз2 гип депо_подез_ру 1Ль1епег [1ЫРО] [1720269098.208724710] [Нз^елег]: I Неагд [1МЕО] [1720269099.194265214] [ПзГелег]: I Ьеагд [1*1Р0] [1720269100.193299403] [Н51епег]: I Неаг<1 [1МРО] [1720269101.193625939] [Н.$1епег]: I Ьеагд [1ЫЕО] [1720269102.192995209] [Нз^епег]: I Ьеагд [11ЧРО] [1720269103.193537249] [Пз1епег]: I Неагд [НеПо НогХд: 1] [НеПо НогТс!: 2] [Не По НогХд: 3] [НеПо Ног1с1: 4] [НеПо Ыог1(1: 5] [НеПо Ног1д: 6] Рис. 1.17 ❖ Прсцесс работы узла-подписчика данных Если строка «НеПо Ж)г1с1» передается между двумя терминалами без проб- лем, это означает, что система коммуникации КОЗ 2 работает корректно. На этом установка КОЗ 2 завершена. 1.5. Командная строка КОБ 2 В процессе установки КОЗ 2 вы познакомились с одним из важных отла- дочных инструментов в КОЗ 2 - командной строкой, и сначала она может показаться непривычной. В этом разделе мы изучим другие команды КОЗ 2, и по мере изучения вы обязательно ощутите все преимущества командной строки. 1.5.1. Командная строка в Ьпих Работа в командной строке подобна сценам из научно-фантастических филь- мов - выглядит весьма эффектно. Но освоить ее тем не менее не так просто. Почему же такой, казалось бы, не самый удобный инструмент используется до сих пор? Для Ыпих и КОЗ командная строка является совершенно неза- менимой. Представьте себе следующую ситуацию. Несмотря на все разнообразие одежды в магазинах, сложно полностью удовлетворить потребности всех покупателей. Если бы продавцы предостав- ляли услуги по индивидуальному пошиву одежды, ситуация бы значительно изменилась. Такая услуга позволяет клиентам на основе существующих мо- делей, с учетом личных предпочтений, разрабатывать собственный дизайн. Хотя такой подход может показаться несколько утомительным, его гибкость очевидна. Клиенты могут создавать в точности ту одежду, которая им нужна, нс ограничиваясь готовыми правилами.
В этом примере готовая одежда, предлагаемая другими продавцами, по- добна заранее разработанному программному обеспечению с графическим интерфейсом, которое, хотя и тщательно продумано, не всегда может полно- стью удовлетворить индивидуальные потребности всех клиентов. А услуга индивидуального пошива напоминает командную строку, предоставляя кли- ентам материалы, инструменты и другие ресурсы, позволяя им более гибко и в соответствии с личными предпочтениями и потребностями осуществлять тонкую настройку. 1. Способы запуска Команды командной строки вводятся с помощью символов и требуют спе- циального программного обеспечения Тегпнпа! (терминал). Существует не- сколько способов запуска терминала. 1. Открыть из списка приложений. 2, Использовать сочетание клавиш С1г1+А11+Т. 3. Щелкнуть правой кнопкой мыши и в появившемся контекстном меню выбрать Ореп а 1егпйпа1 Неге (Открыть терминал здесь). Интерфейс терминала показан на рис. 1.18. Поскольку он предназначен исключительно для ввода и вывода команд, мышь используется редко (имен- но поэтому хакеры в научно-фантастических фильмах носят с собой ноутбу- ки, но никогда не используют мышь). ₽ис. 1.1 ❖ Окно терминала На первых порах командная строка может показаться скучной и трудной для освоения, Однако со временем вы оцените ее привлекательность. Коли- чество команд и функциональных параметров действительно велико, но нет необходимости заучивать их все. Обычно используется всего около двадцати команд, остальные можно найти при необходимости в справке,
2. Основные команды Давайте сначала познакомимся с самыми распространенными командами Ыпих. 1. сд Синтаксис: ей <путь к каталогу>. Действие: изменяет рабочий каталог. Если «путь к каталогу» не указан, воз- вращает пользователя в сто домашний каталог. 2. риг/ Синтаксис: р\\Д, Действие: отображает абсолютный путь текущего рабочего каталога, как по- казано на рис. 1.19. го52@диуие>1оме:~$ рыс! /Ьо1че/го52 го82@диуиеЬоп>е:~$ сд <1еу_и5/ го52фдиуиекопе:-/<1еу_ы5$ рис /Ноте/го52/с1еу_и5 го52(ЭдиуиеЬог>е:~/<1еу ы5$ | Рис. 1.19 ❖ Примеры использования команд са и р\/ус1 3.15 Синтаксис: 1з [параметры] [имя каталога...]. Действие: выводит список файлов в каталоге, как показано на рис. 1.20. го52@диуие1ю1че :~/<1еу_и5$ Гз ЬитШ гпЫа\.1 Тод вес го52(адиуиепопе:~/де»_и5$ со .. гоз2@диуие11опе Гз ВезкСор БосипепСь Мизес РиЫгс зпар Уг4еоз <1еу_нз ОонпТоадз РгсТигез гоьЬад2_2024..О7_0',-06_15_57 Тепр1а1ез го&2@диуие!1опе: -$ Рис. 1.20 ❖ Пример использования команды 1з 4. тксНг Синтаксис: тксИг [параметры] <имя каталога>. Действие: создает новый каталог, как показано на рис. 1.21.
ГЧ гоз2@диуиеЬоте: ~ О = □ х гоз2@диуиеНоте:~$ 1з Эезк1ор Ооситеп±з Мизгс РиЫЛс зпар У/хдеоз (1еу_Н5_2 0оып1оас15 Ргс1игез гозЬад2_2024_07_0б-21_21_33 ТепрТа^ез го52@диуиеНопе:~$ лксНг йеу_Ы5 гоз2@диуиеКоле:~$ 1з 0езк1ор деу_н5_2 ОоипТоадз Ргс^игез гозЬад2_2024_07_06-21_21_33 Телр1а1ез с1еу ы5 Оо сипел 1:5 Мизгс РиЫЛс зпар Угдеоз Рис. 1.21 ❖ Пример использования команды тксПг 5. §е(И1 Синтаксис: §ебп <имя файла>. Действие: открывает редактор уес11Г для редактирования файла; если файл отсутствует, создается новый, как показано на рис. 1.22. го52@диуиеЬоте:~$ 1б Реактор 0осилеп15 Михгс РиЫЛс 5пар Угйеоз (1еу_ы5 0онп1оа<15 Ргс1игез го5Ьад2_2024_07_03-00_15_57 ТепрТа^ез го52@диуиеЬопе:~$ деЫЛ 1е51Фг1е Рис. 1.22 ❖ Пример использования команды деаД Если пои вводе команды деДД возникает ошибка «соттапб ’десНГ' поГ 1оипс1», несб- ходимо выполнить команду зыс1о арТ ।пзсаII дебД для установки дебД. 6. ту Синтаксис: ту [параметры] <исходный файл или каталог> <целевой файл или каталог>. Действие: переименовывает файл или каталог либо перемещает файл из одного каталога в другой, как показано на рис. 1.23.
7. ср Синтаксис: ср [параметры] <имя исходного файла или каталога> <имя целе- вого файла или каталогам Действие: копирует файл или каталог в другой файл или каталог, либо копи- рует несколько исходных файлов в целевой каталог, как показано на рис. 1.24. ГП го52@дцуиеЬоте:~/<1еу_ул О = о х гоз2@диуиеЬоте:~$ 1з ОезкГор Ооситеп^з Мизгс Ргс±игез гозЬад2_2024_07_03-00_15_57 ТепрТа^ез (1еу_нз 0омп"1оа<1з ту_1:еасЬ РиЫгс зпар Уг<1ео5 гоз2@диуиеЬоте:~$ ср ту_1еасЬ деу_мз/ гоз2@диуиеЬоте:~$ сд деу_мз/ го52@диуиеЬоте:~/(1еу_м5$ 1з ЬигЫ гпз1а11 Ход ту_1еасК зге гоз2@диуиеКоте:~/де у нз $ Рис. 1.24 ❖ Пример исполпзования команды ср 8. гт Синтаксис: гт [параметры] <имя файла или каталога...>. Действие: удаляет один или несколько файлов или каталогов в заданном каталоге, а также может удалить каталог вместе со всеми файлами и под- каталогами. В случае с символическими ссылками удаляется только ссылка, а исходный файл остается неизменным, как показано на рис. 1.25. Г+1 го52(йдиуиеНоте: * О = □ х гоз2@диуиеЬоте:~$ 1з 0езк1ор 0оситеп1з Мизгс Ргс^игез гозЬад2_2024_07_03-00_15_57 Тетр1а1ез деу_ыз ОонпТоадз ту_1еасЬ РиЫгс зпар 71<1еоз гоз2@диуие1юте:~$ гт ту_1:еасЬ гоз2@диуиеЬоте:~$ 1з Оезк^ор 0оситеп1з Мизгс РиЫгс зпар Угдеоз деу_шз ОонпХоадз РгсЪигез гозЬад2_2024_07_03-00_15_57 Тетр1а1ез гоз2@диуиеЬоте:~$ гт -г^ гозЬад2_2024_07_03-00_15_57/ гоз2@диуиеЬоте:~$ 1з Оезкгор 0оситеп1з Мизгс РиЫгс ТетрХа^ез деу_мз 0оип1оас18 Ргс1игез зпар Угдеоз го з 2@д и уи е Ьоте:~$ | Рис. 1.25 ❖ Пример использования команды гт 9. $ис1о Синтаксис: зибо [параметры] [команда]. Действие: выполняет команду с правами системного администратора, как показано на рис. 1.26.
ГП го52(0)диуиеЬоте: ~ О - □ х ГО52@диуиеКоте:~$ зийо ар! ирда!е [зидо] раззногс! 1ог гоз2: - 1x1:1 Хипа. 1зхпдЬиа.ес1и .сп/гоз2/иЬип!и поЫе ТпКеТеазе 1x1:2 • 1 • » из!с.еди.сп/иЬип!и поЫе 1пРе1еазе - 1x1:3:^™ из!с.ес1и.сп/иЬип1и поЫе-ирда!ез 1пКе1еазе - 1x1:4 из1с.еди.сп/иЬипХи поЫе-Ьаскрог15 1пке1еазе Н х1:5’ г из!с.еди.сп/иЬип1и поЫе-зесигИу ТпРеТеазе - 1x1:6 иЬип!и.соР1/иЬип1и поЫе 1пКе1еазе 1x1:7 я=я яш иЬип!и.сот/иЬип1и поЫе-зесигИу ТпКеХеазе Н11:8 ха &_ м иЬип1и.сот/иЬип1и поЫе-ирс1а1е5 1пКе1еазе • 111:9 • Л иЬип1и.соп/иЬипХи поЫе-ЬаскроПз 1пКе1еазе геасНпд раскаде 1x515... Оопе ЗиПсНпд (1ерепдепсу 1гее. . . Оопе ^еаЛпд зХаХе хпГогтаХхоп... Оопе 382 раскадез сап Ье ирдгайес!. Кип 1 ар! 1x51 --ирдгадаЫе' 1о зее 1Ьет. го52@дцуиеЬоте: РкС. 1.26 ❖ Пример использования команды 5ис1о Эти команды не нужно заучивать наизусть; по мере использования в про- цессе разработки это произойдет автоматически. 1.5.2. Симулятор черепахи После ознакомления с методами работы в командной строке Ыппх перейдем к КОЗ 2 и запустим классический пример в КОЗ - симулятор черепахи. Сначала откройте первый терминал и выполните следующую команду для запуска симулятора черепахи. $ ГО52 гип ЩгНезт."! Гиг11е5гт_пос1е Затем откройте второй терминал и выполните следующую команду для запуска функции управления с клавиатуры. $ гоб2 гип ЩгНезтл ЩгНе_Се1еор_кеу Первая команда запустит симулятор черепахи с синим фоном, а вторая - узел управления с клавиатуры, Нажимая стрелки на клавиатуре в этом терми нале, как показано на рис. 1.27, вы сможете управлять движением черепахи. 1.5.3. Командная строка в К05 2 Механизм работы командной строки КОЗ 2 аналогичен Ыппх, однако все операции интегрированы в одну общую команду КОЗ 2, как показано на рис. 1.28. Первый параметр после гоз2 указывает на цель операции, напри- мер побе обозначает операции с узлами, а 1ор1с - операции с гемами. Далее можно добавить ряд параметров, уточняющих конкретные действия.
Рис. 1.27 ❖ Пример управления движением черепахи го52@диуиеЬоте: ~ гоз2@диуиеЬоте:~$ го$2 --Ье1р изаде: гоз2 [-Ь] [--изе-руХЬоп-деГаиТХ-ЬиГГегхпд] Са1Л 'гоз2 <сотапд> -Ь' Гог тоге <Ле1:аИес1 изаде. ... гоз2 х$ ап ехХепзхЫе соттапд-1хпе Хоо! Гог КОЗ 2. орХхопз: -И, --НеТр зЬои ХЬхз Не1р теззаде апд еххХ --изе-руХЬоп-деГаиХХ-ЬиГГегхпд Во поХ Гогсе Ххпе ЬиГГегхпд хп зХдоиХ апд хпзХеад изе ХЬе руХЬоп деГаиИ ЬиГГегхпд, мЬхсН тхдЬХ Ье аГГесХед Ьу РУТНОШМВОРЕЕКЕВ/-и апд дерепдз оп иЬаХемег зХдоиХ хз хпХегасХхуе ог по! Соттапдз: асХхоп Ьад сотропепХ дзетой досХог хпХегГасе ХаипсЬ 1хГесус1е тиТХхсазХ Уагхоиз асГхоп геТаГед зиЬ-соттапдз Уагхоиз гозЬад геТаХед зиЬ-соттапдя Уагхоиз сотропепГ геТаХед зиЬ-соттапс15 Уагхоиз даетоп ге1а1ед зиЬ-соттапдз СЬеск КОЗ зеХир алд оХЬег роХепХха! хззиез 5Ьои хпГогтаХхоп аЬоиХ КОЗ хпХегГасез Кип а ХаипсЬ Гх1е Уагхоиз 1хГесус1е геТаХед зиЬ-соттапдз Уагхоиз ти1.Ххса5Х геТаХед зиЬ-соттапдз Рис. 1.28 ❖ Командная строка в КОБ 2 1. Запуск программы узла Чтобы запустить узел в КОБ 2, можно воспользоваться командой гоз2 тип. Первый параметр указывает на название пакета, а второй - на название узла внутри пакета. Примеры команд для запуска узла симуляции черепахи и узла управления с клавиатуры (рис. 1.29): $ ГО52 гип РигПезгп СигПезгпдюбе $ ГО52 гип УигсХезтп ^иг-1:1е_се1еор_кеу
го52фдиуиекоте: ~ го52@диуиеНоте: ~$ го$2 гип СигСХезгт СигС1е51.Р1_поде рЗоскеСЫоСгПег: Сап опХу Ье и$ед ыССК СЬгеадз зСагСед мхСЬ (ЭТЬгеад [1ЫЕО] [1720269623.716427411] [СигСТ.езт.го]: 5СагСхпд СигСХезгп ихСЬ поде гНезХп О = - □ х [11ЧЕО] [1720269623.732262308] [СигСХезхт]: Брамптпд СигСХе [СигС1е1] а! 445], у=[5.544445], СЬеСа=[9.000000] га52@диуиеКоте: ~ -о52@диуиеКоте: ~$ го$2 гип СигСХезхт СигС1е_Се1еор_кеу ?еадхпд Ггот кеуЬоагд Кзе аггом кеу$ Со тоуе СЬе СигСХе. Дзе д|ЫV|с|д|е|г1С кеуз Со гоСаСе Со аЬзоХиСе огхепСаСХопз. Т' Со сапе аСхоп. 'д' Со дихС. О Рис. 1.29 ❖ Запуск процесса с помощью команды гох2 гип 2. Просмотр информации об узлах Какие узлы работают в текущей системе КОБ 2? Для просмотра можно ис- пользовать следующую команду (рис. 1.30). $ гоб2 поде Г+1 го52(ФдиуиеЬоте: - О = - □ X го52@диуиеЬоте:~$ го$2 поде □заде: гоз2 поде [-Ь] СаП ' гоз2 поде <соттапд> -Ь' Гог тоге деСаПед изаде. ... УагХоиз поде геХаСед зиЬ-соттапдз орГхопз: -Ь, --ЬеХр зЬон ГЫз ЬеХр теззаде апд ехП Соттапдз: ХпГо ОиСриС ХпГогтаПоп аЬоиС а поде ИзГ ОиСриС а 1Лз1 оГ ауаПаЫе подез СаП 'гоз2 поде <соттапд> -Ь‘ Гог тоге деГаПед изаде. гоз2@диуиеЬоте:~$ гоз2 поде ПзГ /ГеХеор-ГигПе /ГигГХезХт гоз2@диуиеЬоте:~$ Рис. 1.30 ❖ Информация об узлах системы Р.О5 2 На рис. 1.31 показано, как с помощью подкоманды пДо можно получить подробную информацию о конкретном узле. $ го$2 пэс!е тпГо /1игНе5тп
Я го52(®дцуиеЬоте: ~ О. = - □ х го52@диуиеЬоле:~$ гоз2 поде ХпГо /ХигНезхт /ХигХХезхт 5иЬзсг1Ьегз: /рагатеХег_еуепХз: гс1_1пХегГасез/пзд/РагатеХегЕуепХ /1игХ1е1/стд_уеХ: деотеХгу-ГОздз/тзд/Тю.зХ РиЫХзЬегз: /рагапеХег_еуепХз: гсХ-Т-пХегТасез/тзд/РагапеХегЕуепХ /гозоиХ: гс1_т.пХегЕасез/т5д/1_од /ХигХ1е1/со1ог_зепзог: ХигМезХп/нБд/СоХог /1игНе1/р05е: ХигХХезхп/тзд/Розе 5егугсе 5егиегз: /сХеаг: зХд_5ГУ5/згу/ЕтрХу /кт.И: ХигХХезХп/згу/КХХХ /гезеХ: 51д_5ГУз/згу/Етр1у /зрамп: 1игХХезХт/згу/8рамп /ХигХХе1/зеХ_реп: ХигХХезХп/згу/ЗеХРеп /ХигХХе1/ХеХерог1_аЬзоХи1е: ХигХХезХп/згу/ТеХерогХАЬзоХиХе /ХигХХе1/ХеХерог1:_геХа11уе: ХигХХезХп/згу/ТеХерогХРеХаХХуе /ХигХХе51т/дезсгХЬе_рагатеХег5: гсХ_Хп1егГасез/згу/0езсгХЬеРагап1еХег5 /ХигХХез1р)/деХ_рагате1ег_Хурез: гсХ^пХегГасез/згу/СеХРагапеХегТурез /Хиг1Хез1т/де1_рагапеХег5: гсХ_1пХегГасез/5Гу/6еХРагагпеХег8 /ХигХХез1г)/деХ_Хуре_дезсгХрХХоп: Хуре_де5СгХрХ1оп_1пХегЕасе5/5гу/Се1Туре0езс гХрХХоп Рис.1.31 ❖ Просмотр сведений об узле 3. Просмотр сведений о темах Какие темы существуют в текущей системе? Для просмотра можно исполь- зовать следующую команду (рис. 1.32). $ гос2 Торсе 1151 Я го52(Фдиуие11оте:~ О = □ х го52@диуиеНоте: ~$ гоз2 Хорхе Хт.51 /рагатеХег_еуепХз Егозой! /ХигХ1е1/ст(1_уе1 /1игХ1е1/со1ог_зепзог /ХигХ1е1/розе ~оз20дцуиеЬоте:~$ И_________________________________________________________________ Рис. 1.32 ❖ Просмотр сведений с теме Добавив подкоманду еейо, можно показать данные сообщений в конкрет ной теме, как показано на рис. 1.33. $ гоз2 Торге ес^о /ТогТ1е1/розе
Я го52(фдцуиеНоте: - а = □ X го52@диуиеЬоте:~$ гоз2 к: 5.544444561004639 у: 5.544444561004639 1Ье1:а: 0.0 11пеаг_ие1.осИу: 0.0 апди1аг_уе1ос11:у: 0.0 *оргс есЬо /1иг^1е1/рО5е к: 5.544444561004639 у: 5.544444561004639 ЬЬе^а: 0.0 1т.пеаг_ие1ос11у: 0.0 апди1аг_уе1ос11у: 0.0 к: 5.544444561004639 у: 5.544444561004639 0.0 ИпеаГ-УеТостЛу: О.О апди1аг_уе1ос1Лу: 0.0 к: 5.544444561004639 у: 5.544444561004639 СНе^а: 0.0 1Апеаг уе1ос11у: О.О Рис. 1.33 ❖ Использование подкоманды есбо для поосмотра данных сообщений в теме 4. Публикация информации о теме Для управления движением черепахи можно напрямую публиковать коман- ды в теме через командную строку, как показано на рис. 1.34. $ гоз2 Сорте риЬ --гаСе 1 /ЬигсЪИ/сгс^е! деопе1:гу_П5дз/Г'1ьд/Т|л|15С "(Ипеаг: {х: 2.0, у: 0.0, г: 0.0}, апди!аг: {х: 0.0, у: 0.0, г: 1.8}}" Й г о $2(ф9 иу и еКоте: - ' |Л .^го52@диуиеЬоле:~$ гоз2 Юргс риЬ --га11е 1 /1игП.е1/ст4_уе1. деоте 51 "{Нпеаг: {х: 2.6, у: 0.0, г: 0.0}, апдиХаг: {х: 0.0, у: 0.0, -•^риЫгзЬег: Ьедтпптпд 1оор риЫЛзМпд #1: деоте1:гу_т5д5.т5д.Тиг51(Кпеаг=деоте1:гу_т5д5.т5д. -0.0, 2=0.0), апди1аг=деоте1гу_т5д5.т5д.Уес1:огЗ(х=в.О, у=0.0, 2= риЫлБЫлд #2: деоте1гу_т5д5.т5д.Ти151:(1Лпеаг=деоте1:гу_т5д5.т5д. =0.0, 2=0.0), апди1аг=деоте1гу_Р15д5.т5д.Уес^огЗ(х=0.0, у=0.0, 2= риЫгьЬгпд #3: деоте 1гу_т5д5. тзд. Тмт.51 (Ипеаг=деоте1:гу_т5д5 .тзд. =0.0, 2=0.0), апди1аг=деоте1гу_п5д5.т5д.Уес1:огЗ(х=0.0, у=6.0, г= риЫъБЫпд #4: деоте1гу_т5д5. тзд. Тиг51( 1Лпеаг=деоте€гу_т5д5.тзд. =0.0, 2=0.0), апди!аг=деоте1:гу_т5д5.т5д.\/ес1огЗ(х=0.0, у=0.0, 2= риЫЛзНпд #5: деоте1гу_т5д5. тзд. Тмх51( 1гпеаг=деоте^гу_т5д5.т5д. =0.0, 2=0.0), апди1аг=деоте1:гу_т5д5.т5д.Уес^огЗ(х=0.0, у=6.0, 2= риЫхБЫлд #6: деоте1:гу_т5д5. т$д. Тмх5^( 1Лпеаг=деоте1:гу_т5д5.тзд. =0.0, 2=0.0), апди1аг=деоте!:гу_т5д5.т5д.Уес1:огЗ(х=0.0, у=0.0, 2= Рис. 1.34 ❖ Публикация команд гемы через командную сгроку
5. Публикация запроса на выполнение службы Если вам нужно, чтобы в интерфейсе было несколько черепах, симулятор предоставляет инструменты для создания черепахи. Запустите следующую команду для вызова службы: $ гэс2 зегуссе саП /грагчп ЬигСЕезтп/згу/Зрамп "{х: 2, у: 2, сЬеГа: 0.2, пате: В левом нижнем углу появится вторая черепаха (см. рис. 1.35). Т1и11е51т го52(®диуиеНоте: ~ О (.ц-о52@дцуиеЬоте:~$ го$2 зегухсе саП /$ранп ^игНезт-п/згу/Зраип 1а: 0.2, пате: ^ыа<1лпд ^ог зегухсе 1О Ьесоте ауаИаЫе... гедиез^ег: такгпд гедиез!: 1иг11.е51т.5ГУ.5раип_Кедие5^(х=2.0, у= |к1_пате=’') Ицгезропге: ^игИезгп.згу. 5раып_Резропзе(пате=' 1игМеЗ') гоз2@диуиеЬоте:~$ [] Рис. 1.35 ❖ Вызовы службы порождают новых черепах 6. Отправка цели действия Чтобы черепаха выполнила конкретное действие, например повернулась на заданный угол, можно использовать асНоп симулятора и отправить пель действия через командную строку. $ гоз2 асГт-Оп зепс1_доа1 /ТигТ1е1/гот:аТе_аЬьо1и1:е ТигТ1е5.1т/асЫоп/ВоТасеАЬьо1и1:е "сбега: 3" На рис. 1.36 видно, что первая черепаха имеет некоторое отклонение по углу поворота по сравнению с рис. 1.35. 7. Запись и воспроизведение данных В роботизированных системах обрабатывается множество данных. Если не- обходимо записать определенный фрагмент данных для последующего вос- произведения в лаборатории, как это сделать? Для этого в КОЗ 2 используется команда гозЬа§. # Запись данных. $ го$2 Ьад >-есогс1 /ТигТ1е1/спа_7е1 # Воспроизведение данных. $ гоз2 Ьад рсау го5Ьад2_2024_07_06-21_21_23/ го5Ьад2_2024_07_0б-21_21_23_0.тсар
гозгфдиуиеНоте: ~ (-^гоз2@диуиеЬопе:~$ гоз2 зегугсе саП /зраип ^игМезгт/згу/Зранп 1а: 0.2, пате: 1 ^^иаПггпд Гог зегугсе Го Ьесопе ауатЛаЫе... гедиезЕег: такдпд гедиез!: 1иг1:Хе5гт.5ГУ.8раып_Яедие51(х=2.0, у ^|пате='') Ь|ге$роп5е: ГигПезХт. згу. 5раип_Резропзе(пате=1ГигПеЗ1) ! гоз2@диуиеЬогое:~$ ЛС го52@диуиеКоте:~$ гоя2 асГхоп зепд_доа! /ГигГХе1/гоГа1е_аЬ5оХи1 п/КоГаГеАЬзоХиГе "1Не1а: 3" ЫагГХпд Гог ап асЕгоп зегуег Го Ьесоте ауаХХаЬХе... | 5еп<1т.пд доаХ: ГЬеГа: 3.0 СоаХ ассерГед нШ Ю: 4662828аГ02Г4ад9а2с900ЬЬГ52дГа20 Рези!!: скНа: 0.7840002179145813 Соа! ГхпхзЬед жЛЬ зГаГиз: 50ССЕЕОЕР гоз2@диуиеКоте:~$ | Рис. 1.36 ❖ Отправка дели действия После записи нажмите сочетание клавиш С1г1+С в терминале, чтобы со- хранить записанную информацию. Процесс выполнения команды показан на рис. 1.37. ГП го52©диуиеНоте:~/го5Ьад2_2024_07_06-21_21_33 О — □ х гоз2@диуиеНоте:~$ гоз2 Ьад гесогд /1иг1Хе1/стс1_уеХ [ХМЕО] [1720272093.100001148] [гозЬад2_гесог<1ег]: Ргезз БРАСЕ Гог раиз1пд/гезит1 пд [ХМЕО] [1720272093.117264717] [гозЬад2_гесог<1ег]: ИзГелХпд Гог Горгсз... [1^0] [1720272093.117397823] [гозЬад2_гесогдег]: Еуеп! риЬХХзЬег ГЬгеад: БГагЫ пд [ХМРО] [1720272093.117796712] [гозЬад2_гесогдег]: РесогсКпд... [1ИЕ0] [1720272104.289182291] [гозЬад2_гесогс!ег]: РаизХлд гесогсИлд. [ХМЕО] [1720272104.289368296] [гозЬад2_срр]: ЫгХЫлд гетаХпХпд теззадез Ггот сас Не Го 1Ье Ьад. II тау Гаке а мЫ!е [1МЕ0] [1720272104.291123923] д [1МЕ0] [1720272104.291208009] [ХИРО] [1720272104.318043899] го52@диуиеНог1е:~$ Хз ОезкГор ОоситепГз МизХс <1еу_нз ОонпХоайз РХсГигез гоз2@диуиеЬоте:~$ сд гозЬад2_2024_07_06-21_21_33/ го52@диуиеЬоте:~/го5Ьад2_2О24_07_06-21_21_33$ Хз теГадаГа.уатХ гозЬад2_2024_07_06-21_21_33_0.тсар го52@диуиеЬоте:~/гозЬад2_2024_О7_Об-21_21_33$ гоз2 Ьад рХау гозЬад2_2024_07_06 21 21 33 О.тсар [гозЬад2_гесогоег]: ЕуепХ риЬХхзпег Глгеаа: ЕхгГхг [гозЬад2_гесог<1ег]: РесогсКпд зГорред [гсХсрр]: згдпаХ_Ьапс11ег(5гдпит=2) РиЫгс_______________________ зпар Угдеоз ТетрХаГез гозЬад2_2024_07_06-21_21_33 Рис. 1.37 ❖ Запись и воспроизведение данных Здесь имя файла го5Ьад2_2С24_0/_06-21_21_23 автоматически генерируется на сс- нове текущего времени компьютера В процессе использования его необходимо за- менить на фактически сгенерированное имя Ьад-фэйла. Это основные команды, используемые в КОЗ 2. У каждой команды есть множество подкоманд, которые вы можете протестировать самостоятельно.
1.6. Резюме Б этой главе мы познакомились с миром КОЗ, изучили текущее состояние его развития, изучили различия между КОЗ 1 и КОЗ 2, а также освоили установку и базовые методы использования КОЗ 2 в операционной системе ОЪипш. С книгой предоставляются все исходные коды и справочные материалы для практических занятий, что поможет вам создать разнообразные приложения для роботов с использованием КОЗ. Теперь, с хорошим настроением, отправимся в путешествие по разработке с помощью КОЗ 2!
Глава Основные принципы КО$ 2. Фундамент для создания роботов После установки КОЗ 2 вы, возможно, захотите как можно скорее приступить к разработке роботов. Но в процессе использования КОЗ 2 вы столкнетесь с рядом ключевых концепций и соответствующих методов разработки, ко- торые нужно изучить заранее. В этой главе мы подробно рассмотрим эти основные понятия, чтобы укрепить базу знаний и подготовиться к практи- ческой разработке. 2.1. Процесс разработки роботов с использованием КОЗ 2 КОЗ 2 является мощным инструментом для разработки роботов. Как же его эффективно использовать для этой цели? Схематически процесс разработки роботов с использованием КОЗ 2 представлен на рис. 2.1. Создание рабочего простэанства Создание пакета функций Написание исходного кода (Счч-/Ру1Ноп) Настройка правил сборки (СМайвШз.Ы/ зеТор.ру) Компиляция и отладка Запуск функционала Рис. 2.1 ❖ Процесс разработки роботов с использованием КОЗ 2
1. Создание рабочего пространства В любом программном обеспечении первым шагом является создание про- екта, который служит пространством для управления последующим раз- витием. В контексте разработки роботов с использованием КОЗ 2 этот шаг называется созданием рабочего пространства. Это пространство хранит все файлы, связанные с разработкой роботов, и в компьютерной системе пред- ставлено в виде папки, в которой будут храниться все файлы, необходимые для дальнейшей разработки. 2. Создание пакетов Ключевым аспектом процесса разработки роботов является программирова- ние. Поскольку существует множество файлов с кодом и конфигурационны- ми файлами, для удобства управления и обмена наработками разработчики обычно помещают несколько файлов с кодом, относящихся к одной функции, в одну папку. В КОЗ 2 такая папка называется «пакетом». Каждый пакет яв- ляется организационной единицей, реализующей определенную функцию робота, например управление шасси, моделирование робота, автономная навигация и т. д. Несколько пакетов составляют полную функциональность робота, и все они размещаются в рабочем пространстве, созданном на пре- дыдущем этапе. 3. Написание исходного кода После создания рабочего пространства и пакетов следующим шагом является написание кода в пакетах. Наиболее часто используемыми языками про- граммирования в разработке с использованием КОЗ 2 являются С++ и РуГйоп. Соответствующий код необходимо размещать в пакетах. 4. Установка правил компиляции После написания кода необходимо его скомпилировать для создания ис- полняемых файлов. Этот процесс требует четких правил компиляции, чтобы компьютер мог понять, какие файлы надо скомпилировать и где должны быть размещены полученные исполняемые файлы. Для кода на С++ компиляция обязательна, и правила компиляции устанав ливаются в файле СМакеЫЩз.Ш, находящемся в пакете. Хотя код на Ру11топ не требует компиляции, для настройки местоположения исполняемых фай- лов и входной точки выполнения файлов также необходимо использовать в пакете конфигурационный файл зеГпр.ру. 5. Компиляция и отладка КОЗ 2 предоставляет полный набор инструментов для компиляции, которые позволяют проверять зависимости различных пакетов и библиотек, выяв лять ошибки в коде и преобразовывать исходный код в исполняемые файлы. В случае возникновения проблем в процессе компиляции система предосгав-
ляет подробные сообщения об ошибках, что помогает быстро определить источники проблем. На этом этапе, следуя подсказкам, можно вернуться к этапу написания кода для отладки и исправления, после чего продолжить компиляцию. В процессе отладки кода для повышения эффективности обыч- но используют такие инструменты, как СГОВ или ГОЕ, чтобы установить точ- ки останова или выполнить пошаговую отладку. Если все прошло успешно, в рабочем пространстве будут созданы необходимые исполняемые файлы. 6. Запуск функционала После создания исполняемого файла можно запустить программу. Б идеаль- ных условиях робот должен успешно выполнить заданные функции, однако на практике могут возникнуть различные проблемы. В таких случаях необ- ходимо проанализировать результаты выполнения, вернуться к коду для от- ладки и оптимизации, затем снова скомпилировать и запустить программу. Путь от написания исходного кода до выполнения функций часто требует многократных попыток. Этот процесс довольно сложный и требует от раз- работчика постоянного преодоления трудностей. Однако именно эти вызовы и трудности составляют привлекательность разработки роботов! Ознако- мившись с основным процессом разработки роботов на КОЕ 2, далее мы углубимся в изучение ключевых концепций. 2.2. Рабочее пространство: база для разработки роботов В повседневной разработке кода часто используются интегрированные сре- ды разработки (ГОЕ), такие как \/ииа1 ЕШсйо, ЕсПрзе, 01 СгеаТог и др. Перед началом написания программы в этих ГОЕ обычно выбирается команда Соз дать новый проект на панели инструментов, что приводит к созданию пап- ки, в которой будут размещены все файлы, связанные с проектом. Эта папка и ее содержимое называются файлами проекта. Аналогично в КОБ 2, когда разработчик пишет код для реализации опре- деленных функций робота, все файлы кода, параметры, сценарии и другие материалы должны размещаться в определенной папке для управления ими. Эта папка в системе КОБ 2 называется рабочим пространством (ХЛюгкзрасе). 2.2.1. Что такое рабочее пространство Рабочее пространство - это папка, в которой хранятся все файлы, связанные с разработкой проекта, и все материалы, используемые в процессе разра ботки.
Типичная структура рабочего пространства КОЗ 2 показана на рис. 2.2, где ШогкЗрасе является корневым каталогом рабочего пространства и содержит четыре подкаталога (подпространства): 1) ЬиПс1: пространство компиляции, используется для хранения проме- жуточных файлов, создаваемых в процессе компиляции; 2) 1п$1а11: пространство установки, используется для размещения испол- няемых файлов, сценариев, конфигураций и других файлов, связанных с выполнением; 3) 1о§: пространство журналов, используется для хранения различных предупреждений, ошибок и информации, возникающих в процессе компиляции и выполнения; 4) зге: пространство кода, используется для размещения написанного кода, сценариев, конфигураций и других файлов, связанных с разра- боткой. Большинство операций по разработке роботов на КОЗ 2 выполняются в зге, после ** успешной компиляции исполняемые файлы запускаются из 1п.з1:а11,а папки Ьц11с1 и Тод использукгся относительно редко. Иогк5расе---Пользовагельская рабочая среда |--ЬиГ1<1: Каталог для хранения скомпилированных файлов. В этом каталоге создается отдельный подкаталог для каждого пакета функций. |--тпгРаП.: Каталог установки, используется для хранения исполняемых файлов, сгенерированных после компиляции пакетов функций. |--1од: Каталог для хранения файлов журнала. |-'5гс: Каталог для хранения исходного кода пакетов функций. |--С++ (Пакет функций) |--раскаде.хгчТ: Информация о пакете, например имя пакета, версия, автор, зависимости. |--СМакеизТз.РхТ: Настройка правил компиляции, например исходные файлы, зависимости, целевые файлы. |--згс: Каталог для исходных файлов на С++. |--тпс1ис1е: Каталог для заголовочных файлов. |--пзд: Каталог для файлов интерфейсов сообщений. |-'5гм: Каталог для файлов интерфейсов служб. |- асТтоп: Каталог для файлов интерфейсов действий. | ТаипсЬ: Каталог для файлов запуска узлов. |--РуТ1топ (Пакет функций) |--раскаде.хпТ: Информация о пакете, например имя пакета, версия, автор, зависимости. |--зеТир.ру: Аналог СМакеГШз.Хх! для С++ функциональных пакетов. |--зеЫр.сГд: Базовый конфигурационный файл пакета. |--гезоигсе: Каталог для ресурсов. |--1ез1:: Каталог для хранения файлов, связанных с тестированием. |--Каталог с именем пакета: Каталог для исходных файлов на РуСЬоп. | --ТаипсЬ: Каталог для файлов запуска узлов. Рис. 2.2 ❖ Типичная структура рабочего пространства КОЗ 2 Здесь необходимо отметить, что название рабочего пространства может быть определено разработчиком, и количество таких пространств нс огра- ничено. Например:
а) рабочее пространство 1: название - йеутуза, используется для раз- работки функций робота А; б) рабочее пространство 2: название - беушзЬ, используется для раз- работки функций робота В Такая ситуация полностью нормальна и аналогична созданию нескольких новых проектов в ШЕ, которые существуют параллельно. В зависимости от целей разработки можно переключаться между различными проектами. 2,2.2. Создание рабочего пространства После ознакомления с понятием рабочего пространства необходимо создать его для изучения исходного кода, представленного в этой книге. Существует множество способов создания рабочего пространства, суть которых заключается в создании папки. В этом разделе представлены два распространенных .метода. 1. С помощью контекстного меню Откройте файловый менеджер, дважды щелкнув по значку главной папки системы, затем щелкните правой кнопкой мыши и выберите Создать пап- ку. Назовите ее йеу шз. Таким образом, первое рабочее пространство будет создано. После создания папки дважды щелкните ее, чтобы войти в нее. Этот путь будет являться корневым каталогом рабочего пространства. Далее выполните аналогичное действие, создав новую папку с именем зге, которая будет использоваться в качестве пространства для кода, как по казано на рис. 2.3. Н1е$ Кесеп1 ЗСаггеб 1-|г>гг>о Ноте / с!еу_«$ Рис. 2.3 ❖ Структура рабочего пространства 2. С помощью командной строки Запустите новое окно терминала с помощью комбинации клавиш С1г1+Лк+Т и выполните там следующую команду, чтобы создать папку с именем йеу шз, которая будет использоваться в качестве рабочего пространства для после- дующих операций, описанных в книге. Также создайте в корневом каталоге
рабочего пространства папку с именем «гс, которая будет использоваться в качестве пространства для кода. $ пксНг -р - /с1е7_ИЗ/зГС Рабоиее пространство можно оазместить в любом кзтатсге в зависимости от потреб- ностей разработки. В большинстве материалов рабочее пространство размещается в одной главной папке, и в данной книге используется такой же подход. После создания рабочего пространства необходимо войти в созданное пространство для кода, то есть в папку зге. Для навигации можно использо- вать командную строку или просто дважды щелкнуть по папке в файловом менеджере. Затем выполните следующую команду для загрузки исходного кода, сопровождающего книгу, чтобы продолжить обучение и разработку. $ ей ~/с)е7_Из/зГС $ дИ с!опе [Исходный код этом книги] Замените [Исходный код этой книги] на ссылку из предисловия. 2.2.3. Компиляция рабочего пространства В терминале сначала необходимо перейти в корневой каталог рабочего про- странства. Перед началом компиляции, чтобы убедиться, чго все пакеты успешно скомпилируются и будут работать, можно воспользоваться коман- дой гозбер системы КОЗ 2 для автоматической установки необходимых биб- лиотек зависимостей для различных пакетов в пространстве исходного кода зге. Выполните следующие команды: $ сс1 ~/с1е1/_й5 $ гэзс1ер тпБГаП --бгот-раТЛз зге --гдгоге-зге -г -у После установки необходимо выполнить установку компилятора КОВ 2 со!соп и использовать следующую команду для компиляции рабочего про- странства. $ зибо арб бпзбаП рубЬопЗ-соТс.оп-гоз $ сВ -/с1еУ_И5/ $ соТсоп ЬиПс! При отсутствии зависимостей или наличии ошибок в коде в процессе ком- пиляции появятся сообщения об ошибках, в противном случае компиляция завершится без ошибок, как показано на рис. 2.4. После успешной компиляции в рабочем пространстве будут автоматиче- ски созданы подпространства ЬшШ, 1о§ и т.Ща11, как показано на рис. 2.5. Запускаемые узлы КОВ 2 будут находиться в папке тзГаП.
ГЛ го52@диуиеЬоте: ~/4еу_м« а = - □ X го52@диуиеЬоте:~/деу_из$ соХсол ЬиХХд ЧагХХлд »> Хеагл1пд_ХпХегГасе $ХагХглд »> ХеаглХпд_с7 ЧпХзЬед «< Хеагп1пд_ХпХегГасе [1.755] 5ХагХ1пд »> Хеагпт.пд дагеЬо :гпт.$Ьед «< 1еагп1пд_су [2.605] БХагХХпд »> ХеагпХпд_дагеЬо_^ог1:ге55 ЧгпзЬес] «< Хеагп1пд_дагеЬо [1.435] "ЧагХХлд »> ХеагпХпд_ХаилсЬ -ХпХзЬес! «< Хеагпт.пд_да2еЬо_1:ог^ге55 [1.465] БХагХгпд »> Хеагп1пд_лос1е ЧпхзЬед «< ХеагпХпд_ХаипсЬ [1.695] БХагХХпд >» ХеагпХлд_лоде_срр Г1п15Ье<1 «< 1_еагп1пд_пос1е [1.825] ^ХагХХпд »> Хеагл1пд_рагапеХег Чпх5Ье<1 <« ХеагпХпд_рагапеХег [1.745] 5ХагХ1пд »> ХеаглХпд_рагапеХег_срр РхпхзЬед «< Хеагптпд_пос1е_срр [9.215] ^ХагХХпд »> 1еагпт.пд_ркд_с ЧпхзЬед <« Хеагпгпд ркд с [0.57б] БГагНпд »> 1еаглгпд_ркд_руГЬоп ’т.пг5Ье(] <« 1еагп1пд_рагате1ег_срр [8.275] 51агХгпд »> Хеагпт.пд_до5 -глт-зЬед «< ХеагпХпд ркд_ру1Ьоп [1.485] Рис. 2.4 ❖ Процесс компиляции пакета функций 2.2.4. Настройка переменных окружения После успешной компиляции необходимо настроить переменные окружения рабочего пространства, чтобы система могла корректно находить пакеты и исполняемые файлы. Существует два способа настройки. 1. Настройка переменных окружения в текущем терминале - будет дей- ствовать только в текущем сеансе терминала. Для этого выполните следующую команду. $ зсигсе ~/с1е^_^5/гп51:а11/5е!:ир.эа511 2. Настройка переменных окружения в системном файле .ЬазНгс, что по- зволит использовать их во всех сеансах терминала. Для этого выпол- ните следующую команду. $ есНо 'Чоьгсе ~/^еу_и5/1п51:а11/5еГир.ЬаьЬ" » -/.ЬазЬгс
ЬазНгс - это сценарий оболочки, который выполняется каждый раз при запуске тер минала. Этот файл содержит ряд конфигураций и команд инициализации, предна- значенных для настройки пользовательских переменных окружения, псевдонимов, функций и других элементов, чтобы сделать сеанс работы в терминале более персо- нализированным и эффективным. 2.3. Пакеты: классификация функций робота В сопроводительном исходном коде этой книги содержится множество папок с различными названиями, как показано на рис. 2.6. В КОЗ 2 они не являются просто папками, а представляют собой пакеты. С1ОС5 1еагпгпд_ асНоп 1еагп1пд_ асНоп_срр 1еагтпд_см 1еагтпд_ дагеЬо 1еагп1пд_ дагеЬо_ ГогСгезз ГеагпГпд_ ГпсегГасе 1еаггйпд_ 1аипсН 1еагп1пд поде 1еагп1пд_ поде_срр 1еагп1пд_ рагатеЬег 1еагптд_ рагатеСег_ срр (еагтпд. ркд_с 1еагпГпд_ ркд_руспоп 1еагп1пд. 1еагп1пд. зеплсе 1еагп1пд_ зеплсе_срр 1еагп1пд_^ (еагп1пд О.срр' 1еагп1пд 1оргс 1еагпГпд_ Соргссрр Рис. 2.6 ❖ Некоторые пакеты в сопроводительном исходном коде 2.3.1. Что такое пакет Каждый робот может обладать множеством функций, таких как управление движением, визуальное восприятие, автономная навигация и др. Исходный код этих функций можно разместить вместе, однако при попытке поделить- ся только некоторыми из них с другими людьми возникает проблема: код плотно связан и трудноразделим. Например, представьте, что у вас есть красная, зеленая и желтая фасоль. Если смешать их в одном мешке, то извлечение только желтой фасоли станет весьма затруднительным занятием, так как придется выбирать каждую фасо- лину из «пестрой» смеси, и чем больше фасоли, тем сложнее задача. Если же фасоль разных цветов разложить по трем мешкам, то нужную фасоль можно будет извлечь сразу же. Принцип работы пакетов аналогичен фасоли. В КОЗ 2 разработчики могут разделять код различных функций на разные пакеты, .минимизируя их взаим
ную зависимость. Таким образом, при необходимости поделиться некоторыми функциями с другими участниками сообщества КО8 достаточно объяснить, как использовать данный пакет, и они смогут сразу приступить к работе. Таким образом, механизм пакетов является одним из важных способов по- вышения уровня повторного использования программного обеспечения в КО8. 2.3.2, Создание пакета На рис. 2.6 изображено множество пакетов. Метод их создания следующий. $ гоз2 ркд сгеаСе --ЬиПД-Суре <Ьит.1с1-Суре> <раскаде_папе> Элементы приведенной выше команды КО8 2: а) рк§: подкоманда для вызова функций, связанных с пакетами; б) сгеа1е: подкоманда для создания пакета; в) Ьи11с1-1уре: указывает, является ли создаваемый пакет С++ или РуНтоп. Если используется С++ или С, здесь указывается атепг сшаке; если ис пользуется РуТЬоп, то атепС руСЬоп; г) раска§е_пате: имя создаваемого пакета. Например, следующие команды командной строки позволяют создать па- кеты на С++ и РуГйоп. Результат выполнения команд показан на рис. 2.7 и 2.8. $ сд ~/(1е7_И5/5ГС $ гоз2 ркд сгеасе --ЬиПД-Гуре анеп1:_спаке 1еагптпд_ркд_срр # Создание пакета С++. $ гоз2 ркд сгеате --ЬиПД-Суре апепГ_руСЬоп 1еагптпд_ркд_руФоп # Создание пакета РуСЬоп. Г»1 гохг^дцуиеНоте -/йеу_*л/5гс О = О х го52@диуиеЬояе:~/(1еу_и5/5гс$ гоз2 ркд сгеаГе --Ьих1(1-Гуре ателГ_стаке Теагпхпд_р кд.срр доход Го сгеаГе а пен раскаде раскаде пате: 1еагпГпд_ркд_срр йезГхпаГхоп сНгесГогу: /Ьоте/гоз2/с1еу_н5/5гс раскаде Госта!:: 3 уегзхоп: в.6.в йезсгхрГхоп: ТООО: Раскаде дезсгхрГхоп паГпГаГпег: [‘гоз2 <гоз2@Годо.Годо>'] Гхсепзез: [’ТООО: Ьхсепзе десТагаГхоп' ] ЬиПд Гуре: атепг_стаке йерепйепсхез: [] сгеаГхпд ГоГдег . /1еагпхпд_ркд_срр сгеаГГпд ./1еагп1пд_ркд_срр/раскаде.хтТ сгеаГхпд зоигсе ап<1 хпсГиде ГоЫег сгеаГГпд ГоГдег ./1еагпхпд_ркд_срр/згс сгеаГхпд Го1с1ег ./1евгпхпд_ркд_срр/хпс1иде/1еагпхлд_ркд_срр сгеаГГпд ./1еагпГпд_ркд_срр/СМакеИ.5Гз. ГхГ [ЫАНИ1МС]: ипкпонл Тхсепзе 'ТООО: Ьхсепзе десТагаГхоп’. ТМз Ьаз Ьеел зеГ хп ГЬ р раскаде.хтГ, ЬиГ по ИСЕИ8Е Гх1е Ная Ьееп сгеаГес!. И хз гесоттепс1ед Го изе опе оГ ГЬе атепГ Гхсепзе хдепГхГхегз: АрасЬе-2.0 381-1.6 Рис. 2.7 ❖ Создание пакета функций С++ в терминале
Щ го52фдцуиеЪоте -/<1еу_мд/$ге О = □ х го$2@диуиеЬояе:-/<1еу_*«/5гс$ гоб2 ркд сгеа^е •-ЬиИд-Гуре атеп<:_ру^Ьоп Теагпгпд ркд_руМюп дотпд 1о сгеа^е а пен раскаде раскаде папе: 1еагп1пд_ркд_ру1Ьоп дезНпаНоп «Нгес^огу: /Ьоте/гоз2/де7_н5/5гс раскаде ^огта!: 3 7ег51оп: 0.0.0 девсггрНоп: Т000: Раскаде деБсгхрНоп пагШахпег: ['го$2 <го52еюдоЛодо>' ] Нсеп$е$: ['ТОСЮ: Исепзе десТагаНоп' ] ЫпЫ 1уре: атеп1_ру{Ьоп дерепдепсгез: [] сгеаМпд ТоТдег ./1еагп1пд_ркд_ру*Ьоп сгеаНпд ./'1еагп1пд_ркд_ру1:Ноп/раскаде.хп1 сгеаМпд зоигсе ГоХдег сгеаИпд ГоХдег ./1еагп1.пд_ркд_ру1Ьоп/1еагп1пд_ркд_руеЬоп сгеаНпд ./1еагп1пд_ркд_руТНоп/зе1:ир.ру сгеаНпд ./1еагп1пд_ркд_руТЬоп/5еГир.сГд сгеаНпд Го14ег ./1еагп<пд_ркд_ру1Ьоп/ге5оигсе сгеаГгпд ./1еагп1пд_ркд_руГЬоп/ге5оигсе/1еагп1пд_ркд_руГЬоп сгеаНпд ./1еагл1пд_ркд_ру1:Ьоп/1еагп1пд_ркд_руТЬоп/____1пг1___.ру сгеаНпд ГоТдег ./1еагпгпд_ркд_ру1Ьоп/ке51: сгеаНпд ./1еагп1пд_ркд_руГЬоп/1е5Г/1е51:_соруг1дЫ.ру сгеаНпд ./1еагл1пд ркд руГЬоп/{е51:/1:е5С 1:1аке8.ру Рис. 2.8 ❖ Создание пакета функций РуТИоп в терминале В системах РОВ 1 функциональный пакет представляет собой универсальную струк- туру, в которую можно поместить код на С++. РуСНоп, определения интерфейсов и дру- гие конфигурации. В РОВ 2 система более четко разделяет типы Функциональных пакетов, что позволяет выполнять компиляцию и компоновку сложных систем. 2.3.3. Структура функционального пакета Функциональный пакет - это не просто папка. Но что же это тогда? Ответ можно получить, проанализировав два функциональных пакета, созданных в разделе 2.3.2. 1. Пакет функций С++ Сначала рассмотрим пакет функций типа С++. В таких пакетах обязательно присутствуют два файла: раска§е.хт1 и СМакеЫв^б.НЛ, как показано на рис. 2.9. { й Ноте / с1е7_и5 / 5гс / го:2_21_Ы1опа15 / 1еагтп9_ркд_с СМакесЯз.Г хС раска де ,хт1 Рис. 2.9 ❖ Структура пакета функций С++ Файл раска^е.хт! содержит описание авторских прав на функциональный пакет с подробными сведениями о правообладателе, сроке действия автор
ских прав и самих заявлениях о правах. Кроме того, файл содержит список библиотек, инструментов и ресурсов, от которых зависит функциональный пакет, включая требования к их версиям и источникам, что необходимо для правильной сборки и работы пакета. Рассмотрим пример раскате.хгп! из 1 е агп1п§_рк§_срр. <!-- Директива ХМ1_, указывающая версию ХМ1_ 1.0. --> <?хп! уег51оп= ' 1.0"?> <!-- Декларация модели ХМ1_, указывающая 1141-адрес файла Х5С-схемы для проверки ХМЕ-документа. --> <?хп1-госе1 [Ссылка на Х50 для валидации, автоматически генерируется при создании файла раскаде. хп! функционального пакета[р <!-- Версия фермата пакета Р.05 - 3, определена в соответствии с КЕР 149 --> «раскаде боплаб="3"> <!-- Имя пакета должно быть уникальным, начинаться со строчной буквы, содержать строчные буквы, цифры и символы подчеркивания и не должно содержать два последовательных символа подчеркивания. --> <папе>1.еагп1гд_ркд_с</пате> <!-- Номер версии в формате Х.У.7, где X, У и I - неотрицательные целые числа, начольные нули не допускаются. - > <уег51оп>0.0.И«/уег51оп> <!-- Описание пакета, содержимое не ограничено. --> «бевсгтрНопаТООО: Раскаде с1е5сггр11оп«/с1е5сггрНоп> <!-- Информация о сопровождающем, включая имя и адрес электронной почты. --> «ПоЕпбат.пег епат1.-''1лсх@1ос1оЛо(1о">1тсх</г1атп1:гт.пбг> <!-- Лицензионное заявление (может быть несколько) используется для описания условий лицензии пакета. --> <1Лсеп5е>ТЭ0С: Ысегзе Дес1агаЫоп</Исеп5е> <!-- Зависимости. --> <!-- Зависимости инструментов сборки, необходимых для сборки этого пакета. --> «ЬиПб1:оо1_берепааа1леп1:_сюаке</Ьи11бгоо1_берег.ба <!-- Зависимости для тестирования. --> <!-- Первая зависимость для тестирования, инструмент для автоматизированном проверки кода. --> <Ее!:Е_СерепбаапепЕ_1'1-п1:_аиЕо«/1е5Е_берепба <!-- Вторая зависимость для тестирования, общий инструмент проверки кода. --> <1:еЕ1:_сере)1с1>ап1еп1:_1Лг1б_сотпоп</ге51:_с1ереп(Ь <!-- Экспорт информации. --> «ехрогба <!-- Тип сборки, который сообщает системе, как собирать этот пакет. --> <Ьи11б_ЕуреаапепЕ_смаке</Ьииб_Еуреа «/ехрогба «/раскадеа Файл СМакеЫзТз.ТхТ является основным для определения правил компиля- ции. Поскольку код на С++ необходимо сначала скомпилировать, в этом фай-
ле требуется детально настроить процесс и правила компиляции, включая указание компилятора, параметров компиляции, библиотекдля компоновки и т. д. для правильной компиляции кода в исполняемый файл. Этот файл написан с использованием синтаксиса СМаке, и его структура и содержание имеют решающее значение для процесса сборки функцио- нального пакета, В РО5 2 общий стиль этого файла практически не меняется. В качестве примера можно рассмотреть СМакеЫзЩ.Ш из 1еагшпу_рк§_срр, # Установка минимально необходимой версии СМаке. сГ'1аке_п1п1|Пип_геритгеб(УЕКЫОМ 3.8) # Определение имени проекта и версии (версия управляется через раскаде.хгл1, поэтому здесь ее # указывать не нужно). ргодесб(1еа"л1пд_ркд_с) # Добавление дотолнительных параметров компиляции при использовании компилятора ССС или С1апд. тФ(СМАКЕ_СОМР11.ЕК_15_йМ11СХХ ОР СМАКЕ_СХХ_СОМРИЕК_Ю МАТСНЕ5 "Оапд") а<1б_сотр11.е_орНопь(-Ыа11 -йехбга -ЫребапНс) епД-Щ) # Поиск пакета алепЩспаке - основного пакета системы сборки РОЗ 2. ГгпД_ргскаде(а1чепб_сг,1аке РЕЦ1ЛРЕО) # При необходимости добавления других зависимостей вручную нужно раскомментировать и указать их. # гггб_раскаде(<берепбепсу> КЕ()1ЛкЕ0) # Проверка, включена ли сборка с тестированием (через параметры СМаке или переменные окружения). гКВОКО.ТЕЗТЩС) # Поиск пакета аг.епЩСтпЩаиЕо, используемого для автоматической пронерки кода. бг||б_раскаде(а11епг_1тп1:_аибо КЕцШКЕО) # Пропуск проверки авторских прав (временно используется до добавления лицензий в исходный код). 5еб(апепб_спаке_соруг1дбб_Е011М0 ТР11Е) # Пропуск лрозерки сррКпб (можно раскомментировать, если все исходники содержат ливензию # и находятся в СтТ-репозитории). 5эС(апеп1:_сР1а,ке_срр11Рб_ЕО11МП ТЕШЕ) в Автоматический поиск зависимостей, необходимых для тестов. а те п СТТ п Т_а и Ро_Нпс1_1:е5 С_с!ереп бепсгез () епбтЕО # Вызов макроса агепг_раскаде(), который задает цели установки пакета и свойства сборки эшепб. алепб_раскаде() 2. Пакет функций РуНюп Пакет функций С++ требует компиляции исходного кода в исполняемые фай- лы, что является важным этапом в процессе его сборки. Однако язык Рукйоп, будучи интерпретируемым, исполняется иначе, чем С++, и не требует пред- варительной компиляции в исполняемый файл. Поэтому при создании функ- циональных пакетов на РуШоп существуют некоторые отличия от пакетов на С++, хотя они все же содержат ключевые файлы, такие как рэска§е.хт1
и зеЕпр.ру, На рис. 2.10 показано, что эти два ключевых файла составляют основную структуру функционального пакета, обеспечивая его правильную сборку и установку. Файл раска§е.хт1 в функциональном пакете на языке РуЕйоп выполняет схожую роль с аналогичным файлом в пакете на С++. Он содержит важную информацию, такую как описание авторских прав и декларации зависимо- стей, что имеет важное значение для правильной сборки и распространения пакета. Ниже приведен пример раскате.хт1 из пакета 1еэгтп§_рк§_ру111оп. < !-- Дирек’ива ХМС, указывающая версию ХМ1_ 1.0. --> < ?хм1 уег5т.оп='1.0 ?> <!-- Объявление Х,'<-модели, указывающее 11Р1 Х50-схемы для проверки X,‘‘11-документа. --> «ЗхпТ-л’обе! [ХбО-ссылка для проверки, автоматически генерируется при создании файла раскаде.хп1]> < !-- Форма- РО$-пакета версии 3. --> «раскаде Гогпаг="3"> <!-- Название пакета. <па'че>1еагп1| |д_рку_руФоп</ пате> < !-- Версия пакета, следует обновить перед выпуском. --> < ме-5топ>0.0.0«/уег5топ> < !-- Описание пакета. Должно подробно объяснять его назначение и функциональность. --> «йезсп.рМопаТСЮО: Раскаде бе5СГ1рНоп</бе5сгтр1:гоп> < !-- Информация о сопровождающем, включая имя и адрес электронной почты. --> «пагпЕатпег еяаИ="1тсх§1:ос1о. 1ос1э">Ьсх«/р1а1 п1агпег> < !-- Заявление о лицензии. Следует указать тип лицензии, например В50, МП, АрасЬе 2.0 и т. д. «НсепзеаСООО: Нсепзе бес1агаггоп</Нсеп5е> < !-- Зависимости для тестирования. --> < !-- Инструмент для проверки авторских прав, следит за наличием валидных заявлений в исходниках. --> <тегС_с1ере'1сЬагеп1:_соругта1и</Се5С_с1ере11с1> < !-- Инструмент для проверки качества РуФоп-кода, выявляет нарушения стиля РЕР 8. --> <ге5Г_<1ерепс1>агрепЕ_Наке8</1:е5Г:_с1ерепс1> < !-- Инструмен- для проверки строк документации, помогает совладеть стандарт РЕР 257. --> <Ее51:_с1ерепс1>а1лепС_рер257</Сеь'(:_с1ереп(1>
< !- Тестовый фоеймворк на РубНоп для написания и запуска тестев. --> <берб_еерепс1>рубЬог.З -рубер б</бер Ы е реп с1 > < !- Блок с экспортируемой информацией. --> <ехро1б> <!-- Тип сборки, указывает, что это Рубтоп-пакет, использующий систему сборки апепб. --> <Ьи<1с1_1:уре>апепТ_русЬоп</Ьс11Т_Туре> </ехрогб> </раскаде> Файл зеШр.ру содержится только в пакетах Рубпоп и используется для опи- сания процесса установки и распространения данного пакета. Этот файл содержит метаданные пакета, информацию о зависимостях, сценарии уста- новки и другие данные и является неотъемлемой частью процесса сборки и установки пакета. Рассмотрим пример файла зебир.ру в пакете 1еагшпу_ рк§_ру1йоп. # Импортируем функции НпсЦраскадез и ребир из себирбообр. бгол ребирбсобр тпрогб НпсЦрас кодер, ребир # Определяем имя пакета. раскаде_пате = '1еагпбпд_ркд_руб1топ' # Используем функцию ребир для описания инфоомации об установке пакета. еебир( # Имя пакета. папе=раскаде_папе, # Версия пакета. Рекомендуется указать актуальную версию. уегрюп='0.9.Г, # Автоматически находим подмодули пакета, исключая директорию ’берб’. раскадер Гтпс1_раскадеб(ехс1ис1е=['берб' 1), # Определяем данные, которые будут установлены вместе с пакетом. баба_Шер [ # Указываем целевые директории установки и соответствующие файлы. ('р|^аге/ар1е.^б_1пс1еx/^ероигсе_гпаеx/раскадер,, [ ’героигсе/' + раскаде_па!ле]), ('рЬаге/' + раскаде_папе, ['раскаде.хт!']), # Указываем зависимссти, необходимые для установки этого пакета. бпрба11_1 ецибгес-[ регирбоо!р' ], # Определяем, можно ли безопасно устанавливать пакет как гбр-архив. гбр_рабе=Тгие, # Имя сопровождающего проекта. пабпбабпег='гор21, # Адрес электронной почты сопровождающего. Рекомендуется заменить на актуальный. пабпбабпег_епаб1='гор2@ехапр1е.сот', # Описание пакета. Следует указать назначение и функциональность. берсгбр(боп=' Это пример пакета для изучения разработки паке-ов РубЬоп1, # Лицензия. Рекомендуется указать фактическую используемую лицензию. Исепре= МП', # Если присутствую1- тесты и вы хотите запускам их с помощью руберб. бербр_тецитге=[1руберб' ], # Определяем точки входа для командной строки.
епггу_рслгД5={ 'сопьо1е_5СггрТ:$': [ А' Если у вас есть СП-утилиты, добавьте их сюда. # Например: 'пу_соппа.тб = Теа, п^пд_ркд_ру^:I|оп.пу_поби^е:IIIагп_^:ипс,, ], }, ) 2.З А Компиляция пакета После создания пакета можно продолжить написание кода для реализации необходимых функций. Однако одного лишь написания кода недостаточ- но - необходимо также скомпилировать пакет и настроить соответствующие переменные окружения, чтобы обеспечить корректную работу кода. Существует множество методов компиляции пакетов, но в основе всех них лежит использование компилятора со1соп. Сокол - это инструмент компи- ляции, специально разработанный для КОЗ 2, который эффективно обраба- тывает исходный код в пакетах и компилирует его в исполняемые файлы или библиотеки, предоставляя необходимую поддержку для последующего запуска и тестирования. I. Компиляция всех пакетов Подобно функции ВшШ ЛИ (Скомпилировать все) в популярных интегриро ванных средах разработки (ЮБ), компилятор со1соп в КОЗ 2 предоставляет разработчикам удобный способ компиляции всего исходного кода в рабочем пространстве без необходимости вникать в детали. Эта функция значительно упрощает процесс компиляции, позволяя разработчикам сосредоточиться на написании кода и реализации функций, не тратя слишком много времени и усилий на этап компиляции. $ ей ~/с1ек'_1л15 $ ссДсоп ЬиПб в Компиляция всех пакетов в рабочем пространстве. МЬ При компиляции всех пакетов заново проверяются все зависимости пакетов, после чего они компилируются и компонуются поочередно Если количество пакетов или объем кода велик, процесс компиляции может занять значительное время. 2. Компиляция определенного пакета В разработке крупных проектов компиляция всех пакетов может быть тру- доемкой и затратной по времени. Поэтому бывает удобно компилировать только один или несколько определенных пакетов. Перед использованием необходимо установить расширенные функции со1соп. $ зибо арт тлзЕаП ругЬопЗ-соТсоп-соптооп-ехгепзгопз
После установки можно использовать параметры --раска§е8-8е1ес! или - -раска§е8-нр-1о для компиляции конкретных пакетов. $ сс! ~/с1е1/_й5 $ $ сэТсоп ЬиИД --раскадеь-ьеТесГ <раскаде_папе> сэТсоп Ьи'.Тс! - раскадез-ир-Го <раскаде_пане> # Компиляция только указанного пакета. # Компиляция указанного пакета и его # зависимостей. Компиляция конкретного пакета не учитывает изменения в коде других паке~ов, что подходит для быстрого тестирования после внесения изменений в отдельные пакеты. 3. Очистка истории компиляции В процессе компиляции в корневом каталоге рабочей области в папке с^еVе1 создается множество промежуточных файлов, которые используются в по- следующих компиляциях. Пакеты или исходный код, которые не были из- менены, используют результаты предыдущей компиляции. Если необходимо очистить всю информацию о компиляции и полностью перекомпилировать рабочую область, используйте следующую команду. $ сд ~/с1е7_И5 $ гп -гГ тлзсаП/ ЬиПб/ 1од/ # Очистка истории компиляции в рабочей области. 2.4 .Узлы: рабочие клетки робота Робот представляет собой интегрированную систему, включающую мно жесгво функций, каждая из которых подобна рабочей клетке робота. Эти «клетки» связываются между собой с помощью определенных механизмов, образуя полноценного робота. В КОЗ 2 эти «клетки» образно называются узлами (]\’ос1е). Узлы являются одним из ключевых понятий в системе КОЗ 2, представляя собой независимые единицы, которые выполняют определен- ные задачи или функции в роботе. Они взаимодействуют друг с другом по- средством передачи сообщений и вызова служб, совместно реализуя сложное поведение и интеллектуальные решения робота. 2.4.1. Что такое узел Полноценная роботизированная система может не быть физически единым целым, как показано на рис. 2.11, а может состоять из собственно робота и других дополнительных устройств. Внутри корпуса робота установлен компьютер А, который выполняет роль «мозга» робота. С помощью «глаз» робота - камеры - компьютер А может
в реальном времени получать информацию об окружающей среде. Он также управляет «ногами» робота - колесами, направляя его в нужное место. Кроме того, может существовать компьютер В, который, выполняя роль «удаленного командира», размещен на столе и способен удаленно контролировать все, что видит робот. Он может удаленно настраивать скорость робота и другие параметры, а также иметь джойстик для ручного управления движением робота в любом направлении. Рис. 2.11 ❖ Схема роботизированной системы Эти функции распределены между различными компьютерами и являются важными «рабочими клетками» робота, то есть узлами. Эти узлы обладают уникальными функциями и одновременно взаимодействуют друг с другом, образуя полную и эффективную роботизированную систему. В системе КОЗ 2 узлы обладают следующими характеристиками: О каждый узел является процессом: узел в роботизированной системе выполняет конкретные задачи и с точки зрения операционной систе мы компьютера называется процессом; □ каждый узел представляет собой независимый исполняемый файл: например, выполнение программы на РуШоп или запуск ском- пилированного файла на С++ считается запуском узла; □ каждый узел может использовать различные языки программи- рования: поскольку каждый узел является независимым исполняе- мым файлом, можно использовать различные языки программирова ния для их разработки: С++, РуШоп, 1ауа, КизГ и др.; О каждый узел может работать распределенно на разных хостах: эти узлы выполняют различные функции и в зависимости от структу ры системы могут работать на компьютере А, компьютере В или даже в облаке. Это называется распределенной системой, го есть узлы могут быть развернуты на разных аппаратных платформах;
О каждый узел должен иметь уникальное имя: в системе КОЗ 2 все узлы управляются по именам. Когда необходимо найти определенный узел или узнать его состояние, это можно сделать по его имени. ч Узлы можно сравнить с рабочими, каждый из которых выполняет свою задачу: одни " работают на прсиззодственной линии, другие обеспечиваю! поддержку в тылу. Они могут не знать друг друга, но вместе способствуют выполнению более сложных задач роботом, которого можно представить как «фабрику». 2.4.2. Методика программирования узлов (Ру1Ноп) Следуя вышеописанному процессу, начнем с каноничного примера програм мы «НеПо УУог1с1». Для этого сначала реализуем простой узел, который будет выполнять несложную функцию - выводить в цикле строку «НеПо УЛлШ». 1. Написание кода Сначала откройте пакет функций кагтп'т рк^ руШоп, созданный в разде- ле 2.3, и в одноименной папке создайте файл с именем пойеНеПомюййНа.з.з. ру. Затем откройте файл пойе ЬеПоууогШ сЫяя.ру и напишите код узла в со- ответствии с приведенным ниже содержанием. Код, представленный ниже, можно найти в сопроводительном исходном кеде книги в файле 1еат1пд_пос1е/пос1е_1те11о'лгог1с1_с1а5<;.ру. #;/и5г/Ь'.п;ет7 рубпопЗ # *- сосппд: иИ-8 -*- ъпрогт гсГру # Библиотека РубКо.п-интерфейса для КОБ 2. Ггоп гсТру. псс1е тпрогб Иосе # Класс узла КОБ 2. ъпрогб Ттне II II II Создаем узел Не11оУУог1с1. При инициализации выводит лог «НеПо АУог1с1». с!аз5 НеП.оНсг1.с1Мос|е(Кос1е): беГ______ъпН___(зеИ, папе): зирег().___гпИ____(пале) # Инициализируем родительский класс узла РОБ 2. ипПе гс1ру.ок(): # Проверяем, работает ли система КОБ 2. зе’.Г. дебДоддегОЛп-ГоС'Неио Ног1с1") # Выводим сообщение в лог КОБ 2. Нле.51ееэ(0.5) # Пауза для управления частотой цикла. беГ гпат.Г|(а1 дз=Мопе): # Главная функция точка входа для узла КОБ 2. тс Гру.тптС(агдз=агд2) # Инициализируем РубКоп-интерфейс РОБ 2. пэбе - НеиоИог1Мос1е("пос1е_1те'1'1оиог1.с1_с'1а55') # Создаем и инициализируем объект узла РОБ 2. гсДру.зр1п(пос1е) # Запускаем цикл ожидания завершения работы РОБ 2. тбе.безТтоу-ПобеО # Уничтожаем экземпляр узла. гсГру,5НиЙош() # Завершаем работу РубКоп-интерфейса КОБ 2.
В разработке роботов с использованием КОВ 2 эексмендуется применять объектно ориентированный подход. Хотя он може1 показаться сложным,такой подход обеспе чивает лучшую читаемость и переносимость кода, а также облегчает процесс отладки Комментарии в приведенном коде подробно объясняют значение каждой строки. Необходимо изучить реализацию кода, чтобы понять основной про цесс программирования узлов, как показано на рис. 2.12. Инициализация программного интерфейса Создание и инициализация узла Реализация функциональности узла Уничтожение узла и закрытие интерфейса Рис. 2.12 ❖ Процесс программирования узла При программировании узлов сначала необходимо инициализировать среду КОЗ 2 с помощью метода гс1рулш1(). Основная цель инициализации - настроить механизм связи КОЗ 2, чтобы после создания узел могли обнару- жить другие узлы и взаимодействовать с ним. Затем создастся и инициа лизируется экземпляр узла, включая настройку необходимых параметров и инициализацию компонентов, что позволяет новому узлу иметь уникаль- ную декларацию. Далее реализуется основная функциональность узла: опре- деляются типы сообщений, пишутся функции обратного вызова для обра- ботки сообщений и запросов на обслуживание. Также необходимо следить за состоянием узла во время его работы и обрабатывать все исключения. При завершении работы узла необходимо остановить все компоненты, уничто- жить экземпляр узла с помощью безНоу побеО и закрыть среду КОЗ 2 с по- мощью ДинДсмпО для освобождения ресурсов. 2. Настройка параметров компиляции После написания кода необходимо настроить параметры компиляции паке- та, чтобы система знала точку входа программы на РуГйоп. Откройте файл зеШр.ру в пакете 1еагпт§_рк§_ру11топ и добавьте следующие параметры кон фигурации точки входа. В будущем, при запуске исполняемого файла пойе_ ИеПоиюг'б Дазз, система найдет точку входа в функции тэт программы побс_11с11оздог1с1_с1а8ь в пакете кагтпд ркд руНюп. епГгу_ро1пС5={ солзоТе зсггрГз': [ 'пос!е_Ье11оиог1с1_с1а53 - 1еагптпд_ркд_ру1Ьоп.пос1е_Ье11оиог1<1_с1а55.па1п', ], } ДК Для кода в пакетах РуГНсп каждый узел требует аналогичной настройки точки схода. Ошибки в конфигурации или ее отсутствие могут привести к тому, что во время вы- полнения не удастся найти соответствующий исполняемый файл. 3 последующих при- мерах кода, связанных с РуНтоп, конфигурация узлов уже выполнена, поэтому мы не будем к этому возвращаться. Вы можете изучить исходный код, прилагаемый к книге.
3. Компиляция и запуск Теперь можно скомпилировать только что написанную программу и парамет- ры конфигурации из корневого каталога рабочей области. $ сб ~/с1е7_и5 $ соТсоп ЬитЛс! в Компиляция всех пакетов в рабочей области. После компиляции исполняемый файл узла пойе_1те'1о\л'ог1й_с1а.кк будет автоматически размещен в рабочей области тзГаП. В папке теперь можно запустить скомпилированную программу узла с по- мощью команды гоз2 гип в КОЗ 2. $ ГО52 гип 1еагп1пд_побе побе пеиолог1б_с1а55 После успешного запуска в терминале будет циклически выводиться стро- ка «НеПо \Уог1й», как показано на рис. 2.13. гоз2<адиуие1юпе -/йеу_и5$ гоз? гип 1еагптпд_побе поае_пеПоиог 1д_с1азз [1КРО] [1720801479.969887966] [по0е_ПеНоиог1а_с1а55]: НеПо Ног 16 [1ИГО] [1720801480.4711909301 [побе_ЬеПомогЩ_с1а55]: НеПо НогГд [1МР0] [1720801480.9728217691 [побе .беПомог1б_с1а55]: НеПо НогГб [1МР0] [1720801481.474801259] [побе_ПеПоиог1с_с1а55]: НеПо 'Но г 16 [1НР0] [1720801481.976608100] [побе_беПоног 1Д_с1азь]: НеПо Йог 16 [1ГЧЕ0] [1720801482.477609368] [побе_Ье11омог 1о_с1а<>5]: НеПо Ыог1б [1МР0] [1720801482.979323426] [побе_ЬеПо«ог1д_с1а5ь]: НеПо Ног 16 [1ИР0] [1720801483.480851569] [побе_НеПомог 1б_с1азь]: НеПо Ног1б [ШРЭ] [1720801483.984546965] [побе_Пе11омог1С_с1а55]: НеПо НогГб [1ИГ0] [1720801484.485846636] [побе_беНомог1б_с1а55]: НеПо Ног1б [НЛО] [1720801484.988938066] [побе_ЬрПоног 1б_с1а5<>]: НеПо Ног 16 [1ИР0] [1720801485.490570378] [поЛе_ЬеП.омог1б_с 1а55]: НеПо НогШ [1ИР0] [1720801485.993447682] [побе_беПомог 1б_с1а5ь]: НеПо НогТб ГТК^О] [1720801466.446431120] [побе брПонОГ 1С с1а55]: НеПо НогГб Рис. 2.13 ❖ Результат запуска программы для узлов (РуСНоп) Таким образом, мы написали код узла на РуНтоп, выполнили компиляцию и его запуск. 2,43. Методика программирования узлов (С++) Если же нам нужен не РуШоп, а С++? Как тогда реализовать узел «НеПо УУоНсЬ? 1. Написание кода Сначала откройте пакет функций 1еагшп§_рк§_срр, созданный в разделе 2.3, и в папке зге создайте файл с именем пос1е_Ье11о1Уог1с1_с1а88.срр. Затем от кройте файл пос1е_Ье1'о\уог;с1_с1а.5.5.срр и напишите код узла в соответствии с приведенным ниже содержанием.
Код можно найти б файле 1еагп1пд_побе_срр/5гс/побеД|е11с,лгог1б_с1а55.срр, который прилагается к книге. #тпс!ос1е <1)Пт.5Т:<1. 1т> #тпс1ибе " гс!срр/гс1срр. Ирр" у*** Создаем узел НеИо'ДогТ-б. При инициализации выводит лог "НеПо Ь!ог'1б''. *** у с'газз Не’.ГойэгЩМоае : рцЫгс гсТсрр::Ыосе { риЫЛс: Не11оЫпг1с1Поаг() : 1Ые("гЫе_Ьеисшг',.(1_с1.аБ5'') // Инициализируем родительский класс узла КОБ 2. { ипИе(гс1срр: :ок()) // Проверяем, работает ли система КОЗ 2. { КС1СРР_1ПЕо(Т:1т1.Е->де1:_1.оддег(), ' НеНо Иог1сГ'); // Вьводим сообщение в лог КЭБ 2. з1еер(1); // Пауза для управления частотой цикла. } } }; Ц Главная функция - точка зходэ для узла КОБ 2. тпг патп(тп1: агас, сбег * агуу[]) { // Инициализируем интерфейс С++ КОБ 2. гс1срр: НпЩагдс, агду); Ц Создаем и инициализируем обьект узла КОБ 2. гсГсрр::зрт.п(збс!: :паке_5Ьагес1<Не11оЫог1с1Пос1е>()); // Завершаем работу интерфейса С++ КОБ 2. гс1срр::5Ьибаоип(); гебагп 0; } Комментарии в коде подробно объясняют значение каждой строки, а про- цесс реализации полностью совпадает с версией на РуГЬоп, поэтому здесь мы не будем повторяться. 2. Настройка параметров компиляции Для запуска кода на С++ его необходимо скомпилировать. Для этого нужно настроить файл СМакеЫзГз.ГхГ в пакете функций. Откройте файл СМакеТлзГз. ГхГ в пакете 1еагпш§_рк§_срр и добавьте следующее содержание. МК Для кода в пакете функций на С++ конфигурация компиляции схожа для всех узлов. Настройка выполняемся с помощью синтаксиса СМаке, а способы настройки можно найти в реализации исходных кодов пакетов. Б примерах кода на С++ в этой книге уже выполнена настройка, поэтому мы больше не будем возвращаться к данному во просу Вы можете изучить исходный код, прилагаемый к книге.
3. Компиляция и запуск Теперь можно скомпилировать только что написанную программу и парамет ры конфигурации в корневом каталоге рабочего пространства. $ С<1 ~/с1е7_И5 $ соТсоп ЬиИс! # Компиляция всех пакетов в рабочем пространстве. После завершения компиляции можно продолжить выполнение скомпи- лированного узла с помощью команды гоз2 гип. $ го§2 гип 1еагпгпд_пос)е_срр П<х1е_1те11омог1(|_с1а55 После успешного запуска в терминале будет циклически выводиться стро- ка «НеПо Шог1с1», как показано на рис. 2.14. го5239иуиеЬопе:~/<1е7_и5$ гоз2 гип 1еагптпд_пос1е_срр по4е_Ье1Лоыог1Д_с1.а55 [ШРО] [1720850870.778979384] [поЦе_Не11о^ог Ш_с1_а55]: НеПо Ног1с1 [1ЧЕО] [1720850871.781242130] [поде_Ье1.1о„ог1е_с1а55]: Не’Ло НогЩ Г1НРО1 [1720850872^7815784861 [поде Ие11рмог1Д <Да5'1 НеПо ЫогЩ Рис. 2.14 ❖ Результат запуска программы для узла (С++) Таким образом, .мы завершили написание, компиляцию и запуск узла с ис- пользованием С++. 2.4.4. Команды для работы с узлами При разработке роботизированных приложений командная строка позволя- ет гибко обрабатывать различные задачи отладки и выполнения. Команды, связанные с узлами в КОЗ 2, обозначаются как пойе. Подкоманды для кон- кретных функций представлены на рис, 2.15. Н го52@диуие1юте: ~ О = - □ X гоз2@диуиеЬоте:~$ гоз2 поде изаде: гоз2 поде [-Ь] СаП 'гоз2 поде <соттапд> -Ь' Гог тоге деГаПед изаде. ... МагХоиз поде геХаХед зиЬ-соттапдз орПопз: -Н, --ЬеХр зЬом ХНХз ЬеХр теззаде апд ехХХ Соттапдз: ХпГо ОиГриХ ХпГогтаГХоп аЬои! а поде ХХзХ ОиГриГ а Из! оГ ауаХХаЬХе подез СаП 'гоз2 поде <соттапд> -Ь' Гог тоге деТаПед изаде. го5 2@диуиеЬоте:~$ 11
Возьмем в качестве примера узел пос!е_пе11ошо11с1_с1а88, запушенный в этом разделе. Во время выполнения узла можно использовать следующие команды для просмотра списка всех текущих узлов и получения подробной информации о конкретном узле, включая информацию о публикуемых и под- писываемых темах, а также о серверах и клиентах для служб или действий. $ гоз2 по1е 1л5С # Просмотр списка узлов. $ гоз2 по!е 1пго <г,ос!е_папе» # Просмотр информации об узле. Результаты выполнения показаны на рис. 2.16. ГИ го52(ФдиуиеЬоте:~ О. = о х БиЬзсгхЬегз: /рагапе!:ег_еуеп18: гс1_1п1:егГасе5/п)8д/Рагате1егЕуеп1: РиЫЛзЬегз: /рагате1ег_е7еп1:з: гс1_1п1егТасез/п)5д/Рагате1:егЕуеп1 /гозои!: гс1_1пТегГасез/тзд/1од Бегущее Зегуегз: /поде_Ье11оыог'1д_с'1а55/(1е5сг1Ье_рагате1:ег5: гсТ-Хп^егГасез/згу/ОезсгхЬеРагат е1:ег5 /по^е_Ье!1омог1с1_с1а83/де1:_рагате<:ег_Туре5: гс1_1п1:егТасе8/8ГУ/Се1Рагате1егТ урез /поде_Ье'1'1<жог1(1_с1.а55/де1:_рагатеТег5: гс1_1пТегГасез/згу/Се^Рагапе1ег8 /поде_Ье11омог1с!_с1а5з/деТ_Туре_с1е5Сг1р1:1оп: ТуредезсгхрХхопхпТегТасез/згу /СеХТуреОезсгхрНоп /пос1е_Ье11оног1с1_с1а55/1181:_рагатеГег5: гсХ-гпТегТасез/згу/ЕгзТРагатеТегз /по(1е_Ье11оног1(1_с1а55/5е1:_рагар)е1:ег8: гс!_1п1:егГасе5/5ГУ/5е1:Рагап1еТегз /поде_Ье11оног1д_с1аз5/зе1:_рагате1:ег8_аТоп11са11у: гс1_т.пТегТасе5/згу/$е1:Рага пе^егзАТотхсаНу Зегугсе СНепЪз: АсМол Зегуегз: АсТхоп СНепТз: "О52@диуиеЬоте:~$ | Рис. 2.16 ❖ Результат выполнения команд для работы с узлами 2.4.5. Пример использования узла: обнаружение объектов После изучения основных методов программирования узлов возникает во- прос: как узлы применяются на практике в разработке роботов? Далее мы вместе создадим пример приложения для робота, чтобы глубже понять кон- цепцию «узла». Какой узел мы создадим? Глаза робота, то есть камера-сенсор, должны не только получать информацию об изображениях внешней среды, но и рас- познавать определенные объекты на изображениях. Сейчас мы разработаем узел, который будет считывать изображения с камеры и динамически рас- познавать на них яблоки (или объекты с похожим цветом), как показано на рис. 2.17.
Рис. 2.17 ❖ Пример применения узла: распознавание яблок на изображениях с помощью камеры I. Результаты выполнения Сначала рассмотрим, как работает данный узел. Откройте терминал и за- пустите следVющий узел. $ гоз2 гип 1еаглгпд_псс1е пос1е_сЬзес1:_иеЬсзп # Необходимо настроить камеру в виртуальной # машине. Если Во1 работаете в виртуальной машине, выполните следующие настройки: 1) установите созместимость виртуальной машины с 115В 3.1; 2) в разделе «Подключаемые устройства» подключите камеру к виртуальной машине. После успешного запуска узел сможет управлять камерой и в реальном времени распознавать красные объекты в кадре, такие как яблоко или другие похожие предметы, как показано на рис. 2.18. Рис. 2.18 ❖ Пример работы узла
2. Анализ кода После ознакомления с результатами выполнения давайте подробно рассмот- рим, как этот пример реализует использование «узла». Подробный код мож- но найти в файле 1еагп1п^_пос1е/пос1е_оЬ|'ес1:_№Ьсат.ру. строгб гсТру # Библиотека РуГбоп-интерфейса для КОБ 2. Ггоп гсСру.побе строг! Мос)е # Класс узла КОБ 2. строг! ст2 # Библиотека обработки изображений ОрепСУ. строг! потру аз пр й Библиотека для вычислений в РуСНоп. 1оыег_гес = пр.аггау([0, 90, 128]) # Нижняя граница НЗУ-диапазона для красного цвета, ирреггес = пр.аггау([180, 255, 255]) # Верхняя граница НЗУ-диапазона для красного цвета. Реб о!цес!_с1еГес1(стаде): # Преобразуем изображение из цветового пространства ВСЧ в Н5У. 115У_спд = а/2.с\'1Сс1ог(стэде, С72.С0!СК_ВСК2Н5У) # Выполняем бинаризацию изобэажения. пазкгеб = С72.1пЧагде^5У_гид, 1оиег_гес1, иррег_геб) # Выполняем поиск контуроз. сопГоигз, ЬсегагсЬу = С72.НлбСоп!оиг5(тазк_геб, С72.ЧЕТЧ_1Л5Т, су2.СНА1Н_АРРКОХ_МОМЕ) Я Удаляем шум со слишком малыми контурами, бог сп! сп сог.Гоогз: сб сп1:.ьНаре[0] < 150: сопГтпие # Получаем координаты верхнего левого угла и ширину/высоту ограничивающего прямоугольника, (х, у, и, Ь) = С72.ЬоипбгпдРес1(сп!) # Обводим контур яблока. су2.бгаиСсп!оиг5(стаде, [сп!], -1, (0, 255, 0), 2) # Рисуем центр яблока С72.с1гс1е(ичаде, (сп!(х+и/2), сп!(у+Ь/2)), 5, (0, 255, 0), -1) # Отображаем обработанное изображение с помощью ОрегСУ. су2.тпзбомС"оЬдесг", стаде) су2 . 1»ас!Кеу( 50) беб ратп|,атдз=Мопе): # Главная функция - точка входа для узла КОЗ 2. гс1ру.спс!(агд5=агдз) # Инициализируем РуГЬсп-интерфейс КОЗ 2. побе = Иобе("побе_оЬ]есГ_1л/еЬсап'') # Создаем и инициализируем объект узла КОЗ 2. побе.дег_1.одде"().1гДо("Пример узла РОЗ 2: обнаружение яблок на изображении.") сар = су2 . Ут.с!эоСар1:и ге(0) нЫЛе гс!ру.ок(): гет, стаде = сар.геаб() # Считываем один кадр изображения. С б ге! == Тгие: об]ес!_бесес!(ттаде) # Выполняем обнаружение яблок. побе.без!гоу_побэ() а Уничтожаем экземпляр узла. гсГру.зЬисбоигО # Завершаем работу РуГпоп-интерфейса КОЗ 2. Код узла сначала использует функцию УШеоСарГигеО из ОрепСУ для управ- ления камерой, затем периодически считывает информацию с камеры. После
этого с помощью встроенных интерфейсов обработки изображений ОрепСУ выполняется предварительная обработка изображения, а затем на основе пороговых значений НЗУдля красного цвета определяется местоположение яблока, ОрепСУ библиотека с открытым исходным кедом, широко используемая в осработ ке изображений. Подробное описание и методы ее использования см. в главе 7 этой книги или в онлайн-справочниках. 2.5. Тема: мост для передачи данных между узлами Узлы реализуют различные функции робота, но эти функции не существуют изолированно, они тесно связаны друг с другом. Одним из важнейших спо собов связи между ними является тема (Торге), которая служит мостом для передачи данных .между узлами. 2.5.1. Что такое тема Рассмотрим пример с двумя узлами робота (см. рис. 2.19). Узел А отвечает за управление камерой и получение изображений, узел В выполняет функцию видеомониторинга, отображая полученные изображения в реальном време- ни пользователю.
Естественно, возникает вопрос: как же осуществляется связь между этими двумя узлами? Ведь узел А должен передать полученные изображения узлу В, чтобы он мог визуализировать их. В ВОЗ передача изображений от узла А к узлу В осуществляется с помощью темы, которая служит мостом для пере- дачи данных между узлами в одном направлении. 2.5.2. Модель коммуникации посредством темы В КОЗ 2 коммуникация через темы основана на модели публикации и подпис- ки ВВЗ. Что же такое публикация и подписка? Характер передачи данных через темы заключается в том, что данные передаются от одного узла к другому (см. рис. 2.20). Объект, отправляющий данные, называется издателем (РнЬПзЬег), а объект, получающий данные, на- зывается подписчиком (ЗнЬзспЬег). Каждая тема должна иметь имя, а пере- даваемые данные должны иметь фиксированный тип данных. Мойе (Узел) Рис. 2.2-1 ♦♦♦ Модель коммуникации посредством темы На рис. 2.21 приведена аналогия. Например, вы любите читать статьи в со- циальной сети, где есть аккаунт о робототехнике под названием Сиуисщ (§иуие1тоте.сот). В этом случае Сиуиещ - это название темы. Редактор акка- унта является издателем, который публикует статьи о роботах в определен- ном формате. Формат статьи - это тип данных темы. Если вам интересна эта тема, вы можете подписаться на аккаунт Сцуцещ и в качестве подписчика получать статьи. Если же вы не подписаны, то не будете получать их. По- добные модели публикации и подписки повсеместно встречаются в жизни, например подписка на газеты, рассылки и т. д. Коммуникация через темы в КОЗ 2, основанная на модели публикации и подписки, обладает следующими характеристиками.
Рис. 2.21 ❖ Модель публикации и подписки 1. Коммуникация «многие ко многим» Один человек может подписаться на множество аккаунтов, газет, журна- лов, и у каждого аккаунта, газеты, журнала может быть много подписчиков. С коммуникацией через темы та же история: количество издателей и подпис- чиков не ограничено, это называется коммуникацией «многие ко многим» (см. рис. 2,22). Рис. 2.22 ❖ Модель публикации и подписки «многие ко многим» Такая многоточечная коммуникация в некоторых случаях может вызывать помехи в данных. Например, один, два или три узла могут публиковать инструкции по управ лению движением робота, в то время как один, два или три робота могут подпи- сываться на них Представьте себе, кто должен их слушаться при таком количестве роботов? Поэтому при наличии нескольких издателей или подписчиков тем важно расставлять приоритеты. 2. Асинхронная коммуникация Одной из характеристик обмена сообщениями является асинхронность. Асинхронность означает, что после отправки данных издатель не знает, ког-
да подписчик их получит. Это похоже на публикацию статьи в блоге: автор не знает, когда читатели ее прочтут. Или на отправку газеты: редакция не знает, когда она будет доставлена. Асинхронность делает обмен сообщения- ми более подходящим для периодически публикуемых данных, таких как данные с датчиков или команды управления движением. Однако для команд с более строгой логикой, например изменения параметров робота, такой способ передачи данных менее уместен. 4^ С другой стороны, если есть способ быстро узнать, были ли донные получены, это на- зывается синхронностью, как в случае телефонного звонка. В РОБ также существуют и методы синхронной связи, а именно службы и действия, которые будут рассмотре- ны в разделах 2 6 и 2.8. 3. Интерфейс сообщений Поскольку речь идет о передаче данных, издатель и подписчик должны использовать единый формат описания данных. В ВОЗ формат описания данных для обмена сообщениями называется сообщением (Мезза^е), что аналогично концепции структуры данных в программировании. Например, кадр изображения включает в себя значения длины и ширины в пикселях, информацию КОВ для каждого пикселя и т. д. В КОЗ для этого существует стандартное определение сообщения. Сообщения в КОЗ представляют собой способ определения интерфейсов, который не зависит от языка программирования и является важным мето- дом декомпозиции узлов в КОЗ. Для робототехнических приложений в КОЗ определено множество стандартных сообщений, таких как изображения, карты, скорость и др. Пользователи также могут свободно определять свои собственные сообщения с помощвю файлов с расширением .шя^. Благодаря интерфейсам сообщений различные узлы можно соединять, как строитель- ные блоки, создавая сложные системы роботов. Создание пользовательских сообщений будет рассмотрено в разделе 2.7. 2.5.3. Пример создания обмена сообщениями Рассмотрев основные принципы обмена сообщениями, перейдем к написа- нию кода. Начнем с примера «НеПо ШогПЬ, преобразовав вывод строки из раздела 2.4 в публикацию и подписку на текстовое сообщение. В этом случае создает- ся издатель, который периодически публикует строковое сообщение «НеПо ШогШ» через тему сНаПег, тип сообщения - 31пп&, определенный в ВОЗ. Так- же создается подписчик, который подписывается на тему спаПег для полу- чения строкового сообщения «НеПо ЛЛ7ог1с1».
Сначала посмотрим на результат работы. Запустите первый терминал и выполните следующую команду для запуска узла издателя сообщений, как показано на рис. 2.23. $ г 052 гип ТеаглТпдЩортс Гор1с_ЬеПо1л/ог1б_риЬ го52(ЭдиуиеЬоте;~/<1еу_и5$ гоз2 гип Хеагпъпд 1юр1с ^оргс ЬеНомогТд риЬ [ 1К1Р0] [1726851069.455697756] [Сор<с_ЬеНоиог1д_риЬ]: РиЬНзЬтпд: "НеНо Ыог1сГ [ 1МЕ0] [1720851069.940823200] [^ор-1с_ЬеНомог1.с1_риЬ]: РиЬНзЬтпд: "НеНо Ыог1<1" [1ИГО] 1720851070.441187295] [Чорте ЬеНомогХд риЬ]: РиЬНзЫпд: "НеНо Ног10“ Г1ИР0] [1726851070 941517265] [1орхс_КеНомог1и_риЬ]: РиЬНзЬтпд: "НеПо Ног1<]" [1МЕ0] [1720851071.441152173] [Порте Ье11ож>г1д_риЬ]: РиНтеКтпд: "НеПо Ног1с1" [1ИР0] [1720851071.941002171] [Портс_ЬеН.оиог1д_риЬ]: РиЫтзЬтпд: "НеНо НогЫ" Рис. 2.23 ❖ Результат работы узла издателя темы Откройте второй терминал и запустите узел подписчика сообщений, ре- зультат работы показан на рис. 2.24. $ гоз2 гип ТеаглгпдЩортс Гсргс_ЬеПоадг1б_5иЬ го52@диуиеНопе:~/<1еу_и5$ гоз2 гип 1еагп1пд_-кор1с 1оргс_Ье11.оиог1д_5иЬ [ГИЮ] [1720851104.465165848] [Горте ЬеХТомогТЗ зиЬ]: I Кеагд: "НеНо Ыог1<1" [1№0] [1720851104.941627539] [^оргС-НеПомогЫ-ЗиЬ]: I Неагд: "НеНо Ног1<]" [ХИРО] [1720851105.445914956] [Торте ЬеПомогТЗ зиЫ: I Ьеаг<1: "НеНо Ыог’кГ 1ХИРО] [1720851105.942442566] [{оргс НеНомог1д_зиЬ]: I Неагд: "НеНо ЫогХс]" [ХИРО] [1726851106.441087582] [Горте ЬеХТомогХи зиЬ]: I Ьеаг<1: "НеНо НогТсГ [ХИРО] [1720851106.941215849] [Порте ЬеНомог1с1_5иЬ]: I Ьеагй: "НеНо ИогШ" [ХЧРО] [1720351107.441840148] [Гортс_ЬМ1 0И0г1д_5иЬ]: I Беагс!: "НеНо НогЫ" Рис. 2.24 ❖ Результат работы узла подписчика на тему Можно видеть, что издатель в цикле публикует сообщения со строкой «Не1- 1о Шцг1с1», а подписчик получает их с почти такой же частотой. Как же два узла в приведенном выше примере осуществляют передачу строковых сообщений через тему? Перейдем к изучению методов програм- мирования. 2,5.4. Метод программирования издателя темы (РуИпоп) Рассмотрим метод реализации издателя, код на языке РуПхоп находится в файле 1еагпт§_1:ор1сДор1с_Ие11ошог1с1_риЬ.ру, подробный разбор представ- лен ниже. ттрогб гсТру [гоп гсТру.поде тпрогб Носе Сгон зГсТтздь. пьд тпрогГ Збггпд # Библиотека РуЩоп- интерфейса для Р05 2. # Класс узла № 2. # Тип сообщения строка.
II II II Создаем узел-издатель. II II II с1а55 РиЫЛьНе'Мобе(Мос1е): беГ ___тли___(веИ, пате): 5ирег().___фптЛ__(пате) # Инициализируем родительский класс узла К05 2. # Создаем объект издателя (тип сообщения, имя темы, длина очереди). сеИ.риЬ - 5е1^.сгеате_рио1т51тег(5Тгтпд, "сЬабсег", 10) # Создаем таймер (функция обратного вызова, период з секундах). веИ.Щлег = 5е1Г.сггаге_Г1тег(0.5, 5е1/.1:1тег_саи.оаск) # Функиия обратного зызова, вызываемая таймером. беГ 1ттег_са',ЛЬгск(5е1<:): тзд = 51ггпд() # Создаем объект сообщения типа Збгтпд. изд.баба = 'НеПо МогТб' # Заполняем поле данных сообщения. ье1Г.риЬ.риЫЛ5Ь(т5д) Л Публикуем сообщение в тему. веЮдесДсддегО ЛпГо('РаЬКзптпд: "%5"' йпзд.баба) # Выводим информацию в журнал. бе! 1пат.п(агдь=1'1опе): # Главная функция точка входа для узла КОЗ 2. гскру.тпЩагдь-агдз) # Инициализируем КубЬоп-интерфейс КОЗ 2. псбе = РиЫгзЬегКобе("бор1с_Ье1.',.оног1б_риЬ') # Создаем и инициализируем объект узла КОЗ 2. гс1ру.зр1п(псбе) # Запускаем цикл ожидания завершения работы КОЗ 2. побе.беьбгоу_побе() # Уничтожаем экземпляр узла. гс1ру.з1тиббои.т() # Завеэшаем работу Ру1Ьоп-интерфейса КОЗ 2. На основе приведенного кода можно обобщить процесс реализации из- дателя темы, как показано на рис. 2.25. Инициализация программного интерфейса । Создание и инициализация узла Создание объекта издателя Создание и заполнение сообщения темы Публикация । сообщения темы Уничтожение узла и закрытие интерфейса Рис. 2.25 ❖ Процесс реализации издателя темы Сначала производится инициализация среды КОЗ 2 и настройка интер- фейса связи КОЗ 2. Затем создается и инициализируется экземпляр узла, включая установку необходимых параметров и инициализацию компонен- тов. Далее с помощью метода сгеаГе риЬНзЬегО создается объект издате- ля: необходимо задать имя темы, тип сообщения и длину очереди. Затем, в цикле с таймером, с фиксированной частотой создается и заполняется содержимое сообщения, которое публикуется с помощью метода риЫ1зп(). В конце программы, при завершении работы узла, останавливаются все компоненты, уничтожается экземпляр узла и закрывается среда КОЗ 2 для освобождения ресурсов.
2,5.5. Метод программирования подписчика темы (Ру1Ноп) Теперь рассмотрим метод реализации подписчика, код на языке РуГЬоп на- ходится в файле 1еагпт§_1ор1сДор1с_11е11ошог1с1_8иЬ.ру, подробный разбор представлен ниже. тлрогг гсТру # Библиотека РубЬоп-интерфепса для РОЗ 2. Ггоп гссру.побе тпрогб 1Мос1е # Класс узла №5 2. Ггол 5^с1_Р5д5.п5д тпрогб бсгтпд # Стандартный тип сообщения Збгтпд, определенный в РС5 2. Создаем узел-подписчик. сГаьз $иЬ5.сгт.Ье'Мобе(Чос1е): беГ___1пи_(зеК, пале): 5ирег().__тптб__(папе) # Инициализируем родительский класс узла Юб 2. # Создаем объект подписчика (тип сообщения, имя темы, функция обратного вызова, длина очереди). зеТТ.зиЬ = 5е1Т.сгеаге_5иЬ5сгнрС\.оп(\ ЗГгтпд, ЧЬаббег'1, веГГ.ПзбепегсаНЬаск, 10) # Функция обратного вызова, вызываемая при получении сообщения из темы. беГ НзТепеГ-СаПьаскДеШ, изд): зе1Т.деб_1.оддег()ЛпЦцТ Ьеагб: "%5'" % тзд.баба) # Выводим сообщение в журнал. беГ гг1атп(ггд5=Мопе): # Главная функция, точка входа для узла РОЗ 2. гс1руЛпи(агд5=эгд5) # Инициализируем Ру Сноп-интерфейс Р05 2. побе = 8иЬзсг'.ЬегМобе( Тор1с_Ьеио1л1Ог1с_5иЬ") # Создаем и инициализируем объект узла РОЗ 2. гс1ру.5ргп(поае) # Запускаем цикл ожидания завершения работы КОЗ 2. побе.бе51гоу_побе() # Уничтожаем экземпляр узла. гсГру.зЬ.иЙоннпО # Завершаем работу РубЬот-интерфейса 605 2. Процесс реализации подписчика на тему представлен на рис. 2.26. Инициализация Создание Создание Обработка данных темы Уничтожение программного и инициализация объекта в функции обратного узла и закрытие интерфейса узла издателя вызова интерфейса Рис. 2.26 ❖ Процесс реализации подписчика на тему Сначала производится инициализация среды КОЗ 2 и настройка интерфей са связи КОЗ 2. Затем создается и инициализируется экземпляр узла, включая настройку необходимых параметров и компонентов. Далее с помощью мето- да сгеаГе зиЬзспрГюпО создастся объект подписчика, для которого необхо
димо задать тип сообщения, имя темы, название функции обратного вызова и длину очереди. Когда подписчик получает сообщение от издателя, он сразу же переходит в функцию обратного вызова НзТепегсаПЪаскО. В функции обратного вызова обрабатываются данные темы и продолжается ожидание следующего сообщения. При завершении работы узла все компоненты оста- навливаются, экземпляр узла уничтожается, и среда КОЗ 2 закрывается для освобождения ресурсов. Ключевым элементом понимания кода подписчика является функция обратного вызова 11$1епег_са11Ьаск(), так как тема выступает асинхронным средством связи, и подписчик не знает, когда придет сообщение. Поэтому в фоновом режиме работы НОВ 2 действует механизм опроса, который при обнаружении данных в очереди сообщений вызывает функцию обратного вызова, обеспечивая быструю реакцию на полученные данные. Функции обратного вызова имеют стандартную форму во многих языках программи- рования и являются распространенным приемом в разработке программного обес- печения. 2.5.6. Метод программирования издателя темы (С++) Можно ли реализовать издателя темы с аналогичной функциональностью на языке С++? Конечно, можно. Пример работы издателя показан на рис. 2.27. го52@диуиеЬоте:~/<1еу_И5$ гоб2 гил 1еагп1пд_ХорХс_срр 1ор1с_Ье1Лож)г1(1_риЬ [ТМЮ] [1720851196.134677978] [Гортс_Ье11эйОг1д_риО]: : РиЫЛзЫпд: 'НеПо Ыог1(Г [ТМРО] [1726831196.634391579] [гор!.с_Ье 1Тэног1Д_рио] : : РиЫЛ$М.пд: 'НеПо ЫогХсГ [ТМЮ] [ 1720851197.134624131] [1орт.с_Ье11с.иогЩ риЬ] : : РиЫлзМпд: 'НеПо НогХсГ [ТМРО] [1720851197.634399887] [1ор1С_Ье11оыог1<1..риЬ]: : РиЫЛзМпд: 'НеПо ЫогХсГ [ТМЮ] [1720851198.135112797] [1орт.с_||е11оИог1<1_риО]: : РиЬИзЬХпд: 'НеПо ЫогХсГ [ТМЮ] [1720851198.634375638] [гор1с_ЬеТ1эыог1с1_риЬ]' : РиЫлзМпд: 'НеПо ЫогХд1 [ТМЮ] [1720851199.134685329] [1оргс_Ье11с.ногЫ_риЬ]. : РиЫлзНпд: 'НеПо ЫогТ_д’ [1ИР0] [1720851199.634817675] [1ортс Ье1гэиог1й риЫ• : РиЫЛзЬглд: 'НеПо НогХд' Рис. 2.27 ❖ Пример работы издателя темы (С++) Полный код находится в файле 1еагпту_Гор1с_срр\8Гс\1ор1с_11е11от/тог1с1_риЬ. срр. #гпс1ис1е <сЬгсло> #тпс1ис1е <ТипсНспаТ> #1пс1ис1е <пепогу> #тпс1ис1е <5ггтпд> #гпс1ис!е ' гс!срр/гсТсрр.Нрр" // Библиотека интерфейса С++ В08 2. #тпс1ис1е "5бс1_п5д5/"'8д/51г1пд.5рр" // Тип сообщения - строка. изТпд папезрасе зЩ: :сЬгопо_1ЛтегаТз; сТазз РиЫтзбегМобе : риЫАс гсТсрр: :Мос1е {
риЫгс: РеЫЛзЬегМобеО : Мобе("Гсргс_Ье11оиог1.а_рио ) // Инициализируем родительский класс узла КОЗ 2. { // Создаем объект издателя (тип сообщения, имя темы, длина очереди). риЫ18Йег_ - бЬтъ->сгеабе_риЬи5|1ег<5(:б_п5д5: :пзу: :$Сг1пд>("с1таС1ег1', 10); /7 Создаем таймер, выполняющий функцию обратного вызова по расписанию. Ппе'_ = 1Мь->сгеа1:е_иаи_1:1|,1ег( 500П5, 516::Ы.пс1(&РиЫт.51тегМос1е : :сГтег_са1СЬаск, ТНТь)); } ргтуабе: // Функция обратного вызова, вызываемая периодически таймером. уэтб С1пег_саиЬаск() { /7 Создаем объект сообщения типа Збттпд. аибо пзд = збсЬъдв: :гъд: :5бгтпд(); // Заполняем поле данных сообщения. П5д.с1аба - "НеПо Ног1<Г'; // Публикуем сообщение в тему. рцо115Ьег_->риЫ1з11(п5д); // Выводим информацию в лог, подтверждая публикацию. Р,С1СРР_^Р0(.11'Гс5->деС_1оддег(;, 1 РиЫЛъЬтпд: ' , П5д.с1аба.с_5бг()); } гсТсрр: гПпегВазе: :5пагес1Рбг 1тР1ег_; // Указатель на таймер. гсТсрр; :Рьб1151'1ег<5бб_Г15д5: :гпзд: :5Тг<пд>: :5йаге<1Рбг риЬ1Л5Ьег_; // Указатель на издателя. }; // Главная функция, точка входа для узла КОЗ 2. нот Па1п(тпб агдс, сйаг * агд7[]) // Инициализируем интерфейс С++ КОЗ 2. гсГсрр: :т.птЛ(агдс, агду); // Создаем и инициализируем объект узла РС5 2. гсТсрр::5рТп(5М: :паке_з1аагес1<РиЬи5ЬегМос1е:’()); // Завершаем работу интероейса С++- КОЗ 2. гсТсрр;:зЬиТйоип(); геСигп 0; } Комментарии в коде подробно объясняют каждую строку, а процесс рса лизации полностью совпадает с версией на РуГкоп, поэтому здесь мы не будем повторяться. 2.5.7. Метод программирования подписчика темы (С++) Пример работы подписчика темы, реализованного на С++, показан на рис. 2.28.
го52@диуиеьорте:-/4еи_ы58 го$2 гоп 1еагп1пд. Сорхс_<рр Сорте. Не Понос [1ЫРО] [1720851202.636799828] [Сор1е_Неиоыог1<1_5иЬ]! I Ьоагд: ‘НеТЦо Ио г 18 [1НРО] [1720851203 135933409] [сортс_Ье11.оног1а_ьиЫ: I Ьеа'д: 'НеНо НогТВ' [1ЫРО] [1720851203.635822133] [СорГс_Ье11оногЫ_ьиЬ]: ] Ьеа-8; 'НеНо Ио, ТсГ [1НРО] [172085120-1.135743193] [Сор1с_ЬеНоног1с аиЬ]: I Ьеагд: 'НеНо Иог1хГ [1ГчЕО2 [1720851204.635549940] [Сортс_Ье11оиогТ6_ьиЬ]: I беа_8: НеНо Ног Ю [1КЕО] [1720851205.134895284] [Гор1с_Ье1Тоыог1а_5иВ]: I (1еа-а: 'НеНо ЬогТс! [1ЫЕО] [1720851205.635098176] [СовтС-ЬеТ1 оыог1<Н_ьиЬ]: I Ьеа'д: 'НеНо иог!«Г [1МЕ0] [1720851206.135197185] [1_орт.с_Ве11оыог1Д_<.иЬ]: ] Ьеа-8: 'НеНо Ио, 18’ [1НБО] [1720851206.635815426] [Соргс_НеНоыог18_5иЬ]: I Ьеаг8: 'НеНо НогЫ [1НБО] [1720851207 135044081] [Сортс_НеНоног18_5иЬ]: I Ьеа-'О; 'НеПо НогТО Рис. 2.28 ❖ Пример работы подписчика на тему (С++) Полный код находится в файле (еагпт^ Хоргс сррХ.чгсХХорк пеПошогМ зиЬ. срр. #спсТибе <пепогу> #тпс1ис1е " гс!срр/гс1срр. брр" // Библиотека интерфейса С++ Р95 2 #1псТа6е "51:6_н5д5/п5д/51г1пд.!1рр'' // Тип сообщения строки изГпд 516::р1асеНо1бегб: :_1; сТазз 5иЬьсг1ЬегМоае : риЫЛс гсТсрр::Иосе { риЫЛс: $иЬ5Сг1ЬегГ1о6е() : Но6е("1ор1с_||е1Лоно'1.6_5иЬ") // Инициализируем родительский класс узла К05 2. { // Создаем объект подписчика (тип сообщения, имя темы, функция обратного вызова, длина // опереди). 5иЬ5Сг1рНог,_ = 1Ы5->сгеаГе_5иб5Сг1рГ1оп<516_Л5д5: :н5д::5ЛгЛпд>( "сЬаНег", 19, 516: :Ыпб(&5иЬ5сг1ЬегИо6е: :1ср1с_са11Ьаск, 11115, _1)); ргСуаСе: // Функция обратного вызова, вызываемая при получении сообщения из темы. 7016 1эр1С_са1ЛЬаск(соп5Г зббпзде: :п5д: :5ЛгЛпд: :5Ьаге0Рбг П'д) С0П51 { // Выводим информацию в журнал, подтверждая получение сообщения. КС1СРР_1Г1Е0(1:1115->деС_1оддег(), "I Ьеагб: П5д->6а1:а.с_51:г()); Ц Указатель на подписчика. гсЕсрр: :5иЬ5СГ1р11ОР<5Гб_пзд5: :пзд: :$1:г1пд>: :5ЬагебРРг 5иЬ5СГ1.рНоп_; Ц Главная функция, точка входа для узла КС5 2. Лпб паЛп(ЛпЛ агде, сЬаг * агду[]) { Ц Инициализируем интерфейс С++ К05 2. гсЛсрр::1пЛЛ(агдс, агду); // Создаем и инициализируем объект узла Р05 2. гсЕсрр: :5рГп($16: :паке_ьЬаге6<биЬбсг1Ье1 Иобе^О);
// Згвершаем работу интерфейса С++ К05 2. гсТсрр::ьЬобиоип(); гебигп 0; Комментарии в коде подробно объясняют значение каждой строки, а про- цесс реализации полностью совпадает с версией на РуГйоп, поэтому мы не будем еще раз на этом останавливаться. 2,5.8. Команды для работы с темами Команды, связанные с узлами КОЗ 2, обозначаются как Горгс. Ниже приведе- ны наиболее часто используемые операции. $ ГО52 гербе Изб $ гоз2 борте тпГо <бортс_папе> $ гоз2 борте Ьг <тсртс_пате^ $ гоз2 борте Ьн <бсртс_пате> $ гоз2 борте есЬо <бортс_папе> # Просмотреть список тем. # Просмотреть информацию о теме. # Посмотреть частоту публикации сообщений в теме. # Посмотоеть пропускную способность (скорость передачи б данных) темы. # Просмотреть данные, публикуемые в теме. $ гоз2 борте риэ <тортс_папе> <пзд_буре> <т5д_даса> # Опубликовать сообщение в тему. При запуске издателя темы горгсйеПоу/огШзстЬ и подписчика темы Гор1с_ РеПоууогШрпЬ можно с помощью команд Н.Щ, еейо, И/ и тГо просматривать текущий список тем, данные сообщений, частоту передачи и подробную ин- формацию. Результаты показаны на рис. 2,29. гоз2<адиуиеЬопе:~$ гоз2 борте Изб /еЬаббе! /рага"1ебег_еуепбь /го'ооб гоз?@диуиеНопе:-$ гоз2 борте ееЬо /сбаббег даба: НеПо Ыогбд заба: НеПо Ногбд даба: НеПо Ногбд дата: НеПо Иог1д ЛСго52@диуиеЬоче:-5 гоз2 борте Ьг /сбаббег ауегаде габе: 2.001 гчтп: 0.4995 пах: 0.5003 5бд деу: 0.000455 итпдоч: 4 ауегаде габе: 2.000 ибо: 0.4995 шах: 0.5015 збд деу: 0 090475 ибпдоч: 6 лСгоз2@диуиеПопе-$ гоз2 борте тпбо /сПаббег Гуре: 5бд_т5д5/1Ч5д/Збгтпд РиОбтзЬег соипб' 1 ЗиЬзегтрбтоп соипб: 1 Рис. 2.29 ❖ Пример выполнения команд для работы с темами
2.5,9, Пример использования тем: обнаружение объектов (периодическое) Как применить темы в реальных сценариях робототехники? В разделе 2.4.5 с помощью одного узла была реализована идентификация красных объектов на камере. Хотя эта функция работает корректно, она не является модуль- ной, что важно для разработки роботов. Более подходящий способ - сделать управление камерой и обнаружение целей двумя отдельными узлами, как показано на рис. 2.30. Связь между узлами осуществляется через сообщения с изображениями, которые периодически передаются с помощью тем. На рис. 2.30 представлена архитектура связи для примера обнаружения объектов (периодического). РиЬНзНег (Издатепь) Тема: 1таде_гаи Сообщение Изображение Дан1ые. Данн ые изображения ЗиЬзспЬег (Подписчик) Рис. 2.3'3 ❖ Архитектура связи для примера обнаружения объектов (периодическою) Сообщения с изображениями в КОЗ имеют стандартное определение. По этому если в будущем потребуется заменить камеру, достаточно будет изме- нить узел драйвера, а структура публикуемых сообщений с изображениями останется неизменной, и узел визуального распознавания изменять не по требуется. Такой модульный подход к проектированию позволяет программ- ному обеспечению быть более переносимым. I. Результаты выполнения Сначала давайте рассмотрим результаты. Откройте два терминала и выпол- ните в каждом из них следующие команды для запуска двух узлов. Первый узел управляет камерой и публикует темы изображений, второй узел подпи- сывается на темы изображений и осуществляет визуальное распознавание. $ го$2 гип 1еагг.гпд_Горт.с Гор1с_1<,еЬсап_риЬ $ гоз2 гип 1еагг.гпд_1ор’.с Гор1с_иеЬсаг_5иЬ Поместив красный объект в поле зрения камеры, можно наблюдать эффект распознавания (см. рис. 2.51).
Рис. 2.31 ❖ Результаты работы функции обнаружения объектов 2. Анализ кода издателя Какие изменения были внесены на уровне кода? Сначала изучим реализацию кода узла-издателя, основная функция которого заключается в управлении камерой и публикации данных камеры в виде сообщений КОЗ. Полный код находится в файле 1еагтгщ_1юр1с/1юр1с_ууеЬсат_риЬ.ру. гпрогТ гсТру # Библиотека РубЬоп-интерфейса РОЗ 2 бгоз гсТру.побе гпрогб Иосе # Класс узла РОЗ 2 бгол зеп5ог_1лзд5.пзд тпрогб Тпадэ # Тип сообщения для изображения Сго'л су_Ьг1с1де лпрсгб СуВгТбде # Класс для преобразования изображений между РОЗ и ОрепСУ гг.рогб ст2 # Библиотека обработки изображений ОрепСУ II II II Создание узла-публикатора. II II II сТазз Т’ладеРиЫгзКег(Кобе): беГ___тлИ____(зе1Т, папе): зирег().___гпт.6_(пале) # Инициализация родительского класса узла РОЗ 2 # Создание объекта издателя (тип сообщения, имя темы, длина очереди) зе1б.риЫгз1лег_ = 5е1.С.сгеабе_риЫ15Ьег(1паде, '1паде_гзи', 10) # Создание таймера (обратный вызов, период з секундах) ьеТТ.бтпег = зе1б.сгеаТе_Н|ле'(Э.1, зеТТ.бг111ег_са11Ьаск) # Создание объекта видеозахвата для получения изображения с камеры (номер устройства) зеИ.сар = су2.У1беоСарбиге(0)
# Создание объекта преобразования изображения для последующего преобразования изображения # ОрепСУ в сообщение КОЗ 5еИ.С7_Ьггбде - СуВгтДде() беГ Нпег_саПЬаск(5е1Г): геТ, Т’гапе - зеИ.сар.геабО # Считывание изображения по кадрам ТЕ Ге! Тгие: # Если изображение успешно считано зеИ. рнЬ1Л5 Ьэг_. рцЫЕзЬ ( 5е1Е.су^ггФде.су2_Ц)_1пдп5д.(<тане, 'Ьдг8')) # Публикация сообщения с изображением зеТЕ.дебТодсег() лпГо(' РиЫтзПТпд утоео Ггазте') # Вывод информационного сообщения # в журнал беЕ гаТп(агд5-Е1опе): # Главная функция, точка входа узла Р05 2 гсТру ЛпП(агд5=агд5) # Инициализация РуВтоп-интерфейса 405 2 поре - 1падеРпЫг5Пег( "Еоэгс_1л/ебсап_риЬ") # Создание и инициализаиия о6ъектг узла 405 2 гс1ру.5рт.п(посе) # Цикл ожидания завершения работы Р.05 2 побе.безЕгоу-Пойе;) # Уничтожение экземпляра узла гс1ру.5ЬиЩоип() # Зазершение работы Русбоп-интерфейса К65 2 В этом коде используется функция су2Аг1(1еоСар1иге() из ОрепСУдля управ- ления камерой. В цикле, заданном таймером, с помощью функции геай() из- влекаются данные изображения, которые затем преобразуются в сообщение с изображением КОВ 2 с помощью функции су2_Со_ш1&т8&() и публикуются. 3. Анализ кода подписчика Узел-подписчик периодически получает сообщения с изображениями, опуб- ликованные узлом-издателем, и с помощью функции обратного вызова об- рабатывает изображения, распознавая целевые объекты. Полный код нахо дится в файле ^агпЁп^ ЕорЁсДорЁс ууеЬсат яиЬ.ру. гпрогб гс!ру Егоп гсЕру.поСе спрогг Моде Ггоп 5еп5ог_п5д5.пзд тпрогб Тгпаде Егоп С7_Ьгсс1де ТпрогЕ СуВгСВде ЕпрогЕ су2 Ег.рогг пипру аз пр 1сыег_геб = пр.атау([0, 90, 128]) иррег_гес = пр.аггау([186, 255, 255]) # # # Библиотека РуЕЬоп-интерфейса КС5 2. Класс узла К05 2. Тип сообщения для изображения. Класс преобразования изображений между К05 и ОрепСУ. Библиотека обработки изображений СрепСУ. Библиотека численных вычислении для Руг1тог,. # Нижняя граница НЕУ-порога для красного цвета. # Верхняя гранича Н5У-порога для красного цвета. II и и Создание узла-подписчика. II II II с1а55 1паде5иЬзсгЕЬег(Ноае): <1еЕ___1П1Д__(зеИ, папе): 5орег().___Егп.1_(папе) # Инициализация родительского класса узла КЭ5 2. # Создание объекта подписчика (тип сообщения, имя темы, функция обратного вызова, длина # очереди). зеТЕ.зиЬ = 5е1Г.сгеаЕе_5оЬ5сг1рЕ1оп( Тпаде, 1паде_гаи', 5е1г.11зЕепег_саПЬаск, 10)
# Создание объекта преобразования изображений между ОрепСУ и сообщениями КОЗ. ъе1Т.С7_Ьггс!де - С</Вгт.с1де() с1еб обдесб-бесесЦзеИ, гладе): # Преобразование изображения из цветовой модели ВСЯ в ПЗУ. КБУ-Тпд = с7?.с7бСо1ог(1ладе, су2.С0ЮР_ВБР2Н8У) # Бинаризация изображения. пазк_геб = С72ЛпКапде(б5У_г'г1д, 1оиег_гес1, иррег_геб) # Обнаружение контуров на изображении. сопбсигв, бтегвгсбу = С72.бтГ|бСопбоиг5( па5к_геб, су2.РЕТР_1 15Т, су2.СНА1М_АРРК0Х_М0ИЕ) # Удаление контуров с площадью меньше порогового значения (шум), бог спб т.п соптоигв: тб спб.збаре[0] < 150: сопбтпие # Получение координат левого верхнего угла, ширины и высоты ограничивающего # прямоугольника. (х, у, и, б) = «г.ЬоипсНпдКесЦспб) су2.бга|л/Сопбоигз(1паде, [спб], -1, (0, 255, 0), 2) # Обводка контура предполагаемого # яблока. # Отметка центра предполагаемого яблока. су2.с1гс!.в(гпаде, (1пб(х + и / 2), 1пб(у + б / 2)), 5, (0, 255, 0), -1) # Отображение обработанного изображения с помошью ОрепСУ. су2.1пьбо1л|("обдесб", спаде) су2.иа1б!<еу(10) беб И51епег_саГ1Ьаск(ье1б, баба): зеИ деб_1оддег() ,1пбо( Ресегппд утСео Ггапе') # Вывод информационного сообщения в журнал. Я Преобразование изображения из сообщения КОЗ в Формат ОрепСУ. гладе - 5еИ.С7_Ьг1бде.1пдп5д_6о_С72(баСа, 'Ьдг8') ье1Т.оБ1ес1:_бегес6(1ладе) # Детекиия яблока на изображении. беб "1Э1П( агд2=МоГ|е): # Славная функция, точка входа для узла КОЗ 2. гсТ.руЛпШагдв-агдв) # Инициализация Рутбоп-интерфейса КОЗ 2. пэбе - 1падеЗзЬ5Сг1Бег("бор1с_1л1еЬсап_5иЬ") # Создание и инициализация экземпляра узла РОЗ 2. гс!ру.зр1п(побе) # Запуск цикла обработки событий до завершения работы КОЗ 2. пэбе.безСгоу_побе(.) # Уничтожение экземпляра узла. гсТру.5биббомп() # Завершение работы Руббоп-интерфеиса РОЗ 2. После декомпозиции функций из раздела 2.4.5 через темы пример визу- ального распознавания стал более современным, однако кажется, что что то все еще не так. Вы что-нибудь заметили? 4. Более универсальный узел управления камерой Разве цель КОВ не заключается в повышении уровня повторного использо- вания программного обеспечения? Теперь узел визуального распознавания можно использовать повторно, а узел управления камерой, кажется, нет. Каждый раз, когда меняется камера, нужно менять узел управления, не так ли? Эго никуда не годится!
Стандартный драйвер для ЪГЗВ-камер является универсальным, и он уже интегрирован в КОЗ. Достаточно выполнить следующую команду для его установки. Независимо от типа камеры, если она соответствует стандарту НЗВ, можно использовать узел управления камерой в КОЗ для публикации стандартных тем изображений. $ 5С|бо зрГ спзГаИ гоз-заггу-изЬ-сап Если вы используете зиртуальную машину, необходимо сначала подключить камеру к виртуальной машине: нажмите параметр Виртуальная машина в строке меню, вы- берите Подключаемые устройства, найдите модель камеры, которую нужно подклю- чить, и нажмите Подключить Таким образом, код еще более упростился: теперь вместо ранее использо вавшегосяузла публикации изображений применяется более универсальный узел драйвера камеры. При этом изменение узла обнаружения объектов не требуется. Ниже приведены команды для запуска, результат работы идеи тичен рис. 2.31. $ гоз2 гип иьЬ_саг1 изЬ_сап_по1е_ехе $ гоз2 гип 1еагп1пс|_гор1с Горгс_иеЬсап_5и1? Это и есть то, что мы неоднократно упоминали как «развязка», которая способствует стандартизации программного обеспечения и облегчает обмен и использование его функций. 2.6. Службы: взаимодействие между узлами в формате «вопрос-ответ» Коммуникация с помощью тем позволяет осуществлять однонаправлен ную передачу данных между несколькими узлами КОЗ 2. Используя этот асинхронный механизм связи, издатель не может точно знать, получил ли подписчик сообщение. В этом разделе будет рассмотрен другой распростра пенный механизм связи в КОЗ 2 - служба (Зепйсе), который позволяет реа- лизовать синхронное взаимодействие в формате «вопрос-ответ». 2.6.1. Что такое служба В приложении с тематической коммуникацией один узел управляет камерой и публикует темы изображений, а другой узел подписывается на эти темы для распознавания красных объектов на изображениях.
На основе вышеописанного процесса, как показано на рис. 2.32, информа- цию о положении целевого объекта можно передать на верхние уровни при- ложения робота, например для следования за объектом или перемещения к его позиции. В этом случае очевидно, что нет необходимости постоянно подписываться на получение этой информации. Достаточно отправить за- прос на получение актуальной позиции объекта, когда это необходимо. Ответ с расположением яблока Запрос расположения яблока Рис. 2.32 ❖ Вызов службы для взаимсдейс_вия между узлами Этот механизм связи в КОЗ 2 называется службой: при необходимости отправляется запрос, и в ответ приходит ответ. Взаимодействие происходит по модели «вопрос-ответ». 2.6.2. Модель коммуникации посредством службы Формат «вопрос-ответ» называется моделью коммуникации через службу, и ее основа - это клиент-серверная модель, сокращенно С/8. На рис. 2.33 схематично изображено, как клиент, нуждаясь в определенных данных, от- правляет запрос в конкретную службу. А сервер, предоставляющий эту служ- бу, после получения запроса обрабатывает его и отправляет ответ. Эта коммуникационная модель часто встречается и в повседневной жизни. Например, когда мы просматриваем различные веб-страницы, браузер на нашем компьютере выступает в роли клиента, который с помощью домен- ного имени отправляет запросы на сервер сайта. Сервер, получив запрос, возвращает данные страницы, которые необходимо отобразить, и только тогда мы сможем увидеть обновленную информацию. Клиент-серверная модель обладает следующими особенностями.
(Сервер службы) Мойе (Узел) Рис. 2.33 ❖ Модель коммуникации посредством службы 1. Синхронная коммуникация Когда мы выходим в интернет, а в браузере «крутится» значок загрузки, это означает, что сервер вышел из строя или возникли проблемы с сетью. В от- личие от связи с помощью темы, в коммуникации по службе клиент может определить состояние сервера по его ответу - это и называется синхронной коммуникацией. 2. Коммуникация «один ко многим» Возьмем, к примеру, сайт ^нуиеЬоте.сот, посвященный изучению КОЗ. Веб- сервер уникален, и нет других таких же сайтов. Однако посетители сайта не уникальны, и все они видят один и тот же интерфейс. Таким образом, в модели коммуникации по службе сервер является уникальным, а клиентов может быть много. 3. Интерфейс службы Как и в случае с коммуникацией по теме, основой коммуникации по службе является передача данных, которые делятся на две части: данные запроса и данные ответа. В КОЗ 2 эти данные, как и сообщения темы, требуют стан- дартного определения: темы определяются в файлах П18§, а службы - в фай- лах ЖГУ. ЛК Методы определения интерфейсов коммуникации будут подробно рассмотрены в разделе 2.7 этой книги.
2.63. Пример программирования коммуникации посредством службы Теперь, когда мы познакомились с основными понятиями и областями при- менения коммуникации по службе в КОЗ 2, приступим к написанию кода. Начнем с относительно простого примера - реализации функции сложения через службу. Условие этого примера заключается в следующем: клиент публикует два числа, а сервер, получив данные, возвращает клиенту результат их сложения. Более конкретно: клиентский узел упаковывает два слагаемых в данные за- проса и отправляет их в службу асМДхуощпЩ.Узел сервера, предоставляющий эту службу, получает данные запроса, выполняет сложение и упаковывает результат в данные ответа, которые возвращает клиенту. После этого клиент получает желаемый результат. Давайте посмотрим на результат выполнения примера. Откройте терми- нал и выполните следующую команду для запуска узла сервера, который будет ожидать данные запроса и предоставлять функцию сложения. $ гоя2 гип Теагпгпдзегуссе ьеп/гсе_ас1с1ег_5ег7ег Затем откройте второй терминал и выполните следующую команду для запуска узла клиента, который отправит два слагаемых и будет ожидать ре- зультат сложения. $ гоз2 гип 1еагпгпд_<.егу1се ьегугсе_ас1с1ег_с1геп1: 2 3 На рис. 2.34 мы видим, что клиент опубликовал запрос, содержащий два слагаемых 2 и 3. Сервер, получив этот запрос, быстро выполнил операцию сложения и вернул 5 в качестве ответа клиенту. ГИ гозгфдиуцеНоте: О = □ х гоз2@диуиеЬоте:~/деу_н5$ гоз2 гип Хеагпхпдзегухсе 8егухсе_адс1ег_8ег7ег [ХМЕО] [1730648850.587783845] [5егухсе_адс1ег_8егуег]: Хпсопхпд гедиезТ а: 2 Ь: 3 1 ГП го52@)диуиеЬоте: - О = - О х го52@диуиеЬоте:~$ гоз2 гип 1еагпхпд_8егухсе 8егухсе_адбег_с1хеп1: 2 3 [ХЫЕО] [1730648850.686752424] [8егухсе_аддег_с1хеп1:]: КезиН оГ а<1(1_1мо_1п15: То г 2 + 3 = 5 го52@диуиеЬоте:~$ Рис. 2.34 ❖ Схема работы службы для сложения чисел Как же эти два узла реализуют операцию сложения через службу? Для этого необходимо изучить методы программирования клиента и сервера.
2.6А Программирование клиента (Ру1Ноп) Рассмотрим реализацию клиентской части, Код на РуШоп находится в файле кагшп^.чепйсе/зепйсеасМегсКепНру и подробно разобран ниже, спрогс зуз тпрогт гс1ру # Библиотео РуБбоп-интерфейс? КОЗ 2. бгоп гсбру.побе тпрогб 1Чос1е # Клосс узла КОБ 2. бгоп 1еагпбпд_гпсегбасе.згу тпрог! АбббиоГпбз # Пользовательский интерфейс службы. сбазз абаегСИепС (Мобе): беб__бпбб__(зебб, папе): зирег()._тптб_(папе) # Создание клиента (тип интерфейса службы, имя службы). зебб.сТгепб = зе'И.сгеабесКепЦАбсПиоШз, 1 абб_Тио_бпбз1) # Цикл ожидания запуска сеовера. иЬНе пот зе1Б.с1ЛепС.иа1С_Бог_5егутсе(Сгпео1'С_зес=1.0): зе1б.деб_1оддег().тпбо( 'зегубсе поб ауаНаЫе, шатДспд адатп1) # Создание объекта запроса к службе, зебб.гециезб - АббТно1пбз.Рецеезб() # Создание функции отправки запроса к службе. беб зепб_гецие5б(зе1б): зебб.гедиезс.а = бпб(зуз.агду[1]) зебб.гедиезт.Ь = бпб(зуз.агду[2]) # Асинхронная отправка запроса к службе, зебб. бибиге = зе1б.с1белС.са1'1_азупс(зе1б.гедиезб) беб пасп(агдз=Мопе): гс1ру.спбб(агдз-агдз) а Инициализация Рубкой-интерфейса КОЗ 2. побе = аббегС1ЛепС("зегубсе_аббег_с1.1епС") # Создание и инициализация экземпляра узла КОЗ 2. побе.зепб_гедиезб() # Отправка запроса к службе. ибббе гс!ру.ок(): # Проверка, работает ли система КОЗ 2. гсбру.зртп_опсе(побе) “ Однократная обработка событий узла, бб побе.бибиге.бопе(): # Проверка, получен ли результат, бгу: гезропзе - побе.бибиге.гезиббО # Получение результата от сервера, ехсерб Ехсертбоп аз е: побе.дег_1эддег()Лпбо( 'Сбои при вызове службы %г' % (е,)) е1зе: побе.деб_1.оддег()Лпбо( # Вывод полученного результата. 'КезиТб об адб_био_гпбз: %б + %б = %б' % (побе.,‘еоие5б.а, поОе.гециезб.Ь, гезропзе.зип)) Ьгеак побе.безбгоу_побе() # Уничтожение экземпляра узла. гсбру.зЬиббо1л/Г'() # Завершение работы РубЬоп интерфейса Р05 2. На основе приведенного кода можно выделить основные этапы реализа- ции клиентской части в процессе коммуникации по службе, как показано на рис, 2.35.
Инициализация Создание . _ - к Создание . _ . Уничтожение Создание объекта Ожидание ответа программного и инициализация и отправка узла и закрытие . - , клиента г “1Г от сервера 7 .. интерфейса узла данных запроса г интерфейса Рис. 2.35 ❖ Процесс реализации клиентской части в механизме коммуникации посредством службы Сначала необходимо произвести инициализацию среды КОЗ 2 и настроить интерфейс коммуникации КОЗ 2. Затем создается и инициализируется экзем- пляр узла, включая установку необходимых параметров и инициализацию компонентов. Далее с помощью метода сгеа1е_с11еп1() создается объект кли- ента, для чего необходимо задать тип интерфейса и имя службы. После это- го считываются два пользовательских данных из терминала и помещаются в запрос, который затем отправляется с помощью метода саП азупсДецнезГ). При завершении работы узла все компоненты останавливаются, экземпляр узла уничтожается, а среда КОЗ 2 закрывается для освобождения ресурсов. 2.6.5. Программирование сервера (РуТНоп) Теперь рассмотрим реализацию серверной части. Код на РугНоп находится в файле 1еагп1п§_зе^1се/зегУ1се_ас1бег_зегуег.ру и подробно анализируется ниже. тлрогС гс!ру # Библиотека РугЬоп-интерфейса КОЗ 2. Ггоп гс1ру. псс)е тпрогб Иосе # Класс узла Р.05 2. Ггоп 1.еагп1пд_гпГегГасе.5Г7 тпрогб ЛббТнсГпбз # Пользовательский интерфейс службы. сТазз абоег5ег7ег(Мобе): беб___тптЛ__(зеИ, папе): зирег().__тпИ____(папе) # Создание объекта сервера (тип интерфейса, имя службы, функция обратного вызова). зеИ.згу = 5еИ.сгеабе_5ег7бсе(АббТыо1пб5, 'абб_тио_тпгз', 5еИ.аббег_са11Ьаск) # Создание функции обратного вызова для обработки входящего запроса. беб аббег_са1'1Ьаск(зе1Г, гецоезб, гезропзе): # Выполнение операции сложения и помещение резулотата в отвей гезропзе.зип = гециезб.а + гециезб.Ь # Вывод информационного сообщения о полученном запросе. зеИ.уеб_1оддег().тп1:о(1псО|Лгпд гециезб\па: %б Ь: %б' % (гедиезб.а, гециезб.Ь)) # Возврат ответа. гебигп гезропзе СеГ паиЧа,дз-бопе): а Главная функция, точка входа для узла КОЗ 2 гсГру.Гп1б(агдз=агдз) # Инициализация Рутбоп-интерфейса КОЗ 2. пабе - аббег5ег7ег("зегу1се_абаег_зег7ег") # Создание и инициализация экземпляра узла КОЗ 2. гс!ру.зр1п(побе) # Запуск цикла обработки событий до завершения работы КОЗ 2. побе.безбгоу_побе() # Уничтожение экземпляра узла. гсГру.збиббо1л1,т() # Завершение работы РубЬоп-интерфейса КОЗ 2. На основе приведенного кода можно выделить процесс реализации сер верной части, как показано на рис. 2.36.
Инициализация программного интерфейса . Создание |Ь и инициализация узла Создание объекта сервера Обработка службы через функцию обратного вызова Передача . Уничтожение ответа [ узла и закрытие клиенту интерфейса Рис. 2.36 ❖ Процесс реализации серверной части в механизме посредством службы Сначала необходимо произвести инициализацию среды КОЗ 2 и настро- ить интерфейс коммуникации КОЗ 2. Затем создастся и инициализируется экземпляр узла, включая установку необходимых параметров и инициализа- цию компонентов. Далее с помощью метода сгеаГе_8епчсе() создается объект сервера, для чего необходимо задать тип интерфейса службы, имя службы и функцию обратного вызова сервера. Затем сервер ожидает данные запро- са от клиента и после их получения переходит в функцию обратного вызова для обработки службы, передавая обработанный результат обратно клиенту. При завершении работы узла все компоненты останавливаются, экземпляр узла уничтожается, а среда КОЗ 2 закрывается для освобождения ресурсов. 2.6,6, Программирование клиента (С++) Клиента с аналогичной функциональностью можно реализовать и с по- мощью С+4. Пример выполнения показан па рис. 2.37. I о52@>д<1уиеЬоте: - 3 52@диуие1юте:-$ гоз2 гип 1еагп1пд_5егу1се_срр 5егу1се_асЫег_с11еп1: 2 3 ДИЮ] [1721530999.297282542] [гсТсрр]: 5ип: 5 го52@диуиеЬопе: -= Рис. 2.37 ❖ Пример запуска клиента спужбы (С++) Полный код можно найти в файле 1еагтп2_8ег\чсе_срр/«гс/8егу1се_а(1(1ег сИепГ.срр. #\.пс1ис1е "гс1срр/гс1срр.Нрр" // Б.-блистека интерфейса Р05 2 на С++. /Нпс'Ые " 1еагргпд_1п1егГэсе/5Гу/а<1с1_б«о_1п1:5.Ьрр" // Пользовательский интерфейс службы. #тпс!ис1е <сбгопо> #тпс1ис1е <сзгсИгЬ> #\.пс!ис1е <пепогу> изхпд папезрасе зЩ: :с1мопо_Ше-а15; гпС патп(т.п+ агос, сЬаг **агду) { // Инициализация интерфейса Р.05 2 на С++. гекерр: мптЦагдс, агду); И (агде != 3) { Р.С1СРР_Л1Б0(гс1срр: :уеб_1оддег("гс1срр"), "изаде: зегугсеасМеГ-СИепб X V"); гебигп 1;
} // Создание и инициализация узла КОЗ 2. зтб: :зЬагеб_р1:г<гс1срр: :Побе> побе = гсТсрр: :Мобе: :паке_з1|агеб("зегугсе_абЦег_сие|Д''); // Создание клиента (тип интерфейса службы, им службы). гсЕсрр. :С1гепС<1еагп1пд_1лбегбасе: :згу: :АааТмо1п1:5>::ббагесРЕг сИепб = побе->сгеаТе_с'1гегЛ<1еагп1лд_гпСегбасе. :згу: :АббТио1пС5>("абб_Е|л1О_1пбз"); Ц Создание объекта запроса к службе. аебо гедиезС = збб: :паке_ьНагей<1еагпбпд_тп1:егбасе: :$гу: :Аббт1л/с1пбз: :КедиезЕ>(); гедиезб->а = агоЩагдуЦ]); гедае$С->Ь = або'11(агду[2]); // Цикл ожидания запуска сервера службы. иЩе (!с1тепб->1л1аи_1:ог_5егигсе(15)) { И (!гс!срр::ок()) { РСЕСРР_ЕКК0К(гс1срр: :деб_1оддег(''гс1срр''), "ШеггирТес! иЬПе иаШ.пд бог Ебе зегутсе. ЕхтЛгпд.'); гебигп 0; } КСЕСРР'_^Е0(гс1срр: :деб_1оддег("гс1срр"), 'зегутсе поб ауаПаЫе, наШпд адагп.. } // Асинхронная отправка запроса к службе. аибо гезиП = с1.кепг->а5упс_зепб_гедие51(гедиезг); // Получение ответа от сервера службы. тб (гсТсрр:: зргп_ипЕЕ1_би1:иге_сопр1ебе(побе, гезиП) == гсТсрр::ЕибигеРеЕигпСоЦе::$ОССЕ$$) { // Вывод полученного результата. ЕСЕСРР_^Е0(гс1срр:'деТ_1оддег("гс1срр"), "5цп: %1б', гезиИ.дег()->зип); } е1зе { РСЕСРР_ЕКР0К(гс1срр: :деб_1оддег("гс1срр"), "ЕатЪеб Со саП зегугсе асШ__гпбз''); } // Завершение работы интерфейса КОЗ 2 на Сн+. гсЕсрр • • зЬибс1о1л/п(); гебигп О: } Комментарии к коду подробно объясняют каждую строку, а процесс реа- лизации полностью аналогичен версии на Руг1юп, поэтому мы не будем по- вторно на этом останавливаться. 2.6.7. Программирование сервера (С++) Пример выполнения серверной части, реализованной на С++, показан на рис. 2.38.
ГП го 5 2 (Ф д цу и еН о те: -/^еу_'*5 О = □ х ^о52@диуиеЬоте:~/(^еV_ы5$ гоз2 гип 1еагп1пд_зег7т.се_срр 5егу\се_аддег_5ег7ег [1МЕ0] [1730648959.569098778] [гсТсрр]: Реаду Ю адд гпСз. [1МЕ0] [1730648988.200961613] [гсХсрр]: Тпсопйлд гедиез! а: 2 Ь: 3 [1ЫР0] [1730648988.201623104] [гсХсрр]: зепдхпд Ьаск гезропзе: [5] Рис, 2.38 ❖ Пример запуска сервера службы (С++) Полный код можно найти в файле 1еагпт§_8егУ1се_срр\8гс\8епйсе_ас1с1ег зегуег.срр. #1пс1ис1е "гс!срр/гсХсрр.Нрр" // Библиотека интерфейса С++ РОЗ 2. #т.пс1ис1е "1еагргпд_1пГегбэсе/зг7/а(1б_б«о_Гпб5.крр" // Пользовательский интерфейс службы. #тпс1абе <11е1'1огу> Ц Создание функции обратного зызсва, обрабатывающей входящие запросы. уотб аббегЗегуег(сопзб з1с1: :зйагес1_рГ:г<1еагпгпд_гпсегбасе: :згу: :АсИТиохпбя: :Редсезб> гецнезг, зГб: :зЬагес1_р1:г<1еагп1пд_1М:егГасе: :$гу:;АЬсПйоГпГз: :Кезропзе> гезропзе) { Ц Выполнение операции сложения и помещение результата в ответ. гезропзе->зип = гедиезб->а + гедиезб->Ь; // Вывод информации о входящем запросе. КС1.СРР_1НЕ0(гс1.срр: :деГ_1оддег(''гс1срр"), "Гпсопгрд геаиезЦпа: %1Ф Ь: %И", геднезт-аа, гедиезб->Ь); // Вывод отправляемого ответа. ПС1СРР_]МР0(гс1срр: :деб_1оддег(''гс1срр"), "зепсКпд Ьаск гезропзе: [Ш]1', (Гопд тпб)гезропзе->зин); } // Главная функция точка входа для узла КОБ 2. тп+ на1п(т.пг агдс, сбаг **агду) { // Инициализация интерфейса Р.08 2 на С++. гсЕсрр: ДптЦагдс, агду); // Создание и инициализация узла 405 2. веб: :зЬагес1_р1:г<гс1.срр: :Е1ос1е> поСе = гсГсрр::Моде: :паке_зйагес1(''5егу1се_абс1ег_5ег7ег'); // Создание сервера службы (тип интерфейса, имя службы, функция обратного вызова). гсТсрр: :5егуГсе<1еагптпд_ГпГегГасе: :згу: :Ас1с1Тйо1п65>::ЗЬагебРбг зегутсе = поСе-^сгеате_5ег7Гсе<1еагптпд_спгегГасе: :згу- :А^Тио1п-(:5>( "абс1_Г|Н0_гпГ5' , &ас1с1ег5егуег); КСГСРР_1ПР0(гс1срр: :деб_1оддег("гс1срр"), "Кеас1у Го ас!с Ъло тпгз1'); // Запуск цикла обработки событий до завершения работы РОЗ 2. гсГсрр::зрт.п(пос1е); // Завершение работы интерфейса С++ Р,С5 2. гсЕсрр::зКибсЮип(); }
Комментарии в приведенном выше коде подробно объясняют значение каждой строки, а процесс реализации полностью аналогичен версии на Ру- Шоп, поэтому мы не будем повторно на этом останавливаться. 2.6.8. Команды для работы со службами Команды НОВ 2, связанные со службами, обозначаются как зегутсе. Ниже при- ведены наиболее часто используемые операции. $ гоз? зегутсе 1АзГ * Просмотр списка служб. $ гоз2 зегутсе Гуре <зе171се_папе> # Просмотр типа данных службы. $ гоз? зегуссе саП <зег7тсе_папе> <зегУ1се_Гуре> <зег71се_баба> # Отправка запроса к службе. Во время работы клиента и сервера в примере службы из этой главы можно использовать команды ИзГ, Гуре и саП для просмотра списка текущих си- стемных служб, интерфейса данных конкретной службы и отправки запроса к службе. Результаты выполнения команд показаны на рис. 2.39. ГЛ го52@диуиеЬоте: ~ С} — □ х го52@диуиеЬоте:~$ гоз2 зегухсе Из! /адд_Гио_1п<:5 /5егугсе_аддег_зег7ег/с1е5сг1Ье_рагапе1:ег5 /5егугсе_аддег_5ег7ег/де1_рагате1:ег_(:уре5 /5е™1се_ас1<1ег_5ег7ег/де1:_рагате{:ег5 /5е™1се_а<1<1ег_5е™ёг/деХ_Хуре_де5СГ1рХгоп /5егу1се_а<1с1ег_5егуег/'1151_рагате1:ег5 /5егугсе_а<1<1ег_5ег7ег/5е1:_рагате1:ег5 /зегу1се_ас1дег_5ег7ег/5е1:_рагате1:ег5_а1:отт.са11у гоз2(адиуиеЬояе:~$ гоз2 зегухсе ^уре /адд_Хмо_1п15 1еагп1пд_1п11егТасе/5Гу/Ас1с1Тно1п1з го52@диуиеЬопе:~$ гоз2 зегухсе саП /а<1(1_1но_1п1:5 1еагп1пд_1п1егТасе/5ГУ/Ас1Лмо] пХз "{а: 2, Ь: 2}" гедиез^ег: пакхпд гедиез!: 1еагп1пд_1п1:ег1?асе.згу.А<й!Тио1п1:з_Яедие5<:(а=2, Ь=2) гезропзе: 1еагп1пд_1п1:ег1:асе.5ГУ.Ас1дТмо1лХ5_Ке5роп5е(5ит=4) го52@диуиеЬопе:~$ Рис. 2.39 ❖ Результат выполнения команд для работы со службами 2.6.9. Пример использования службы: обнаружение цели (по запросу) В разделе 2.6.1, где обсуждался механизм коммуникации посредством служ- бы, упоминалось, что пример с обнаружением цели на основе темы посто- янно использует вычислительные ресурсы. Однако гораздо более эффектив- но делать запрос только при необходимости получения позиции цели. На рис. 2.40 показано, что пример обнаружения цели на основе службы вклю- чает следующие три узла:
1) узел драйвера камеры: используется для публикации данных изобра- жения; 2) узел визуального распознавания; действует как сервер подписки на данные изображений и готов предоставить местоположение цели в лю- бое время; 3) узел запроса клиента: отправляет запрос на обнаружение цели. ОНепГ (Клиент) Рис. 2.40 ❖ Архитектура коммуникации для примера по обнаружению цели (по запросу) 8еп/ег (Сеовер) 1. Результаты выполнения Можно ли реализовать функцию, удовлетворяющую нашим требованиям? Для этого необходимо запустить три терминала, чтобы запустить указанные выше три узла. # Узел драйвера камеры. $ гов2 гип изЬ_сап изЬ_сап_пос1е_ехе # Узел визуального распознавания. $ гов2 гип 1еагп1пд_5ег71се ьег7гсе_оо]ес(:_5егуег # Узел запроса клиента. $ гоз2 гип 1еагпспд_5егу1се ьег7гсе_оо]ес(:_с1.гепС После запуска можно увидеть результаты обнаружения, как показано на рис. 2.41. Если цель успешно обнаружена, клиент выведет координаты, полу ченные от сервера. го52@дцуие1юте:~/<1еу_н5$ гоз2 гип !еагпгпд_5егу!се зегу!се_оЬ]ес*_с!!еп* [1МЕ0] [1721233189.630592436] [зегу!се_оЬ]ес!_с!!еп!]: зегу!се по! ауаНаЫе, иах*гпд ада хп... [1МЕ0] [1721233190.633831010] [зегу!се_оЬ]ес!_с!геп!]: зегуЁсе по! амаИаЫе, иахМпд ада гп... [1МЕ0] [1721233191.638160599] [5егу!се_оЬ]ес!_с!1еп!]: зегугсе по! ауаИаЫе, иатЛгпд ада !п... [1МЕ0] [1721233192.641870109] [зегу!се_оЬ]ес!_с!геп!]: зегухсе по! ауаИаЫе, наг!гпд ада гп... [1МЕ0] [1721233193.663984513] [зегугсе_оЬ]ес!_с!геп!]: Рези!* о* оЬдес! розгМоп: х: 431 у: 224 Рис. 2.41 ❖ Результат обнаружения цели 2. Анализ кода клиента Полную реализацию клиентского кода можно найти в файле 1еатп1п§_8егУ1се/ 8егу1се_оЬ]ес1_с11еп1.ру. Ниже представлены основные моменты.
с!авв оЬзесССИепбСМобе): беб___гпИ___(веИ, папе): вире'().__г пи_(папе) # Создание клиента (тип интерфейса службы, имя службы). ье!Г.сИепб = 5еИ.сгеаСе_с11епг(СеИ35]есСРс'5Шо11, 'деб-ГагдеТ-розИлоп') # Цикл ожидания запуска сервера службы. иЬПе поб зеИ.сИеп1:.иаи_бог_5егу1се(1:гпесиС_5ес=1.0): 5еИ.деС_1оддег().1п-Ео(зегугсе пор ауайабЕе, ^аСТспд адагп... ) # Создание объекта запроса к службе. веИ.гедиевб = ОеГОо]есСРовШоп.КедиевС() <М вепб_гедиевб(ве1б): веИ.гедиеЛ.деЕ = Тгие # Асинхронная отправка запроса к службе. веИ.биСиге = веИ.сИепСсаи_авупс(ве1Г гедиевб) оеб па1п(агдз=1№пе;: гс1ру.иЛ(агдв-агдв) # Инициализация интерфейса РОЗ 2 на Рубтоп. побе - оЬ]ессСиепб(''вегу1се_оЬдесс_с11епб") в Создание и инициализация узла КОЗ 2. пэбе.вепб_гедзевС() иЫ1е гс!ру.ок(): гс1ру.вртп_опсе(побе) # Проверка завершения обработки данных. 16 псбе.бЛоге.бопе(): тгу: гевропве - побеЛиСиге.геви'Щ) # Получение ответа от сервера службы, ехсерб Ехсериоп ав е: побе.де1_1сддег()Лп1:о( 'Зегутсе саП баПеб %г' % (е,)) е!ве: побе.де1_1сддег()Лпбо( # Вывод полученной информации. 'КевиИ об оодесб ровтог,:\п х: %б у: %сГ % (гевропве.х, геврспве.у)) Ьгеак побе.6е51гоу_побе(} # Уничтожение экземпляра узла. гсСру.ь1гЛс1о1л1'Т() # Завершение работы интерфейса РОЗ 2 на РуЩэп. В приведенном коде с помощью метода сгеаГесЕепЦ) создается объект клиента службы, после чего создается запрос данных, связанный с именем службы йе1_1аг§е1_ро8111оп. Затем с помощью метода саП азупсО запрос от- правляется и ожидается ответ от сервера. 3. Анализ кода сервера Код сервера находится в файле 1сагшп§_8егУ1се/ зегУ1сс_оЬ)ес1:_8сгуег.ру. Ниже представлены основные моменты. сТавв 1таде5зЬвсггЬег(Мобе): бвб___тпП___(веИ, папе): вирег().__гпИ__(папе)
# Создание подписчика (тип сообщения, имя темы, функция-обработчик, длина очереди). 5«И.5мЬ = '>е'И.сгеаЩ_зиЬзсггр1:т.оп( Тпаде, '1паде_гаиг, ьеК. ссзСегег саИоаск, 10) # Создание объекта преобразования изображении для конвертации между ОрепСУ и сообщениями Р05, ее!б.С7_Ьгг<1де - СуВпбде() # Создание сервера службы (тип интерфейса, имя службы, функция-обработчик). зеТб.ъгу = 5еИ:.сгеабе_5ег7тсе(СесОЬ]ессРо5Ш.оп, деТ_1:агде1:_ро5Шоп', 5еИ.оЬ]есС_ро5Т.С1оп_са11Ьаск) зеИ.оЬдесСХ = 0 зеТТ.оЬдесгУ - 0 # Создание функции-обработчика, выполняющей обработку данных после получения запроса. беГ оЬтесС-розШоП-СаИЬасЦвеИ, гедоезб, гезропзе): тТ гедоезб.деб -- Тгие: гезропзе.х - зеИ.оЬтесгХ » Координаты X и V целевого объекта. гезрспзе.у - зеИ.оЬдесСУ 5е1б.дег_1од;ег().1п(о( 'ОЬдесг ро5т.1:т.оп\пх: Кб у: %б' % (гезрспзе.х, гезрэпзе.у)) е!ъе: гезрспзе.х - 0 гезропзе.у = О зе1€.деб_1оддег().спбо(' 1пуа1Лб сотапб') гегигп (езропзе # Ответ на запрос. В этом коде осуществляется подписка на тему 1та§е_гаш для получения сообщений с изображениями. В функции обратного вызова темы с помощью ОрепСУ выполняется обработка изображений и обнаружение объектов, вы- числяются и записываются координаты центра обнаруженного объекта. Кро- ме того, предоставляется интерфейс службы, которая через службу ^еС_1:аг- §е1_ро8Йлоп при получении запроса от клиента возвращает информацию о координатах положения объекта. Также код отображает обработанное изображение, включая контуры объ- екта и точку центра, чтобы наглядно продемонстрировать результаты обна- ружения. 2.7. Интерфейсы коммуникации: стандартная структура передачи данных В темах и службах ВОЗ, а также в действиях, которые мы рассмотрим в раз- деле 2.8, используется важная концепция - интерфейс коммуникации.
2,7.1, Что такое интерфейс коммуникации Коммуникация - эго не монолог, а обмен информацией между двумя или более участниками. Для облегчения понимания можно определить стан- дартную структуру для передаваемых данных - это и есть интерфейс ком- муникации. С понятием «коммуникация» разобрались, теперь рассмотрим смысл ело ва «интерфейс». Интерфейсы встречаются повсюду, как в аппаратной, так и в программной среде. Например, в повседневной жизни это розетки и вил- ки, штекеры и разъемы, которые должны соответствовать друг другу, см. рис. 2.42.И5В-интерфейсы на компьютерах и телефонах, такие как М1сго-И5В и Туре-С, также относятся к аппаратным интерфейсам. Рис. 2.42 ❖ Аппаратные интерфейсы в повседневной жизни В программной разработке интерфейсы используются еще шире. При на- писании программ функции и их входные и выходные данные также назы- ваются интерфейсами, как показано на рис. 2.43. Каждый вызов функции со- единяет основную программу и вызываемую функцию через интерфейс, что позволяет системе работать корректно. Еще более наглядно это представлено и51пд папезрасе 1пк 1«1п()//гй^ < 1п1 пах(1п€ а,1п1 ЬДпЪ с) Топд пах(1опд а,1опд Ь,1опд с); 1пС Й1,61,01,11; с1п »А1 >>В1 »С1; 11-пах(Й1,В1,С1);//^©^ сот «•'ЫН-" «11 «еп<11; юпд А2,82,02,12; с1п »А2 »В2 »С2; 12-пах(А2,В2,С2); сои! «“1п112-” «12 «епс11; > Рис. 2.43 ❖ Программные интерфейсы при разработке программного обеспечения
в графическом программировании, где каждый программный модуль имеет фиксированную структуру и форму, и только при их совпадении они могут работать вместе, что очень удобно для визуализации кода. Таким образом, интерфейс - это отношение, при котором соединение воз- можно только при взаимном соответствии. Вернемся к коммуникационной системе КОВ, ее основная цель - передача данных, что требует от всех узлов создания эффективных соединений и точ- ной упаковки и разбора передаваемых данных. Такие механизмы, как темы и службы, были созданы для этой цели, и все передаваемые данные должны соответствовать стандартному определению интерфейса коммуникации, как показано на рис. 2.44. Рис. 2.44 ❖ Интерфейс коммуникации в КОЗ Например, тема изображения, публикуемая драйвером камеры, состоит из значений трех основных цветов К, С и В для каждого пикселя. Команды скорости для управления движением робота состоят из линейной и угловой скоростей Службы для настройки робота включают параметры конфигура ции и результаты обратной связи и т. д. НОВ содержит подобные часто ис- пользуемые определения, но вы также можете создавать свои собственные. Эти интерфейсы коммуникации, хотя и выглядят как ограничения, явля ются важнейшей частью КОВ. Например, при использовании узла драйвера камеры вам не нужно беспокоиться о том, как он управляет камерой, до- статочно выполнить команду, чтобы узнать формат публикуемых данных изображения, и быстро приступить к разработке приложений. Аналогично пульт дистанционного управления можно оснастить пакетом драйверов КОВ, и не важно, как это будет реализовано, главное, что он публикует линейную и угловую скорости, которые можно использовать для управления движени- ем робота.
Интерфейсы коммуникации позволяют снизить зависимость между про граммами, облегчая использование узлов друг другом, что и является основ- ной идеей НОЙ - уменьшение необходимости «заново изобретать велосипед». В НО8 существует три основных механизма связи: темы, службы и дей- ствия. Благодаря интерфейсам коммуникации, определенным в каждом из этих механизмов, различные узлы могут органично связываться друг с дру- гом, формируя целостную систему робота, как показано на рис. 2.45. Рис. 2.45 ❖ Определение интерфейса коммуникации 27.2. Определение интерфейсов коммуникации Интерфейсы коммуникации в КОБ не зависят от языка программирования, чтобы обеспечить возможность использования различных языков для каждо го узла. Йй32 обозначает 32-битное целое число, т164 - 64-бигное целое чис- ло, Ьоо! - булево значение, как показано на рис. 2.46. Также можно определять .массивы и структуры, которые в процессе компиляции автоматически пре- образуются в соответствующие структуры данных для языков С++ и РуШоп. Определение интерфейса коммуникации для темы осуществляется с по- мощью файлов .шзу. Поскольку передача данных односторонняя, необходи мо описывать только передаваемый кадр данных. На рис. 2.46 определены два 32-битных целых числа хи у, которые могут использоваться для передачи данных, таких как координаты на плоскости. Определение интерфейса коммуникации для служб осуществляется с по- мощью файлов ,5гу, которые включают части запроса и ответа, разделенные тремя дефисами «---». Например, для функции сложения, изученной ранее, данные запроса состоят из двух 64-битных целых чисел а и Ь, а данные от- вета - из результата сложения япт.
# Данные коммуникации 1п132 х т(32 у тема (файл .гпзд) № Данные запроса 1П164 а 1п164 Ь # Данные ответа 1п164 вит служба (файл .во/) # Цель Ьоо1 епао1е # Результат Ьоо1 Г|П1зб # Обратная связь 1П132 Ь1а1е действие (файл .асГоп) Рис. 2.46 ❖ Пример определения интерфейса коммуникации КОЗ 2 Действия представляют собой другой механизм связи, используемый для описания процесса движения робота, и определяются с помощью файлов .асДоп. Например, для поворота черепахи на 90°, с периодической обратной связью о текущем состоянии, интерфейс определяется тремя частями: 1) цель действия: например, начало движения; 2) результат действия: например, завершен ли поворот на 90°; 3) периодическая обратная связь действия: например, каждую 1 секунду сообщается, достигнут ли угол поворота 10°, 20° или 30°, чтобы другие узлы знали о прогрессе выполнения действия. Возможно, вам интересно, какие именно интерфейсы коммуникации определены в КОЗ? В каталоге установки КОЗ в папке зйаге содержится мно- жество определений стандартных интерфейсов, как показано на рис. 2.47 < МЬипки / орк / ГО5 / )аиу / хНаге / деотекгу_т5дз / тзд И еф _ а х й АссеЫб! @ АссеЦзоп Й Ассе1.т$д й Ассе15катр еблб1 (о) Ассе15катр еб )5оп И Ассе13катр еб.тзд й АссеМ 1к1гС оуапапсейб й АссеМФЬС оуапапсе.р оп й Ассе1УДкК оуапапсе.т Ассе1МкНС оуалапсеЗк атреблб! АссеКмФК оуапапсеЗк атреб.)$оп й АссеИлЛкНС оуапапсеЗк атреб.тзд й 1пегк1а <61 @ 1пегк1а.)5оп й 1пегИа.т5д й 1пегк1а5кат реблб! ® 1пегк1а5кат реб.]5оп й 1пегНа5кат реб.тзд й Ротклб! ® РО1П1]5ОП й Ротк.т$д й Ро|’пк32лб1 ® Р01Пк32.)50П й Ро1пк32.тзд й РоткЗкатр еб (61 @ Р01пк5катр еб.]5оп РоткЗкатр еб.т$д й Ро1удоп.1б1 |о| Ро1удоп.)5о п й Ро1удоп.т5 д й Ро1удоп1п$к апселб! о Ро1удоптзк апсе.]5оп й Ро1удотп$к апсе.тзд й Ро(удопШ5к апсеЗкатре б (61 @ Ро1удоп1п5к апсеЗкатре б.)5ОП й Ро1удоп1п$к апсеЗкатре б.тзд И Ро1удоп5ка треб.<61 Ро1удоп5ка треб-)$оп й Ро1удоп5ка треб глад й Розелб! РО5в.]5ОП й Розе, тзд й Ро5е2О.1б1 й РО5е204$ОП й Ро5е2О.тзд В Ро$еАггаул 61 @ РО5вАГГау.)5 оп й Ро5вАггау. тзд й Розезкатре блб1 @ РозеЗкатре б )5ОП й РозеЗкатре б.тзд й РоьеМЛкЬСо уапапселб! РозеМкЬСо уапапсе.)5о й РозеМкЬСо уапапсе.тз Рис. 2.47 ❖ Пример стандартных интерфейсов коммуникаций в КОЗ 2
2,7,3. Команды для работы с интерфейсами коммуникации В КОЗ 2 команды, связанные с интерфейсами коммуникации, обозначаются как пйеНэсе. Ниже приведены основные операции. $ го5? тпТегГасе Нзб # Просмотр списка интерфейсов коммуникации в системе. $ гр$2 тпТегГасе збои <1п1:ег5асе_паае> # Просмотр подробного определения конкретного # интерфейса коммуникации. $ г оз? тпбегГасе раскаде <раскаде_на"1е> # Просмотр определения интерфейсов коммуникации # в определенном пакете. Например, можно посмотреть, какие интерфейсы связи доступны в теку- щей системе, как показано на рис 2.48. ГИ го52@)дцуиеЬоте: ~ О = □ х го52@диуиеЬоте:~$ гоз2 хп^ег^асе Меззадез: ас11оп_тздз/тзд/Соа11пГо асТхоП-тздз/тзд/СоаТЗ^а^из асТ1оп_П5дз/р1зд/Соа15ГаГизАггау ас1т.оп11Ь_тзд8/<пзд/СоаП0 асИопИЬ-Пздз/тзд/СоаТЗ^а^из асЧоп11Ь_тзд5/п5д/Соа181:а1:и5Аггау ас1иа1:ог_т8дз/т5д/Ас1иа^ог8 ас1иа1ог_т8д5/тзд/Ас1:иа1:ог5Апди1агРо5111оп асТиа^оГ-Пздз/тзд/Ас^иаТогзАпдиХагХ/еТосИу ас^иа^оГ-Пздз/тзд/Ас^иа^огзИпеагРозИхоп асХиа^ог^здз/тзд/АсХиа^огзКпеагУеТосИу ас^иа^оГ-Пздз/тзд/Ас^иа^огзМогтаИгед ас<:иаГог_т8д5/тзд/Ас*иа1:ог5Ро81Моп асСиа^оГ-Пздз/тзд/Ас^иа^огзУеХостЛу ЬитИЛП-ХП^ег^асез/гозд/ОигаМоп ЬииНП-Т.п^ег^асез/пзд/Ппе (ЛадпозИс.тздз/тзд/ОхадпозИсАггау сИадпозМС-Пздз/пзд/ОъадпозМсЗХаХиз д1адпо5Т1с_п8д5/тзд/Кеу\/а1.ие ехатр1е_гп1:егГасе8/п8д/Воо1 ехатрТе-гп^ег^асез/тзд/Ву^е ехатрТе-Т-пГег^асез/тзд/Ву^еМиШАггау Рис.2.48 ❖ Просмотр списка интерфейсов связи в системе Также можно отобразить конкретные данные, определенные для интер фейса коммуникации. На рис. 2.49 представлена подробная структура дан- ных сообщения под названием СоаПпГо. Можно также выполнить запрос по какому-либо пакету функций и уз- нать, какие интерфейсы коммуникации в нем определены, как показано на рис. 2.50.
Г+1 гоьгод цуиепоте: - О = п х гоз2@диуиеЬо1"е:-$ гоь2 сгйегГасе зпои асТ1оп_п5дз/пзд/Сод11пГо № СоаС 10 игЛаие-ТДепсСНег ^зд 5/01110 доаГ_1<1 # ит.пТ8Г16] иит.0 № ТГпе нЬеп ТЬе доа! ыаз ассерСеО ЬиСПСп_т.п1егГасез/ТСпе ьСапр СП132 вес испСЗг папозес гоз2фдиуиеЬопе:~$ Рис. 2.49 ❖ Просмотр конкретной структуры данных интерфейса коммуникации гоз2@диуоеЬоп1е;гоз2 гпсегГасе раскаде 1еагпт.(1д_1пгег басе 1еагпт.пд_т.пСег^асе/асгтоп/МоуеСтгс1е 1еагпт.пд_сп1егбасе/|П5д/ОЬ]есСРо5Т.1гоп 1еагп1пд_1пСегГасе/5Гу/СеС0Ь1есСРс-.+1(:т.оп 1еагпт.пд 1пГегГасе/згу/АддТыо1п15 Рис. 2.50 ❖ Просмотр интерфейсов коммуникации, определенных в пакете функций 2.7.4. Пример использования интерфейса службы: запрос координат обнаруженного объекта Ознакомившись с понятием интерфейса коммуникации, расс.мотрим, как определить и использовать интерфейс связи с помощью программного кода. В примере использования службы в разделе 2.6.9 мы написали пример, представленный на рис. 2.51. СНеп1 (Клиент) бегуег (Сервер) Рис 2.51 ❖ Архитектура приложения для обнаружения объекта с помошью службы 1. Результат выполнения В этом примере приложения задействованы три узла. 1. Первый узел управляет камерой и публикует изображения в виде тем. 2. Второй узел реализует функцию визуального распознавания и одно- временно инкапсулирует объект сервера службы для запроса располо- жения объекта.
3. Третий узел отправляет запрос к службе, получает расположение объ- екта и использует эти данные. Результэ г выполнения представлен на рис. 2.52. Для выполнения этих опе- раций можно воспользоваться командами из раздела 2.6.9, го52@диуиеЬоте:-/(1еу_и5$ гоа2 [1МЕО] [1721233189.630592436] 1п... [1ЫРО] [1721233190.633831010] Т.П. . . [1МЕО] [1721233191.638160599] гп... [1ЫЕО] [1721233192.641870109] гп... [1ЫЕ0] [1721233193.663984513] х: 431 у: 224 гил 1еагпгпд_5егу1се 5егу1се_оЬзес1_с1хеп1 [5егу1се_оЬ]ес1:_с11еп1:]: зегухсе по! ауаПаЫе, наШпд ада [2еп/1се_оЬ}есГ_сНел1:]: зегу^се по1 ауаПаЫе, нахНпд ада| [5егу1се_оЬ]ес1:_с1т.еп1:]: зегухсе по1 ауаНаЫе, нах^гпд ада [5егу1се_оЬ]ес1_с1геп1:]: зегухсе по1 ауаПаЫе, шаШпд ада [5егу1се_оЬ]ес1_с11еп1]: КезиИ о!7 оЬзес! розИгол: Рис. 2.52 ❖ Результат выполнения примера обнаружения объекта с помощью службы 2. Определение интерфейса коммуникации В этом примере интерфейс коммуникации определяется в файле СеЮЬ]есЕ- РозШоп.бгу. Определение структуры данных можно найти в файле 1еэгп- т$_т1егГасе/8ГУ/ОеЮЬ(ес1:Ро811:1оп, згу. Определение интерфейса коммуникации для этой службы состоит из двух частей. В верхней части содержится инструкция по получению расположения объекта: если параметр уеЕ установлен в Егие, значит, выполняется запрос на получение текущего расположения объекта, и сервер пришлет ответ со значениями координат х и у. 3. Настройка параметров компиляции Определение интерфейса коммуникации не зависит от языка программи- рования, поэтому необходимо настроить параметры компиляции в файле СМакеЫзЕз.ЕхЕ пакета, чтобы компилятор автоматически генерировал код на различных языках на основе определения интерфейса. Это позволит другим узлам вызывать данный код Ниже приведен .метод настройки. # Поиск зависимого пакета гозгс11_0еЕаи1Е_дрпегаЕог5, который предоставляет функцию # автоматической генерации кода. Нпо_раскэде(го5т<11_бе-Еаи1Е_депегаЕог5 НЕрЛРЕО) # Перечисление файлов интерфейсов коммуникации, которые необходимо скомпилировать. го5тсй_депегаЕе_1.пЕегЕасе5(${РВ03ЕСТ_МАМЕ} "5Гу/СеЦ)Ь]ес1:Ро5Щоп.5Гу“ ) Кроме того, в файле раска§е.хт! пакета также необходимо добавить за висимость от генерации кода, чтобы при компиляции быстро находить не- обходимые пакеты.
<Ьи11с1_с1ерепй>го5Ш_с1е1:аи11:_депега1:ог<,</Ьиис1_<1ере11с1> <ехес_берепб>гозтс11._с1еГаи'1'(:_ги.г|Н.г:е</ехес_с1ербп<1> <пепЬег_о'Г_дгоир>гоь1б1_1п1:егГасе_раскадеь</пеР|Ьег_о<:_дгоир> После завершения настройки можно приступить к компиляции. После успешной компиляции в папке шзГаН рабочего пространства появится авто магически сгенерированный код, как показано на рис. 2.53. Какже вызывать скомпилированные интерфейсы? Давайте рассмотрим методы использова- ния интерфейсов коммуникации в коде. Рис. 2.53 ❖ Автоматически сгенерированный код на основе определения интерфейса коммуникации 4. Вызов интерфейса коммуникации на стороне клиента Сначала изучим, как вызывать интерфейс коммуникации в клиенте службы. Полный код находится в файле 1еагп1п§_8егУ1се/яегу1се_оЫес1:_с11еп1:.ру. Ниже приведена ключевая часть кода. Сгоп 1еагптрд_гпСегбасе.згу тпоогб СетОЬдесСРозтНоп # Импорт пользовательского интерфейса # службы коммуникации. сказз оЬдесгСТлепЦНсбе): СеС___тпИ___(зеИ, папе): зирег().__тпИ___(папе) # Создание клиента, напэямую использующего уже импортированный интерфейс коммуникации. зеТС.сиепС = зе'И.сгеаСе_с1.геп1:(СеШЬ]ес1:Рэ5Шоп, ' деССагдеСрозШсп') ипПе пос зеП:.сиеп1-.иаИДог_зегу1се(Нпеои1:_5ес=1.0): зеИ.деС_1одсег().1П'Го('зегутсе поС ауаПаЫе, иатПпд адатп...') # Получение результата ответа от сервера службы. зеТС.гедиезс = СесОЬдесСРозгКоп.НедоезД)
Отметим, что в своем коде, как и при использовании предопределенных интерфейсов коммуникации КОВ 2, вы можете импортировать и вызывать пользовательские интерфейсы коммуникации, используя точно такой же синтаксис. 5. Вызов интерфейса коммуникации на стороне сервера Вызов интерфейса коммуникации на стороне сервера выполняется анало гично. Полную реализацию функционала можно найти в файле 1еагп1п§_8ег- У1се/8ету1се_оЬ)ес1:_8ег\7ег.ру. Ниже приведена ключевая часть кода. Ггоз '1еа"п1пд_гпТег1:асе.5Г7 гР|рогб СегОЬтесбРозШоп # Импорт пользовательского ин*ерфейса # коммуникации. сТазз 1заде5 зЬзсггбег( Мос1е): беб_____тпП___(зе!б, пазе): зирег().__гпП___(.пазе) # Создание подписчика (тип сообщения, имя темы, функция обратного вызова подписчика, длина # очереди). зебб.зиЬ зе1б.сгеа1е_зиЬзсггрг1сп(1таде, 'гг:аде_га1»', зе1б.изСепег_са11Ьаск, 10) # Создание обьекта преобразования изображения ОрепСУ и сообщений изображений КОЗ. се1б.С7_'оггбде = СуЗгтбде() # Создание обьекта сервера службы, напрямую использующего уже импортированный интерфейс # коммуникации, зебб.згу = зе1.Г.сгеабе_5ег7гсе(СебОЬ]есбРо5Шсп, 'де1_багдеб_розП1Оп', зе'И.оЬдесТ-розШоП-СаП.Ьаск) зеИ.о^гесбХ = 0 зеТб.оЬтесбУ = 0 » Создание функции обратного вызова, выполняющей обработку данных после получения запроса. беб оЬтесб_ро5гбгоп_са11Ьаск(зе1б, геццрзб, гезрепзе): тб гециезб.деб == Тгие: # При получении запроса службы со значением Тгое возвращаются # координаты обнаруженного объекта. гезропзе.х = зеИ.оЬдесбХ гезропзе.у = зеИ.оЬдесбУ зе1б.деб_1оддег().1пбо( 'ОЬдесб розП1о.т\пх: %б у: %б' % (гезропзе.х, гезропзе.у)) е1зе: # Иначе координаты обнаруженного обьекта по умолчанию равны 0. гезропзе.х = 0 гезропзе.у = 0 зе1б.деб_1.оддег().1|тГо( '1пуаИб соттапФ) гесигп гезропзе # Отправка ответа службы клиенту.
2.7.5. Пример использования интерфейса темы: периодическая публикация координат обнаружения объекта Определение интерфейса коммуникации темы выполняется аналогично. Продолжая развивать пример обнаружения объектов, заменим службу из раздела 2.7.4 на тему и независимо от наличия потребности будем перио- дически публиковать расположение распознанных объектов. Архитектура представлена на рис. 2.54. РиоНзбег (Изда-ель) Тема 0В]ес1 _ро5|1юп Сообщение Расположение объекта Данные х, у объекта ЗиЬзспЬв! (Подписчик) Рис. 2.54 ❖ Призер архитектуры приложения для обнаружения объектов с использованием темы 1. Результат выполнения Нам необходимо запустить следующие три узла: 1) первый узел управляет камерой и публикует тему изображения, при этом используется стандартное сообщение 1та§е, определенное в КОЗ; 2) второй узел выполняет функцию визуального распознавания, опреде- ляет расположение цели и публикует его в виде сообщения темы, на которое могут подписывать другие узлы; 3) третий узел подписывается на тему расположения цели, получает данные сообщения из интерфейса коммуникации и выводит их в тер- минал. Откройте три окна терминала и запустите вышеуказанные узлы. Резуль- таты выполнения показаны на рис. 2.55. $ гоз2 гип иьЬ сал и5Ь_сэт_пос1е_ехе $ гоз2 гип 1еагггпд_Горт.с 1пГегГасе_оЬ]ес4_риЬ $ гоз2 гип 1еагг,гпс_Щрт.с ЦДегГасе-ОЬдесС-ЗиЬ 2. Определение интерфейса коммуникации В этом примере используется интерфейс коммуникации в теме, определяе- мый с помощью ОЪ)ес1Ро8Й1оп.т5§. Подробное описание содержится в файле 1еагпт5_т1ег€асе/т8§/ОЬ)ес1:Ро81Ноп.т8§, где используются координаты х и у для определения расположения. 1п±32 х 101:32 у # Координата х цели # Координата у цели
ГП го52(П)диуи еНоте: (Д — - □ X гоз2(ддиуие1>оне;-/<1ех_н5$ гоз2 ГТИРО] [1721385841-564538023] гип 1еагпгпд_1:ор1с т.пСегГасе_оЬ]ес1:_ьиЬ [1п1:егГасе_ро51СЕоп_зио]: ТагдеС Роз! Поп: "(611, 93)" [ШРО] (1721385841 604692547] [хпСегГасе_розхС:хоп_5иЬ], ТагдеС РозхСхогк "(611, 92)" [1НРО] (1721385841 661058469] [хпСегбасерозт.Ст.о'Т-Зио]: ТагдсС РозхСхоп: "(611, 92)" Г1МГО] (1721385841 721633598] [хп1:ег6асе_розхС:хоп_5иЬ] ТагдеС РозхСхоп: "(611, 92)" (1ИРО] (1721385841.785708253] [хп1:егГасе_розхС:хоп_5иЬ]. ТагдеС РозхСхоп: "(611, 93)" [ШРО] (1721385841.848450449] [хпСегГасе_розхС:хоп_5иЬ]; ТагдеС РозхСхоп: "(611, 92)" [1НРО] (1721385841-904700221] [хп1:егГасе_ро5х1:хоп_зиЬ]; ТагдеС РобШоп: "(611, 92)" ( НЛО] (1721385841.962355445] [т.п1:егГасе_ро5т1:т.оп_5иЬ] ТагдеС РозхСхоп: "(611, 92)" [тнго] (1721385842 019240965] [хп1:ег6асе_ро511:хоп_5иЬ] ТагдеС РозхСхоп: "(611, 92)" [тыго] (1721385842 085253914] [хп1:ег6асе_ро511:хоп_ьиЬ] ТагдеС РозхСхоп: "(611, 92)" [ШГО] [1721385842,143633246] [хпГегГасе_роз1Схоп_зиЬ] ТагдеС Розе Поп: "(611, 92)" Г ШРОТ (1721385842-2014373121 (гпТегГаге ообтСхоп зьЫ ТагаеС РозхСхоп: "(611. Рис. 2.55 ❖ Пример работы обнаружения объекта с использованием темы 3. Настройка параметров компиляции Подобно компиляции интерфейса коммуникации в службе, описанной в раз- деле 2,7.4, интерфейс коммуникации в теме также требует компиляции для генерации кода на различных языках. Этот процесс настраивается в файле СМакеЫз^зДх!: пакета и полностью аналогичен настройке для службы. # Поиск зависимого пакета го5гсП._6еГаиП:_депегаГог5, который предоставляет функцию # автоматического преобразования кода. Нп<]_ргскзде( го5(.<11_с1еГаи1г_депег агогз КЕрЛКЕО) # Перечисление файлов интерфейсов коммуникации, которые необходимо скомпилировать. го5тс11_депе"аТ:е_1.птегГасе5(${РК03ЕСТ_МАМЕ} ''пвд/ОЬдесЕРозИЕоп.птд" ) После завершения настройки компиляции пакета генерируются файлы кода на различных языках, которые затем можно использовать в своем коде. 4. Вызов интерфейса коммуникации в узле-издателе Приведем пример с узлом-издателем, полный код находится в файле 1еагп- т§ Еор1с/т1:ег[асе_оЬ1есЕ_риЬ.ру. Основная часть кода, связанная с интерфей- сом коммуникации, приведена ниже,
бгоп ТеагпбпдЗпгегбасе.пзд тпоогс ОЬдесбРозШоп # Импорт пользовательского интерфейса б коммуникации темы. сТазз 1паде5иозсгбоег(Мобе): СеГ____бпИ___(зебб, папе): зарег().___бпбб__(папе) # Создание подписчика (тип сообщения, имя темы, функция обратного вызова подписчика, длина # очереди). зеТб.змЬ = зе1б.сгеабе_зоЬзсггргбоп(1паде, 'бпаде_гаи', ьеПЛтзСепег саПбэск, 10) # Создание издателя, напрямую использующего уже импортированный интерфейс коммуникации. зеТб.риб - 5е'1б.сгеа<е_риЬизКег(0Ь]есбРо5гггсп, "оЬ]есР_розгН.оп", 10) # Создание обьекта преобразования изображения для взаимного преобразования изображений # ОрепСУ и сообщений изображений РОб. зе1б.су_Ьггоде - СуВгбс1де() зеТб.оЬдесРХ = 0 зеТб-оРдесРУ = 0 Реб 11ьСспег_са11Ьаск(зе1б, баба): зе1б.дет_1.осдег().1.пбо('Кесег7б.пд уббео бгапе1) # Преобразование сообщения изображения КОЗ в изображение ОрепСУ. спаде - зе1б.С7_Ьгббде.гпдпзд_бо_су2(с1аба, 'Ьдг8') # Создание сообщения темы для сохранения координат позиции. розНб-оп = 0ЬдесРРоз1Рбоп() # Запуск распознавания объекта. зе1б.оЬ]есР_бетесг(бпаде) # Заполнение сообщения координатами, полученными при распознавании объекта. розбббсп.х, рсзШоп.у - тпР(зе1.б.оЬ]есбХ), бпб(зе1б.оЬдесРУ) # Публикация позиции объекта. зеИ. риЬ. р иЫЛ51т( розт Поп) 5. Вызов интерфейса коммуникации узла-подписчика Метод вызова сообщений в узле-подписчике полностью аналогичен, полный код находится в файле 1еагп1п^_1ор1с/1П1егГасе_оЬ)ес1_яиЬ,ру. Ниже приведена ключевая часть кода. бгоп 1еагпт.пд_гп1егбасе.п5д тпрогб ОбдесРРозтРтоп # Импорт пользовательского интерфейса # коммуникации темы. сгазз 5>иЬьсгт Ьег Мосе(Мос1е): беб ___РптР__(зеРР, папе): зарег().___РптР__(папе) # Создание подписчика, напрямую использующего уже импортированный интерфейс коммуникации зеРб.зиЬ = 5е1б.сгеа1е_зиЬ5сггрсРоп(0Ь]есРРоз1р1оп, 7оо]есб_розбг1оп", зе1б.изгепег_ са!Траск, 10)
# Создание функции обратного вызова, выполняющей обработку данных после получения сообщения # темы. бгб 1л5Сепег_са1.1.Ьаск(5е11:, пзд): # Вывод информации о координатах распознанного объекта. 5еИ.деб_1оддег()Лп1:о( Тагдеб РозбСбоп: "(%б, %с1)" % (пзд.х, пьд.у)) 2.8. Действие: управление процессом выполнения полной единицы поведения Робот представляет собой сложную интеллектуальную систему, и его функ- ции не ограничиваются лишь дистанционным управлением с клавиатуры или распознаванием конкретного объекта. Основная задача робота заклю- чается в реализации сложносоставных приложений в конкретных сценариях, таких как доставка еды, доставка товаров или сортировка. В процессе реали- зации этих сложных функций часто используется одна коммуникационная механика - действие (АсНоп). 2.81. Что такое действие Из названия легко понять суть понятия «действие»: эта коммуникационная механика предназначена для удобного управления процессом выполнения роботом какой-либо полной единицы поведения. Например, чтобы повернуть робота на 360°, обычно его вращают с опре- деленной частотой на определенный угол, дабы обеспечить достаточную точность поворота. Однако это вызывает некоторые вопросы: совпадает ли фактический угол поворота с гем, который распознает робот? Действитель- но ли робот начал вращение? На сколько градусов он повернулся? Решение этих вопросов заключается в том, чтобы робот постоянно сообщал о текущем прогрессе, например каждую 1 секунду информировал о текущем угле по- ворота. По истечении некоторого времени, когда вращение достигнет 360°, отправляется сообщение о завершении действия. После команды на выполнение определенного действия робот периоди- чески сообщает о текущем прогрессе действия в реальном времени, а затем передает результат выполнения, как показано на рис. 2.56. Эта коммуника- ционная механика называется действием. Действие предоставляет «инди- катор прогресса», который позволяет контролировать выполнение процесса в любое время.
2.8.2. Модель коммуникации действия Изучив суть понятия «действие», можно заметить, что обмен данными в про- цессе выполнения действия напоминает работу службы, но при этом он более сложен. Действительно, модель коммуникации действия схожа со службой, она также основана на модели «клиент-сервер» (С/8), как показано на рис. 2.57. боа 8еп/юе Айюп (Служба цели (Коммуникация Ыобе (Узел; Мобе (Узел) Рис. 2.57 ❖ Модель коммуникации действия 1. Модель «клиент-сервер» В процессе коммуникации действия клиент отправляет цель действия - за- прос на выполнение роботом определенной операции. Сервер выполняет
это действие - управляет роботом для выполнения операции, одновремен- но периодически сообщая о состоянии выполнения. Если это навигацион- ное действие, то могут периодически сообщаться координаты робота. Если это действие захвата манипулятором, то может периодически сообщаться текущая позиция манипулятора. После завершения действия сервер пере- дает сообщение о завершении действия, завершая весь процесс коммуни- кации. 2. Коммуникация «один ко многим» Как и в случае со службой, в коммуникации действий может быть несколько клиентов, каждый из которых может отправлять команды действия. Но сер- вер может быть только один, поскольку робот один, и он может выполнить только одно действие за раз, прежде чем приступит к следующему. 3. Синхронная коммуникация Поскольку существует обратная связь, действие также является механизмом синхронной коммуникации, как было рассмотрено в разделе 2.7.2. Интер- фейс передачи данных в процессе действия определяется с помощью файла .асНоп. 4. Комбинация службы и темы Если внимательно изучить рис. 2.57, можно обнаружить скрытую деталь: три модуля связи действия включают две службы и одну тему. Когда клиент отправляет цель движения, используется запрос службы, а сервер также от- правляет ответ, подтверждающий получение команды действия. Процесс обратной связи действия представляет собой периодическую публикацию темы, где сервер выступает в роли издателя, а клиент - подписчика. Действие является механизмом связи на прикладном уровне, реализованным на ос- нове тем и служб. 2.8.3. Пример программирования коммуникации действия Хотя действие состоит из темы и службы, на практике методы программи- рования тем и служб не используются напрямую. Вместо этого применяется набор программных интерфейсов, специально разработанных для действий. Давайте изучим их. Предположим, робот должен двигаться по круговой траектории, как по- казано на рис. 2.58. Это действие требует определенного времени, и оно идеально подходит для реализации с помощью механизма коммуникации действия. Давайте посмотрим на результат выполнения.
Рис.2.5- ❖ Пример программирования коммуникации действия Откройте два терминала и выполните следующие команды для запуска примеров сервера и клиента действия. # Запуск сервера действия. $ гоз2 гип 1еагпт.пд_асСт.оп асС1оп_по7е_5егуег # Запуск клиента действия. $ гоз2 гип 1еаг пгпд_ас11оп асНоп_п<№_с1леп1: Мы видим в терминале, что после отправки клиентом цели действия сер- вер начинает имитировать движение робота, отправляя информацию об об- ратной связи каждые 30° поворота, и завершает движение сообщением об окончании действия, как показано на рис. 2.59. А го52@диуи еНоте: О = □ х го52@диуиеЬоте:~/<1еу_и5$ гоз2 гип 1еагп1пд_ас1:1оп ас11оп_тоуе_5егуег [1МЕ0] [1720852168.136713107] [асМоп_тоуе_5егуег]: Моуъпд съгсТе... [1ЫР0] [1720852168.137109431] [ас11оп_поуе_5егуег]: РиЬИзЬгпд ГеебЬаск: 0 [1МР0] [1720852168.638479908] [ас11оп_тоуе_5егуег]: РиЫЛзЬгпд ГеедЬаск: 30 [1МЕ0] [1720852169.140497416] [асМоп_тоуе_5егуег]: РиЫЛзЬгпд ЕеедЬаск: 60 [11ЧЕ0] [1720852169.642163766] [асИоп_тоуе_5егуег]: РиЫЛзМпд ГеедЬаск: 90 [1МЕ0] [1720852170.143296672] [ас1гоп тоуе 5егуег]: РиЫгзЬгпд ^еедЬаск; 120 А го52(фдиуиеЬоте: ~/деу_у/5 О = - □ |ГО52@диуиеЬоте:~/<1еу_Н5$ гоз2 гип 1еагп1пд_ас11оп асЧоп_тоуе_сИеп1: [1МЕ0] [1720852168.135955024] [ас11оп_тоуе_с1Леп1:]: Соа! ассер!ед :) [1МР0] [1720852168.139666841] [ас11оп_тоуе_с11еп1]: Несегуед ГеейЬаск: {0} [1МЕ0] [1720852168.640574320] [ас*гоп_тоуе_с1геп1:]: Кесехуед Геес1Ьаск: {30} [1Г4Г0] [1720852169.142563514] [ас1гоп_тоуе_сИеп1:]: Кесехуед ГеедЬаск: {60} [1ИР0] [1720852169.644240284] [ас1Лоп_поуе_с1Леп1:]: Песехуед Геес1Ьаск: {90} [1МР0] [1720852170.144696093] [асНоп_поуе_с1леп1]: Ресет. уед ГеедЬаск: {120} [1ИР0] [1720852170.647940873] [ас1гоп_поуе_сКеп1]: Песеъуед Гее^Ьаск: {150} [1ЫР0] [1720852171.148719076] [ас1Лоп тоуе с11еп1:]: Песегуес! ГеейЬаск: {180} Рис. 2.59 ❖ Пример работы механизма коммуникации через действие Схематично процесс выполнения вышеописанного действия представлен на рис. 2.60: клиент отправляет цель действия, сервер управляет движением
робота и периодически отправляет обратную связь, а после завершения от правляет сообщение об окончании. СНеп! (Клиент) Действие: то(/е_С1гс1е Служба: Соа1 Данные запроса: Тгие Данные ответа: Данные обратной связи: з1а1е 8еп/ег (Сервер) Данные ответа: Лп1зИ Служба: КезиК Данные запроса: Тгие Рис. 2.6' ❖ Схема обмена данными коммуникации через действие 2.8.4. Определение интерфейса действий Формат сообщений действия, используемый в примере раздела 2.8.3, не яв- ляется стандартным определением в КОЗ 2, а создан вручную. Файл МоуеСлгс1е.асНоп является пользовательским, и на его примере мы изучим методику создания пользовательских файлов для интерфейсов дей- ствий. Как было рассмотрено в разделе 2.7, пользовательские файлы интерфейсов хранятся в пакете функций. Файл МоуеС1гс1е.асИоп находится в папке 1еаг- шп§_т1:еНасе/асНоп и имеет следующее содержимое. Ьсо! егайе # Определяет цель действия, указывая на начало выполнения. Ьоо! НптвЬ # Определяет результат действия, указывая на успешность выполнения. Т.П132 зРаГе # Определяет обратную связь, указывая на текущее положение выполнения. Интерфейс действия включает три части: 1) цель действия: если епаЫе равно 1гие, значит, движение началось;
2) результат выполнения действия: если Гтгяй равно Фгие, значит, выпол- нение завершено; 3) периодическая обратная связь действия: указывает на текущий угол поворота робота. После создания определения необходимо настроить параметры компи- ляции в файле СМакеЫзЕз.ФхФ пакета функций, чтобы компилятор автома- тически генерировал код на разных языках в соответствии с определением интерфейса. Ц Поиск связанных пакетов зависимостей. Н,пс1_раскаде(го5г<Л._с1е<:аиП:_депега1:ог$ КЕ()111КИ)) Ц Объявление определения файла асНоп и его местоположения. гоз1Ф1_депега1:е_гп1:ег4:асез(${РК0ЭССТ_1АМЕ} " аспоп /МоуеСтгсЕе. асН оп" ) После завершения настройки можно приступать к компиляции пакета функций, в результате чего будут сгенерированы файлы интерфейса для различных языков программирования. Процесс аналогичен изложенному в разделе 2.7, где описаны пользовательские гемы и службы, поэтому здесь мы не будем повторяться, 2.8.5. Программирование сервера (РуХНоп) Рассмотрим метод реализации сервера в приведенном выше примере. Код на Ругйоп находится в файле кагпт&асНоп/асНоппюуезегуег.ру. Подробный анализ кода приведен ниже. ггрогс ЕЕпе тпрогб гс!ру Поп гс!ру.пос!е тпрогб Мобе Ггоп гсЕру.асНоп фтрогб АсНолБегуег Егоп 1еэгпЕпд_гп1:егЕасе.асНоп ЕпрогЕ МоуеСггсЕе # Библиотека РутЬоп для КОБ 2. # Класс узла КОБ 2. # Класс серзера действии КОБ 2. # Пользозательскии интерфейс коммуникации # для движения по окружности. с'1азз Мо7еСггс1еАсПог5ег7ег(1№бе): беГ_____гптЛ__(зеИ, пате): зирег().__гпт.1_(пате) л Инициализация родительского класса узла КЭБ 2. # Создание сервера действий (тип интерфейса, имя действия, функция обратного вызова). зеПУасЕгопгегеег - АсНопЗегуеНзеИ, МоуеСггсТе. тоуе_сггс1е’, зеИ.ехесиСе саИЬаск) # Функция, выполняемая после получения цели действия. СеЕ ехес1Не_саиЬаск(зеИ:, доа1_йапб1е):
5е1ЛдеОо&дег()ЛпГо( Моугпд сггсТе...') # Создание сообщения с информацией о ходе выполнения действия. €ееФЬаск_1Ч5д - Мо^еСт.гс!е.ЕеебЬаск() # Выполнение движения по окружности от 0 до 360° с шагом 30°, периодическая передача Я обратной связи. Гог г 1п галде(0, 360, 30): # Создание обратной связи, указывающей текущий угол выполнения. Еее|Л|аск_1’1ьд. ьбаке = т 5е1Е.дек_1оддег()Лп-Ео('РиЫтзЫпд ЕееоЬаск: %с1' % Сеес1Ьаск_п5д .зраке) # Публикация информации обратной связи. доа1_Ьапс11.е.риЫт5Н_'Ееес1баск(<:еебЬаск_п5д) Ст_гче. 51еер( 0.5) дог1_Ьапб1е.ьиссееб() # Успешное выполнение действия. гезикС = МоуеСггс1е.Резии() # Создание сообщения с результатом. гезиТк.-Етпгзй = Тгие геТигп гезиТс № Отправка клиенту конечного результата выполнения действия. дег паТп(агдз=1№пе): # Главная функция входа в узел К05 2. гс1ру.1П11:(а1 дз=агдз) » Инициализация РуТйоп-интерфейса К65 2. побе = Мо7еСггс1еАсгтоп6ег7ег(''асТ:1сп_поре_5ег7ег'') # Создание и инициализация объекта # узла КОЗ 2. гс1ру.зр1п(побе) # Цикл ожидания завершения работы КОЗ 2. побе.беь-(:гоу_побе() # Уничтожение экземпляра узла. гсТру.зЬиТс1о1л/п() # Завершение работы РубЬоп-интерфеиса КОЗ 2. На основе приведенного кода можно выделить процесс реализации серве- ра действий, как показано на рис. 2.61. Инициализация программного интерфейса к Создание [Ъ и инициализация узла Создание объекта сервера Предоставление службы через функции обратного вызова Отправка ответа клиенту Уничтожение узла и закрытие интерфейса Рис. 2.61 ❖ Процесс реализации сервера в коммуникации действия Сначала производится инициализация среды КОЗ 2 и настройка интер- фейса коммуникации КОЗ 2. Затем создается и инициализируется экземпляр узла, включая установку необходимых параметров и инициализацию ком- понентов Далее с помощью метода АсНоп8егуег() создается объект серве- ра, для которого необходимо задать тип интерфейса сервера, имя действия и функцию обратного вызова. После создания и запуска объект сервера будет ожидать отправки клиентом цели действия. Получив цель действия, сервер вызовет указанную функцию обратного вызова ехесп1е_са11Ьаск() для вы- полнения кругового движения и периодически будет отправлять клиенту ин- формацию о прогрессе (например, текущий угол). По завершении действия сервер вызовет доаИтапсИе.знссеебО для отметки завершения и создаст со- общение с результатом МоуеС1гс1е.Ке8и1Г(), содержащее информацию о вы- полнении (например, завершено ли действие). При завершении работы узла все компоненты останавливаются, экземпляр узла уничтожается, и среда КОЗ 2 закрывается для освобождения ресурсов.
2.8,6, Программирование клиента (Ру1Ноп) Теперь рассмотрим метод реализации клиента в приведенном выше при- мере. Код на РуГйоп находится в файле кагптуасПоп/асНоптоуесПегй.ру. Подробный анализ кода приведен ниже. бпрогб гсбру » Библиотека РубЬоп для К6$ 2. бгоп гсбру.побе бпрогб ЫоДе # Класс узла КОЗ 2. бгоп гсбру.асббоп гпрогб АсбгопСКепб # Класс клиента действий РОЗ 2. бгоп 1еагпбпд_бг:бегбасе.асббоп бпрогб МоуеСбгсбе # Пользовательский интерфейс коммуникации # для движения по окружности. с баяв МоуеСбгсбеАсббогСбтепб(Моде): Феб___тпбб__(зебб, папе): зирег().__бпбб__(папе) # Инициализация родительского класса узла КОЗ 2. # Создание клиента действий (тип интероеиса, имя действия). зебб._асббоп_с!бегб = АсббопС1бепб(5е1б, Мо^еСбгсбе. 'по7е_сбгсбе') # Функция для отправки цели действия. <1еб зепс1_доа!(5е!б, епаЫе): # Создание сообщения с целою действия. доа!_пьд = МоуеСбгсбе.СоаЦ) # Установка цели действия - включить выполнение. чтобы ообот начал движение. доа!_пзд. епаЫе = епаЬбе # Ожидание запуска сервера действии. вебб.-асббоП-СИепб.иабб-богвегуегО # Асинхронная отправка цели действия. 5е!б._5епс1_доа!_бибиге = 5е!б._асббоп_с!бепб.5епс1_дсэ!_а5упс( дсаб_п5д, # Цель действия. беебЬаск_са!!ьаск=5е!б.бее<ббаск_са11Ьгск) # Функция обратного вызова для обработки # периодических сооощении обратной связи. # Настройка функции обратного вызова при получении ответа серзера после отправки цели. зе!б._5епс1_доаб_бибиге.ас1с1_<бопе_саиЬаск(5е!б.доа!_ге5роп';е_са!!Ьаск) # Функция обратного вызова при получении ответа сервера после отправки цели. Феб дсаб_ге5роп5е_са!1баск(5е!б, бибиге): доа1_Ьапс11е = бибиге.гевиббО # Получение результата по действию. бб поб доаТДаапсЦе.ассербес!: # Если действие отклонено. 5е1б.деб_боддег().бпбо( 'боа! гедесбеб :(') гебигп # Действие принято к выполнению. зебб.деб_!осдег().бпбо('Боа! ассербео :)') # Асинхронное получение окончательного результата выполнения действия. зе!б._дес_ге5и!б_бибиге = доа!_йапс1!е.деб_ге5и!б_аяупс() # Настройка функции обратного вызова при получении конечного результата. зе!б._деб_ге5и!б_бибиге.эс1с1_(бспе_Са11Ьаск(5е!б.дег_гези!б_са!!Ьаск) # Функция обратного вызова при получении конечного результата. Феб деб_гези!г_са!!Ьаск(зе!б, бибиге): Гези!! = бибиге.геьи1!().гевиТб # Чтение результата выполнения действия. 5е!б.деб_!оддег().1пбо('Ке5и!б: {%с!}' % гевибб.ббпбзЬ)
# Функция для обработки периодических сообщений обратной связи. беб ГееЦЬаск_саГ1Ьаск(ьеИ, Геес1Ьаск_пьд): беебЬаск - ГееЦЬасклльд.теебЬаск # Чтение данных обратной связи. зеН.деТ_1иддег()Лнбо('Кесегуес! ГеебЬаск: {%с1}' % ГеебЬаск.збате) Зет гт|асп(агдБ=Мопе): # Главная функция входа в узел кОЬ 2. гс!ру. 1п11:(агу5=агдз) # Инициализация РубЬоп-интерфейса КС5 2. побе - МоуеСггс1.еАсстопСИеп1:(''асб1оп_1лоуе_с1гепб'') # Создание и инициализация объекта # узла РОь 2. пос!е.5епЗ_доа1(Тгие) # Отправка цели действия. гс1ру.ьр1п(поЗе) # Цикл ожидания завершения работы КС 5 2. пэСе.с1езТ:гоу_лос1е() # Уничтожение экземпляра узла. гсСру.зЬи-ЙоилО # Завершение работы РубЬоп-интерлейса КОЗ 2. На основе приведенного кода можно выделить основные этапы реализа- ции клиента действий, как показано на рис. 2.62. Инициализация программного интерфейса к Создание и инициализация узла Создание объекта клиента Обработка ответа на действие и результатов его выполнения Отправьте цель действия Уничтожение узла и закрытие интерфейса Рис. 2,62 ❖ Процесс реализации клиента в коммуникации действия В среде КОЗ 2 сначала инициализируется узел КОЗ 2 и настраиваются необ- ходимые интерфейсы коммуникации. Затем создается и инициализируется экземпляр узла КОЗ 2, в котором будет размещаться сервер действий. В про- цессе инициализации узла устанавливаются необходимые параметры, такие как имя узла, пространство имен и т. д. Далее с помощью класса АсНопЗегеег создается объект сервера действий. При создании необходимо указать тип интерфейса действия, имя действия и функцию обратного вызова, которая будет вызвана при поступлении цели действия для выполнения логики дей- ствия. После запуска сервер действий будет ожидать отправки клиентом цели действия. Как только цель действия будет получена, сервер вызовет ранее указанную функцию обратного вызова. В данном обратном вызове сервер выполняет конкретную логику дей- ствия - в нашем примере выполняется круговое движение. В процессе вы полнения действия сервер периодически отправляет клиенту сообщения обратной связи, содержащие текущий статус выполнения действия (напри- мер, текущий угол, скорость и т. д.). Клиент может обновлять интерфейс или выполнять другие операции на основе этих сообщений. После завершения выполнения действия сервер вызывает метод &оа1_1тапс11е.8иссеес1() для обо значения успешного завершения действия и создает сообщение с резуль- татом, которое отправляется клиенту. Это сообщение содержит результат выполнения (например, успешно ли завершено, конечное состояние и т. д.). По завершении работы узла (по запросу пользователя, по завершении про- граммы или при аварийном завершении узла) сервер прекращает выполне- ние всех текущих действий, уничтожает экземпляр узла и закрывает среду КО8 2 для освобождения ресурсов.
2.87. Программирование клиента (С++) Работа клиента, реализованного на С++, показана на рис. 2.63. Пример кода можно найти б файле 1еатт§_асНоп_срр\8гс\асНоп_тоуе_с11егй.срр. В ком ментариях к коду подробно объясняется значение каждой строки, а процесс реализации полностью совпадает с версией на РуТйоп, поэтому мы не будет повторно останавливаться на этом. го52@диуиеЬоте:~/<1еу_и5$ гоз2 гип 1еагп<пд_ас1гоп_срр асНоп_то7е_сИеп{: [1НЕ0] [1720853220.800739060] [ас11.оп_тоуе_с1геп1]: СНеп1: ЗегкКпд доа! [1ИЕ0] [1720853220.802544634] [ас11ол_но7е_с11еп1]: СНеп1: Соа! ассер!ед Ьу зег Vег, натЛглд 1Ъг гези11 [1ИЕ0] [1720853220.803200891] [ас11.оп_Р1ОУе_с1т.еп1]: СНепЪ: Кесехуес] ГеедЬаск: 0 [1ИЕ0] [1720853221.804530754] [асНол_тоуе_с1.гел1]: С1гел1: Кесехиед ГеедЬаск: 3 0 [1НЕ0] [1720853222.803876903] [ас1!ол_поие_с11еп1]: СИеп1: Несегуед ЕеедЬаск: 6 0 [1ИЕ0] [1720853223.803715434] [асНоп_тоуе_сИеп1]: СНелЬ: Ресехуес} ГеедЬаск: 9 0 [1ИЕ0] [1720853224.804044345] [ас^1оп_тоуе_с1теп^]: СНеп*: Ресехуед Гее<1Ьаск: 1 20 [1НЕ0] [1720853225.803871861] [ас11ол_тоуе_с11еп1]: СНепЪ: Кесехуеб ЕеедЬаск: 1 50 Рис. 2.63 ❖ Работа клиента при интерактивной коммуникации (С++) #спс!ибе <1озСгеаи> #тпс!ийе "гс1срр/гс1сррйрр" // Библиотека С++ для КОЗ 2. #тпс1ибе "гс1срр_асСтоп/гс1срр_асбт.опФрр" // Класс действий РЭ5 2. #1пс1и6е "1еагп1пд_РпСегГаср/аст1сп/г.оуе_стгс1е.1’1рр // Пользовательский интерфейс коммуникации // для движения по окружности. иатпд папезрасе зРа; сТазз МоуеСггсТеАсГсопСПеп!: : риЫдс гсТсрр::Мобе { риЫтс: Ц Определение пользовательского класса интерфейса действии для удобства использования. изтпд СизСопАсСтоп = Теагпспд спТеНасе: :асНэп: :Мо1/еСтгс!е; // Определение клиентского класса для обработки запросов действий, их отмены и выполнения. изтпд СоаРНагЛе = гс1срр_асСгоп: :С11еп1.Соа1Нап<11е<Си5(опАсНоп>; ехрПсП МоуеСггс1еЛсНопС1гепТ(соп5р гс1срр: :МоРе0р15.опь & тобе_орс1опз = гсРсрр: ^обеОрНопзО) : Побе(|ас1:1оГ|_поуе_с1.1еп1:'', побе_орН.ппз) // Инициализация родительского класса узла РОЗ 2. { // Создание клиента действий (тип интерфейса, имя действия). ЙТ15->с1гепС_рСг_ = гс!срр_асНоп: :сгеабе_сНеп1:<Си5('О1лАсНоп>( Йти->деС_побе_Ьа5е_1|ТСег(:асе(), тйть->деС_пос!е_дгар1т_Т11Сег1:асе(), Шь-адеТ-ПоаеДоддтпдЗпСегСасеО, Йпз - >деС_побе_иа’Л аЫе5_йДегГа се (), "поуе ссгсРе"); }
// Функция для отправки цели действия. уоТб зепб_уоа1(Ьоо1 епаЫе) { // Проверка доступности сервера действий. тб (!ЕЫз->с1.гепЕ_р1т_->иагЕ_бог_асЕ1оп_зегуег(5Еб: гсЬгопо: :зесопбз(10))) { КСЕСР?_ЕККОК(ЕЫз->деЕ_1.099ег(), "СИепЕ: АсЕтоп зегуег пот ауаПаЫе аГ±ег иаШпд"); гсТсрр::зЬиЕбоип(); геЕигп; } /7 Привязка функций обратного вызова для запроса действия, отмены и выполнения. аиЕо зепб_уоа1_орЕтопз = гс1срр_асЕЕоп: гСИепЕкСизтолАсЕЕопь: :5епббоа10рЕтопз(); изтпд пашезрасе зЕб: :р1асебо1бегз; 5ег.б_уоа1_орЕ1сп5.доз1_гезропзе_са11Ьаск - зЕб: :Ьтпб(&1ЙО7еС1гс1еАсЕ1опС1.1епЕ: :уоа1_гезропзе_са!1Ьаск, ЕЫз, _1); зег.б_уоа1_орЕгспз. Г еебЬзск_са11Ьаск = зЕб: :Ьгпб(&1яо^еСЕгс1еАсЕ1опСиепЕ:: ГеебЬаск_са11раск, ЕЫз, _1, _2); зег.б_уоа 1_орЕ1спз. гези! Е_саИЬаск - зЕб::Ы.псЦ&Мос/еСт.гс'кеАс^т.опС.П.еп!:::гезиЕЕсаТЕЬаск, ЕЫз, _1); // Создание сообщения с целью действия. аиго доа1_шзд СизЕопАсЕЕоп::боа!(); дса1_пзд.епаЫе - епаЫе; // Асинхоонная отправка цели действия. РСЕСРР_1ПЕ0(ЕЫз->деЕ_1оддег(), "СНепЕ: Зелбгпд доа!"); ЕЫз->с11епЕ_рЕг_-->а5упс_5епб_доа1(доз1_1П5д, зепб_доа1_срггопз); } ргтуаЕе: гс!срр_асЕгоп: :С'11епЕ<СизЕопАсЕ1оп>::бЬзгебРЕг сНепЕ_рЕг_; Ц Функция обзатнсо вызова при получении ответа сервера после отправки цели, уотб доэ1_гезэопзе_са11Ьаск(6оа1Напб1е: :5Ьагес1РСг доа1_пеззаде) { И ('доай-Пеззаде) { РСсСРР_ЕРР0Р(сК'15->деТ_1оддег(), ''СИепб: боа! иаь гейесбес Ьу зеп/ег"); гсТсрр::зЬиббо«п(); // Закрытие клиентского узла. } еТзе { РСЕСРР_№0(С1п5->деГ_'1оддег(), ''СЛепб: боа! ассербеб Ьу зеггег, пчатТЛод бог гезиН"); } } // Функция обратного вызова для обработки периодических сообщений обратной связи, уотб ЕеебЬаск_саиЬаск( СоаТНапбТе::ЗЬагебРЕг, сопзб збб :з1|агеб_рЕг<сспзЬ СозЕопАсбтоп::ЕеебЬаск> бее6Ьаск_пез5аде) {
зЕй: :зЕг1пдзЕгеап 55; 55 « "СНепС: КесеЕуей ГеейЬаск: ' « ГеейЬаскдлеззнде-ызЕаЕе; Р.СЕСРР_Л1Е0ДМ5->деЕ_1оддег(), зз.зЕгО .с_зЕг()); } Ц Функция обратного вызоза при получении конечного результата. уотс! гезиЕЕ_саЕЕЬаск(соп5Е СоаЕНапйЕе::ИгаррейРезиЕт & гезиЕЕ-Гезегде) { ЗиЕГск (гези1Е_Г|ез5аде.собе) { сазе гсЕсрр_асЕ1оп:: КезиЕЕСойе:: 811ССЕЕ0Е0: Ьгеак; сазе гс1срр_асЕ1ол::РезиНСоСе:: АВОРТЕО: КСкСРР_ЕКК0К(гЬЕ5->деЕ_Еоддег(), "СЕгепЕ: Зоа1 \чЭ5 аЬогЕей1'); гсЕсрр::(); // Закрытие клиентского узла. геЕигп; сазе гсЕсрр_асЕ1оп::КезиЕЕСойе::САМСЕЕЕВ: КСЕСРР_ЕКР0К(С1тЕ5->деЕ_Еоддег(), "СЕгепЕ: СоаЕ паз сапсеЕей'); гсЕсрр: :з1тиЕЙ0'л1п(); // Закрытие клиентского узла. геЕигп; йеЕаиЕЕ: КСЕСРР_ЕКК0К(Е1тг5-ьдеЕ_Еоддег(), "СЕгепЕ: Ппкпоип гезиЕг сойе"); гсЕсрр::зНисйоып(); // Закрытие клиентского узла. геЕигп; } ВСЕСРР_№0(.ЕЫ5->деЕ_Еоддег(), "СЕгепЕ: КезиЕЕ гесегуей: %з", (ге5иЕЕ_пе55аде.ге5иЕЕ->Е1пЕз1т ? "Егие" : "ЕаЕзе')); гсЕсрр: :з1гигЙ0'лп(); // Закрытие клиентского узла. } }; Ц Главная функция входа в узел К68 2. ЕпЕ п'агп(гпЕ агдс, скат * агдч[]) { Ц Инициализация интерфейса С++ для КС$ 2. гсЕсрр::тп1Е(агдс, агду); // Создание указателя на клиента. аиЕс асЕ1оп_сЕтепЕ - зЕй: :паке_5кагей<Мо^еС1гс1еАсЕ1опСЕЕепЕ>(); Ц Отправка цели действия. асЕ1оп_сЕгепЕ->зепй_доэЕ(Егие); } 2.8.8. Программирование сервера (С++) Работа сервера, реализованного на С++, показана на рис. 2.64. Пример кода можно найти в файле 1еагтп2_асЕюп_срр\8гс\асГюп_тоуе_8егуег.срр. В ком ментариях к коду подробно объясняется значение каждой строки, а процесс реализации полностью совпадает с версией на Руйтоп, поэтому мы не будем повторно на этом останавливаться.
А го52(ЙдиуиеНоте: О — _ □ X го52@диуиеЬояе:~/йеу_ы5$ гоб2 гип 1еагп1пд_асНоп_срр асГгоп_тоуе_5егуег [1МРО] [1720853229.802010455] [асГт.оп_гооуе_5егуег]: Бегуег: Ресехуей доа1 гедиеБ С: 1 [1ИЕ0] [1720853220.802986640] [ас1Лоп_п1ОУе_5егуег]: Зегуег: ЕхесиГтпд доа! [1МР0] [1720853220.803096640] [асЫоп_тоуе_5егуег]: 5егуег: РиЫЛзЬ ГеейЬаск [1МЕ0] [1720853221.803937447] [асГдоп_иоуе_5егуег]: Зегуег: РиЫЛзЬ ГеейЬаск [1ГМЕ0] [1720853222.803487525] [асМоп_Р1ОУе_5егуег]: Зегуег: РцЫЛбЬ ГеейЬаск {1ИЕО] [1720853223.803275565] [ас1гоп тоуе 5егуег]: 5егуег: РиЫгаЬ ГеейЬаск Рис. 2.64 ❖ Работа сервера при интерактивной коммуникации (С++) #тсс1ибе <1озбгеап> #тпс1ибе "гс1срэ/гс!срр.Нрр' // Еиблиотека С++ для РОЗ 2. #гпс!ис1е "гс'1срэ_асС1оп/гс1срр_асгтоп.1'.рр" // Класс действий В0$ 2. #гпс1||с!е ||1езгп1пд_гп1:егбасе/асбгоп/п1О7е_с1гс1е.1трр'' // Пользовательский интерфейс коммуникации // для движения по окружности. изтпд папеьрасе 5±а; с1а55 МоуеСтгсТеАсбтопЬегуег : риЬИс гсТсрр:: Йобе { риЫЛс: // Определение пользовательского класса интерфейса действии для удобства использования. изтпд СизбопАсСтоп - 1еагптпд_гпбег<:асе: :асб!оп: :Мо^еСсгс1е; // Определение сервера для обработки запросов действий, их отмены и выполнения. изтпд СоаШапДе гс1срр_асНоп: :5егрегйоа1НапЛе<СизТопАсСтоп>; ехрНстб Мо1/еСтгс1еАсбтоп5ег7ег(сопзг гсТсор: гИос'еОргтопз & асбтоп_зег\'ег_сргтопз = гсьсрр: ^обеОрНопвО) : Моое("асбгоп_по^е_5ег7ег", асгтоп_5ег7ег_оргсоп8) // Инициализация родительского класса // узла РОЗ 2. { изтпд папезэасе збб: грТасеЬо'Иегз; // Создание сервера действий (тип интерфейса, имя деиствия, функции обратного вызова). С1п5->ас1:гол_5егрег_ = гс1срр_асНоп: :сгеабе_5егрег<Сиь1:отАсСгоп>( гЫв - >дег_пос!е_Ьа5е_1птегбасе(), СЫб - >дег_поСе_с1оск_т.пСег(:асэ(), тЬ15->дет_пос!е_1оддтпд_тпсегбасе(), бЬ’.в ->дет_Г|0Се_каббаЫе5_гпбегбасе(), '"Ю7е_сггс1е", 5бс1: :Ыпс1(&Мс7еС1гс1еАсСгопЗег^ег: НапЛе_доа1, ТЫь, _1, _2), збб: :Ьтпс1(&Мс7еС1гс1еАсггоп$ег^ег: :Ьапо1е_сапсе1, СЫз, _1), зМ: :Ьтпс1(&Мо7еС1гс1.еАсСгоп5егиег: :Ьапс11е_ассерТес1, СЫз, 1)); } ргт7абе: гс1срр_эсбтоп::ЗегуегсСизбогпДсбтоп»: :Збэгес1Рсг асНоп_зег7ег_; // Сервер действий. // Обработка запроса цели действия. гс1срр_асбтоп: :6са1Пезроп5е ЬапЛе_доа1( ссгзС гс1срэ_асТ:1рп: :Соа11Л1Ю & иисд, збб: :зНагес1_рСг<соп8С СизбопАсСгоп: :Соа1> дса1_гедиезб) {
РСЕСРР_1ПР0(ЕпЕв->деЕ_Еоддег(), "Зегуег: КесеЕуеб доаЕ гедиевЕ: ", деаЕ_гедиевЕ->епаЫе); (У01.Й) ииЕс!; // Если в запросе указано епаЫе принять запрос на движение, иначе отклонить. ЕЕ (доаЕ_гедиевЕ->епаЬЕе) { геЕигп гсЕсрр_асЕЕоп: :ОоаЕПевропве: :АССЕРТ_АПО ЕХЕСЦТЕ; } еЕве { геЕигп гсЕсрр_асЕЕоп::ОоаЕПевропве::РЕЗЕСТ; } } // Обработка запроса на отмену действия. гсЕсрр_асЕЕоп: :СапсеЕР.европве 1тапЫе_сапсеЕ( сопвЕ вЕс1: :в1|агей_рЕг<СоаЕНапс1Ее> дсаЕ_Ьапс1Ее_сапсеЕес1_) { РСЕСРР_1ИЕ0(Е1тЕв->деЕ_Еоддег(), "Зегрег: Ресетуес! гедиевЕ Ео сапсеЕ асЕЕоп"); (уоЕсй) доаЕ_Еапс1Ее_сапсеЕеа_; геЕигп гс1срр_асЕ1оп::СапсеЕПезропве::АССЕРГ; } // Обработка выполнения действия после его принятия. уоЕС Ьапс11е_ассерЕес1(соп5Е вЕй: :вЬагес1_рЕг<6оаЕНапЫе> доаЕ_лап<1Ее_ассерЕес1_) { ивЕпд папеврасэ вЕб::рТасе?то1с1егв; // Выполнение действия з отдельном потеке. вЕб::ЕПгеас!{вЕ(1::ЬЕпб(&|''ю«еСЕгсЕеАсЕЕопЗег^ег: :ехесиЕе, ЕЫв, _1), доаЕ_Еапс1Ее_ассерЕес1_}. бесасЬ (); } 7оЕс1 ехесисе(сопвЕ вЕб: :збагес1_рЕг<СоаЕНапс1Ее> доаЕ_Ьапс1Ее_) { сопвЕ аисо гедиевЕеадоаЕ = доаЕ_1тапсЕе_->деЕ_доаЕ(); // Цель действия. аиЕо ЕеейЬаск = вЕб: :’паке_в1тагей<СивЕопАсЕЕоп: :ЕеебЬаск>(); // Сообщение обратной связи. аисо гевиЕЕ = вЕб: :паке_в1тагес1<СивЕопАсЕЕоп:-Кеви1Е>(); // Результат действия. РС1СРР_1НЕ0(11тЕв->деЕ_1оддег(), "Зегиег: ЕхесиЕЕпд доа!"); гсЕсрр::КаЕе 1оор_га1е(1); // Процесс выполнения действия. Ъг (ЕпЕ Е = 0; (Е < 361) && гсЕсор: :ок(); Е = Е + 30) { // Проверка, отменено ли действие. ЕЕ (доа1_кап<11е_->Ев_сапсе1Епд()) { гевиИ->ЕЕпЕвк = ЕаЕве; доаЕ_1тапЫе_->сапсе1ей( гевиЕЕ); ПСЕСРР_1Мс0(ЕЬЕв->деЕ_1оддег(), "Зегуег: СоаЕ сапсеЕес!''); геЕигп;
} // Обновление состояния обратной связи. Геес1Ьаск->51-а1:е = с; // Публикация состояния обратной связи. доа1_Ьапс11е_->рио1т 5Ь_тееаЬаск(<:еес1Ьаск); ЯСГСРР_1ПГО(П115->уеГ_1оддег(), "бегуег: РиЫЛзЬ ГеебЬаск"); 1оор_габе.51еер(); } // Действие завершено. ГГ (гсТсор::ок()) { геы|Н:->Ггпг51т = 1гие; доа1_Ьапс11е_->5иссеес1(ге5и11:); КС1СРР_1ПРО(Скр5->уеС_1оудег(), "5егуег: боа! 5иссеес1ес1"); } } }; // Главная функция входа в узел Р0$ 2. гпб пасп(тп1: агде, с1таг * агду[]) { Ц Инициализация интерфейса С++ для РОб 2. гсГсрр НпН(агдс, агду); Ц Создание обьекта узла К05 2 и запуск. гсГсрр. :зртп(5Гб: :паке_5Ьагеб<,1оуеС1гс1еАсНо,л8ег7ег>()); // Закрытие интерфейса С++ для РОЗ 2. гсГсрр :5Ьи1:боип(); гебигп 0; } 2.85. Команды для работы с действиями Команды, связанные с действиями в КОЗ 2, обозначаются как асНоп. Ниже приведены часто используемые операции. $ гоз2 асНоп 1Л$б # Просмотр списка служб. $ гоз2 асНол ГпГо <асНоп_папе^ # Просмотр типа данных службы. $ гоз2 асНол 5епб_доа! <асН.оп_папе> <асН.оп_Гуре> <асНоп_баГ:а> # Отправка запроса на И выполнение действия. В примере действий этой главы при работе клиента и сервера можно ис- пользовать команды 1181,1пТо и 8епс1_^оа1 для просмотра списка текущих дей- ствий в системе, получения подробной информации о конкретном действии и инициирования действия, как показано на рис. 2.65.
А го52@диуиеЬоте: ~ О = - о х го52@диуиеЬопе:~$ гоб2 ас Поп НзХ /1иг11е1/го1а1:е_аЬ5о1и1е го52@диуиеКоте:~$ гоб2 асНоп хпГо Диг11е1/го1а1е_аЬ5о1и1е АсНоп: /1:1лЧ1е1/го1а1е_аЬ5о1и1е АсПоп сНепГз: 1 ДеХеор^игИе АсНоп зегуегБ: 1 /Хиг1:1е51п го52@диуиеЬопе:~$ гоб2 асНоп 5епд_доа! /ХигХ1е1/го1а1:е_аЬ5о1и1е ЕигНезт-п/асНс п/ЯоГаХеАЬБоХиХе ”{1Ье1а: 2.57}" НагНпд Гог ап асПоп зегуег Хо Ьесопе ауаИаЫе... $еп<Нпд доа1: ГЬеГа: 2.57 боа! ассерХед ИЛЬ 10: 53463ГЬе4а584Г23Ь(143е298Ье9028а0 НезиН: деНа: -2.559999942779541 Соа! ПпхзЬед юЛЬ зГаГиз: 511ССЕЕ0Е0 гоз2@диуие11ог»е: ~$ Рис. 2.65 ♦ Работа с действиями в командной строке 2.9. Параметры: глобальный словарь роботизированной системы Мы уже познакомились с такими механизмами коммуникации, как темы, службы и действия. В этом разделе мы рассмотрим еще один способ передачи данных, часто используемый в системе КОЗ 2, - параметры. 2.9.1. Что такое параметры Параметры в КОЗ 2 аналогичны глобальным переменным в программирова- нии на С++. Они позволяют нескольким узлам обмениваться определенными данными и представляют собой глобальный словарь в роботизированной системе. В каких случаях параметры используются при разработке роботов? При разработке функции визуального распознавания большое количество па- раметров влияют на результаты распознавания и отображения, как показа- но на рис. 2,66. Например, в узле А необходимо учесть множество аспектов: к какому НЗВ порту подключена камера, каково разрешение изображения, каковы экспозиция и формат кодирования и т. д, Все эти вопросы можно решить с помощью параметров. Узел В аналогичен узлу А: какие пороги цвета используются для распознавания изображений, какая часть изобра- жения является ключевой областью, требует ли процесс распознавания
улучшения качества изображения и т. д. Все это также можно настроить с помощью параметров. Узел А Запрос/установ/а параметра Разрешение Номер порта Экспозиция Кодирование Запрос/установха параметра Рис. 2.66 ❖ Гример параметров для функции визуального распознавания Изменение параметров Ш)В 2 подобно настройке качества изображения на камере с помощью ползунков или полей ввода. Изменение этих параметров влияет на выполнение функций. 2.9.2. Модель коммуникации параметров В системе КОВ 2 параметры существуют в виде глобального словаря, который, как и настоящий словарь, состоит из имен и определений, также называемых ключами и значениями. Параметры подобны переменным в программи- ровании: у них есть имя переменной, за которым следует знак равенства, а затем значение переменной, как показано на рис. 2.67. Для использования достаточно обратиться к имени переменной, чтобы получить ее значение, В ДОВ 2 параметры обладают множеством характеристик. Например, если один узел создает параметр, другие узлы могут получить к нему доступ. Если какой-либо узел изменяет параметр, другие узлы могут немедленно синхро низироваться и получить новое значение. По умолчанию при изменении параметра узлы не синхронизируютя автоматически. КОВ 1 предоставляет механизм динамической конфигурации, который требует на- стройки в программе синхронизации параметров через метод обратного вызова.
Командный терминал Узел (до настройки параметров) $ гозшп ... _гоЬо(_ пагпе:='КоЬо(А" _тах_зреес1:=1.0 _таурс1п1з:=["Ноте"] Узел (после настройки параметров) гоЬо( пос!е Содержимое параметров гсЬо1 пате: гпах зрееФ О.С м/ауро1п1з [ ] гоЬоО-Побе ।оЬо1 пате: ‘'КоЬо1А' тах зрееФ 1.0 м/ауро1П(з:["Нсте"] Файл параметров (УА\11_) гоЬо(_поое: гоЬо(_пате: ''КсЬо1А" тах_зрееФ 1.0 м/ауро1п1з:["Ногг:е"] Рис. 2 67 ❖ Модель коммуникации параметров 2.9.3. Работа с параметрами в командной строке В примере с черепахой симулятор предоставляет множество параметров. В этом примере мы познакомимся с их значениями и методами работы с па рэмеграми через командную строку. Откройте два терминала и запустите симулятор черепахи и узел управле- ния с клавиатуры. Результат выполнения показан на рис. 2.68. $ гоз2 гип бигб1.е5тл СигС1е5гп_по<1е $ гоз2 гип СигСТезсп СигС1е_1:е1еор_кбу гозафдиуиеЬоте: ~/деу_«5 гоз2@диуие1юте:~/де7_ы5$ гоб2 рагат изаде: гоз2 рагат [-Ь] СаП 'гоз2 рагат <соттапд> -Ь' Тог тоге деТаПед из< УагТоцз рагат ге!а!ед зиЬ-соттапдз орПопз: -К, --Ье1р зЬон 1К1з Ье1р теззаде апд ехг! Соттапдз: де!е1е ОеХеХе рагатеТег дезсгХЬе 5Ком дезсгХрПуе ХпТогтаПоп аЬои! десХагед рагатеХегз дитр 5Ьом аХХ оТ 1Не рагатеХегз оТ а поде гп а УАМЬ ТПе Тогта деХ 0е1 рагатеТег 1151 Ои1ри1 а 1151 оГ амаПаЫе рагате!ег5 1оад 1_оад рагате!ег Н1е Тог а поде зе! 5е1 рагатеТег СаП 'гоз2 рагат <соттапд> -Ь' Тог тоге деТаПед изаде. Рис. 2.68 ❖ Пример управления движением черегахи
1. Просмотр списка параметров Какие параметры присутствуют на текущий момент в системе КОЗ 2? Это можно узнать с помощью следующей команды терминала. $ гоз? рагат 1т5Т Результат выполнения команды показан на рис. 2.69, где представлен спи- сок имен параметров каждого узла. А гоз2фдиуиепоте:~/деу_>ге гоз 2@диуие Ноте -/деу_*«$ гоз 2 рагат 1л зС /СигСХезгт: Ьаскдгоупд_Ь Ьаскдгоипд_д оаскд< оипд_г ЬоГопотгс до$_.оуегггде5./рагатеСег_еуепГз.риЫг$Нег .берег, доз_оуеггт.дез./рагатегег_еуеп1:з. риЫЛзЬег, скгаЬгИгу доз_оуег г Где з. /раг апеСег еуеп* з. риЫлзНег. Щ зГогу доз_оуеггГдез./раг атеСы _еуепСз.риЫлз11ег.геТлаЫЛлсу зГагс_суре_дезсгтрс1оп_зегуГсе изо зтп Лто Рис. 2.69 ♦ Результат выполнения команды управления движением черепахи 2. Получение и изменение параметров Для получения и изменения значения какого-либо параметра используются подкоманды §еГ и зе1 соответственно после команды рагат, Результат вы- полнения показан на рис. 2.70. $ гоз? рагат дезсгтЬе СигСТезгт 6аскдгоипс1_Ь # Просмотр описания параметра. $ гоз2 рагат деГ Гиггкезтт Ьаекдгоипс1_Ь # Запрос значения параметра. $ гоз? рагат зе! СигПезгт Ьаскдгоипс1_Ь 10 # Изменение значения параметра. 3. Сохранение параметров в файл и загрузка их из файла Получать и изменять параметры по одному слишком утомительно, поэтому лучше воспользоваться файлом с параметрами. В КОЯ 2 файлы параметров используют формат УАМЬ. Для сохранения па- раметров узла в файл используется подкоманда с!шпр после команды рагат. Для загрузки всех параметров из файла используется подкоманда 1оай. Ре- зультат выполнения и формат содержимого файла параметров показаны на рис. 2.70. $ гоз? рагат дитр ГигНезгт » Сигг1езГт.уат1 $ г оз2 рагат Дозе! ГигПезГп СигНезгп.уат! # Сохранение параметров узла в файл. # Загрузка всех параметров из файла.
ГП гоз2(5»диуиеНоте: ~/<1е7_у/5 О = го52@диуиеЬоте:~/<1еу_ш5$ гон2 рагат ПезсгхЬе ^игЧезхт Ьаскдгоипс1_Ь Рагате1ег пале: Ьаскдгоипд_Ь , Туре: хп!едег I ОезсгхрХхоп: В1ие сЬаппеТ оТ 4Ье Ьаскдгоипд соТог СопзХгаТп^з: Мхп уа1ие: 0 Мах уаТие: 255 51ер: 1 го52@диуиеЬоте:*-/<1еу_ы5$ го$2 рагат де! ХигИезхт Ьаскдгоипд_Ь 1п1едег уаТие х$: 255 го52@диуиеЬоте:~/<1еу_и5$ гоз2 рагат зе! 1иг11езхт Ьаскдгоипд_Ь 10 5е1 рагатеХег зиссеззГиТ 4 го52@диуиеЬоте:~/<1е7_ш5$ гоз2 рагат дитр СигНевхт » 1иг!1е5хт.уат1 го52@диуиеЬоте:~/<1еу_и5$ Тз ЬитЫ хпзХаИ Тод зге ТигИезТт. уатТ гоз2@диуиеКоте:~/<1еу_н5$ са! ТигНезхт. уат! /ТигМезхт: I гоз____рагатеТегз: Ьаскдгоипс1_Ь; 10 Ьаскдгоипд_д: 86 Ьаскдгоцпд_г: 69 ЬоТопотхс: ТаТзе до5_оуеггхдез: /рагате1ег еуепТ5: Рис. 2.70 ❖ Результат получения, изменения, сохранения и загрузки параметров 2.9.4. Программирование параметров (Ру1Ноп) Выполнять установку и чтение значений параметров в коде узла относитель- но просто, это реализуется с помощью нескольких функций. Давайте изучим, как использовать эти функции. 1. Результаты выполнения Давайте изучим пример программы. Откройте терминал и выполните пер- вую команду для запуска узла рагат_с!ес1аге. В журнал выводится информа- ция с параметром узла, где после НеПо следует значение параметра тЬо1, как показано на рис. 2.71. гоЬоГ пате - это имя параметра. Если с помощью командной строки изменить значение этого параметра на ГигНе, программа узла вернет параметр к значению тЬоГ. $ гоз2 гип Т.еагпгпд_рагапеСег рагап_1ес'.аге $ гоз2 рагат зег рагап_с1ес1аге го0ог_папе бигНе ГП гоБ/ЖдигуиеНоте: •/8еу_«га С = □ х го52@диуиепопе:~/деи_н5$ гсз2 гип Геагпхпд рага'пеГег ра-ап <3е<1аге [1КР0] [1720832503.639671356] [рагап.аесСа. е]: НеПо тЬоС! [1КГЭ] [1720852505.623076369] [рагатп_<1ес1 аге]: НеПо СигПе! Г 1КЕ0][ 1720852507.622716156] [рагач НесГаге]: НеПс пЬос! Рис. 2.71 ❖ Результат выполнения призера работы с параметрами (Руйтоп) 2. Анализ кода Как в этом примере создаются, считываются и изменяются параметры? Пол- ная реализация находится в файле 1еагтпу_рагате1:ег/ра1ап1_с1ес1аге,ру. Ниже представлены ключевые фрагменты кода.
с!азз Ра патеТес Мос1е(Мос1е): беГ __дпИ___(зеИ, папе): зирег().__тп1С__(папе) ьеИ.Нпег = зеИ:.сгеаСе_1:1пег(2, зе1 Г.Нпег_са11Ьаск) # Создание параметра с установкой значения по умолчанию в пЬог. зеИ.Сес1аге_рагапе1:ег(' гоЬоС_папе', 1 пЬок') # Создание функции обратного вызова для периодического выполнения по таймеоу. ОеС НтещсаПЬаскСзеИ): # Получение значения параметра гоЬоб_папе из системы РОВ 2. гоЬоГ_папе_рага?1 - зеТАдеГ-рагааебегС1 гоЬо^папе') деАрагапеСег^акиеО.зСгтпд^аТсе # Вывод информации в журнал с полученным значением параметра. 5еИ.деб_1сддег().гп<:о( НеПо %з!' % гоЬоС_пане_рагап) # Установка значения параметра гсЬойпапе обратно в пбог. пец_папе_рагап = гсйру.рагапеСег.Рггаг.еСег('гоЬоС_папе', гс1ру.РагапеРег.Туре.5ТР1МС, ’пЬоС1) аЦ_пеи_рагапеТег5 = [геи_паге_раггт] # Обновление списка параметров в системе РОВ 2 новыми значениями, зе 1Г.зес_рагапеСегз(а11_пеи_рагапесегз) Метод Йес1аге_рагате1:ег() позволяет создать параметр, ^е1_рагате(:ег() - прочитать значение параметра, а веТ рагашеТегвО - установить значения нескольких параметров одновременно. Это основные методы работы с па- раметрами в программном коде. 2.9.5. Программирование параметров (С++) Программирование на С++ выполняется аналогично. Пример программы с использованием параметров можно запустить с помощью следующей ко- манды. Результаты выполнения показаны на рис. 2.72. $ гоз2 гип 1еагптг1д_рага1че-(:ег_срр рагап_с1ес1аге $ гоз? рагат зеГ рагап_с!ес1аге гэЬот_папе СигНе Полный пример программы находится в файле 1еэгпт&_рагэтеТег_срр/вгс/ рагат_с1ес1агс.срр. Ниже представлены ключевые фрагменты кода ссазз Ра-атесегМоСе : риЬПс гекерр: :Мобе риЫЛс: Регате1:егКос1е() : Чобе("рагэп_бес1аге ) {
// Создание параметра с установкой значения пс умолчанию в пЬсС. сЫ5->(]ес1аге_рагар1еСег( 'гсЬоГ-Папе", ' пЬоС"); // Создание таймера для периодического выполнения функции обратного вызова. 1тпег_ = СЬт5->сгеа1:е_иаи_т:гг,ег( 1000пз, збФ :Ы.пс1 (&РагагпебегМсде: :Мпег_са11баск, СМз)); } // Функция обратного вызова, выполняемая по таймеру. уот.с1 С1|'1ег__саПЬаск() { // Получение значения параметра гоЬоб_папе из системы РС8 2. 5бс1: гзбгтпд гоЬоб_папе_рагап = Рп5->де1:_рага,ле1:ег("гоЬог_па11.е,').а5_'Лг1пд(); ,'/ Вызод в журнал полученного значения // параметра. РС1СРР_1МЕО(1:1т15->деС_1оддег(), НеНо !", гоЬоб_папе_раг ап.с_5бг()); // Установка значения параметра гоЬоС_папе обратно в пЬоб. 5бс1: :7есбог<гс1срр: :Рагапебег> а11_пеи_рагапебег5{гс1срр: :Рагапебег("гоЬо1:_11аае", "иЬо!")]; // Обновление списка паоаметрсв в системе 405 2 новыми значениями. СН5->5ет_рагапе1:ег5(аи_пеи_раг алеТег 5); } ргсуате: гс 1срр: ЛтпегВазе::5ЬагебРЕ:г Нг.ег ; }; ГП го52(П)диуоеЬоте: ~/8еу_мге О = □ х го52@диуиеЬоте:~/деу_и5$ гоз2 гип 1еагпгпд_рагате1:ег_срр рагат_дес1аге [1МЕО] [1721487276.491265848] [рагат_дес!аге]: НеНо тЬоН [1МЕО] [1721487277.491618832] [рагат_дес!аге]: НеНо тЬоН [ШЕО] [1721487278.491445529] [рагат.десТаге]: НеНо тЬоН [1МЕ0] [1721487279.491438006] [рагат_дес1аге]: НеНо тЬоН [1МЕО] [1721487280.491207744] [рагат_дес1аге]: НеНо тЬоН [1МЕ0] [1721487281.491375962] [рагат.десТаге]: НеНо тЬоН [1ЧЕ0] [1721487282.491105298] [рагат_дес!аге]: НеНо 1игНе! [11ЧГ0] [1721487283.491897501] [рагат_дес1аге]: НеНо тЬоН [1МЕ0] [1721487284.491246292] [рагат_дес!аге]: НеНо тЬо1! [1ИЕ0] [1721487285.491181501] [рагат дес!аге]: НеНо тЬоН Н ГП го $2(П)диуи еНоте: ~/<1еу_Ш5 С = _ □ х го52@диуиеЬоте:~/деу_«5$ гоб2 рагат зе! рагат_с!ес1аге гоЬо1_пате 1игНе 5е* рагате1:ег зиссеззГи! го52@диуиеЬоте:~/(1еу ы5$ | Рис. 2.72 ❖ Результат выполнения примера работы с параметрами (С++) Как и в РуШоп, метод с,ес1аге_рагате1:ег() создает параметр, §е1_рагате^ег() читает значение параметра, а зек рагатекегзО устанавливает значения не- скольких параметров одновременно.
2,9,6. Пример использования параметров: установка порога для обнаружения объектов Теперь научимся использовать параметры в робототехнике. Продолжим оп- тимизацию примера с обнаружением объектов. Распознавание объектов чувствительно к освещению, и в различных усло- виях используются разные пороги цвета, Изменение порогов в коде каждый раз очень неудобно, поэтому их можно выделить в параметры и динами- чески изменять во время выполнения, что значительно повысит удобство сопровождения программы. 2. Результаты выполнения Перейдем к делу и посмотрим, как работает измененная версия примера программы. Откройте три терминала и выполните следующие команды: 1) запустите узел драйвера камеры; 2) запустите узел обнаружения объектов; 3) измените пороговое значение для красного цвета через командную строку, чтобы динамически изменить результаты обнаружения: $ гоз2 гип и5Ь_сап изЬ_сап_пос1е_ех= $ гоз2 гип 1еагптлд_рагапе1:ег рагаЛ-ОЬ^есС-гкСесГ $ гоз2 ргган зеС рагап_оэ]ес1:_с1еСесг гес!_Ь_иррег 180 В запущенном узле обнаружения объектов по умолчанию верхний предел порога для красного цвета намеренно установлен в 0. Если этот параметр не изменить, узел не сможет выполнять функцию обнаружения объектов, как показано на рис. 2.73. Рис. 2.73 ❖ Обнаружение объектов не выполняется из-за неправильного порога зого значения
После изменения значения параметра порога для красного цвета на 180 через командную строку вы сразу увидите изменение результатов обнару- жения объекта, как показано на рис. 2.74. Можете попробовать далее кор- ректировать значение параметра, чтобы достичь оптимальных результатов обнаружения. Рис. 2.74 ❖ Обнаружение объекта после изменения порога 2, Анализ кода Полный код приведенного выше примера программы находится в файле 1еагпт&_рагате1ег/рагат_оЬ]ес1:_11е1:ес1:.ру. Ниже представлены ключевые фрагменты кода. 1оиег_гес = пр. аг гау( [0, 90, 128]) иррег_геб = лр.аггау([ 180, 255, 255]) # Нижний порог Н5У для красного цвета. # Верхний порог Н5У для красного цвета. сТазз 1паде5нЬзсг1Ьег(Но|1е): бе! ___тпП:__(зеП, папе): заре: ().__спИ___(папе) # Создание подписчика (тип сообщения, название темы, функция обратного вызова, длкна # очереди). зеИ.зиЬ - зе11:.сгеа1'е_зиЬ5сггрНоп(1пэде, ' гпаде_гач', зеП.изСепег саПЬаск, 10) # Создание объекта для конвертации между изображениями Оре.тСУ и РОВ. зеИ.С7_Ьг11де - СчВгтДде() # Создание параметра для верхнего порога.
зеЦг.бес1аге_рагап’ебег(' гесИ1_иррег', 0) # Создание параметра для нижнего порога. 5е'И.с1ес1.аге_рага1’’е1:ег( геб_1т_Ъыег', 0) <М оЬдесб_бебес{(зеИ, стаде): # Получение значения параметра верхнего порога. иррег_1 ес1 [0] = зеИ.деб_рага?1егег(' ге<1_Ь иррег1).дет_рагапе’:ег_7а1.ие().слбедег_уа!ие # Получение значения параметра нижнего порога. 1о1че"_1 ес1[0] = 5еИ.уеС_рага,т1е1:ег(' ге^_Н_1оиег1 ).деб_рага1'1е<:ег_7а1ие().спбедег_^а1ие # Зывод полученных значении параметров в журнал. зе1б.деб_1оддег()лп'Го('Себ кеб Н Пррег: %с1, 1_оыег: %сГ % (иррег_геб[0], 1оие;_гес1[0])) # Конвертация изображения из модели ВСК в НБУ. ЬзУ-Тнд = су2.С7бСо1ог(спаде, су2.С0ЮК_ВСК2Н5\/) # Бинаризация изображения. пазк_гес! = су2.гнНапде(||37_1?1д, 1с1чег_1еб, иррег_геб) # Обнаружение контуров на изображении. сопбоигз, Ьсегагску = С72.бспбСопбоигз(Р1азк_1 еб, С72.РЕТВ_1_15Т, су2.СНА1М_АРРРОХ_НОМЕ) # Удаление шумов со слишком маленькой площадью контура. бог спб тп сопсоигз: сб спб.зЬаре[Р] < 150: сопбтпие # Получение координат (х,у) верхнего левого угла контура и его размеров (ширина, высота). (х, у, и, К) = С72.Ьои11ЛпдВесб(спб) # Огрисовка контура объекта. су2.бга1л|Сопбоигз(б|Ладе, [спб], -1, (0, 255, 0), 2) # Огрисов<а центральной точки ооъекта. су2.ст.гс1е(гГ1аде, (спб(х+и/2), спЦу+Ь/2)), 5, (0, 255, 0), -1) # Отображение обработанного изображения с помощью ОрепСУ. су2.тлз1тои( ’сЬдесг", спаде) су2.иагбКеу(50) В функции оЬ]ес1:_с1еГесГ() перед каждым выполнением обнаружения объ- ектов с помощью метода §е1_рагате1ег() получаются новые значения поро- говых параметров Если вы изменили значение параметра через командную строку, в следующий раз, когда будет получено значение порогового значе- ния, оно изменится, что приведет к динамическому изменению результатов обнаружения объектов. 2.10. Служба распределения данных (005): нейронная сеть робота В системе НОЕ 2 реализация тем, служб и действий использует механизм коммуникации ИВЕ, который можно сравнить с нейронной сетью в системе роботов КОЕ 2.
2.10.1. Что такое 005 008 не является новой коммуникационной технологией. До использования в КОЗ 2 ВГ)8 уже широко применялась в различных областях. В сфере бес- пилотных транспортных средств обычно присутствуют модули восприятия, прогнозирования, принятия решений и позиционирования, которые требу- ют быстрого и частого обмена данными, как показано на рис. 2.75. 008 пре красно удовлетворяет потребности в коммуникации между этими модулями. Рис 2.75 ❖ Четыре распространенных режима коммуникации ВИЗ расшифровывается как Ва1а От81пЬиНоп Зеппсе, то есть служба рас- пределения данных. Эта технология появилась в 2904 году, она была раз- работана и поддерживается организацией ОЬ)’есС МапауешепГ Сгонр (ОМС), представляет собой стандарт распределения и подписки данных, специально разработанный для систем реального времени. Первоначально ВВ8 при- менялась в ВМС США для решения проблем совместимости при обновлении программного обеспечения в сложной коммуникационной среде кораблей, а теперь стала общепринятым стандартом. ДК Организация ОЬ]ес1 МападетелГ Сгоьр была основана в 1989 гаду с целью разработ ки технологических стандартов, которые приносят реальную пользу тысячам специа- лизированных отраслей Помимо 005 организация поддерживает множество других технологических стандартов,таких как языки моделирования 8У8М1. и ОМЬ, а также стандарт промежуточного ПО СОЗВА. Технология ВВ8 играет ключевую роль в системе КОЗ 2, так как все раз- работки высокого уровня базируются на 008. Она делает акцент на данных и предоставляет широкий набор политик качества обслуживания для обеспе-
чения эффективного и гибкого распределения данных в режиме реального времени, отвечая потребностям различных распределенных коммуникаци- онных приложений. 008 является стандартом коммуникации, подобно 4С или 50. А раз это стандарт, любой .может реализовать соответствующие функции б соответ ствии с ним, как это делают Нпаше! и Опа1сотт с 50. Существует множество коммуникационных систем, реализованных по стандарту 008. На рис. 2.76 изображены модули 008, которые соответствуют системе, разработанной конкретной компанией или организацией. Цззг Сойе (Пользовательский код; □вег Мобев (Пользовательские узлы) КОЗ СНеп( Ьауег (КС1_) (Клиентский уровень КОЗ) гс! (реализация 4032 на языке С) гттл' (008 АР1) КОЗ М|И(11е\уаге 1_ауег (КМУУ) (Промежуточный уровень КОЗ) Раз! 008 Г11005 05 Ьауег (Системный уровень) 5 \Л/1пдо\л/5 Рис. 2.76 ❖ Обзор системной архитектуры КОЗ 2 Существует множество реализаций 008, какую же выбрать? Все они соот- ветствуют основным стандартам, но могут различаться по производительно- сти. Принцип КОЗ 2 заключается в максимальной совместимости, позволяя пользователям делать выбор в зависимости от сценария использования. Если это личная разработка, можно выбрать открытую версию 008. Если это про- мышленное применение, возможно, потребуется коммерческая лицензия. Для обеспечения совместимости с различными производителями 008 для КОЗ 2 разработали промежуточное программное обеспечение МШсПешаге, представляющее собой единый стандарт. Независимо от того, какая реали- зация 008 используется, интерфейсы функций верхнего уровня программи- рования остаются неизменными. Таким образом, проблема совместимости
перекладывается на разработчиков ЛВЗ: если они хотят, чтобы их реализа- ция ОШ вошла в экосистему КОЗ, они должны разработать драйверы в соот- ветствии со стандартами интерфейсов КОЗ 2. В любом случае, цель КОЗ 2 остается неизменной - повышение уровня повторного использования программного обеспечения в робототехнике: «меняй 035 на нижнем уровне,а верхнее прикладное программное обеспечение оставляй без изменений». Благодаря включению 13В8 в четыре основных компонента КОЗ 2 значи- тельно повышается общая эффективность распределенной коммуникаци онной системы, что позволяет сосредоточиться на разработке приложений верхнего уровня, не беспокоясь о проблемах коммуникации. 2.10.2. Модель коммуникации 008 Основой ВОЗ является коммуникация, и существует множество моделей и программных фреймворков для ее реализации. Обычно их делят на четы- ре типа, как показано на рис. 2.77. Точка-точка ТСР. КЕЗТ, №*, ОГ>С ЫА СОРВА, ТИпй IV одель брокера МОТТ, ХМРР АМОР, КаГка Модель, ориентированная на данные р|е1аЬи8 САМЬиз, 008 ОРС ОАРиЬ-ЗиЬ Рис. 2.77 ❖ Четыре распространенные модели коммуникации 1. Точка-точка Многие клиенты подключаются к одному серверу, и для каждой сессии связи необходимо устанавливать соединение между сторонами коммуникации. С увеличением числа узлов связи увеличивается и количество соединений. Каждый клиент должен знать конкретный адрес сервера и предоставляемые им услуги. Если адрес сервера изменится, это затронет всех клиентов.
2. Модель брокера Эта модель является оптимизацией модели «точка точка», в которой брокер централизованно обрабатывает все запросы узлов и находит роль, способную ответить на запрос. Клиентам не нужно знать конкретный адрес сервера. Однако у этого подхода есть очевидные недостатки: производительность брокера влияет на эффективность всех узлов, и при увеличении масштаба системы брокер становится узким местом. Более того, если брокер выйдет из строя, это может привести к сбою всей системы. 4К Коммуникационная система КОЗ 1 использует модель брокера, и при отказе узла Мазтег вся система передает функционировать. 3. Широковещательная модель Все узлы .могут транслировать сообщения по каналу связи, а все остальные узлы могут их получать. Эта модель решает проблему адресации сервера, и сторонам коммуникации не нужно устанавливать отдельное соединение. Однако из-за большого количества сообщений в широковещательном канале все узлы должны обрабатывать все сообщения, что может привести к значи- тельным затратам системных ресурсов и неэффективному использованию пропускной способности сети связи. 4. Модель, ориентированная на данные Эта модель схожа с широковещательной, но все узлы могут публиковать и подписываться на сообщения в шине данных (Т)а1а Виз). Преимущество этой модели заключается в наличии множества параллельных каналов связи, что позволяет каждому узлу сосредоточиться только на интересующих его сообщениях и игнорировать остальные. Это похоже на вращающийся кон- вейер с блюдами: различные вкусные блюда перемещаются по шине данных, и каждый может взять только то, что ему нужно, игнорируя остальное. ПП8 использует модель, ориентированную на данные, что обеспечивает значительные преимущества. 2.103. Стратегия обеспечения качества Какие преимущества предоставляет ЙЙ8 для системы коммуникации КОЗ 2? На рис. 2.78 показана схема этой модели, которая поможет нам разобраться в данном вопросе. Базовой структурой ОЭ8 является домен. Домен связывает различные при- ложения и определяет структуру глобального пространства данных. Взаи- модействовать друг с другом могут только узлы в одной доменной группе, что позволяет избежать бесполезного использования ресурсов при обмене данными.
Еще одной важной особенностью ЕЮ5 является стратегия качества обслу- живания (ОнаШу о5 Зепйсе, ОоЗ). ОоЗ представляет собой стратегию передачи данных в сети, при которой приложение указывает необходимое качество передачи, а ОоЗ стремится выполнить эти требования. Это можно рассмат- ривать как соглашение между поставщиком и получателем данных. В КОЗ 2 часто используются следующие стратегии: 1) ЭЕАЭЫМЕ: указывает, что узлы должны завершать обмен данными в пределах заданного срока; 2) Н18ТОКТ: определяет размер кеша для исторических данных; 3) КЕЫАВ1Е1ТТ: описывает режим передачи данных. ВЕ8ТЕГГ0КТ - это режим максимальных усилий, при котором даже при плохих условиях сети обеспечивается плавность передачи, но возможны потери данных. КЕЫАВЪЕ - это надежный режим, который максимально гарантирует целостность данных в процессе передачи. Выбор подходящего режима зависит от сценария применения; 4) ЭЕГКАВ1ЫТУ: позволяет настроить передачу определенного объема исторических данных для поздно присоединившихся узлов, чтобы они могли быстро адаптироваться к системе. Все стратегии ОоЗ в КОЗ 2 можно настроить с помощью следующей струк- туры, определенной в файле /ор1:/го8/|'а27у/1пс\ис1е/гтад/гтАм/1:урс8.1т.
туребеб збгисб КМ1»1_РиВЕ1С_ТУРЕ г™_роз_ргоН1е_з { епип ™_чоз_бгз1:огу_ро1лсу_е НзЕогу; // Настройка политики истории сообщений (}о5. зтгеЕ бертб; // Длина очереди сообщений. епип ™_чоь_ге1ЛаЬт.1.иу_ро1лсу_е геНаЬННу; // Настройка политики надежности (}оЕ. епип гпи_роз_бигаЫ1тгу_роНсу_е бигаЬШЕу; // Настройка политики долговечности ро5. збгисЕ гпи_Е1пе_з беабНпе; // Ожидаемый период отправки/получения сообщений. зЕг^с! гпи_ЕЕпе_з Шезрап; // Время, после которого сообщение считается устаревшим // и недействительным. епип гти_роз_1хуеипез5_роНсу_е ТдуеНпезз; // Настройка политики активности (}о8. зЕгисЕ гпи_Е1пе_з 1.1ие1Епе55_1.ба5е_бигаЕЕоп; // Время, в течение которого узел КНЫ или // издателе должен подтверждать свою // активность. Ьоо1_ а\'о1б_гоз_папе8расе_сопуепЕгопз; // Флаг избегания соглашений о пространстве имен КС5. } ™_роз_ргоН.1.е_Е; Чго произойдет, если не настроить Оо8? Не беспокойтесь, система КОЗ 2 будет использовать параметры по умолчанию. Вы можете ознакомиться с ними в файле /ор^гов^аггуДпсШбе/гтш/гтууЛщов ргоШев.Ь. Мапе сопзб мм_щоь_ргоН1е_Е гпи_ро5_ргоЕЕ1е_зепзог_баЕа = { КМЯ_рЭ5_Р0!_1СУ_Н15Т0РУ_КЕЕР_1АбТ, 5, ЙМИ^0О5_РОЕ1СУ_КЕЕ1АВ1Е1ТУ_ВЕ5Т_ЕЕРОКТ, К.ЧЫ_505_Р0Е 1СУ_ВиКАВП ПУУ01.АТП.Е, РНЫ_0О5_ОЕАОЕ1МЕ_ОЕЕА11ЕТ, К.ЧН_(}Э5_Е1Е Е5 РАМ_ОЕ ЕаНЫ , КМЫ_0О5_РОИСУвЕ1УЕЫМЕ55_5У5ТЕМ_ОЕЕАиЕТ, КМЫ_005_ИУЕ1™Е5$_1ЕА5Е_[ЮРАТ10Н_ВЕЕА1)1Т, ЕаЕзе }; зЕагЕс сопзЕ гпч_ро5_ргоШе_Е ти_роз_ргоП1е_рагапегег5 = { КМЫ_0О5_РО11СУ_Н15ТОКУ_КЕЕР_1А5Т, 1300, К.1Я_5О5_РО11СУ_КЕИАВ111ТУ_КЕ11АВЕЕ, К!Щ_5Э5_РС11СУ_0иКАВ111ТУ_УО1нП1Е, К,ЧЯ_0О5_ОЕАВЕ1НЕ_ВЕЕАи!.Т, КМИ_005_11Е Е5Р АМ_ОЕ ЕА11ЕТ, КМЫ_рО5_РОЕ1СУ_Е1УЕЕ1МЕ$5.5У5ТЕМ_ОЕЕАВЕТ, Ш_5О5_Е1УЕЕ1НЕ5$_ЕЕА5Е_О1ЖАПОН_1)ЕЕАЕЕТ, ЕаТзе }; зСагтс сспзб г™_роз_ргоЕ1.1е_Е гли_ооз_ргоЕЕ1е_беЕаиН = КМи_0О5_РОЕ1СУ_Н15ТОРУ_КЕВР_ЕА5Т, 13, КМН_0О5_РОЕ1СУ_КЕЕ1АВ1Е1ТУ_КЕЕ1АВ1.Е,
КМ<0О5_РОЫСУ_ВиРАЗП1ТУ_УС1АТП.Е, КМЫ_0О$_ОЕАОЕ^Е_СЕЕА1ЛТ, КМ<0С5_И Е Е5РАЫ_0 Е ЕАЫТ, К,Ч<ОС5_Р01:СУ_11УЕ11ЬЕ55_$У$ТЕМ_СЕЕА01.Т, КМЫ_0О5_11УЕ11МЕ55_1ЕА5Е_ОиКАТ1ОЛ1_ОЕЕА1ЛТ, ЕаЕзе }; ьСаЕсс С0П5Е грм_доЕ_ргоЕИе_Е гри_роЕ_ргоЕие_зег71се5_|1еЕаиП = { КМЫ_0О5_Р0Е1СУ_Н15ТОКУ_КЕЕР_ЕА5Т, 10, КМЬ|_5С5_РОЕТСУ_КЕ1 ЕЛВЛ 1ТУ_КЕИЛВ1 Е, КМН_0О5_РО1:СУ_ОиРА31ПТУ_УОЕАТ11Е, КМЬ|_5С5_ПЕАПи^Е_ВЕЕАЫТ, КМЫ_0О$_1.1РЕ5РАМ_ОЕЕА1Л.Т, КМЫ_0О5_РОЕ:СУ_Е1УЕЕ^Е5Ь_$У$ТЕК_ОЕЕА1ЛТ, КМЫ_0О5_ПУЕ1.1ИЕ!>5_1ЕА5Е_1ХЖАТ1ОМ_ОЕРА1Л.Т, Га 1зе }; зЕаЕЛс сопзЕ гпи_до$ ргоНЛе С гпи_роь_ргоЕИе_рагапегег_е7епС5 - { КМН_0О5_РОЕ1СУ_Н15ТОКУ_КЕЕР_1А5Т, 1069, КНЫ_005_Р011СУ_КЕЕ1АВП1ТУ_РЕЕ1АВЕЕ, КМ<00$_Р011СУ_ОиРА31Е1ТУ_У01АТ1ЕЕ, КМИ_рО5_ОЕАО1 ^Е_ВЕЕА01Т, КМЫ_рО$_1.1РЕ5РАМ_ВЕРА1Л.Т, КМИ_рО5_РО1_1СУ_1.1УЕЕШЕ$5_$У$ТЕМ_ВЕЕА111.Т, КМЫ_0О5_11УЕПМЕ55_ЕЕА5Е_[Х)КАТ1ОМ_ОЕРА1ЛТ, Та 1зе }; зЕаНс сопзЕ гпь/_чоз_ргоЕИе_Е гпи_ро5_ргоШе_5у5Сеп_с1еЕэи'1С = { РМИ_С05_Р0Е1СУ_НГ$Т0РУ_5У$ТЕМ_ОЕЕАи1Т, РМЫ_505_Р011СУ_ОЕРТН_5У5ТЕМ_ВЕЕАМЕТ, КМН_0О5_РОИСУ_КЕЕ1АВ1ИТУ_5УЬТЕМ_ОЕЕАи1Т, КМИ_рО5_РОЕ1СУ_(Х]РАВ11ПУ_$У$ТЕМ_ВЕЕАи1Т, КМИ_С05_0ЕА0И«Е_ВЕЕАЫТ, КМЫ_Е)С$_Е1ЕЕЬРАМ_0ЕЕА1!1Т, КМ<0О5_РОИСУ_Е1УЕЕ^Е55_5У5ТЕИ_0ЕЕЛи1.Т, КМ^0ОЬ_11УЕ1№$$_ЕЕА9Е_ОиКАТ16^ВЕЕАОЕТ, ЕаЕзе }; Почему требуется так много различных стратегий? Для лучшего понима- ния рассмотрим пример с роботом, Например, при управлении беспилотником для аэрофотосъемки, если сеть работает нестабильно, пульт управления может использовать режим КЕЫ- АВЬЕ для отправки команд движения беспилотнику, что гарантирует успеш- ную передачу каждой команды, допуская небольшую задержку, как показано
на рис. 2.79, Процесс передачи изображений от беспилотника может исполь- зовать режим ВЕЗТЕЕЕОКТ, обеспечивая плавность видео, хотя возможны потери кадров. Если в этот момент хакер взломает сеть беспилотника, можно зашифровать данные связи КОЗ 2, и хакер не сможет напрямую управлять беспилотником или перехватить полезные данные. Рис. 2.79 ❖ Различные сценарии применения могут использовать разные стратегии Оэ8 Аи1Ьеп11саЬоп (Аутентификация) и Епсгур! зепзфуе да1а (Шифрование конфиденциальных данных) го л тапе! йата (Управляющие команды) угЛео сам (Видеоданные) Внедрение ППЗ значительно изменило систему коммуникации КОЗ 2, пре- доставив разнообразные конфигурации связи, которые лучше соответствуют различным сценариям использования роботов. Каждый .механизм коммуникации имеет свои преимущества и недостатки. Несмотря на то что ППЗ является стабильной и безопасной системой, она имеет более низкую эффективность при передаче больших объемов данных. МК В конце 2023 года в КОЗ провели официальное голосование и приняли решение по- степенно внедрять поддержку другой системы связи - 2епсК, однако это займет че- ко~орое время. Заинтересованные читатели могут следить за последними новостями з сообществе КОЗ. 2.10.4. Настройка Оо$ ЭП5 в командной строке Как же конкретно настроить ОоЗ? Попробуем настроить стратегию ОоЗ ПОЗ через командную строку. Запустите первый терминал и создайте узел-изда- тель в режиме ВЕЗТЕЕЕОКТ, который будет циклически публиковать любые данные. В другом терминале используйте режим КЕЫАВЕЕ для подписки на ту же гему, как показано на рис. 2.80. В этом случае передача данных не- возможна, поскольку стратегии ОоЗ различны. Только изменив оба узла на режим ВЕЗТ ЕЕЕОКТ, можно будет осуществить передачу данных, как по казано на рис. 2.81. $ гоз2 Сорте риЬ /сбаЫзег 'ЛсЩпззз/пзд/Тпиг 'Ваба: 42' --роз-геТЛаЫШу Ье5С_еССсгс $ гоз2 Серее есЬо /сПаССег --роз-геСтаЬтПСу геСтаЫе $ ГО52 Сорте есло /сЬаССег -доз-геСтаЫСтСу Ье5С_еИогг
го52(®диуиеЬоте: ~/6еч_у/5 □ х го52@диуие1юте:~/с1е7_и5$ гоз2 1ор1.с риЬ /сЬаНег з1<Д тздз/пзд/1п132 "даЕа: 42" | --доз-геТЛаМЛгСу Ьез1_еГГог1: рчЬТЛзЬег: Ьедгпгплд 1оор риЫгзЫпд #1: 51:(1_п5д5.т5д. 1п132(да1:а=42) риЫЛзЬглд #2: яХсНпздя.тяд. 1пХ32(с1аХа=42) риЫхяЫпд #3: зХ<1_1лядя.тяд. 1п132(4аХа=42) риЫхзЫпд #4: зХсНлздз.пзд. 1пХ32(<1аХа=42) риЫхзЫпд #5: зХ^^здз.пзд. 1п132(йа1а-42) риЫлзЫпд #6: зХсНчздз.пзд. 1пХ32(Ьа1а=42) [НАЕМ] [1720852881.022678119] [_ГО32с11_5217]: Меи зи рхс 1 /сЬаНег1, гедиезХхпд хпсопраНЫе (}о5. Ио пезза I хпсотраХгЫе роТлсу: ЙЕПАВШТУ риЬИзЫпд #7: з^сМчздз.тзд. 1п132(<1а1:а=42) риЫлзЫпд #8: 81с1_т8дз.тзд. 1п132(с1а1а=42) рцЬИ&Ыло #9: 51(1 тзоз.газд. 1п132(с1а^а=42^ го52(д>диуие1юте: ~Д1еу_»5 гоз2@диуиеЬоте:~/<1еу_и5$ гоз2 Хорхе есбо /сЬаХХег --доя-геХхаЬтЛхХ [НАЕМ] [1720852881.022125716] [_гоз2сН_5245]: Ией риЫхзЬег (Нзсо ’/сЬаНег', оГГегхлд хлсогпраХхЫе ро5. Мо пеззадез нх!1 Ье гесеху хпсотраПЫе роНсу: ЙЕИАВШТУ Рис. 2.80 ♦♦♦ Когда стратегии 0о5 издателя и подписчика различны, передача данных невозможна гоз2(ФдиуиеЬоп1е: ~ □ х го52@диуиеНопе:~$ гоз2 1ор1С есЬо /сЬа111ег --до$-геИаЬгНЛу Ье51_еГГог1 <]а1а: (1а1:а: с]а1а: с1а1а: да!а: да1:а: да!а: да1а: Рис. 2.81 ❖ Когда стратегии Оо5 издателя и подписчика совпадают, передача данных возможна Как узнать стратегию Оо8 каждого издателя или подписчика в системе КОЗ 2? Просто добавьте параметр уетЬозе к команде тоз2 Горю. $ гоз2 Сорте тпГо /сЬгССег --уегЬозе Результат выполнения представлен на рис. 2.82, где подробно изложены Оо5-политики данного узла.
ГП го52(Фдцуи еНоте: ~ О = _ о х го52@диуиеЬопе:~$ гоз2 Хорте тпГо /сЬаХХег --уегЬозе Гуре: 51д_т5д5/т5д/1пХ32 РиЫтзЬег соцпХ: 1 ^оде папе: _гоб2сИ_11328 Чо<3е патезрасе: / Горте Хуре: 5Хд_т5д5/т5д/1пХ32 Горте Хуре ЬзбЬ: Я1Н501_Ь6578аеаЗс58с626сГе8а1абГЬ6еО4Т706Г97е9Г03д2727с9ГГ4е74Ь 1сеГ0деЬ ЕпдротпХ Хуре: РУВИЗНЕЙ СЮ: 01.0Т.е5.Зе.40.2с.€2.67.00.00.00.00.00.00.07.03 5о$ ргоНТе: КеИаЬШЛу: ВЕ5Т.ЕЕЕОКТ НтзХогу (ОерХК): ОМКМОЫИ ОигаЬгШу: УО1_АТ11_Е ЬтГезрап: ХпГтптХе ОеасПЛпе: ГпГтптХе ЦуеКпезБ: А1ЛОМАТ1С 1_туе1тпе55 Хеазе дигаХтоп: ХпТггпЛе 5иЬзсггрХтоп соипX: О Рис. 2.32 ❖ Результат запроса текущей политики Оо5 узла 2.10.5. Пример программирования с использованием 005 Помимо работы в командной строке, можно настроить ОВ8 в коде, как по- казано на рис. 2.83. В качестве примера рассмотрим настройку Оо8 для 008 в коммуникации по теме НеПо \Уот1й. РибНвбег (Издатель) Тема: сЬайег Сообщение: Строка Данные НеНо УУог1с1 ЗиЬзспЬег (Подписчик) Рис. 2.83 ❖ Архитектура коммуникации по теме НеНо УУог1с1 1. Результат выполнения Сначала рассмотрим результат выполнения примера программы. Откройте два терминала и запустите в них узлы издателя и подписчика. $ го$2 гип 1еагпгпд_чо<> доь_Ье11эиог1с1_риЬ $ гоз2 гип 1еагпгпд_до5> до5_Ье11о'л1Ог1с1_5иЬ Результат коммуникации в двух терминалах показан на рис. 2.84 и, на первый взгляд, не сильно отличается от результата, полученного в разде- ле 2.5. Однако в данном случае стратегия нижнего уровня коммуникации отличается.
ги го52(ФдиуиеЬоте: ~/<1еу_Ш5 о = □ ГГчЕО] [1720853050.538581337] [до8_НеПоиог!с1 зиЬ]: I Ьеагд "НеПо ЫогХд" 1МР0] [1720853051 071055861] [доз Ье11омог1с1_8иЬ]: I Ьеагй " НеПо НогХд" ГТ1ЧЕ0] [1720853051.571007721] [доз ЬеПоиогТд зиЬ]: I Неагс) "НеПо Ног1д" ЧИЕО] [1720853052.070887265] [доз_ЬеПомог1(1_8иЬ]: I Ьеагд "НеПо Ног1д" ЧМРО] [1720853052 570213624] [до5_ЬеПомог1д_5иЬ]: I Ьеагд "НеПо НогХб" ПКРО] [1720853053.074035244] [доз_Ь|е11оыог1д_зиЬ]: I Ьеагс! "НеПо Ног1<1" п го52@диуие11оте: ~/с1еу_ш5 с = □ го52@диуиеЬопе:~/<1е7_М5$ го&2 гип 1еагпт.пд_до5 до5_ЬеПоиогХд_риЬ [1ЧЕ0] [1720853042.101816793] [яоз_бе! Ссыог М риЬ]: РиЫлзЫпд • [1МЕ0] [1720853042.570257070] [яо<_НеПоноггд_риЬ]: РиЫлаЬгпд "НеПо Ног1(Г "НеПо Ног1д" [1ИЕ0] [1720853043.069972240] [до'_ЬрПо*огЫ_₽иЬ]: РиЫЛзГппд: "НеПо Ыог1<Г [1ИР0] [1720853043.570219643] [доб_НеПон.огЫ_риЬ] : РиЬПзЫпд: "НеПо 14ог1д" [1МР01 [ 1720853044,070662878] [доз_беПоногЫ_риЬ] : РиЬНаЬгпд: "НеПо Ыог1д" [1МР0] [1720353044.569968873] [док_бр1 1ойогЫ_риЬ] : РиЬИзЫпд: "НеПо Ыог1д" [И4Р0] [172О853045.07О326434] [дсь_ЬеНо^огЫ роЬ]: РиЬИзЫпд: "НеПо ЫогХсГ [1ЧЕ0] [1720353045.570316457] [доб_НеПоиог1а_риЬ]: РиЬ’ПзЫпд: "НеПо ЫогХсГ [1ЧЕ0] [1720853046.070035447] [до'-ЬрГГоиогЫ.риЬ]: РиЫГзЫпд: "НеПо Ыог1д" [И4Р01 [1720853046.570090314] [дог ЬеНоюгЫ риЬ]: РиЬ’ПзЬгпд: "НеПо НогХсГ [1ЧЕС] [1720853047.670153082] [дог_ЬеПоиог1<1_риЬ]: РиЫлзЫпд: "НеПо НогТсГ ГТЫЕП1 Г1771МКЗаЛ7. 57Й1Д415Й1 Гллс Но11пыпг1Н пиЫ ? РнЫтсМпл» "НаПп Ыпг1Н"_________, Рис. 2.84 ❖ Эффект коммуникации по теме НеПо У/огИ 2. Анализ кода издателя Полный текст кода издателя находится в файле 1еагп1п^_ро8/ро8_пе11оштг1с1 рнЬ.ру, а ключевой фрагмент, связанный с ИОВ, приведен ниже. бгоп гсСру.цоз сярэгГ ОоБР^оНДе, СоБКеНабиПуРсНсу, ОоБНгзбогуРоПсу # Классы фо5 в КОБ 2. с1а55 РиЫЛ з1зегМос1е(Кос1е): СеГ___гптл__(зеИ, папе): 5арег().__ггп.1_(папе) # Создание политики роБ. цо5_ргоТЦе = (1о5РгоН1е( # ге ИаЫШу=0о5Ре1ЛаЫШуРо Псу. ВЕБТ_ЕРРОКТ, геПа Ы1т.1у=0о5 ВеИаЫШуРоТлсу. РЕЫАБЕЕ, Ы 5 ±0 г у=фо5Н15 То г у РоИсу. КЕЕР_1 АБТ, ФерТЬ-1 ) # Сознание объекта издателя (тип сообщения, название темы, политика роБ). зеИ.рпЬ = зеИ.сгеа!е_риЫл5Ьег(БТгтлд, "сНаТсег", цэзргоРПе) # Сознание таймера (функция обратного вызова, период в секундах). зеПЛ’.пег = 5еПг.сгеаСе_Н.пег(0.5, 5еИ.Нпег_саПЬэск) # Функция обратного вызова, выполняемая по таймеру. беГ Ппег_са11Ьаск(5е1Р): нзд = БбгспдО # Создание объекта сообщения типа БСгспд. пзд.баТа = НеПо ИогТб' # Заполнение данных сообщения. 5еИ.ри'о.риЫ.т.5к(п5д) # Публикация сообщения в тему.
В приведенном выше коде основное изменение заключается в создании необходимого режима Оо8 с помощью Оо$РгоШе() и его использовании при создании издателя. После первоначальной настройки, если в процессе эксплуатации потребу- ется изменить политику Оо$, это можно сделать непосредственно в структуре. 2. Анализ кода подписчика При создании подписчика также необходимо использовать аналогичную на- стройку Оо8. Полный код находится в файле 1еагп1п§_цо8/цо8_11е11о\лгог1б_8иЪ.ру. Ггогт гсТру.дов тпрсгб фоЗРгоГПе, роЗКбТ’.аЬ’.ИГуРоПсу, ОобНтвСогуРэПсу # Класс (^о8 в К05 2. с'1а55 РиЫт-З^егМобе(.Мос1е): беГ___т.п1б_(зеИ, паче): 5ирег()-__тпИ___щапе) # Создание одной стратегии <Эо5. дов_ргэН1е - $о8РгоТт1.е( # геПаЬП ИуЦ)о8Че11аЫиГуРо1Лсу. ЕЕ5Т_ЕЕР0РТ, ге1гаЬШ1:у=5о8Ке1ЛаЬ';.и1:уРоису.ЕЕ!-1АВ1Е, Ы5Согу=0о8Н15!:огуРоЦ.су>КЕЕР_1А5Т, с!ерГН-1 ) # Создание объекта издателя (тип сообщения, имя темы, стратегия Зс8). зеИ.риЬ : 5еИ:.сгеаГе_риЫг51тег(8Сг1пд, 'сВаттег", дэзргобие) # Создание таймера (вызываемой функции, выполняемой через заданный период, единица - # секунда). зеТГ.Нпег < веИ:.сгеаТ-е_1:гпег(Э.5, веЪЕ.Нпег_са11Ьаск) # Создание функции обратного вызова, выполняемой таймером периодически. Реб Нпег_саиЬаск(ве11:): пвд = БбгтпдО # Создание объекта сообщения типа ЗСгтпд. пвд.ааСа = НеПо Ыог1с1 # Заполнение данных сообщения в объекте сообщения. веП.риЬ.риЫт51т(гп5д) # Публикация сообщения темы. 005 поедс_авляет собой чрезвычайно сложный механизм коммуникации, и вышеиз- ложенное - лишь малая его часть. Здесь мы хотим лишь познакомите читателя с 005. Для получения более подробной информации и методов использования рекоменду- ется обратиться к онлайн-ресурсам и руководствам конкретных разработчиков 005. 2.11. Распределенная коммуникация Интеллектуальные роботы обладают большим количеством Функций. Если все их разместить на одном компьютере, может возникнуть проблема недо-
статочной вычислительной мощности и задержек в обработке. Однако если эти задачи разбить и распределить по нескольким компьютерам, можно лег- ко решить проблему ограниченности ресурсов. КОЗ 2 предоставляет способ распределения задач на нескольких вычислительных платформах - распре- деленная коммуникация. 2.11.1. Что такое распределенная коммуникация Функции робота состоят из различных узлов, которые могут находиться на разных компьютерах. Распределенная коммуникация позволяет распреде- лять задачи, требующие значительных ресурсов, по различным платформам, снижая нагрузку на вычислительные мощности. При разработке приложений для роботов разработчики часто размещают функции системы робота как на стороне устройства, так и на стороне раз- работчика, как показано на рис. 2.85. Этот подход значительно умсньша ет размеры робота и позволяет разработчикам удаленно контролировать устройство робота. Рис. 2.85 ❖ Схематическое изображение концепции распределенной коммуникации 4М Конечное устройство может бьгь компьютером или встраиваемой платой, например КаьрЬеггу Р:, РОК и т. д. В примерах этой книги используемся плата КОК ХЗ. но методы применения для других плат аналогичны. Система КОЗ 2 с самого начала проектировалась с поддержкой распреде- ленной коммуникации, что позволяет быстро реализовать связь устройств между несколькими узлами в одной локальной сети. Например, на конечном устройстве можно реализовать функции управления сенсорами, управления двигателями, интеллектуальными функциями, а на стороне разработчика -
визуализацию информации с сенсоров, удаленное управление движением робота и другие функции. 2.11.2, Удаленное сетевое подключение по $5Н 88Н (8еспге 8Не11) - это сетевой протокол, предоставляющий безопасный ко- мандный интерфейс через зашифрованное соединение, часто используемый для удаленного выполнения команд. Для реализации удаленного подключения к целевой плате с компьютера разработчика можно использовать следующую команду. $ {имч_пользователя}@{1Р-аДрес} # Пример: $ ззЬ госЬ@192.168.1.10 Эта команда также работает и в операционной системе ААЧпбом/з: откройте Роадег8Ье11 и введите команду для удаленного подключения, как показано на рис. 2.86. Здесь гоо1 - это имя пользователя целевой платы, а 192.168.1.10 - ее 1Р-адрес. Если устройство поддерживает 88К-подключение, будет предложе- но ввести пароль, после чего можно будет удаленно управлять платой через терминал, как если бы это был локальный компьютер. Р5 С:\11зег5\12459> 5зН гоо!^192.168.1.10 ТНе аиТИепТхсхТу о-Е Коз! '192.168.1.10 (192.168.1.10)' сап'! Ье езТаЬПзИес!. Е025519 кеу Т1п§егрг1пТ 15 5НА256: РЭс10т6рВУ§61РВМАТЮ^уМЭр2^Нка1ЧУи-Е341§Те80р. ТЫз Коз! кеу хз кпоил Ьу ТЬе €о11оы1п§ оТЬег памез/ас^геззез: С: \изегз\12459/. зз11/кпомп_ИозТз: 1: 192.168.1.105 С: \изегз\12459/ . ззЬ/кпомп_ИозТз: 4: 192.168.0.107 Аге уои зиге уои мапТ То сопТ1пие соппесТ1п§ (уез/по/[-Е1п§егрг1пТ])? уез Ыагп1п§: Регтапеп'Ыу ас1с1ес1 '192.168.1.10' (Е025519) То ТЬе 1151 о-Е кпошп ЬозТз. гооТ@192.168.1.10'з раззмогс!: Не1соте То иЬиггТи 20.04.6 1_Т5 (ОШ/Ипих 4.14.87 аагсЬ64) * ОоситепТаИоп: ИТ1р$://Ие1р.иЬипТи.сот * МападетепТ: ИТТрз://1апс1$саре. сапоп1са1. сот * ЗиррогТ: 1т1Т:р$://иЬип1и.сот/аскап1аёе 1_азТ 1о§1п: 5аТ Зип 22 23:55:44 2024 -Егот 192.168.1.22 1Р: УЕКЗЮМ: 2.0.2 Рис. 2.86 ❖ Пример удаленного 88Н-подключения к птате разработки МК Метод удаленного 88Н-подключения к плате, описанный выше, подходит для под- ключения к любому устройству, поддерживающему протокол 88Н. Хотя использование Ро^гег8пе11 позволяет быстро подключиться к уда- ленной плате, это не всегда удобно для разработки кода, В таких случаях можно использовать интегрированную среду разработки У8Сойе. В расши- рениях У8Сос1е выполните поиск по слову 88Н, появится результат ХЧзпа!
81иЛо Собе Кетозе - 88Н. После загрузки в левом нижнем углу окна У8Сойе появится значок с двумя треугольными скобками, нажав на который, мож- но выполнить удаленное 88Н-подключение к другим устройствам прямо из \г8Сос1е. Подключение выполняется с помощью аналогичной команды язп гооХ@192.168.1.0, как показано на рис. 2.87. После успешного подключения можно будет удаленно писать код на других устройствах, как показано на рис, 2.88. Егйег $$Н Соппесйол Соттапб О Е5Р ЮР: ЗеагсК Ег гзИ го<й<§>192 168110 Ргезз 'ЕпХег' 1о сопбгт уоиг три! ог 'Езсаре 1о сапсе! ®КетоГе - 55Н Ореп апу (о1бег оп а гетоХе тасЫпе изтд 85Н апс! Хаке абуапХаде оХ Собе’з Ти11 ХеаХиге зеХ $ МкговоЙ 55Н Е5 Рис. 2.87 ❖ Удаленное $8Н-подключение в УЗСобе Р,е ЬМ 5>е1е<Поп У1ен ЕХП.08ЕК 0РЕМЕ01Т0К К00Т (53Н 192.168.1.10) сасЬе сопйд > .1о<а1 ^собе «егуег > сопЯд Опд1пЬо1-у|рг $ 6а$Ь_а1|а$е$ ,Ьа$Ь_Ь15(огу $ .ЬазМодош $ ЬазКгс О дИсопйд $ ргоЯ1е У1Ш1П(О идеЬЬвЬ С* ог1дтсаг_Ьа$есрр X <з> Ш - йеу.ют > вгс > <х1д!псаг > олдтсаг.Ьже > яс > & олдтсаг.Ык* срр > ® опдтсаг ЬаюО 399 391 302 393 394 вез 306 307 398 399 310 311 312 313 314 315 316 317 318 319 320 321 оп$1псаг_Ьа5е: :ог181псаг_Ьа5е() гс1срр..Ыос1е ("ог1в1псаг_Ьа$е ') тет5в1:(8йоЬо1_Роз, 9, нетзеЬ(8йоЬо1_Уя1л 9, тетз ей(&Пес е1уе_Оайа, тетзей(85еп<)_Райа, б, $ тетзей (ЬМри6050_Оа1:а, 5 неоР (В оЬо!_Ро5)); 512вор;йоЬо!_Ув1)); 0, 512ео€(Яесе1уе_0а1а)); 51геоР(5епа_0айа)); 0, 512еоТ(Мри6059_Оа1:а)); Ап1 8ег1а1_Ьаьд_гайе 115299, 1Н15-><1ес1аге_рвгатейег<5йс1. . 81г1П8>("и8«г1:_рог1:_пате’’, '*/<1вУ/11уСН343и8В0' ), 1М5->с1ес1аге_рага«1е'Сег<з'Сс1::зйг1Пв>("ст<1_уе1", ‘спк1_уе1"); »Ы5->Зас1аге_рагатегег<?йа-: 4ТГ1лв>("акт_егай_уе1", аскегтапп_спй"); 1Н?->с1ес1аге_рагатей*г<5Ы' 51г1пв>("о<1от_Ггате_1<1", "одот"); 4Ыз->4ес1аге_рагатейег<51с1:: ь±г1пв>( "гоЬо1_-Ргате_х8", "Ьа5е_11пк"); 1Ыз->с1ес1аге_рагаи1е1:ег<5йс1.. $1г1п8>("8уго_Ргате_1<Г, "вуго_Нпк"), С1И8->вег_рагатегег( нзег1а1_0аи4_гаге ", 5епа1_Ьаи<1_гасе); йЫ®->8вй_рагап»йвг( пи5аМ:_рогй_пата”, и4агй_рогй_патв); Рис. 2.88 ♦♦♦ Использование У8Сос1е для удаленного написания кода 2.113. Распределенная передача данных Мы установили соединение между компьютером и платой разработки через 88Н, что является основным условием для осуществления распределенной коммуникации в К08 2. Если нам необходимо развернуть узлы робота К.08 2 на различных устройствах, то какие действия нужно предпринять? На самом деле в системе коммуникации К08 2 уже все есть для этого. До- статочно подключить несколько устройств к одной сети, и без какой-либо дополнительной настройки узлы К08 2 на этих устройствах смогут обмени ваться данными. Представим, что у нас есть компьютер и плата разработки. Давайте развернем узлы для темы и службы и проверим, удастся ли нам передать данные между ними.
Используя метод, описанный в разделе 2.11.2, подключитесь к плате раз- работки через и запустите на ней узел подписчика темы. $ ГЭ52 гип ехатэ1е5_гс!срр_пгпг1>1а1_5иЬ5СггЬег зиЬзсгсЬегдпег'.ЬеГ-ГипсНоп # Ра плате разработки. Перед запуском необходимо убедиться, выполнены ли следующие предварительные действия: 1) пакеть. функций скомпилированы в среде 11ЬьпТи на плате разработки. Нетод создания и компиляции рабочего пространства на плате разработки полностью соответствует описанному в этой главе Следуйте инструкциям в зависимости от используемой платы разработки; 2) плата разработки и компьютер подключены к одной сети, обычно к одному ком мутатору или маршрутизатору. В терминале на компьютере введите следующую команду для запуска из- дателя темы: $ гоз2 тип ехапэ1е5_гс1срр_п1пгпа1_риьИ51те" рийг51тег_грепЬег бипстгоп # На компьютере. Если на одном компьютере один узел публикует сообщения темы, а другой узел на них подписывается, между ними будет передаваться строка «НеПо Ууог 1с1». Сейчас, используя два устройства для запуска узлов, можно наблю- дать аналогичный эффект передачи данных, как показано на рис, 2,89 и 2.90. [1МРО] [1МЕО] [1ЫЕО] [1ЫЕО] [1МЕО] [1МРО] [11ЧЕ0] [1МРО] [1МЕО] [1ЫЕО] [1МЕО] [1МРО] [11ЧЕ0] [11ЧЕ0] [1МЕО] [1МГО] [1МЕО] [1МЕО] [1МЕО] [1721380626.747561533] [1721380627.247997570] [1721380627.751214765] [1721380628.247669863] [1721380628.749658409] [1721380629.247385193] [1721380629.746074424] [1721380630.246299644] [1721380630.750457730] [1721380631.245713132] [1721380631.745771859] [1721380632.249692744] [1721380632.746406026] [1721380633.245052589] [1721380633.743758224] [1721380634.244620556] [1721380634.743981250] [1721380635.273299052] [1721380635.742877891] [т1П1та1_зиЬзсг1Ьег]: [ш1П1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1П1та1_5иЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1П1та1_5иЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсгд.Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1п1та1_зиЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: [т1П1та1_зиЬзсг1Ьег]: I I I I I I I I I I I I I I I I I I I Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: Неагс!: 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, 'НеПо, шог!с!! ыог1с!! шог1с!! мог1с!! мог1с!! шог1с!! йгог1д! шог1с!! ыог1с!! мог1с!! мог1с!! мог1с!! мог!д! мог!с!! ыог1с! 1 1лЮГ1с! ! мог1с! 1 мог!с!! шог1с!! 205 1 206 1 207' 208' 209' 210' 2111 212' 213' 214' 215' 216' 217' 218 1 219' 220' 221' 222' 223' >< $5Н:-"'.<48 МО %..й- ДО Рис. 2.89 ❖ Вывод журнала подписчика на плате разработки Если используется виртуальная машина, измените режим сетевого подключения на Мост (Впс1де).
ПД го52(®дцуиекоте: ~ О = - о х 5' [1МЕ0] [1721380657.199735929] [тгпгта1_риЫ15Ьег]: РцЫЛзМпд: 'НеНо, могХд! 26 б' [1ЫР0] [1721380657.699508485] [тШта1_риЬгт.5Ьег]: РиЫгзЫпд: 'НеНо, ногХд! 26 7' [1МЕ0] [1721380658.199893850] [тхп1та1_риЫ15Ьег]: РиЫЛзНгпд: 'НеНо, иогХд! 26 8' [1Г1Р0] [1721380658.699260742] [т1п!г|а1_риЬг1.5Нег]: РиЫЁзЫпд: 'НеНо, ногХд! 26 9' [11ЧЕ0] [1721380659.199773906] [т1п1та1_риЫ15Ьег]: РиЫхБНгпд: 'НеНо, могХд! 27 0' [1МР0] [1721380659.701284118] [т.п1та'1_риЫ1.5Ьег]: РиЫ15Ыпд: 'НеНо, ногХд! 27 1' [1МЕ0] [1721380660.199599860] [рп.пт.та1._риЫЛ5Нег] : РиЫгвЫпд: 'НеНо, могХд! 27 2’ [1МР0] [1721380660.699750648] [л1пгпа1_риЫг5Нег]: РиЫгБЬгпд: 'НеНо, ногХд! 27 3' [1МР0] [1721380661.199282179] [пгп1па1_риЫ.15Ьег]: РиЫгзЫпд: 'НеНо, мог!д! 27 4’ [1МЕ0] [1721380661.699456387] [пгп!та1_риЫг5Ьег]: РиЫгзЬгпд: 'НеНо, ногХд! 27 5' [1НР0] [1721380662.199759064] [т!п1та'1_риЫ15Ьег]: РиЫлБМпд: 'НеНо, иог!с1! 27 . Рис. 2.9(. ❖ Вывод журнала издателя на компьютере Из приведенного примера видно, что использовать распределенную ком- муникацию в КОЗ 2 совсем не сложно. Достаточно разработать функцио- нал узлов в соответствии с механизмами коммуникации, такими как темы и службы. После чего их можно свободно размещать на различных устрой- ствах без необходимости вникать в настройки сети. Если в сети много компьютеров или плат разработки и вы не хотите, чтобы они могли свободно взаимодействовать, а предпочитаете, чтобы они обща- лись только в рамках своих групп (но не между группами), то следует ис пользовать механизм В0МА1М. 2.11.4. Группы распределенной коммуникации КОЗ 2 предоставляет механизм ООМАПМ, который позволяет устройствам общаться только в пределах одной группы (домена). Настройка этого меха- низма проста: в терминале, где запущен КОЗ 2, введите следующую команду для установки ПОМА1И Ю текущего устройства. Устройства с одинаковым ВОМАГО ГО относятся к одной группе. Устройства с разными ПОМА1И ГО не смогут взаимодействовать друг с другом. Для удобства использования можно добавить эту команду в файл .Ьазпгс, чтобы при каждом запуске терминала автоматически устанавливался нуж- ный ЕЮМАШ ГО, как показано на рис. 2.91. $ ехрогГ К05_00*1АЩ_10=<уоиг_с1опа\.п_1с1> # 0-255
Орел ~ П ‘.Ьаьпгс за7е е - □ х эз атгаз-г=“сз п — 94 95» Абб гп ''аЬегТ:" аХгаз Гог Тог.д гипптпд согапапбз. Цзе Ьгке зо: 96 » з1еер 10; аЬегГ 97 аНаз а1ег(:='поГгГу-5епб --игдепсу=1он -г "$([ $? = 0 ] && есЬо ГегпгпаЬ || есЬо рггог)" "$(Ыз(:огу]1:аг1 -п1|зеб е \' б/л\з*[0 9]\+\з*//;з/[;&| ]\з*а1ег1$//' \' 98 99» АНаз беГгпИгопз. 100» Уои пау магг Го риг аН уоиг аббггтопз гпГо а зеэагаге Ше Ике 101» ~/.ЬазЬ_аИазез, гпзГеаб о< аббгпд СЬег, Неге бтге<_Ыу. 10?» 5ее /изг/зЬа^е/бос/ЬазЬ-бос/ехатрЬез гп ГПе ЬазН бос раскаде. 103 104 гГ [ Г -/.ьазЬ аТЛазез ]; Гпеп 105 . -7.ЬазЬ_а1Лазез 106 Н 107 108» епаЫе ргодгалтаМе сотрЬеГгоп Геагигез (уои боп'с пееб го епаЫе 109» ГЫз, г» гС'з аТгеабу епапЬеб гп /еСс/ЬазЬ.ЬазЬгс апб /еГс/ргоНДе 110» зоигсез /еГс/ЬазЬ. оазЬгс). 111 гГ ! зНорГ од розгх; ГПеч 112 гГ [ Г /изг/зНаге/ЬазЬ-сопр1е!:гоп/Ьа5Ь_сотр1е1:гоп ]; ГЬеп ИЗ . /изг/зпаге/ЬазЬ-сотрХеГгоп/Ьазк-СопрХетгоп 114 еНГ [ Г /еГс/ЬазП_<.опр1еггоп ]; ГПеп 115 . /еГс/ЬазЬ_сотр1еГгоп 116 Н 117 Н 118 119 » >» ГгзЬгоз гпгНаХгге »> 120 зоигсе /орг/гоз/заггу/зегир.ЬазН 121 122ехрог» КО$_ООМА1М_Ю=12| зЬ V ТаЬУ7|бЕЬ:3^ Ю122.СО124 !№ Рис. 2.91 ❖ Настройка группы 0СМА1И 2.11.5. Распределенная коммуникация в примере с черепахой Распределенная сеть связи уже создана за нас, но как использовать распре- деленную коммуникацию в реальных приложениях для роботов? В качестве примера возьмем симуляцию управления движением черепахи. На компью- тере можно запустить симулятор черепахи, а на плате разработчика - узел управления движением с клавиатуры, имитируя дистанционное управление реальным роботом. $ гоз2 гип ГигНезгп СигНезсП-Рэбе # На компьютере. $ гоз2 гип СигНезгп 1игНе_1:е1еор_кеу # На плате разработки. После успешного запуска обоих узлов с клавиатуры на плате разработчика можно контролировать движение черепахи вверх, вниз, влево и вправо.
В разработке приложений для реальных роботов использование подобной распределенной коммуникации встречается очень часто. По мере углубле- ния в материал книги вы сможете лучше понять этот процесс. Здесь важно сосредоточиться на базовых методах использования распределенной ком- муникации в КОЗ 2. Также можно обратиться к дополнительным учебным материалам и руководствам в интернете для изучения методов сетевого подключения и использования ЗЗН. 2.12. Резюме Глава 2, наконец, завершена. Если это ваше первое знакомство с КОЗ 2, то вам, вероятно, было нелегко: узлы, темы, службы, действия, параметры, ин- терфейсы, ППЗ - много новых понятий, которые нужно запомнить. Не стоит сразу зацикливаться на конкретных методах программирования для каждого из них. В процессе дальнейшей разработки роботов вы будете часто возвра- щаться к материалам этой главы и углублять понимание через практическое применение. Конечно, это далеко не все понятия КОЗ 2. В третьей главе мы продолжим изучение инструментов и функций для разработки роботов,
Глава Часто используемые инструменты КО$ 2: упрощаем разработку роботов Функциональные возможности систем для робототехники чрезвычайно раз нообразны: помимо написания кода, требуется управлять множеством узлов, визуализировать данные, проводить моделирование различных локаций и т. д. Все это невозможно без соответствующих инструментов. В КОЗ 2 име- ется множество полезных утилит, которые позволяют существенно повысить эффективность разработки. И мы изучим их в этой главе. 3.1. ЬаипсИ: сценарии запуска и конфигурации нескольких узлов Обычно для запуска каждого узла КОЗ требуется открыть новый терминал и выполнить команду. В большинстве случаев робототехнические системы содержат много узлов, и такой способ запуска становится неудобным. Можно ли запустить все узлы сразу? Разумеется, да. Для этого используются файлы запуска ЬаипсЬ - сценарии, предназначенные для запуска и конфигурирования нескольких узлов КОЗ. Ниже приведен их общий вид. г^рогГ 05 Ггоэ апе|Ц_1.гкЗех_руЩоп.раскадеь гнрогГ деГ_раскаде_5Ьаге_сИгес<:огу Ггоп ЪгипсЬ гпрогГ 1_аипсЬ0е5сг1рН.оп
Ггоп ТаипсН.асбгопз ггпрог! 1пс1и<1е1.аипсН0е5сггрггоп Ггон ТаипсЬЛаиг,с1т_с1е5сг1р1:гоп_5иигсе5 бпрогб РубЬопЬаипсЬСезсгбрбтопВоигсе Ггоп 1аипсЬ_гоз.асббопз стром Мос!е беГ депегабе_1аспсЬ_с1е5Сг1рНо.т(): # Установка имени пакета и имени симуляционной среды. раскаде_папе - '1еагпбпд_дагеЬо' иог1(1_Гт1е_рас11 - 'йог!бь/пегдНЬогНооб.ио г 1(11 # Получение путей к пакету и симуляционной среде. ркд_рабЬ - оз. рай.]О'.п(деб_раскаде_зЬаге_с1ггесбогу(раскаде папе)) иог1(1_ра1Ь = оз.рабЬ.]о1п(ркд_рай, коги_Н1е_раСЬ) # Ус’аноЕка переменных положения робота в симуляционной среде. зраип_х_уа1 = '0.0' зргип_у_ма1 '0.0' зраип_г_ма1 - '0.0 зранп_уаи_ма1 - '0.9 # Вызов файла запуска шасси эобста и сенсоров. пЬот = 1пс1ис1е1аипс1'Ве5Сг1рбгоп( Ру бЬоп1_аипсН0е:зс гт.р’Ьй опЗои гее ([оз.рабЬ. до1п( деб_раскаде_з1таге_сК''есбсгу(раскаде_па1пе), 'ТаипсН', 'Г|Ьоб_сапега.1аипсЬ.ру' )]), 1аипсЬ_агдипепбз={'изе_5гп_Нпе': Чгие', 'ног1(1': ног1с1_раб11}.1беп5() ) # Вызов файл? запуска СааеЬо, предоставляемого пакетом дагеЬо_гоз. дааеЬо = 1пс1сс1е1аирсЬ0езсггрбгоп( РубНоп1аипс1т0е5сг1.рб1опЗоигсе( [оз. рэ бЬ. ]отп( деТ_р?скасе_з1таг е_г1тгесгогу(' да2еЬэ_гоз'), ' 1аигсЬ', ' дагеЬс.ТаопсЬ. ру' )]), ” ) # Вызов узла зраиг_егШу из пакета дааеЬо_гоз с набором параметров. 5раип_епШу = №бе(раскаде-'дагеЬо_го5', ехесибаЫе='зранп_епбИ:у.ру', агдипепгз;['-борте', 'гоЬоб_безсг1рНоп', ’-епШу', 'пЬоб', ’-х', зраип_х_7а1, '-у', зраиг._у_ма!, '-а', зраип_2_7а1, '-У', зраип_уаи_7а1], ообрпб^ зегееп') # Запуск всех вышеуказанных конфигураций. гебзгп 1аипсР0езсгбрб’.оп([ пЬоб, дагеЬо, зраип_епШу, ]) Приведенный выше файл Ьаипсй похож на код РуШоп, На самом деле так и есть: в КОЗ 2 файлы Ьаипсй описываются на языке РуШоп. Основное назначение файла Ьаипсп - запуск узлов с возможностью за- давать параметры, которые обычно передаются в командной строке. Кроме
того, можно использовать стандартные средства программирования РуГйоп, что существенно повышает гибкость запуска множества узлов. Файлы йанпей крайне часто используются в КОЗ: они выступают в роли «клея», позволяя свободно комбинировать и настраивать различные узлы. Как читать и как писать файлы йанпей? В данном разделе мы шаг за шагом разберемся с этим вопросом на серии примеров. 3.1.1, Способы запуска нескольких узлов Сначала узнаем, как запустить несколько узлов. Откроем терминал и вос- пользуемся в гоз2 командой 1анпсй для запуска первого файла йанпей. $ го$2 ТаипсЬ 1еагп1пд_1аипсЬ згпр'ЕеЛ.гипсЬ.ру После успешного запуска в терминале будут отображаться сообщения жур- нала от двух узлов - издателя и подписчика, как показано на рис. 3.1. ГИ го22(П»диуиеЬоте: ~ <Д = _ а х го52@диуиейоте:~$ гоь2 Танпсй 1еагпт.пд_йаипсй згтрйе.ТаипсН.ру [11МРО] [Таипсй]: АН Тод ГПез сап Ье Гоипб ЬеЙом /Ьопе/го52/.го5/1од/2024-07-22-14-03-05-771097-диуиейопе-2932 [1МГО] [Таипсй]: ОеГаиИ Тоддхпд уегЬо5Т.Ту 15 зет То 1МРО [1МГО] [1ортс_йеНомог16_риЬ-1]: ргосе55 БТагйеб нПй рТб [2936] [11ЧРО] [Тор1с_йеНомог16_5нЬ-2]: ргосегз зТагйеб мПй рйб [2937] [Тор\с_йе11оиог1д_риЬ-1] [1ИЕО] [1721628187.592612915] [1ор1с_йеН.оног1.6_риЬ]: РиЫгзйТпд: "НеНо Но г 16" [Тор1с_йе11омог16_5иЬ-2] [1ИЕО] [1721628187.607713352] [Торт.сйеНоиогТ.бьиЬ]: I йеагб: "НеНо НогТб" [Тор1с_йе11оног16_риЬ-1] [1ЙЕО] [1721628188.021338724] [1ор1с_йеНоног16_риЬ]: РиЬИзйгпд: "НеНо НогХб" [Тор1с_йе11оиог16_$иЬ-2] [1ИЕО] [1721628188.021969375] [Торгс_йе11оиог16_зиЬ]: I йеагб: "НеНо Иог1<Г [Тор1с_йе11омог16_риЬ-1] [1МЕО] [1721628188.522931203] [Тор1с_йеПоиог16_риЬ]: РнЬНзЫпд: "НеНо Ног 16" [Тор1с_йе11омог16_5иЬ-2] [1&1Е0] [1721628188.523338129] [1оргс_йеНоиог16_зиЬ]: I йеагб: "НеНо НогХб" [Тор1с_йеПоыог16_риЬ-1] [1&1Р0] [1721628189.021453544] [Торгс_йеНоног16_риЬ]: РиЫгзйгпд: "НеНо НогХб" [Торхс_йеПомог16_5иЬ-2] [1НЕО] [1721628189.021944074] [1оргс_йеНоног16_5иЬ]: I йеагб: "НеНо НогТб" [Тор1с_йе11оног16_риЬ-1] [1МЕО] [1721628189.521115398] [Торгс_йеНоногТ6_риЬ]: РнЫЛзйспд: "НеНо Ног 16" [Тор1с_йе11омог16_5нЬ-2] [1МРО] [1721628189.522221178] [1оргс_йеНоног16_$иЬ]: I йеагб: "НеНо Ног16" [Тор1с_йе11омог16_риЬ-1] [1ИЕО] [1721628190.020666452] [1ор1С_йеНоног16_риЬ]: РиЬНзЫпд: "НеНо Ног 16" [Тор1с_йе11оыог16_5иЬ-2] [1НЕ0] [1721628190.021031959] [1ор1с_йеНоиог16_5иЬ]: I йеагб: "НеНо Ног16" [Тор1с_йе11оиог16_риЬ-1] [1ИЕ0] [1721628190.520838204] [Тор1с_йеНоиог16_риЬ]: РиЬНзйгпд: "НеНо НогТб" [Тор1с_йе11оног16_5иЬ-2] [1ИЕ0] [1721628190.521092290] [Торгс_йе11оиог16_5иЬ]: I йеагб: "НеНо НогХб" [Тор1с_йе11оног16_риЬ-1] [1ИЕ0] [1721628191.021600468] [1ор1с_йеНоиог16_риЬ]: РнЬНзйгпд: "НеНо НогТб" [1ор1с_йе11оыог16_5иЬ-2] [1ЫР0] [1721628191.021937892] [1ор1с_йеНоног16_5иЬ]: I йеагб: "НеНо НогХб" [Тор1с_йе11омог16_риЬ-1] [1ИЕ0] [1721628191.520956952] [1орхс_йеНоиог16_риЬ]: РиЬНзЫпд: "НеНо НогТб" [Тор1с_йеНоиог16_5иЬ-2] [1МР0] [1721628191.521074499] [1ор1с_йе11оног16_зиЬ]: I йеагб: "НеНо НогХб" [Тор1с_йе11омог16_рнЬ-1] [1ИЕ0] [1721628192.021196416] [1ор1с_йеНоиог16_риЬ]: РнЬНзЫпд: "НеНо НогТб" [Тор1с_йеНоиог16_5иЬ-2] [1ЙЕ0] [1721628192.021344960] [1ор1с_йеНоиог16_5нЬ]: I йеагб: "НеНо Ног16" [Тор1с_йе11оиог16_рнЬ-1] [1МЕ0] [1721628192.520537603] [1оргс_йеНоиог16_риЬ]: РиЫгзМпд: "НеНо Ногйб" [Тор1с_йе11оиог16_5нЬ-2] [1ЫЕ0] [1721628192.521835797] [Торгс_йеНоиог16_зиЬ]: I йеагб: "НеНо Ног16" [Тор1с_йе11оног16_риЬ-1] [1МЕ0] [1721628193.021081226] [1оргс_йе11оног16_риЬ]: РыЫгзйтпд: "НеНо НогТб" [Торгс_йе11оног1ё_5иЬ-2] [ШЕО] [1721628193.021406838] [1оргс_йе11оиог16_$иЬ]: I йеагб: "НеНо НогТб" [Торгс йе11оног16 риЬ-1] [1ЯЮ] [1721628193.521940454] [Тор1с йеНоног16 риЬ]: РоЬНзйгпд: "НеНо Ног 16" Рис. 3.1 ❖ Файл ЬаипсН для запуска узлов издателя и подписчика Как же эти два узла запускаются? Вся «магия» содержится в файле 1еаг- пт5_1аипсй/8йпр1е1аипсй.ру. Подробности приведены ниже. Ггоп ЪгипсН гнрегг 1аипсЬ0е5сггр1:гоп # Класс описания файла запуска ЬаипсН. Ггоп 1гипс1'|_гог.асг1ОП5 тлрогГ Мойе # Класс описания запуска узла. йег депега1:е_1азпс11_с1е5сг1р'НопО: # Функция азтоматической генерации файла запуска 1_аипсй. геГигп 1эипсЬЬе5СГ1рт1оп([ # Воззрат описания файла запуска Ьаипсй. Мсс1е( # Конфигураыия запуска одного узла.
рзекзде- 1еагп1пд_Горгс', # Пакет, в котоэом находится узел. ехесиТаЬТе-'гортс_ЬеПо»;ог1с1_риЬ', # Исполняемый файл узла. ), Пос1е( # Конфигурация запуска одного узла. рзскзде='1еагп1пд_Горгс', # Пакет, в котоэом находится узел. ехеси<:аЫе='т:ор1с_Ье11о».ог1с1_5иЬ', # Исполняемый файл узла. ), ]) В этом файле йаипей функция &епега1:е_1аипсй_с1е8спрНоп() формирует содержимое файла йаипей, а конкретные параметры запуска описываются внутри йаипсйВезспрНоп. Вызов Койе() задает правила формирования этих параметров и является ключевой настройкой запуска узла в йаипей. Чем больше узлов, тем больше вызовов Кос1е(), Поддерживаются следующие па- раметры конфигурации: 1) раскате: имя пакета; 2) ехесиТаЫс имя исполняемого файла узла. Файлы йаипей обычно размещают в каталоге 1анпс1т соответствующего пакета. Перед использованием их необходимо собрать, правила сборки ана- логичны правилам для исходного кода. В РуШоп-пакете правила задаются в файле зеШр.ру: с помощью О8.ра1й.|о1п() необходимо скопировать все фай- лы Йаипей в пространство тзГаН. <1ага_Н1ез=[ ( зЬаге/апепГДпСех/гезоигсеДнйех/раскадез', [ ^оысе/' + раскаде_папе1), ('зЬаге/' + раскгде_па1че, [ раскаде.хт!']), (оз.раЩ.]спр( 'зНаге . раскаде_папе, 'ТаипсК ), д1оЬ(о5.раЩ.догп( Еаипск , '*.1аипсЬ.ру'))), (о5.раЩ.]спп( 'зКаге . раскасе_папе, сопНд), д1оЬ(о5.раЦп.до1п('сопГ1д1, '*.*'))), (о5.раГ.Ь.догр(|51'1аге , раскаде_папе, гуы'), дТобСоз.рабб.дотГ|('гуи , '*.*'))), Для пакетов С++ правила сборки файлов йаипей задаются в СМакеЫки. 1x1. Здесь также требуется скопировать все файлы из каталога 1анпсй в про- странство тзГаП. гп51-а11(01КЕСТ0КУ ТаипсЬ 0Е5ПШКЖ 5Ьаге/${РР.03ЕСТД1ДОЕ}/
3.1.2. Настройка параметров командной строки Запуская узлы в терминале с помощью команд КОЗ 2, можно посредством параметров передавать различные значения в программу узла. То же самое удобно делать и через файл Тайней. Например, чтобы запустить визуализа- тор КА/:2 и загрузить определенный файл конфигурации, можно выполнить следующую команду. $ гог2 гип гут.е2 гутг2 -с! <РАСКАЗЕ- РАТЩ/гу-.г/еигНе-ГУтг. гите В этом примере к команде добавляется длинный путь к конфигурацион- ному файлу, что не слишком удобно. В файле Ъаипс11 то же самое делается гораздо элегантнее, а результат идентичен (см. рис. 3.2). $ ГО52 ТаипсЬ 1еагпгпд_1эипсЬ г'/г;.1аиг.сЬ.ру /Ьоте/11сх/<1еу_>«/$гс/го$2_21_еиГог1а15/1еагп1лд_1аипсЬ/гуЬДигие_гу12.гуи*- ВУ1г □ х Е<1е Еапе(з Це!р '‘-Моте Са тега + №р!ам ► * С1оЬа1 ОрНопз ► О с!оЬа! 5Са(и$' У/агп ► * СгМ ► П, КоЬоГМоВ»! * ТР А<И Туре ОгЬй (гУ1г_деРаи11_р1ид1П5) - 2его - Сиггеп1 \/1е* Меаг сир О&Еалсе 1п*в1± 2 АХ15 Тагдес Ргате ОКСалсе Роса! ЗНаре 51ге Роса! зЬаре Р!хед 51ге Уа* РКсЬ ► Роса! Ро!л1 ОгЪИ (гук) 0.01 <Р1хеб Егате> 2 99598 0.05 Рис. 3.2 ❖ Запуск визуагизатора ЧУ12 через файл ЬаипсИ Как передать параметры командной строки в узел через файл ЬанпсН? Изучим файл 1еагптд_1аипс1т/гу12.1аипс11.ру. тпрогГ 05 # Метод запроса пути к пакету. Ггоп аг:епГ_тлс1ех_руСпоп.раскаде5 тпрогГ деГ_раскаде_511аге_с11гесгогу Ггоа ТгипсЬ тнрогГ каипсЬОезсгтрНоп # Класс описания файла запуска ЦаипсН.
Ггоп 1аипсН_го5.асббор5 бпрогб 1Мос1е # Класс описания запуска узла. иеГ денег абе_1аспсЬ_с1е5сгбргбол(): # Функция автоматической генерации файла запуска баилсЬ. гу1?_сопГгд - ОБ.ратЬ.]ог.п( # Поиск полного пути к файлу конфигурации. дег_раскаде_ь1та1 е_с!бгесбогу(' 1еагпбпд_1аипс1',1), 'гухг', 1 Гцгббе тг.губ? ) гегагп каипсбОедсгт-рбтоп^ [ Мос1е( раскаде='гугг2', ехесибаЬ1е=' губг2', папе-- губг2', агдипепбз-[1 -б', губг_сспб'бд] ) ]) # Возврат описания файла запуска каипсЬ. # Конфигурация запуска одного узла. # Пакет, в котором находится узел. # Исполняемой файл узла. # Переименование узла. # Загрузка аргументов командной строки. В приведенном выше файле запуска Ьанпсп в гу:2_соп(щ сохранен полный путь к конфигурационному файлу, который затем загружается при запуске узла через Кос1е() посредством параметра агуигпепбз. © В разработке роботов на КОБ 2 параметры узлов (например, модель робота) можно загружать аналогичным образом. 3.1.3. Переназначение ресурсов В сообществе КОЗ существует множество ресурсов. При использовании чу- жого кода имена тем для обмена данными могут не соответствовать вашим требованиям. Можно ли переименовывать такие ресурсы? Для повыше- ния степени повторного использования программного обеспечения в КОЗ предусмотрен механизм переназначения ресурсов. Откройте терминал и запустите следующий пример - появится окно си- мулятора с двумя черепахами, как показано на рис. 3.3. $ гоз2 Таипсб 1эагпбпд_1аипсЬ гегаррбпд.баипсЬ.ру Откройте терминал и опубликуйте сообщение в теме - первая черепаха начнет движение, а вторая будет двигаться вместе с ней. $ гоз2 Горбе риЬ --гаге /Ги1б1еьбп1/бигб1е1/сна_уе1 деотебгу_тзд5/|Ъд/Тибьб "{ббпеаг: {х: 2.0, у: 0 0, г: 0.0}, апдибаг: {х: 0.0, у: 0.0, г\ 1.8}}" Почему движутся обе черепахи? Здесь используется другой узел из паке- та ШгНезгт под названием пшше. Его задача - подписаться на положение выбранной черепахи, вычислить соответствующую команду скорости для идентичного движения и опубликовать ее.
Рис. 3.3 ❖ Запуск двух симуляторов черепахи через файл !_аипсЬ Имена тем, на которые подписывается и в которые публикует узел тпп1с, можно переназначить на имя любой из черепах. Соответствующие настрой- ки находятся в файле 1еагп1п2_'аипс!т/гетарр1пу.1аипсй.ру. Ггоп ГаипсЬ тпрогГ СаипсНВезсгтртгоп Ггоп 1гипсЬ_го5.асиоп5 тлрогг Носе # Класс описания файла запуска каипсЬ. # Класс описания запуска узла. ОеГ дегегаке_1аипс11_с1е5сг1ркгопО: # Функция автоматической генерации файла запуска 1_аипсЬ. геСигп СаипсЬОезсгтргЛопЦ Мос1е( раскаде- ТигНезГп', г.апезрасе-' Гигг1езГп1', ехесиСаЫе=' Гигк1еьГп_пос1е', папе-'зтп' ), Мос1е( раскаде-ЧигкГезГп1, г,апезрасе=:' Гигг1е5тп21, ехес иСаЫе=1 ГигГ1е5гп_гос1е', папе='5тп' ), Г1ос1е(. раскаде- ГигкГезГп', ехесикаЫе='пГп1с', папе- нг1чгс', г етарртпд=.= [ # Воззрат описания Файла запуска 1аипсН. Г Конфигурация запуска одного узла. # Пакет, в ко_ором находится узел. # Пространство имен, в котором находится узел. # Исполняемый файл узла. # Переименование узла. # Конфигурация запуска одного узла. И Пакет, в котором находится узел. # Пространство имен, в котором находится узел. # Исполняемый файл узла. # Переименование узла. # Конфигурация запуска одного узла. # Пакет, в ко-ором находится узел # Исполняемый файл узла. # Переименование узла. # Список переназначений ресурсов. # Изменение имени темы /гприС/розе на /СигПееГШ/СигПеГ/роге. ('/тлриЬ/рсзе , '/ТогШезгп!/1:игШе!/розе'),
# Изменение имени темы /оЩрЩ/спЩуе!. на /Сиг11е51п2/СигС:1е1/спа_уе1. (' /оиСрьС/спс1_7е1', /СигС1е5<й2/С:игНе1/сп(1_уе1'), ) ]) В процессе запуска узла тише добавлена конфигурация гстарртдз. В этом списке задаются ресурсы, подлежащие переназначению: в каждом кортеже первым элементом указывается исходное имя темы, вторым - новое имя. Например, заменив /шрнС/розе на Диг11е8Ш11Дигт1е1/ро8е, мы фактически «переименовываем» тему: после запуска тема /шрнС/розе больше не сущест- вует, везде используется ДитНе51т1Дит11е1/ро8с. Аналогично тема /онСриС/ сшс1_уе1, публикуемая узлом ппппс, становится темой ДитГ1е81т2ДитГ1е 1/ сшс1_уе1, что позволяет управлять движением второй черепахи. ® Механизм переназначения - один из ключевых способов повышения повторного ис пользования кода в КС5: можно, не изменяя и даже не зная кода, непосредственно пере- именовывать коммуникационные интерфейсы, если их типы соответствуют друг другу. 3.1.4. Настройка параметров КОЗ В сложных робототехнических системах существует множество параметров, и задавать их непосредственно в коде нецелесообразно. В таких случаях па- раметры удобно быстро настраивать через файл запуска Ьанпсп. Сначала запустите пример: откройте терминал и выполните следующую команду. $ гоз2 ТаипсЬ ТеаггЛпдДаипсЬ рагапе^егзЛаипсЬ.ру Мы видим, что изменился цвет фона симулятора черепах - этот параметр был задан в файле запуска ЬанпсЬ (см. рис. 3.4). Рис. 3.4 ❖ Изменение параметра цвета фона в симуляторе черепах через файл запуска Ьаипсб
Как именно задаются параметры в файле запуска Ьаипсй? Реализация при- ведена в файле 1еагп1П8_1аипс11/рагатеЕег8.1аипс11.ру. Ггоп ЪаипсН строга ЦаипсНРезсгТрСгог. # Класс описания файла запуска каипсЬ. Ггоп ТаипсЬ.асМопз т.гпрогС ОесТагекаипсбАгдипепк # Класс объявления аргумента, используемого # в Лайле запуска кгипсЬ. Егоз ТаипсЬ.зиЬзСтбиНопз ктцогЕ каипсЬСспЕтуигаНоп, ТехЕЗиЬзЕкТиЕкоп Егоз 1аипсЬ_гоз.асЕт.оп5 УтрогС Мобе # Класс списания запуска узла. аеЕ дегегаГе_1аипсЬ_с1е5сгтрНоп(): # Функция аьтоматическои генерации файла запуска I аопсЬ. # Создание аргумента Ьаскдгоипо_г в файле запуска каапсЬ. Ьаскдгоипб_г_1аипсК_агд = 0ес1агекаипсЬА| дипелк( 'Ьаскдгоапб_г', беЕаи1Е_уа1ие=ТехЕ5иЬ5ЕЕЕиЕ1оп(Еехк='0') ) з Создание аргумента Ьаскугоипо_д в файле запуска каапсЬ. Ьаскдгсипс1_д_1.аипс1т_агд = 0ес1агекаипсЬАгдипепЕ( Ьаскдгоипб_д', с!еЕаи1.Т_уа1ие=ТехГ5иЬБШ1|Е1оп(ТехТ=84') ) # Создание аргумента Ьаскдгоспб_Ь в файле запуска каапсЬ. Ьаскдгсипб_Ь_1аипс1т_агд = 0ес1агекаипсЬЛгд,апелк( 'Ьаскдгоцпб Ь' , ФеЕаи1Е_уа1це=ТехЕ8иЬ5Ет.ЕиЕи>п(кек'Е='122') ) # Возврат списания файла запуска каипсЬ. гекигп каипсЬОезсг!рк1оп([ Ьэскдгоипс1_г_1аипс11_агд, # Вызов зьнъесозданного аргумента Ьаскдгоипб_г. Ьаскдгои,тб_у_1аипс11_агд, Ьаскдгоипб_Ь_1зипсЬ_агд, Нобе( # Конфигурация запуска одного узла. раскаде=1кигкТезкп', ехеси-каЫе='кигк1е51Г1_гобе', # Пакет, в котором находится узел. папе='ьгш', # Переименование узла. ра"апетегз=[[ # Установка списка параметров ВОВ. Ьаскдгоипб г': каиг1сбСопЕЕдигаЕ';.оп('ЬаскдгоиГ|б_г'), # Создание параметра Ьаскдгоипб г. Ьаскдгоипб_д : каипсКкопЕтдигаккоп('Ьаскдгоипб_д'), # Создание параметра оаскдгоипо_д. 'ЬасхдгоипО': каипсЬСопЕкдигаЫоп('Ьаскдгоипс1_Ь ), # Создание параметра Ьаскдгоипо_Ь. }] ), ]) В Мойе() добавлена конфигурация рагашеЕегз: параметры задаются сло- варем, слева располагается имя параметра, справа - его значение. В дан ном случае устанавливаются три параметра: Ьаск§гонпс1_г, Ьаск§гонпс1_§ и Ъаск§гонпс1_Ь. В приведенном выше файле запуска используется еще одно понятие «параметра» - аг§итепГ. Хотя и аг§итепЕ, и рагатсЕег переводятся как «параметр», их смысл различается: □ аг^итепЕ: используется только внутри файла запуска Ьаипсй для удоб- ной передачи значений, определяется с помощью Всс1агсЬаипс1тАг§и тепЕ(), используется через Ьаипс11СопЕк§ига1топ(); □ рагатеТег: параметр КОВ, предназначенный для использования зна- чений в узле, задастся непосредственно в словаре рагашеЕсгз узла.
Задавать параметры по одному в файле запуска все же неудобно. При большом количестве параметров рекомендуется загружать их из файла па- раметров. Реализация такого подхода приведена в файле 1еапнп$_1аипс1т/ рагатеГегзуатЫаипсЬ.ру, гг.рогГ оь Ггоп агпепГ_1пйех_руГ1топ,раскадез гпрогС деГ_раскаде_5Ьаге_йггесСогу # Метод запроса пути Ггоп ТаипсК гтро*Г ЬаипсКОезсггрРгоп Поп 1аипсК_гоь.асг1оР5 йпрогг Мойе # к пакету. # Класс описания файла запуска ЬзипсР. # Класс описания запуска узла. йеГ депегаГе 1аипсГ,_йезсг1р1:го,т(): сопГтд - оз.рг1К.тот.п( # Функция автоматической генерации файла запуска Раи.тсК. # Поиск полного пути к файлу параметров. уег_раскаде_з1та1 е_сКгесГогу(' 1еагп1пд_1аипсЬ1), ' сопГт у', 'ГигГТеьтп.уап!' ) геГагп 1аипсЬ0еьсгт.р1Лоп( [ Мойе( раскаде=1 ГигНеьгР!', ехесиГаЫе=' ГигНе51п_пойе', пате'расе-1 ГигНеь1т2', папе-1 ИгТ , # Возврат описания файла запуска ГаипсН. # Конфигурация запуска одного узла. # Пакет, в котором находится узел. # Исполняемый файл узла. # Пространство имен, в котором находится узел. # Переименование узла рагатегегз=[сопг1д] ) ]) # Загрузка файла параметров. В приведенном выше примере используется файл параметров ШгНезпп. уаш!. Подробный формат настройки показан ниже - применяется синтаксис УАМЬ. /ГигГТезтп’/зтп: гоз__рагапегегз: Раскугоипс1_Ь: Э Ьаскдгсипй_д: 0 Раску гсипс1_г: 0 3.1.5. Вложенное включение файлов ЬаипсК В сложных робототехнических системах файлов ЪанпсН может быть много. В таких случаях можно воспользоваться механизмом, аналогичным функции тс1ис!е в программировании, и организовать вложенное включение файлов Ьанпс11. Рассмотрим это на примере 1еат1п&_1аипсЬ/пате8расе8.1аипс1т.ру. В указанном файле ЪаипсИ метод 1пс1ийеЪаипспПе8спрНопО позволяет подключать другие файлы ЬаппсН по заданному пути. Одновременно в коде настраивается пространство имен: поскольку невозможно заранее знать, не содержатся ли во внешнем файле ЬанпсЬ узлы, параметры, темы и другие
ресурсы с теми же именами, что и в текущем, надежнее всего поместить все ресурсы внешнего 1анпсп в отдельное пространство имен - так удастся из- бежать конфликтов. Здесь понятие «пространство имен» по смыслу и назначению сходно с одноименным понятием в языке С++ и других объектно ориентированных языках программирования. 3.2.II: управление системами координат робота Система координат - хорошо знакомое понятие и важная основа робототех- ники. В полном робототехническом комплексе существует множество систем координат. Как управлять взаимным положением этих систем? Нужно ли самостоятельно выводить формулы? Разумеется, нет: в КОЗ 2 для этого есть мощный инструмент Н (Папз&гт). В ЧО5 2 строчное ГТ обычно обозначает систему управления системами координат и соответствующие библиотеки, а прописное ТЕ - компонент визуализации систем координат. 3.2.1. Системы координат робота Какие системы координат обычно используются в роботе? На рис. 3.5 показано, что в промышленном манипуляторе место установки робота задает базовую систему координат (Вазе Ргаше). Опорная система внешней среды называется мировой системой координат (1Уог1й Ргаше). По- ложение хвата на конце робота задает систему координат инструмента (Тоо1 Ргаше). Положение внешнего объекта - систему координат объекта (0Ь]ес1 Ргаше). При захвате внешнего предмета манипулятором взаимные соотно шения этих систем координат постоянно меняются. На рис. 3.6 показано, что у мобильного робота центр робота является ба- зовой системой координат (Ьазе Ипк)1. Положение лазерного дальномера задает систему координат дальномера (1а5ег_Ипк). При движении робота одометрия вычисляет накопленную позу, и опорная система для этой позы называется системой координат одометрии (ойош). Одометрия накапливает ошибки и дрейф, поэтому система координат карты (тар) может служить более стабильной опорой. 1 В промышленной робототехнике и в интеллектуальной мобильной робототехнике англоязычные обозначения базовой системы координат различаются.
координат Рис. 3.5 ❖ Типичные системы координат в промышленном роботе Взаимосвязи между системами координат сложны: одни связи относи- тельно постоянны, другие непрерывно меняются, Даже, казалось бы, простые системы координат в пространстве обладают сложным поведением, поэтому наличие хорошей системы управления координатами особенно важно. Базовые теоретические сведения о преобразованиях систем координат приводятся в любом учебнике по робототехнике: преобразование можно разложить на параллельный перенос и вращение и описать матрицей 4*ч.
Преобразование между двумя системами координат в пространстве сводится к векторному математическому преобразованию (см. рис. 3.7). Рис. 3.7 ❖ Основы теории преобразований систем координат Принцип работы И в КОЗ 2 заключается в инкапсуляции этих математи- ческих преобразований. За подробным теоретическим обоснованием об- ратитесь к учебникам по робототехнике, в этой книге основное внимание уделяется практическому использованию системы управления координа тами И. 3.2.2. Работа с II из командной строки Как использовать И в КОЗ 2? Начнем с примера с двумя черепахами и по- знакомимся с алгоритмом следования по системам координат. Сначала необходимо установить соответствующие пакеты, затем запус- тить их через файл ЬаппсЬ. После этого можно управлять движением одной черепахи, а вторая будет автоматически ее преследовать. Выполните следу ющие команды для установки пакетов. $ ьибо арЬ гпзСаП гоз-заггу-СигНе-Ш-ру гоь-загзу-ГГг-СооТз $ зибо р’.рЗ тпьЬаП ГгапзГоплзЗс! После успешной установки введите в терминале следующие команды, что- бы запустить пример следования черепахи и узел управления с клавиатуры. $ ГЭ52 ТаспсЬ СигНе_гС2_ру ЩгН.е_И2_с1ег1О.1.аипс1'1.ру $ гох2 гип ГигНезгп ГигНе_1:е1еор_кеу После успешного запуска откроется интерфейс симулятора черепахи. При управлении одной черепахой с клавиатуры другая будет следовать за ней, как показано на рис. 3.8.
СТагпртпд Ггот [х=1.578143, у=-0.030657]) [1иг1Де51.т_пос1е-1] [ЫАРМ] [1721629977.732836383] СХапрхпд Геол [х=1.587318, у=-0.030657]) [51п]: оь по! I МЛ 1Ье ка!Л! [1шЛ1.е51т_пос1е-1] [ЫАРМ] [1721629977.747969664] СХапрхпд Ггот [х=1.596493, у=-0.030657]) [«" оь по! I МЛ 1Ье иаН! [Гиг(:1еБйп_по(1е-1] [ЫАРМ] [1721629977.763740129] СХапргпд Ггот [х=1.605668, у=-0.030657]) [ни]: оь по! I МЛ 1Ье на 11! [1иг11е$1п_поае-1] [МАРИ] [1721629977.780535450] СХапрхпд Ггот [х=1.614843, у=-0.030657]) оь по! I МЛ 1Ье на11! [ил-Че5гт_поае-1] [ЫАРМ] [1721629977.796098844] СХапрхпд {тот [х=1.624018, у=-0.030657]) [«»]: оь по! I МЛ 1:Ье на!Л! [1игЧе51П_поде-1] [ЫАРМ] [1721629977.812280124] СХапрхпд {тот [х=1.633193, у=-0.030657]) [а1и]: оь по! I МЛ ХЬе на!Л! [1игС1е5тт_поде-1] [ЫАРМ] [1721629977.829078068] СХатрхпд {тот [х=1.642368, у=-0.030657]) [пи]: он по! I МЛ ^Ье иаП! [1игМе5хт_поде-1] [ЫАРМ] [1721629977.843902747] СХатрхпд ^гот [х=1.651542, у=-0.030657]) [вСи]: оь по! I МЛ ХЬе иаП.! [1игМе5хт_поде-1] [ЫАРМ] [1721629977.860061974] С1атрхпд Ггот [х=1.660717, у=-0.030657]) [П«] оь по! I МЛ ХЬе каП! [1игМ.еБ1т_лоде-1] [ЫАРМ] [1721629977.876167249] СГатрЁпд Ггот [х=1.669892, у=-0.030657]) [пи]: оь по! I МЛ 1:Ье каИ! [1иг1Ле51т_поде-1] [ЫАРМ] [1721629977.892810915] С1атнл<1 {гот Гх=1 .679067. у=-0.0306Ч7П [пи]: оь по! I МЛ 1Ье иаП! Рис. 3.3 ❖ Результат запуска примера со следованием черепахи 1, Просмотр дерева I/ Какие системы координат используются у двух черепах? Эго можно узнать с помощью одного полезного инструмента. $ гоз2 гип *:Р2_1:оо15 у1еи_€гаяе5 По умолчанию в текущем каталоге будет создан файл Ггатек.рсИ. Открыв его, вы увидите взаимосвязи всех систем координат в системе, как показано на рис. 3.9. Рис. 3.9 ❖ Просмотр структуры систем координат с помощью инструмента у1ел_Тгате5 2. Запрос информации о преобразованиях координат Но одного лишь просмотра структуры недостаточно. Если требуется узнать конкретное соотношение между двумя системами координат, воспользуй- тесь инструментом Гй есйо.
$ гоз? гип Н2_го5 Н2_есЬо ТигС1е? СигНе1 После запуска в терминале будут циклически выводиться значения пре- образования системы координат, состоящие из двух частей - параллельного переноса и вращения, а также значения матрицы вращения, как показано на рис. 3.10. Рис. 5.10 ❖ Просмотр преобразования систем координат с помощью инструмента ТГ2_есбо 3. Визуализация систем координат Числовые значения недостаточно наглядны? Попробуйте средство визуали зации. $ гоз2 гип гутг2 гИ.г2 -с1 $((оь2 ркд рге’Гтх --зпаге ГигНе_1:г2_ру)/гу12/1:иг1:1е_Г7г2.Г712 Управляя черепахой с клавиатуры, вы увидите, как в КУ12 начинают пере- мещаться оси координат, как показано на рис. 3.11. Гораздо нагляднее, не правда ли? Пример следования черепашки весьма интересен. Как же он устроен? По- будем сильно спешить, далее мы разберем методы работы с Н и продолжим углубленное изучение. КУ|2 - это мощная платформа визуализации в 405 2 подробное описание приведено в разделе 3.4.
Рис. 3.11 ❖ Визуализация осей координат с помощью Д\Лг 3.23. Статическая трансляция К (РуИпоп) Основной задачей 11является управление системами координат. С помощью механизма трансляции в реальном времени обновляется вся структура де- рева координат. Далее мы попытаемся создать и транслировать простые взаимосвязи двух систем координат. Самый простой случай преобразований координат - когда их относитель- ное положение не меняется. Например, дом: пока его не снесут, его поло- жение неизменно. Подобные ситуации часто встречаются и в робототехни- ческих системах, например взаимное расположение дальномера и шасси робота после монтажа практически не меняется. В 11 такие случаи называ- ются статическими преобразованиями 11. Посмотрим, как это реализуется в программе. Откройте терминал и выполните следующие команды: $ гоз2 гип 1еаггЛпд_1:Г 5Ш1с_Н_Ьгоас1сэ51ег $ гоз2 гип Н2_1оо1.5 ИеиДгапез Мы видим, что в системе присутству- ют две системы координат (см. рис. 3.12): ллгог1с1 и йонзе. Их взаимное положение не изменяется и поддерживается с по мощью статического объекта 11. Как в этом узле создаются системы координат и транслируется статическое преобразование 11? Полный код нахо- дится в файле 1еагшп&_11/81аНс_11_Ъгоас1- саз1ег.ру. Транслятор: бэТаи11_аи1Ног.1у Средняя скорость: 10000.0 Длина буфера О.С Последнее преобразование: 0.0 Самое раннее Д преобразование: 0.0 Иоизе ) Рис. 3.12 ❖ Структура систем координат в примере со статической трансляцией ГТ
бпрогг гсбру # Библиотека Ругбоп-интерфеиса КОБ 2. Ггол гсбру.побе бпро! б Мосе # Класс узла КОБ 2. бгоп деопебгу_пзд5.пзд бпрогб ТгапзбогпБбапреб # Сообщение преобразования кооэдинат. бпрогб бб-бгаозФогнаббопз # Библиотека бб для преобразования координат. # Класс статического передатчика трансляции системы координат бб. бгоп бС2_го8.5баббс_бгап5бопл_Ьгоас1са5бег бпрогб БбаббсТгап8рогР|Вгоабса5бег сгазз Бба ббсТЕВ гоаОсагбе г(Мойе): беб___бпбб__(зебб, пале): зирег().__бпбб__(папе) # Инициализация родительского класса узла КОБ 2. 5ебб.бб_'огоас1сазбег = БбасбсТгаг,5богпЕгоас1са5сегб8ебб) # Создание объекта бб-передатчика. # Создание обьекта сообщения преобразования координат. 5бгббс_бгап5богп$ба"1рес1 = Тгап5бог"1Ббапрес1() # Устансзка временной метки сообщения преобразования координат. 5бгббс_бгап5богп$бапрес1.беас1ег.зганр - зебб.деб_сбоск().пои,().со_пзд() # Устансзка исходной системы координат для преобразования. збгббс_бгапзбогп5бапрес1.беас1ег.бгапе_б^ = иогбб # Устансзка целевой системы координат для преобразования. збгббс_бгапзбогп5бапрес1.с1тбб^_бгапе_бс1 = 'Мойве' # Устансзка смещения по х, у, т. в преобразовании координат. збгббс_бгап5богп5ба"1реб.бгап5бот.сгапз1аббоп.х = 10.0 5бгббс_бгап5богп5банрес1.бгап5богп.бгап5баббоп.у = 5.0 збгббс_бгапзбогп5бапрес1.бгап5бот.бгап5баббоп.2 = 0.0 # Преобразование углов Эйлера в кватернион (гобб, рббсЬ, уаи). диаб = бГ_бгапзботэббопз.диабегпбоп_Гго111_еа1ег(0.0, 0.0, 0.0) # Установка позорота по х, у, 2 в преобразовании координат (кватернион). збаббс_бгапзбогпБба"1рес1.ггап5бот.гобаббоп.х = диаб[0] 8бгббс_бгапзбогпБбапрес1.бгап5бот.гобзббоп.у = циаб[1] 8баббс_бгэпзбогпБба"1рес1.бгап5бот.гобэббоп.7 = циаб[2] 8бгббс_бгапзбогп5бапрес1.бгап5богп.гобзббоп.1л/ = диаб[3] # Передача статического преобразования координат; после передачи взаимное положение двух # систем координат остается неизменным. себб.бб_'огоа<1са5гег.5епс1Тгап5бог"1(8баббс_бгап5богп5гапрес1) беб пабп(а1 дз=№пе): гсбру.бпбб(агдз агдз) # Инициализация РубЬоп-интерфейс а К05 2. побе - 5баббсТРВгоабсазбег("5баббс_бб_Ьгоабсазсег'') # Создание и инициализация объекта # узла КОБ 2. гсбру.зрбп(побе) # Ожидание завершения работы КОБ 2 в цикле. пэбе.безбгоу_лобе() # Уничтожение объекта узла. гсбру.зЬиббоил() В указанном коде статическое преобразование ТЕ передается следующим образом: 1) с помощью класса УбаПсТгапзЕоппВгоасказбег создается объект бГ Ьгоас! сагбег для последующей трансляции; 2) создается экземпляр сообщения преобразования координат ТгапзЕогт 81атреб() - объект збаИс бгапзГогт^батрей;
3) в 81аНс_1гап8Еогт81атрес1 записываются параметры статического пре- образования: метка времени Иеайег.^ашр, исходная система коорди- нат ГгатеШ, целевая система координат сЫ1с1 Ггаше 1(1, трансляция по осям хух (1гап81аНоп) и вращение по осям хух (гоШюп); 4) методом зепсГГгапяГогтО сведения о статическом преобразовании I? передаются в систему. 3.2.4. Статическая трансляция К (С++) Статическую трансляцию {Г можно реализовать и на С++. Откройте терминал и запустите пример, написанный на С++, с помощью следующих команд. $ гоз2 гип Т.еагпт.пдЩЩсрр згаЩсЩбЬгоабсазСег $ гоз2 гип Н2_боо1.5 уге'лИтапеь Полученная структура систем координат будет соответствовать рис. 3.12: заданы две системы - шог1с1 и йонзе. Их относительное положение не меняет- ся и поддерживается статическим объектом И. Полная реализация приведена в файле 1еагптк_14_срр/8гс/81аНс_Н_Ьгоас1са81ег.срр. #тпс!ибе 4гс1срр/гс1срр.брр" // Библиотека интерфейса С+т в КОБ 2. #1пс1ибе "Сб2/1гпеагМгбЬ/Сиа1:егпгсп.Ь' // Библиотека операций с кватернионами. #\.пс!ибе "Ш_гоъ/5Сапс_Сгап5бспт1_1)гоас1са51:ег.Н" // Класс статического передатчика системы // трансляции координат Н. #гпс1ибе чдеог1еггу_р15д5/п5д/1:гап'><:огп_81:апрес1.Ьрр'' // Сообщение преобразования координат. сСазз БСайсТБВгоабсаъбег : риЫгс гекерр: Мобе { риЫЛс: ехрПсгб ЗсаЪгсТРВгоабсазсег() : 11обе("5баНс_И_Ьгоабса51:ег") // Инициализация родительского класса узла РОБ 2. { // Создание объекта И-передатчика. И_5бабгс_Ьгоабса;гег_ = :паке_51тагес1<Н2_гс5: :БбаЫсТгап5'ГсгтВгоабса5сег>(СЫ5); // Передача статического пзеобрэзовэния координат; после передачи взаимное положение двух // систем координат остается неизменным. бЫ5->паке_сгап5Тогп5(); } ргЩасе: уо1б паке_Сгап5Согп5() { // Создание объекта сообщения преобразования координат. деопебгудпздз::пзд: ТгапзбогпБбапреб С; // Установка временной метки сообщения преобразования координат. б. беабег. згапр = бЫ5->дег_с1оск()->пои(); // Установка исходной системы координат для преобразования Ц1теас1ег.1та'пе_1.с1 = "моги";
// Установка целевой системы координат для преобразования. б.с1п1с1_1тапе_г<1 = "Ьоизе // Установка смещения по х, у, г е преобразовании координат. б.бгапзбопл.бгапьХагтоп.х = 10.0; С.ТгапзбсгпЛгапзТаСтоп у = 5.0; б.ггапзбспл.бгапзТагт.оп.г = 0.0; // Преобразование углов Эйлера в кватернион (го11, ртбсЬ, уаи). Н2: :риа беглтоп ц; Ч.зеШУ(0.0, 0.0, 0.0); // Установка псворота по х, у, г в преобразовании координат (кватернион). б.тгапзбопл.готаНоп.х = ц.х(); б Лгапзбсгп.гобаИоп.у = д.у(); б.бгапзбопл.госаМоп.г - д.г(); б.ггапзбогп.готагтоп.и = ч.и(); // Передача статического преобразования координат. С<:_5баб1с_Ьгоабса5сег_->5епсТгаг:5<:огп(б); } збб : :зКагеб рбг<Н2 гоб: гЗтабгсТгапзГогпВ^оабсазсега Н_збабтс_Ьгоабса5бег_; }; тпб па1г(1пб агдс, сбаг * агду[]) // Инициализация интерфейса С+т- в Р.05 2. гсТсрр: :т.птб(агдс, агду); // Создание и инициализация объекта узла Р05 2, ожидание завершения работы КС5 2 в цикле. гсТсрр; :зртп(5М: :паке_зЬагес1<5Таб1сТРВгоабса5Тег>(}); // Завершение рабо-ы С++-интерфейса Р05 2. гсТсрр::5КиТбоип(); геТигп 0; } Комментарии в коде подробно разъясняют назначение каждой строки. Процесс реализации полностью совпадает с версией на РуНюп, поэтому мы нс будем повторно останавливаться на этом. 3.2.5. Динамическая трансляция К (Ру1Ноп) При статической трансляции Н взаимное положение двух систем координат не меняется со временем. В робототехнических приложениях часто возника- ют иные отношения между системами координат, для которых относитель- ная поза изменяется; такие системы координат необходимо поддерживать с помощью динамической трансляции Н. Возьмем в качестве примера симулятор черепах. Предположим, что ле- вый нижний угол окна симулятора является глобальной системой координат с именем шогШ, а система координат, связанная с центром черепахи, пазы-
вается ЕигНепате (ее можно изменить в соответствии с именем конкретной черепахи, например Еип1е1 или 1иг11е2), как показано на рис. 3.13. Когда че- репаха движется, система координат 1пг11епате перемещается относительно \уог1(1 - таким образом, черепаху можно локализовать. Рис. 3.13 ❖ Системы координат в симуляторе черепахи По аналогии при разработке робототехнической системы на КОБ относительное по- ложение систем координат Ц испсльзуетя для локализации ообота. В дальнейшем мы будем применять ГТ довольно часто. Запустим пример и посмотрим, как работает динамическая трансляция ГР. Откройте три терминала и выполните следующие команды: $ гоз2 гип ГиггТезЩ ГигПезг^побе $ го$2 гип 1еаггдпд_1Г ГигНеИ-ЬгогсказТ-ег --го$-агд$ -р ГигГ1епане:=ТигТ1е1 $ гоз2 гип Н2_Гоо1г у<еи_Ггагте5 11 ри запуске ГигГ1е_ГТ_Ьгоабса5Тег параметр — гоз-агсд означает передачу параметров КС5 через командную строку; р означает рагагпеТег. В программе имя системы коор- динат черепахи задается параметром, поэтому здесь мы непосредственно передаем имя черепахи ЩгПе1. Если нужно использозать другое имя, просто измените соот- ветствующий параметр. Снова откройте сгенерированный РВР-файл: вы увидите две системы ко- ординат: \уог1(1 и Гиг11е1 (рис. 3.14). Код узла динамической трансляции 11 расположен в 1еагшп&_11/1еагпт8_1Е/ ГигНе ГГ ЬтоабсазГег.ру. Ниже приведен подробный разбор.
Транслятор: беТаоК_ао(боп(у Средняя скорость: 62.724 Длина буфера: 4.878 Последнее преобразование: 1705764594.831732 Самое раннее преобразование: 1705764589.953242 Рис. 3.14 ❖ Структура систем кооодинат в примере динамической трансляции 1Г гпрогР гс!ру # Библиотека РуСБоп-интертрейса РОБ 2. Ггоя гсСру.побе гпротI Иосе # Класс узла К05 2. Ггоп деопе1:гу_пед5.п5д спрогб ТгапзТогпЗбзтред # Сообщение преобразования координат. тпрогб С-Г-СгапзбогпаНопз # Библиотека преобразований СТ. Стоп 1Т2_го5 тпрогб ТгапзбогнВгоабсазбег # Широковещательный передатчик пэеобразований Н. Стол Чиг'Ыезт.т.тпьд гпрогС Розе # Сообщение о положении черепахи из СигСТеьт-П. сТаьз ТигСТеТЕВгоабсазбег(Мос1е): бе47___тпИ___(зеИ, парте): зирег().___тли___(папе) # Инициализация родительского класса узла РОБ 2. зе!1:.бес1аге_рагзле1:ег( ЧигНепане', ЧигИе ) # Создание параметра имени черепахи. # Использовать значение параметра, заданное извне, или значение по умолчанию. зеССЛигНепапе = зе1б.дег_раггпе1ег( 'гиггТепапе' ).деб_ра"ат|е1:ег_7а1ие().5Сг1г'д_7а1ие # Создание и инициализация объекта широковещательного передатчика К. веИлС-Ьг'оабсазбег = Тгапзбот г.ВгоасТсазГегЧеИ) # Создание подписчика на сообщения о положении черепахи. зеИ.зибзсггрбгоп = 5е1Е.сгеаге_зиЬзсггрггоп( Розе, б'/{гетТ.Сигт1епгпе}/розе , # Используем имя черепахи из параметра. 5еИЛиг1:1е_ро5е_саиЬаск, 1) # Обработчик сообщений о положении черепахи: преобразует позицию в координатное # преобразование. беЕ 1:иг1:1е_эо5е_саиЬаск(зеИ:, изд): # Создание объекта сообщения преобразования координат. Сгапзбогп - ТгапзбогпЗСапребО # Установка временной метки сообщения. Сгапз1гогп.1’,еэбег.5гапр зе1Е.де1:_с1оск() ,пои().1:о_п5д() # Установка исходной системот координат. Сгапз1:огп.1пеобег.(:гапе_гб = 'иогСб1 # Установка целевой системы координат. Сгапз1гогп.с1т11б_'ГгаГ|е_гб = зеИЛигСТепгпе # Установка смещения по осям х, у, г. ТгапзбогпЛгапзЕогпЛгапзТ.аНсп.х = пзд.х СгапзбогпЛгапзЕогпЛгапзТ.аНоп.у = лад.у СгэпзбоггтЛгапзЕогпЛгапзТ.аНсп.г = 6.0 # Преобразование углов Эйлера в кватернион (го!Л, ртЛсЬ, уаи).
а - 1:О:гап5ГогпэТ1оп5.чиа1:еггпоп_1то1’1_ги'1ег(0, 0, тдЛбеГа) # Установка поворота в формате кватерниона. бгапзбогп.бгапзбогп.гобабгоп.х = д[0] бгарзбогп.бгапзСогт.госаггоп.у = д[1] Тгапзбогп. бгагзбогп. гобаНоп. т. = д[2] бгапзбогп.бгаг.збогт.гобабтоп.и = д[3] # Передача преобразования координат: при изменении положения черепахи обновляется # информация о трансформации. ьеТС.б^Ьг оабсаьбег.ъепбТгапзбогт(бгапьбогп) беб га1п(агд5=б1опе): гсЛру .ЛлЛЩагдгагдз) # Инициализация РутЬоп-интерфейса РОЗ 2. побе = Тигс1еТгВгоабса5бег('Тигб1е_бб_Ьгоабса5бег'') # Создание и инициализация объекта # узла КОЗ 2. гс1ру.зртп(побе) # Цикл ожидания завершения работы КОЗ 2. побе.безСгоу_побе() а Уничтожение объекта узла. гсТру.'ЬиббокпО # Завершение работы РугКоп-интеэфейса КОЗ 2. В отличие от статической трансляции 11, гце используется ЗбаНсТгапяГогт Вгоайса.'йег, для динамической трансляции 11 применяется ТгапзГоппВгоас! сав1ег. Поскольку преобразование между системами координат изменяется во времени, необходимо периодически передавать преобразования для об- новления данных Н. Остальные части реализации аналогичны. 3.2.6. Динамическая трансляция 1Г (С++) То же самое можно реализовать на языке С++, Откройте три терминала и за- пустите пример динамического широковещания, написанный на С++, с по- мощью следующих команд: $ гоб2 гип бигбТезг"! биг11е5гп_побе $ го$2 гип 1еагпгпд_Сб_срр 1игб1е_б1_Ьгоабса5бег --гоз-агдз -р СигС1епапе:=Сигб'1е1 $ гоз2 гип бС2_боо1.5 ЛенДгапез Полученная структура систем координат совпадает с изображенной на рис. 3.14. Полный код находится в файле (сагпшд И срр/згсДигНс И Ьгоас! сазбег.срр. Ниже приведен подробный разбор. #гпс1ибе <€ипсбгопа!> #0пс1ибе <пепогу> #гпс1ибе <55бгеап> #.пс1ибе <5бг1пд» #1пс1ибе "гс1срр/гс1срр.Ьрр" // Библиотека интерфейса С++- в КОЗ 2. #^пс!ибе "Н2/1ЛпеагМабЬ/Зиагегпгсп.1т" // Библиотека работы с кватернионами. #\.пс1ибе "Рб2_гэ5/бгап51огт_Ьгоабсазбег.П'' // Передатчик трансляции преобразований 61. #гпс1ибе "бигбТезтп/пзд/рэзе.Ьрр" // Сообщение о положении черепахи из бигбТез’.т. #.пс1ибе "деопебгу_п5д5/г15д/бгапзбогп_ьбапреб.Брр'' // Сообщение преобразования координат. сгазз ТигбТеТБВгоабсаябег : риЫЛс гсТсрр: :Ыобе
риЫЛс: ТигНеТЕВгоабсазбегО : ЧобеС'ЬигНе-бС-ЬгоабсазСег") // Инициализация базового класса узла К05 2. { // Создание параметра для имени черепахи. Сиг1'1епане_ = СЬ15->с1ес1а,'е_рагапеСег<5С(1: :5Сг1пд>("СигС1епате", "СигбТе"); // Создание и инициализация объекта передатчика трансляции СГ. И_Ьгоас1са5гег_ = збб: :1чаке_ип1дие<1Е2_го$: :ТгапзЕотБгоабсаз1:ег>(*'(:пг5); // Формирование имени *емы с использованием параметра имени черепахи. $16: :озСггпдз1:геап $1геап; зСгеэгп « "/" « 1иг11епак1е_.с_$1г() « '/розе"; з!б: :зсг1пд торцС-Папе = з!геэп.51г(); // Создание подписчика на сообщения о положении черепахи. $иЬ$сггр1тсп_ - 1Р15->сгеа1э_8иЬзсг1о11оп<1иг11ез1п::п$д::Рэ$е>( 1ортс_папе, 10, $16::Ьтпб(&Тиг! 1еТЕВгоа6саз1ег:: 1иг11е_ро$е_са1.1Ьаск, 1Ы$, 316::р1асеЬо16егз::_1)); } ргтуаСе: // Обработчик сообщений о положении черепахи: преобразует положение в преобразование // координат. усгб 1игт1е_ро$е_са11Ьаск(соп$1 $16: :$1наге6_ргг<1иг11е$11л: :п$д: :Рсзе> пзд) { // Создание объекта сообщения преобразозания координат. деопе1гу_п$д$::пзд::ТгапзЕогп51атре6 1; // Установка временной метки сообщения. 1.Ьеа6ег.$1апр = 1Ьт$->де1_с1оск()->,пон(); // Установка исходной системе! координат. 1.1неэ6ег.1тапе_1.6 = иог16"; // Установка целевой системы координат. 1.сЬ\Югапе_16 = Сег11епапе_.с_$бг(); // Установка смещения по осям х, у, г. 1.бгап$Еогп.1гап$1абтоп.х = ">зд->х; 1.1гап$Еогп.1гап$1а1гоп.у = "1зд->у; 1.1гап$Еогп.1гап$1.а1гоп.7 = 0.9; // Преобразование углов Эйлера в кватернион (го11, рИсЬ, уаи). 1€2::Риасегп1оп д; д.ьеШУ(0, 0, п$д->1Ьеба); // Установка поворота в фермате кватерниона. б.СгапзЕогп.гогаИоп.х = ц.х(); С.бгапзЕогп.гоСаИоп.у = д.у(); РЛгапзЕогп.гоСаНоп.а = ц.г(); б.бгапзЕогп.гоСаИоп.и = ц.ы(); // Передача преобразования координат: пои изменении положения черепахи обновляется // информация о преобразовании. Сб_Ьгоа6саз1:ег_->$епаТгап5<:огп(С); }
гсЕсрр::ЗиЬзегтрбт-Оп^бигбТезгт: :п$д: :Роъе>::5>НагебР1т ъиЬьсггрНоп_; збб: :ипгцие_рбг<бЕ2_го5: :Т|ап5ботВгоас1саь1:ег> гГ_Ь-оабсаз бег_; збб: :5бгт.пд ЕигНепапр_; }; гпб па1п(1пб агце, сЬаг * агду[]) { // Инициализация интерфейса Сн+ в КОЗ 2. гс1срр: :1пИ(агдс, агду); // Создание и инициализация объекта узла КОЗ 2, цикл ожидания завершения работ КОЗ 2. гсЕсрр: :зргп(5бс1: :г»аке_зЬа1 ес1<ТигбЪеТЕВг оас!саы:ег>()); // Завершение работы интерфейса С++ в КОЗ 2. гс1срр:: =>Ни1:с1с'ИГ1(); геТигп 0; } В комментариях к приведенному коду подробно разобрано назначение каждой строки. Процесс реализации полностью совпадает с версией на Ру- 111оп, поэтому мы не будем повторно останавливаться на этом. 3.2.7. Прослушивание К (Ру1Ноп) Мы реализовали статическую и динамическую трансляцию ЕЕ и описали из- менение двух систем координат. Как же получить доступ к этой информации в процессе работы? Давайте изучим этот вопрос - в ЕЕ это называется про- слушиванием систем координат. Откройте два терминала, запустите узел статической трансляции гЕ и узел прослушивания. После успешного запуска в терминале будет периодически выводиться взаимное положение систем координат (рис. 3.15). $ гоъ2 гип 1еа(п1пд_ЕЕ 5(:аЕгс_ЕЕ_Ьгоас1саьЕег ГД гоз2(ФдцуиеЬоте: ~ О = - о х го52@диуие1юте:~$ гоз2 гип 1еагпгпд_!Т !Г_1!з!епег [1ЫЕО] [1721663041.866367821] [!Г_1!з!епег]: Се! могХд --> Ьоизе !гапз!огг): [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1ИР0] [1721663042.832081290] [!Т_1лз!епег]: Се! иогТд --> Ьоизе !гапзГогт: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1ЫР0] [1721663043.832736085] [!Г_1Лз!епег]: Се! могХд --> Ьоизе !гапз!огт: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1ИР0] [1721663044.832339659] [!Г_1Лз!епег]: Се! иогТд --> Ьоизе !гапзТогп: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕ0] [1721663045.832631784] [!Г_1Лз!епег]: Се! иог!<1 --> Ьоизе !гапз!огт: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1НР0] [1721663046.832307446] [!Г_1Лз!епег]: Се! иогТд --> Ьоизе !гапз!огт: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1ИР0] [1721663047.832950875] [!Г_11з!епег]: Се! мог1с1 --> Ьоизе !гапз!огт: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] [1ИР0] [1721663048.832351508] [!!_1Лз!епег]: Се! иогТд --> Ьоизе !гапз!огт: [-10 .000000, -5.000000, 0.000000] [0.000000, -0.000000, 0.000000] Рис. 3.15 ❖ Прослушивание ГГ и вывод взаимного положения двух систем координат
Как указанные узлы получают информацию о взаимном положении двух систем координат через 11? Полная реализация находится в файле (еагпшд Н/ гГНзЕепег.ру. гпрогТ гс1ру # Библиотека РубНоп-интерфейса для КОЗ 2. Егоп гс!ру.пос1е тпрогб Мобе # Класс узла КОЗ 2. СпрогС ЕЕ_СгапзЕогпаСлоп5 # Библиотека преобразования координат СЕ. Егоп СЕ2_гоз тлрогС ТгапзЕогпЕхсерССоп # Класс исключений при преобразовании координат СЕ. Геол СЕ2_гоз.ЬиЕЕег тпрогС ВиЕЕег # Класс буфера для хранения информации о преобразовании # координат. Егоп СЕ2_/о5.СгапзЕоги_1т5Еепег СпрогС ТгапзРогтИзгееег # Класс слушателя преобразований # координат. сСазз ТЕЕ1зСепег(Мос1е): РеЕ____т.пЦ__(зеСЕ, пазе): зирег().___таге__(пазе) # Инициализация родительского класса узла КОЗ 2. # Создание параметра имени исходной системы координат. 5еИ.бес1аге_рагагрегег(1 зоигсе_бгагпе1, 'йоги') # Приоритетное использование внешнего значения параметра, иначе - значение по умолчанию. 5е1.Е.5оигсе_Еггпе = \ 5е1.Е.деС_раггпеСег('ьсигсе Егале') .деС_рагапеСег_уа1.ие().5Сггпд_уа''1.ие # Создание параметра имени целевой системы координат. зе1.Е.бес1аге_рагапеСег(1 Та г деСТг апле', 1 Ьоизе') # Приоритетное использование внешнего значения параметра, иначе - значение по умолчанию. з е1.Е.СагдеС_Еггпе - зе1Е.деС_рагапеСег(1 СагдеС Ег апе ).деС_рагапеСег_уа',.ие().зСгСпд_уа1.ие # Создание буфера для сохранения информации о преобразовании координат зе1Е.СЕ_ЬиЕЕег = ВиЕЕег() # Создание слушателя преобразования координат. зеСЕ.НЧЛзСепег = Тгапз₽огпЕг5Сепег(зе"1.Е.сЕ_ЬиЕЕег, зеЕЕ) # Создание таймера с фиксированным периодом для обработки информации о координатах. зеСЕ.ССпег = зе1Е.сгеаСе_Сгпег(1.е, зе1Е.оп_Сг|т.ег) беЕ оп^ССпег(зеСЕ): фгу: # Получение текущего воемени КОЗ. пои = гсТ.эу.Ст.пе.ТСпеО # Прослушивание преобразования координат от исходной системы к целевой в текущий момент. Сгапз = ае'сЕ. СЕ_ВиЕЕег. 1оокир_Сгапз Гогг^ зе1Е.гагдеС_Егале, зе1Е.зоигсе_Егапе, пои) # При неудачном получении преобразования координат переход к отчету об исключении. ехсерС ТгапзЕогпЕхсерССоп аз ех: зеСЕ.деС_1оддег(). СпЕо( Е Ссо1с1 поС СгапзЕогп {зе1Е.СагдеС_Егапе} Со {зе1Е.зоигсе_Егапе}: {ех}') геСигп рез = Сгапз.СгапзЕогт.СгапьЕаСтоп # Получение информации о позиции. диаб = Сгапз.СгапзЕогт.гоСаттоп # Получение информации о позе (кватернион).
еи!ег - Н_Ггап51огпаН..оп5.еи1ег_бгст_диа1:егп'1.оп([диаЕ.х, циаб.у, циаГ.г, чиаб.и]) зеИ.деТ_1осдег')ЛпГо('Ьег --> %5 Егапьбогп: [%б, %1, %Е] [%1, %б, %Г]1 % (ЧеИ.ьоигсеДгапр, ье!1 ЛагдеГ_1гале, роз.х, роз.у, роз.г, еи!ег[0], еи'(.ег[1], еи!ег[2])) беГ 1ча1п(агдз=№пе): гс1ру.1п1т(агаз=агдз) побе - ТНлзсепегС'НДЦзбепег") гс1ру.зр1п(по<1е) поСе. с^езТгоу_пос1еО гсТру. зЬиЩомД) # Инициализация интерфейса Рутпоп для РОЧ 2. # Создание объекта узла РОЗ 2 и выполнение инициализации. # Циклическое ожидание завершения РОЗ 2. # Уничтожение экземпляра узла. # Закрытие интерфейса РуЙпсп для РОЗ 2. В .этом коде требуется выполнять прослушивание отношения между двумя системами координат. Сначала посредством класса слушателя 11 ТгапзГопп- ЫЩепег создается объект 11_И<5Гепег, который используется для последующих операций прослушивания. Одновременно создается 11_Ьн11ег - буфер для хранения сведений о преобразованиях координат. Далее методом 1оокнр_ 1гап81огш() по именам любых двух систем координат запрашивается их вза- имная поза, результат сохраняется в переменной ггапз и включает перенос по осям х, у, х (ПапДаНоп) и вращение по осям х, у, 2 (го1аНоп). Прослушивание 11 не различает динамические и статические трансляции 11, важна лишь доступность нужных систем координат в робототехнической системе КОЗ 2. Поэтому если нужно прослушивать динамическую транс ляцию 11, запустите узел динамической трансляции и узел прослушивания, а в параметрах целевой системы координат в приведенной программе ука- жите 1нг11е1. Одновременно управляя движением черепахи, вы будете на- блюдать непрерывно изменяющиеся отношения систем координат 11. Для выполнения этого примера откройте четыре терминала и выполните следу ющие команды. $ гоз2 гип бигПезт."! Гиг11е5гт_пос1е $ гоз2 гип Теаспгпдбб РигС'СеббДгоабсаБРег --гоз-агдз -р 1и г Непале :=ШгЦе1 $ гоз2 гип ТеагггипдД! НДЛзгепег --гоз-агдз -р Гагде1:_Егапе:=Е:игг1е1 $ гоз2 гип ГигНезЩ Гигр1е_1:е1еор_кеу После успешного запуска управляйте черепахой с клавиатуры. В термина- ле узла прослушивания 11 вы увидите непрерывно обновляющиеся коорди- наты черепахи, как показано на рис. 3.16. 3.2.8, Прослушивание И (С++) Прослушивание 11 можно реализовать и на С++. Откройте два терминала и запустите указанные ниже узлы - в терминалах будет периодически вы- водиться взаимное положение систем координат, как показано на рис, 3.17. $ гоз2 гип 1еагг.гпд_1:1_срр 5ба(:гс_Н:_огоас1са'Яег $ гоз2 гип 1еагг.гпд_1:Е_срр Н Пяепег
ГП го52(ШдиуиеЬоп1е: ~ О = _ □ X го52@диуиеЬоте:~$ гоб2 гип 1еагп!пд_!! !Г_1Л5!епег --гоБ-агдБ -р !агде!_!гапе:= 1иг!1е1 [1МЕ0] [1721663109.507136316] [!Е_1Л5!епег]: Се! ногХд --> !иг!1е1 !гап5!огт: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1ИЕ0] [1721663110.453852298] [и_И5*елег]: Се! ног!д --> !иг!1е1 !гап5!огп: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1ЫЕ0] [1721663111.454012680] [!Г_1л5!епег]: Се! иогХд --> !иг!1е1 !гап5Еогт: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1ИЕ0] [1721663112.453592795] [!Г_115!епег]: Се! могХд --> !иг!!е1 !гап5!огп: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕ0] [1721663113.454216432] [!!_115!епег]: Се! ног!с1 --> !иг!1е1 !гап5Еогт: (- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕ0] [1721663114.454489799] [!Г_1Л5!епег]: Се! ногХд --> !иг!1е1 !гап5Гогп: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕО] [1721663115.453061813] [1Г_115!епег]: Се! иог!с1 !иг!1е1 !гап5Еогт: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕ0] [1721663116.452988178] [!Г_115!епег]: Се! ногХд --> !иг!1е1 !гап5!огп: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕ0] [1721663117.454995094] [!Г_11з!епег]: Се! иогХд --> !иг!1е1 !гапБЕогт: [ 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1МЕ0] [1721663118.453476604] [!Е_1г5!епег]: Се! мог--> !иг!1е1 !гап5Еогт: [- 5.544445, -5.544445, 0.000000] [0.000000, -0.000000, 0.000000] [1ЙЕ0] [1721663119.453349819] [!Г_Н5!епег]: Се! ног!д --> !иг!1е1 !гап5!огп: [- 5-544445, -5.544445, 0.000000] [0.000000, -0.006000, 0.060000] Рис. 3.16 ❖ Мониторинг взаимосвязи между двумя динамическими системами координат через ТГ ГП гоьгфдиуиепоте. - О = - с х го52?диуие!1опе--$ 1052 гип Теагптпд_ТГ_срр СГ_1т5Тепег [1МЕ0] [1721663172-610677498] [ТГ_1г51епег]: ОТ мог 10 --> пос5е ТгапзТогт: [-10 .000000, -5.600000. 0.000000] [0.000000, -0 000000, 0.000000] [ТМЕО] [1721663173.610601654] [СГ_1Л&Тепег]: Сет ног10 -> посге СгапзГогп: [-10 000000, -5.000000, 0.000000] [0.000000, -0.00000С, 0.000000] [1ИЕ0] [1721663174.611192690] [ТГТгаТепег]: СеТ иогТд --> 6об5е ТгапзГогп: [ 10 .000000, -5.000000, 0.090000] [9.000009, -0.000000, 0.000000] [1НР0] [1721663175.611633084] [ГГНзСепег]: СеС иогЮ --> Ноизе СгапБСогго: [-10 .009600, -5.000000, 6.000000] 10.600003, -0 000000, 0.000060] [1МЕ0] [1721663176-611781975] [ТГ.ИзТепег]: СеТ мог Ш -> Ьосзе ТгапзГогп: [-10 .000000, -5.000000, 0.000009] [0.000000, -9.000090, 9.000000] Рис. 3.17 ❖ Прослушивание 1Т и вывод взаимного положения двух систем координат Реализация приведена в файле 1еагшп^_1:Е_срр/8гсДГ_1181епег.срр. Ниже приведен подробный разбор. #гпс!ис1е <сЬгопб> #гпс1ис1е ^-ГипстгопаЪ #тпс!ис1е <^1еиогу> Мпс’Ые 55Тг1пд> #тпс1ис!е "гс!срэ/гс1срр. Нрр" #гпс!и^е "Н2/ехсерНоп5.Ь" Нпс'Ые Ч^-Гсз/СгапбГогпДгзСепег.Ь1' #тпс1ис1е "ТГг-Гсз/ЬиГГег.Ь" ибтпд папеьрасе 51с)::сЬгопо_1Н:ега1.5;
сТазз ТгИзбепег : риЫЛс гс1_сор.: Мобе { риЫЛс: ТР1Л5{:епег() : ПобеС'еЛТЛзбепег") // Инициализация родительского класса узла Я05 2. { /7 Создание параметра имени целевой системы координат с приоритетным использованием внешнего // значения, иначе значения по умолчании. СагдеС-Ггапе- - 1К1з->6ес1аге_рага"1еСег<з1:6: :5Сгт.пд>("1-агдеС_Ггапе", "Конзе1'); // Создание буфера для сохранения информации о преобразовании координат. бб_Ьиббег_ = згб : :паке_ипгдие<Н2_гоз: :Вн1:тег>(Сб15->деС_с1оск()); // Создание слушателя преобразования координат. Сб_115Сеяег_ - збб: :паке_зКаге6<Сб2_гоз: :Тгап5богп1’.зТелег>(*Сб_ЬиСбег_); // Создание таймера с фиксированным периодом для обработки информации о координатах. Нпег_ = СЬгз->сгеаТе_иа11._Сгг.ег(1е, збб: :Ьтп<1(&ТЯЛ51:епег: :оп_Стлег, Шз)); } ргСуабе: 7отб оп_Сгпег() { // Установка имени исходной и целевой систем координат. зСб::збг1пд Тагдес_бгате = СагдеС_Сгапе_.с_зСг(); 21:6:: 5 Ьгтпд зоигсе_бгапе = "исгТ.6"; деопеТгу_п5дз::пзд::Тгал5богп51агре6 Лгала; // Прослушивание преобразования координат от исходной системы к целевой в текущий мсиент ггу { бгапз = Сб_ЬиП:ег_->1оок,нрТгап81:о''п( 1агде1:_бгале, зоигсе_бгапе, И2: :Т1пеРо1п1:2его); } сабсЬ (сопзб Ш: :ТгапзбогпЕхсео1:1оп & ех) { // При неударном получении преобразования координат переход к отчету об исключении. КС1СРР_1МЕ0( СЫз->де1:_1оддег(), "СоиИ пот Сгапзбогп %з То %з: %з", 1агде1_б'апе.с_51г(), еоигсе_бгапе.с_5Сг(), ех.иЬаЦ)); геЕигп; } // Преобразование кватерниона в углы Эйлера. Н2: :Эи?гегптоп ц( ЕгапзЛгап5Гоги.го(аЕгоп.х, 1гап5.ггаг15богп.го(аСтоп.у, Лгала. 1: ггпзбогт. го 1 абЛол. 2, Егалз.ггапзбогп.го1эбтоп.и); И2: :НаСггхЗхЗ п(ц); боиЫе гоЦ, ртЛс1т, уан; н.деСКРУ(го'1!, ртСсЬ, уаи); // Вывод полученной информации о координатах. ПС1СРР_1ПР0( 1Ыз->дег_1оддег(), "Себ %з --> %з Сгапзбо'п: [%б, %б, %б] [%б, %б, %€]",
5оигсе_Ггапе.с_51:г(), Та гдеТГг агле. сбТ г (), ТгапьЛгалз^сгп.ТгапьТаСсоп.х, ^гапв.'ЬгапзГогт.бгапзТа^т.сп.у, ±гап5. [гапзГсгпЛгапзТаНоп.г, го11, рИсЬ, уаи); } гсТсрр: ДъпегВазе: :5Ьаг?1Р1г 1Щег_{пи11р1г}; Мб::5На1 ес1_р1:г<И2_Г05: МгапзГоглЫзСепео гГ_1т51:епег_{пи11р1:г}; зтб: :игприе_р1:г<И2_гоь: :ВиГГег> М_ЬиИег_; 5 Гб: :з1:гтпд ЕагдеЕ Етвте ; }; гпВ патп(1п1: а, дс, сЬаг * агдх/[]) { Ц Инициализация интерфейса С++- в РОВ 2. гсТсрр: :1гтЩагдс, агду); // Создание объекта узла РОВ 2 и выполнение инициализации, циклическое ожидание завершения Ц РОВ 2. гсТсрр: :зртп(5Сс1: :паке_ьЬагеб<ТРИ51:е||ег>()); Ц Закрытие интерфейса С++ в ВОВ 2. гсТсрр::зНи!:иоип(); геСигп 0; } В комментариях к коду подробно разъяснен смысл каждой строки. По- рядок выполнения полностью совпадает с версией на РуТйоп, поэтому мы не будем повторно останавливаться на этом. Если требуется прослушивать динамическую трансляцию Н, запустите в четырех терминалах следующие узлы, результат показан на рис. 3.18. $ ГО52 тип РигтТезтп ЩгНезЩд'эбе $ гэз2 гип сеаттпд-И-Срр Тигс1е_Н_Ьгоа11са51:ег --гоз-агдз -р СигНепалегМигНе! $ гоз2 гип ^.еагптпд-СГ-Срр СГ_1Л5кепег --гоз-агдз -р Сагде1:_Ргапе:=1:игг1е1 $ гоз2 гип РигНезтп Гиг1:1е_1:е1еор_кеу ПТ го$2(&диуиеЬоте: - О = -ах го5 2^д1уиеНоре:-$ гое 2 гип 1еагпСпд_1Г_':рр СГДСзТегег --гоз-агдБ -р СагдеС_Ггаг е:=1игг!е1 [ТМРО] [1721663231.921341297] [СГ ИеСепег]: Сет ыогЫ --> СигтТе! Сгапзбогп: [- 7.560444, -5.544445, 0 006000] [0 600000, 0 000000, 0 000000] [1МГО] [1721663232.921836866] [МИМепег] бег йогЫ --> Сиг11е1 СгапзГогп: [- 7.56С444, -5.544445, 0.600000, [0 000000, -0.066000, 0.060000] [1ГЧГ0] [1721663233.921799801] Ц6_1гзТепег]: СеГ йогЫ -> 1иг«е1 Сгапзбогп: [- 7.560444, -5.544445, 0.9000001 [0 000000, 0 000000, 0 0Р0000’ [1МГ0] [1721663234.921800562] [(Т_1т.51епег]; бе! ыогЫ -> 1иг(1е1 СгапьГогп: [ 7.560444, -5.544445, 0.000000] [0.000000, -0.000000, 0.0000001 Рис. 3.18 ❖ Мониторинг взаимосвязи между двумя динамическими системами координат через ГГ Мы освоили базовые приемы работы с И, теперь перейдем к примеру сле- дования движения одной черепахи за другой.
3.2,9, Пример комплексного применения К: следование (Ру1Ноп) Это тот же пример следования, вы можете реализовать его самостоятельно и сравнить полученный результат. Откройте терминал и выполните следу- ющие команды. $ гоз2 ГаигсЬ 1еаггЛпд_1Е Гигт'1е_1:о11ок1пд_с1ер10. саипсЬ.ру $ гоз2 гип гиггТезгп гигПе_Те1еор_кеу Эффект соответствует встроенному примеру НО8 2, как показано на рис. 3.19. Рис. 3.19 ❖ Результат выполнения примера следования двух черепах 1. Принцип работы В симуляторе черепах задаются три системы координат, как показано на рис, 3.20. Глобальная система симулятора называется ууогШ, ее начало рас- положено в левом нижнем углу окна. Системы координат 1нг11е 1 и 1иг11е2 свя- заны с центрами соответствующих черепах и перемещаются вместе с ними. Таким образом, относительное положение систем шг11е1 и мгог1<1 задает по- ложение черепахи 1 в симуляторе, аналогично и для черепахи 2. Чтобы заставить черепаху 2 двигаться к черепахе 1, достаточно соединить их позиции отрезком и добавить стрелку. Вспомните школьный курс: это есть вектор. Описание преобразований координат и выполняется через векторы, поэтому ТГ легко решает задачу следования, Длина вектора задает расстояние, направление - угол. Зная расстояние и угол и задав временной коэффициент, можно вычислить скорость. Затем
формируется сообщение скорости и публикуется в тему. Черепаха 2, подпи- савшись на это сообщение, начнет двигаться по направлению вектора. Рис. 3.20 ❖ Определение систем кооэдинэт в симуляторе черепах Итак, суть примера - вычисление вектора через системы координат. Ло скольку обе черепахи непрерывно движутся, вектор нужно периодически обновлять, для чего используется динамическая трансляция и прослушива- ние 11. Разобрав принцип, перейдем к деталям реализации. 2. Разбор файла запуска Ьаипск Рассмотрим файл запуска 1еагп1п§_11/1аипскЛиг1:1е_Го11ош1п§;_с1ето.1аипс11.ру, который мы только что использовали. В нем запускаются четыре узла: 1) симулятор черепах; 2) трансляция системы координат черепахи 1; 3) трансляция системы координат черепахи 2; 4) управление движением для следования. Ггоп ТгипсН тлрогГ каипсЬОегсгкрггог, Ггоп кгипсЬ.асГгопз трпрогЦ Сес1агекаипсРАгдитепк Ггоп 1гипсЬ.5иЬ5Г1Гиг1оп5 кпрогк каипсЬСопГт.дигаггоп Ггоп '1аипсЬ_го5.асЛ.оп5 строг! Иове йеГ дрге-а1е_1аипсЬ_с1е$сгтр!1оп(): геГигп каипсКЬезсгсрЛопЦ Нойе( раскаде=1 кигсГе^гп ’, ехесикаЫе='кигк1е51п_пойе',
пзпе-Чгп' ), Мобе( рэскаде=11еагг.Чд_Н , ехеси*аЫе=Чиг*1е_'Ч:_Ьгоа<1саЕ1:ег , папте=' Ьгоабсагбег!', рагапетег5=[ {ЧигНгпапеЧ ЧигПеГ} ] ), 0ес1агекаспс11Агдчпеп1( ЧагдеОгапе , с1е(:аи11:_уа1ие=Чиг1:1.е1', беьсггр±1оГ1=1 Тагдеб ТгаР1в папе.' ). Нос1е( раскаде= Чеагп1рд_И', ехеситаЫе=Ч:иг1:1е_ТЧогоас1саяег , папе-1 Ьгоас1са5гег2|, рагапеТ:ег5-[ {ЧигНепа.зеЧ Чиг^1е2'} ] ), Пос1е( раскаде:;Чеагпт.пд_ТГ , ехеси*аЫе=' гигНе_Есио1л1гпд', папе- НзТепег', рагапекегз=[ { Чагде^Ггапе : 1азпс'1СопНдзгаНсп( Чагдет_Чапе')} ] ), ]) В этом файле запуска ЬаипсН для трансляции обеих систем координат по вторно используется узел 1игНе_Н_Ьгоас1са81:ег, имена транслируемых систем координат задаются через параметры. 3. Динамическая трансляция систем координат Преобразования координат от ллгог1с1 к 1:игНе1 и шгйе2 реализованы в узле ШгНеНЬгоайсаяГег. За исключением различий в именах систем координат, функциональность для обеих черепах одинакова. Подробная реализация была рассмотрена в разделах 3.2.5 и 3.2.6, и здесь мы не будем повторно на этом останавливаться. 4. Следование черепахи Когда трансляция систем координат настроена, остается подписаться на взаимное положение черепах и преобразовать его в команды скорости для управления. Полный код приведен в файле 1еагтп5_НДигНе_Го11ош1п§.ру. Ниже дан подробный разбор,
Бпрогт табН Бпрогб гсБру # Библиотека интерфейс? РубЬоп для 405 2. Б^он гсЛрупобе Бпрогб Мобе # Класс узла Р.СЗ 2. Бпрогб бБ_бгапзБогпабБоп8 # Библиотека преобразования координат бБ. бгоп Бг2_гоз Бпрогб БгапзбогпЕхсербгоп # Класс исключении при преобразовании косрдинат хБ. Гго'л Б€2_го5.ЬиББег Бпрогб ЕиББег # Класс буфера для хранения информации # о поеобразовании координат. бгоп ББ2_го8.БгапзБогп_ББ5Бепег Бпрогб БгапьЕогпЕгзсепег # Класс слушателя пэеобразоваьий # координат. Бгоп деопеб'у_п5дз.п'.д тпрогб ТнБзб # Сообщение управления скоростью РОЗ 2 Бгоп Бигб1е5гп.5Г7 Бпрогб Зраип # Интерфейс службы генерации черепах. сБазз ТигбБеЕоББон\.пд(^обе): ОеБ ___Бпбб__(зеББ, папе): зирег().___Бпгб__(папе) # Инициализация роди’ельского класса узла КОЗ 2. # Создание .параметра имени исходной системы косрдинат. ье1Б.бесБаге_рагагебег('зонгсе_Бгапе', 'БигбБеГ) # Приоритетное использование внешнего значения параметра, иначе - значение по умолчанию. зеББ.зоигсе_Бгапе = зеББ.уеб_рагапебег( '5оигсе_Бгапе ).деб_рагапебег_маБие().збггпд_^аБие # Создание буфера для сохранения информации о преобразовании координат. зеББ.бБ_ЬцББег - ВиБГег() # Создание слушателя преобразования координат. зеББ.бБ_1Сзбепег = ТгапзБогпБгзСепегСзеББ.бБ-ЬиББег, зеБ^) # Создание клиента запроса генерации черепахи. зеББ.зраипег = зеББ.сгеабе_сББепб(5ра,ип, 'зранп') # Флаг готовности запроса к службе генерации черепахи. 5 еББ.СигББе_ьран1|бпд_зег7Ссе_геабу - БаБзе # Флаг успешной генерации черепахи. ьеББ.БигсБе_зргнпеб = БаБзе # Создание темы скорости для следящей черепахи. зеББ.риББгзЬег - зеББ.сгеаБе_риЬББ8Пег(Тчгзб, 'БигбБе2/спб_7еБ', 1) # Создание таймера с фиксированным периодом для управления движением следящей черепахи. зеББ.СБпег = зеББ.сгеабе_бгпе."(1.0, зеББ.оп_бгг.ег) СеБ оп_СБпег(зеББ): Бгоп_Бгапе_геБ = зе1Б.зоигсе_Бгапе # Исходная система координат. бо_Б_апе_геБ = 'бигБ1е2' # Целевая система косрдинат. # Если запрос к службе генерации черепахи уже отправлен. Б Б зеББ.БигББе_8раипБпд_зег7Бсе_гегс1у. ББ зеББ.БигББе_зраипес1: # Если следящая черепаха уже сгенерирована. бгу: пси = гсБру.ббпе.ББпе() # Получение текущего времени РОЗ. # Прослушивание преобразования координат от исходной системы к целевой в текущий момент. бгапз = зеББ.ББ_ЬиББег.Боокир_БгапзБогп( бо_БгаГ|е_геБ, Бгоп_Бгапе_геБ, .той)
# При неудачном получении преобразования координат - вывод отчета об исключении. ехсерб ТгапзЕогпЕхсерггоп аз ех: 5е'И.дет_1.оддег().1пГо( б СоиУ по! ЕгапзТогп {го_Егапе_ге1} то {Егсил_€гапе_ге1}: {ех}') гебигп изд = ТигзЕ() # Создание сообщения управления скоростью. 5са1е_гоЕаНоп_гаСе - 1.0 # Расчет углевой скорости по углу черепахи. тзд.апдиТаг.г = 5са1е_го1:аП.оп_га'(:е * гпагЬ.абап2( РгапзЛгагзЕогтЛгапзТаСгоп.у, ТгапзЛгапзЕогтЛгапзЕаНоп.х) 5са1е_Еогиагб_5реес1 = 0.5 # Расчет линейной скорости по расстоянию до черепахи. тзд.Нпеаг.х - 5са1е_Еогиагф_5рееб * гпагН.здгб( РгапзЛгагзЕогтЛгапзТаСТоп.х ** 2 + ЕгапзЛгапзТогтЛгапзТаНоп.у ** 2) зе!4:.риЬ'1т5бег.риЬ1.г51т(п5д) # Публикация команды скорости для движения следящей # черепахи. # Если следящая черепаха еще не сгенерирована. е1зе: ТЕ 5е1Е.гези11.бопе(): # Проверка, сгенериэована ли черепаха. 5е1Е.де1_1оддег(),ТпЕо( Е'биссеззЕиIIу зрачпеб {зеТЕ.гезиТР.гезиТЕО.папе}') зеЕЕЛигНезраипес! - Тгие еЕзе: # Черепаха еще не сгенерирована. зе1Е.дет_Еоддег().ТпЕо('браип Т.з пот Егпгзпеб ) еЕзе: # Если запрос к службе генерации черепахи еще не отправлен. ТЕ зеТЕ.зраипег.зегуТсеТзгеабуО: # Если сервер генерации черепахи готов. гециезЕ = Зра'лп.КедиезЕО # Создание данных запроса. # Установка данных запэоса: имя черепахи, координаты х, у, поза. гец'аезб.папе - 'ЕигНе2' гециезЕ.х = ЕЕоаТ(4) гециезЕ.у = ЕЕоаС(2) гедиезЕЛЬеСа = Е1оаЕ(0) зеЕЕ.гезиЕЕ = зе1Е.5раипег.сгЕ1_азупс(гедие5Е) # Отпэавка запроса к службе. 5е1Е.ЕцГ'ЕЕ€_8раипЕпд_зегу1се_геабу = Тгие # Установка флага отправки запроса. еЕзе: # Сообщение с том, что сервер генерации черепахи еще не готов. зеИ.деТ-ТоддегОЛпЕоС '$ег<1се т.5 пот геабу') беб па1п(агдз=Попе): гс1ру.гптЛ(агдз=агд5) # Инициализация интерфейса РуЕЕоп для ПОЗ 2. побе = ТигЕ1еЕо11ощ1пд("ЕигЕ1е_ЕоЕ1о«1пд") # Создание объекта узла КОЗ 2 и выполнение # инициализации. гс1оу.зрЕп(побе) # Циклическое ожидание завершения КОЗ 2. побе.бе51гоу_г,обе() # Уничтожение объекта узла. гсЕру.збиббомп() # Закрытие интерфейса РуЕЬоп для ПОЗ 2. На примере следования двух черепах показано, как в НО8 2 использовать систему управления координатами ЕЕ для создания, обновления и прослуши вания различных систем координат. По мере роста сложности робототехни-
ческой системы аналогичный подход позволяет поддерживать согласован- ность ее систем координат. В сложных робототехнических системах меже- содержа-ься множество систем коор- динат - как правило, их взаимное расположение предварительно задают при модели- ровании робота с помощью 11К0Е. Соответс-вующие вопросы рассмотрены в главе 4. 3.2.10. Пример комплексного применения К: следование (С++) Тот же пример следования черепахи можно реализовать и на С++. 1. Разбор файла запуска Ьаипсй В версии на С++ используется файл запуска 1сагп1п§_гГ_срр/1аипс1т/Шг1:1е_&1 1осут§_с1ето.1аипс11.ру, который, как и прежде, запускает четыре узла: 1) симулятор черепах; 2) трансляция системы координат черепахи 1; 3) трансляция системы координат черепахи 2; 4) управление движением для следования. 2. Динамическая трансляция систем координат Преобразования координат черепах 1 и 2 в системе шогШ реализуются в узле СигНеИЬгоабсазСег. За исключением различий в именах систем координат, функциональность для обеих черепах одинакова. Подробная реализация уже была рассмотрена в разделах 3.2.5 и 3.2.6, поэтому здесь .мы не будем по- вторно на этом останавливаться. 3. Следование черепахи Когда трансляция систем координат запущена, можно подписаться на взаим- ное расположение двух черепах и преобразовать его в команды скорости для управления. Полная реализация на С++ приведена в файле 1еа1шп§_Н_срр/ згсДигНе ГоПошту.срр. Ниже дан подробный разбор. #Тпс1ис1е ^сЬгопо #гпс1ис1е <ЩпсС1.опа1.> #т.пс1ис1е <Р1₽погу> #гпс!ис1е <5Сг1пд> #Тпс 1и6е "дестеСгуцъдь/пьд/СгапзГсггцБГапреД Нрр" #гпс1ис1е "дестебгу^здх/тзд/ЩгзС.Ьрр" #1пс1и^е "гс1срр/гс1срв.Нрр" #гпс1ис1е "И2/ехсерНоп5.Ь" #1пс1ис1е 'ЧЩ-Гоз/ГгапИогпДЛзСепег.Ь" #гпс1ис1е "И2_го5/ЬиИег .Ь" #1пс1ис1е "СигНезгп/згу/зраип.^рр'
изхпд пэпезрасе збб: :сЬгопо_1Л1:ега1.5; сТазз ТигНеЕоиошхпд : риЫЛс гсьсрр: :Е1о6е { риЫЛс: ТигТЛеЕо11.о«Лпд() : Мосе('ЛигС1е_'Л2_Егате_1Л51:епег"), Тиг-(:1е_5ра1л/п1пд_5ег71се_геас1у_(5а15е), 1иг1:1е_5ра1л/г,е6_(Еа15е) // Инициализация родительского класса узла РС5 2. { // Создание параметра с именем целевой системы координат, с приоритетом использования // внешнего значения, иначе - значения по умолчанию. СагдеС_Егаг1е_ = ЕЫз->6ес1.аге_рага"1е1:ег<з1:с1: :зЕгтпд>("1:агде1:_Егапе", 'ЛшЛТеГ'); // Создание буфера для хранения информации о преобразованиях координат. ЕЛ_ЬиНег_ = 516: :паке_ипхцие<1Е2_гоз: :ВиНег>(1Ы.з->де1_с1.оск()); /7 Создание слушателя преобразований координат. И_1Л'Лепе( _ = 216: :1лаке_5лаге6<1Е2_1 оз::Тгапзбог гЛтЕЛе.тег>(*ТЛ_ЬнТСег_); // Создание клиента запроса генерации черепахи. зраипег_ = 1Ы5->сгеа1е_с1Леп1<1иг11еьхп: :згу: :5раип>(4зраип"); // Создание темы скорости для следования черепахи. раЫтьНег_ = 1Ыз->сгеа1е_риЫ1з11ег<деопе1гу_П5д8: :пзд: :Т|л1Х81>('1иг11е2/с(ч6_уе1' , 1); // Создание таймера с фиксированным периодом для обработки координатной информации. 11пег_ = 1Ыз->сгеа1е_иаи_1хгег ( 1з, 516: :Ы|16(8.Тиг11.еЕоио1<Лпд: :оп_11пег, ЛНЛ5)); } ргхуа!е: уосб оП-НпегО { // Установка имен исходной и целевой систем координат. 516: :5бгЛпд ЕгопЕгапеРе! = 1агде1_Егапе_.с_51г(); з16::$1гхпд 1оЕгапеРе1 = '1иг11е2"; хЕ (Еиг11е_5рашпхпд_зег71се_геа6у_) { хЕ (1иг11е_5раипе6_) { деопе1гу_п5дз: :пзд: ЛгапвЕоггЛСаирео б; // Прослушивание преобразования косрдинат от исходной системы к целевой в текущий момент // времени. бгу { 1 = хЕ_ЬиЕЕег_->1оокирТгапзЕогп( ЕоЕгапеР.е!, ЕгонЕганеКе!, 1Е2; ТхГ|еРохп17его); } саЕсЬ (сонзЕ 1Е2: :Тгап8ЕогпЕхсер11оп & ех) { // Вывод отчета об ошибке, если не 7далось получить преобразование координат. РС1СРР_1ПЕ0( 1М.5->деб_1099егО, "Сои 16 по! ЕгапзЕогп %5 Ео %з: %5", ЕоЕгапеРе1.с_зЕг(), Его1'1ЕгапеРе1.с_5Ег(), ех.иЬаЕ()); геЕигп; } // Создание сообщения управления скоростью. деопеСгу_п5д5::т5д::Тит51 пзд; // Расчет угловой скорости по углу черепахи. 51атЛс ССП5Г 6оиЫ.е зсаТеРосаЕЛопРате - 1.0;
пзд.апди1аг.2 = зсаЕеРогаСтог.РаСе * аСап?( 1.1: гапзбогп. СгалзТаСтол. у, 1: . (та.лзЛогп. ТгапьТаМоп. х); // Расчет линейной скорости по расстоянию черепахи. Збайте сопзб боиЫе зсаТеЕогиагс15реес1 - 0.5; Р|5д.Ипеаг.х = зсаТеЕогигагбЗрееб * зцг1:( рои^ЛгапзЕогтЛгапзСаСтоп.х, 2) + рон( 1:.^гапзГопп. СгапзЕаСтоп.у, 2)); // Публикация команды скорости для следования черепахи. риЫтз1тег_->рио115Ь(пзд); } е!зе { // Проверка, создана ли черепаха. РС1_СРР_1 М?0(СПъз - >деС_1ос де г (), "ЗиссеззбиНу зраипеб"); бигб1е_5ра1л,пес1_ = Сгие; } } е!зе { // Если сервер генерации черепахи уже готов. тГ (зраипег_->зегу1се_г5_геа<1у()) { // Создание данных запроса, установка содержимого запроса, включая имя черепахи, // положение ху и ориентацию. аибо гециезб = збб: :1>1аке_51тагеб<СигС1е51п: :згу: :3раип: :КериезС>(); гециезС->х 4.0; гециезЕ->у - 2.0; гедиезС->с1теса = 0.0; гециезС->папе - Чцг11е2"; // Отправка запроса службы. изтпд ЗегутсеРезропвеЕибисе = гс!срр: :С1депЕ:<1:игиезт.р1: : згу: :5ранп>::ЗКагеб Еибиге; аиСс гезропзе, есетлебсаПЬаск = [СпгзКЗегутсеРезропзеЕиСиге ЕиТиге) { аисо гезиИ = Еигиге.дес(); т/ (зСгс1г1р(гееи1Л->па1>1е.с_5Е:г(), "СигНе2") == 0) { // Установка флага, указывающего, что запрос был отправлен. Сиг1Ае_5ргнп1пд_зегугсе_гегбу_ - Сгие; } е!зе { КСЕСРР_ЕР.КОК(1:1т15->де1:_1'оодег(), 'Зегутсе саИЬаск гезиИ птзиабсК'); } }; аибо гезиИ = зраипег_->а5упс_зепб_гедие5с(гедиез1:, гезролзегесетуебсаНЬаск); } е!зе { // Сообщение о том, что сервер генерации черепахи еще не готов. КС1.СРР_ИР0(СЫз->деЕ_1осдег(), "Зегутсе гз лоб геабу"); } } } Ьэо! Сигб1.е_59анпгпд_8ёгу1се_геабу_; Ьэо! СигС1е_зранпеб_; гсТсрр: :С1гепб<сигс1ез1т::згу::5рамл>::ЗЬагебРЕг 5раилег_{ри11рбг}; гсТсрр::ПпегЕазе::ЗЛагебРЕг Сгч1ег_{пи',1.1рС:г}; гсТсрр: гРиЫ.гзКегкдеопеСгу-Пздз-:пзд: :Ти1зЕ>::ЗЬагебРСг риЫтзЛег_{пи11р1:г};
зТб: :5Ьагес1_рбг<И2_го5: :Тгап5Гсгп1Л5Тепег> Н_1Л$бепег_{пц1,1.рбг}; 5±б: •ипгцие_рЕ:г<Н:2_гоь::ВиГГег > Н_ЬиИег_; збб: гзбгтпд ГагдеГМгапем }; ггД глаёп(1 пб агас, сЬаг * агду[]) { // Инициализация интерфейса С++ в НОЬ 2. гсЕсрр: ЛпИда'дс, агду); Ц Создание объекта узла КОъ 2 и его инициализация, ожидание завершения работы К05 2. гсЕсрр::Ер<п(5±с1: :паке_ьЬагес1<ТигС1еЕоиои1пд>()); // Закрытие интерфейса РОЕ 2 С++. гсЕсрр:: зЕтиббон/п(); гебигп 0: } 3.3. баиеЬо: платформа для трехмерного физического моделирования роботов При разработке роботов с использованием КОЗ главную роль играет сам робот. Но что делать, если под рукой нет физического образца? Не пробле- ма: платформа для трехмерного физического моделирования С1а2:еЬо может «создать робота из ничего» в виде виртуального устройства. 3.3.1. Введение в СагеЬо СахеЬо - одна из наиболее распространенных платформ для трехмерного физического моделирования в экосистеме НО8. Она поддерживает физиче- ские движки и обеспечивает высококачественный графический рендеринг. Платформа позволяет моделировать как робота, так и его окружение, а также учитывать физические характеристики, такие как трение, упругость и др., как показано на рис. 3.21. Например, создавая марсоход, можно смоделировать в СагеЬо условия на поверхности Марса Или при разработке беспилотного летательного ап- парата из-за ограничений дальности и зон полетов невозможно часто про- водить эксперименты на реальном устройстве. В таком случае имеет смысл сначала выполнить моделирование в Сат:еЬо, а затем, доведя алгоритмы до приемлемого уровня, развернуть их на физическом аппарате для испытаний. Платформа (За/еЪо помогает проверять алгоритмы робота, оптимизировать его конструкцию и тестировать сценарии применения, обеспечивая более гибкий подход к разработке.
Рис. 3.21 ❖ Моделирование робота с помощью СагеЬс СагеЬо появилась в 2002 году, то есть раньше самой платформы КОЗ. В 2009 году при разработке КО8 и робота РК2 была реализована симуляция в СахеЬо. С тех пор эта платформа стала одной из наиболее используемых симуляторов в сообществе КОЗ. Впоследствии ОагеЬо и КОЗ развивались вместе, став двумя ключевыми проектами, поддерживаемыми фондом ОЗКР. Подобно КОЗ 1 и КОЗ 2, у СахеЬо есть две крупные ветки: СагеЬо С1аз81с и Са/еЬо Зпп. Как следует из названия, ОагеЬо С1а8<йс - классическая ветка, она часто устанавливается по умолчанию в настольных сборках КОЗ и имеет обширную экосистему материалов. Последний выпуск СагеЪо С1а«81с вер сии 11.0 вышел в 2020 году, и его поддержка прекращается в 2025 году (см. рис. 3.22). А ПЬипгн 24.04 и КОЗ 2 (ахгу уже не поддерживают эту ветку. ОагеЬо 1 9 2013 от 24 багеЬо 2 2 2013 11 07 багеЬо 3020Н04 и СагеЬо 4 0 гом-07-28 багеЬо 5 0 2015-01-26 багеЬо 60 2015 07-27 багеЬо 71 2016 01-25 СагеЬо 82 2017-12-10 СагеЬо 9 0 готе 01 25 СагеЬо 10 0 2019 01 24 СагеЬо 11 0 2020 01 зо Рис. 3.22 ❖ Версии платформы СагеЬе С1г551С и ее интерфейс
СагеЬо 81т была заново спроектирована и разработана снизу вверх. Пер- вый официальный релиз вышел в 2019 году (см. табл. 3.1). В нем появились новые возможности моделирования, например поддержка деформируемых объектов и более гибкий модульный механизм подключаемых модулей. Что бы отличать его от СагеЬо (Лаззгс, изначально использовалось название 1§ш- Ноп, однако разработчики продолжали называть его (ЗагеЬо. После стабили- зации проекта официальное название вернули к СагеЬо. В связи с прекращением обновлений СагеЬо С1азз1с в 2025 году сообщество КОБ рекомендует как можно скорее переносить работу на актуальные версии СагеЬс. Таблица 3.1. Версии СагеЬо Имя версии Дата выхода Прекращение поддержки Примечание СахеЬо-1 Сент. 2025 Сент. 2030 ЬТБ СагеЬо I Сент. 2024 Сент. 2026 Нагтошс Сент. 2023 Сент. 2028 ЬТБ Сагбеп Сент. 2022 Пояб. 2024 РогТгезз Сент. 2021 Сент. 2026 ЬТБ ЕсНбсе Март 2021 Март 2022 ЕОЬ Иоте Сент. 2020 Дек. 2021 ЕОЬ Сйабе! Дек. 2019 Дек. 2024 ЬТБ ШиерпгД Май 2019 Дек. 2020 ЕОЬ АсгороПз Фев. 2019 Сент. 2019 ЕОЬ Во зсех примерах этой книги, связанных с Сагеэо, используется веэсия СагеЬо Наг топк. Старые и новые ветки СагеЬо не совместимы полностью, поэтому при исполь- зовании Сагебо С1азз1с возможны ошибки. Итак, как же пользоваться СагеЬо? Для начала просто запустите ее и озна- комьтесь с основными возможностями. Ниже приводятся подробные шаги установки, рекомендованные разработчиками Са- гебо. Если вы запускаете Сагебо впервые или предпочитаете более простой способ установки, можно воспользоваться вспомогательным сценарием го5_1П5С.аЦ.51т из со- проводительного кода к книге. Перейдите в каталог со сценарием выполните в тер- минале команду ./го5_т5ТаИ.51т и следуйте подсказкам. Вес пакеты, связанные с СагеЬэ, .можно установить с помощью следующих команд: в Установка связанных зависимостей. $ зиФо арС-деС ирФаСе $ зибо арт-деТ гпзсаП. 1зЬ-ге1еазе идет дперд # Установка СагеЬо Нагпспгс. $ зиФо идет [Официальный ключ СатеЬо] -С /изг/з1таге/кеуг1пд5/ркд5-озг1:-агсЫ7е-кеуг1пд.дрд $ ес1то "ФеЬ [агск-$(с1ркд --рг1пТ:-эгс1тиесТ:иге) 51дпес1-Ьу-/и5г/81таге/кеугт.пд5/ркд5-05г(:-агсй17е-кеугт.пд.дрд] [Базовый ацрес репозитория СагеЬо]
$С15Ь_ге1еаье -сб) пагп' | зис!о гее /еТс/арГ/^оагсеЕ.НгТ.^/дагеэо-БбаЫе.ПБб > /Феу/йдЦ $ ьибо ар1-деб црфабе $ бьс1с арГ-деб гпБбаИ дт-Кагпопгс # Установка функционального пакета Заггу дг. $ бсс1с арб 1л}1аи гоБ-даггу-гоь-дг О Необходимо заменить [Официальный ключ СагеЬс] и [Базовый адрес репозитория багеЬэ] в командах на актуальные ссылки в соответствии с разделом 1п5Та11 офици- ального руководства багеЬо. После завершения установки можно запустить СахеЬо с помощью следу ющей команды. $ дг бтп Спустя некоторое время откроется окно, изображенное на рис. 3.23. По умолчанию будет предложено выбрать пример для запуска. СагеЬо дшек $1агЬ _ П X Нагтопк V 8.3.0 Зк_5Наре5.здГ аскегтапп_51ееплд.5(1Г асои$6с_сотт5.«1Р асои&Ыс_со тт5_<1 е т... асои51к_сотт5_тоу|... асои$Ыс_сотт$_раск... яим Рис. 3.23 ❖ Выбор примера после запуска балебо После выбора примера и нажатия кнопки 1Ш\ (Запуск) откроется собствен- но окно среды моделирования. Центральная область СагеЬо - это область отображения моделей, справа выводятся состояния и параметры различных моделей, как показано на рис. 3.24. Для начала можно разместить на сцене несколько стандартных фигур с панели инструментов в левом верхнем углу. При запуске в виртуальной машине возможно отсутствие изображения в области мо- делировэния или постоянное мерцание. В этом случае необходимо отключить в на стройках виртуальной машины параметр Ускорение ЗО-трафики.
Рис. 3.24 ❖ Интерфейс среды моделирования СагеЬо 3.3.2. Пример моделирования робота Познакомившись с СагеЬо, перейдем к моделированию робота. Закройте все ранее запущенные примеры, откройте два терминала и вы- полните в них следующие команды: сперва запустите среду моделирования робота, затем - узел управления с клавиатуры. $ гоз2 ТаипсЬ го5_дг_51р|_с!е1'1О^ дШдФ «е. [аипсЬ.ру $ гоб2 гип Те1еор_Тит5т:_кеу5оагс1 Щ1еор_М5Т:_кеуЬэагс1 --гоь-агдз -г егк^е!: =тосМ/7е1пс1е_Ь I ие/спс1_уе1. После успешного запуска в окне СахеЬо появятся два мобильных шасси робота, как показано на рис. 3.25. В терминале узла для управления с клавиатуры с помощью четырех кла- виш «1», «)», «,», «1» можно перемещать одного из роботов вперед, назад, влево и вправо. Если требуется управлять вторым роботом, измените соот- ветствие имени темы управления скоростью у клавиатурного узла на тобе!/ уе1мс1е_Ыие/стс1_уе1, как показано на рис. 3.26. Процедура моделирования во многом схожа с ранее изученной симуляци- ей управления движением черепахи, однако теперь и робот, и среда модели- рования существенно сложнее.
Рис. 3.25 ❖ Моделирование двух роботов в СагеЬс И го52(ФдиуиеЬоте: ~ О = _ <? х го52®диуиеЬоте:гоз2 гип {е1еор_^т.51_кеуЬоагс1 Ье1еор_Снгз^_кеуЬоаг<1 --гоз-агдз -г ст<1_ие1:=то(1е1/иеЬгс1.е_Ыие/с1>1с1_уе1 ТЫз пойе гакез кеургеззез Ггоп 1Ье кеуЬоагд апс! риЫгзЬез 1Ьеп аз Ти151/Тнг51:81а1пре(1 теззадез. II могкз Ьез! иНЬ а 118 кеуЬоагд 1ауои(. Моугпд агоипд: иго 3 к г п , Еог НоХопопгс поде (з^гаНпд), Но1с1 домп 1Ье зЬгП кеу: и I О 3 К Ь М < > г : ир (+г) Ь : домп (-г) апуМчгпд е1зе : з^ор д/г : гпсгеазе/десгеазе пах зрее^з Ьу 10% н/х : гпсгеазе/десгеазе оп!у Нпеаг зреес! Ьу 10% е/с : гпсгеазе/десгеазе оп!у апди!аг зреед Ьу 10% СТКЬ-С 10 диг! Рис. 3.26 ❖ Изменение соответствия имени ’емы скорости для управления движением второго робота
3.3.3. Пример моделирования датчиков Возможности моделирования в СагеЬо весьма широки: помимо роботов, можно моделировать и распространенные датчики. В качестве примера рас смотрим камеру и оценим результат моделирования датчиков. Откройте терминал и выполните следующую команду: $ гоз2 1аипсН го5_дг_51п_с)епо5 гдЬС_сапега_Ьггс1де.1аипсЬ.ру После успешного запуска откроются интерфейсы моделирования СагеЬо и НУ12, как показано на рис. 3.27. В СагеЬо можно непосредственно наблюдать публикуемые симулированной ШЗВЙ-камерой данные изображения. СагеЬо ВОВ сатега СагеЬо Рер№ сатега -Жсатега5_а1оле ,4, сатега_ипЩ_1|^аг >АгдМ_сатега 'Ж1Ьегта1_ сатега >жСоп5Сгис11оп Сопе > ф $ип Рис. 3.27 ♦> Визуализация данных при моделировании датчика в багеЬо В запущенном ВУ12 также будут видны смоделированные данные датчика, как показано на рис. 3.28. Возможности моделирования (ЗагеЬо на этом не исчерпываются. В главе 4 мы подробно разберем построение модели робота и научим робота выпол- нять в моделируемой среде разнообразные функции.
/ор^/|о5/^1итЫе/^Ьаге/го5_д2_5^т_<^ето5/гV^I/^дЬ<^_сатега_Ьг^<^де.^VI^• - К5/1г ^МоцеСэтега '□5е1ес1 «я-Госи; Сатега сзмеашге X 2Э Роте ЕзЬтаЬе Х20Соа1Роте 9 РиЫ|5<1 Рот1 "Я" ,3_|таде Рис. 3.28 ❖ Визуализация моделирования КСВО-камеры в КУ!? 3.4. КУ|2: платформа визуализации данных Задумывались ли вы, как выглядит мир «глазами» робота? Как увидеть изо- бражение, полученное его камерой? Эти вопросы относятся к области визу- ального представления данных. В этом разделе мы изучим одну из ключевых составляющих КОЗ 2 - КУ12, инструмент трехмерной визуализации. 3.4.1. Введение в При разработке роботов требуется реализовать множество функций, и ана- лизировать их только на уровне данных затруднительно. Если, к примеру, показать людям карточки с числами от 0 до 255 и спросить, что здесь изо- бражено, большинство окажется в замешательстве. Но стоит преобразовать эти числа в визуальную информацию - и все становится гораздо понятнее.
Такие ситуации встречаются часто, как показано на рис. 3.29. Так, при моделировании робота важно иметь изображение его самого, а также рас- положение множества внутренних систем координат в процессе движения. При планировании движения манипулятора и автономной навигации мо- бильного робота необходимо наблюдать окружение, построенный маршрут, а также данные от датчиков - камеры, лазерного дальномера и др. Данные нужны для вычислений, а визуализация - для человека. Медель робота Координаты Планирование движения Навигация Рис. 3.29 ❖ Типичные сценарии визуализации данных при разработке роботов Визуализация данных существенно повышает эффективность разработки роботизированных устройств. Инструмент КУ:/ предназначен именно для этого: он позволяет быстро отрисовывать и отображать модель робота, дан- ные с датчиков, информацию об окружающей среде и т. д. ВУ'12 - едно из самых часто используемых приложений в КС5. Вместе с появлением КС5 2 оно также получило обновление - КУ|2 2. Ядро КУгг построено на визуальной подсистеме 01 - это открытая плат- форма, которая «из коробки» содержит подключаемые .модули для типовых задач визуализации в робототехнике. Достаточно в КОЗ публиковать со-
общения в соответствующие темы, и вы увидите графическое представление данных, как показано на рис. 3.30. Если базового набора недостаточно или требуется добавить новые способы отображения, можно разработать соб- ственные подключаемые модули для КХЧг и тем самым создать ПО верхнего уровня для своей робототехнической системы. Рис. 3.34 ❖ Визуализация в КУ1? мелели робота карты, камеры ит. д. Как и всякое средство визуализации, КУ'12 имеет графический интерфейс. Запустить КУ 12 можно из терминала соответствующей командой. $ ГО52 гип гугг2 гугг2 КУ1 г включен в полную версию ВОЗ, и, как правило, отдельная установка не требуется. После запуска откроется интерфейс приложения, как показано на рис. 3.31. Интерфейс КУ12 включает следующие области, 0: ЗИ-область, где отображаются визуализируемые данные; пока данных нет, поэтому показывается черный фон; 1: панель инструментов с управляющими командами: управление ракур- сом, задание цели, публикация точки и др.; 2: список отображений, где перечислены добавленные подключаемые модули визуализации и настраиваются их свойства; 3: область настройки вида, где выбирается режим обзора; 4: область времени, где отображается системное время и время КОЗ. Как же сделать так, чтобы данные стали видимы в КУ12?
Рис. 3.31 ❖ Интерфейс НУ!? 3.4,2, Процесс визуализации данных Первое, что нужно сделать для визуализации в КУ12, - иметь данные, пуб- ликуемые в виде сообщений требуемого типа. Тогда в КУ12 подключается соответствующий модуль, который подпишется на нужную тему и выполнит огрисовку. Ниже приведено пошаговое описание процесса. Сначала добавьте подключаемый .модуль отображения данных. Нажмите кнопку ЛДй (Добавить) в нижней части левой панели К\ш, откроется список поддерживаемых типов модулей, как показано на рис. 3.32. Выберите .модуль для нужного типа данных, затем в поле В1$р1ау №те (Отображаемое и.мя) задайте уникальное и.мя для данного отображения. На- пример, чтобы показать данные от двух лазерных датчиков, добавьте два модуля типа Ьазег Исаи и назовите их, например, Ьазег Ьазе и Ьа.зегДтеай. После добавления в разделе В18р1ау (Отображение) слева в окне ЙХПг ото- бразится список добавленных моделей. Нажав на значок плюса перед спис- ком модулей, можно открыть список свойств и настроить их в соответствии с вашими потребностями, как показано на рис. 3.33. Обычно нужно настро- ить свойство Торге (Тема), так как оно определяет источник данных, на кото- рые подписывается модуль. Только после успешной подписки данные будут визуализироваться в центральной области отображения. Если возникают проблемы с визуализацией, сначала проверьте поле $1аП18 (Состояние) в области свойств, как показано на рис. 3.34. Состояние может иметь четыре значения: ОК (Нет проблем), УУагшпд (Предупреждение), Еггог
(Ошибка) и ОгзаЫей (Отключено) Если состояние не ОК, проверьте сообще- ния об ошибках и убедитесь, что данные публикуются корректно. 5 О15р1ау5 ▼ Л С1оЬа1 ОрИопз Нхе<1 Егагпе Васкдгоипс! Со1ог Егате РаЬе ▼ О С1оЬа15Ьа1:и$:\л/агп @ Е1хед Егате ► Ф Сг1д ► Ьа5ег_Ьазе ► 'Ъ 1_а5ег_Ьеа<1 тар 48; 48; 48 30 МоЬГдаЬа. АсШа! еггог... Ьазег.Ьазе О15р1ау5 ЬЬе с!аСа Ггот а 5еп5ог_т5д$:;1а5ег8сап теззаде аз ро<п1з т 1Не у/огШ, дга«/п аз ротЬз, Ь|ИЬоаг<15, огсиЬез. Моге 1пГогтаЬоп. Адд ОирПсаЬе Ретоуе Репате Рис. 3.32 ♦♦♦ Список модулей отображения в ЕМ? ▼ Сатега ► & У15|Ы1Лу 1таде Торк ТгапзрогС Н1пЬ риеие 81хе ипгеИаЫе 1таде Репдеппд □ Ьаскдгоипд апд оуег!ау , 1таде Торк 5еп5ог_т5д5"1таде Еорк Ьо зиЬзспЬе Ьо. Айд ОирПсаЬе Ретоуе Репате Рис. 3.33 ♦♦♦ Свойства подключаемых модулей отображения в КУ12
Е 01. 1_азег 5сап (1_азег Б 51а1из: ОК Р01П13 Тор1С Тгапзгогт ЗНоитд [125053] ро1гЛз Л 1243 теззадез гесе^ес! ТгапзКэгт ОК В В Ыа1из: \Л/агптд Рош1з БНоитд [0] рот(5 Ггогп (г Ио теззадез гесег.ед Б 03. Ро1п1 С1оис1 (Ро1п1 В 51а1из: Е|гог Рот1з ТгапзЬгт В 04 Ьазег БсапЗ (Са5в1 ЗНоитд [И] рот(з [гот [О К1о теззадез гесегуед Пате [/ЬасНгате] <1оез Рис. 5.34 ❖ Состояние визуализаиии в КУ!г Мы ознакомились с процессом настройки визуализации данных в КУ12, теперь перейдем к рассмотрению примеров. 3.4.3. Пример 1: визуализация данных К В примере следования за черепахой из раздела 3.2 использовались динами- ческие преобразования нескольких систем координат. Основываясь только на данных, сложно понять происходящее, но визуализация изменений ко- ординат значительно облегчает восприятие. В этом разделе мы рассмотрим, как с помощью К\Чг динамически отображать изменения данных И. Откройте два терминала и выполните следующие команды для запуска примера следования за черепахой. $ гоз2 1аипсЬ 1гагп1пд_СГ Щгг1е_Щио«т.пд_се1г1о.'1аипс1т.ру $ гоз2 гип СигЫезгп СигНе_]:е1еор_кеу Запустите КУ12 и измените Нхей Ргате (Неподвижная система коорди- нат) в глобальных настройках слева на систему координат мюг1с! из примера с черепахой, как показано на рис. 3.35. Нажмите кнопку АсШ в левом нижнем углу и в появившемся окне списка найдите модуль отображения ТБ, затем нажмите кнопку ОК, как показано на рис. 3.36. Вернувшись в основной интерфейс КУгг, вы увидите три системы коорди- нат: адогМ, Шг11е1 и 1нН1е2, как показано на рис. 3.37
П1е РапеВ Не1р Рис. 3.35 ❖ Установка глобальной системе! координат в КУ12 Рис. 3.36 ❖ Добавление модуля отображения ТЕ в ЧУ:2 Если информация отображается недостаточно четко, можно продолжить настройку параметров модуля ТР слева. Управляя движением черепахи с по мощью клавиатуры, вы также сможете в реальном времени наблюдать из- менения положения систем координат (Д’, как показано на рис. 3.38.
Ке5еС ЬеП-сЬск: ВоСаСе МЩЩе-сИск- МоуеХ/У ЮдЫ: С1)ск/Мои:е ИЬеек гоош 5Ы№: Моте орЕюп; Рис. 3.37 ❖ Визуализация системы координат в главном окне ЗУ 12 Рис. 3.3 ❖ Настройка визуализации системы координат в РЛ/12
С визуализацией данных в й\/: 2 стало гораздо нагляднее, не правда ли? В приложениях для роботов со множеством систем координат можно легко и динамично отслеживать изменения различных положений. 3.4.4. Пример 2: визуализация данных изображений В главе 2 мы научились использовать узел драйвера камеры в ВОЗ для по- лучения сообщений с изображениями. Но каковы эти сообщения на самом деле? В этом разделе мы визуализируем изображения с помощью КУгг. Сначала подключите устройство камеры, затем откройте терминал и вы- полните следующую команду, чтобы запустить узел драйвера камеры. $ го5?. гип и5Ь_сап и5Ь_сап_пос1е_ехе Если вы используете виртуальную машину, сначала подключите камеру к виртуагь- ной машине: в меню выберите Виртуальная машина, за_ем Подключаемые устрой- ства, найдите свею камеру и нажмите Подключить. Далее запустите КУ12, как показано на рис. 3.39. Нажмите кнопку Ас1й в левом нижнем углу, в появившемся списке найдите модуль отображения 1та§е и нажмите ОК Рис. 3.39 ❖ Добавление модуля отображения 1таде в
В интерфейсе К\Чх появится окно визуализации изображения, но пока без данных. Не спешите, сначала нужно настроить тему изображения, на кото- рую будет подписываться модуль отображения 1та$е. В списке элементов отображения слева найдите выбранный модуль ото- бражения 1та°е и настройте подписку на тему 1та§е_гаад, как показано на рис. 3.40. Теперь появится текушее изображение. Рйе Рапек Не1р ГпТегасТ ’ФМотеСатега сЩЗеТесС фтоокСэтега <=Мев5Мге X 20Роте ЕйтаСе Х2РСоа1Роте 9 РмЫяЬ РотТ ф ’ • С1оЬа1 ОрЬолз Нхей Ггате Васкдгоцпс! Соки Нагле Ка1е ’ О С1оЬа15<аШ5:... тар 48; 48; 48 30 Адд Е1 владе Туре: ОгЬЛ (плгдеГаи ’ 2его ’ СиггепС ог№ (гук) ИеагсНр... 0.01 1пуег12 Ах(5 ТагдеЬ Кга... <Р'|хед Нгате> О|$Ьапсе 10 Госа15Ьар . О 05 Роса15Ьар... Узу/ 0.785398 РксЬ 0.785398 ► Роса! РО1П1 0; 0; О 5эу« 11 йетоуе | [ Репате Рис. 3.4С ❖ Визуализация изображения в IV'2 Различные данные датчиков и функциональные данные робота можно на- строить и визуализировать аналогичным образом, создавая на основе КУ1х собственное программное обеспечение для взаимодействия человека и ма- шины. ВУ12 поддерживает множество подключаемых модулей отображения по умолчанию, но иногда они не полностью удовлетворяют потребности. В таких случаях можно раз- рабатывать собственные модули на базе От для более персонализированного ис- пользования ВУ|2. 3.4.5. Взаимосвязь СагеЬо и КУ12 На этих двух примерах мы познакомились с процессом использования плат- формы визуализации КУтх. Сравнение функций визуализации СахеЬо и КУ1х представлено на рис. 3.41. Чтобы избежать путаницы, подчеркнем еще раз основные моменты:
О СагеЪо - это платформа симуляции, основная функция которой за- ключается в создании данных. Если нет робота или датчика, их можно виртуализировагь с помощью СахсЬо; О КУ1/ - это платформа визуализации, основная функция которой за- ключается в отображении данных. Для этого нужны данные, получен- ные из симуляции или реального объекта. Без данных это все равно, что «варить кашу без крупы». ОагеЬо Платформа симуляции: генерация данных № Платформа визуализации: отображение данных Рис 3.41 ❖ Сравнение функций визуализации багеро и К\/12 Таким образом, для симуляции робота мы используем СагеЬо, а КУ12 мы запускаем для отображения различных данных этой симуляционной среды. Если же разработка ведется с применением реального робота, СагсЬо может и не понадобиться, но КУ12 все равно будет использоваться для отображения модели, карты, сенсоров и другой информации о реальном роботе. 3.5. гозЬад: запись и воспроизведение данных Для удобства отладки и тестирования робота КОЗ предоставляет пакет гозЬа§ для записи и воспроизведения данных. Он помогает разработчикам запи сывэть данные сообщений, передаваемых во время работы КОЗ, и воспро- изводить их в офлайн-режиме. В этом разделе мы изучим метод реализа- ции записи и воспроизведения данных с использованием го.чЬа§ на примере с черепахой. 3.5.1. Запись данных Сначала запустите все узлы, необходимые для примера управления черепа- хой с клавиатуры.
$ гоз2 гип ГигсТезсп ГигГ1е5гп_пос1е $ гоз2 гип ГигЦезгп Гиг(:1е_1е1еир_кеу После успешного запуска можно управлять движением черепахи с кла- виатуры, а с помощью следующей команды можно просматривать текущие темы в КОЗ. $ ГО52 Горте ИзГ -V Мы увидим список похожих тем, как показано на рис. 3.42. РП го52@диуиеЬоте:~ О = - □ х гоз2@диуиеЬонегоз2 Торге 1151 -V РиЫЛхЬес! ТоргсБ: * /рагаие1:ег_еуеп1:8 [гсХ-гпТегГасеБ/тзд/РагатеТегЕуепТ] 3 риЫгзЬегз * /гобоуТ [гс1_гпТегГасеБ/т5д/1_од] 3 риЫгБЬегБ * /1иг11е1/стд_уе1 [деотеТгу_П5д5/р15д/Тиг5Т] 1 риЬНзЬег * /ТигТ1е1/со1ог_5еп5ог [ТогНеБгт/тБд/Со'ког] 1 риЫЛзНег * /1игНе1/ро5е [ТигПеБгт/иБд/РоБе] 1 риЫЛзЬег ЗиЬБсггЬес! Кортез: * /рагапеТег_еуепТ5 [гс1_гпТегГасе5/Р15д/Рагап1еГегЕуепТ] 3 зиЬзсгхЬегз * /1иг11е1/стд_уе1 [деоте1гу_т5д5/р15д/Тиг51] 1 зиЬзсгтЬег Рис. 3.42 ❖ Список тем в примере управления движением черепахи Затем используем гозЬа§' для захвата сообщений этих тем и упакуем их в файл, который будет помещен в указанную папку. $ тксНг ~/ЬадН1ез $ сб ~/ЬадН1еь $ гоз2 Ьад гесогй /сигНеТ/спЩуес гесогс! является подкомандой для записи данных. После ввода команды начнется запись сообщений темы, запись будет упакована и сохранена, как показано на рис. 3.43. В терминале также отображается название текущей записываемой темы. го52@диуиеЬо1’1е:~/ЬадГПе5$ ГО52 Ьад гесогс! /ТигТ1е1/стс!_ие1 [1ЫЕО] [1721663629.467249128] [го5Ьад2_гесогдег]: РгеББ 8РАСЕ Гог раиБТпд/геБипг пд [1А1ГО] [1721663629.495220987] [го5Ьад2_гесогдег]: ИзГепгпд Гог Горхсз... [11МРО] [1721663629.495319410] [го5Ьад2_гесогдег]: ЕуепТ риЫЛзЬег ТЬгеас!: ЗТагТг пд [1ИГ0] [1721663629.504293473] [го5Ьад2_гесогс!ег]: ЗиЬзсггЬес! Го Торге 1/ГгиГ±Ъе1/ спс!_уе11 [1МГ0] [1721663629.504557159] [го5Ьад2_гесогдег]: Ресогдгпд... [11ЧР0] [1721663629.505507241] [го5Ьад2_гесогдег]: АН гедиеБТед ТоргсБ аге бмЬбс ггЬед. 5Торр1па дгБСОУегу... Рис. 3.43 ❖ Исполозование команды гесогс! из пакета гсзЬад для записи сообщений темы
Управляйте движением черепахи в терминале, а затем нажмите комбина- цию клавиш С1г]+С в терминале записи данных, чтобы остановить запись. В созданной папке ~/Ьа^й1ез появится папка, начинающаяся с гоз2 и содер- жащая метку времени, в которой будут находиться записанные файлы дан- ных. Если вы хотите записать сообщения нескольких тем, используйте следую- щую команду, результат выполнения которой показан на рис. 3.44. $ ГО52 Ьад гесогс! -о заЬйеЬ /ЬигЫ.е1/сп(1_уе1 /сигг1е1/оо5е го52@диуиеНоте:~/ЬадГПе5$ гоб2 Ьад гесогс! -о 5иЬ5еГ /ГигГ1е1/спс1_уе1 /ГигГ1е1/р озе [1МЕО] [1721663652.098458500] [гозЬад2_гесогдег]: Ргезз 5РАСЕ Гог раиБГпд/геБцтГ пд [1МРО] [1721663652.449573672] [гозЬад2_гесогдег]: ЫзЬепгпд Гог ГорГсБ... [1ЫЕО] [1721663652.449887679] [го5Ьад2_гесогдег]: ЕуепГ риЫЛзЬег СЬгеас!: ЗГагГГ пд [1МЕО] [1721663652.480242306] [гозЬад2_гесог<1ег]: БиЬзсггЬес] Го Горхс 1 /ГигГ1е1/ розе1 [1ЫРО] [1721663652.486959440] [гозЬад2_гесогдег]: ЗиЬзсгГЬес! Го ГорГс '/ГигГ1е1/ сгк1_уе11 [1МРО] [1721663652.487842867] [гозЬад2_гесог<1ег]: РесогсНпд... [1МЕО] [1721663652.490111492] [гозЬад2_гесог<1ег]: АП гедиезГеб Горгсз аге зиЬзс гъЬед. БГоррГпд Лзсоуегу... Рис. 3.44 ❖ Использование команды гесогс! из пакета гозЬад для записи сообщений нескольких тем Параметр -о обозначает пользовательское имя файла данных, что позво- ляет избежать использования временной метки для именования сгенериро- ванных файлов данных. 3.5.2. Воспроизведение данных После завершения записи данных .можно использовать записанные файлы для воспроизведения данных. Пакет функций гозЪа^ предоставляет команду тГо, позволяющую просмотреть подробную информацию о файле данных. Формат использования команды следующий: $ гог2 Ьад 1пГо <усиг ЬадГПе? Используя команду 1пГо для просмотра только что записанного файла дан ных, вы можете просмотреть информацию о нем, как показано на рис. 3.45. Из приведенной информации видно, какие темы, типы сообщений и ко- личество сообщений содержатся в файле данных.
гоз2@диуиеЬопе:-/ЬадГг!ез$ гоз2 Ьад гпГо зиЬзеГ/ РИез: зиЬзе!_0 .тсар Вад згге: 102.3 КгВ 5!огаде гд: тсар РОЗ ОгзГго: дахху СигаПоп: 21.983з 5!аП: Зи! 22 2024 23:54:12.493 (1721663652.493) Епс1: Зи! 22 2024 23:54:34.476 (1721663674.476) Меззадез: 1375 Торге гпГогпаГгоп: Торге: /!иг!!е1/спк1_7е! | Туре: деопе!гу_п5дз/я5д/Тмгз! | Сои п!: 0 | 5егга!г2а!гол Еогта!: сс!г Торге: /1иг!1е1/розе | Туре: 1иг!!езгп1/я5д/Ро5е | Соип!: 1375 | 5егга!гга1гоп Рота!: сс!г Зегугсе: 0 5егугсе гпГотаЕгоп: Рис. 3.45 ❖ Использование команды (пГс из пакета гозЬад для просмотра сведений о файле данных Остановите ранее запущенный узел управления клавиатурой 1ип1е_1:е1еор_ кеу и перезапустите узел 1игНе<йт_пос1е, чтобы воспроизвести записанные данные тем, с помощью следующей команды: $ гоз2 Ьад р!ау <уэиг ЬадП1е> После небольшого ожидания данные начнут воспроизводиться, и траекто- рия движения черепахи должна полностью совпасть с записью. В терминале также выводится эта информация, как показано на рис. 3.46. го52@диуиеЬопе:~/ЬадГг!е5$ го$2 Ьад р!ау зиЬзе!/ [1МРО] [1721663740.409652449] [го5Ьад2_р!ауег]: 5еС га!е 1о 1 [1ЫЕ0] [1721663740.438565688] [гозЬад2_р!ауег]: Аддгпд кеуЬоагд саПЬаскБ. [1МЕ0] [1721663740.439346001] [Г05Ьад2_р!ауег]: Ргезз 5РАСЕ Гог Раизе/Резипе [тО] [1721663740.439559791] [гозЬад2_р!ауег]: Ргезз СиР50К_Р1СНТ Гог Р!ау №хГ Меззаде [1МЕ0] [1721663740.439599802] [гозЬад2_р!ауег]: Ргезз С11К50Р_11Р Гог Тпсгеазе КаГ е 10% [1МР0] [1721663740.439629855] [гозЬад2_р!ауег]: Ргезз СиР50Р_00Ш Гог Оесгеазе Р а!е 10% [1МЕ0] [1721663740.439888815] [гозЬад2_р!ауег]: РТауЬаск ип!г! 1гпез!атр: -1 Рис. 3.46 ❖ Использование команды р1ау из пакета гозЬад для воспроизведения файла данных 3.6. гдС: модульный набор инструментов для визуализации Функционал КУ12 в ^08 является достаточно мощным, однако в некоторых случаях может потребоваться использование более легких визуальных ин- струментов. Например, если нужно отобразить изображение только с одной камеры, использование К\’12 может быть несколько громоздким. В таких слу-
чаях можно воспользоваться другим модульным инструментом визуализа- ции гц1, предоставляемым КОЯ. 3.6.1. Введение в гд! Набор инструментов гцГ, как и КАНх, также разработан на базе визуальных функций библиотеки От. Перед использованием его необходимо установить с помощью приведенной ниже команды, после чего его можно запустить командой гцг. $ зсс1с арб тлзТаИ гоз-даггу-грб $ тцГ В гцГ можно загрузить множество небольших модулей, каждый из которых выполняет конкретную функцию, как показано на рис. 3.47. Рис. 3.47 ❖ Интерфейс инструмента визуализации тд( Нажав на кнопку Р1и^тз (Подключаемые модули) на панели инструмен- тов, можно выбрать необходимый модуль, как показано на рис. 3.48. Некоторые модули также можно запускать с помощью быстрых команд. Далее мы рассмотрим основные методы использования гцг на примере не- скольких часто используемых модулей. 3.6.2. Отображение журналов Модуль отображения журналов предназначен для визуализации и фильтра- ции журналов КОЯ, включая уровни тГо, шаги и еггог.
ОеГаик - гдС Н1е Рипп1пд РегзресЬуез Не1р фСоп ь СопЬатег @ Б АсМопб * # В СопНдигаЬоп ► Ц| 1п1го5ресЫоп ► Меззаде 1_одд1пд Ехс1и< I В М15се11апеои$ Тоо1$ Ё| 5еппсе5 В Тор1С5 В \Л$иа1|хаЫоп Еггог ЕаСа1 Рис. 3.48 ❖ Выбор модуля в г^Т Существует два способа запуска модуля отображения журналов. Первый - после запуска г ср найти элемент Сопзо1е в разделе Р1н§1П5 и открыть сто в ин терфейсе где. Второй - открыть его напрямую с помощью следующей команды: $ го$2 гип гдг_ссп5о!е грГ_соп5о1е Обе эти команды открывают модуль отображения журналов, интерфейс которого показан на рис. 3.49. Рис. 3.49 ❖ Интерфейс модуля отображения журналов в щг
Когда в системе появляются сообщения журнала различного уровня, ин- терфейс гц1_соп8о1е последовательно отображает соответствующую инфор- мацию, включая содержание журнала, временные метки, уровень и т. д. При большом количестве журналов можно использовать этот инструмент для фильтрации отображаемых данных. 3.6.3. Отображение изображений Модуль отображения изображений аналогичен такому же модулю в КУ12, который подписывается на тему 1ша§е и позволяет визуализировать сообще- ния изображений в текущей системе ВО8. Существует два способа запуска. Первый - после запуска гцГ найти элемент 1та§е Угеш в разделе Р1и§Ш8 и от- крыть его в интерфейсе гц1. Второй - открыть его напрямую с помощью следующей команды: $ гоб? гип гяС_1паде_7ге^ гчГ_гпаде_у1еи Оба способа открывают модуль отображения изображения. После успеш- ного запуска настройте подписку на тему изображения - появится визуали- зация, как показано на рис, 3.50. д1гмде Им /лплде_гм ’ 0 о ‘ 10.00т I /йп»9с_гм_тоц»е_1еП $тооУ1 кЛпд V - ОХ Рис. 3.50 ❖ Модуль отображения изображений в грТ
3.6,4, Публикация данных тем и служб Можно публиковать дынные темы или службы не только через командную строку, но и визуально с помощью инструмента гцГ. Например, через модуль публикации тем (Ме.чза^е РпЫщпег) или модуль вызова служб (8егу1се СаПег) в гр Г можно публиковать команды движения черепахи или создавать новую черепаху, как показано на рис. 3.51. Рис. 3.51 ❖ Модуль публикаыии тем или вызова служб в гр! 3.6.5. Построение графиков данных В щ! также имеется модуль для построения графиков данных, который по- зволяет отображать необходимые данные в виде кривых на координатной плоскости ху, что облегчает понимание изменений скорости, положения ро- бота и других параметров во времени. Откройте в гц! модуль Ма1Р1оС - появится двумерная координатная плос кость. Затем введите в верхнем поле интерфейса название темы для построе- ния графика. Если название темы неизвестно, можно просмотреть список тем с помощь команды го<?2 1ор!с Из! в терминале. Например, в примере с черепахой графическое отображение изменений координат х и у черепахи представлено на рис. 3.52.
Рис. 3.52 ❖ Модуль построения графика данных в трт 3.6.6. Управление пакетами данных Модуль управления пакетами данных позволяет визуально воспроизводить пакеты данных гозЬа^, подобно плееру, с возможностью быстрого переме щения по шкале времени к нужной позиции воспроизведения. Открыв в гцГ модуль Ва^, можно воспроизвести записанный в разделе 3.5 пакет данных о движении черепахи, как показано на рис. 3.53. 3.67. Визуализация узлов Сложные роботизированные системы КОЗ могут состоять из множества уз- лов, Можно использовать модуль визуализации узлов в гц1 для быстрого понимания взаимосвязей узлов в системе. Он позволяет графически и дина- мически отображать диаграмму взаимосвязей узлов в текущей системе КОЗ.
Рис. 3.53 ❖ Модуль управления пакетами в гцТ Откройте в гц1 модуль Мойе ОгарЬ, после запуска он автоматически распо- знает все работающие в текущей системе КОБ узлы. Для примера с черепахой визуализация узлов представлена на рис. 3.54. ^Сио* Старк О ©О - ох © Иод«/Гойа(*сйу«) • / / & ® 9 Сгомр: 2 С Нали$расе$ АсЪога У 1т»де$ н1дКидЬс V ЯС ИИе: / ОайяпЬ иаНоркз V ОеЬид I/ V илгекпгЫе V Рагапп
3.7. Настройка среды разработки РО$ 2 Разработка роботов КОБ невозможна без написания кода. В книге представ- лено множество примеров исходного кода. Как просматривать, писать и ком- пилировать этот код? Необходимо выполнить некоторые подготовительные действия для повышения эффективности разработки. Б этом разделе мы рекомендуем два важных инструмента разработки: СК и УБСойе. 3.7.1. Система управления версиями СИ Сй - это программное обеспечение для управления версиями, созданное для операционной системы Ыпих. Ыпих развивается стремительно, и тысячи людей вносят свой вклад в ее развитие, добавляя код, который исправляет ошибки, поддерживает новые аппаратные драйверы или добавляет новые функции в систему. Ручная про- верка и объединение миллионов строк кода невозможны, поэтому требуется программное обеспечение, которое эффективно управляет всем кодом, по- зволяет разработчикам видеть изменения при каждом коммите, автома- тически определяет возможные конфликты с существующим кодом и даже переключается между различными версиями. Отец-основатель Ыпих, Линус Торвальдс, разработал инструмент управления версиями СИ, который полу- чил широкое применение в области разработки программного обеспечения. Известные сайты для размещения открытых проектов, такие как СйНнЬ и ки- тайский Сйее, используют СИ для управления кодом множества открытых проектов. Установка Сй в Ыпих очень проста: достаточно в терминале выполнить следующую команду. $ зобо арб бпвбаП дй Ниже приведены часто используемые команды уй. # Загрузка проекта и всей его истории кода $ дй сТспе [иг1] # Добавление указанной файлов в зону подготовленных файлов. $ дй абб [Я1е1] [Гйе2] ... # Добавление указанного каталога в зону подготовленных файлов, включая подкаталоги. $ дй абб [бй] # Добавление всех файлов из текущего каталога в зону подготовленных файлов. $ дй абб . # Удаление файлов из рабочей области и помещение информации об удалении в зону подго-овленных # файлов. $ дй гп [бйе1] [Ше2] ... 9 Отправка зоны подготовленных файлов в репозиторий.
$ дИ сопптТ -п [пеззаде] # Вывод всех локальных веток. $ ди ЬгапсН # Вывод всех удаленных веток. $ ди ЬгапсН -г # Вывод всех локальных и удаленных веток. $ ди ЬгапсН -а # Создание новой ветки, но с сохранением текущей ветки активной. $ ди ЬгапсН [ЬгапсЬ-папе] # Создание новой ветки и переключение на нее. $ дИ сНескоиС -Ь [ЬгапсН] # Отображение файлов с изменениями. $ ди збаТиз # Отображение истории версий текущей ветки. $ ди Сод # Загрузка всех изменений из удаленного репозитория. $ ди ГеСсЬ [гелоТзе] в Вывод всех удаленных репозиториев. $ ди гелюбе -V # Вывод информации о конкретном удаленном репозитории. $ ди гелюбе зЬои [гепобе] # Получение изменении из удаленного репозитория и их слияние с локальной веткой. $ ди ри11 [гепоге] [ЬгапсН] # Отправка указанной локальной ветки в удаленный репозиторий. $ ди ризН [гелюбе] [ЬгапсН] # Сброс указанных файлов в зоне подготовленных файлов до состояния последнего сотщи, рабочая # область не изменяется. $ ди гезеб [ГИе] # Сброс зоны подготовленных файлов и рабочей области до состояния последнего солтбб. $ ди гезеб --ка'б # Сброс указателя текущей ветки на заданный сотбб с одновременным сбросом зоны подготовленных # файлов, рабочая область не изменяется. $ ди гезеб [соптгГ] # Сброс НЕАЬ текущей ветки на заданный сэлтбб с одновременным сбросом зоны подготовленных файлов # и рабочей области, состояние соответствует заданному сошли. $ ди гезеб --ба'б [сошли] # Настройка информации о пользователе для солили кода. $ ди сопНд [--д1эЬа1] изег.папе "[папе]" $ ди сопНд [--д!оЬа1] изег.епаи ' [епат.1 айФлезз]" Система управления версиями СН является чрезвычайно распространенным инстру- ментом в разработке программного обеспечения. Она обладает мощными возмож- ностями и множеством команд.Здесь приведены лишь основные сведения.Д1ля более подробной информации и методов использования клиентских инструментов СИ об- ратитесь к материалам в сети.
3.7.2. Интегрированная среда разработки УБСобе У18иа1 ЕШсПо Сойе (сокращенно УЕСобе) - это легковесная, но мощная ин- тегрированная среда разработки (ЮЕ), выпущенная компанией МгсгозоП в 2015 году. Она поддерживает операционные системы АУтбошз, Ыпих и ша- сО8 и обладает богатым набором расширений, которые помогают быстро создавать проекты. УБСобе стал важным инструментом в арсенале разра ботчиков. Вы можете скачать и установить новую версию программы с официаль- ного сайта УБСобс. После установки и открытия программы в левой панели инструментов нажмите Ех1еп81оп8 (Расширения), чтобы войти в окно уста- новки расширений. В строке поиска введите название нужного расширения, найдите его и нажмите кнопку 1п81а11 (Установить). В репозитории У8Собе имеется множество расширений, связанных с КОЕ, которые помогают повысить эффективность разработки кода (см. рис. 3.55). 6? Ыеляоп. ЙО5 X О Е5Р-ЮЕ ЗеагсЬ Еггог НшГ Щ КОЗ У0.9.2 М1СГО5ОЙ в пцсгозойсот Ф 927,763 Оеуе1ор КоЬог Орегайлд 5у5(ет (КОЗ) ... О - х КОЗ =5 V КОЗ Ф 927К ★ 4 • • • Оеуе1ор КоЬоГ ОрегаГтд ЗуЯет (КОЗ) ииГЬ У,5иа1 ЗГидю Соде фМкго$оЙ [ГВДИЧ коз Ф35К ЗоЙу/аге Оеуе1ортепГ Тоо1$е1 агоипд КОЗ (КоЬоГ ОрегаГтд 5у.. 0ЕТА115 ЕЕАШКЕ5 СНАИ6Е1.О6 ЦЕРЕМОЕГ4С1Е5 1аеНуип5Н|т КОЗ ЗтрреГк Ф 46К ★ 5 \/15иаI 51ис1|о Соде ЕхГепБЮП То! КОЗ Сагедопез 0еЬоддег5 КОЗ (КоЬоГ ОрегаГтд ЗузГет) 5пгрреГ5 Гог гонру, го5срр, 1аипс Ьеул УУи1Ъра1 ни ТЬе \й5иа1 3(идю Собе ЕхГегкюп Тог КО5[Л 1 ] ргоУ1де5 зиррой 1ог КоЬоГ Орегайпд Бухает (КОЗ) деуе1ортеп1 Еог КО31 апс! КО32 оп У\йпс1о1№ апс! Стих ЕеаТигез Ке$оигсе$ Магке1р1асе 155ие5 Керозйогу 1йсеп5е М1сго5оЛ КОЗ зтрре15 КОЗ (КоЬог орегабпд $уз1ет) зтрреи руаг КОЗ Раскаде УапаЫе КОЗ раскаде уапаЬ!е$ (ог 1аипсН]$оп апд 1а5к5]5оп гопеогг ФЗЗК (ЕЭ1 АгЛотаЪс КОЗ етлгоптепГ сопбдигаЪоп. А11оук 51агхтд, Яорртд апб 71в’Л1пд 1Ье КОЗ соге 51а1и5. АШотаВсаПу сгеаГе саГгкап таке = РО5 ГО5 5П,рреГ5 КОЗ 1 5П,рре1з аЬоЩ гогерр, го$1аипсН апд стаке ед» Моге 1пк> РиЫкИед 2019-06-29, 050922 1л<>1 2023-11-14 ге1еа5е<1 035634 КОЗ 2 Атеп1 Тахк Ргочлдег А11,500 ТЪаскзГоп 11ЯИ11 Ф 14К Ргоук1е51а5к5 апд ргоЫет та1сбег5 (ог ЯО82 ргО)есК изтд а . КОЗ Не1рег ИГИЛ Рис. 3.55 ❖ В У5Сос1е есть много модулей для ВС5 Для облегчения последующей разработки и отладки в КОЕ 2 мы рекомен- дуем установить некоторые модули, которые приведены в табл. 3.2. Вы мо- жете установить и использовать их в зависимости от ваших потребностей, неограниченно расширяя функциональность УЕСойе.
Таблииа 3.2. Рекомендуемые расширения для разработки РОЗ в УЗСоде Название расширения Назначение Р.иззтап Ьап§иа^е Раск Гог УГзиа! ЗГщПо Собе Языковой пакет для русского языка РуТбоп Расширение для языка РуШоп С/С++ Расширение для языка С++ СМаке Расширение для СМаке узеобе 1соп8 Альтернативные значки для улучшения внешнего вида значков дерева файлов слева ПОЗ Расширение КО8, автоматически настраивает соответствующее окружение и поддерживает подсветку синтаксиса Мз§ Ьапдща^е ЗиррогС Подсветка синтаксиса файлов определения интерфейса КОЗ, поддерживает гп5&, бгу и асНоп УГзиа! ЗШб:о ГпГеШСобе Автодополнение кода ЦКВР Поддержка синтаксиса ЦКВР Магкбошп А111п Опе Поддержка синтаксиса Магкбошп КетоСе - 88Н Удаленное подключение по 88Н После настройки расширений в УЗСобе вы можете открыть исходный код, предоставленный в этой книге, как показано на рис. 3.56. Подобно другим интегрированным средам разработки, вы можете открыть любой файл кода и внести изменения, а также открыть терминал для ввода команд или под- ключиться к удаленным устройствам для разработки. РИе ЕсМ $е1ес1юп У1е« Со Кип Р гоз2_21_1и1опа1з С В □ 03 ЕХПОЙЕК V ОРЕМ ЕО1ТОК5 X Ф ытр1е1оипс 1 V КО52 21 Т1ГТОК1АЕ5 > 1еагп1пддп1ег(асе 1еагп1пд_1аипсН • > сопбд V 1аипсЬ • ♦ патезрасез 1аипс ♦ рагате1ег$_попат ♦ рагате(ег$_уап'|11а Ф рагате№г$ 1аипсГ| Ф гетарртд 1аипсЬ ру ♦ п/121аипсН ру ♦ 31тр1е 1аипсЬ 1 > 1еагп1пд_1аипсН > гезоигсе я» раскаде хт1 О зе1ир с(д ♦ зешрру > 1еагп1пд_пос1е > 1еат1пд_побе_срр > О1пиЫЕ > Т1МЕС1ГЧЕ > КЕИ 1М510Ы РКОЕЕСТ > РЙО1ЕСТ СОМРО№ГГ5 • ятр1е (аипсЬ ру 1 X 1еаттд_1аипсЬ > 1аипсН > Ф ытр1е 1аипсК ру > Ф депега1е_1аипсН_безс(|р1|оп Егот ТаипсН хтрогЬ СаипсНОезспрСюп Лее 8впега1е_1аипсЬ_с1е$сг1р11оп(): # ЙцЙ^Й21аилсЬЙ<409Й8Й ге!игп 1аипсЬ0е5сг1р(юп( [ # Ио<1е( # —145ЙЙЗЙЧЙ раска§е='1еагп1п§_Сор1с ’, # ехесиСаЫе=’1:ор1с_Ье11оиог1<1_риЬ', # №йе( # ЕЙВ—445^Й)§9) I раскате»'1еагп1П8_Лор1С’1 # 15^ЙгЙЙ9ЙЯи® | ехеси1:аЫе='±ор1с_Ье11оиог1с1_5иЬ’, # т5^ЕЙчЙЙйгЙ1Ф45 Рис. 3.56 ❖ Интерфейс работы с кодом вУЗСэбе [> '- <а Ц[ Е$Р ©е ЗеагсЬ Еггог Н1П1 ш УЬСобе поддерживает множество подключаемых модулей и обладает очень мощны- ми возможностями Выше приведены лишь личные рекомендации, вы также можете искать в интернете и настраивать наиболее подходящую для себя среду разработки. # 1аипсКЙ4в9Йк^
3.8. Резюме В этой главе мы рассмотрели основные инструменты для работы в КОЗ 2. Теперь вы знаете ответы на следующие вопросы 1. Какой метод следует использовать для одновременного запуска и на- стройки нескольких узлов КОЗ? 2. Как И в КОЗ 2 управляет сложными системами координат и как исполь- зовать Идля трансляции и прослушивания преобразований координат в системе? 3. Что такое КУ12, какие функции он может выполнять и какие визуальные инструменты предоставляет набор инструментов гцг? 4. Можно ли изучать разработку в КОЗ с помощью симуляции при отсут- ствии реального робота? Какие инструменты для этого необходимы? 5. При разработке роботов часто требуются повторяющиеся циклы от- ладки, как в КОЗ можно записывать различные пакеты данных для последующего анализа? На этом знакомство с основами разработки в КОЗ 2 завершено. Далее мы перейдем к проектированию и разработке роботов и с помощью КОЗ 2 соз- дадим полноценную робототехническую систему.
ЧАСТЬ II Проектирование роботов в КОБ 2
Глава КОБ 2: моделирование роботов без затрат Изучив основные принципы КО8 2, вы готовы приступить к работе с робо- тами. Однако когда речь заходит о роботах, неизбежно возникает вопрос о сложном оборудовании. Что делать, если у вас нет собственного робота? Управление роботами не обязательно требует больших затрат - с помощью систем моделирования (симуляции) можно обучаться и разрабатывать робо- тов. В этой главе мы покажем, как создать симуляционную модель робота без затрат и заставить его «ходить» и «видеть» в симуляционной среде. 4.1. Понятие робота и его составные части Даже для создания симуляционной модели робота необходимо понимать основные концепции и знать составные части робота. Без этого невозможно создать модель и выбрать подходящие сенсоры и механизмы. Понятие «робот» появилось в 1920 году в научно-фантастическом романе «Россумские универсальные роботы, где слово «робот» означало «тяжелый труд». То есть изначально люди представляли роботов как помощников, ос- вобождающих от физического груда и повышающих производительность. Сегодня понятие робота расширилось, и существует множество определений, однако стандартного общепринятого определения нет. Например, в китайской онлайн-энциклопедии Вагйи Вайсе можно найти такое определение: робот (гоЬо!) - это интеллектуальная машина, способная выполнять задачи, такие как работа или перемещение, полуавтономно или полностью автономно, с помощью программирования и автоматического управления. Американская ассоциация робототехники определяет робота как много- функциональную машину, предназначенную для перемещения различных
материалов, деталей, инструментов или специальных устройств, выполня- ющую различные задачи с помощью программируемых действий. Существует множество различных определений, имеющих как сходства, так и различия. Основная идея заключается в том, чтобы рассматривать робота как инструмент и описывать его через цель использования. Незави- симо от определения, структура робота остается относительно неизменной. Например, с точки зрения управления робот состоит из четырех частей: ис- полнительные механизмы, приводная система, сенсорная система и система управления, как показано на рис. 4.1. Робот Автономная навигация Система управления Управление движением Человеко- машинное взаимодействие Мониторинг системы Обработка изображений Машинное обучение Система моделирования Визуализация данных Электро- Серво- привод привод Электро- Серво- Транс- Вакуумный двигатель механизм миссия захват Соединитель- ный узел Пневмо- Сенсорный Периферий- привод привод ный привод Рис.4.1 ❖ Четыре основных компонента робота (сточки зрения управления) 1. Исполнительные механизмы Исполнительные механизмы являются важными устройствами для движения робота. Например, для мобильного робота необходима возможность «пере- движения», и мотор или сервопривод выполняет эту функцию, Однако не все конечные точки движения требуют отдельного мотора. Например, в автомо- биле обычно имеется только один двигатель, и для того чтобы четыре колеса вращались с разной скоростью, требуется система распределения мощности, известная как дифференциал. Помимо мобильных роботов, в некоторых про- мышленных или коллаборативных роботах двигатели суставов робота или захваты для объектов также можно считать исполнительными механизмами. 2. Приводная система Для того чтобы исполнительные механизмы точно выполняли свои действия, необходимо подключить к ним систему привода. Например, если требуется, чтобы двигатель робота вращался со скоростью 1 м/с, то как .можно дина
мически регулировать напряжение и ток для достижения точной скорости вращения? Эту функцию выполняет привод. Система привода определяется типом исполнительного механизма. На- пример, для привода двигателя постоянного тока может использоваться встроенная плата управления двигателем. Для промышленных сервомото- ров обычно применяются специализированные сервоприводы. Кроме того, система привода включает в себя пневматические устройства для пневмо- приводов, драйверы для периферийных устройств, таких как клавиатура и мышь, а также драйверы для различных датчиков, что обеспечивает нор мальную работу всех устройств робота. 3. Система сенсоров Способность робота к восприятию в основном осуществляется за счет си- стемы сенсоров, которая делится на внутренние и внешние сенсоры. Внут- ренние сенсоры используются для восприятия состояния самого робота, на- пример для определения его положения с помощью одометра, для получения информации об ускорении в различных направлениях с помощью акселе- рометра, а также для измерения взаимодействующих сил с внешней средой с помощью датчиков силы. В отличие от внутренних сенсоров, внешние сенсоры помогают роботу воспринимать внешнюю информацию. Например, с помощью камеры можно получать цветные изображения окружающей среды, а с помощью лазерного дальномера, сонара и ультразвуковых датчиков - определять расстояние до препятствий в заданном угловом диапазоне. 4. Система управления Система управления является мозгом робота и обычно состоит из аппарат- ного и программного обеспечения. Аппаратная часть чаще всего представ- лена процессорами с разнообразными вычислительными ресурсами, такими как ноутбуки, ЮЭ К или КазрЬеггу Р1, на которых запускаются различные при- ложения для выполнения различных функций. Например, для построения карты неизвестной среды, перемещения к месту доставки или распознава ния определенного объекта. Основные алгоритмы интеллектуального робота почти всегда реализуются в системе управления, что и составляет основную часть разработки программного обеспечения для роботов. Четыре основных компонента робота взаимозависимы и взаимосвязаны, образуя полный цикл управления роботом, как показано на рис. 4.2. Можно провести аналогию с частями тела человека. О Исполнительные механизмы аналогичны рукам и ногам робота, вы- полняющим конкретные действия и взаимодействующим с внешней средой. □ Система привода аналогична мышцам и костям робота, обеспечива- ющим непрерывную подачу энергии.
Внешние сенсоры (детекция окружения; Управление Привод Исполнение Рабочий объект Внутренние сенсоры (детекция положения) Рис. 4 2 ❖ Взаимосвязь четырех основных компонентов робота □ Система сенсоров аналогична органам чувств и нервам робота, осу- ществляющим сбор информации как изнутри, так и извне и передаю- щим ее в мозг для обработки. О Система управления аналогична мозгу робота, осуществляющему обработку различных задач и информации и выдающему команды управления. С развитием программного и аппаратного обеспечения роботов эти четы- ре основных компонента также постоянно эволюционируют и оптимизиру- ются, способствуя интеллектуализации роботов. Далее мы продолжим изучение методов моделирования роботов в КОЗ 2, создав виртуального робота с четырьмя основными компонентами, чтобы глубже понять принципы его устройства. 4,2. Моделирование робота с использованием 11КОГ КО8 является операционной системой для роботов и предназначена для их использования. Однако, прежде чем начать работу, необходимо «предста- вить» робота КОЗ. Как это сделать? КОЗ предлагает специальный .метод моделирования роботов - унифици- рованный формат описания роботов (ЛпИ1ес1 КоЬо1 ИезспрПоп Рогта1, ПКЙР), который используется для описания внешнего вида, характеристик и дру- гих свойств робота. ПКОР позволяет не только четко описать .модель самого робота, но и его внешнюю среду, где стол также может рассматриваться как часть модели, см. рис. 4.3. Файлы моделей ИКПР используют формат ХМЬ. Пример модели робота в СКОР напоминает исходный код для веб-разработки, состоящий из тегов, окруженных угловыми скобками, и их атрибутов.
Нпк (Связь) Рис. 4.3 ❖ Моделирование робота с помсщоЮ ЬКОГ в КС5 <?хп! 7ег5жеп="1.0" ?> «гоЬоС пагче="г|ЬоР"> <!-- Связь основания. --> <Кпк пэс1е= 'Ьа5е_1тпк''> <7Т5иа1> <!-- Совпадение начала координат основания с глобальной системой координат, без смещения и вращения. --> <ог1д!п хуг=" 0 0 0" гру="0 0 01 /> «деопебгу^ <!-- Внешняя форма - цилиндр, высота 0.16 м, радиус 0.20 м. --> <СуЦпс1ег 1епдбЬ="0.16" гас1ги5 =1 0.?0"/> </деотеСгу> <таРегга! папе="уе11.ои"> <!-- Значения КСВА внешнего цвета: желтый, непрозрачный. --> <со1ог гдЬа="1 0.4 0 1"/> </р|абегга1> </у15иа1> </1Лпк> <!-- Сустав левого колеса. --> <]отп1 папе="^е^:(:_и^Iее^_^о^п1:,' Гуре='1соп1:1лио|з5''> <!-- Смещение начала кооодинат относительно родительской связи по осям ху? на (0, 0.19, -0.05) м, без вращения. --> <огт.д1п хуг-"0 0.19 -0.05" гру="0 Э 0"/> < !-- Родительская связь ЬезеКпк. --> <рагепб Ипк=''Ьа5е_ипк"/> < !-- Дочерняя связь 1е^_иЬее1._1лпк. --> < с(п1с1 II пк=" ТеССикееТНг к"/> < !-- Вращение двух связей вокруг оси у сустава. --> <ах15 хуг='0 1 0"/> </]От.п1:> <!-- Связь левого колеса. --> <1Лпк пате="1.е(:1:_шЬее1_ипк"> кутвиаЪ
<!-- Отсутствие смещения связи относительно сустава по осям хуг, вращение (1.5/07, 0, 0) радиан. --> <огтдтп ху2="0 0 0" гру="1.5/07 0 0" /> <уеопе11у> <!-- Внешняя форма - цилиндр, радиус 0.06 ,м, длина 0.025 м. --> <су!тпс1ег гасИиь= "0.06" 1епдР1=110.025 /> </деоне!гу> <|ча1егта1 папе="|41тЛе"> <!-- Значения КСВА знешнего цвета: белый, прозрачность 0.9. --> <со!ог гдЬа="1 1 1 0.у"/> </пабегга1> </у1ьиа1> </Нпк> </гоЬог> Как же использовать такой файл для описания робота? Возьмем, к приме- ру, человеческую руку, состоящую из плеча и предплечья, которые не могут двигаться самостоятельно. Они должны быть соединены локтевым суставом, чтобы двигаться относительно друг друга под воздействием мышц. В моде- лировании роботов плечо и предплечье аналогичны независимым жестким телам, называемым связями (!шк), а локоть аналогичен части, приводимой в движение мотором, называемой суставом 0отГ)- Таким образом, ключевая задача в процессе моделирования ИКБР за- ключается в описании каждой связи и сустава с помощью тегов <1тк> и <)О1пг>. 4.2.1. Описание связей Тег <1тк> описывает внешний вид. и физические свойства определенной жесткой части робота, включая размер (згхе), цвет (со1ог), форму (зЬаре), инерционную матрицу (тегНа! та1пх), параметры столкновения (соШзюп ргорегНез) и т. д. Структура связей робота обычно имеет вид, изображенный на рис. 4.4, а ее базовый синтаксис описания в 1Л1ПР выглядит следующим образом: <1гпк пар|е="<1тпк папе>"> <1пегНа1> . . . </1пегбга1> <У15иа1> . . . </уг5иа1> «сэШзгспь . . . </сс11Л5гоп> </Цпк> Тег <У15па1> описывает параметры внешнего вида части Ипк, тег <1пег1ла1> описывает инерционные параметры 1шк, а тег <со1118юп> описывает свойства столкновения 1шк.
Рис. 4.4 ❖ Связь в йкРЕ-модеги робота На примере этой связи механической руки ее описание 1шк выглядит сле- дующим образом: <1дпк гапе="Ппк_агп"> <!-- Часть для визуализации. --> <У15иа1> <!-- Для визуализации используется 511-файл. --» <део1леГгу> спевН Шепаге="Ипк_агп.гг1"/> </део1леРгу> <!-- Начало координат в точке (Э, Э, 0), без вращения. --> <ог1дт_п хуг="0 0 0'' гру= 0 0 0" /> </ут5иа1> <!-- Часть для обнаружения столкновений. --> <СО1,Н5ЯОП> <!-- Для обнаружения столкновений используется цилиндр. --> -д°отеТ-у> <су11пСег 1епдЩ="0.5" гаЩц5="0.1*/> </део1леГгу> <!-- Начало координат в точке (0, 0, -0.05), без вращения. --> «эгСдСп хуг="0 0 -0.05" гру="0 0 0"/> «/соШИопь </1Лпк> Атрибут пате в теге <Ипк> обозначает название данного звена, которое можно задать самостоятельно. Это название будет использоваться при со- единении звеньев через )О1п1. Секция <у1зпа1> в <Ппк> описывает внешний вид робота, ниже приведено описание двух параметров: □ <$еоте1гу> обозначает геометрическую форму, с помощью <тезй> вызывается заранее спроектированная в трехмерном программном
обеспечении модель синего цвета - Ппкагт.811, благодаря чему симу- ляционная модель выглядит так же, как и реальный робот; О <оп^1п> обозначает смещение системы координат относительно на- чального положения, включая перемещения по направлениям х, у, 2 и вращения то11, рДсй, уаад. Если смещение не требуется, все значения равны 0. Вторая часть кода, <со11181оп>, описывает параметры столкновения. Со- держимое этой части похоже на <у1§ца1>, так как также включает <§еотеСгу> и <оп§1П>. Однако между ними есть значительные различия. Секция <У18на1> предназначена для описания визуального состояния ро- бота. Секция <со11181оп> описывает состояние робота в процессе движения. На пример, как робот взаимодействует с внешней средой, что считается столк- новением. ЛЬ В этой модели робота видимые части описываются с помощью <у|5иа1>. В процессе управления такая сложная внешность требуе’ значительных вычислительных ресур- сов для обнаружения столкновений. Чтобы упростить вычисления, модели для обна- ружения столкновений упрощается до цилиндра, очерченного вокруг объекта, как описано в параметре <деотеГгу> секции <соЦ|51оп>. Смещение системы координат <опд1п> задается аналогично и может описывать смещение центра масс твердого тела. Для мобильных роботов <Ппк^ также может использоваться для описания частей робота, таких как шасси и колеса, как показано на рис. 4.5.
4.2.2. Описание суставов Твердые тела в модели робота должны быть соединены суставами, чтобы воз- никло относительное движение. Тег <}отГ> используется для описания кине- матических и динамических свойств суставов робота, включая ограничения по положению и скорости движения суставов. В зависимости от формы дви- жения суставов их .можно разделить на шесть типов, как показано в табл. 4.1. Таблица 4.1. Формы суставов робота Тип сустава Описание Пример сопппиоиз Вращающийся сустав, может бесконечно вращаться вокруг одной оси Автомобильные колеса ге\-о1и1:с Поворотный сустав, аналогичен сопНпиоиз, но имеет ограничение по углу поворота Сочленения роботизированных рук рпьшаНс Призматический сустав, перемещается вдоль одной оси с ограничением по положению Линейный двигатель р1апаг Плоскостной сустав, допускает перемещение или вращение в ортогональных направлениях плоскости — 11оайп§ Свободный (плавающий) сустав, позволяет выполнять поступательные и вращательные движения - Йхес! Жесткий (неподвижный) сустав, особый тип сустава, не допускающий движения Камера, закрепленная на шасси робота Как и суставы человека, суставы робота служат для соединения двух твер- дых тел, называемых родительским звеном (рагеп! йпк) и дочерним звеном (сЫШ Нпк), как показано на рис. 4.6, где 1тк_1 является родительским зве- ном, Ипк_2 - дочерним звеном и оба звена соединены суставом }ош1_2, что позволяет им двигаться друг относительно друга. Рис.4.6 ❖ Суетаз в ИКОЕ-модели робота В ИКЦР-модели вышеуказанные суставы описываются с помощью следу- ющего ХМЬ-кода, включая имя сустава, тип движения и т. д.
<]од.пР папе="]огпб_2' сурр="ге7о1игеМ < !-- Родительская связь Нпк_1. --> «рагепб 1гпк="1Лпк_1'/> < !-- Дочерняя связь - Ипк_2. --> <с1Л1(] Цпк= '1лпк_2"/> < !-- Начало координат сустава в точке (0.2, 0.2, 0), без вращения. --> «оггдсп хуг="0.2 0.2 0" гру="0 0 0"/> < !-- Вращение сустава вокруг осп г. --> <ахбз хул-"0 0 1"/> <!-- Ограничение угла сустава: нижний предел -п, верхний предел п, угловая скорость 1.0. --> «ПнП 1оиег=''-3,14" иррег 3.14" уе!ос1гу= 1.0"/> </зот.п±-> <рагеп1> описывает родительское звено. <сЫ1с1> описывает дочернее звено, которое движется относительно роди- тельского звена. <оп§ш> обозначает взаимное расположение систем координат двух зве- ньев, то есть вектор на рис. 4.6, который можно понимать как способ сочле- нения двух звеньев. <ах18> обозначает единичный вектор оси движения сустава, например если 2 равно 1, это означает, что вращательное движение происходит вокруг по ложительного направления оси г. <1пиИ> обозначает ограничения движения, включая верхние и нижние пределы движения сустава, ограничения скорости и момента. ®В КОЗ едмниией измерения перемещения по умолчанию является мегр, а единицей измерения вращения - радиан (не градус). Таким образом, значение 3.14 соответ- ствует движению в диапазоне от-180° до 180°, линейная скорость измеряете в м/с, а угловая скорость - в рад/с. 4.23. Полная модель робота Все теги <1тк> и <1от1> выполняют описание и объединение частей робота, размещаясь в теге <гоЬо1>, формируя полную модель робота, как показано на рис. 4.7. Структура описания полного ЦКПР-файла модели выглядит следующим образом: сгобог папе-"<имя робота>"> < 1Лпк> ... </1тпк> < 1Лпк> ... </1лпк> < до1п!:> ... </]эгпб> < )о1пб> ... </]огпб> </гоЬоб> При изучении конкретной ПкВР модели не стоит торопиться с погруже- нием в детали кода. Сначала найдите <Ппк> и <)о1п1>, чтобы понять, из каких частей состоит робот, а затем, разобравшись в общей архитектуре, псрехо дите к коду.
Рис. 4.7 ❖ Полная ЬКОЕ модель робота 4.3. Создание ЬКОЕ-модели робота Для углубления понимания 1ЛЮР в этом разделе мы с нуля создадим прос- тую модель дифференциального шасси двухколесного робота, как показано на рис. 4.8. 4,3.1. Пакет функций модели робота Полная модель робота размещена в пакете функций кагптдигсД, структура пакета представлена на рис. 4,9. □ 1аипск: содержит файлы запуска. О теякеь: содержит файлы отрисовки .моделей, на которые ссылается ПКЦР. □ ГУ12; хранит конфигурационные файлы НУт/. О игсИ: содержит файлы 1ЛП)Р или хасго модели робота.
Рмс.4.8 ❖ 11КОЕ-модель дифференциального шасси двухколесного робота 4.3.2, Визуализация модели робота Сначала рассмотрим общий вид этой модели и проанализируем се элементы Ппк и )от1. Откройте терминал и введите следующую команду: $ гоз2 ТаипсК 1еагп<пд_игсУ ЩзрТауЛаипсЬ.ру Вскоре в открывшемся окне ЙУш появится модель робота, как показано на рис. 4.10. Для обзора используйте левую, среднюю и правую кнопки мыши.
Согласно визуализации, модель шасси робота включает 5 элементов Ппк и 4 элемента )’ош1. Элементы Ппк включают шасси робота, два ведущих колеса слева и справа, а также два универсальных колеса спереди и сзади. Элементы )от1 отвечают за установку ведущих и универсальных колес на шасси и на стройку соответствующего способа соединения. Правильно ли мы поняли эту информацию? Это можно проверить с по- мощью инструмента игсИГоугарйхчг, применив его к файлу модели. Команда запуска следующая, $ игбГ_то_дгарНут/ пЬо^Ьаье.игаб # Запустите в каталоге с моделью После успешного выполнения будет создан РПГ-файл, содержащий резуль- таты анализа -модели, как показано на рис. 4.11. Рис. 4.11 ❖ Анализ структуры СКОЕ-модели с помощью инструмента игаб_Го_дгарКу|2 © При работе со сложными моделями роботов инструмент игс1г_Го_дгар1ту|2 помогает быстро упорядочись основную структуру модели ясно показывая все связи между Мп к и ]01Щ. Вышеприведенное содержимое отображает ПКИГ-модель робота в НУ 12 с помощью следующего файла сП8р1ау.1аипсН.ру. Егор аг"еп(:_кпбех_руТПоп.раскаде5 тпрогк дек_эаскаде_51таге_раЩ Егор ГаилсЬ тпрогб каипсЬОезсгкрттоп бгоп каипсЬ.асбкопз тлрогГ ОесТагекаипсЬАгдипепк бгоп 1аипсЬ.сопс1кгсоп5 тпрогк ПСопоббюп, ЬпбеззСспсКббоп Егор ТаипсЬ.зоЬзбтбиббопз бпрогб Соээарс!, каипсПСопЕбдигаббоп бгоп 1аипсЬ_го5.асН.оп5 бпрогб Мобе бгоп 1аипс,Ь_го5.раганебег_с1е5сгбрббоп5 бпрогб Рагаг.ебегУабие бег дегегабе_1а'апс11_с1е5сгбрббоп(): ч Получение общего пути паке-а 1еагпбпд_ип1Е. игс!Е_бибогба1_раг11 = деб_раскаде_5каге_рабЬ(' 1еагпкпд_игсй ) # Путь по умолчанию к ККЩ-модели и путь к конфигурационному файлу КУбг. бебаибб_псс1е1_рабк = игс!Е_сибогба1_рабЬ / 'игг1Е/г|Ьоб_Ьэ5е.игс1Е' с1еЕаи1б_губг_сог|Нд_рабЬ = огс!Е_бибогбак_рабЬ / 'губг/игсИ.гут? 1 # Объявление параметра запуска: включение добпб_5бабе_риЫб'.11ег_диб, по умолчанию Еабзе.
диЕ_агд = 0ес1агеЕаипсН?тдипепЕ( па"1е='ди1 , <1еЕаи1Е_7а1ие=' ЕаЕзе', сЬоЕсеь=[’Егие', ЕаЕзе'], с!е5сгт.р1:гсп=' Е1ад Ес епаЫе ]сЕпЕ_5ЕаГе_ргЫЕ5Нег_даЕ' ) # Объявление параметра запуска: путо к модели, по умолчанию абсолютный путь к бРОЕ-файлу. побе!_агд - Оес1агеЕаипсЬАгдипепЕ( папе='побеЕ', Се^аиТОаТ-ее^зт: (с!еЕаи1Е_1'1обе1_раЕЬ), Фе5сгЕрсЕсп='АЬ5о1иЕе раЕН Ео гоЬоЕ игбб Гт1е' ) # Объявление параметра запуска: путо к конфигурационному файлу КУтг, по умолчанию абсолютный # путь к конфигурационному файлу РЕЧ?. гуЕг_агд = 0ес1агеЕаипсЬАгдитепЕ( папе=' гуиоопЕЕд', йеЕэи1Е_уа1ие-зЕг(с1еЕаи1Е_гуЕ2_сопЕ’1д_раЕЛ), беьсгЕрЕЕоп=1 АЬзоЕпЕе рабЬ Ео гуЕ? сопГГд Ше1 ) # Определение параметра описания робота, использование хасго для преобразования Е1Р0Е-файла # в параметр В0$. гоЬоЕ_сегсгЕрЕЕоп = РагапеЕег\/а'1ие( Соппапс1([’хасго ', ЕаипсЛСопбЕдигаЕ1оп( ’пос1э1')]), уа!ие_Еуре=5Ег ) # Создание узла гоЬоЕ_зЕаге_риЫЕс1тег для публикации информации о состоянии робота. гоЬоЕ_5ЕаЕе_рсЫЕ51тег_пос1е = Е1обе( раскаде=' гоЬоЕ_5ЕаЕе_риЫЕ51тег', ехесиЕай!е=' гоЬоЕ_зЕаЕе_риЫЕ51тег', рзганеЕег5=[{'гоЬоЕ_бе5сгЕрЕЕсп : гоЬоЕ_с1е5сгЕрЕюп}] ) # В зависимости от параметра дот запуск узла доЕпЕ_5.ЕаЕе_риЫл5!те'' или узла # ]01пЕ_5ЕаЕе_риЫЕ5Ьег_диЕ. доЕпЕ_5Еаге_риЫЕ5бег_поое Е1ос1е( раскаде-' доЕпЕ_5ЕаЕе_риЫ15Ьег1, ехесиЕаЫе-1 догпЕ_5ЕаЕе_ри'э1Лз1тег', сопбгТЕоп=бп'1е55Сопс1тЕЕоп(Еаипс1тСопЕЕдигаЕгоп( 'диЕ')) # Если параметр диЕ равен Еа1зе, # выполняется запуск. ) доЕпб_5Еабе_риЫЕ5пег_диЕ_пос!е - Мобе( раскаде=' доЕпЕ_51аФе_риЫг5Ьег_диЕ', ехесиЕаЫе-' дсЕпЕ_5ЕаЕе_риЫЕ5бег_диЕ', сопб1ЕЕоп-1ЕС.опбЕЕЕоп(Еаипс1тСопЕЕдигаЕЕоп('диЕ')) # Если параметр диЕ равен Егие, # выполняется запуск.
# Создание узла Р\Л/ с загрузкой указанного конфигурационного файла ВД.з. гу1г_пос!е - Моде( раскаде='гу1т2', ехеси(:аЬ'1е=' гухг2', папе-'гуг72', оисриТ-'зсгеегГ, агдипепбз=[ 4, 1_аипсЬСопНдига1:1ог(1 гуысопНд )], # Загрузка конфигурационного файла # с помощью параметра -гуггсопСёд. ) # Возврат объекта каипслОезсгтрГгоп, содержащего все определенные действия и параметры запуска, гебигп 1аипс1т0е5сг1.рс1оп([ дитагд, побе1_агд, гуи_агд, тотп-(:_5к:ак:е_риЫЛ5Ьег_Г|Ос1е, ]От.|Л_51:а1:е_риЫ15Пег_диг_пос!е, гоЬоб_5каке_риЫ15Ьег_пос1е, Г7тз_пос1е ]) Этот файл 1аипс11 запускает четыре узла: 1) гоЬо1_51а1е_риЫ18пег_пбс1е: публикует отношения между Ппк и (от! ро- бота в виде трехмерной информации о позе через 11; 2) ]о1п1_51а1е_риЬН51тег_по(1е: публикует состояние каждого )О1п1 (кроме типа Пхес!); 3) )от1_81:а1:е_риЫ1811ег_§ш_пос1е: аналогично (отГ яГаГе риЬИчЬег пойе, но с дополнительным визуальным окном управления, позволяющим управлять |о1п1 с помощью ползунков; 4) гугх пойе. узел визуализации платформы КУ12. Эти четыре узла читают ключевые параметры, определенные в 1аипс1т- файле: О игдГ_1и1ог1а1_ра111: пакет функций, содержащий файл 1Л1ВР модели; □ йеГаи11_тос1е]_ра111: подробный путь кЫКОР-модели в пакете функций; О (1еГаи11_гу1г_сопН^_ра1й: конфигурационный файл, загружаемый при запуске КУсг; □ 8ш_аг§: параметр, определяющий, запускать ли визуальное окно управления (оспС зкаСс риЬПзйег диг пойс. Если изменить параметр ^ш_аг$ на Сгпе, после повторной компиляции и запуска сЙ8р1ау.1аппс1т.ру будет запущен не только КУ12, но и интерфейс под названием (от! Згакс РиЬНзПег, как показано на рис. 4.12. В этом интерфейсе, при перемещении ползунка мышью, колеса робота в КУтг будут вращаться. Файл Фзр1ау.1аипс1т ру является универсальным. Вы можете скопировать его в любой пакет с ЕК1)Г-моделоЮ и изменить параметры игаТ_ГиГопа1_раЙт, с1е1:аиЦ_тсс1е1._раГК и ае1аиЦ_гу|2_сой'тд_раТ1т, итобы быстро отобразить другие модели.
Рис.4.12 ❖ Управление движением сочленений с помощью инструмента 1о!М 5ТаТе РиЫчзНег 4.3.3. Анализ модели робота После того как мы познакомились с результатом моделирования робота, изучим, как ПКОР описывает эту модель. Полный файл модели находится в файле 1еагп1П5_ип1Г/игсИ/п1Ьо1_Ьа8е.иг11Е, его содержимое приведено ниже. <?хп! уег51оп="1.0" ?> «гоЬот папе- 'пЬоС'> <!-- Связь основания. --> <1 ток папе;"Ьа5е_1Лпк"> <у15ьа1> <!-- Настройки визуализации. --> <огтдтп хуз=" 0 0 0" гру=''0 0 0” /> <!-- Начале координат в точке (0, 0, 0), без вращения. - -> <деопеСгу> ссуИпСег 1епдСЬ="0.16" га<Ди5-"0.20"/> <!-- Цилиндр, зысста 0.16, радиус 0.20. --> </деопебгу> <паСег1а! пале="уе1Той"> <со!ог гдЬа="1 0.4 0 1"/> <!-- Хелтый материал. --> </паСегга!> </мС5иэ1> </Нпк> <!-- Сустав левого колеса. --> <]отпС пэпе-"1е<:г_и11ее1_до1пС" Суре="сопСтпиои5"> <огт.дтп ху!="0 0.19 -0.85" гру="0 0 0"/> <!-- Начало косрдинат в точке (0, 0.19, -0.05), без вращения. -->
<рагепб 1дпк="Ьа5е_1Лпк"/> <!-- Родительская связь Ьа5е_1лпк. --> <сЫ1с! Ипк=''1е<:1:_и11ее1_ипк'7> <!-- Дочерняя связь 1е^_иЬее1._1лпк. --> «ахт.5 хуг- '0 1 0"/> <!-- Вращение вокруг оси у. --> </20сп1:> <!-- Связь лезогс колеса. --> <1лпк пэте=,|1е1:1:_иЬее1_1'кпк''> <71ьиа1> <огхдхп хуа="0 0 0" гру-'1.5707 9 0" /> <!-- Начало координат в точке (0, 0, 0), вращение (1.5707, 0, 0). --> <деоте!гу> <су11пс1ег гас11и5="0.06 1епд11т=''0.025"/> <1-- Цилиндр, радиус 0.06, длина 0.025. --> </деотебгу> чпаСегтэ! пате="иЫ1е"> <^о1ог гдЬа='1 1 1 0.9"/> <!-- Белый материал, прозрачность 0.9. --> </табегта1> </у15иа1> </Цпк> <!-- Сустав правого колеса. --> «дотпб пате= ггд№_и1тее1_)от.пр'' 1уре='сопН.пиои5"> <ог1д1п хуа-"0 -0.19 -0.05'' гру-'В 0 0"/> <!-- Начало координат в точке (0, -0.19, -0.05), без вращения. --> <рагепС Ипк=''Ьа5е_11.пк7> <!-- Родительская связь Ьа5е_1лпк. --> <с1п1с1 Ипк-"гтдЬг_и|11ее1_11пк7> <!-- Дочерняя связь - гтдЫ:_и11ее'1_1Спк. --> <ахт5 хуг="0 1 0 /> <!-- Вращение вокруг оси у. --> </;о1п1:> <!-- Связь правого колеса. --> <Нпк пате-'ггдЫ_нЬее1_11пк"> <71ьиа1> <огтдгп хуа-"0 0 01' гру="1.5767 0 0" /> <!-- Начало координат в точке (0, 0, 0), вращение (1.5707, 0, 0). --> <деотебгу> <суИпс!ег гасИи5="0.06'' 1епдт1л-"0.025'/> <!-- Цилиндр, радиус 0.06, длина 0.025. --> </деотебгу> <пабегта1 папе="иЫ1:е"> <сосог гдЬа="1 1 1 0.9 /> <!-- Белый материал, прозрачность 0.9. --> </та1егта !> </уг5иа1> </Нпк> <!-- Сустав переднего поддерживающего колеса. --> <до1п1: пате- 'Ргоп1_<;а51:ег_догп1" Туре="сопг1пзои5''> <ог1д1п хуа-"0.18 0 -0.095 гру-'В 0 6"/> <!-- Начало координат в точке (0.18, 0, -0.095), без вращения. --> <рагеп1: Ипк«=“Ьа5е_Ипк"/> <!- Родительская связь - Ьа5е_1Лпк. --> <сЫ1с1 1дпк=|'Тгоп1:_са51ег_1'и1к"/> <!-- Дочерняя связь - 1тспг_са51:ег_Ипк. --> <ахт5 хуа='0 1 0"/> <!-- Вращение вокруг оси у. --> </]отп1:> <!-- Связь переднего поддерживающего колеса. --> <Нпк пате- 'Бгоп1:_са51:ег_11пк"> <У151131>
сопдтп ху/-"0 0 0" гру-"0 0 0"/> <!-- Начало координат з течке (0, 0, 0), без вращения. - -> <деопеГгу> <зрНеге гас!ти5="0.015' /> <!-- Сфера, радиус 0.015. --> </деотебгу> ктаРегта! пвпе="Ыаск"> <со!ог гдЬа='0 0 0 0.95"/> <!-- Черный материал, прозрачность 0.95. --> </р|а±егтг1> </у15из1> </Нпк> <!-- Сустав заднего поддерживающего колеса. --> «дотпГ папе-'Ьаск-СавРеГ-ЗогпС1' 1уре-"сопН.пиои5"> <ог1д\п хуг="-0.18 0 -0.095" гру="0 0 0"/> <!- Начало координат в точке (-0.18, 0, -0.095), без вращения. --> <рагеп! 1лпк="Ьа5е_1Лпк"/> <!-- Родительская связь Ьа5е_1Лпк. --> <сЫ1с1 Ппк="Ьаск_са51ег_1тпк"/> <!-- Дочерняя связь - оаск_саст:ег_1Лпк. --> <ах15 хуа="0 1 0"/> <!-- Вращение вокруг оси у. --> </]о1п1> <!-- Связь заднего поддерживающего колеса. --> <1Лпк папе- Ьаск_са51ег_Ппк"> <ут5ьа!> <огтдгп хуг-"0 0 0" гру="0 0 0"/> <!-- Начало координат в точке (0, 0, 0), без вращения. - -> <деопесгу> <зрЬеге га<Ии5="0.015' /> <!-- Сфера, радиус 0.015. --> </деопебгу> спагегса! па1е="Ыаск"> <со!ог гдЬэ='0 0 0 0.95"/> <!-- Черный материал, прозрачность 0.95. </табегга'1> </715ва1> </Ппк> </гоЬог> Проанализируем ключевые части приведенного выше описания модели. <?хп! уегьтоп- 1.0" ?> <гоЬоб папе-"тЬоГ' > В этом файле для описания модели используется язык ХМЕ. С помощью корневого тега <гоЬо!> определяется модель робота и задается ее имя шЬоГ. «Ппк пате 'Ьа5е_1гпк"> <у1зиа1> <огт.д1п худ=" 0 0 0" гру="0 0 0' /> <деоте1:гу> «суНпРег 1епд1к-"0.16' га<1гие-''0.20"/> </деопеГгу^ стаГегга! пате="уе11он"> <со!ог гдЬа=”1 0.4 0 Г/> </та1егга1> </ут5иа1> </Ипк>
Первая часть кода описывает связь шасси робота. Тег <У1зиа1> определяет визуальные свойства шасси, которые будут отображаться в Шй/ или СагсЬо в соответствии с этим описанием. Шасси робота задаются абстрагировано в виде цилиндрической структуры с помощью тега <су1тс!ег>, где задаются радиус и высота этого цилиндра. Затем указываются трехмерные координа- ты и ориентация цилиндра в пространстве. Центр шасси находится в центре интерфейса, поэтому с помощью тега <оп§ш> начальные координаты уста- навливаются в начало координат. Кроме того, с помощью тега <тэ1ег1э1> задается цвет шасси робота (желтый), где <со1ог> представляет собой КСВА- значение желтого цвета. ^огпГ папр-"1еН_мЬее1_]О1пб" Гуре=' сопНпиоиз"> <огтдтп хуг-"0 0.19 -0.05" гру="0 0 0'/> «рагеггЬ 11пк="Ьа$е_1лпк"/> <сЬПс1 11пк='1еН>11ее1_ипк"/> <ах15 хуг="0 1 0"/> </]огпГ> Вторая часть кода определяет первый )’ош1, который соединяет шасси ро- бота и левое колесо. Тип этого )ош1 - сопГтионз, что позволяет ему вращать- ся вокруг оси, что идеально подходит для колес. Тег <оп§ш> задаст началь- ную точку )’ошГ, устанавливая ее в точке крепления колеса, то есть в месте соединения колеса и шасси. Тег <ах1§> определяет ось вращения ]О1пГ как положительную ось у, вокруг которой колесо будет вращаться при движении. <1дпк папе="1.еН:_1л|Ьее1_Ппк"> «утзиа'о <ог1дтп хуг="0 0 0" гру-"1.5707 0 0' /> ^деотеб"у> <су11пс!ег гасНиз= 0.06" 1епд1Ь="0.025"/> </дестеТ:гу^ «пабегга! папе=”и|Ысе"> <со!ог гдЬа="1 1 1 0.9’/> </пабег1а!> </у1зиа1> </1Лпк> Приведенный выше код описывает модель левого колеса. Форма двига теля абстрагирована в виде цилиндра с радиусом 0.06 м и высотой 0.025 м, окрашенного в белый цвет. Поскольку цилиндр но умолчанию создается вер тикально относительно поверхности, необходимо с помощью тега <оп§т> повернуть цилиндр вокруг оси х на 90° (в радианах это примерно 1.5707), чтобы он соответствовал форме двигателя. Остальные части модели шасси робота описываются аналогичным обра- зом, поэтому здесь не будем повторяться. Рекомендуем попробоватс самостоятельно изменить различные параметры з 11К0Р и затем просмотреть результат в ЧУ1г, чтобы более лучше понять значение и методы настройки таких ключевых параметров, как координаты, оси вращения и типы со- единений.
4.4. Оптимизация модели робота с использованием ХАСКО Мы создали простую модель дифференциального шасси робота. Если слож- ность структуры робота увеличивается, то и файл модели СКЭР становится слишком громоздким. Есть ли способ упростить его? Допустим, у большин- ства роботов колеса одинаковые, можно ли определить «колесо» как функцию и вызывать его в разных местах несколько раз? Это избавит от необходимо- сти повторно описывать одинаковые колеса. Для повышения эффективности моделирования в КОЗ 2 предоставляется обновленная версия формата файла СКОР - ХАСКО. Файлы ХАСКО имеют больше программных методов реализации, что делает процесс создания мо- делей более удобным и эффективным. Макросы: у автомобиля 4 одинаковых колеса, поэтому нет необходимо сти создавать 4 одинаковых элемента НпК. Можно создать модуль, который можно использовать повторно, подобно определению Функции в языках программирования. Включение файлов: файлы моделей сложных роботов могут быть очень большими. Для разделения различных модулей, таких как шасси и сенсоры, можно разместить их в отдельных файлах, а затем включать их в общий файл. Программируемый интерфейс: в файлах ХАСКО можно определить некоторые константы для описания размеров робота, а также переменные для передачи данных при вызове макросов. Можно выполнять вычисления данных и даже добавлять условные операторы: если робот называется А, то у него есть камера, если робот называется В, то камеры нет. В этом разделе мы оптимизируем предыдущую модель СКЭР с помощью файла ХАСКО. Сначала необходимо установить пакет для анализа файлов ХАСКО с помощью следующей команды: $ зис!о эрб гпббаП гез-]зггу-хасго 4.4.1. Основные синтаксические конструкции файлов ХАСКО Файлы ХАСКО предоставляют множество программируемых методов, ана- логичных языкам программирования. Сначала познакомимся с их базовым синтаксисом. 1. Определение констант В файлах ХАСКО для определения констант используется тег <-хасго:ргорег1у>. На- пример, константа Р1 с именем М_Р1 и значением 3.14159. Константы можно вызывать, используя их имена в конструкции ${}. Ниже приведен пример кода.
<!-- Определение константы М_Р1=3.14159 --> <хасго:р:орегбу паг,е="м_Р1" уа1ие="3.14159'7> <!-- Вызов определенной константы с помощью ”${ХХХХХ}" --> «оггдтп хуг="0 0 и" гру="${М_Р1/2} 0 0'' /> Аналогично можно определить массу, размеры и положение установки каждого элемента Ипк как константы и разместить их в начале файла модели для удобства вызова и изменения в процессе моделирования. 2. Математические вычисления В конструкции ${} можно не только вызывать константы, но и выполнять не- которые распространенные математические операции, включая сложение, вычитание, умножение и деление. Ниже приведен пример кода. <!-- В ${ХХХХХХ} поддерживаются математические вычисления согтдтп хуе="0 ${(гоГог_1епдсЬ+1л/1.ее1_1®пд1:Ь)/2} 0" гру="0 0 0"/> В модели робота СГКЬР многие пространственные отношения зависят от констант робота, и в таких случаях можно использовать математические формулы для вычислений, чтобы избежать плохой читаемости кода, вызван- ной прямым написанием результатов. /94 Все математические операции преобразуются в числа с плавающей запятой для обеспечения точности вычислений 3. Определение макросов Тег <хасго:шасго> используется для объявления модулей кода, которые мож- но повторно использовать и которые могут содержать входные параметры, аналогично функциям в программировании. <!-- Определение макроса, папе - имя макроса, рагапв параметры макроса --> <хасго:пасго папе-'папе'' рагап5=''А В С"> </хасг о: Р1асго> <!- Вызов макроса, нужно указать имя и параметоы макроса --> «пале А=''А_уа1ие" В='Е_уа1зе" С="С_уа1ие'7> Тег пате обозначает имя макроса, которое можно задавать произвольно, рагат? обозначает входные параметры макроса. Благодаря установке вход- ных параметров разработчик может легко передавать данные в макрос для настройки. В модели робота СТВОР часто используются определение и вызовы макросов для создания повторно применяемых модулей, таких как модули колес, камер и т. д. Можно даже определить всего робота как макрос и вы- зывать его в других моделях для создания нескольких моделей роботов. В процессе разбора файла ХАСКО модели все содержимое определений макросов будет полностью вставлено в месо вызова макроса.
4. Включение файлов Что делать, если модель ИНОЕ слишком большая? Ее можно разделить на несколько файлов моделей и включать их друг в друга с помощью тега <хасго:тс!ш1е>. <!-- Включение файла, Шепапе - это полный путь к включаемому файлу --> «хасго:тпс1пбе Шэпате--"$(Нпс1 ог1д1пЬоб_да2еЬо)/игб<:/Ьа5е_да2еЬс.хасго17> Этот метод очень похож на включение файлов в программировании на языке С/С++, после включения можно вызывать макросы из включенных файлов, 4.4,2. Оптимизация модели робота Далее, используя синтаксис ХАСКО, проведем первую оптимизацию модели ШВЕ, созданной в разделе 4.3. Оптимизированный код модели содержится в файле ^агшп& игсД/нгсД/тЪоГ Ьазе.хасго, его полный текст приведен ниже. «?хп! уегьтоп^ ' 1.0"?> «гобое папе="пво1:' хп1пъ:хасго=[хасго Объявление пространства имен, обычно это ссылка на гоа Щкт. хасго] «!-- Список свойств. --> «хасго:ргореггу пагле="М_Р1' уа1ие="3.1415926 '/> <!-- Значение п. --> «хгегогргорегбу папе-"Ьа5е_га<1ги5 уа1се-"0.20'7> <!-- Радиус шасси. --> «хасго:ргорегту паюе="Ьа5е_1епдЦт'' уа1ее- '0.16"/> <!-- Длина шасси. --> «хасго:ргорегбу папе-'У'ЬееТ.габсиз" уаТие- "0.96"/> «!-- Радиус колеса. --> «хасго:ргорегсу папе="иЬее1_1епдгп" уа1ие- 'О.025"/> <!-- Длина колеса. --> «хасго:ргорегбу пагле-'У'Ьее!_]огп1:_у" уа1ие- 0.19"/> <!-- Смещение колесного сустава по оси у. --> «хасго:ргорегбу папе="|Лее1._]о1п1:_2" уаТие- 0.05"/> <!-- Смещение колесного сустава по оси а. «хасго:ргорег1у папе="са5!:ег_габти5' уа1ие= 0.015"/> «!-- Радиус поддерживающего колеса. «хасо:ргорегту папе="са51:ег_догп1:_х" </а1ие="0.18' /> «!-- Смещение сустава поддерживающего колеса по оси х. --> «!-- Определение цвета, используемого роботом. --> «пасегта! папе="уе11ои"> <со1ог гдЬа="1 0.4 0 1"/> «!-- Желтый. --> «/г.аТегтэВ «пабегта! папе="Ыаск"> «со1.ог гдЬа=”0 0 0 0.95"/> <!-- Черный. --> «/гагегта!> «пасегта! папе-''дгау"> «соТог гдЬа="0.75 0.75 6.75 1"/> «!-- Серый. --> «/г.аге г1.а!> «!-- Определение макроса: колесе робота. -->
<хасго:пасго паге='иЬее1" рагап5="ргеНх геНес1:"> <зот.пб пат1е="${рге€1х}_иИ<е1_]оСп1'' Ьуре="сеп1;<пиои5"> <ог1д!п хуг="0 ${геГ1есб*и1лее1_доСп<_у] ${-иЬее1_]о1пк_7} ' гру="0 0 0"/> <рагеп1: 1гпк=''Ьа<>е_1Лпк'7> <сЬиб ипк="${ргеНх}_1л|11ее1._1Лпк7> <3X15 хух="9 1 0"/> </]отпТ> <Нпк паг1е-"${ргеПх}_иЬее1._1лпк"> <У15иа1> <оггдтп хух="0 0 0" гру=''$[М_Р1/2} 0 0" /> <деопебгу> <су1тл<1ег 1'асИ.11ь="${|лЬее1._1 асНиз}" 1епд1К=* ${иЬее1_1.епд1:11}1 /> </деопе1ту> ктаТегтаЪ папе='дгау" /> </ут ьиа1> </1Лпк> </хасго:т1асго- <!-- Определение макроса: поддерживающее колесо робота. --> <хасго:пасго паге="са5Тег" рагаяз-' ргеСтх геНесб"> <]О1п1- папе= ''$[ргеНх}_сазбег_до1пб1' Суре="сопЦ.пио1»5"> <ог1д!п ху2="${ге<:1ес'(:*са5гег_]о1п'(:_х} 0 ${ (Ьазе_1епдгЬ/2 + са5бег_гасКиз)}" гру="0 0 0'7> срагепЬ 1Лпк=''Ьа5е_11пк"/> <с!п1(1 Илк- "${ргеНх}_сазгег_1Лпк7> <ахх5 хуг-"0 1 0''/> </]огпб> <Цпк папе="${ргеНх}_са5бег_1Лпк' > <угзиа1> <ргтдгп хуг='0 0 0" гру=''0 0 0'7> <део1'1е1:гу> <зркеге га01и5="${са5гег_габ1из}" /> </деспетгу> слабегга! папе="Ыаск" /> </71ьиа1> </Ипк> </хасго:пасго> <!-- Связь шасси. <1Лпк папе- 'Ьазе_Кпк"> <715иа1> <ог1дт.п хуг-" 0 0 0" гру="0 0 0" /> <деолебгу> <суИпс1ег 1епдгЬ="${Ьа5е_1.епдгЬ}" гас1ги5="${1>а5е_гас1ги5}7> </деэпеСгу> <"1аСегга1 папе^'угИои" /> <!-- Материал желтого цвета. --> «/утзиаН </Ипк> <!-- Вызов макроса колеса для создания левого и правого колес. --> <хасго:\чНееС ргеМх="1еН" геНесб="1'7> <хасго:иЬее! ргеНх="г1д№ геН.ес^="-1'7>
<!-- Вызов макроса поддерживающего колеса для создания переднего и заднего колес. --> <хасго:са<Дег ргебгх=ч Гто.тб 1 ге<Тесб="-1"/> <хасго:са51ег ргеНх="Ьаск'' геНес1="1'7> </гоЬоб> Проанализируем подробно изменения, сделанные в связи с добавлением синтаксиса ХАСКО. 1. Определение констант «хасгогргорегсу папе="М_Р1" уа1ое="3.1415926'/> <!-- Значение п. --> <хасго:ргорег1у Г|апе="Ьа5е_га<Ди5 уа!ое="0.2Э"/> <!-- Радиус шасси. --> <хасго:ргорегсу Г|апе="Ьа5е_1.епдгЬ" уаТое- '0.16"/> <!-- Длина шасси. --> <!-- Связь шасси. --> <Ппк папе= Ьа5е_Нпк"> <ут5са1> <оггдгп хуг=" 0 0 0" гру="0 0 0'' /> <деопеггу> <суПпс1аг 1епд1Ь="${Ьа'е_1епд1.Ь)" га<1ги5="${Ьа5е_гас1ги5}'7> </сеоР1еСгу> ятаТегт а! пат1е=' уе1 Том ' /> </у15иа!> </Ипк> Прежде всего задайте основные параметры модели робота в виде конс- тант, например базовые размеры шасси и колес, и разместите их в начале файла модели В процессе моделирования используйте константы, такие как ${Ьа8е_1сп§1:п} Если потребуется изменить эти значения, достаточно внести изменения в месте их определения, без необходимости корректировки всей модели. 2. Математические вычисления Далее, используя существующие формулы, мы выведем некоторые числовые зависимости в процессе моделирования, что позволит сократить количество ненужных чисел. Таким образом, при изменении значений констант связан- ные с моделью позы также будут динамически изменяться. <зот.п1: папе='${ргеНх}_са51ег дотпе'' Туре= "сопН.пиои5|> <ог1дт.п хуг="${геН.ес1:*са51ег_]01п1:_х} 0 ${-(Ьа5е_1епдЙ/2 + са51ег_гасКи5)}" гру-"0 0 0"/> <рагепт Плк="Ьа5е_Ппк'7> ссбтШ 11пк="${ргеН.х}_са5гег_1Лпк'7> <ах15 хуг="0 1 0'/> </]О1П1> 3. Определение макроса <!-Определение макроса: колесо робота. --> <хасго:пасго папе-1 мЬее1" рагапз='ргеНх геПесС"» <]011Т(: паие='${рге<:1х}_141ее1._]о1.пЦ 1уре-''со1|Нпиоиь">
<оггд1п ху2="0 ${геГ1есС*икее'1_]оСпГ_у] ${-иКее1_]О1пТ_г}'' гру='Э 0 0"/> <рагепС Цпк="Ьа$е_1Лпк"/> <сЬИс1 Ппк="${ргеНх}_1«Ьее1_Кпк7> <ах15 хуг="8 1 0"/> </]0’.П1> <1Лпк пате="${р, еПх}_иЬее4_1лпк' > <у’.5иа1> <огтд1п хуг='0 0 0" гру="${М_Р1/2} 0 0" /> <деоие(:гу> <суПпс1ег гас1ги5-''${|41ге1._гас1ги5}" ТелдгЬ = "${иНее1_1апдг!'}'/> </деопебгу> <гоаСегга1. папе="дгау" /> </уты1а1> </1Лпк> </хасго:?1асго> <!-- Вызсь макроса колеса для создания левого и правого колес. --> <хасго:иЬее1 ргеНх= 1еП" геНесС="1'/> <хасгс:иЬее'. ргеН.х="гсд№" геГ1есб=''-1'7> Можно определить часто используемые модули как макросы. Например, определите связанные с колесами Ппк и ]от1 как макрос шНее1, который имеет два параметра: □ ргеПх, обозначающий префикс для имен Ппк и )от1, так как имена левого и правого колес не должны совпадать; О геПес!, обозначающий зеркальное положение левого и правого колес по оси у, принимающий значения 1 или -1. В нужном месте модели колес можно вызвать уже определенные 1шк и )от! с помощью тега <хасго:ш11ее1>. Благодаря вышеописанной оптимизации содержание модели в формате ХАСКО стало значительно более лаконичным, по сравнению с предыдущей моделью СКОР, и больше напоминает программный код. 4.4.3. Визуализация модели робота Действительно ли оптимизированная модель СКОР идентична предыдущей? Проверим это с помощью КУ1г. Откройте терминал и введите следующую команду: $ гэз2 Таспсп 1еагп!пд_игсИ с!г5р1ау_хасго.1аипсЬ.ру В открывшемся окне КУ12 появится точно такая же модель, как показано на рис. 4.13. Мы по прежнему можем управлять свободным вращением колес робота через окно 1ош1 81а1е РнЬПзйег.
Рйе Е^пек Ые!р ’ТМэтеСатиа + — У™*Т- ► • С1оЬа1 ОрЬопк ► ✓ с!оЬа! ЗСаСоз: Ок > » сна 3 ► й, НоЬо^Мойе! |И ► Л>-Т₽ ,Е А!рЬа АтошН оГ Сгагкрагепсу бо арр!у Со сЬе !!пк$. АЙР - ЛИЛ Туре' ОгЬЛ (плг_беГаи!С_р1ид1П5 » 2его ’ СиггепСЧ1е» ОгЫС (гу!х) №аг€1|рО1з1а . 0 01 ЮТег12 Ах15 П ТагдеС Ргате <Р|хеР Ргете> О|51апсе 1 26042 Роса! ЗКаре 5ие 0 05 Роса! ЗНаре Р1Х . •/ Уа» 5.28 Р|СсЬ 0 335 ► Роса!Рот1 015186,010481,0 0 /Ьоте/ду!1/(1еу_*5/1п51аИ/1еагп1пд_игйГДбаге/1еагп1пд_иг<1Г/г*Ц/иг4Г.гу|г‘ - РУ1г 31 Гр5 5ауе Кетоуе Кепате РезеС Рис. 4.13 ❖ Визуализация ХАСКО-файлов модели в КУ|? вк Использование формата ХАСКО для описания 11К0Р-модели робота делает ее более читабельной и удобной для поддержки. Болпшое количество моделей роботов в со- обществе КОЗ созданы именно таким образом. 4.5. Совершенствование симуляционной модели робота Теперь, когда основа модели робота построена, необходимо добавить в нее некоторые обязательные для симуляции модули и параметры, чтобы .модель могла функционировать в симуляционной среде. 4.5.1. Совершенствование физических параметров В модели, созданной в разделе 4.4, мы создали только визуальные параметры .модели. Помимо этого, необходимо добавить физические характеристики и параметры столкновений (коллизий). Возьмем, к примеру, базовое звено робота Ьазе Ипк и добавим в него теги <1пегПа1> и <со1118юп>, чтобы описать физические инерционные свойства и параметры столкновений.
<!-- Определение формулы расчета инерциальной матрицы цилиндра. <хас г о: гча с । о папе=1,суКпс1ег_гпе( ст.аТтаТгДх' рага115="гл г Ь"> <Лпегфха1> <огт.дтп хуг="0 0 0" гру="0 0 0"/> <па5ь 7а1не-"$[п}" /> сгпегНа гхх=”${п*(3*г*г+1т*Ь)/12}1 тху = "0" гх2 = '0" 1уу="${п*(3*г*г+Н*Ь)/12} 1 ту? = ’0" т.г2=ч${р1*г*г/2}'' /> </1пег1:1 а1> </хасго:тасго> <!-- Определение полных параметров шасси робота. --> <1Лпк гапе="Ьазе_ипк"> <уу$ца1> <огт_дтп хуг=" 0 0 0" гру="0 0 0" /> <деопебгу> <су11пбег 1епд,111="${Ьа5е_1епдМ1}" габги5="${Ьаье_гас1иь} '/> </деотеТ гу~> сптаСегта! па1ле-''уе11еи" /> </ут5иа1> <со!Иьгоп> <огт.дтп хуг=" 0 0 0' гру="0 0 0" /> <деотеСгу> <су11пс1ег 1епд1:Ь.= "5{Ьэ5е_1бпдб1т}'' гасКи5="${Ьа5е_габ1 из}"/> </деоте1:гу> </со11151ол> <хасго:су1Лпс1ег_1пегТт.а1_та1:ггх п=''${Ьа5е_111а55}'' г="${Ьа5е_гас!ги5}" ^'^{Ьаье-ЩпдЙт}'' /> с/Нпк» Инерционные параметры включают в себя массу и инерционную матрицу. Если объект имеет регулярную форму, инерционную матрицу можно рас- считать с помощью формул на основе размеров и массы. Вы можете само- стоятельно найти соответствующие формулы в сети. Содержимое тега <со1- 1181оп> почти идентично содержимому тега <У18на1>, поскольку внешний вид используемых моделей обычно прост и регулярен. Если же использовать трехмерную модель реального робота, то в теге <У18на1> можно задать более сложный внешний вид робота. Чтобы уменьшить вычислительную нагоузку при обнаружении столкновений, в <соШ- 51оп> чаете используется упрощенная модель робота, напримео сустав манипулятора можно упростить до цилиндра или прямоугольного параллелепипеда. 4.5,2. Добавление модуля контроллера На текущий момент наш робот является статичной моделью. Чтобы он начал двигаться, необходимо использовать подключаемый модуль СахеЬо. Он на- деляет модель ИНОЕ более мощными функциями, позволяя связывать модель с сообщениями НО8, что помогает симулировать выходные данные сенсоров и управлять двигателями, делая модель робота более реалистичной.
СагеЬо предоставляет подключаемый модуль ИЫ^пШоп-^агеЬо-сИЕГ йпуе- зуЩеш.яо для управления дифференциальным привод ом, который можно настроить и применить к созданной модели робота с помощью приведенного ниже кода. <дагеао> <!-- Подключаемый модуль контроллера: система дифференциального приаода. --> <р1идт.п Шепапе=Ч1Ь1дптЛт.оа-да2еЬо-с1г'ГГ-с1гг7е'зузгет.ьо" папе="тдлШсп: :дггеЬэ: гзузбег.д: :0гШ)гтуе"> <ирс1аге_га’:е>30</ирс1абе_гаГе> <!-- иастота ооновления 30 Гц. --> <1еЙ_]огпб>1еГГ:_и1тее'1_]огМ</'1еН_]о1гД> <!- Левая ступица колеса. --> <Г1дЙ_до1пг>гГдЬг_'ипее1_до1ПГ</гТдЙ_]отпС> <!-- Правая ступица колеса. -> <иЬее1_5ерагаРгоп>$<У'Ьее1_]огпГ:_у*2}</иЬее1_5ерагг1:Гоп> <!-- Расстояние между двумя колесами. --> <ийее1_гас1ги5>${иЬее1_гас1ги5}</иПее1_гас11и5> <!-- Радиус колеса. --> <Сор1с>с1лб_уеТ</гор1с> <!-- Тема управляющих команд. --> <риЫ15Ь_ос1о’1>Г:гие</риЬи5'т_о<1оп> <!-- Публикация темы одометра. --> <риЬТт5б_йс1оп СГ>Сгие</риЬН5б_ос1оп_СГ> <!-- Публикация гГ одометра. --> <рий15Ь_иЬееТ_И>Ггие</рийт.51т_н1тее1._Г:Г> <!- Публикация С С колес. --> <обо1леГ:гу_’:ортс>ос1о1л</о(1о1леггу_т:ор1с> <!-- Название темы одометра. --> <ос!опеГ:гу_Ггапе>обот</сбопе1:гу_<:га"1е> <!-- Имя системы координат одометра. --> <гоЬсг_Ьа5е_Сгопе>Ьаье_СооСргТп1:</гоЬоС_5а5а_Ггапе> <!-- Система координат шасси робота. --> </р1идт.п> <!-- Подключаемый модуль сенсоров. --> «рТадтп Гиегапе=''Тдп1Г1оп-да7ебо-5еп5ог5-5у51:еп'' папе="Тдп1ггоп::дггеЬо :5У5беп$::Зепзогз"> <гепс!ег_епдгпе>одге2</гепс1ег_епд1пе> <!-- Подсистема отриссвки. --> </р1идт.п> <!-- Подключаемый модуль пользовательских команд. --> «рТидТп Шепапе-'ЧдптТГол-да/еЬо-изег-соппапбь- зуйеп" папе="1дпШоп: :дагеЬо: гьузСепз: :Пзе1 Со1Л1лап<15''> </р1ид1п> <!-- Подключаемый модуль трансляции сцены. --> «рТадтп Гиепапе-"1дптТГоп-да7еНо-5сепе-Ьгоас1са5Гег-5уьТеп' па"1е=чтдпШоп::дагеЬо: : зуз'Ьетз: :5сепеВ( оаСсаьтег' ь </р1ид1п> <!-- Подключаемый модуль пуоликации состояния суставов. --> «рТидтп ГПепапе=''тдп1Г1ол-да2еЬо-]о1п1:-5Га1:е-риЫ15Рег-зуз1:еп" пагое="т.дпШоп: :да?еЬо: гзузСепз:: Зо1пт5тагеРийг51'ег"> </р 1идтп> <!-- Подключаемый модуль пуоликации одометра. --> «рТидГп Г11епапе=''тдптГ1ол-да2еЬо-ос1опе'(:гу-риЬи5Пег-5у5'(:е1п пагое="т.дпШоп: :датеЬо: ггугСепз::Ос1опебгуРиЫгз1тег' > <ос!о1л_Гга1ле>оОот</оРо’л_Гга1ле> <!-- Система координат одометра. --> <гоЬог_Ьа5е_Сгопе>Ьа5е_ТооСргТп1:</гоЬоТ_оа5а_Сгапе> <!-- Система координат шасси робота. --> </р!идгп> </дагеЬо>
При загрузке модуля контроллера дифференциального привода необхо димо настроить ряд параметров, среди которых ключевыми являются сле- дующие: О <1еГТ_]О1п1> и <п21К_]ош1>: сочленения для вращения левых и правых колес, которые контроллер должен вращать; □ <мгкее1_8ерагаПоп> и <и11ее1гасПиь>: размеры модели робота, необ- ходимые для расчета параметров дифференциального привода; О <Сортс>: команда управления скоростью, на которую подписывается контроллер, обычно называемая сшс!_уе1 в НО8; О <риЫ18И_о(1от>: указывает, публиковать ли тему одометрии ойот; О <"о(1оте1гу_1ор1с>: имя темы одометрии, если она публикуется; О <ойоте1:гу_Ггате>: опорная система координат одометрии, обычно в КО 5 называемая об от; □ <гоЬо1_Ьаке Ггате>: базовая система координат робота, обычно ис- пользуется Ьазе Ипк или ЬазсГооСрпп!. После улучшения ПКЬР-модели робота она готова к симуляции, можем протестировать ее в симуляционной среде. Полная модель симуляции робота находится в пакете 1еагптд_да7еЬо_1тагтоп:с\игс1Г и включает в себя два файла модели: тЬоГ_да2еЬо.хасго и тбс1:_Ьа5е_да2еЬо.хасго. 4.6. Симуляция робота в базеЬо Теперь загрузим модель робота в СагеЬо, что позволит не только дистан- ционно управлять движением модели, но и симулировать работу камеры, дальномера и других сенсоров, чтобы робот мог воспринимать информацию о симуляционной окружающей среде. 4.6.1. Загрузка модели робота в СагеЬо Откройте новое окно терминала и выполните следующую команду. $ ГО52 ТаипсЬ 1еагп1пд_да7еЬо_11амоп1с 1оас1_игс1Г_гпЩ_дэ7еЬо_1тагж>пгс. [аипсЬ.ру Подождите немного, запустится СагеЬо с симулированным изображением, как показано на рис. 4.14. Робот расположен в центре окна, .можно увеличить или уменьшить масштаб с помощью колесика мыши. При запуске в виртуальной машине возможны отсутс’вие изображения в области мо- делирования или постоянное мерцание. В этом случае необходимо отключить в на- стройках виртуальной машины параметр Ускорение 31 графики.
Рис. 4.14 ❖ Загрузка и отображение модели робота в СагеЬо Для запуска Са/еЬо и загрузки модели робота используется файл 1оас1_ игсИДпбо иагеЬоДтагтотсЛаипсИ.ру. Ниже приведено описание реализации. с1еГ уепегабеДаипсЬДезсгкрНопС): # Включение файла запуска гоЬоб_5ба1:е_риЫл511ег. раскаде_па1'1е=' 1еагп1пд_дагеЬо_1'1агпоп1с' ркд_рзЦ1 = оз.рабк.до1п(деб_раскаде_5Наге_Лгесбогу(раскадепапе)) хасгоДНе = оз.рабк. ]о1п(ркд_раб1т, игсН', 'пЬот_дг2еЬоДап'1ОП1С.хасго') гоЬокДе5сгтрНоп_сопНд - хасгс.ргосе55_Ше(хасго_Гт1е) в Позиция и ориентация робота после загрузки. 5раип_х_7а1 = '0.0' зраип_у_7а1 = '0.0' 5раип_г_7а1 = '0.3 5раип_уаи_уа1 = '0.0' в Запуск симулятора СагеЬо. ркд_го5_дг_5гп = дет_рзскаде_51тагеД1гесбогу(1 г05_д;_51т') дагеЬо = 1пс1и<1екаипсЬ0е5СггрНоп( РубЬопкаипсЬ0езсг1рб1эп5оигсе( 05.рабЬ.]0гп(ркд_г05_дг_51р, 1аипск , 'дг зтл.кэипсН.ру')), 1аипск_агди’1епт5-{'д2_агд5': '-г еррбу.зс!Т'}.Иепз(), ) В Запуск узла зраипег из пакета дагеЬо_гоз для загрузки модели робота. зраып_епШу = Мобе(раскаде='гоз_д2_зтт', ехесиТаЫ.е= сгеабе',
агдиР1епГ5=['Дерке', ' гоооТДессгТрс’.оп , '-пале', 'пЬот:', -X1, 5ракп_х_уа1, '-у', ьра1л/п_у_уаТ, '-г', 5ра1лгп_г_уа1, '-V', 5ра1л/П_уЭ1лМ/а1], оигриТ='5сгееп') # Создание узла гоЬо1:_51:а1:е_риЬ'115||ег. рагапз = {' гоЬокДезсгтрйоп': гоЬоС_с1е5сгтрМоп_сопГ<у.Т:охт1.(), 'и5е_51п_1гие': Тгие} пос!е_гоЬа1:_51:аТе_риЫг5Ьег = Мос!е( раскауе=' гоо<Я_5Гат:е_риШ Аег', ехеси 1аЫе=' гоЬоТ_51:аТе_риЬи51тег', оиТриТ =' зегееп', рагапекегь [рагапз] ) в Запуск узла го5_дг_Ьгкс1де для преобразования данных. го5_дг_ЬгТс1де - Мос1е( раскаде го5_дг_Ьг1с1де', ехесиТаЫе-'рагапекег_Ьггс1де', раг атеТ:ег5=[ { 'сопС1д_Тие': оз.раТП.]огп(де1:_раскаде_5Ьаге_с11гес1:огу(раскасе_гате), 'сопГгд', 1 го5_дг_Ьги1де_Р1Ьо(:.уа<ч1'), ДсздтуеггтЗес.ДОГакгс.риЬКзЬегДигаЬитЛу : Чгапзгеп^ТосаТ', }], оикриТ='зегееп1 ) # Запуск всех вышеперечисленных функций. гасигп каипсЬОезсгиргЛопС[ даееЬо, 5рууп_епШу, гоз_дг_Ьггс1де, пос1е_гэЬоТ_5гаТ:е_риЫ15Ьег, ]) 3 приведенном выше коде сначала задаются несколько ключевых пара метров: □ раска§е_пате: название пакета с моделью робота для симуляции; О рк§_ра1Ъ: путь к пакету с моделью робота для симуляции; О хасгоЩе: имя файла с моделью робота для симуляции; □ гоЪо1_<1е8спр11оп_сопГ1§: преобразует файл модели ХАСКО в формат модели 1ЖЦЕ, □ зраип х уак зрамп у уа!, зраигп_2_уа1, зрашп уаи’ уа]’ координаты х, у, 2 и угол уа\у модели робота в СагеЬо. Затем запускаются несколько ключевых узлов: О §а/еЪо запускает СахеЬо и загружает пустую среду етрку.збГ; О 8рашп_еп1ку: загружает модель робота в формате 1ЛЮР в симуляци- онную среду Са/еЬо;
□ поде_гоЬо1_51а1е_риЬИбкег: запускает гоЬоГзГаГернЬИзпег, поддер- живающий I? робота; О го8_яг_Ь11й^е: запускает узел рагате1ег_Ьпс1§е, который преобразует сообщения между КОЗ и СагеЬо. Сообщения, требующие преобразова- ния, настраиваются в файле гоз_§/_Ьпс1§е_тЪо1:.уат1. Дк При использовании СагеЬо для симуляции робота необходимо установить и5е_51т_ бте в значение Тгие, чтобы вся система КЭ8 2 использовала симуляционное время, избегая функциональных сбоев из-за несинхронизированных часов Здесь важно обратить внимание на функционал узла гоя_§2,_Ьпс1§е, так как структуры сообщений СахеЬо и КОЗ не являются совместимыми. Для преобразования данных между ними требуется мостовой узел. Достаточно настроить структуру сообщений и названия тем, и узел гозо/ЬгДде сможет осуществить преобразование данных. Конфигурация тем для симуляции в этом разделе находится в файле гоз_ 22_Ьпй§е_тЪо{,уат1. Его содержимое приведено ниже. гоз_Гор1с_папе- “/сткН/е!" д2_Торгс_гапе: "/спкЬ/е!" гоз_Гуре_папе: "деспебгу-Пздз/пБд/Тю.зЕ1 дг_буре_паР1е: „дг.пздз ЛУтзг" сНгесНоп:, Р08_Т0_С7 гоз_1:ор1с_пар|е: "/сТоск" дг_1ор1с_папе: "/сТоск" го5_Гуре_гапе: ''гоздгарЬдпздз/рзд/СТоск" д2_Гуре_папе: "дг.пздз.СЕоск" сНгесПоп: 62_Т0_К0$ - гоз_Горбс_папе "/ойоп" дг_1оргс_паГ|е: "/пюс1е',./тЬоГ/ос1ог,еггу" гоз_1:уре_11аме: "паV_пздз/пзд/^сIоI^е1:гу', дг_Г:уре_папе: ''д?.пздз.ОЗогтеСгу" (Игесйоп: С2_ТО_КОЗ го5_Гор1.с_папе: "/сТоск" дг_Гэр1с_па1г1е: "/с Тоск" го5_гуре_паР|е: "го8дгарк_Г1зд5/р5д/с1оск" дх_1уре_паие: "д?.пздз.СЕоск" ЛгесПоп: 62_ТО_Р.О$ гоз_ГорГс_папе: "/доТпЩзЕаЕез" дг_Еор1с_папе: Дкюг1ф'епрГу/по<!е1/пЬо1:/]о1пГ_5Г:а1:е'' гоз_Гуре_папе: "зепхогдпьдз/пзд/Зот.пШаЩ" дг_Гуре_папе: „д?.гпздв.Мсс1еЕ" сЦгесНоп: 62_Т0_К05 го5_горт.с_пар|е: ''/Гб1' дг_бор1с_паР1е: "/лобеЕ/тЬоУ/розе'' го5_Гуре_паР1е: "Ш-Пьдс/грзд/ТЕКесзаде" д2_Гуре_папе: "д7.п5дь.Рс5е_\/" (ИгесПоп: С2_ТО_РС$ гоз_Гор1с_паР1е- "Дг_5(а1:гс' д2_Горт.с_паР1е: "/тос1е1/р1ЬоГ/эо5е_',гаг1с" го5_Гуре_гаР1е: “Ш-Нздз/тзд/ТЕМеззаде"
д7_Суре_папе: ''д?.п5д5.Р05е_\/" ЩгесНоп: С7_Т0_К0$ В приведенном содержании каждая конфигурация интерфейса тем состоит из следующих пяти параметров: □ го8_1ор1с_пате: название темы в 305, например /стс!_уе1; О 2г_1ор1с_пате: название темы в системе СахеЬо, например /стс1_уе1; О го8_1уре_пате: тип темы в КОЗ, например §еоте1гу_т8§8/т8§/Т^Ь81; □ ^2_1урепате: тип темы в системе СагеЬо, например $2.гп5§5.Т\у18{; □ (ИгесНоп: направление преобразования темы, КОЗТОС2 означает преобразование темы КОЗ в (ЗагеЬо, СХ ТО КОЗ означает преобразо- вание темы СазеЬо в КОЗ. С помощью вышеуказанной конфигурации можно преобразовать тему КОЗ 2 /сшс1_уе1 в систему СагеЬо для управления движением робота в симу- ляционной среде СагеЬо. 4.6.2. Симуляция управления движением робота Мы добавили в модель робота модуль дифференциального управления НЬщ- шНоп-^агеЬо-сШТ-бпуе-зуз^еш.зо, который позволяет использовать диффе- ренциальный контроллер для движения робота, На рис. 4.15 показаны список тем и подробная информация о теме скорости после запуска симуляционной среды робота. М го52фдмуиеКоте:~ С = о1 х го52@диуиеЬоте:~$ гоз2 Торге НзТ /сТоск /спд_уе! /зогпТ_5ТаТез /одот /рагапеТег_еуепТз /гоЬоТ_дезсггрТгоп /гозомТ Л? /ТГ_51аТгс гоз2@диуиеЬоте:~$ гоз2 Сорте тпГо --уегЬозе /спд_уе1 Туре: деопеХгу-Пздз/изд/ТнгзТ РиЫгзЬег соипТ: 0 йиЬзсгтрТгоп соипТ: 1 Моде пате: Г05_дг_Ьгтдде Моде патезрасе: / Торге Туре: деотеТгу_т2д5/тзд/Тиг5Т Торге Туре ЬазЬ: Р1Н501_9с45ЬГ161:еО983д80еЗс1:е750д6835843д265а9а6с46Ьд2е6О9ГсдддебГЬ8д2а ЕпдрогпТ Туре: 811В8СК1РТ10М СЮ: 01.ОГ.да.0Ь.2а.03.ГЬ.71.00.00.00.00.00.00.14.04 Ро8 ргоГгТе: йе1гаЬг!гТу: КЕ1_ТАВ1_Е НгзТогу (ОерТЬ>: ОЫКМОЫМ ОигаЬгТгТу: УОЬАПЬЕ ЬгГезрап: 1пГгпгТе ОеадТгпе: 1пГгпгТе ЬгуеИпезз: А0Т0МАТ1С ЬгуеИпезз Теазе дигаТгоп: ТпГгпгТе Рис. 4.15 ❖ Список тем и подробная информация о теме скорости в симуляционной соеде робота
Как видно, дифференциальный контроллер в симуляции СагеЬо подписан на тему ст(1_уе1. Теперь можно запустить узел управления с клавиатуры, как показано на рис. 4.16. При нажатии клавиш 1, к, 1 на клавиатуре узел кла- виатуры будет публиковать соответствующие сообщения темы сшс1_уе1 для управления движением робота, а робот начнет двигаться в СахеЬо. $ гоз2 гип Ге1еор_Щ15Г_кеуЬоаг<1 Ге1еор_М5Г_кгуЬэагс1 Когда робот сталкивается с препятствием в симуляционной среде, СагеЬо в зэви- симости ст физических свойств двух объектов решает отскочит ли робот или будет сдвинуто препятствие. Э’о демонстрирует, что СагеЬо является физической симуля- ционной платформой, приближенной к реальной среде. Наш робот, построенный с нуля с использованием модели ПКЕ’Е, уже может двигаться в Са/еЬо. Далее мы углубимся в симуляцию и визуализацию таких распространенных сенсоров, как КОВ -камера, КСВП-камера и дальномер. ПП го52ф>диуиеНоте: - (Д — _ □ х го52@диуиеЬо(пе:~$ гоз2 гип 1е1еор_1и1з1:_кеуЬоагс1 1:е1.еор_1:н15<:_кеуЬоагд ГЫз поде 1акез кеургеззез {тот кеуЬоагб апд риЫЛзЬез ^Ьет аз 1Ччг5<:/Ты151:51атре(1 теззадез. II: ыогкз Ьез! юЛЬ а 115 кеуЬоагд 1ауои1. Ио71пд агоипд: и 1 о 1 к г т , Еог Но1опот1с тоде (з^гаПпд), с1омп 1Ье зМ.14 кеу: 11 I О □ К 1_ М < > е : ир (+х) э : донп (-х) апу11ппд е1зе : з!ор д/г : гпсгеазе/десгеазе пах зреедз Ьу 10% н/х : т-псгеазе/десгеазе опХу Нпеаг зреед Ьу 10% в/с : хлсгеазе/десгеазе оп!у апдиХаг зреед Ьу 10% Рис. 4.16 ❖ Узел клавиатуры для управления движением робота 4.6,3, Симуляция и визуализация КбВ-камеры КСВ-камера является одним из наиболее часто используемых сенсоров в ро- бототехнике, Подобно модулю дифференциального контроллера, СагеЬо также предоставляет модуль для симуляции КОВ -камеры, который можно подключить к модели ПК1ЭГ.
1. Настройка модуля симуляции Чтобы камеру можно было подключать модульно, был создан отдельный файл модели КСВ-камеры сатега_§а2еЬо_Нагтотс.хасго, в котором опреде- лены макросы камеры. Содержание файла приведено ниже. <?хп! уег51оп="1.9"?> <гоЬоб хт1п5:хасго-[хасго-ссылка на объявление пространства имен, обычно это ссылка на гоь 1чгкт. для хасго] пэпе=:''сгпега'> <хасго:пасго папе="изб_сапега ' рагап5="ргеГтх:-сапега'> <!-- Звено камеры с настройкой внешнего вида, матрицы инерции и модели столкновения. --> <1Лпк папе="${ргеНх]_1лпк' > <гпе1Гта1> <таь5 уа!ие="0.1" /> <огтд1п хуг="0 О 0Ч /> <тпегб1а тхх="0.01" тху-"0.0' Сх2="0.0" Суу="0.01" Су2="0.0" Т,22="0.0Г /> </1пегбта1> <ут.5иа1> <ог1дгп хух=" 0 0 0'' гру="б 0 0" /> <деопебгу> <Ьох 5ие="0.01 0.04 0.04" /> </деопе бгу> <та±егта1 папе="Ыаск"/> </цт5иа1> <со11л5го.п> <оггдгп ху?= 0.0 0.0 0.0" гру="0 0 0" /> <деопе1:гу> ^Ьох 5йе= 0.01 0.04 0.04" /> </деопе17гу> </со1Ат5гоп> </1гпк> <!-- Настройка функциональных параметров подключаемого модуля камеры в Оатеэо. --> <даае1)0 геГегепсе= ${р1 еЧх}_1лпк > <веп5ог буре-’сапега" пане="сапега_пос1е'> <а1иауа_ог1>тгие</а1иау5 _оп> <1дптГ1оп_1:гаге_тб>${рге1:1х}_ипк^/бдпи1оп_1:гапе_тс1> <!-- Система координат сообщения изображения. --> ь ца1 т/оСгиеч/цб виаНге* <Торгс>са1'1ега</Соргс> <!-- Название темы изображения, публикуемой камерой. --> ^ирс!аСе_гаге>10.0</црс1асе_гаСе> <!-- Частота публикации темы изображения. --> <сатега паг,е="${ргеНх}’'> <Ьогг2опСа1_боу^1.396?634</Ьог12опба1_1:о7> <!-- Угол обзора камеры. --> <рове>0 0 0 0 0 0</розе> <бнаде> <!-- Разрешение камеры. --> <|л1г<1б1'1>640</ибс1бй> <Ьетд1тС>489</Ье1д1тС> <бог 1па1:>Р8С8В8</'РоГ|Па±> ^/тпаде>
<с1лр> <!-- Дальность видимости камеры. --> <пеаг>Э.005</пеаг> <баг>20.Ос/баг> </сПр> <погье> <!-- Шум камеры. --> <±уре>дас122т_ап</1:уэе> ^иеап>9.0</теап> <ь1:<1с1е7>0.00 7</з1 с! с!е у> </пот.5е> </сапе(а> </ьеп5ог> </дагеЬо> </хасго:пасго> с/гоЬоо Файл модели ВСВ-камеры состоит из двух основных частей. Первая часть описывает Ппк камеры, где с помощью тега <У18иа1> описывается внешний вид камеры в виде черного прямоугольного параллелепипеда. Вторая часть содержит подробную настройку модуля камеры в СагеЬо. Тег <8еп8от> используется для описания различных свойств сенсора: гуре указывает тип сенсора, пате - имя камеры. С помощью тега <сатега> опи- сываются параметры сенсора, включая разрешение, диапазон изображения, частоту обновления, имя публикуемой темы, опорную систему координат, параметры шума и т. д. 2. Настройка параметров интерфейса Симуляция камеры будет публиковать тему изображения, поэтому необхо- димо добавить соответствующие настройки темы изображения в файл кон- фигурации интерфейса то.<5_$2_Ьпс1§е. Полный код находится в файле го.з_§2_ Ъпс1яе_тЬо1:_сатега.уат1. Настройки, связанные с камерой, приведены ниже. го5_Гор1.с_папе: '7сапега/гпаде_га1«'' дг_Щргс_пане: "/сане'а" го5_Гуре_паие: "ьепзощпьдь/пзд/Щгде" дг_буре_папе: „дг.пздь.Щаде" (ЛгесНоп: Щ_Т0_К0Е гоз_1:ор1с_папе: ''/сапега/сапегаЗлбо' дгЗоргС-Папе: "/сапегаЗпЩ" гоь_гуре_паг1е: "5еп5ог_тьдь/пьд/Саг.егаI|1|:о,' д73уре_паг1е: 'дг.пздь.СапегаТпЩ ЩгесНоп: 62_Т0_К0$ Согласно вышеуказанным настройкам, тема изображения, публикуемая камерой, будет преобразована из /сатега в СагеЬо в /сатетаДтэде гамг в КОЗ. А тема калибровочной информации камеры будет преобразована из /сайт егашГо в СагеЬо в /сатега/сатега тГо в КОЗ.
3. Запуск симуляционной среды Модель настроена, и теперь мы можем проверить, получится ли симулиро вать камеру и отобразить информацию об изображении в К\Й2. Используйте следующую команду для запуска симуляционной среды и загрузки модели робота с установленной камерой. $ ГО52 ТаипсЬ 1еагп1пд_да7еЬо_Ьаглоп1с 1озс1_11|Ьос_сапега_1пто_да7эЬо_1татоп1с.1алпс1т.ру После запуска СагеЬо видно, что модель робота с установленной камерой успешно загружена, как показано на рис. 4.17. Рис. 4.17 ❖ Загрузка и отображение модели робота с КСВ-камеоой в СагеЬо При просмотре модели робота можно заметить черный прямоугольный параллелепипед на шасси робота, который является симулированной КСВ камерой. Может ли она действительно детектировать изображение? Сначала взглянем на список тем в текущей системе, как показано на рис. 4.18. Из информации о темах видно, что камера робота в СагеЬо уже начала публиковать тему изображения. 4. Визуализация данных изображения Теперь используем КАИг для визуализации информации об изображении. Сначала запустите КУ12 с помощью следующей команды. $ ГЭ52 гип гу172 гугг2
ПИ го52фдиуиеНоте:~ О = _ □ х го52@диуиеЬоте:~$ гоз2 1ор1с 1x51: /сатега/сатега-ХП^о /сатега/хтаде_гаи /сХоск / 5охп1:_51:а1:е5 /одот /рагате1ег_еуеп15 I гоЬо1:_де5Сг1р1:хоп /гозоиХ /ХГ /4Г_81а1хс гоз2@дцуиеЬоте:~$ гоз2 Хорхе хпГо --уегЬозе /са1чега/хтаде_гаи Гуре: 5еп5ог_т5д5/ш5д/1таде ’цЫхзЬег соипХ: 1 №де пате: гоз_дг_Ьгхдде 1оде патезрасе: / Горхс Хуре: зепзоГ-Пздз/тзд/Хтаде Горхс Суре ЬазЬ: Р1Н501_<131441а9а4с4Ьс8еае9Ье757Ь0Ьее<13065641:7526с88еа6а45881:Ь9582527с147 ЕпдрохпС Суре: Р11ВИ5НЕК СЮ: 01.0Х.да.0Ь.ЕЬ.03.4€.0с.60.О6.00.00.00.00.1а.03 ?о$ ргоШе: РеСхаЬхСхСу: ЙЕ1.1АВ1Е НхзСогу (ОерСЬ): (ЖМОИМ ОигаЫЛхСу: УОЬАТИЕ ЦхТезрап: 1пПпхСе ОеасЛЛпе: ТпГхпхСе 1_хуе1хпе55: АУТОМАТТС ЦуеТхлезз Хеазе с!игаСхоп: ТпСхпхСе Рис.4.18 ❖ Просмотр списка тем и подробной информации отеме изображения в симуляционной среде робота После успешного запуска в окне ВгзрГау (Отображение) слева нажмите кнопку Айд (Добавить), найдите модуль отображения Гтадс и добавьте его в список модулей. Затем настройте подписку на тему изображения /сатега/ 1та§е_гаи', чтобы показать изображение с камеры робота. В данный момент в симуляционной среде СагеЬо ничего нет, и информация об изображении кажется не слишком полезной. Можно добавить в ОахеЬо несколько базовых кубов, сфер и т. д., как показано на рис. 4.19, - информация об изображении будет синхронно обновляться. Вы также можете исполозовать более легковесный инструмент гдГ для отображения изображений, выполнив следующую команду: гсз2 гип гр! ппаде_У1е\у гц1:_)таде у!е\л/. 4.6А Симуляция и визуализация КСВО-камеры Вам недостаточно КСБ-камеры? Хотите попробовать трехмерную камеру? КСВБ-камеры, такие как КеаЬепзе и КтесГ, способны получать богатые трех- мерные облака точек внешней среды. Хотя КСВР камеры значительно доро же КСВ-камер, благодаря симуляции .мы можем использовать их совершенно бесплатно.
Рис.4.19 ❖ Визуализация изображений с симулированной камеры СагеЬо с помощью РЛ/12 1, Настройка модуля симуляции Чтобы камеру можно было подключать модульно, был создан отдельный файл модели ИСВО камеры г^Ьй^агеЬойагтоп^с.хасго, в котором опреде- лена макрокоманда для камеры. Содержимое файла приведено ниже, <?хп! уег51ол=’1.0"?> <гоЬ(Д хп1.пз:хасго-[хасго-ссылка на объявление пространства имен, обычно это ссылка на гоз кАкт. для хасго] паР1е=''гдЬс1_сапега"> <хасго',пасго лапе="гдЬс1_сапег?'' рэгапо="рге1:гх:=сапега"> <!-- Создание спорной системы координат КСВЬ. --> <!-- Добавление меыа для ВСВО --> <Ипк папе="${ргеЛх}_11пк’> согЬдгп хуг-”0 0 0" гру="0 И 0"/> <У15иа1> <оггдгп хуг="0 0 й" гру="0 0 ${М_Р1/2}"/> <део1лебгу> <Ьсх 5ые="0.15 0.04 0 04" /> </деопебгу> </ут5иа1> <со1.1т.5тол> <деопетгу> <Ьох 5ые='0.07 0.3 0.09"/> </деопег.гу> </соШ$1оп> </Нпк>
папе- ${ргеНх}_орНса 1_]отпб" ^урер‘Нгхес1 > ^ог;дГп хуг="В 0 0" гру="-1.5708 0 -1.5708"/> <рагепТ 1дпк="$(рге€т.х}_Нпк'7> <сМ 1с1 ипк="${ргеНх]_Тгапе_орР1са1 "/> </дотп1а~» <1Лпк па1пе=''${ргеНх}_ГгаР1е_орС1са1.,7> <дагеЬо геге,‘епсе-' ${ргеН.х}_1Лпк"> <зеп5ог пате="гдЬа_сапега" Суре=''гдЬс1_сапега''> <сапега> <Ьогг7ОпГа1._бо7>1.047</1пог12ОгЛа1_1:С7> <гпаде> <1-Лс,г1'1>640^/итсН1п-> <ЬегдЬб>480</Ье1дЬ1:> </гпаде> <с1лр> <пеаг>Э.1</пеаг> <баг>100</баг> </сНр> </саП|ега> <а1алау5_оп>1</а11.иау5_оп> <ирсаСе_гаге>20</ирс1а1:е_га1:е> <7Т5иа11.7е>егие^/е75иа11ге> <Гср1с>гдЬа_сапега</1:ор1с> <епаЬ1е_^ебг1с5>бгие</епаЬ'1е_пе1:г1с5> <тдпШоГ|_<таге_тс1>${рге1\х}_ипк</1дпШоп_1:г апе_тс1> </зеп5ог> </дааеЬо> </хасго:пасго> </гоЬок> Процесс настройки КОВБ-камеры аналогичен процессу настройки КСгВ- камеры. Сначала с помощью элемента Ппк описывается внешний вид камеры. Затем в теге <8епяог> устанавливается тип сенсора г&Мсашега, а параметры в <сашега> аналогичны параметрам КСВ-камеры, включая установку имени темы публикуемых данных и других параметров, таких как система координат. 2. Настройка параметров интерфейса Симуляция камеры будет публиковать темы облака точек и изображений, поэтому необходимо добавить соответствующие настройки в файл конфи- гурации интерфейса гоя ^г Ьггб^е. Полный код находится в файле гоя_§2_ Ьпс1§е_тЬо1:_г§Ьс1.уат1. Настройки для КСЕП-камеры приведены ниже. го5_Гор1.с_папе- "/гдЬс1_сапега/гпаде' дг_Горт.с_папе: "/гдЬс1_сапега/граде" го5_Гуре_папе: "5еп5ог_пьдь/п5д/1паде" дг_Гуре_папе: „дг.пздз.Гпаде (ЦгесНоп: 62_ТО_РО8 гоз_гор1.с_папе- ’7гдЬс1_сапега/сгпега_1п'Го' дг_Гор1с_паР1е: "/гдЬ^сапега/саг.егаЗп^о" го5_Гуре_паР1е: "5еп5сг_п5д5/п5д/Саг1ега1пГо'
д7_Гуре_папе: "д?.пэдэ.СапегаТпГо" сНгесгтоп: С7_Т0_К0$ гр5_1орт.с_па1че: '7гд^^1_саIчега/^ер^:I^_^.гг,аде,| д7_Гор1с_пэпе: "/гдКс1_сапРга/с!эрН1_тмаде" го5_Гуре_папе: "зепаоГ-тьд^/пьд/Тпаде' д7_1уре_папе: „д/.пэдэЛпаде ЛгесИоп: С2_ТО_РО$ гэшортс_папе: "/гдЗфсапега/ротпГз" д7_1ор’.с_папе: "/гдЬс1_сапега/рогпТ:5' го5_гуре_пэР|е: ”5еп5ог_т'>д5/п5д/Ро1пгС1оис12' д2_Гуре_папе: "д?. тзд з. Рот п Шэе с! Ра с кеа" с1ч.1 есМоп: СШ0_К0$ Темы, публикуемые КСВИ камерой, включают множество элементов, та- ких как изображение КСВ-камеры /г^ЬйсатегаДта^е, информация о ка- либровке камеры /г§Ъс!_сатега/сатега тГо, изображение глубины камеры /г^Ьб сатега/берГйфтауе и изображение облака точек камеры /г^Ъбсатега/ рот1з, которые необходимо настроить для преобразования. 3. Запуск симуляционной среды Используйте следующую команду для запуска симуляционной среды и за- грузки модели робота с установленной КСВИ камерой. Результат показан на рис. 4.20. $ ГО52 Таипсп 1еггп1пд_да7еЬо_пагпоп1с 1озс1_111Рос_гдрс1_1п'1о_дагеЬо_1тагпоп1с.1аипс1т.ру
После успешного запуска в текущем списке тем появились связанные с КСЕО-камерой темы, как показано на рис. 4.21. ГП гохгфдиуиеЬоте: ~ О = _ о х го52@диуиеЬоте:~$ гоз2 коргс 1г$к /с!оск /стд_уе! /догпк_5каке5 /одот /рагатекег_еуепкз /гдЬд_сатега/сатега_глГо /гдЬд_сатега/дергЬ_гтаде /гдЬд_сатега/хтаде /гдЬд_сатега/рокпк5 /гоЬок_дезсгкркгоп /гО5О1)к /кГ_зкакгс го52@дцуие1юте: ~$ гоз2 корте гпко --уегЬозе /гдЬд_сагаега/рогпк5 Туре: $еп5ОГ_Р15д5/р)5д/Ро1пкС1оис12 РиЫЛзЬег соипк: 1 Моде пате: го$_дг_Ьгкдде Моде патезрасе: / Торте куре: 5еп5ОГ_тзд5/тзд/РотпкС1оид2 Торте куре ЬазЬ: Р1Н501_9198саЬГ7да3796ае6Ге19с4сЬЗЬдд3525492988с70522628аГ5даа124Ьае2Ь5 Епдротпк куре: РОВИЗНЕР СЮ: 61.0Г.да.0Ь.еЗ.04.28.ГТ.00.00.00.00.00.00.1д.63 ОоБ ргоГтТе: РеТтаЬтТтку: КЕИАВЬЕ Нтзкогу (ОеркЬ): ОМКМОЫМ ЭигаЬтТтку: УО1_АТ11_Е ИГезрап: ГпГтптке ОеадНле: ТпГтптке ЦуеНпезз: А0Т0МАТ1С Рис. 4.21 ❖ Просмотр список тем б симуляционной среде и подробной информации о теме облака точек 4. Визуализация данных облака точек Далее воспользуемся НУ1Х для визуализации информации о трехмерном об- лаке точек. Для этого откройте новое окно терминала для работы с К\Чх и вы- полните следующую команду. $ гоз2 гип г утз2 гу1?2 В КУ12 настройте опорную систему координат Пхед Ргате на ойот. На жмите кнопку Адд и добавьте модуль отображения типа Рот1С1оис12. Из- мените тему подписки модуля на /г§Ъс!_сатега/рот18, после чего появятся данные облака точек, как показано на рис. 4.22. Можно использовать мышь для масштабирования, каждая точка в облаке состоит из позиции хух и цвета КСВ. 4Ж Добавьте модуль отображения 1таде, подписавшись на темы /гдЬс1_сатега/1таде и /гдЬс1_сатега/ро;п15, чтобы также отображать цветные КбВ-изображения и изобра- жения глубины, полученные КСВЛ-камерой.
Рис. 4.22 ❖ Просмотр списка тем и подробной информации о темах облака точек в симуляционной соеде робота 4. 6.5. Симуляция и визуализация лазерного дальномера В приложениях для роботов, таких как 8ЬАМ и навигация, для получения более точной информации об окружающей среде часто используется лазер- ный дальномер в качестве основного сенсора. Вы также можете загрузить лазерный дальномер для симуляционного робота в СахеЬо. 1. Настройка модуля симуляции Чтобы сенсор можно было подключать модульно, был создан отдельный файл .модели лазерного дальномера ПсЬт дагсЬо йагтошс.хасго, в котором содер жится определение макроса лазерного дальномера. Текст макроса приведен ниже. <?хп! уег5топ="1.в"?> <гоЬ(Л хп1.п5:хасго= [хасго-ссылка на объявление пространства имен, сбонно этс ссылка на гоь кЛкт. для хасго] папе=“1а5ег"> <хасго:пасго лаге="'1а5ег_1Лс1аг'' раган5="ргеНх: = 1аьег"> <!-- Создание опорной системы координат лазера. --> <Нпк па1'1е="${ргеПх}_1тпк"> <1пег,Ьта'1> сглазь уа1ие="0.1" /> <огтдтп худ="0 0 0" /> <тпегНа 1хх="0.01" тху-"0.3' 1хг="0.0" т.уу="0.0Г' 1ун="0.0" ыг="0.01' /> </т.пегбта1> <чт5иа1>
<оггд!п хуг-' 0 0 0 " гру-"0 0 0" /> <деопетгу> <суПпбег 1епдбН="0,05" гасНи5="0.05'7> </део!г1ег гу> <па+:егга1 папе="Ыаск'7> </7гьиа1> <со11г5гол> соггдгл хуг="0.0 0.0 0.0” гру="0 0 0" /> <деопебгу> <су1гпСег ЪепдбЬ- 0.06" гасНи5="0.05'7> </деопе!:гу> </со11л5гэп> </Нпк> здагеЬо геГегепсе-' ${ргеПк}_Нпк"> <5еп5ог гуре="дри_Ис1аг паг.е="дри_Ис!аг''> <Рсрт.с>1тс1аг</Рор1.с> <ирс1абе_гаге>10^/ирс1аге_гаге> <г ау> <зсап> <.НоггхопбгТ.> <5апр1ег>360</5анр1е5> <ге5о1и*1оп>1</ гезоТиНог» <пгп_апд 1е>-3.14</пгп_апд1е> <пах_апд!е>3.14</пах_апд1е> </Ьогт2оп*а1> <уегбтса1> <5апр1°5>1</5апр1е5> <ге5о1иГ1оп>0.01</гег.оЫ:тгп> <пгп_апд1е >0<Дпгл_апд1е> <пах_апд1е>0</пах_аг,д1е> </уегНса1> </зсап> <гапда> <пгп>0.08</т1п> <пах>19.0</|лах> <гезо1ибтоп>0.01</ге5с1иб1оп> </гагде> </гау> <а 1иау зОп > 1< / аЪ«а у зОп > <715иа1.г2е>Ргие<Д'’..5иа1л1е> <тдг1Р1эп_1:гапе_1с1>${рге1:1х}_ипк</1рпи1оп_1:г ате_<с1> </зеп5ог> </дахеЬо> </хасго:1часго> </г оЬог> Тип сенсора для лазерного дальномера - §ри_Пс1аг. Для достижения более реалистичного эффекта симуляции необходимо настроить параметры в со- ответствии с фактическими значениями. Параметры дальномера в теге <гау>: угол обзора ЗбО°, 360 точек выборки на один оборот, частота выборки 10 Гц, дальность обнаружения 10 м. Тема лазерного дальномера, публикуемая в СагеЬо, - /П(1эг, которая впо- следствии будет преобразована в зсап.
2. Настройка параметров интерфейса Симуляция лазерного дальномера публикует тему глубины дальномера, по этому необходимо добавить соответствующие настройки в файл конфигура- ции интерфейса го8_Я2_Ьпйяе. Полный код находится в файле го«_§;2_Ьпс1§е_ тЬо1_Пс1аг.уат1. Настройки для лазерного дальномера приведены ниже. гэ5_Тор1С_папе: "/5сап" д7_Гор’.с_паР1е: "/Идаг" го5_Руре_пэпе: "5еп5ог_(пьд5/тзс/ЦагегЗсап' д2_Гуре_папе: „дг.яздз.ГазегЗсап" (НгесНоп: 62_ТО_КЭ5 Тема, публикуемая лазерным дальномером, одна: она преобразуется из /Пбат в СагеЬо в /зсап в КОЗ. 3. Запуск симуляционной среды Выполните следующую команду для запуска симуляционной среды и загруз- ки робота с установленным лазерным дальномером. Результат выполнения показан на рис. 4.23. $ ГО52 1аипс1т 1еаГ|Ппд_да2еЬо_11агпогт1с 1сэс1_поот_и<1аг_Шо_да2е5о_11агпогп.с.1.эи.1с11.ру
После успешного запуска проверьте список тем в текущей системе и убе- дитесь, что модуль симуляции лазерного дальномера запущен, как показано на рис. 4.24. (П го52@>диуиеНоте: ~ О = - □ х гоз2@диуие1юте: ~$ гоб2 Ьоргс /с!оск /стд_уе1 / }о1п1:_5*а1:е5 /одот /рагатеЬег_еуеп*$ /гоЬо4_де5сг1р11оп /гозоиЬ /зсап /1^_51а€гс го52@диуие1юте:~$ го52 Ьоргс гпГо --уегЬозе /зсап Гуре: 5еп5ог_т5д5/т5д/1а5ег8сап РиЫгзЬег соип!: 1 Иоде пате: го$_дг_Ьггдде №де патезрасе: / Торге 1уре: 5еп5ог_п5д5/т5д/1_а5ег*>сап Торге Туре ЬазЬ: Я1Н501_64с191398013аТ96509д518дас71д51б4Г9382553Г:се5с1Т8сса5Ье7924Ьд828 ЕпдрохпТ Туре: РдВЫЗНЕЯ СЮ: 01.0Т.да.9Ь.д0.05.аб.Ьб.00.ОО.60.©0.00.00.1а.93 5о5 ргоШе: КеНаЫЛгТу: КЕИАВЬЕ НгзТогу (ОерТК): ОИКМОИМ ОигаЬШЛу: УОЬАТИЕ ИГезрап; 1пН.п1Те ОеадТгпе: ТпТггпТе ЕгуеХгпезз: А11Т0МАТ1С ЬгуеТгпезз Теане дигаТТоп: ТпТгпгТе ЗиЬзсггрТгоп соипТ: 0 Рис. 4.24 ❖ 11росмотр списка тем в симуляционной среде робота и подробной информации о теме лазерного дальномера 4. Визуализация данных изображения Выполните следующую команду для открытия КУ12 и просмотра данных ла- зерного дальномера. $ гоз2 гип п/и2 гу1г2 В ЯЛ/12 настройте опорную систему координат Пхед Ггате на одот, затем добавьте модуль типа ЬаяегЗсап и измените тему подписки модуля на /зсап, чтобы показать данные дальномера на экране, как показано на рис. 4.25. Теперь модель робота в СагеЬо уже достаточно полноценна. В последу- ющих главах мы реализуем другие разнообразные функции на основе этой симуляционной среды. 4.7. Резюме Симуляция является важным этапом в разработке роботизированных систем. После изучения этой главы вы должны понимать, как создать модель робота
с помощью файла 1Л\ВР, затем оптимизировать эту модель с использованием файла ХАСНО и разместить ее в симуляционной среде СахеЬо, чтобы модель могла «двигаться» и «видеть». Рис. 4.25 ❖ Визуализация данных лазерного дальномера симуляции базеЬо с помощью КУ|г
Глава Создание робота с КО5 2: от симуляции к реальному устройству В главе 4 мы в симуляционной среде создали робота, который может не толь- ко «двигаться», но и «видеть», хотя и в виртуальной среде. В этой главе мы перейдем от симуляции к реальному устройству, с нуля разработаем и соз- дадим интеллектуального робота, чтобы познакомиться с полным циклом проектирования роботов. 5.1. От симуляции к реальному роботу Благодаря симуляции вы уже познакомились с концепцией и составными частями роботов. Как же спроектировать и разработать реального интел- лектуального робота? В этом разделе мы разработаем интеллектуальную тележку. Начнем с четырех основных компонентов робота и проведем анализ конкретного примера. 5.1.1. Анализ конкретного примера В процессе исследования неизвестного объекта одним из способов быст- рого его понимания является глубокий анализ конкретного примера. Здесь возьмем для анализа одного из распространенных роботов в сообществе КОБ - Таг11сВо13, который изображен на рис. 5.1. ТигНсВоГЗ имеет понятную иерархическую структуру, и каждый компонент хорошо виден. Изучая его в качестве примера, можно получить множество идей для изучения и про- ектирования роботов.
Лазерный дальномер 360° (для 81_АМ-картографирования и навигации) Масштабируемая конструкция Вычислительная плата (здесь - НазрЬеггу Р| 4В) Плата управления приводами (здесь - ОрепСК) Дифференциальная двухколесная конструкция Колеса и шарниры Аккумулятор Рис. 5.1 ❖ Структура робота ТигНеВоСЗ Проанализируем четыре основных компонента робота ТигПеВоГЗ. 1. Исполнительные механизмы ТигНеВо13 использует перфорированную плату в качестве основы конструк- ции. На нижнем уровне установлены основные исполнительные механизмы робота - два двигателя, выходные валы которых соединены с колесами, что позволяет роботу двига гься. 2. Приводная система Двигатели робота вращаются, получая команды, в этом процессе участвует приводная система. Основная ее задача в ТигНеВо13 - контролировать вра- щение двух колес с заданной скоростью, что реализуется с помощью платы управления ОрепСК (Ореп СопГгоНег). ОрепСК - это микроконтроллер (или встраиваемая система), который выводит сигналы на двигатель через алго ритмы управления, заставляя его вращаться. Кроме того, ОрепСК отвечает за управление питанием всего робота и управление некоторыми сенсорами. 3. Система сенсоров Внутренние сенсоры ТпгНеВоГЗ включают в себя энкодеры на обоих двигате- лях, которые могут в реальном времени передавать информацию о скорости вращения двигателя. Датчик 1МП на плате управления ОрепСК позволяет получать информацию об ускорении и угловой скорости. Внешние сенсоры включают в себя лазерный дальномер, который .может получать информацию
о глубине окружающих препятствий, и устанавливаемую отдельно камеру, позволяющую роботу видеть окружающую среду. 4. Система управления Где же обрабатывается весь этот объем информации? Правильно, в «мозге» робота - системе управления. В ТиН1еВо13 в качестве аппаратной основы си- стемы управления используется КазрЬеггу Р1, а все программное обеспечение разрабатывается в среде КОВ, что позволяет реализовать такие функции, как построение карт с использованием ВЬАМ, автономная навигация и распо- знавание объектов. Проанализировав структуру ТигПеВоШ, можно получить общее представ- ление о структуре и проектировании роботов, таких как интеллектуальная тележка. 5.1.2. Проектирование робота Опираясь на структуру робота Тиг11еВо13, мы можем спроектировать соб- ственную интеллектуальную тележку, которая изображена на рис. 5.2, Рис. 5.2 ❖ Проектирование собственной интеллектуальной тележки Шасси робота служит основой для установки различных компонентов, его можно изготовить из металлических деталей или с помощью ЗБ-печати. Под шасси устанавливаются исполнительные механизмы - моторы, которые при- водят в движение колеса робота. Для поддержания равновесия в движении под шасси также устанавливается всенаправленное колесо. Таким образом, у робота появляются «тело» и «ноги», обеспечивающие базовые двигатель- ные способности.
Но для того, чтобы робот начал двигаться, одних «ног» недостаточно, не- обходимы также «мышцы» - это батарея и контроллер движения, установ- ленные на шасси, то есть система привода, как показано на рис. 5.3. Эта часть должна быть разработана в соответствии с функциональными требованиями робота и представлять собой встроенную систему, аналогичную контроллеру ОрепСК от ТигНеВоГЗ. Для создания «мозга» робота в качестве аппаратной платформы можно использовать НЭК, КазрЬеггу Р1 или даже персональный компьютер, а для разработки программного обеспечения прекрасно подходит КОЗ. Итак, у нас есть тело, мышцы и мозг, но по-прежнему чего-то не хватает. Верно, это система сенсоров. Робот должен не только воспринимать цветовую информацию из внешней среды, но и определять расстояние до препятствий. Мы будем использовать камеру и лазерный дальномер в качестве внешних сенсоров. Кроме того, на моторах установлены энкодеры для получения дан- ных о скорости вращения колес, что позволяет вычислять положение робота. Контроллер движения также оснащен датчиком положения 1МЕ, который на основе данных об ускорении и угловой скорости повышает стабильность позиционирования робота. Таким образом, цель становится все более ясной: создать такую интел- лектуальную тележку. В нашей книге этот робот получит название Оп^шВсй, символизирующее «первую мечту». Рис. 5.3 ❖ Структура интеллектуальной тележки Ог'д1пБо1 - это открытый проект, асе связанные с ним программные и аппаратные оесурсы находятся в открытом доступе, что позволяет каждому выполнить разработку робота с нуля. Более подробную информацию можно найти на официальном сайте Опд । пБоС
5,13. Проектирование программной архитектуры Контроллер движения является ядром приводной системы и отвечает за управление моторами и другие низкоуровневые функции Прикладной про- цессор - это ядро системы управления, отвечающее за обработку алгоритмов приложений. Оба компонента требуют значительных усилий по программи- рованию. Какова же связь между этими программами? Давайте сначала рас- смотрим общую программную структуру интеллектуального робота Оп§ш- Во1, которая изображена на рис. 5.4. Рис. 5.4 ❖ Программная архитектура интеллектуальной тележки Опд1пВсЛ 1. Контроллер движения Приводная система создается на базе микроконтроллера (МСП) и в соче- тании с периферийными схемами образует плату контроллера движения, которая отвечает за управление моторами, управление питанием, расти рение сенсоров и низкоуровневое взаимодействие с человеком. Реализация всех этих функций относится к области разработки встраиваемых систем и включает в себя принципы и реализацию таких понятий, как таймеры, ШИМ-регуляторы, ПИД-регуляторы и т.д., а также взаимодействие с внешни- ми устройствами через интерфейсы ввода-вывода (1/0), последовательный порт, 12С, 8Р1 и другие. 2. Система управления Система управления создается на базе системы на кристалле (8оС), она пре- доставляет вычислительные ресурсы в виде платы прикладного процессора
и выполняет функции автономной навигации, построения карт, распознана ния изображений и др. Она также выполняет некоторые задачи, связанные с управлением сенсорами, например сбор информации с внешних камер и дальномеров через ИЗВ, Передача данных между управляющей и привод- ной системами осуществляется через последовательный порт, а для обес- печения высокого качества связи необходимо разработать специальный коммуникационный протокол. 3. Удаленный мониторинг с компьютера У робота отсутствуют клавиатура, мышь и экран, поэтому для удобства управ ления роботом, а также для подключения к роботу с целью написания кода и выполнения мониторинга необходимо использовать собственный компью- тер. С помощью распределенной коммуникационной системы КОЗ 2 можно быстро реализовать передачу данных между различными узлами. В этом, на первый взгляд сложном программном архитектурном реше- нии функции в пунктирной рамке реализуются на основе КОЗ 2, а функции в контроллере движения реализуются на основе разработки встраиваемых систем. Каждый компонент выполняет свою задачу: одни ориентированы на приложения верхнего уровня, другие - на низкоуровневое управление. А в совокупности они реализуют все функции робота. ДК Для разработки встраиваемых систем также можно использовать Мюго-КОЗ, метод работы в котором схож с КОЗ 2. 5.1.4. Настройка среды разработки на компьютере Изучив общую программную архитектуру интеллектуальной тележки, мы обнаружили, что помимо контроллера движения и системы управления, ком- пьютеров и коммуникационных протоколов низкого и высокого уровня важ- ную роль играет удаленный мониторинг с нашего персонального компьютера. Процесс разработки робота Оп§тВо1 почти полностью осуществляется на компьютере. Необходимо скачать и скомпилировать функциональные пакеты для компьютерной части Оп§1пВо1:, чтобы облегчить последующие операции. 1. Загрузка пакетов функций оп§1пЪо1_дезк1ор Е рабочем пространстве системы ЦЬцпШ на компьютере загрузите функцио- нальные пакеты для компьютерной части Оп§1пВо1. $ сс! ~/с1еу_и5/5ГС $ дП сТопе [Ссылка на исходный код, прилагаемый к книге.] После загрузки установочного пакета в каталоге появятся соответствующие пакеты функций, как показано на рис. 5.5.
1+1 го52@диуиеЬоте: ~/деу_\*5/5гс/ог!д1пЬо1:_с!е5к1:ор О = _ □ х го52@диуиеЬоте:~/деу_ы5/5гс/оггдгпЬо1_с1е5к1ор$ 1з гтадез тапиаТз оггдгпЬо!_дето оггдгпЬо1_да2еЬо_Гог1гезз оггдгпЬо1_паугдаМоп гпз1а11_ргегед.зЬ оггдтпЬо1_арр оггдгпЬо1_<1е$сг1р1гоп огт.дхпЬо1_да2еЬо_Ьагтопт.с оггдгпЬо1_У12 ЫСЕМ5Е оггдгпЬо1<1еер1еагпгпд оггдгпЬо!дагеЬо оггдгпЬо1 п15д5 РЕАОМЕ.пс! Рис. 5.5 ♦> Пакеты функций опд1пЬоТ_с1е5к1:ор 2. Установка зависимостей пакетов функций Для целей последующей разработки необходимо установить ряд пакетов функ- ций и библиотек зависимостей. Процесс их установки показан на рис. 5.6. $ сб -/с1еу_иЕ/5гс/ог1д1пЬо'(:_с1е5кТ:ор $ ./1пзТа11_ргегед.511 гоз2@диуиеЬопе: ~/<1еу_и5/8гс/ог1д1пЬоГ_(1е5к1ор$ . /1п81а11_ргегед. зй [зидо] раззногд €ог гоз2: Се!: 1 * Липа.1:51.пдНоа.ебц.сп/го52/иЬип1:и поЫе ХпКеХеазе [4,667 В] НИ:2 г т тв. 1151с.еби.сп/иЬипФи поЫе 1пКе1еазе Се1:3 .из1с.ес1и.сп/иЬип1и поЫе-ирдаСез 1пКе1еазе [126 кВ] Се1:4 ж .из1с.ес1и.сп/иЬип1и поЫе-ЬаскрогСз 1пРе1еазе [126 кВ] Се1:5""в .1ипа.151пдЬиа.ебо.сп/го52/иЬип1:и поЫе/пагп атс164 Раскадез [922 кВ] Се1:6 • .из1с.еби.сп/иЬип1и поЫе-зесигПу ТпКеХеазе [126 кВ] Се1:7 ^^м ^и.иЬип1и.соп/иЬипСи поЫе-зесигПу 1пРе1еазе [126 кВ] НИ:8 иЬип1и.сот/иЬип1и поЫе ГпКеТеазе Се1:9 1 - .изН.еби.сп/иЬипФи поЫе-ирс!а1ез/та1п атб64 Раскадез [317 кВ] Се1:10 ри овн ™^.изТс.ес1и.сп/иЬип1и поЫе ирбаОез/патп ТгапзТаИоп-еп [82.7 кВ] Се1:11 11 .иЬип!и. сот/чЬипОи поЫе-ирс1а1ез 1пЯе1еазе [126 кВ] Се1:12 Им - .озФс.ебо.сп/оЬогНи поЫе-ирда^ез/шагп апк!64 с-п-Г Ме1ас1а1:а [5,640 В] Се1:13 ' .из1с.еди.сп/иЬип1и поЫе-ир(1а1е5/ге81г1с1ес] атд64 Раскадез [208 кВ] Се1:14 »-® "".изФс.еди.сп/иЬипСи поЫ.е-ир<1а1е5/ге81гт.с1ес1 ТгапзХаИоп-еп [40.7 кВ] Се1:15 ммн т_ ™.из1с.еди.сп/иЬип1и поЫе-ирс1а1е5/ип1.уег8е атд64 Раскадез [318 кВ] Се1:16 Им 1.изФс.ебо.сп/иЬопСи поЫе-ирйаНз/ипгуегзе ТгапзХаИол-еп [133 кВ] Се1:17 .из!с.еби.сп/иЬоп!и поЫе-ирда1ез/ипПегзе апк164 с-п-Г Ме1ада1а [12.5 кВ] Се1:18 "ПР" из1с.ебо.сп/иЬоп!и поЫе-ЬаскроНз/цпгуегзе а(пдб4 Раскадез [10.3 кВ] Се1:19 ммми м »и.из1с.еби.сп/иЬоп1и поЫе-ЬаскрогФз/иптуегзе апк!64 с-п-Г Ме1ат1а1а [1,016 В] Се!:20 . .из1с.еди.сп/иЬип1:и поЫе-зесигИу/латп апс164 Раскадез [265 кВ] Се1:21 .из!с.ес1и.сп/иЬип1и поЫе-зесигИу/татп Тгапз1аНоп-еп [63.1 кВ] Се1:22 »'.из1с.еби.сп/иЬип1и поЫе-зесигНу/татп апд64 с-п-Г Ме1ас1а1а [3,632 В] Се1:23 ^ш.изФс.еби.сп/иЬип1и поЬ1е-зесигИу/гез1гтс1ес1 агс164 Раскадез [208 кВ] Се1:24 Нм .из!с.ес1и.сп/иЬип1и поЫе-5есигНу/гез1гт.с1ес1 ТгапзТаНоп-еп [40.7 кВ] Се1:25 в ™ ' .из!с.ес1и.сп/иЬип1и поЫе-зесигИу/ипгуегзе атд64 Раскадез [246 кВ] Се1:26 __Я1^гн1.из1с.ес1и.сп/иЬип1и поЫе зесигИу/иптуегзе ТгапзХаИоп еп Г106 кВ1 Рис. 5.6 ❖ Установка зависимостей пакетов функций спд!пЬоГ_с1е5кГор 3. Компиляция рабочего пространства Затем вернитесь в корневой каталог рабочего пространства и скомпилируйте его полностью. $ с<5 ~/с1е7_1л/5 $ со!соп ЬиПс! 4. Настройка переменных окружения Теперь настройте переменные окружения, чтобы система знала расположе- ние рабочего пространства. $ есЬо "~/с!е\/_и5/Гп51а1',./5е!:.ир.51т1' » -/.ЬазЬгс На этом настройка среды разработки для компьютерной части Оп&тВо! завершена.
5,1,5. Тестирование симуляции робота Чтобы проверить правильность настройки среды разработки на компьютере, запустим симуляцию в СагсЬо, выполнив следующую команду: $ го$2 ТаипсЬ оггдзпЬо1:_да2еЬо_Ьагпоп1с 1оас1_оггд1пЬоС_Шо_да1еЬо.1.аипсЬ.ру После успешного запуска упрощенная модель Оп^тВо! появится в СагсЬо, как показано на рис. 5.7. Рис. 5.7 ❖ Загрузка упрошенной модели ОпдтВст в среду моделирования Сагеоо 5.2. Проектирование приводной системы: робот начинает двигаться Образ умной тележки Оп§1пВо1 уже начал формироваться в вашем вообра- жении, и теперь мы шаг за шагом превратим ее в полноценного робота. В ос- нове приводной системы лежит одно слово - движение! На первый взгляд, кажется простой задачей, но это включает в себя множество классических аспектов разработки роботов. Мы постепенно научим ее двигаться, двигать- ся точно и устойчиво.
5, 2.1. Принцип работы привода двигателя: от ШИМ-регулятора до Н-моста За счет чего двигается робот? Основным компонентом, обеспечивающим движение, является двигатель, как показано на рис. 5.8. Возможно, вы играли с чстырехколссными машинками в детстве. Чтобы машинка ехала быстрее, нужно усилить двигатель В свое время автор этой книги неоднократно тра- тил значительные суммы на покупку более мощных двигателей для своих четырехколесных машинок, и прирост скорости был весьма заметным. Рис. 5.8 ❖ Двигатель в четырехколесной машинке На большинстве распространенных двигателей на рынке есть два металли- ческих контакта: «плюс» и «минус». Достаточно подключить к ним соответ- ствующие полюса аккумулятора, чтобы создать простую схему управления двигателем: ток выходит из положительного полюса аккумулятора, проходит через обмотку двигателя и под воздействием магнитного поля вызывает движение, возвращаясь к отрицательному полюсу. Когда аккумулятор подает высокие напряжение и ток, двигатель вращается быстро. Когда напряжение и ток низки, скорость вращения уменьшается. Для четырехколесной машинки, которую нужно разогнать как можно быстрее, скорость двигателя напрямую зависит от мощности, подаваемой аккумуля- тором. Однако у робота скорость движения может варьироваться, и поэтому возникает естественный вопрос: если можно контролировать напряжение и ток на клеммах двигателя, то можно ли управлять его скоростью? Здесь на помощь приходят встраиваемые системы, а именно программирование микроконтроллера для управления напряжением, подаваемым на двигатель, что позволяет регулировать его скорость. Наиболее часто используемой тех- нологией в этом контексте является широтно- импульсная модуляция (ШИМ).
ШИМ - это метод цифрового кодирования уровня аналогового сигнала, который использует счетчик высокого разрешения для модуляции прямо- угольной волны с определенным коэффициентом заполнения, как показано на рис. 5.9, Коэффициент заполнения 25 % Коэффициент заполнения 50 % Коэффициент заполнения 75 % Рис. 5.9 ❖ Способ кодирования уровня ШИМ Проще говоря, если у вас есть лампочка мощностью 10 Вт, которая горит полчаса в рамках одного часа, то в макроскопическом плане ее мощность за этот час составит 5 Вт, что эквивалентно снижению входного напряжения. Аналогично, изменяя продолжительность свечения лампочки в течение этого часа, .можно достичь эквивалентного изменения входного напряже ния. Если продолжать сокращать этот час до очень маленьких временных отрезков, то включение и выключение питания может выражать изме- нение напряжения, а этот очень короткий временной интервал является обратной величиной частоты ШИМ. Процент времени, в течение которого лампочка горит в этом коротком интервале, называется коэффициентом заполнения. ДК Хотя технология ШИМ стремится имитировать аналоговый сигнал, по своей сути он остается цифровым, так как в любой момент времени вызод может быть либо на высоком, либо на низком уровне. С помощью ШИМ цифровые схемы могут создавать эффект аналогового сигнала, что позволяет осуществлять плавное управление, например, ско- ростью двигателя или яркостью экрана. Одной из ключевых функций платы управления движением Оп§тВоГ яв ляется генерация сигналов ШИМ, что позволяет управлять вращением двух двигателей и достигать желаемой скорости движения робота. На схеме платы управления движением можно найти четыре канала сигналов ШИМЕ ШИМ4, выводимых микроконтроллером, как показано на рис. 5.10.
3\’3|- РУ.М1 РУЛ12 РУЛИ КЕ5ЕТ СЕР О8С 1141 О8С ОЫ 1 О8С 1192 ОМ> ОьС О1ГГ2 8 1<| 12 УВлТ РС13 РС14 РС15 О8С1Д О8СОПГ МК5Г У88А УООА РАО РА1 РЛ2 'СЫО Об 51М32Г103С8Т6 и □ С\Р'|| ЗУЗ УЭ1> 2 У85 2 8\УЮ РЛ12 РАН РАЮ РА9 РА8 РВ15 РВ14 РВ13 РВ12 16__________ 35__________ 11 8Ц Т>11 33____ 32__________ И РАЮ 10 РЛЧ 29____ 28___ 27___ 26 11Ц7ЛСГ 25 |зуз ®о О § Рис. 5.10 ❖ Четыре канала сигналов ШИМ, выводимых микроконтроллером У ОгцДпВо! всего два двигателя, почему же требуется четыре канала ШИМ? Это приводит нас к следующему вопросу: один канал ШИМ действительно может управлять движением двигателя, но робот должен двигаться не только вперед, но и назад. Двигатель должен вращаться не только в прямом направ лении, но и в обратном. Для обратного вращения необходимо изменить по- лярность подключения двигателя. Как реализовать это переключение? Здесь используется классическая схема управления двигателем постоянного тока с помощью Н-моста. Н-мост - это типичная схема управления двигателем постоянного тока, получившая свое название из-за формы, напоминающей букву Н. Четыре переключателя образуют четыре вертикальные линии буквы Н, а двигатель представляет собой горизонтальную перекладину. Принцип работы Н-мосга несложен: когда замкнуты только ключи 01 и 04, положительный полюс двигателя слева, отрицательный справа, а двигатель вращается в прямом направлении; когда замкнуты только 03 и 02, положительный полюс справа, отрицательный слева, а двигатель вращается в обратном направлении, как показано на рис. 5.11. Таким образом, можно осуществить прямое и обратное
вращения двигателя, а с помощью соответствующих сигналов ШИМ можно контролировать скорость вращения. Рис. 5.11 ❖ Принцип управления прямым и обратным вращениями двигателя постоянного тока с помощью Н-моста При реализации схемы Н моста можно использовать интегральные мик- росхемы, например драйвер АТ8236, принцип работы которого показан на рис. 5.12. Контроллер движения Оп^шВоТ использует эту микросхему: не- сколько каналов сигналов ШИМ, выводимых микроконтроллером, подаются на выводы 1М1 и Ш2, как показано на рис. 5.13. Изменяя сигналы-ШИМ, можно управлять прямым и обратным вращениями двигателя, а также его скоростью. с.нэВВ 1М2Ц 141 КЯ УВЕ1 О 6НО (РРАО) АТ8236 Иоитг В15ЕМ КИ-ЩТ1 И ЦМ Таблица функциональной логики 1М1 1Ы2 Функция ШИМ 0 Прямое вращение ШИМ, быстрое затухание 1 ШИМ Прямое вращение ШИМ, медленное затухание 0 ШИМ Обратное вращение ШИМ, быстрое затухание ШИМ 1 Обратное вращение ШИМ, медленное затухание
Электродвигатель РЗУМ2 К-131 121К Ц- •Омп Р\УМ1 ВВ1К ЗУЗ №2 ЕЧ1 УКВ? ОГГГ2 I8Е^ О1Л1 УМ 8 Л02 7 о ас; 5 \'М 2 _____ К5 6.5К СП а., Ь ст М1 1 Г^Р 2 ХНА 3 М1В 4 ЗУЗ 4 301 ... ^04 РН2.0-6Р Ю4Р 104Р 104Р 104Р АТ8236 М2 НЗЫР 2М2А ЗМ2В 433 3 5 во1 6воз . РН2.0-6Р С1б 104Г Назначение конденсатора: снижает скачки напряжения генерируемые двигателем 2 2 4 Рис. 5.15 ❖ Схема управления Н носом в контроллере движения СпдтВо! Размер и вес робота могут различаться, поэтому при разработке необхо- димо учитывать не только скорость вращения двигателя, но и его крутящий момент, то есть способность двигателя приводить в движение различные гру- зы. Например, используемые нами двигатели постоянного тока обладают вы- сокой скоростью вращения, но при прямом подключении к колесам их ско- рость трудно контролировать, а крутящий момент ограничен. В этом случае требуется дополнительный инструмент - редуктор. Как следует из названия, редуктор представляет собой комплект шестерен, добавляемый к обычному двигателю постоянного тока, который обеспечивает более низкую скорость вращения и больший крутящий момент, как показано на рис. 5.14. Различ- ные передаточные числа редуктора позволяют получать различные скорости и крутящие моменты. Рис. 5.14 ❖ Редуктор для двигателя постоянного тока
ЛЬ Выше мы попытались объясните основные принципы и процессы управления двига -ел ем простым и понятным языком.Для получения более подробной теоретической информации и деталей о методах управления рекомендуем обратиться к специали- зированным источникам. 5. 2.2. Программирование управления прямым и обратным вращениями двигателя Управление с использованием Н-моста реализуется с помощью схемы, а для управления прямым и обратным вращениями двигателя ключевым является управление сигналами ШИМ микроконтроллера. Для реализации такой функции в нашем роботе Оп&тВоГ необходимо раз- работать встроенную систему в контроллере движения, чтобы генерировать сигналы ШИМ с различными коэффициентами заполнения. Как правило, можно использовать режим ШИМ, предоставляемый тай- мером микроконтроллера. Для настройки частоты выхода таймера исполь- зуется регистр автоматической перезагрузки (Т1Мх_АКК), а для установки рабочего цикла - регистр захвага/сравнения (Т1Мх_ССКх). Хотя у таймера имеется только один регистр автоматической перезагрузки, регистр захвата/ сравнения имеет 4 канала (Т1Мх_ССК1, Т1Мх_ССК2, Т1Мх_ССКЗ, Т1Мх_ССК4). Поэтому при использовании таймера для вывода сигнала ШИМ частота на всех 4 каналах будет одинаковой, однако рабочий цикл каждого канала мож- но настроить независимо. Достаточно установить значения регистров срав- нения Т1Мх_ССК1, Т1Мх_ССК2, Т1Мх_ССКЗ, Т1Мх_ССД4, чтобы контролиро- вать выходной сигнал с различными рабочими циклами. Ниже приведены ключевые фрагменты кода для реализации описанных выше шагов. 1. Инициализация ШИМ для двигателя // Инициализация выводов двигатегя. Ц Инициализация ШИМ двигателя. чотс! МоГсг_Р1л'М_1пгГ(и16 агг, и16 рзс) Т1М_Т1г1еВа5е1лгЫуре0еГ ПМ/Г’-пеВазеббгисбцге; ЛМ-ОСТпШуреОеГ Т1М_ОС1п1С5СгисГиг е; КСС_АРВ1Регтр!1С1сскСпс1(РСС_АРВ1₽ег1рЬ_Т1М2, ЕМАВЬЕ); // Сброс таймера в состояние по умолчанию. Т1М_Эе1пИ(Т1М2); // Установка величины переполнения счетчика, генерация события обновления каждые ххх отсчетов. Т1М_ПпеВа5е81:гисбиге.Т1М_Реггэд = агг - 1 ; // Коэффициент предделителя равен 0, то есть предделение не выполняется, частота таймера равна Ц 72 МГц.
Т1М_Т1пеВавеЗЕ:гисСиге.Т1М_Рге5са1ег = рве; Ц Установка коэффициента деления тактовой частоты: без деления. Т1М_Т1пеВа5е5бгисбиге.Т1М_С1оскСт.у151оп = Т1М_СК0_С1У1 ; // Режим счета вверх. Т1М_Т1пеВаве5ЕгисСиге.Т1М_СоипЕегМос1е - Т1М_СоипбегМос1е_11р; Т1М_Т1Р1еВа5е1птЕ(Т1М2, (ШМ_Тт.пеВа5еЗСГ1к1:иге); Ц Установка значений по умолчанию. Т1М_0СЗтгисб1пгцШМ_0С1пгг$ггчсгиге); // Конфигурация в режим ШИМ 1. Т1М_ОС1п1г$бгисгиге.Т1Н_ОСГ1ос!е = Т1М_ОСМос1е_РНМ1; Ц Разрешение вывода сравнения. Т1М_0С1п1б5бгисгиге.Т1М_0абриб5баге = Т1М_Оибриг5басе_Епао1е; // Установка значения переключения, при достижении которого изменяется уровень сигнала. Т1М_ОС1п1б5бгисбиге.Т1М_Ри15е - 0; Ц Низкий уровень, когда значение счетчика меньше значения переключения. Т1М_ОС1п1т5бгисгиге.Т1М_ОСРо1агггу = Т1М_0СРо1агиу_Ьои; Т1М_0С11пи(Т1М2, &Т1М_0С1пи$1:гисЕ:иге); // Разрешение канала 1. Т1М_0С1Рге1оа^СопНд(Т1М2, Т1М_0СРге1оас1_Епар1е); // Конфигурация в режим ШИМ 1. Т1М_ОС1п1г5Егисбиге.Т1М_ОСМос|е -- Т1М_ССМосе_РИЧ1; Ц Разрешение вывода сравнения. Т1М_ОС1п1Е$Егис+:иге.Т1М_ОиЕриЕ5гаЕе = Т1М_0исриЕ5басе_Епаэ1.е; // Установка значения переключения, при достижении которого изменяется уровень сигнала. Т1М_0С1птЛЕЕгис+:иге.Т1М_Ри1.5е = 0; // Низкий уровень, кеда значение счетчика меньше значения переключения. Т1М_ОС1п1Г$Егис+:иге.Т1М_ОСРо1аггбу = Т1М_ОСРо1аггбу_Еоч; // Разрешение канала 2. Т1М_ОС21п1Е(Т1М2, &Т1М_0С1пгс5Егисбиге); Т1М_0С2Рге'1оаоСопНд(Т1М2, Т1М_0СРге1оа11_ЕпаЫ.е); // Конфигурация в режим ШИМ 1. Т1М_ОС1птЛ5Егис1:еге.Т1М_ОСМос!е = Т1М_ОСМо<1е_РЫМ1; // Разрешение вывода сравнения. ПМ^ОСЕптКбгис^иге.ИМОибрибЗЕабе = Т1М_0иРри1:$1:аГе_ЕпаЫе; Ц Установка значения переключения, при достижении которого изменяется уровень сигнала. Т1М_0С1птЛ5Егес1:иге.Т1М_Ри'15е = 0; // Низкий уровень, когда значение счетчика меньше значения переключения. Т1М_ОС1пЕИбгис111ге.Т1М_ОСРо'1ап.бу = ТХМ-ОСРоТ.аггЕу-Ео'л'; // Разрешение канала 3. Т1М_ОСЗТпи(Т1М2, &Т1М_ОС1п1Е$1гисбиге); Т1М_ОСЗРге1оаоСопбтд(Т1М2, Т1М_0СРге1саа_ЕпаЫ.е); // Конфигурация в режим ШИМ 1. Т1М_ОС1п1Е5ЕгисЕиге.Т1М_ОГМос!е = Т1М_ОСМоое_РИМ1; // Разрешение вывода сравнения. Т1М_ОС1п1б5ЕгисЕиге.Т1М_ОибриЕ5Еа1-е = Т1М_0исриЕ5Сасе_ЕпаЫе; // Установка значения переключения, при достижении которого изменяется уровень сигнала. Т1М_0С1пШбгисбиге.Т1М_Ри1.5е - 0; // Низкий уровень, когда значение счетчика меньше значения переключения.
ПМ_0С1пи8РгисРиге.Т1М_0СРо1.аггРу - Т1М_ОСРо1аггЕу_Ео1»; Ц Разрешение канала 4. Т1М_0С41птЛ(Т1М2, &Т1М_ОС1пгЕ5ЕгисЕиге); Т1М_0С4Р| е1оас!СопЕтд(Т1М2, Т1М_11СРге1оа(1_Е.паЫе); Ц Разрешение регистра автоперезагрузки АРР таймера 3. ЛМ.АРРРг е!оасКбпЕтд(Т1М2, Е№В1_Е); // Разрешение таймера 2. Т1М_Спс!(Т1М2, Е1МАВ1.Е); } 2. Настройка делителя частоты ШИМ Ц Установка скорости двигателя, зреес!: +3ь00, 6 - остановка. уоЕЬ МоЕог_5еЕ_Рир(и8 тс!, тпЕ зреес!) { // Ограничение входного значения. тЕ (зреес! > И0ТСР_МАХ_РиЕ5Е) зреес = МОТОР_МАХ_РиЬ5Е; тЕ (зреес! < -М0Т0К.МАХ.Р1Л5Е) зреес! = -МОТОР_МАХ_Р1И$Е; зиЕСсЬ (ЕС) { сазе МОТОР_Ю_1: МоЕо г_г11_рт (зреес!); Ьгеак; сазе М0Т0Р_Ю_2: МоЕог_п2_р|л1п(зреес!); Ьгеак; йеЕаиЦ: Ьгеак; } } Уосе! МоЕог_п1_р1л'п(ЕЕоаЕ зреес) { тЕ (зрееЬ >= 6) { РИ1 = 0; РИМ2 = зреес!/1.5, } еЕзе { РЧМ1 = пуаЬз( зреес!)/1.5; РНН2 = 0; } } уот.с1 МоЕог_п2_рип(ЕЬоаЕ зреес!) тЕ (зреес! >= 0) [ РИЗ = зреес!/1.5; РН,44 = 0; } еЕзе {
РИНЗ = 0; РНМ4 = пуао5(ьреес!)/1.5; } } 3. Вызов интерфейса для управления ШИМ из основной функции уотС Мо1:гоп_8ег_Р1л1М(1п1: но1:ог_кеЕг, гп1: тоГог_Ргд111:) { Мо1ог_5ек _Ркт(’'10Т0К_1С_1, тРоГ-кеИ); Моког_$ек_РпР|(М0ТЭК_1С_2, рюРог ЩдМ); } После реализации вышеуказанной программы управления двигателем можно использовать следующий код, чтобы двигать робота Оп^1пВо1 вперед, назад и поворачивать влево, вправо. уссй 5У5кеп_1пИ^о1с1) { 5у5Т1ск_сп1У(72, 10); к1АРТЗ_1пП(9600); иАРТ1_1пП(115200); Зу901_1пт.г(); Ое1ау_Мь(1000); Ое1гу_Мз(1000); Абс_1пгЦ); 0Р10_СопРсд(); М0Т0К_СР10_1пИ(); Моког_РИМ_1пгР(МОТОК_МАХ_Рк1к5Е, ЧОТОР._РКЕ0_О1УЮЕ); Епсобег_1пИ(); Т1М1_1пт.1(); РЮ_1пП(); Ое1ау_М'>(10О0); } гпк: гатп(уогс1) { 5у5Тет_1пП(); Ц Демонстрация движения робота. ипт!е(1) { // Движение вперед. ргспИ(’^оугпд ЕогиагсЦп'); МоНоп_5е1:_РйМ(500, 500); Ое1эу_Мв(2000); // Остановка. ргспПЦ" 51орргпд\п");
Мос1оп_5ек_РНМ(0, э); Пе1ау_М5('1000); // Движение назад. рг 1пК("Моугпд Ьаскиагс1\п"); МоПоп_5еГ_РНМ(-5О0, -500); Се1ау_М5(2000); // Остановка. ргт.п11б(" 5борргпд\п"); МоНоп_5еГ_РНМ(0, 0); Се1ау_М5( 1000 ц // Поворот влево. ргт.п1:б("Тигпгпд 1еН\п"); МоТтоп_5е1:_РНМ(-Зе0, 300); 0е1ау_Мь(1000); // Остановка. ргтпбб("5борргпд\п"); МоНоп_5^1_РНМ(0, 0); 0е1ау_Мь(1000); // Поворот зправо. ргтпбГС'Тигагпд г1уЫ:\п"); МоПоп_5еГ_РНМ(300, -300); Ье1ау_Мь(1000); // Остановка. ргЧпЩ"51орргпд\п"); Мо1лоп_$е1_РЫМ(0, 0); 0е1ау_М5(2000); // Конец цикла, подготовка к перезапуску. рг тлКС'Оерю сус!е сопр1екес1. Кеьбггбтпд...\п\п''); } } В приведенном коде путем установки значений тоРогЬей и то1ог_К1§111: в функции МоНоп_8е1:_ РАЛ/М() удалось добиться изменения скорости враще- ния двигателей Оп&тВо! в прямом и обратном направлениях. Это первый шаг к движению - обеспечить базовые возможности робота, которые необ- ходимо будет впоследствии улучшать. 5.3. Управление движением шасси: стабильное движение робота В процессе управления роботом на практике необходимо не только контро- лировать его ускорение и замедление, но и заданную скорость. Например, если «мозг» дает команду на движение со скоростью 1 м/с, то только с по-
мощью ШИМ и Н-моста не получится добиться точного и стабильного резуль- тата. Это похоже на езду на велосипеде: для достижения целевой скорости необходимо знать текущую скорость, чтобы понять, нужно ли ускоряться или замедляться В случае автомобиля эта задача решается проще благо- даря спидометру: если скорость слишком высокая, можно отпустить педаль газа, если низкая - нажать. Управление двигателем робота аналогично: не- обходимо знать реальную скорость двигателя и сопоставлять ее с целевой для успешного управления. Это и есть цель данного раздела - обеспечить стабильное движение. 5.3.1. Принцип измерения скорости с помощью энкодера Рассмотрим первый аспект, необходимый для обеспечения стабильного дви жения, - получение реальной скорости двигателя. Как эффективно измерить скорость вращения двигателя, если он враща- ется с высокой скоростью? Обычно на двигатель устанавливается датчик - энкодер. Существует множество типов энкодеров, но в робототехнике чаще всего используются оптические и магнитные (холловские) энкодеры, как показано на рис. 5.15. Рис. 5.15 ❖ Принцип измерения скорости двигателя с помощью энкодера Принцип работы оптического энкодера с кодовым диском достаточно прост: на выходной вал двигателя устанавливается диск с равномерно рас- положенными прорезями. При вращении двигателя диск вращается с той же скоростью. Рядом с диском находится пара фотоэлектрических трубок, которые непрерывно излучают и принимают инфракрасный свет. Когда свет проходит через прорезь, он принимается приемной стороной, что вызывает сигнал нарастающего фронта высокого уровня. Когда свет блокируется, воз- никает сигнал спадающего фронта высокого уровня. Таким образом, свет проходит через прорези с определенной частотой, и фотоэлектрические трубки генерируют соответствующие импульсные сигналы высокого и низ- кого уровней. Это позволяет подсчитать количество прорезей, обнаруженных
за единицу времени и, зная количество прорезей на одном обороте диска, вычислить скорость вращения двигателя. Например, если на оптическом кодовом диске 20 прорезей и за 1 секунду фотоэлектрические трубки обна- руживают 100 сигналов нарастающего фронта, то можно вычислить скорость вращения двигателя: 100/20 = 5 оборотов/с = 5 х 2п рад/с. Точность измерений оптического кодового диска в основном зависит от плотности прорезей и ограничена аппаратными возможностями. Кроме того, существует другой распространенный тип энкодера - энкодер Холла. В этом типе энкодера на задней части двигателя устанавливается датчик Холла и выдает два сигнала уровня. При прямом вращении двигателя один сигнал (А) опережает другой сигнал (В); при обратном вращении один сигнал (А) отстает от другого сигнала (В), как показано на рис. 5.16. По изменению этих сигналов можно определить направление вращения двигателя, а по из- менению уровней - вычислить скорость вращения. Прямое вращение Фаза А Фаза В Обратное вращение Рис. 5.16 ❖ Принцип измерения скорости двигателя с помощью энкодера Холла Как оптические, так и холловские энкодсры вычисляют скорость вращения двигателя на основе количества импульсов, зарегистрированных за единицу времени. С учетом передаточного отношения редуктора можно рассчитать угловую скорость вращения колес робота, а фиксированная длина окружно- сти колеса позволяет определить его линейную скорость. ЛК Однако вычисленные значения касаются только скорости и положения двигателя, а не скорости и положения самого робо~а. Для этого необходимо преобразование с использованием кинематической модели робота - этот вопрос будет рассмотрен в разделе 5.4. 5.3.2. Программирование измерения скорости с помощью энкодеров Изучив принципы измерения скорости с помощью энкодеров, применим их в разработке роботов. Основная задача измерения скорости заключается в вычислении скорости вращения двигателя на основе количества импуль-
сов, зарегистрированных за единицу времени. Рассмотрим этот вопрос на примере платы управления движением Оп^тВоЕ. Обычно используются два метода сбора данных об импульсах, 1. Сбор данных через внешнее прерывание, определение знака по раз- ности фаз Л и В. 2. Использование режима энкодера таймера для непосредственного сбо- ра импульсных сигналов и обработки их с помощью аппаратного счет- чика. В процессе практической разработки чаще используется второй подход, поскольку аппаратный таймер непосредственно обрабатывает импульсные сигналы, что позволяет эффективно подсчитывать высокочастотные им- пульсы, Аппаратный таймер обладает более высокой точностью и стабильно- стью подсчета, не подвержен влиянию задержек и колебаний программного обеспечения. Ниже приведены ключевые методы программной реализации второго подхода. 1. Настройка режима таймера для энкодера // Канал 1 и какал 2 таймера 3 подключены к энкэдерам М1А и М1В, соответствующим выводам Ц СРЮ РА6 и РА7. уотб Епсос1ег_1ргС_Т1МЗ(уо1с1) { Т1М_ТЩеВе5е1пг1:ТуреОеЕ ТТМТгпеВазеЗбгдсЩге; ПМ_ТС1пНТуреОеГ Т1М_1С1пг1:51:гис1:иге; СРЮ-ТпШуреВеГ СРИМптШгисСиге; КСС_АРВ1РеггрЬС1оскСпй(КСС_АРВ1РегсрЬ_Т1МЗ, ЕНАВЕЕ); РСС_АРВ2Регтр1тС1оскСпс1(На1_1А_КСС, ЕМАВЬЕ); СРЮ_1пН5Е:гисГиге.СР10_Р1п = На1_1А_Р1М; ОР10_1пт.ШгисЩге.СР10_Мос1е = СР1С_,Мос1е_1М_Е10АТЩС; СРЮ_1пН(На1_1А_Р0ЧТ, &СР10_1гп«1:гис1:иге); РСС_АРВ2РегтрЬС1.оскС'пс1(На1_1В_КСС, ЕМАВЬЕ); СРЮ_1пШ1:гис1:иге.СР10_Р1п - На1_1В_Р1М; СР10_1птЛ$ггисГиге.СР10_Мс1е = СР1С_Мосе_1М_РЕ0АТЩС; СР10_1пи(На1_1В_Р0ЧТ, ШЧ0_1п1ШгисЩге): Т1Н_Т1пеВа5е$ЕгисЫпи(&Т1М_ТтгеВа5е$-(:гисЕиге); // Пррдделитель. Т1М_Т1теВз5е5сгисгиге.Т1М_Ргесса1.ег = 0x0; // Установка автоматической перезагрузки счетчика. Т1И_ТхшеВа5е51г11с1иге.Т1М_Рег1ос1 - ЕМС00ЕК_ТТЯ_РЕК10В; Ц Выбор делителя тактовой частоты: бе? деления. Т1М_Т11деВа5е51:гис1иге.Т1М_С1.оск01У15СОп = Т1М_Г.К0_В1У1; // Режим счета вверх для Т1М. ПМ-ТтлеВазеЗсгисбиге ,Т1М_СоипГегМобе = ПМ_Соипгег,'1ос1е_11р; Т1М_Т1Р1еВа5е1пт1:(Т1МЗ, ШМТтпеВазеЗбгисбиге); // Использование режима энкодера 3. Т1М_Епсобег1пГегЕасеСопНд(Т1МЗ, Т1М_ЕпсобегМос1е_Т112, Т1Л_1СРо1аг1су_Р1зтпд, Т1М_1СРо1агН:у_Кг5гпд); Т1М_1С$ГгисЫ|тЩ&ПМ_1СТ>/тШгис1:иге); Т1М_1С1пи51гисЩге.Т1М_ГСЕШег = 10:
Т1М_1С1птЛ(Т1МЗ, аПМ-ТСТпШггисбиге); Т1М_С1езгЕ1ад(Т1РЗ, Т1М_ЕЕАС_0рЗасе); ПМ_ГГСопПд(Т1МЗ, Т1М_П_Нрс1а1:е, ЕМАВЬЕ); Т1МЗ->СМТ = ОхУГГГ; ПНОпсЦПКЗ, ЕМАВЕЕ); } Ц Канал 1. и канал 2 таймера 4 подключены к энкодерам М2А и М2В, соответствующим вьводам Ц СРЮ РВб и РВ7. йотФ Епссйег_1пи_71М4(уо1с1) ПМ-ТтлеВазеЮтЛТуреСеЕ Т1М_Т1пе8а5е31гисбиге; Т1М_1С1пШуреВеГ Т 1М_1С] птШгиспгге; СР1Й_1пШуреСеГ СРЮ_1пи$ггистиге; КСС_АРВ1Регтр:тС1оскСпс1(КСС_АРВ1Рег1рЬ_Т1М4, Е^ВЕЕ); КСС_АРВ2Реггр!1С1.сскСпк1(На1_2А_кСС, ЕЧАВЕЕ); СР10_1(1тЛ5Ь-исШге.СРЮ_Р1П = На1_2А_Р1Н; СР10_1пИ81:гисбиге.СРЮ_МоЗе = С.Р1Э_МоЗе_1Н_ЕШАТ1МС; СРЮ_1пи(На1_2А_Р0РТ, &СР10_1пт.К1:гис1:иге); КСС_АРВ2РеггрЬС1оскСМ(На 1_2В_КСС, Е ЧАВ1Е); СРЮ_1пиЬЕгисЕиге.СРЮ_Р1п = На1_2В_Р1И; СРЮ_1пи5ТгисТ:иге.СРЮ_Нос!е - 0РЮ_Мос1е_1М_ЕЕ0АТ1МС; СР10_1пт1(На1_?.В_Р0КТ, &СРЮ_1пИ51:гисЮге); Т1М_ПпеВазе$ггисг1пи(&Т1М_Т1пеВа!;е$1:гис1:иге); // Предделитель. Т1М_т11чеВа5е5Г.гисСиге.Т1М_Р|'езса1.ег = 0x0; Ц Установи автоматическом перезагрузки счетчика. Т1М_ПтеБа5е5ггисбиге.Т1М_Регтэб = ЕЧС00ЕР_Т1М_РЕКЮ0; // Во|6ср делителя тактовой частоты: без деления. Т1М_Т1пеВазе8бгис7:иге.ПМ_С1.оск0тИ.5т.оп = Т1М_СК0_01Ь1; Ц Режим счета вверх для ИМ. Т1М_Т1Р1еБазе8бгисбиге.Т1М_СоипЕ:егМос1е = Т1М_Соипбе1 Мос1е_11р; Т1М_Т1леВа5е1лт.1:(Т1М4, ШМ-ТтаеВоСеЗЕгисЕзге); // Использование режима энкодера 3. Т1М_ЕпсоЗег1пбегРасеСопЕ1д(Т1М4, Т1М_Епсос1ег1'‘ос1еД112, Т]М_1СРо1агЕЕу_Р15ттд, ПН_1СРо1ггтСу_Р151пд); Т1М_1С5бгисШ'И(ШМ_1С1п11:5Ег11с1иге); Т1М_1С1пи5бгиси1ге.Т1М_1СРЩег = 10; Т1М_1С1пи(Т1М4, &т1М_1С1пИ81:гисТ:иге); // Очистка флога обновления Т1М. ТИ_С1еэгЕ1ад(ТТМ4, Т1М_Е1АС_ирба1:е); Т1М_1ТСопНд(Т!М4, Т1Н_1Т_Нрс1асе, ЕНАВЕЕ); ПМ4->СМТ = 0х7Ш; Т1М Спс1(Т1М4, ЕИАВЕЕ); } 2. Считывание данных с энкодера Ц Чтение счетчика энкодера за единицу времени. 516 ЕпсоЗе: _Кеас1_СМТ(и8 ЕпсоЗег_тЗ)
516 Епсос1ег_Т1М - 0; 51Л1сЬ(Епсос1ег_т<1) { сазе ЕВД>ЕК_Ю А: { Епсо(1ег_Т1М - Ох/СГТ - (зЬогЬ)Т1МЗ -> СМТ; Т1МЗ -> С1МТ = 0х7€€€; Ьгеак; } сазе ЕМС00ЕК_Ю В: { Епсос1ег_Т1М - 0х7ЕгЕ (зЬогЬ)Т1М4 -> СМТ; Т1М4 -> С1МТ = 0х7Ш; Ьгеак; } ЬрЕзсИ: Ьгеак; } геЬагп Епсос1ег_ПМ; } // Обновление значения счетчика энкодера. усгб Епсос1ег_11рс1аЬе_СоипЬ(и8 Елсос1ег_1с1) { зИЛсЬ (Епсооег_гс1) { сазе ЕМСООЕК_Ю А: { д_Епсос1ег_А_№и -= ЕпсоЛег_Веас1_СКТ(ЕООЕЙ_1С_А); Ьгеак; } сазе ЕЮ>ЕК_Ю В: { д_Епсо<1ег_В_Мои1 += Епсос1ег_₽еас1_СНТ(Е№00ЕЙ_1В_В); Ьгеак; } ЬеЕаиИ:: Ьгеак; } } 3. Вычислении фактической скорости энкодера уссс! СеМ-'югоГ-ЗреесКгг!: *1е<Ч$реес1, спб *ггдпЬ5рееб) { Епсос1ег_1;рс1а’:е_Сэипг'ЕЬС0Г>ГР_1Ь_А); ЬеГШЬееЬЕпсоСегЫои - ЕпсоЬег_Се1_Соип1:_Кои(ЕМС00ЕК_1С_А); Епсобег_Ьрс1ат:е_Сэип1:(ЕГК0ВЕК_:Ю_В); г1дЬ1ИЬее1ЕпсойегМо,л1 = Епсос1ег_Се1_СоипТ_№й(ЕОЬЕЯ_1[,_В); *1еЕг5реес = (1.еС1:Н1тее1Епсос1егМси - 1еЕткЬее1Епсэс1ег1аз1) * ЕООЕК_СНТ_10*1$_2_$РО_ММ_5; *гЬдЬТ$реес1 =(г1дЬ1ЫЬее1Епсос!егМО1» - Г1дНЬ|л1Ьеэ1Епсос1егЕа5Е)* ЕЛС9ОЕК_СМТ_101'.5_2_5РО_ММ_5; 1еЕ1_епсос1ег_спг +- ЬеЕЕЫЬееЬЕпсоЬегМои - 1егТиЬее1Епсос1егЕазг; гсдЬ1_епсос1ег_спЬ +- гтдЫИНееЬЕпсоСегЬос - ггдЬЕИЬее1Епсос1егЕазЕ; гесогб_г1пе++;
// Запись данчых энкодера за предыдущий цикл. 1еГ1:НЬее1 Епсоне: Ьаьт = 1е-ЕЩ11ее1Епсос1егМои; ггдНсНЬее1Епсос1ег1.а5Е = гт.дН1:ИНее'1Е.псос1ег1\юи; } Этот код позволяет с помошью режима энкодера таймера точно изме- рять скорость двигателя. Данный метод не только повышает эффективность и точность обработки, но и усиливает надежность системы и ее устойчивость к помехам. Обрабатывая импульсные сигналы напрямую через аппаратный таймер, можно поддерживать стабильный подсчет при высокочастотных им- пульсах, избегая проблем задержек и колебаний, связанных с программными прерываниями. Получив точные данные о скорости двигателя, их можно применить в бо- лее сложных алгоритмах управления, таких как ПИД-регулятор, которые будут подробно рассмотрены в разделе 5.3.3. 533. Методы замкнутого управления двигателем После получения данных о реальной скорости двигателя следующим шагом является выполнение второго основного условия «стабильного движения» - замкнутого управления. Противоположностью «замкнутому управлению» является «разомкнутое управление», как показано на рис. 5.17. Процесс кипячения воды является типичным примером разомкнутого управления, при котором нсвозмож но точно контролировать температуру и поддерживать ее на заданном уровне. Рис. 5.17 ❖ Пример разомкнутого управления Что такое замкнутое управление? Например, робот движется со скоростью 1 м/с, где «1 м/с» является ожидаемым значением для управления движе- нием. Контроллер движения с помощью алгоритма управления подает на двигатель заданное напряжение и ток, чтобы привести робота в движение. Возникает вопрос: действительно ли скорость движения робота составля- ет 1 м/с? С помощью энкодера фактическая скорость движения передается обратно контроллеру движения. Если фактическая скорость меньше ожи- даемой, происходит ускорение, если больше - замедление, что в конечном итоге стабилизирует скорость движения робота около 1 м/с. Если продолжить аналогию с кипячением воды, го для достижения точной температуры необ- ходимо интеллектуально регулировать процесс кипячения на основе данных, полученных отдатчика температуры, как показано на рис. 5.18.
Рис. 5.18 ❖ Пример замкнутого управления Как видим, разомкнутое и замкнутое управления представляют собой два различных метода управления, основное различие между которыми заклю- чается в наличии или отсутствии механизма обратной связи. Разомкнутое управление простое, но недостаточно стабильное и точное. Замкнутое управ- ление обладает лучшими характеристиками, но его разработка и реализация более сложны. В зависимости от конкретного сценария применения и требо- ваний можно выбрать подходящий метод для достижения целей управления. Оба метода управления не имеют абсолютных преимуществ или недостатков, и в ре- альной практике аыбор подходящего метода зависит от конкретного сценария при мечения и требований. Изучив основные концепции замкнутого управления, перейдем к конкрет- ным методам реализации. Эта часть выполняется в контроллере движения ОпушВоГ и использует классический метод замкнутого управления - ПИД регулятор (пропорционально-ингегрально-дифференцирующий регулятор). Алгоритмическая структура представлена на рис. 5.19. Рис. 5.19 ❖ Структура алгоритма замкнутого управления скоростью двигателя с использованием ПИД регулятора Так называемый ПИД-регулятор - это три ключевых параметра алгоритма управления, как показано на рис. 5.20. 1. Пропорциональный (П): регулирует выход контроллера пропорцио- нально текущей ошибке. Большая ошибка приводит к большему из- менению выхода, что ускоряет реакцию системы. 2. Интегральный (И): учитывает накопленную ошибку за определенный период времени, решая проблему статической ошибки системы. Это устраняет постоянные небольшие ошибки, обеспечивая более точное соответствие выходного сигнала желаемому значению.
3. Дифференциальный (Д): регулирует на основе скорости изменения ошибки, подавляя перерегулирование и колебания системы. Это по- зволяет предсказывать тенденцию изменения ошибки, что помогает замедлить реакцию системы и повысить ее стабильность. Рис. 5.20 ❖ Три ключевых параметра в замкну_ом управлении скоростью авигателя с использованием ПИД-регулятора ПИД-регулятор действует как три наставника, помогая системе поддержи- вать точный и стабильный выход. Различные значения параметров опреде- ляют различные эффекты управления, как показано на рис. 5.21. Приведем наглядный пример: при езде на велосипеде, если вы отклоняетесь от направ- ления, П скажет: «Вы еще далеко от цели, ускорьтесь». Если дорога неровная и велосипед постоянно отклоняется, И запомнит каждое отклонение и ска- жет: «Мы отклонились столько-то раз, нужно срочно вернуться». Д, будучи более умным, предскажет будущее и скажет: «Впереди может быть поворот, нужно скорректировать направление». ПИД-регулятор - это суперкоманда. П говорит, насколько вы далеки от цели, И запоминает прошлые отклонения, а Д предсказывает будущие из- менения. При грамотном использовании этой команды устройство будет оставаться стабильным. Изучив принципы работы ПИД-регулятора, рассмотрим конкретные мето- ды реализации этого алгоритма, наиболее распространенные из которых - позиционный ПИД-регулятор и инкрементный ПИД-регулятор. 1. Позиционный ПИД-регулятор Б позиционном ПИД-регуляторе контроллер выполняет корректировку на основе разницы между целевым и текущим значениями (ошибкой), что под- ходит для систем, требующих поддержания стабильного положения, напри мер для удержания робота на определенном угле. Алгоритмическая структу- ра представлена на рис. 5.22.
Заданная ПОЗИЦИЯ Рис. 5.21 ❖ Различные значения параметров в алгоритме П ИД-рс гуляторз определяют различный эффект управления Позиционный ПИД-регулятос И(Интегральная составляющая) Фактическая позиция П(Пропорциональная составляющая) Д (Дифференциальная составляющая) Выход ШИМ на двигатель Вращение двигателя Знкодер считывает накопленное значение(обратная связь) Рис. 5.22 ❖ Алгоритмическая структура позиционного ПИД-регуляторз Формула расчета выглядит следующим образом: выход = К * ошибка + К1 * накопленная ошибка + скорость изменения ошибки; н(0 = к е(0 + х,/;е(оаг + к Ниже приведено описание параметров. О е(0 обозначает ошибку, которая является разницей между целевым значением (установленным значением) и фактическим значением. Для управления скоростью двигателя ошибка обычно выражается как разница между целевой и фактической скоростями. Формула расчета следующая:
е(Г) = целевая скорость - фактическая скорость, О е(С)с1Г обозначает интеграл ошибки. Интегральная часть прсдставля ет собой накопленную сумму ошибки во времени, используемую для устранения статической ошибки системы, то есть для обеспечения стабильности системы после достижения целевого значения. Общая формула следующая: [еД)(к = |(целевая скорость - фактическая скорость)бЦ О с1еД)/ск представляет собой дифференциал ошибки, который отражает скорость изменения ошибки во времени. Он используется для прог- нозирования тенденции изменения ошибки, что позволяет заранее вносить коррективы, уменьшая перерегулирование и колебания. Об щая формула следующая: с[е(1)/й1 = <1(целевая скорость - фактическая скорость)/Ш. □ К представляет собой параметр пропорциональной составляющей, который определяет непосредственное влияние ошибки на выход управления. Более высокое значение К делает систему более чувстви- тельной к ошибке, но может привести к колебаниям. Общая формула следующая: пропорциональная составляющая = Кр* е(1). О К' представляет собой параметр интегральной составляющей, который определяет влияние интеграла ошибки на выход управления. Более вы- сокое значение К, ускоряет устранение статической ошибки, но может привести к перерегулированию системы. Общая формула следующая: интегральная составляющая = К: * |ое(Г)<Д. О К представляет собой параметр дифференциальной составляющей, который определяет влияние дифференциала ошибки на выход управ- ления. Более высокое значение Сделает систему более чувствительной к изменению ошибки, что позволяет уменьшить перерегулирование и колебания. Общая формула: дифференциальная составляющая = йе(^)/Ш. □ н(0 представляет собой выход управления, который рассчитывается ПИД-регулятором на основе пропорциональной, интегральной и диф ференциальной составляющих и используется для регулирования сиг- нала ШИМ двигателя, контролируя его скорость. Общая формула сле- дующая: = кдо + к[ое(^ + л; ае(о/аг.
Ниже приведена реализация на языке С. у** Позиционный ПИД-регулятор. РТ-оа-Ь д_кр = 20; ЛЪоаТ д_кт = 0.01; Поаг д_кс = 50; */ НоаС рто_са1с(Г1оат Гагдеб, Ноаб сиггеп1){ зТаНс Г.оат еггог_1гг(:едга1.,еггсг_'1а5'(:; // Текущая ошибка: целевое значение фактическое значение ТТоаС еггог - Тагдес - сиггелб; // Накопление ошибки. еггсг_тпТедга1 += еггог; // Реализация алгоритма ПИД-регулятора. Поаб ртс!_геьи11: = д_кр * еггог + д_кт * еггог_гпбедга1 + д_кб * (еггог - еггогДазб); // Запись предыдущей ошибки. еггог Тавб = ето;; // Возврат результата ПИД-регулятора. ге1:иг п рсСгезиН; } 2. Инкрементный ПИД-регулятор В инкрементном ПИД-регуляторе, как следует из названия, вычисляется изменение управляющего воздействия на основе изменения ошибки, что подходит для систем, требующих инкрементной корректировки выхода, например регулирования скорости двигателя. Алгоритмическая структура представлена на рис. 5.23. Инкрементный ПИД-регулятср Заданная позиция е(к) Фактическая скорость И(Интегральная составляющая) П(Пропорциональная составляющая) Д (Диффеэегщиальная составляющая) Выход ШИМ на двигатель Вращение двигателя Измерение скорости «кодером (обратная связь) Рис. 5.23 ❖ Алгоритмическая структура инкрементного ПИД-регулятора
Формула расчета выглядит следующим образом: выходное изменение = X * текущая ошибка + К1 х накопленная ошибка + К.х скорость изменения ошибки; Ршш = Кр* [е(/с) - е(к - 1)] + К * е(к) + Кг [е(к) - е\к - 1)] - [г(к - 1) - е(к - 2)]. Ниже приведено описание параметров. □ е(к) обозначает ошибку, которая является разницей между целевым значением (установленным значением) и фактическим значением. Для управления скоростью двигателя ошибка обычно выражается как разница между целевой и фактической скоростями. Формула расчета следующая: е(к) = целевая скорость - фактическая скорость. О е(к - 1) представляет собой предыдущую ошибку, то есть разницу между целевым и фактическим значениями в предыдущем цикле выборки. Общая формула следующая: е(к - 1) = предыдущая целевая скорость - предыдущая фактическая скорость. О е(к - 2) представляет собой ошибку два цикла назад, то есть разницу между целевым и фактическим значениями два предыдущих цикла выборки. Общая формула следующая: е(к - 2) = целевая скорость два цикла назад - фактическая скорость два цикла назад, О К представляет собой параметр пропорциональной составляющей, который определяет непосредственное влияние ошибки на выход управления. Более высокое значение К делает систему более чувстви- тельной к ошибке, но может привести к колебаниям. Общая формула следующая: пропорциональная составляющая = К, * е(к). О К1 представляет собой параметр интегральной составляющей, который определяет влияние интеграла ошибки на выход управления. Он ис- пользуется для устранения статической ошибки системы, обеспечивая стабильность после достижения целевого значения. Более высокое зна- чение Кг ускоряет устранение статической ошибки, но может привести к перерегулированию системы. Общая формула следующая: интегральная составляющая =- К1 * ^е(к).
□ X, представляет собой параметр дифференциального компонента, ко- торый определяет влияние дифференциала отклонения на управляю- щий выход. Он используется для прогнозирования тенденции измене- ния отклонения, что позволяет заранее вносить коррективы, уменьшая перерегулирование и колебания. Более высокое значение Кг1 делает систему более чувствительной к изменениям отклонения, что снижает перерегулирование и колебания. Общая формула следующая: дифференциальный компонент = Ка* [е(к) - е(к - 1)]. □ Ршш представляет собой инкрементальный выход, который является результатом расчета ПИД-регулятора на основе пропорционального, интегрального и дифференциального компонентов, и используется для регулировки сигнала ШИМ двигателя, тем самым контролируя ско- рость двигателя. Общая формула следующая: Руут = К х е(к) + 1С * ^е(к) + Кл * [е(/с) - е(к - 1)]. Ниже приведена реализация на языке С. I -к-к Инкрементный ПИД-регу.лятор. Чтение приращения энкодера, вычисление скорости. */ Гюат р1о_са1с2(Ноаг гагдет, НоаС сиггепС){ зСаНс ТТоаб еггогспСед га!,еггог_ТагТ,еггогТйзСТггГ,ртдгези'И:; епсос!ег_с1еаг(); // Текущая ошибка: целевое значение - текущее значение. НоаТ еггог = Сагдет - сиггелб; // Реализация алгоритма ГИД-эегулятора. ртс1_ге5иИ: +- д_кр * (еггог - еггогДазС) + д_кт. * еггог + д_кс! * ((еггог - егга_1аЯ) - (еггог_1азТ - еггог_1азГ_1а5^)); // Запись предыдущей ошибки. еггогТазГТазГ - еггогТазб; еггогТазб = еггог; // Возврат результата ПИД-регулятора. гебагп рт.с!_ге5иН:; } В целом позиционный ПИД-регулятор ориентирован на абсолютное зна- чение отклонения, тогда как инкрементный фокусируется на изменении значения отклонения. Выбор между этими методами зависит от конкретного сценария применения и требований системы. В реализации контроллера движения Опд:пВоГ используется инкрементный ПИД- регулятор для замкнутого управления двигателем.
5.3.4. Программирование замкнутого управления двигателем Ключевым моментом для достижения идеального управляющего эффекта в реализации ПИД-регуляторэ является правильная настройка весов грех компонентов. Этот алгоритм применяется во многих областях, таких как промышленное управление, управление роботами, регулирование темпера- туры и т. д. Как же использовать ПИД-регулятор для управления двигателем и достижения желаемой скорости в умной тележке Оп§тВо1? Основной код для замкнутого управления двигателем содержится в двух файлах: арр_тс11оп_сол1:го1.с и р!с.с В контроллере движения создан таймер на 10 мс, который активирует функцию управления движением Мо1юп_Соп1го1_10т<;(). уотД МсГ1оп_СопГго1_10п)с(7о1с1) { // Получение текущей фактической скорости левого и правого колес СеГ_МоГог_5реес1(&1еГГ$рее^ои, &гтдКгЗреесИМои); т! (1еН ЗреесПеС || гтдНТ!~реес15е1:) { // Заданные (целевые) скорости р1б_Та5к_1еГ1. ареебЗеТ - ТебСЗреейЗеС; ртб_Та5к_Кгдбс.5реебЗет - гтдНсЗреебЗеб; // Фактические скорости ртс!_Та5к_1еГг.ореес1Мои = 1ебт5реес1Мо\ч; ртс1_Та5к_кгд1т1:.5реес1Пои - ггдЬСЗрее^ои; // Выполнение управления с помощью ПИД-регулятора Ртб_СГг1(&по1:ог1еб1:, ЗпоСогН тебе, д_аШ.Тис1е.уги); /7 Установка ШИМ Мос1оп_5еГ_РНМ(по1О1 Цебб, поСогРсдЫ); д_51ср_соип1: = 0; } е!зе { // Сброс угла рыскания РЮ_Ке5еб_Уан(д_а1:т:иы1е. у ан); гГ (дабсрсоипб < МАХ_ЗТ0Р_С0иМТ + 19) д_51ор_соипГ++; // Отключение функции торможения робота (д_5бор_соипб == МАХ_$Т0Р_С0Л1Т) Мобог_С1оее_Вгаке(); } }
В этой программе сначала определяется текущая фактическая скорость левых и правых колес робота. Затем проверяется, введена ли желаемая це- левая скорость. Если да, то сохраняются целевая и фактическая скорости, которые используются в качестве входных значений для ПИД регулятора, чтобы получить необходимое значение ШИМ для управления двигателем и достижения целевой скорости. Расчет и вывод ПИД-регулятора в основном выполняются с помощью сле- дующих трех функций. #йеНпе СОМ5ТКА1Ы(х, пгп, пах) ((х) < (пгп) ? (гпп) : ((х) > (пах) ? (пах) : (х))) усЩ РгсИДгЦгпг ЧеНМсДсг, гпЕ *г1д№НоЕог, Ноак уаи) { спТ: гепрДеН = ЧеНМсДог; гпб Тепр_ггдД = *г1дЬТМсТог; стс!_Са1си1аТ:е(&ргс1Да'>к_1еТг, &рЩДа5к_К1дМ, уаи); 1енр_1еН + рг<1_Та5кДеТ1:.Ас1)из1:; сепр_г1дД +- рЩДэзкД’.дЬг.АбзихТ; ЧеТЩпТог = С0М5ТКА1М(ЩпрДеН, -МОТОК_МАХ_Р(Д5Е, МОТОК_МАХ_Р1Л.$Е); ЧкдпЕМоЕог = С0И$ТКАЩДепр гтд1тЦ -МОТОК МАХ_Р(Д5Е, МОТОК МАХ РУС5Е); } усЩ РтДДаТсиТаке^ТгисТ ртДигпг *ртс1ДеЕг, ькгисС ртДиспТ: *ргс1_г1дД, Ноаг уаи) { сопбТ тпк зкеегтпддДТзеТ: = 0; // ПИЛ-регулятор скорости левого колеса. тТ (рт.с!_1еТТ:->Еп — 1) { рЩДеТт^Асцилг = -РЮ_Сонпоп(рт.с1ДеТ1:->5рее<ВеТ:, ртс1ДеТТ:->5реес1Мои, рЩДеН) - 5Теегтяд_оТТ5е1:; } еТье { рт.рДе1Ч->А(1ди5Т: - 0; Кезеб_Р10(рт6Детг); рЩДеЕс->Еп = 2; } // ПИЛ-регулятор скорости правого колеса. И (рт.с!_ггдМ:->Еп == 1) { рТсЦгтдМ->АР)и51: - -РЮ_Сопрсп(рЩ_гТдРТ:->5реес1$е1:, рЩ_ггд1т1:->зреейМ01л1, ргсНТдМ:) + 5геегТпд_оТТ5ег; } ек^е { ртДгтсТТ-.’АозигТ = 0; Ке5еТ_Р10(рг0_гт.д|Ц); рЮ_гТдД->Еп = 2; } } Т.ПЙ2Д РЮ_Соппоп(1п1 зеТсрет.пт, гм пеаьигепепТ, зТгисТ ртс1_и1пЕ ч,р1с1) {
тгД еггог - пеазигепеп!: - зе^рогпг; гп{32_1: оигриг; оиСриС = ргг1-^ргеу1ои5_ои1:ри1: + ртс1--'Кр * (еггог - р1о-=ргеугоиз_еггог) + * еггог + ртс1->Кс! * (еггог - 2 * рЩ->р-еЩоиь_еггог + рг<1->рге_рге7гоиз_егго1); ртс1->рге7’.ои5_ои1:ри1: = оЩриГ; ргс1->р"е_ргеугои5_еггог = рте!->ргеуГои5_еггог; ргс1->рге7’.ои5_еггог = еггог; гггигп СОГ.ЗТКА1М<ои1риТ » 10, -ргс!->11г, рт.С->11г); } Кезе(._Р10(51гисг ргс!_и1р1 *ргс1) ргс1->р'е7’.ои5_оЩрЩ = 0; ргс1->р-е7т.ои5_еггог = 0; ргс)->р'е_рге71ои5_етог = 0; } Основные функции системы ПИД регулятора реализованы в трех функци ях: РШСНЦ), Р1с1_Са1си1а1:е() и РЮ_Сопш1оп(). Рк!_С1г1() является основным входом ПИД-регулятора, отвечающим за обработку входных и выходных значений ШИМ двигателя. Сначала вызы- вается Р1с1_Са1си1а1:е() для расчета корректировочных значений ПИД. Затем эти корректировочные значения применяются к значениям ШИМ левого и правого двигателей. Б завершение проверяется, что скорректированные значения ШИМ не превышают предустановленный максимальный предел, чтобы защитить двигатель. Р1й_Са1си1а^е() отвечает за выход ПИД регулятора для управления левым и правым колесами. Учитывая, что левое и правое колеса могут требовать различных настроек параметров ПИД, необходимо выполнять расчеты от- дельно для каждого колеса. Р1с1_Са1си1а1:е() также включает в себя корректи- ровочный коэффициент поворота, который можно использовать для тонкой настройки способности тележки двигаться по прямой. Если для какого либо колеса ПИД-регулятор не активирован, то функция сбрасывает соответству- ющие параметры ПИД и устанавливает корректировочные значения в ноль. Р1В_Соттоп() реализует конкретный алгоритм ПИД, принимая в качест- ве входных данных заданное значение (желаемая скорость), измеренное значение (фактическая скорость) и параметры ПИД-регулирования. Внутри функции сначала вычисляется текущая ошибка скорости, затем с исполь- зованием классической формулы алгоритма ПИД рассчитывается выход- ное значение. Эта формула учитывает пропорциональный, интегральный и дифференциальный компоненты, используя текущую ошибку, предыду- щую ошибку и ошибку до предыдущей. В конце концов, функция выполняет масштабирование и ограничение выходного сигнала, чтобы гарантировать, что управляющий сигнал находится в разумных пределах.
Весь процесс ПИД-регулирования выполняется благодаря скоординиро- ванной работе этих трех функций, что позволяет точно контролировать ско- рость левого и правого колес робота. Можно оптимизировать движение робота в различных условиях, регули- руя параметры ПИД. 5.4. Решение прямой и обратной задач кинематики: точное движение робота Мы изучили движение одного двигателя, однако робот, как правило, имеет несколько двигателей. Например, V Оп§тВоГ их два. Как связаны движения отдельных двигателей с движением робота в целом? В этом разделе мы рас- кроем данную тему, которая является третьей частью управления роботом: точное движение, позволяющее роботу «следовать указаниям». Сначала вспомним, как различные роботы перемещаются в повседнев- ной жизни: одни, как роботы-пылесосы, используют двухколесный привод, другие, как автомобили на дорогах, управляются поворотом передних колес. Разные способы движения подходят для различных сценариев. Если требу- ется, чтобы робот двигался вперед со скоростью 1 м/с и поворачивал влево с угловой скоростью 307с, необходимо, чтобы несколько двигателей работа ли согласованно в соответствии с формой робота. Этот процесс основан на кинематической модели робота. 5.4.1, Распространенные кинематические модели роботов Существует несколько распространенных кинематических моделей роботов. 1. Дифференциальное движение Что такое дифференциальное движение? Проще говоря, это движение, при котором робот движется вперед или поворачивает за счет разницы в ско- рости между механизмами движения с двух сторон. Гироскутер является типичным примером дифференциального привода - см. рис. 5.24. Пред- ставим движение гироскутера: если скорости обоих колес одинаковы и они вращаются вперед, скутер движется вперед; если они вращаются назад, ску- тер движется назад, Если скорость левого колеса выше, чем правого, скутер поворачивает вправо, а если наоборот - влево. Это и есть основной принцип дифференциального движения.
Рис. 5.24 ❖ Пример применения дифференциальной кинематической модели Ключевым моментом дифференциального движения является разница в скорости колес с двух сторон, как показано на рис. 5.25. Это одна из наибо- лее распространенных форм движения роботов, которую можно разделить на двухколесное, четырехколесное, гусеничное дифференциальное движение и другие виды. Хотя между ними есть некоторые различия, суть заключается в управлении роботом за счет разницы в скорости. Рис. 5.25 ❖ Дифференциальная кинематическая модель На этом этапе может возникнуть вопрос: почему автомобили, которые мы видим на дорогах каждый день, не похожи на описанное здесь дифференци- альное движение? 2. Аккермановское движение Автомобили, безусловно, являются одними из наиболее распространенных движущихся объектов. Если вы знакомы с автомобильным шасси или игра- ли с моделями автомобилей, то, возможно, слышали о таком имени, как Аккерман.
Дифференциальное движение создает большое трение при поворотах. Еели бы автомобили использовали подобную конструкцию, им пришлось бы часто менять шины. Как уменьшить износ шин? Из принципа четырехколесного дифференциального движения следует, что необходимо минимизировать поперечные скорости и сосредоточиться на качении колес, чтобы уменьшить скользящее трение. Это требует оптимизации структуры движения робота. Более 200 лет назад многие инженеры-автомобилестроители задумались над этой проблемой. В 1817 году один немецкий инженер в области транспортных средств изо брел конструкцию, которая минимизирует тоение при движении. В 1818 году его британский агент Аккерман подал на это изобретение патент. Это стало теоретическим прототипом акксрмановского движения, известным как ак кермановская структура движения, или рулевая трапеция Аккермана. Основ- ная задача этой конструкции - обеспечить плавный поворот транспортного средства. Упростим модель движения автомобиля и проанализируем основ ные принципы аккермановского движения, как показано на рис. 5.26. Два ключевых компонента движения автомобиля - это передний рулевой механизм, управляющий передними колесами с помощью рулевого колеса, и дифференциал, распределяющий дифференциальное движение задних ко- лес при повороте. Верхнюю часть рулевого механизма можно упростить до равнобедрен- ной трапеции АВСЭ, представляющей собой четырехзвенный механизм. Звено АВ является неподвижной основой, звено СП может качаться влево и вправо, приводя в движение звенья АС и ВЭ. Звено СА вращается вокруг точки А, которая жестко соединена с шиной, поэтому при вращении звена СА поворачивается и левое переднее колесо. Принцип работы правого передне- го колеса аналогичен. Поворот передних колес является взаимосвязанным, они считаются пассивными колесами с одной степенью свободы, управля- емыми одним рулевым колесом. Этот способ поворота является основой аккермановского движения и называется рулевой трапецией Аккермана. Нижняя часть дифференциала соединена с приводным двигателем на вхо- де и с двумя задними колесами на выходе. Дифференциал автоматически распределяет мощность двигателя между левым и правым колесами, регу- лируя скорость задних колес в зависимости от угла поворота передних колес. Таким образом, задние колеса являются активными и приводят в движение автомобиль. Если робот использует аналогичную аккермановскую структуру дьиже ния, его прямолинейное движение будет аналогично движению с четырьмя колесами и дифференциалом. При повороте передние колеса могут поддер- живать углы поворота, удовлетворяющие определенным .математическим отношениям, так что продолжения линий АС и ВИ пересекаются в точке Е. Во время поворота точка Е всегда находится на продолжении оси задних колес, а дифференциал динамически регулирует скорость задних колес в зависи мости от угла поворота, минимизируя поперечную скорость каждого колеса и предотвращая излишний износ шин, как показано на рис. 5.27,
Обратите внимание на положение передних и задних колес, не напомина- ет ли это два велосипеда, которые «держатся за руки» при повороте? Верно, аккермановскую кинематическую модель можно упростить до модели вело- сипедов - эти две модели практически идентичны по механизму движения: руль управляет передними колесами, но не имеет привода, а педали через серию шестерен передают мощность на задние колеса, приводя велосипед в движение. Эти шестерни аналогичны дифференциалу.
Рис. 5.27 ❖ Аккермановская кинематическая модель В целом в реальных условиях аккермановская структура обеспечивает хо- рошую стабильность движения и обладает неплохой проходимостью, что де- лает ее подходящей для использования на открытых пространствах. Однако вспомните параллельную парковку и заезд в гараж - это настоящий кошмар, не правда ли? Да, такая система движения имеет радиус поворота, что делает ее менее маневренной. 3. Всенаправленное движение (колесо Илона) Всенаправленное движение подразумевает возможность робота двигаться по плоскости в любом направлении. Существует множество способов реали- зации всенаправленного движения, мы рассмотрим один из них - движение с использованием колеса Илона. Как следует из названия, ключевым элементом данного типа движения является конструкция колес, а именно колесо Илона. Использование таких колес позволяет выполнять впечатляющие маневры, включая движение впе- ред, вбок, по диагонали, вращение и их различные комбинации. В отличие от привычных резиновых шин, колеса Илона имеют уникальную конструкцию, которая изображена на рис. 5.28. Их механическая структура выглядит весь- ма сложной и состоит из двух частей: ступицы и роликов, Ступица является основной опорой колеса, а ролики - это цилиндрические элементы, установ-
ленные на ступице, представляющие собой множество маленьких колесиков, вместе образующих полное колесо Илона. Рис. 5.28 ❖ Механическая структура колеса Илона Угол установки роликов на ступице имеет важное значение, см. рис. 5.29. Угол между осью ступицы и осью вращения роликов составляет 45°. Теорети- чески этот угол может быть любым, так как он влияет на будущие параметры управления, но в большинстве коммерчески доступных колес Илона угол со- ставляет 45°, поэтому остановимся на этом значении. Для достижения этой геометрической связи край ступицы изогнут, образуя .монтажные отверстия для вращающегося вала ролика. Однако очевидно, что ролики не имеют соб- ственного привода и не могут вращаться самостоятельно, поэтому они яв- ляются пассивными. Двигатель устанавливается на оси вращения ступицы и приводит ее в движение, поэтому ступица является активной. Когда колесо Илона начинает вращаться, активное колесо начинает дви- жение, но нс контактирует с поверхностью, поэтому не создаст движения. Вместо этого оно приводит в движение ролики, которые взаимодействуют с поверхностью, создавая движение. Таким образом, анализ грения между роликами и поверхностью является ключевым элементом принципа работы колес Илона. В движущемся состоянии силу трения (Рг), действующую на ролики со стороны поверхности, .можно разложить на силу качения (Р±) и силу сколь- жения (Гц). Сила качения заставляет ролики вращаться вокруг своей оси, что не создает движущей силы для всего робота и является неэффективным движением. Сила скольжения, в свою очередь, заставляет ролики двигаться относительно поверхности, а поскольку ролики закреплены на ступице, воз- никающая реактивная сила приводит в движение все колесо Илона вдоль оси роликов. Таким образом, при вращении ступицы против часовой стрелки колесо движется в направлении 45° влево вверх, а при вращении по часовой стрелке - 45° вправо вниз. Изменяя угол между осями роликов и ступицы, можно изменить направление действующей силы на колесо Илона.
Рис. 5.29 ❖ Модель структуры колеса Илона Понимание характеристик движения колеса Илона позволяет заменить все четыре колеса робота на такие колеса. Благодаря распределению скорости под разными углами можно с помощью четырех колес синтезировать раз личные направления движения. Действительно, правильная установка колес Илона позволяет создать всенаправленно двигающуюся платформу. Основываясь на характеристиках движения колес Илона, конфигурация платформы со всенаправленным движением имеет следующие принципы: передние и задние колеса симметричны относительно горизонтальной оси, а левые и правые колеса симметричны относительно вертикальной оси. Та- кая симметричная структура предназначена для балансировки продольных и поперечных составляющих силы. Абстрагируем всенаправленную платформу с колесами Илона в виде мате- матической модели и проанализируем принцип всенаправленного движения робота, как показано на рис. 5.30. Сила статического трения является движущей силой для каждого колеса Илона. Разложив эту силу вдоль осей координат колесной системы, можно выделить продольную и поперечную составляющие, Если требуется, чтобы робот двигался вперед, необходимо, чтобы колеса с обеих сторон компенсировали поперечную составляющую силы, поэтому колеса расположены симметрично. Если они не будут симметричны, по- перечная составляющая будет направлена в одну сторону, и робот начнет от- клоняться. Если требуется, чтобы робот двигался влево, необходимо компен- сировать продольную составляющую: одно колесо должно вращаться назад,
а другое - вперед. Что же делать, если робот должен двигаться по диагонали? Достаточно, чтобы противоположные колеса не вращались, и результирую- щая сила двух движущихся колес будет направлена под углом 45° вперед. Рис. 5.30 ❖ Кинематическая модель всенаправленной платформы с колесами Илона Таким образом, движение всенаправленной платформы с колесами Илона представляет собой «борьбу» сил между колесами, и здесь стоит поблагода- рить Ньютона за открытие тайн механики. Конечно, условием компенсации составляющих сил является одинаковая скорость вращения, что в реальных условиях может иметь погрешности, поэтому добиться точного управления не так просто. В целом платформа с колесами Илона обладает хорошей гибкостью все- направленного движения, так как не имеет радиуса поворота, что делает ее подходящей для использования в узких пространствах. Однако взаимная компенсация сил приводит к потере энергии, поэтому ее эффективность ниже, чем у обычных шин, а износ роликов будет также значительным, что делает ее подходящей для более гладких поверхностей. Кроме того, ролики нс образуют непрерывную поверхность, что вызывает вибрации в процессе движения. Это заметно увеличивает уровень шума, и требуются дополни- тельные усилия по проектированию подвески для их устранения.
5.4.2, Принципы дифференциальной кинематики Интеллектуальная тележка Оп§тВо1 использует относительно простую мо- дель движения с двумя колесами и дифференциальной кинематикой, что является одним из наиболее распространенных способов в реальных робо- тотехнических сценариях. Давайте подробно изучим принцип этой модели движения. Модель с двумя колесами и дифференциальной кинематикой достигает определенной угловой и линейной скорости робота за счет различной ско- рости и направления вращения двух ведущих колес. Если скорости левого и правого ведущих колес одинаковы, робот движется по прямой линии. Если скорости различаются, робот движется по окружности. Построим математи- ческую .модель этого процесса, как показано на рис. 5.31. Всенаправленное колесо Ведущее колесо Рис. 5.31 ❖ Математическая модель дифференциального движения Здесь V, и Ук обозначают линейные скорости левого и правого колес соот- ветственно, Уобозначаст общую линейную скорость робота, ы - общую угло вую скорость робота, В - расстояние между двумя колесами робота, а К обо- значает радиус вращения робота. Математическая модель создана, теперь необходимо решить два вопроса. 1. Прямая задача кинематики: зная угловую скорость двух колес, вычислить угловую и линейную скорости робота. В старших классах на уроках физики изучается связь между линейной и угловой скоростями. У = ш Таким образом, линейные скорости левого и правого колес робота можно разложить следующим образом: Уь — ш х (Е + Е)) — <т>х(Е + 2с/) — ш х (Я + с/) — V + ы(1, Ук = д>хЕ = <т>х(Я-с/) = У- а>й.
Линейная скорость всего робота вычисляется так: V = ш х К = а) х (Ь + (I) 2а>А + 1а>(1 2 ДнЛ г Ч- ^(1) 2 К + “ 2 ’ Угловая скорость всего робота вычисляется как Ук - V, = 2ы<1, У„ - V. К - V. . . к ь к ь СО = = 2с1 Л Код на языке С для этих формул выглядит следующим образом: иоУ к1петайс_Еогиагс!(Е1оаТ 1еН:_и1'1ее1_5реес1, Ноаб Г1дкб_ибее1_5р=еб, Ноак &гоЬоГ_1Лпеаг_5реес1, Г1оат &гсЬоб_апди1аг_5рееб) { Ц Вычисление линейной скорости робота. гоЬос_Ипеаг_5рее^ = (1е1Ч_1л1пе=1._5реес1 + ггдЬЕ_икее1_5рее11) / 2.0; // Вычисление угловой скорости робота. гоЬсс_апди1аг_5рееб = (гтдМ:_1л/бее1_5реес1 - 1е^б_1«|Ьее1_5реес1) / ИНЕЕ1ДН5ТА1ЧСЕ; } 2. Обратная задача кинематики: зная угловую и линейную скорости робота, найти скорости двух колес. Имея формулы прямой задачи кинема гики, решение обратной задачи становится значительно проще. Известно следующее: V + V у = 2 к й) -= —- -. 0 Можно получить: 1 2 V + ы0 к“ 2
Код на языке С для этих формул выглядит следующим образом: уотб к1петаМс_гпугг5е(НэаГ гоЬог_Ипеаг_5реес!, Ноае гоЬоГ_алди1аг_5реес1, ПоаТ &1е*к_1л/1‘|ее'1_5реес1, РТоаС ХгсдПОЛееОрем) { // Вычисление линейной скорости левого колеса. 1еГт_иЬее1._5рее<1 = гоЬоГ_Ипеаг_5реес1 - (гоЬоТ_апди1аг_5реес1 * ЫНЕЕ1_015ТАЮ) / 2.0; Ц Вычисление линейной сксоости правого колеса. гтдН_иЬее1_5рееС = гоЬсЕ_1Лпеаг_5реес1 + (гоЬоб_апди1аг_5реес1 * ННЕЕЕ_015ТА1ЧСЕ) / 2.0; } После изучения общих принципов рассмотрим, как реализовать вышеопи санные прямую и обратную задачи кинематики для робота Оп§птВо{. 5.43. Обратная задача дифференциальной кинематики: вычисление скоростей двух колес Код на языке С, который на основании вышеуказанных принципов и формул реализует решение обратной задачи кинематики для Оп&шВоГ, выглядит следующим образом: уотб МоНоп_1пуег5е_5рее05еЕ(Ноа1: Нпеаг_х, Нэаб апди1аг_г) { Ноае 1еН:_5рее(1_п_5, гтдпТзрееЛпь; Ц Обратное кинематическое вычисление. 1еЕ1_5реес1_п_'. = 1Лпеаг_х - апди1аг_г * ЫНЕЕ1__ТВАСК / 2.0; гтдН_зрее;1_п_5 = Ипеэг_х + апди!аг_г * ННЕЕЬТРАСК / 2.6; // Преобразование в мм/с и ограничение скорости. тпНб_Е 1еН = (гпЕ16_Т)(1.еН_5реес1_п_5 * 1009); Еп1:16_<: ггуЫ: = (1П116_1)(гтдН_ьрееб_т_5 * 1ЭИ0); И (1еН > 5Р0_М.1_5_:'1АХ) 1еН = 5Р0_.1М_5_МАХ; е!ве И (1еН < -5Р0_ММ_5_МАХ) 1еН = -5Р0_ММ_$_МАХ; И (НдЬЕ > 5Р0_ММ_$_МАХ) НдШ - 5Р0_ММ_$_МАХ; е!зе И (гтдЫ < -$Р0_ММ_5_Г.АХ) гтдЫ = -$Р0_ММ.$_НАХ; 1еЕС5реес16еС = 1еН; гтдпсЗрееаЗеб = гтдЫ; }
Функция МоНопДпуегзеЗреебЗеЦ) предназначена для преобразования полученных команд движения (линейной и угловой скоростей) в конкрет- ные скорости левого и правого колес, предоставляя необходимые входные данные для управления движением робота с дифференциальным приводом. Б отличие от объяснений в этом разделе, в реальной ситуации необходи- мо учитывать предельные значения робота и ограничивать вычисленные скорости, чтобы они не превышали заданную максимальную скорость 8РБ_ ММ_8_МАХ. Этот шаг позволяет предотвратить отправку чрезмерно высоких значений скорости на двигатель. 5.4.4. Прямая задача дифференциальной кинематики: вычисление общей скорости робота Код на языке С, который на основании вышеуказанных принципов и фор мул реализует решение прямой задачи кинематики для Оп§1пВо1, выглядит следующим образом: уоЩ Мо11оп_СеГ_\/е'1ос1Гу(Г1оаГ *1Лпгаг_х, КоаГ *апди1аг_г) Г1оаг 1еГГ_5рее<1_п_5 = 1еГ1_5рееб_пп_5 / 1600.0; // Преобразование в м/с. Ноаб ггдЫ:_5эеес1_п_5 = г 1дК1:_зреес1_т_з / 1000.0; // Преобразование в м/с. *1Лпеаг_х = (г1дб1:_5реес_п_5 + 1еГ1_5реес1_п_5) / 2.6; *апди1аг. г = (ггдЫ:_5реес1_п_5 - 1е51:_5рееб_п_з) / ИНЕЕЬ ТКАСК; } Для вычисления линейной скорости используется среднее значение скоро- стей левого и правого колес, так как в дифференциальном движении скорость передвижения робота равна средней скорости двух колес. Угловая скорость вычисляется на основе разности скоростей двух колес, деленной на колесную базу (АЛ/НЕЕЕТКАСК). 5.5. Что еще есть в контроллере движения Контроллер движения Оп^пВоГ представляет собой встроенную систему с богатым интерфейсом и гибкими возможностями расширения, как показа- но на рис. 5.32. Он не только осуществляет управление двигателями робота, но и обеспечивает реализацию его базовых функций.
Рис. 5.32 ❖ Контроллер движения ОпдтБоГ 5.5,1, Управление питанием: один вход, много выходов Интеллектуальная тележка Оп§тВо1 оснащена аккумулятором на 12 Е, как показано на рис. 5.33. Он не только приводит в движение моторы, но и обес- печивает энергией устройства на тележке, такие как микроконтроллеры, датчики и контроллеры. Однако требования ко входному питанию у этих устройств различны, поэтому модуль управления питанием на контроллере движения может стабильно обеспечивать их различными сигналами питания. Рис. 5.33 ❖ Управление питанием в контроллере движения ОпдтБоГ
Питание 12 В, поступающее через Т-образный разъем от батареи, необхо - димо преобразовать различными способами: □ 5 В используется для питания контроллера КИК ХЗ и предоставляет возможность внешнего питания через ПЗВ-интерфейс; О 3,3 В применяется для питания микроконтроллеров и различных ком- понентов на плате, обеспечивая стабильную работу всех чипов; О 12 В используется для питания привода моторов, обеспечивая мощ- ность двигателей. На рис. 5.34 показана реализация стабилизирующей цепи на 5 В, где вход- ное напряжение 12 В преобразуется с помощью понижающего чипа ХЬ4005, выдающего сигнал питания 5 В/4 А. 12 - это встроенный зарядный интерфейс. Рис. 5.34 ❖ Стабилизирующая цепь на 5 В контроллера движения Опд:пВо1 Сигнал 5 В подается через интерфейс Туре-С на плате контроллера движе- ния для питания ШЖ ХЗ и через ИЗЕ интерфейс для питания других внешних устройств, как показано на рис. 5.35. Разъем Туре-С для питания и коммуникации (3-контактный штыревой) .и смо ____В7 ___В8 5\'|------ ТУРЕ-С16Р1№ УВОЗ УВН8 —---------15У СС2 5ВШ —— ОР2(О+) ОМ —------ ОМ (О ) ОР1 —----- 8ВО2 СС1 —— УВОБ УВЫ8 ——--------|5У О СЫО О СЫО ——--------||’ Рис. 5.35 ♦♦♦ Выходная цепь на 5 В контроллера движения Ог1дтВоГ Питание 5 В далее стабилизируется до 3,3 В с помощью чипа АМ81117, предоставляя питание для микроконтроллеров и других компонентов, как показано на рис. 5.36.
Стабилизированное питание 3,3 В Рис. 5.36 ❖ Стабилизирующая ыепь на 3,3 Б контроллера движения Опд1пВоТ Питание крайне важно для робота, поэтому на контроллере движения так- же предусмотрен модуль контроля заряда, как показано на рис, 5.37. Это позволяет роботу в реальном времени отслеживать уровень заряда батареи и в случае необходимости сигнализировать о низком заряде или автомати чески возвращаться на зарядную станцию. Контроле заряда 12,6 х (7,5/(30 + 7.5)) = 2,52 В Рис. 5.37 ❖ Цепь контроля заряда контроллера движения Ог)д(пВоЬ 5.5.2.1 М0: контроль положения робота Встроенная система имеет богатый интерфейс и позволяет подключать раз- личные сенсорные модули на шинах 12С, 8Р1, последовательных портах и г. д. Контроллер движения Оп§тВо1 также содержит инерциальный измеритель- ный блок(1МП), который используется для определения состояния движения робота, как показано на рис. 5.38. 1МП представляет собой микромеханическую систему (МЕМ8), которая из- меряет и сообщает сведения о состоянии движения объекта, включая угловую
скорость, линейное ускорение и информацию о магнитном поле. Обычно 1М0 включает следующие три типа датчиков: 1) гироскоп: измеряет угловую скорость объекта, то есть скорость враще- ния объекта вокруг определенной оси; 2) акселерометр: измеряет линейное ускорение объекта, то есть ускоре- ние объекта по прямой траектории, и может обнаруживать изменения ускорения, вызванные гравитацией, движением или вибрацией; 3) магнитометр: измеряет силу и направление магнитного поля Земли. В сочетании с данными акселерометра и гироскопа он позволяет повы- сить точность оценки положения, особенно при длительном движении. 1МИ обрабатывает и объединяет данные этих датчиков, предоставляя ин- формацию о состоянии движения объекта, такую как ориентация, положение и скорость. На практике 1МП часто используется в беспилотных летательных аппаратах, роботах, космических аппаратах, автомобилях и других областях для реализации функций навигации, позиционирования и стабилизации управления. МК Для получения более точной информации о состоянии движения обычно применяют- ся алгоритмы слияния данных датчиков, такие как фильтр Калмана. В контроллер движения Оп&тВоГ интегрирован чип 1М1Т 1СМ 42670 Р, который главным образом измеряет угловую скорость и линейное ускорение робота, передавая данные через последовательный порт в микроконтроллер. । ми Рис. 5.38 ❖ Схема IМII в контролтере движения Опд!пВо1 Код обработки данных 1М11 в контроллере движения представлен ниже.
// Функция обработки данных последовательного порта 3, вызызаемая при получении каждого байта Ц данных. усгб Соре5ег1а130аЬа(ипз1дпеб сбаг исСаба) { зЬагЬс ипзтдгеб сбаг исРхВиСГег[250Л; зЬаЫс ипзгдпеб сЬаг исКхСпЬ = 0; // Сохранение полученных данных в буфере. исРхВиЫег[исКхСпЬ++] - исОаба; // Если заголовок данных неверный, то повторный поиск заголовка данных 0x55 1Г (исРхЕиЫег[0] != 0x55) { исйхСпб=0; гегигп; } // Если количество данных меньше 11, то возврат. 11 (исКхСпЬ < И) гегигп; // Определение типа данных гироскопа. // Некоторые данные отправляются гироскопом только после настройки вывода через ПК-программу, // предоставленную официально НИМоЫоп // 3 данном проекте учитываются только ускооение, угловая скорость и угол. зЖсЬ(исРхЕиЫег[1]) { сазе 0x50: лепсру(&51сТ1Г|е, 8исКхВиббег[2], 8); Ьгеак; сазе 0x51: "1ег1сру(&зТсАсс, &исКх.ВиГЕег[2], 8); Ьгеак; // Ускорение. сазе 0x52: лепсру(&з1сСуго, &исРхВиЫег[2], 8); Ьгеак; // Углевая скорость. сазе 0x53: лепсру(&з1сАпд1е, &исйхВиб1ег[2], 8); Ьгеак; // Угол. сазе 0x54: лепсру(&з1сМад, &исКхВиЫег[2], 8); Ьгеак; сазе 0x55: ч1епсру(&з1сС51а1из, &исКхВи-Ебег[2], 8);Ьгеак; сазе 0x56: лепсру(&ь1сРгез5, ХисРхВЖег[2], 8); Ьгеак; сазе 0x57: лепсру(&зТсЬспЬа1, &исРхВиНег[2], 8); Ьгеак; сазе 0x58: лепсру(&ь1сСР5У, &исРхВиЫег[2], 8); Ьгеак; сазе 0x59: лепсру(&з1сС, &исКхВЖег[2], 8); Ьгеак; } исРхСпб = 0; // Очистка буфера. } Ц Отправка ускорения гироскопа. ус!б Асс_5епб_0аЬа(ус1б) { йбеНпе Асс^Е^ 7 и1п18_1 с!аСа_ЬигЖг[АссЕЕР] = {0}; и1пг8_1 1, сбескпип = 0; Ц Младший бант впереди, старший байт позади. Ц Ускорение по оси х. баЬа_Ьи11ег[0] = збсАсс.а[0]&0хЕР; ЬаТа_ЬиНег[1] = (зЬсАсс.а[0]»8)&0хЕЕ; // Ускорение по оси у. <Жа_ЬЖег [2] = зЬсАсс. а [ 1]&0хЕЕ; баТа_Ьи1бег[3] = (зТсАсс а[1]»8)&0хЕг;
// Ускорение .по оси г. с1аба_ЬиЕЕег[4] = збсАсс. а [ 2 ]&0хЕЕ; баЕа_ЬигЕег[5] - (збсАсс.а[2]^>8)Х0хЕЕ; // Вычисление контрольного байта путем суммирования всех байтов данных & ОхЕЕ. Гог (г - 0; г < АссЬЕМ-1; г++) сЬескниР! += <1ат:а_ЬиЕЕег [г]; <1а1:а_ЬиЕЕег[АссЕЕМ-1] = сЬескпия 8, ОхЕЕ; иАРТ1_РиЕ_СЬаг(.0х55); // Заголовок кадра. 11АКТ1_Р1Л_С1таг(0х03); // Идентификатор. иАРТ1_РиЕ_СЬаг(0х0б); // Длина данных (в байтах). 11АРТ1_Ри1:_С1таг((1аЕ:а_ЬиЕЕег[0]); 11АРТ 1_РиЕ_СЬа г (,баба_ЬиЕЕег [ 1 ]); 11АРТ1_РиЕ_СЬаг(РаРа_ЬиЕЕег[2]); 11АРТ1_РиЕ_СЬаг(бага_ЬиЕЕег[3]); 11АРТ1_Ри1:_С1паг((1аЕ:а_ЬиЕЕег[4]); 11АРТ1_РиЕ_СЬаг(бага_ЬиЕЕег[5]); 11АРТ1_РЩ_С1таг(ааба_ЬиЕЕег[6]); 11АРТ1_Р11б_СЬаг(0хВВ); // Хвост кадра. } // Отправка угловой скорости гироскопа. уоЕа Суго_5етс1_Ьа1:а(ус1с1) { #СеЕ1пе СугоЬЕМ 7 игпб8_б бака_Ьи€1:ег[Суго1-Е1Ч] = {0}; и1пЕ8_1: 1, сбескпип = 0; // Младший байт впереди, старший байт позади. // Угловая скорость по оси х. баСа_ЬигТег[0] = збсСуго.н[0]&ЭхЕЕ; баРа_РиЕЕег[1] = (<,ГсСуго.1л/[0]»8)&ЕхЕЕ; Ц Углевая скорость по оси у. баРа_РиЕЕег[2] - зРсСуго.и[1]&ЭхЕЕ; баба_ЬиЕЕег[3] = (збсСуго.и[1]»8)&0хЕЕ; Ц Угловая скорость по оси г. баба_ЬиЕЕег[4] = збсСуго.и[2]&9хРЕ; баба_РиЕтег[5] = (збсСуго.1л/[2]»8)&0хЕЕ; // Вычисление контрольного байта путем суммирования всех байтов данных & ОхЕЕ. Гог (т = 0; г < бугоСЕИ-1; т++) сЬескпип + баба_ЬиЕЕег[г]; баРа_ЬиЕЕег[СугоЕЕМ-1] - сЬескпип & ОхЕЕ; иАРТ1_Риб_СЬаг(0х55); // Заголовок кадра. 11АРТ1_РиЕ_СЬаг(0х04); // Идентификатор. иАРТ1_РиЕ_СЬаг(0х06); // Длина данных (в байтах). иАРТ1_РиЕ_СЬаг(.бага_ЬиГЕег[0]); 11АРТ1_Ри1_СЬаг(ааРа_ЬиЕЕег[1]);
!1ЛРТ1_Ри1:_С11аг(баСа_оиЕЕег[2]); 11АРТ1_Ри1:_СЬа1'(ааТа_ЬиНе|[3]); 11АРТ1_РиГ_СЬаг(баСа_ЬиЕЕег[4]); 11АР.Т1_Ри1:_СЬаг (с1аТа_ЬиГГег[5]); иЛКТ1_Р||Т_С11аг(с1аса_ЬиПег[6]); 11АРТ1_Ри1:_СЬа1'(0хВВ); // Хвост кадра. } // Отправка углов Эйлера гироскопа. уотс! Апд1е_$епс1_0а1:а(7от.с1) { #беНпе АпдТеСЕМ 7 и!п!8_! басаЬитТе г [ Апд!е1_ГН ] = {0}; и!п!8_! т., сбескпип = 0: // Младший байт впереди, старший байт позади. // Яо1.!. с!агг_ЬиПег [0] = 5!сАпд!е.Апд!е[О]&0хЕЕ; ба!а_ЬиЕЕег[1] = ($!сАпд!е.Аад!е[0]»8)&0хЕЕ; // РсбсЬ. Ра!а_ЬиГЕег[2] = збсАпдТе.Апд!е[ 1 ]&0хЕЕ; даса_ЬиГТег[3] = ($ГсАпд!е.Апд!е[1]>'8)&0хЕЕ; // Хаи. с1ата_ЬиНег[4] = 5ГсАпд!е.Апд!е[2]&0хЕЕ; ба!а_ЬиГЕег[5] = (5!сАпд!е.Алд1е[2]»8)&0хЕЕ; Ц Вычисление контрольного байта путем суммирования всех байтов данных & 0хЕЕ. Гог (т. = 0; ! < Апд!е1.ЕМ-1; с+т) сЬескпип +- ба!а_ЬиЕГег[!]; <1а!а_ЬиГГег[Апд1е!Е|А1] = сбескпип & 0хЕЕ; иАРТ1_Ри!:_С1таг(0х55); // Заголовок кадра. ОАРТ1_Ри!:_СЬаг(0х05); // Идентификатор. 0АРТ1_Ри!_С1таг(0х06); // Длина данных (в байтах). 11АРТ1_Ри1:_СЬаг(ба!:а_ЬиЕЕег[0]); 0ЛКТ1_Ри!:_СЬаг(баСа_оиЕЕег[1]); 11АРТ1_Ри1:_СЬа1'(аа!:а_ЬиГЕег[2]); 11АРТ1_РиГ_СЬаг(ба!а_5иЕЕег[3]); 11АР.Т1_Ри1:_СЬаг (с1а!а_ЬиЕЕег[4]); иАКТ1_Рн1:_СЬаг(баСа_ЬиЕЕег[5]); 11АРТ1_Ри1:_СЬаг(ба!а_ЬиЕЕег[й]); с1АРТ1_Ри!_Сйаг(0хВВ); // Хвост кадра. } В приведенном выше коде функции Асс_8епс1_Ба1а(), Суго_8епс1_Оа1а() и Ап^1е_8епс1_Оа!а() постоянно сохраняют данные об ускорении, угловой скорости и угле наклона в буфер данных. Когда кадр данных заполняется, функция Соре8епа13Ва!а() объединяет данные и отправляет их в буфер по- следовательного порта для дальнейшей передачи.
5.5.3. Человеко-машинное взаимодействие: ясность состояния на низком уровне В процессе разработки легко упустить из виду еще один аспект - человеко- машинное взаимодействие. Как робот должен сообщать о низком уровне заряда аккумулятора? Можно использовать звуковой сигнал! Как указать на обновление версии программы робота? Можно изменить цвет светодиода! Как быстро дать понять, что в работе робота произошла ошибка? Можно использовать светодиод и звуковой сигнал одновременно! Поэтому в контроллере движения специально предусмотрены компонен- ты для человеко-машинного взаимодействия - звуковой сигнал и светодиод, схема которых показана на рис. 5.39. Рис. 5.39 ❖ Схема звукового сигнала и светодиода в контроллере движения Опд!пВоГ Звуковой сигнал и светодиод управляются программированием через вы- воды микроконтроллера, ниже приведены ключевые фрагменты программ- ного кода для этого. Вы можете самостоятельно разработать способ взаимо действия в зависимости от функциональности робота. Для примера включения и выключения светодиода сначала реализуем со ответствующий АР1 для светодиода. Согласно рис. 5.39, интерфейсом ввода/ вывода светодиода является РС13, поэтому необходимо определить его со- ответствующий интерфейс следующим образом: #деНпе ВЩ2ЕК_Р0КТ СРЮВ #<1еНпе ВЩ2ЕВ_РЩ СР1С_Р1Р_13 Реализацию мигания светодиода, то есть управление уровнем напряжения на выводе РС13, можно произвести с помощью АР1 для управления напря- жением ввода/вывода. уоЮ СРЮ 5еШ15(СРЮ_Туре0еб* СРЮх, итлПб.Д СРЮ Р1п) а55ег1:_ра'ап(15_СРЮ_АЕЕ_РЕЧ1РН(СРЮх));
а55ег-1_рзган( 15_СР1О_Р1Ч(СР] 0_Ргп)); 6Р10х->В5РК = ОРЮ Ргп; } На основе АР1 СРЮ ЗегВИв можно создать АР1 для управления включением и выключением светодиода. // Включение светодиода. чогс! 1ЕО_О1Д уотс!) { ОРЮ йе5е1ВН5(ЕЕ0 РОКТ, ЕЕО_Р1Ы); } // Отключение светодиода. усЕС ЕЕО_ЭЕЕ(уог<1) { СРЮ_5еЮИ5(ЕЕ0_Р0КТ, ЕЕО_Р1И); } Если необходимо включить светодиод, мы вызываем функцию ЕЕВ_ОНТ(), если выключить - ЕЕП_ОГЕ(). На этом изучение основных функций контроллера движения на плате за- вершено. Встраиваемые системы широко применяются в робототехнике, и в реальных приложениях часто используются дополнительные датчики и более сложные функции. Однако, несмотря на все сложности, они обеспе- чивают стабильную базу для роботов благодаря гибкости и реальному вре- мени выполнения. Реализация верхнего уровня системы управления будет рассмотрена в разделе 5.6. 5.6. Система управления роботом: от «мышц» к «мозгу» У нашего робота уже есть «тело» и «мышцы», теперь необходимо разработать для него «мозг». Приводную систему и систему сенсоров в конечном итоге необходимо связать с системой управления, которая и является «мозгом». На этом поле ведется основная работа по разработке роботов, а КО5 2 является на нем ключевым игроком. 5.6.1. Вычислительная платформа системы управления Система управления требует мощного процессора в качестве вычислитель- ной платформы. В реальных условиях установка полноценного компьютера в робота не всегда целесообразна, поэтому обычно используются более ком-
пактные и энергоэффективные встраиваемые процессоры, такие как КПКХЗ, КазрЬеггу 14 5, 1е1яоп Опп Капо и др. Сравнение основных параметров этих процессоров представлено в табл. 5.1. Таблица 5.1. Сравнение параметров популярных встраиваемых процессоров Встраиваемая система КахрЬепу И 5 {егяоп Опп Мапо клкхз Процессор А76,4 ядра А78, 6 ядер А53, 4 ядра Память 4/8 Гб 4/8 Гб 2/4 Гб Подсистема ИИ - СРП/СШ1А ВРИ Вычислительная мощность - 20/40 ТОР8 5ТОР8 Порты расширения ПЗВ/ЕТН/С81/НПМ1 Энергопотребление Макс. 15 Вт Макс. 15 Вт Макс. 15 Вт Операционная система ЦЬиШи 20.04/22.04 ЦЬппШ 20.04/22.04 ПЬипШ 20.04/22.04 Среда разработки роботов КОЗ 1/308 2 КОЗ 1/КОЗ 2 1заас ЗПК КОЗ 1/КОЗ 2 ТКОЗ Цена 450-700 юаней 2600-3600 юаней 329-399 юаней С учетом целевых характеристик Оп§тВо1, при условии хорошего со- отношения цены и качества, желательно, чтобы робот демонстрировал больше интеллектуальных функций. Чем выше вычислительная мощность платформы, тем более плавно выполняются интеллектуальные приложе- ния, такие как распознавание людей, отслеживание объектов и т. д. Если оценивать в целом, КПК ХЗ обладает вычислительной мощностью 5 ТОРЗ и имеет явное преимущество в соотношении цены и качества по сравнению с другими платформами. В рамках разработки роботов все три платформы поддерживают КОЗ, а в КПК ХЗ также предоставлена глубоко оптимизиро- ванная система ХОЗ 2 - ТКОЗ, включающая множество интеллектуальных алгоритмов. Таким образом, для Оп^шВоГ отлично подходит КПК ХЗ в качестве вычис- лительной платформы для системы управления интеллектуальной тележкой. При разработке и проектировании интеллектуальных тележек и роботов можно ис- пользовать и другие встраиваемые процессорные платформы. Принципы разработки и реализации будут в основном совпадать с приведенными в этой книге. 5,6.2. Прошивка и настройка системы управления Далее .мы установим систему на КПК ХЗ в Оп§тВо1 и настроим ее для под готовки к дальнейшей разработке. Инструкции по установке можно найти в руководстве на официальном сайге КПК. Оп§шВо1 также предоставляет образ системы для установки КОЗ 2 и ТКОЗ. ДК Следующие действия можно выполнить, следуя последним инструкциям на офиии- альном сайте ОпдюВоГ.
1. Подготовка оборудования Выполните подготовку оборудования, как показано на рис, 5.40. 1. Соберите интеллектуальную тележку Оп§тВо1, убедившись в правиль- ности подключения аккумулятора. 2, Найдите в Оп^тВоГ картридер и подготовьте 80-карту для записи об- раза системы. 3. Используйте модуль последовательного порта для подключения КИК ХЗ к ноутбуку, чтобы на следующем этапе можно было увидеть инфор- мацию о запуске образа системы. 4. Если у вас есть сетевой кабель и монитор с НОМ1-портом, они могут понадобиться в дальнейшем (не обязательно). Рис. 5.40 ❖ Схема подключения периферийных устройств к КОК ХЗ После подготовки аппаратного обеспечения можно переходить ко второму этапу. 2. Установка операционной системы ЦЪипШ 1. На официальном сайте Оп§тВо1 загрузите последнюю версию образа для 80-карты. 2. Подключите 80-карту к компьютеру с помощью картридера. Рекомен- дуемый объем 80 карты - не менее 16 Гб. 3. Запустите программное обеспечение для записи образа, как показано на рис. 5.41. Убедитесь в правильности выбора 80-карты. Выберите образ системы для записи и нажмите кнопку СТАРТ. Шкала прогресса покажет текущий статус записи. После завершения записи закройте программу.
0 НиЛк 4 9 2256 (РогТаЫе) - X Свойства диска ---------------------------------- 4 Кики; 4 92256 (РоПаЫе) Свойства диска --------------------- Устройство МСН.АВЕ1. (Е-) [16 ГБ] Метод загрузки опд1пЬо1_еп_Х5 1гпд ВЫБРАТЬ Схема раздела Целевая система ОЕЕ1 (не-С5М) Устройство Ы0_1_АВЕ1_ (Е) [16 ГБ] Метод загрузки опд1пЬоЕ_еп_Х51тд Схема раздела МВК ~ 0 ВЫБРАТЬ Целевая система ВЮ5 (или ЦЕЯ-С5М) а Скрыть расширенные свойства диска О Список 115В-дисков Добавить исправления для старых В105 С Проверка носителя 11ЕЕ1 во время выполнения а Скрыть расширенные свойства диска О Список 058-дисков Добавить исправления для старых ВЮ5 Проверка носителя ОЕП во время выполнения Параметры форматирования ---------------------- Новая метка тома 16 ГБ Файловая система Размер кластера ЕАТ32 (по умолчанию) 8192 байт (по умолчанию) V Показать расширенные параметры форматирования Статус ---------------------------------------- Параметры форматирования -------------- Новая метка тома 16 ГБ Файловая система ЕАТ32 (по умолчанию) Размер кластера 8192 байт (по умолчанию) V Показать расширенные параметры форматирования [ СТАРТ ] ЗАКРЫТЬ © О 5 (3 [ СТАРТ ] ЗАКРЫТЬ Используется образ. опд|пЬоС еп Х5 «гид Обнаружено устройств: 1 002035 ©02® Рис. 5.41 ❖ Запись образа системы на 50-карту с помощью программы ЕиГиз 5. Запуск системы 1. Убедитесь, что интеллектуальная тележка Оп&тВоЕ установлена пра вильно. 2. Подключите отладочный порт КПК ХЗ на стороне робота с помощью модуля последовательного порта. Порядок подключения проводов по- казан на рис. 5.42. Рис. 5.42 ❖ Подключение отладочного порта КЭК ХЗ с помощью модуля последовательного порта
3. Подключите модуль последовательного порта кЪГЗВ порту компьюте- ра, запустите программное обеспечение для работы с последователь- ным портом, выберите устройство порта, установите скорость переда- чи данных на 921 600 и отключите управление потоком, как показано на рис. 5.43. Зеьзюп зеШпдз 88Н ТеШе! Кзй Хбтср НОР УИС РТР 8ГТР 8епа1 А1е 8Ье11 Вгомзег МозП Аюз83 У781_ Ва51с Зепа! зеНтдз 8епа1 роб Абчапсеб 5епа1 зейтдз Тегтта! зейтдз ♦ Вооктагк зеШпдз 11 уои пее<11о (галзТег Й1ез (е д гснйег сопйдигабоп Я1е), уои сап иве МоЬаХ(егт етЬеббеб II- 1Н зегчег Зепа1 епдте | РиТТУ (зНоууз тапиа! СОМ роб зейпд) у] 0а1аЬЛз |б у| 8!орЬ(1з 1 у| Рагйу | Моле | Р1оуу соп1го1। ® Незе! беТаиНз Ехеси1е тасго а! зеззгоп з!аб I <попе> ’Зеп/егз" «тбо’Л' —> ТЕТР зеп/ег ©ОК О Сапсе! Рис. 5.43 ❖ Настройка программного обеспечения для подключения к КОК ХЗ Ч Если устройс-во перга не обнаружено, сначала установите системный драйвер для " модуля последовательного порта, затем повтооите попытку. 4. Вставьте ЗП-карту с записанным образом и включите питание ин- теллектуальной тележки Оп§тВо1. В программном обеспечении для работы с последовательным портом появится журнал запуска. Через некоторое время появится приглашение для входа, как показано на рис. 5.44. Введите имя пользователя и пароль (гооЕ: гооЕ).
СЗ СОМ9 ($!1!соп ЬаЬ& СР210х О5В То 1)АЙТ ВгИде (СОМ9)) X * ® ? х щ V е • -• «> X вегуег Ехй |~ рыск соппес(~| 7. С0М9 (8Й1С0П ЬаЬз СР210х 1)8: ] 5!аг!еб ЫеЪ/огк Мападег 8с ггр! 0гзра!с11ег Зегугсе. ] 5!аг!ед 1_8В: адЬ баетоп. 7.456921] гсЛоса! : 0 8!аг!ед 5!аг!е<1 51аг!е<1 КеасЬед 8!аг!ес] 5!аг!ес1 кеасбеб /е!с/гс Лоса! СотраКЫШу. 6е!!у оп 1!у1. 5егга1 6е!1у оп 11у80. 1а где! Годен Рготр!з. 1_5В: ЬоЬо! Кбтг гпг!. В1ие!оо!К тападетеп! тесНапгбш. 1агде! МиПг-Озег 8уз!ет. 8!аг!гпд ша!сЬ(1од йаетоп... 5!аг!е<1 81аг! хИупс а! 51аг!ир.. 5!аг!ед ыа!сИс1од баетоп. кеасЬед !агде! бгарЫса! 1п!ег!асе. 8!аг!гпд 0рба!е 11ТМР аЬои! 8уз!ет ЯипТеуе! СНапдез... ЕгпгзИеб ирба!е 11ТМР аЬои! 5уз!ет КипТеуе! СК ап дез. !>Ьип!и 20.04.4 1_Т8 иЬип!и «у80 иЬип!и !одгп: гоо! Раззыогс!: ^еГсоте !о иЬип!и 20.04.4 1_Т8 (СШ/Ггпих 4.14.87 аагсЬ64) * Ооситеп!а!гоп: * Маладетел!: * Зиррог!: Ьаз! Ходгп: Егг 8ер гоо!@иЬип!и гоо!@иЬип!и гоо!@иЬип!и | 1 т .салопгса!.сот ’ .сот/адуап!аде 2022 Тгот 192.168.1.100 оп р!з/0 1ЖВ1Е615ТЕЙЕВ УЕК81ОМ - Р1еа5е зиррогС МоЬаХТегт Ьу зиЬзспЬгд (о (Ье рго(е55юпа1 ебйоп Неге Кгсрз //тоЬахСегт тоЬа(ек.пе( Рис. 5.44 ♦♦♦ Вход в операционную систему 11ЬипГы на ВОК ХЗ через последовательный порт 4. Расширение пространства ЯП-карты Для уменьшения размера образа системы, удобства загрузки и записи сво- бодное пространство в образе системы является сжатым. Если необходимо использовать полное пространство 8В-карты, его нужно расширить вручную. После запуска ЗВК ХЗ и входа через последовательный порт выполните сле- дующие команды, как показано на рис. 5.45. $ зсс1с д-оирагг /<1е^/рпсйк2 1 $ зис!с гемгегГз /с|еу/"1псЫк2р1 гоо1@иЬип1и§ис!о дгомраг! /с1еу/ттсЫк2 1 СНАМ6Е0: рагННоп=1 81аП=2048 оТд: 81?е=18948096 епс!=18950144 пей: 81ге=62331871 еп<1=62333919 гоо!фиЬип1и&ис1о гез1ге2^$ /деу/пнпсЫк2р1 геаыегТб 1.45.5 (07-Зап-2020) ЕПебузЕет а! /с1еу/ттсЫк2р1 15 тоипСед оп /тесКа/вскагсП; оп-Кпе гезхгхпд гедихгед о1д_де5с_Ыоск5 = 1, пем_де5с_Ыоск5 = 2 ТЬе ТИе5у51ет оп /^еу/ттсЫк2р1 15 пом 7791483 (4к) Ыоск5 Хопд. Рис. 5.45 ❖ Расширение пространства 50-карты После успешного выполнения перезагрузите систему, чтобы изменения вступили в силу. Используйте следующую команду для проверки успешного расширения пространства системы, как показано на рис. 5.46. В нашем слу- чае используется 8П-карта объемом 32 Гб. О
гоо1@иЬип1и сИ -11 ЕИеаузТет 51ге 115ед Дуа И 050% МоипТес! оп /с1е7/гоо1 306 8.96 216 31% / 1.66 0 1.66 0% /дем 2.06 0 2.06 0% /дем/зЪт ТтрТз 394М 1.2М 393М 1% /гип ТтрТб 5.0М 0 5.0М 0% /гип/Хоск ТтрТз 2.06 0 2.06 0% Дуз/Тз/сдгоир ТтрТз гооТ@иЬип1и 394М 1 0 394М 0% /гип/изег/б Рис. 5.46 ❖ Проверка выполнения расширения пространства 50-карты 5. Настройка сети После установки ЦЬцпШ и запуска системы произведите настройку сети IV! • И, выполнив следующие команды, как показано на рис. 5.47. $ зис1о ппсП йеЛсе ЛЕ’. геьсап $ ьис!о ппсП с1еЛсе ЛЕЕ ЕЕзс $ зис1о ЛЕ1_соппес1 "5510" "РА55Н0'' # Сканирование сетей НЕ-Ет.. # Список найденных сетей 1Л-Е1. # Подключение к указанной сети Л-ЕЕ. гоо1@иЬип1п]зидо пгосИ деугсе гезсап гоо1@иЬип1изис!о птсН с!еу1се ыШ 1151: 1И-05Е В55Ю 55Ю МООЕ СНАМ КАТЕ 51СМАЕ ВАК5 5ЕС0В1ТУ А2:90:7Е:55:0А:АА - - 1пТга 2 ,0 МЬИ/З 94 - - 50:2О:ВВ:О0:0В:7А тг8еа_са_0019 1пТга 2 65 МЬтЛ/з 82 МРА2 34:ЕС:А1:9С:А7:АВ 602 ТпГга 1 130 мьи/з 79 _ы_ МРА1 МРА2 9С:9О:7Е:55:0А:АА ХН-Ноте 1пГга 2 130 МЫ1/5 72 ШРА1 МРА2 74:05:А5:93:24:2В В2-501 1пГга 11 270 МЬИ/5 65 КРА1 МРА2 9С:08:63:0А:4С:22 НЕ-ЕРТ130 1пТга 6 135 МЫ1:/5 49 л - - ОС:ЕЕ:18:88:30:1В ТН1МК-Ие1ыогк 1пТга 11 405 мьи/з 37 МРА1 ИРА2 ЕС:7С:02:40:Р0:В7 циег7705ОЗ ТпГга 3 270 мьи/з 29 ИРА1 ИРА2 С8:8Е:26:19:0С:4Р Ториау_190С4Е 1пТга 1 130 МЬг1/з 22 — ЫРА2 гоо1@иЬип1и зийо мх1Ч_соппес1: »" 'Т " Оеухсе 'и1ап0' зиссеззТиНу ас1й/а1ес! «ИЬ '4еа86192-91Та-4сд0-Ьдд7-ае08ТТб9с1с171 . Рис. 5.47 ❖ Сканирование доступных сетей и подключение к сети \У1-Р1 из командной строки Если терминал возвращает сообщение знссеззГнПу асНуаГей, это означает успешное подключение кШЕ ГЕ Для подтверждения подключения можно вы- полнить команду рту, для любого сайта, Если команда рнщ проходит успеш- но, значит, подключение к сети установлено, и можно приступать к загрузке и обновлению программного обеспечения. 6. Удаленный доступ по ЯЯН После настройки сеги можно подключаться к систе1ме не только по провод- ному подключению через последовательный порт, но и удаленно по 88Н через беспроводную сеть, как показано на рис. 5.48. Если используется виртуальная машина, необходимо установив сетевое псдкгюие- ние в режим моста.
МишЕхес Типпе1|пд Раскаде:; ьегуегь М9. 192.168.31.246 > 55Н 5655хоп 1о гоо!@192.168.31.246 ? МоЬаХ1егт Рег5опа! Ед11гоп у22.0 ? (55Н сХхеп!» X зегуег апд пеХногк ХооХь) | ршск соппесТ сопЙд .дйсопПд ргоГИе узсойе-зел/ет ЬазЬДпЯогу . ЬазМодои! иде( >15(5 _ КетоТе — топ|1оппд ? Оггес! 55Н ? 38Н сотргевбХоп ? 55Н-Ьгоы5ег ? Х11-!огмагдхпд X (дхБаЫед ог по! 5иррог!ед Ьу зегуег) ► Еог тоге хпТо, с!г1+с1хск оп Ье1р ог V 151.1 оиг неЬаНе. ИеХсоте 1о ЦЬип1и 20.04.4 ЬТЗ (бИЧ/Ипих 4.14.87 аагсЬ64) * 0оситеп1а11оп: г * Мападетеп!: * 5иррог1: !_а51 Ходит: ЕгХ Зер гоо1@иЬип1и гоо!@иЬип!и гоо!@иЬип!и гоо1(ЭиЬип1и рмд /гоо! гоо1@иЬип1и15 гоо!@иЬип!и| . иЬип!и.сот л иСапопкаТлот , .сот/адуапХаде 1гот 192.168.31.208 ^о11ош Сегтша! Го1с1е 11МВЕ618ТЕЙЕЦ УЕК810Й - Р1еазе зирроП МоЬаХТегт Ьу зиЬзсгЬюд То ТЬе ргоГеззюпа! ебйоп Ьеге ЬИрз //тоЬахТегт тоЬаТек пеС О, Рис. 5.48 ❖ Удаленный вход в операционную систему 11бипТи на ОпдтЗоТ через 55Н 7. Управление движением тележки После завершения всех настроек можно попробовать управлять движением тележки, чтобы убедиться в правильности конфигурации. После подключения по 58Н выполните следующую команду для запуска узла управления шасси робота. Журнал вывода показан на рис, 5.49, $ го5? ТаипсЬ огсдгпЬо1_ЬгХпдир огтдхпЬоХЛаипсп.ру V Ошск соппес) 8Р 192 168 31 246 Щ « ЗезБюп ЗегтегБ 4 |\ 2. 192.168.31.246 * 8ез5юл5 У<ем 5рИ МикЕхес Типпе1|пд Раскадез ЗеШпдз > 55Н 5655Топ 1о гоо!@192.168.31.246 ? Охгес! 55Н ? 55Н сотрге55хоп ? 58Н-Ьгом5ег ? ХН-Еогмагдхпд © Не1р (дх5аЫед о г по! 5иррог!ед Ьу зегуег) сопЛд угсойе-гегуег .1 ЬазЬ_Ыяогу Ьэ5>1_1одО1Л , ЬзеЬгс дйсопПд ргоЫе у|гп1пГо игде1-Ьв1в НеХсоте 1о 11Ьип1и 20.04.4 ИЗ (6М11/1_хпих 4.14.87 аагсЬ64) * ОоситепХаХхоп: * Мападетеп!: * ЗиррогХ: Ьаз! Ходхп: Егх Зер иЬип!и.сот .сапопхсаХ.сот :от/адуап!аде Тгот 192.168.31.208 гооПЗиЬипТигов2 ХаипсЬ огхдхпЬо!_Ьгхпдир огхдхпЬо!.ХаипсЬ.ру [1МЕ0] 779 [1МЕ0] [1ЫЕ0] [1МР0] [ХаипсЬ]: АН Ход Шб5 сап Ье Тоипд ЬеХом /гоо1/.го5/Ход/2О22-09-02-15-57-27-ЗО9172-иЬип!и-18 [ХаипсЬ]: ОеТаиХ! ХоддХпд уегЬозИу 15 5е! !о 1ИЕ0 [ог1дй1Ьо!_Ьа5е-1]: ргосе55 51аг1ес1 их!Ь рхд [51а!хс_!гап5Тогт_риЫ15Ьег-2]: ргосеьъ 51аг1ед ыНЬ рхд [огхдхпЬо!_Ьа5е-1] 1_оадигд рагате1еГ5: [огхдтпЬо!_Ьа5е-1] [огхдтпЬо1_Ьа5е-1] [огхдхпЬо!_Ьа5е-1] [огхдхпЬо!_Ьа5е-1] [огхдхпЬо!_Ьа5е-1] Нето1е топйоппд [51а!хс_!гап5ТогтриЫ х$Ье г-2] [IИЕО] - рог! пате: Ну53 - соггес! !ас!ог ух: 0.8980 - соггес! !ас!ог у!Ь: 0.8740 - аи!о 51ор оп: 0 - иве йпи: 6 [51а!гс_!гап51о гтри Ы т.5Ье г_2Н!о] п 042 г 11 с Ы26]: Зрхппхпд ип!!1 кгНед риЫХбЫпд 1гап51огт Тгот '/Ьа5е_1гпк' !о '/ипи ХХпк' -оИош Тегт1па1 Ео1де [огхдхпЬо!_Ьа5е-1] [1МР0] [огхдхпЬо1_Ьа5е-1] [1МЕ0] "Еч1 [огхдй1Ьо1_Ьа5е]: огхдйтЬо! зегхаХ рог! орепеб [ог1д1пЬо!_Ьа5е]: ОгхдхпВо! 8!аг!, еп]оу XI. 4 о X * ЦМНЕИ8ТЕКЕР УЕН81ОМ Р1еазе шррогТ МоЬаХТегт Ьу хиЬзсгЬпд То ТЬе ргоЕевяопа! еб&оп бете- Кйрз //тоЬахСегтп тоЬаТек пеС Рис. 5 49 ❖ Запуск узла управления шасси робота
Затем откройте еще один терминал, подключитесь по 88Н и выполните следующую команду для запуска узла управления с клавиатуры. Журнал вы- вода показан на рис. 5.50. $ гоз2 гип Се-1еэр_ги151:_кеу5оагс1 Се1еор_ЬЛМ_кеуЬоагс1 ^192168 31.246(2) 4 . ЧЕ Ш Зеззюп Зегуегз Тоо1з Сатез Зеззюпз 1Леж Зркг X У И * я’ О МиЮЕхес Типпе1тд Раскадез ЗеНтдг Не1р 0 ЕхИ (^шск соппесС сопйд узсойе-зеп/ег ЬаеЬ_Ь|з1огу Ьа$)1_1одои( ЬазЬгс дИсопЙд И 2 192 168 31 246 * Мападетеп!: * ЗиррогЧ: 1_азЬ 1од1п: РгЁ 5ер РХл. 192.168.31.246 (2 — ,сапов хса1. сот -. сот/ас1уапЕаде Л Тгот 192.168.31.208 гоо1@иЬип1шгоз2 гип 1е1еор_1м151:_кеуЬоагс1 1е1еор_1:ыт51_кеуЬоагс1 ТЬгз по4е (акез кеургеззез (Тот 1Ье кеуЬоагб апс! риЫЛзЬез 1Кет аз Тч1з1 теззадез. II могкз Ьез! ит.111 а 115 кеуЬоагй 1ауои±. Моутпд агоипск .иттСо .шдеС ЬЯз Ь : 4омп (-2) апу(Ы.пд е1зе : зЬор 4/2 м/х тпсгеазе/десгеазе тах зреесЬ Ьу 10% гпсгеазе/десгеазе оп!у Нпеаг зреес! Ьу 10% е/с : й1сгеазе/с1есгеа5е оп!у апдиТаг зреей Ьу 10% Пепкйе топйоппд -о Но и/ гептила! Ро1с1е сиггепЫу: зреей 0.5 ЦМЙЕ615ТЕЙЕЦ УЕЙ5ЮН Р1еа$е киррогС МоЬаХСегт Ьу аиЬвсгЬгд Со СЬе ргоСеяяюпа! ейСюп Неге Нйрз //тоЬахСегт тоЬаСекпеС Рис. 5.50 ❖ Запуск узла управления с клавиатуры Следуя подсказкам в терминале, можно управлять движением интеллек- туальной тележки Оп§1пВоС вперед, назад, влево и вправо, а также динами- чески регулировать скорость движения. Теперь мы можем управлять движением не только черепахи и модели ро- бота в СагеЬо, но и, наконец, движением реального робота. Поаплодируем себе! 5.7. Резюме В этой главе мы перешли от моделирования в симуляционной среде к раз- работке реального устройства. Сначала был проведен анализ ТпгНеВо13 и создана интеллектуальная тележка Оп§тВоС. Затем, шаг за шагом, через создание платы контроллера движения, мы реализовали основные функции системы привода робота, включая управление двигателем, замкнутое управ-
ление, расчет кинематики, управление питанием, управление 1МН и взаимо- действие на низком уровне. Далее была представлена программная архитек- тура системы управления и системы привода, что позволило получить более полное представление о разработке программного обеспечения. В этой главе мы завершили макродизайн и низкоуровневую разработку робота. Начиная с главы 6 мы продолжим поэтапно разрабатывать и реализовывать различ- ные функции в системе управления, двигаясь снизу вверх.
Глава Чх Управление и восприятие в К0$ 2: учим робота двигаться и видеть В главе 5 мы создали приводную систему, которая позволила роботу начать движение. Однако на данном этапе он способен выполнять лишь базовые движения, а его датчики могут воспринимать только собственное состоя- ние. В этой главе рассматривается расширенная интеграция КОВ 2 в систему управления роботом и добавление ему «глаз», чтобы он мог видеть окружа- ющую среду. 6.1. Разработка протокола коммуникации робота С помощью функций встраиваемых систем уже можно в начальной степени управлять действиями робота, но такой подход имеет определенные огра- ничения в вопросах интеллектуализации и гибкости управления движением. Например, каждое незначительное изменение или обновление программы требует повторной компиляции и записи в контроллер движения, а ограни- ченные вычислительные возможности контроллера затрудняют реализацию интеллектуальных способностей робота. Поэтому создание эффективного и мощного «мозга» является ключом к интеллектуализации робота. Этот «мозг» должен обладать выдающимися вычислительными способностями для поддержки сложных алгоритмов, их эффективного выполнения и обработки в реальном времени, а также вы- сокой расширяемостью для облегчения интеграции и обновления робото технических технологий в будущем. В то же время обеспечение стабильной и эффективной синхронизации данных между «мозгом» и контроллером
движения крайне важно, так как это является базой для точного управления, быстрого реагирования и интеллектуального принятия решений. Между системой управления роботом и контроллером движения сущест- вует «мост», который обеспечивает быструю, точную и стабильную передачу данных между ними, как показано на рис. 5.4. Как же построить этот «мост»? Для этого требуется совместная поддержка аппаратного и программного обес печения робота. Если говорить о ОгщптВо!, передача данных между си- стемой управления и контроллером движения на аппаратном уровне осу- ществляется через последовательный порт. На программном уровне не- обходимо разработать протокол обмена данными, подобный грамматике человеческого языка, чтобы стороны могли взаимодействовать. В протоколе последовательной связи определяемся содержание пакета данных, кото- рый состоит из стартового бита, основной части данных, контрольного бита и стопо- зого бита. Формат пакета данных должен быть согласован между сторонами комму- никации для корректной отправки и получения данных. 6.1.1. Проектирование протокола коммуникации Концепция протокола коммуникации широко используется в различных отраслях, где применяются роботы, для обеспечения эффективной пере- дачи большого объема данных. В соответствии с потребностями передачи данных робота Оп&шВоТ в нашей книге разработан относительно простой и практичный протокол коммуникации, формат протокола данных которого представлен в табл. 6.1. Таблица 6 1. Формат протокола данных ОндтВо! Заго- ловок Иденти фикатор Длина Байты данных Конт рольный байт Столовый байт 0x55 0x0* 0x06 0х** 0х** 0х** 0х** 0х** 0х** 0х** ОхВВ Первый байт кадра данных является заголовком, который имеет фиксиро- ванное значение 0x55. Это значение не несет какого-то смысла, его основная функция - сообщить получателю, что последующие байты представляют со- бой кадр данных. Второй байт кадра данных является идентификатором, указывающим конкретное значение содержимого данных. Описание функ- ционального идентификатора ОгщшВо! представлено в табл. 6.2. Таблица 6.2. Описание функционально?': идентификатора ОпдтВо! Идентификатор Назначение 0x01 Управление скоростью 0x02 Обратная связь по скорости 0x03 1МЕ - ускорение 0x04 1МЕ - угловая скорость
Таблица 6 2 (окончание) Идентификатор Назначение 0x05 1МП - углы Эйлера 0x06 Данные сенсоров 0x07 Состояние светодиодов, зуммера, калибровка 1МП 0x08 Параметры ПИД левого мотора 0x09 Параметры ПИД правого мотора При получении идентификатора 0x01 содержимое данного кадра исполь- зуется для управления скоростью робота. Если идентификатор равен 0x02, то содержимое представляет собой значение обратной связи с фактической скоростью. Таким образом, различные идентификаторы указывают на раз- личное физическое значение последующих байтов данных. Третий байт фрейма данных указывает на длину байтов данных, которая здесь установлена на 0x06. Это означает, что каждый фрейм данных может содержать 6 байт фактического содержимого. ЛК Если содержимое данных превышает 6 байт, длину байтов можно изменить, чтобы удовлетворить расширенные требования к передаче данных. Байты кадра с четвертого по девятый являются байтами данных, которые в зависимости от определения идентификатора представляют различные значения данных. Например, если идентификатор равен 0x02, то 6 байт дан- ных обозначают направление и скорость вращения левого и правого моторов робота. Десятый байт кадра данных является контрольной суммой, используемой для проверки корректности данных. Наиболее распространенные методы проверки включают проверку по ХОК, проверку четности и др. Способ про- верки данных ОпдтВо! заключается в суммировании всех байтов данных и выполнении операции АГ.Ь с ОхГГ для получения контрольной суммы. На практике, если сумма принятого контрольного бига и битов данных от- личается от результата после ОхГГ, это указывает на проблему с передачей данного кадра, и он будет проигнорирован. Последний байт кадра данных является стоповым и обозначает заверше- ние кадра данных. Здесь используется фиксированное значение ОхВВ. 6.1.2. Пример анализа протокола коммуникации Изучив формат протокола связи, далее рассмотрим примеры кадров данных в различных ситуациях. 1. Управление скоростью (0x01) Кадр данных управления скоростью отправляется с верхнего уровня на ниж ний, то есть от системы управления, выполняющей роль «мозга», к контрол-
леру движения. Формат и пример кадра данных управления скоростью пред- ставлены в табл. 6.3. Поскольку система управления роботсм и контроллер движения обычно находят- ся в отношениях верхнего и нижнего уровней, систему управления час’о называют «верхним уровнем», а контооллер движения - «нижним уровнем». Протокол комму- никации обеспечивает передачу данных между верхним и нижним уровнями Таблица 6.3 Формат и пример кадра данных управления скоростью Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт 2 м о О =5 л у Управление левым двигателем Управление правым двигателем Направление Скорость левого двигателя (мм/с) Направление Скорость правого двигателя (мм/с) 0x00: Назад ОхРР: Вперед Младший байт Старший байт 0x00: Назад ОхРР: Вперед Младший байт Старший байт ОхВВ Пример 0x55 0x01 0x06 0x00 0x20 0x00 ОхРР 0x20 0x00 ОхЗР ОхВВ В приведенном примере кадра данных команда скорости, отправлен- ная системой управления, контролирует обратное вращение левого мо- тора и прямое вращение правого мотора. Конкретное значение скорости вращения описывается двумя байтами: старший байт левого мотора равен 0x00, младший байт - 0x20, что в сумме составляет 0x0020. Преобразовав в десятичное число, получаем 32, единица измерения - мм/с. Учитывая направление управления левого мотора, скорость вращения левого мотора составляет 32 мм/с. Аналогично скорость вращения правого мотора состав- ля ет 32 мм/с. Суммируя 6 байт данных, получаем контрольную сумму: 0x00 + 0x20 + 0x00 + ОхРР + 0x20 + 0x00 = 0х013Р, затем выполняем операцию АКЙ с ОхРР, полу- чая контрольную сумму ОхЗР. 2. Обратная связь с фактической скоростью (0x02) Обратная связь с фактической скоростью осуществляется путем накопления значений энкодера контроллером движения, который затем отправляет дан- ные в систему управления верхнего уровня. Формат и пример кадра данных обратной связи скорости представлены в табл. 6.4. Таблица 6.4. Формат и пример кадра данных обратной связи с фактической скоростью Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Столовый байт Управление левым двигателем Управление правым двигателем Направление Скорость левого двигателя (мм/с) Направление Скорость правого двигателя (мм/с) 0x00: Назад ОхРР: Вперед Младший байт Старший байт 0x00: Назад ОхРР: Вперед Младший байт Старший байт ** ОхВВ Пример 0x55 0x02 0x06 ОхРР 0x00 0x00 ОхРР 0x00 0x00 ОхРЕ ОхВВ
Единица измерения скорости в обратной связи - мм/с, а данные состоят из старших и младших 8 бит, всего 16 байт. В приведенном выше примере кадра данных скорость вращения колес с обеих сторон равна 0, сумма 6 байт данных составляет ОхЕЕ + ОхЕЕ = 0х01ЕЕ, а побитовая операция АКБ с ОхЕЕ дает контрольную сумму ОхЕЕ. 3. Данные 1М1} (0x03-0x05) Данные 1МП достаточно объемны и передаются от контроллера движения к системе управления в трех группах. Формат и пример кадра данных пред- ставлены в табл. 6.5. Таблица 6.5. Формат и пример кадра данных 1М11 1МУ - ускорение Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Столовый байт Ускорение по оси х Ускорение по оси у Ускорение по оси 2 Младший байт Старший байт Младший байт Старший байт Младший байт Старший байт Пример 0x55 0x03 0x06 0x00 ОхАР 0x00 0x00 0x08 0x23 0хЕ7 ОхВВ 1М11 - угловая скорость Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Стоповый байт Ускорение по оси х Ускорение по оси у Ускорение по оси 2 Младший байт Старший байт Младший байт Старший байт Младший байт Старший байт Пример 0x55 0x04 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ОхВВ 1МП - углы Эйлера Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Стоповый байт Крен Тангаж Рыскание Младший байт Старший байт Младший байт Старший байт Младший байт Старший байт Пример 0x55 0x05 0x06 0x00 0x40 ОхРС 0x94 0хВ9 0хЕ2 0x6В ОхВВ Единица измерения ускорения - м/с2, угловой скорости - °/с, углов Эйле- ра - °. Здесь содержатся данные по осям х, у и г. Подобно описанию скорости, каждое значение состоит из старших и младших 8 бит. 4. Данные других сенсоров (0x06) С помощью кадра данных сенсоров в систему управления передаются пока- зания некоторых сенсоров в контроллере движения, например напряжение аккумулятора. Формат и пример кадра данных представлены в табл. 6.6.
Таблица 6.6. Формат и пример кадра данных других сенсоров Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Столовый байт Напряжение, В Резерв для сенсора 1 Резерв для сенсора 2 Целая часть Дробная часть - - - - Пример 0x55 0x06 0x06 0х0С 0x16 0x00 0x00 0x00 0x00 0x22 ОхВВ В описанных выше данных напряжение батареи составляет 12,22 В, До полнительно зарезервированы четыре байта для передачи данных других датчиков в будущем, например ультразвукового. 5. Конфигурация контроллера движения (0x07) На контроллере движения имеются периферийные устройства, такие как светодиод и звуковой сигнализатор (зуммер), которые могут использовать разработчики. Например, при возникновении определенных ситуаций робот может подавать световые или звуковые сигналы. Кроме того, этот кадр дан- ных включает настройки калибровки 1МП, которые можно использовать для повторной калибровки при запуске робота или значительном дрейфе 1МИ. Этот кадр данных отправляется системой управления в контроллер движе- ния, его формат и пример представлены в табл. 6.7. Таблица 6.7. Формат и пример кадра данных конфигурации контроллера движения Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Столовый байт Светодиод Зуммер Калибровка 1МП Управление включением ОхРР: Вкл. 0x00: Выкл. Состояние Управление включением ОхРР: Вкл. 0x00: Выкл. Состояние ф 2 Л . § Й « Км м й X Од й К го ш ге 2 ь к 6 а е- « о е м х ге х >> и о о Состояние Пример 0x55 0x07 0x06 ОхРР 0x00 0x00 0x00 0x00 0x00 ОхРР ОхВВ В приведенном выше примере кадра данных система управления устанав ливает светодиод на контроллере движения в состояние «включено», отклю- чает звуковой сигнализатор и не требует калибровки данных 1МИ. 6. Параметры ПИД (0x08-0x09) Для более эффективного управления движением в контроллере движения реализовано замкнутое управление моторами на основе ПИД, Однако эти параметры различаются для каждого мотора. В нашем случае можно из- менить параметры ПИД замкнутого управления для конкретного .мотора с помощью кадра данных в системе управления, чтобы достичь различных
эффектов управления движением. Формат и пример кадра данных пред- ставлены в табл. 6.8. Таблица 6.8. Формат и пример кадра данных параметров ПИД Кадр данных Заголовок Идентификатор Длина Байты данных Контрольный байт Столовый байт П И Д Младший байт Старший байт Младший байт Старший байт Младший байт Старший байт Пример 0x55 0x08 0x06 0x10 0x27 0x00 0x00 0x64 0x00 0x9В ОхВВ 0x55 0x09 0x06 0x98 ОхЗА 0x00 0x00 0хС8 0x00 0х9А ОхВВ В приведенном выше примере кадра данных система управления уста навливает параметры ПИД для левого колеса робота: Р = 10,1 = О, И = 0,1. Для правого колеса: Р = 15,1 = О, Г) = 0,2. Поскольку значения параметров ПИД маты, фактические управляющие параметры равны значению данных, разделенному на 1060. Благодаря вышеописанной конструкции реализована схема протокола связи между системой управления роботом Оп^шВоГ и контроллером дви- жения. Далее рассмотрим, как использовать протокол коммуникации для реализации конкретных функций на верхнем и нижнем уровнях. 6.1.3. Разработка протокола на стороне контроллера движения (нижний уровень) Контроллер движения, выступающий в роли «нижнего уровня» робота, мо- жет передавать данные от сенсоров нижнего уровня на «верхний уровень», а также принимать и выполнять команды, отправленные «верхним уровнем». Логика работы представлена на рис. 6.1. Основная программа в контроллере движения представляет собой боль- шой цикл, который последовательно выполняет задачи, такие как проверка напряжения питания, получение данных с 1МИ, получение и отправка данных с энкодера, прием команд скорости, вычисление выходных значений ШИМ и управление движением двигателя. В процессе выполнения осуществляется реальная связь через последовательный порт с прикладным процессором, а конкретные функции протокола связи представлены в табл. 6.9.
Цикл таймера (Т1М1; Контроллер движения Зуммер Получение данных 1М0 Расчет параметров ПИД для выходного значения ШИМ Управление скоростью мотора Определение напряжения питания Отправка значений энкодера Получение значений энкодера Пакет драйверов ЕЮ8/ЯО5 2 Прикладной процессор Таймеры (Т1МЗ/Т1М4) Рис. 6.1 ❖ Структура обработки протокола коммуникации на нижнем уровне Таблица 6.9. Описание функций верхнего и нижнего уровней Тип функции Направление передачи данных Функции Период Прием команд Прикладной процессор -> контроллер движения (Верхний уровень -> Нижний уровень) • Прием команд скорости и управления движением • Прием команд для светодиода и зуммера • Прием команды калибровки 1МИ • Прием параметров ПИД и их обнозление 100 мс Обратная связь Прикладной процессор <- контроллер движения (Верхний уровень <- Нижний уровень) • Передача скорости моторов • Передача состояния ГМИ • Передача напряжения аккумулятора и данных других сенсоров 40 мс Адзес репозитория с кодом см в предисловии. © 1. Прием команд В соответствии с вышеописанными функциями прием команд реализован на стороне контроллера движения в файле ргоТосойс в папке оп§тЬо1_соп1:го1- 1ег. Ключевые фрагменты кода приведены ниже. // Прием одиночного байта данных по последовательному порту и сохранение. уотД Рррег_Саба_Весеие(и? Рх_тепр) { ылбсЬ (КхЕТад) [
сазе 0: // Заголовок. { 16 (Кх_Тенр == 0x55) { КхВи€Гег[0] = 0x55; КхЕ1ад = 1; } е!зе { КхЕ1эд = 0; РхВи-ЕГег [3] = 0x0; } Ь|еак; } сазе 1: // Идентификатор. { т.6 (Вх_Тепр == 0x01 11 Кх_Тепр == 0x07 11 Кх_Тепр == 0x08) { РхВи'Г'Гег[ 1 ] - Кх_Тепр; КхЕЬад - 2; Кх1п0ех = 2; } е!зе { КхЕ1эд = 0; Кх5и66ег[0] = 0; РхВи66ег[1] - 0; } Ьгеак; } сазе 2: // Длина данных. { // Общее количаство байтов кадра данных - заголовок + идентификатор + длина + контрольный // байт + столовый байт (5 бант) + данные. Меи_СМ0_1.епдЬЬ - Кх_Тепр+5; т.6 (Меи_СМ0_1епдбЬ >= РТ0_МАХ_В11Е_1_ЕР) { Р.х1пбех - 0; РхЕ1ад = 0; КхВи66ег[0] = 0; КхВи66ег[1] = 0; Чеи_СГ0_1епдбЬ - 0; Ьгеак; } Р.хВи66ег[Рх1п<1ех] = Рх_Тег1р; Рх1псех++; КхЕбад - 3; Ьгеак; } сазе 3: // Чтение оставшихся полей. { Рх8и66ег[Рх1п(1ех] = Рх_Те1чр; Кх!пбех++; т.6 (РхТпбех >= Ме^_С|-Ю_1епдЫт 8& РхВи66ег[61еи_СМ0_1.епдбЬ-1] == ОхВВ) { гоен_СМЭ_Над ; 1; Чх1пбех = 0; ЧхЕГад = 0;
} Ьгеак; } <Маи11:: Ьгеак; } } После получения данных через последовательный порт происходит пере- ход к функции Пррег_Ва1а К.ссс1Уе(), где с помощью КхР1а§ определяется значение полученных данных в кадре. Если КхР]а§ = 0 (значение по умолчанию), проверяется, являются ли теку- щие полученные данные заголовком кадра 0x55. Если да, то НхР1а{г усганав ливается в 1; если нет, продолжается ожидание заголовка кадра. Если КхР1а§- 1, значит, текущие полученные данные представляют собой идентификатор. Далее, если данные равны 0x01, 0x07 или 0x08, это команда от верхнего уровня, и КхР1а§ устанавливается в 2 для продолжения приема последующих данных. Иначе текущие полученные данные ошибочны, и при- нимаемые данные сбрасываются, 11хР1а& устанавливается в 0, ожидается сле- дующий кадр данных. Если КхР1а§ = 2, полученные данные указывают длину байта данных, и вместе с заголовком кадра, идентификатором, длиной, контрольным бай- том и стоповым байтом это составляет полную длину кадра в байтах, которая сохраняется в переменной Иеш СМВДещДй. Если длина превышает размер буфера, буфер и флаг сбрасываются, и снова ожидается заголовок кадра. Иначе КхГ1а§ устанавливается в 3, и начинается прием последующих данных. Если КхГ1а§ = 3, выполняется буферизация данных кадра, контрольного байта и стопового байта. После завершения чтения КхР1а§ сбрасывается в 0, чтение кадра завершается, происходит переход к ожиданию следующего кадра данных. После чтения полного кадра данных необходимо провести анализ содер жимого кадра в соответствии с форматом протокола связи и выполнить со ответствующие действия. Соответствующий код приведен ниже. // Разбор инструкции, передача принт,той полной инструкции и ее длины. уотй Раг5е_Снс1_РаЬ:а(и8 *с1аГа_ЬиЕ, и8 пип) { #11 ЕМАВЬЕ-СНЕСКЗВМ Ц Вычисление контрольной суммы. тпЬ зиш - 0; Гог (и8 т. = 3; г < (пит - 2); г++) гип +- *(с1а(:а_5иГ + Ь); зип = Зит & ОхРР; и8 гесуРип - *(<1аЬ:а_ЬиГ + пип - 2); гГ (I(зип = гесудип)) гегигп; #епсИР
// Проверка заголовка. ЕЕ (!(*(11а1:а_ЬиЕ) == 0x55)) геЕогп; и8 Еипс_Ес1 - *(с1аГ:а_ЬиЕ + 1); 51«1ЕсЬ (Еопс_Еб) { // Проверка функционального кода: управление скоростью. сазе Е1М.М0ТЮМ: { и8 Епбех_Е - *(СаСа_ЬиЕ + 3); о16 ЕеЕЕ = *(баба_ЬоЕ + 5); 1еГ1: - (ЕеЕЕ « 3) | (*(баЬа_ЬиЕ + 4)); иЗ Епбех_г = *^баса_ЬиЕ + б); о16 гтдНС = *(ОаЕа_ЬсЕ + 8); гтдЫ: = (гЕдбт « 8) | (*(бата_ЬиЕ + 7)); МоЕЕоп_Те5Е_Зрэес1$еЕ(Епс1ех_Е> ЕеЕЕ, Епбех_г, гтдЬг); Ьгеак; Ц Проверка функционального кода: состояние светодиода, зуммера, калибровка 1М11. сазе Р11МС_БЕЕР_ЕЕВ: { и8 Ееб_сбгЕ_еп = *(ДэЕа_ЬоЕ + 3); // Поле управления включением. и8 Тед = *(баба_ЬоЕ + 4); // Поле состояния. ЕЕ (Ееб_сЬгЕ_еп) { ЕЕ (Ееб) ЬЕВ_ЭИ(); еЕзе ЬЕВ_ОЕЕ(); } и8 Ьс2гег_сЕг1_еп = *(йэЕа_ЬиЕ + 5); // Поле управления включением. и8 Ьсагег = *(баЕа_ЬиЕ + 6); // Поле состояния. ЬЕ (Ьи2гег_сТгЕ_ер) { 1Е (Ьиггег) вишк_ом(); еЕзе В1122ЕР_ОЕг(); } и8 саЕЬЬгаьЕоп_сТгЕ_еп = *(ЬаТа_ЬиЕ +7); // Поле управления разрешением. и8 саЕЕЬгаЕЕоп = *(ДаЕа_ЬоЕ +8); // Поле состояния. ЕЕ (саЕЕЬгатЕоп_сЬгЕ_еп 38 саЕЕЬгаЕЕпп) ]у901_саЕЕЬгаС1оп(); Ьгеак; } // Проверка функционального кода: параметры ПИД левого колеса. сазе РиМС_5ЕТ_ЕЕЕТ_Р10: { 016 кр_гесу = *(баба_ЬоЕ + 4); кр_гесу = (кр_гесу « 8) | *(баЕа_Ьоб + 3);
и15 к1_гео/ = *(с!ага_Ьи1: + 6); кт._гесу = (кг_1есу « 8) | *(оага_Ьи7 + 5); о15 кД_гесу = *(Ьага_Ьи1: + 8); кс!_гесу = (кд—гесу « 8) | *(даЕа_Ьи€ + 7); ПоаЬ кр = (НсаЬ)кргесу / 1080.6; НоаЬ к! = (Нсаг)к1_ге« / 1000.6; ПоаЬ кд - (НсаЬ)кс1_гесу / 1006.6; Ьег1_Р10рс1зге_Уа1ое(кр, кт., кд); Ьгеак; // Проверка функционального кода: параметры ПИД правого колеса. Сахе НМ $ЕТ К1СНТ РЮ: { о15 кр_гесу = *(ЬаГа_ЬиЕ + 4); кргесу = (кр_гесу « 8) | *(йаГа_Ьи1: + 3); о!5 кт._гесу = *(ЬаЬа_Ьо1: + 6); кс_гесу = (кт_гесу « 8) | *(Ьа1а_Ьо1: + 5); о15 к(1_гесу = *(Ьата_Ьо1: + 8); кс!_гесу = (кс1_гес7 « 8) | *(ааГа_Ьо7 + 7); Н.оаЬ кр = (НсаЬ)кргесу / 1000.6; НоаЬ кт. = (Ноаг)к1_гесу / 1000.0; ГЬоаЬ Ы - (НсаЬ)кс1_гесу / 1000.6; Р1дЫ_РЩ_11эс1аге_Уа1ие(кр, кг, кд); Ьгеак; ЬеГаоЦ: Ьгеак; } } При входе в функцию анализа Раг5е_Сшс1_ПаГа() программа сначала сум- мирует данные и сравнивает результат с контрольной суммой. Если про- верка не проходит, значит, произошла ошибка приема данных - функция завершается. Если проверка проходит, далее проверяются заголовок кадра и последующий идентификатор. □ ЕПКСМОТЮК: если идентификатор указывает на управление скоро- стью, анализируются данные скорости, и функция МоНоп_Те<Ц_8реес1- 8е1() управляет вращением двух колес с заданной скоростью. □ РПМСВЕЕРЕ.ЕП: если идентификатор указывает на управление звуко- вым сигналом и светодиодом, анализируется соответствующее состоя- ние ввода/вывода в данных и выполняется управление состоянием. О ЕПНС8ЕТЕЕЕТРГО: если идентификатор указывает на параметры ПИД левого колеса, анализируются соответствующие параметры ле-
вого колеса и динамически обновляются параметры кр, к5, Ы, исполь- зуемые для управления движением левого колеса. □ БПЫС_8ЕТ_КЮНТ_Р1В: если идентификатор указывает на параметры ПИД правого колеса, анализируются соответствующие параметры правого колеса и динамически обновляются параметры кр, к!, кс1, ис- пользуемые для управления движением правого колеса. 2. Данные обратной связи Контроллер движения периодически отправляет обратную связь о скорости двигателя и других состояниях через протокол коммуникации. Соответству- ющий код находится в таких модулях, как арр_тоНоп_соп1го1.с. Рассмотрим процесс упаковки и отправки данных по нашему протоколу на примере об- ратной связи по скорости мотора. // Отправка данных о скорости двигателя. усЩ Мо-Поп_5еп<1_0а^а(уо1с1) { // Вычисление скорости, которую следует отправить в этот раз. 1еН_5реес1_пР1_5 - 1еН:_епсос1ег_сп1: * ЕООЕР_СЗТ_10Мэ_2_5РЭ_И'1_5 / гесогс1_Нпе; гтдЫ:_ьреес1_га'1_ь = гсдЫ_епсо<1ег_спС * Е№00ЕК_СЩ_10МЬ_2_ЬР0_ММ_$ / гесог(1_1:Ще; гесог^Ппе - 0; 1е<:г_епсосег_сп+: = 0; гтдМ:_епсос1ег_сп1: = 0; #с!еНпе МоЫопЕЕМ 7 и1пС8_Е с1э1:а_Ьиг1:ег[,''1о(Ло.тЕЕ1Ч] = {0}; игпРвД т, сЬескпип = 0; ЕЕ (1еН_5реес1_пп_5 < О) { СаГа_ЬиЕЕег[О] = 0x00; итпПбД 5рй = (иЕп1::16Д:)ЕаЬ5('1еЕЕ_5реег!_т_5); с!аСа_ЬиЕЕег[1] = 5рД&0хЕЕ; с!ата_ЬиЕЕег[2] = (зрс<»8)&0хЕЕ; } е1ье { с1аСа_Ьи7Еег[0] = 0хЕЕ; ыпС16_С зре! = (и1пНЬ_г)1еИ_5реес1_пп_5; 1аСа_ЬиЕЕег[ 1] - 2рЦ&0хЕЕ; бака ЬиЕЕег[2] = (врс!»8)&0хЕЕ; } ЕЕ (гЕдЬЕ_5реэй_яп_5 < 0) { баСа_ЬиЕЕег[3] - 0x00, иЕпЕ16_Е эре! = (иЕпЕ16_Е)ЕаЬь(гЕдПЕ_5реес1_пп_ь); 6аСа_ЬиЕЕег[4] = врй&0хЕЕ; йага_Ь1/Еег[5] = (5рС»8)&ЕхЕЕ; } еЕье { с!аСэ_ЬиЕЕег[3] - 0хЕЕ; иЕпЕ16_Е зре! = (иЕпЕ16_Е)гЕд1тС_5реес1_гт_5; с1аГа_ЬигЕег[4] = врс1&ЭхЕЕ; с!аСа_ЬиЕЕег[5] = (вр0>^8)&0хЕЕ; }
// Во1числение контрольного байта Бошолняется путем сложения всех байтов данных и Вошолнения Ц & ОхЕЕ. Гог (г = 0; г < МоНоп!^ - 1; г++) сЬескпиР! += с1аса_ЬаГГег[1]; сЦ.^аЬи ЕЕег [Е’огТспЕЕИ - 1] = сЕесклип & ОхЕЕ; иЛКТ1_РиЕ_СЬагГ0х55); // Заголовок. иАРТ1_Ри1_СЬаг(Их02); // Идентификатор. 11ЛРТ1_Ри1_СЬаг(0х0б); // Длина данной (в байтах). иАРТ1_Риб_СЬаг(бага_оиГЕег[0]); 11АРТ 1_Риб_СЬа г (<1аба_ЬиКег [ 1 ]); иАРТ1_Ри1_СЬагб(1ага_ЬиЕЕег[2]); 11АРТ1_Ри1_СЬаг((1а1:а_ЬиГЕег[3]); иАРТ1_РиЕ_СЬаг(с)ага_оиЕЕег[4]); 11АРТ1_Р1Л_С1таг(с1а1:а_0иГЕег[5]); иЛРТ1_РиЕ_СЬаг(баг:а_оиС:ег[6]); иАРТ1_Риб_СЬаг(.0хВВ); // Стоповой байт. } Функция МоПопЗепсЕВаСаО вызывается периодически в основном цикле и передает текущую скорость левого и правого колес робота. Программа сначала считывает скорость колес, упаковывает се в кадр данных протокола и отправляет через последовательный порт на «верхний уровень». В процессе упаковки значения начала кадра, идентификатора, длины данных и конца кадра фиксированы и могут быть назначены напрямую. Скорость в данных требует дополнительного разложения на направление, старший и младший байты, а также вычисления контрольной суммы для проверки на верхнем уровне. Методы обратной связи состояния такие как 1Мб, аналогичны и здесь подробно не рассмат ривакгся. °екомендуется ознакомиться с соответствующим прилагаемым кодом. 6.1.4. Разработка протокола на стороне прикладного процессора (верхний уровень) Как и контроллер движения, верхний уровень после обработки приклад- ных функций также должен отправлять управляющие команды по прото- колу коммуникации и принимать обратную связь о состоянии от «нижнего уровня». Структура обработки протокола коммуникации на верхнем уровне представлена на рис. 6.2. На верхнем уровне также создается постоянный периодический цикл, в котором вычисленные команды скорости прикладных функций упаковы- ваются в данные последовательного порта и отправляются для выполне- ния контроллеру движения. Одновременно принимаются обратные данные о скорости, ускорении, угловой скорости и других состояниях от контроллера
движения, которые передаются прикладным функциям для замыкания цик- ла управления роботом. Рис. 6.2 ❖ Оруктура обработки протокола связи на верхнем уровне 1. Отправка команд Если говорить об отправке команд движения роботу Оп§тВоГ, когда верхний уровень приложения (например, навигация или управление с клавиатуры) вычисляет скорость движения робота, ее нужно отправить через последо- вательный порт контроллеру движения для выполнения. Процесс упаковки протокола реализован в файле огцрпЬог Ьазе.срр в проекте Оп&шВоП чогс! 0|"сдтпЬо±Ваве: :с1'1с1_7е1_саиЬаск(сопьГ деопе1:гу_п5дь: :н5д: :Ти1з1::ьНагеЦРСг пьд) { ОабаЕгапе стЦРгале; Ноак ЕеНЬреес! - 0.0, ггдЫ5реес1 - 0.0; Ноак х_1лпеаг = П5д->11пеаг.х; Ноак 2_апди1аг = пзд->апди1аг.г; // Решение с использованием дифференциальной кинематической модели колес. 1еН5реес1 - х_Нпеаг - г_апди!аг * ОК1С1МВОТ_1л1НЕЕС_ТКАСК / 2.0; гсдпсЗрееа = х_1Лпеаг + гапдиТаг * 0Р?1С1МВ0Т_ЫНЕЕ||__ТНАСК / 2.0; ЕЕ (ТеШреес! < Э) спс1ггапе.с!ага[0] = 0x00; е1зе спФггапе.Цага[0] = 0хГб; сгс1Егзпе.ааСг[1] = спЦ'аЬзПеШреес!) * 1000) & 6хИ; // Преобразование значения скорости //из м/с в мм/с. спс1Егапе.с!а1:г[2] = (спЦаОзСЕеНЗреес!) * 1000) » 8) & 0хРГ;
тГ (гт.дНР5реес1 < 0) спбРгате.ба1а[3] = 0x00; е!зе стдРпаР1е.с1а1:а[ 3] = ОхГГ; // Преобразование значения скорости из м/с в мм/с. спбЕгате с1аба[4] - тпГ(аЬь( ггдЬТбрееб) * 10Э0) & ОхГГ; спбЕгапе.Раба[5] = (1пГ(аЬз(гтдЬГЗреес!) * 1000) » 8) & ОхГГ; слбЕгате.с5еск = (сгрбЕгапе.баса[0] + стбЕгапе.бата[1] + спбЕгаэе. с!аГа[2] + спбЕгаР1е.баЬа[3] + спбЕгапе.ба!:а[4] + сп0Егапе.бата[5]) & ОхГГ; // Инкапсуляция кадра данных команды скорости. сзбЕгате. Неабег - 0x55; спбРгапе.Щ - 0x01; сябЕгате.ТепдсЬ = 0x06; слбЕгапеЛаП = 0хБВ; Ггу { 5епа1_.1л1гие(&спс1Егапе.Ьеааег, 51гесГ(спбЕгаг’е)); // Отправка данных в последовательный // порт. } сабсЬ (5егга1:: ЮЕхсерСгоп &е) { // В случае сбоя отправки данных вывод сообщения об ошибке. КС1_СРР_ЕРЧОВ(1:1п5->де1:_1оддег(), 'ОпаЫе Со зепб баба тЬгоидЬ загса! рогГ'); } // Учет значения счетчика для плавней остановки. гГ((ГаЬ5(х^Ипеаг)>0.0001) || (ГаЬз(2_апди!аг)>0.00И1)) аисо_5Сор_соипС:_ = 0: } При разработке на КОЗ 2 команды скорости робота обычно передаются че- рез тему стбусй Поэтому команды скорости, выходящие из верхнего уровня приложения, поступают в узел оп^пЬоГЬазе через тему стйуе!, вызывая функцию обратного вызова стб_уе1_са11Ьаск() для анализа данных о скоро- сти. В процессе анализа линейная и угловая скорости робота разлагаются на скорости двух колес в соответствии с кинематической моделью робота. За- тем данные упаковываются в кадр протокола, добавляются начало и конец кадра, а также контрольная сумма. После этого кадр данных записывается в последовательный порт методом 8епа1_.шгПе(), откуда нижний уровень може г считать и проанализировать кадр данных для управления движением. Теоретические сведения о кинематической модели приведена в разделе 5.4. Управление светодиодами, звуковыми сигналами и настройка параметров ПИД аналогичны: данные заполняются в кадр протокола и записываются в последовательный порт.
2. Прием данных Прикладной процессор также в цикле непрерывно считывает данные из последовательного порта для получения информации, возвращаемой ниж- ним уровнем. Процесс считывания из последовательного порта реализован в функции геайКам'Па1:а(), чосс! ОгбдтпЬобВазе:: геабКайЗаГа() { ибпТ8_б гх_с1гТа = 0; ЗагаЕгапе Ггале; иЬПе (гсЪсрр: :ок()) { // Чтение 1 байта данных, поиск заготовка. аибо 1еп = 5егга1_.геас1(&гх_(1аба, 1); И (1еп < 1) сопНрие: // После обнаружения заголовка начать обработку кадра данных. т.Г(гх_с!ага == 0x55) { // Чтение полного кадра данных. тегна1_.геас1<&Егате 10); // Проверка правильности стопового байта. тГ(Ргапе.сатТ != ОхВВ) { КС1СР₽_ЫАВМ(1Н5->деб_1оэдег(), "Заба бгапе баб! еггог!”); солбтпие; } Егапе.Ьеабег = 0x55; // Проверка кадоа. тЕ(сЬескЗгбаЕгапе(Егапе)) { // Обработка данных кадра. ргосен>ьЗабаЕгапе(Е'ар|е); } е1зе { КС1_СРР_'ЛАКЕ1(1:1к5->де1:_1.оддег(), "Заба бгапе сЬеск ГатТеб!"); } } } } После запуска робота функция геас!Ка\уОа1:а() в отдельном потоке цикли- чески выполняет задачу чтения данных с последовательного порта. Когда полученные данные содержат заголовок кадра, то есть 0x55, производится однократное чтение всей информации данного кадра, поскольку длина всех
пакетов данных одинакова. Если последний байт данных является концом кадра ОхВВ, значит, кадр данных полный. Затем с помощью контрольной суммы проверяется наличие ошибок в кадре данных. Если ошибок нет, дан- ные обрабатываются функцией ргосеввПаЕаЕгатеО. Ц Обработка входящего кадра данных, вызов соответствующей функции обработки в зависимости Ц от 10 кадра данных. мотб ОгЬдЬпЬсЕВазе: :ргосез50аЕаЕгапе(0а1:аЕга111е &Ггапе) // Использование оператора зЩтсЬ для ветвления по Ю кадра данных. з^ПсЫ Егапе. гб) { сазе ЕКАКЕ_Ю_\/ЕЕ0С1ТУ: // Если Ю кадра данных - кадр скорости. ргосе5ьУе1осгЕу0эта(1тапе); // Вызов функции обработки данных скорости. Ьгеак; сазе ЕНАЕ,Е_Ю_АССЕЕЕНАТ1Э1т: // Если Ю кадра данных - кадр ускорения. ргосеззАссе1егаТ:1оп0аЕа(1:гапе); // Вызов функции обработки данных ускоэения. Ьгеак; сазе ЕКАМЕ_Ю_АМС11ЕАН: // Если Ю кадра данных кадр угловой скорости. ргосеззА.тди1агСаЕа(Тгапе); // Вызов функции обработки данных углозой скорости. Ьгеак; сазе ЕКЛМЕ_Ю_ЕЕ1ЕЕР: // Если Ю кадра данных кадр углов Эйлера. ргосеззЕи1е| 0аТ:а(Е| ане); // Вызов функции обработки данных углоз Эйлера. Ьгеак; сазе ЕНАКЕ_Ю_ЬЕМЫЭН: // Если Ю кадра данных - кадр данных датчиков. ргосез55епзогВаЕа(Егзпе); // Вызов функции обработки данных датчиков. Ьгеак; бгЕаиТб: РСЬСРР_ЕКг!0К(гЬЕ8->де1:_1о99ег(), ' Ргаше 10 Еггог[%б]", -Ггагге. гб); Ьгеак; } } В функции ртосевзЦаЕаЕгатеО содержимое кадра данных определяется по идентификатору, а обработка данных осуществляется с помощью различных функций. Предположим, что полученный кадр данных является данными сенсора, содержащими информацию о заряде аккумулятора робота. В этом случае данные кадра считываются функцией ртосезвЗспзотПаЕаО и сохра- няются в переменной состояния робота для использования в приложениях верхнего уровня. 7отб ОгЬдЕпЬоЕВазе::ргосе8з5епзогВага(ВаЬаЕгапе &Егапе) { гоЬоЬ зЬаЩ4_.ЬаНегу_Уоиаде = (ПсаЬ)Егапе.баЕа[0] + ((НоабЯгапе.ба!а[1 ]/100.0); } Методы приема других данных аналогичны, поэтому мы не будем рассматривать здесь их подробно.
6.2. Разработка привода К05 2 для шасси робота После изучения проектирования протокола связи робота и его разработки на нижнем и верхнем уровнях необходимо преобразовать эти данные в реаль- ные функции привода робота, эффективно используя их в «мозге» робота. В этом разделе мы разработаем функции привода шасси робота на базе КОВ 2 на прикладном процессоре. 6.2.1. Привод К05 2 для шасси робота Робот представляет собой сложную инженерную систему, содержащую мно- жество функциональных модулей, которые должны работать совместно для достижения высокой эффективности эксплуатации. Для эффективной ком- муникации между частями системы необходимо передавать только необ- ходимые данные. Однако если разработчики будут определять сообщения по своему усмотрению, это может привести к потере данных или ошибкам интерфейса. Поэтому перед началом разработки обычно необходимо за ранее согласовать стандарт, чтобы облегчить последующее сотрудничество и распределение задач. В главе 2 была рассмотрена коммуникационная механика КОВ 2, в которой передача данных возможна только при определении интерфейса тз§ или згу. Структура передачи данных показана на рис. 6.3. Например, при управлении движением робота с клавиатуры передаваемые команды скорости опреде- ляются стандартными линейной и угловой скоростями КОВ 2, а реализация этой скорости в контроллере движения осуществляется ранее разработан- ным контроллером. Например, если на роботе установлена камера, может потребоваться от- правка данных изображения на верхний уровень для отображения или даль- нейшей обработки. Эти данные изображения также определяются стандар- тами КОВ 2, аналогично структурам данных в программировании. Следуя таким стандартным определениям, легко интегрировать функции двух уз- лов, даже если их разрабатывали разные программисты. Таким образом, для разработки интеллектуального робота с использова- нием КОВ 2 необходимо упаковывать данные для передачи в соответствии с правилами КОВ 2. Эти упакованные функциональные пакеты называются нижним уровнем привода для робота. По рис. 6,2 видно, что оп§1пЬог_Ьазе является узлом управления шасси в Оп§тВо1 на платформе КОВ 2. Темы и службы, предоставляемые этим узлом, приведены в табл. 6.10. Разработчики могут использовать эти интер- фейсы для дальнейшей разработки приложений верхнего уровня.
Таблица 6.10. Интерфейсы узла управления шасси НО5> 2 в роботе ОпдтВоТ Содержимое данных Направление передачи Тип интерфейса Имя интерфейса Тип данных Команды скорости Приложение верхнего уровня -» Привод шасси Тема стбуе! ^еотейу т8§8: :т8§::ТЧал181: Одометр Привод шасси -» Приложение верхнего уровня Тема обот пау_т8§8:: гг.8§: :Оботейу Состояние робота Привод шасси -» Приложение верхнего уровня Тема оп^гпЪоТзГаГиз оп§тЪо( т8§8: :т8&: Юп^тЬоЦйаТив Состояние зуммера Приложение верхнего уровня -» Привод шасси Служба опдтЪоГЪихгег огцдпЪоЩ т8§8: жгу: :Ог1§тЬоГВи22ег Состояние светодиода Приложение верхнего уровня -» Привод шасси Служба оп§тЪоГ_1ес1 оп§тЪоГ т8§8::8ГУ::ОпфпЬоП.еб Параметры ПИД левого колеса Приложение верхнего уровня -> Привод шасси Служба оп^тЬоТ 1ей_рИ оп^рпЪоГ Ш8§8: :хгу: :Сп§1 пбоГРЮ Параметры ПИД правого колеса Приложение верхнего уровня -» Привод шасси Служба оп§тЬоГ п§Щ_р1с1 оп§1пЪо1 т8§8::8ГУ::Оп§тЬоГРЮ Система координат Й Привод шасси -» Приложение верхнего уровня Й - Й2_ го8: ДгапвГогтВгоабсазГег Конкретная реализация соответствующих интерфейсов определена в кон- структоре Оп^шЬсЯВазе в файле оп&тЪсйЬаяе.срр. Ниже приведена реали- зация кода.
// Создание издателя одометрии и состояния робота. обоП-риЬТЛ'ЬеГ- - Сб15->сгеаСе_риЫ151тег<па7_п5д5: :пзд: :0с1спе1;гу>("ос1оп", 10); зба1:из_риНгзЬег_ = 1Ы5->сгеаСе_р1Ьи5|'.ег<эг1д\пЬог_пзд5: :пзд: :0ггдгпЬоб51аЩ5>(''оггд1пЬо1_з1:а1и5'', 10); Ц Создание подписчика на команду скорости. спб^е1_зиЬзсггр1:гоп_ = Сп15->сгеаСе_Т1Ь5сг1рСтоп<дес.'т1еСгу_птд5: пзд: :Тигзб>("стс1_7е1'', 10, 51с1: :Ь1П11(&0ггдтпЬосВа5е: :спб_уе1_са11Ьаск, 1Мз, _1)); Ц Создание служб управления зуммером и светодиодом. Ьи22ег_5еготсе_ СЫ5->сгеаСе_зегу1се<ог1дтпЬо1:_п5д5: : 5гу; :0ггдгпбо13и72РГ>( оп.д!пЬо1_Ь||27ег", збб: :Ыпб(50ггдгпЬо1Вазе. :Ьи72ег_са11Ьаск, _1, _2)); 1еб_5ег71се_ = СЫ5->сгеа1е_5егу1се<ог1дтпЬо1:_п5д5: : згч: :0ггд1пЬоНей>("оггдгпсо1:_1е11", зЩ: :Ыпс1(&ОггдтпЬосВа5е: :1еб_са11Ьаск, Эпз, _1, _2)); 1еН_ри_зегу1се_ - 1Ыз->сгеаГе_зег71се<сг1д1пЬо1:_П5дз: :згу: :Ог<$гпЬо{Р10>("оггд1пЬо1ДеН_риГ', збй: гЫпс^&ОггдгпЬоРВазе-.: 1еН_р1с1_са11.Ьаск, СЬтз, _1, _2)); ггдЫ_р1й_5егугсе_ = СЫз-^сгеасе тегхчсе^огтдтпЬот пздз: :$гу: :0ггдгпЬогР1С>("оггд1псог_г1.дЬг_ргс1", зСб: :Ыпб(&0ггдтпЬосВа5е: :ггдЫ_ри_са11Ьаск, Нг1з, _1, _2)); Ц Создание 11-издателя. СГ-ЬгоасказтеГ- = збб: :таке_ип1дие<гГ2_гоз:: Тгапз1огпЗгоас1са5Сег>(*Шз); 1. Приложение верхнего уровня привод шасси Управление движением робота является ключевой функцией любой задачи: от построения карт с помощью 8ЕАМ и автономной навигации до визуальных приложений. Поэтому роботу требуется интерфейс для управления скоро стью, и в КОВ 2 для этой цели обычно используется тема спн1_\е1. В роботе Оп§тВо1, когда узел приложения верхнего уровня публикует дан- ные темы стс!_уе1, подписчик темы стс1_ус1 в узле управления опдтЬог Ьаве получает сообщения о линейной и угловой скоростях. Затем выполняется ки- нематическое разрешение, преобразующее общую скорость робота в скоро- сти двух колес. Эти данные передаются в контроллер движения через кадры данных, определенные в протоколе коммуникации, а контроллер выполняет замкнутое управление ПИД для запуска моторов. Если необходимо изменить параметры ПИД в контроллере движения, это можно сделать через службу. Например, узел управления ог1§1пЬо1_Ьазе реа- лизует службу динамической настройки параметров ПИД. Вспомните, как в главе 2 книги описывалась связь через службу: после завершения вычис- лений сервер передает результат узлу, вызвавшему службу, в данном случае это результат настройки параметров ПИД. Кроме того, в роботе Оп§тВо1 предусмотрены такие функции, как управ ление светодиодом и звуковым сигналом, которые также обернуты в службы. Узел управления оп§1пЬо1_Ьа8е выступает в роли сервера: как только клиент
отправляет запрос, команда передается контроллеру движения через после- довательный порт для включения или выключения светодиодов и звуковых сигналов, а затем результат возвращается клиенту. Реализация тем и служб здесь является типичным примером применения основных концепций КОБ 2. Ранее изученные теоретические основы КОБ 2 теперь находя- практическое воплощение. 2. Привод шасси -> приложение верхнего уровня Приложения верхнего уровня не только отдают команды роботу, но и нужда- ются в информации о его состоянии. Эти данные передаются от контроллера движения к узлу управления КОБ 2 огщшЬогЬазе в процессоре приложений, где они оборачиваются в соответствующие темы 1208 2 и передаются узлам- приложениям, подписанным на эти данные. Для мобильных роботов наиболее часто используемая информация обрат- ной связи включает сообщения тем одометрии (ойот) и инерциального из- мерительного устройства (шш). ойот записывает текущее положение робота, а шш фиксирует его ускорение и угловую скорость в реальном времени, что является базовыми данными для локализации робота. В главе 5 мы уже изучили, как считывать данные ойот и 1тн из контрол- лера движения. А в разделе 6.1 мы научились отправлять эти данные в узел управления КОБ 2 огщтЪоМэазе через кадры данных протокола коммуника- ции. Достаточно обернуть эти данные в сообщения, определенные стандар том КОБ 2, и опубликовать их с помощью объекта издателя. Кроме того, для удобства отладки в КОБ 2 специально предусмотрена структура пользовательского сообщения ог1§1пЬо1_51а1и8, которая публикует информацию о состоянии заряда робота, а также о состоянии светодиодов и зуммера, что облегчает их использование. Содержание данного раздела подходит не только для разработки робота СпдтВоГ, но также применимо для разработки драйверов шасси большинства мобильных ро ботов в среде КОБ 1 или 405 2. 6.2.2. Подписка на тему управления скоростью Движение является критически важной функцией робота, но способы пере- движения различных типов роботов могут значительно различаться. Су- ществуют роботы с дифференциальным движением, подобные Оп§тВо1, летающие устройства, такие как дроны, а также человекоподобные прямо ходящие роботы. В КОБ 2 независимо от типа робота команды движения, ге- нерируемые различными прикладными функциями, передаются через гему сшйуе! сообщения ТмйЩ. Это требует разработки драйвера шасси, который будет обрабатывать данную тему и обеспечивать управление на низком уров- не для различных форм передвижения.
Вернемся к примеру с роботом ОпдтВоГ. Как управлять его движением после получения темы скорости сшйуе! от верхнего уровня приложений, таких как автономная навигация или управление с клавиатуры ? Узел оп§тЬо1_Ьазе подписывается на тему стйуе!, как показано на рис. 6.4. После получения сообщения темы оно обрабатывается через функ- цию обратного вызова стс!_уе1_са11Ьаск(), которая управляет полученной скоростью сообщения ТийЩ. Контроллер (ЗТМ32) Тема стс1_уе1 опдтЬоГ базе — стс1_уе1_са11Ьаск1 ргосеззЗепзогОай ргосе8з7е1ос1(уОа1 ||тег_100т8_са11Ьаск о(1от_ риЬПзНег Тема опдтЬо1_81а(и8 ойот ргосе88Ассе1ега1юп Оа(а Рис. 6.4 ❖ Блок-схема управления движением робота ОпдтВоГ Код функции управления скоростью в драйвере шасси Оп§тВо1 выглядит следующим образом: мсГВ ОггдтпЬоГВаге: :сг.сЩе!_са1'.Ьа«(сопг1: део!пеГгу_пзд5:. пяд: :Тис51: гОбагесРГг пзд) { ОагаЕгапе сгк1Егате; Поас ТеГсЕрееб = 6.0, гт.дЫ5рееВ = 0.0; Поаг х_1Лпеаг = п5д->Ппеэг.х; Поас г_арди!аг = П5д->апди1.аг г; // Решение с использованием кинематической модели дифференциальных колес. 1еГ15реес1 = х_Нпеаг - г_апди1аг * 0К161НВ0т_ННЕЕЬ_ТКАСК / 2.0; гтдЫтБреес! - х_1Лпеаг + с_апди1аг * 0Н1СЩВ0Т_<1ЕЕ1_ТР.ЛСК / 2.0; 1Г (ТеТГБреес! < 0) спкКгапе. Ватта [0 ] = 0x00; е!ле спкКгапе. Ватта [0] = ОхГГ; спВРгапе.Ваба[ 1 ] = 1п1(аЬ5(1.еН5реес1) * 1000) & ЭхГГ; // Преобразование значения скорости //из м/с в мм/с. спВ13гаг'1е.Ва1:а[2] = (т.пб(аЬ5(1е1:1тьрееВ)) * 1000) » 3) К ОхГГ; (гтдбТЗрееВ < 0) спВЕгапе.Васа[3] = 0x00; е!зе сгтВЕгапе. Вата [3] = ОхГГ; ст.ВЕгапте.ВаСг[4] = 1пС(аЬз(ггдЬСЗрееВ) * 1000) & ОхП; // Преобразование значения скорости //из м/с в мм/с.
слбЕгапе.«Заба[5] (ЕпЦаЬз(гтдЫзБрееб) * 1006) » 8) & 0х5Е; спбЕгапе.спеск = (сгс1Егапе.(1аба[и] + сп|1Егаг1е.<1ага[1'| + снаЕгале.баба[2] + стдРгате.с1аЬа[3] + спбЕгапе.баба[4] + сп0Егапе.даба[.5]) & 0х<Т; // Инкапсуляция кадра данных команды скорости. слб Ег апе. Неадег = 0x55; с.лб Ег ате. 1с1 = 0x01; слбЕгате.ЪепдбН = 0x06; спбЕгапе.бат! = ОхВВ; 1гу { 5егт.а1_.1л1гие(&спс1Егзпе.Ьеааег, 5Т.7есЕ(спс1Егаге)); // Отправка данных в последовательный // псрт } сабсК (ве'та1.:: ЮЕхсерЫоп &е) { // Вьвод сообщения об ошибке при сбое отпразки данных. КС1СРР_ЕКК0К(11тг5->дб1:_1од9ег(), ' ОоаЫе То зепб баба 1Ргоид1т зегба! рогб"); } // Учет значения счетчика для плавной остановки. бб((ЕаЬз(х_1бпеаг)>0.0001) || (баЬ5(г_апди1аг)>0.6001)) аибо_збор_соипб_ - 0: } Сообщение ТалтзЕ состоит из двух частей: линейной скорости (Ипеаг) и угло- вой скорости (ап$п1аг), каждая из которых имеет три компонента: х, у и 2. Для роботов с дифференциальным движением в плоскости актуальны только линейная скорость в направлении х (движение вперед и назад) и угловая скорость вокруг оси г (вращение влево и вправо). На основе кинематической модели дифференциального движения можно вычислить команды скорости для двух колес, затем упаковать их в кадр данных для передачи через после- довательный порт контроллеру движения. Теоретические аспекты кинематической модели рассмотрены в разделе 5.4. Используя управление с клавиатуры в качестве примера, мы можем изучить процесс публикации и подписки на тему управления скоростью ро- бота, как показано на рис. 6.5. Сначала войдите удаленно в систему ИЬипШ робота Оп§тВо1 через 88Н, откройте два терминала и выполните следующие команды: # Запуск узла шасси робота огбдбпЬобЬазе. $ гоз2 баипсЬ огбд.пьоб_Ьгбпдир огбдбпЬоб.баипсЬ.ру # Запуск узла упразления с клавиатуры. $ гоз2 гип бе1ес'р_бЩзб_кеуЬоаГс1 бе1еср_бчбзб_ке7Ьсагс1 © Подробнее о программном обеспечении 55Н см. в разделе 2.11.
Узел издателя Тема: стс уе1 Сообщение деолеТу гп5д8/Тм81 Данные: Кпеаг, апди1аг г Узел подписчика к____________ Веоше1гу п18е5/Ту1з1: Мезааве ЕПе: 8ео»еТгу_взйз/Т»1зГ, взк] Ка« Меззаее ОеПпШоп С«орас1 Меззаяе РеГшПюп Рис. 6.5 ❖ Способы упргвления движением в 302 2 Первая команда запускает узел шасси робота оп&тЪоГЬазс, который под писывается на тему спи!_уе1, как показано на рис. 6.6. гооЦФиЬипЕи: - гооХ(ЗиЬипХи:~# гоз2 ХаипсЬ огХд!пЬоХ_ЬгХпдир огХдХпЬоХ.ХаипсЬ.ру [ХМЕО] [ХаипсЬ]: АН Ход НХез сап Ье Гоипс! ЬеХон /гооХ/.гоз/Ход/2024-08-13-12-4 2-44-188953-иЬипХи-5726 [ХИЕО] [ХаипсЬ]: ОеГаиХХ ХоддХпд уегЬозХХу 15 зеХ Хо ХМЕО [ХМЕО] [огХд1пЬоХ_Ьазе-1]: ргосезз зХагХеЬ нХХЬ ртд [5728] [ХМЕО] [зХаХ1с_ХгаГ|5^огп1_риЬХ15Ьег-2]: ргосезз зХагХес! и/ХХЬ рХЬ [5730] [ХМЕО] [зХаХ1с_Хгап5^огт_риЬХ1зЬег-3]: ргосезз зХагХеЬ И1ХЬ рХЬ [5732] [огХд!пЬоХ_Ьазе-1] ЬоаЛпд рагатеХегз: [огтдХпЬоХ_Ьазе-1] - рогХ пате: ХХу$3 [огХд!пЬоХ_Ьазе-1] - соггесХ ХасХог 7х: 0.8980 [огХдХпЬоХ_Ьазе-1] - соггесХ ГасХог уХЬ: 0.8740 [огХд!пЬоХ_Ьазе-1] - аиХо зХор оп: 0 [ог!дХпЬоХ_Ьазе-1] - изе Хти: О [зХаХ1с_Хгап5^огт_риЫ1зЬег-3] [ХЫЕО] [1723524165.495855608] [зХаХ1с_Хгапз^огт_Р иЬ1гзЬег_11и8да]уХ71х\/1_Нг4]: ЗргппХпд ипХН кХХХеЬ риЬНзЫпд ХгапзХогт Ггот 1/Ьа 5е_11пк' Хо '/Хти_1гпк' [зХаХХс_Хгап5Гогт_риЫХзЬег-2] [ХМЕО] [1723524165.495855650] [зХаХ1с_ХгапзХогт_Р| иЫХзЬег_г2Ри4тМ1кР1риРХХ]: 5рХппхпд ипХН кХХХеЬ риЬНзЫпд ХгапзХогт Ггот '/Ьа зе_ХооХрг!пХ1 Хо '/Ьазе_1Хпк' [огХдт.пЬоХ_Ьазе-1] [ХМЕО] [1723524165.518974232] [огХдХпЬоХ_Ьазе]: огХдХпЬоХ зег ХаХ рогХ орепес! [ог1д1пЬоХ_Ьазе-1] [ХИЕО] [1723524166.020188785] [огъд1пЬоХ_Ьазе]: ОгХдХпВоХ 5Ха гХ, еп]оу XX. Рис. 6.6 ❖ Запуск узла шасси робота Вторая команда запускает узел управления с клавиатуры, который после считывания нажатий клавиш публикует тему спк!_уе1. Таким образом, два узла могут взаимодействовать друг с другом. Подобно симуляции черепахи, сейчас можно управлять движением робота Оп§шВо1 с помощью информа- ции, отображаемой в терминале, как показано на рис. 6.7.
Рис. 6.7 ❖ Запуск узла управления клавиатурой 6.2,3. Тема одометрии и поддержка (Г Теперь робот может двигаться благодаря подписке на тему. Но возникает вопрос: как определить текущее положение Оп§тВо1, учитывая, что он все время двигается? Это называется задачей локализации робота. В системе КОЗ 2 одометрия является важным методом определения мес- тоположения робота. В роботе ОгщтВо! используются энкодеры для предо- ставления данных одомегрии. В контроллере движения периодически про- изводится выборка сигналов скорости, передаваемых энкодсрами двух колес, и эти данные загружаются в прикладной процессор. Затем узел оп§шЪо1_Ьа8е должен дополнительно упаковать скорость в тему ойот одометрии, одно- временно постоянно обновляя дерево координат гГ, чтобы верхний уровень приложений знал о текущем положении робота, как показано на рис, 6.8. ЛЬ Одсметрия вычисляет положение путем интесрирсвания скорости по времени, и это* метод очень 1-увствителен к ошибкам. Поэтому точный сбор данных, калибровка обо- рудования и фильтрация данных являются крайне необходимыми мерами. Определение положения робота с помощью одометрии связано со мно- жеством координатных отношений, поэтому необходимо сначала ознако- миться с основными правилами данных о положении в КОЗ 2. Во первых, еди ницы измерения: по умолчанию единица измерения расстояния - метр (м), времени - секунда (с), скорости - метр в секунду (м/с), угла - радиан (рад).
Тема: осЮт Сообщение: па< лздз/Ос1оте1гу Данные: розе, Ьмз( Узел подписчика Узел издателя Рис. 6.8 ❖ Публикация темы одометрии обот Во вторых, направление: в К05 2 по умолчанию используется правосто ронняя система координат, как показано на рис. 6.9. Вытяните правую руку: указательный палец указывает положительное направление оси х, средний палец - положительное направление оси у, большой палец - положительное направление оси л. Таким образом, движение робота вперед соответствует положительной скорости по оси х, а движение вправо - отрицательной ско- рости по оси у. Что касается вращения, используется правило правой руки: согните четыре пальца, большой палец указывает положительное направле- ние оси вращения, а направление изгиба четырех пальцев - положительное направление вращения. Например, поворот робота влево на земле соответ- ствует положительной угловой скорости, а вправо - отрицательной угловой скорости. Рис. 6.9 ❖ Направления системы координат в КОЗ 2 (правосторонняя система координат) Попробуйте получить изменение положения робота в процессе движения. Сначала выполните удаленный вход на Оп^тВо! через 88Н и выполните следующие команды в двух терминалах для запуска узлов управления шасси и управления с клавиатуры.
$ го5? Таипсп оггдгпЬоГ_Ьг1пдир огтдт.пЬобЛаипсп.ру $ г оз2 тип 1:е1.еор_Г1ЛзГ_кеу1|оагс1 Те1еор_Ъ;тЛ_кеуЬоаг с1 Затем на компьютере с установленным КОЗ 2 и находящимся в той же сети, что и робот, откройте терминал и выполните следующую команду для запуска программного обеспечения визуализации КУ12: $ го5?. тип гИ.12 гугг2 После запуска КУ12 в выпадающем списке Пхей Егате (Неподвижная си- стема координат) выберите ойот, нажмите ЛсМ (Добавить) и добавьте эле- мент отображения И. В этот момент в КУ12 появится система координат Ьазе_ ГооГрпп!, представляющая положение робота, и система координат ойот, представляющая исходную точку координат одометрии. Относительное по- ложение между этими двумя системами координат показывает результат позиционирования робота с использованием одометрии. Управляя движе- нием робота с помощью клавиатуры, .можно в реальном времени наблюдать изменения положения между двумя системами координат, как показано на рис. 6.10. Рис. 6.10 ❖ Отображение взаимосвязи системы координат Й робота в КУ|7 Как же реализуется процесс позиционирования с помощью одометрии? 1. Интегральный расчет одометрии Контроллер движения с помощью энкодеров в реальном времени собирает данные о скорости левого и правого колес робота ОгцДпВо! и упаковывает их в кадры данных протокола коммуникации. Эти кадры передаются через последовательный порт в узел ог1§1пЬо1_Ьа.<>е на прикладном процессоре, где
они поступают в функцию ргосез<>Уе1осйуВа1:а для анализа данных о скоро сти. Затем, используя кинематическую модель, производится интегрирова- ние для вычисления текущей одометрии и положения, которые публикуются через тему ос1от. Полный код представлен ниже. устй ОгсдспооГВазе: :ргосе55\/е1осггу0ага(0аГаРга'’1е &Гггпе) { Ноат 1еН_5оге<1 = 0.0, ггдйЕ_зреес1 0.0; НоаС ух = 0.0, уЕК = О.0; Ноат сеТтаЦт = 0.0, аеПэ_х = 0.0, СеПза у = 0.0; Ц Вычисление разницы во времени между двумя циклами. з1аНс гсТсрр::Тгпе 1аз1_1:гпе_ = Шз->по1л/(); сиггеп!:_1:гне_ = 1Мз->почО; Ноаб Щ = (сиггегЛ Стпе .зесопскО - 1аз1:_Ппе_.5есоп(15()); 1азГ_-(:1пе_ - сиггеп!_1:гпе_; Ц Получение скорости колес эобота с обеих сторон и выполнение преобразования единиц мм/м --> // м/с. ит.п1:16_Г бабаТепр - Ггапе. оа Са[2]; НоаГ ьреебТепр = (Нра1)((<1абаТеяр « 8) | Ггапе.с1г!:а[1]); И (<тапе.г1а1а[0] == 0) 1еН_зреес1 = -1.0 * зреебТепр / 1000.0; е!зе 1еН_зрееб = зреесПегнр / 1000.0; РабаТепр = Ггапе.ба1а[5]; зреебТепр = (Моз!:) ((баГззТетр « 8) | бгапе.баГа[4]); И (Ггапе.с1а1:а[3] == 0) гсдЫ_5реес = -1.0 * зреебТегр / 1000.0; е!зе г1дЫ_зреес = зреесПетр / 1000.0; Ц Вычисление линейной и угловой скоростей робота по скоростям колес с обеих сторон //и калибровка с использованием коэректирующих параметров. ух = соггесС Гас1ог_ух_ * (1еН_ьреей + ггд1г1_зрэеб) / 2; угй - соггесГ_Тасгог_уСй_ * (ггдШзрееб - ТеП-Зрееб) / 0К1С1МВ0Т_ИИЕЕ1_ТКАСК; // Вычисление положения за один цикл одометрии. беПа_х = ух * соз(обсп_1:Ь_) * 61; бе11а_у = чх * згп(обсп_1:!т_) * <П; бе1са_Г.Ь = у1й * 61; // Вычисление накопленного положения одометрии обоп,_х_ += беИах; обоп_у_ += беПау; обоп_Ы1_ += 6еПа_11'.; Ц Коррекция угла ориентации для поддержания значения в пределах от -180° до 180°. гГ(обо1л_11н_ > Ч_РТ) обоп_-1Ь_ -= М_Р1‘2; е!зе 1Г(ос1оп_Щ_ < (-М_Р1))
обоп_1Ь_ + М_₽1*2; // Публикация темы одометрии и выполнение трансляции Н. обоп_риН1зйег(ух, утЬ) ; } Одометрия широко используется в различных типах роботов. Приведен- ный выше код представляет собой типовой шаблон для интегрированного вычисления положения одометрии. Давайте детально разберем ключевые фрагменты кода. // Вычисление разницы ьо времени между двумя циклами. ЗбаНс гс1срр::Ттпе 1азбД:гг1е_ Рн$->лои(); сигге|Л_-(:1пе_ = тНз->пои(); Ноаб 6Г - (сиггепб_Ппе_.5есопбз() - ТазСНне.зесопбзО); 1аз1:_Ппе_ = сиггепг_Нле_; Одометрия вычисляет перемещение путем интеграции скорости по вре- мени, и интервал времени имеет критическое значение. Здесь определены две статические переменные 1аяГ_Нтс_ и сиггепГ_Нтс_, которые фиксиру ют временные метки соответственно предыдущего и текущего выполнений функции ргосе88\'е1осПуПа1а. Разница временных меток дает интервал вре- мени сК, необходимый для текущего интегрирования. // Получение скорости колес робота с обеих сторон и выполнение преобразования единиц мм/м --> И м/с. итпН6_б бабаТегр = Ггапе.баба[2]; Ноае зрееоТепр = (Ноаб)((СасаТелр « 8) | Ггаге.бгга[1]); И (бгапе.баба[0] -= 0) 1еН:_5рееб - -1.0 * зреесТепр / 1000.0; е'1зе 1еН_зрееб = зреебТепр / 1000.0; баРаТепр = бгапе.бага[5]; зреебТепр = (Ноае)(СбабаТепр « 8) | бгэпе.ааба[4]); И (Гга1че.ба1а[3] == 0) г1дН_зрееб - -1.0 * зреебТелр / 1000.0; е!зе НдН-Зрееб - зреебГепр / 1090.0; Далее анализируются значения скорости двух колес, 1еН_8реес1 и п§11Г_ зреей, они преобразуются в единицу скорости КОЗ 2 - м/с. Знак скорости указывает на направление вращения колеса. // Вомисление линейной и углевой скоростей робота по скоростям колес с обеих сторон //и калибровка с использованием корректирующих параметров. ух = соггесбДасбог_ух_ * (1еИ_зрееб + гтдЬЩзрееб) / 2; уЩ = соггесбДасгог_убЬ_ * (гтд1тг_5рееб - 1еН_зрееб) / 0К161МВ0Т_ЫНЕЕ1_ТКАСК; Имея скорости двух колес, вычисляется линейная и угловая скорости от- носительно центра робота на основе кинематической модели дифференци
ального привода. Для этого введены два линейных корректирующих коэф- фициента соггес1_Еас1:ог_ух_ и соггес1_Еас1ог_у1п_, которые используются для калибровки линейного отклонения между фактическим и теоретическим интегрированным расстояниями. // Вычисление положения за один цикл одометоии. бе1Еа_х - ух * со5(ос!ор1_Ц1_) * ЦТ; Се1Са_у = ух * 5тп(ос1ср1_Й1_) * сП:; йеНа_1Ь = уйт * сИ; // Вычисление накопленнэ-о положения одометрии. обоР1_х_ += Сенах; оСог_у_ += 1е1Да_у; ос1оп_СЬ_ + СеНа_ЙЦ Получив интервал времени ЙЕ и скорости робота ух и уНт, можно вычис- лить перемещение робота по оси х йеках, по оси у йейау и угол поворота вокруг оси 2 йека_Й1 за время Й1. Затем с помощью статических переменных ойот_х_, ойот_у_ и ойот_1й_ накапливаются все перемещения и повороты за все интервалы времени, таким образом, интеграцией определяются текущее положение и угол поворота робота. // Коррекция угла ориентации для поддержания значения в пределах от -180° до 180°. ЩоСорИЪ. > М_Р1) ос!оп_СН_ -- М_Р1*2; е!зе 1Е(о1о«_Й_ < (-М_Р!)) оСот_СН_ += Н_Р1*2; // Публикация темы одометрии и выполнение трансляции ГЕ. обоР1_риМг511ег(ух, УЙ); Поскольку используется метод интегрирования, при повороте робота бо- лее чем на 180° значение угла может превышать п. Чтобы угол робота всегда оставался в пределах ±п, выполняется дополнительная корректировка по- ложения. После завершения всех этих операций можно опубликовать тему ойот с помощью функции ойот_риЫ18Йег() и обновить дерево координат Н. 2. Публикация темы одометрии и поддержка системы координат Г/ в системе ЯО8 2 Тема одометрии использует сообщения пау_т8§8/тз§/Ойоте1гу, которые определены следующим образом: # Включение имени опорной системы координат одометрических данных Егапе_1с1. 5Й_п15д5/Неас1ег Ьеэбег ЬиШ1п_тМ:егЕасеь/Т1Р1е ьбарр 1п132 чес итпЕЗЗ папозес зЕгтпд Егар1е_гб
# Базовая система координат робота. зТг гид сМ1с1_1тгпе_гс1 # Оценка положения робота в опорной системе координат, включая положение (координаты) и ориентацию (кватернион). деояе1:гу_П5д5/Ро5е1л|,г1:11Соуаггапсе розе Розе роье РотгЛ розШоп Поаб64 х ПоаббИ у НоаС64 г Оиабегпгоп оггепгабгоп Поаб64 х О Поа164 у 0 НоаТ64 г 0 НоаббИ и 1 Ноа1:64[36] соуаггапсе # Оценка состояния робота в опорной системе кооодинат, включая линейную и угловую скорости. деолеН уцпзд'/ЩгзсЛгЬСоуаггапсе ЩгзГ Титзб ТигзТ УессогЗ Ппеаг ПоаТ64 х Яоаб64 у ПоаС64 г УессогЗ апдЛаг ПоаТ64 х Поаб64 у ПоаТ64 г Г1оаУ64[Зб] соуагтапсе Сообщение одометрии состоит из двух частей: 1) розе: текущее положение робота, включая координаты по осям х, у, т и параметры направления, а также ковариационную матрицу для кор рекции ошибок; 2) текущее состояние движения робота, включая линейную и угло- вую скорости по осям х, у, я, а также ковариационную матрицу для коррекции ошибок. д|К В приведенной выше структуре сообщения, помимо ключевой информации о скоро- сти и положении, также содержится ковариационная матрииа, используемая в алго- оитмах филыграыии. В системах роботов с невысокими требованиями к точности мож- но использовать ковариационную матрицу по умолчанию. Однако в системах с более высокими требованиями к точности необходимо сначала точно смоделировать ро- бота, а затем определить конкретные значения этой матрицы с помощью симуляций, экспериментов и других методов. Далее в функции оботрпЬПзЬегО вычисленные данные одометрии упако- вываются в сообщение ОботеГгу и публикуются. Код реализации выглядит следующим образом:
х'стС ОпдспЬоСВэзе: :сс!оп_р11о1.гзЬег(Г1оаС ух, Г1эа* у1Ь) { аиТо осоп_пзд - пау_пздз: :пьд::Одопе±гу(); // Вычисление данных одометрии. о^оП-Пзд.Ьеа^ег.Ггапе^с) = 'одой"; оУоп_пзд.Ьеас1ег.5Сапр = Йг5->дес_с1.оск()->по‘л/(); ойоН-Пзд.розе.розе .роНМоп.х = ос!оп_х_; иСог_тзд.розе.розе.ро51Стоп.у = оУон_у_; о^оН-Пзд.розе.резе.роз-Исон.7 - 0; Н2: гусаке Гитон д; д.зе1-КРУ(0, 0, оооп_СЬ_); оУоП-Пзд.сЬИОгапеЗ^ = 'Ьазе_Гоо<:рг1п1:"; о(1оп_пзд.розе.розе огтепШтоп.х = д[0]; ос!оп_1Чзд. розе, розе. огт-епДабгоп. у = д[1]; ойог.-Изд .розе. розе .огтепСаНоп. г = д[2]; ис1ог_11зд.розе.ро5е.огтепШ-1оп.и = д[3]; сопоС с!оиЫе о(1оя_ро5е_ссуаггапсе[36] = {1е-3, 0, 0, 0, 0, 0, 0, 1е-3, 0, 0, 0, 0, 0, 0, Зеб, 0, 0, 0, 0, 0, 0, 1еь, 0, О, 0, 0, 0, 9, 1еб, 0, 0, 0, 0, 0, 0, 1е-9}; сопзС с!оиЬ'1е о<1оя_ро5е_соуаггапсе2[36]= {1е-3, 0, 0, 0, 0, 0, 0, 1е 3, 0, 0, 0, 0, 0, 0, 1еб, 0, 0, 0, 0, 0, 0, 1е6, 0, О, 0, 0, 0, 9, Зеб. О, 0, 0, 0, 0, 0, 1е-9}; оСог_лзд.1:и-1зт.1:и151:.Нпеаг.х = т; сСоГ-Пзд.Ълзг Литзг Лтпеаг .у = 0.00; сс!ог_пздЛит51:Ли151: .Ппеаг .7 - 0.00; ос1оп1_П5д Лнгзг Л'лзг. апдиТэг .х = 0.00; оСоГ-ПздЛитзСЛитзС.апсиЪэг .у = 0.00; оСог1_пзд.Ълзг .Шзт.апдиТэг .2 = у11а; соп41 с!оиЫе ос!оа_1:т5С_со7аГсапсе[36] = {1е-3, 0, 0, 0, 0, 0, 0, 1е-3, 1е-9, 6, 6, 0, 0, 0, 1еб, 0, 0, О, 0, 0, 0, 1еь, 0, 0, 0, 0, 0, 0, Зеб, О, 0, 0, 0, 0, 0, 1е-9}; сопзс йоиЫе оСогп_1:1'Л5С_со7агтапсе2[Зб] = {1е-3, 0, 0, 0, 0, 0, 0, 1е-3, 1е-9, 6, 0, 0, 0, 0, 1еб, 0, 0, 0, 0, 0, 0. 1еь, 0, 9, 0, 0, 0, 0, Зеб, О, 0, 0, 0. 0, 0, 1е-9};
И (ух == 0 && убН -= 0) "1епсру(Кос!о1ч_п'5д.розе.соуаггапсе, ос!он_роье_соуаг1апсе2, 5ггео<:(ос1о1,1_ро5е_ссуагга11се2)), пепсру(&о^оп_П5д. 1x1.51:.соуаггапсе, ос!оп_1:1л1г51:_соуаг1зпсе2, зггеэКос!сп_Г|л/г51:_ссуаг гапсе2)); еНе пепсру(&ос1оп_П8д.ро5е. соуаггапсе, ос!от_роье_соуаггапсе, 517ео1:(эс1сп_ро5е_соуаггапсе)), пенсру(&ос1ог1_Г15д. 1x151. соуаггапсе, ос1от_[|л1г51:_соуаггапсе, 5г2есГ(ос1о1‘1_1х1.51:_соуаггапсе)); // Публикация темы одометрии. ос!оп_риЫ15Ье1_->риЫ15Ь(ос!он_п15д); деопеТгу_п5д5::пзд: гТгапь-ГогпЬтапреб С; б.Ьесбег.зсапэ = бЫз->де1:_с1сск()->гои(); 1:.1геас1ег.1тане_1Д = ' одоп"; С.сЬг1с1_бгапе_Щ = "Ра5ё_Гоо1:рггпс'; б.бггпзГотп.кгапзТабтоп.х = обоп_х_; СЛгапьЕо'п.сгапзТаггоп.у = оаоз_у_; б.бгапБ^отп.бгапзТаббоп.г = 0.0; бЛгапзГо'п.гсбабгор.х = д[0]; б.бггпьГогп.гобаббог.у = д[1]; б.бгапзГо^Р1.гсбаб\.ог..2 - д[2]; б.бгап5Гогп.гобабтоп.и = ц[3]; 11:(риЬ_ос1оп_){ // Трансляция тТ одометрии. гб_Ь-оаЗсае се г- >зеос1Т ггпзбогт (б); } } В приведенном выше коде сначала создается сообщение одометрии ос!от_ тз§, в которое заполняются ранее вычисленные данные одометрии ойош_х_ и ос1от_у_. В части данных о положении используется кватернион для опи- сания ориентации в сообщении ОбошеТгу, тогда как ранее вычисленная ори- ентация была представлена в виде углов Эйлера. Хотя оба метода описания имеют одинаковое значение, они различаются по способу представления, поэтому необходимо использовать метод зе1КРУ() из 112: :Оиа1егп1оп для пре- образования углов Эйлера в кватернион. Кроме того, в сообщении Ойошебгу также содержится ковариационная матрица, которую можно использовать для будущих расчетов фильтрации. После заполнения сообщения одометрии его можно опубликовать через ойот_риЫ1з11ег_, что позволяет приложениям верхнего уровня подписываться на данные о положении робота. В системе КОЗ 2, помимо публикации данных Обош, необходимо также контролировать взаимное положение робота и внешней среды через Н, по- этому функция ойот_риЫ151тег() на основе данных одометрии также обнов- ляет через И Ьгоайсазбег . Итак, мы реализовали публикацию темы, связанной с одометрией робота, и обновление 11.
6.2 А Динамический мониторинг состояния робота Одомегрия является важной частью данных о состоянии робота. Кроме нее, состояние робота обычно включает в себя уровень заряда аккумулятора, состояние ввода/вывода и т.д. Робот Оп^тВоб также содержит макет и реа- лизацию этой части. Поскольку состояния разных роботов нс полностью одинаковы, в КОЗ 2 нет стандартного определения для подобных сообщений. Можно реализовать их через пользовательские интерфейсы сообщений. В этой книге для робота Оп&тВоГ разработано сообщение оп^тЬоГ_т8§8/т8§/Оп§тЬо1:81аГи8. Ноаб32 ЬаНегу_уоПаде # Уровень заряда аккумулятора, в вольтах. Ьсо1 5иггег_оп # Состояние зуммера, бгие означает включен, 1а1зе - выключен. Ьсо! 1еб_оп # Состояние светодиода, Сгие означает включен, ба1зе - выключен. Эти данные о состоянии робота периодически передаются от контрол лера движения к прикладному процессору, после чего они анализируются и сохраняются в соответствующие переменные программы. Код реализации выглядит следующим образом: уогб Огт^СпЬоНЗазе: :Нпег_1е0т5_са11Ьаск() { Ц Публикация информации о состоянии робота. огбдбпЬоб_тздз: :нзд: гОгтдСпЬоббСаГиз 5баби5_п5д; 5гаги5_пзд.оагТегу_уо',Даде = гоЬоб_5габиз_.Ьагбегу_уо11аде; зГаСиздпзд.ЬигзеГ-ОР = гоЬоб_5бабиз_.Ьи22ег_оп; згаби5_пзд.1еа_оп = гоЬоб_збагиз_.1еб_оп; 5бабиз_рсЫгьЬег_->риЫ1зл(5бабиз_пзд;; } В конструкторе Оп§1пЬо1ВазеО узла драйвера шасси Оп§1пВо1 для ВОЗ 2 создается таймер с периодом 100 мс, который с частотой 10 Гц вызывает функцию обратного вызова Нтег_100т8_са11Ьаск(), создавая сообщение о со- стоянии робота 81а1и8_ш8§. После заполнения новой информацией о состоя- нии оно публикуется через 81аГиз_риЫ18Нег_. Если в других приложениях или в терминале нужно просмотреть состояние робота, необходимо подписаться на тему оп§тЬоГ_8ГаГи8 для получения этой информации. Например, можно подписаться на тему оп^тЬоГзШиз через командную строку, результат по казан на рис. 6.11. $ гоз2 борее есб.о /огсдбпЬоО^абиз Перед подпиской на тему опд1пЬоб_зГа1из убедитесь, что узел шасси робота загущен с помощью команды гоз2 таипсН ог.д.пЬоТ Ьппдир ог.дтЬоМаипсб.ру.
Я гооЬ(®иЬип1и: ~ а = □ X -оо!(ЗиЬип1и:гоз2 1оргс есЬо /оггдгпЬо1_51а1из эа«егу_7о11аде: 4.559999942779541 эиггег_оп: ГаХзе 1ед_оп: 1гие >а«егу_7о11аде: эиггег_оп: ГаХзе 1е<1_оп: 1гие 4.559999942779541 эаИегу_7о1Ладе: зо72ег_оп: ГаТзе 1ед_оп: 1гче 4.559999942779541 эа11:егу_7оИ:аде: эо2гег_оп: ГаХзе 1е<1_оп: 1:гие 4.559999942779541 эа^егу^оПаде: эи2гег_оп: ГаХзе 1ед_оп: 1гие 4.559999942779541 эа1:1егу_701Ладе: эи22ег_оп: ГаХзе 1ед оп: 1:гие 4.570000171661377 Рис. 6.11 ❖ Подписка на тему опд;пЬоТ_51а1и5 Как можно управлять зуммером и светодиодом, информация о которых со- держится в состоянии робота? Это .можно реализовать с помощью механиз- ма службы 8егу1се. Однако для этого необходимо создать пользовательские интерфейсы службы опутЬо^тя^/згу/Оп^тЬсйВихгег и огщтЬоГ тхдзАгу/ Оп§тЬоГЬес1, которые имеют одинаковую структуру данных. Ьос! от, # Команда управления вводом/вывсдом, Ггие для включения, ЕаУве для выключения. Ьоо! гезиИ # Результат управления вводом/выводом, Ггае означает успех, ЕаТзе означает неудачу. Рассмотрим пример реализации интерфейса управления для зуммера. Ьоо! ОгтдтпЬсЩазе: :Ьиггег_сопГго1(Ьоо1 оп) { ОабаЕгате сопЕтдЕ! аге; // Инкапсуляция кадра данных команды для зуммера. сопНдЕсапе. Ьеас1ег = 0x55; сопКдЕгате. 1с1 - 0x07; сопбтдЕгапе.ТепдсЬ = 0x06; сопНдЕгате.Ра1а[0]- 0x00; сопГъдЕгапе.с1аба[ 1 ] - 0x00: сопНдЕгапе. с!ата[?]- ОхЕЕ; гб(оп) согР.дЕгапе.баГа[3]- ОхЕЕ; е!зе ссгЕтдЕ-апе.бага[3] = 0x00; согтЕ1дЕгат)е.(1а1а[4]= 0x00; сопНдЕгапе с!аГа[5]- 0x00;
сопНдЕгапе.скеск = (сопГ1 дЕ гапе. баСа [ 0] + сопНдЕгапе.баСа[1 ] + сопЕЕ дЕгапе. баса [ ? ] + сопЕСдЕтапе.баса[3] + сопЕсдЕгапе.бака[4] + сспЕСдЕга1'1е.баСа[5]) & 0хЕЕ; сопЕсдЕгзпе.сат! = 0хВВ: тгу { 5егЕа1_.нггге(&согЕ1дЕ'аР1е.11еа<1ег, зСсеоЕ(сопгСдЕгапе)); // Отправка данных //в последсва-ельный порт. } сэссй (зегса!: :ЮЕхсерСсоп &е) { // Вывод сообщения об сшибке при сбое отправки данных. КСССРР_ЕКК0к(СЕЛ8->деС_1оддег(), "ОпаЫе Со вепс! с1а±а ЙгоидЬ зегса! рогС"); } геСигп сгие; } уссб ОгсдспЬоСВазе: :Ьиссег_саиЬаск(сопзС зсб: :5кагес1_р1:г<эгкдСпЬо1:_1П5д5::згу: :СгтдспЬоСВиссег::Чедаез1:> героев!, зСб: :зНаге<б_рСг<огЕдЕпЬэС_П5д5: :вгу: :Ог 1 дспЬоСВиссег: :Чевропве> гевропве) { । оЬсСьСаЕиз.Ьиссегоп - гедиезС->оп: тЕ(Ьиссег_сопСго1(гоЬо(_5СэС,из_.Ьисзе''_оп)) { РС1СРР_1МЕ0(С1=115->деС_1оддег(), "Зе! Биссет зСаСе Со %б", гоЬсС_вСаСив_.Ьиссег_оп); гезропзе->гези1С = Сгие; } е!ве { КСССРР_1л1АМ(С11т.8->де(_',,оддег(), "ЗеС Биссег вСаСе еггог [%!]", гоэоС_вСаСиз_.Ьоссег_оп); гезрппзе->геви1с = ЕзТзе; } } Когда клиент запрашивает службу управления зуммером, сервер в драй- вере шасси переходит в функцию обратного вызова Ьи22ег_са11Ьаск(). На ос- нове команды управления вводом/выводом из запроса гсцпезС >оп функция Ьи22ег_соп1го1() формирует кадр данных протокола коммуникации, который затем через функцию 8епа1_.шп1е() отправляется на контроллер движения для управления вводом/выводом зуммера. Если управление было успешно, сервер возвращает 1гпе, в противном случае - га1зе. Зуммер можно включить или выключить с помощью приведенных ниже команд, как показано на рис. 6.12. В терминале отображается результат, воз- вращаемый службой. #л Включение зуммера $ гоз2 зегуссе саП /огСдтпоос_Ьи?сег огтдСпЬоС-Г’здз/згу/О'с.дт.пЬссВиссег "'оп': Сгие' ## Выключение зуммера $ гоз2 зегуссе саП /огСдтпаоС_Ьи7гег огтдспЬоС-Пздз/зге/ОггдЕпЬоСВиссег " оп : Еа1зе"
М гооЬфиЬипЬи: ~ О = _ о х Гоо1@иЬип^и:~# гоб2 Бегутсе саП. /ог1д1пЬо1:_Ьи22ег ог-1дт.пЬо1_т5д5/5Гу/Ог1д1пЬо1:В иггег "'оп': 1:гие" гедиез^ег: такгпд гедиезС: огтдгпЬо^пздз.5™.0г1д1пЬо1Виг2ег_Кедие5<:(оп=Тгие) гезропзе: огтд1пЬо1:_т5д5. згу . 0г-1д1пЬо11Ви22ег_Ке5рог)5е( гези11:=Тгие) гоо*@иЬип1и: гоб2 зегитсе саП. /огтдтпЬо1:_Ьиг2ег оггдгпЬо1_тздз/5Г7/0ггд1пЬо1:В иггег "'оп1: ГаХзе" гедиез1:ег: тактпд гедиезС: огхдтпЬо^пздз.згу.0ггд1пЬо1:Ви22ег_Редие5<:(оп=Еа15е) гезропзе: 0ггдгпЬо1_П5д5.5ГУ.0ггдгпЬоСВингег_Ке5роп5е(ге5и1С=Тгие) Рис. 6.12 ❖ Управление включением и выключением зуммера в ОпдтВоГ через службу Аналогично управлению зуммером, в драйвере шасси Оп^тВо! также реа- лизовано управление светодиодами и изменение параметров ПИД. Под- робная реализация кода здесь не приводится, но вы можете динамически управлять или с помощью вызова службы в терминале. На этом этапе, основываясь на ключевых концепциях КОЗ 2 и распреде- ленной коммуникационной сети, мы, используя робог ОпдтВоГ в качестве примера, реализовали в ВОЗ 2 драйвер шасси робота. В следующих главах мы продолжим разрабатывать функции верхнего уровня для робота! 6.3. Программирование и визуализация движения робота После завершения разработки в ВОЗ 2 драйвера для шасси можно управлять движением робота и получать информацию от сенсоров. В этом разделе .мы начнем с базовых функций движения робота, создав простое приложение для управления. В приложении симулятора черепахи мы публиковали команды скорости через командную строку, чтобы черепаха двигалась по круговой траектории. В этом разделе мы попытаемся заставить реального робота дви- гаться по кругу, 6.3.1. Определение сообщений управления скоростью в КОЗ 2 В разделе 6.2 мы узнали, что для управления движением робота в КОЗ 2 обыч- но используется тема спн1_уе1 в качестве интерфейса. Драйвер шасси робота анализирует сообщения, публикуемые в сшй уе!. Типом этого сообщения яв-
ляется ТМ₽1. Какова его структура данных? Выполните следующую команду для просмотра структуры, как показано на рис. 6.13. $ гоз2 тпГегГасэ зНон деопеГгу-Пздз/нзд/ТЩзГ гозгфдиуиеЬоте: - гоз2@диуиеНоте:гоб2 хп^егГасе зНоы деоте1:гу_т5дз/т5д/Т>А51: # ТМб ехргеззеБ уе1ос\Лу гп Ггее Брасе Ьгокеп 1п1о Из Нпеаг апд апдиТаг раг15 Х/ес'ЬогЗ Ипеаг Г1оа^64 х Г1оаГ64 у Г1оа1164 2 \/ес1огЗ апдиХаг Поа164 х Поа164 у Поа1б4 2 Рис. 6.13 ❖ Структура сообщения 1\л/15Г Как видим, сообщение ТтхшЕ очень простое, оно содержит только два век- тора: линейной скорости и угловой скорости. Каждый вектор состоит из ком- понентов по осям х, у, г. Независимо от того, движется ли робот по земле, летит в воздухе или плавает под водой, в трехмерном мире можно передавать команды скорости через сообщение ТущЩ. Еще раз подчеркнем, чтс в системе КОЗ 2 единица измерения линейной сксрости по умолчанию - м/с, а у!ловой скорости - рад/с. Направление определяется по правилу правой руки: движение вперед - это положительное направление оси х, поворот вле во - это положительное направление вращения вокруг оси 2. В драйвере шасси робота КОЗ 2 уже интегрирован подписчик на коман- ды скорости. Чтобы заставить робота двигаться по кругу, нужно создать со • общение Тупз! с линейной и угловой скоростями и опубликовать его в теме скорости. Можно использовать метод управления черепахой, чтобы напрямую опуб- ликовать тему скорости для Оп§тВо1 в командной строке. $ гоз2 Горте риЬ -гаГе 1 /спс!_7е1 деопеГгу_п5д5/п5д/Ти15Г "{Ипеаг; {х: 0.2, у: 0.0, г: 0.0}, апдиЕаг: {х: 0.0, у: 0.0, г: 0.8}}'' Приведенные выше команды публикуют с частотой 1 Гц линейную ско- рость 0,2 м/с по оси х и угловую скорость вращения 0,8 рад/с по оси г. При запуске шасси робота можно наблюдать, как робот автоматически движется по круговой траектории, как показано на рис. 6.14.
Рис. 6.14 ❖ Результат запуска кругового движения робота 6.3.2. Программирование движения и визуализация Помимо публикации тем скорости через командную строку, более распро- страненным методом является публикация через программный код, что об- легчает интеграцию в робототехнические приложения. Например, если робот видит препятствие впереди, программа может опубликовать тему скорости, чтобы изменить направление и обойти препятствие. Сначала запустим пример, чтобы посмотреть на результат. После запуска шасси робота Оп§тВо1 выполните следующую команду на роботе или на компьютере в той же сети. Процесс выполнения показан на рис. 6.15. $ гоз? гип оггдтпЬсГ_с1епо с1га1л1_сггс1е О гоос@)иЬипЬи:~ гоо^@иЬип1и:~# ГО52 гип ог!д1пЬо1_^ето с1гам_с1гс1е [1К1ГС1 [1723524583.341968078] [дгам_сггс1е]: РиЬНзЬгпд: "Нпеаг: 0.20, апдиХаг: 0.80" [то] 0.80" [1723524583.724052215] [дгам_сггс!е]: РиЫгзЫпд: "Нпеаг: 0.20, апдиХаг: [то] 0.80" [1723524534.224316364] [е)гам_с1гс1.е]: РиЬИзЫпд: "Нпеаг: 0.20, апдиХаг: [Ш0] 0.80" [ 1723524584.724044023] [дгам_с!гс1е]: РиЬНзЬгпд: "Нпеаг: 0.20, апдиХаг: [1МЕ0] 0.80" [1723524585.224319577] [с1ган_с1гс1е]: РиЬИзМпд: "Нпеаг: 0.20, апдиХаг: [11ЧГ0] 0.80" [1723524585.724029761] [дгам_сггс!е]: РиЬНзЫпд: "Нпеаг: 0.20, апдиХаг: [то] 0.80" [1723524586.224369229] [дгам_сггс!е]: РиЬИзЫпд: "Нпеаг: 0.20, апдиГаг: [11ЧЕ0] 0.80" [1723524586.724038857] [бгам_с1гс1е]: РиЬНзЫпд: "Нпеаг: 0.20, апдиХаг: [1ИР0] 0.80" [1723524587.224891159] [дгам_стгс1е]: РиЬНзМпд: "Нпеаг: 0.20, апдиХаг: [1О] 0.80" [1723524587.724043412] [дгам_сггс1е]: РиЬНзЫпд: "Нпеаг: 0.20, апдиХаг:
После запуска робот начинает круговое движение, как показано на рис. 6.14. Изучим программный код этого узла. Код находится в файле оп$шЬо1_ 4ето/с1гаш_с1гс1е.ру, его полный текст приведен ниже. гпрогб гс!ру # Интерфейс РугЬоп в 805 2. бгоп гс!ру.пос1е тпрогс Мобе # Класс узла КОЗ 2. бгоп деопебгу_н5дь.п5д ттрогб Гитьб # Сообщение темы скорости. II II Н Создание издателя узла. II н н сТазз РиЫЛьЬег Мобе(Мобе): беГ __сптС__(зеИ, папе): зоре,().__гпИ____(папе) # Инициализация родительского класса узла КОЗ 2. # Создание объекта издателя (тип сообщения, имя темы, длина очереди). зеИ.риЬ = зеЪТ. с г еа Се_риЫ151тег (ТитьТ, 'сп<1_уе1', 10) # Создание таймера (период в секундах, выполняемая периодически функция обратного вызова). зеИ.Пнег = зе1г.сгеабе_Ппег(0.5, зеИ.П?1ег_са11Ьаск) Реб Пнег_са11Ьаск(зеИ:): # Создание функции обратного вызова, выполняемой периодически # таймером. битзб - ТитзбО # Создание объекта сообщения тина Тнгзб. гигзб.Ипеаг.х = 0.2 # Заполнение линейной скорости в объекте сообщения. Ситзб.апдиТаг.а - 0.8 # Заполнение угловой скорости в объекте сообщения. зеП.риЬ.риЬП5Ь(гыЗМ) # Публикация сообщения на тему. зеИ.деб_1осдег()ЛпГо('Рибизйтпд: "Нпеаг: %0.2б, апдиСаг: %0.2Г' % (глзб.Ипеаг.х, Ситзб.апдиТаг.а)) Реб пабп(агдз-Мопе): # Вход в главную функцию патл узла КОЗ 2. гсТру.1пП(агдз=агдз) # Инициализация интерфейса РуТНоп в 805 2. поре - РиЫЛз1тегМос1б("с1гач_стгс'1е ) # Создание объекта узла 805 2 и его инициализация. гс1ру.зрт.п(поае) # Циклическое ожидание выхода 805 2. поРе.Ре'Лгоу_поРэ() # Уничтожение экземпляра узла. гсТру.з(|ибс!о1л/п() # Закрытие интерфейса РуЦ.оп в 805 2. Этот код аналогичен коду узла издателя темы, рассмотренному в разде- ле 2.5.4, с некоторыми отличиями, которые приведены ниже. 1. Отличается имя темы, публикуемой издателем. Здесь это спкАме!, и оно предназначено для управления движением робота. 2. Отличается тип сообщения. Здесь используется тип ТмйЩ, в который заполняются линейная и угловая скорости. Остальные процессы полностью идентичны, поэтому, зная общую струк- туру публикации и подписки тем, вы без труда сможете работать с любыми темами и сообщениями.
6.4. Драйвер камеры и данные изображения Мы научились управлять движением робота с помощью дистанционного управления и программирования, но этого недостаточно. Робот должен так- же уметь «видеть» окружающую среду, и для этого ему необходимы «глаза», то есть камера. 644. Распространенные типы камер Камера является «глазами» робота, позволяя ему видеть внешний мир. Наи- более распространенные типы камер включают монокулярные, стереоско- пические и трехмерные камеры, они изображены на рис, 6.16. Рис. 6.16 ❖ Распространенные типы камер Принцип работы монокулярной камеры относительно прост и схематично изображен на рис. 6.17. Свет проходит через объектив и попадает на свето- чувствительный сенсор внутри камеры, где аналоговый сигнал прообразу ется в цифровой. Затем формируется изображение, состоящее из множества пикселей, которое можно использовать в системе управления для обработки изображений и распознавания объектов.
Традиционные визуальные камеры получают двумерные изображения, лишенные пространственной глубины. С усложнением практических задач появилась технология ЗБ-визуализации. Она не только эффективно решает задачи распознавания сложных объектов в трехмерном мире, но и позволяет реализовать более сложные функции взаимодействия человека и машины и находит все ботес широкое применение. В настоящее время в промышлен- ности существуют три основных решения ЗБ визуализации: метод времени пролета (ТоР), метод структурированного света и метод стереоскопического зрения. Все они привели к изменениям в аппаратной части камер, а также к развитию соответствующих технологий сенсоров и полупроводниковых чипов. С развитием полупроводниковой отрасли системы .машинного зрения ста новятся все более интегрированными, миниатюрными и интеллектуальны- ми. Многие интеллектуальные камеры имеют размер с ладонь, но оснащены высокоскоростными процессорами, которые могут самостоятельно выпол нять задачу распознавания без необходимости в подключении внешнего процессора. Для часто используемых в роботах визуальных сенсоров в КОЗ 2 имеют ся стандартные пакеты драйверов и определения сообщений. Рассмотрим сначала распространенные двумерные цветные камеры на примере камеры ноутбука. Мы воспользуемся пакетом драйверов КОЗ 2 для ее «запуска». 6.4.2. Драйвер камеры и визуализация В разделе 2.5 было описано использование пакета изЬ сат для запуска узла камеры. Давайте вспомним этот процесс. Сначала установите пакет изЬ сат с помощью следующей команды, процесс установки показан на рис. 6.18. $ зибо аре 1п5*а11 гоз-таггу-изЬ-сап го52(адиуие1ю1’1е:~$ зийо ар! тпз1аИ гоз-Заггу-изЬ-сап ВеасИпд раскаде Из1з... Оопе ВиИсНпд йерепдепсу 1гее... Оопе Кеадгпд з!а1е хпГогтаНог)... Оопе ТЬе 1о11ом1пд раскадез мН! Ье ирдгас1ед: гоз-заггу-изЬ-сап 1 ирдгадед, 9 пеш1у 1пз1а11ес1, 0 1о гепоуе апс1 552 по!: ирдгадед. Меес! 1о де! 169 кВ о Г агсЫиез. АПег 1Ыз орегаИоп, 0 В оГ асМШопа! сНзк зрасе т.11 Ье изед. Се1:1 Ы1р | ' 1з1пдЬиа.ес1и.сп/го52/иЬип1:и поЫе/гчагп апс!64 гоз-^аггу -изЬ-сат атд64 0.8.1-1поЫе.20240731.165845 [169 кВ] ЕеИсЬед 169 кВ 1п Оз (422 кВ/з) (КеаЛпд да1аЬазе ... 313212 Н1ез апд сНгес1ог1ез сиггепНу 1пз1а11е(].) Ргерагъпд 1о ипраск .. ./гоз-за22у-изЬ-сап_0.8.1-1поЫе.20240731.165845_ап<]64.деЬ □праскспд гоз-заггу-изЬ-сап (0.8.1-1поЫе.20240731.165845) оуег (0.8.1-1поЬ1е.20 240703.180939) ... 5е111пд ир гоз-заггу-изЬ-сат (0.8.1-1поЫе.20240731.165845) ...
После завершения установки выполните следующую команду для управ- ления камерой ноутбука: $ гоь2 гип изЬ_сап изЬ_сан_п<Пе_ехе ®Если вы используете виртуальную машину, сначала подключите камеру к виртуаль- ной машине' нажмите в меню параметр Виртуальная машина, выберите пункт Под- ключаемые устройства найдите свою модель камеры и нажмите Подключить. После успешного запуска можно использовать инструмент гц1_1та$е_У1есу из ВОЗ 2 01 ТооПэох для просмотра данных изображения. $ го$2 тип грГ гпаде^теь гчг_т.пгде_Щен После запуска выберите тему изображения 1та§е_гаш в выпадающем меню, чтобы отобразить изображение с камеры в реальном времени, как показано на рис. 6.19. Рис. 6.19 ❖ Просмотр изображений с камеры через грГ_1таде_У1е\у В некоторых случаях может потребоваться подписка на несколько источ- ников данных изображения, для этого можно использовать другой способ запуска, предоставляемый пакетом изЬ сат. $ гоз2 ТаипсЬ изЬ_сап сатега.Таипсб.ру Вышеупомянутый файл запуска Ъаипсй располагает данные изображения в пространстве имен сатега1, соответствующая тема изображения также изменяется на/сатега1/ппа§е_гаш, что позволяет избежать конфликта имен нескольких тем изображения, см. рис. 6.20. Используемый здесь пакет функций нзЬсаш является драйвером ПЗВ камеры, основанным на протоколе У4Ъ, с основным узлом изЬ сат побе ехе. Связанные темы и основные параметры представлены в табл. 6.11 и 6.12.
ОеРаик-гдЬ гоо^@ гоо1:@ гоо1@ гоо^ го52фдцуиеЬоте: ~ Н1е Р1ид!п5 йипп'тд Рег$ресйуе$ Не1р 3'1таде ХЛеллг /сатега 1/|таде гаму Я Г§] |®| □ 1 |де_га>л/_тои5е_1еГ(: ЗтооСЬ $са1тд | | о* ; го52@диуиеЬоте:~$ го$2 ХаипсЬ изЬ_сат сатега.ГаипсЬ.ру [1А1Е0] [1аипсЬ]: АН Ход НЛез сап Ье ^оипд ЬеХои /Коте/го52/.го5/1.од/2024-08-1; -13-33-42-470645-диуиеКоте- 5671 [1МР0] [ХаипсН]: ОеТаиН ХоддХпд уегЬозгХу 15 зе! Со 1МР0 [1ИЕ0] [и5Ь_сат_поде_ехе-1]: ргосеББ 5(агХес1 «ИЬ р1д [5674] [изЬ_сат_поде_ехе-1] [1ЫЕ0] [1723527222.737050593] [сатега!]: сатега_пате уаХие: 1ез1_сатега [ц5Ь_сат_поде_ехе-1] [НАКИ] [1723527222.737139741] [сатега!]: 1татега1е: 30.ОООЕ 00 [изЬ_сат_пос1е_ехе-1] [1ЫЕ0] [1723527222.740726081] [сатега!]: сатега саНЬгаНог 11КЬ: раскаде://и5Ь_сат/соп^хд/сатега_гпГо.уат1 [и5Ь_сат_поде_ехе-1] [1МЕ0] [1723527222.742318373] [сатега!]: 51аг11пд Че51_сап ега’ (/деу/ухдеоб) а! 640x480 уха ттар (т]ред2гдЬ) а! 30 ЕР5 [изЬ_сат_поде_ехе-1] ТМ.5 деухсе зиррогХз ХЬе ГоНошхпд ГогтаХз: [изЬ сат поде ехе-1] 7077 4:2:2 640 х 480 (36 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 648 х 480 (24 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 648 х 480 (20 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 648 х 480 (15 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 648 х 480 (16 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 648 х 480 (7 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 648 х 480 (5 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 160 х 90 (36 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 168 х 96 (24 Нг) [изЬ сат поде ехе-1] 7077 4:2:2 166 х 96 (20 Нг) Рис. 6.20 ❖ Запуск файла ЬаипсН в паке1е функций и$Ь_сат и вывод изображения на экран Таблица б. 11. Темы в пакете функций изЬ сат Имя Тип Описание Публикация темы - < сатега пате >/1 та§е зепзогтздзДтаде Публикация данных изображения Таблица 6.12. Параметры в пакете функций изЬ сат Параметр Тип Значение по умолчанию Описание у!с1ео бе VI се зГппд «/с1еу/у|<1ео0» Номер устройства камеры 1тадс 1ПГ 640 Горизонтальное разрешение изображения йпаде }1е!§1л1: т1 480 Вертикальное разрешение изображения (татегаГе тС 30 Частота кадров сатегатГо иг1 зТппд «раскаде:// изЬ сат/сопб§/ сатега тГо.уат!» Путь к файлу калибровки камеры сатега пате зГппд «Гез! сатега» Имя камеры р1хе! ГогтаГ зГппд «пнре§2гдЬ» Кодировка пикселей: уиуу2гдЬ: формат захвата У4Ь2 - УПУУ, кодирование изображения в ВОЗ 2 - ВСВ8; нуууЗгдЬ: формат захвата У4Ь2 - ЦУУУ, кодирование изображения в ВОЗ 2 - ВСВ8; т)ред2гдЪ формат захвата У4Ь2 - М}РЕС, кодирование изображения в ВОЗ 2 - ВСВ8; гдЬ8: формат захвата У4Ь2 и кодирование изображения в ВОЗ 2 - ВСВ8; уцут : формат захвата У4Г2 и кодирование изображения в ВОЗ 2 - УПУУ; иууу: формат захвата У4Ь2 и кодирование изображения в ВОЗ 2 - ПУУУ; =>
Таблииа 6.121 (окончание) Параметр Тип Значение по умолчанию Описание ш4202г^Ь8. формат захвата 741.2 - М420 (также известный какУПГУ420), кодирование изображения в КОЗ 2 - КСВ8; топо8’ формат захвата У4Ь2 и кодиро вание изображения в КОЗ 2 - М0Ы08; топо16: формат захвата 74Е2 и кодиро вание изображения в КОЗ 2 - М0Ы016; у102топо8: формат захвата 741.2 - У10 (также известный как МОЫО10), кодирование изображения в КОЗ 2 - М0М08 1о тейюф 8ГПП§ «шшар» Каналы ввода/вывода: геай: копирует видеокадры между пользовательским пространством и пространством ядра; штар: буфер памяти, выделенный в пространстве ядра; ихегр^г: буфер памяти, выделенный в пользовательском пространстве 6,43. Определение сообщения изображения п Н05 2 Формат публикуемых данных изображений может быть разным при исполь- зовании как 115В-камер, так и КСЕВ-камер, Перед обработкой данных полез- но сначала ознакомиться с этими форматами. После запуска КОВ камеры можно использовать следующую команду для просмотра тем изображений в текущей системе. Результат выполнения по- казан на рис. 6.21. $ го5? Сорте тпГо -V /1паде_гаи Тип сообщения темы изображения - 8еп8ог_т8$8/1та§е, это тип 408 2 для необработанных изображений. Для просмотра детального определения со- общения можно использовать следующую команду. Результат выполнения показан на рис. 6.22. $ ГО52 ШеТасе зЬол 5еп5ог_пзд5/п5д/1таде Ниже приведено описание полей сообщения 8сп8ог_т8§8/1тадс. О Деайег: заголовок сообщения, содержащий номер изображения, вре- менную метку и привязанную систему координат. □ вертикальное разрешение изображения, то есть количество строк пикселей, например 480, О итДгй: горизонтальное разрешение изображения, то есть количество столбцов пикселей, например 640. □ епсос!1п§: формат кодирования изображения, включая распростра- ненные форматы, такие как КС1В, УИУ, формат не затрагивает сжатие изображения.
гоз2@диуиеЬоне:~$ гоз2 Соргс гпЕо -V /салега1/гнаде_ган Туре: $еп$ог_П5д5/т$д/1таде РиЫЛзЬег соипС: 1 Моде папе: сапега1 Моде папезрасе: / Торге Суре: зепзо^лздз/лзд/Тладе Торге Суре ЬазЬ: Р1Н$01_д31д41а9а4с4Ьс8еае9Ье757Ь0Ьеед306564Г7526с88еа6а4588ЕЬ9582527д47 ЕпдрогпС Суре: Р11В115НЕК СЮ: 01.0Е. 6а. 4с. 29.17. Е8. Та. 00.00.00.00.00.00.18.03 (?о$ ргоГгТе: ЯеТгаЬгТгСу: КЕИАВЬЕ НгзСогу (ОерСЬ): ОМКМОЫМ ОигаЬгТгСу: УОЬАТИЕ ЬгЕезрап: ТпЕгпгСе ОеадТгпе: ТпГгпгСе ЦуеТгпезз: А11Т0МАТ1С ЦуеТгпезз Теазе дигаСгоп: ТпСгпгСе 5иЬзсггрСгоп соип1: 1 Моде папе: гдС_диг_срр_поде_5471 Моде палезрасе: / Торге Суре: зепзо^лздз/лзд/Тладе Торге Суре ЬазЬ: Р1Н501_д31д41а9а4с4Ьс8еае9Ье757Ь0Ьеед306564Г7526с88еа6а4588ЕЬ9582527д47 ЕпдрогпС Суре: 50В5СК1РТ1ОМ СЮ: 01.0Е.6а.4с.5Е.15.сЕ.99.00.00.00.00.00.00.26.04 0о5 ргоСгТе: КеТгаЬгТгСу: ВЕ5Т ЕЕЕ0КТ Рис. 6.21 ❖ Просмотр информации о теме изображения Я го52(®диуиеЬоте: ~ гоз2@диуиеЬопе:~$ гоз2 гпСегГасе зЬои зепзо^лздз/лзд/Тладе И ТЬгз леззаде сопСагпз ап ипсолргеззед гладе И (0, 0) гз аС Сор-ТеЕС согпег оГ гладе зСд-Пздз/Неадег Ьеадег # Неадег СглезСалр зЬоиТд Ье асдигзгСгоп Сгле оГ гладе ЬигТСгп_гпСегСасез/Тгпе зСалр гпС32 зес цгпС32 папозес зСггпд Егале_гд # Неадег Егале_гд зЬоиТд Ье орСгса! Егале оГ сапега # оггдгп оЕ Егале зЬоиТд Ье орСгсаТ сепСег оЕ салеага # +х зЬоиТд рогпС Со СЬе ггдЬС гп СЬе гладе # +у зЬоиТд рогпС донп гп СЬе гладе # +г зЬоиТд рогпС гпСо Со рТапе оЕ СЬе гладе # I? СЬе Ггале_гд Ьеге апд СЬе Сгале_гд о? СЬе Салега1пГо # леззаде аззосгаСед игСЬ СЬе гладе сопЕТгсС # СЬе ЬеЬаугог гз ипдеГгпед игпС32 ЬегдЬС # гладе ЬегдЬС, СЬаС гз, пилЬег оС гонз игпС32 мгдСЬ # гладе игдСЬ, СЬаС гз, пилЬег оЕ соТилпз # ТЬе Теда! уаТиез Тог епсодгпд аге гп ЕгТе гпс1иде/5еп8ОГ_л8дз/гладе_епсодгпд5.Ьрр и 1Е уои мапС Со зСапдагдгге а пен зСггпд ГоглаС, ]огп № гоз-изегзвТгзСз.гоз.огд апд зепд ап елаг! ргорозгпд а пен епсодгпд. зСггпд епсодгпд # Епсодгпд оГ ргхеТз -- сЬаппеТ леапгпд, огдеггпд, згге # Сакеп Егол СЬе ТгзС оЕ зСггпдз гп гпс1иде/зеп5Ог_л5д5/гладе_епсодгпд5.Ьрр игпС8 гз_Ьгдепдгап # гз СЬгз даСа Ьгдепдгап? □гпС32 зСер # ЕиТТ гон ТепдСЬ гп ЬуСез □гпС8[] даСа # асСиаТ лаСггх даСа, згге гз (зСер * гонз) Рис. 6.22 ❖ Определение типа сообщения изображения ьеп5ог_т5дь/1таде О 1з_Ы§епс1лап: режим хранения данных изображения с учетом порядка байтов. О зТер: количество байтов в одной строке данных изображения, высту- пает в качестве параметра шага данных. Например, если в строке изо Сражения 640 пикселей, то 81ер равен мчйШ х 3 = 640 х 3 = 1920 байт.
О йа1а: массив, хранящий данные изображения, размер которого со- ставляет Мер х Не байт. Например, для изображения с разрешением 640x480 пикселей размер данных одного кадра составляет 1920 х 480 = 921 600 байт, что эквивалентно 0,9216 Мб. Объем данных изображения с разрешением 640x480 пикселей приближа- ется к 1 Мб. При частоте 30 кадров/с камера генерирует около 30 Мб данных в секунду. Для изображений более высокого разрешения объем данных необ- работанного изображения становится очень большим. Такой объем данных неприемлем в практическом применении, особенно при передаче изобра- жений на расстоянии, так как это создает значительную нагрузку на беспро водную сеть. На практике изображения часто сжимаются перед передачей. В ВОЗ 2 существует тип сообщения для сжатых изображений - зепзог тздз/ СотргеязесПта^е, который представлен на рис. 6.23. го52@диуиекопе:~$ гоз2 хпГегГасе зЬои 5еп5ог_т$д5/т5д/Сопрге55ед1паде # ТЬхз пеззаде сопГахлз а солргеззед хладе. зйб-Лздз/Неадег Неас1ег # Неас1ег ГхпезЪалр зЬоиХс! Ье а с ди хз хГхоп Гхяе оГ хладе Ьих1Гхп_хпГегГасе5/Тхле зГалр тп132 зес ихп1:32 папозес зГгхпд Ггапе_хд # Неадег Ггале_хс1 зйоиХб Ье орГхеа! Ггале оГ салега # огхдхл оГ <тале зЬоиЪд Ье орНса! сепгег оГ салеага # +х зКоиГи рохп1: Го ГЬе гхдЬГ хп ГЬе хладе # +у зЬоиХс! рохпГ доип хп {Ье хладе # +? зЬоиХс! рохл! 1пГо Го рХапе оГ ГЬе хладе зГгхпд ГоглаГ # ЗресхГхез ЬЬе ГоглаГ оГ ГНе с1аГа # АссерЬаЫе уаХиез дхГГег Ьу Гйе хладе ГгапзрогГ изес!: # - солргеззес1_хладе_{гап5рог1:: # 0В1С-Р1ХРМТ; СООЕС солргеззес! [СОМРКЕ8$ЕО_Р1ХРМТ] # мЬеге: # - 0Р1С_Р1ХРМТ хз рххе! ГоглаГ оГ ГЬе гаш хладе, х.е. # ЬЬе сопьет оГ зепзоГ-ЛздзДладе/епсоЬхпд ихтЬ # уаЬиез Ггоп хпс1ис1е/5епзог_лзд$/хладе_епсодхпд5.Ь # - СОЭЕС хз опе оГ [оред, рпд, ЬхРР] # - СОМРРЕ55ЕО_Р1ХЕМТ хз оп!у арреп<1е<1 Гог соХог хладез # апс! хз Ы1е рххе! ГогпаГ изес1 Ьу ГКе сопргеззхоп # аХдогхЬЬп. \/а!хд уаХиез Гог дред епсодхпд аге: # [Ьдг8, гдЬ8]. \Уа1х<1 иаХиез Гог рпд епсодхпд аге: # ГЬаг8. гаЬ8, Ьаг16. гаЫб!. Рис. 6.25 ❖ Тип сообщения сжатого изображения 5еп5ог_т!>д!>/Сотрге55еа1таде Определение сообщения сжатого изображения значительно проще по сравнению с необработанным изображением. Помимо заголовка сообще- ния, оно содержит только формат сжатого кодирования изображения Гогта! и массив с данными изображения ДаГа. Форматы кодирования сжатого изо- бражения включают 1РЕС, РМС, ВМР и др. Каждому формату соответствует детальное определение структуры данных, поэтому в определении типа со общения опущено множество ненужной информации.
6.4,4, Драйвер и визуализация трехмерной камеры Существует множество видов трехмерных камер, и для многих из них драй- веры уже интегрированы в экосистему КОЗ 2. Рассмотрим процесс установки драйвера и визуализации на примере трехмерной камеры Кеа13еп8е, изо- браженной на рис. 6.24. Рис. 6.24 ❖ фехмерная камера кеа1$ег1'е Перед установкой пакета драйверов КОЗ 2 для Кеа13еп8е необходимо уста- новить официальный ЗВК Кеа18епзе, Подробные инструкции можно найти на официальном сайте Кеа13еп8е. После завершения установки ЗПК можно приступить к установке пакета драйверов КОЗ 2 для Кеа13еп8е, $ зибо арг спз^аП. гоз-заггу-геаТзепзе?-* После установки выполните следующую команду для запуска узла драй- вера камеры Кеа13еп8е. $ гоз2 1аипсЬ геа1зепзе2_сапега гзДаипсЬ.ру Как выглядит изображение с трехмерной камеры? Запустите КУ12, уста- новите параметр Ыхей Ргаше (Неподвижная система координат) на саше- гаИпк, с помощью кнопки Ас1с1 (Добавить) добавьте элементы отображения Ро1п1:С1оий2 и Ппа^е, задайте названия тем для данных облака точек и изо- бражения соответственно, и вы увидите трехмерное изображение, как по- казано на рис. 6.25.
Рис. 6.25 ❖ Просмотр трехмерных данных облака точек в РУД 6.4.5. Определение сообщений облака точек в К05 2 Какой гип сообщения у данных трехмерного облака точек? Вы можете про- смотреть его, выполнив следующую команду, как показано на рис. 6.26. $ гоз? спГегГасе з!тох» зепьог^здз/тзд/РотпРСЛоисЩ гоз2@диуиеЬоте:~$ гоз2 хпСегСасе зЬом зеп8Ог_тзд5/т8д/РохпСС1оид2 и ТЬхз теззаде Ьо1дз а соИесСхоп оГ М-дхтепзхопа! рохпСз, мЬхсЬ тау № сопСахл аддхСхопа! хпСогтаСхоп зисЬ аз погпаТз, хпСепзхСу, еСс. ТЬе Н рохпС даСа хз зСогед аз а Ьхпагу ЫоЬ, хСз ХауоиС дезсгхЬед Ьу СЬе № сопСепСз о С СЬе "СхеХдз" аггау. В № ТЬе рохпС сТоид даСа тау Ье огдапхгед 2д (‘Стаде-Ике) ог 1с1 (ипогдегед). № РохпС сТоидз огдапхгед аз 2д хтадез тау Ье ргодисед Ьу сатега дерСЬ зепзогз № зисЬ аз зСегео ог Схте-оГ-Т1хдЬС. № Тхте оГ зепзог даСа асдихзхСхоп, апд СЬе соогдхпаСе Ггате Ю (Рог Зд рохпСз). 5Сд_тзд5/Неадег Ьеадег Ьих1Схп_хпСегТасез/Тхте зСатр хпС32 зес ихпС32 папозес зСгхпд Ргате_хд № 20 зСгисСиге оТ СЬе рохпС с!оид. И СЬе сСоид хз ипогдегед, ЬехдЬС хз № 1 апд мхдСЬ хз СЬе СепдсЬ оТ СЬе рохпс сСоид. ихпС32 ЬехдЬС ихпС32 ихдСЬ № ОезсгхЬез СЬе сЬаппеХз апд СЬехг СауоиС хп СЬе Ьхпагу даСа ЫоЬ. РохпСЕхе1д[] ГхеХдз ихпС8 1МТ8 = 1 ихпС8 01МТ8 = 2 ихпС8 1МТ16 = 3 ихпС8 111МТ16 = 4 ихпС8 1МТ32 = 5 ихпС8 М1МТ32 = 6 ихпС8 Н.ОАТ32 = 7 ихпС8 ГЮАТ64 = 8 Рис. 6.26 ❖ Определение типа сообщения для трехмерного облака точек 5епзог_т5д5/т5д/Ро1п1С1оиб2
Ниже приведено описание полей сообщения 8еп8ог_т8§8/т8§/Рот1:С1оис12. О вертикальное разрешение изображения облака точек, то есть количество строк пикселей в изображении. О ичйЛ: горизонтальное разрешение изображения облака точек, то есть количество столбцов пикселей в изображении. О Пе1йь: тип данных для каждой точки. О 18_Ь1$еп<Г1ап: порядок байтов данных. О ро1п1_81ер: шаг в байтах для данных одной точки. О гои ьТер: шаг в байтах для одной строки данных. □ да Та: массив хранения данных облака точек, общий размер в байтах равен тоту .чТер х 1те1§]й. О тьйепье: наличие недействительных точек Трехмерные координаты каждого пикселя в данных облака точек пред- ставлены в виде чисел с плавающей точкой и также содержат данные изо- бражения. поэтому объем данных в одном кадре достаточно большой. При использовании распределенной сети передачи данных в условиях ограни- ченной пропускной способности необходимо учитывать возможность обес- печения стабильной передачи данных или сжатия данных перед их пере- дачей. 6.5. Драйвер и визуализация лазерного дальномера Для получения информации об окружающей среде, помимо камеры, робот может использовать лазерный дальномер. Он предоставляет данные о рас- стоянии до препятствий, контурах окружающих предметов и другие сведе- ния. Дальномер также является распространенным сенсором для построения карт 8ЬАМ и автономной навигации роботов. 6.5.1. Типы лазерных дальномеров Лазерный дальномер - это распространенный сенсор, способный точно из- мерять расстояние до предметов и их форму, Он широко используется в бес- пилотных автомобилях и летательных аппаратах, системах безопасности и наблюдения. Лазерные дальномеры можно классифицировать по содер- жанию получаемых данных. 1. Однолинейный лазер Дальномер с однолинейным лазером использует для измерений один лазер- ный луч, как показано на рис. 6.27. Путем вращения или колебания лазерный
луч направляется в окружающую среду, а затем на основе времени возврата лазерного луча рассчитываются расстояние и угол объектов. Рис. 6.27 ❖ Распространенные дальномеры с однолинейным лазерсм и формат данных Дальномеры с однолинейным лазером имеют простую конструкцию и низ- кую стоимость, что делает их подходящими для случаев, когда важна экономия или нет высоких требований к восприятию окружающей среды, таких как домашние роботы-пылесосы, низкоскоростные автономные транспортные средства, охранные патрули и т. д. Однако из-за наличия только одного ла- зерного луча диапазон сканирования и скорость сбора данных однолучевых дальномеров ограничены. Обычно они могут выполнять сканирование на 360° только в одной плоскости, а объем собираемых данных невелик, что ограни- чивает их способность к высокоточной и сложной оценке окружающей среды. Оп§дпВо1 использует дальномер с однолинейным лазером, в котором ла- зерная головка испускает лазерный луч, а приемная головка принимает от- раженный свет. Затем с помощью геометрических соотношений и времени полета измеряется расстояние до точки выборки. Принцип работы изобра- жен на рис. 6.28. Рис. 6.23 ❖ Принципиальная схема работы дальномера с однолинейным лазером
В дальномере также установлен мотор, который равномерно вращает из- лучающую и приемную головки. В процессе вращения происходит непрерыв- ное сканирование, что позволяет получить данные о расстоянии до множест- ва точек выборки в диапазоне 360°, тем самым обеспечивая информацию о глубине препятствий в плоскости, где расположен дальномер. 2. Многолинейный лазер Дальномер с многолинейным лазером использует для измерений несколько лазерных лучей, как показано на рис. 6.29. Каждый луч может сканировать под разными углами, что позволяет за короткое время получить более пол- ную информацию об окружающей среде. Рис. 6.29 ❖ Распространенные дальномеры с многолинейным лазером и фермат данных Дальномер с многолинейным лазером может одновременно сканировать в нескольких плоскостях, охватывая более широкую область. Это позволяет в значительной степени воссоздавать трехмерные модели сложного окруже- ния. Он широко применяется в таких областях, как беспилотные автомобили и летательные аппараты, а также интеллектуальные транспортные системы, где требуются высокая точность и надежность восприятия окружающей сре- ды. По сравнению с однолинейным дальномером, многолинейный способен собирать больше данных об окружающей среде за более короткое время, что повышает его адаптивность к быстро меняющимся условиям. Однако из-за необходимости в большем количестве излучателей и приемников его стои- мость и сложность конструкции сравнительно выше.
6,5,2. Определение сообщения дальномера в Р05 2 Для дальномера с однолинейным лазером в пакете 8еп8ог_т8§8 КОЗ 2 опре- делено специальное сообщение ЬазегЗсап, предназначенное для хранения данных дальномера. Подробное определение представлено на рис. 6.30. □ ап§1е_тш: начальный угол диапазона обнаружения. О ап$1е_тах: конечный угол диапазона обнаружения, вместе с ап§1е_тт образует диапазон обнаружения лазерного дальномера. □ ап§1е_тсгетеп1: угловой шаг между соседними кадрами данных. О 11те_тсгетеп1: временной шаг .между соседними кадрами данных, используется для компенсации при относительном движении сенсора. □ 8сап_Нте: время, необходимое для сбора одного кадра данных. О гап§е тт: минимальный порог обнаружения глубины. О газетах: максимальный порог обнаружения глубины. □ гап§е&: массив для хранения данных глубины одного кадра. гозгфдцуцеЬоте: - гоз2@диуиеЬоте:-$ гоз2 хпкегкасе $Ьон зеп$ог_пздз/р)5д/1азег5сап # 5хпд1е зсап кгон а рХапаг Хазег гапде-кхпдег № # 1к уои Ьауе апокЬег гапдхпд демхее НкЬ дхккегепк ЬеЬаихог (е.д. а зопаг # аггау), рХеазе кХпд ог сгеаке а йхккегепк теззаде, зхпее аррХхсакхопз # ИХХ паке кахгХу Хазег-зресхкхс аззитркхопз аЬоик кНз (1ака зксПчздз/Неадег Ьеадег # кхтезкатр хп кНе Ьеадег хз кЬе асдихзхкхоп кхпе ок ЬитЛкт.п_т.пкегкасез/Т1те зкапр хпк32 зес ихпк32 папозес зкгкпд кгагпе_1<1 # кЬе кхгзк гау хп кЬе зсап. и # хп кгате кгапе_х<1, апдХез аге пеазигес! агоипс! # кЬе розхкхуе 2 аххз (соцпкегсХоскихзе, хк 7. хз ир) # НкЬ хего апдХе Ьехпд когыаг<1 аХопд кЬе х аххз к1оак32 апдХе_пхп кХоак32 апд!е_тах к1оак32 апдХе_хпсгепепк # зкагк апдХе ок кЬе зсап [гас1] # епд апдХе ок кЬе зсап [га<1] # апдиХаг сИзкапсе Ьекиееп яеазигепепкз [гас!] Г1оак32 кхпе_хпсгетепк к!оак32 зсап_кхте # кхте Ьекнееп пеазигепепкз [зесопдз] - хк уоиг зсаппег # хз тоухпд, кЬхз НИ Ье цзес1 хп хпкегроХакхпд розхкхоп # ок Зд рохпкз # кхгпе Ьекнееп зсапз [зесопс!$] к!оак32 гапде_шхп к!оак32 гапде_тах # рн-пхиип гапде уаХие [п] # шаххпит гапде узкие [т] к!оак32[] гапдез # гапде с1ака [п] # (Моке: уаХиез < гапде пхп ог > гапде пах зЬоиХд Ье Нзсагдед) Рис. 6.3г Определение типа сообщения 5ел5ог_т5дз/^а5ег5сап Это базовые настройки дальномера, которые в процессе работы не пре- терпевают значительных изменений. Реальная информация о глубине со- храняется в массиве гапдез, например если в одном обороте 360 точек, то информация о глубине всех этих точек хранится в этом массиве, а пользова- тели могут непосредственно считывать эти данные.
В ВОЗ 2 существует множество стандартных определений для таких сен- соров, как камеры и лазерные дальномеры. Это важный метод обеспечения повторного использования программного обеспечения в КОЗ 2. Независимо ог того, какой сенсор какого производителя вы используете, на выходе по лучается единообразная структура данных, а алгоритмы верхнего уровня не нуждаются в учете влияния оборудования нижнего уровня. Для дальномера с мнсголинейным лазером в 408 2 используются те же сообще- ния, что и для трехмерных камер, а именно 5еп5ог_т5д5/твд/Ро1пСС1оис12, описанные в разделе 6.4.5. 6.5.3. Драйверы лазерного дальномера и визуализация данных На роботе Оп§тВо1 установлен дальномер с однолинейным лазером, под ходящий для использования в мобильных роботах в помещении. Он спосо- бен обнаруживать информацию об объектах в радиусе 360° с частотой 6 Гц, максимальная дальность обнаружения составляет 12 м. Для этого лазерного дальномера в пакете драйверов КОЗ 2 предусмотрена обширная конфигура- ция параметров, позволяющая настроить номер порта, скорость передачи данных, название системы координат, дальность измерения и другие пара- метры в соответствии с реальными потребностями. # Конфигурация параметров узла КС5 2. гоз_рагапесегв: # Имя последовательного порта, используемого для связи с дальномером. вегСа1рогС_пале: ' /с1еу/С6у115В6" # Скорость передачи последовательного порта, используемая для установки скорости связи # с дальномером. вег1а1рог1_Ьаи<1: 115200 # Ю кадра данных дальномера, используемый для обозначения принадлежности данных к системе # координат в В05 2. бгапеДД: "1авегДтапе" # Использование режима фиксиоованного разрешения, если Га1ье, то возможно автоматическое # регулирование по конфи-урации или окружению. гево1и!1.оп_Г1хе<1: Га1зе # Автоматическое переподключение, пои разрыве связи с дальномером выполняется попытка # переподключения. ааСогесоппесС: Сгие # Инвертирование данных (например, углов или расстояний), обычно используется для исправления # направления установки оборудования. ге\<ег5топ: Шве
# Инвертирование направления сканирования, влияет на направленность данных сканирования, тпуегбеб: ГаТзе # Минимальный угол сканирования, единица измерения - градус. апд!е_т1п: -180.0 # Максимальный угол сканирования, единица измерения градус. апд!е_тах: 180.0 # Минимальная измеряемая дистанция, единица измерения - обычно м. гапде_т1п: 0.001 # Максимальная измеряемая дистанция, единица измерения обычно м. гапде_тах: 64.0 # Скорость сканирования, время, необходимое для одного оборота. атл_зрееб: 6.6 з Частота дискретизации, влияющая на частоту публикации данных. 5апр1Лпу_га1:е: 3 # Разрешение изменения углового смещения, используемое для калибровки начального угла # сканирования. апд!е_сГ1гзе1:_с1таг,де_Пад: ГаТзе # Угловое смещение, используемое для корректировки начального угла сканирования. апд1е_сГ1зет: 0.0 # Игнорируемая строка массива, обычно используется для указания определенных точек или # областей, которые нужно исключить. 1дпоге_эггау_з1:ггпд: '" # Включение скользящего риль’рэ, используемого для сглаживания данных. Гт.иег_з1т.с1гпд_епаЫ.е: бгие # Порог скачка скользящего фильтра, используемый для обнаружения и исключения аномальных » значений. Ш1:ег_51т.с11пд_дипр_1:1тге5Но1б: 50 # Включение максимального диапазона скользящего фильтра. ГгИег зИсИпд пах гапде Над: ГаТзе # Значение максимального диапазона скользящего фильтра. ЯЛбег_з1’.с11пд_пах_гапде: 8000 # Размер скользящего фильтра. Ш1:бг_511с1гпд_и1пс101>1: 3 # Включение ограничения расстояния хвостового фильтра. Г1иег_Га!1_с115Гапсе_1тттТ_Нгд: РаТзе # Значение ограничения расстояния хвостового фильтра. Щ1ег_бат.1._(11.5бапсО^п1Л_7а1.ие: 8000 # Уровень хвостового Фильтра, влияющий на силу и результат фильтрации. Ш1:ег_ба11._1.е7е1.: 8
# Количество соседей хвостового фильтра, используемое при учете числа соседних точек # в фильтрации. ШСег_Сат.1._пет.дпЬог5: 0 После удаленного входа на Оп§1пВоГ можно использовать лазерный даль- номер для получения информации, запустив узел драйвера с помощью сле- дующей команды. $ гоь2 ХаипсЬ огсдгпЬоГ_Ь| епдир огсдспЬоГ.ХаипсЬ.ру и$е_1Л(1аг:=Ггие Если необходимо получить больше информации о публикациях лазерного дальномера, используйте следующую команду, как показано на рис. 6.31. $ го$2 Горте есЬо /зсап го52@диуиеЬо"1е: -$ го$2 торте есЬ-- /всап Ьеабег: ьТатр: зес: 1723531046 паговес: 733666186 Ггате_1б: 1а5ег_Ипк апд!е_т1п: -3.1415927410125732 апд!е_тах: 3.1415927410125732 апд'ХеД.псгепрпГ: 0.01259155385196209 Г1те_1псгетеп1: 0.0003285326820332557 5сап_Гтте: 3.16393780708312988 гапде_т.п: 0.0010000000474974513 гапде_пах: 64.0 гапдеь: - 0 0 - 0.0 - 2.440999984741211 2.427999973297119 2.4170000553131104 2 4089999198913574 2.4189999103546143 - 0.0 - 1.5701-1000524520874 Рис. 631 ❖ Вывод сообщений темы, публикующей данные дальномера Данные лазера в терминале не наглядны и трудно читаются, поэтому их можно отобразить в графическом интерфейсе с помощью КАИг Измените параметр Е1хей Егате (Неподвижная система координат) на (азег, нажмите кнопку Айд (Добавить), добавьте модуль отображения ЬазегЗсап и настройте модуль для подписки на тему /зсап Появится визуализация данных с даль номера, как показано на рис. 6.32.
Рис. 5.32 ❖ Визуализация данных дальномера в КУ12 6.6. Драйвер 1МИ и визуализация данных Модуль 1МС в роботе Оп§тВо1 интегрирован в контроллер движения, ко торый получает данные 1МЫ в реальном времени через последовательный порт и передает их в прикладной процессор через коммуникационный про- токол. В драйвере шасси данные дополнительно инкапсулируются в тему 1МИ в ВОН 2. Данные 1МС, содержащие ускорение и угловую скорость, не слишком на глядны, поэтому с помощью инструментов визуализации в ВОН 2 эти данные можно сделать более понятными. 6.6.1. Определение сообщений IМ11 в К0$ 2 Сначала ознакомьтесь с определением сообщений 1МЫ в КОН 2, которое мож но запросить с помощью следующей команды, результат выполнения по- казан на рис. 6.33. $ го5? тлСегГасе зепьощмздз/пзд/Ши
ГП го52®>диуиеЪоте: ~ гоз2@диуиеНоте:гоя2 ГпГегГасе зЬои 5еп5ог_тзд5/тзд/1пи № ТМ.5 <5 а теззаде Го Ьо1с1 йаГа Ггот ап 1М0 (1пегГга1 МеазигетепГ КпхГ) № № АссеХегаГхопз зЬоиХд Ье хп п/зЛ2 (по! хп д'5), ап<1 гоГаГхопа! уеХосХГу зЬоиХд Ье хп гад/зес V И 1Г ГЬе соуагхапсе оГ ГЬе пеазигетепГ хз кпоип, хГ зЬоиХс! Ье ГхХХес! хп (хГ аХХ уои кпон хз ГЬе № уагхапсе оГ еасЬ теазигетепГ, е.д. Ггот ГЬе даГазЬееГ, дизГ риГ ГЬозе аХопд ГЬе дхадопаХ) № А соуагхапсе таГгхх оГ аХХ гегоз ихХХ Ье ХпГегргеГед аз "соуагхапсе ипкпоип", апд Го иве ГЬе Й даГа а соуагхапсе мхХХ Ьауе Го Ье аззитес! ог доГГеп Ггот гопе оГЬег зоигсе Й № 1Г уои Ьауе по езГхтаГе Гог опе оГ ГЬе даГа еХетепГз (е.д. уоиг 1М0 доезп'Г ргодисе ап И огХепГаГхоп езГхтаГе), рХеазе зеГ еХетепГ б оГ ГЬе аззосхаГед соуагхапсе таГгхх Го -1 И 1Г уои аге ХпГегргеГхпд ГЬхз теззаде, рХеазе сЬеск Гог а уаХие оГ -1 хп ГЬе ГггзГ еХетепГ оГ еасЬ И соуагхапсе таГгхх, апс! йхзгедагд ГЬе аззосхаГе^ езГхтаГе. зГд.тздз/Неабег Ьеадег Ьих1Гхп_хпГегГасез/Т1те зГатр хпГ32 вес ихпГ32 папозес зГгхпд Ггате_1<3 деотеГгу_тздз/0иаЬегп1оп огхепГаГхоп Г1оаГ64 х 6 ПоаГ64 у б ПоаГ64 г 6 Г1оаГ64 и 1 Г1оаГ64[9] огхепГаГхоп_соуагхапсе # Кон та^ог аЬоиГ х, у, г ахез деотеГгу_тздз/УесГогЗ апди1аг_уе!осхГу ПоаГб4 х Г1оаГ64 у ПоаГ64 2 Рис. 6.33 ❖ Определение типа сообщения 5епЕог_пг5у5/|Т15д/1ти В определении сообщения 1МИ содержатся три основных компонента: ориентация в виде кватерниона, вектор угловой скорости и вектор линейно го ускорения. Каждая часть сопровождается параметрами ковариационной матрицы, что облегчает фильтрацию данных. 6.6.2. Драйвер и визуализация 1М11 Как можно визуализировать ориентацию и скорость 1МП? В КХЧх для этого предусмотрен соответствующий .модуль, который позволяет легко наблюдать изменения данных 1МЕ. После удаленного подключения к ОпдгпВоГ через 88Н выполните в тер- минале следующую команду, чтобы запустить шасси робота и узел 1МП, как показано на рис. 6.34. $ го;2 1аипсЬ ог1дгпйоГ_Ьг1пдир огГдгпЬоШаипсЬ.ру и5е_1т:=Ггие На компьютере, находящемся в той же сети, выполните следующую коман- ду для установки модуля 1МЪГ для КУ12. $ зибо арГ гпзщи гог-даггу-гуы-Щи-рсидгп
гооХ@иЬипХиго&2 ХаипсЬ ог1дхпЬоХ_Ьггпдир огтдХпЬоХ.ХаипсЬ.ру и5е_Хти:=Хгие [ХМЕО] [ХаипсЬ]: АХХ Ход ГйХез сап Ье Тоипй ЬеХон /гооХ/.го5/Ход/2024-08-13-14-25-50-351513-иЬипХи-6149 [ХЫЕО] [ХаипсЬ]: ОеГаиХХ Ходдтпд уегЬозгХу хз 5еХ Хо ХЫЕО [ХЫЕО] [ог1д1пЬоХ_Ьа5е-1]: ргосезз зХагХес! нхХЬ ртб [6151] [ХИРО] [8ХаХ1с_Хгап8Гогт_риЬХ15Ьег-2]: ргосезз зХагХей иХХЬ рХд [6153] [1МГО] [з1аХ1с_ХгапзГопп_риЬХХ5Ьег-3]: ргосезз гХагХес! кХХЬ ртд [6155] [ог1дХпЬоХ_Ьазе-1] ЬоадХпд рагапеХегз: [оггдХпЬоХ_Ьа$е-1] [огХдХпЬоХ_Ьаве-1] [ог1дХпЬоХ_Ьа5е-1] [оггдХпЬоХ_Ьазе-1] [оггдХпЬоХ_Ьа5е-1] [5ХаХХс_Хгап5рогт_риЫХ5Ьег-2] - рогХ пате: ХХу53 - соггесХ ХасХог ух: 0.8980 - соггесХ ГасХог уХЬ: 0.8749 - аиХо зХор оп: 0 - иве хти: 1 [ХМЕО] [1723530350.793000793] [5ХаХХс_Хгап5Хогт_риЬХХ5Ьег_и9у126ХЬХ5Кк19М1]: БрХппХпд ипХХ X ктХХед риЬНзЫпд ХгапзЕогт Хгот '/ЬазеЕооХргтпХ’ Хо '/Ьазе_1Хпк' [зХаХгС-ХгапзГогп-риЬХХзЬег-З] [ХМЕО] [1723530350.793448430] [5ХаЫс_ХгвпзРогг1_риЬХг5Ьег_4ЫХрпМКадед1дИХ]: 5р1лп1пд ипХх X кХХХед риЬХхзЫпд ХгапзХогт Хгот '/Ьазе_ХХпк‘ Хо ' /хти_Х1пк' [ог1дХпЬоХ_Ьазе-1] [ХИРО] [1723530350.804431487] [ог1д1пЬоХ_Ьазе]: оггдХпЬоХ зегХаХ рогХ орепед [ог1дХпЬоХ_Ьазе-1] [ХИРО] [1723530351.316538811] [ог!дХпЬоХ_Ьазе]: ХМХ1 саХХЬгаХХоп ок. [огХд!пЬоХ_Ьазе-1] [ХИРО] [1723530351.817221609] [ог1д1пЬоХ_Ьазе]: ОгХдХпВоХ 5ХагХ, еп]оу IX. Рис. 6.34 ❖ Запуск шасси Опд1пВоГ и узла 1М11 После завершения установки запустите КУ12, добавьте модуль для ото- бражения 1МП и установите 1ши в качестве имени темы для подписки, как показано на рис. 6.55. Теперь информация 1МП будет отображаться в графи- ческом представлении. При движении робота координатные оси в К\'12 также будут следовать за движением. КУ1г* Е|1е Рапек Не1р [Р-УпЬегасЕ ^МоуеСатега РосшСатега аМеашге X 20 Р«ке Е5ЬтаЫ Х20Соа1Р<ке О О|5р(ау5 • © С(оЬа1 ОрОопз Е1хе<1 Егате Васкдгоипд Со1ог Егате ЯаСе > / С1оЬа( ЗСаШз. Ок > « Сг14 ЬазегЗсап Ьа5в_1тк 48,48. 48 1ти •/ ЗСаНк Ок Торк Г|хед_Ггате_опепс Вох ргорегС1е$ ЕпаЫе Ьох Вох союг Вох а(рНа ► Ахе$ ргорегйе5 ► Ассе(егаСюп ргорег. Вох (епдСЬ (х), <л теСег5 9 РчЫ|$ь Рыт А44 Ке5е1 ЬеЕЕ-СИск: ЧоСаЬе М14<Ие-С11ск: Моуе Х/У К1дЫ-с11ск/Мои5е ШЬее1: 2оот 5ЫГ1 Моге орНопх Рис. 6.35 ❖ Визуализаиия данных 1М11
6.7. Резюме В этой главе мы успешно создали протокол коммуникации между контрол- лером движения и прикладным процессором, обеспечив эффективную и ста- бильную передачу данных между ними. В процессе построения системы управления мы применили основные концепции КОЗ 2 для систематической упаковки данных и реализовали передачу управляющих команд и обратную связь о состоянии робота через механизмы тем и служб КОЗ 2. Кроме того, мы реализовали управление движением робота и настроили драйверы для раз- личных распространенных сенсоров с визуализацией, используя функцио- нальные пакеты, предоставляемые КОЗ 2, что позволило роботу не только двигаться, но и «видеть»! На этом заканчивается вторая часть книги, в которой мы вместе построили робота Оп§п1Во1. В третьей части мы продолжим разработку, чтобы реали- зовать больше интеллектуальных функций для робота.
ЧАСТЬ III Применение Й05 2 в робототехнике
Глава Визуальные приложения ЙО5 2: учим роботов понимать мир Человек получает более 90 % информации через зрение. Глаза, являясь сен- сорами большого объема визуальной информации, передают данные в мозг, который выступает в роли «процессора», обрабатывающего эту информацию. Лишь после обработки мы можем понять окружающую обстановку и сформи- ровать собственное мировоззрение. Как же научить робота так же понимать внешнюю среду? Первая мысль - это оснастить робота «глазами», чтобы он мог воспринимать мир как человек. Однако выполнить этот процесс для робота гораздо сложнее. В этой главе мы рассмотрим технологии обработки визуальной информации в роботах. В недалеком будущем роботы, возможно, станут неотъемлемой частью каждого дома и смогут выполнять сложные домашние дела, как показано на рис. 7.1. Например, чтобы выполнить задачу мытья посуды, робот должен сначала с помощью зрения определить местоположение тарелки, затем по пять, как ее захватить, поместить в посудомоечную машину и закрыть двер- цу. Помимо мытья посуды, этот робот может складывать одежду, расставлять предметы, наливать вино и ухаживать за цветами - все эти задачи требуют функции машинного зрения. Рис. 7.1 ❖ Домашний сервисный робот
7.1. Введение в принципы машинного зрения Машинное зрение - это использование компьютеров для имитации зритель- ных функций человека. Однако это не просто копирование человеческого глаза, а, что более важно, способность извлекать информацию из изображе- ний объектов, обрабатывать и понимать ее подобно человеческому мозгу, что в конечном итоге используется в таких сценариях, как обнаружение, контроль, и многих других. Получение информации из изображений относительно просто, но научить робота различать разнообразные объекты на изображении - задача не из легких. Машинное зрение предназначено для решения этой серии сложных задач, оно стало междисциплинарной областью, охватывающей искусствен- ный интеллект, нейробиологию, физику, компьютерные науки, обработку изображений, распознавание образов и др., как показано на рис. 7.2. На се- годняшний день в этих областях работает большое количество разработчиков и организаций, накоплены разнообразные технологии, но остается и мно- жество нерешенных проблем. Поэтому исследования в области машинного зрения будут продолжаться еше очень долго. Рис. 7.2 ❖ Пример применения машинного зрения в промышленности и транспорте Существует много ключевых технологий, связанных с машинным зрением. Например, сбор и обработка сигналов визуальных изображений. Это в основ- ном процесс сбора внешних световых сигналов с помощью сенсоров, которые в конечном итоге преобразуются в сигналы цифровых схем для дальнейшей обработки После получения изображения более важной задачей является распознавание объектов на изображении, определение их местоположения или обнаружение изменений в объектах. Для этого используются технологии распознавания образов или машинного обучения, что является основным направлением современных исследований в области машинного зрения. В отличие от двух глаз человека, сенсоры, используемые машинами для по- лучения изображений, более разнообразны: это .может быть одна камера, две камеры, три, четыре и даже больше камер. Они способны не только фикси- ровать цветовую информацию, но и получать данные о глубине или энергии
(например, инфракрасные камеры). Человеческое зрение хорошо справляет- ся с качественной интерпретацией сложных, неструктурированных сцен, в то время как машинное зрение, обладая такими преимуществами, как скорость, точность и воспроизводимость, идеально подходит для количественного из- мерения структурированных сцен. Однако это также может создать опреде- ленную вычислительную нагрузку при постобработке. В промышленности системы машинного зрения уже широко используются для автоматической инспекции, обработки деталей, автоматизации сборки и контроля производственных процессов. С быстрым развитием и широким применением роботов машинное зрение постепенно находит применение в сельском хозяйстве, беспилотных грузоперевозках, сфере услуг, беспилот- ных транспортных средствах и других областях. Роботы с машинным зрени ем активно используются на фермах, в логистике, на складах, в транспорте, больницах и других разнообразных сценариях. Как правило, типичную систему машинного зрения можно разделить на три части: сбор изображений, анализ изображений и управление выводом (см. рис. 7.3). Источник Объектив Сенсор Блок света изображения управления Чип обработки изображений ПО для обработки изображений Освещение Камера (20/30) Захват изображения Усиление детектируемых признаков источником света Захват признаков объективом камеры Преобразование оптического изображения в цифровое Процессор обработки изображений Анализ изображений I1ИI • Извлечение характеристик изображения • Анализ характеристик изображения • Калибровка данных изображения Выход управления • Управление вводом/выводом • Управление движением • Визуализация данных Рис. 7.3 ❖ Система машинного зрения 1. Сбор изображений Сбор изображений производит выборку исходного оптического сигнала и яв- ляется сенсорной частью всей системы зрения, в центре которой находятся камера и сопутствующие аксессуары. Источник света используется для ос- вещения объекта, подлежащего обследованию, и эффективного выделения его характеристик с помощью камеры. Источник света является важным фактором, влияющим на качество изображения в системе машинного зре- ния. Хороший источник света и освещение в целом существенно влияют на
качество работы машинного зрения. В настоящее время источники света для машинного зрения уже вышли за пределы видимого спектра человеческого глаза, охватывая диапазоны инфракрасного (1К), видимого, ультрафиоле- тового (ЪГТ) и даже рентгеновского излучений, что позволяет осуществлять более детальный и широкий анализ, удовлетворяя особые потребности. Камера считается «глазом» системы машинного зрения и выполняет важ ную задачу сбора информации об изображении. Ядром камеры является сенсор, который бывает двух типов: ССБ и СМО$. Принцип их работы за- ключается в преобразовании оптического сигнала, полученного объективом камеры, в цифровой сигнал Выбор подходящей камеры является важным этапом в проектировании системы машинного зрения, так как он не только напрямую определяет качество и скорость сбора изображений, но и связан с режимом работы всей системы. 2. Анализ изображений После получения цифровых изображений с камеры система обработки изо- бражений с помощью различных программных алгоритмов выполняет из- влечение признаков изображения, анализ признаков и калибровку данных, а затем делает выводы. Это наиболее концентрированная часть исследований различных алгоритмов зрения, от традиционных алгоритмов распознавания образов до современных популярных методов машинного обучения. Все они направлены на то, чтобы помочь машине лучше понимать окружающую среду. Для человека распознавание такого объекта, как яблоко, является триви- альной задачей, однако для робота это требует извлечения характеристик различных типов, цветов и форм яблок, затем обучения для создания «мо- дели» яблока и последующего сопоставления этой модели с изображениями в реальном времени, чтобы определить, является ли объект яблоком. 3. Управление выводом В роботизированной системе результаты визуального распознавания в ко- нечном итоге связываются с определенными действиями робота, что состав- ляет третью часть - управление выводом, включающую интерфейсы ввода/ вывода, управление движением, визуализацию ит. д После завершения ана лиза изображения система передает результаты в систему управления робо- том, которая затем осуществляет управление движением. Например, когда визуальная система распознает положение объекта захвата, выполняется захват и размещение через интерфейс вьода/выьода, при этом результаты распознавания и состояние движения могут отображаться на верхнем уровне системы для удобства мониторинга. Что касается машинного зрения, то в описанных трех частях анализ изо- бражений занимает центральное место, и для его реализации используется множество методов, различное программное обеспечение и фреймворки, такие как ОрепСУ, ТОЬО и др. И это является основной частью последующей разработки.
7.2. Калибровка камеры в КО5 2 В главе 6 мы научились получать изображения с помощью драйвера камеры в КОЗ 2, что является первым шагом в обработке изображений - сбор изо- бражений. Но насколько надежны эти данные и соответствует ли их качество нашим требованиям? Здесь необходимо применить дополнительные методы для оптимизации собранных данных, например калибровку камеры, о кото- рой пойдет речь в этом разделе. Являясь точным прибором, камера предъявляет высокие требования к оп- тическим компонентам, а из-за некоторых внутренних и внешних факторов изображения объектов, создаваемые камерой, часто искажаются. Чтобы из- бежать ошибок, вызванных источником данных, необходимо выполнить калибровку параметров камеры. Официальный пакет КОЗ 2 предоставляет функционал для калибровки монокулярных и стереокамер - сашега саПЬга- Ноп. 7.2.1. Установка пакета для калибровки камеры Сначала установите пакет для калибровки камеры сашсгасаНЬгаДоп с по мощью следующей команды, процесс установки показан на рис. 7.4. $ зибо арт гпзГаИ го5-]аг7у-сапега-саИЬга’:гоп Рис. 7.4 ❖ Установка пакета сатега_са1|ЬгаТ:оп Для калибровки потребуется мишень с шахматной доской, изображенная на рис. 7.5, которую можно найти в исходном коде, прилагаемом к книге
(1еагтп&_су/с1ос8/с11ескегЬоагс1.рсИ). Для калибровки распечатайте эту ми шень и наклейте на картон. © На практике, чтобы повысить качество калибровки, необходимо использовать ми- шень с более высокой точностью исполнения Здесь мы используем распечатанный вариант только для демонстрации функционала. 7.2.2. Запуск узла калибровки камеры После подготовки начнем калибровку камеры. Сначала выполните следую щую команду для запуска И8В-камеры. $ г 05? ТаипсН изЬ_сап сапега.ТаипсЬ.ру Измените параметры в соответствии с используемой камерой и размером шахматной мишени, после чего выполните команду для запуска программы калибровки. $ ГО52 гип сапега_саПЬга1:1сп сапегасаПЬгаСог --згге 8x6 --здиаге Э.02И --гоз-агдз -г спаде:-сапе"а/гпаде_гаи -р сатега :=/с1е€аи1Л_саг1 Программа калибровки сатегаса11Ьга1ог требует ввода следующих пара- метров: □ з1ге: количество внутренних углов шахматной мишени для калибров- ки, В нашем случае используется доска с 6 рядами, в каждом из которых 8 внутренних углов; О зпиаге: длина стороны каждого квадрата шахматной мишени, единица измерения - метры; □ ппа^е: установка темы изображения, публикуемого камерой; О сатега: имя камеры, здесь используется стандартное имя изЬ сат - йеЕаиД сат.
7.2.3. Процесс калибровки камеры После запуска программы калибровки поместите мишень для калибровки в поле зрения камеры - появится окно, изображенное на рис, 7.6. Рис, 7.6 ❖ Интерфейс программы калибровки камеры До завершения калибровки все кнопки справа будут серыми и недоступ- ными для нажатия. Для повышения точности калибровки старайтесь по- казать мишень во всех областях поля зрения камеры, как представлено на рис, 7.7. Индикатор прогресса в правом верхнем углу интерфейса будет по- казывать ход калибровки. О X: горизонтальное перемещение мишени в поле зрения камеры. О V: вертикальное перемещение мишени в поле зрения камеры. О 512е: перемещение мишени вперед и назад в поле зрения камеры. О 8кеш: наклонное вращение мишени в поле зрения камеры. Продолжайте перемещать мишень в поле зрения камеры, пока кнопка САЫВКАТЕ (КАЛИБРОВКА) не изменит цвет, как показано на рис. 7.8. Это указывает на завершение сбора параметров калибровки. Нажмите кнопку САЫВКАТЕ, чтобы программа начала автоматически вычислять параметры калибровки. Этот процесс требует некоторого времени, и интерфейс может стать серым и не оеа- гировать на ваши действия. Ни в коем случае не закрывайте окно программы калиб- ровки.
Рис. 7.7 ❖ Процесс калибровки камеры Рис. 7.8 ❖ Сбор данных калибровки завершен
После завершения вычисления параметров интерфейс вернется в нор- мальное состояние, как показано на рис. 7.9, а в терминале отобразятся ре- зультаты калибровки. ГП го52фдиуиеЬоте: ~ СД = -ах **** СаНЬгаМпд **** топо р1пНо1е саНЬгаИоп... О = [0.13253276543829817, -0.19779337134923225, 0.004649580943336633, -0.002919483913585071, 0.0] К = [625.3352879487251, 0.0, 317.6752609244677, 0.0, 624.8248401453104, 251.09351130531206, 0.0, 0.0, 1.0] й = [1.9, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] Р = [640.0031127929688, 0.0, 315.55411273779646, 0.0, 0.0, 638.8068237304688, 252.44464320203588, 0.0, 0.0, 0.0, 1.0, 0.6 ] Моле # о5Т уегзхоп 5.0 рагапе^егз [ттаде] нгсИК 640 бетдЫ 480 [паггои_51егео] сатега та^гтх 625.335288 0.000000 317.675261 0.000000 624.824840 251.093511 0.000000 0.000000 1.000000 ЛБйгйол 0.132533 -0.197793 0.004650 -0.002919 0.000000 гесНПсаИол 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 Рис. 7.9 ❖ Результаты калибровки в терминале После генерации данных калибровки вернитесь в окно калибровки, как по- казано на рис. 7.10. Цвет кнопок 8АУЕ (СОХРАНИТЬ) и СОММ1Т (ЗАПИСАТЬ) изменится. Й15р1ау _ □ х < > « * а а а <3 а 5 » Сатега 1уре: 0: р!пНо!е О 1: ПхЬеуе (0/1) зса1е (010/100) (х= 10 у=438) - Р:0 <3:0 В:0 Рис. 7.10 ❖ Сохранение и запись данных после генерации калибровочных данных
Нажмите кнопку 8АУЕ, чтобы сохранить параметры калибровки в папку по умолчанию, как показано на рис. 7.11. Путь к файлу отобразится в терминале. рго]ес!Лоп 640.003113 0.000000 315.554113 0.000000 0.000000 638.806824 252.444643 0.000000 0.000000 0.000000 1 000000 0.000000 ('Нго1е саНЬгаМол да!а '/Ъяр/саНЬгаНопда^аЛаг .д?') Рис. 7.11 ❖ Путь сохранения параметров калибровки Нажмите С0ММ1Т, чтобы записать данные и выйти из программы. От- кройте папку Дтр, там будет находиться сжатый файл са11Ьга1юп(1а1а,1:аг.§2 с результатами калибровки. После распаковки этого файла вы найдете файл с результатами калибровки под названием озГ.уат!, как показано на рис. 7.12. Скопируйте этот файл и переименуйте его для использования, Конфигурационный файл, сгенерированный при калибровке камеры, име- ет формат ,уат1 и должен быть загружен при запуске камеры. Существует несколько способов загрузки, вы можете выбрать подходящий в зависимости от ситуации.
Метод 1. Размещение файла калибровки в пути по умолчанию При запуске узла драйвера камеры п^Ьсат файл калибровки будет автома- тически загружаться из пути ~/.гоз/сатега шГо/. Поэтому вы можете назвать конфигурационный файл именем камеры и поместить его в эту папку, как показано на рис. 7.13. Рис. 7.13 ❖ Расположение файлов калибровки камеры по умолчанию ЛК Папка ~/.гоз/ является скрытой и по умолчанию не отображается. В операционной системе 11ЬипЩ ее можно показать с помошью сочетания клавиш ОН+Н. После копирования конфигурационного файла в эту папку необходимо не только изменить имя файла, но и открыть его, чтобы убедиться в правиль- ности имени камеры. В данном случае используется имя камеры беГапк сат, а параметры калибровки в файле следующие: теаде_1ЛсН1: 640 гг.аде_Г1егдЫ: 480 сапега_папе: с1е<-аии_сап сапегадпаСггх: гоиз: 3 со 1г: 3 Сага: [625.33529, 0. , 317.67526, 0. , 624.82484, 251.09351, 0. , 0. , 1. ] <Из1:ог1:1оп_пойе'1: р1ипР_ЬоЬ (ЦзбогиоП-СоеНЧсгеп^: гол5: 1 со15: 5 йаба: [0.132533, -0.197793, 0.004650, -0.002919, 0.900000] гестЛН.са-ПопдпаГггх: гои5: 3 со15: 3 баба: [1., 0., 0., 0., 1., 0., 0., 0., 1.] рго]есг1оп_Р1атггх: гои5: 3 со!5: 4 баса: [640.00311, 0. , 315.55411, 0. ,
0. , 638.80682, 252.44464, 0. , 0. , 0. , 1. , 0. ] После закрытия узла драйвера камеры изЬ сат и его повторного запуска вы увидите журнал загрузки файла калибровки, как показано на рис. 7.14. Рис. 7.14 ❖ Автоматическая загрузка файла параметров калибровки при запуске драйвера камеры Метод 2. Ручная установка пути загрузки при запуске узла драйвера камеры Узел драйвера камеры нзЪ сат загружает калибровочный файл с исполь- зованием параметров, поэтому при запуске этого узла можно указать путь к калибровочному файлу в самой команде. Например, если калибровочный файл находится в папке по умолчанию, его можно загрузить при запуске камеры с помощью следующей ко .манды: $ гоз2 гип изЬсап изЬ_сап_пос!е_ехе --гоз-агдз -р сагега_т.гтГо_иг1 =Н1е:///Ьспе/диуие1топе/.го5/ сапгга_1п Еэ/с1еГэ Лг_сап. уагй Метод 3. Загрузка через файл параметров Узел изЬ сат имеет множество параметров для настройки. Эти параметры можно поместить в файл параметров и загрузить все сразу при запуске узла, включая путь к калибровочному файлу. Откройте папку сопГщ в пакете функ- ций изЬ сапт, где уже есть пример файла параметров рагап18_1.уат1. I** гоь__рагапеСегз. ^т^ес_с1е7гсе: "/беу/ссбеоО" ГггпегаСе: 30.0 1с_пеС1тс(1: "пгар' 1гаие_1с1: "сатега" ртхе1_Есппа1:: "щред2гдЬ" # зее изЬ-Сэт/зирроггеОопчаСз 1ог ИзГ о! зиррогТес! богпаСз аV_сIеV^се_Гогра^:: "У11\/422Р 1паде_и1<Д1т: 640 1паде_ЬетдЬ1:: 480 саг.е-а_папе: ”Т:ез1:_сэпега" сагпега тлбсциг].: "раскаде://с5Ь_сап;сопГгд/сарега_^пЕо.угп^, Ьг1д1гТпезз: 1
согДгазс: -1 вабигаНоп: -1 зЬагрпрзз: -1 датп: -1 аЫо_иНЕЕе_оа1апсе: 1:гие ипие_Ьа1.апсе: 400И аибоехроьиге: Ггие ехрозиге: 1Э0 аибоЕосиз: ГаТзе Госиз: -1 Параметр сатега _тГо_иг1 указывает путь к калибровочному файлу, кото- рый можно изменить в соответствии с фактическим путем. После внесения изменений при повторном запуске узла камеры достаточно загрузить этот файл параметров. Результат выполнения показан на рис. 7.15, где можно увидеть журнал загрузки файла параметров. $ гоз2 гип изЬ_сап изЬ_сзп_пос1е_ехе --гоз-агдз --рагапз-ЕПе /срС/гоз/]а27у/з11аге/и8Ь_сап/сопН.д/рагапз_1.уал1 го52@диуиеЬоте:/орХ/го5/]ахху/5Ьаге/и5Ь_сат/соп^хд$ гоб2 гип и5Ь_сат и5Ь_сат_поде_ехе --гоз-агдз --рагапз-ГИе /ор^/гоз/ ]дгху/5Каге/и5Ь_саР1/соп1Чд/рагат5_1. уат! [1МР0] [1724605839.122144664] [и$Ь_сат]: сатега_пате уаХие: 1е$^_сапега [ЫАКМ] [1724605839.122374897] [и5Ь_сат]: Ггатега^е: 30.000000 [1ЫЕ0] [1724605839.123818136] [изЬ-Сат]: сатега саНЬгаХхоп ПКЬ: раскаде://и5Ь_сат/сопГхд/сатега_хпГо.уат! [1МР0] [1724605839.183215788] [изЬ_сат]: 51аг1хпд '€е51_сатега' (/деу/ухдеоО) а(: 640x480 уха ттар (т]ред2гдЬ) ак 30 ЕР5 ГЬхб йеухсе 5иррог1$ ГоИонхпд ГогтаСз; УМУУ 4:2:2 1280 х 720 (9 Нх) УСУУ 4:2:2 640 х 480 (30 НО УСУУ 4:2:2 352 х 288 (30 НО УСУУ 4:2:2 320 х 240 (30 Нг) Рис. 7.15 ❖ Загрузка файла калибровки камеры Если добавление файла параметров в командной строке кажется неудоб- ным, можно использовать файл запуска Еаппсй. Пример можно найти в фай- ле /ор1/го8/)а22у/з11аге/и8Ъ_сат/1аипс11/сэтега.1эипс11.ру. Ггоп сатега_сопНд 1прогС СатегаСспГЕд, 11$В_СА1Ч_01В # Определение списка конфигураций камеры. СА.1ЕРА8 = [] # Добавление конфигурации камеры в список. САМЕРА5. гррепф СатегаСопНд( папе='сатега', рагат_раСп-Раб1т(115В_САМ_01К, 'сопНд', 'рагаг!5_1.уат1 ) ) ) # Разбор аргументов командной строки. рагзег = агдрагзе.АгдипепЕРагзег(бевсгтрПоп-'ивЬ-Сагп бепо') рагзег.абб_агдипепб('-п', '--побе-папе', бе5б='пос1е_гапе , Гуре^гг,
Ье’.р- Имя устройства.', <1еГаи1т=' иьЬсап1 ) # Создание списка узлов камеры. сгпега_поРе5 = [ Исс1е( раскэде='и5Ь_сао', ехесиГаМ.е-'и5Ь_сэ1л_пос|е_ехе , осСриС=1 зсгэеп', рапе^салега.папе, гатезрасе-сапега.пате'расе, ра-а те се г г.=[ сапе г а. ра гат_ ратб ], генаррт пдз=сапег а.гепарргпдз ) Гог сапега т.п САМЕКА5 # Создание группового действия, включающе_о все узлы камер. сапега_дгоар = СгоирАсСт.оп(са1ле,'а_пос1ез) В этом файле запуска определена группа камер, в которой можно настро- ить файл конфигурации и пространство имен - в данном случае это рагатз!. уат! и сатега, как показано на рис. 7.16. При запуске этого файла ЬанпсЬ результат будет выведен в пространстве имен сатега. Р1 го52@диуиеЬоте:~ О. = _ о х го52@диуиеКопе:~$ гоз2 1:ор1с 1151 /сатега/сатега_гпГо /сатега/сотрге55есЮер1:Ь /сатега/1таде_сотрге55ес1 /сатега/ттадегаи /сатега/ттаде_гаи/1Ьеога /гтаде_гам/281:с1 /рагапе1ег_е7епС5 /гозоиХ. Рис.7.16 ❖ Списоктем камер с пространствами имен Если камера не меняется, то калибровку камеры нужно выполнить только один раз. 7.2.5. Калибровка стереокамеры Пакет функций сатега саПЬгаНоп также поддерживает калибровку стерео- камер. После запуска драйвера стереокамеры в системе ВОЗ 2 должны одно- временно присутствовать темы изображений для двух камер В этом случае программу калибровки можно запустить с помощью следующей команды: $ гоз2 гип сапега_саПЬгаНсп сатегасаПЬгаСог \ -51ге=8х6 \ -здиаге=0.024 \ - арргохтла1:е=0.3 \ -по-зегутсе-сЬеск \ гоз-агдз --гегар /1еП: =/1еН/гпаде_гесГ \ гепар /гтдЩ:=/г1.дШ/т-Г1аде_гэсТ:
Здесь 1ей соответствует имени темы изображения девой камеры, а - правой. Их можно изменить в соответствии с фактическим расположением. После выполнения команды появится окно с изображением с двух камер, как показано на рис. 7.17. Рис. 7.17 ❖ Калибровка стерескамеры Дальнейший процесс калибровки идентичен калибровке монокулярной камеры. После завершения калибровки будет создан файл калибровки сте- реокамеры, использование которого аналогично файлу для монокулярной камеры, поэтому здесь мы не будем повторно останавливаться на этом. После выполнения калибровки продолжим разработку функций обработки изображений. Наиболее часто используемой библиотекой для этого является ОрепСУ. 7.3. Обработка изображений с помощью ОрепСУ ОрепСУ (Ореп Зонгсе СотрпГег У131оп ЫЬгагу) - это кросс-платформенная библиотека компьютерного зрения с открытым исходным кодом, выпущен- ная под лицензией ВЗО. Она может работать на таких операционных си- стемах, как Ыппх, ИПпйоу/з и шасОЗ. ОрепСУ состоит из функций на С и не- большого количества классов на С++, а также предоставляет интерфейсы для языков С++, РуСйоп, КнЬу, МАТЬ АВ, реализуя множество общих алгоритмов в области обработки изображений и компьютерного зрения, и является бес- платной как для некоммерческого, так и для коммерческого использования.
7.3.1. Установка ОрепСУ На базе ОрепСЛ/ можно быстро разрабатывать приложения в области машин- ного зрения. В КОЗ 2 уже интегрирована эта библиотека и соответствующие интерфейсные пакеты функций. Для установки используйте следующую команду, результат выполнения показан на рис. 7.18. $ зибс арГ глзГаИ гоз-заггу-утьгоп-орепсу 1тЬоэепсу-с1еу руЩопЗ-орепсу 1+1 гоз2фдиуиеЬо1+1е: - гоь2@диуие!>опе.-$ зидо арГ ГпзТаИ. гоз-заггу-угзтоп-орепсу 1г5орепсу-<1еу руНтопЗ-орепсу Йеабгпд раскаде ГгзГз... Оопе ВагГёгпд дерепдепсу Ггее... Сспе ВеасНпд зГаГе глТогтаТтоп. . Оопе гэз-засгу-угзгоп орепсу гз а1геаду ГЬе пенез! уегзгоп (4.1.0 1поЬ1е.20240712.143749). Иоорепсудеу гз аТгеаду ГЬе пенезС уегзгоп (4,6 0+дГзд 13.1иЬипТи1) руГЬопЗ-орепсу гз аТгеайу Нге пенез! уегзгоп (4.6.0+сИзд 13.1чЬипСи1). Рис. 7.18 ❖ Усановка библиотеки КОБ 2 для ОрепСУ 7.3.2. Использование ОрепСУ в КОБ 2 КОЗ 2 предоставляет пакет интерфейсов для ОрепСЛ/ - су_Ъпс1§е. Разработ- чики могут использовать этот пакет для преобразования изображений из со- общений РОЗ 2 в формат ОрепСЛ/ и затем применять библиотеку ОрепСЛ/ для различной обработки изображений, как показано на рис. 7.19. Кроме того, можно преобразовать данные, обработанные ОрепСЛ/, обратно в сообщения изображений КОЗ 2 и опубликовать их через тему, обеспечивая передачу изображений между узла+ми. ОрепСУ КОЗ 2 1рПтаде б ОрепСУ СуВпбде Сообщение кладе в КОЗ Рис. 719 ❖ Назначение пакета су_Ьпбде 4*4 Концепиия «моста» часто встречает ся в КОБ и служит для преобразования и обмена данными между системами с несовместимыми структурами данных. Примерь! вклю- чают су_Ьпсде (КС5 и ОрепСУ), дагеЬо_Ьпсде (КС5 и СагеЬо), у*еЬ_Ьпс1де (РОБ и У/еЬ 1БОЫ) и др. Рассмотрим простой пример, демонстрирующий использование су Ьпй^с для преобразования изображений между КОЗ 2 и ОрепСЛ/. В этом примере узел КОЗ 2 подписывается на сообщения изображений, публикуемые драй- вером камеры, затем преобразует их в данные изображений ОрепСЛ/ для ото-
бражения, после чего преобразует изображение из формата ОрепСУ обратно в сообщение изображения КОВ 2 для публикации и отображения. Откройте три терминала и выполните следующие команды для запуска примера. $ гоз2 гип иьЬ саг" и5Ь_сзп_пос1е_ехе $ гоз2 гип 1еагпгпд_су С7_Ьг1ЛдеДеМ $ гоз2 гип гдГ-ТладедЛен гдТ^ваде^утеи Результат выполнения примера показан на рис. 7.20. Слева находится изо- бражение после преобразования сообщения КОВ 2 в данные ОрепСУ с по- мощью су_Ьпс1§е. Затем с помощью библиотеки ОрепСУ в левом верхнем углу изображения нарисован красный круг. Справа показано изображение после повторного преобразования данных изображения ОрепСУ в сообще- ние изображения КОВ 2 с помощью су_Ьг1(1§е, Оба изображения должны быть полностью идентичны. Рис, 7.20 ❖ Результат выполнения обработки с помощью су_Ьпс1де Исходный код для реализации этого примера находится в файле 1еагп- ш&_су/су_Ьпс1§е_1:е81:.ру и выглядит следующим образом: тпрогг гс!ру бгоп гс!ру.пос1е тпрогб Иоде бгоп 5еп5ог_п5д5.п5д тпрогб 1паде бгоп су_Ьгтс1де бчрогб Ст/ВгЩде 1-Гтрогб су2 тг'рогт пипру а? пр # Импорт библиотеки РуЫтоп для К05 2. # Импорт класса Ь1ос1е из модуля гсбру. # Импорт типа для сообщений изображения. # Импорт (Л/ВгтДде для преобразования изображений между КОЗ 2 # и ОрепСУ. # Импорт библиотеки ОретСУ. # Импорт библиотеки ИипРу.
с1азз Щаде5зЬзсггЬег(Мобе): * Определение класса 1пэдеЗиЬ5сг1оег, наследуемого от Моде. Реб___тпгб__(зеИ, папе): 5орег().__тли___(папе) # Инициализация класса Моде. # Создание подписчика на тему тпаде_"аи. зеИ.зиЬ 5еИ.сгеабе_5иб5сггрт1сп( 1паде. 'гпаде_гги , 5е1б.1Д5бепег_саЦ.Ьаск, 10) # Создание издателя для темы су_ Ьг тбдеДпаде. зеК.риЬ зеИ.сгеабериоНзЬег ( Щаде, ' су_Ьгтс1де_ттаде', 10) # Создание о6ьекта С’чВгт.дде. зеИ.су_огтс!де = Су8гт.дде() баб Н51епег_са СЬаскДеИ, дата): # Преобразование сообщения изображения КОЗ в данные изображения ОрепСУ. тлгде - 5еИ.су_Ьг1бде.1|>1д1П5д_бо_су2(баРа, 'Ьдг8') (гоиз, со!з, сбаппеТз) = тмаде.збаре # Получение размера и числа каналов изображения. И со!з > 6Е апб тома >69: # Проверка, что изображение достаточно большое. су2.сбгс1е(1Г|аде, (60, 60), 30, (0, 0, 255), -1) # Отрисовка окружности на изображении. су2.тл5бсм("1паде испбои", гладе) # Отображение окна изображения. су2.иа11Кеу(3) # Ожидание 3 миллисекунды. # Преобразование измененных данных изображения ОрепСУ обратно в сообщение КОЗ и публикация. 5е1б.риЬ.риЫг5Н(5е1б.су_Ьггбде.су2_бо_1пдп5д(тпаде, "Ьдг8")) бег ^а1г(эгд5=Мопе): а Определение функции патп. гс1руЛп1б(агд5=агд5) # Инициализация КОЗ 2. побе = 1падеЗнЬ5СГ1Ьег("су_Ьггбде_бе5б") # Создание экземпляра класса ЩадеЗиЬзсгтЬег. гс1ру.зр1п(побе) # Поддержание работы узла и обработка функции обратного вызова. побе.безРгоу_побе() # Уничтожение узла. гсТру.ьЬиббоип() # Завершение работы КОЗ 2. Анализ ключевых фрагментов кода примера. бгоп су_Ьгтбде тпрсгб СуВгтбде # Класс для преобразования изображений между КОЗ 2 и ОрепСУ. тпрогт су2 # Библиотека для обработки изображений ОрепСУ. Для использования ОрепСУ необходимо сначала импортировать модуль ОрепСУ, а также некоторые модули, необходимые для су_Ьпс!уе. зеИ.зиЬ = 5еИ.сгеабе_5иЬ5сгтрббсп( Спаде, 'гпаде_гаи , зеТб.ИзбепегсаИ'эаск, 10) зеИ.риЬ - 5е1б.сгеабе_риЫ15бег( Спаде, 'су_Ьгтбде_бпаде', 10) 5е1б.су_Ьгтбде СуВгббдеД В коде определен подписчик зиЬ для приема исходных сообщений изо- бражений, затем определен издатель риЬ для публикации изображений, об-
работанных ОрепСУ. Также определен дескриптор СуВг1й§е для вызова со- ответствующих интерфейсов преобразования. гладе - 5е14Г.су_Ьггс1де.гтдт5дД:о_С72(с1аТа, 'Ьдг8') Функция интерфейса 1П1{’т'>8_1:о_су2() преобразует сообщения изображе- ний КОЗ 2 в данные изображений ОрепСУ. Этот интерфейс принимает два входных параметра: первый указывает на поток сообщений изображений, второй используется для определения формата данных изображения при преобразовании. 5е1Г.риЬ.риЫг5Ь(5еН:.С7_Ьггс1де.с72_1:о_гпдп5д(гпаде, "Ьдг8")) Функция интерфейса су2_1о 1трт18§() преобразует данные изображений в формате ОрепСУ в сообщения изображений КОЗ 2. Этот интерфейс также требует двух параметров: потока данных изображения и формата данных. ЛК Из этого примера видно, что использовать ОрепСУ в КОЗ 2 не сложно. Досаточно освоить методы использования интерфейсных функций 1тдт5д_1:о_су2() и Су2_1о_ 1тдт5д0- Основы применения ОрепСУ и КОЗ 2 уже были подробно рассмотрены в примерах приложений главы 2, при необходимости можно вернуться к ним, чтобы освежить знания. Далее мы рассмотрим несколько визуальных при- ложений, которые помогут вам освоить разработку функций роботизирован- ного зрения в КОЗ 2. 7.4. Визуальное приложение 1. Навигация по линии Как сделать так, чтобы робот лучше адаптировался к окружающей среде, и минимизировать зависимость от нее? Если у нас есть камера с «глазами», можно ли с помощью визуального динамического анализа информации об окружающей среде контролировать движение робота? Например, для авто- мобилиста, движущегося по дороге, дорожная разметка является сигналом, указывающим направление движения. А находящиеся по сторонам горы или море не имеют большого значения. 7.4.1. Основные принципы и реализация Следуя логике дорожной разметки, предположим, что для робота также на- несена специальная разметка. Роботу не нужно беспокоиться о препятствиях вокруг, он просто следует разметке, что упрощает сложную задачу плани
рования маршрута до задачи отслеживания пути. Визуальные или другие сенсоры помогают роботу находить эту разметку. Данный метод уже широко используется в промышленности, например для транспортировочных роботов. В сложной заводской среде для роботов устанавливают специальные дорожные знаки, которые помогают им ста- бильно и быстро передвигаться, как показано на рис. 7.21. Эти знаки могут быть ОН-кодами, цветными или магнитными линиями, которые дают роботу четкие сигналы для движения, включая регулировку скорости, указание раз- вилок и мест остановки. Рис. 7.21 ❖ Транспортировочный робот и специальные дорожные знаки Принцип работы функции следования по линии аналогичен, как показано на рис. 7.22. Если робот обнаруживает, что разметка находится слева в поле зрения, он поворачивает налево. Чем больше отклонение, тем выше скорость поворота. Главное - удерживать разметку в центре поля зрения. Рис. 7.22 ❖ Визуальное следование мобильного робота за линией Разобравшись с принципом, можно приступить к практической реали- зации. Согласно описанным выше методам реализации с использованием ОрепСУ, процесс следования за линией можно разделить на шесть этапов.
1. Ввод изображения: получение информации об изображении через драйвер камеры. 2, Бинаризация: обработка входного изображения для получения целе- вой линии. 3. Индексация линии: определение положения целевой линии. 4. Вычисление координат линии: определение координат целевой линии. 5. Вычисление команд скорости: расчет команд скорости на основе коор- динат линии. 6. Вывод команд: публикация команд управления скоростью 7.4.2. Симуляция визуального следования робота за линией Сначала попробуем реализовать функцию следования по линии в симуляци- онной среде. Пример кода находится в репозитории оп§тЬо1_с1с8к1:ор. Посмотрим на конечный результат демонстрации. Запустите пример с по- мощью следующей команды: $ гоз2 1аипсЬ ог<дгпЬоГ_да2еЬо_ЬагпогЛс 1оас1_ог1д1гЬоТ_1М:о_ите_1:о11оиег_да2еЬэ.1.гипсЬ.ру После запуска СагеЪо появится желтая линия с симуляционным роботом, находящимся в начале этой линии, как показано на рис. 7.23. Рис. 7.23 ❖ Следование робота по линии в симуляционной среде
Запустите КУ12 и добавьте элемент отображения 1та§е, чтобы отобразить данные изображения в реальном времени, как показано на рис. 7.24. $ ГЭ52 гип гугг2 гугг2 Рйе Рапе Ь Не1р ЙШСегаЛ Моте Сатега □5е1е<Х ф₽оо» Сатега гу!х2 I© О1$р1ау5 9 с!оЬа1 ОрЕюпа Нхед Ргате Васкдгоипд Со1ог Ргате Раке / С1оЬа1 5какиз: Ок / Р1хед Ргате « сна 9| 1таде обот 48; 48; 48 30 ОК 1<] Р1хе«1 Ргате Ргате !лко «ЫсН а<1 бага (з ГгалзГогтес! ЬеГоге Ье1пд <Й5р1ауес1 Сгеаке У15иа1|гаНоп Ву б!5р1ау Гуре Ву Горк 2 Туре: ОгЬК (пЯ2_<1еГа1 ’ 2его * /сатега ' /!таде_гаи ____а Сатега 1__Д-]гпа^е_ ’ /окЕесГроТп^™ гам/ • РсилКкатред ’ /доа!_розе X Розе ’ /|пШа1ро&е РозеМкЬСоуапапсе - /одот х\ Ойотекгу /5С0П (.азегЗсап Абб таде ОеБслрйоп: РезеГ РО5Т!те: 1687541209.84 РО5Е1арзес1: 14.20 5Ьом/ игмзиаНгаЫе Гор!с5 015р1ау Мате ОСапсе! О 1А/аИТ1те. 1687541209.93 №И Е1арзе<1. 14.20 Сиггепк. У1ете ЫеагСЬр... 1луегк2 Ах 15 ТагдеГ Рга... О15капсе Роса! 5Ьар... Роса! 5Ьар... Уам/ РНсЬ ► Роса1Ро1пс ОгЫк (гу1?) 0 01 <р|хе<1 Ргате> 10 0 05 0.795398 0.780398 Заме Ретоуе Репате ЕхрептелГа! 10 Где 1 3 Рис. 7.24 ❖ Просмсгр следования робота по линии в реальном времени Откройте новое окно терминала и запустите функцию следования за ли- нией. $ гоз2 гип сггдгпЬст_с1е11о 1лпе_Го11оьег После запуска симуляционный робот начинает движение по линии, одно- временно откроется окно с отображением результатов обнаружения линии в реальном времени, как показано на рис. 7.25.
Рис. 7.25 ❖ Процесс визуального следования робота по линии Исходный код для реализации данного примера находится в файле оп§т- Ьо1_(1ето/ог1§тЬо1:_с1ет/1те_Го11ошег.ру и представлен ниже. тг.рогс гс1ру бгоп гсТру.побе гпрогб Моде бгоп 5еп5ог_1лзд2.п5д бпрогб 1таде бгоп деоР1е1гу_п5д5.П5д бпрсгб Гибзб гпрогг пипру аз гр ггрогб ы2 т-гтрогт С7_Ьгтс1де # Создание мостика между КОЗ и ОрепСУ. Ьг!с1де = сУ-ЬгтЗде.СуВгтДдеО беб бпаде_са11Ьаск(рзд): # Преобразование сообщения изображения КОС в формат изображения ОрепСУ. тпаде_1приб = Ьггбде.бпдпзд_1:о_с72(п8д, безггеб_епсоббпд-'Ьдг8') # Преобразование изображения из ВСК в цветовое пространство Н5У. Ьзу = су2.сугСо1ог<спадетприб, су2.ССЮК_ВСК2Н5У) # Определение диапазона порогов Н5У для желтого цвета. 1окв1 _уеИои - пр.аггау([10, 10, 10]) иррег_уе!1ои = пр.аггау([255, 255, 250]) # Создание маски для выделения только желтых областей пазк = С72.1пКапде(бз7, 1оиег_уе11ои, иррег_уеИоь|) # Получение высоты, ширины и глубины изображения. К, и, б = гпаде_гприб.5Ьаэе # Определение области поиска. зеагсЬ_бор = гпб(3*Ь/4) зеагсЬ_Ьоб = гпГ(3*Ь/4 + 20) пазк[0:зеагсб_1:ср, 0:и] = 0 па8к[зеагсб_Ьоб:1т, 9:и] - 0 # Вычисление центра тяжести маски. М = сс'2.попепб5(пазк) б б М['тО0'] > 0: сх = бпб(М[ 'Р11Э ]/,‘1['П00' ])
су = гггк(М[' п011 ]/М[' П00' ]) # Отрисозка красной точки в позиции центоа тяжести. су2.с1гс1е(г11аде_1при1:, (сх, су), 20, (0,0,255), -1) # Начало управляющей логики. егг = сх - и/2 1ИС5.1: = Тшт51() (ж$б.1дпеаг ,х = 0.2 Ритз^.апдиТаг.г = -НоаГ(егг) / 5С0 роЬИзЬег, раЫгз^б^тзб) # Завершение управляющей логики. # Отображение обработанного изображения. су2ЛпзЬои( 'с1ебесб_1лпе", гпадеДприб) су2.иаПКеу(3) Реб па1п(): гсТруЛпШ) д'юоа! побе побе = Нобе( ГоИоиег ) дТоЬа! риЫгз!аег риЬНзбег - пойе.сгеаГе_риЬиз11ег(Щ15б, '/спд уе'Г', гс1ру.до5.до5_ргобт1е_5у5Рег_бебаик) зибзсг’-рН-оп - побе.сгеабе_зиЬ5сггрт1оп(1паде, 'сапега/гпаде_гаи', тладе_саиЬаск, гс1 ру. доз. цо5_ргобие_зеп5ог_ба ба) гс1ру.зр1п(побе) бгу: па1п() ехсерг (КеуЬоагЛпгеггарб. гс1 ру.ехсериопз.К051пбеггиргЕхсергтог,): # Отправка пустого сообщения для остановки робота. елрбу_пеЕьаде = ТитзбО рвЫЛзЬег. риЫА5К(еир1:у_пе55аде) # Очистка узла и заверпение работ гс!ру. пэбе.безбгоу_побе(.) гс!ру. збиЩоип () ехи() Давайте проанализируем код .этого примера. зиЬзсгсрПоп = ппбе.сгеа1.е_зиЬ5сггрНоп(1таде, сапега/тпаде_гги , тладе_саиЬаск, гс1. ру .доз. доз_ргоН1е_5епзог_ба1 а) Этап 1 - ввод изображения. В этом примере для получения данных изобра- жения, публикуемых камерой, используется функция подписки КОВ 2 пойе. сгеаЕезнЬзспрНоп. Первый параметр 1та°е указывает формат принимае- мых данных, то есть формат изображения. Второй параметр - имя темы для подписки, указывающее, что подписка осуществляется на необработанные данные изображения с камеры. Третий параметр - имя функции обратного вызова 1та§е_са11Ьаск, которая вызывается для обработки изображения при каждом получении кадра данных КОЗ 2. Четвертый параметр связан с ме- ханизмом Оо8 в КОЗ 2, который обеспечивает надежную передачу данных.
гпаде_1прик - Ьггс1де.1.пдп5д_1:о_с72(п5д, 11езгггс1_епсос1т.пд='одг8') Ьзу = с^2.С7ГСо1ог(1г»аде_тприТ:, С72.С0ГЭК_ВСК2Н5\/) 1оиег_уеПсм - пр.аггау([10, 10, 10]) иррег_уеПсм - пр.аггау([255, 255, 250]) пазк = с72.гпВапде(Ь57, 1даег_уеПои, иррег_уе11ои) Этап 2 - бинаризация изображения. На этом этапе используется су_Ьпй§е для преобразования сообщений изображения, полученных КОЗ, в формат для ОрепСУ, что позволяет использовать богатые функции обработки изо- бражений этой библиотеки. Затем цветовое пространство КОБ преобразуется в цветовое пространство НБУ, что упрощает распознавание цвета. Далее путем установки пороговых значений извлекается целевой цвет (желтый) и формируется бинаризованное изображение. Ь, и, с) = тладеДпрл.зЬаое 5еагсЬ_Тср = гпГ(3*Ь/4) зеагсЬ_Ьос = гп+:(3*Ь/4 + 20) па5к[0:',еагсЬ_1:ор, 0:и] = 0 1ча5к[5еагсН_Ьо1::11, 0:и] - 0 Этап 3 - индексация линии пути. После индексации линии пути можно определить оптимальное положение для отслеживания целевой точки. На этом этапе изображение обрезается, чтобы оставить только центральную часть и удалить помехи сверху и снизу изображения. Это позволяет сосредо- точить внимание на области, где наиболее вероятно находится линия пути, повышая точность и эффективность ее обнаружения. И - су2.попепг5(эа$к) И М[' гт00 ] >0: сх = 1пг(М['я10']/М['п00']) су = 1П1(М[ '301' ]/М['ГП06' ]) Этап 4 - вычисление координат линии пути. На этом этапе используется функция су2.тотспГ8() из ОрепСУ для вычисления координат центра масс (сх, су) желтой области в маске изображения. Эти координаты будут исполь- зованы для определения положения линии пути. Если центр масс желтой об ласти действителен (то есть шОО больше нуля), то вычисляются координаты центра масс сх и су, указывающие на положение линии пути. егг = сх - и/2 ЬлбС = ЬпзЦ) ГихьШгпеаг.х = 0.2 Щ15(:.»пди1аг.2 = -ПоаЦегг) / 500 Этпа 5 - вычисление команд скорости. В зависимости от величины откло нения центра линии пути в поле зрения камеры линейно пересчитывается угловая скорость робота, при этом линейная скорость фиксирована и со- ставляет 0,2 м/с. раЫл'.Ьег. риЫЛ5Ь(Ы 51)
Этап 6 - публикация вычисленных сообщений управления скоростью в тему КО8 2 /сшй уе!, что позволяет управлять движением робота, заставляя его следовать по желтой линии. 7.4.3. Визуальное следование по линии реального робота Давайте теперь на примере Оп^дпВо! посмотрим, как хорошо работает сле- дование по линии с реальным роботом. Для этого необходимо запустить три терминала для запуска в них трех основных функций. # Терминал 1 на роботе: запуск узла привода шасси робота. $ ехрогб КМЫ_1ИРЕЕМЕМТАТЮ^1=гп»г_сус1опес1а5_сэр $ гоз2 ТаипсР огтд\.пЬо1:_Ьг1пдир огЕдгпЬобЛаипсП.ру и5е_сапега:=Ггие # Терминал 2 на робо-е: запуск узла визуального следования по линии и публикация темы управления # скоростью. $ ехрогб РМЫ_1МРЕЕ1“.ЕМТАт10М=гП|л/_сус1опес1с1ь_сэр $ г оз? гип огтдт пЬот:_1Тпебо11о1л/ег ТоТТоиег # На компьютере: подписка на изображение, получаемое с камеры робота. $ гоз2 гип гдЕДюадед/теи гдТ_Тпаде_иТеи ДК Для обеспечения обработки изображения в реальном времени здесь вместо 005 ис- пользуется сусшпеббз, чтобы избежать задержек из-за фрагментации 005. Теперь робот начал медленно двигаться вдоль черной линии. Вы также можете подписаться на тему изображения с результатами распознавания в открытом интерфейсе тцгДта^ехйеш, чтобы просмотреть эффект распо- знавания линии пути в реальном времени. Красная точка обычно остается в центре распознанной линии пути, как показано на рис. 7.26. Рис. 7.26 ❖ Следование по линии реального робота
Возможно, вы заметите, что процесс следования по линии реального робота не всег- да стабилен. Это связано с тем, что обработка изображений зависит от окружающей среды, и пороговые значения цвета могу- различаться в разных условиях Поэта му необходимо учитывать реальные условия и корректировав пороговые значения цвета в программе Код реализации движения реального робота по линии находится в файле опдтЬогПпс&ПошсгД'оПошег.ру и практически идентичен процессу реали- зации визуального следования по линии в симуляционной среде, описан- ному в разделе 7.4.2. Здесь мы не будем повторно останавливаться на этом. 7.5. Визуальное приложение 2. Распознавание ОК-кодов С какими задачами распознавания изображений мы сталкиваемся чаще все- го в повседневной жизни? Сканирование ОК кодов, безусловно, является одной из таких задач. Для входа в ЛЛ7еС11аС необходимо сканировать ОК-код, для мобильных пла- тежей также требуется сканировать ОК-код, и даже для взятия самоката на прокат нужно отсканировать ОК-код - см. рис. 7.27 Помимо этих уже широко распространенных в повседневной жизни сценариев, ОК-коды также актив- но применяются в промышленном производстве, например для маркировки деталей или сохранения служебной информации о производстве. Рис. 7.27 ❖ Применение ОК-кодов ОК-коды, глубоко проникшие в различные аспекты жизни и производства, также называют двумерными штрихкодами. Они являются естественным развитием идеи одномерных штрихкодов. Объем информации одномерного штрихкода ограничен, в то время как двумерный штрихкод расширяет это пространство на плоскости и использует черно белые графические элементы для записи информации, что значительно увеличивает объем данных.
Раз ОК коды могу г хранить много информации, можно ли их использовать в приложениях для роботов? Конечно, можно. Во многих сценариях приме- нения роботов возникает необходимость в распознавании ОК-кодов. Этот процесс похож па визуальное следование робота по линиям, и его можно реализовать с использованием КОВ 2 в сочетании с ОрепСУ. Это позволит роботу распознавать ОК-коды и выполнять заранее заданные действия, за- кодированные в них, 7.5.1. Библиотека 2Ьаг для сканирования ОК-кодов 2Ьаг - это открытая библиотека для сканирования штрихкодов и ОК-кодов, которая позволяет быстро распознавать их и декодировать. Установка биб- лиотеки очень проста и требует выполнения следующей команды. $ зсс1о ар1 тльГаЦ 1ЛЬ?Ьаг-с1еу Функциональность библиотеки 2Ьаг включает в себя следующие четыре основных компонента. 1. Получение и предварительная обработка изображений Библиотека 2Ьаг сначала должна получить на вход изображение, которое может быть как изображением, захваченным камерой в реальном времени, так и сохраненным статическим изображением. Сначала обычно требуется предварительная обработка изображения, такая как преобразование в гра- дации серого, снижение шума, обнаружение краев и другие операции для повышения точности и эффективности последующего декодирования. 2. Локализация символов и определение их положения Библиотека 2Ьаг использует технологии обработки изображений для лока- лизации штрихкодов и ОК-кодов на входном изображении. Для различных типов символов (например, ОК кодов, одномерных штрихкодов и т. д.) 2Ьаг применяет различные алгоритмы и стратегии для определения их положе- ния и границ. Для ОК-кодов обычно обнаруживаются их поисковые шаблоны (Ршбсг РаПсгпз) и три угла позиционирования. 3. Декодирование символов После правильной локализации символов библиотека 2Ьаг выполняет операцию декодирования. Для одномерных штрихкодов это включает анализ ширины и интервалов полос, а затем их сопоставление с опрсде ленными правилами кодирования (например, ЕА1\-13, Собе 128 и т. д.). Для ОК-кодов библиотека 2Ъаг анализирует матрицу данных в узоре и из- влекает данные в соответствии с правилами кодирования ОК-кодов или кодов Эа1а МаГпх.
4. Вывод данных и интеграция с приложениями После успешного декодирования библиотека 7-Ьаг выводит распознанное содержимое данных, такое как текст, ПКЬ-адреса, числа и т. д. Эти данные могут быть подвергнуты дальнейшей обработке для реализации функций приложений, таких как автоматическое заполнение форм, поиск информа- ции о товарах, проверка логина и др. 7.5.2. Распознавание ОК-кодов с помощью камеры После изучения принципов распознавания ОК-кодов мы сначала запустим пример распознавания ОК-кодов с помощью камеры на локальном компью- тере В репозитории кода оп§тЬо1_де8кГор содержится пакет функций опу- тЬоГ_цгсодс_дсГесГ для распознавания ОН кодов, который .можно запустить с помощью следующих команд: # Терминал 1 компьютера: запуск узла камеры $ гоз2 ТаипсН изЬ_сап сатега.1аипс!1.ру # Терминал 2 компьютера: запуск узла распознавания (Ж-кодов $ гоз2 гип оггдгпЬоТ:_дгсос1е_6е1ес1: ог1дТпЬос_дгсос1э_йе1:ес1: # Терминал 3 компьютера: запуск визуально-о интерфейса $ гчт После выполнения вышеуказанных команд появится окно, изображенное на рис. 7.28. ОеРаиК-где идт5 Пиптпд РегзресПуез Не1р го52@диуиейоте' ~/деу_у«5 го52@дцуиеЬоте ~/деу_»5 сз Со ко СиуиеКоте [1ИРО] [1725171397.536916608] ПI ю.оот I сз Со ко СиуиеЬоте [1МР0] [1725171397.548047341] 1е 1 гладе эде_тои5е_1еГь| П ЗтооЬЬзсаНпд | О*1 ^2 | [ се Со СиуиеКоте [1МР0] [1725171397.859738686] сз Со ко СиуиеЬоте [1МР0] [1725171398.226434707] сз Со ко СиуиеЬоте [1МР0] [1725171398.239389329] сз Со ко СиуиеЬоте [1МР0] [1725171398.590841666] сз Со ко СиуиеЬоте [1МР0] [1725171398.602300998] сз Со ко СиуиеЬоте [1МР0] [1725171398.758982669] сз Со ко СиуиеЬоте [1ИР0] [1725171398.827108940] сз Со ко СиуиеЬоте [дг_соде_декесккоп]: [дг_соде_декесккоп]: [дг_соде_декесккоп]: [дг_соде_декесккоп]: [дг_соде_декесккоп]: [дгсодедекесккоп]: [дг_соде_декесккоп]: [дг_соде_декесккоп]: [дг_соде_декесккоп]: _______________________._____ I [1ИР0] [1725171398.839001001] [дг_соде_декесккоп]: су::ро1уккпез(Тгате, рокпкз, к1С5 Со СиуиеЬоте [1ИР0] [1725171400.022425093] [дг_соде_декесккоп]: су::Рокпк кехк_оггдкп = рогпкзПсз Со ко СиуиеЬоте Г052@дцуие1юте' ~/де«_«к х Зсаппед РР Соде: 1_еагп РоЬокк Зсаппед рР Соде: 1_еагп РоЬокк Зсаппед РР Соде: 1_еагп РоЬокк 5саппед рр Соде: Ьеагп РоЬокк 5саппед РК Соде: 1_еагп КоЬокх Зсаппед РР Соде: Ьеагп КоЬокк Бсаппед РР Соде: 1_еагп РоЬокк Зсаппед РР Соде: 1_еагп РоЬокк Зсаппед РР Соде: Ьеагп РоЬокк 5саппед рР Соде: 1_еагп РоЬокк $саппед РР Соде: 1_еагп РоЬокк го52фдиуиеНоте: ~/6еу_ул 3®® Е
Слева на экране отображается интерфейс гц! для распознавания ОК-кодов, который показывает местоположение и результаты распознавания. Справа на экране в терминале выводится информация «Ъеагп КоЬоНсв Со 10 Спуне- поте», что и является информацией из ОК-кода. Как же выглядит код реализации этой функции? Полная реализация на- ходится в файле оп§шЬо1_цгсос1е_с1е1:ес1:/8гс/цг_с1есос1ег.срр, содержание ко- торого приведено ниже. #гпс1ис!е "гс!срэ/гс1срр. брр" «гпсТибе "5еп5ог_Р5дс/п$д/1паде.(1рр'' йгпс’Ые <.су_Ьг1Сде/су_Ьг!с(де. брр> #гпс1ис1е "эрепсу2/срег.су.Ьрр #гпс!ис1е "орепсу2/гпдргос.Ьрр" йгпс!ис1е "орепсу2/гпдсос(ес5.(1рр' #гпс1и!е "эрепсу2/Ыд(1ди1.Ьрр" #тпс1ис1е "гЬаг.Ы #гпс!ис1е <51а_п5д5/п5д/51г1пд.11рр> с1а55 ргСос1еГ>е1:ес1:\.оп : риЬНс гсТсрр::Иобе риЫЛс: 5гСО'1еСе1есЕ’.оп() : Мос1е("дг_со(1е_с|огес1Лоп") { 5иЬ5СгЛрНол_ = ГЫь->сгеа1:е_2иЬ5СгЛр11оп<5еп5СГ_П5д5: :пзд: :1паде>( '7сэпега/1паде_гал|", 10, 51(1: :Р1рс((&9гСос1еОеГесГт.оп: :ЛнадеСаиЬаск, 1Ы.5, 51с!::рТэсебоШегз: :_1)); дг_со0е_риЬ_ - 1ПЛ5->сгеа1е_р1Ьи5Ьег<51с1_п5д5: :н$д: :5Лггпд>(''дг_сос1е", 10); Лпгде_риэ_ = ГЫь->сеаЕе_риЬи5Ьег<5еп5ог_п5дз: :пзд: :1паде>("дг_сос(е_Л|,нде", 10); } ргхуаЕе: уоЛс! Лр|адеСа1_1Ье1ск(сопзТ 5еп5ог_пзд5: :п5д: :1Р1аде::ЬбагесРЛг нзд) { Ггу { су_Ьги(де::Су1падеР1г суркг - су_Ьг!с(де: ДоСуСору^ьд, '>еп5ОГ_П5дь: :гР1аде_епсосИпдь::ВПК8); су::МаЬ (тапе = су_р!г->1паде; су::МаГ дгау; су: :су(:Со1сг((:гаГ|е. дгау, су::С010К_ВСК26КА7); гЬаг:: 11г1адеьсаппе। зсаппе:; зсаппег. ьек-СопНдПЬзг: :2ВЛВ_М0'\1Е, 7Ьаг: :7.ВАВ_СЕС_ЕЧАВ1Е, 1); гЬаг::Тгчаде зЬаг_1,1аде(1Тап1е.со'1.$, Егапе.гоиз, ''7800", (искаг *)дгауПака, (тапе.соП * (тапелонь); 5саппег.5сап(гЬаг_Лнаде); €ог (г5аг: :1ваде: :5упЬо1И:ега(:ог зутЬс! = 2Ьаг_Лпаде.5утЬо1._ЬэдЛп(); зутЬо! != гЬэг_Лпаде.5упЬо1._епс1О; ++зупЬо1) { зГс!::51:гтпд дг_сос(е_с1аГа - 5упбо1->дек_с1а1а(); В(1СРР_1((Р0(Нт5->дес_1оддег(), "ЗсаапеС ()В Сос(е: %5", дг_сэс(е_с1а1а.с_51г());
// Публикация данных СР кода. аибо цг_соСе_п5д = зСсНтздз: :нзд: :5Тгт.пд(); ог_собе_п5д.бгга = дг_собе_багэ; аг_собе_риЬ_->риЫ15Ь(дг_собе_пзд); // Отрисовка границы СК-кода и информации на изображении. збб::уесбог<су: Рот.пб> ротпбз; бог (бпб г = 0; 1 < 5упЬо\->деб_1осабгоп_5г2е(); т++) { рогпбз. риз11_Ьа ск (с у:: Рогпт( г у 1лЬо1 ->деб_1осаббоп_х(1), зупоо1->де1:_1осабгоп_у(т))); } су: :ро1уиг,е5(бгапе, ротптз, бгие, су: :8са1аг(0, 255, 0), 2); су::Рогпб бехбогСдтп - рсгп1:5[0]; бехР_опд1п.у -= 10; // Слегка смещение позиции текста вверх. су::ри1Техс(бгапе, дг_собе_баба, СехСогСдтг, су::ГОМТ_НЕР$НЕУ_51МР1_ЕХ, 0.8, су::5са1аг(0, 255, 0), 2); } // Публикация изображения с отметками СР-кода. ьегьог_т5д5::тзд:: Ттаде::ЗЬагедРбг оиб_ъР1д = су_Ьггс1де: :Су1паде(5Тс1_пзд5: :п$д: :Неабег(), ' Ьдг8", бгапе; .тоХпадеМздО; т.паде_риЬ_ >рийЛ5Ь(*ои1:_Щд); } сатсб (су_Ьггбде::Ехсергтоп &е) { ЧС1.СРР_СРР0Р(Т:1п5->де1:_1.оддег(), "су_Ьггске гхсерЕтоп: %з", е.уу1та1:()); гебигп; } } гс 1срр: :8иЬ5СггрНоп<5епьог_1П5дз: :пзд: :1паде>: :81тагебРСг 5иЬ5СГ\.ртЛоп_; гсЕсрр: :Рибизбег<51:б_п5д5: :пзд: :5бг1пд>: :8ЬагебР1г дг_ссбе_риЬ_; гсксрр: :РиЫг5Ьег<ьеп5ог_111ьд5: :пзд: :1паде>::5б.аг ебРСг чладе_эиЬ_; }; тпб пат.п(1пб агдс, сбаг *агду[]) { гс1срр: :тпИ(агдс, агду); гс 1срр:: 5ртп(5М: :паке_5Ьагеб<5гСобе0еСес1:гсп>()); гсТсрр: :5Ьиббол1п(); гебигп 0: } Рассмотрим ключевые фрагменты кода. 5иЬ5СгтрНоп_ = бЬ1з->сгеаТ:е_5иЬ5сг1.р1:гоп<5еп5ог_п5д5: .пзд :1паде>( '7сапега/гпгде_гаи', 10, збб: :Ы.г.б(.81ргСос1е0е1:ес1:1оп: :1падеСаиЬаск, Рттз, 516::р1асебо1бегз::_1)); Сначала, подписываясь на данные темы изображения, мы захватываем изображение, и каждый раз при получении сообщения изображения выпол- няется функция обратного вызова. Как показано в следующем коде, каждый раз при получении данных темы 1та§е выполняется код 1та§еСа11Ьаск.
// Перебор распознанных дК-кодэв. бог (гЬаг: :1Р1аде: :5уяЬо11бегаЩг зунЬо! = гЬаг_гпаде.5уг,»Ьо1_Ьедгп(5; зупЬо! != гЬаг_гнаде.5у|’|Ьо1_епб(); ++зупЬо!) { сог.зб сбаг *дгсобе_пзд = зу|лЬо1->деб_баРа().с_зсг(); кС1СРР_ЩЕС(Шз->деб_1оддег(), 1 Зсаппеб др. Собе: %з", дгСобе_пзд); аибо 51дп_соп пзд = зЩ_пздз: :пзд: :5Рг1пд(); зт.дП-СОП-Пзд.баба - дгСобе_пзд; // Публикация содержимого др-кода. аибо дг_собе_рзд - збб_1Л5дз::пзд::5бГ1пд(); дг_собе_пзд.баса дг_собе_баРа; Ч г_собе_риЬ_->риЬИзб (ц г_собе_пзд); После получения данных темы и входа в функцию обратного вызова осу- ществляется локализация и анализ ОК-кода. Сначала входное изображение конвертируется в градации серого, затем вызываются методы локализации и сканирования библиотеки 2Ьаг для распознавания, после чего публикуется результат распознавания. // Огрисовка границы УК-кода и информации на изображении. згб: :уесбог<су::Ро1пб> робпбз; Рог (бпб 1 = 0; г < зупбо1->де1:_1.осаб1сп_зг2е(); 1++) { рсЕпбз разК_Ьаск(су: :Робпб(зурЬэ1->де1_1осаг1.оп_х(1), зу1лЬо'.->деГ:_1осаПап_у(г))); } су::ро1у11пез(бгаяе, ротМэ, бгие, су::5са1аг(0, 255, 0), 2); су::Ро:пГ гехб_огкд1п = рогпбз[0]; Гехб_ог1д1л.у -= 10; // Слегка смешение позиции текста вверх. су::ри1Техб((таге, дгсобебаба, ГехбоггдЕп, су::ЕСМТ_НЕК5НЕУ_51М?ЕЕХ, 0.8, су::5са!аг(0, 255, 0), 2); } Ц Публикация изображения с отметками ОР-кода. зепзогдлздз: :Р15д: :Щаде: :5КагебРбг о'Н_Е|лд - су_Ьгт:1де: :Су11лгде(зЕб_пзд5: :пзд: :Неабег(), "Ьдг8", бгаяе).Ео1<яадеМзд0; Епаде_риЬ_->риЫЕзб(*оиЕ_Епд); Кроме того, можно объединить результаты декодирования ОК-кода и ин- формацию изображения с помощью интерфейса ОрепСУ. 7.5.3. Распознавание ОК-кодов с помощью камеры реального робота Рассмотрим процесс распознавания ОК кодов на примере реального робота Ог1§тВо1. Подключитесь к роботу Оп§1пВо1: через 88Н и выполните следующую команду: $ гоз2 Таипсб цг_ссбе_бебесбгоп дг_собб_бе1:есНоп.'1аипсб ру
При запуске камеры необходимо загрузить файл калибровки, иначе ОР код может не распознаться. После успешного запуска откройте браузер на компьютере, находящемся в той же сети, введите адрес ЬПр://1Р:8000 и нажмите Веб-интерфейс, чтобы просмотреть изображение и результат работы алгоритма, как показано на рис. 7.29. Рис. 7.29 ❖ Результат распознавания ОР-кода роботом © В адресе в браузере «1Р» необходимо заменить на фактический 1Р-адрес Опд!пВоТ. Код для распознавания ОК кодов на реальном роботе реализован в пакете функций оп§шЬо1_ехатр1е/цг_со11е_с1е1:ес(: и почти идентичен процессу реа- лизации распознавания ОК-кодов на локальном компьютере, поэтому здесь мы не будем повторно к этому возвращаться. 7.5.4. Следование реального робота за ОК-кодом Раз уж робот способен распознавать ОК-коды, можно ли в нем закодировать определенные команды? Простым примером является управление движением робота с помощью ОК-кода. Рассмотрим, как связать распознавание ОК-кодов с функцией управления движением робота на примере ОгщтВгЩ Войдите удаленно в систему робота, откройте три терминала и введите следующие команды для запуска робота и выполнения функций распозна- вания и отслеживания ОК-кодов.
# Терминал 1: запуск шасси движения робота. $ г05? ТаипсЬ ог!д\.пЬоГ_Ьг1пдир оггдТпЬоТЛаапсл.ру # Терминал 2: запуск распознавания ОР-кодов $ гоь2 ТаипсЬ дг_ссс!е_с1ебесТТой дг_собе_бе1есГТоп.1аипсК.ру # Терминал 3: запуск узла управления с помощью |)К-кода. $ го$2 тип дг_соае_сопРгоТ дг_сос1е_сопгго1_побе Затем поместите предварительно напечатанный ОК-код перед роботом - он будет двигаться вперед, назад, влево или вправо в зависимости от рас- познанного результата, как показано на рис. 7.30. Рис. 7.30 ❖ Распознавание ОЧ-кода и управление роботом Нам необходимо переписать узел для обработки результатов распознава- ния ОК-кодов, а именно узел цг_со(1е_соп1:го1_пос1е. Этот узел предназначен для управления движением робота в зависимости от содержимого ОК-кода. Основной код приведен ниже. бе! ь.еТ:Ти/т.ь1:(ье1Г, Нпеаг_х, апдЛагг): # Ограничение диапазона линейной скорости и углозои скорости. 1лпеаг_х = 1’1ах(гчп(1Лпеаг_х, 0.1), -0.1) апди1аг_2 = пах(пгп(апдь1аг_г, 1.0), -1.0) # Установка скорости движения робота. веТГЛтзТ.и.пеаг .х = Ипеаг_х ьеТГ.бигьГ.апдиТаг.г = апдиТаг_2 1еГ 5е1Ти151ЫН:б9г1п<:о(5е1Т, дгсэйеЗп^о: Ысгтпд): в Разбор информации (Ж-кода. тпТо - дгсобегпТо.баГа
# Корректировка направления движения и скорости робота на основе ()Н-кода. И 'Егоп!:1 гп гпГо: 5е1Е.5ебТиг51:(9.1, 0.0) еИ€ 'Васк' гп гпЕо: 5еИ.5ебТиг5б(-0.1, 0.0) еШ 'ЬеН' гп гпЕо: 5е1Е.5егТиг5б(9.0, 0.4) еШ 'КгдЬг' гп гпЕо: 5еИ.5есТиг5б(9.0, -0.4) е1ге: 5е1Е.5егТиг5б(0.0, 0.0) # Движение вперед. # Движение назад. # Поворот влево. # Повооот вправо. # Остановка движения. # Публикация управляющей команды. ье'И.риЬСопбгоКотапбО Приведенный код аналогичен изученному ранее следованию робота по линии. Управление движением робота вперед, назад, влево и вправо осу- ществляется посредством подписки на результаты распознавания ОК-кодов. Если ОК-код находится слева в поле зрения, робот движется влево, в про- тивном случае - вправо. Затем команды скорости передаются в функцию риЬСоп1го1Соттапб, которая публикует их в тему для управления движе- нием робота. ОК коды могут содержать достаточно много информации и обеспсчи вают стабильное распознавание. Помимо демонстрируемого здесь управ- ления следованием за ОК-кодом, их можно прикреплять к различным объектам, упрощая их идентификацию. Также, сканируя ОК коды, робот может определять свое текущее местоположение в процессе навигации, что позволяет уменьшить глобальную накопленную ошибку. Сценарии применения ОК кодов весьма разнообразны, и их возможности продол жают развиваться. 7.6. Приложение машинного обучения 1. Визуальное следование по линии с использованием глубокого обучения Мы разработали визуальное следование робота по линии с использованием ОрепСУ, что позволило тележке двигаться по линии. Однако распознава- ние изображений на основе ОрепСУ сильно зависит от освещения, и при изменении окружающей среды необходимо заново настраивать пороговые значения. Возможно ли, чтобы робот самостоятельно адаптировался к из- менениям окружающей среды, то есть чтобы он учился сам?
7.6.1. Основные принципы и структура реализации В отличие ог традиционной обработки изображений, глубокое обучение по- зволяет машинному зрению адаптироваться к большему количеству изме- нений, повышая точность в сложных условиях. В отличие от традиционно- го метода сопоставления шаблонов, метод разработки на основе глубокого обучения претерпел принципиальные изменения. Типичный процесс раз- работки показан на рис. 7.31. Анализ роалоной проблеме! Влияет на выбор ал-орктма, оценку модели и инвестиционные затраты Определение проблемы Подготовка данных Выбор подходящей модели Нахождение или написание соответствующего кода модели Выбор/разработка модели Оценка и тестирование обученной модели Проверка соответствия модели требованиям Использование набора данных для обучения модели Настройка модели в соответствии с бизнес-требованиями Хранение,экспорт и развертывание службы вывода модели Системная интеграция и мониторинг метрик Определение области данных: адаптация к требованиям задачи Сбор данных: загрузка и очистка Предварительная обработка данных: предварительная обработка и улучшение Определение и сегментация набора данных, обучение, оценка и тестирование Рис. 7.31 ❖ Процесс разработки глубокого обучения Основная цель машинного обучения - решение задач, которое можно раз- делить на 6 шагов. 1. Определение проблемы: какую задачу необходимо решить? Например, для визуального следования по линии это распознавание положения линии пути на изображении. 2. Подготовка данных для решения задачи. Например, подготовка изо бражений различных сцен для следования по линии, которые будут размечены и использованы для машинного обучения. 3. Выбор или разработка модели. Модель - это набор процессов для об- работки данных, таких как широко известные сверточные нейронные сети (СИН), генеративно-состязательные сети ((ЗАК), рекуррентные нейронные сети (ККК) и т. д. 4. Обучение и оптимизация модели: внесение данных в модель и полу- чение оптимальных параметров через обучение. Этот процесс .можно рассматривать как процесс обучения машины. 5. Оценка и тестирование модели: предоставление некоторого количест- ва данных обученной модели и наблюдение за результатами. 6. Развертывание. Когда все готово, обученную модель можно установить на робота, то есть передать знания роботу для решения ранее постав- ленной задачи.
7.6.2. Визуальное движение по линии с использованием глубокого обучения В этом разделе мы рассмотрим, как запустить функцию визуального дви жения по линии на реальном роботе с использованием глубокого обучения. Возьмем в качестве примера робота Оп§рпВоФ. Подключитесь к роботу через 88Н и выполните в терминале следующие команды. Результат пред- ставлен на рис. 7.32. # Переход б каталог пакета функций. $ сб /05егс1ага/ае7_и2/5гс/сггдтг,ЬсГ/ог1.д1пЬоГ_с1гер1еагп1пд/11пе_ГоПо?|ег_регсерГ1Оп/ # Запуск функции визуально-о следования по линии на основе глубокого обучения. $ го;2 геп 1Лпе_1:о1.'1сие-_регсерНоп 1лпе_Тоиоие-_регсерН.оп --гоз-агдз -р \ гобеТ_рэсЬ:=|Лос1е1/ге5пеТ18_224х224_п^12.Ып -р лобеТ_папе =ге5.теМ8_224х224_пу12 ГП гооЦфиЬипЬи:/и5егс!а1:а/йеу_\Ы5/5гс/опд|пЬо1:/опд'тЬо1:_с1еер(еагп1пд/1те_Роиот«ег_регсер1|оп О = _ а х гоо1@иЬип!и:~# сд /и5егда!а/деу_И5/5гс/ог!д!пЬо1:/ог!д!пЬо1:_деер1еагп!пд/1!пе_Го11онег_регсер1:!оп/ гоо1@иЬип!и:/и5егда1а/деу_И5/5Гс/оггд1пЬог/оггд!пЬо^_деер1еагп!пд/Нпе_Го11оиег_регсерМоп# гоб2 гип Ипе_1:о11оиег_регсе{ Поп 1гпе_Го11омег_регсер1гоп --гоз-агдз -р тоде!_раХЬ:=гподе!/ге5пе1:18_224х224_пу12.Ь1п -р тоде!_пате:=ге5пе118_224х224_г 712 [1МЕО] [1724678936.735417947] [дпп]: Моде 1П1.Е. [1ИРО] [1724678936.735936825] [ЫпеЕоПонегРегсерНопМоде]: раФЬ:тоде!/ге5пеХ18_224х224_пу12.Ьгп [1А1ГО] [1724678936.736008720] [ИпеЕоИомегРегсерИопМоде]: пате:гезпе1:18_224х224_пу12 [1МРО] [1724678936.736207712] [дпп]: Моде! тптЛ. [ЕазуОММ]: ЕазуОМИ уегзгоп = 1.6.1_(1.18.6 ОМИ) [ВРи_РЬАТ]ВРи Р!а1:Гогт Уег51оп(1.3.3)! [НВКТ] зе! Ход 1еуе! аз 0. уегзгоп = 3.15.25.0 [ОМ] РипХгте уегзХоп = 1.18.6_(3.15.25 НВКТ) [А][ОММ][раскед_тоде!.срр:234][Моде!](2024-08-26,21:28:57.310.835) [НогггопКТ] ТЬе поде! ЬигХдег уегзгоп = 1.8.7 [1МР0] [1724678937.453180869] [дпп]: ТЬе поде! гпри! 0 н!д1Ь 15 224 апд НеХдКХ 15 224 [1ИЕ0] [1724678937.453404531] [дпп]: Тазк 1П1Л. [1МР0] [1724678937.455679034] [дпп]: 5еХ Хазк пип [4] Рис. 7.32 ❖ Запуск функции визуального следования на основе глубокого обучения Эти команды запускают модель следования по линии. После этого доста- точно запустить файл камеры, чтобы начать выполнение примера. Установите робота Оп§тВоТ на подготовленную площадку для следования по линии. Затем на устройстве робота откройте два терминала и выполните следующие команды: # Терминал 1 на роботе: запуск драйвера камеры в режиме нулевого копирования # для ускорения внутренней обработки изображений. $ гоз2 ТаипсК огтдтпооС_Ьг1пдио сапега_тпбегла1.1аипсЬ.ру # Терминал 2 на роботе: запуск шасси робота. $ гоз2 Сзипсб огТдгпЬог_Ьг1пдир огтдспЬоб.[аипсб.ру После успешного запуска робот начнет движение по линии, как показано на рис. 7.33. Заметили ли вы, что .метод визуального следования по линии с исполь- зованием глубокого обучения более плавный? Продолжим разработку этой функции.
Рис. 7.33 ❖ Робот ОпдтВоГ с визуальным следованием по линии на основе глубокого обучения 7.6.3. Сбор данных и обучение модели Задача ясна: необходимо контролировать робота, чтобы он двигался вдоль линии. Следующим шагом является сбор данных и обучение модели. В разделе 7.4 мы уже определили путь решения задачи следования по линии: установление координатной точки и использование отклонения ее положения в поле зрения для управления направлением робота. Метод глу- бокого обучения аналогичен, но отличается способом распознавания цент ральной точки линии пути, в то время как метод управления после распо- знавания полностью совпадает. Чтобы распознать линию пути с помощью глубокого обучения, необходи- мо «научить» робота распознавать линию пути на основе большого количест- ва данных. Эго включает в себя создание набора данных, то есть нанесение координатных точек пути на собранные изображения. Каждое изображение соответствует одной позиции (х, у) и становится одним элементом данных. Серия таких данных формирует набор данных, который затем можно ис- пользовать для обучения модели. Существует множество методов сбора и разметки данных. Можно сохра- нять покадровые изображения, собранные роботом, и использовать инстру- менты для их разметки. Для Оп§тВо1 разработан специальный узел для сбо- ра и разметки данных в реальном времени. После запуска робота и камеры выполните следующую команду. # На компьютере. $ сй -/с!е7_и5/5гс/ог1.д1пЬо1:_с!е5кГор/ог1д1пЬо1:_аеер1еагп1пд/11пе_1:О11.оиег_тос1е1 $ гоз2 гип 11пе_Го11оиег_пос1е1 апоогаПоп
В работающем узле программа будет подписываться на новые темы изо- бражений, обрезать изображения и отображать их в графическом интер- фейсе. После сбора данных щелкните по центру линии пути в вертикальном направлении, чтобы завершить разметку кадра данных изображения, как показано на рис. 7.34. Рис. 7.34 ❖ Сбор и разметка данных изображения линии пути Код функции разметки данных находится в файле ог1д1пЬот_с1еер1езт1пд/11пе Го1- 1с\л/ег_тоСеУ11пе Го11о\л/ег_гт.ос1е1/гппо1:а1:1оп_тетбег_Щпс1:1Сп.ру. Заинтересованные читатели могу’ознакомиться с ним более подробно. После завершения разметки нажмите клавишу Еп1ег. Программа автома- тически сохранит результаты разметки в папке тга^е баСэзеС в текущем ка- талоге. Изображения будут иметь и.мя вид ху_[координата_х]_[координата_у]_ [ишс1].)р§, где ишс! - уникальный идентификатор изображения, что позволяет избежать дублирования имен файлов. Путем постоянной корректировки положения робота на площадке для сле- дования по линии повторяйте процесс сбора и разметки данных. Рекомен- дуется, чтобы в наборе данных содержалось не менее 160 изображений. При изменении обстановки или площадки размещения .можно также собирать дополнительные изображения для обучения, чтобы повысить адаптивность модели. Собранный набор данных представлен на рис. 7.35. МК Теоретически чем больше размеченных данных в наборе, тем больше данных будет использовано для обучения модели в будущем и тем лучше будет результат обучения. Другими словами, чем больше данных получает робот для изучения, тем лучше его резул ьгаты. После подготовки набора данных можно приступать к вводу размеченных данных в модель для обучения. Однако перед началом обучения необходимо принять важное решение: какую .модель выбрать? На сегодняшний день сверточные нейронные сети (Соп\то1нНопа1 Кен- га! №Шогкз, СМК) широко используются в области обработки изображений и естественного языка. В 1998 году Ян Лекун и его коллеги предложили ал- горитм обратного распространения на основе градиента для распознавания документов. В этой нейронной сети сверточный слой играет ключевую роль.
С увеличением вычислительных возможностей крупные СЦЦ начали демон- стрировать значительные преимущества в области обработки изображений. В 2012 году Алекс Крижевский и его коллеги предложили структуру сети А1ехК'еГ, которая выиграла соревнование по классификации изображений 1та§еМе( с преимуществом более 11 % по сравнению с ближайшими конку- рентами. Впоследствии различные исследователи предложили ряд сетевых структур, которые постоянно улучшали результаты 1ша§еКе1, среди которых классическими являются УСС, Соо§ЬеЦе( и КезКе!. Сверточная нейронная сеть состоит из входного слоя, сверточного слоя, слоя подвыборки, полно связного слоя и выходного слоя, как показано на рис. 7.36. й Ноте / (1еу_\уз / 5гс / оп... ор / оп...тд / 1т... 4е1 / 1таде_<1аЬа5е1 ху 065 061 ху 101 081 XV 117 078 6аГааО26-35 б7е60б64-3 с0а44Г36-35 00-11...5.)рд 500-1 ...5.]рд 00-11...5.]рд ху 122 077 ху 126 083 ху 137 049 сГ0е70Гб-35 Ь47с12с5а-3 964Г0268-34 00-11...5.]рд 500-1...5.]рд ГГ-11... 5.)рд XV 153 042 ху 167 077 ху 175 089 921а36с2-34 О8а5а3а2-35 58а81372-35 ГГ-11... 5.]рд 01-11...5.]рд 00-11...5.]рд ху 183 069 ху 199 062 ху 217 092 132338СС-35 16(33966-35 55765(130-3 00-11 ...5.;рд 00-11...5.]‘рд 500-1... 5.]рд ху 239 082 ху, 241 088 ху ,252 082 1(10се89с-35 За66аОЬ4-3 8Г5еГ418-34 00-11...5.]рд 500-1...5.)рд ГГ-11... 5.}рд ху 257_072_ ху,259,087 ху 260 076 1958566е-35 2Гб0412е-35 8беЗб(150-3 00-11...5,|рд 00-11...5.]рд 4ГГ-1... 5.]рд ху 273 090 ху 277 073 ху 287 087 с6906с19е-35 2606(372-35 34а5д62О-3 00-11...5.)рд 00-11...5.)рд 501-1 ...5.]рд ху 291 077 ху 302 073 ху 304 093 5е690498-34 56561(122-3 10с2ссеа-35 ГГ-11... 5.]рд 4ГМ... 5.]рд 01-11...5.)рд ху 314 080 ху 317 083 ху 320 084 с937857е-34 С010(1(36-34 0с3835а2-35 ГГ-11... 5.|рд ГГ-11... 5црд 01-11...5-1рд ху 325 088 ху 326 080 ху 328 089 ху 335 073 ху 350 077 ху 350 096 ху 357 101 ху 360 083 ху 362 082 а82а1526-35 5775231а-34 058749(12-3 5а253Г32-34 9а84б88с-34 6(1339460-3 8е8а5220-35 е376аа78-34 еО39ГбЗа-34 00-11...5.]рд ГГ-11... 5.}рд 501-1...5.]рд ГГ-11 .. 5.]рд ГГ-11... 5црд 500-1 ...5.)рд 00-11 ...5.]рд ГГ-11... 5.]рд ГР-11... 5црд ху 375 104 ху 379 104 ху 383 100 ху 388 080 ху 389 097 ху 402 096 ху 407 111 ху 408 096 ху 411 104 9465517С-35 а 1641 Ра 2-35 8467138С-35 бесе 1168-34 (173б1?7О-35 а51сРЗ(8-35 78О6С658-34 692Ра8ае-35 7664Р306-34 00-11...5.]рд 00-11...5.]'рд 00-11 ...5.]рд ГГ-11... 5.]рд 00-11 ,..5.]рд 00-11 ...5.}рд Рд-11...5.]рд 00-11...5.]рд Г(1-11... 5.)рд Рис. 7.35 ❖ Пример набора данных изображений для визуального следования Учитывая зрелость .модели и требования к аппаратному обеспечению СР11 и СР11 для ее обучения, для функции визуального следования по линии была выбрана классическая модель СЦЦ - остаточная нейронная сеть (КезИе!). КезКе! была предложена учеными из МгсгозоЕ! Кезеагсп, включая Хэ Каймин, Чжан Сянъюй, Жэнь Шаоцин и Сунь Цзянь, и выиграла соревнование 1та§еК- е! Ьаг§е 8са1е \Чзиа1 Кесо^шИоп СНаИеп^е (1С8УХС) в 2015 году. Хез№1 умело использует связи зйогТси!, решая проблему деградации модели в глубоких сетях, и является одной из наиболее широко применяемых сетей СХПЧ для извлечения признаков. Среди различных типов моделей сети КезХе! часто используется структура КезМе118, которая изображена на рис. 7.37.
Рис. 7.36 ❖ Основная структура сверточной нейронной сети ---------► Пропуск карты признаков напрямую > Пропуск карты признаков через сверточный слой 1><1 с шагом 2 Рис. 7.37 ❖ Структура сети КевМеШ Для вывода координат линии пути (х, у) необходимо изменить выход РС сети КевМе118 на 2, чтобы напрямую выводить координаты линии пути (х, у). Разрешение входного изображения для Ке^е118 составляет 224*224 пикселя. После выбора модели можно использовать такие фреймворки глубокого обучения, как РуТогсЪ или ТепзогНом1, для реализации программного кода. В нашем случае используется РуТогсЬ. После настройки среды разработки глубокого обучения выполните следу ющие команды для тренировки модели визуального следования по линии с использованием ресурсов процессора компьютера. # На компыстере. $ сС - /с1е7Дль>/ьгс/011д1пЬоГ_с!е5кГор/огтд1Г1ЬоГ_с1еер1еагп1пд/1лпе_1:ои1Л1ег_пос1е1 $ гоз2 гип 11 пеГоПсиегпсДе! Ггатптпд Процесс тренировки может занять значительное время, поэтому необхо- димо запастись терпением. После завершения процесса будет создан файл модели, как показано на рис. 7.38.
Полный код 'ренироьки модели находится в файле опд!пЬоГ_сеер1еагптд/!!пеДо1 1о\лег_тсс1е1/Гпе_ГоКомег_тос1е1Дга1П1пд_ппетЬег_Гипс1:1оп.ру. Для его изучения не обходимо обладать базовыми знаниями о глубоком обучении с использованием Ру- Того!!. Желающие могу’самостоятельно ознакомиться с материалами более подробно. 7.6.4. Оценка эффективности модели После завершения тренировки модели необходимо проверить ее эффектов ность. Если результаты удовлетворительные, модель можно использовать для дальнейшего развертывания. В противном случае потребуется коррек- тировка данных или оптимизация модели с повторной тренировкой. Для запуска программы проверки выполните следующие команды в тер- минале, чтобы показать результаты вывода модели на определенном наборе изображений. Красная точка будет отмечать центр линии пути, а в терминале будут выводиться координаты (х, у), как показано на рис. 7.39. # На компьютере. $ сб ~/с!е7_и5/5гс/огсди|ЬоГ_с1е5кГор/ог1дт.п1|о1:_Щер'1еагп1.пд/ипеД:ои1ме1 _Р1о^1 $ русЬопЗ 11пе_Гоиоиег_1тос1е1/уегИу.ру сарЬиге 1таде /Кол1е/1д1/(1еу_м5/5гс/ог1д1пЬоГ_6е5к1ор/ог1д1пЬо1_с1еер1еагп1пд/11пе_Го11окег_пю(1е 1/хп1аде_с1а1а5е1:/ху_833_О84_Тб145860- 341Д- 11ес1-8ЬбЬ-71ба7с1еб7Ьс5. ]рд 0.6835533 0.1528658 808 95 /Ноте/1д1./<1е7_и5/5гс/ог1д1пЬо1_с1е$к1:ор/ог1д1пЬо1_деер1еагпгпд/11пе_Го11.оиег_п1ос1е 1/гтаде_с1а1а5е1/ху_835_097_7еТ:5еЬе0-34ТТ- 11ес1-8ЬйЬ-716а7(1е67Ьс5. Д рд 0.7239302 0.1О671159 827 100 /Ьоте/1д‘1/деу_М5/5гс/ог1дгпЬо1_де5к1ор/ог1д1пЬо1:_6еер1еагпхпд/11пе_То11онег_п1оде 1/1таде_6а1:а5е1/ху_317_О83_с01ОбТ5е-34П:-11ес1-8Ьс1Ь-71ба7(1е67Ьс5. зрд -0.3324738 0.24783604 320 84 □_____________________________________________________________________________________ Рис. 7.39 ❖ Проверка эффективности модели на компьютере
Полный код для проверки модели находится в файле опд1пЬоГ_сеер1еагп1пд/опе_1:о1- 1с\л/ег_тобеУ11пе к>11омег_гг'осе1/уегИу.ру. Для его изучения необходимо обладать базовыми знаниями о глубоком обучении с использованием РуТогсК. Желающие мо- гут самостоятельно ознакомиться с материалами более подробно. 7.6.5. Развертывание модели на роботе После завершения тренировки и проверки модели большая часть работы по разработке глубокого обучения позади. Далее необходимо развернуть обученную модель на роботе. Возникает вопрос: возможно ли выполнение обученной модели на роботе, учитывая различия в архитектуре чипа, про- изводительности и поддержке операторов? Для развертывания используется стандартизированный процесс, как показано на рис. 7.40. Рис.7.40 ❖ Процесс преобразования и количественного развертывания модели Для развертывания модели в определенной среде можно использовать любой фреймворк глубокого обучения, такой как РуТогсН или ТспзогПош, для определения структуры сети и определения параметров через тренировку модели. Затем структура и параметры модели преобразуются в промежуточ ное представление, описывающее только структуру сети, на котором про- водятся оптимизации. Потом с использованием высокопроизводительных программных фреймворков, ориентированных на конкретное оборудование, пишется программа для эффективного выполнения операций в сети глу- бокого обучения. Ядро вывода преобразует промежуточное представление в специфичный для себя формат и эффективно выполняет модель на соот- ветствующей аппаратной платформе. Такой процесс развертывания решает следующие две основные проблемы развертывания моделей:
1) используя промежуточное представление, соединяющее фреймворки глубокого обучения и ядро вывода, разработчикам не нужно беспоко- иться о том, как запустить сложные фреймворки в новой среде; 2) благодаря оптимизации структуры сеги через промежуточное пред- ставление и оптимизации вычислений на низком уровне ядром вывода вычислительная эффективность модели значительно повышается. Далее на примере развертывания модели визуального следования за лини- ей в КИК ХЗ робота ОгщтВо! мы расскажем, как количественно развернуть модель глубокого обучения в реальной среде. Мы завершили первый этап обучения модели, теперь осталось выполнить промежуточное представление и вывод с помощью ядра. Эта задача включа- ет два промежуточных процесса - преобразование модели и развертывание на плате, 1 Преобразование модели Прежде чем подробно рассмотреть преобразование модели, необходимо рассказать о формате Ореп Кенга! К'е!луогк Ехсйап^е (ОК’МХ). Это формат, выпущенный Мега (ранее Еасейоок) (компания Мега признана экстремист- ской на территории Российской Федерации) и М!сго5ой в 2017 году для стан- дартизированного описания вычислительных графов. В настоящее время при поддержке нескольких организаций СЖХХ интегрирован с различными фреймворками глубокого обучения и ядрами вывода и рассматривается как мост между ними, подобно промежуточному языку компилятора. ОХКХ может показаться сложным для понимания и использования, но в процессе преобразования модели достаточно использовать интерфейсную функцию 1огсй.оппх.ехроП. СогсЬ.оппх.ехрогс(годе!, х, 11. /Ье51_Ппе_1:сис111ег_пос!е1_ху. оппх", ехрогС_рагал5=Тгие, ор5.еОтег51оп=11, с1с_сспзГапг_Го'1<йгд=Тг1'е, 1приГ_папез=['тприС ], опгриГ_пэпез=['оигри!' ]) Функция 1огсй.оппх.ехроП встроена в РуТогсй и предназначена для пре- образования модели в формат (ЖКХ. Первые три параметра функции ука- зывают модель для преобразования, произвольный набор входных данных модели и имя экспортированного файла СЖКХ. При преобразовании модели необходимо указать исходную модель и имя выходного файла, что является логичным, но почему требуется предоставить набор входных данных? Пере- ход от модели РуТогсй к модели ОККХ по сути является переводом на дру- гой язык, требующим полного анализа кода исходной модели и записи всех управляющих потоков, как это делает компилятор. Поэтому, предоставив набор входных данных и выполнив модель, можно зафиксировать вычис-
лительный граф, соответствующий этим входным данным, и сохранить его в формате ОХХХ. Функция ехрог! использует метод отслеживания экспорта, требующий предоставления произвольного набора входных данных для «за- пуска» модели. Среди оставшихся параметров орзеГуегыоп указывает на версию набора операторов ООХ, а шриГпашеБ и оиГрЩпатез являются именами входных и выходных тензоров соответственно. В среде разработки глубокого обуче- ния робота Оп§шВо1 выполните следующую команду для генерации модели ОХХ’Х Полученная модель показана на рис. 7.41. $ сс! -/с1е7_и5/5гс/ог1д1пЬо1:_с1е5кСср/сгтд1пЬоС_с1эер1еагп1пд/1Лпе_1:си(»1ег_пос1е1 $ гоз2 гип 14ле_1о11оиег_пос1е1 десегаТе_оппх После завершения преобразования необходимо, чтобы модель ОХХХ работала в оптимизированной среде вывода на плате, соответствующей аппаратному обеспечению. Если СШХХ не поддерживает это, потребуется дальнейшее преобразование модели в поддерживаемый формат, что требует использования ИИ-инструментов, то есть инструментов для преобразования модели. Робот Оп§тВо1 использует КПК ХЗ в качестве «мозга» и обладает ИИ-яд- ром с производительностью 5 ТОР8. Если разворачивать модель на этом ядре, необходимо использовать соответствующую инструментальную ИИ-цепочку для быстрого преобразования модели ОХХХ в формат .Ып. ЛЬ Подсобные инструкции по преобразованию нодели с использованием инструмен- тальной цепочки К1ЖХЗ можно найти на официальном сайте ОпдюВоТ. 2. Развертывание на плате После преобразования модели получается Фиксированная модель, готовая к запуску на КПК ХЗ. Как развернуть ее на КПК ХЗ для реализации функций захвата изображений, вывода .модели и управления движением? Скомпи лированную фиксированную модель ге.<>пе118_224х224_пу12.Ып необходимо скопировать в папку тойе! пакета 11пе_&11оугег_регсерПоп на стороне Огщ- шВоГ, заменив существующую модель, а затем заново скомпилировать рабо чее пространство. После компиляции можно развернуть модель с помощью следующей команды, где параметры тобе1_ра11т и тобе1_пате указывают на путь и и.мя модели.
# На роботе. $ с<1 /и^егйаЬа/Неу^з/ггс/огтдтпЬог/огтд-.пЬот ^еер^еагптпд/Ипе^оиоие! _регсерНоп/ $ гоз?. гип 11пе_Го11оиег_регсерг1сп Иг.е_то',Лоыег_регсер'Ггоп --го5-агд5 -р нос1е1_рабЬ: =поие! /геь пе Г 18_224х224 п V12. Ел п -р 1чос1е1_папе:=ге',пег18_224х224_лу12 Затем, следуя инструкциям из раздела 7.6.1, выполните запуск камеры и шасси робота, и робот начнет движение по линии! 7.7. Приложение машинного обучения 2. Обнаружение объектов с помощью УОШ Обнаружение объектов является одной из ключевых задач в области ком- пьютерного зрения. Задача заключается в том, чтобы, получив изображение или кадр видео, компьютер смог определить местоположение объекта и его тип, то есть выдать ограничивающую рамку (ВошмПп§ Вох) и соответствую- щую метку. Категории и местоположения объектов, полученные в результате обнаружения, являются важным инструментом в понимании окружающего мира роботом и выполнении им сложных задач. Например, робот, оснащен- ный манипулятором, может использовать обнаружение объектов для визу- ального захвата. Робот с подвижными частями может осуществлять слежение за объектом и т. д. Метод «Смотрим лишь раз: унифицированное обнаружение объектов в реальном времени» (Топ Оп1у Ьоок Опсе: ИпШей, Кеа1-Т1те ОЬ)есГ Ве- 1есНоп, УОЬО) представляет собой алгоритм, объединяющий обнаружение объектов с применением глубокого обучения в робототехнике. В этом раз- деле мы изучим, как развернуть обнаружение объектов с помощью ТОЬО на реальном роботе, что поможет углубить навыки применения глубокого обучения. 7.7.1. Основные принципы и структура реализации Прежде чем использовать алгоритм ТОЪО, необходимо понять основные принципы и процесс машинного обучения. Помимо шести шагов, описанных в разделе 7.6.1, процесс машинного обучения обычно делится на три части, известные как три кита машинного обучения: стратегия (модель), функция потерь и алгоритм оптимизации. 1. Стратегию (модель) можно сравнить с учеником или мастером. Это конкретная сущность, предназначенная для выполнения определен- ной задачи или решения проблемы. В машинном обучении стратегия означает выбор и архитектуру модели. 2. Функцию потерь можно рассматривать как наставника или стандарт оценки для стратегии (модели). Она количественно оценивает раз-
ницу или «потери» между предсказаниями модели и фактическими наблюдениями. 3. Алгоритм оптимизации подобен «дирижеру» в процессе обучения мо- дели. Он направляет модель в правильном направлении, минимизируя потери. В области компьютерного зрения обычно выделяют три типа задач: клас- сификация объектов, обнаружение объектов и семантическая сегментация, как показано на рис. 7.42. Рис. 7.42 ❖ Классификация объектов, обнаружение объектов и семантическая сегментация До появления алгоритма ТОЬО в области обнаружения объектов обычно использовались двухэтапные алгоритмы, такие как К СКМ или Разг К СЛ’М. Общая идея этих алгоритмов заключается в предложении и классификации (ргороза! предоставляет информацию о местоположении, классификация - о категории). Хотя такие алгоритмы обеспечивают высокую точность рас- познавания, их скорость работы оставляет желать лучшего. Когда двухэтапные алгоритмы были на пике популярности, появилось но- ваторское решение -- УОЬО, которое объединило оба этапа в один, превратив шись в одноэтапный алгоритм. На выходном уровне одновременно выдаются и классификация объектов, и их местоположение. С точки зрения машинного обучения, это превращает задачу классификации в задачу регрессии. Почему ХОЬО работает так быстро? Взгляните на рис. 7.43. Рассмотрим следующую стратегию: когда изображение поступает в сеть ХОЬО, алгоритм делит его на сетку фиксированного размера. Для каждой ячейки сетки УОЬО использует сверточную нейронную сеть для однократ- ного прямого прохода, предсказывая фиксированное количество ограни- чивающих рамок, каждая из которых содержит пять основных атрибутов, приведенных ниже. О Координата х центра ограничивающей рамки (Ьх): обычно это зна- чение, выраженное в долях от ширины изображения, в диапазоне от О ДО 1. О Координата у центра ограничивающей рамки (Ьу): обычно это зна- чение, выраженное в долях от высоты изображения, в диапазоне от О ДО 1. О Ширина ограничивающей рамки (Ьш): обычно это значение, вы- раженное в долях от ширины изображения.
О Высота ограничивающей рамки (Ы1): обычно это значение, выра- женное в долях от высоты изображения. О Уверенность (сопГ): это значение в диапазоне от 6 до 1, которое от- ражает уверенность модели в том, что в ограничивающей рамке со- держится целевой объект, а также точность предсказания самой рамки. Ограничивающая оамка и достоверность Вероятность классификации Рис. 7.43 ❖ Идея алгоритма УОШ Кроме этих пяти параметров, ТОЪО также выводит вероятность класса для каждой ограничивающей рамки. Эти вероятности показывают уверенность модели в том, что в рамке содержится объект определенного класса. Напри мер, если модель УОЬО обучена для обнаружения объектов трех классов, го для каждой рамки модель также выводит три вероятностных значения, соответствующих этим классам. После выполнения вышеуказанных шагов можно получить информацию о возможных объектах в каждой сетке. Как же оценить точность предсказания? Здесь вступает в действие функция потерь ТОЬО, которая учитывает точность регрессии положения объекта, уверен- ность в наличии объекта и точность предсказания класса. Конкретно функ- ция потерь включает нижеприведенные компоненты. О Ошибка положения (ВоипсИп^ Вох Ве^геьяюп Ьо&з): измеряет раз- ницу между предсказанным положением ограничивающей рамки и ис- тинным положением. О Ошибка уверенности (ОЪ]ес1 Сонйбенсе Ьовя): оценивает уверен- ность модели в наличии объекта. О Ошибка класса (С]авз Ьоья): используется в задачах классификации и измеряет потери кросс-энтропии между предсказанным классом и истинным классом.
Цель оптимизации заключается в минимизации взвешенной суммы этих трех компонентов потерь, путем настройки параметров модели с помощью обратного распространения, чтобы функция потерь достигла минимального значения. После этого получаются предсказанные данные в каждой сетке. Но воз- никает проблема: один и тот же объект может быть выделен несколькими ограничивающими рамками. В этом случае ТОЮ предлагает очень эффек- тивный метод, известный как подавление немаксимумов (Моп-Махлтшп Знрргеззюп), который отбирает лучшие ограничивающие рамки на основе уверенности и степени перекрытия, завершая тем самым очень эффектив- ный процесс обнаружения объектов. С развитием области искусственного интеллекта алгоритм ТОЮ также быстро эволюционирует, как показано на рис. 7.44. УО1_Оу1 УОЮуЗ УОЬОХ УО.ОР РР-УОЮу2 УО1_Оу8 2015 год 2016 год 2018 год ЗД20 год 2021 год 2022 год 2023 год Зса1ес1 УОШу2 О.ОгЧ РР-УОШ ' 01-075 УОЮтб ОАМО УОЮ РР-УОЮЕ УОЮу7 УОЮуб Рис. 7.44 ❖ Временная шкала эволюции алгоритма УОШ 7.7.2. Развертывание обнаружения объектов с помощью ТОЮ Прежде чем приступить к развертыванию алгоритма ТОЮ, рекомендуется сначала ознакомиться с результатами его работы. 1. Переключение ветки кода # Сначала выполнить команду дИ с'Юпе для загрузки кода У0Юу5 и переключиться # на ветку >/2.0 для совместимости с операторами, поддерживаемыми на плате. $ дП сЬескоиГ у2.Э 2, Настройка среды Сопда, загрузка зависимостей # Создание новой среды Сопйа с именем уо!о75 и указанием версии РуЩоп 3.7. $ сопба сгеаге -п уоТоуЗ ругЬоп=3.7 # Активация среды Сопйа с именем уо1оу5. $ сопс!а асСОаГе уо!ос5
# Установка РуТогсй, ГогсЬутзгоп, СэгсйаиШо и поддержки СОРА 11.7 в активированной среде. $ сог>бг спзСаП русогсЬ Тогсйусвгоп УогсНаисКо рутогс11-сиаа=11.7 -с ругогсН -с путсИа # Установка всех РуЙюп-пакетов, перечисленных в файле геоитгепепРвЛхР. $ ртр т.пьЬаИ -г гериггетеп1ь. 1х1: -г Нббрь://рург.УиГ1а.ОоъпдЬиа.еди.сп/гУтрУе # Установка библиотеки арех. $ ртр спьйаП аэех -г ЬСЩь://рург.гипа.1:51|1дпиа.ес1и.сп/51|1р1.е 3. Проверка базовой среды $ руИтопЗ с!ебесб.ру --гоигсе ./тпГегепсе/ттадез/ -ие1дМ.ь уоТоуЬз.р! --сопТ 0.4 После выполнения всех команд можно увидеть результаты обнаружения объектов, как показано на рис. 7.45. Рис. 7.45 ❖ Официальный пример УОЬОуБ УОЬОу5 имеет пять версий: УОЬОу.5п, УОЬОу5з, УОЬОубт, УОЬОу51 и ТО Ь0у5х, как показано на рис. 7.46. Структура этих моделей в основном одина- кова, различия заключаются в параметрах глубины модели (с1ср11т_ти1Нр1е) и ширины модели 0лпс№_тиШр1е). ТОЬОуЗп является сетью с наименьшей глубиной и шириной карты признаков в серии УОЬОу5 и оптимизирована для мобильных устройств с малой вычислительной мощностью. Остальные четыре версии постепенно увеличивают глубину и ширину для обеспечения более высокой эффективности и точности.
Мало ГО1_Оу5п 8та11 УО1_Оу5з Меб!ит УОХОубт Ьагде УОЬОу51 Х1_агде УО1_Оу5х 4 МВ 14 МВ 41 МВ 89 МВ 166 МВ 6.3 ГП8 , „ 6 4 тз „„ 8 2 тз,, 10 1 тз 4 12 1 тз 28.4 тАРгпгп 37.2 тАР„_ 45 2 тАР„_ 48 8 тАРг 50 7 тАР^ Рис. 7.46 ❖ Версии алгоритма УО1_Оу5 7.7.3. Сбор данных и обучение модели На роботе ОгццпБоТ развернута функция распознавания футбольного мяча на основе УОЬОуВ. После подключения к роботу выполните следующие команды. # Терминал 1 робота: запуск узла распознавания футбольного мяча. $ гоз2 гип оТ.ау-ГооСЬа'Н р1ау_РооТ:Ьа11 # Терминал 2 робота: запуск узла камеры. $ гоз2 ТаипсН оггдгпЬоС_Ьг1пдир сапега_1пТегпа1.1аипсЬ.ру После выполнения команд на экране появится интерфейс, показанный на рис. 7.47, где в терминале будет выведена информация о положении, типе и вероятности того, что объект является футбольным мячом. ГП гооЦЗЩЬипЕи: - О = - ® х гооХ@иЬипХигоз2 гип р1ау_ХооХЬа11 р1ау_ХооХЬа11 [1МР0] [1724688840.367779288] [дпп]: №с!е хп1Л. [1ЫРО] [1724688840.368326954] [<1пп]: Мобе! хпхХ. [ЕазуОЫЫ]: ЕазуОЫМ уегзхоп = 1.6.1_(1.18.6 Омм) [ВР1)_Р1_АТ]ВРи РГаХГогп Уегзхоп(1.3.3)! [НВРТ] зеХ Год ХеуеГ аз 0. уегзхоп = 3.15.25.0 [ОМ] КипХхпе уегзхоп = 1.18.6_(3.15.25 НВКТ) [А][ОММ][раскеЬ_тоде!.срр:234][Моде1](2924-08-27,00:14:60.761.166) [НогхгопРТ] ТЬе поде! Ьих1с1ег уегзхоп = 1.8.7 [1ЫР0] [1724688840.887528549] [с)пп]: ТЬе тос!е1 хприХ 0 игсПЬ хз 672 апд НехдЬХ гз 672 [ПАРИ] [1724688840.887679041] [дпп]: Рип 4еХаи1Х ЗеХОиХриХРагзег. [КАРМ] [1724688840.887750224] [<1лп]: 5еХ оиХриХ рагзег ихХЬ йеГаиГХ Ьпп пос)е рагзег, уои нгИ деХ аХГ оиХриХ Хепзогз апд зЬоиГЬ рагзе оиХриХ_Хепзогз хп РозХРгосезз [1МР0] [1724688840.887800444] [дпп хпрГ]: 5еХ деХаи!. X оиХриХ рагзег [11ЧГ0] [1724688840.888211579] [дпп]: Тазк ХЛХГ. [1МЕ0] [1724688840.889905339] [дпп]: 5еХ Хазк_пигп [4] [1МЕ0] [1724688840.931662007] [доп]: Хазк хд: 3 зеХ Ьри соге: 2 [ШАРМ] [1724688840.932734835] [дпп]: Тгу 1о гезеХ дпп хпХег сХг! рагат [ЫАРМ] [1724688840.932899789] [дпп]: Рип хпХег зиссезз аХХег гезеХ дпп хпХег сХгХ рагат. Тазк рага зеХ нх!1 Ье епаЫе! [1ЫР0] [1724688841.012233640] [р1ауГоо1Ьа11_побе]: гох гесХ: 518.656 335.03 671 501.789, гох Хуре: ГооХЬаП, зсоге:0.6651 5 [1ЫЕ0] [1724688841.032091869] [р1ауГоо1Ьа11_поде]: гох гесХ: 503.933 350.981 671 499.579, гох Хуре: ГооХЬаП, зсоге:0.620 173 [1МР0] [1724688841.084920190] [р!ауРооХЬа11_по<1е]: гох гесХ: 490.572 360.296 671 498.137, гох Хуре: ГооХЬаИ, зеоге:0.616 031 [1МР0] [1724688841.146262895] [р1ау1=ооХЬа11_по(1е]: го! гесХ: 474.864 359.097 671 500.666, гох Хуре: ХооХЬаИ, зеоге:0.467 318 [ПЧРО] [1724688841.204712585] [р1ауХооХЬа11_побе]: гох гесХ: 464.936 364.861 671 498.114, гох Хуре: ХооХЬаП, зеоге:в.444 0Й2___________________________________________________________________________________________________________________________
Далее объясним подробно, как реализована эта функция обнаружения объ- ектов. Процесс развертывания на плате показан на рис. 7.48. Рис. 7.48 ❖ Процесс развертывания глубокого обучения на плате Процесс сбора данных аналогичен описанному в разделе 7.6,3. Запустите узел одновременного сбора и разметки данных с помощью следующих команд. $ с<1 ~/с)е7_и5/5гс/сг1д1пЬоС_^е5ктор/ог1д1пЬсГ_с1еер'!.еагп1пд/уо1.о_с;еГесНоп $ г оз? гип спаде_аппо1:агтоп аппосаНоп После запуска будет выводиться изображение в реальном времени, как по- казано на рис. 7.49. Щелкните по экрану, чтобы зафиксировать текущий кадр. Нарисуйте прямоугольник с помощью мыши и выберите категорию, нажав клавиши 1, 2 и т. д. После разметки всех объектов в кадре нажмите клавишу ЕпЛег, чтобы сохранить изображение и метку в указанную папку. Для выхода из функции разметки нажмите клавишу О. Рис. 7.49 ❖ Сбор и разметка данных изображений Путь сохранения можно изменить в кеде.
После завершения сбора и разметки данных начинается этап обучения модели. Какую версию ТОЬО следует выбрать? Для разработки и разверты- вания на роботе не всегда лучше использовать самую новую версию. Не- обходимо учитывать поддержку всех операторов как при преобразовании модели, обученной в РуТогсЬ/ТепзогПоад, в промежуточный файл (ЖИХ, так и при дальнейшем преобразовании этого файла в оптимизированный формат для конкретной аппаратной платформы. В этом процессе поддержка ядра вывода и связанных инструментов крайне важна, так как они долж- ны правильно интерпретировать и оптимизировать вес операторы модели. Если некоторые новые операторы или структуры не поддерживаются, это может привести к неудачному преобразованию или снижению эффектив- ности. Изучив список поддерживаемых операторов робота Оп§тВоГ с КИК ХЗ, можно увидеть, что алгоритм версии УОЕО\’5 2.0 поддерживает больше опе- раторов. Это означает, что вероятность успешного выполнения данной вер сии на плате выше. Поэтому здесь мы выберем алгоритм версии ХОЬСЛ/5 2.0. После настройки среды разработки ТОЬО, описанной в разделе 7.7.2, мож- но использовать размеченные данные для обучения собственной .модели на компьютере. $ руГЬоп Ггадп.ру --гнд 672 --ЬаГсЬ 16 --еросЬз 1 --СаГа /боше/Ед! /уо!о/с1а1:а/с1а1:а/с1ага.уат1 -летдИСь уоТоуБз.рС Процесс обучения .может занимать .много времени, проявите терпение. В терминале будет постоянно обновляться прогресс выполнения, как по- казано на рис. 7.50. Рис. 7.50 ❖ Процесс обучения модели УОЬО
После завершения обучения в выходном каталоге появятся результаты оценки модели, как показано на рис. 7.51. Рис. 7.51 ❖ Результаты оценки модели Кроме того, в каталоге \\ге1§Ь1з можно найти файл ЬезГ.рГ, который явля- ется моделью, сгенерированной после обучения. Затем необходимо преоб- разовать .модель в файл промежуточного представления 0№Х и развернуть на роботе Оп§тВо1 КПК ХЗ в формате .Ып. Процесс аналогичен описанному в разделе 7.6.5, поэтому здесь мы не будем повторяться. ЛЬ Подробные инструкции по преобразованию и количественной оценке модели можно также найти на официальном сайте ОпдтВоГ. Эффективность работы модели в формате .Ып, развернутой на роботе Оп§тВо1, показана на рис. 7.52. Модель может в реальном времени точно распознавать футбольные мячи на изображении. Рис. 7.52 ❖ Обнаружение объектов с помощью'/01_0
7.7.4. Обнаружение целей и следование робота за ними После завершения обучения и преобразования модели можно скопировать файл .Ып на Оп&тВоТ, чтобы робот начал действовать. На основе обнаружения футбольных мячей можно реализовать распо знавание и следование за движением футбольного мяча, а также функцию удара по мячу. # Терминал 1 робота. $ гоз2 гип рТау_ГоотЬгТТ р1ау_ГооГЬаП # Терминал 2 робота. $ гоз2 ТаипсЬ оггди|Ьо1:_1)г1лдир сапега_т.М:ег11а1..1аи11с11.ру # Терминал 3 робота. $ гоз2 ТаипсЬ оггдгпьос_Ьг1пдир огтдспЬоГ. 1аипс1т.ру После запуска можно наблюдать, как Оп§тВоГ следует за футбольным мячом, как показано на рис. 7.53. Риг. 7.53 ❖ Робот ОпдгпВоГ использует УОЮ для обнаружения объекта и следования за ним В разделах 7.6 и 7.7 подробно рассматривается процесс применения машинного обучения в робототехнике, включая множество теоретических и практических аспек- тов. За дополнкгельной информацией вы можете обратиться к другим источникам, а также к материалам на официальном сайте ОпдтВоГ.
7,8. Резюме Б этой главе мы начали с основных принципов машинного зрения, изучили методы сбора и калибровки данных камеры, а затем сосредоточились на использовании ОрепСУ для разработки зрения робота. Также мы рассмот рели ограничения ОрепСУ в обработке визуальных данных и объяснили, как с помощью глубокого обучения можно решить задачи визуального распо- знавания В процессе применения глубокого обучения в робототехнике на примере Оп&тВоГ было показано, как проводить обучение, преобразова- ние, количественную оценку и развертывание ИИ-моделей. Глава содержит множество теоретических и практических аспектов машинного обучения, которые можно дополнительно изучить, обратившись к другим источникам и подробным инструкциям на официальном сайте Оп§1пВоГ. Далее перейдем к следующему разделу: 8ЬАМ и автономная навигация!
Глава Построение карт с помощью КО$ 2: роботы понимают окружающую среду В повседневном взаимодействии с роботами, возможно, у вас возникал во прос: как робот-доставщик понимает, куда в точности нужно доставить еду? Каким образом робот-пылесос способен убрать каждый уголок дома? Как беспилотные автомобили могут так хорошо ориентироваться на дороге? За всеми этими вопросами стоит важная технология - ЗЪАМ, или метод одно- временной навигации и построения карт. 8.1. Принципы построения карт с помощью 5ЬАМ Закройте глаза и представьте, что вы находитесь в неизвестной комнате. Вы хотите понять, что находится вокруг, поэтому протягиваете руки и медленно ощупываете стены вокруг себя, двигаясь вдоль них. Вскоре вы чувствуете, что вернулись в знакомое место, и понимаете, что комната имеет форму прямоугольника, а вы находитесь у одной из ее стен. Таким образом вы составили приблизительную карту неизвестной среды и определили свое местоположение. Теперь можно открыть глаза и вспомнить свои действия - это и есть 8ЬАМ. Ваши руки выступают в роли сенсоров, а полученный результат - это вос- принятая карта и информация о местоположении.
8,1.1. Что такое 5ЬАМ Простыми словами, 8ЬАМ (ЗппиНапеоиз ЬосаИхаНоп Лпс! Маррт^ - одно- временная навигация и построение карт) - это процесс, при котором робот попадает в неизвестное пространство, не зная своего местоположения и окружающей среды. Затем он с помощью сенсоров постепенно форми- рует представление об окружающей среде и определяет свое местополо- жение. Здесь появляются два ключевых понятия: автономная навигация и по- строение карт. Они означают, что робот в неизвестной среде одновременно определяет свое местоположение и строит карту, в результате чего получает новую информацию, как показано на рис. 8.1. Рис. Г.1 ❖ Схема построения карты с помощью 81АМ Если представить 8ЕАМ как черный ящик, то на входе он получает ин- формацию от сенсоров робота, включая внешние сенсоры для восприятия окружающей среды и внутренние сенсоры для восприятия собственного со- стояния. А на выходе - результаты местоположения робота и карту окружа- ющей среды. Результаты навигации легко понять: это координаты х, у, 2 робота и углы его ориентации. Если робот находится на улице, возможно, добавится инфор- мация о координатах С1Р8. А что же представляет собой карга окружающей среды? На рис. 8.2 показаны различные изображения, которые являются примерами карт, созданных с помощью 8ЪАМ. Они описывают окружающую среду и могут быть представлены в виде сетчатых карт, облаков точек, раз- реженных карт точек и топологических карт. Строго говоря, 8ЕАМ не является конкретным алгоритмом, а представляет собой технологию, для реализации которой существует множество алгорит-
мов. Сегодня ЬЬАМ стал неотъемлемым навыком мобильных роботов, что подчеркивает его значимость. Рис. 8.2 ❖ Примеры карт, созданных различными алгоритмами 51_АМ Беспилотный летательный аппарат, оснащенный трехмерной камерой и лазерным дальномером, исследует ранее неизвестный дом, как показано на рис. 8.3. Дом большой, и оператор стремится создать карту каждого этажа с помощью робота. Для этого он дистанционно управляет дроном, наблюдая за обстановкой в помещении через бортовую камеру. Одновременно с этим трехмерная камера и дальномер, используя алгоритм 8БАМ, строят карту окружающей среды, представленную на трехмерной карге слева на рисун- ке. По мере того как робот завершает исследование каждого этажа, карга окружающей среды постепенно дополняется, в итоге отображая внутреннее состояние всего дома, то есть полную карту, созданную с помощью ЬЬАМ. Рис. 8.3 ❖ Построение карты с помощью 81АМ на дроне Следуя описанному процессу 8БАМ, можно запустить дрон в неизвестное пространство, в которое человек не может войти напрямую, и, управляя им дистанционно, быстро создать полную карту этого пространства. Подобные
функции могут быть полезны для обследования местности после природных катастроф, дистанционного обследования лесов без участия человека, а так- же в различных военных сценариях. Технология 8БАМ позволяет не только строить карту окружающей среды на основе статических объектов, но и обрабатывать динамические сцены. Бес- пилотный автомобиль действует в чрезвычайно сложной системе, в которой на дороге присутствуют не только дороги, здания и светофоры, но и мно- жество пешеходов и транспортных средств. В таких условиях автомобиль должен с помощью различных датчиков комплексно воспринимать инфор мацию об окружающей среде, динамически строить карту и одновременно распознавать, где находятся люди, здания и другие автомобили, чтобы по- зволить системе управления принимать правильные решения о движении. Алгоритм 81АМ в беспилотном автомобиле в режиме реального времени строит карту дорожной обстановки, используя облако точек от трехмерного дальномера, для выполнения задачи вождения, как показано на рис, 8.4. Рис. 8.4 ❖ Построение карты с помощью ЫАМ в беспило’ном автомобиле 8.1.2. Основные принципы 8ЬАМ После ознакомления с основными понятиями технологии 8Г.АМ перейдем к изучению ее основных принципов. Мы уже знаем, что существует мно- жество алгоритмов, реализующих технологию 8ЬАМ. В этом разделе будет рассмотрена типичная структура, используемая большинством алгоритмов. В типичной структуре алгоритма 8БАМ выделяются две части: фронтенд и бэкенд, как показано на рис. 8.5. Фронтенд обрабатывает входные сырые данные, а бэкенд выполняет глобальную навигацию и замыкание карты.
Рис.8.5 ❖ Типичная структура алгоритма ЕЬАМ Данные, полученные ог внешних сенсоров и сенсоров положения, ис- пользуются в качестве входных данных для системы 8 БАМ, как показано на рис. 8.6. Выход Траектория положений Карта окружения Рис. 8.6 ❖ Функции фронтенда и бэкенда алгоритма 51_ЛМ Фронтснд 8БАМ использует входную информацию от сенсоров для вы бора, извлечения и сопоставления различных ключевых точек, получает из них оценку движения между кадрами и описание локальных ориентиров и определяет положение за короткий промежуток времени. Бэкенд 8 БАМ продолжает оценивать состояние системы и неопределен- ность на основе результатов фронтенда, выводит траекторию движения
и карту окружающей среды. Обнаружение замыкания (Ьоор СЛознге) путем сравнения текущей сцены с историческими данными определяет, была ли посещена ранее текущая позиция, что позволяет скорректировать отклоне- ние траектории. Алгоритмы бэкснда являются ядром технологии 8ЬАМ и способны осущест- влять глобальную оценку состояния, используя такие методы, как фильтрация и оптимизация. До 2000 года в бэкенде 8ЬАМ преобладали методы фильт- рации, однако они имели проблемы с накоплением ошибок, линейными ошибками и большими объемами выборки. Оптимизационные методы, на- против, более эффективно используют исторические данные, сочетая в себе эффективность и точность, и постепенно становятся основной методикой. В результате этого сложного процесса получается траектория движения, соединяющая позиции робота в реальном времени, а также карта окружаю- щей среды. 8.1.3. Оптимизация бэкенда $1_АМ У различных реализаций 8ЬАМ существуют различия в реализации фронтен да и бэкенда. Алгоритмы фронтенда требуют обработки различных входных данных от сенсоров. Например, сопоставление ключевых точек для визуаль- ных алгоритмов или межкадровое сопоставление для алгоритмов на основе дальномера. Это необходимо для извлечения и сопоставления ключевых точек или характеристик, чтобы оценить движение сенсоров и изменения в окружающей среде. Алгоритмы бэкенда обычно отвечают за оптимизацию всей карты и маршрута, обеспечивая глобальную согласованность и досто- верность. Только благодаря совместной работе фронтенда и бэкенда система 8ЭАМ может строить точные карты в неизвестной среде и осуществлять ав- тономное позиционирование. Алгоритмы бэкенда можно разделить на две основные категории: алго- ритмы оптимизации графов и алгоритмы оптимизации на основе фильтров. 1. Алгоритмы оптимизации графов Алгоритмы оптимизации графов представляют задачу 8ЬАМ в виде графа, где «граф» относится к структуре данных в вычислительной технике, содержа- щей узлы и ребра В 81АМ полный граф представляет весь процесс движения, где узлы обозначают позиции робота или ключевые точки на карте, а ребра отражают относительные связи между этими позициями или точками. Например, если обозначить два узла как X, и Х2, их связь можно предста- вить как преобразование от Хх к X, (обратное Хх умножается справа на Х2). Таким образом формируется граф, состоящий из множества узлов и ребер Цель оптимизации графа заключается в минимизации накопленных ошибок в процессе 81АМ. Когда робот перемещается отХ1 кХп, он может обнаружить, что характеристики окружения X, схожи сХг Это явление реализуется через обнаружение замыкания цикла, результаты которого помогают роботу опре-
делить относительное положениеX, иХп на основе двух эталонных значений: прямого наблюдения отХ1 к Хп и накопленного пути через промежуточные узлыХ,,Х, ит. д. Алгоритмы оптимизации графа с помощью нелинейных ме- тодов, таких как метод Гаусса-Ньютона или метод Левенберга-Марквардта, минимизируют ошибку между этими двумя эталонными значениями, тем самым оптимизируя позиции всех узлов и точность карты. Предположим, что робот осуществляет навигацию в закрытом помещении, как показано на рис. 8.7. Робот стартует с точки Х1 и следует по маршруту через несколько промежуточных точек (Х2, Х3, ..., X ,) до точки Х„. Из-за ошибок датчиков и влияния внешней среды каждое перемещение может вносить небольшие ошибки в оценку положения, которые со временем на- капливаются, Если в точке Х„ робот обнаруживает, что окружающая среда очень похожа на ту, что была в Хр он с помощью обнаружения замыкания цикла может определить, что вернулся в близкое к начальной позиции место. В этот момент алгоритм оптимизации графа добавляет новое ограничение между Х1 иХя и корректирует положение всех узлов, чтобы оценка положения всего маршрута соответствовала новому ограничению, тем самым уменьшая накопленную ошибку в Хп. X Ряс. 8.7 ❖ Алгоритм оптимизации графа Процесс оптимизации графа позволяет значительно скорректировать ошибку, накопившуюся в Х„. Алгоритм использует новую информацию, предоставленную обнаружением замыкания цикла, чтобы «выпрямить»
оценку положения всего маршрута, делая ее более соответствующей фак- тическим наблюдениям окружающей среды. В настоящее время алгоритмы оптимизации графа являются основными в бэкенде 8ЬАМ. К ним относится алгоритм СаПо§гар1тег, который будет использоваться в последующих раз- делах этой главы. 2. Алгоритмы оптимизации на основе фильтров Алгоритмы оптимизации на основе фильтров решают задачи локализации и построения карты робота в неизвестной среде с помощью рекурсивной оценки. Основной принцип заключается в использовании для непрерывно- го обновления оценки состояния робота байесовских фильтров, таких как фильтр Калмана, расширенный фильтр Калмана или фильтр частиц. Весь процесс включает прогноз состояния, фактические измерения, ассоциацию данных и обновление состояния. При использовании в 5ЪАМ алгоритмов на основе фильтров каждое пере- мещение или наблюдение робота рассматривается как шаг обновления, в ко- тором состояние робота включает в себя положение (местоположение и ори- ентацию) и частичную информацию о карте окружающей среды. Каждый раз, когда робот перемещается из одного места в другое или осуществляет наблюдение с помощью своих сенсоров, фильтр обновляет оценку состояния. Предположим, что робот осуществляет навигацию в закрытом помеще- нии, как показано на рис. 8.8. Робот начинает с начальной точки и собирает данные об окружающей среде с помощью сенсоров. В процессе перемещения робот, достигая нового положения, использует эти данные для обновления своего понимания окружающей среды. Метод на основе фильтров использует эти непрерывные данные наблюдений для рекурсивного уточнения оценки положения робота через этапы прогнозирования и обновления. На этапе предсказания фильтр использует управляющие входные данные робота (например, данные одометрии или 1МП) для прогнозирования его возможного нового положения. На этапе обновления, когда робот выполни ет наблюдение, фильтр сравнивает наблюдаемые данные с предсказанным состоянием и корректирует оценку, чтобы уменьшить расхождение меж- ду прогнозом и фактическими наблюдениями. Этот процесс повторяется, и с течением времени точность оценок постепенно повышается. Таким образом, 8ГАМ на основе фильтров может эффективно справляться с шумом сенсоров и неопределенностью в окружающей среде, постепенно создавая детальную карту окружающего пространства и в реальном времени обновляя оценку положения робота. Преимущества и недостатки данного алгоритма очевидны: при обновле- нии данных алгоритм сравнивает предсказания только с текущими факти- ческими значениями, игнорируя ранее предсказанные данные, что делает вычислительные затраты на каждое обновление практически постоянными и небольшими. Однако если в предыдущих данных присутствуют ошибки, исправить накопленные ошибки в данных 8ЬАМ невозможно. К распростра- ненным алгоритмам 8ЪАМ на основе фильтра относится Сшаррш§ и др.
Рис. 8.8 ❖ Процесс оптимизаыии на основе фильтра 8.2. Построение карт с помощью 51_АМ Тоо1Ьох ЗЬАМ Тоо1Ьох - эго открытая платформа для алгоритмов 8ЕАМ, созданная Стивом Маценски в компании ЫтЬе КоЬоПсз. Она поддерживает интеграцию данных от различных сенсоров, таких как лазерные дальномеры, камеры и ШЕЕ Алгоритмы используют метод ВцпсИе АсЦцз^теп! (блочное уравнива- ние) для оптимизации положения робота и карты. Эти алгоритмы предостав- ляют не только стандартные функции 20 8 ВАМ, необходимые для .мобильных роботов, но и включают в себя ряд продвинутых возможностей, таких как непрерывное уточнение карты, ремаппинг и режимы позиционирования на основе оптимизации, что делает их одним из наиболее часто используемых наборов алгоритмов лазерного 8ЬАМ в робототехнике.
8.2,1. Принцип работы алгоритма 81ап1_1оо1Ьох - это синхронный узел в КОЗ, который подписывается на дан- ные лазерного сканирования и одометрии и генерирует карту и оценку по- ложения робота, реализуя алгоритм ЗЕАМ ТооПэох. В целом его можно раз- делить на три части, как показано на рис. 8.9. Рис. 8.9 ❖ Структура алгоритмов ЗЬАМ ТооПэох 1. Сбор данных Алгоритм специально настраивает узел КОЗ для сбора данных одометрии и лазерного дальномера робота в реальном времени, что позволяет получить данные о положении, скорости робота и сканировании окружающей среды. Кроме того, узел отвечает за публикацию информации о преобразовании координат от карты к одометрии, что составляет основу для последующей обработки данных и построения карты. 2. Построение карты ЗЕАМ Тоо1Ьох использует алгоритм сопоставления сканирований для опти- мизации предварительных данных о положении, полученных от одометрии, с целью повышения точности оценки положения. Одновременно система выполняет обнаружение замыканий. Если замыкание обнаружено, график положения подвергается соответствующей оптимизации для исправления накопленных ошибок навигации. 3. Оптимизация и вывод карты ЗЕАМ ТооПэох настраивает специальный оптимизатор, который периоди- чески оптимизирует весь график положения, точно обновляя оценку поло- жения робота. Эти оптимизированные данные о положении используются
для вычисления и публикации нового преобразования карты в одометрию, а также для генерации и обновления карты, на которую полагается робот. 8.2.2. Установка и настройки Алгоритмы 8ЪЛМ Тоо1Ьох уже интегрированы в 2Ю8 2, их можно установить с помощью следующей команды. $ зибо арГ гпьСаП. Г05-заггу-зТае-ГооТЬох Если вы хотите изучить исходный код 51ат_Гос1Ьох, то следует использовать спо- соб установки из исходных кодов. Подробные инструкции по установке можно найти в репозитории кода 51ат_1юо1Ьсх. 8.2.3. Построение карт с помощью 5ЬАМ Тоо1Ьох в симуляционной среде Использовать пакет 81ат_1оо1Ьох не сложно. Здесь мы рассмотрим процесс построения карт с помощью алгоритмов 8ЬАМ Тоо1Ьох на примере симуля- ционной среды. Откройте первый терминал и запустите симуляционную среду с помощью следующей команды: $ гоб2 1аипсб 1гагп1пд_дагеао_ЬагГ|Оп1с 1оас1_пЬог_ис1аг_1п<:о_па2е_да7еЬо_Ьагпопгс.1аипсЬ.ру После небольшой паузы откроется симуляционная среда с моделью робо- та, как показано на рис. 8.10. Рис. 8.10 ❖ Симуляционная среда для построения карт с помощью ЗЬАМ
Затем запустите алгоритм построения карт 8ЕАМ Тоо1Ьох и интерфейс КУ12. # Запуск узла алгоритма из пакета зТатДсоТЬох. $ гоз2 ТаипсЬ з1ар_Т°о1Ьох оп1лпе_а5упс_1эипгЬ.оу # Откройте новый терминал и запустите $ гэз2 1аипс!т оггдт.пЬоТ_ут.г с!г5р1ау_51ап.1аипсЬ.ру Если все прошло успешно, откроется интерфейс ВУтг с картой, как показа- но на рис. 8.11. Если карта не отображается, нажмите кнопку Айй (Добавить), выберите модуль Мар и настройте подписку на тему карты, чтобы отобразить процесс построения карты. Рис. 8.11 ❖ Результат построения карты 81_АМ ТооШох в РУ! г На данном этапе в КЛ71г отображается только небольшая часть информа- ции о среде вокруг робота. Чтобы робот создал полную карту окружающей среды, необходимо направить робота, дабы он исследовал неизвестное про- странство. Запустите узел управления с клавиатуры с помощью следующей команды: $ гоз?. гип Щ1еор_Щ1зТ_кеуЬоаГс1 Ге1еор_Щ1ьГ_кеуЬсагс1 В терминале управления с клавиатуры используйте стрелки на клавиатуре для управления роботом и исследуйте неизвестную среду. В КУ 12 постепенно будет появляться полная карта, как показано на рис. 8.12. После завершения построения карты всей области можно сохранить карту в локальный файл с помощью инструмента пауЗтарзегуег. Установите его с помощью следующей команды: $ зийо ар1 спзсаП гоз-]аггу пау2-пар-;е"7е"
Рис. 8.12 ❖ Процесс построения карты с помощью 5_АМ Тсо1бох Затем сохраните карту под именем с1о181ег с помощью команды $ го$2 гип пау2_пар_5е1^ег пзр_5ауег_сП -Г пар -Г сЪотзСег Эта команда сохранит карту в текущем каталоге терминала в виде двух файлов: файла данных карты .р&т и файла описания карты ,уат1, как по казано на рис. 8.13. ГП го52(®диуиеЬоте:- О = - ст х го$2@диуиеЬоте;гоз2 гип пау2_тар_зегуег тар_зауег_сХ1 -X пар -Г сХохзХег [11ЧРО] [1723828483.052989387] [тар_замег]: пар_5ауег ХХГесусХе поде ХаипсНед. ЫаХХХпд оп ехХегпаХ ХХГесусХе ХгапзХхХопз Хо асХХуаХе 5ее — Г’ гоя2.огд/агХ1сХез/поде_ХХЕесусХе.ЬХтХ Гог тоге хпГогтаХХоп. [11ЧРО] [1723В2В483.053/26В17] [тар_зауег]: СгеаХХпд [1МЕО] [1723828483.064108864] [тар_зауег]: СопТХдигХпд [1Г4ЕО] [1723828483.128147844] [тар_замег]: 5ауХпд тар Хгот 'тар' Хорхе Хо ’сХохзХег' ГХХе [НАКМ] [1723828483.128445254] [тар_зауег]: Егее ХЬгезЬоХс! ипзресХГХес!. 5еХХХпд XX Хо деГаиХХ уаХие: 0.250000 [НАЕМ] [1723828483.128463175] [тар_замег]: ОссирХед ХЬгезКоХс! ипзресХЕХед. ЗеХХХпд XX Хо деГаиХХ уаХие: 0.650000 [1МР0] [1723828485.183701416] [тар_зауег]: ОезХгоуХпд [гоз2гип]: Ргосезз еххХед ыХХЬ ГаХХиге 1 Рис. 8.13 ❖ Использование пгу2_тар_5егуег для сохранения созданной карты © При последующем использовании навигации необходимо скопировать оба файла карты в пакет навигации. 8.2.4. Построение карт с помощью 8ЬАМ Тоо1Ьох и реального робота После построения карты с помощью алгоритмов 8ЬАМ ТооПэох в симуля- ционной среде, возможно, вы захотите повторить этот процесс с реальным
роботом. Далее мы рассмотрим, как реализовать аналогичный процесс 8ЬАМ на примере робота Ог1{»тВо1. Сначала посмотрим на результат построения карты с помощью алгорит- мов 8ЬАМ Тоо1Ьох с реальным роботом. Необходимо подключиться к роботу Ог1§1пВо1 через 88Н и запустить узел шасси робота, который публикует дан- ные одометрии и лазерного дальномера робота - это необходимые входные данные для алгоритма 8ЬАМ. # Запуск шасси эобота. $ ГЭ52 ТаипсЬ огАд^пбосЬгъпдир оАдгпЬоГЛаипсК.ру и$е_1тс1аг:=1:гие # Запуск алгоритма построения карт 51.АМ ТооТ'оох. $ Г052 Таипсп 51ап_Соо1Ьох оп1тпе_а5упс_1аипсЬ.ру Сейчас алгоритмы 81АМ Тоо1Ьох уже работают на роботе. Как просмотреть работу 8ЬАМ в динамике? На компьютере в той же сети выполните следую щую команду, чтобы запустить интерфейс КУ1г и отобразить результат по- строения карты, как показано на рис. 8.14. # На компьютере. $ го$2 Таипсп огтдспЬоСд/тг ат5р1ау_51ап.1эипс1т.ру Рис. 8.14 ❖ Процесс выполнения алгоритма 51_аМ ТосНэох на роботе ОпдтВоГ Как роботу полностью воссоздать окружающую обстановку в комнате? Необходимо выполнить следующую команду для запуска узла управления с клавиатуры. Результат выполнения показан на рис. 8.15. $ гоз2 гип бе1еср_ЩШ_кеуЬоагс1 се1еср_Счт.ь!:_кеуЬсагс1 Управление с клавиа гуры можно выполнять как на стороне компьютера, так и на стороне робота. После запуска, согласно подсказкам в терминале, нажми те клавишу г, чтобы сначала снизить скорость движения робота, предоставив ему достаточно времени для выполнения алгоритма и повышения точности построения карты с помощью 8ЕАМ. Затем управляйте движением робота и одновременно наблюдайте за изменениями карты в КУгг. Вы заметите, что при движении робота в реальной среде координаты Н в КУг/ также изменяют-
ся, а информация на карге постепенно заполняется. Продолжайте управлять роботом, пока он не завершит исследование и не создаст полную карту. РИ го52(П>диуиеЬоте: ~ гоз2@диуиеЬопе:~$ гоз2 гип 1е1еор_1игзФ_кеуЬоаг(1 1е1еор_1:и151:_кеуЬоагс! ГЫз пос!е 1акез кеургеззез 1гоп ЬЬе кеуЬоагд апс! риЬНзЬез ФЬеп аз Тм1з1/Тн1з1:81атрес! пеззадез. II могкз Ьез! иНЬ а 118 кеуЬоагс! 1ауои1. Чоухпд агоипд: и 1 о 3 к I п , Еог НоХопопФс поде (з1гаГгпд), Но1д домп 1Ье зМЛ: кеу: и I О □ к к м < > Ь : ир (+г) Ь : доып (-г) апу1Ь1пд е1зе : з1ор д/г : гпсгеазе/десгеазе пах зрее^з Ьу 10% у/х : хпсгеазе/десгеазе оп!у Нпеаг зреес! Ьу 10% е/с : гпсгеазе/сксгеазе оп!у апдиТаг зреес! Ьу 10% СТКЬ-С Ю дитЛ сиггепНу:зреес! 0.5 Ьигп 1.0 Рис. Н.15 ❖ Запуск узла управления с клавиатуры робота ОодтВоС После построения карты необходимо сохранить ее. Для этого запустите узел пау2_тар_8сгусг и сохраните карту в файл с именем ту тар. $ го$2 гип пау2_пар_5ег\.'ег пар_5а\ег_сП -С тар -Г пу_пар После успешного сохранения в каталоге, где была выполнена команда, по- явятся файл карты с данными.р§т и файл с описанием карты ,уат1. Открыв файл .р§т с помощью программы для работы с изображениями, вы увидите карту, как показано на рис. 8.16. Это и есть восприятие окружающей среды, реализованное с помощью алгоритма 8ЪАМ, на основе которого можно про- должить реализацию навигационных функций в дальнейшем.
8.3. СаПодгарНег: построение двумерных карт СаПо^гарЬег - это набор алгоритмов 8ЬАМ на основе оптимизации графов, разработанный компанией Соо&1е. Он позволяет роботам осуществлять ло- кализацию и построение карт в двух- и трехмерных средах. Основная цель разработки этого набора - обеспечить возможность получения карт с высо- кой точностью в реальном времени даже при ограниченных вычислительных ресурсах. Это один из наиболее широко применяемых лазерных алгоритмов 8ЪАМ. Рис. 8.16 ❖ Результат построения карты с помощью 81_АМ ТооШох 8.3.1. Принцип работы алгоритма Алгоритмы СаПо^гарйег состоят из двух частей. Первая часть называется Ьо- са1 81АМ и является фронтендом 8ЬАМ. Она строит набор подкарт (8иЬтар) на основе данных лазерного дальномера, Они представляют собой серию сеточных карт. При поступлении новых данных с дальномера система встав- ляет их в наиболее подходящее место в подкарге с помощью алгоритмов сопоставления. Вторая часть алгоритма СЯоЪа! 8ЬАМ является бэкендом 8ЪАМ. Она пред- назначена для устранения накопленных ошибок в подкартах с помощью обнаружения замкнутых контуров, Когда построение подкарты завершено, новые данные с дальномера в нее больше не вставляются, и она включается в процесс обнаружения замкнутых контуров.
Говоря простым языком, Ьоса! 8ГАМ создает отдельные фрагменты пазла, а СИоЬа! 8ЬАМ составляет их вместе. Рис. 8.17 ❖ Структура алгоритма СаНодгарбег 8.3.2, Установка и настройка Алгоритмы СагГо§гарПег интегрированы в КО8 2. Их можно установить с по мощью следующих команд: $ ьебо арГ 1П51аи гоз-даггу-сагГод! арЬег $ зибо арб Соз^аИ. гоз-даггу-сагЕодгаоЬег-гоз Если вы хотите изучить исходный код СагТодгарЬег, выполните установку из исходных кодов. Подробные инструкции по установке можно найти на официальном сайте со- общества СагТодгарбег. После установки необходимо настроить некоторые параметры для исполь- зуемого робота. В алгоритмах СаНо§гар1тег достаточно много параметров, но они предоставляют стандартный шаблон параметров, в котором нужно изменить лишь некоторые из них. Пример настройки параметров для СэНо^гарйег на основе двумерного лазерного дальномера и их детальный анализ приведены ниже.
гпсТиСе "пар_Ьиибег.1иа" тпсТибе 'Лгадес1:огу_Ьит.1.с1егЛиа" орттопз = { пар_ЬиЕ1бег - МА?_ВШЕВЕК, -- Конфигурация пар_Ьиг1с!егЛиа. ±гадес1:О| уЬиЛСег = ТКАЛСТОРУ_В111РЗЕК, -- Конфигурация 1:га]ес1огу_ЬиЕ1с1егЛиа. рар_<тане = "пар", -- Название системы координат карты. 1гаскд.пд_€гагее - "Ьаае Уоо^ргтп^", -- Система косрдинат слежения, обычно базозая система координат робота. риЫлзбесНтапе - обои", -- Название системы косрдинат одометрии, используемой для публикации информации о локализации. ос!оп_Егате "обои , -- Название существующей системы координат одометрии рооота. рго71Йе_ос1оп_ГгаГ|е = ГэТзе, -- Необходимость публикации алгоритмом информации одометрии. рьЫЛ2Ь_Егэ1,1е_ргсдес1:ес1_1'о_2с1 - ГаТзе, -- Необходимость публикации только информации о двумерной позе. и5е_обс1,1еСгу - Егие, -- Использование одометрии робота. изе_па7_ьаС = ГаТзе, -- Использование СР5. изе_1апбт1агкз = ГаЕзе, -- Использование ориентиров. пип_1азег_5сапз - 1, -- Количество подписок на тему дальномера 1_азег$сап. пег|1_пиЖ_ес1то_1.аьег_5сапз = 0, -- Количество подписок на тему лазерного дальномера с многократным эхосигналом. пип_зиЬс1тЛ51оп5_рег_1а5ег_5сап = 1, -- Деление одного кадра данных лазерного дальномера на несколько обработок. пип_роЕпб_с1оис18 = 0, -- Использование данных облака то^ек. 1оокир_1гап51:сгр_1:1реои1:_5ес = 0.2, -- Время ожидания при поиске данных преобразования координат ЕС. зиЬпгр_риЬизЬ_рег1об_зес = 0.3, -- Период публикации субкарты зиЬпар в секундах. розе_ри1'1Лз1т_рег'.он1_8ес = 5е-3, -- Период публикации позы в секундах. бга]есбогу_риэ1тз11_регтос1_8ес = ЗЭе-З, -- Период публикации ’раектории в секундах. гапдеЛп0ег_5апр1Лпд_гаЛо = 1., -- Частота выборки дальномера. обопебгу_за1Лрипд_габ1о = 1., -- Частота выборки данных одометрии. Ггхеб_1:гэпе_ро8е_5арр11пд_га'(:го = 1., -- Частота выборки позы в фиксированной системе координат. тпи_запр11пд_гаГ1О = 1., -- иастота выборки данных 1М11. 1апбп1агк5_за1лрипд_гаЛо = 1., -- Частота выборки данных ориентиров. } - Использование 20-картогрэфиэования. МАР_В1ЛЮЕК.иге_бгадесбогу_Ьии<1ег_2|1 - бгие - - Минимальное расстояние измерения лазерного дальномера в метрах. ТВАЗЕСТЭКУ_ВЛЕВЕК_2Р.гпп_гарде =0.1 - - Максимальное расстояние измерения лазерного дальномера в метрах. ТКАЗ ЕСТ0КУВ1Л ЕВЕР2С.пах_гарде 8 - - Присвоение недействительным лазерным данным данного значения для использования при фильтрации. ТКА]ЕСТ0КУ_Вб1ЕВЕК_2В.п1зь1пд_с1а1:а_гау_1епдбб = 0.5 - - Использование данных 1МП. ТКАЗЕСТЭРУ_В1|1ЕВЕК_20.изе_1пи_с1а1:а = ЕаЕзе - - Использование корреляционного сопоставления сканирований С5М. ТКнЗЕСТ0КУ_ВЕ1ЕРЕК_2б.азе_оп11пе_согге1аЛье_5сап_гг1а1:с1ппд = Егие - - Минимальный угол между двумя кадрами данных лазерного дальномера. ТЕЛЗЕСТЭВУ_ВЕ1ЕСЕЧ_20.гоТ1ОП_Шгег.пах_апд1е_га<Лап5 = па1Ь.гас(0.1)
- Текущий минимальный балл глобального ограничения (балл сопоставления текущего узла с текущей субкартсй). Р05Е_СРАР|Ьсоп5Ега1пЕ_Ьит1бег.пЕп_5СОге = 0.7 Глобальный минимальный балл глобального ограничения 'балл сопоставления текущего узла с глобальной субкартой). РиЬЕ_СКАРН.сопзЕга1пЕ_Ьи11бег.дЕоЬа1_1оса1ЕгаЕ1оп_л11п_зсо1 е - 0.7 геЕигп орЕЕопз 8.3.3. Построение карты Саг1одгарНег в симуляционной среде Разобравшись с основными принципами алгоритмов СагЕо^гарйег, рассмот- рим их настройку и использование на примере симуляции робота. В пакете Оп§шВоТ содержится функция построения карт с использовани- ем СагТо^гарНег в симуляционной среде. Пакет называется оп§тЬо1:_паУ1§а- Поп, а файл запуска называется сагТо§гарЬег_§а2еЬо.1аипс1т.ру. Ниже при- веден разбор кода. ЕнрогЕ оз Ггоп апепЕ_Епбех_руЕ11оп.раскадез тпрогЕ деЕ_раскаде_зЬаге_бггесЕогу Поп ЕаипсЬ ЕпрогЕ ЕаапсЬЭезсгтрЕгоп Ггоп 1аипс1’1.5иЬ5Е1ЕиЕЕоп5 ЕпрогЕ ЕаипсЬСопНдигаЕтоп Ггоп 1аипсЬ_гоз.асЕЕогз тпрогЕ Мобе Ггоп 1аипсЬ_гоз.зиЬеЕЕЕиЕЕолз тпрсгт ЕЕпбРаскадеббаге беЕ депегаГе_1аипс1т_бе5сгЕрс1оп(): ЖШЖ Конфигурация параметров узла ######### # Путь к пакету навигации. пауЕдаЕЕоп2_с1гг = деЕ_раскэде_з1таге_бЕгессогу( 'огЕдЕпЬоЕ_па*ЕдаЕЕоп') # Использование симуляционного времени, для СагеЬо установлено значение Егие. изе_зЕп_Егпе - ЕаипсЬСопЕ1дигаЕ1оп(' и5е_згп_ЕЕпе', йеТаи1Е=' Егие') # Разрешение карты. гезоЕиЕЕсп = Еаиг.спСопГтдигаЕтоп(' гезоТиЕгоп', беГаи1Е='0.05') # Период публикации данных карты. риЫдзЬ_реггоб_зес = ЕаипсЬСопЕгдигаЕЕоп( 1риЫЕз1л_регЕоб_5ес', беТаиТЕ 1.0 ) # Пу-ь к папке с файлом конфигурации параметров в пакете. сопЕ1дигаЕ1оп_бггесЕогу = Еа'.тсЕ,СопЕ1дигаЕ1оп( |сопНуигаЕ1О11_Л| есЕогу', бебаи1Е= о5.раЕЬ.]оЕп(пауЕдаЕ1оп2_бЕг, ’сопНд')) # Имя Файла конфигурации параметров. сопЕЕдигаЕЕоп_Ьазепар1е = Еаипс1тСопНдигаЕ1оп( 'сопЕЕди'аЕЕоп_Ьазепар'.е', беГаиГЕ-' Ебз_2б.Ена') # Путь к файлу конфигурации визуализации РУбг. гуЕг_сспНд_б1г = оз.раЕГ|.]огп(пауЕдаЕЕоп2_бЕг, 'гуЕг )+"/$Еап.гуЕг'' # ###### Запуск узлов: сагЕодгарЬег_побе, сагЕодгарЬег_оссирапсу_дгЕб_побе, гугг2 ##Ш## сагЕодгарЬег_побэ - Мобе( раскаде='саг ГодгарЬег_го5', ехесесаЬЕе-- сагЕодгарЬег_пос1е', папе- сагЕодгарI1е^_посIе,, оаГреЕ-1зсгееп',
рагапеРег5-[{'иье_51п_-(:'1пе : и5е_з1п_Т:1пе}], згдипеп<:5-[ сспНдигаНоП-СНгесгогу1, сопНдигат1оп_сИгесГогу, '-сопНдигаГиОп_Ба5епапе , сопНдига-НсП-Ьазепаге]) сагТодгарЬег_оссираг.су_дг1с1_поС|е - Мос1е( раскаде=' са гтзодгар1тег_гоь', ех°си(-айе=' сагтодгарЬег_оссирапсу_дг1с1_пос1е', папе= саг1:одг арЬег_оссиргпсу_дпс1_рос1е', оитриТ:='зсгееп', рэгапйегз [{ У5е_5ъп_г1пе': и5г_51п_Нпе}], агдипеп1.5=['-гезоЫЛоп , гезокпоп, '-оиЫлзП_рег1.ос!_5ес', риЫ1з1т_реггоа_5ес]) гу12_пс1е - 1Чос1е( раскаде='г7122', ехесиТаЫе- ' гут22', папе='гутг2', агдипепРз=[' б', гу17_сопГгд_сКг], рэгапеГегз [{ изе_з1п_г1пе : изг_81п_11пе}], оиТри(:=' зсгееп1) 1б - 1_аипсл0езсг\.рН.опО 1<1.а<1с1_асРгоп(саггодгарЬег_поае) 1.0. асЩзсДтс п (са гСод г арНе госссрэг.суд отд.-юСе) 1с1. а Н_эсНоп( гугг_пос1е) гэ1игп 11 Указанный файл запуска Ьанпсй активирует все узлы и параметры, связан ные с процессом 8ЪАМ. Общая структура представлена на рис. 8.18 и вклю- чает в себя два основных узла: О /саг1о$гар11ег_пос1е: узел получает данные для вычислений из тем /зсап и /обот и выводит данные в /знЬтарИз!. Необходимо задать параметры из конфигурационного файла алгоритма; О /оссирапсу_$псИ_пос1е: узел принимает список подкарт /зиЬшар ИяГ, затем объединяет их в карту и публикует. Требуется настроить два параметра: разрешение карты и период обновления. Рис. 8.11 ❖ Структура узла СагГодгарЬег Файл запуска затружаег параметры алгоритмов СагТодгарНег, которые содержатся з файле 1сЕ_2с11иа, идентичном файлу из раздела 8 3 2. Теперь можно приступить к выполнению Саг1о§гар1тег 8ЬАМ. Откройте первый терминал и выполните следующую команду для запуска симуляци онной среды. $ гоз2 ТаипсЬ 1еагп1пд_да7еЬо_Ьагчоп1с 1оасНчЬо01^г_1п1:о_дагеЬо_1тагпоп1с.1аи:1с1т.ру
После успешного запуска появится симуляционная среда с моделью робо- та, как показано на рис. 8.19. Рис. 8.19 ❖ Построение кар!ы ЗЬАМ в симуляционной среде Далее запустите алгоритмы построения карты Саг1о§гар1тег и верхний уро- вень КУ12, $ го$2 ТаипсЬ оггдгпьог_па\'1даиоп сагГодгарЬег_да7еЬо.1аипс1т.ру Если все прошло успешно, появится окно КАИг с картой, как показано на рис. 8.20. Если карта не отображается, нажмите кнопку Ас1с1 (Добавить), вы- берите модуль Мар, затем настройте подписку на тему карты - отобразится процесс построения карты. Сейчас в КХ/: 2 отображается только небольшая часть информации вокруг робота. Чтобы робот построил полную карту окружающей среды, необходимо управлять роботом для исследования неизвестного пространства. Запустите узел управления с клавиатуры. $ гоб2 гип Ге1еэр_Щ15С_кеуэоагс1 Ге1еор_М5Г_кгуЬэагс1 Используйте клавиши управления на клавиатуре в терминале управления для исследования неизвестной среды роботом. В постепенно будет по являться полная карта, как показано на рис. 8.21. После завершения построения карты всех областей используйте инстру- мент пау2_тар_8егуег для сохранения карты с именем с1о181ег в локальную папку. Для этого выполните следующую команду: $ гоз2 гип пау2_нар_5аг7ег пар_5ауе1 сП -1 пар -1 сТотьГег
Рис. 8.2С ❖ Результат работы СагГодгарНег среде в КУ1? Рис. ..21 ❖ Процесс построения карты с помощью СагТодгарНег Эта команда сохранит карту в текущем каталоге терминала, создав два файла: файл данных карты .р^т и файл описания карты ,уат1, как показано на рис. 8.22.
ГП гоБгфдиуиеЬоте: - О. = — с1 X го52@диуиеЬопе:-$ гоз2 гип пау2_тар_5егуег тарзауегсИ -Г пар -Г сХодзЬег [1ЫЕО] [1723828483.052989387] [тар_зауег]: тар зауег 1ЛГесус1.е поде ГаипсЬед. ИагЫпд оп ехГегпа! 1гГесус1е ГгапзШопз 1о асЫуаГе 5ее - . го52.огд/аг!:гс1е5/поде_1гГесус1е.Н1:т1 Тог тоге тпГогтаИоп. [1ЫРО] [1723828483.053726817] [тар_зауег]: СгеаНпд [1МЕ0] [1723828483.064108864] [тар_зауег]: СопГгдиггпд [1МЕ0] [1723828483.128147844] [тар_зауег]: 5аИ.пд тар Ггот 'тар' Торге То ’сТогаТег1 П1е [НАЙМ] [1723828483.128445254] [тар_зауег]: Ггее ТНгезЬо1д ипзресгГТед. ЗеТТТпд ТТ То деЕаиТТ уаТие: 0.250000 [МАЕМ] [1723828483.128463175] [тар_зауег]: Оссир!ед ТНгезНоТд ипьрестГгед. ЗеТТТпд ТТ То деГаиТТ уаТие: 0.650000 [1Г1Г0] [1723828485.183701416] [тар_зауег]: ОезТгоуТпд [го82гип]: Ргосекз ехТТед мТТК ГаТТиге 1 Рис. 8.22 ❖ Сохранение карты с помощью па\'2_тар_зегуег © Для последующего использования в навигации необходимо скопировать оба файла карты в пакет навигации. 8.3.4. Реальный робот После построения карты в симуляционной среде теперь можно запустить СаПоугарЬег на реальном роботе. Откройте два терминала и подключитесь к роботу Оп§1пВо1 через 88Н, а затем выполните следующие команды: # Терминал 1: запуск шасси робста. $ гоз2 ТаипсЬ оггдт.пЬоС_1?гт.пдир огТдтпЬоТ. [аипсб.ру и5е_1Лс1аг:=1:гие # Терминал 2: запуск алгоритма построения карты СагбодгарЬег. $ гоз2 ТаипсН оггдгпЬоС_паугдабгоп сагбодгарЬегЛаипсЬ.ру Теперь СагТо§гар11ег выполняется на роботе. Как нам увидеть результат работы 5ЬАМ в динамическом режиме? На компьютере в той же сети выпол ните следующую команду для запуска верхнего уровня КЛМх. в На компьютере. $ гоз2 1аипсК огТдТпЬоЩут? с1’.5р1ау_51аг1.1аипсЬ.ру Компьютер и робот должны находиться в одной локальной сети. В запущенном ВУ12 появится результат работы 8ЪАМ, аналогично разде- лу 8.3.3, как показано на рис. 8.23. Вы, конечно, уже догадались, что для построения полной карты комнаты нужно выполнить следующую команду для запуска узла управления с кла- виатуры, как показано на рис. 8.24. А после запуска управлять роботом для исследования всей окружающей среды. $ гоз2 тип Ге1еор_Щ181_кеуЬоагс1 Ге1еор_ЩтЩ_кеуЬоагс1 Лк Систему управления с клавиатуры можно запустить как на стороне компьютера, так и на стороне робота.
Рис. 8.25 ❖ Создание карты СаподгарНег с использованием Ог1дтВоГ А го52@>диуиеЬоте: ~ го52(3диуие11оте:~$ го$2 гип ге1еор_Ъп5Ь_кеуЬоагд 1е1еор_1дуг5Г_кеуЬоагд ГЫ.5 поде 1акез кеургеББез ?гот 1Ье кеуЬоагд апд риЫгБЬеБ 1Ьет аз Ти<51/Тнх51:51:атред гоеББадеБ. II иогкь ЬезЬ нг!Ь а 05 кеуЬоагд ТауоиЬ. 1оугпд агоипд: иго 3 к 1 т Еог НоХопопгс поде (Б^гаГгпд), Ьо1д домп ЬЬе аНгН: кеу: 0 10 3 К Ь М < > С : ср («) э : донп (-г) апугЫлд еХзе : 51ор д/г : гпсгеазе/десгеазе пах Бреедз Ьу 10% н/х : гпсгеаБе/десгеаБе оп!у Нпеаг Бреед Ьу 10% е/с : гпсгеаБе/десгеазе опХу апдиХаг Бреед Ьу 10% СТКЬ-С Ьо дитЛ сиггепНу:Бреед 0.5 Ьигп 1.0 Рис. 8.24 ❖ Запуск узла управления с клавиатуры робота ОпдтВоГ После завершения построения карты необходимо сохранить созданную карту. Для этого запустите узел пау2_тар_8сгусг с помощью следующей ко манды и сохраните карту в файл с именем с1о1Щег. $ ГО52 тип па72_1чар_<.ег1/ег пар_5асег_сП -Г пэр -Г сТотьТег После успешного сохранения в каталоге, где была выполнена команда, появятся файлы .р§ш и ,уаш1. Открыв файл .р§т с помощью программного обеспечения для обработки изображений, можно просмотреть карту, как
показано на рис, 8.25. Эго результат восприятия окружающей среды, вы- полненного с помощью алгоритма 8ЬАМ. В дальнейшем, при автономной навигации, можно выполнять планирование маршрута на основе этой карты. Рис. 8.25 ❖ Результат пос~роения карты с помощью СагТсдгарНег 8.4. ОКВ: построение визуальных карт Двумерная карта, созданная с помощью 81АМ, представляет собой плоскость, однако наше пространство является трехмерным. Можно ли создать трех- мерную карту, аналогичную той, что видит человек? Конечно, это возможно, и существует множество алгоритмов для этого. ОКВЬЕАМ - это система монокулярного 8ЬАМ в реальном времени, осно- ванная на ключевых точках. Она способна вычислять траекторию движения камеры и одновременно создавать простую трехмерную карту точек, вы- полняя замыкание цикла на больших расстояниях и осуществляя глобальную релокацию в реальном времени. Ее можно использовать как для получения последовательных изображений с помощью портативных устройств, так и для получения изображений в процессе движения автомобиля. Описание системы О11В8ЕАМ было опубликовано Раулем Мур-Арталом (Кэн1 Миг Аг- 1а1), X. М. М. Монтилем (|. М. М. МопДе!) и Хуаном Д. Тардосом Диал Г). Тагйоз) в 2015 году в журнале 1ЕЕЕ ТгапзасНопз оп КоЬоДсз.
8.4.1. Принципы алгоритма Система алгоритмов 0КВ81АМ разделена на три основных потока: отслежи- вание признаков (РеаТитс Тгаскш§), локальное построение карт (Ьоса! Мар пш§), замыкание цикла и объединение карт (Ъоор С1озт§), как показано на рис. 8.26. Также она поддерживает две основные структуры данных: карту и визуальный словарь. Отслеживание особенностей Извлечение ОКБ Изображение Интеграция 1М11 Релокализация или генерация карты на основе позы последнего кадра Отслеживание локальной карты Решение о новом ключевом кадре Атлас База ключевых кадров Неактивная карта Активная карта Ключевые кадры Визуальный мешок слов Точки карты Точки карты База распознавания Ключевые кадры Ключевые кадры Кограф видимости Кограф видимости Остовное дерево Остовное дерево Определение положения Коррекция замкнутого контура Объединение карт Слияние циклов и карт Уточнение масштаба 1М1) Удаление локальных ключевых кадров Рис. 8.26 ❖ Структура алгоритмов ОКВ Вставка ключевого кадра Удаление ближайших точек карты Создание новых точек карты Локальная корректировка связности Инициализация 1М0 1. Отслеживание признаков При получении данных изображения поток отслеживания сначала извлекает угловые признаки (ОКВ-признаки) на изображении. Поскольку монокуляр- ная система А/8ЪАМ на начальном этапе не имеет информации о масштабе, необходимо сначала провести инициализацию с использованием эпипо- лярной геометрии. Для этого камере нужно переместиться на небольшое расстояние в пространстве, чтобы обеспечить эффективность эпиполярных ограничений. В процессе инициализации ОКВЗЬАМ запускает два потока для одновременной оценки матрицы сущности и матрицы гомографии, пос- ле чего выбирается наиболее подходящая модель для инициализации. После завершения инициализации система получает начальную карту с информацией о масштабе. Для каждого последующего изображения вычис- ляется положение текущего кадра на основе соответствия ключевых точек. После получения положения текущего кадра ОКВЬЬАМ проецирует ключе- вые точки с изображений, имеющих общие видовые связи, на текущее изо-
бражение, чтобы найти больше соответствующих точек. С использованием новых найденных точек снова оптимизируется положение камеры - этот шаг называется локальным отслеживанием карты, После выполнения этих действий, в зависимости от расстояния движения текущего изображения относительно предыдущего кадра и количества найденных ключевых точек, определяется, может ли текущее изображение стать ключевым кадром. Если может, то выполняется локальное построение карты. Если нет, то выполня- ется обработка следующего кадра. 2. Локальное построение карты После каждого добавления нового ключевого кадра начинается процесс локального построения карты. Вставка нового ключевого кадра приводит к обновлению в ОКВ8ЕАМ таких структур данных, как связующее дерево (8рапппщ Тгее), граф совместимости (СоУ18:Ы1Ну СгарЬ) и граф существен- ности (ЕззепНа! Сгар1т). Эти структуры данных поддерживают информацию о взаимных смещениях и отношениях совместимости между ключевыми кадрами. После обновления этих структур данных вставка ключевого кадра завершается. Далее происходит удаление ненадежных точек карты. Если количество ключевых кадров, наблюдающих определенную точку карты, меньше за- данного порога, то такая точка считается незначительной и может быть удалена. После удаления создаются новые точки карты: если вновь обна- руженные точки признаков могут быть сопоставлены с ранее несопостав- ленными точками карты, то возможно восстановление глубины и создание новых ЗП-точек карты. Затем проводится локальная оптимизация для нового ключевого кадра, локальных кадров карты, имеющих с ним совместимость, и видимых ими точек карты. Это позволяет повысить точность локальной карты за счет новых ограничений. Локальное отслеживание и локальная оп- тимизация используют среднесрочную ассоциацию данных, что является одной из причин высокой точности ОКВ 5ЕАМ. После завершения локальной оптимизации ОКВ8ЕАМ удаляет избыточные ключевые кадры (те, на кото- рых большинство точек карты видны другими ключевыми кадрами). Этот механизм удаления ключевых кадров в ОКВ8ЕАМ называется механизмом выживания наиболее приспособленных и является ключевым элементом, позволяющим системе работать длительное время в одном месте без бес конечного роста числа ключевых кадров, 3. Циклы и объединение карт После завершения локального построения карты начинается этап обнаруже- ния циклов для каждого ключевого кадра. ОКВ8ЕАМ использует библиотеку ПВо\У для поиска возможных циклов и проверяет результаты на геомет- рическую согласованность. Если цикл обнаружен, вычисляется отношение 8ппЗ .между текущим кадром и циклическим кадром, включающее вектор переноса, матрицу вращения и вектор масштаба. На основе этой инфор-
мации устанавливаются ограничения между текущим кадром и его графом совместимости, а также между циклическим кадром и его графом совмести- мости - этот шаг называется слиянием циклов. Затем оптимизируется граф существенности с учетом ограничений циклов, что позволяет скорректиро вать всю карту. Если цикл не обнаружен, информация о дескрипторах при- знаков текущего кадра добавляется в визуальный словарь для сопоставления с новыми ключевыми кадрами. В системе часть, отвечающая за отслеживание признаков, относится к фронтенду, а части, отвечающие за локальное построение карты и объ единение карт, - к бэкенду. Основная задача фронтенда - обнаружение при- знаков и поиск максимально возможного количества ассоциаций данных. Бэкенд, опираясь на начальные оценки и ассоциации данных, предостав ленные фронтендом, выполняет оптимизацию, устраняет ошибки наблю- дений и накопленные ошибки и создает карту с максимально возможной точностью. 8.4.2. Установка и настройка В КОБ 2 установка и настройка алгоритма ОКВББАМ выполняется следую- щим образом. 1. Установка библиотек зависимостей - Е1§епЗ $ зибо арУ тлзкаП ИЬет.депЗ-бе\' 2. Установка библиотек зависимостей - РапдоНп # Переход в домашний каталог пользователя. $ сс1 ~ # Копирование репозитоэия РапдоНп с СПНиЬ $ дИ с!опе [Адэес репозитория РапдоНп на СИНиЬ] # Проверка рекомендуемых команд установки зависимостей в режиме с!гу-гиг. с помощью скрип-а. $ сб РапдоПп $ ./гсНрГз/тпМаПргегеоитННз.аЬ --бгу-гип гесоппепбеб # Установка рекомендуемых зависимостей с помощью скрипта. $ ./5сг1рГ5/тп5баП_ргегес|ит5ие5.сЬ гессттелВес! # Конфигурация системы сборки РепдсНп с помощью спаке, установка выходного каталога в папку # Ьит.16 в текущем каталоге, генерация необходимых МакеЩе (или других файлов сборки). $ спаке -В ЬаПб # Сборка РагдсНп с помощью спаке с использованием 4 параллельных заданий для ускорения процесса. $ спаке --ЬиПб ЬиПб -]4 « Установка РапдоПп в систему. $ зобо спаке --тпзтаП ЬиПб
Добавление конфигурации окружения в файл .ЬазЬп.: тГ [[ ' :$Ю_ЫВКАВУ_РАТН:" != *":/и5г/1сса1/1лЬ:"* ]]; ЕЬеп ехрогр Ю_ЫВКАВУ_РАТН=/и5г/1.оса;/НЬ:$10_ЫВ!сАВУ_РЛТН Н 3. Проверка версии ОрепСУ Рекомендуется использовать версию ОрепСУ 4.5 или выше. $ руЕЬопЗ -с "тпрогО су2; ргтпб(су2._уегзсоп_)" 4. Компиляция исходного кода ОВВ81АМ5 $ дИ с!опе [адрес СттНиЬ репозитория ОКВ_51АРЗ] $ сб ОКВ_5'_АМЗ $ сбг.об +х ЬитЛсСзН $ ./ЬотСб.зН /фЧ Рекомендуется объем оперативной памяти более 8 Гб, иначе в процессе компиляции может произойти зависание. После завершения компиляции выполните следующие команды для ком пиляции исходного кода алгоритмов: $ сб ~/0КВ_$1_АМЗ/Т1пг Цр^гбу/ЬорНиь/Ьит'Ш $ зибо паке ЕпзЕаП 5. Тестирование функциональности ОКВ ЗТЛМЗ Для проверки корректности установки можно использовать официально предоставленный набор данных. # Загрузка поднабора ЕиР.оС (НН_01_еа$у). $ сб ОКВ_5_АМЗ $ идет -с # Загрузка последней версии набора данных ЕТН 2игтсЬ Л51 бабаьеб Гог грЬоГгсз. # Распаковка загруженного набора данных. $ ипгтр МН_01_еа5у.?т.р # Запуск примера МопосиГаг из ОКВ_$ЕАМЗ для обработки набора данных ЕийоС. $ ./Ехапр1е5/Нороси1аг/гип_попоси'1аг_еигос.5Ь ./УосаЬиГагу/ОКВуос.ЕхЕ ./ЕхапрГед/МопосиГаг/ ЕикоС.уапГ МН_01_еазу ./Ехапр1е5/Мопсси1аг/ЕиКоС_Тгпе5гапрь/МН61.Ехс оиЕрсЩсКгессогу Результат запуска изображен на рис. 8.27.
Рис. 8.27 ❖ Тестирование ОРВ ЗЬАМ 3 на официальном наборе данных 8.4.3. Построение карты ОКЕ на реальном роботе После знакомства с мощными возможностями 0КВ81АМ на локальном уровне перейдем к запуску ОКВ ЗЬАМ на реальном роботе. Обычно для запуска алгоритма ОКВД51АМ используется камера глубины. Для выполнения целей этого раздела мы заменили монокулярную камеру Оп^шВоГ на камеру глубины Кеа18епзе П4351. 4*4 Вам необходимо самостоятельно заменить камеру на своем роботе на камеру глуби- ны. Можно использовать аналогичные модели. Откройте два терминала на Оп^тВоТ и выполните следующие команды: в первом терминале запустите Веа18еп8е П4351 для публикации данных изо бражения. # Терминал 1 робота. $ ГО52 ТаипсВ геа1зепзе2_сапега г5_18ипсЬ.ру епаЫе_берЩ:=Та'15е епаЬТе_со1ог:-ЕаПе епаЫещп (та 1: =Ггие с!ерЩ_пос1и1.е. ргоН. 1е: =640x480x15 Во втором терминале запустите алгоритм построения карты ОКВ ЗЬАМ. # Терминал 2 робота. $ ГО52 гип сгЬ_51.анЗ_ехаг1р1е_го52 попо ./ОК?70сДхГ ./Ехапр1е5/Чопоси1аг/Кеа15еп5е_04351.уап1 Теперь алгоритм ОКВ 8ТАМ выполняется на роботе. Как нам увидеть ре- зультат работы 81А.М в динамическом режиме? На компьютере в той же локальной сети выполните следующую команду для запуска КХТт;. # Компьютер в той же локальной сети $ пп.г2
После загрузки элементов отображения в КУ12, как показано на рис. 8.28, будет отображаться результат работы ОКВЬЬАМ в режиме реального вре- мени. Рис. 8.28 ❖ Построение реальной карты с помош,ью СКВ_81_АМ Далее запустите узел управления с клавиатуры и управляйте движением робота, чтобы завершить построение полной карты окружающей среды. Результат построения карты показан на рис. 8.29: ОКВЗЬАМ отображает различные ключевые точки визуальных данных. Рис. 8.29 ❖ Результат построения кар’ы с помощью ОКВ ЗьАМ
8.5. КТАВ: построение трехмерной карты 0КВ8ВАМ является трехмерным 8ЬАМ-алгоритмом и выводит разреженную карту точек, которая может использоваться для обхода препятствий роботом, но она не соответствует реальному окружению. В этом разделе представлен другой популярный трехмерный 8ЬАМ-алгоритм - КТАВ, который может создавать трехмерный мир, соответствующий человеческому восприятию, как показано на рис. 8.30. Рис. 8.30 ❖ Трехмерный ЗЬАМ-алгоритм КЛАВ На рисунке изображена работа одной трехмерной камеры, расположенной в центре комнаты. Трехмерная камера может захватывать трехмерное облако точек перед собой, что очень похоже на то, как человек видит окружающую среду. По мере вращения камеры можно получить больше информации, ко- торая постепенно соединяется в единую трехмерную карту комнаты. Этот эффект выглядит весьма впечатляюще, не так ли? По сравнению с двухмерными алгоритмами 51АМ, требозания к вычислительной мощности для построения трехмерной карты возрастают экспоненциально. Если компьютер обладает средней производительностью, то эффект не будет столь впе- чатляющим. 8.5.1. Принципы алгоритма Алгоритм КТАВ появился в 2013 году и представляет собой библиотеку с от- крытым исходным кодом, реализующую обнаружение замкнутых циклов с помощью методов управления памятью. Он ограничивает размер карты,
что позволяет выполнять обнаружение замкнутых циклов за фиксированное время, удовлетворяя требованиям к онлайн-картографированию в долго- срочной перспективе и в крупномасштабной среде. КТАВ также использует классическую структуру 8ЬАМ с фронтендом и бэ- кендом, как показано на рис. 8.31. Фронтенд в основном отвечает за на вигацию через сопоставление ключевых точек и работает с относительно высокой частотой. Бэкенд занимается построением карты через обнаруже- ние замкнутых циклов, имеет высокую сложность и низкую частоту. В про- цессе обнаружения замкнутых циклов в бэксндс КТАВ использует дискрет- ный байесовский фильтр для оценки вероятности формирования замкнутого цикла карты. Когда обнаруживается высокая вероятность замыкания, фик- сируется замкнутый цикл карты. Рис. 8.31 ❖ Структура алгоритма КТАВ 8.5.2. Установка и конфигурация Алгоритм КТАВ 8 БАМ уже интегрирован в КОБ 2, его можно установить с по- мощью следующей команды. Результат выполнения показан на рис. 8.32. $ зис1о эрГ тпзгаИ гоз-заггу-гЬаЬпар-гоз Если вы хотите изучить исходный код Р.ТАВ 8ЬАМ, выполните установку из исходного кода, подробные инструкции можно найти в руководствах в сети После установки в каталоге /орТ/гозДаггу/зпаге/ можно найти связанные с гГаЬтар пакеты ресурсов, как показано на рис 8.33.
ГП го52(®диуиеНоте: - О = - □ х гоз2@диуиеЬопе:~$ зидо арГ хпзГаХХ гоз-заггу-гГаЬтар-гоз [зидо] раззногс! Гог гоз2: }еа<!хпд раскаде ХхзГз... Оопе $ихХс!хпд дерепдепсу Ггее... Оопе 1еас1хпд зГаГе хпГогтаГхоп... Оопе ГЬе ГоХХоихпд раскадез ихХХ Ье ирдгадеск гоз-заггу-гГаЬтар-гоз 1 ирдгас!е(1, 0 пенХу ХпзГаХХед, 0 Го гепоуе апс! 641 по! ирдгадед. №е<! Го деГ 5,226 В оГ агсЫуез. МЧег ГЫз ооегаГхоп, 0 В оГ асМхГхопа!. дхзк зрасе «XXX Ье изеск ЗеГ:1 «ц .Гипа.1зХпдЬиа.еди.сп/го52/иЬипГи поЬХе/паХп а яс! 6 4 гоз-]ахгу -гГаЬпар-гоз атд64 0.21.5-ЗпоЬХе.20240820.014934 [5,226 В] -еГсЬед 5,226 В хп 05 (13.4 кВ/з) (ВеасНпд йаГаЬазе ... 325790 ПХез апс! сЛгесГогхез сиггепГХу ХпзГаХХед.) ’герагхпд Го ипраск .. ./гоз-за22у-г1аЬяар-гоз_0.21.5-ЗпоЬХе.20240820.014934_атс!б 4.деЬ ... !праск1пд гоз-захху-гГаЬтар-гоз (0.21.5-ЗпоЬХе.20240820.014934) оуег (0.21.5-Зпо Ле.20240802.074552) ... 5еГГхпд ир гоз-загху-гГаЬтар-гоз (0.21.5-ЗпоЬХе.20240820.014934) ... Рис. 8.32 ❖ Установка пакета В1АВ_51_АМ ГН го52@диуиеНоте:/орЕ/го5/)а2ху/5Ьаге/г1аЬтар_ехатр1е5/1аипс11 О = - □ х го52@диуиеЬог»е:/орЪ/го5/зах2у/511аге/гГаЬтар_го5$ Хз спаке ХосаХ_зеГир.ЬазЬ ХосаХ_зеГир.зЬ раскаде.дзу епухгоппепГ ХосаХ_зеГир.дзу 1осаХ_зеГир.гзЬ раскаде.хтХ го82@диуиеЬопе:/ор±/го5/дахху/5Ьаге/г'ГаЬпар_го5$ сс! . ./гГаЬтар_ехатр!ез/ гоз2@диуиеЬопе:/орГ/гоз/зах2у/5Ьаге/г1аЬтар_ехатр1ез$ Хз спаке ХаипсЬ ХосаХ_зеХир.с!5У ХосаХ_зеГир.гзЬ раскаде. хпХ (епухгоппепГ ХосаХ_зеГир.ЬазЬ ХосаХ_зеГир.зЬ раскаде. <!зу гоз2@диуиекопе:/ор^/го5/за2ху/5Ьаге/г1аЬпар_ехапр1ез$ сс1 ХаипсЬ/ гоз2@диуиеНопе:/ор^/го5/за22у/зЬаге/гГаЬпар_ехапрХез/1аипсЬ$ Хз сопГхд геаХзепзе_с1435х_хпГга. ХаипсЬ. ру еигос_<1аГа8еГ5.ХаипсЬ.ру геаХзепзе_<!435х_8Гегео. ХаипсЬ .ру к4а.ХаипсЬ.ру гдЬдзХат^аГазеГз.ХаипсЬ.ру кхпесГ_хЬох_360.ХаипсЬ.ру гГаЬтар_О405х2.ХаипсЬ.ру геаХзепзе_<!400. ХаипсЬ. ру гГаЬтар_О405хЗ. ХаипсЬ. ру геаХзепзе <14351 соХог.ХаипсЬ.ру___уХр!6.ХаипсЬ.ру_________________________________ Рис. 3.33 ❖ Пакет ресурсов алгоритма КТАВ На основе существующих примеров несложно заметить, что можно вруч- ную выбрать датчики для КТАВ Мар. Ключевым моментом настройки явля ются параметры конфигурации в приведенном ниже коде, такие как иден- тификатор кадра, использование симуляционного времени, подписка на глубинные изображения, подписка на цветные изображения, подписка на данные лазерного дальномера и т. д. Эти параметры передаются запускае- мому узлу КТАВ Мар. рагапете'5 = { Чтале_т.сГ: 'Ьа5е_ГооТрг1пТ', ' и5е_5Т.Р1_Т:гпе': и5е_51п_С1Г1е, |5иЬ;сгт.Ье_ЛеэЩ|: Тгие. 'и5е_асПоп_Тог_доэ1': Тгие, 1 до5_1лэде': доз, 'Розали : доз, 'Вед/ЕсгсеЗЭоР': 'Тгие . '0рпп^2е"/СгаVг^у^I^дпа, : '0' # Отключение ограничений 1М11 (используется 20).
8,5.3. Построение карты КТАВ в симуляционной среде Рассмотрим настройку и использование КТаВ с различными датчиками на примере симуляционной среды робота, 1. Построение карты с использованием 81АМ и лазерного дальномера На компьютере откройте три терминала и выполните следующие команды, # Терминал 1: запуск симуляционной среды робота. $ гоз2 1аипсЬ 1еагп1пд_дагеЬо 1оаб_пЬоТ_11с1аг_гп1:о_па2е_са2еЬо_1тагпопт.с.1.а1)гс1т.ру # Терминал 2: запуск $1АМ-алгоритма КТАВ. $ го$2 1аипсб огТдгпЬо^паутдабгоп гбаЬ_5сгп_дг7еЬо.ТгипсЬ.ру. # Терминал 3: запуск интерфейса верхнего уровня. $ гоз2 ТаипсЬ оггдгпЬоМДг (1г5р1ау_з1ат.1аипсЬ.ру После запуска появится интерфейс КТАВ с отображением окружающей среды робота, как показано на рис. 8,34. Мос1е1 Са Зоигсе П Мойе! 50 Рагеп1 Ег Ища Мог 3(айс ЗеИ Со11| ЕпШу Тгее , Ддгоип > ,4, ьог<1« > Д 0Ь51а > ,4. тЬо1 Рис. 8.34 ❖ Пример моделирования с помощпю КТАВ Алгоритм КТАВ работает в фоновом режиме и постоянно сохраняет дан- ные в каталоге .гоз, поэтому нет необходимости специально сохранять карту вручную. Объем данных трехмерного облака точек очень велик. После за- вершения построения карты закройте все запущенные узлы и просмотрите файл базы данных сохраненной трехмерной карты, который может зани- мать несколько сотен мегабайт, а при длительном построении карты - даже гигабайты. Как нам просмотреть трехмерную карту? Можно использовать инструмент визуализации базы данных КТАВ гГабтар-йаГа'оазеХйеадег, как показано на рис. 8.35, Выполните следующую команду, чтобы просмотреть созданную карту. $ ггаэпар-гАГаЬазеЩе'/ге- гбаЬгпар. с!Ь
бгарН Рис. 8.35 ❖ Двумерная карта КТАВ на основе данных дальномера В вышеупомянутом основном файле запуска гТаЬ_8сап_§а2еЬо.1аипс1т.ру параметры конфигурации для темы лазерного дальномера и различных ал- горитмов были настроены следующим образом: рагапесегз = { ЧтапеиГ: 'Ьазе_ТооТ:ргТп1:', ' и5е_5тл_(:г1г1е : изе_з1п_г:1пе, 'зиЬзсг1Ье_с1ер1:1т': ЕаТзе, 'зиозсг1Ье_гдэ': ЕаТзе, 'зиЬзсг1Ье_зсап': Тгие, 'арргох_зупс': Тгие, 'изе_асГ1оп_Еог_доаТ': Тгие, 'доз_зсап : доз, 'доз_1ни ; доз, 'Кед/ЗСгаСеду': '1', ' Кед/ЕогсеЗЦоР' : Тгие1, 1 КСВО/Мет.дКЬогГт.пкРеГТ.пт.пд : Тгие', '(ЗгТД/РапдеМгп': '0.2', # Игнорирование точек лазерного сканирования на самом роботе. 'ОрСспТгег/СгауТСуЗтдта': '0' в Отключение ограничений 1МС1 (используется 20). } гепарртпдз = [ ('зсап', '/зсап')]
2. Построение карты с использованием визуального 8!АМ-алгоритма Мы рассмотрели 8ЬАМ-алгоритм КТАВ с использованием только лазерного дальномера, но каков же будет результат работы чисто визуального алгорит- ма КТАВ? Процедура выполнения аналогична той, что и для КТАВ с дально- мером, результат работы показан на рис. 8.36. Слева можно увидеть точки со- поставления ключевых точек между кадрами, а справа - форму трехмерной карты. Используйте следующие три команды для выполнения. # Терминал 1: запуск симуляционной средн робо_а. $ гоз2 Тайней Теагп1пд_да2е'эо_йаггюп1С 1оай_пЬоТ:_гдЬс1_1п1.о_|’1а7е_да7еЬо_йа''1лопгс.Тайней.ру # Терминал 2: запуск $ЬАМ-алгоритма РТАВ. $ гоз2 1аипсК оггдгпЬоС_па7гдаПоп гГаЬ_гдйс1_да7еЬэ.Тайней.ру # Терминал 3: запуск интерфейса верхнего уровня. $ гоз2 Тайней оггдгпсоС_7т.2 с!15р1ау_51ап.1эипсй.ру Рис. 8.36 ❖ Создание трехмерных карт КТАВ с помощью камеры Наконец, запустите узел управления робота с клавиатуры, в процессе дис- танционного управления происходит построение трехмерной карты. В К\'12 можно наблюдать, как облако точек постепенно соединяется, формируя трех- мерную карту. Кроме того, отображается двумерная карта, проецируемая на поверхность, которую можно использовать для навигационных функций в будущем.
В вышеупомянутом основном файле запуска г1аЬ_г§Ьс1_§а2еЬо.1аипсН.ру параметры лазерного дальномера и другие параметры алгоритма настроены следующим образом: рагапесегз - { ЧтапеДсГ: 'ЬазеДооТрппЕ1, 'изе_зТп_1:гпе': изе_з1п_Нпе, 'зиЬзсгТ1|е_с!ерЦт|: Тгие, 'изе_асМо.п_Еог_доа1': Тгие, 'дозДпаде': роз, ' дозДпи': роз, ' Кед/ЕогсеЗЭоЕ' : Тгие', 'ОргтпТгег/СгауПуЗТдпз': 0 # Отключение ограничений 1М11 (используется 20). } гепарртпдз = [ (' гдЬ/спаде', '/сапега/спаде_гаи'), (1 гдЬ/са1лега_гпТс', '/сапега/сапегаДпЕо1), ('бергЬ/тладе', '/сапега/с1ерЩ/гпаде_гак'')] Здесь используются данные с камеры глубины, поэтому необходимо доба вить камеру глубины для робота Оп§тВоГ в симуляционной среде. Для этого просто добавьте соответствующий раздел г§Ъс! в существующий файл ХАСКО. 8.5.4. Построение карты КТАВ с реальным роботом Применим теперь алгоритм КТАВ на реальном роботе. Выполните удаленный вход на робота ОпщпВоТ и запустите узлы шасси и камеры глубины. # Запуск шасси робота ОгсдспВоб. $ гоз2 ТаипсЬ огтдгпЬоЕ_ЬгТпдир огГдспЬотЛаипсЬ.ру изе_1Щаг:=Ггие # Запуск узла камеры 04351. $гоз2 ТаипсЬ геаТзепье2_сапега гзДаипсЬ.ру епар!е_с1ерГ1т:-ЕаТзе епаЫе_со1ог:=гаТзе епаЫеДпЕга!: =Егие берГЬ_поаи1е. ргоЕПе: =640x480x15 Затем на компьютере в той же сети запустите ЁТ АМ-алгоритм КТАВ и среду КУ12 для отображения в реальном времени. « Запуск ЗГАЙ-алторитма КТАВ. $ гоз2 Таипсп оггдгпЬоЕ_пау1даПоп гЕаЬ_гдЬа_дагеЬо.1аипсЬ.ру # Запуск верхнего уровня. $ гоз2 ТаипсЬ сгт.дгпЬоТ_У17 сИзр1ау_81ап.1эипс1т.ру
МК КТАВ требует значительных вычислительных ресурсов, но благодаря распределен ным возможностям ВОВ 2 алюритм можно КТАВ выполнить на компьюнере. Помимо трехмерной карты, строится также двумерная карта, проециру- емая на поверхность, как показано на рис. 8.37 Ее можно использовать для будущих навигационных функций. Рис. 8.37 ❖ Процесс построения карты К1АВ с использованием реального робота Управляя роботом, обойдите комнату и проверьте, соответствует ли построенная трехмерная карта окружающей среде. Если обнаружены не- соответствия с реальной обстановкой, следует учесть возможные ошибки в данных сенсоров. Обычной практикой в таких случаях является повторная калибровка одометра, а также снижение скорости при повторном построе- нии карты. После завершения построения карты закройте терминалы, а затем с по- мощью инструмента НаЬтар- 11а1аЬазеУ1е\уег на компьютере просмотрите сохраненные файлы карты и двумерной карты, как показано на рис. 8.38. $ гГаопар-^аСаЬазеУСе'^е- -/.гоз/гГаЬпар.сЬ
Рис. 8.3$ ❖ Результат пос_роения карты РТАВ с использованием реального робота 8.6. Резюме Б этой главе мы подробно изучили ключевую технологию в области интел- лектуальных роботов - ЗБАМ. Легко заметить, что для ЗБАМ требуется ком- плексное применение знаний из предыдущих семи глав книги, начиная с ба- зовых принципов КОЗ 2 и заканчивая практическим применением, включая управление и отладку симуляционных роботов, а также считывание данных сенсоров и управление шасси робота. Все эти части тесно взаимосвязаны. В главе 9 мы с помощью карты ЗБАМ продолжим исследовать навигацион- ные технологии для интеллектуальных роботов, обучим роботов автономно передвигаться в неизвестной среде и выполнять более интеллектуальные задачи.
Глава ✓ Автономная навигация в КО5 2: свобода движения робота С помощью технологии 8ЬАМ мы уже научились управлять роботом для соз- дания карты неизвестной среды. Возможно, у вас возник вопрос: как можно использовать эту карту? В этой главе мы рассмотрим важный сценарий ис- пользования карты 8ЕАМ - автономную навигацию. Возьмем, к примеру, робот-пылесос. Когда он впервые попадает в ваш дом, ему ничего неизвестно об окружающей среде. Поэтому при пеовом запуске его основная задача - исследовать это неизвестное пространство, используя технологию 8ЕАМ. После создания карты робот приступает к работе, и перед ним встает множество вопросов: как обойти все уголки дома? Как избежать столкновения с известными на карте степами, шка- фами и другими препятствиями? Если статические объекты еще .можно обойти, то как быть с непоседливыми детьми и домашними животными? А также с различными предметами, которые могут неожиданно появиться на полу? Для решения этих задач требуется интеллектуальный алгоритм автономной навигации. 9.1. Принципы автономной навигации робота Процесс автономной навигации робота несложен и весьма схож с функцией навигации в картографических приложениях. Сначала выбирается целевая точка навигации, как показано на рис. 9.1. Ее можно ввести непосредственно в картографическом приложении или задать вручную в роботе, чтобы определить, «куда» должен двигаться робот.
Далее, прежде чем приступить к планированию маршрута, робот должен знать, «где» он находится. В картографическом приложении это достигает- ся с помощью СРВ, установленного в телефоне. Робот может использовать аналогичный метод на улице. Однако в помещении точность работы СРВ недостаточна, поэтому для определения местоположения можно использо- вать технологию ВЪАМ или алгоритм глобального позиционирования А.МСЬ, который будет рассмотрен позже. Комикс РО.Б.ОТ. Его путь, может, и не оптимальный, но зато у него есть свой стиль Рис. 9.1 ❖ Процесс автономной навигации мобильного робота Вспомните, как работает картографическое приложение: оно прокладыва- ет оптимальный маршрут от начальной точки до конечной. Это и есть про- цесс планирования .маршрута. Модуль, выполняющий эту задачу, называется глобальным планировщиком. Он анализирует, как робот может достичь цели по оптимальному пути, рассматривая карту в целом. После планирования маршрута робот начинает движение. В идеальных условиях он должен следовать глобальному маршруту, но в процессе могут возникнуть временные препятствия, требующие динамического принятия решений В таких случаях робот отклоняется от глобального маршрута, чтобы обойти препятствия, и для этого ему необходим локальный плани- ровщик. Локальный планировщик не только прокладывает путь обхода прспят ствий в режиме реального времени, но и старается удерживать робота на глобальном маршруте, корректируя скорость его движения в каждый момент времени. Эта скорость передается через тему сшс1_ус1. Команды скорости
передаются на шасси робота, и приводы управляют двигателями, заставляя робота двигаться к цели. 9.2. Архитектура автономной навигации Ыау2 В Р.О8 2 существует профессиональная система автономной навигации для роботов Кау2. Название является сокращением от НаУ1^аНоп2, а сама си- стема представляет собой набор программных пакетов, предоставляющих функции навигации для мобильных роботов. Этот набор поддерживает ав тономное позиционирование, планирование маршрута, избегание препят- ствий и управление движением для различных типов роботов. 9.2.1. Архитектура системы Сначала рассмотрим архитектуру системы автономной навигации Иау2, схе- ма которой изображена на рис. 9.2. Эта платформа требует взаимодействия со множеством внешних узлов. В первую очередь это касается путевых точек, представляющих собой серию целевых позиций для навигации. Путевые точ- Дерево поведения Преобразование координат Я Карта Информация с датчиков ' Следование по путевым точкам । ' । Автономная система Сглаживатель скорости Детектор столкновений Шасси робота Рис. 9.2 ❖ Архитектура системы автономной навигации Мау2
ки могут быть как одиночными, так и множественными, например от А до В, от В до С и далее от С до В. Здесь В, С и Б являются целевыми позициями на маршруте. Для осуществления навигации Кау2 также требуется вспомогательная ин- формация, которая помогает определить местоположение, и навигационные данные. Например, информация о преобразовании координат И, которая показывает взаимосвязь между роботом и одометром, помогает роботу опре- делить свое местоположение на карте. Для навигации робота важно знать, где находится он сам и где находится цель, чтобы осуществить планирование маршрута. Другой важной информацией является карта, построенная с по- мощью ЗСАМ, которая предоставляет данные о статических препятствиях в окружающей среде, таких как стены и столы. Кроме того, робот должен с помощью дальномера динамически обнару- живать движущиеся препятствия в окружающей среде, например внезапно появившегося впереди человека, и в реальном времени обновлять информа цию о местоположении и стратегии избегания препятствий. Имея вышеуказанную информацию, можно приступить к реализации на- вигации на основе №у2. В верхней части системы находится сервер навига- ции на основе дерева поведения, который реализует механизм организации и управления навигационными алгоритмами. Дерево поведения с помощью параметрической конфигурации настраивает модули и функции, используе- мые в процессе навигации, и организует и управляет несколькими серверами с конкретными функциями. 1. Сервер планировщика Сервер планировщика аналогичен функции планирования маршрута в кар- тографических приложениях. Он отвечает за планирование глобального маршрута. На основе глобальной карты затрат (С1оЬа1 СозПпар) сервер пла нировщика рассчитывает оптимальный маршрут от точки А до точки В. об- ходя препятствия. Существует множество алгоритмов планирования, таких как А* и алгоритм Дейкстры. 2. Сервер контроллера После завершения глобального планирования маршрута сервер контролле- ра предоставляет службу следования по маршруту (Ро11о\у РагН), позволяя роботу двигаться по заранее определенному пути. Одновременно он дина- мически корректирует путь робота на основе локальной карты затрат (Ьоса! СозПпар) и данных от сенсоров в реальном времени, чтобы робот мог избе- гать движущихся препятствий и следовать глобальному маршруту. 3. Сервер сглаживания После того как серверы планировщика и контроллера выдают маршрут, сер вер сглаживания обрабатывает его, делая более плавным, уменьшая резкие
повороты и изменения скорости, что обеспечивает более плавное движение робота. Эти три сервера организованы и управляются с помощью дерева поведе- ния. Дерево поведения определяет порядок выполнения и условия для каж- дого функционального модуля, обеспечивая правильность и эффективность навигационного процесса, ЛЧ Дерево поведения выступает в роли организатора, координирующего роботу рзз- личных модулей. После завершения планирования траектории Мау2 генерирует команды управления скоростью стс1_уе1, включающие линейную и угловую скорости. Для повышения плавности управления шасси робота служба сглаживания скорости обеспечивает плавное ускорение и замедление, после чего прове- ряет, не произойдет ли столкновение с препятствием при движении робота с заданной скоростью. Затем результаты передаются контроллеру шасси ро- бота, который приводит робота в движение по запланированному маршруту, завершая весь процесс навигации. 9.2,2, Глобальная навигация Глобальная навигация осуществляется сервером планировщика, основная задача которого - вычисление оптимального маршрута от начальной до це- левой точки на основе глобальной карты затрат. Что же такое глобальная карта затрат? В №у2 под затратами понимается степень сложности прохождения роботом определенной области. Например, в открытых пространствах затраты низкие, и робот может легко их пересечь. Вблизи препятствий затраты высокие, и роботу необходимо проходить их с осторожностью. Глобальная карта затрат представляет собой детализи- рованную модель окружающей среды, построенную на основе статической карты, созданной с помощью Ы.ЛМ, и динамических данных, предоставляе- мых сенсорами. Таким образом, ключ к глобальной навигации заключается в использо вании информации карты и данных сенсоров для обеспечения точности и эффективности планирования маршрута. Информация карты обычно генерируется с помощью технологии 8ГАМ и включает статические пре- пятствия в окружающей среде, тогда как данные сенсоров предоставляют информацию о препятствиях в реальном времени. Объединяя эту информа- цию, сервер планировщика .может разработать безопасный и эффективный маршрут. В Кау2 глобальные алгоритмы планирования задаются в виде модулей в ХМЬ-файле дерева поведения. Среди распространенных алгоритмов - А* и Дейкстры, сравнение результатов которых представлено на рис. 9.3.
123456789 101112 1314151617181920 123456789 1011 1213141516171819 20 Рис. 9.3 ❖ Алгоритмы Дейкстры и А* Алгоритм Дейкстры можно рассматривать как алгоритм поиска в ши- рину. Процесс поиска начинается с начальной точки и распространяется слоями, пока не будет обнаружена целевая точка. Из-за большого про- странства поиска часто удается найти глобальное оптимальное решение в качестве маршрута, однако это требует больше времени и ресурсов па- мяти, что делает его подходящим для планирования маршрутов на нсболь ших территориях, таких как навигация в помещениях или на территории кампуса. Алгоритм А*: благодаря использованию эвристической функции в про цессе поиска появляется направление, что сокращает пространство поиска. Однако из-за определенной случайности эвристической функции получен- ный глобальный маршрут не всегда является глобально оптимальным ре- шением. Тем не менее этот алгоритм отличается высокой эффективностью и низким потреблением ресурсов, что делает его подходящим для более об ширных областей. Учитывая, что большинство приложений для мобильных роботов ограни- чены по своему охвату и в наличии достаточные вычислительные ресурсы, в навигации К()$ 2 предпочтение отдается алгоритму Дейкстры. 9.2,3. Локальная навигация В системе №у2 локальная навигация осуществляется сервером контроллера (СопггоПег Зегуег), основная задача которого - обеспечить движение робота в режиме реального времени по запланированному маршруту на основе гло- бального планирования и динамически избегать препятствий в окружающей среде с помощью локальной карты затрат. Локальная навигация аналогична функции реальной навигации в приложениях для смартфонов: когда мы
движемся по дороге, приложение постоянно корректирует маршрут, чтобы не отклоняться от заданного глобального пути. Ключевыми аспектами локальной навигации являются оперативность и гибкость. Хотя глобальное планирование пути предоставляет оптимальный маршрут от начальной точки до цели, в процессе движения окружающая сре- да может изменяться, например, из-за внезапно появляющихся пешеходов или движущихся препятствий. Сервер контроллера постоянно получает дан- ные от сенсоров, таких как лазерное сканирование и облака точек, и обнов- ляет в реальном времени информацию о положении робота и окружающей среде, обеспечивая его способность гибко реагировать на эти изменения Локальная карта затрат схожа с глобальной картой затрат, но она сосредо- точена на локальной среде вокруг робота и обновляется чаще, чем глобаль- ная карта затрат. Алгоритмы локального планирования пути отличаются от алгоритмов глобального планирования, однако их настройка также осущест- вляется в ХМЕ-файле дерева поведения, В Хау2 часто используются такие алгоритмы, как О\УА и ТЕВ. Алгоритм БАМА (Оупапнс ХУшДош Арргоасйез) принимает на вход глобаль- ный путь и информацию из локальной карты затрат, а на выходе прсдоставля ет конечную цель всего навигационного процесса - команды скорости, пере- даваемые на шасси робота. Схема этого процесса показана на рис. 9.4 справа. Дискретизация пространства управления (йх, ду, сШ) Процесс выполнения алгоритма О\Л/А Вход и выход алгоритма О\Л/А Препятствия Путь, скорость Алгоритм ОМА Очистка и повторение Выбор траектории с наивысшим баллом, отправка команды 1. Глобальное планирование пути 2. Карта стоимостей Выполнение прямого моделирования из текущего состояния робота, наблюдение траектории Оценка каждой траектории, полученной при прямом моделировании т Цель Команды скорости, отправляемые на мобильную базу Рис9.4 ❖ Структура алгоритма ОАЛ В\УА сначала дискретизирует пространство управления робота, то есть, исходя из текущего состояния робота, выбирает несколько наборов скоро- стей, а затем использует их для моделирования траектории движения робота
в течение определенного времени. После получения нескольких траекторий применяется функция оценки, которая оценивает их по критериям, таким как возможность столкновения робота или приближение к глобальному пути. Траектория с наивысшей оценкой становится командой скорости, передавае- мой роботу. Алгоритм ПАЛА прост в реализации и обладает высокой вычислительной эффективностью, но не очень подходит для сред с частыми изменениями. Алгоритм ТЕВ, Полное название алгоритма - Типе Е1азНс Ваий, где Е1азНс Ваий переводится как «резинка», что подчеркивает его способность изменять форму пути, соединяющего начальную и целевую точки, в зависимости от различных ограничений, аналогично воздействию внешней силы на резинку. В структуре алгоритма ТЕВ робот находится в текущей позиции, а целе- вой точкой является точка на глобальном пути, как показано на рис. 9.5. Эти две точки аналогичны концам резинки и являются фиксированными. Далее алгоритм ТЕВ вставляет между ними несколько точек позы робота, контро лируя деформацию резинки. Для отображения кинематической информации траектории необходимо также определить время движения между точками, что и подразумевается под Т1тс в названии алгоритма. Эти дискретные позы формируют задачу оптимизации: траектория из этих поз должна быть минимальной по времени и расстоянию, избегать препятствий, а также соответствовать ограничениям скорости и ускорения, учитывая кинематику робота.
В конечном итоге состояние робота, удовлетворяющее этим ограниче- ниям, становится входной командой скорости для шасси робота в рамках локальной навигации. 9.2 А Функция локализации В Иау2 функция локализации является основой для автономной навигации робота. Основная задача локализации - определить точное местоположение и ориентацию робота в окружающей среде. В Ка\г2 для локализации обычно используется алгоритм АМСЬ. Что же он из себя представляет? Пакет АМСЬ включает в себя метод Монте-Карло для локализации в дву- мерной среде, как показано на рис. 9.6. В основе алгоритма лежит фильтр час- тиц, который использует набор частиц для представления возможных состоя- ний робота. Каждая частица содержит оценочные значения местоположения и ориентации робота. При движении робота эти частицы обновляются в со ответствии с моделью движения робота. Одновременно алгоритм оценивает вес каждой частицы, сравнивая данные сенсоров робота (например, данные лазерного дальномера) с картой, то есть степень соответствия оценки поло- жения частицы фактическим наблюд аемым данным. При каждом обновлении частицы с более высоким весом имеют больше шансов быть сохраненными, тогда как частицы с меныпим весом могут быть исключены. Этот процесс называется предварительной выборкой. Таким образом, группа частиц по- степенно концентрируется в области, которая, вероятно, представляет фак- тическое местоположение робота, обеспечивая высокоточную локализацию. Информация об окружении (Карта) Данные датчиков (Сканирование) Информация о пройденном пути (Одометрия) Модели движения Модель датчика Пакет АМСЬ Калибровка курса (Н) Начальная поза Расчет пути ло методу Монте-Карло Алгоритм выборки (повторной выборки) Распределение частиц (Облако частиц) Оптимизированная поза (Отфильтрованная поза). Рис 9.6 ❖ Алгоритм АМСЬ Алгоритм АМСЬ можно описать следующим образом: вокруг начальной по- зиции робота случайным образом распределяется множество частиц, каждая из которых может рассматриваться как копия робота, как показано на рис. 9.7. Поскольку частицы распределены случайно, их ориентации различны. Далее робот начинает движение, например, со скоростью 1 м/с, и эти час- тицы-копии также движутся с той же скоростью. Из-за различной ориента- ции направление движения каждой частицы не совпадает, и они постепенно удаляются от робота. Как определить, что эти частицы отклонились? Здесь на помощь приходит информация карты.
Обновление АМС1_ = 1 Например, робот продвинулся на 1 м, и с помощью сенсоров мы обнару- живаем, что расстояние до препятствия впереди уменьшилось с 10 м до 9 м. Эта информация передается всем частицам, и те из них, которые удаляются от робота, будут удалены алгоритмом, а частицы, соответствующие состоя- нию робота, сохраняются и порождают частицы с тем же состоянием, чтобы избежать ситуации, когда все частицы будут удалены. Следуя этой логике, с определенной частотой происходит отбор частиц оставляются те, которые в основном совпадают, а несоответствующие уда- ляются. В итоге эти частицы постепенно приближаются к истинной позиции робота, и область с наибольшей концентрацией частиц рассматривается как текущее положение робота, то есть результат локализации. ДК Это упрощенное описание алгоритма АМС1_. Для более глубокого изучения сбрати- тесь к книге «Вероятностная робототехника». 9.3. Установка и использование Ыау2 Изучив структуру №у2, можно приступить к установке и использованию автономной навигационной системы робота Иау2. 9.3.1. Установка Ыау2 В КОЗ 2 Иау2 можно установить напрямую через бинарные пакеты Для этого откройте терминал и выполните следующие команды. $ ьибо арЬ ирбаТе $ зобе ар1 гпгШ! гоз-даггу-па\'1даг1ср2
Если вы хотите изучить исходный код №у2,то потребуется установка из исходного кода. Подробные инструкции по установке можно найти на онлайн-ресурсах. Помимо №у2, на официальном сайте также доступен пакет для обучения пау2_Ьпп&нр. Установите его с помощью следующей команды, так как даль- нейшая разработка и практика в этой главе основаны на этом пакете. $ зибо эр! гпз^аИ гоз-]а7гу-па\/2-Ьг1пдир После завершения установки в каталоге/орЕ/гозДазгу/яйаге появится спи- сок пакетов, как показано на рис 9.8. Это подмодули системы Иау2. ГЛ гоь2@)дцуиепоп1е:/орс/го5/|а7гу/5Ьаге ГО52@диуиеЬоне:/ор*/го5/]атгу/5Ьаге$ с<1 пау2_ пау2_апс1/ пау2_ЬеЬауюг5/ рау2_ЬеНаутог_1:гее/ рау2_ЬМпдир/ пау2_ЬТ_паутдаТог/ Пау2_со11т.5топ_попг1:ог/ тау2_соггтоп/ 1ау2_соп5Ггагпе<1_зпоо1Ьег/ >ау2_гоп1:го'11.ег/ рау2_соге/ пау2_со$1:пар_2с1/ пау2_<1иЬ_соп(:го11ег/ пау2_дгасеГи1_соп1:го1Аег/ |ау2_1гСесус1.е_пападег/ 1а\'2_гар_5ег«е'-/ та\'2_нгпгта1_ТЬЗ_5гп/ пау2_п1пгпа1_ТЬ4_се5сг1рТгоп/ пау2_н1п1па1_1:Ь-:_51п/ пау2_пррЦ_сопЦго11ег/ тау2_г5дз/ пау2_пауГп дЛаппег/ пау2_рГаппег/ 1ау2 геди1аТе<1риге рсг5чС(:сопСго11ег/ Рис. 9.8 ❖ Список пакетов №у2 9.3.2. Работа с примерами Ыау2 В пау2_Ьпп§нр содержатся официальные примеры автономной навигации для ТнгНеЬоЕЗ и ТцгНеЬоМ. Выберите и запустите одну из следующих команд. # Припер навигации для ТогПеЬоСЗ. $ гоз2 1аиг,сЬ пау2_Ьг1пдир СЬЗ_згпи1аН.оп_1гипсЬ.ру # Пример навигации для ТигН.еЬ(Я:4. $ гоз2 1аипсЬ пау2_Ьг спдир тЬ4_згг,и1а1:1.оп_1гипс1‘,.ру После успешного запуска появится интерфейс, как на рис. 9.9, где нет ро- бота и других элементов, а есть только статическая карта.
Рис. 9.9 ❖ Ишерфейс после запуска официальною примера №у2 Теперь нажмите параметр 20 Розе ЕзНтаГе (20-оценка позы) в панели инструментов НУ12 и с помощью мыши задайте роботу начальную позу на статической карте. Это действие позволит роботу запустить алгоритм АМСЬ для корректировки своей позиции. В результате окно примет вид, как на рис. 9.10, Рис. 9.10 ❖ Интерфейс №у2 после запуска позиционирования Теперь в интерфейсе КЛ/12 появился робот и соответствующая карта затрат. Нажмите параметр навигации Ыау2 Соа1 (Дель №у2) на панели инструмент-
тов и установите целевую точку на карте, как показано на рис. 9.11. Робот начнет движение к целевой позиции, а в КУ12 появится глобальный маршрут, соединяющий робота и целевую точку. Рис. 9.11 ❖ Пример навигации робота с помощью Кау2 9.4. Симуляция автономной навигации робота После ознакомления с официальным примером Иау2 вы, вероятно, захотите запустить Шу2 на своем роботе. В этом разделе мы продолжим использовать ОгщтВо! в качестве примера и изучим методы настройки Ызу2. Далее мы запустим симуляцию автономной навигации на вашем компьютере. Настройка Иау2 включает в себя две основные части: настройку парамет- ров №у2 и конфигурацию файла запуска ЬаипсН. 9.44, Настройка параметров Мэу2 Для работы автономной навигации в Иау2, помимо ввода данных, необхо- димо настроить такие параметры, как алгоритм глобального планирования маршрута и координаты робота, чтобы быстро адаптироваться к различным типам роботов. Пакет пау2_Ьпп§ир, использованный в разделе 9.3, содержит параметры по умолчанию, которые можно изменять. Эти параметры адаптированы и пере- несены в каталог рагат пакета оп§тЬоГ_паУ1§аНоп. Открыв файл опдт
ЬоЕ_пау2.уат1, вы увидите более четырехсот строк, содержащих информацию о размерах робота, конфигурации датчиков, ограничениях скорости и на- стройках дерева поведения. Хотя информации достаточно много, большая часть параметров схожа. Например, параметры с названием, содержащим Еоргс, относятся к информации о темах, таких как/.чсап, /ойот и т. д. Парамет- ры с названием, содержащим Егате, относятся к информации о координа- тах, таких как тар, Ьазе Ипк и т. д. В качестве примера приведем настройку параметров планировщика поведения, где используются тема одометрии (ойошЕорЕс) /ойот и глобальная система координат (&1оЬа1_Егате) тар. Ьб_пам1да(ог: гоз__рагэтебегз: иье_51Л_[гпе: Тгие д1оЬа1_Егапе: пар гоЬоб_Ьа5е_Егапе: ЬазеИпк ос!оп_1оргс: /оСсп Ьб_1оор_с1и гаНоп: 10 Помимо общих параметров, конкретные алгоритмы планирования имеют множество специализированных параметров настройки. Правильная кон- фигурация этих параметров позволяет роботу лучше адаптироваться к раз- личным сценариям. Рассмотрим в качестве примера алгоритм АМСЬ, для которого доступны следующие параметры. апс!: гоз__рагэпебегз: аТрЕа!: 0.2 а!рЬа2: 0.2 аТрЬаЗ: 0.2 а1р||а4: 0.2 аЕрРаЬ: 0.2 Ьазе_Егапе_Щ: "Ьазе_Еоосрг1пг" Ьеап_5к1р_с1г51апсе: 0.5 Ьегп_5к1р_еггог_Ц1ге5Ьо1с1: 0.9 Ьеап_5к1р_бЬгезко1с1: 0.3 с1с_Реэп5'к1р: ЕаЕзе # Шум вращательного движения модели одометрии. # Шум поступательного дзижения модели одометрии. # Шум вращения после поступательного движения модели одометрии. # Шум поступательного дзижения после вращения модели одометрии. # Дополнительный параметр шума модели одометрии. # Идентификатор системы координат базовой рамы робота. # Поро_свое значение расстояния для пропуска луча. # Порог ошибки для пропуска луча. # Порог веэоятности для пропуска луча. # Выполнение оптимизации пропуска лучей. д1оЬа1._Егапе_Щ: "пар" 1апЬс1а_5Ьог1:: 0.1 1азег_1’-кеИЬоо(1_пах_с115г: 2.0 1азег_пах_гапде: 100.0 1азег_т1п_гапде: -1.0 # Идентификатор системы координат глобальной рамы. # Параметр экспоненциального распределения (для модели # короткого расстояния попаданий). # Максимальное расстояние модели поля правдоподобия лазера. # Максимальная дальность измерений лазера. # Минимальная дальность измерении лазера. 1а5ег_псг1е1._1:уре: "1лке1г1кх><М:ге1с1| # Тип модели лазера. г.ах_Ьеапз: 60 пах_рагНс1.е5: 2060 П1Г,_рзг!:гс1е5- 506 ос!оп_Е| ане_г<1: "обоп" рЕегг: 0.05 рЕ_а: 0.99 # Максимальное количество лучей, учитываемых при каждом сканировании. # Максимальное количество частиц фильтра частиц. # Минимальное количество частиц фильтра частиц. # Идентификатор системы координат одометрии. # Параметр ошибки фильтра частиц. # Параметр 2 фильтра частно. гесоеегу а'Ыта Еаз!: 0.0 # Коэффициент восстановления для быстрой сходимости.
гесо7егу_а1рЬа_51.ои: 0.6 # Коэффициент восстановления для медленной сходимости. гезанрТе _тп1:ег уа!: 1 # Интервал предварительном выборки. гоЬоб_побе1_1уре: "па72_атс1: :0тИегепНа1.Мо1:топМос1е1" # Тип модели движения робота. 5ауе_ро5е_гате: 0.5 з1дта_РП: 0.2 НцЬгоабсазс: тгие # Частота сохранения позы. # Сэеднеквадратическое отклонение модели попаданий. # Выполнение трансляции преобразования координат. Ггап5-Еогг1_1:о1егапсе: ирба1:е_1лп_а: 0.2 ирс!абе_п1п_б: 0.25 0.5 г_г.ах: 0.05 2_гапс1: 0.5 г-ЗЬогб: 0.05 зсап_Црт.с: зсап 1.0 # Допустимое значение преобразования координат # Порог обновления (минимальное угловое изменение). # Порог обновления (минимальное изменение расстояния). # Вероятность попадания. # Вероятнос’ь максимального измерения. # Вероятность случайного измерения. # Вероятность ксро-кого измерения. # Имя темы данных лазерного сканирования. Некоторые из вышеперечисленных параметров, такие как 8сап_1ор1с, а1- р!та1, а1р1та2, могут на первый взгляд показаться сложными для понима- ния, однако они необходимы для адаптации к реальным движениям робота. В процессе использования можно корректировать их в зависимости от кон- кретного приложения и характеристик робота, чтобы оптимизировать точ- ность и эффективность позиционирования. Например, изменяя количество частиц, модель сканирования и параметры шума, можно найти баланс между вычислительными ресурсами и точностью позиционирования. 9.4.2. Конфигурация файла запуска 1_аипс11 После получения базового файла параметров и пакета навигации следующим шагом является запуск множества связанных с навигацией узлов в Ка\'2 че- рез файл запуска ЬанпсН и загрузка необходимых конфигурационных пара- метров для каждого узла. Обратившись к примеру ТигГ1еЬоГЗ в пау2_Ьппещр, можно обнаружить ключевой файл для запуска Изу2 Ьпп§ир.1аипс1т.ру. Этот файл запускает все ключевые узлы, необходимые для Кау2, включая вызов параметров файла, использование 5ЬАМ и др. Ьгтпдзр_стс1 = 1пс1ес1е1ешпсН0е5сггр1:топ( РуНюп! аипсЬ0е5сгт.рбт.оп5о,.1Гсе(о5.рас1т.]отп(1.аипсп_с11Г, ' Ьгтпдир_1аипсН.ру1)), 1аипсЬ_агдинеп1:ь={ 'папезрасе': папезрасе, 'изе_папезрасе': и5е_пэпезрасе, ’з1ат': з1ап, 'пар': Иар_уар1._1:1.1е, 'и$е_5Ъ1ч_Н1т1е': и5е_51т_Нпе, 'рагапз_Н1е': рагапз_Ше, 'аиГоЩагС : аибозбагЦ ' изе_сопрозШоп': изе_сотро5гНоп, 'изе_гезраиг,': и5е_гезраип, }.Н:ет5(),
Для нашего робота достаточно включить содержание этого файла запуска. Б случае ()г1§тпВс)1 полным файлом запуска является оп§шЪо1:_паУ1§а1лоп/ 1а1тс11/па\'_Ьг1п§ир_§а2еЬо.1аипс1т.ру, его содержание приведено ниже. тпрогГ ой Ггот апепг_1.т(1ех_рукЬоп. раскадез тпрогк дек_раскаде_зЬаге_с1кгессогу Геол каипсЬ ъпрсгГ каипсЬСезсгтрккоп Ггоп каипсЬ.асккопз 1прогк ОесТагеьаипсНАгдитепС Геол каипсЬ.асЫопз тпрогб ТпскаекаипсЬСезсгкркгоп Ггол '1гипсН.1аипсЬ_с1е5сгкрккоп_5оигсе5 1прогк РубЬспкаипсНОезсгкрктопВоигсе Ггот кгипсЬ.зиЬзтгЕиЫопз кпрогб каипсЬСопЕ-.дигатгоп Ггоп 1аипсЬ_го5.аск1оп5 кпрогк 1Ьйе аеГ деге"аке_1аипсЬ_с1е5сгкрпоп(): # Получение общего каталога пакета. па71даЫоп2_с11г = дек_раскаде_з1таге_с11гескогу( 'оггдЕпЬок_па71даЕ1ор') па72_Ьгкпдир_сНг = дек_раскаде_зЬаге_Ыгес1:огу('па72_Ьгкпдир') в Определение конфигурации использования симуляционного времени. и2е_51|Л_Т:кпе - каипсЬСопНдигаЕ1оп('и8е_5т.1л_Гт1ле', бекас1к=Чгсе') # Определение конфигурации пути к файлу карты. пар_уат!_ракЬ = каипсЬСопНдигаТ:коп( 'пар', ФеЕаи1к=оз.раТЬ. докГ|(пгу1дактоп2_с11г, 'гарз', пу_пар.уат!')) # Определение конфигурации пути к файлу параметров. пау2_ра эт_раг1н = каипсНСопбтдига1:т.сг.(' ра‘атз СПе', ФеГги1Т=05.ракЬ.до1п(паукдаТ:гоп2_<Лг, 'рагап!', 'сг1дтпЬоС_пау2.уалЪ')) # Путь к файлу конфигурации РУт.7. г укг_сопГкд_с1тг = оз.ракЬ. до1п(||ау2_Ьг1пдир_с11г, 'гИ.г', ,1'ау2_с1ебаи11:_7ке1л/.Г71г|) геГигп каипс1т0е5сгкрк1оп([ # Объявление параметра запуска использования симуляционного времени. 0ес1агекаипсЬАгдип’епк(,изе_51п_Е1пе', ФеЕаи1к_уа1 ие-изе_зкп_Ыпе, бе5сгкркгоп='Если истинно, то используются симуляционные (СагеЬо) часы.'), # Обоявление параметра запуска пути к файлу карты. ЬесДагекаипсКАгдигепД 'тар', бе1 аи1к_7аые Г|ар_уагр1_рагЬ, Сезсгтрткоп^Полный путь к файлу карты для загрузки.'), # Объявление параметра запуска пути к файлу параметров. 0ес1агекаипсЬАгдигепГ('рага1Л5Д11е', 0е1:аи11:_ракиб=па72_рагап_ракЬ, с1езсгкр1:гоп= Полный путь к файлу параметров для загрузки.'), # Включение конфигурации запуска Мау2. 1пс1ис1екаипсЬ0езсг гркт.оп( РукЬопкаипс1'|Сезсг1рЕксп5сигсе([пгу2_Ьг1пдрр_<1кг, ' /'каипсЬ', /Ьгкпдар_1аипс1т.ру 1), каипсЬ-агдигепкв { 'тар': пар_уап1_раТЬ, 'изе_з11л_Т:гпе': изе_511л_1:кпе, 'рагапзДИе : па72_рагап_ракЬ}.т.ке1лз(),
), # Запуск узла КУт.г. Нос1е( раскаде='гугг2', ехес|ЛаЫ.е=' гут.г2', паг1е=' гугг2', агдиР1еп15=[1 -сГ, г\Д2_соп€гддНг], рага1'1е1ег5-[{'иье_5ТР1_1:гпе': иье_5тп_1:гпе}], оисри*= зсгегп'), ]) Этот файл запуска определяет и запускает навигационную структуру Иау2, включая настройку и использование симуляционного времени, загрузку файлов карты и параметров, а также запуск инструмента визуализации НХЛ/ для отображения навигации и состояния робота на экране. 9.4,3» Симуляция автономной навигации робота Все готово, теперь можно запустить симуляционную среду робота и начать автономную навигацию с помощью №у2! Откройте первый терминал и вы- полните следующую команду для запуска симуляционной среды робота Огщ- тВоГ. $ гоз2 1аипсЬ 1еагп1пд_дагеЬо_Ьагрюп1с 1оад_тЬоТ_ГсРаТ-ТАСО—гча7е_дагезО—Ра^топТс. ЪэипсЬ.. ру После небольшой задержки откроется симуляционная среда с моделью робота, как показано на рис. 9.12. Рис. 9.12 ❖ Модель и сцена в симуляционной среде Ог!д!пВо1:
Затем откройте второй терминал и выполните следующую команду для запуска пакета навигации Мау2. $ гэз2 ТаипсЬ ог1дгпЬоЬ_п<зк'1даГгэп па7_Ьг1пдар_дагеЬо.1аипсГ|.ру Откроется интерфейс КУ12 с картой из главы 8, как показано на рис. 9.13. Рис. 9.13 ❖ Карта симуляции автономной навигации ОпдтВоГ В данный момент в терминале отображается непрерывный вывод информации, что связано с отсутствием настройки начальной позы робота. После установки начально го положения данная проблема будет устранена. В открытом окне Р.У12 необходимо настроить отображаемые элементы, как показано на рис. 9.14. Нажмите на панели инструментов параметр 20 Розе ЕзНта1е (20-оценка позы) для оценки начального состояния, выберите на- чальную позу робота на карте и подтвердите выбор. После этого предупреж- дения в терминале исчезнут. Затем нажмите параметр 20 Соа1 Розе (2П-цель позы) и выберите точку назначения на карге, как показано на рис. 9.15. Робот немедленно начнет движение в режиме автономной навигации.
Рис.9.14 ❖ Начальное позиционирование в симуляционной среде Р|1е ₽апе1з Не1р Моке Сатега к15е1есс -ф РОсиз Сатега ^Меазиге X 20 Розе Езчтаге □ 015₽1ау5 - в 61оЬа1 ОрГюпз Ахей Ргате Васкдгоипй Со1ог Ргате На1е ► X 61оЬа1 51а1из Ок ► ❖ бпд ► №1, йоЬ«1Мойе1 ► н, ЦазегЗсап г т Витсег НЙ______ даа | <& ГОак<дапоп2 .Й 48,48 48 30 Нак1да(юп ас(|ке Еоса1иа1юп асСже Реей Ьаск асНое ЕТА 5 а 01зСапсе гетаттд 2 64 гл Т!те Сакеп б 5 Несокелез о Тоо1з Рог \Ч₽-Ро11ои1пд Ниш оТ 1оорз О 5е1есиг а СОлСгоПег Иаппег Ре1аи1С • ОеСаиК -* Соа1 СИескег ЗтооСкег Ре(аи1С • 0е(аи11 • Ргодгезз СЬескег Ре(аи1( 9 РиОИзЬ Ротс 31 (рз НезеС 1.еП-С11ск: КоСаГе М1дд1е-С1|ск: Моке Х/Г Н1дМ*С||ск 2оот 5Н1Р1: Моге орНопз Рис. 9.15 ❖ Автономная навигация робота в симуляционной среде
9.5. Автономная навигация робота на практике В разделе 9.4 была реализована функция автономной навигации робота в си- муляционной среде. Насколько велика разница между навигацией виртуаль- ного и реального робота? Давайте проверим! 9.5,1. Конфигурация навигационной карты Карта, используемая в симуляции автономной навигации, была создана с по мощью технологии 81_АМ. Функция автономной навигации реального робота также требует 8ЬАМ для построения карты. В пакет навигации робота Оп&тВоГ включена карта по умолчанию. Перед началом навигации необходимо заменить ее на карту, созданную с помощью 8ГАМ. Для этого выполните следующие три шага. 1. Копирование файлов карты Скопируйте файл карты (*.р§ш) и файл конфигурации карты (*.уаш1), создан- ные с помощью 8ЕАМ, в папку оп§1пЬо1_паУ1§аНоп/тар8. 2. Изменение имени вызываемой карты Измените имя вызываемой карты в файле оп§тЬо1_паУ1§аНоп/1аипс11/пау_ Ьпп§щр.1анпсЬ, чтобы оно соответствовало имени файла конфигурации кар- ты, скопированного на предыдущем шаге. Например, в следующей конфи- гурации вызывается карга ту шар. # Определение переменной конфигурации пути к файлу карты. пар_уат1_ратЬ = 1_аипсЬСопТгдигаН.оп( 'пар', РеГаи11:=05.раСЬ4огп(огтд1пЬоС_пау1с|аНоп_с!’.г, 'пара', 'ну_пар.уап1')) # Определение переменной конфигурации пути к файлу параметров. пау2_рагап_ра!:Ь = 1анпсЬСопГгдига1:1сп(' рагэпаДПе', оегаиН:=с5.ра1:1т.догп(ог1.д1пЬо1:_пау1да11Оп_сЦг, 'рагат', 'ог^д^пЬо^:_паV2.уат',^')) 3. Перекомпиляция пакета функций После внесения вышеуказанных изменений перекомпилируйте пакет функ- ций в корневом каталоге рабочего пространства. На этом конфигурация карты завершена, и теперь можно использовать собственную карту для на- вигации.
9.5.2, Конфигурация параметров Ыау2 и файла запуска ЬаипсН Методы конфигурации параметров Кау2 и файла запуска для реального ро- бота аналогичны гем, чго используются в симуляционной среде. Обратимся к нашему примеру робота Оп^тВоО В каталоге оп§тЬоГ_паУ1 §а(зоп/рагат создайте файл оп^тЬоГпау.уат! и внесите в него информацию о размерах робота, конфигурации датчиков, параметрах алгоритма, ограни- чениях скорости, конфигурации дерева поведения и т. д, Ниже приведены некоторые ключевые параметры и их описание. агс1: гоз___рагаюебегз: и5е_ь1п_Нпе: РаГзе # Исполсзование симуляционного вэемени, применимо для # работы на реальном оборудовании. Ьа5е_Егаг1е_гй: 1 Ьазе_Гоо1:рггпг'' # Базовая система координат робота. д1оЬа1_€гаг1е_1с1: "мар" # Глобальная система координат, используемая для локализации. п1п_рагНс1е5: 569 # Минимальное количество частиц з фильтре частиц. рах_рагНс!е5: 2600 # Максимальное количество частиц в фильтре частиц. сопНоИеГ-Зегуег: гоз___рагаюеГегз: иье_51|Л_Н|пе: ЕаТье # Использование симуляционного времени. сонбгоПеМтециег.су: 16.0 # Частота работы контроллера, Гц. гЛп_х_уе1ост1:у_Ц1геьЬо1.с1: 0.001 # Минимальный порог скорости по оси х для определения # момента остановки робота. г»ах_уе1_х: 0.22 # Максимальная скорость по оси х для управления # максимальной скоростью движения робота вперед. 1сса1_соз1:пар: Госа1_созГюар: гоз___рэгаюеГегз: ирса1е_Ггериепсу: 5.0 # Частота обновления локальной карты стоимости, Гц. гобоГ_гас1го5: 0.08 а Радиус робота, используемый для расчета обхода препятствий. гезоТиггоп: 0.65 # Разрешение карты стоимости, метры. д1оЬаГ_созСпар: д1ооа1_созГпар: гоз___рагапегегз: ирса!е_Ггериепсу: 1.0 # Частота обновления глобальной карты стоимости, Гц. гоЬоб-Гайгиз: 0.08 # Радиус робота. Ьс_Но7ГдаГог: гоз___рагзпебегз: иье_з1|Л_ггюе: РаГзе # Использование симуляционного вэемени. # Имя файла ХМ_ по умолчанию для дерева поведения, определяющего задачи навигации. 6еГаи11_Ы_хп1_гПепате: " паусдате н ге р1арпгпд_аг.;1_гесоуегу. хп!" гесоуегтеззегуег: гоз_____рагаюебегз: изе_з1Р1_1:гюе: РаГзе # Использование симуляционного вэемени.
гесоуегурХидХпз: ["зрХп", "оаскир", "иаХХ"] # Определение модулей, используемых # для поведения восстанозления. Метод изменения файла запуска ЪаипсЬ также совпадает с симуляцион- ной средой. Полное содержимое файла запуска опутЬо1_паУ1&аНоп/1аипс1т/ пау_Ьг1Пйир.1аипсп.ру приведено ниже. #!/изг/ЬХп/руТЬопЗ ХпрогЕ оз Ггот аг»еп1_Хпс1ех_руЕЬоп.раскаде5 тпрогТ деХ_раскаде_5Ьаге_г|Хгестогу бгоп ХаипсЬ Хпрсгк ЕаипсЬСезсгтрЕХоп бгоп ХаипсЬ асНопз Хпрогк ОесХагеХаипсЬАгдипепк бгоп ХаипсЬ.асбХопз бпрогб ТпсХиоеЕаипсЬСеьсгХрЫоп бгоп ХаипсЬ.ХаилсЬ_безсг1рЫоп_5оигсе5 ХмрогР РубЬспХаипсЬ0е5сг1рбХоп5оигсе бгоп ХаипсЬ аиЬзШитХопа бпрогб ЕаипсЬСспбХдигаЫоп бгоп ХгипсЬ_гоз.ас1:1оп5 Хпрогб Мобе беб дегегабе_1аипсЬ_бе5сгХрбгоп(): # Получение путей к общим каталогам пакетов огбдгпЬоб_па7сдаЫоп и пгу2_Ьппдзр. огтдспЬеХ-ПаутдаНоп сКг = деС_раскаде_5Ьаге_бХгес1:огу( 'ог1дХгЬоТ:_па71дакХоп') пау2_ЬгХпдир_бгг = деб_раскаде_зЬаге_Ыгес1:огу(' пау2_ЬгХпуир') # Определение конфигурационной переменной использования симуляционного времени, по умолчанию » 'баХве'. и5е_5Хп_СХпе - 1_аипсЬСопбХдигаЫоп(' и5е_5Хп_бтпе', беГаиХ 1:-'-ГаХзе') # Определение конфигурационной переменной пути к файлу карты. нар_уапХ_рабЬ = ХаипсКСопНуигагХоп( 'лар', бебаиХб=05.рабЬ.до1п(ог1д1пЬок_па7ХдаЫоп_с1Хг, 'парз', 'пу_пар.уапХ')) # Определение конфигурационной переменной пути к файлу параметров. пау2_рагап_рабЬ - ХаипсЬСопГ1дигат:1оп(' рагапз_бХХе', бебаиХб=оз.рабЬ.до1п(ог1дХпЬоб_па7бдабХоп_бХг, 'рагат', 'ог ХдтгЬоб_пау2.уапХ')) гебигп ЕэипсЬЬезсгсрбХопЦ # Объявление параметра запуска использования симуляционного времени, для настройки # использования симуляционных (СагеЬо) часоз. Г'ес.Хаге1_аипсЬАгдипепб( 'изе_згп_Ыпе', аебаиХС:_7аХие-и5е_51п_г1пе. безсгХрЫоп=| Если истинно, то используются симуляционные (СагеЬо) часы.'), # Объявление параметра запуска пути к файлу карты, для указания полного пути к файлу карты # для загрузки. ОесХагеЕэипсЬАгдигепб('пар', 6е<:гиХб_иаХие=пар_уагХ_рэбЬ, безсггрЫоп='Полный путь к файлу карты для загрузки.'), # Объявление параме-ра запуска пути к файлу параметров для указания полного пути к файлу # парэметроз для загрузки. ОесХаге1.аипсЬАгдипепб( рагап5_бгХе', бебаиХб_7аХие=пэи2_рагап_раХЬ, безсг1рЫоп= Полный путь к файлу парэметэов для загрузки.'), # Включение файла описания запуска Иау2, пеэедача карты, симуляционного времени и файла # конфигурационных параметров. 1псХибецаипсЬ0езсг1рЫоп( РуХЬопХаипсЬСеесггрТХопСсигсе([па72_Ьггпдзр_с11г, '/ХаипсЬ', '/Ьг1пдир_ХаипсЬ.ру ]),
1зипсЬ_агдипеп1:5={ 'тар': 1т1ар_уагй_раСН, 'р5е_51п_НАе'; изе_5гп_1:гпе, 'рагалз Ше': па72_рагар_раЩ).1-(:еР15(), ), ]) В этом файле запуска сначала с помощью функции §е[_раскауе_5Иаге_сИ гес!огу() получаются пути к каталогам пакетов огщтЬоГпаущапоп и пау2_ Ьгтщгр, потом определяются использование симуляционного времени (няе_ 51т_Нте), путь к файлу карты (шаруапйраГк) и путь к файлу параметров навигации (пау2_рагат_ра11т) и т. д. Затем эти параметры передаются нави- гационному узлу для его запуска. 9.53. Автономная навигация робота на практике Теперь можно запустить функцию автономной навигации на роботе. Под- ключитесь к роботу ОН§1пВо1 по 88Н, откройте два терминала и выполните команды: первый терминал запускает шасси робота, второй - функцию ав- тономной навигации. # Терминал 1 робота. $ гоз2 (аипсб оггдгпсоб_Ьг1пдир огсдгпЬоШаипсК.ру изе_Ис1аг:-1:гие # Терминал 2 робота $ гоз2 1аипсН оггдгпЬоб_па7гдаГгоп паи_Ьг1пдир.1.аипсб.ру Теперь Изу запущен на роботе. Как просмотреть результат динамической автономной навигации? На компьютере выполните следующую команду для запуска верхнего уровня КУ12. # Компьютер. $ гоз2 1аипсН оггдгпЬоРмЛ/ Щзр1.ау_паутдаНоп.1аипсб.ру После открытия КУ12 робот будет некоторое время оставаться неподвиж- ным, и можно выбрать режим навигации к одной или нескольким целевым точкам. По умолчанию уставов/ен режим навигации к одной целевой точке 1, Навигация к одной целевой точке В открытом окне НУ 12 настройте отображаемые элементы, затем нажмите на панели инструментов параметр 2В Розе ЕзНтаТе (2П оценка позы) для оценки начального состояния и выберите начальную позицию робота на кар- те. После этого нажмите параметр 2В Соа1 Розе (2В цель позы) и выберите целевую точку навигации на карте. В этот момент робот начнет автономную навигацию, как показано на рис. 9.16.
Рис. 9.16 ❖ Навигация мобильного робота к одной целевой точке 2. Навигация к нескольким целевым точкам Нажмите элемент Рапе1з (Панели) в строке меню КУ:2, затем выберите мо- дуль НаУ1&аНоп2 и нажмите кнопку ОК, как показано на рис. 9.17. Рис. 9.17 ❖ Модуль многоцелевой навигации для мобильного робота © Если вам не удается найти модуль №у|дабоп2, установите его с помощью команды вибо арТ ।избаИ гоз )а22у-пау2*
В появившемся слева окне модуля навигации нажмите кнопку ШауротГ тос!е (Режим путевых точек), чтобы перейти в режим выбора нескольких точек, как показано на рис. 9.18. Используйте элемент Мау1^а11оп2 Соа1 (Цель ЦаУ1§аНоп2) на панели ин- струментов для выбора нескольких точек, через которые необходимо осущест- вить навигацию. После завершения выбора нажмите в модуле кнопку 81аг1 №у1§а11оп (Начать навигацию). Начнется движение по маршруту, робот по- следовательно пройдет через выбранные точки, как показано на рис. 9.19. Рис. 9.18 ❖ Режим выбора нескольких точек в №у2
9.6. Программирование автономной навигации робота Мы изучили базовый процесс автономной навигации с использованием КОЗ 2, но этот процесс всегда требует ручного выбора целевых точек. Есть ли более удобный способ? Например, можно ли с помощью программы отпра- вить роботу целевою позицию и получить результат выполнения навигации? В этом разделе мы рассмотрим методы программирования с использовани- ем №у2. 9,6.1. Работа функции Давайте сначала испытаем, как с помощью программы можно отправить целевую позицию и заставить робота двигаться к ней. В качестве примера автономной навигации выполните следующие коман- ды для запуска симуляционной среды и функций навигации на компьютере. # Терминал 1. $гоз2 ТаипсН 1еагпгпд_да2еЬо_Ьагчюпгс 1оаг1_тэоГ_'1.г(1аг_1пГо_пг2е_да2еЬо_Ьагполгс.'1аипс1т.ру # Терминал 2. $ го$2 Таспсб огтдтпЬоГ_па71даТ:гэп пау_Ьг1пдар_дагеЬо.1.аипсЬ.ру Затем откройте новый терминал и запустите следующий узел: $ ГЭ52 гип сгт.д1пЬс1_5епс1_доа1 ьеп<1_дог1_пос1е После запуска .можно увидеть, как робот движется к позиции (1, 1) на кар те, при этом в терминале постоянно выводится оставшееся расстояние до целевой точки, как показано на рис. 9.20. [1724321400.665857828] [6оа1Соогс1хпа1:е]: Кетахпхп§ 0хз1алсе •Ргот 0ез1хпа1хоп: 2.620710 [1724321408.675558922] [6оа1Соогс11па1:е]: Кетахпхп§ ОхзЕапсе Егот 0ез1:1па1:хоп: 2.620710 [1724321400.685362419] [боа1Соогс1хпа1:е]: Кетахпхп§ Охз1алсе -Ггот 0ез1хпа1хоп: 2.620710 [1724321400.695283357] [6оа1Соогс1хпа1е]: Кетахлхл§ 0хз1алсе Егот 0ез1хпа1хоп: 2.620710 [1724321400.705345815] [боа1Соогс11па1:е]: Кетахп1п§ Охз1алсе Тгот оезНлаНоп: 2.620710 [1724321400.715587558] [Соа1Соогс1хпа1:е]: Кетахпхп^ Схз1апсе Егот Оез^хпаИол: 2.620710 [1724321400.726017186] [6оа1Соогс1хпа1:е]: Кетахпхп§ 0хз1алсе ^гот 0ез1хпа11оп: 2.620710 [1724321400.735563162] [боа1СоогсПпа1е]: Кетахпхп§ Охз^апсе ^гот 0ез1хпа1хоп: 2.620710 [1724321400.744894317] [6оа1Соогс1хпа1:е]: Кетахпхп§ 0хз1алсе -Ргот 0ез1хла1хоп: 2.595710 [1724321400.755342633] [<Зоа1Соогс1хпа1е]: Кетахп1п§ Охз1алсе Егот ОезЕхпаТхоп: 2.595710 [1724321400.766230712] [боа1СоогсПпа1е]: Нетахпхп§ 0хз1апсе -Роот Оез^хпаНоп: 2.595710 [1724321400.775326377] [6оа1Соогс1хпа1е]: Кетахпхп§ 0хз1апсе -Ггот 0ез1хпа1хоп: 2.595710 [1724321400.785746084] [Соа1Соогс11па1е]: кетахпхп§ Рхз^апсе -Ггот ОезИпаИоп: 2.595710 [1724321400.795683643] [боа1Соогс1хпа1:е]: Кетахпхп§ Охз^апсе -Ргот ОезЕхпаНоп: 2.595710 [1724321400,805660854] [6оа1Соогс1хпа1:е]: Кетахпхл§ 0хз1алсе Егот ОезЕхпа1хоп: 2.59571© [1724321400.815935624] [6оа1СоогсНпа1е]• кетахпхп^ Охз^алсе -/гот 0ез1хпа1хоп: 2.595710 Рис. 9.20 ❖ Примео программирования автономной навигации мобильного робота Как с помощью программы отправить целевую позицию и заставить ро- бота выполнять автономную навигацию? Для этого нужно использовать раз-
личные АР1, предоставляемые Иау2. В соответствии с методом коммуника- ции КОВ 2 АР1 Мау2 можно разделить на следующие категории: О действия: управление выполнением роботом полного набора дей- ствий по планированию маршрута и навигации; О службы: предоставление специфических вызовов служб, таких как служба карты, очистка карты затрат и т. д.; О темы: реализация публикации и подписки на данные сенсоров, ин- формацию о состоянии и другие функции. Как программно вызывать эти интерфейсы для реализации функций ав- тономной навигации? Ниже мы рассмотрим методы программирования на С++ и РуГЬоп. 9.6.2. Методы программирования (С++) В этом разделе мы на языке С++ реализуем узел КОЗ 2 под названием Соа1- СоогсПпаге, который использует АР1 Ктау2 для отправки целей навигации и обработки результатов выполнения навигационных задач. Полный код реализации находится в оп§шЬо1_8спс1_§оа1/8гс и состоит из трех частей. Этот код в основном использует интерфейс действий 1\'ау2. 1. Инициализация клиента действий гЫ5->сИепС_рСг_ = гс1срэ_асНсг,: :сгеаге_с1гепг<№71даЩТоРС'Зе>(Шз, "пау1д<Яе_(:о_ро5е''); В конструкторе класса СоаЮоогсйпаСе инициализируется клиент действий, который может взаимодействовать с сервером навигационных действий Кау2. 2. Отправка цели навигации ааСо доз1_пзд Ма'лдгСеТоРоье: :Сса1(); доа1_пзд.роьеАеас1е1 .Ггапе_Щ = "пар"; доа!_пзд.розе.розе.розШэп.х - 1.0; доа1_пзд.роье.розе.розП:1О11.у = 1.0; доаТ.-Пзу.розе.розе.оггепТаН.оп.и = 1.0; гЬ1з->с11еп<:_р<:г_->а8у||С_зелс!_уоа'1(уоа1_тзд, 5епс1_доа1_арМоп5); В функции-члене зепс1_§оа1() создается цель навигации, которая отправ- ляется на сервер действий через клиента действий. Сервер действий запус- кается при запуске фреймворка Мау2 и, получив запрос на цель, начинает планировать глобальный маршрут. Затем он публикует тему стй уе! для локальной навигации, чтобы управлять движением робота к целевой по- зиции.
3. Обработка обратной связи и результатов Интерфейс действий Кау2 включает несколько типов обратной связи. Кроме того, предусмотрены три функции обратного вызова: для обработки ответа сервера на навигационную цель, обратной связи в реальном времени в про- цессе навигации и результата достижения целевой позиции. Рекомендуется ознакомиться с исходными файлами для полного понимания кода реализации. 9.6.3. Методы программирования (РуТНоп) Помимо С++, для программирования автономной навигации можно также использовать язык РуНюп. Логика кодирования полностью идентична, а пол- ная реализация кода находится в пакете оп§тЬо1_8епс1_§оа1_ру. 1. Инициализация клиента действий зеИ.сПепГ = АсПопСТгепЦзеИ, ^укдэ^еТэРозе, 'паЛдаГе-Гсцрозе') В конструкторе класса Ск>а1СоогсНпа1е создается клиент действий с по- мощью класса АсНопСПеШ, который может взаимодействовать с сервером действий навигации К'ау2. 2. Отправка цели навигации доа1_пгд = №у;.даГеТоРо',е.Соа1() доа1_п5д.рэ5е.Ьеа<1ег.<:гате_1с1 = 'тар' доа1_п5д.рэье.ро5е.ро51Г1оп.х = 1.0 доа1_п5д.рэ5е.ро5е.ро5Н:т.оп.у - 1.0 доа1_п5д.рэье.ро5е.ог1егЦагт.оп.1л1 - 1.0 5еИ.5епс1_доа1_Ри1:иге = 5е1-Г.с1гэп1:.5егс1_дэа1_а5упс(доа1_п5д, 1еегЬа:к_са11Ьаск=5еИ.Геег|Ьаск_саиЬаск) В методе-члене зепй §оа1 создается сообщение с навигационной целью, которое асинхронно отправляется через клиента действий. 3. Обработка обратной связи и результатов 5е1<:.5епс1_доа1_Ри1:иге.аг1с1_с1опе_саП.Ьаск(5е11:.доа1_геьроп5е_са11Ьаск) При отправке цели в клиенте действий устанавливается функция обратно- го вызова для обработки полученной в процессе навигации обратной связи и конечного результата. МК Рекомендуете?, ознакомиться с исходными файлами для полного понимания кода реэлизаиии.
9.7. Применение навигации для автономного исследования робота Мы изучили технологии ЬЬАМ и Кау2. Можно ли объединить их, чтобы стро- ить карту в процессе навигации? В этом разделе мы изучим этот вопрос, чтобы реализовать функцию автономного исследования с использованием 8ЬАМ и навигации! 9.7.1. Автономное исследование с использованием Ыау2 и 5ЬАМ ТооШох Вспомним раздел 9,4.2, где упоминалась конфигурация узлов Кау2 в файле запуска пау2_Ъпп§ир. Ьггпдар_спс! = 1пс1.ис1е1аипсНГ)е5>сгтр1:топ( РуГЬоп1аипсЬ0е5Сг1рМоп5оигсе(о5.раСЬ. ]01п(1а1'ПсЬ_с11 г, ' Ьггпдир_1.аипсЬ.ру')), саипсН_агдипеп1:5-{ ' па1яеьрасе': панехрасе, 'и5е_пзне5расе': и5е_папе5.эасе, 'гТарГ: =>1ал, 'пар . пар_уап1_Ше, 'и5е_511Р1_Сгпе': и5.е_51п_Нпе, 'рагап5_Н1г': рагап5_Ше, 'аиСоьСагС1: аиСохГагС, ' и5е_сопрозШоп': и5е_ссшро5Шоп, 'и5е_геьра1л/п': и5е_ге5раип, }. Нерв (), ) ' Здесь есть параметр з1ат, который может принимать значение Тгие или Га1зе. Вернемся к коду симуляции пау_Ьгт§ир_§агеЬо.1аипс1т.ру, который также ссылается на файл Ьгт^иркипсЬ.ру из пау2_Ьгт{*ир, 1пс1ис1е1аипср0е5С|'1р11оп( РуСРоп!.аипсЬ0е5сг1рНэп5оигсе([пау2_Ьг-1пд1р_(1тг, '/ЪаипсЬ', '/Ьг1пдир_1аипсЬ.ру' ]), 1аипсЬ_агди’1епс5-{ пар': пар_уап1_раГЬ, и5е_5гп_Сгпе': изе зич йпе, 'рагэР15_Л1е': па72_рага1’1_раСЬ}.1Сеп5(), ), Как же файл Ьпп§ир_1аипс1т.ру запускает узлы №у2? Перейдите в папку /ор1/го8/)а22;у/.';11аге/пау2_Ь1тп§ир/1аипс!1 и откройте Файл Ъпп§ир_1аипс1т.ру, где можно найти следующий код.
# Включение описания запуска 51.АМ. I пс1ис1е 1_а и пспОезс г грКо! । ( # Указание пути к файлу запуска 51 АМ. РутНог ЬэипсЬОеьсгт.р1:гоп5оигсе(оь.. ]о1п(1аипсп_с11г, ''ЛагИ.аипсЬ.ру')), # Выполнение данного описания запуска, если переменная 51ап истинна, со, И 1ттоп=1 ПСспс1г1:топ (ь1ат), # Передача параметров и файл запуска 51 АМ. 1аипсЬ_агдлпетб5={ 'пгпезрасе1: папезрасе, 'изе_51Р1_1:1пе': изе_з1п_1:гне, аиСоМаМ': аисозсагГ, 'изе_гезраил': изе_гезраип, 'рагапз_Гие': рагаю5_Гт1.е }.иер|з()), # Пространство имен. # Использование симуляционного времени. # Автоматический запуск. # Автоматический перезапуск после завершения. # Путь к файлу параметров. # Включение описания запуска локализации. 1пс1ийе1аипсп0езсггрНоп( # Указание пути к Файлу запуска локализации. РуСЬоп1 аипсЬ0е5сгАрГтоп8оигсе(о5. рабЬ. ]о1п(1аипсй_б1г, ' 1 оса1Л7аНоп_1.аипсЬ.ру')), Ч Выполнение данного описания запуска, если переменная зТар, ложна. сопФи-;.оп=1ГСопс1Шоп(Ру'('ЬопЕхрге55т.оп([,по1: ', зТап])), я Передача параметров в файл запуска локализации. 1аипс11_агдвпел1:5={ папезрасе : паыезрасе, # 'пар': тар_уап1_Ше, # 'и8е_51рИЛр1е': изе_з1п_1:гр|е, # аи±ов1:аг1:' : аибозбагб, # рагаР15_Гг1е': рагапз_Гт1е, # 'изе_сопрозШоп : изе_сопрозШоп, # 'изе_гезра1л/п': изе_гезраип, # 'сопба1пег_паге': ' пэ72_сопгайпег' # Пространство имен. Путо к файлу карты. Использование симуляционного времени. Автоматический запуск. Путь к файлу параметров. Использование составного узла. Автоматический перезапуск после завершения. Имя контейнера. }.иер|з()), В этом коде, если параметр з1ат установлен в значение Тгие, будет запу- щен файл 81ат_1аипс1т.ру из Мау2. Если параметр 81ат установлен в значение Гаке, будет выполняться только функция навигации. Откройте файл 81ат_1аипс1т.ру, в котором содержится алгоритм 8Е.АМ Тоо1- Ьох, описанный в главе 8. # Проверка наличия параметров узла зТаП-Фоооох в файле параметров. Ьа5_з1гп_1:оо1Ьох_рагаг8 = Наз№с1еРагапз(ьоигсе_Ше=рагапь_Ше, пос1е_гапе='51ап_гоо1оох ) # Если нет специфических параметров з1гп_Гоо1Ьох, запуск 51АМ тоо1Ьох без передачи этих # параметров. 5Гаг1:_81ап_Гсо1эох_срс1 - 1пс1и деЦаипсбОезсгт-рГтеп ( РуЩоп1_аипсЬПе5сг1.р11.оп8эигсе(51.ап_'1аипс11_Гг1.е), # Передача параметров в файл запуска 51АН, здесь передается только использование # симуляционного времени. 1аипсЬ_агдлпеаб5:{ и5е_5тт_Тйпе : иье_51т_Ггпе}.'Ц:еп5(), # Выполнение данного описания запуска, только если отсутствуют параметры 51э1п_1:оо1.Ьох. сопс1ит.оп=11п1.е55Сопс1ит.оп(1'а5_51.ап_1:оо"1.Ьох_рагагз))
# Если существуют специфические параметры 51ат_сос1Ьох, запуск 51АМ ТооТЬох с передачей этих # параметров. ьСагЕ_51ап_1:оо1Ьсх_сп(1_иИН_рагап5 = 1пс1ийе1аипс1пВе5сг1рЕТоп( РуТЬоп1аи11еЬ0еасг<рС1опЬоигсе(5'1а1'1_1аипсН_Е11е), # Передача параметров в файл запуска 51 АМ, включая использование симуляционного времени # и путь к файлу параметров. 1аипсН_агдипеп1:5={'и5е_51п_1:тпе': и5е_51т_Тгпе, ' $1ат_рагэт$_Н1е': рагатз_ЕПе}.11:етз(), # Выполнение данного описания запуска, только если присутствуют параметры з1ап_Е:оо1.Ьох. сО|‘с1ЕТтоп=1ЕСо||с1и1оп(Ьа5_51а1г1_1:оо1рох_рагат)) Проанализировав приведенный выше код, можно понять, что настройка параметров 51ат позволяет контролировать запуск алгоритма ЯЬАМ Тоо1Ьох. Таким образом, задача значительно упрощается: мы можем установить параметр 51ат в файле запуска навигации пау Ьпп^ир ^а/еЬоТаипсй.ру в значение Тгие, чтобы одновременно с запуском функции навигации Ктау2 активировать алгоритм ЯЬАМ. # Определение конфигурационной переменной использования 51.АМ, по умолчанию 'Тгие'. зТап = 1аипсйСопЕ1дигаЕ1оп('з1аГ|', йеЕаиП:= Тгие') # Включение файла описания запуска Мау2, передача карты, параметра симуляционного времени # и файла конфигурационных параметров. ТпсШекаипсЕВезсгТрНоп ( РуТЬоп1аипсйВе5сг1рЕ1оп5оигсе( [па72_Ьгтрдир_(1тг, ' /Тайпей', 1 /огтпдир_1 аипск. ру' ]), 1аипсй_агдитепСг- { 'тар : т?р_уат1_оаЦп, 'и5е_5гт_Нпе': иьб_5гт_1:1ре, ' рагатг_Е1Ле': па72_рагат_раЩ, з1ат': зТатПЛсетзО, ), После внесения этих изменений необходимо вернуться в рабочее про- странство для компиляции, а затем открыть два терминала и выполнить следующие команды. # Терминал 1: запуск симуляциоинои среды. $ гоз2 1аипсН 1еагп1пд_да7еЬо_ЬагГ|Оп1с 1оай_тЬот_Ттс1аг_тпЕс_па2е_дагеоо_Ытоп1с.1аипсЬ.ру # Терминал 2: запуск алгоритма навигации и построения карт Йау2. $ гоз2 1аипсН огтдгпооС_па7гдаТгоп пау_Ьг1пдир_да7еЬс.1.аипсй. ру После запуска мы видим, что в КУ!/ пока отсутствует полная карта. С по- мощью параметра Кау2 Соа1 (Цель Кау2) можно задать целевую позицию, как показано на рис. 9.21. Робот, направляясь к целевой позиции, будет не- прерывно строить карту.
Рис. 9.21 ❖ Автоматическая навигация и синхронное построение карты с использованием 51аМ 3 процессе автономного исследования можно заметить, что когда карта еще не полностью построена, путь глобальной навигации Иау2 представля- ет собой почти прямые линии от точки к точке. По мере заполнения карты 8ЕАМ глобальный путь постоянно корректируется, чтобы робот мог избегать обнаруженных препятствий и достигать целевой точки, одновременно вы- полняя построение карты по пути следования. Если навигационные точки охватывают все возможные позиции в окружении, робот в конечном итоге создаст полную карту окружающей среды, что и является целью автономного исследования и навигации с использованием 8ЬАМ. © Созданную кар_у можно сохранить для будущей навигации, как описано в главе 8. 97.2. Автономное исследование Мау 2 + СаПодгарНег Помимо встроенного в Мэу2 алгоритма 8ЬАМ, можно также интегрировать в Кау2 алгоритм СагХо§гар1тсг. Выполните следующие команды, чтобы по смотреть, как это работает. # Терминал 1: запуск симуляционной среды. $ гоз? ХаипсЬ Хеагп1пд_дз2еЬо_Ьагяоп1с Хсас1_пЬо1:_ХХЬаг_1пХо_Па7е_да7еЬо_Ьзгпопгс.ХаипсЬ.ру # Терминал 2: запуск алгоритма навигации и построения карт Ьау2. $ гоз2 ХаипсЬ огХдХпЬоГ_пас'1даЫоп пау2_сагХо.ХаипсЬ.ру После успешного запуска появится интерфейс, показанный на рис. 9.22, в котором вокруг робота уже имеется небольшая предварительно построен- ная карта.
Рис. 9.22 ❖ Начальный интерфейс автономного исследования с помощью Иау2 и СагТодгарпег С помощью параметра Хау2 6оа1 (Цель Мау2) можно задать целевую точку, и робот, направляясь к ней, будет непрерывно строить карту, как показано на рис. 9.23. Рис. 9.23 ❖ Процесс навигации и построения карты при использовании №у2 и СаЦодгарНег
Секрет одновременной работы функций Кау2 и Сат1о§гар1тег заключается в файле пау_саг1о.1аипс11.ру, содержание которого приведено ниже. строг! об Ггот атеп!_с,тс1ех_ру!поп.раскаде5 строг! де!_9аскаде_ь1тгге_с1сгес!о"у Егоз ЪаипсН строг! 1_аипсЬ0е5СГср!соп Ггот ТгипсЬ.зиЬзШииопз -строг!: каипскСопГсдигагсоп бгоп 1аипсЬ_гоз.ас!соп5 Строг!: Мойе Ггот 1гипсЬ_го5.5иЬ5!с!и!соп5 строг! ЕспаРаскаде51гаге Ггот 1аипсЬ.ас!соп5 строг! 1рс1иое!аипс1тСе5сгср!соп Ггот 1гипсЬ.1аипсЬ_с1е5сгсрссоп_5оигсе5 строг! Ру!Ьсп!аипсЬ0е5сгср!соп$ои"се Йе! дегега!е_1аипс1г_с1е5сгср!соп(): # #### Конфигуоация параметров узлов ###### # Путь к пакету навигации. па7тда!тэп2_с1сг = де!_раскаде_з1таге_с1сгес!огу( 'огсдспЬо!_пг\/сда!соп') в Использование симуляционного времени, здесь применяется СагеЬо, поэтому значение !гие. изе_5ст_!сте - 1аипсОСоп’Гтдигг!сог:('и5е_5ст_!тте|, с!еГас1!='!гсе') # Разрешение стрсяцейся карты. гэ5о1п!тэп = 1аипс1тСоп1Чдига!!оп('ге5о1иТ1Оп', С1е1:аи1!='0.05') # Период публикации данных карты. риЬ1с5Ь_регсос1_5ес = 1_аипсбСопСгдсга!топ('риЫ.с51т_регсое_5ес', бе<-аи'1!='1.0') # Путь к папке с конфигурационными файлами в пакете. соп!сдига!соп_(1сгес!огу = !аспсбСэп!:сдига!соп( 'соп!сдига!соп_с1сгес!огу', йе!ат1!= о5.расЬ.]о!п(па7сдассоп2_с1сг, 'сопбсд')) # Имя конфигурационного файла. сэп!сдига!!оп_Ьазег,ате = !аипсбСог.Гтдига!-соп( 'соп!сдага!сср_Ьа5епате', бе!аи1.!='1с15_2с1.1иа') # Параметры навигации. пау2_Ьгспдир_с1сг = дес_раскаде_51таге_с1сгес!огу('па72_Ьгспдир') пар_уат!_рагЬ = каипсЬСопГсдига!соп( 'пар', с1е!аи1!=о5.ра!Н.]осп(па7сда!соп2_с1сг, 'парз', 'с1ссз!ег.уат1')) пау2_рагат_ра!1т - каипсЬСоп(:сдига!соп( рагат5_!с!е', бе!ги',1.!=05.ра!1т. досп(пассда!соп2_йсг, 'рагат', 'огсдспЬо!_ пау2.уат1')) # Путь к файлу конфигурации К'Лз для визуализации. Г7Т2_ссп!сд_с1тг = О5.расЬ.]о!п(па72_Ьгспдир_с1тг, 'гутг') + "/па7’_бегаии_”!еч.Г7!г" ##### Запуск узлов: саг!одгарКег_пос!е, саг!одгар1?ег_оссирапсу_дгт<1_пос1е, г\гсг2 ############################################################################## саг!одгарЬег_по(1е = Мобе( раскаде='саг!осгар1тег_го5 , ехесп (аЬ1е=' саг!одгар|-1ег_пойе1, пате='саг!одгарЬег_посе , оо!ри(='зсгееп1, рагатекегз [{ и5е_5ст_!сте : и5е_5сп_!!те]], агдитеп!з=[' -сопНдига!соп_с!!гес!огу', сс'п!1дигас!оп_с1тгес!огу, ' -сопНдига!соп_эа5епэте', сопНдига!сор_Ьа5епаге]) саг!одгарЬег_оссирапсу_дгсс1_поСе = Иос1е( раскаде=' саг!одгар1гег_го5',
ехесиТаЫе-'сагСодгарЬег_оссирапсу_дг1.с1_поаг', па"1е=' сагГодгаркегоссирапсу_дгт.с1_посе', оибри1:=' зсгееп', рагатеДег 5=[ {'и^е_5гп_1:гне': и5е_5\пД1пе}], агдипепк5=['-гезо1.РНоп', геасТиКоп, '-риЫл5Ь_рег’..ос1_5ес', риЫт.5Н_рег1ой_5ес]) паукдаНопДаипсЬ = 1пс1 ийеЬаипсЬОеасггрМоп ( РуГЬоп1а11псЬ0еасг1рНэп:)оигсе([па72_Ьппдир_с1тг, '/1-аипсЬ1, '/Ьг1пдир_1аппсЬ.ру 1), 1аипсЬ_а1'дипепк5={ пар': пар_уап1_раЙ1, Р5е_5гл_Нг1е': изе_5гп_1:гпе, рагзпзДПе': га72_рагап_раСп}Л1:еп5(),) гу1г_поае - Ио<1е( раскаде-' г\,гг2', ехесиСаЫе- ' гИ,12', пане- гут.г2', агдипепкз=[' -(I1, гу12_сопН.д_с1гг], рагапекегз [{'иае_а1п_Ргпе': иае_а1Н_бргае}], олрсС= 5сггеп ) 1й = 1аипсЬ0езсггркЛоп() 1с1.ас1(1_ас+:гсп(сагкод''аркег_поае; 1с1.ас1с1_аскгср(саг1:одгарЬег_оссирапсу_дг1с1_поРэ) Щ.айсЦасНспСпаут.даКопД.аипсЬ) Щ. ас!с1_аскгог (гугггойе) гекзгп Ш При тщательном анализе видно, что в основе лежит файл саПо^гар1тег_пау2. 1аипсН.ру, в который добавлены узлы Кау2. Однако при запуске Ыау2 исполь- зуется не пау2_Ьпп$ир.ру, а файл запуска навигации паУ1§аНоп_1аипс1т.ру. Почему так сделано? Дело в том, что автономная навигация обычно опи рается на статическую карту, которая в КОЗ 2 представлена интерфейсом /тар. В приложении для автономного исследования нет заранее известной статической карты, поэтому робот должен одновременно строить карту с по- мощью СаНодгарйег и публиковать информацию карты /тар, чтобы исполь- зовать Ыау2 в процессе планирования пути и избегания препятствий. 9.8. Резюме В этой главе мы объединили теорию и практику, чтобы изучить автономную навигацию с использованием №у2. Мы не только рассмотрели основные алгоритмы в функциональной структуре Кга\’2, но и испытали функции ав- тономной навигации на симуляторе и реальном роботе. Также мы освой ли методы программирования АР1 в Хау2, реализовав вызов программ для управления роботом и задания целей навигации. Затем, объединив техно логию ЗТАМ с функцией автономной навигации, мы реализовали функцию
автономного исследования роботом, которая позволяет одновременно вы поднять Хтау2 и алгоритмы ЗЬАМ. На этом содержание книги завершено. Мы начали с основ КОЗ 2, изучи- ли принципы реализации и области применения таких механизмов ком- муникации, как темы, службы и действия. Мы познакомились с методами использования часто применяемых компонентов КОЗ, таких как файлы за- пуска ЬаипсЬ, преобразования координат Н, платформа визуализации К\Чг и физическая симуляционная среда СагеЬо. Мы также изучили определение и составные части робота, освоили процесс разработки реального робота и, даже при отсутствии необходимых условий, научились создавать симуля- ционные модели роботов с помощью файлов ЦКВР. После изучения теории мы продолжили путь разработки приложений для роботов, освоив методы реализации в КОЗ 2 таких функций, как машинное зрение, построение карт с помощью ЗЬАМ и автономная навигация. Теперь можно с уверенностью заявить, что вы знаете, как применять КОЗ 2 в разработке роботов! Хотя книга и завершена, КОЗ 2 и робототехника продолжают быстро раз- виваться, и наши исследования и практика также продолжаются. Поэтому это не конец, а новое начало. Желаем всем приятного и насыщенного путе- шествия в мире разработки роботов!
Предметный указатель с Саг!о§гарЬет, 481 О ВВ8 (Ва1а ВгзгпЪиНоп 8егу1се), 148 В1УА (Вупатшс У\йпс1о\у АрртоасПез), 512 6 СагеЬо,204 I 1МИ (Инерциальный измерительный блок), 332 М №у2, 508 О ОИКХ (Ореп Хейта! ИеШогк Ехсйап^е), 453 ОрепСУ, 424 ОКВВЬАМ, 490 К тозЬа§, 221 щ1, 225 КТАВ, 497 КУ12, 212 5 ЬЕАМ, 467 8ЬАМ Тоо1Ьох, 474 88Н (Весите 8Ье11), 161 Т ТЕВ (Типе Е1а5Нс Вапй), 513 11 (НапзГотт), 177 и ИКВГ (Итбеб КоЬоТ ВезспрНоп Готта!:), 240 V УВСойе (Угзиа! 81исНо Собе), 233 X ХАСКО, 256 V УОШ, 455 2 гЬат,437 А Алгоритм Дейкстры, 511 Алгоритм А* 511 д Действие, 123 3 Замкнутое управление, 307 И Интерфейс коммуникации, 111 К Калибровка камеры, 414
Предметный указатель ❖ 543 м Машинное зрение, 411 т Тема, 84 П Пакет функций, 65 Параметры КОЗ, 138 ПИД-регулятор, 308 Протокол коммуникации, 349 У Узел,74 Ф Файл запуска ЪаипсН, 167 Р Рабочее пространство, 60 Распределенная коммуникация, 160 Ш ШИМ (Широтно-импульная модуляция), 293 С Сканирование ОК-кодов, 436 Служба, 99 э Энкодер, 302
Книги издательства «ДМК Пресс» можно купить оптом и в розницу на складе издательства по адресу: Москва, ул. Электродная, д. 2, стр. 12, офис 7, тел. +7 (499) 322-19-38, а также заказать на сайте шшш.дткргезк.сот с доставкой в любой регион РФ Ху Чуньсюй, Ли Цяолун КО5 2 Программирование интеллектуальных роботов Главный редактор Мовчан Д. А. Зам, главного редактора Яценков В. С. еоИог@с|ткрге;5.сот Перевод Шевкун И. А. Корректор Синяева Г. И Верстка ЧаннозаА.А. Дизайн обложки Мовчан А. Г. Гарнитура РТ 8епГ. Печать цифровая. Усл. печ. л. 44,2. Тираж 200 экз. Веб-сайт издательства: ад\угу.с1ткргеяя.сот
Освойте программирование современных роботов на практике! Книга посвящена основным принципам работы с операционной сис- темой для роботов ВОЗ 2 и практике разработки роботов. В ней приводятся подробные объяснения ключевых концепций, компо- нентов и инструментов ВОЗ 2 и рассматриваются методы построе- ния симуляционных и реальных робототехнических систем, а также способы применения ВОЗ 2 для задач компьютерного зрения, по- строения карт и автономной навигации. Книга снабжена большим количеством иллюстраций, схем и исходного кода на языках С++ и Ру!Иоп, что позволяет не только освоить базовые функции ВОЗ 2, но и глубже понять методы разработки роботов и применить полу- ченные знания на практике. Основные темы книги: • назначение и принцип работы ВОЗ 2; • инструменты разработки роботов в составе ВОЗ 2; • моделирование роботов на платформах Са/еЬо и В\/1г; • взаимодействие с аппаратными ресурсами робота. Материал изложен на основе последних стабильных версий ВОЗ 2 и СагеЬо. Особое внимание уделяется практической реализации основных функций роботов Для начала обучения достаточно иметь только персональный компьютер. Издание адресовано как начинающим разработчикам, желающим познакомиться с системой ВОЗ 2 и применять ее на практике, так и опытным инженерам-робототехникам, которые могут использо- вать книгу в качестве справочного пособия. мгалллдмк.рф 15ВЫ 978-5-93700-412-3