Как многие за вас знают, что идет активно кампания по сбору денег для проекта СелфиБот компании Endurance.
В этом посте мы хотели бы рассказать о том, как происходит само проектирование и создание робота СелфиБот.
Итак, суперинтересная статья о суперкрутом проекте Селфибот)))
Селфибот - управляемая подставка для телефонов и планшетов. Чтобы заставить её двигаться нужно отправить команды на Ардуину.
Цель
Сделать видеозвонки удобнее (добавив в них немножко интерактивности)
Задачи
- Подключаться к Ардуине и передавать на неё команды с телефона (или планшета)
- Расшарить управление Селфиботом для своего собеседника (предоставить доступ)
- Дать возможность пользователю одновременно с управлением Селфибота вести видеоконференцию
Условия
- Соединение с Ардуиной должно проходить по Bluetooth
- Управлять Селфиботом должно быть легко и просто даже с другого конца планеты (то есть необходимо использовать интернет, а не местный Wi-fi как в некоторых проектах)
- + Куча требований к передаче видео при разговоре
Соединение с Ардуино и передача команд
Задача предельно простая. Материалов по данным вопросам очень много, Android Developers описывают досконально соединение устройств по Bluetooth и передачу данных. (http://developer.android.com/intl/ru/gu ... tooth.html).
Отдельное спасибо нужно сказать Амперке (http://wiki.amperka.ru/беспроводная-связь:android-и-bluetooth), поскольку у них в статье был указан железобетонный метод соединения по Bluetooth с устройствамине поддерживающими UUID. Он не такой элегантный как в официальной документации, и не гарантирует вам успешное подключение, однако с его помощью можно подключаться к таким устройствам как модуль HC-06.
Не буду рассказывать подробно процесс передачи данных, а расскажу лишь, что меня заинтересовало в процессе установки соединения.
Для подключения к устройству Bluetooth в качествеклиента (поскольку нам предоставляют Bluetooth сеть) требуется создать последовательно два параллельных потока: поток подключения (Коннектор) и поток передачи данных (Транспорт).
В потоке подключения мы пытаемся создать сокет и соединить его с девайсом. После успешного соединения наш Коннектор отправляет открытый сокет на Транспорт. Транспорт извлекает из сокета потоки на чтение и запись и приступает к обмену данными. Коннектор можно теперь отключать или держать прозапас, чтобы в момент разрыва связи сразу же начать её восстанавливать.
Предоставление доступа к Селфиботу
Доступ к управлению Селфиботом предоставляется через прокси-сервер. И телефон на Селфиботе и телефон собеседника должны подключиться к этому серверу и сообщить ему свой логин. При этом к логину прибавляется "G" со стороны Селфибота и "C" со стороны управляющего телефона.
Маленькое терминологическое отступление. Крайне сложно подобрать термины для всех сущностей, участвующих в информационном обмене при управлении Селфиботом. Для ясности приведу картинку. На Селфибот ставится мобильное устройство и взаимодействует со вторым мобильным устройством через прокси-сервер.
Диаграмма развёртывания. Управление Селфиботом с мобильного устройства
Вообще говоря, весь процесс соединения с подставкой по Bluetooth и расшаривание управления происходят одновременно. То есть для пользователя это всего лишь одна кнопка "подключиться к подставке". После успешного подключения весь "Транспорт" пытается выстроиться в цепочку и передавать сообщения друг-другу напрямую. Передачу данных по Bluetooth и через интернет инициирует Сервис Селфибота, который запускается и висит как фоновый процесс, независимо от основного приложения (почти независимо). При инициализации Транспортов Сервис должен соеденить их напрямую. В Java я соединяю два потока с помощью механизма передачи сообщений (Messages) в сторонний поток (Thread).
Диаграмма классов. Сервис, предоставляющий управление Селфиботом
Видеоконференция и Селфибот
Поскольку создание собственного мессенджера, передающего видео представилось мне слишком сложной задачей я решил разрабатывать такое приложение, которое могло бы встраиваться в любой мессенджер. Все, кто пользуется видеозвонками и так имеют парочку установленных приложений, зачем же ещё одно лишнее приложение? Именно поэтому приложение для управления Селфибота занимает совсем немного места. А видеозвонки можно делать в вашем любимом Скайпе или Хэнгаутсе.
Итак, для того, чтобы и говорить по Скайпу и управлять подставкой нужно работать с двумя приложениями одновременно.
Существует множество решений и для этой задачи. Я решил не пользоваться сторонними библиотеками, поскольку потом могли возникнуть проблемы с использованием приложения в коммерческих целях.
Я решил сделать прозрачный джойстик, который располагался бы поверх экрана.
Требования к джойстику:
1. Располагается поверх всех окон
2. Вне джойстика всё остаётся кликабельным
3. Джойстик можно сворачивать (минимизировать) и восстанавливать
4. Перетаскивать по экрану
Расположение поверх всех окон достигается с помощью настроек приоритета отображения TYPE_PRIORITY_PHONE. А кликабельность вне джойстика настраивается с помощью флагов LayoutParamFlags описанных ниже.
final int LayoutParamFlags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams = new WindowManager.LayoutParams(
controlWidth,
controlHeight,
WindowManager.LayoutParams.TYPE_PRIORITY_PHONE,
LayoutParamFlags,
PixelFormat.TRANSLUCENT);
При настройке типов отображения нужно обязательно в манифесте разрешить приложению появляться поверх всех окон.
Кроме того, в данном коде видно, что фон у джойстика в целом прозрачный.
Решения взяты частично отсюда: http://stackoverflow.com/questions/1144 ... d-launcher (Реплика пользователя t0mm13b).
Сворачивать джойстик и перетаскивать его по экрану стало возможно с помощью свойств Gravity и Margin. При сворачивании, значение Gravity меняется на END и BOTTOM (правый нижний угол экрана).
Отдельно можно рассказать о том что происходит с элементами джойстика при сворачивании. Структура layout такова, что все элементы кроме кнопки “свернуть” находятся в отдельном лэйауте. Когда поступает команда свернуть лэйаут с основными элементами становится невидимым (Visability.GONE), а корневой лэйаут принимает размеры своего содержимого (wrap_content).
Вот примерно как это выглядит:
FrameLayout fl = (FrameLayout) mMyView.findViewById(R.id.controlButtons);
if (View.VISIBLE == fl.getVisibility()) {
fl.setVisibility(View.GONE);
mWinMgr.updateViewLayout(mMyView, mPausedLayoutParams);
} else {
fl.setVisibility(View.VISIBLE);
mWinMgr.updateViewLayout(mMyView, mLayoutParams);
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/controls_width"
android:layout_height="@dimen/controls_height"
android:theme="@style/KeyControlsTheme">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="@dimen/smallButton"
android:layout_height="@dimen/smallButton"
android:text="-"
android:id="@+id/bPause"
android:layout_gravity="left|top"
android:background="@drawable/dot_white" />
</FrameLayout>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/controlButtons"
android:layout_gravity="right|bottom">
<!-- Long description of control buttons -->
</FrameLayout>
</FrameLayout>
На прозрачные стили андроида я надеяться не стал, они не на всех устройствах корректно отображались, поэтому кнопки я сделал в виде полупрозрачных картинок.
Перетаскивание окна по экрану сделано с помощью обработки события ACTION_MOVE вот так:
<...>
final float k = (float) 2.5; //Special parameter
final float X = event.getRawX() / mLayoutParams.width / k;
final float Y = event.getRawY() / mLayoutParams.height / k;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mXDelta = X - (mLayoutParams.horizontalMargin);
mYDelta = Y - (mLayoutParams.verticalMargin);
Break;
case MotionEvent.ACTION_MOVE:
Log.v(TAG, "ACTION_MOVE");
mLayoutParams.horizontalMargin = (X - mXDelta);
mLayoutParams.verticalMargin = (Y - mYDelta);
break;
<...>
Причём отступы от краёв (margins) и координаты нажатия определяются в разных координатных сетках, поэтому пришлось подбирать коэфициент k.
Конструкция:
Установка базируется на использовании сервоприводов модели TowerPro MG995. Данные сервоприводы имеют момент, равный 8-10 кг/см и требуют напряжения в пределах от 4,8 В и до 7 В. Для нормального функционирования, соответственно, на сервоприводы подаются стабилизированные 5-6 В( зависит от сборки).
Управляющая часть- Arduino на базе МК Atmega328- имеет рабочий диапазон в пределах от 5 до 12 В. Вместе с тем, Bluetooth HC-06, используемый в подставке, требует напряжение питания до 6 В. Так что на эти два модуля подаются стабилизированные 5 В, как и на используемые датчики движения и освещенности.
На инфракрасные диоды( на данный момент с мощностью 100 Вт и длиной волны 860 нм) подается напряжение 6 В. Они подключены к выходам ШИМ.
Для этих целей в базовой конструкции использован блок Li-Ion аккумуляторов, имеющий итоговую емкость 2600 мАч и выдающий в среднем 7,4 В. Вместе с тем, для грамотной зарядки и разрядки собранного блока в самой подставке, установлен соответствующий балансер-контроллер заряда + выход под USB для зарядки внешних устройств и power jack для питания через адаптер.
Алгоритмика:
Изначально питание подается лишь на Arduino, датчик движения и HC-06. Пока не было принято никаких данных или же не было засечено движения, установка не подает питания на сервоприводы. Если же началась передача данных через Bluetooth или в радиусе 7 метров было засечено движение, то подается 5-6 вольт на сервоприводы и дается соответствующий импульс для изменения положения. Если в течение 10-20 минут подставка была неактивна, то ток перестает подаваться на сервоприводы, и подставка вновь входит в режим ожидания.
(видео: https://www.youtube.com/watch?v=gvj36v4bv0k)
При получении пакетов данных, сервоприводы изменяют свое положение в заданном направлении до тех пор, пока не будет пакетно задано другое направление движения сервоприводов, либо же установка не получит вновь тот же самый пакет. В новой версии подставки движение сервоприводов плавно, что достигается за счет добавления в пакет параметра максимальной скорости.
В то же время, МК считывает показания с датчика освещенности. Если получаемые данные переходят определенный заданный порог, то начинается подаваться питание на ик светодиоды или же наоборот. Сами светодиоды подключены к выходам ШИМ, из-за чего достигается нарастающее возрастание яркости.
Кому вообще нужен СелфиБот?
Кому нужен СелфиБот?
Видеоблоггерам.
Снимайте себя со своего телефона / планшета / GoPro камеры без необходимости выстраивать кадр. Функция follow me сама будет поворачивать камеру и снимать вас, даже если вы двигаетесь по помещению.
Родителя с маленькими детьми.
Преврати свой телефон или планшет в удобную видеоняню. Теперь ваш телефон или планшет очень удобная видеоняня с режимом ночной съемки и функцией слежения за ребенком.
Занятым мамам и па
Вы постоянно заняты, в командировках, поздно возвращаетесь, но хотите видеть, как ваш малыш растет. Звоните на планшет, который установлен на СелфиБот и общайтесь со своим ребенком, даже если он совсем маленький. Он вас видит и слышит, а главное никому не нужно держать в руках планшет или телефон. Функция автоответа настраивается так, что никому не нужно нажимать кнопку «ответить» на планшете / телефоне.
Охранным предприятиям.
Мобильный охранный модуль с помощью СелфиБот и любого мобильного устройства. Теперь подвижная / мобильная WiFi камера с помощью любого мобильного планшета или телефона. Работает в сетях 2g, 3g, 4g, WiFi. Имеется ночное видение и датчик движения. СМС или иные формы информирования, в случае, если это необходимо.
Руководителям в компаниях.
Если Вы не успеваете физически приехать на все совещания, то СелфиБот позволит телеприсутствовать на всех встречах, почти одновременно не тратя время на дорогу.
Установите СелфиБота у ваших партнеров или в офисах где Вам необходимо телеприсуствовать. Подключайтесь в любое время и общайтесь с коллегами и партнерами по видеозвонку из любого мессенджера, в т.ч. Skype, Viber, Hangouts.
Фотографам.
Делай видео и фото дистанционно. Дистанционно выбирай ракурс и снимай на телефону или на камеру GoPro. Теперь удаленные фото или видео доступны. СелфиБот работает как от сети, так и автономно от аккумуляторов до 8 часов.
Кто много общается.
Освободите свои руки во время видеозвонков с мобильных устройств. Теперь Вам не надо держать телефон или планшет в руках. Это очень удобный гэджет, который позволит видеозвонки сделать более привычными, особенно в вечернее время за счет инфраркасной подсветки. Функция follow me будет поворачивать планшет или телефон самостоятельно, т.е. Вам не нужно все время пытаться попасть в кадр.
Для тех, кто влюблен.
Вы хотите общаться со свои любимым в ночное время и не хотите включать свет... Теперь видеосвязь доступна в ночное время с помощь инфракрасной подсветки. А главное теперь не нужно держать телефон или планшет в руках. Установите на СелфиБот и он сам будет поворачиваться за вами. Вы просыпаетесь и СелфиБот просыпается вместе с вами за счет того, что на нем установлены сенсоры движения.
У кого есть пожилые родители.
Чтобы вы могли позвонить вашим родителям с любое время и им не нужно было бы отвечать на телефон. Телефон и планшет всегда заряжен и находится на док. станции. Вы можете поворачивать камеру и всегда можете их найти в комнате, где они находятся.
Главное, что телефон / планшет всегда заряжен, установлен на СелфиБот и теперь Вы сами можете поворачивать и менять угол обзора. Функция автоответчика настраивается через Skype, т.е. нажимать кнопку ответить, теперь не обязательно.
Кто много готовит.
Хотите смотреть любимый фильм, при этом ходить по кухне или общаться с кем либо, чтобы быть постоянно в центре кадра. СелфиБот с функцией follow me. Позволит обрести свободу и не держать в руках телефон или планшет.
Теперь в момент разговора ваш телефон будет заряжаться за счет беспроводной зарядки.
Кто занимается спортом и любит делать селфи видео.
Хотите знать, правильно ли вы делаете упражнения? Поставьте Селфибот и он сам будет следить за вами и делать видеосъемку того, как вы занимаетесь. Для профессиональных тренеров теперь легко проводить видеоуроки.
Творческим личностям.
Вы любите что-то рассказывать и хотите делиться с друзьями этим. Не нужно сидеть теперь перед камерой. Ходите, двигайтесь. Камера сама будет за вами поворачиваться за счет функции follow me.
Вы можете преподавать, рассказывать. Читать лекции, рисовать, что-то делать своими руками и теперь камера сама будет поворачиваться. Онлайн вебинары теперь намного удобнее.
Малому бизнесу.
Вы часто не в офисе, но хотите знать, как работают ваши люди, и хотите с ними общаться. Оставляете планшет или телефон на СелфиБот и звоните и общайтесь в любое время.
Теперь вы всегда доступны в режиме видеозвонка. Можете проводить инспекцию или проводить обучение при этом никому не нужно держать в руках телефон или планшет. Он всегда на СелфиБот, всегда заряжен, всегда в сети. Меняйте угол обзора самостоятельно.
Кто любит собираться большой компанией.
Если вы друзьями собрались, а кто-то приехать не смог приехать. С СелфиБот это не беда. Теперь он сможет телеприсутсвовать с вами за одним столом. При этом сам сможет поворачивать камеру и менять угол обзора. Он может использовать любой мессенджер, который ему нравится. СелфиБот имеет внешний динамик, т.е. собеседника будет хорошо слышно. За счет встроенного аккумулятора, СелфиБот является автономным.
В медицинских учреждениях.
Теперб доктор может дистанционно общаться с пациентами. Для того, чтобы к больному родные и близкие смогли бы подключаться дистанционно по скайпу в любое время достаточно поставить СелфиБот в палате. Установить на него телефон или планшет. В любой момент родные и близкие смогут пообщаться, при этом не нужно держать телефон в руках. Планшет и телефон всегда будут заражены за счет беспроводной зарядки.
В шоу румах и демо стендах.
Преврати обычный планшет в подвижной рекламный носитель. Он будет привлекать больше внимания. Интерактивная связь с рекламодателем. Нажми кнопку и получи специальные условия по продукту. Теперь планшет или телефон легко трансформируются в то, что позволит увеличить продажи за счет подвижного механизма и интерактивной связи.
Для тайм кафе.
Теперь нет необходимости в тайм кафе выдавать посетителя жетоны. Посетителю достаточно подойти к СелфиБот. СелфиБот запомнит посетителя и далее начнет считать время. Когда же посетителю нужно будет уходить, то достаточно будет подойти к СелфиБоту и нажать кнопку «ухожу». СелфиБот сделает расчет сколько данный посетитель должен будет заплатить.
Поддержите нашу кампанию на http://igg.me/at/selfiebot