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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Иногда, устроившись  на мягком пуфике с книжкой, так и хочется скосплеить Громозеку из мультфильма Тайна третьей планеты, и сказать “Официант, 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. https://support.kaspersky.com/help/KCE/1.1/en-US/preparing_sd_card_rpi.htm

  2. https://support.kaspersky.ru/help/kce/1.1/en-us/gpio_output_example.htm/

  3. https://www.waveshare.com/wiki/AlphaBot

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

  5. https://www.waveshare.com/w/upload/archive/c/c7/20161230083253!AlphaBot-User-Manual.pdf

  6. https://derrekito.github.io/Minicom-tutorial/

Источник: https://habr.com/ru/post/726466/


Интересные статьи

Интересные статьи

15 июня 2022 года издание App2Top.ru сообщило, что разработчик и издатель мобильных игр Game Insight уходит из РФ, закрывает офисы и увольняет разработчиков. Сообщается, что «у компании нет средств на...
В этой статье руководитель группы защиты инфраструктурных ИТ-решений компании «Газинформсервис» Сергей Полунин рассмотрит два способа управления учётными записями и их правами в облачной среде на прим...
Допустим, вы сделали свое собственное устройство “Умного дома” и хотите интегрировать его в платформу домашней автоматизации Samsung SmartThings. Тогда вы сможете включить его в общую экосистему, подд...
В январе компания Kolesa Group опубликовала очередное исследование Kolesa Zerttey. В этот раз оно посвящено менеджменту в IT. Ранее подобные исследования публиковались по...
Разработка LED-драйвера – интересная и комплексная задача. Рынок в этом направлении весьма насыщен – иногда кажется, что производство светодиодных светильников везде. Начиная от гаража и заканчив...