Статьи

Потоковая камера Raspberry Pi в VR с JavaScript

Я провел неделю, переделывая камеру Raspberry Pi и изучая способы ее передачи в веб-браузер. В этой статье мы рассмотрим самый простой и эффективный способ потоковой передачи изображений в клиентский JavaScript. В конце мы отправим эти изображения в средство просмотра виртуальной реальности, созданное в моей предыдущей статье « Фильтрация реальности с помощью JavaScript и Google Cardboard» .

Что вам нужно

Для этой демонстрации вам в настоящее время понадобится Raspberry Pi (я использовал Raspberry Pi 2 Model B ) с установленным Raspbian ( NOOBS об этом рассказывал здесь ), подключение к Интернету (я рекомендую получить адаптер Wi-Fi, чтобы ваш Pi может быть относительно портативным) и модуль камеры .

Если ваш Pi новенький и в данный момент не настроен, следуйте инструкциям на странице настройки Raspberry Pi NOOBS, чтобы ваш Pi был готов к работе.

Если у вас уже есть куча вещей на вашем Pi, пожалуйста, убедитесь, что вы сделали резервную копию всего, так как процесс установки заменяет различные файлы. Надеюсь, все должно играть хорошо, но всегда важно быть в безопасности!

Код

Наш демонстрационный код, который использует данные камеры, доступен на GitHub для тех, кто хочет скачать и попробовать.

Прикрепление вашей камеры Pi

Если вы новичок в Raspberry Pi и подключаете камеру, я быстро расскажу об этом здесь. В основном, вокруг отверстия находится пластиковый контейнер (называемый разъемом гибкого кабеля), который нужно аккуратно открыть. Для этого потяните за выступы в верхней части разъема вверх и в направлении порта Ethernet. Как только вы ослабите его, вы сможете вставить разъем в гибкий кабель вашей камеры. Кабель имеет синюю полосу на одной стороне, подключите его так, чтобы сторона была обращена к порту Ethernet. Соблюдайте осторожность, чтобы кабель оставался прямым (не размещайте его в слоте под углом, он должен прямо вставляться). Вот фотография моего гибкого кабеля, подключенного к камере, чтобы показать, что мы ищем здесь:

Raspberry Pi камера подключена

RPi Cam Веб-интерфейс

Самый простой способ для потоковой передачи изображений с камеры Pi заключался в использовании веб-интерфейса RPi Cam . Вы запускаете несколько основных команд терминала, чтобы установить его, а затем он настраивает вашу камеру на сервере Apache, готовом к использованию.

Если вы уже установили Raspbian с нуля, возможно, вы также уже включили камеру на экране конфигурации, который появился позже. Если нет, вы можете добраться до него, введя следующую команду:

sudo raspi-config 

На этом экране вы сможете выбрать «Включить камеру», нажать эту опцию и выбрать «Включить» на появившемся экране.

Экран включения Raspberry Pi Camera

Далее, убедитесь, что ваш Raspberry Pi обновлен (прежде чем сделать это, я хочу повторить — вернемся к делу, чтобы быть в безопасности). Мы начинаем с загрузки последних списков пакетов репозитория:

 sudo apt-get update 

Затем мы вносим любые обновления в существующие репозитории на нашем Pi, которые мы могли бы найти:

 sudo apt-get dist-upgrade 

Наконец, мы обновляем и наше программное обеспечение Raspberry Pi:

 sudo rpi-update 

Затем мы устанавливаем сам веб-интерфейс RPi Cam из его репозитория GitHub. Перейдите в папку на вашем Pi, в которой вы хотите клонировать репозиторий, и выполните команду git clone :

 git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git 

Это создаст папку RPi_Cam_Web_Interface готовую с установщиком bash. Во-первых, перейдите в этот каталог:

 cd RPi_Cam_Web_Interface 

Обновите разрешения для файла bash, чтобы вы могли запустить его:

 chmod u+x RPi_Cam_Web_Interface_Installer.sh 

Затем запустите программу установки bash:

 ./RPi_Cam_Web_Interface_Installer.sh install 

