С момента появления сенсора Kinect for Windows я питал тихую страсть к программированию такого рода устройств – ведь это волшебное чувство, когда написанная тобой программа отзывается на движения человека на расстоянии! Сегодня я расскажу вам про программирование ещё одного похожего устройства – Leap Motion.
По сути дела, Leap Motion – это небольшой Kinect, который может распознавать положение кистей рук. По замыслу создателей (хорошо отраженных в этом видео), его можно использовать для управления компьютером во множестве различных сценариев. В этом посте мы рассмотрим, как программируется Leap Motion (на платформе .NET), и как можно не его основе создать простой музыкальный инструмент – терменвокс. Вот такой:
Простейший терменвокс на базе Leap Motion
Leap Motion для программиста
С точки зрения программиста, Leap Motion предоставляет набор удобных API (документированных тут), которые позволяют:
- С высокой частотой (более, чем 60-100 кадров в секунду) получать модель пространства, включающую в себя координаты и скорости пальцев рук, нормали ладоней, положения и скорости различных “инструментов” (Leap Motion хорошо распознает карандаши и авторучки)
- Распознавать основные жесты: окружность, swipe, нажатие
- Эмулировать touch surface, т.е. касания некоторой виртуальной поверхности перед экраном
- Распознавать основные движения рук и пальцев (motions), транслируя их в преобразования поворота, перемещения или масштабирования.
В отличие от Kinect, Leap Motion не предоставляет доступа к 3D-данным, полученным с камеры
Программировать Leap Motion можно на различных языках и платформах, в том числе .NET. В этой статье мы рассмотрим использование первой возможности – доступа к модели руки.
Отслеживаем простейшие движения
Для наших экспериментов создадим пустой WPF-проект, и добавим на основной экран цветную окружность. Нашим первым шагом будет научиться перемещать эту окружность по экрану движениями пальца. Итак, разметка основной странички (XAML) будет выглядеть так:
<Window x:Class="LeapVoxSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="768" Width="1024" Background="Black">
<Canvas>
<Ellipse x:Name="ptr" Fill="Yellow" Height="30" Width="30"/>
</Canvas>
</Window>
Для использования Leap Motion необходимо скачать Leap Motion SDK, и подключить к проекту ссылку на LeapCSharp.NET4.0.dll. Однако это еще не всё – Leap SDK требует также библиотек Leap.dll и LeapCSharp.dll, которые должны находится в одной директории с выполняемым файлом проекта. Поэтому найдите эти файлы в директории LeapSDK\lib\x86 (в той директории, где установлен Leap SDK), перетащите их в проект Visual Studio и установите свойства “действия при компиляции = контент, копировать в выходную директорию = копировать, если новее”.
Все общение с контроллером Leap ведется через объект Controller. Создадим такой объект в нашем основном файле MainWindows.xaml.cs:
Controller Leap = new Controller();
Теперь Leap Motion готов предоставлять нам кадры с данными о положении рук. Получать кадры можно двумя способами:
- Передать в объект Controller экземпляр класса Listener, в котором будет перегружен метод OnFrame. Этот метод будет автоматически вызываться Leap Motion SDK с максимально возможной частотой кадров.
- Создать свой метод, который будет периодически опрашивать класс Controller и получать с него текущий кадр. Так следует поступать, есть в программе уже есть естественный цикл, или если мы хотим выполнять код в UI-потоке выполнения.
В нашем случае для создания цикла опроса конроллера используем DispatcherTimer, который будет срабатывать 30 раз в секунду:
DispatcherTimer dt = new DispatcherTimer()
{
Interval = TimeSpan.FromSeconds(1 / 30)
};
public MainWindow()
{
InitializeComponent();
dt.Tick += dt_Tick;
dt.Start();
}
В методе dt_Tick будет сосредоточена основная логика отслеживания движений. Мы получаем текущий кадр (Frame), и если в этом кадре видны пальцы – берем первый попавшийся их них и используем его координаты, чтобы изменить положение окружности:
void dt_Tick(object sender, EventArgs e)
{
var fr = Leap.Frame();
if (fr!=null && fr.Fingers.Count>0)
{
var f = fr.Fingers[0];
Canvas.SetLeft(ptr, 512 + f.TipPosition.x);
Canvas.SetTop(ptr, 768-f.TipPosition.y);
}
}
Мы добились того, что можем перемещать кружок по экрану, передвигая палец над контроллером Leap Motion. Пример кода на данном этапе можно посмотреть на GitHub.
Программная генерация звука различной высоты
Для программной генерации звука различной высоты мы используем библиотеку NAudio. Простейший способ добавить поддержку NAudio в проект – использовать Nuget, набрав в консоли диспетчера пакетов:
install-package NAudio
Процесс генерации звука переменной высоты подробно описан в статье Чарльза Петцольда на MSDN. Если коротко – мы создаем класс, который генерирует синусоидальную волну звука, и передаем её на вход методу NAudio, который эту волну воспроизводит. При этом есть ряд тонкостей: чтобы звук менялся более плавно, необходимо плавно менять частоту звука, и при этом учитывать задержку буферизации аудио. Все эти тонкости учтены в классе PortamentoSineWaveOscillator.cs, который необходимо поместить в проект.
Для генерации звука мы создаем объект типа WaveOut и инициализируем его, передавая экземпляр созданного нами осциллятора:
WaveOut WaveGen = new WaveOut();
PortamentoSineWaveOscillator Osc = new PortamentoSineWaveOscillator(44100,120);
Инициалиацию мы проводим в конструкторе страницы:
WaveGen.Init(Osc);
WaveGen.Play();
Теперь нам достаточно изменять свойство Osc.Pitch, чтобы соответствующим образом менялась высота звука, и Osc.Amplitude для изменения громкости. Пускай горизонтальные движения пальцев отвечают за громкость, а вертикальные – за высоту звука. Коэффициенты подбираются опытным путем для достижения кофортного звучания:
void dt_Tick(object sender, EventArgs e)
{
var fr = Leap.Frame();
if (fr!=null && fr.Fingers.Count>0)
{
var f = fr.Fingers[0];
...
// Меняем высоту звука
var p = Math.Abs(f.TipPosition.y / 2);
var a = 255 - Math.Abs(f.TipPosition.x);
if (p >= 0 && p <= 150) Osc.Pitch = p;
if (a >= 0 && a <= 255) Osc.Amplitude = (short)a;
}
}
Версию проекта на этой стадии можно получить тут.
Последние штрихи
Чтобы сделать проект чуть более красивым, вместо обычного круга, перемещаемого по экрану, можно добавить спец.эффекты на основе системы частиц (Particle Systems). Я взял за основу вот эту статью на CodeProject, где приводится исходный код WPF-контрола, представляющего собой источник частиц. Заменив им окружность, добавленную на первом шаге, мы получим финальный проект, исходный код которого доступен на GitHub.
Домашнее задание
Если вы захотите продолжить эксперименты, то простор для творчества практически неограничен! В частности, можно:
- Добавить поддержку многоголосия и управления сразу несколькими пальцами
- Экспериментировать с другими способами управления высотой звука, например, брать за основу не положение пальца, а его скорость
- Добавить поддержку жестов для извлечения специальных звуков (сэмплов)
Если вас будет интерес к этой теме (пишите в комментариях), то я продолжу серию статей, добавляя различные дополнительные интересности, связанные с Leap Motion, Kinect и неожиданным использованием мобильных устройств. О чем вам бы хотелось услышать? Например, в этом видео показано, что ещё можно сделать с помощью Leap Motion за пару часов:
Мини-хакатон с Leap Motion – результаты
Вот и закончилось самое крупное студенческое мероприятие в истории российского Майкрософта – международный финал конкурса Imagine Cup. К этому мероприятию мы готовились больше года, и проводилось оно огромной международной командой, распределенной по странам и континентам – США, Россия, Англия, Франция – это лишь основные из вовлеченных стран. А вообще-то вовлечен был почти весь мир, поскольку на сорвенование приехали студенты из 71 страны мира! Со многими из этих студентов мне довелось познакомиться заранее – поскольку мы переписывались с командами, пытясь дать им совет, как провести всё их оборудование через таможню.
Само соревнование проходило в Санкт-Петербурге в течение 4 дней, из которых сами соревнования заняли 2 дня. Соревнования проходили в рамках Международной молодёжной недели инновационных информационных технологий, в рамках которой же неделей ранее прошел международный финал командного чемпионата мира по программированию ACM. В течение двух дней команды презентовали свои проекты международному жюри, состоящему из признанных в мире экспертов отрасли, среди которых были разработчик компьютерных игр, создатель «Тетриса» Алексей Пажитнов, старший исследователь Microsoft Research Билл Бакстон, вице-президент, организатор выставок «Технического музея инноваций» Лэт Карлсон и другие.
К слову сказать, мне тоже довелось принять участие в работе жюри в онлайн-категориях, где не было российских команд – так что теперь мое имя находится в одном списке с этими великими людьми!
Для многих студентов финал становится поворотным событием в жизни. Это не только поездка в новую незнакомую страну, но и возможность познакомиться с самыми активными и талантливыми студентами со всего мира, очень ярко и насыщенно провести время, посмотреть, какие проекты делают студенты из других стран и вдохновиться на создание новых инновационных проектов.
Сами соревнования проходили в гостинице Park Inn Прибалтийская. В течение первого дня студенты представляли на суд жюри 10-минутные презентации своих проектов, а во второй день – проводили несколько (4-6) индивидуальных 15-минутных встреч с каждым из членов жюри, показывая ему свой проект, давая попробовать, и отвечая на индивидуальные вопросы. По результатам двух дней в результате долгих совещаний жюри и сложных расчетов были определены победители.
Такой формат соревнований был применен впервые, и очевидно, что он имеет свои плюсы и минусы. Тем не менее, было очень интересно беседовать со студентами, по словам которых формат 1:1-собеседований с жюри помог им извлечь множество полезных мыслей и получить реальные советы по поводу дальнейшего развития проекта.
Также в этом году впервые студенты после первого дня презентаций получили отзывы и комментарии жюри, и имели шанс учесть их во второй день в ходе индивидуальных сессий. Наша российская команда, например, получила эти отзывы в 3 утра, и до 5 утра доделывало свою демонстрацию, которую в 8 утра уже надо было показывать жюри! Вы можете себе представить, в каком напряженном режиме жила команда, и какую волю к победе они имели!
Студенты также имели возможность приобщиться к российской культуре. В рамках культурного дня они посетили комплекс “деревня Шуваловка”, где смогли потрогать медведя и принять участие в множестве традиционно-русских развлечений: ковка, гончарное дело, сражения на мечах и т.д.
А завершилась церемония грандиозным фонтанным шоу в Петергофе, который был специально открыт только для участников соревнований.
Одна из важнейших составляющих соревнований – это выставка проектов, которая была открыта для всех желающих, и которую посетили около 400 студентов Санкт-Петербурга и других городов. В рамках выставки стенды студентов также посетили члены жюри, президент Майкрософт Россия Николай Прянишников, Иван Громов, председатель комитета по информатизации Санкт-Петербурга), Алексей Никуличев, председатель комитета по информатизации Вологодской области, который проявил особый интерес к представленной на конкурсе российской команде из Череповецкого университета и обещал подробнее познакомиться с проектом и оказать поддержку.
Деловая часть мероприятия завершилась грандиозной церемонией награждения, которая проходила в Александринском театре. На церемонии присутствовал и вручал награды победителям Министр связи и массовых коммуникаций РФ Николай Никифоров.
Кстати, перед церемонией он отдельно встретился с российскими командами, пожелал им удачи на пути дальнейшего развития их проектов и становления предринимателями, внимательно выслушал пожелания студентов и обещал при необходимости оказать проектам поддержку.
Саму церемонию закрытия вел Мэтт Смит, известный также как Доктор Кто, главный персонаж одноименного британского сериала. На подходах к театру его встречала толпа молоденьких фанаток, которые, к слову, были также рады видеть наши российские команды Imagine Cup и шумно желали им удачи.
На церемонии также выступали Николай Прянишников, представители партнёров: генеральный директор АСИ Андрей Никитин, руководитель Открытого университета Сколково Андрей Егоров, спонсоры: Mail.ru, KFC, Samsung, DevExpress и другие.
Не буду перечислять здесь весь список победивших команд – заинтересованных отсылаю к официальному сайту, или к моей официальной записи в студенческом блоге. Отмечу лишь, что не все проекты-победители были очень сложными – например, в категории Windows Phone победило несложное приложение – напоминалка с голосовым интерфейсом, правда, оно уже было в Marketplace и имело около 5000 пользователей.
В завершение церемонии перед студентам в формате видеообращения выступил Стив Балмер, который отметил, что Imagine Cup побывал уже во многих странах, но пока еще ни разу не был ДОМА. Поэтому финал Imagine Cup 2014 пройдет в самом сердце Майкрософт – в штаб-квартире корпорации в Редмонде и в Сиэтле.
Полностью запись церемонии награждения Imagine Cup 2013 вы можете посмотреть на TechDays.ru, на русском и английском языках.
Прекрасным завершением дня и всех соревнований стала студнческая вечеринка, которая прошла на берегу реки в прекрасном ресторанчике ЗимаЛето. И хотя не все студенты были одинаково радостны – это было место, где команды узнавали подробности о своих выступлениях от членов жюри, где завязывались полезнейшие международные связи и рождались идеи для конкурса следующего года.
Вы можете много читать про Imagine Cup (например, хороший взгляд на финал “с другой стороны” можно прочитать в статье на iXBT. и в блоге Алексея Надёжина), смотреть фотографии – но передать атмосферу и энергетику этого мероприятия в словах нельзя. Поэтому самое время летом подумать, что хорошего можно сделать с помощью удивительных информационных технологий, чтобы в следующем году поучаствовать в конкурсе и влиться в это удивительно живое и активное сообщество людей, которые живут идеей Imagine Cup.
До встречи в следующем учебном году!
Многие из вас наверняка слышали про предстоящий выход нового поколения игровых консолей Xbox One, которые будут комплектоваться сенсором Kinect нового поколения. Ожидается, что аналогичные по характеристикам сенсоры Kinect for Windows появятся в 2014 г.
Среди новых возможностей Kinect 2.0 – существенно улучшенное распознавание скелета, включая движение пальцев, углы поворота костей и напряжение мышц, возможность измерять пульс человека на расстоянии, намного более высокая точность 3D-камеры, повышенное разрешение обычной веб-камеры, новый режим работы в ИК-диапазоне (что позволит сенсору работать при любой освещенности) и много других нововведений.
Однако для самых активных Kinect-разаботчиков есть уникальные возможность присоединиться к программе early adopters. За $399, участники программы получат предварительную альфа-версию устройства (предположительно осенью 2013 г.), и потом окончательную версию, когда она выйдет в 2014 г. Кроме того, будет предоставлен доступ к предварительный версиям Kinect SDK (в т.ч. Kinect SDK 1.8, который ожидается в сентябре), к специализированной документации и т.д.
Подать заяки на участие в программе нудно до конца июля. При этом далеко не все подавшие заявки получат доступ к программе. У нас есть возможность номинировать лучших разработчиков, чтобы повысить их шансы на участие в программе – если вы хотите номинироваться, присылайте мне информацию о своих проектах для Kinect for Windows, на английском языке.