Вы находитесь на странице: 1из 33

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ПОЛИТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ ПЕТРА ВЕЛИКОГО»
ИММиТ, кафедра «Мехатроника и роботостроение» при ЦНИИ РТК

Отчет о прохождении производственной практики

Зарубина Кирилла Витальевича


(Ф.И.О. обучающегося)

3 курс, группа 3331506/80401


(номер курса обучения и учебной группы)

Направление подготовки 15.03.06, «Мехатроника и робототехника»


(Направление подготовки (код и наименование)

Место прохождения практики: «Центральный научно-исследовательский и


опытно-конструкторский институт робототехники и технической
кибернетики»

Россия, 194064, г. Санкт-Петербург, Тихорецкий пр. д.21

Сроки практики: 08.06.2021г. – 29.06.2021г.

Руководитель практики от ФГАОУ ВО «СПбПУ»:

Габриель А.С., ст. преподаватель

Руководитель практики от профильной организации:

Лунев С.М., заведующий лабораторией

Оценка:

Научный руководитель-консультант:
Абросимов Э.А.

Руководитель практики
от ФГАОУ ВО «СПбПУ» Габриель А.С.

Дата:

1
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ

Тема: Экспортирование знаний из OWL-онтологий в классы с


помощью языков Python/C++ для непосредственного управления роботом.
Цель: знакомство с понятием OWL-онтологии, с фреймворком ROS,
фреймворком Protégé, разработка способа экспортирования и
импортирования знаний между OWL-онтологией и классами Python/C++ и
способа применения этих знаний при управлении роботом.
1. Анализ предметной области (OWL-онтологии);
2. Изучение функциональных возможностей фреймворка ROS;
3. Изучение функциональных возможностей фреймворка Protégé;
4. Изучить один или оба из вариантов библиотек для работы с OWL-
онтологиями (Python/C++);
5. Придумать и реализовать способы обмена знаниями между
онтологией и роботом: передача в онтологию сведений, на какой из участков
находится робот; передача в онтологию информации, обнаружен ли объект, и
если да, то какой; получение из онтологии с помощью машины логического
вывода (Reasoner) действий для робота, в частности движение в точку при
получении указаний с помощью стека навигации
6. Написание отчета.

2
СОДЕРЖАНИЕ

ВВЕДЕНИЕ..............................................................................................................4
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ...................................................................................5
1 OWL-ОНТОЛОГИИ.............................................................................................5
1.1 Язык OWL.....................................................................................................................
1.2 Основные элементы онтологий...................................................................................
1.3 Пример онтологии........................................................................................................
2 ОЗНАКОМЛЕНИЕ С НЕОБХОДИМЫМИ ПРОГРАММНЫМИ
ПРОДУКТАМИ.....................................................................................................11
2.1 Фреймворк Protégé.....................................................................................................
2.1.1 Использование Reasoner........................................................................11
2.2 Фреймворк ROS..........................................................................................................
2.2.1 Робот TurtleBot3.....................................................................................12
2.2.2 Gazebo......................................................................................................13
3 ОБЗОР БИБЛИОТЕК ДЛЯ РАБОТЫ С ОНТОЛОГИЯМИ...........................15
3.1 Cowl (язык программирования C++)........................................................................
3.2 Owlready2 (язык программирования Python)...........................................................
3.3 Выбор библиотеки......................................................................................................
ПРАКТИЧЕСКАЯ ЧАСТЬ...................................................................................18
4 МОДЕЛИРОВАНИЕ ПРОСТЕЙШИХ ЗАДАЧ...............................................18
4.1 Передача в онтологию сведений, на каком из участков находится робот
............................................................................................................................................
4.2 Передача в онтологию информации, обнаружен ли ОИ и если да, то
какой..................................................................................................................................
4.3 Получение из онтологии от Reasoner действий для робота...................................
ЗАКЛЮЧЕНИЕ.....................................................................................................25
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ............................................26
ПРИЛОЖЕНИЕ 1 ЛИСТИНГ КОДА УЗЛА-ПОДПИСЧИКА ROS.................28
ПРИЛОЖЕНИЕ 2 ЛИСТИНГ КОДА УЗЛА-ПУБЛИКАТОРА ROS...............31

3
ВВЕДЕНИЕ

Онтология, как формальный способ описания таксономий, является


своего рода базой знаний со структурой, состоящей из классов объектов и
отношений между объектами. OWL-онтология – это онтология, написанная
на языке OWL.
В работе будет рассмотрена онтология, спроектированная в рамках
ВКР «Разработка онтологии группы роботов, функционирующих в
интеллектуальном пространстве» студентом направления «Мехатроника и
робототехника» Я.С. Кондрашовой [3]. Данная онтология описывает
поведенческие принципы группы роботов. Проблема заключается в том, что
знания из онтологии не могут быть напрямую использованы роботом для
автоматического управления.
Целью данной работы является извлечение знаний из онтологии,
представление их в виде классов на языках Python/C++ и настройка
управления робота на основе этих знаний.
Были поставлены следующие задачи:
1. Ознакомление с понятием онтологий, рассмотрение представленной
онтологии.
2. Ознакомление с необходимыми для работы фреймворками (ROS,
Protégé).
3. Обзор двух предложенных вариантов библиотек для работы с
онтологиями (на языке Python и языке С++).
4. Моделирование простейших задач в симуляции с группой роботов с
использованием выбранной библиотеки и знаний онтологии.

4
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

1 OWL-ОНТОЛОГИИ
Онтология – способ формального представления понятий, называемых
классами, в некоторой области знаний и свойств, характеризующих эти
понятия. Такой способ представления знаний, как онтология может быть
использован как основа для базы знаний, при создании множества
индивидуальных экземпляров.
Процесс построения онтологии, согласно [1], состоит из создания
следующих блоков:
 классов и их свойств (classes, properties);
 свойств каждой концепции, описывающих различные
функциональные возможности и атрибуты концепции (слоты
(slots), иногда называемые роли);
 ограничения по слотам (также известных как аспекты/грани (slot
facets), иногда называемые ограничения ролей).
Также в [1] названы причины возникновения потребности в разработке
онтологий:
 совместное использование людьми или программными агентами
общего понимания структуры информации;
 обеспечение возможности использования знаний предметной
области;
 создание явных допущений в предметной области;
 отделение знаний предметной области от оперативных знаний;
 анализ знаний в предметной области.
1.1 Язык OWL

Язык OWL (Web Ontology Language) – язык для определения и


представления веб-онтологий [2].

5
Формальная семантика OWL описывает, как получить логические
следствия, имея такую онтологию, то есть получить факты, которые не
представлены в онтологии буквально, но следуют из ее семантики [2].
Язык OWL, ранней версией которого является язык OIL, основывается
на XML, но имеет пару отличий, представленных в [2]:
 онтология отличается от схемы XML тем, что это представление
знаний, а не формат сообщений;
 доступность инструментов, которые могут рассуждать. Такие
инструменты обеспечивают общую поддержку, делая
строительство онтологии намного более доступным, чем
строительство четкой и работоспособной системы, чтобы
рассуждать в пределах одной XML схемы.

1.2 Основные элементы онтологий

Ниже приведён список составных элементов онтологий [1].


 Простые классы, находящиеся в корне различных
таксономических деревьев, представляют фундаментальные
понятия области знаний. При этом каждый класс, созданный в
мире OWL, является подклассом owl:Thing. Классы могут
пересекаться, совпадать и не пересекаться, что задаётся в
настройках класса.
 Индивиды – члены классов, имеют смысл конкретных вещей.
Индивиды обладают признаками класса, наследуют его свойства.
Также два индивида могут совпадать, описывая один и тот же
объект, но имея разные имена.
 Свойства – бинарные отношения. Разделяются на свойства-
объекты (отношение между двумя представителями одного или
разных классов) и свойства-значения (отношение между
индивидуумами классов и типами данных).

6
Свойства обладают некоторыми характеристиками, отвечающими за
логику онтологии [1].
 TransitiveProperty. Если свойство P транзитивно, то справедливо
следующее:
∀ x , y , z ; P ( x , y ) ; P ( y , z ) → P( x , z) (1)
 SymmetricProperty. Если свойство P симметрично, то
справедливо следующее:
∀ x , y ; P ( x , y )→ P ( y , x ) (2)
 FunctionalProperty. Если свойство P функционально, то
справедливо следующее:
∀ x , y , z ; P ( x , y ) ; P ( x , z ) → y=z (3)
 inverseOf. Если свойство P1 помечено, как inverseOf P2, то
справедливо следующее:
∀ x , y ; P 1 ( x , y ) → P 2( y , x ) (4)
 InverseFunctionalProperty. Если свойство P обратно
функционально, то справедливо следующее:
∀ x , y , z ; P ( y , x ) ; P ( z , x ) → y=z (5)
1.3 Пример онтологии

В качестве примера рассматривается онтология, проектирование


которой подробно описано в [3]. Данная онтология содержит в себе правила
поведения группы роботов, которые будут описаны далее.
Два робота работают в зоне, разбитой на разграниченные участки,
выполняя некоторую обработку участков.
Робот в каждый момент времени может выполнять только одну
операцию: перемещение между участками или обработка участка.
Перемещение и обработка возможны в двух режимах: обычный и
форсированный.
Робот способен определить своё местоположение абсолютно точно и
время, необходимое для завершения обработки участка. Состояние
7
обработки участка может быть одно из трёх: не проводилась, проводится,
завершена.
На участке могут находиться некоторые объекты интереса ОИ, которые
представлены двух типов: ОИ1 и ОИ2. ОИ обнаруживается роботом сразу
при входе на участок.
Роботы не должны заходить на один и тот же участок, если на нем нет
ОИ.
Если робот зашел на участок и обнаружил ОИ1, второй робот должен
сразу завершить свой маршрут или обработку участка и отправиться на
участок с ОИ1 в режиме перемещения Обычный. Первый робот при этом
продолжает обработку участка в режиме Обычный
Если робот зашел на участок и обнаружил ОИ2, второй робот должен
сперва завершить обработку участка и отправиться на участок с ОИ2 в
режиме перемещения Форсированный. Первый робот при этом продолжает
обработку в режиме Форсированный.
Данная онтология создавалась в редакторе Protégé (описание которого
приведено в данном отчёте в пункте 2.1 Фреймворк Protégé).
Для описания данного сценария были созданы классы, представленные
на рисунке 1.

Рисунок 1 – Классы онтологии


Каждый класс содержит индивидуумов, которые показаны на рисунке
2.

8
Рисунок 2 – Экземпляры классов онтологии
Описание классов (все классы также являются непересекающимися)
представлено на рисунке 3.

Рисунок 3 – Описание классов онтологии


Свойства классов показаны на рисунке 4.

Рисунок 4 – Свойства классов онтологии


Описания свойств классов (все свойства также не пересекаются) и их
характеристики представлены на рисунке 5.

9
Рисунок 5 – Описание свойств классов онтологии и их характеристики

10
2 ОЗНАКОМЛЕНИЕ С НЕОБХОДИМЫМИ ПРОГРАММНЫМИ
ПРОДУКТАМИ
Для выполнения работы использовались фреймворки Protégé и ROS,
описание которых приведено в подразделах этого раздела. Для установки
фреймворка Protégé был использован Docker.
Docker позволяет сначала «упаковать» приложение со всем его
окружением и зависимостями в контейнер, который может быть развернут на
любой Linux-системе, а также предоставляет набор команд для управления
этими контейнерами.
Это дало возможность использовать Protégé из командной строки.
2.1 Фреймворк Protégé

Protégé – свободный, открытый редактор онтологий и фреймворк для


построения баз знаний [4]. Редактор Protégé-OWL позволяет строить
онтологии для семантической паутины, в частности на OWL.
Как было сказано в пункте 1.3 Пример онтологии, онтология, с которой
будет производиться работа, была спроектирована в данном редакторе.
Protégé позволяет наглядно отобразить все составные части онтологии.
А при построении позволяет делать все необходимые операции по созданию
классов, индивидов, их свойств.
2.1.1 Использование Reasoner
Одной из самых важных особенностей Protégé – Reasoner.
Функции у Reasoner следующие:
 проводить классификацию и показывать иерархию выводимых
классов;
 проверять согласованность, показывать несоответствия;
 определять тип индивида – принадлежность к определенному
классу.

11
В OWL Reasoner работает на основе концепции “Open World
Reasoning” – OWR. Это рассуждение об открытости мира – категория,
которая обозначает открытость баз знаний, берущая основание на
предположении об открытости мира. Этот фактор выступает в качестве
принципиального отличия таких баз знаний от баз знаний, основанных на
предположении о замкнутости мира.
Так это говорит о возможности получения фактов путем вывода их
логическими рассуждениями.
То есть если какой-то тезис не был явно задан как истинный, нельзя
называть его строго ложным – предполагается же, что правдивость данного
тезиса не была занесена в базу знаний, а потому должна иметь
неопределенность своего значения.
Таким образом создаются явные допущения, что даёт возможность
изменять эти допущения при изменении влияющих на них знаний без ущерба
логике.
2.2 Фреймворк ROS
Операционная система робота (The Robot Operating System – ROS) –
это гибкая структура для написания программного обеспечения робота [5].
Иначе набор инструментов, библиотек и соглашений, направленных на
упрощение задачи создания сложного и надежного поведения роботов на
самых разных роботизированных платформах.
ROS основан на архитектуре графов [6]. Так вся обработка данных
производится в узлах графа, узлы в свою очередь могут получать и
передавать информацию через топики.
Внутри среды можно осуществлять картографирование, навигацию,
тестировать системы компьютерного зрения, строить симуляции и другое.
Всё это осуществляется с использованием различных ROS-ориентированных
пакетов.
Для работы была выбрана версия ROS Melodic, так как она подходит к
версии дистрибутива Ubuntu 18.04 операционной системы Linux.

12
2.2.1 Робот TurtleBot3
TurtleBot3 – один из стандартных платформенных роботов, которых
поддерживает ROS [7]. Это небольшой программируемый мобильный робот
на базе ROS для использования в образовательных целях, исследовательских
работах и прототипировании продуктов.
Основные технологии TurtleBot3 – это SLAM, навигация и
манипуляция, что делает его подходящим для домашних сервисных роботов.
TurtleBot3 может запускать алгоритмы SLAM (одновременной локализации и
картографирования) для построения карты.
Подробную инструкцию по работе с TurtleBot3 можно найти в [7].
TurtleBot3 поддерживает среду разработки моделирования, которая
может быть запрограммирована и разработана с помощью виртуального
робота в процессе моделирования. Для этого существует две среды
разработки: одна использует узел (fake node) с инструментом 3D-
визуализации RViz, а другая – 3D-симулятор робота Gazebo.
Узел fake node подходит для тестирования с моделью робота и
движения, но не поддерживает датчики. Gazebo же отлично подходит для
SLAM и навигации, так как он поддерживает такие датчики, как IMU, LDS и
камеру.
2.2.2 Gazebo
В ходе практической части работы будет использована среда Gazebo.
Это 3D динамический симулятор с возможностью точного и эффективного
моделирования роботов в сложных условиях [8]. Подобно игровым движкам,
Gazebo предлагает физическую симуляцию с гораздо более высокой
степенью точности, набор датчиков и интерфейсов как для пользователей,
так и для программ.
Gazebo может быть использована для:
 тестирования алгоритмов робототехники;
 проектирования роботов;

13
 выполнение регрессионного тестирования с реалистическими
сценариями.
Также Gazebo имеет такие ключевые особенности, как:
 несколько физических движков;
 богатая библиотека моделей роботов и сред;
 большое разнообразие датчиков;
 удобные программные и графические интерфейсы.
Подробную инструкцию использования Gazebo можно найти в [8].

14
3 ОБЗОР БИБЛИОТЕК ДЛЯ РАБОТЫ С ОНТОЛОГИЯМИ
Для работы с онтологией посредством команд Protégé необходимо
использовать библиотеки для одного из языков программирования, которые
поддерживает ROS: C++ или Python. Для рассмотрения были предложены
две таких библиотеки на разных языках, ниже будет представлен обзор на
них и выбор той, с которой и будет проводиться работа.
3.1 Cowl (язык программирования C++)

Cowl – библиотека для работы с онтологиями на языке OWL [9].


Достаточно новая библиотека, разработанная, чтобы получить доступ к
онтологиям на языке С++, так как ранее такие решения были написаны на
Java или Python.
Cowl придерживается следующих принципов:
 код программы написан со стандартом С11 без использования
расширений, зависящих от компилятора, и специфичных для
платформы вызовов API;
 полностью самодостаточный, без каких-либо внешних
зависимостей, кроме uLib;
 высокое быстродействие и малая затратность памяти.
К сожалению, Cowl обладает и некоторыми минусами,
представленными ниже.
 Библиотека в настоящее время предоставляет только один парсер
функционального синтаксиса, хоть и архитектура Cowl допускает
наличие нескольких парсеров.
 Также он не предоставляет возможности редактирования
онтологий.
Важно отметить, что библиотека находится на раннем этапе развития,
что отмечают разработчики [9].

15
3.2 Owlready2 (язык программирования Python)

Owlready2 – это библиотека для управления онтологиями OWL на


языке Python [11]. Она позволяет загружать, изменять, сохранять онтологии и
поддерживает рассуждения через HermiT Reasoner, обеспечивая прямой
доступ к онтологии.
Owlready2 обладает следующими возможностями:
 импорт онтологий в форматах RDF/XML, OWL/XML или
NTriples из репозитория или интернета;
 манипулирует онтологическими классами, экземплярами и
аннотациями, как если бы они были объектами Python;
 может добавлять методы Python в классы онтологий;
 повторно классифицирует экземпляры автоматически, используя
HermiT Reasoner;
 экспорт в файл OWL.
Архитектура Owlready2 нацелена на быстродействие, но ещё более на
малые затраты памяти, что важно для онтологий, так как иногда они могут
занимать объёмы выше 200 Мб.
Owlready2 поддерживает quadstore (виртуализация хранилищ) в
оптимизированной базе данных. Классы и индивидуумы динамически
загружаются из quadstore по мере необходимости, кэшируются в памяти и
уничтожаются, когда больше не нужны.
Подробную инструкцию пользователя можно найти в [11].
3.3 Выбор библиотеки

В пунктах 2.1 Cowl (язык программирования C++) и 2.2 Owlready2


(язык программирования Python) были представлены краткие характеристики
двух библиотек ля работы с OWL-онтологиями.
Наша задача подразумевает необходимость не только считывать и
обрабатывать онтологию, но и вносить изменения. Также одним из важных

16
критериев является запуск Reasoner непосредственно из этой библиотеки, без
обращения к Protégé. Таким требованиям удовлетворяет только одна из
рассмотренных библиотек – Owlready2 на Python, которая и будет
использована в практической части работы.

17
ПРАКТИЧЕСКАЯ ЧАСТЬ

4 МОДЕЛИРОВАНИЕ ПРОСТЕЙШИХ ЗАДАЧ

Практическая часть работы была выполнена в дистрибутиве Ubuntu


18.04 операционной системы Linux, установленной на виртуальной машине
Oracle VM VirtualBox.
Моделирование производится в мире, удовлетворяющем условиям
онтологии, описанной в пункте 1.3 Пример онтологии. Карта мира
представлена на рисунке 6.

TurtleBot3
OI11 Burger
Robot2 TurtleBot3
Area12 Area11 Waffle_pi
Robot1

OI21
Area22
Area21

Рисунок 6 – Карта мира с обозначениями


4.1 Передача в онтологию сведений, на каком
из участков находится робот

Для осуществления передачи информации о принадлежности робота


конкретному сектору на поле изначально определяется топик ROS, в который

18
публикуются данные о координатах робота. Для этого открывается
симулятор командой:
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
Происходит загрузка мира, после чего узел Gazebo начинает
публикацию данных в топик, который можно определить, написав команду:
$ rosnode info gazebo
Из представленного списка топиков найдены топики, принимающие в
качестве сообщения одометрические данные (тип сообщения
nav_msgs/Odometry). Это топики /tb3_0/odom (для Robot1) и /tb3_1/odom (для
Robot2).
Информация о типе данных nav_msgs/Odometry предоставляется по
команде:
$ rosmsg info nav_msgs/Odometry
Нас будет интересовать м часть сообщения:
geometry_msgs/PoseWithCovariance pose
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
Дальше был создан пакет, в котором объявляется узел-подписчик на
топики /tb3_0/odom и /tb3_1/odom.
В директории системы сборки catkin был создан пакет talkers с
зависимостью rospy (использование языка Python). Для того, чтобы узел
запускался из файла, нужно изменить CMakeLists.txt в только что созданном
пакете, добавив:
catkin_install_python(PROGRAMS
scripts/talker.py #Путь файла с кодом
DESTINATION talker)
Далее был написан код узла (см. Приложение 1).
Разбор нужных для этого задания строчек кода:

19
import sys
sys.path.append("/home/kirill")
import owlready2
from owlready2 import *
Данный код импортирует в файл программы библиотеку owlready2, так
как код должен взаимодействовать с онтологией.
onto=get_ontology("file:///home/kirill/data-docker/protege-docker-x11/
workspace/ Ontology_GroupOfRobots.owl").load()
В переменную onto проиcходит импорт онтологии с указанием пути до
неё, по этой переменной будет осуществляться обращение к онтологии.
import roslib
roslib.load_manifest('talkers')
import rospy
from nav_msgs.msg import Odometry
Эта часть кода импортирует библиотеки для связи с ROS, загружает
тип данных Odometry.
def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("/tb3_0/odom", Odometry, callback1)
rospy.Subscriber("/tb3_1/odom", Odometry, callback2)
rospy.spin()
Код функции, где определяется имя узла, далее идёт команда, которая
считывает сообщение из /tb3_0/odom типа Odometry и передаёт его в
функцию callback(), вызывая её. Следующая команда совершает аналогичные
операции, только принимая значения положения Robot2. Последняя команда
обеспечивает бесконечную работу узла, пока он не будет закрыт вручную.
def callback1(data):
if ((data.pose.pose.position.x > 0)&(data.pose.pose.position.y > 0)):
onto.Robot1.BeInTheArea = [onto.Area11]
elif ((data.pose.pose.position.x <= 0)&(data.pose.pose.position.y > 0)):
20
onto.Robot1.BeInTheArea = [onto.Area12]
elif ((data.pose.pose.position.x <= 0)&(data.pose.pose.position.y <= 0)):
onto.Robot1.BeInTheArea = [onto.Area21]
else:
onto.Robot1.BeInTheArea = [onto.Area22]
onto.save(file = "NewOnto", format = "rdfxml")
Код данной функции определяет положение робота Robot1 по его
координатам. Переменная data.pose.pose.position.x (имя переменной взято из
вывода информации о типе данных nav_msgs/Odometry) хранит в себе
координату x, с y и z – аналогично. Так разбиение по секторам происходит по
принципу: если робот в первой четверти на координатной плоскости, то он на
Area11, на второй – Area12, на третьей – Area21, на четвёртой – Area22.
В конце происходит сохранение онтологии под именем NewOnto.
Функция callback2() аналогична и сделана для робота Robot2.
Изменения в онтологии (принадлежность роботов определенному
сектору) после запуска созданного узла представлены на рисунке 7.

Рисунок 7 – Изменения в онтологии


4.2 Передача в онтологию информации, обнаружен ли ОИ
и если да, то какой

Для реализации этой задачи был использован тот же узел, что и в


предыдущем подпункте, так как для этой цели также необходим узел-
подписчик.
Разбор нужных для этого задания строчек кода из Приложения 1:
onto.OI11.BeInTheArea = [onto.Area12]
onto.OI21.BeInTheArea = [onto.Area21]
Nothing = onto.ObjectOfInterest("Nothing")

21
В основном теле программы задаётся положение ОИ11 и ОИ21, был
создан индивидуум Nothing, который понадобится при выполнении функций
callback 1 и 2.
if (onto.Robot1.BeInTheArea == onto.OI11.BeInTheArea):
onto.Robot1.Find = [onto.OI11]
elif (onto.Robot1.BeInTheArea == onto.OI21.BeInTheArea):
onto.Robot1.Find = [onto.OI21]
else:
onto.Robot1.Find = [onto.Nothing]
Данный код был добавлен к функции callback1. Он вносит в онтологию
изменения по тому, нашел ли робот Robot1 ОИ11 или ОИ21. Для этого он
проверяет совпадает ли сектор робота с сектором одного из ОИ, при
совпадении передавая в онтологию информацию, что ОИ был найден. Если
же робот покинул сектор с ОИ, либо ещё не находил ОИ, то в онтологии
будет информация о том, что робот не нашёл ничего (как на рисунке 8).

Рисунок 8 – Утверждения робота Robot1


Статус робота изменится (рисунок 10), когда он попадёт на сектор с
ОИ (рисунок 9).

22
Рисунок 9 – Новое положение робота Robot1

Рисунок 10 – Утверждения робота Robot1


Так, при попадании Robot1 на Area12, на которой находится OI11,
считается, что Robot1 нашёл объект OI11.
4.3 Получение из онтологии от Reasoner действий для робота

Для того, чтобы передавать роботу любую информацию, было


определено, из какого топика ROS робот получает сообщения
соответствующего этой информации типа, и создан узел-публикатор,
который будет отправлять такие сообщения в вышеупомянутый топик. В
качестве примера (робот должен покрутиться, найдя ОИ) было принято
реализовать код, отличия которого от кода в Приложении 1 будут описаны
далее (полный листинг см. в Приложении 2).
Узел был создан так же, как и при выполнении предыдущих заданий.
from geometry_msgs.msg import Twist
Был импортирован тип данных Twist, который содержит в себе вектора
linear и angular.
23
def writer():
pub1 = rospy.Publisher('/tb3_0/cmd_vel', Twist, queue_size = 10)
pub2 = rospy.Publisher('/tb3_1/cmd_vel', Twist, queue_size = 10)
rospy.init_node('writer', anonymous=True)
for i in range(10):
sync_reasoner([onto])
pub1.publish(call1())
pub2.publish(call2())
rospy.sleep(2.0)
Выше представлен код основной функции writer(). Изначально мы
создаём две переменные, которые заявляют, что наш узел публикует
сообщения в топики /tb3_0/cmd_vel и /tb3_1/cmd_vel типа Twist, очередь
сообщений достигает 10. Так же сообщаем через rospy.init_node имя нашего
узла.
Далее в цикле после каждой итерации вызывается Reasoner, и 10 раз
происходит отправка сообщений обоим роботам. Сообщения передают
результаты выполнения функций call1() и call2().
def call1():
twist_robot1 = Twist()
if onto.Robot1.Find == [onto.OI11]:
twist_robot1.linear.x = 0.0
twist_robot1.angular.z = 2.0
elif onto.Robot1.Find == [onto.OI21]:
twist_robot1.linear.x = 0.0
twist_robot1.angular.z = 1.0
else:
twist_robot1.linear.x = 0.0
twist_robot1.angular.z = 0.0
return twist_robot1

24
Данная функция создаёт локальную переменную типа Twist, изменяя её
в зависимости от условия: если найдет ОИ1, то робот Robot1 будет вращаться
быстрее и совершит больше оборотов, чем если будет обнаружен ОИ2. При
этом, если ничего обнаружено не будет, робот не предпримет никаких
действий.
Аналогичная функция написана и для робота Robot2.
Сохранение онтологии в данном случае не требуется, так как не
происходили её изменения.

25
ЗАКЛЮЧЕНИЕ

При выполнении задания были изучены характеристики и возможности


фреймворков Protégé и ROS, такие библиотеки ROS, как TurtleBot3 и Gazebo,
был проведён обзор возможностей двух библиотек для работы с OWL-
онтологиями: Cowl на С++ и Owlready2 на Python. Были написаны
программы узлов (писателя и подписчика) ROS, реализованы простейшие
задачи на группе роботов в 3D-симуляторе Gazebo.
Проделанная работа способствовала знакомству с понятием онтологии
и принципами её построения, с основными элементами онтологий,
инструментом их моделирования.
В рамках данной работы была спроектирована и запущена рабочая
модель, решающая проблемы, которые были озвучены в задании.

26
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Муромцев Д.И. Онтологический инжиниринг знаний в системе: учеб.


пособие/ Д.И. Муромцев — СПб: СПб ГУ ИТМО, 2007. — С. 62.

2. OWL 2 Web Ontology Language Document Overview (Second Edition). —


URL: https://www.w3.org/TR/owl2-overview/ (дата обращения: 26.06.2021)
– Режим доступа: свободный. — Текст: электронный.

3. Кондрашова Я.С., Разработка онтологии группы роботов,


функционирующих в интеллектуальном пространстве: ВКР, защищена
08.06.21, руководитель В.Н. Уланов/ Я.С. Кондрашова — СПб: СПбПУ,
2021. — с. 64.

4. Protégé [Электронный ресурс]: Википедия. Свободная энциклопедия. —


URL: https://ru.wikipedia.org/wiki/Protégé (дата обращения: 26.06.2021) –
Режим доступа: свободный. — Текст: электронный.

5. ROS: About ROS: официальный сайт. — URL: https://www.ros.org/about-


ros/ (дата обращения: 26.06.2021) – Режим доступа: свободный. — Текст:
электронный.

6. Lentin Joseph. Robot Operating System (ROS) for Absolute Beginners:


Robotics Programming Made Easy. — Apress, 2018. — ISBN
9781484234051.

7. TurtleBot3: 1. Overview: официальный сайт. — URL:


https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/#overview

27
(дата обращения: 26.06.2021). – Режим доступа: свободный. — Текст:
электронный.

8. Gazebo: Beginner: Overview: официальный сайт. — URL:


http://gazebosim.org/tutorials?cat=guided_b&tut=guided_b1 (дата
обращения: 26.06.2021). – Режим доступа: свободный. — Текст:
электронный.

9. Cowl: What is this?: официальный сайт. — URL:


http://sisinflab.poliba.it/swottools/cowl/about/index.html (дата обращения:
26.06.2021). – Режим доступа: свободный. — Текст: электронный.