Программа установки имеет немного больше визуального интерфейса. Я лично установил его с помощью опции сервера Apache (первая опция), поэтому следующее будет сосредоточено на этом методе. Если вы предпочитаете использовать сервер Nginx, вы можете. Я думаю, что большая часть процесса относительно похожа.

Экран установки Raspberry Pi Cam

Затем вы укажете, где вы хотите разместить веб-интерфейс RPi Cam в каталоге вашего сервера /var/www . Если вы ничего не перечислите, он будет установлен в корневой каталог /var/www . Я установил его в папку с именем picam чтобы сохранить его отдельно.

Экран местоположения установки кулачка

На следующем экране я выбрал «да», чтобы включить автоматический запуск камеры во время загрузки.

Загрузка камеры при запуске

Программа установки спросит, на каком порту вы хотите запустить. Я сохранил его по умолчанию для порта 80.

Экран выбора порта камеры

Затем вам будет предложено указать, хотите ли вы, чтобы безопасность веб-сервера. Это создаст имя пользователя и пароль htaccess для вашего сервера. Я сказал «нет» в целях тестирования и потому, что получил его в подпапке. В этой демонстрации мы создадим другие функции в других подпапках, поэтому я бы рекомендовал установить безопасность на всем сервере на корневом уровне, если вы беспокоитесь о том, что люди следят за сервером Pi.

Включение веб-безопасности на сервере Apache

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

Чтобы увидеть то, что видит ваша камера, вы можете посетить встроенный интерфейс камеры, который предоставляет веб-интерфейс RPi Cam. Для этого вам сначала нужно узнать IP-адрес вашего Пи. Не уверен как? Для этого вы можете ввести:

 ifconfig 

Это будет один из немногих реальных IP-адресов с этим списком. В зависимости от настроек вашей локальной сети, это должно быть что-то относительно простое, например 192.168.0.3 . Для меня это был 192.168.0.12 как в моей сети есть куча других устройств.

