Pull to refresh

Можно ли привить кибериммунитет роботу? Практическое исследование на примере DIY робота официанта

Level of difficultyMedium
Reading time8 min
Views2.2K

Иногда, устроившись  на мягком пуфике с книжкой, так и хочется скосплеить Громозеку из мультфильма Тайна третьей планеты, и сказать “Официант, 400 капель яблочного сока и печеньку”.

Рис. 1. “Официант, 400 капель яблочного сока и печеньку”
Рис. 1. “Официант, 400 капель яблочного сока и печеньку”

Мы решили реализовать такого робота на практике на платформе AlphaBot под управлением Raspberry PI 4 и назначить его официантом в нашем коворке.

Рис. 2. “Alphabot-официант с KasperskyOS CE”.
Рис. 2. “Alphabot-официант с KasperskyOS CE”.

Одна из важнейших и часто недооцененных задач при разработке «домашних» решений таких, как умные пылесосы, Smart TV и т. д. — обеспечение приватности пользователей. Для того, чтобы робот мог двигаться по квартире робот должен быть оснащен камерой, а камера потенциальный источник чувствительной информации. Совсем недавно широкую огласку получил случай, когда робот пылесос посылал в облако фото с камеры на котором была хозяйка в неудобном положении. Даже информации о траектории движении робота или информация о графике его раоты может быть интересной для недоброжелателей.

Поддействием весеннего солнца и хорошего настроения 1-го апреля мы решили
попробовать добавить роботу киберимунитет. Для этого в качестве операционной системы был использован KasperskyOS CE.

Начали мы с того, что проанализировали требования и составили список того, что должна делать система:

  • Предоставлять возможность передавать роботу высокоуровневые команды при помощи telegram сообщений («Привези сок», «Забрал напиток»)

  • Предоставлять механизм передачи роботу команд управления (вперед, назад, поворот налево, поворот направо, стоп)

  • Сок должен наливаться автоматическим дозатором

  • Автоматически определять положение робота

  • Знать положение дозатора

  • Автоматически определять позицию «студента‑клиента»

  • Предотвращать передачу команд от других студентов в процессе выполнения заказа

  • Робот должен прокладывать маршрут и автоматически приезжать к » студенту‑клиенту» из любой точки коворкинга и позволять поставить чашку на поднос

  • Робот должен прокладывать маршрут и автоматически приезжать от студента‑клиента к дозатору от «студенту‑клиенту»

  • Робот должен дождаться налива сока в стакан из дозатора

  • Робот должен прокладывать маршрут и автоматически возвращаться с чашкой сока к «студенту‑клиенту» от дозатора

Общая архитектура нашего решения получилось такая:

Рис. 3. Общая архитектура системы управления роботом.
Рис. 3. Общая архитектура системы управления роботом.
Рис. 4. Укрупненная схема передачи команд роботу.
Рис. 4. Укрупненная схема передачи команд роботу.

В этой статье мы расскажем о реализации программы управления роботом на KasperskyOS. Остальные компоненты системы будут описаны в последующих статьях.

Подготовка RaspberyPi 4 к работе