10. Owlready2. Docs: Introduction: официальный сайт. — URL:


https://owlready2.readthedocs.io/en/v0.32/intro.html (дата обращения:
26.06.2021). – Режим доступа: свободный. — Текст: электронный.

28
ПРИЛОЖЕНИЕ 1 ЛИСТИНГ КОДА УЗЛА-ПОДПИСЧИКА ROS

#!/usr/bin/env python3

#import OWL_files

import sys

sys.path.append("/home/kirill")

import owlready2

from owlready2 import *

#import ROS_files

import roslib

roslib.load_manifest('talkers')

import rospy

from nav_msgs.msg import Odometry

#Download ontology

onto=get_ontology("file:///home/kirill/data-docker/protege-docker-x11/
workspace/Ontology_GroupOfRobots.owl").load()

def callback1(data):

if ((data.pose.pose.position.x > 0)&(data.pose.pose.position.y > 0)):

onto.Robot1.BeInTheArea = [onto.Area11]

elif ((data.pose.pose.position.x <= 0)&(data.pose.pose.position.y > 0)):

onto.Robot1.BeInTheArea = [onto.Area12]

elif ((data.pose.pose.position.x <= 0)&(data.pose.pose.position.y <= 0)):

onto.Robot1.BeInTheArea = [onto.Area21]

else:

onto.Robot1.BeInTheArea = [onto.Area22]

if (onto.Robot1.BeInTheArea == onto.OI11.BeInTheArea):

29
onto.Robot1.Find = [onto.OI11]

elif (onto.Robot1.BeInTheArea == onto.OI21.BeInTheArea):

onto.Robot1.Find = [onto.OI21]

else:

onto.Robot1.Find = [onto.Nothing]

onto.save(file = "NewOnto", format = "rdfxml")

def callback2(data):

if ((data.pose.pose.position.x > 0)&(data.pose.pose.position.y > 0)):

onto.Robot2.BeInTheArea = [onto.Area11]

elif ((data.pose.pose.position.x <= 0)&(data.pose.pose.position.y > 0)):

onto.Robot2.BeInTheArea = [onto.Area12]

elif ((data.pose.pose.position.x <= 0)&(data.pose.pose.position.y <= 0)):

onto.Robot2.BeInTheArea = [onto.Area21]

else:

onto.Robot2.BeInTheArea = [onto.Area22]

if (onto.Robot2.BeInTheArea == onto.OI11.BeInTheArea):

onto.Robot2.Find = [onto.OI11]

elif (onto.Robot2.BeInTheArea == onto.OI21.BeInTheArea):

onto.Robot2.Find = [onto.OI21]

else:

onto.Robot2.Find = [onto.Nothing]

onto.save(file = "NewOnto", format = "rdfxml")

def listener():

rospy.init_node('listener', anonymous=True)

rospy.Subscriber("/tb3_0/odom", Odometry, callback1)

30
rospy.Subscriber("/tb3_1/odom", Odometry, callback2)

rospy.spin()

if __name__ == '__main__':

onto.OI11.BeInTheArea = [onto.Area12]

onto.OI21.BeInTheArea = [onto.Area21]

Nothing = onto.ObjectOfInterest("Nothing")

listener()

31
ПРИЛОЖЕНИЕ 2 ЛИСТИНГ КОДА УЗЛА-ПУБЛИКАТОРА ROS

#!/usr/bin/env python3

#import OWL_files

import sys

sys.path.append("/home/kirill")

import owlready2

from owlready2 import *

#import ROS_files

import roslib

roslib.load_manifest('talkers')

import rospy

from geometry_msgs.msg import Twist

#Download ontology

onto=get_ontology("file:///home/kirill/data-docker/protege-docker-x11/
workspace/
NewOnto").load()

def call1():

twist_robot1 = Twist()

if onto.Robot1.Find == [onto.OI11]:

twist_robot1.linear.x = 0.0

twist_robot1.angular.z = 2.0

elif onto.Robot1.Find == [onto.OI21]:

twist_robot1.linear.x = 0.0

twist_robot1.angular.z = 1.0

else:

twist_robot1.linear.x = 0.0
32
twist_robot1.angular.z = 0.0

return twist_robot1

def call2():

twist_robot2 = Twist()

if onto.Robot2.Find == [onto.OI11]:

twist_robot2.linear.x = 0.0

twist_robot2.angular.z = 2.0

elif onto.Robot2.Find == [onto.OI21]:

twist_robot2.linear.x = 0.0

twist_robot2.angular.z = 1.0

else:

twist_robot2.linear.x = 0.0

twist_robot2.angular.z = 0.0

return twist_robot2

def writer():

pub1 = rospy.Publisher('/tb3_0/cmd_vel', Twist, queue_size = 10)

pub2 = rospy.Publisher('/tb3_1/cmd_vel', Twist, queue_size = 10)

rospy.init_node('writer', anonymous=True)

for i in range(10):

sync_reasoner([onto])

pub1.publish(call1())

pub2.publish(call2())

rospy.sleep(2.0)

if __name__ == '__main__':

writer()

33

Вам также может понравиться