Откройте веб-браузер на компьютере в той же локальной сети и введите IP-адрес вашего Pi, а затем имя папки, в которую вы установили веб-содержимое камеры Pi (например, http://192.168.0.12/picam ). Это должно открыть веб-вид вашей камеры! Вот вид, показывающий невероятно скучный вид моей клавиатуры:

Raspberry Pi камера работает

Если вы хотите удалить текст с датой и временем вверху, откройте «Настройки камеры» и удалите текст в «Аннотация»:

Удаление аннотаций с камеры

Доступ к изображениям с камеры через JavaScript

Хотя сам по себе этот интерфейс может делать много очень полезных вещей, в том числе удаленный захват изображений, запись видео, обнаружение движения и т. Д., Как разработчик, который любит переделывать и создавать свои собственные вещи — я хотел включить эти изображения в свои собственные творения. В частности, я хотел попробовать включить его в настройку VR / AR Google Cardboard, которую я создал в моей предыдущей статье « Фильтрация реальности с помощью JavaScript и Google Cardboard» . Таким образом, мы можем надеть нашу гарнитуру Google Cardboard и наблюдать за нашей камерой на расстоянии. Прикрепите Raspberry Pi к вашему домашнему питомцу, автомобилю с дистанционным управлением, держите его рядом с аквариумом или вольером для хомяков, а затем наслаждайтесь виртуальной реальностью в режиме реального времени, сидя и наблюдая за происходящим с новой точки зрения!

Чтобы получить удаленный доступ к изображениям с камеры из JavaScript, нам понадобится следующая структура URL (заменяя IP-адрес и папку теми, что есть в вашей среде):

 "http://192.168.0.12/picam/cam_pic.php?time=" + new Date().getTime() 

Мы гарантируем, что получаем последнее изображение, добавляя текущую метку времени с помощью new Date().getTime() .

Чтобы получить доступ к этим изображениям в JavaScript и на холсте HTML5, не встречая ошибок общего доступа к ресурсам, мы также запустим этот JavaScript на нашем Pi. Это делает вещи красивыми и простыми. Если вы хотите получить доступ к изображениям с другого сервера, ознакомьтесь с разделением ресурсов общего доступа и политикой того же происхождения .

Мы не будем рассматривать всю теорию VR и Three.js в этой статье, поэтому прочитайте мои предыдущие статьи « Фильтрация реальности с помощью JavaScript и Google Cardboard» и « Перенос виртуальной реальности в Интернет с помощью Google Cardboard и Three.js» для получения дополнительной информации. если вы новичок в этом.

Биты, которые изменились из моей статьи «Фильтрация реальности с помощью JavaScript и Google Cardboard», заключаются в том, что все биты, вовлеченные в фактический процесс фильтрации, были удалены. Вы могли бы очень хорошо держать их там и фильтровать изображения с вашей камеры Pi тоже! Однако, чтобы наш пример был простым, а код — относительно чистым, я удалил их.

В нашей функции init() я изменил ширину и высоту холста, чтобы соответствовать входному размеру по умолчанию, который предоставляет программное обеспечение RPi Cam:

 canvas.width = 512; canvas.height = 288; 

Тем не менее, когда он запускает nextPowerOf2() чтобы убедиться, что она работает лучше всего в качестве текстуры Three.js, он получится как холст 512 × 512 (только с черным сверху и снизу из моего опыта).

Я PlaneGeometry размер нашей PlaneGeometry чтобы он тоже был 512 × 512:

 var cameraPlane = new THREE.PlaneGeometry(512, 512); 

Я также перемещаю камеру немного ближе к нашей плоскости, чтобы она покрывала обзор:

 cameraMesh.position.z = -200; 

Функция animate() совершенно иная, так как мы больше не смотрим на камеру устройства, а вместо этого извлекаем изображение из HTTP-запроса к нашей камере Pi в каждом кадре анимации. Функция выглядит так:

 function animate() { if (context) { var piImage = new Image(); piImage.onload = function() { console.log('Drawing image'); context.drawImage(piImage, 0, 0, canvas.width, canvas.height); texture.needsUpdate = true; } piImage.src = "http://192.168.0.12/picam/cam_pic.php?time=" + new Date().getTime(); } requestAnimationFrame(animate); update(); render(); } 

Мы храним изображение камеры нашего Pi в переменной с именем piImage . Мы устанавливаем его src на URL, который мы упоминали ранее. Когда наш браузер загрузил изображение, он запускает piImage.onload() которая рисует это изображение на элементе canvas нашей веб-страницы, а затем сообщает нашей текстуре Three.js, что ее нужно обновить. Наша текстура Three.js PlaneGeometry будет обновлена ​​до изображения с нашей камеры Pi.

Добавление на наш сервер

Есть множество способов получить это на сервер нашего Пи. По умолчанию, если вы только что настроили свой Pi и его сервер Apache, папка /var/www не позволит вам копировать в нее файлы, поскольку вы не являетесь владельцем папки. Чтобы иметь возможность вносить изменения в папку, вам нужно либо использовать команду sudo либо изменить владельца папки и файлов, используя:

 sudo chown -R pi www 

Затем вы можете подключить FTP к вашему Pi в качестве пользователя по умолчанию «pi» и скопировать файлы в каталог или добавить свой проект в удаленное Git-репо и клонировать его в папку (я сделал второй вариант и, таким образом, мог сделать это только через sudo git clone https://mygitrepo без необходимости смены владельца папки или файлов).

Я добавил их в папку с именем piviewer в папке /var/www .

В бою

Если мы добавим этот код на наш сервер, а затем перейдем на наш сервер из мобильного браузера Chrome с IP-адресом нашего Pi и именем папки нашего пользовательского кода (например, у меня было http://192.168.0.12/piviewer ), вы должны увидеть VR настроить, что вы можете просматривать в Google Cardboard!

Наша Raspberry Pi Cam в действии!

Вывод

Теперь у нас есть вид виртуальной реальности нашей камеры Raspberry Pi, готовый присоединить этот Pi абсолютно везде, где мы хотим! Виртуальная реальность — забавный вариант для данных камеры, но вы можете использовать их в любом количестве JavaScript или веб-приложений. Так много возможностей, так мало времени! У меня есть свои планы на некоторые дополнения к этой установке, которые будут рассмотрены в будущей статье, если они удастся.

Если вы попробуете этот код и сделаете с ним что-то интересное, оставите заметку в комментариях или свяжитесь со мной в Twitter ( @thatpatrickguy ), я бы с удовольствием посмотрел!