Система, о которой я хочу рассказать, представляет собой роботизированную панорамную камеру. Проект основан на Raspberry Pi. Здесь, ради простоты, используются панорамные фотографии, а не видеозаписи или потоковая передача сигнала. Опыт, полученный в ходе работы с сотнями компаний, использующих камеры с обзором в 360 градусов (эти компании, в целом, провели миллионы виртуальных проверок сотрудников), и анализ рынка, подсказывают мне, что сейчас, в начале 2021 года, чаще всего встречаются именно решения, основанные на панорамных фотографиях.
![](https://habrastorage.org/webt/br/hf/9c/brhf9c6rpqs23rql09il98dcjre.jpeg)
Я, исследуя ситуацию, пользовался материалами форума, посвящённого использованию API Ricoh Theta, и тем, что удалось узнать при личном общении с представителями бизнеса в ходе онлайн-встреч с ними.
Требования к проекту
Я остановился на следующих требованиях к проекту, касающихся его аппаратной составляющей и инфраструктуры:
- Гибкое позиционирование камеры с помощью робота.
- Использование одноплатного компьютера Raspberry Pi 4 с 4 Гб памяти для управления камерой и роботом.
- Ориентация системы на съёмку 360-градусных фотографий.
- Применение прозрачного корпуса камеры.
- Организация связи камеры с системой управления камерой по Wi-Fi.
Раскрою некоторые подробности, касающиеся вышеозначенных требований.
?1. Гибкое позиционирование камеры
Использование робота для позиционирования камеры позволяет организовать удалённое наблюдение за рабочим местом сотрудников, что актуально во время эпидемии COVID-19. Это, кроме того, позволяет использовать камеру в составе систем, рассчитанных на работу в опасных для человека условиях, например — это могут быть системы для анализа радиационной обстановки. В моём проекте используется игрушечный гусеничный робот. Благодаря этому стоимость компонентов проекта невелика, поэтому создать соответствующий прототип смогут все, кому он может понадобиться. При этом те же механизмы управления камерой, которые используются в прототипе, легко можно адаптировать к применению в подобных системах, основанных на промышленных роботах.
?2. Raspberry Pi 4
На Raspberry Pi 4 можно установить, кроме прочих ОС, специализированную операционную систему Robot Operating System (ROS). Я решил использовать в проекте стандартную ОС Raspberry Pi. Благодаря этому он будет доступнее для заинтересовавшихся им разработчиков и организаций.
?3. 360-градусные фотографии
Самым популярным форматом выходных данных 360-градусных камер являются именно фотоснимки. Они, в сравнении с видео, дают более высокое разрешение изображения и хранятся в файлах гораздо меньшего размера. Работать с фотографиями значительно легче, чем с видео. В результате у проекта, который создаётся в расчёте на использование фотоснимков, больше шансов на успешное завершение.
?4. Прозрачный корпус камеры
Прозрачный корпус защищает камеру от дождя, от пыли и промышленных загрязнителей. Имеется растущий тренд использования камер потребительского уровня, вроде Ricoh Theta, в крупномасштабных коммерческих проектах. В результате растёт потребность в защите таких камер от физических повреждений, от загрязнений, от плохой погоды. Одна из задач моего проекта заключается в исследовании воздействия прозрачного корпуса на качество изображений.
?5. Wi-Fi-соединение между камерой и контроллером
Хотя надёжнее было бы организовать управление камерой по USB, используя Picture Transfer Protocol (PTP) и применяя библиотеку libptp, я решил выбрать API Google Open Spherical Camera (OSC) и связываться с камерой по Wi-Fi. API OSC, которое в документации Ricoh называется «Web API», легче реализовать, что позволяет быстрее перейти к практическим испытаниям проекта.
![](https://habrastorage.org/getpro/habr/post_images/81c/2dd/d03/81c2ddd031f14abbc45b2888527771bb.png)
Снимок, сделанный камерой, смонтированной на гусеничном роботе и заключённой в прозрачный корпус, отличается минимальными искажениями
Преимущества фотоснимков перед потоковой передачей видео
Я дополнил то, что можно найти о системах наблюдения в интернете, пообщавшись с людьми, которые работают с такими системами. В частности, поговорил с инженерами из компаний fulldepth, и Unusly. Первая компания занимается глубоководными системами наблюдения, вторая специализируется на системах, предназначенных для сферы недвижимости. Меня интересовал опыт инженеров, касающийся роботизированных систем.
Компания fulldepth тестировала потоковую передачу видео с 360-градусной камеры, смонтированной на роботе, который предназначен для работы на глубине в 300 метров.
![](https://habrastorage.org/getpro/habr/post_images/213/343/c87/213343c878e3bae486bb60f0fa5b2c84.png)
Продукция компании fulldepth
Одна из моих ранее опубликованных статей посвящена потоковой передаче 360-градусного видео. Хотя этот подход весьма популярен в сфере прототипирования систем наблюдения, и хотя он находит применение в определённых коммерческих проектах, в интернет-обсуждениях больше внимания приковано к панорамным снимкам, которые используются для целей мониторинга и для организации виртуальных туров.
Изначально я хотел реализовать в описываемом тут проекте возможность потоковой передачи видео с Raspberry Pi на Windows 10-компьютер с применением RTP. Специалисты из fulldepth поделились со всеми желающими методологией потоковой передачи 360-градусного видео с Raspberry Pi. Используя их спецификации и программный код я, наверняка, смог бы реализовать нечто подобное и в своём проекте.
Но я, в итоге, остановился именно на фотоснимках. На моё решение сильнее всего повлияло то, что устройствами для получения подобных фотоматериалов очень сильно интересуются компании, занимающиеся продажей подержанных машин, фирмы, которые занимаются недвижимостью, строительные компании. Речь идёт о том, что таким организациям нужно воссоздать привычный порядок работы в условиях эпидемии COVID-19. Вот почему подобные компании отдают предпочтение фотографиям:
- Разрешение фотоснимков больше, чем разрешение видео. Фотографии лучше выглядят с точки зрения людей, а системы искусственного интеллекта могут использовать их для определения параметров объектов.
- При съёмке фотографий можно лучше контролировать параметры изображения — такие, как выдержка (изображение можно делать светлее или темнее) и цветность.
- Возможность создания HDR-изображений (High Dynamic Range, расширенный динамический диапазон), позволяющая корректировать неблагоприятные условия освещённости (нечто вроде слишком светлых фрагментов изображений, появление которых вызывает, например, яркий солнечный свет, проникающий в комнату через окно). При создании HDR-изображений делают несколько кадров одной и той же сцены, используя разную выдержку, после чего эти кадры объединяют, выбирая с каждого из них участки с наиболее удачной экспозицией.
Планируя проект я, кроме того, пообщался с представителем международной автомобильной компании, где потоковая передача видеоданных с 360-градусной камеры используется для контроля взаимодействия людей со встроенными в транспортное средство OLED-панелями. На картинке, которая получается при потоковой передаче видео, панели выходят слишком светлыми, а то, что на них выводится, оказывается невидимым.
Хотя будущее, конечно, за потоковой передачей видеоданных, и к этой теме я ещё вернусь, я решил, что те задачи, которые ставит перед нами 2021 год, нужно решать с привлечением фотографии и роботов.
Управление камерой
Для того чтобы упростить работу с камерой с робота, основанного на Raspberry Pi 4, я, на языке Dart, создал библиотеку и приложение, рассчитанное на работу в командной строке. Для написания библиотеки я выбрал именно Dart из-за того, что при таком подходе код библиотеки я мог бы многократно использовать во Flutter-приложениях, рассчитанных на Android и iOS. Dart-код компилируется в нативные бинарники, которые запускаются на Raspberry Pi без необходимости установки Dart SDK. Соответствующие инструменты командной строки, созданные для Raspberry Pi, можно использовать из bash-скриптов, что позволяет автоматизировать управление камерой.
Для того чтобы управлять камерой с Raspberry Pi, можно воспользоваться простым bash-скриптом. Ниже приведён пример такого скрипта, в котором выполняются следующие действия:
- Настройка различных параметров камеры (отключение автоматического перевода камеры в режим сна или автоматического выключения камеры).
- Деактивация встроенного таймера.
- Вывод параметров камеры в консоль для их проверки.
- Удаление из текущей директории, предназначенной для выгрузки изображений, всех старых изображений, снятых камерой Ricoh Theta, что приводит к тому, что в папке будут храниться только свежие изображения.
- Запуск процесса съёмки 500 фотографий.
- Передача изображений с камеры на Raspberry Pi с применением Wi-Fi-соединения.
- Загрузка изображений на удалённый облачный сервер. Просмотр этих изображений организован с помощью веб-сервера Apache.
#!/usr/bin/bash
# отключение offDelay
./theta offDelay --off
# отключение sleepDelay
./theta sleepDelay --off
# выключение встроенного таймера
./theta exposureDelay --seconds=0
# уменьшение громкости звука срабатывания затвора
./theta shutterVolume --low
# подтверждение настроек
./theta getOptions
sleep 1s
# ЭТА КОМАНДА УДАЛИТ ВСЕ ИЗОБРАЖЕНИЯ, ХРАНЯЩИЕСЯ В ПАПКЕ СКРИПТА
rm R00*.JPG
echo start timelapse photography loop test
echo images will be viewable at http://45.xx.xx.xx/robot/
# Пример цикла, в котором делается 500 снимков, позволяющих
# наблюдать за развитием некоего процесса во времени.
# Для того чтобы снять другое количество фотографий, нужно изменить
# число, используемое ниже, например - так: {1..300}
for counter in {1..500}
do
./theta takeAndDownload
echo that was picture $counter
((counter++))
# если снимки нужно делать с интервалом в 30 секунд
# sleep 30s
echo 'waiting 10 seconds for the next shot'
sleep 10s
# если снимки нужно делать с интервалом в 5 минут
# sleep 5m
echo '*** Will Start Upload to Digital Ocean Hosting ***'
scp -r *.JPG craig@45.xx.xx.xx:/home/craig/robot/`date +"%Y%m%d%H%M"`.JPG
echo completed upload
echo deleting all RICOH THETA images from current directory
rm R001*.JPG
done
echo timelapse done
echo go to http://45.xx.xx.xx/robot/ to view images
Инструмент командной строки, используемый в этом bash-скрипте — это бесплатный опенсорсный проект. Я публикую подробности о нём здесь. Например, в этом материале речь идёт о некоторых наблюдениях, сделанных в ходе использования описываемой в этой материале системы.
Проблемы проекта, выявленные в ходе «полевых» экспериментов
В этом разделе я хочу поделиться основными выводами, которые я сделал после того, как перенёс робота из офиса в «полевые» условия, оснастив автономной системой питания, и поэкспериментировал с ним.
![](https://habrastorage.org/getpro/habr/post_images/bfe/951/9f7/bfe9519f7d65f588662dbcb63366d622.png)
Офисные эксперименты
?Проблема электропитания автономного робота
Собственный источник питания робота слишком слаб для того чтобы эффективно обеспечивать энергией Raspberry Pi и всё сопутствующее оборудование. Подробности об энергопотреблении Raspberry Pi можно почитать в этом материале.
Обычно я тестировал систему, подключив её к настенной электрической розетке. Перевод робота на автономное питание вызвал у меня, так сказать, «культурный шок». В результате я сделал вывод о том, что мне, когда робот питается от батарей, нужно внимательнее относиться к энергопотреблению дополнительного оборудования, вроде Wi-Fi-адаптера, подключённого к Raspberry Pi.
![](https://habrastorage.org/getpro/habr/post_images/645/e73/38c/645e7338ce7c8dfb6f73c1aef0ef9b21.png)
В «полевых» условиях на первый план выходят вопросы автономного питания устройства
?Решение проблем мобильной связи
В офисе робот подключается к Wi-Fi-роутеру, а в «поле» — к мобильному хот-споту, выводящему устройство в интернет через LTE-сеть. Наладка работы системы в таких условиях вызвала неожиданные сложности. В качестве хот-спота я использовал не специализированное устройство, а телефон Pixel 2. Для того чтобы узнать IP-адрес Raspberry Pi, мне, на Pixel 2, пришлось воспользоваться Termux и командой
ip neigh
. Потом я воспользовался ноутбуком для того чтобы подключиться к Raspberry Pi по SSH и настроить скрипты, ответственные за управление камерой. Если интересно — вот моя статья о выполнении Linux-команд на Android-устройствах с использованием Termux.?Маршрутизация на Raspberry Pi
После загрузки Raspberry Pi с двумя Wi-Fi-интерфейсами автоматически были созданы два стандартных, конфликтующих друг с другом шлюза. Мне понадобилось вручную удалить стандартный маршрут к камере и перенаправить к камере трафик из подсети 192.168.1.0 Raspberry Pi.
![](https://habrastorage.org/getpro/habr/post_images/979/0d7/f3d/9790d7f3de4d4f39148bdcde418a4e66.png)
Настройка двойного Wi-Fi-подключения на роботе без пользовательского интерфейса
Неожиданная польза, которую принёс этот проект моей компании
Робот, о котором я рассказываю, это — экспериментальный проект, направленный на проверку различных идей. Я использую его в учебных целях. Отмечу, что не ожидал того, что работа над этим проектом хорошо отразится на оптимизации операций, которые в компании, где я работаю, выполняются вручную. Меня удивило то, что благодаря моему роботу ускорилась работа над проектами, которые даже с ним не связаны. Например, инструмент для тестирования API камеры, предназначенный для использования из командной строки на Raspberry Pi, стал широко применяться в компании для тестирования API камеры на Windows и Mac. Это стало возможным благодаря тому, что для разработки этого инструмента было решено использовать язык Dart (а так же — благодаря существованию команды dart compile).
Ещё одной приятной неожиданностью стало то, что мы начали использовать при работе с этим инструментом bash-скрипты, направленные на проведение автоматизированных тестов API камеры. Это благотворно сказалось на наших мобильных разработчиках. API камеры — это REST-подобное HTTP-API, в Dart-программах можно пользоваться JSON-данными. Это позволяет создавать тесты, которые подойдут тем разработчикам, которые пишут на Swift, Kotlin или Java. Я проверял робота, запуская тесты на Raspberry Pi. Однажды, отвечая на какой-то вопрос с форума, я просто показал свои результаты. В итоге оказалось, что то, что я сделал, заинтересовало разработчиков мобильного приложения. Теперь мы пользуемся WSL2 в Windows 10 для запуска bash-скриптов с соответствующих компьютеров.
Итоги
Разработка собственного робота — это потрясающий способ превращения идей в нечто осязаемое. При этом исследование робота в разных условиях, например, в «поле», когда он питается от батарей и подключён к интернету через мобильный телефон, позволяет выявлять проблемы проекта, ранее незаметные, вроде слишком высокого энергопотребления и сложностей, связанных с дистанционной настройкой системы. Справляться с подобными проблемами очень интересно, а когда удаётся их решить, в награду нам достаётся не только работающее устройство, но и чувство глубокого удовлетворения.
Если вы решите сами сделать нечто подобное — примите во внимание то, что вам, помимо решения сетевых проблем и проблем электропитания робота-камеры, может понадобиться создать собственную библиотеку, учитывающую особенности датчиков, которые есть у робота. Возможно, вам понадобится построить серверную систему, поддерживающую работу проекта. Если вы, создавая своего робота, воспользуетесь универсальными технологиями, применимыми в компьютерных системах вашей организации, то подобный проект может оказать неожиданное положительное влияние на работу организации. И это — вдобавок ко всему тому интересному, что ждёт создателей роботов, погружённых в увлекательные эксперименты, позволяющие взглянуть на будущее робототехники.
Хотите создать собственную 360-градусную камеру, смонтированную на каком-нибудь роботе?
![](https://habrastorage.org/webt/ou/g5/kh/oug5kh6sjydt9llengsiebnp40w.png)
Blue_Duck
Точно-ли компании нужен сотрудник за которым необходимо постоянно следить? И не станет-ли подобное «доверие» поводом к увольнению из компании нормальных сотрудников. Чисто технически решение интересное