Аннотация
В этой статье описывается создание кода для приложения с виртуальным джойстиком (см. рис. 1), использующего новый модуль Hand Cursor в составе Intel® RealSense™ SDK. Проект разрабатывается на C#/XAML, его можно собрать с помощью Microsoft Visual Studio* 2015.
Рисунок 1. Приложение RS Joystick, управляющее имитацией полета в Google Earth*
Введение
В Intel RealSense SDK R5появилась поддержка новой модели камеры Intel® RealSense™ SR300. Камера SR300 — развитие модели на F200, в ней усовершенствован ряд возможностей и добавлен новый режим работы Hand Cursor.
Согласно описанию в документации SDKмодуль Hand Cursor возвращает одну точку для положения руки, что позволяет добиться высокой точности и скорости отслеживания. Цель этого модуля — упростить работу с элементами управления пользовательского интерфейса с помощью руки при поддержке ограниченного набора жестов.
RS Joystick — программный эмулятор джойстика, описанный в этой статье. Это приложение сопоставляет трехмерные данные руки, предоставляемые пакетом SDK, в виртуальные элементы управления джойстиком, что дает возможность взаимодействия с приложениями, управляемыми при помощи джойстика.
Приложение RS Joystick использует следующие компоненты модуля Hand Cursor.
- Тип Body Side:приложение оповещает пользователя о том, какая из рук управляет виртуальным джойстиком (на основе порядка от ближнего к дальнему).
- Жест Cursor-Click:пользователь может переключать состояние ВКЛЮЧЕНО/ВЫКЛЮЧЕНО кнопки 1 на виртуальном джойстике с помощью жеста щелчка пальцами.
- Адаптивное отслеживание точки:приложение отображает нормализованную трехмерную точку внутри воображаемой «ограничительной рамки», заданной модулем Hand Cursor, и использует эти данные для управления виртуальным джойстиком по осям X, Y и Z.
- Данные оповещений:приложение использует оповещения Cursor Not Detected, Cursor Disengagedи Cursor Out Of Borderдля изменения цвета джойстика с зеленого на красный, когда рука пользователя находится вне дальности действия камеры SR300.
(Дополнительные сведения о модуле Hand Cursor см. в статье “Что можно делать в режиме Intel RealSense Cursor?”)
Предварительные требования
Требуются некоторые знания C# и понимание базовых действий в Visual Studio, таких как сборка исполняемого файла. Также пригодится опыт добавления сторонних библиотек в индивидуальные программные проекты. Впрочем, даже если раньше вы этого не делали, трудностей возникнуть не должно, поскольку в этом руководстве приводятся подробные инструкции необходимых действий. В системе должна быть камера переднего обзора SR300, последние версии SDK и Intel® RealSense™ Depth Camera Manager (DCM). Кроме того, система должна отвечать требованиям к оборудованию, перечисленным здесь. И наконец, компьютер должен работать под управлением Microsoft Windows* 10 Threshold 2.
Стороннее программное обеспечение
В этом проекте, помимо пакета Intel RealSense SDK, используется сторонний драйвер виртуального джойстика под названием vJoy* и несколько библиотек динамической компоновки (DLL). Эти программные компоненты не входят в распространяемый код, связанный с этим проектом, поэтому сведения по загрузке и установке драйвера устройства приводятся ниже.
Установите Intel RealSense SDK
Загрузите и установите DCM и SDK по адресу https://software.intel.com/en-us/intel-realsense-sdk/download. На момент написания этой статьи последними версиями компонентов были следующие:
- Intel RealSense Depth Camera Manager (SR300) v3.1.25.1077
- Intel RealSense SDK v8.0.24.6528
Установите драйвер устройства vJoy и SDK
Загрузите и установите драйвер устройства vJoy: http://vjoystick.sourceforge.net/site/index.php/download-a-install/72-download. При получении соответствующей инструкции перезагрузите компьютер, чтобы завершить установку.
После установки драйвер устройства vJoy появится в разделе «Устройства HID» в диспетчере устройств (см. рис. 2).
Рисунок 2.Диспетчер устройств
Откройте в Windows 10 меню «Пуск» и выберите Все приложения. Вы увидите несколько установленных компонентов vJoy, как показано на рис. 3.
Рисунок 3.Меню «Пуск» в Windows
Чтобы открыть браузер по умолчанию и перейти на страницу загрузки, нажмите кнопку vJoy SDK.
После загрузки скопируйте ZIP-файл во временную папку и найдите DLL-библиотеки C# в папке \SDK\c#\x86.
Мы добавим эти DLL-библиотеки в проект Visual Studio после его создания (см. описание ниже).
Создайте новый проект Visual Studio
- Запустите Visual Studio 2015.
- В меню выберите Файл, Создать, Проект….
- На экране «Создание проекта» разверните «Шаблоны» и выберите Visual C#, Windows.
- Выберите Приложение WPF.
- • Укажите расположение проекта и его имя. Для этого проекта мы используем расположение C:\, а имя приложения — RsJoystick.
На рис. 4 показаны настройки этого проекта.
Рисунок 4.Настройки нового проекта в Visual Studio*
Нажмите кнопку ОК, чтобы создать проект.
Скопируйте библиотеки в проект
Для создания приложений Intel® RealSense™ на языке C# требуются две библиотеки.
- libpxcclr.cs.dll – управляемая DLL-библиотека интерфейса C#.
- libpxccpp2c.dll – неуправляемая DLL-библиотека C++ P/Invoke.
Еще две библиотеки дадут возможность приложению обмениваться данными с драйвером устройства vJoy.
- vJoyInterface.dll – библиотека API на языке C.
- vJoyInterfaceWrap.dll – оболочка C# для библиотеки API на языке C.
Чтобы упростить структуру проекта, мы скопируем все четыре библиотеки в папку проекта.
- Щелкните проект RsJoystick правой кнопкой мыши и выберите Добавить, Существующий элемент…
- Перейдите в папку библиотек vJoy (\SDK\c#\x86) и выберите vJoyInterface.dll и vJoyInterfaceWrap.dll. Примечание. В поле типа файлов может потребоваться выбрать Все файлы (*.*), чтобы DLL-библиотеки стали видны.
- Нажмите кнопку Добавить.
Аналогичным образом скопируйте в проект DLL-библиотеки Intel RealSense SDK.
- Щелкните проект RsJoystick правой кнопкой мыши, выберите Добавить, Существующий элемент…
- Перейдите в папку библиотек x86, это папка C:\Program Files (x86)\Intel\RSSDK\bin\win32, если пакет SDK был установлен в папку по умолчанию.
- Выберите libpxcclr.cs.dll и libpxccpp2c.dll.
- Нажмите кнопку Добавить.
Теперь все четыре файла должны быть видны в обозревателе решений в проекте RsJoystick.
Создайте ссылки на библиотеки
Если необходимая библиотека физически скопирована в проект Visual Studio, необходимо создать ссылки на управляемыебиблиотеки (.NET), чтобы приложение могло их использовать. Щелкните правой кнопкой мыши «Ссылки» (под проектом RsJoystick) и выберите Добавить ссылку…В окне диспетчера ссылок нажмите кнопку Обзори перейдите в папку проекта (c:\RsJoystick\RsJoystick). Выберите файлы libpxcclr.cs.dll и vJoyInterfaceWrap.dll, затем нажмите кнопку Добавить. Нажмите кнопку OKв диспетчере ссылок.
Для правильной работы управляемых DLL-библиотек оболочки необходимо скопировать неуправляемые DLL-библиотеки в выходную папку проекта перед запуском приложения. В обозревателе решений щелкните файл libpxccpp2c.dll, чтобы выбрать его. В окне свойств будут показаны свойства файла libpxccpp2c.dll. Найдите поле Копировать в выходной каталоги выберите в раскрывающемся списке Всегда копировать. Повторите этот шаг для файла vJoyInterface.dll. За счет этого неуправляемые DLL-библиотеки будут скопированы в выходную папку проекта при сборке приложения.
Здесь может появиться предупреждение о несовпадении между архитектурой процессора, заданной для собираемого проекта, и архитектурой процессора библиотек. Уберите это предупреждение, выполнив следующие действия:
- Найдите ссылку на диспетчер конфигураций в раскрывающемся списке в меню (см. рис. 5).
- Выберите Диспетчер конфигураций.
- В окне диспетчера конфигураций разверните раскрывающийся список в столбце Платформаи выберите Новая.
- Выберите x86в качестве новой платформы и нажмите кнопку OK.
- Закройте окно диспетчера конфигураций.
Рисунок 5. Диспетчер конфигураций
На этом этапе проект должен быть собран и запущен без каких-либо ошибок или предупреждений. Кроме того, если изучить содержимое выходной папки (c:\RsJoystick\RsJoystick\bin\x86\Debug), вы увидите, что в нее скопированы все четыре библиотеки.
Пользовательский интерфейс
В пользовательском интерфейсе (см. рис. 6.) отображаются следующие сведения:
- Рука пользователя, управляющая виртуальным джойстиком (на основе порядка доступа от ближнего к дальнему; ближайшая к камере рука считается управляющей).
- Состояние ВКЛЮЧЕНО/ВЫКЛЮЧЕНО кнопки 1 на виртуальном джойстике (управляется с помощью жеста щелчка пальцами).
- Эллипс, в котором отслеживается относительное положение руки пользователя по осям X и Y; диаметр изменяется на основе оси Z в соответствии с расстоянием между рукой и камерой.
- Данные Adaptive Point по осям X, Y и Z из SDK представлены в виде нормализованных значений, диапазон — от 0 до 1.
- Цветная рамка, цвет которой меняется с зеленого на красный, когда рука пользователя выходит за пределы дальности действия камеры SR300.
- С помощью ползунка регулируется чувствительность для каждой оси.
Рисунок 6. Пользовательский интерфейс
Полный исходный код XAML представлен в таблице 1. Его можно скопировать и вставить непосредственно в код MainWindow.xaml, автоматически сформированный при создании проекта.
Таблица 1.Исходный код XAML: MainWindow.xaml
<Window x:Class="RsJoystick.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:RsJoystick" mc:Ignorable="d" Title="RSJoystick" Height="420" Width="420" Background="#FF222222" Closing="Window_Closing"><Window.Resources><Style x:Key="TextStyle" TargetType="TextBlock"><Setter Property="Foreground" Value="White"/><Setter Property="FontSize" Value="14"/><Setter Property="Text" Value="-"/><Setter Property="Margin" Value="4"/><Setter Property="HorizontalAlignment" Value="Center"/></Style></Window.Resources><StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="320"><TextBlock x:Name="uiBodySide" Style="{StaticResource TextStyle}"/><TextBlock x:Name="uiButtonState" Style="{StaticResource TextStyle}"/><Border x:Name="uiBorder" BorderThickness="2" Width="200" Height="200" BorderBrush="Red" Margin="4"><Canvas x:Name="uiCanvas" ClipToBounds="True"><Ellipse x:Name="uiCursor" Height="10" Width="10" Fill="Yellow"/><Ellipse Height="50" Width="50" Stroke="Gray" Canvas.Top="75" Canvas.Left="75"/><Rectangle Height="1" Width="196" Stroke="Gray" Canvas.Top="100"/><Rectangle Height="196" Width="1" Stroke="Gray" Canvas.Left="100"/></Canvas></Border><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock x:Name="uiX" Style="{StaticResource TextStyle}" Width="80"/><Slider x:Name="uiSliderX" Width="150" ValueChanged="sldSensitivity_ValueChanged" Margin="4"/></StackPanel><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock x:Name="uiY" Style="{StaticResource TextStyle}" Width="80"/><Slider x:Name="uiSliderY" Width="150" ValueChanged="sldSensitivity_ValueChanged" Margin="4"/></StackPanel><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock x:Name="uiZ" Style="{StaticResource TextStyle}" Width="80"/><Slider x:Name="uiSliderZ" Width="150" ValueChanged="sldSensitivity_ValueChanged" Margin="4"/></StackPanel></StackPanel></Window>
Исходный код программы
Полный исходный код приложения RSJoystick на языке C# представлен в таблице 2. Его можно скопировать и вставить непосредственно в код MainWindow.xaml.cs, автоматически сформированный при создании проекта.
Таблица 2.Исходный код C#: MainWindow.xaml.cs
//-------------------------------------------------------------------------------------- // © Intel Corporation, 2016. // Все права защищены. // // Предоставляется разрешение на использование, создание, распространение и подготовку производных работ // этого программного обеспечения для любых целей без уплаты отчислений при условии, что приведенное выше уведомление об авторских правах // и данное уведомление сохранятся во всех копиях. Корпорация Intel не делает никаких заявлений относительно // пригодности этого программного обеспечения для любых целей. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ». // КОРПОРАЦИЯ INTEL НЕ ПРЕДОСТАВЛЯЕТ НИКАКИХ ГАРАНТИЙ, ЯВНЫХ И ПОДРАЗУМЕВАЕМЫХ, // ВКЛЮЧАЯ ГАРАНТИЮ ОТСУТСТВИЯ ОПОСРЕДОВАННЫХ ИЛИ ИНЫХ НЕПРЯМЫХ УБЫТКОВ В СВЯЗИ С ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, // ВКЛЮЧАЯ ГАРАНТИЮ НЕНАРУШЕНИЯ КАКИХ-ЛИБО ПРАВ СОБСТВЕННОСТИ И ВКЛЮЧАЯ // ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ ИЛИ ПРИГОДНОСТИ ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ. Корпорация Intel не // несет ответственности за любые ошибки, которые могут быть в этом программном обеспечении, и не принимает // никаких обязательств относительно обновления этого программного обеспечения. //-------------------------------------------------------------------------------------- using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using vJoyInterfaceWrap; using System.Threading; using System.Windows.Shapes; namespace RsJoystick { /// <сводка> /// Логика взаимодействия для MainWindow.xaml /// </сводка> public partial class MainWindow : Window { private PXCMSenseManager sm; private PXCMHandCursorModule cursorModule; private PXCMCursorConfiguration cursorConfig; private vJoy joystick; private Thread update; private double joySensitivityX; private double joySensitivityY; private double joySensitivityZ; private const uint joyID = 1; private const uint MaxSensitivity = 16384; public MainWindow() { InitializeComponent(); // Configure the sensitivity controls uiSliderX.Maximum = MaxSensitivity; uiSliderY.Maximum = MaxSensitivity; uiSliderZ.Maximum = MaxSensitivity; joySensitivityX = uiSliderX.Value = MaxSensitivity / 2; joySensitivityY = uiSliderY.Value = MaxSensitivity / 2; joySensitivityZ = uiSliderZ.Value = MaxSensitivity / 2; // Создание экземпляра джойстика joystick = new vJoy(); joystick.AcquireVJD(joyID); // Configure the cursor mode module ConfigureRealSense(); // Запуск потока Update update = new Thread(new ThreadStart(Update)); update.Start(); } public void ConfigureRealSense() { // Создание экземпляра SenseManager sm = PXCMSenseManager.CreateInstance(); // Включение отслеживания указателя sm.EnableHandCursor(); // Получение экземпляра модуля Hand Cursor cursorModule = sm.QueryHandCursor(); // Получение экземпляра конфигурации указателя cursorConfig = cursorModule.CreateActiveConfiguration(); // Создание и применение изменений конфигурации cursorConfig.EnableEngagement(true); cursorConfig.EnableAllGestures(); cursorConfig.EnableAllAlerts(); cursorConfig.ApplyChanges(); // Инициализация конвейера SenseManager sm.Init(); } private void Update() { bool handInRange = false; bool joyButton = false; // Запуск цикла AcquireFrame-ReleaseFrame while (sm.AcquireFrame(true).IsSuccessful()) { PXCMCursorData cursorData = cursorModule.CreateOutput(); PXCMPoint3DF32 adaptivePoints = new PXCMPoint3DF32(); PXCMCursorData.BodySideType bodySide; // Получение текущих данных указателя cursorData.Update(); // Проверка наличия данных оповещений for (int i = 0; i < cursorData.QueryFiredAlertsNumber(); i++) { PXCMCursorData.AlertData alertData; cursorData.QueryFiredAlertData(i, out alertData); if ((alertData.label == PXCMCursorData.AlertType.CURSOR_NOT_DETECTED) || (alertData.label == PXCMCursorData.AlertType.CURSOR_DISENGAGED) || (alertData.label == PXCMCursorData.AlertType.CURSOR_OUT_OF_BORDERS)) { handInRange = false; } else { handInRange = true; } } // Проверка срабатывания жеста щелчка PXCMCursorData.GestureData gestureData; if (cursorData.IsGestureFired(PXCMCursorData.GestureType.CURSOR_CLICK, out gestureData)) { joyButton = !joyButton; } // Отслеживание указателя: находится ли он в пределах допустимой дальности int detectedHands = cursorData.QueryNumberOfCursors(); if (detectedHands > 0) { // Получение данных указателя с помощью индекса на основе порядка PXCMCursorData.ICursor iCursor; cursorData.QueryCursorData(PXCMCursorData.AccessOrderType.ACCESS_ORDER_NEAR_TO_FAR, 0, out iCursor); adaptivePoints = iCursor.QueryAdaptivePoint(); // Получение управляющей стороны тела (т. е. правая или левая рука) bodySide = iCursor.QueryBodySide(); // Управление виртуальным джойстиком ControlJoystick(adaptivePoints, joyButton); } else { bodySide = PXCMCursorData.BodySideType.BODY_SIDE_UNKNOWN; } // Обновление пользовательского интерфейса Render(adaptivePoints, bodySide, handInRange, joyButton); // Возобновление обработки следующего кадра cursorData.Dispose(); sm.ReleaseFrame(); } } private void ControlJoystick(PXCMPoint3DF32 points, bool buttonState) { double joyMin; double joyMax; // Масштабирование данных по оси X joyMin = MaxSensitivity - joySensitivityX; joyMax = MaxSensitivity + joySensitivityX; int xScaled = Convert.ToInt32((joyMax - joyMin) * points.x + joyMin); // Масштабирование данных по оси Y joyMin = MaxSensitivity - joySensitivityY; joyMax = MaxSensitivity + joySensitivityY; int yScaled = Convert.ToInt32((joyMax - joyMin) * points.y + joyMin); // Масштабирование данных по оси Z joyMin = MaxSensitivity - joySensitivityZ; joyMax = MaxSensitivity + joySensitivityZ; int zScaled = Convert.ToInt32((joyMax - joyMin) * points.z + joyMin); // Обновление настроек джойстика joystick.SetAxis(xScaled, joyID, HID_USAGES.HID_USAGE_X); joystick.SetAxis(yScaled, joyID, HID_USAGES.HID_USAGE_Y); joystick.SetAxis(zScaled, joyID, HID_USAGES.HID_USAGE_Z); joystick.SetBtn(buttonState, joyID, 1); } private void Render(PXCMPoint3DF32 points, PXCMCursorData.BodySideType bodySide, bool handInRange, bool buttonState) { Dispatcher.Invoke(delegate { // Изменение отображения границы, чтобы указать, находится ли рука в пределах допустимой дальности uiBorder.BorderBrush = (handInRange) ? Brushes.Green : Brushes.Red; // Масштабирование данных указателя для отображения double xScaled = uiCanvas.ActualWidth * points.x; double yScaled = uiCanvas.ActualHeight * points.y; uiCursor.Height = uiCursor.Width = points.z * 100; // Перемещение указателя по экрану Canvas.SetRight(uiCursor, (xScaled - uiCursor.Width / 2)); Canvas.SetTop(uiCursor, (yScaled - uiCursor.Height / 2)); // Обновление отображаемых значений данных uiX.Text = string.Format("X Axis: {0:0.###}", points.x); uiY.Text = string.Format("Y Axis: {0:0.###}", points.y); uiZ.Text = string.Format("Z Axis: {0:0.###}", points.z); uiBodySide.Text = string.Format("Controlling Hand: {0}", bodySide); uiButtonState.Text = string.Format("Button State (use 'Click' gesture to toggle): {0}", buttonState); }); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { update.Abort(); cursorConfig.Dispose(); cursorModule.Dispose(); sm.Dispose(); joystick.ResetVJD(joyID); joystick.RelinquishVJD(joyID); } private void sldSensitivity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { var sliderControl = sender as Slider; switch (sliderControl.Name) { case "uiSliderX": joySensitivityX = sliderControl.Value; break; case "uiSliderY": joySensitivityY = sliderControl.Value; break; case "uiSliderZ": joySensitivityZ = sliderControl.Value; break; } } } }
Сведения о коде
Чтобы код был как можно проще, все методы заключены в один класс. Как показано в исходном коде в таблице 2, класс MainWindow состоит из следующих методов:
- MainWindow(): несколько частных классов и членов-переменных объявляются в начале класса MainWindow. В конструкторе MainWindow создаются экземпляры этих объектов и происходит инициализация переменных.
- ConfigureRealSense():этот метод обрабатывает создание объекта SenseManager и работу модуля Hand Cursor, а также настраивает модуль Cursor.
- Update(): согласно описанию в Справочном руководстве Intel RealSense SDKинтерфейс SenseManager может быть использован либо вызовами процедур, либо обратными вызовами событий. В приложении RSJoystick мы используем вызовы процедур в качестве методики взаимодействия. Они получают и высвобождают запуски циклов кадров в потоке Update() независимо от основного потока пользовательского интерфейса. Этот поток работает непрерывно; в нем мы получаем данные указателя, жестов и оповещений.
- ControlJoystick(): этот метод вызывается из метода Update() при обнаружении руки пользователя. Этому методу передаются данные Adaptive Point вместе с состоянием кнопки виртуального джойстика (оно переключается жестом CURSOR_CLICK). Данные Adaptive Point масштабируются на основе значений, полученных от ползунков регулировки чувствительности. С помощью ползунка и расчета масштабирования пользователь может выбирать масштаб значений, передаваемых в метод vJoy SetAxis(). Этот метод ожидает значения в диапазоне от 0 до 32 768. Если ползунок регулировки чувствительности установлен в максимальное положение, то соответствующие данные указателя будут преобразованы в значение в диапазоне от 0 до 32 768. При снижении чувствительности этот диапазон будет сужен для такой же траектории руки. Например: от 8192 до 24 576.
- Render(): этот метод вызывается из потока Update() и использует метод Dispatcher.Invoke() для выполнения операций с потоком пользовательского интерфейса. Это касается обновления положения эллипса на полотне и обновления значений данных в элементах управления TextBlock.
- sldSensitivity_ValueChanged(): этот обработчик событий срабатывает при регулировке положения ползунков.
Использование приложения
Можно проверить работу приложения, запустив vJoy Monitor в меню «Пуск» в Windows 10 (см. рис. 3). Как показано на рис. 7, можно отслеживать эффекты перемещения руки вдоль трех осей и выполнения жеста щелчка для переключения виртуальной кнопки 1.
Рисунок 7. Тестирование приложения с vJoy Monitor
Чтобы попробовать приложение в более интересном контексте, можно запустить симулятор полета в программе Google Планета Земля* (см. рис. 1). Согласно описанию на сайте, «Google Планета Земля — это виртуальные путешествия по всем уголкам Земли, спутниковые изображения, карты местности, трехмерные здания и самые разные объекты — от галактик в космосе до океанских впадин». (https://www.google.com/earth).
После загрузки и установки программы Google Планета Земля ознакомьтесь с инструкциями, приведенными здесь, для запуска симулятора полета. Сначала следует снизить чувствительность для осей X и Y в RSJoystick, чтобы движения руки не слишком сильно влияли на перемещение виртуального самолета. Для оси Z необходимо установить ползунок в максимальное положение. Немного привыкнув, вы сможете управлять виртуальным самолетом при помощи плавных движений руки.
Заключение
В этой статье приведено простое пошаговое руководство, в котором описывается создание приложения-эмулятора джойстика с помощью Intel RealSense SDK и использование модуля Hand Cursor, который поддерживается камерой SR300.
О технологии Intel RealSense
Дополнительные сведения о пакете Intel RealSense SDK для Windows см. по адресу https://software.intel.com/en-us/intel-realsense-sdk.
Об авторе
Брайан Браун (Bryan Brown) — инженер по разработке программных приложений в подразделении Software and Services Group корпорации Intel.