- Разбор PTZ-камеры: что внутри и как это работает
- Прежде чем резать, давайте немного разберемся
- Tandberg — HD Precision Camera TTC8-01
- Электроника
- Подопытный номер №2: СleverMic 1012w
- Сверхдешёвая камера с управлением — своими руками
- Пройдём по ценам*
- О реализации
- Довольно лирики!
- Будьте внимательны к мелочам
- Оставшиеся недоработки
- О скидках
- Ссылки
Разбор PTZ-камеры: что внутри и как это работает
Сегодня препарируем PTZ-камеру и детально рассматриваем ее железные составляющие, чтобы понять принцип работы.
Прежде чем резать, давайте немного разберемся
Как сделать общение по видеосвязи достаточно комфортным, чтобы участники воспринимали его как живое? Добиться такого эффекта можно, если камера будет захватывать не только общий план комнаты, но и конкретного участника. Переходы между сценами должны быть быстрыми и плавными, чтобы общение не вызывало дискомфорта и не отвлекало участников от обсуждения рабочих вопросов.
Как этого добиться? Есть пара вариантов:
- программно вырезать (а по не-нашему кропать) из общего плана, который захватывается камерой, нужную часть изображения;
- или установить PTZ-камеру. Они бывают с механическими или магнитными приводами.
Камеру с магнитными приводами я найти не смог. Зато камер с механикой вокруг — пруд пруди. Я также разобрал современную и широко распространенную в РФ модель PTZ FullHD камеры, чтобы понять, как изменилась логика и принцип работы за 10 лет прогресса и развития. Итак, приступим!
Tandberg — HD Precision Camera TTC8-01
Итак, начнем мы с весьма распространенной PTZ-камеры от норвежской компании Tandberg. Именно эта камера перекочевала в линейку Cisco Telepresence без каких-либо значимых изменений и продавалась до начала 2010-х.
В свое время Tandberg делал премиальные PTZ-камеры, и об этом нам говорит строгий, лаконичный дизайн с преобладанием металлических частей корпуса.
Внешне Tandberg выглядит весьма понятно — в серебристом тубусе размещается оптика и матрица, а соединяют камеру с основанием подвижные механизмы.
Массивное металлическое основание добавляет камере устойчивости и надежно защищает от внешних воздействий главную плату с электроникой. Именно на этом основании располагается поворотная платформа.
Ложе камеры перекатывается на специальных роликах, расположенных внутри подвижной платформы. Работа этого механизма напоминает балансирование циркового акробата на металлических цилиндрах.
В движение этот узел приводится обыкновенным электромотором с зубчатым колесом, по которому перекатывается ложе камеры. Чтобы показать работу этого механизма, пришлось расчехлить старый добрый Autodesk Fusion.
Контролировать коллекторный мотор в каждый момент времени призваны оптические датчики, определяющие угол наклона по отраженному свету от меток. Для этого с внутренних сторон зубчатых реек установлены две специальные накладки, которые формируют прерывания отраженного света, по которым определяется угол наклона камеры.
Чтобы маломощный коллекторный мотор справлялся с тяжелой оптикой камеры, объектив сбалансирован так, чтобы центр тяжести совпадал с осью мотора. Массивный груз в задней части камеры и обеспечивает тот самый баланс.
Под куполом располагается еще один приводной мотор, поворачивающий камеру влево и вправо. Однако он конструктивно отличается от коллекторного тем, что вал проворачивается небольшими шагами (1 шаг = 3,750), то есть для одного полного оборота потребуется 3600 / 3,750 = 96 шагов. Также дополнительным бонусом является удержание вала в заданном положении.
Для стабилизации изображения PTZ-камеры имеются механизмы удержания заданной позиции, а это значит, что если направлять камеру в другую сторону при помощи рук и настойчивости, то пластиковые детали внутри камеры очень быстро выйдут из строя (если не сразу).
Это правило справедливо и для выключенной камеры. Если не вдаваться в тонкости теоретической механики, то можно сказать, что пластиковые шестерни могут передавать вращение от мотора к узлам камеры, а не наоборот.
И о самом главном — о камере. Конструктивно она похожа на зеркальный фотоаппарат, только без пентапризмы и зеркала. Фокусное расстояние регулируется коллекторным мотором и механическими передачами: это, конечно, не ультразвуковые моторы современных “зеркалок”, но малый вес и габариты для стационарной камеры — вовсе не ключевые показатели.
Электроника
Рулит всеми задачами цифровой сигнальный процессор от Texas Instruments с передовой вычислительной мощностью на начало 2000-х, способный выполнять почти 6 миллиардов инструкций в секунду. В те времена это было передовое решение в формате SoC (System on the Chip), в котором был реализован многоуровневый кэш L1/L2, 64-битный интерфейс к внешней оперативной памяти, Ethernet 10/100 Мбит/с, 3 видео порта с поддержкой нескольких разрешений, а также управлением других периферийных устройств.
Следующая передовая микросхема своего времени — Altera Cyclone 2. По сути это обыкновенный ПЛИС (программируемая логическая интегральная схема). Производители устройств могут программировать такие схемы для любых задач от управления сервоприводами до передачи данных памяти.
Интерфейс HDMI версии 1.3 реализован чипом AD9889B, поддерживающим разрешение FullHD (1080p) с защитой передачи медиаконтента по технологии HDCP v. 1.2.
Остальные компоненты — это модули памяти и пассивные радиокомпоненты, предназначенные для работы основных элементов.
Подопытный номер №2: СleverMic 1012w
Корпус камеры целиком выполнен из пластика и обладает широким и устойчивым основанием. Спереди у камеры находятся ИК-приемники для пульта дистанционного управления, а сзади — интерфейсные разъемы. Вес у камеры небольшой: предполагаю, что можно подвесить в армстронг на потолок или закрепить на гипсокартонной перегородке.
Оси перемещения организованы гораздо проще и понятней, чем у Tandberg, в качестве движущей силы трудятся шаговые моторы, передающие крутящий момент приводным шкивам.
Подвижная платформа имеет 2 полые стойки, между которыми закреплена камера, в полости одной из стоек скрывается приводной механизм, за счет которого изменяется угол наклона.
Немного ниже приводного шкива располагается оптический датчик. Этот концевик нужен для определения позиции камеры после включения.
При запуске объектив наклоняется вниз, и когда специальный шип прерывает поток света в оптическом датчике, система понимает, что достигнута крайняя нижняя точка. Все дальнейшее позиционирование производится путем подсчета шагов.
Мотор, поворачивающий камеру влево и вправо, скрывается за сопрягаемым фланцем с 6 винтами, оснащенный таким же концевиком для определения горизонтальной позиции камеры.
Поскольку сопрягаемый фланец неподвижен, в центре находится 2 кабеля: для управления моторами и шлейф с цифровой матрицы.
Как мы видим, система механических передач целиком состоит из мощных шаговых моторов, что делает позиционирование камеры более точным и быстрым, а ременные передачи снижают уровень собственного шума устройства.
Электроника камер во многом похожа, поэтому лучше поговорим о явных различиях. Из новинок появились USB3.0 и RS-232, при помощи которых можно получить видео в сжатом виде, а также собрать целый каскад подобных камер и через UART (RS232) полностью автоматизировать их наведение на участников конференции.
Как видите, современная PTZ-камера более надежна по конструктиву, имеет лучший сенсор и универсальна по способам подключения, но в остальном недалеко ушла от своей предшественницы. Кроме одного — цены, которая стала ниже в 5 раз. Поэтому сегодня мы видим всё больше и больше оборудованных ПК переговорных комнат, где данный PTZ-зверь уже перестал быть экзотикой.
Источник
Сверхдешёвая камера с управлением — своими руками
В качестве преамбулы скажу, что поскольку, подобная статья уже была, я по-началу и не собирался писать о камере на хабр.
Камера была сделана, просто ради интереса, тренировки навыков и отработки технологии удалённого управления физическими объектами.
Немного позже использовал эту систему как наглядный пример, сопровождающий обзор, на другом ресурсе (а фактически, в качестве чита что-бы подтянуть голоса). Это был настоящий бета-тест, который выявил кучу недоработок. За это огромное спасибо всем неравнодушным, помогавшим кто советом, а кто и куском кода.
При этом, посетители, которые игрались с камерой, помимо того, что не проходило и часу чтобы не помянули хабр, так ещё и начали активно интересоваться устройством всего этого дела, техническими деталями, программной реализацией и конечно же стоимостью.
Вот это всё и сподвигло меня на статью. А чтобы не повторюшничать, я и решил заостриться на стоимости, т.к. у автора предыдущего топика на эту тему, насколько я помню, итоговая стоимость вылилась во что-то в районе 5000р.
О том какова стоимость моей поделки: читаем ниже.
Итак, «как корабль назовешь, так он и поплывет», раз написал заголовок про дешевизну — буду соответствовать прозой, так что, детали — потом, а сперва о стоимости.
Пройдём по ценам*
* все цены даны со скидками. О скидках — отдельно, пожже.
Необходимый набор:
- Arduino Uno (или nano) — 15.29$
- Сервопривод (рулевая машинка) SG90 2х2.37$ = 4.74$
- Вебкамера 3.01$
Итого: 23.04$ (примерно 750р, на данный момент)
Дополнительный набор (ленивости + плюшки):
- Экран от Nokia 5110 — 250р (в комплекте с самой Нокией и блоком питания, куплено пару лет назад, будем считать, что именно для этой цели, реально можно найти уже вдвое дешевле, или вообще на халяву)
- MegaShield v4 к Arduino — 5.86$
- Проводки-коннекторы — 2.86$ (40 штук за эту цену, реально использовано 7)
- Сверхяркий сверхсиний све
рхтодиод для подсветки экрана — 5р/шт (лучше 4шт., у меня сделано неправильно)
Итого: примерно 550р
О реализации
Всё делалось с нуля. Повторять то, что уже было — я не стал, во-первых из соображений тренировки, а во-вторых Ethernet-модуля у меня на тот момент не было, я решил что это всё слишком сложно (там был завязан MySQL) и это решение мне однозначно не подойдёт.
О задачах
Задачи я себе обозначил следующие:
- Видеть картинку/видео
- Иметь возможность управлять камерой
- Иметь возможность управлять размером и качеством видео или картинки, причём не «уже на стороне клиента», а «ещё на стороне сервера, по команде клиента». Такая необходимость возникла из-за того что мне не везде доступен «большой и широкий интырнет»
- Обеспечивать приемлемую «реалтаймовость»
- Иметь задел на будущее — управление нагрузкой 220В и т.д. Собственно ради этого всё и затевалось, т.к. готовые решения либо жутко дороги, либо такой возможности не предоставляют.
О проблемах
В ходе реализации возникли вопросы вот такого плана:
- Видео либо грузит процессор в случает показа на несколько пользователей, либо даёт задержку 5-10, т.е. не обеспечивает «реалтаймовость», из-за чего нельзя сразу определить адекватность и вообще работоспособность управления
- Использование сервиса трансляций, хотя и сильно разгружает сервер в случае большого онлайна, не обеспечивает необходимую надёжность, и, опять же, даёт задержку
- Специальный сервер для трансляции видеопотока требует определённых навыков, которых у меня пока что нет
- Использование отображения путём смены картинок не обеспечивает высокий fps, а также постоянно обращается к жёсткому диску, что, при большом количестве пользователей, может вызывать лаги картинки не из-за загрузки процессора, а именно из-за обращения к диску
О решениях
- Решено использовать в качестве отображения — картинки
- Для исключения жёсткого диска из процесса выдачи картинок установлен RamDisk, на который дважды в секунду «ложится» изображение с вебкамеры
- Для выдачи картинки решено использовать php и gdlib
- Обновление картинки инициируется клиентом посредством javascript и ajax, и происходит без обновления самой странички
Довольно лирики!
Как выглядит
Выглядит всё более чем скромно
Работает примерно так:
Ардуина, если кто не видел
Мегашилд с проводками
«Сэндвич» в профиль
«Сэндвич» анфас
LCDшка
Она же вид сзади (пины и кондёр)
В сборе
В сборе 2
Колхоз — система проводков и верёвочек (крепление камеры)
Куда же без него
Как устроено аппаратно
Вебкамера подлючена по USB к компьютеру.
Arduino тоже подключена к компьютеру по USB.
Все внешние устройства, ввиду исключительно малого потребления тока, подключены напрямую к Arduino, работает круглосуточно уже полтора месяца, с онлайном 10 пользователей в момент наименьшей нагрузки.
Как работает программно
На стороне клиента чистый веб-интерфейс, без всяких плагинов и примочек. Только html, css, и javascript (+ajax).
На стороне сервера
- Сам сервер — Apache
- Обработчик скриптов — php
- Приём картинок с камеры — любая самая простая доступная, бесплатная или самопальная программа для сохранения картинок с вебкамеры
- Хранение картинки — RamDisk, утилита для создания дискового раздела в оперативной памяти (русскоязычная версия RAMDisk «Enterprise» бесплатна для локализованных систем)
- Чтобы не прописывать в php прямых локальных путей, папка с картинкой смонтирована в www папку с помощью juction (бесплатная утилита Марка Руссиновича)
- Передача управления из интернета к Arduino реализована с помощью программы-прокси, следующим образом: php скрипт создаёт UDP сокет и отправляет датаграмму на определённый порт, далее программа-прокси слушает этот этот порт и принимает приходящие на него сообщения и отправляет их на COM-порт Arduino (можно даже без обработки). Выбор UDP вызван исключительно для упрощения системы, UDP не требует никаких подтверждений и проверок о доставке-отправке ни со стороны клиента, ни со стороны сервера.
На стороне Arduino
- Сама (почему «сама»? потому что «плата») Arduino
- Скетч внутри неё — стандартные примеры из штатного набора arduino-0022 servo и serial + найденная на просторах интернета библиотека для дисплея, доработанная до приемлемого вида (в плане кириллицы и латиницы одновременно)
- На данный момент плюсом стоит мегашилд, чисто из-за удобства и культурного вида — в этом варианте я не спаял ни одного проводка (за исключением платы к дисплею)
Система выдержала все нашествия и рейды, а так же онлайн более 120 пользователей.
Были случаи отказа управления, которые случались из-за моих недоработок в программе-прокси, в частности из-за недостаточной обработки ошибок, в то время как програмная часть со стороны Апача и Ардуино держалась достойно.
Будьте внимательны к мелочам
Хочу отметить проблемы с программной частью которые случались из-за собственной невнимательности/неосведомлённости/ненаблюдательности:
- Первое с чем я серьёзно мучался: Arduino принимает из отправленной на её виртуальный COM-порт строки отдельно первый байт и отдельно всё остальное. Какие изощрения я только не пробовал — и с массивами и с кучей проверок… Хоть ты убейся. Решение проблемы? Пришло неожиданно и внезапно, в моментк огда я об этом и не думал: Sleep 2 после чтения каждого байта. ВСЁ!
- Вторая проблема — серьёзная нагрузка на сервер, казалось бы, из ничего, возникла потому, что обновление картинки было сделано по таймеру, не дожидаясь собственно факта загрузки картинки (или ошибки загрузки). Таком образом отсылалась куча «лишних» запросов.
- Третье: FireFox оказался самым правильным и капризным браузером, и заставил меня учиться писать валидный код. Так например, событие OnClick по элементу Option работать не должно. А оно работет, везде кроме огнелиса.
- Четвёртая, совершенно не явная и редко всплывающая: периодически картинка «ломалась». Как выяснилось, это происходило в момент когда файл был занят при записи. Т.е. проверка file_exists() проходила, а файл оставался залоченным. Не помогла и проверка is_writable(). Пришлось организовывать цикл по наличию ошибки и внутри него отрабатывать чтение файла «до победного конца».
Оставшиеся недоработки
Есть и такие.
- Во-первых, это описанные в каментах «левые» символы иногда появляющиеся в конце сообщения на экране. На самом деле это команды управления. Уши этого бага растут из того что если активно спамить или жать кнопки, буфер ком-порта не успевает полностью прочитаться Ардуиной и последующие сообщения валятся в конец буфера. Решение есть, но пока не сделано.
- Во-вторых, это периодическое падение UDP-сокета в программе прокси при большом онлайне. В чём причина — не знаю. Проявляется не сразу. Умирает и не «откисает». Помогает закрытие сокета и бинд по-новой. Возможно, виноват кривой видовский winsock.ocx. Переписывать это дело на API в бейсике, как-то лень. Пока одним из «топорных» решений вижу сброс и ребинд сокета по таймеру, каждые, скажем, полчаса.
О скидках
Общеизвестно, что в Китае — дешевле. Главное знать места, где именно дешевле, и как добыть дополнительную скидку.
Тут смысла писать нет — слишком большой объём текста с картинками, к тому же известный большинству.
Поэтому дабы не провоцировать ярых противников борьбы со спамом и прочим «реферальством», отмечу необходимый минимум — это скидка 15% на BiC, складывающаяся из одноразового купона на 10% и скидки за первую покупку 5% при вводе рекомендателя + хинт, как использовать эту систему неоднократно.
Все заинтересовавшиеся, могут ознакомиться с полной информацией по ссылке на страничке с, собственно, самой камерой.
Ссылки
Камера, работающий экземпляр, для тех кто ещё не видел и не наигрался
Топик, в котором ссылку на камеру слили на хабр раньше времени
RAMDisk
juction
Исходники (упрощённые, во избежание) клиентской части, серверной (php) и программы web-arduino-прокси (VB 6.0)
Apache, php, либо какие-то комбинированые сборки и т.д. — на свой вкус.
Источник