Для получения отладочной информации необходимо подключить к raspberry pi 4 преобразователь для работы с UART через USB. На плате Alphabot`а UART выведен на разъем в передней части платы. Для отладки программ, запущенных на роботе, удобно подключить преобразователь USB2UART к этому разъему.

Рис. 5.Подключение преобразователя  USB2UART к Raspberry PI, установленной на Alphabot.
Рис. 5.Подключение преобразователя USB2UART к Raspberry PI, установленной на Alphabot.

Если робот Alphabot собран, то значительно удобнее подключить преобразователь к разъему UART на Alphabot, что позволит не разбирать робота при необходимости получить отладочную информацию. В качестве терминала, например, можно использовать Minicom.

Рис. 6 Отладочный вывод KasperskyOS в консоль в UART.
Рис. 6 Отладочный вывод KasperskyOS в консоль в UART.

Предварительно надо настроить minicom на работу с устройством /dev/ttyUSB0. Инструкция по настройке может быть найдена тут /6/. Необходимо отметить, что KasperksyOS CE 1.1.1 не включает привычного пользователям Linux командного терминала. В UART выдается только отладочная информация. Для вывода отладочной информации из своей программы разработчик должен осуществлять вывод в стандартный поток ошибок, например при помощи команды fprintf(stderr, “Some error \n").

Разработка программы в KasperskyOS

Установка KasperskyOS SDK

KasperskyOS SDK можно использовать Linux Debian 10 или Ubuntu 20 LTS. Подробная инструкция по установке приведена в руководстве /1/. KasperskyOS CE является встраиваемой системой и для ее запуска необходимо cформировать загрузочный образ с операционной системой и прикладными программами и записать его на MicroSD карту. Перед использованием необходимо провести первоначальную инициализацию MicroSD карты. Данная операция описана в руководстве по KasperskyOS /1/

Управление двигателями Alphabot при помощи GPIO в KasperskyOS

На Alphabot установлены моторы постоянного тока. IN1 и IN2 подключены к левому двигателю, IN3 и IN4 подключены к правому двигателю альфабота. ENA и ENB - это разрешающие контакты, высокоактивные. Чтобы отрегулировать скорость альфабота, возможно выводить ШИМ-сигнал на контакты IN1, IN2, IN3 и IN4. Управление моторами может осуществляться путем выдачи управляющих сигналов на GPIO.

Рис. 7 Команды для управления моторами Alphabot.
Рис. 7 Команды для управления моторами Alphabot.

Детальная информация Alphabot может быть найдена в руководстве пользователя Alphabot /5/ .

KasperskyOS API для работы с GPIO

Для работы с GPIO KasperskyOS SDK предоставляет системную сущность GPIO, которая включает драйвер. При работе с GPIO эту сущность необходимо добавить в проект. Прикладная программа может использовать специальное API для взаимодействия с этой сущностью.

Рис. 8 Взаимодействия прикладной программы client с сущность GPIO в KasperskyOS CE.
Рис. 8 Взаимодействия прикладной программы client с сущность GPIO в KasperskyOS CE.

API для работы с GPIO включает следующие функции:
GpioInit() - Инициализировать подсистему GPIO
GpioOpenPort(char* name, GpioHandle *handle) - открыть порт
GpioSetMode(GpioHandle h, uint32 pin_number, GpioMode mode) - установить режим работы пина (GPIO_DIR_IN, GPIO_DIR_OUT, GPIO_EVENT_LOW_LEVEL, GPIO_EVENT_HIGH_LEVEL, GPIO_EVENT_RISE_EDGE, GPIO_EVENT_FALL_EDGE)
GpioOut(GpioHandle h, uint32 pin_number, uint32 signal) - подать сигнал на пин
GpioIn(GpioHandle h, uint32 pin_number, uint32 &signal) - считать сигнал

Проект в KasperskyOS CE имеет определенную структуру, информацию о которой можно найти в документации /1/. Структура минимального проекта для работы с GPIO показана на Рис.9.

В качестве основы для разработки своего проекта мы использовали пример gpio_output из SDK KasperskyOS, в который добавили функции для выдачи команд на двигатели Alpahot. Первоначальная инициализация GPIO может быть реализована следующим образом:

GpioHandle InitAlphabot() {
GpioHandle handle = NULL;
if (GpioInit()) {
fprintf(stderr, "GpioInit failed\n");
return EXIT_FAILURE;
}
if (GpioOpenPort("gpio0", &handle) || handle == GPIO_INVALID_HANDLE) {
fprintf(stderr, "GpioOpenPort failed\n");
return EXIT_FAILURE;
}
GpioSetMode(handle, GPIO_PIN_NUM_IN1, GPIO_DIR_OUT);
GpioSetMode(handle, GPIO_PIN_NUM_IN2, GPIO_DIR_OUT);
GpioSetMode(handle, GPIO_PIN_NUM_IN3, GPIO_DIR_OUT);
GpioSetMode(handle, GPIO_PIN_NUM_IN4, GPIO_DIR_OUT);
GpioSetMode(handle, GPIO_PIN_NUM_ENA, GPIO_DIR_OUT);
GpioSetMode(handle, GPIO_PIN_NUM_ENB, GPIO_DIR_OUT);
return handle;
}

Выдача команд управления "движением вперед" и "остановки" Alphabot может быть реализована так:
void forward(GpioHandle* handle) {
fprintf(stderr, "forward\n");
GpioOut(*handle, GPIO_PIN_NUM_IN1, HIGH);
GpioOut(*handle, GPIO_PIN_NUM_IN2, LOW);
GpioOut(*handle, GPIO_PIN_NUM_IN3, LOW);
GpioOut(*handle, GPIO_PIN_NUM_IN4, HIGH);
GpioOut(*handle, GPIO_PIN_NUM_ENA, HIGH);
GpioOut(handle, GPIO_PIN_NUM_ENB, HIGH);
}

void stop(GpioHandlehandle) {
fprintf(stderr, "stop\n");
GpioOut(*handle, GPIO_PIN_NUM_IN1, LOW);
GpioOut(*handle, GPIO_PIN_NUM_IN2, LOW);
GpioOut(*handle, GPIO_PIN_NUM_IN3, LOW);
GpioOut(*handle, GPIO_PIN_NUM_IN4, LOW);
GpioOut(*handle, GPIO_PIN_NUM_ENA, LOW);
GpioOut(*handle, GPIO_PIN_NUM_ENB, LOW);
}

Для проверки работы GPIO мы разработали минимальное тестовое решение на Kaspersky OS, которое после старта посылает команды на вращение колес в разные стороны. Структура проекта в KasperskyOS CE обычно включает приложение, задачу инициализации einit и несколько конфигурационных фалов специфичных длял KasperskyOS . В нашем Проект для управления моторами Alphabot на KasperskyOS включает следующие задачи, разрабатываемы пользователем:

  • einit - отвечает за запуск приложений

  • client – собственно приложение для управление моторами через GPIO.

Рис. 9 Структура минимального проекта управления моторами Alphabot в KasperskyOS CE.
Рис. 9 Структура минимального проекта управления моторами Alphabot в KasperskyOS CE.

Необходимо отметить, что для работы задач управления моторами необходимы системные ресурсы сore, BSP и GPIO. Для доступа к системным ресурсам задача client и другие задачи обращаются к системным процессам при помощи посылки сообщений. KasperksyOS требует явно специфицировать разрешения на обмен сообщениями, которые будут происходить в процессе работы. Для этого необходимо задать правила передачи сообщений между задачами при помощи psl файлов. В правилах указываются разрешения на запуск приложения, передачи запроса и передачи ответа. Например, программа Client должна взаимодействовать с программой GPIO посредством API работы с gpio и должны быть выданы разрешения на отправку запроса и прием ответа:
request src=client.Client, dst=kl.drivers.GPIO
{
grant()
}
response src=kl.drivers.GPIO, dst=client.Client
{
grant()
}

Код минимального примера управления моторами Alphabot может быть найден в нашем репозитории с примерами.

Запрограммированный таким образом, бот движется с одной скоростью, причем достаточно резво. Было бы отлично научиться контролировать скорость робота. Для контроля скорости на Alphabot можно предназначены оптоэлектрические датчики числа оборотов WYC-H206 показанные на рис. 10. На оси моторов установлены диски с 20 щелями. С одной стороны от диска установлен светодиод, а со второй фотоприемник. Сигналы от этих датчиков приходят на GPIO7 и GPIO8 Raspberry Pi. Для подсчета числа оборотов колеса возможно подсчитать число прерываний от этих GPIO

Рис. 10. Подключение оптоэлектрического датчики числа оборотов
Рис. 10. Подключение оптоэлектрического датчики числа оборотов

В KasperskyOS есть возможность получать информацию о прерываниях в пользовательском приложении. В составе SDK KasperskyOS есть пример работы с прерываниями от GPIO gpio_interrupt. Для того, чтобы получить информацию о прерываниях в пользовательском приложении возможно:

1. Настроить отправку событий от программы GPIO в управляющую программу client в момент прихода прерывания от GPIO при помощи вызова GpioSetMode.

    GpioSetMode(handle, 0x7, GPIO_DIR_IN | GPIO_EVENT_RISE_EDGE);

  GpioSetMode(handle, 0x8, GPIO_DIR_IN | GPIO_EVENT_RISE_EDGE);

2. В цикле вызывать блокирующий вызов GpioGetEvent и анализировать параметры приходящего событий.

Полный пример работы с прерывания от датчика оборотов в KasperskyOS может быть найден по ссылке. К сожалению, нам не удалось заставить Alphabot генерировать правильное число событий.

Другим подходом к решению задачи плавного управления Alphabot является использование ШИМ контроллера. RaspberyPi 4 не имеет аппаратного ШИМа, и нам пришлось разработать программный.  Для реализации ШИМ была замерена минимальная возможная величина, на которую может заснуть поток с помощью функции usleep(useconds_t usec). Этой величиной может характеризоваться максимальная частота работы контроллера. Данной величиной оказалось 50 микросекунд. При значениях меньше 50 поток не блокировался, и управление возвращалось моментально. Проведя некоторое количество экспериментов, выяснилось, что частота 200Гц является вполне достаточной для стабильной работы. За промежуток времени в 5000 микросекунд, необходимо осуществить переход с высокого уровня на низкий.  Упрощенный график с результатами работы программного ШИМ выглядит следующим образом:

Рис. 11. Реализация программного ШИМ.
Рис. 11. Реализация программного ШИМ.

Программа управления на Alphabot получает по MQTT от сервера распознавания управления следующие команды:

  • Вперед заданное время

  • Назад заданное время

  • Назад влево заданное время

  • Вправо заданное время

  • Стоп

Прием управляющих команд по MQTT

Для добавления работы с сетью и MQTT в проект необходимо добавить сущность VFS, которая инкапсулирует работу с сетевым стеком, а также сконфигурировать разрешения на взаимодействие между сущностями VFS и client в psl файлах.

Рис. 12 Структура проекта с приемом команд по MQTT управлением моторами по GPIO в KasperskyOS CE.
Рис. 12 Структура проекта с приемом команд по MQTT управлением моторами по GPIO в KasperskyOS CE.

Программа client реализует прием сообщений по MQTT и управление моторами через GPIO. Исходный код программы доступен по ссылке.

Разбиение монолитной программы на сущности

Для увеличения защищенности возможно разделить обязанности программы client по сетевому взаимодействию по MQTT и алгоритмы управления в разные сущности KasperskyOS, которые взаимодействуют при помощи IPC. В качестве простой заготовкм, демонстрирующей работу с IPC в KasperskyOS можно взять пример echo, который входит в состав SDK.
Архитектура проекта с разделенными сущностями будет иметь следующий вид:

Рис. 13 Архитектура проекта с приемом команд по MQTT и управлением моторами по GPIO в отдельных сущностях KasperskyOS.
Рис. 13 Архитектура проекта с приемом команд по MQTT и управлением моторами по GPIO в отдельных сущностях KasperskyOS.

Полный исходный код проекта доступен в репозитории. Мы постарались рассмотреть в данной статье подход к реализации программы управления моторами Alphabot при помощи GPIO и получение команд по MQTT в KasperskyOS.  На этом первая часть статьи завершается. В скором времени выйдет следующая часть, в которой будет рассказано, как реализовать в KasperskyOS обработку изображения при помощи OpenCV, телеграм бота для приема команд и управление дозатором в Eclipse 4diac.

Литература

  1. Preparing Raspberry Pi 4 B to run examples

  2. gpio_output example

  3. AlphaBot

  4. https://github.com/MrQuaters/Practice_Kaspersky

  5. AlphaBot. User Manual

  6. Minicom-tutorial

Tags:
Hubs:
Total votes 4: ↑3 and ↓1+2
Comments13

Articles