Quantcast
Channel: Статьи Intel Developer Zone
Viewing all 357 articles
Browse latest View live

Intel® RealSense™ SDK и Oculus Rift* DK2

$
0
0

Введение

В этой статье описываются технические подробности и проблемы, с которыми могут столкнуться разработчики при создании программных решений, использующих Intel® RealSense™ SDK для Windows* и очки (гарнитуру) Oculus Rift*. Мы начинаем с обзора комплекта Oculus Rift Development Kit 2 (DK2), затем перейдем к некоторым проблемам, возникающим при разработке приложений, работающих с несколькими инфракрасными камерами (рис. 1). В этой статье также приводится описание интеграции Intel RealSense SDK и Oculus Rift в проекте Unity* 5.

Intel® RealSense™ SDK and Oculus Rift* Apps

Рисунок 1. Одновременно запущенные демонстрационные приложения Intel®RealSenseSDKи OculusRift*

Область и требования

Информация, представленная в этой статье, касается применения камеры Intel® RealSense™ F200 (переднего обзора). Для выполнения всех описываемых действий потребуется комплект Oculus Rift DK2, камера Intel RealSense (F200)и система разработки, отвечающая следующим требованиям.

  • Процессор Intel® Core™ 4-го поколения или более поздний (для поддержки Intel RealSense SDK)
  • 150 МБ свободного места на жестком диске
  • 4 ГБ ОЗУ
  • Один порт USB3 для камеры F200 и два порта USB 2.0 для Oculus Rift DK2
  • Windows* 8.1
  • Выделенная видеокарта NVIDIA GTX* серии 600 или AMD Radeon* серии HD 7000 (или более мощная) с выходом DVI*-D или HDMI*.

Для поддержки Oculus Rift* DK2 и камеры Intel® RealSense™ (F200) требуются следующие программные компоненты.

  • Intel RealSense SDK (версии 6.0.21.6598 или более поздней)
  • Intel RealSense Depth Camera Manager F200 (версии 1.4.27.41944 или более поздней)
  • Oculus SDK для Windows* (версии 0.7.0.0-beta или более поздней)
  • Среда выполнения Oculus для Windows* (версии 0.7.0.0-beta или более поздней)
  • Oculus Utilities для Unity 5 (версии 0.1.2.0-beta или более поздней)

Для ознакомления с Unity можно использовать бесплатную персональную версию (5.2.2 или более позднюю), доступную здесь.

Комплект Oculus Rift* DK2

Oculus Rift DK2 — это комплект оборудования и программных компонентов, позволяющий разработчикам создавать игры и интерфейсы виртуальной реальности. В дополнение к очкам (гарнитуре) комплект также включает камеру отслеживания положения с низкими задержками, чтобы следить за движением головы пользователя.

Это, по сути, обычная веб-камера, на объектив которой установлен инфракрасный фильтр. Очки (гарнитура) оснащены несколькими скрытыми инфракрасными светодиодами, установленными таким образом, что камера отслеживания использует их для определения положения головы пользователя в трехмерном пространстве. Интересно, что эти скрытые источники ИК-излучения обнаруживаются камерой Intel RealSense при просмотре ИК-потока камеры в примере Raw Streams в SDK (рис. 2).

Oculus Rift* IR LEDs visible to Intel® RealSense™ Camera

Рисунок 2. ИК-светодиоды Oculus Rift* видны камере Intel® RealSense™

Очки (гарнитура) Oculus Rift включают гироскоп, акселерометр и магнитометр.
В сочетании с объединенными данными датчиков это оборудование определяет ориентацию головы пользователя и выдает соответствующие координаты поворота вокруг продольной, поперечной и вертикальной осей. Камера отслеживания предоставляет дополнительную информацию о положении головы пользователя (т. е. пространственные координаты по осям X, Y и Z).

Чтобы лучше понять, что именно камера отслеживания DK2 добавляет в картину виртуальной реальности, запустите демонстрационную сцену из программы настройки Oculus (рис. 3).

Oculus Configuration Utility

Рисунок 3. Программа настройки Oculus

При просмотре демонстрационной сцены (рис. 4) с камерой отслеживания, подключенной к порту USB, вы увидите, что объекты на виртуальном столе будут находиться ближе или дальше при приближении или отдалении головы от камеры.

Oculus Rift* demo scene

Рисунок 4. Демонстрационная сцена OculusRift

Если после этого запустить эту демонстрационную сцену, отключив разъем USB камеры отслеживания, вы увидите, что данные ориентации, предоставляемые датчиком очков (гарнитуры) Oculus Rift, по-прежнему будут задавать углы поворота вокруг продольной, поперечной и вертикальной осей, но ощущение глубины пропадет при перемещении головы по оси Z.

Помехи при одновременном использовании с камерой переднего обзора

Разработчики, использующие Intel RealSense SDK и заинтересованные в создании приложений виртуальной реальности, использующие камеру переднего обзора Intel RealSense F200, должны помнить о возможности помех, образуемых при взаимном влиянии трехмерной камеры глубины и камеры отслеживания Oculus Rift. На рис. 5 показан ультрабук-трансформер Lenovo ThinkPad* Yoga 15 со встроенной камерой Intel RealSense F200 и камерой отслеживания Oculus Rift, установленной рядом на кромке экрана.

Forward-facing cameras

Рисунок 5. Камеры переднего обзора

Камера Intel RealSense F200 использует технологию кодирования света для проецирования ИК-излучения на пользователя и получения невидимого отраженного изображения ИК-камерой. Гарнитура Oculus Rift использует для частичного отслеживания головы набор ИК-светодиодов, свечение которых регистрируется собственной пассивной ИК-камерой; эта камера оборудована оптическим фильтром, который пропускает только инфракрасную область спектра. Влияние ИК-светоди­одов гарнитуры Oculus Rift на камеру Intel RealSense можно увидеть как изменяющиеся помехи в потоке глубины, как показано на рис. 6.

IR Interferences to the Depth Data

Рисунок 6. ИК-помехи данных глубины

Сдвиг камеры отслеживания DK2 на некоторый угол по отношению к камере Intel® RealSense™ может несколько снизить воздействие ИК-помех, но тот факт, что гарнитура Oculus может быть источником ИК-излучения, означает, что она будет определенным образом влиять на камеру переднего обзора Intel RealSense, когда используется камера отслеживания DK2.

Чтобы лучше понять последствия таких помех, мы запустили образец приложения SDK Hands Viewer, подключив камеру отслеживания DK2 к порту USB и запустив демонстрационное приложение виртуальной реальности Oculus Rift. Как показано на рис. 7, наблюдается значительное падение кадровой скорости. Это можно связывать с разными факторами (например, для этого теста использовался видеоадаптер NVIDIA GeForce* 840M, менее мощный, чем указано в минимальных требованиях). Но все же интересно наблюдать, что отслеживание руки и распознавание жестов камерой Intel RealSense при этом работают достаточно хорошо.

Gesture recognition in the presence of Oculus Rift’s IR LEDs

Рисунок 7. Распознавание жестов при наличии инфракрасных светодиодов
OculusRift

Использование Unity 5

Ранее мы упомянули возможные помехи между камерой Intel RealSense и камерой DK2, но что произойдет, если сочетать эти технологии в реальном проекте?
В следующих разделах мы кратко разберем создание простого проекта Unity 5 с поддержкой камеры Intel RealSense, а затем включим виртуальную реальность.

Создайте новый проект Unity

  • Запустите новый проект Unity, дважды щелкнув значок Unity на рабочем столе. Выберите New, затем выберите имя и расположение проекта.
  • Если редактор Unity уже открыт, создайте новый проект, выбрав File, NewProjectв меню, затем укажите имя и расположение проекта.

 

 

Импортируйте набор инструментов RSSDK Unity Toolkit

  • Импортируйте набор инструментов RSSDK Unity Toolkit, выбрав Assets, ImportPackage, CustomPackageв меню.
  • На экране Import Package перейдите в папку SDK, в которой находится пакет Unity Toolkit. Это расположение может различаться в зависимости от того, куда был установлен пакет SDK. В этом примере набор инструментов находится в папке C:\ProgramFiles (x86)\Intel\RSSDK\framework\Unity.
  • Выберите UnityToolkit, затем щелкните Open.

(Примечание.В этой папке находятся два файла Unity: UnityToolkitи UnityCSharp. При импорте UnityCSharpбудут добавлены только нужные управляемые и неуправляемые библиотеки DLL, необходимые для поддержки Intel RealSense SDK в приложении Unity. Если импортировать UnityToolkit, то нужные DLL-библиотеки будут импортированы в проект вместе со множеством других ресурсов, чтобы упорядочить разработку проекта с поддержкой Intel RealSense SDK.)

  • Появится экран Importing Package, на котором будут выбраны все подключаемые модули, действия и заготовки. Оставьте флажки установленными и нажмите кнопку Import.
  • На экране Project обратите внимание, что в проект добавлен ряд активов, которые находятся в следующих папках.
    • Plug-ins. Содержит файл libpxccpp2c.dll и неуправляемую
      DLL-библиотеку C++ P/Invoke.
    • Plugins.Managed. Содержит файл libpxcclr.unity.dll и управляемую библиотеку интерфейса C#.
    • RSUnityToolkit. Содержит папки Actions, Internals, Prefabs и Samples.

Добавьте игровой объект

  • Проект будет изначально содержать основную камеру и направленный источник света. На экране Hierarchy щелкните Create, затем выберите 3DObjectи Cube. При этом в игровую сцену будет добавлен игровой объект-куб.
  • В папке Project в Assets разверните папку RSUnityToolkitи выберите Actions.
  • Папка Actions содержит сценарии, которые можно применять к игровым объектам. Щелкните сценарий TrackingAction, затем перетащите его на игровой объект Cubeна экране Hierarchy.
  • Выберите Cubeна экране Hierarchy, и вы увидите, что на экране Inspector отображается TrackingAction (Script).

Настройка отслеживания рук

  • По умолчанию для действия отслеживания выбрано HandTracking, а для габаритов области виртуального мира (Virtual World Box Dimensions) задано значение 100по осям X, Y и Z. Если вы играете в игру в этот момент, то уви­дите, что светодиод трехмерной камеры глубины включится, указывая, что камера активирована.
  • Если поднять руку перед камерой, вы (скорее всего) увидите, что игровой объект-куб улетит с экрана. Причина в том, что для параметра Virtual World Box Dimensions заданы слишком большие значения. Измените параметры Virtual World Box Dimensions на 10для осей X, Y и Z.
  • Обратите внимание, что в представлении сцены теперь поле виртуального мира, очерченное красным, приблизилось к игровому объекту (см. рис. 8).
  • Снова запустите игру. Теперь игровой объект-куб должен отслеживать движение вашей руки в более тесном виртуальном пространстве.
  • Возможно, вы заметили, что куб двигается прерывисто. Можно сделать движение более плавным, задав для параметра Smoothing Factor значение 10.

Unity* Editor – Tracking Action Settings

Рисунок 8. Unity* Editor — параметры действий отслеживания

Включение виртуальной реальности в проекте Unity

Как указано на веб-сайте Oculus Rift DK2, разработчики Unity 5.1+ могут заменить стереоскопическую камеру виртуальной реальности на встроенные средства отслеживания ориентации и положения главной камеры. Для этого нужно установить флажок VirtualRealitySupportedв разделе Player Settings. Выполните следующие действия, чтобы включить виртуальную реальность в проекте.

  • Выберите Edit – Project Settingsв меню, затем щелкните Player.
  • В окне Inspectorустановите флажок Virtual Reality Supported.

Нажмите кнопку Playи наденьте очки Oculus Rift. Вы сразу увидите, что преобразования главной камеры теперь заменяются отслеживанием ориентации очков Oculus Rift. Куб по-прежнему отслеживает движение вашей руки с помощью сценария TrackingAction в Intel RealSense SDK Toolkit для Unity, но теперь камера Unity отслеживает движение очков.

Unity Virtual Reality Enabled

Рисунок 9. Unityс включенной виртуальной реальностью

Импортируйте пакет Oculus Utilities для Unity

Пакет Utilities — необязательное дополнение, он включает заготовки, сцены и сцена­рии для разработки приложений виртуальной реальности. Ниже показано, как импортировать этот пакет в ваш проект.

  • Выберите Assets, Import Package, Custom Package…в меню.
  • На экране ImportPackageперейдите в папку, в которой находится файл пакета OculusUtilitiesUnity. Выберите OculusUtilities, затем щелкните Open.
  • Появится экран ImportingPackage, на котором будут выбраны все компоненты Oculus. Оставьте все флажки установленными и нажмите кнопку Import.

Примечание.В этом примере мы добавим в сцену заготовку OVRCameraRig из пакета OculusUtilities. Поэтому нет необходимости устанавливать флажок VirtualRealitySupportedв окне Inspector при использовании пакета OculusUtilities.

  • Перетащите заготовку OVRCameraRigна сцену.
  • Выключите основную камеру на сцене, чтобы убедиться, что используется только OVRCameraRig.
  • Нажмите кнопку Playи наденьте очки Oculus Rift. Вы увидите, что OVRCameraRig теперь отслеживает движения очков, а преобразование куба по-прежнему управляется движением руки.

Примечание. Полные сведения об использовании пакета Oculus Utilities
см. в документации по адресу http://static.oculus.com/documentation/pdfs/game-engines/latest/unity.pdf.

Добавьте виртуальную реальность в образец проекта Intel® RealSense™ SDK Toolkit для Unity*

Благодаря встроенной поддержке виртуальной реальности в Unity 5.1+ можно очень просто включить поддержку виртуальной реальности в образце Intel RealSense SDK Toolkit для Unity, например в Sample 1 – Translation. Попробуйте выполнить следующие действия.

  • В папке Project разверните RSUnityToolkit – Samples – Scenesи дважды щелкните Sample 1 - Translation (не забудьте сначала сохранить прежнюю работу, если она вам нужна).
  • Выберите Edit – Project Settingsв меню, затем щелкните Player.
  • Убедитесь, что в окне Inspector установлен флажок Virtual Reality Supported.
  • Щелкните Play и попробуйте!

Заключение

В этой статье мы рассмотрели потенциальные проблемы помех, которые могут возникнуть при использовании камеры Intel RealSense переднего обзора в проекте, использующем камеру отслеживания Oculus Rift. Мы также рассказали о простых сценариях, в которых отслеживание руки камерой Intel RealSense применялось в виртуальной реальности. Попробуйте сами и посмотрите, каких интересных результатов вам удастся добиться!

О технологии Intel® RealSense™

Чтобы приступить к работе и узнать больше о Intel RealSense SDK для Windows, перейдите по адресу https:///software.intel.com/ru-ru/intel-realsense-sdk.

Об авторе

Брайан Браун — инженер по разработке программных приложений в подразделении Developer Relations корпорации Intel. 


Управление дронами с помощью распознавания речи

$
0
0

Пример кода

Управление дронами с помощью приложений для распознавания речи на основе Intel® RealSense™ SDK

В новостях рассказывают о дронах — беспилотных летательных аппаратах — буквально каждый день. Области применения у них самые разные: разведка и боевые операции, фото- и видеосъемка, да и просто развлечения. Технология дронов достаточно новая и заслуживает интереса.

Разработчики могут создавать приложения для управления дронами. Дрон в конечном итоге является обычным программируемым устройством, поэтому к нему можно подключаться и отдавать команды для выполнения нужных действий с помощью обычных приложений для ПК и смартфонов. Для этой статьи я выбрал один из дронов с самыми мощными возможностями программирования — AR.Drone* 2.0 компании Parrot.

Мы узнаем, как взаимодействовать с таким дроном и управлять им с помощью библиотеки, написанной на C#. Опираясь на эту основу, мы добавим речевые команды для управления дроном с помощью Intel® RealSense™ SDK.

PARROT AR.DRONE 2.0

Модель AR.Drone 2.0 компании Parrot — один из наиболее интересных дронов, предлагаемых на рынке для энтузиастов. Этот дрон обладает множеством функций и включает встроенную систему помощи с интерфейсами стабилизации и калибровки. Дрон оснащен защитным каркасом из прочного пенополистирола, предохраняющим лопасти винтов и движущиеся части в случае падения или столкновения с неподвижными препятствиями.

AR.Drone* 2.0 компании Parrot

Оборудование дрона обеспечивает его подключение по собственной сети Wi-Fi* к внешним устройствам (смартфонам, планшетам, ПК). Протокол связи основан на АТ-подобных сообщениях (подобные команды несколько лет назад использовались для программирования модемов для связи по телефонной сети).

С помощью этого простого протокола можно отправлять дрону все команды, необходимые для взлета, подъема или спуска, полета в разных направлениях. Также можно считывать поток изображений, снятых камерами (в формате высокой четкости), установленными на дроне (одна камера направлена вперед, другая — вниз), чтобы сохранять отснятые в полете фотографии или записывать видео.

Компания-производитель предоставляет несколько приложений для пилотирования дрона вручную, но намного интереснее узнать, как добиться автономного управления полетом. Для этого я решил (при содействии моего коллеги Марко Минерва) создать интерфейс, который позволил бы управлять дроном с разных устройств.

Программное управление дроном

У дрона есть собственная сеть Wi-Fi, поэтому подключимся к ней для передачи команд управления. Всю нужную информацию мы нашли в руководстве для разработчиков AR.Drone 2.0. Например, в руководстве сказано, что нужно отправлять команды по протоколу UDP на IP-адрес 192.168.1.1, порт 5556. Это простые строки в формате AT:

AT * REF — управление взлетом и посадкой;

AT * PCMD — движение дрона (направление, скорость, высота).

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

Сначала нужно подключиться к устройству.

public static async Task ConnectAsync(string hostName = HOST_NAME, string port = REMOTE_PORT)
        {
             // Set up the UDP connection.
             var droneIP = new HostName(hostName);

             udpSocket = new DatagramSocket();
             await udpSocket.BindServiceNameAsync(port);
             await udpSocket.ConnectAsync(droneIP, port);
             udpWriter = new DataWriter(udpSocket.OutputStream);

             udpWriter.WriteByte(1);
             await udpWriter.StoreAsync();

             var loop = Task.Run(() => DroneLoop());
        }

Как уже было сказано ранее, нужно использовать протокол UDP, следовательно, нужен объект DatagramSocket. После подключения с помощью метода ConnectAsyncмы создаем DataWriterв выходном потоке для отправки команд. И наконец, мы отправляем первый байт по Wi-Fi. Он служит только для инициализации системы и будет отброшен дроном.

Проверим команду, отправленную дрону.

        private static async Task DroneLoop()
        {
            while (true)
            {

                var commandToSend = DroneState.GetNextCommand(sequenceNumber);
                await SendCommandAsync(commandToSend);

                sequenceNumber++;
                await Task.Delay(30);
            }
        }

Тег DroneState.GetNextCommandформатирует строковую АТ-команду, которую нужно отправить устройству. Для этого нужен порядковый номер: дрон ожидает, что каждая команда сопровождается порядковым номером, и игнорирует все команды, номера которых меньше или равны номерам уже полученных команд.

После этого мы используем WriteStringдля отправки в поток команд через StreamSocket, при этом StoreAsyncзаписывает команды в буфер и отправляет их. И наконец, мы увеличиваем порядковый номер и используем параметр Task Delay, чтобы ввести задержку в 30 миллисекунд перед следующей итерацией.

Класс DroneStateопределяет, какую команду отправить.

    public static class DroneState
    {
       public static double StrafeX { get; set; }
       public static double StrafeY { get; set; }
       public static double AscendY { get; set; }
       public static double RollX { get; set; }
       public static bool Flying { get; set; }
       public static bool isFlying { get; set; }

        internal static string GetNextCommand(uint sequenceNumber)
        {
            // Determine if the drone needs to take off or land
            if (Flying && !isFlying)
            {
                isFlying = true;
                return DroneMovement.GetDroneTakeoff(sequenceNumber);
            }
            else if (!Flying && isFlying)
            {
                isFlying = false;
                return DroneMovement.GetDroneLand(sequenceNumber);
            }

            // If the drone is flying, sends movement commands to it.
            if (isFlying && (StrafeX != 0 || StrafeY != 0 || AscendY != 0 || RollX != 0))
                return DroneMovement.GetDroneMove(sequenceNumber, StrafeX, StrafeY, AscendY, RollX);

            return DroneMovement.GetHoveringCommand(sequenceNumber);
        }
    }

Свойства StrafeX, StrafeY, AscendYи RollXопределяют соответственно скорость движения влево и вправо, вперед и назад, высоту и угол вращения дрона. Эти свойства имеют тип данных Double, допустимые значения — от 1 до -1. Например, если задать для свойства StrafeXзначение -0,5, то дрон будет перемещаться влево с половиной максимальной скорости; если задать 1, то дрон полетит вправо с максимальной скоростью.

Переменная Flying определяет взлет и посадку. В методе GetNextCommandмы проверяем значения этих полей, чтобы определить, какую команду отправить дрону. Эти команды, в свою очередь, находятся под управлением класса DroneMovement.

Обратите внимание, что, если команды не заданы, последняя инструкция создают так называемую команду Hovering. Это пустая команда, поддерживающая открытый канал связи между дроном и устройством. Дрон должен постоянно получать сообщения от управляющего им приложения, даже если не нужно выполнять никаких действий и ничего не изменилось.

Самый интересный метод класса DroneMovement — метод GetDroneMove, который фактически и занимается составлением и отправкой команд дрону.  Другие методы, связанные с движением, см. в этом примере.

public static string GetDroneMove(uint sequenceNumber, double velocityX, double velocityY, double velocityAscend, double velocityRoll)
    {
        var valueX = FloatConversion(velocityX);
        var valueY = FloatConversion(velocityY);
        var valueAscend = FloatConversion(velocityAscend);
        var valueRoll = FloatConversion(velocityRoll);

        var command = string.Format("{0},{1},{2},{3}", valueX, valueY, valueAscend, valueRoll);
        return CreateATPCMDCommand(sequenceNumber, command);
    }
private static string CreateATPCMDCommand(uint sequenceNumber, string command, int mode = 1)
    {
        return string.Format("AT*PCMD={0},{1},{2}{3}", sequenceNumber, mode, command, Environment.NewLine);
    }

Метод FloatConversionне указан здесь, но он преобразует значение типа Double диапазона от -1 до 1 в целочисленное значение со знаком, которое может быть использовано АТ-командами, например строкой PCMD для управления движением.

Показанный здесь код доступен в виде бесплатной библиотеки на сайте NuGet (AR.Drone 2.0 Interaction Library). Эта библиотека предоставляет все необходимое для управления — от взлета до посадки.

Пользовательский интерфейс AR.Drone UI на сайте NuGet

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

Intel® RealSense™ SDK

Теперь посмотрим на одну из самых интересных и удобных в использовании (для меня) возможностей Intel RealSense SDK — распознавание речи.

В SDK поддерживается два подхода к распознаванию речи.

  • Распознавание команд (по заданному словарю).
  • Распознавание свободного текста (диктовка).

Первый подход представляет собой своего рода список команд, заданный приложением, на указанном языке, который обрабатывается «распознавателем». Все слова, которых нет в списке, игнорируются.

Второй подход — что-то типа диктофона, «понимающего» любой текст в свободной форме. Этот подход идеален для стенографирования, автоматического создания субтитров и т. п.

В этом проекте мы используем первый вариант, поскольку требуется поддерживать конечное количество команд, отправляемых дрону.

Сначала нужно определить некоторые переменные.

        private PXCMSession Session;
        private PXCMSpeechRecognition SpeechRecognition;
        private PXCMAudioSource AudioSource;
        private PXCMSpeechRecognition.Handler RecognitionHandler;

Session — тег, необходимый для доступа к вводу-выводу и к алгоритмам SDK, поскольку все последующие действия унаследованы от этого экземпляра.

SpeechRecognition — экземпляр модуля распознавания, созданного функцией CreateImplв среде Session.

AudioSource — интерфейс устройства, позволяющий установить и выбрать входное аудиоустройство (в нашем примере кода мы для простоты выбираем первое доступное аудиоустройство).

RecognitionHandler — фактический обработчик, назначающий обработчик событий для события OnRecognition.

Теперь инициализируем сеанс, AudioSourceи экземпляр SpeechRecognition.

            Session = PXCMSession.CreateInstance();
            if (Session != null)
            {
                // session is a PXCMSession instance.
                AudioSource = Session.CreateAudioSource();
                // Scan and Enumerate audio devices
                AudioSource.ScanDevices();

                PXCMAudioSource.DeviceInfo dinfo = null;

                for (int d = AudioSource.QueryDeviceNum() - 1; d >= 0; d--)
                {
                    AudioSource.QueryDeviceInfo(d, out dinfo);
                }
                AudioSource.SetDevice(dinfo);

                Session.CreateImpl<PXCMSpeechRecognition>(out SpeechRecognition);

Как было отмечено ранее, для простоты кода мы выбираем первое доступное аудиоустройство.

PXCMSpeechRecognition.ProfileInfo pinfo;
              SpeechRecognition.QueryProfile(0, out pinfo);
              SpeechRecognition.SetProfile(pinfo);

Затем нужно опросить систему, узнать фактический параметр конфигурации и назначить его переменной (pinfo).

Также нужно настроить ряд параметров в профиле, чтобы изменить язык распознавания. Задайте уровень достоверности распознавания (при более высоком значении требуется более уверенное распознавание), интервал окончания распознавания и т. д.

В нашем случае параметр по умолчанию устанавливается как в профиле 0 (полученном из Queryprofile).

                String[] cmds = new String[] { "Takeoff", "Land", "Rotate Left", "Rotate Right", "Advance","Back", "Up", "Down", "Left", "Right", "Stop" , "Dance"};
                int[] labels = new int[] { 1, 2, 4, 5, 8, 16, 32, 64, 128, 256, 512, 1024 };
                // Build the grammar.
                SpeechRecognition.BuildGrammarFromStringList(1, cmds, labels);
                // Set the active grammar.
                SpeechRecognition.SetGrammar(1);

Затем задаем грамматический словарь для обучения системы распознавания. С помощью BuildGrammarFromStringListмы создаем простой список глаголов и соответствующих возвращаемых значений, определяя грамматику номер 1.

Можно задать несколько грамматик для использования в приложении и включать одну из них при необходимости, поэтому можно создать разные словари команд для всех поддерживаемых языков и предоставить пользователю возможность переключаться между языками, распознаваемыми в SDK. В этом случае нужно установить соответствующие DLL-файлы поддержки языка, поскольку при установке SDK по умолчанию устанавливается поддержка только для языка «Английский (США)». В этом примере мы используем только грамматику, установленную по умолчанию вместе с языком «Английский (США)».

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

                RecognitionHandler = new PXCMSpeechRecognition.Handler();

                RecognitionHandler.onRecognition = OnRecognition;

Эти инструкции определяют новый обработчик событий для события OnRecognitionи назначают его методу, описанному ниже.

        public void OnRecognition(PXCMSpeechRecognition.RecognitionData data)
        {
            var RecognizedValue = data.scores[0].label;
            double movement = 0.3;
            TimeSpan duration = new TimeSpan(0, 0, 0, 500);
            switch (RecognizedValue)
            {
                case 1:
                    DroneState.TakeOff();
                    WriteInList("Takeoff");
                    break;
                case 2:
                    DroneState.Land();
                    WriteInList("Land");
                    break;
                case 4:
                    DroneState.RotateLeftForAsync(movement, duration);
                    WriteInList("Rotate Left");
                    break;
                case 5:
                    DroneState.RotateRightForAsync(movement, duration);
                    WriteInList("Rotate Right");
                    break;
                case 8:
                    DroneState.GoForward(movement);
                    Thread.Sleep(500);
                    DroneState.Stop();
                    WriteInList("Advance");
                    break;
                case 16:
                    DroneState.GoBackward(movement);
                    Thread.Sleep(500);
                    DroneState.Stop();
                    WriteInList("Back");
                    break;
                case 32:
                    DroneState.GoUp(movement);
                    Thread.Sleep(500);
                    DroneState.Stop();
                    WriteInList("Up");
                    break;
                case 64:
                    DroneState.GoDown(movement);
                    Thread.Sleep(500);
                    DroneState.Stop();
                    WriteInList("Down");
                    break;
                case 128:
                    DroneState.StrafeX = .5;
                    Thread.Sleep(500);
                    DroneState.StrafeX = 0;
                    WriteInList("Left");
                    break;
                case 256:
                    DroneState.StrafeX = -.5;
                    Thread.Sleep(500);
                    DroneState.StrafeX = 0;
                    WriteInList("Right");
                    break;
                case 512:
                    DroneState.Stop();
                    WriteInList("Stop");
                    break;
                case 1024:
                    WriteInList("Dance");
                    DroneState.RotateLeft(movement);
                    Thread.Sleep(500);
                    DroneState.RotateRight(movement);
                    Thread.Sleep(500);
                    DroneState.RotateRight(movement);
                    Thread.Sleep(500);
                    DroneState.RotateLeft(movement);
                    Thread.Sleep(500);
                    DroneState.GoForward(movement);
                    Thread.Sleep(500);
                    DroneState.GoBackward(movement);
                    Thread.Sleep(500);
                    DroneState.Stop();
                    break;
                default:
                    break;

            }
            Debug.WriteLine(data.grammar.ToString());
            Debug.WriteLine(data.scores[0].label.ToString());
            Debug.WriteLine(data.scores[0].sentence);
            // Process Recognition Data
        }

Это метод получения значения, возвращенного из данных распознавания, и выполнения соответствующей команды (в нашем случае — соответствующей команды управления полетом дрона).

Каждая команда дрона относится к вызову DroneStateс определенным методом (TakeOff, GoUp, DoDownи т. д.) и с определенным параметром движения или длительности, который в каждом случае касается определенного количества или длительности движения.

Некоторым командам требуется явный вызов метода Stopдля остановки текущего действия, иначе дрон продолжит двигаться согласно полученной команде (команды см. в предыдущем фрагменте кода).

В некоторых случаях нужно вставить Thread.Sleepмежду двумя разными командами, чтобы дождаться завершения предыдущего действия перед отправкой новой команды.

Для проверки распознавания, даже если нет доступного дрона, я вставил переменную (она управляется флажком в главном окне), которая включает функциональный режим Drone Stub (в этом режиме команды создаются, но не отправляются).

Чтобы закрыть приложение, вызовите метод OnClosingдля закрытия и уничтожения всех экземпляров и обработчиков и для общей очистки системы.

В коде содержатся некоторые команды отладки, выводящие полезную информацию в окнах отладки Visual Studio* при тестировании системы.

Заключение

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

Демонстрация полета на конференции .NET Campus в 2014 году

Об авторе

Марко Даль Пино (Marco Dal Pino) работает в области информационных технологий уже свыше 20 лет, сейчас он фрилансер-консультант по платформе .NET. Марко входит в состав DotNetToscana (это сообщество по технологиям Майкрософт) и обладает званием Microsoft MVP в области разработки платформ Windows.  Марко разрабатывает мобильные и встроенные приложения для розничной торговли и корпоративного сектора, а также принимает участие в разработке приложений для Windows 8 и Windows Phone для сторонней компании.

С 2013 года Марко обладает квалификацией Nokia Developer Champion for Windows Phone. В том же году он получил уровень Intel Developer Zone Green Belt корпорации Intel за деятельность по поддержке разработок и популяризации технологии Intel RealSense и управления компьютером без помощи контроллеров. Кроме того, Марко — лауреат сертификатов Intel Software Innovator по технологии Intel RealSense и Интернету вещей.

Он занимается обучением и выступает на крупных технических конференциях.

Марко Минерва (Marco Minerva) работает с платформой .NET с момента появления ее первой версии. Сейчас он главным образом занимается проектированием и разработкой приложений для Магазина Windows и Windows Phone, используя Windows Azure в качестве внутреннего механизма. Марко — один из основателей и руководитель DotNetToscana, находящейся в Тоскане пользовательской группы, работающей с .NET. Марко выступает на технических конференциях и пишет статьи в журналах.

Intel® RealSense™: фотографии с поддержкой глубины

$
0
0

В области фотографии происходит очередная революция. Корпорация Intel, основатель и творец цифрового мира, разработала фотографию Intel® RealSense™ с поддержкой глубины (DEP). Это необычный подход к художественной фотографии на основе новых оптических технологий и технологий обработки изображения. Результатом применения этой технологии становятся новые, интересные способы слияния виртуального мира с реальным. Если говорить кратко, это новый, необычный и увлекательный способ создания, демонстрации и просмотра изобразительного искусства.

Что такое фотография с поддержкой глубины (DEP)?

DEP расширяет существующие технологии цифровых камер, добавляя к ним третье измерение, за счет получения информации о глубине вместе с изображением. Добавление значения глубины к каждому пикселю при съемке изображения дает фотографам возможность использовать новые способы редактирования и демонстрации фотографий, например, возможность перенесения фокуса на другую часть изображения уже после съемки или возможность применить фильтр к объекту на переднем плане, оставив при этом фон без изменений. Для съемки таких изображений следует применять особые камеры, например, поддерживающие технологию Intel RealSense. Такие камеры сейчас широко доступны и даже устанавливаются на мобильные устройства. Для записи изображений и дополнительных метаданных используется новый формат файлов — eXtensible Device Metadata (расширяемые метаданные устройств, XDM).

Эталонное изображение

Картаглубины

Формат eXtensible Device Metadata (XDM)

В основе фотографии с поддержкой глубины — формат файлов XDM с поддержкой глубины. Корпорация Intel участвовала в разработке этого формата вместе с другими ведущими технологическими компаниями с целью создания открытого стандарта для экосистемы DEP. Спецификация XDMверсии 1.0 является стандартом для хранения метаданных, связанных с устройством, в распространенных контейнерах изображений, таких как JPEG, сохраняя при этом совместимость с существующими программами для просмотра изображений. В файлах с поддержкой XDM хранится расширенная информация о снятом и записанном изображении, включая новое значение третьего измерения — глубины. Для лучшего понимания нового формата рассмотрим типичное изображение в формате RGB, где для каждого пикселя хранится три значения цвета (одно для красного цвета, одно для зеленого и одно для синего). Теперь добавим для каждого пикселя еще одно значение, соответствующее расстоянию от этого пикселя до камеры. Информация о глубине добавляется в файл-контейнер в виде отдельной «карты глубины» или «облака точек». Благодаря добавлению информации о глубине раскрываются новые возможности просмотра и интерактивной работы с отснятыми фотографиями. Файлы XDM могут содержать данные с нескольких камер. Требуется хотя бы одна камера, предоставляющая информацию о глубине. Первая камера сопоставляется с изображением в контейнере (обычно в формате JPEG), тогда как другие камеры могут предоставлять добавочные изображения, облака точек или карты глубины, которые обрабатываются применительно к первому изображению. Один из возможных сценариев предусматривает использование добавочных изображений полного разрешения, снятых с несколько другой перспективы.

Помимо нового атрибута глубины для каждого пикселя вспомогательные файлы XDM дают пользователям возможность включать при желании и другие метаданные, такие как ориентация камеры, ее расположение и даже заданные производителем характеристики матрицы. Корпорация Intel работает вместе с другими технологическими компаниями над поддержкой и стандартизацией этого нового формата файлов, чтобы создать общемировой стандартный формат, совместимый с широким набором платформ — от смартфонов до настольных компьютеров. Стандартный формат изображений позволит разработчикам программ создавать приложения, способные распознавать и поддерживать файлы, созданные на разных аппаратных платформах.

Метаданные XDM в контейнере JPG

Фотографии с поддержкой глубины в действии

Информацию о глубине можно использовать самыми разными способами, расширяя возможности фотографирования. Корпорация Intel предоставляет пакет Intel® RealSense™ SDK, включающий различные сценарии использования для приложений по работе с изображениями. Корпорация Intel предлагает разработчикам придумывать совершенно новые сценарии использования, использующие или расширяющие возможности формата данных с поддержкой глубины. Вот примеры основных сценариев использования, которые могут получить широкое распространение.

  • Художественные фильтры, управление фоном. Разделение данных изображения на слои дает возможность программам редактирования изображений применять различные фильтры (маски) к разным слоям в реальном времени. Можно применять фильтры к отдельным слоям или ко всем, исключая определенные слои. Простой пример: изображение на переднем плане остается цветным, а фон превращается из цветного изображения в оттенки серого. Поскольку информация о глубине позволяет разделять элементы в реальном времени, можно даже подменять фон, как показано в этом ролике, где Джим Парсонс демонстрирует виртуальный зеленый экранв реальном времени.
  • Эффект изменения глубины резкости. Глубина резкости — это один из параметров фотографий, который изначально регулировался путем настройки диафрагмы и фокусного расстояния объектива камеры. Проще говоря, глубина резкости — это расстояние между самым близким и самым дальним объектами сцены, которые отображаются резко (т. е. находятся в фокусе) на итоговой фотографии. Фотографы используют глубину резкости для выделения на фотографиях объектов, к которым нужно привлечь внимание зрителей. При использовании обычных камер, даже если речь идет о современных цифровых зеркальных камерах, нужно сделать несколько снимков, чтобы использовать разную глубину резкости на одном и том же изображении. Фотографии с поддержкой глубины дают возможность фотографу изменять глубину резкости уже после съемки кадра. Например, можно сделать один снимок на собрании всей семьи, предоставить его любому количеству зрителей, а чтобы на получившемся кадре нужный человек оказался в фокусе, достаточно коснуться его лица на планшете. В этом видеоролике Джим Парсонс из «Теории большого взрыва» демонстрирует динамическое изменение глубины резкости.
  • Эффекты движения. Творческое использование данных глубины позволяет создавать двухмерные изображения с иллюзией движения. Файлы изображения XDM можно использовать для создания эффектов движения, таких как параллакс и «наезд/отъезд». Параллакс — это небольшое различие между положением объектов переднего и заднего плана на сцене в зависимости от ракурса. Имитация этой разницы в положении путем изменения данных о глубине переднего и заднего планов в файле XDM позволит создать мощную иллюзию глубины на обычном изображении. «Наезд» и «отъезд» — это кинематографические эффекты, создаваемые путем увеличения или уменьшения переднего или заднего плана по отношению друг к другу. Например, если увеличить задний план, оставив прежний размер объектов на переднем плане, возникнет иллюзия того, что объекты, находящиеся на переднем плане, «отъезжают» от зрителя назад. Напротив, если увеличить объект на переднем плане, сохранив неизменный размер заднего плана, возникнет иллюзия «наезда» объекта на зрителя, т. е. движения объекта вперед.
  • Редактирование. Идентификация слоев по глубине позволяет пользователям редактировать файлы разными способами, применяя статические или динамические эффекты. Можно с легкостью вставлять объекты в изображение между передним и задним планом, основываясь на данных глубины, содержащихся в файле XDM. Можно удалять объекты и заменять их на новые, не используя трудоемкий и длительный процесс пиксельного редактирования. После размещения в кадре новые элементы можно перемещать или масштабировать без необходимости заново задавать их границы и не тратя дополнительное время на пиксельное редактирование.
  • Измерения по фотографиям. Определение размера разных предметов может быть непростой задачей. Нередко возникают ситуации, когда нужно определить размер коробки или предмета мебели. Наличие трехмерных данных в изображении позволяет пользователям быстро оценить размер объектов, не используя рулетку. Располагая планшетом, пользователь может оценить размеры по фотографии своей комнаты, выбирая занавески или новый диван.

Что все это означает?

Фотография с поддержкой глубины преобразует фундаментальные принципы съемки изображений, их обработки и просмотра. Эта технология выводит концепцию изображения в трехмерное пространство и предоставляет динамические интерактивные возможности на всех этапах жизненного цикла изображений. По многим своим качествам расширение файлов XDM является новой графической средой, настолько же отличающейся от традиционных цифровых изображений, насколько цифровые изображения отличаются от фотографий, снятых на пленку и проявленных с помощью химического процесса. С появлением цифровых изображений художники получили новые возможности создавать, редактировать и показывать свое искусство. Аналогичным образом и технология Intel RealSense предоставляет людям новые способы творческого самовыражения в динамичной интерактивной среде.

Другие аспекты технологии Intel RealSense больше применимы к наукам и высоким технологиям. Камеры Intel RealSense предоставляют точную трехмерную картину среды в реальном времени, что позволяет дронам и роботам эффективнее маневрировать в сложной обстановке. Эта технология обладает очевидным потенциалом в таких областях, как автономные (управляемые без помощи водителя) легковые и грузовые автомобили, а также для существенного повышения эффективности работы дистанционно управляемых аппаратов, даже таких, как марсоходы.

Как технология Intel® RealSense™ будет развиваться дальше?

Intel RealSense открывает новые возможности графического выражения. Как и для многих других технологий, способных значительно изменить нашу жизнь, невозможно предсказать все изменения нашего взаимодействия с изображениями.

Многие производители уже начали встраивать камеры Intel RealSense в свои продукты. Прямо сейчас, пока вы читаете эту статью, выпускаются новые приложения на основе Intel RealSense SDK. Камеры на мобильных устройствах будут работать по-новому после массового распространения DEP.

Дополнительные сведения

Об авторе

Шон Голден (Sean Golden) — автор и технический писатель. Его последним местом работы в корпорации была должность программного директора в глобальной компании финансовых услуг. Опыт работы Шона включает управление разработкой финансовых продуктов, мультимедиа в Интернете, публикации в обычных и сетевых СМИ, консолидацию центров обработки данных для компаний из списка Fortune 500. До этого он в течение 15 лет управлял разработкой приложений и корпоративного программного обеспечения, а также издавал ежемесячную периодику, посвященную персональным компьютерам. Он имеет степень бакалавра по физике.

Сегментация фона в Intel® RealSense™ SDK

$
0
0

Введение

В этом документе описывается, как разработчики могут использовать сегментацию фона (background segmentation, BGS)в Intel® RealSense™ SDK для создания новых увлекательных приложений для совместной работы. Описывается предполагаемое поведение программ и их производительность в разных сценариях, оговариваются ограничения, о которых следует помнить разработчикам перед поставкой продуктов клиентам. Основная аудитория этой статьи — группы разработки, использующие BGS, и ОЕМ-производители.

Фон и область

Сегментация фона (технология BGS) — важная отличительная особенность камеры Intel® RealSense™для приложений для совместной работы и создания контента. Возможность отделения фона в реальном времени без особого оборудования или постобработки — очень интересная дополнительная функция для существующих приложений для телеконференций.

Существует огромный потенциал доработки существующих приложений или создания новых с использованием технологии BGS. Например, потребители могут просматривать общий контент вместе с друзьями на YouTube* через другую программу в ходе сеанса видеочата. Сотрудники могут видеть изображение друг друга, наложенное на общую рабочую область при виртуальном собрании. Разработчики могут интегрировать BGS для создания новых сценариев использования, таких как изменяющийся фон или фоновое видео в приложениях, где используется камера или общий доступ к экрану. На рис. 1 и 2 показаны приложения, использующие камеру Intel RealSense. Кроме того, разработчики могут изобретать и другие сценарии использования, например съемку селфи и изменение фона, использование средств совместной работы (браузеры, офисные приложения) для совместного доступа и совместного редактирования, скажем, для создания видео караоке с разным фоном.

Cyberlink® YouCam RX*

Рисунок 1. Cyberlink® YouCam RX*:
http://www.cyberlink.com/stat/product/youcamrx/enu/YouCamRX.jsp

Personify® App

Рисунок 2. Приложение Personify®: http://www.personify.com/realsense

Создание образца приложения с сегментацией фона

Требования

В этой статье мы поясняем, как разработчики могут заменить фон на видео или другие изображения в образце приложения. Мы также приводим фрагмент кода для смешения выходного изображения с любым фоновым изображением и рассказываем о влиянии на производительность.

Текущая реализация сегментации фонаподдерживает форматы YUY2 и RGB. Допустимое разрешение — от 360p до 720p (для цветного изображения) и 480p (для изображения глубины).

На рис. 3 показано общее представление конвейера BGS. Кадры глубины и цвета записываются камерой Intel RealSense и передаются в основной SDK (то есть в среду выполнения Intel RealSense SDK). На основе запроса, поступающего от приложения, кадры доставляются в блок User Extraction, где образуется сегментированное изображение в формате RGBA. К этому изображению можно применить альфа-смешение с любым другим изображением RGB для получения итогового фонового изображения на выходе. Разработчики могут использовать любые механизмы для смешения изображений на экране, но наилучшая производительность достигается при использовании графического процессора.

BGS pipeline

Рисунок 3. Конвейер BGS

Ниже поясняется, как интегрировать трехмерную сегментацию в приложение разработчика.

1. Установите следующие компоненты Intel RealSense SDK. 

  • Основная среда выполнения Intel RealSense SDK
  • Модуль сегментации фона

2. Используйте веб-установщик или автономный установщик, чтобы установить только основные и индивидуальные компоненты. Среду выполнения можно установить только в режиме UAC.   

   intel_rs_sdk_runtime_websetup_x.x.x.xxxxxx --silent --no-progress --accept-license=yes --finstall=core,personify --fnone=all”

   Можно определить, какая среда выполнения установлена в системе, с помощью следующего API Intel RealSense SDK:

   // session is a PXCSession instance
   PXCSession::ImplVersion sdk_version=session->QueryVersion();

3. Создайте экземпляр для использования трехмерной камеры. При этом создается конвейер для работы любого трехмерного алгоритма.

   PXCSenseManager* pSenseManager = PXCSenseManager::CreateInstance();

4.Включите нужный промежуточный модуль. Рекомендуется включать только модуль, необходимый приложению.

   pxcStatus result = pSenseManager->Enable3DSeg();

5. Укажите профиль, нужный для вашего приложения. Запуск с более высоким разрешением и с более высокой кадровой скоростью приведет к повышению нагрузки. Передайте профили, чтобы получить с камеры нужный поток.

   PXC3DSeg* pSeg = pSenseManager->Query3DSeg();
   pSeg->QueryInstance<PXCVideoModule>()->QueryCaptureProfile(profile, &VideoProfile);
   pSenseManager->EnableStreams(&VideoProfile);

6. Инициализируйте конвейер камеры и передайте первый кадр на промежуточный уровень. Этот этап требуется для всех промежуточных уровней, он необходим для работы конвейера.

   result = pSenseManager->Init();

7. Получите сегментированное изображение с камеры. Выходное изображение выводится с промежуточного уровня в формате RGBA, оно содержит только сегментированную часть.

PXCImage *image=seg->AcquireSegmentedImage(...);

   8. Смешайте сегментированное изображение с собственным фоном.

Примечание. Смешение значительно влияет на производительность, если оно осуществляется на ЦП, а не на ГП. Образец приложения работает на ЦП.

  • Можно использовать любую методику для смешения сегментированного изображения RGBA с другим растровым изображением.
  • Можно использовать нулевое копирование данных в системную память при использовании ГП вместо ЦП.
  • Для смешения можно использовать Direct3D* или OpenGL*.

Вот фрагмент кода для получения передачи изображения в системную память, где srcData имеет тип pxcBYTE. 

   segmented_image->AcquireAccess(PXCImage::ACCESS_READ,
   PXCImage::PIXEL_FORMAT_RGB32, &segmented_image_data);

   srcData = segmented_image_data.planes[0] + 0 * segmented_image_data.pitches[0];

Смешение и рендеринг

  • Запись: чтение потоков данных цвета и глубины с камеры.
  • Сегментация: разделение на фон и пиксели переднего плана.
  • Копирование цвета и сегментированного изображения (маски глубины) в текстуры.
  • Изменение размера сегментированного изображения (маски глубины) до такого же разрешения, как у цветного изображения.
  • (Необязательно) Загрузка или обновление фонового изображения (при замене) в текстуру.
  • Компиляция/загрузка шейдера.
  • Установка цвета, глубины и (необязательно) фоновых текстур для шейдера.
  • Запуск шейдера и показ.
  • (В приложениях для видеоконференций) Копирование объединенного изображения на поверхность NV12 или YUY2.
  • (В приложениях для видеоконференций) Передача поверхности в аппаратный кодировщик Intel® Media SDK H.264.

Производительность

На работу приложения влияют следующие факторы.

  • Кадровая скорость
  • Смешение
  • Разрешение

В приведенной ниже таблице показана нагрузка на процессор Intel® Core™ i5 5-го поколения.

 

Без рендеринга

Рендеринг
с помощью ЦП

Рендеринг
с помощью ГП

720p, 30 кадр./с.

29,20 %

43,49 %

31,92 %

360p, 30 кадр./с.

15,39 %

25,29 %

16,12 %

720p, 15 кадр./с.

17,93 %

28,29 %

18,29 %

Чтобы проверить влияние рендеринга на вашем собственном компьютере, запустите образец приложения с параметром -noRender, а затем без этого параметра.

Ограничения технологии BGS

Сегментация пользователей по-прежнему развивается, и с каждой новой версией SDK качество повышается.  

О чем следует помнить при оценке качества.

  • Избегайте наличия на теле предметов такого же цвета, как у фонового изображения. Например, черная футболка при черном фоне.
  • Слишком яркое освещение головы может повлиять на качество изображения волос.
  • Если лежать на кровати или на диване, система может работать неправильно. Для видеоконференций лучше подходит сидячее положение.
  • Прозрачные и светопроницаемые объекты (например, стеклянный стакан) будут отображаться неправильно.
  • Точное отслеживание руки вызывает затруднения, качество может быть нестабильным.
  • Челка на лбу может привести к проблемам при сегментации.
  • Не двигайте головой слишком быстро. Ограничения камеры влияют на качество.

Отзывы корпорации Intel о технологии BGS

Как повысить качество программного обеспечения? Лучше всего — оставлять отзывы. Выполнение сценариев в схожей среде может быть затруднено, если разработчик захочет повторить тестирование с новым выпуском Intel RealSense SDK.

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

Пакет Intel RealSense SDK поставляется с образцом приложения, помогающим собирать последовательности для воспроизведения.

  • Важно для предоставления отзывов о качестве
  • Не для анализа производительности

При установке по умолчанию образец приложения находится в папке C:\Program Files (x86)\Intel\RSSDK\bin\win32\FF_3DSeg.cs.exe. Запустите приложение и выполните действия, показанные на приведенных ниже снимках экрана.

Screenshots - default installation - Intel RealSense SDK

Вы увидите на экране самого себя, при этом фон будет удален.

Воспроизведение последовательностей

Если выбрать режим Record, можно сохранить копию вашего сеанса. Теперь можно открыть приложение FF_3DSeg.cs.exe и выбрать режим воспроизведения для просмотра записи.

playback mode to see the recording

Заключение

Промежуточный модуль сегментации фона технологии Intel RealSense предоставляет пользователям новые интересные возможности. Среди новых моделей использования — изменение фона на видео или другое изображение, создание селфи с сегментированным изображением.

Справочные материалы

Дополнительные сведения об оптимизации компиляторов см. в нашем уведомлении об оптимизации.

 

Уведомление

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

  •  

Обратная связь с пользователем в естественных пользовательских интерфейсах на основе технологии Intel® RealSense™, часть 2

$
0
0

Разместил Justin L. 21 октября 2015 г.

В предыдущей статье Обратная связь с пользователем в естественных пользовательских интерфейсах на основе технологии Intel® RealSense™, часть 1я рассказал об ожиданиях пользователей при естественном взаимодействии с компьютерами и о важности проблем, возникающих при создании пользовательской обратной связи в естественных пользовательских интерфейсах. Я также описал обратную связь при использовании управления с помощью рук, опираясь на наш опыт создания игр Space Between* и The Risen* на основе технологии Intel® RealSense™. В этой статье я поговорю о других возможностях ввода, поддерживаемых технологией Intel RealSense: управление с помощью головы и с помощью речи.


Участник конференции IDF 2015 играет в TheRisen.

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

Краткий обзор: что такое пользовательская обратная связь и почему она важна

На случай если вы не читали первую часть этой статьи, я быстро расскажу о том, что такое пользовательская обратная связь в приложении. Если упростить, то пользовательская обратная связь — это любые уведомления, предоставляемые пользователю приложением о том, что программа распознала ввод пользователя или изменила свое состояние. Например, при использовании кнопки в приложении ее внешний вид обычно изменяется при наведении на нее указателя мыши и при нажатии ее пользователем. Наглядные изменения важны: они сообщают пользователю о том, что с этим элементом возможно взаимодействие, а также о том, какого рода ввод повлияет на этот элемент. Пользовательская обратная связь иногда выходит за рамки программ и распространяется на оборудование, используемое для взаимодействия с программами. Например, при нажатии кнопки мыши раздается характерный щелчок: пользователь получает звуковую и тактильную обратную связь по таким же причинам, как при нажатии кнопки на экране программы. Все перечисленное проистекает из естественного образа взаимодействия людей с другими людьми и с окружающим миром.

В естественных пользовательских интерфейсах обратная связь важна по трем причинам: (1) в большинстве случаев естественные интерфейсы работают без касаний, поэтому какая бы то ни было тактильная обратная связь невозможна; (2) в отличие от других программ и режимов работы в естественных интерфейсах нет стандартов обратной связи; (3) при использовании естественных интерфейсов предполагается, что они будут работать естественно. Утрата тактильной обратной связи при любом способе ввода означает, что программа должна компенсировать это либо визуальной, либо звуковой обратной связью. Если этого не сделать, то программа будет намного менее интуитивной и будет вызывать у новых пользователей больше раздражения, чем интереса.

Отсутствие какого-либо общепринятого стандарта обратной связи означает, что: во-первых, вам придется самостоятельно догадываться, что в этой области работает лучше всего; во-вторых, пользователи будут незнакомы с получаемой обратной связью и им придется обучаться, что усложняет освоение приложений. Работа с ожиданиями пользователей — заключительная задача, поскольку здесь все построено вокруг человеческого языка. К сожалению, на современном этапе развития технологии еще недостаточно совершенны для реализации естественного диалога: пользователи будут пытаться общаться с программой точно так же, как с другим человеком, но в результате лишь убедятся в том, что в программах все совсем иначе.

Отслеживание головы в Intel® RealSense™ SDK


Рисунок 1.Отслеживание головы в IntelRealSenseSDKпоказывает ориентацию головы пользователя

Предположим, приложение «знает», где находится голова пользователя. Ну и что же? Преимущества этого не всегда очевидны. В отличие от рук, пожалуй, не следует разрабатывать изощренные механизмы управления на основе отслеживания головы, иначе пользователям не обойтись без головокружения. Тем не менее ограниченное использование отслеживания положения головы поможет придать уникальную окраску приложению и глубже погрузить пользователей в виртуальный мир. В Intel RealSense SDKесть несколько ограничений при отслеживании головы. Об этих ограничениях следует помнить, особенно при создании пользовательской обратной связи в приложении.

Ограничения отслеживания головы

Объем отслеживания


Рисунок 2.Объем отслеживания в IntelRealSenseSDKконечен и может ограничивать возможности приложения

Как мы уже говорили в первой части этой статьи, понимание того, что отслеживание в IntelRealSenseSDKосуществляется только в поле зрения камеры, крайне важно, чтобы знать, как правильно использовать это устройство.Это действительно самая важная проблема, возникающая у пользователей при работе с любыми приложениями Intel RealSense, и она действует для всех режимов работы Intel RealSense, исключая распознавание речи. Это ограничение менее выражено при использовании модуля отслеживания головы, поскольку обычно пользователи все-таки сидят за столом перед компьютером. Впрочем, затруднения возможны и здесь, если для работы с приложением пользователю приходится наклоняться в стороны.

Отслеживание основано на обнаружении лица

Большую часть времени пользователи сидят лицом к камере, потому обнаружение программой лица является не слишком сложной задачей. Обнаружение лица необходимо главным образом в начале, а также при утрате отслеживания. Программе труднее всего находить лицо пользователя, когда камера расположена выше или ниже головы (вследствие чего лицо оказывается в поле зрения камеры под острым углом). Решение, как и в случае с руками, состоит в том, чтобы показать камере то, что ей нужно, то есть лицо. Необходимость обнаружения лица также накладывает определенные ограничения на отслеживание головы, например невозможно отслеживание затылка (если пользователь отвернулся от камеры).

Голова в качестве указателя


Рисунок 3.На этапе TwilightZoneигры SpaceBetweenдля отслеживания головы пользователя использовался светящийся указатель

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

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

Наши задачи

Люди часто наклоняются, выходя за пределы границ отслеживания.
Это одна из самых распространенных проблем, когда люди впервые используют приложения Intel RealSense, но разные люди погружаются в приложение по-разному, и некоторые наклонялись гораздо сильнее, чем мы предполагали. Выход за пределы отслеживаемой области не проблема, если из-за этого приложению Intel RealSense требуется заново обнаруживать пользователя. Мы обнаружили, что в таких случаях теряются все преимущества естественного управления, и нужно было найти обходной путь.

Движение вверх и вниз было не настолько интуитивным, как мы ожидали.
Горизонтальное движение при боковом наклоне головы удалось реализовать довольно просто, но с вертикальным движением все оказалось сложнее. Для управления положением по вертикали поднимать и опускать голову в буквальном смысле не имело смысла, поскольку пользователям приходилось бы вставать или съеживаться, чтобы их голова двигалась вверх или вниз относительно камеры. Вместо этого мы решили использовать расстояние от камеры (пользователь должен был наклоняться либо к камере, либо от нее), но обнаружили, что этот способ был не слишком интуитивным.

Указатель в SpaceBetween

В игре Space Between мы использовали указатель в виде головы, чтобы управлять китом на этапе, который называется Twilight Zone. На этом этапе игрок может наклоняться влево и вправо, чтобы плыть в соответствующую сторону. Наклон вперед соответствует погружению кита, а наклон назад — всплытию. Кит должен был двигаться вдоль светящегося следа, а при наклоне головы он проплывал определенное расстояние вдоль следа, давая игроку возможность набирать очки по пути.

Что сработало
С точки зрения пользовательской обратной связи отображение связи указателя с положением головы помогло понять, как отслеживается голова. При каждой загрузке игры на экран выводились инструкции и графические подсказки, показывающие, какие используются режимы ввода. Это помогало игрокам осваиваться с управлением. Как только пользователи понимали, что именно показывал указатель (положение головы), они сразу начинали интуитивно понимать и поле зрение камеры: указатель на краю экрана означал, что голова игрока находится на границе поля зрения камеры.


Рисунок 4.Фрагмент инструкций в игре SpaceBetween, показывающий ввод, используемый из IntelRealSenseSDK

Что не сработало
У нас была анимация поворота кита, когда пользователь наклонял голову влево или вправо, но анимация была не очень заметной, и иногда люди не понимали, что они уже повернули в нужном направлении. Требовалось более понятное наглядное указание того, что наклон головы пользователя напрямую связан с движением кита влево, вправо, вверх или вниз. Кроме того, сначала была путаница относительно того, что именно представляет указатель. Чтобы избежать путаницы, надо было лучше показать или пояснить, что указатель соответствовал положению головы.

Выводы

  • Важно подготовить пользователей к тому типу ввода, который будет применяться.
  • Чтобы избежать потери отслеживания, каким-то образом показывайте, где проходит граница поля зрения камеры по отношению к используемому вводу.
  • Управление становится гораздо интуитивнее, когда наглядная обратная связь привязана к тому, чем управляет пользователь.

Распознавание речи в Intel RealSense SDK

Я оставил самое сложное на десерт и начну с заявления: большая часть полученной нами информации касается ограничений и того, что не сработало. Для тех, кто не знаком с Intel RealSense SDK, существует два типа распознавания речи: команды и диктовка. В режиме команд пользователь отдает определенные команды, которые прослушиваются пакетом Intel RealSense SDK. В режиме диктовки выводится строка распознанного текста. Нам удалось заметно повысить удобство пользователей при работе с голосовым модулем, но все равно он оказался (с большим отрывом) самым неудобным как для пользователей, так и для нас. Задача состоит в том, чтобы использовать пользовательскую обратную связь для преодоления технических ограничений распознавания речи.

Ограничения распознавания речи

Точность работы модуля не соответствует ожиданиям пользователей.

Многие пользователи уже имеют опыт работы с программами распознавания речи, такими как Apple Siri*, Google Now* или Кортана корпорации Майкрософт*. Во всех этих решениях программное обеспечение является облачным, работает на основе огромных объемов данных и сложных алгоритмов. Все эти возможности недоступны в локальном решении, таком как в Intel RealSense SDK. Ожидания пользователей основаны на более мощных облачных решениях, поэтому потребуется бороться с ограничениями, предоставляя пользователям обратную связь и инструкции.

Иногда возникают значительные задержки между произнесением команд и их распознаванием.

В зависимости от приложения иногда возникают значительные задержки между моментом, когда пользователь произносит команду, и моментом, когда Intel RealSense SDK распознает ее и возвращает в виде текста.

Тон голоса, его тембр и громкость играют важную роль для точности распознавания речи.

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

Выговор влияет на точность распознавания речи.

Для английского языка в Intel RealSense SDK можно задать две версии: американский и британский. Разумеется, такого выбора недостаточно для покрытия всех особенностей произношения, поэтому речь людей, говорящих с акцентом, распознается хуже.

Качество микрофона значительно влияет на точность распознавания речи.

Микрофон, встроенный в камеру Intel RealSense (F200), работает так же хорошо, как и всенаправленный микрофон веб-камеры, но для распознавания речи лучше подходит микрофон гарнитуры.

Окружающий шум значительно влияет на точность распознавания речи.

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

Распознавание речи в качестве контроллера ввода

Рисунок 5.Вот здесь я командую своими скелетами в игре TheRisen

Использование голосовых команд в приложениях — один из мощнейших способов преодоления преград между людьми и компьютерами. Когда это работает, это просто чудесно. Но когда это не работает, это очень раздражает. В игре The Risen игроки могут отдавать голосовые команды своим подчиненным — скелетам. Сейчас мы поговорим о наших задачах и о том, как мы подошли к их решению с точки зрения пользовательской обратной связи.

Наши задачи

Зачастую голосовые команды просто не распознаются системой.
Этот факт сам по себе является достаточным основанием, чтобы задуматься о целесообразности использования голосового управления как такового. Проектирование пользовательской обратной связи, способной преодолеть технические ограничения Intel RealSense SDK, также весьма непростая задача.

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

Играя впервые, легко забыть, какие были команды.
Мы постарались представить голосовые команды значками, но если вы видите только слова, то их легко забыть.

Распознавание речи в игре TheRisen

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

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


Рисунок 6.Ползунок микрофона в игре TheRisen

Что сработало
С точки зрения определения состояния, в котором пребывают скелеты, наиболее информативным способом являются визуальные эффекты, примененные к скелетам. До того как мы их реализовали, пользователи отдавали по несколько команд подряд, не зная, что скелеты уже находились в нужном состоянии, или не понимали, почему состояние некоторых скелетов отличалось от остальных (согласно игровой механике). Визуальные эффекты также помогли при отладке искусственного интеллекта скелетов.

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

Что не сработало
Анимированный скелет игрока должен был указывать, что идет распознавание команд, но на практике это почти не работало. Здесь, я думаю, дело в том, что в интерфейсе очень много разных элементов, за которыми нужно следить, поэтому на еще одно анимированное изображение просто не обращали внимания. Отметим, впрочем, что для этой игры мы создали только короткий демонстрационный уровень и у пользователей просто не было достаточно времени, чтобы освоиться с интерфейсом.

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

Выводы

  • Информируйте пользователя о том, что идет обнаружение речи, еще до окончания ее обработки, чтобы избежать раздражения и повтора команд во время обработки речи.
  • То, чем пользователь управляет с помощью речи, должно быть очевидно, а изменения состояния должны быть явно заметными.
  • Предоставьте пользователям ползунок управления микрофоном, по которому также будет видно, когда пользователь говорит слишком тихо или слишком громко.
  • Можно отображать системные команды на экране, чтобы помочь пользователям запомнить их.
  • Информируйте пользователя о том, что команда была распознана.

Новый друг человека

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

Первым этапом на этом пути является технология Intel RealSense и другие естественные пользовательские интерфейсы. Эти технологии дают нам возможность действительно по-новому подойти к взаимодействию с миром. Впрочем, здесь все еще только начинается, и мы, будучи разработчиками и создателями, отвечаем за то, чтобы технологии развивались в нужном направлении. Однажды компьютеры станут подобны нашим лучшим друзьям: они смогут предвидеть наши намерения еще до того, как мы начнем их выражать. Сейчас компьютеры ближе к уровню домашних животных: чтобы сообщить нам, что им нужно погулять, им нужна наша помощь.

Об авторе

Джастин Линк — разработчик интерактивных мультимедиаматериалов в компании Chronosapien Interactive, офис которой находится в Орландо, Флорида, США. Его игра Space Between заняла второе место на конкурсе Intel® Perceptual Computing Challenge. В этой игре использовалась камера для распознавания жестов; в трех мини-играх пользователь управляет морской фауной с помощью жестов и голоса. Джастин входит в лучшие 10 % участников программы Intel Innovators, он обучил свыше 1000 разработчиков использованию компьютерных систем с управлением без помощи контроллеров, включая новую технологию Intel RealSense 2014 года.

Обратная связь с пользователем в естественных пользовательских интерфейсах на основе технологии Intel® RealSense™, часть 1

$
0
0

Автор: Джастин Линк

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

С появлением естественных пользовательских интерфейсов (natural user interfaces, NUI), таких как технология Intel® RealSense™, мы можем взаимодействовать с программами по-новому, более естественным образом. Интерфейсы NUI дают нам возможность работать удобнее, проще и эффективнее. Но для этих новых способов взаимодействия с программами нужно создать новый язык.

В этой статье, состоящей из двух частей, описывается опыт компании Chronosapien Interactiveпо разработке естественных интерфейсов для игр с особым упором на пользовательскую обратную связь в этой среде. При этом существует множество распространенных ранее правил, приемов и методик, которые больше нельзя применять. По иронии следует сделать шаг назад и вернуться к способам, которые мы использовали для взаимодействия друг с другом в течение тысячелетий.

Ожидания пользователей

Программное обеспечение в его современном состоянии является негибким и, если угодно, безжалостным. Оно не принимает ничего без явных действий пользователя и ожидает получения полных команд для выполнения нужных действий. Мы хорошо обучены и приспособлены к требованиям программ. Но при использовании естественных интерфейсов картина меняется. Все, что мы узнали о компьютерах и о том, как они познают окружающий мир, исчезает, когда мы говорим компьютеру «Привет!».Когда нам говорят помахать рукой перед экраном, но компьютер не реагирует на это немедленно, мы смущаемся, поскольку, с нашей точки зрения, мы сделали в точности то, что от нас попросили. Часть такого недопонимания проистекает из недостаточного знания технологии, но в основном оно обусловлено тем, что пользователей просят общаться с компьютером естественным образом, а это приводит к «очеловечиванию» компьютера. Пользователи ведут себя так, как будто они общаются с человеком, но при этом они не будут получать такие же подсказки, как в естественном общении: мимика, зрительный контакт, жесты и т. п. Необходимо возместить отсутствие таких сигналов обратной связи, создав очевидные ответы на действия пользователя, нужно выдавать пользователю ответы наподобие «Мы получили ваше сообщение», «Я не понял этого, потому что...» и «Принято, работаю над получением ответа». Кроме того, для формирования нужных ожиданий у пользователей требуется определенное обучение. Относитесь к этому как к знакомству с новым человеком из другой страны.

Приходилось ли вам общаться с кем-либо, кто посередине фразы делал длительную паузу, чтобы лучше сформулировать свою мысль? Или представьте, что вы помахали человеку, а он в ответ неловко приподнял руку. Или вы находились в комнате, где очень шумно, и расслышали лишь обрывки, когда друг прокричал вам: «Пора уходить!». В таких ситуациях, опираясь на контекстные подсказки и прошлый опыт, вы могли правильно интерпретировать намерения людей, обладая лишь частичной информацией. Но такие моменты образуют серьезные затруднения в естественных интерфейсах.

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

Проблемы при создании пользовательской обратной связи в естественных интерфейсах

Аналогия с попыткой разговаривать с собеседником в шумной переполненной комнате очень хорошо подходит к работе с естественными интерфейсами. Ситуация усугубляется еще и тем, что в данном случае ваш собеседник (компьютер) обладает краткосрочной памятью новорожденного младенца, а по способности воспринимать контекст он находится на уровне плодовой мушки-дрозофилы. Ниже перечислены основные проблемы создания пользовательской обратной связи с помощью данных в приложениях Intel RealSense.

  • Зачастую вы не знаете, когда пользователь начал взаимодействовать с приложением.
  • Вы не сможете отличать ситуации, когда пользователь взаимодействует с приложением и когда пользователь делает что-то совершенно постороннее.
  • Вы не сможете без значительных усилий научить программу отличать пользователя, который взаимодействует с приложением, от другого человека, который просто оказался в поле зрения камеры.
  • В данных для взаимодействия будет много помех, иногда такие данные будут ложными.
  • Данные не имеют ограничений, связанных с реальным миром.
  • На обработку данных требуется время, из-за чего возникают неловкие паузы между получением команды и реагированием на нее.

Эти проблемы, связанные с взаимодействием с помощью рук, рассматриваются в приведенных ниже разделах на основе различных реализаций технологии Intel RealSense. Существует и ряд общих принципов, о которых следует помнить при проектировании как обратной связи, так и самого взаимодействия. В ходе своей работы мне удалось найти решение для некоторых проблем, но они по-прежнему являются серьезным препятствием на пути к естественному использованию компьютеров. При разработке с использованием естественных интерфейсов или для них будьте готовы к огромным объемам тестирования и множеству последовательных этапов. Некоторые проблемы, с которыми вы столкнетесь, будут связаны с оборудованием, другие — с SDK, а третьи — с естественными интерфейсами в целом.

Отслеживание рук в Intel® RealSense™ SDK

Способность программ интерпретировать движения рук открывает новые возможности для создателей программ. Помимо образования интуитивной платформы, на которой можно строить взаимодействие между человеком и компьютером, использование рук предоставляет новый уровень «погружения» в приложение, недостижимый иным образом. С помощью Intel RealSense SDKразработчики могут работать со множеством отслеживаемых узлов руки, с ее текущим состоянием «открытости», с различными позами, движениями и жестами. Эти возможности, разумеется, связаны с определенными ограничениями, как и в других режимах приложений Intel RealSense, и эти ограничения придется каким-то образом обходить. Ниже я рассказываю об этих ограничениях, а также описываю разные способы управления с помощью рук, которые мы пытались использовать.

Ограничения взаимодействия с помощью рук

Объем отслеживания


Рисунок 1.Объем отслеживания приложения Intel® RealSense™ в режиме отслеживания рукконечен и может ограничивать возможности приложения

Одной из проблем взаимодействия с помощью рук в SDK является ограниченная возможностями оборудования дальность отслеживания. Поскольку диапазон движения рук у человека достаточно велик, часто руки выходят за пределы этой дальности. Выход за пределы отслеживаемого объема — наиболее частая проблема, с которой сталкиваются новые пользователи, пытающиеся взаимодействовать с приложениями Intel RealSense при помощи рук.

Наложение


Рисунок 2.Взаимное наложение рук из программы Robust Arm and Hand Tracking компании Unsupervised Context Learning

Вторым по распространенности ограничением SDK и других систем на основе отслеживания изображений является наложение. Просто говоря, наложение — это когда один предмет загораживает другой. Эта проблема наиболее важна при отслеживании рук, поскольку во многих естественных позах и жестах руки находятся одна перед другой с точки зрения камеры. Напротив, если экран используется как средство просмотра, руки часто загораживают экран от пользователя.

Размер руки по отношению к размеру экрана

При интерактивном взаимодействии с приложением с помощью рук естественным представляется создание интерфейса так, как если бы пользователь дотрагивался до средства просмотра, то есть (в наиболее частом случае) до экрана. Однако если при таком способе взаимодействия использовать руки, то на экране больше не остается места практически ни для чего. Из-за этого возникают проблемы и для графического пользовательского интерфейса, и для самого приложения.

Усталость рук

Управление цифровым миром с помощью рук — это новая степень свободы, но здесь легко переусердствовать. Одна из важнейших проблем, отмеченных и в наших, и в других приложениях: при использовании рук для работы с приложениями пользователи уже через 60–90 секунд начинают испытывать усталость. Ситуация немного упрощается, если есть стол, на который пользователь может поставить локти, но и это не решает проблему в полной мере.

Отсутствие тактильной обратной связи

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

Руки в качестве указателя

Рисунок 3.Наша реализация рук в качестве указателя в игре Space Between.Указатель — светящийся шар рядом с акулами

В нашей игре Space Between мы пришли к тому, что можно удобно управлять приложением, используя руки в качестве указателя. Так обеспечивается интуитивная связь между управлением приложением традиционным образом (мышью) и новым способом (руками). Ниже я описываю некоторые проблемы, с которыми мы столкнулись при таком походе, нашу реализацию, а также наши удачи и неудачи с точки зрения удобства использования.

Наши задачи

Вот проблемы, которые мы обнаружили при попытке использовать руки в качестве указателя.

Пользователи не понимали, чем именно они управляют
В игре Space Between пользователи напрямую управляют светящимся шаром, который следует за положением их рук на экране в реальном времени. В наших играх персонаж, управляемый игроком, следует за указателем. В результате получилось несколько опосредованное управление. Много раз, когда пользователи впервые пытались играть в нашу игру, им требовалось немало времени для осознания того факта, что они управляют указателем, а не самим персонажем.

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

Руки пользователей часто выходили за пределы отслеживаемого объема
Как уже было сказано ранее, это наиболее распространенная проблема при использовании рук для взаимодействия с приложениями Intel RealSense. Даже когда видимый указатель оказывался на краю экрана, пользователи не связывали это с тем, что их руки дошли до границ отслеживаемого объема.

Указатель в Space Between

В игре Space Between мы использовали двухмерный указатель тремя способами.

Порыв ветра


Рисунок 4.Указатель в виде порыва ветра в игре Space Between

Что сработало
Из всех трех вариантов порыв ветра был наиболее абстрактным. Удачным было то, что его аморфные очертания позволяли замаскировать большую часть помех данных расположения, которые неизбежно возникают в приложениях Intel RealSense. Кроме того, использовалась озвучка, громкость которой изменялась в зависимости от скорости движения указателя. Это было удобно, поскольку пользователи знали, отслеживаются ли движения их рук, или нет (также это можно было определять по движению облаков на экране).

Что не сработало
Аморфные очертания были удобны для маскировки помех, но они не давали возможности точно определить место на экране. Из-за этого возникали затруднения при попытке, например, выбрать ту или иную игру путем наведения указателя на объекты на экране.

Светящийся шар

Рисунок 5.Еще один указатель в игре Space Between

Что сработало
Указатель излучал свет на окружающую среду, но при этом отрисовывался поверх нее. Благодаря этому пользователи знали, куда именно в среде будет двигаться их персонаж, и при этом не возникали проблемы типа «указатель потерялся среди стен». Из-за сравнительно небольшого размера мы также могли видеть точность модуля отслеживания рук в SDK. Изначально мы использовали сам шар в качестве указателя. Но при этом возникла проблема: его было легко потерять из вида, если делать быстрые движения рукой. Чтобы справиться с этим, мы создали след из частиц, который оставался за указателем примерно в течение секунды. У этого решения был приятный побочный эффект: было интересно просто двигать указатель в пространстве, чтобы рисовать им фигуры. И наконец, чтобы соединить указатель с персонажем игрока, мы создали след, соединяющий их. Это было особенно полезно, когда персонаж игрока оказывался заперт в среде и не мог никуда двигаться.

Что не сработало
Основная проблема со светящимся шаром в наших играх: пользователи иногда не понимали, что они управляют именно указателем, а не самим персонажем. Еще одна проблема со светящимся шаром. Помимо управления положением персонажа мы также пытались его использовать для другой функции — отображения открытой или закрытой ладони. Для этого мы увеличивали интенсивность света и делали его ярче. В будущем мы доработаем указатель, чтобы наглядно показывать его изменение при раскрытии ладони. Кроме того, мы можем на короткое время показывать изображение руки рядом с ним, чтобы пользователи понимали, чем именно они управляют.

Указатель в виде руки

Рисунок 6.Указатель в виде руки в Space Between используется для взаимодействия с меню

Что сработало
Указатель в виде руки был самым простым и интуитивным в использовании из всех трех вариантов. Поскольку указатель имел форму руки (и правильный размер), пользователи сразу понимали, чем и как они управляют. Мы продвинулись дальше и создали анимированные изображения переходов между различными положениями руки, соответствуя текущему состоянию. Это было очень удобно, поскольку пользователь сразу видел, что система распознала изменение и реагирует на него. Даже если какое-либо действие не использовалось в текущем контексте, игроки без труда узнавали, что именно интерпретирует приложение и насколько хорошо.

Что не сработало
С точки зрения удобства указатель в виде руки был великолепен, но в игровую среду он совершенно не вписывался по стилю. Либо мы нарушали погружение игрока в атмосферу игрового мира, либо могли использовать этот указатель только в контексте управления приложением, например в меню приостановки игры и настройки параметров.

Выводы

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

  • Во всех возможных случаях предоставляйте пользователю зрительную и звуковую обратную связь при изменении состояния рук. Это помогает игрокам понимать, что именно отслеживается системой, а также позволяет естественно воспринимать игровые возможности.
  • Если пользователь оказывается за пределами отслеживаемого объема, сразу и четко сообщайте об этом.Этой возможности мы в данной момент не имеем в Space Between, но она решает множество проблем, связанных с удобством пользователей, например когда пользователи не понимают, почему игра больше не отслеживает их жесты или работает с задержками при возвращении рук в поле зрения камеры.

Руки и жесты

Рисунок 7.Первый этап жеста поднятия в игре The Risen

Жесты — мощное средство, чтобы выражать свои мысли и выполнять действия. Постоянство жестов позволяет устроить очень точное управление и создать ощущения, уникальные для среды, в которой жесты используются. Использование жестов помогло создать наши игры на основе технологии Intel RealSense, а именно Space Between и The Risen, и соединить игроков с выполняемыми ими действиями. Как уже было упомянуто ранее, сначала я расскажу о проблемах, с которыми мы столкнулись при использовании жестов, о том, как мы их реализовали, и о том, что, по нашему мнению, сработало, а что нет.

Наши задачи

Жесты сложнее, чем просто отслеживание положения. Вот некоторые проблемы, которые мы обнаружили при работе над управлением с помощью жестов.

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

Многие пользователи выполняют жесты правильно, но недостаточно точно для распознавания приложением
Как я уже говорил выше, программное обеспечение распознавания жестов работает весьма придирчиво. Жесты прокрутки должны проходить определенное расстояние, руки должны двигаться определенным образом, на определенном расстоянии от камеры и т. д. Все это иногда делает использование жестов весьма неудобным.

Некоторые углы рук не оптимизированы для отслеживания с помощью технологии Intel RealSense
Одним из серьезнейших недостатков алгоритмов отслеживания рук является невозможность отслеживать определенные углы. В настоящее время система отлично обнаруживает руки, если ладони развернуты в сторону камеры, но обнаружение выполняется гораздо хуже, если ладони направлены перпендикулярно. Это влияет на множество различных жестов, но в особенности на жесты со сложными движениями. Например, в игре The Risen мы создали жест для поднятия скелетов: сначала пользователь показывает камере ладони, затем опускает руки, развернув ладони вверх, а затем поднимает их. В той части этого жеста, когда ладони принимают плоское положение, приложение часто прекращает их отслеживать, что прерывает жест в самой его середине.

Жест поднятия в игре The Risen

Рисунок 8.Второй этап жеста поднятия в игре The Risen

В игре The Risen используется нестандартный жест поднятия, важный для того, чтобы игрок проникся игровой атмосферой и ощутил себе частью игрового мира. И вот что мы узнали в ходе работы.

Что сработало
Нам удалось добиться полного понимания игроками нужных движений, поскольку жест многократно используется в игре. Кроме того, нам хотелось избежать сложных текстов, описывающих в мельчайших подробностях изменение положения рук со временем. Решение было таким: мы показали анимированные руки на сцене в разделе обучения, чтобы было видно, как в точности следует делать нужный жест. Руки в анимации были такого же размера, как руки пользователя на сцене, поэтому пользователи сразу понимали, что от них требуется.

При создании жеста мы знали, что руки пользователей с большой вероятностью не будут правильно расположены. Мы также учитывали существующие в SDK ограничения по отслеживанию рук. Для решения этой проблемы мы выбрали начальную позу жеста так, чтобы модуль отслеживания хорошо ее распознавал. Кроме того, мы предупреждаем пользователя: «Ага, сейчас будет жест поднятия». Пользователь получает зрительное и звуковое уведомление о том, что система знает о начале жеста. Это позволяет избежать ненужных повторений и сообщает игроку, что именно нужно системе.

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

Мы разделили жест на части по техническим причинам и по соображениям удобства, но выполнять его можно слитно, в одно движение. Части используются только для отображения подсказок о правильности выполнения и указания на ошибки, если они есть.

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

Выводы

Вот о чем следует помнить при создании обратной связи для ввода с помощью жестов.

  • Правильная подготовка и объяснения крайне важны для того, чтобы пользователи понимали, как выполнять жесты. Мы использовали анимированное изображение трехмерных рук, и этот способ представляется оптимальным, так как пользователи понимают, что нужно делать.
  • Предоставление обратной связи на разных этапах сложных жестов помогает избегать раздражения.Когда пользователи привыкают к технологии, информирование их о том, что система работает (или не работает), помогает избежать вынужденных повторений жестов раз за разом.

Виртуальные руки

Рисунок 9.Использование виртуальных рук для взаимодействия со средой в игре The Risen

Возможность протянуть руки в виртуальный мир и взаимодействовать с ним, как с нашим собственным миром, — это незабываемые ощущения. Уровень погружения, достигаемый при этом, невозможно сравнить ни с чем. В игре The Risen мы даем пользователям возможность протягивать руки в игровой мир, чтобы открывать двери или включать ловушки. Ниже я перечисляю некоторые проблемы, связанные со взаимодействием при помощи рук, описываю нашу реализацию виртуальных рук в игре The Risen и рассказываю, насколько это оказалось успешным.

Обнаруженные проблемы

Управлять виртуальными руками очень здорово, но реализация такого управления с помощью готовых возможностей SDK связана с определенными трудностями. Вот некоторые проблемы, которые вам придется каким-то образом решать.

Много помех в данных
При отображении руки и управлении данными руки из SDK образуется немало помех. В SDK есть алгоритмы сглаживания, но они далеко не полностью убирают ненужный шум.

Данные не имеют ограничений, связанных с реальным миром
Помимо помех узлы (соответствующие суставам руки) иногда получают расположение, физически невозможное в реальном мире. Кроме того, иногда они прыгают по всему экрану со скоростью света в течение нескольких кадров, это происходит при недостаточной видимости части руки.

Мелкие взаимодействия очень трудно и выполнять, и обнаруживать
Мы хотели предоставить игрокам возможность взаимодействовать с объектами относительно небольшого размера по сравнению с размером руки. Но из-за значительных помех в данных, из-за нечеткого ощущения глубины и отсутствия тактильной обратной связи это оказалось практически невозможно.

Виртуальные руки в игре The Risen

Игроки могут взаимодействовать с миром при помощи рук призрака-скелета в игре The Risen. С помощью рук игрок помогает скелетам различным образом, например открывает двери или включает ловушки для противников. Реализация виртуальных рук помогла нам узнать немало нового.

Что сработало

Рисунок 10.Интерфейс игры The Risen: отображение обнаруженного лица и правой руки

Первое, что следует отметить, — графический пользовательский интерфейс, который мы создали для игры The Risen. Череп в левом верхнем углу представляет игрока и отслеживаемые в данный момент элементы управления. Когда система обнаруживает руки, они отображаются на экране в анимированном виде, показывая игроку, что система их распознает. Казалось бы, это очень просто, но на самом деле полезно, если игрок может определить, что работает, а что нет. Например, если система обнаруживает голову игрока, но не определяет его руки, это означает, что они находятся за пределами отслеживаемого объема.

Чтобы указать, какие объекты мира можно использовать руками, мы показываем значок, который при первом появлении объектов на экране нависает над ними и показывает, как можно взаимодействовать с ними. Мы хотели, чтобы игроки знали, как использовать разные вещи, а также чтобы они могли открывать для себя интерактивные возможности среды. Отображение значка на ранних этапах игры оказалось хорошо сбалансированным решением.

Я описываю наш первоначальный подход ко взаимодействию с объектами среды ниже в разделе «Что не сработало», но в конечном итоге мы добились желаемого: простой жест захвата, в котором использовалась вся рука, работал вполне приемлемо. Это позволило в определенной степени решить две упомянутые выше проблемы (нечеткое ощущение глубины и отсутствие тактильной обратной связи) без существенного ущерба для игры. При этом, впрочем, пришлось строже подойти к выбору объектов, с которыми можно взаимодействовать таким образом, поскольку, если в области руки находятся два или несколько объектов, при взаимодействии они будут затронуты все сразу.

Чтобы указывать пользователям, что их руки находятся в состоянии взаимодействия (сжатая ладонь), мы изменяли цвет рук. При этом использование рук стало схоже с использованием кнопок: было неактивное состояние, и было активное состояние, в котором было совершенно явно, чего ожидает приложение. На основании этого пользователи должны были догадаться, где нужно было взаимодействовать.

Что не сработало
Когда мы впервые задумали использовать руки для взаимодействия со средой, мы представляли себе такие движения, как «потянуть цель», «передвинуть книгу», как будто эти объекты находились прямо перед игроком. Проблема оказалась в том, что было очень трудно выполнять эти движения в точности. Ухватить пальцами цепь, когда вы не можете правильно воспринимать глубину и не получаете тактильной обратной связи, оказалось очень трудной задачей с огромным количеством безуспешных попыток. Эту проблему можно несколько сгладить за счет более точного отслеживания, но действительно решить ее можно при использовании стереоскопического экрана и тактильной обратной связи для рук.

Выводы

Краткая сводка основных выводов, полученных при попытке использовать виртуальные руки.

  • Взаимодействие с помощью простейших жестов работает лучше всего.Возможно, когда технология будет усовершенствована (или при использовании других средств просмотра) можно использовать и мелкие жесты, но пока следует остановиться на самом простом.
  • Предоставляйте наглядную и звуковую обратную связь, когда руки находятся во «взаимодействующем» состоянии. За счет этого пользователь узнает, что система находит объекты в пределах досягаемости, а это упрощает взаимодействие.

Продолжение следует...

В первой части мы обсудили предоставление пользователям обратной связи в приложениях Intel RealSense, особенно при управлении с помощью рук. В следующей статье я расскажу о других режимах технологии Intel RealSense: отслеживание головы, обнаружение эмоций и распознавание голоса. Щелкните здесь, чтобы читать вторую часть.

Об авторе

Джастин Линк — разработчик интерактивных мультимедиаматериалов в компании Chronosapien Interactive, офис которой находится в Орландо, Флорида, США. Его игра Space Between заняла второе место на конкурсе Intel® Perceptual Computing Challenge. В этой игре использовалась камера для распознавания жестов; в трех мини-играх пользователь управляет морской фауной с помощью жестов и голоса. Джастин входит в лучшие 10 % участников программы Intel Innovators, он обучил свыше 1000 разработчиков использованию компьютерных систем с управлением без помощи контроллеров, включая новую технологию Intel RealSense 2014 года.

 

JavaScript*-парсер для фотографий с поддержкой глубины

$
0
0

Аннотация

JavaScript*-парсер для фотографий с поддержкой глубины обрабатывает файлы изображений в формате XDM[1] и извлекает метаданные, внедренные в файлы изображений, создавая XML-файлы. Кроме того, это приложение анализирует XML-файлы, извлекая из них данные цветных изображений и данные карт глубины. Это основа для использования фотографий с поддержкой глубины, например, для просмотра изображений, изменения глубины резкости, параллакса и измерений. Мы использовали JavaScript*-парсер в проекте с открытым исходным кодом под названием Depthy[2] и подтвердили правильность и эффективность его работы.

В качестве входных данных приложение использует файлы изображений XDM, а на выходе мы получаем XML-файлы, файлы цветных изображений и файлы карт глубины.

XDM

Сначала мы описываем входные данные для этого приложения — файлы изображений XDM. XDM — стандарт для хранения метаданных в контейнере изображения при сохранении совместимости с существующими программами для просмотра изображений. Этот стандарт предназначен для технологии Intel® RealSense™[3]. Метаданные включают информацию, связанную с устройством: карту глубины, положение устройства и камеры, модель перспективы объектива, информация о поставщике, облако точек. На следующем рисунке показан пример, где в файле XDM хранится карта глубины (справа) в качестве метаданных вместе с цветным изображением (слева).

XDM

Стандарт Adobe XMP

В настоящее время спецификация XDM поддерживает четыре типа форматов изображений-контейнеров: JPEG, PNG, TIFF и GIF. Метаданные XDM проходят сериализацию и внедряются в файл изображения-контейнера. Формат хранения основывается на стандарте XMP — расширяемой платформы метаданных Adobe[4]. Это приложение разработано специально для формата JPEG. Далее мы вкратце описываем, как метаданные XMP внедряются в файлы изображений JPEG и как анализатор обрабатывает XMP-пакеты.

В стандарте XMP фрагменты данных обозначаются двухбайтовыми маркерами. Маркеры типа 0xFFE0–0xFF­­EF обычно используются для данных приложений, они имеют имя вида APPn. Маркер APPnначинается со строки, указывающей назначение. Эта строка называется строкой пространства имен или строкой подписи. Маркер APP1указывает метаданные EXIF и TIFF; маркер APP13обозначает ресурсы изображения Photoshop, содержащие метаданные IPTC, еще один или несколько маркеров APP1обозначают расположение XMP-пакетов.

В следующей таблице показан формат записей в разделе StandardXMP в файлах JPEG.

  • 2-байтовый маркер APP1 0xFFE1.
  • Длина этого XMP-пакета — 2 байта.
  • Стандартное пространство имен StandardXMP (http://ns.adobe.com/xap/1.0/) длиной 29 байт.
  • XMP-пакет длиной не более 65 503 байта.

Adobe XMP Standard

Если размер XMP-пакета после сериализации превышает 64 КБ, то этот пакет может быть разделен на основной сегмент (StandardXMP) и расширенный сегмент (ExtendedXMP), хранящиеся в нескольких указанных маркерами сегментах JPEG. Формат записей в сегменте ExtendedXMP аналогичен сегменту StandardXMP, но используется другое пространство имен: http://ns.adobe.com/xmp/extension/.

На следующем рисунке показаны сегменты StandardXMP и ExtendedXMP, внедренные в файл изображения JPEG.

Adobe XMP Standard

В следующем фрагменте кода показаны три функции.

  • findMarker.Анализ JPEG-файла (т. е. буфера), начиная с указанного места (т.е. расположения), и поиск маркера 0xFFE1. Если маркер обнаружен, возвращается расположение маркера, если нет, возвращается -1.
  • findHeader.Поиск пространства имен StandardXMP (http://ns.adobe.com/xap/1.0/) и пространства имен ExtendedXMP (http://ns.adobe.com/xmp/extension/) в JPEG-файле (т. е. в буфере), начиная с указанного места (т.е. расположения). При обнаружении возвращается соответствующее пространство имен, в противном случае возвращается пустая строка.
  • findGUID.Поиск идентификатора GUID, хранящегося в xmpNote:HasExtendedXMP в JPEG-файле (т. е. в буфере) от начального места (т.е. расположения) до конечного (расположение+размер-1). Возвращается расположение GUID.
// Return buffer index that contains marker 0xFFE1 from buffer[position]
// If not found, return -1
function findMarker(buffer, position) {
    var index;
    for (index = position; index < buffer.length; index++) {
        if ((buffer[index] == marker1) && (buffer[index + 1] == marker2))
            return index;
    }
    return -1;
}
 
// Return header/namespace if found; return "" if not found
function findHeader(buffer, position) {
    var string1 = buffer.toString('ascii', position + 4, position + 4 + header1.length);
    var string2 = buffer.toString('ascii', position + 4, position + 4 + header2.length);
    if (string1 == header1)
        return header1;
    elseif (string2 == header2)
        return header2;
    else
        return noHeader;
}
 
// Return GUID position
function findGUID(buffer, position, size) {
    var string = buffer.toString('ascii', position, position + size - 1);
    var xmpNoteString = "xmpNote:HasExtendedXMP=";
    var GUIDPosition = string.search(xmpNoteString);
    var returnPos = GUIDPosition + position + xmpNoteString.length + 1;
    return returnPos;
}

128-разрядный GUID, хранящийся в виде 32-байтовой шестнадцатеричной строки ASCII, сохраняется в каждом сегменте ExtendedXMP после пространства имен ExtendedXMP. Он также хранится в сегменте StandardXMP в качестве значения свойства xmpNote:HasExtendedXMP. Благодаря этому мы можем обнаруживать несоответствия и изменения ExtendedXMP.

XML

Метаданные XMP можно внедрять непосредственно в XML-документ[5]. Согласно спецификации XD

M структура данных XML определяется следующим образом.

XML

Файл изображения содержит следующие элементы, как показано в приведенной выше таблице, в формате RDF/XML. Вот описание общей структуры.

  • Изображение-контейнер. Это внешнее изображение (по отношению к XDM), его можно просматривать в приложениях, не поддерживающих XDM.
  • Device. Рутовый объект документа RDF/XML согласно стандарту Adobe XMP.
    • Revision — версия спецификации XDM.
    • VendorInfo — информация о производителе устройства.
    • DevicePose — положение устройства по отношению к окружающему миру.
    • Cameras — последовательность RDF одной или нескольких камер.
      • Camera — вся информация для одной камеры. Для получения любых изображений должна быть хотя бы одна камера. Изображение-контейнер сопоставляется с первой камерой, которая считается основной камерой изображения.
        • VendorInfo — информация о производителе камеры.
        • CameraPose — положение камеры по отношению к устройству.
        • Image — изображение, предоставленное камерой.
        • ImagingModel — модель получения изображения (модель объектива).
        • Depthmap — информация о глубине, включая карту глубины и модель шума.
          • NoiseModel — свойства матрицы камеры, касающиеся шума.
        • PointCloud — данные облака точек.

Следующий фрагмент кода является основной функцией этого приложения. Он анализирует входной JPEG-файл, пытаясь найти в нем маркер APP1 0xFFE1. Если такой маркер найден, выполняется поиск строк пространств имен StandardXMP и ExtendedXMP. Если найдена первая строка, код вычисляет начальную точку и размер метаданных, извлекает метаданные и создает XML-файл StandardXMP. Если найдена вторая строка, код вычисляет начальную точку и размер метаданных, извлекает метаданные и создает XML-файл ExtendedXMP. Приложение выводит два XML-файла.

 

 

// Main function to parse XDM file
function xdmParser(xdmFilePath) {
 try {
     //Get JPEG file size in bytes
     var fileStats = fs.statSync(xdmFilePath);
     var fileSizeInBytes = fileStats["size"];
 
     var fileBuffer = new Buffer(fileSizeInBytes);
 
        //Get JPEG file descriptor
     var xdmFileFD = fs.openSync(xdmFilePath, 'r');
 
     //Read JPEG file into a buffer (binary)
     fs.readSync(xdmFileFD, fileBuffer, 0, fileSizeInBytes, 0);
 
     var bufferIndex, segIndex = 0, segDataTotalLength = 0, XMLTotalLength = 0;
     for (bufferIndex = 0; bufferIndex < fileBuffer.length; bufferIndex++) {
         var markerIndex = findMarker(fileBuffer, bufferIndex);
         if (markerIndex != -1) {
                // 0xFFE1 marker is found
             var segHeader = findHeader(fileBuffer, markerIndex);
             if (segHeader) {
                 // Header is found
                 // If no header is found, go find the next 0xFFE1 marker and skip this one
                    // segIndex starts from 0, NOT 1
                 var segSize = fileBuffer[markerIndex + 2] * 16 * 16 + fileBuffer[markerIndex + 3];
                 var segDataStart;
 
                 // 2-->segSize is 2-byte long
                    // 1-->account for the last 0 at the end of header, one byte
                 segSize -= (segHeader.length + 2 + 1);
                 // 2-->0xFFE1 is 2-byte long
                 // 2-->segSize is 2-byte long
                 // 1-->account for the last 0 at the end of header, one byte
                 segDataStart = markerIndex + segHeader.length + 2 + 2 + 1;
                
                 if (segHeader == header1) {
                        // StandardXMP
                     var GUIDPos = findGUID(fileBuffer, segDataStart, segSize);
                     var GUID = fileBuffer.toString('ascii', GUIDPos, GUIDPos + 32);
                     var segData_xap = new Buffer(segSize - 54);
                     fileBuffer.copy(segData_xap, 0, segDataStart + 54, segDataStart + segSize);
                     fs.appendFileSync(outputXAPFile, segData_xap);
                 }
                 else if (segHeader == header2) {
                        // ExtendedXMP
                     var segData = new Buffer(segSize - 40);
                     fileBuffer.copy(segData, 0, segDataStart + 40, segDataStart + segSize);
                     XMLTotalLength += (segSize - 40);
                     fs.appendFileSync(outputXMPFile, segData);
                 }
                 bufferIndex = markerIndex + segSize;
                 segIndex++;
                 segDataTotalLength += segSize;
             }
         }
         else {
                // No more marker can be found. Stop the loop
             break;
         };
     }
 } catch(ex) {
  console.log("Something bad happened! " + ex);
 }
}

Следующий фрагмент кода анализирует XML-файл и извлекает цветное изображение и карту глубины для фотографирования с поддержкой глубины. Все работает очень просто. Функция xmpMetadataParser() ищет атрибут с именем IMAGE:DATAи извлекает соответствующие данные, то есть цветное изображение, в JPEG-файл. При обнаружении нескольких атрибутов создается несколько JPEG-файлов. Функция также ищет атрибут с именем DEPTHMAP:DATAи извлекает соответствующие данные, то есть карту глубины, в PNG. При обнаружении нескольких атрибутов создается несколько PNG-файлов. На выходе приложения мы получаем JPEG- и PNG-файлы.

// Parse XMP metadata and search attribute names for color image and depth map
function xmpMetadataParser() {
    var imageIndex = 0, depthImageIndex = 0, outputPath = "";
    parser = sax.parser();
 
    // Extract data when specific data attributes are encountered
    parser.onattribute = function (attr) {
        if ((attr.name == "IMAGE:DATA") || (attr.name == "GIMAGE:DATA")) {
            outputPath = inputJpgFile.substring(0, inputJpgFile.length - 4) + "_" + imageIndex + ".jpg";
            var atob = require('atob'), b64 = attr.value, bin = atob(b64);
            fs.writeFileSync(outputPath, bin, 'binary');
            imageIndex++;
        } else if ((attr.name == "DEPTHMAP:DATA") || (attr.name == "GDEPTH:DATA")) {
            outputPath = inputJpgFile.substring(0, inputJpgFile.length - 4) + "_depth_" + depthImageIndex + ".png";
            var atob = require('atob'), b64 = attr.value, bin = atob(b64);
            fs.writeFileSync(outputPath, bin, 'binary');
            depthImageIndex++;
        }
    };
 
    parser.onend = function () {
        console.log("All done!")
    }
}
 
// Process XMP metadata
function processXmpData(filePath) {
    try {
        var file_buf = fs.readFileSync(filePath);
        parser.write(file_buf.toString('utf8')).close();
    } catch (ex) {
        console.log("Something bad happened! " + ex);
    }
}

Заключение

В этом документе описывается формат файлов XDM, стандарт Adobe XMP и структура данных XML. Анализатор JavaScript для фотографии с поддержкой глубины обрабатывает файлы изображений XDM и выдает XML-файлы StandardXMP и ExtendedXMP. Затем он обрабатывает XML-файлы и извлекает из них файлы цветных изображений и файлы карт глубины. Это приложение не зависит ни от каких других программ. Оно является базовым для различных сценариев использования фотографий с поддержкой глубины.

Справочные материалы

[1] «Спецификация eXtensible Device Metadata (XDM), версия 1.0». https://software.intel.com/ru-ru/articles/the-extensible-device-metadata-xdm-specification-version-10

[2] Проект Depthy с открытым исходным кодом. http://depthy.me/#/

[3] Технология Intel® RealSense™. http://www.intel.com/content/www/ru/ru/architecture-and-technology/realsense-overview.html

[4] Центр разработки Adobe XMP. http://www.adobe.com/devnet/xmp.html

[5] «Спецификация XML 1.0», консорциум World Wide Web. Получено 22 августа 2010 г.

Использованные компоненты и решения

В этом проекте используются следующие среды и пакеты.

[1] Среда Node.js (https://nodejs.org/en/) используется в этом проекте. Ее лицензию см. по следующей ссылке: https://raw.githubusercontent.com/nodejs/node/master/LICENSE

[2] Пакет sax (https://www.npmjs.com/package/sax) используется для анализа XML-файлов в этом проекте. Его лицензию ISC см. по следующей ссылке: http://opensource.org/licenses/ISC

[3] Пакет atob (https://www.npmjs.com/package/atob) используется для декодирования данных BASE64 в этом проекте. Его лицензию Apache 2.0 см. по следующей ссылке: http://opensource.org/licenses/Apache-2.0

Об авторе

Ю Бай (Yu Bai) — инженер по разработке приложений в отделе Intel® Software and Services Group (SSG). Она работает с внешними независимыми разработчиками программного обеспечения, добиваясь безупречной работы их приложений на платформах Intel®. До поступления в SSG она работала в компании Rudolph Technologies в качестве старшего инженера по программному обеспечению, занималась разработкой приложений, используемых при работе высокоточного фотолитографического оборудования, используемого в промышленном оборудовании для производства полупроводников. До компании Rudolph она работала в компании Marvell Semiconductor в качестве штатного инженера и занималась анализом электропитания и моделированием электропитания для прикладных процессоров этой компании. Ю перешла в компанию Marvell при приобретении этой компанией технологии Intel® XScale в 2006 году.

Ю получила учетную степень магистра, а затем и доктора наук в области электротехники и информатики в Университете Брауна. Ее дипломная работа была посвящена проектированию архитектуры компьютеров высокой производительности с низким потреблением электроэнергии. Ю владеет шестью патентами США и опубликовала в журналах и материалах международных конференций более 10 статей, посвященных управлению и оптимизации мощности и электропитания.

Камеры Intel® RealSense™ и DCM

$
0
0

Введение

Диспетчер Intel® RealSense™ Depth Camera Manager (DCM) предназначен для предоставления интерфейсов потоков видео с камер Intel® RealSense™ F200и R200для потоков цветного изображения и данных глубины. Служба камеры обеспечивает одновременный доступ нескольких приложений на базе Intel® RealSense™ SDKи одного приложения не на базе SDK к данным с камеры, при этом приложения не мешают работе друг друга. Без службы камер только одно приложение может получать доступ к данным с камеры одновременно, чтобы гарантировать получение точных данных.

Функциональность DCM

DCM — основной интерфейс между камерой Intel RealSense и клиентами Intel RealSense SDK, получающими доступ к данным посредством интерфейсов API Intel RealSense SDK. DCM предоставляет клиентской системе все возможности камер по двухмерной и трехмерной съемке. DCM предоставляет совместимый интерфейс для стандартных видеоприложений в среде DCM с помощью виртуального драйвера устройства получения изображений. DCM также служит для управления камерой, управления политикой доступа и управления электропитанием при доступе нескольких приложений к DCM. Для правильной работы этих функций DCM следует загрузить нужную версию DCM с веб-сайта Intel и установить на компьютере, оборудованном камерой Intel RealSense. По адресу https://downloadcenter.intel.com/download/25044можно загрузить DCM для камеры F200, а по адресу http://registrationcenter-download.intel.com/akdlm/irc_nas/7787/intel_rs_dcm_r200_2.0.3.39488.exe — DCM для камеры R200 для операционных систем Windows* 8.1 и Windows 10. 

Камера F200

Камера Intel RealSense F200 относится к первому поколению трехмерных камер переднего обзора, работающих на основе технологии кодированного света для определения глубины. Камера включает источник инфракрасной (ИК) подсветки, ИК-камеру с разрешением VGA и обычную цветную двухмегапиксельную камеру со встроенным цифровым процессором изображений. Такая камера открывает новые способы использования платформы за счет предоставления синхронизированных данных цветного изображения, глубины и ИК-видео в клиентскую систему. Эффективная дальность распознавания глубины составляет от 0,2 до 1,0 м, это оптимальные значения для использования в помещениях.

Камера R200

Камера Intel RealSense R200 относится к первому поколению трехмерных камер заднего обзора, работающих на основе стереоскопической съемки для определения глубины. Камера включает источник инфракрасной (ИК) подсветки, стереоскопические ИК-камеры с разрешением VGA и обычную цветную двухмегапиксельную камеру со встроенным цифровым процессором изображений. Благодаря синхронизации цветного изображения и инфракрасного изображения глубины эта камера предоставляет новые возможности использования платформы. Эффективная дальность распознавания глубины зависит от используемого модуля и от освещения. Дальность в помещениях составляет до трех, а вне помещений — до десяти метров.


Рисунок 1. Модель DCM — общие принципы работы

Требования к оборудованию

Подробные сведения о требованиях к системе и о поддерживаемых операционных системах для камер F200 и R200 см. здесь.

Компоненты DCM

DCM включает два компонента: службу DCM и виртуальный драйвер DCM.

Служба DCM

Служба DCM работает на клиентском компьютере и управляет запросами нескольких приложений для управления камерами. Служба DCM также выполняет роль диспетчера для управления запросами доступа нескольких приложений к одному видеопотоку. Служба DCM запускается при загрузке операционной системы и позволяет нескольким клиентским приложениям подключаться к себе. Служба DCM взаимодействует с камерой посредством DLL-библиотеки камеры и служит в качестве основного интерфейса камеры для всех типов приложений. DLL-библиотека камеры зависит от конкретной модели, она обеспечивает управление оборудованием каждой камеры. Ниже приводится пример диспетчера задач в системе, где установлены диспетчеры DCM для камер F200 и R200.

Рисунок 2. Служба DCMзапускается при загрузке операционной системы

Виртуальный драйвер DCM

Виртуальный драйвер DCM — это виртуальный драйвер устройства AVstream, поддерживающий совместимый интерфейс к DCM для стандартных видеоприложений. Благодаря виртуальному драйверу стандартные видеоприложения могут одновременно получать доступ к камере из разных приложений SDK.

Определение версии DCM

Используйте ярлык Intel® RealSense™ SDK Gold на рабочем столе, затем откройте Samples\Sample binaries или перейдите в папку C:\Program Files (x86)\Intel\RSSDK\bin\win32 и откройте файл sdk_info. На вкладке «Камера» показана версия службы DCM и другая информация об установленных камерах. На одну и ту же платформу можно установить несколько основных версий DCM для тестирования и разработки. При работе к платформе можно одновременно подключить только одну камеру (такой же или другой модели).

Рисунок 3. Информация о RealSenseSDK

Устранение неполадок

Камера Intel RealSense не передает поток данных правильно.

  • Убедитесь, что служба DCM существует и запущена, как показано на рис. 2.
  • Проверьте панель управления и убедитесь, что в ходе установки приложения была установлена среда выполнения Intel RealSense SDK.
  • Убедитесь, что камера правильно подключена.

Переключение камер между средами выполнения DCM

Клиент SDK может поддерживать разные модели камеры, используя соответствующие среды выполнения DCM этих камер. Клиент SDK должен закрыть все сеансы доступа к одной модели камеры перед переключением к другой модели. Несколько одновременных сеансов доступа клиента SDK к нескольким моделям камеры не поддерживаются. Если клиент SDK включит одновременный доступ к нескольким моделям камер, система может работать непредсказуемым образом.

Удаление

Перед установкой новой версии DCM удалите все существующие версии. Если запустить драйвер DCM в системе, где установлена существующая версия DCM, в меню программы удаления будет предложена команда на удаление и другие команды.

  • Изменить. Изменить текущие установленные компоненты или их параметры.
  • Восстановить. Восстановить отсутствующие или поврежденные файлы, ярлыки и записи в реестре.
  • Удалить. Удалить DCM из структуры папок и из системного реестра.

Заключение

Диспетчер Intel RealSense Depth Camera Manager является основным интерфейсом между камерой Intel RealSense и клиентами Intel RealSense SDK. Он обменивается данными с камерой Intel RealSense посредством DLL-библиотеки камеры.

Справочные материалы

Вот несколько полезных ссылок на Intel RealSense DCM и SDK, включая заметки к выпускам и инструкции по установке и обновлению программного обеспечения.

Об авторе

Нэнси Ле (Nancy Le) — инженер по программному обеспечению в подразделении Software and Services Group корпорации Intel. Она работает над проектами по масштабированию с процессорами Intel® Atom™.


Intel RealSense Technology + Unity 5: полезные советы

$
0
0

Джекоб Пеннок из компании Livid Interactive предлагает полезные советы по работе с технологиями Intel® RealSense™и Unity* 5в этом наборе из семи видеороликов. Описание каждого видеоролика см. ниже.

Примечание. В некоторых видеороликах Джекоб ссылается на видео, описывающее модуль распознавания эмоций в составе SDK. Это видео уже недоступно, поскольку модуль распознавания эмоций упразднен и отсутствует в Intel® RealSense™ SDK, начиная с версии R5.

Настройка набора инструментов Intel® RealSense™ SDK в Unity* 5

Джекоб описывает, как импортировать набор инструментов Intel RealSense SDKв Unity 5 и проверить правильность установки, используя образец кода с перетаскиванием из Intel RealSense SDK. Примечание. Если установлена версия Intel RealSense SDK R4 или более поздняя, можно пропустить инструкции, касающиеся замены 32-разрядных двоичных файлов на 64-разрядные, поскольку начиная с версии R4 набор инструментов поставляется с 64-разрядным двоичными файлами для Unity 5.

Оптимизация для набора инструментов Intel® RealSense™ SDK — часть 1

В этом наборе из двух видео, посвященных оптимизации, Джекоб рассказывает об областях набора инструментов Intel RealSense, где производительность недостаточна для рабочего приложения. В первой части описывается значительное повышение кадровой скорости за счет использования SenseToolkitMgr.Update(). Также показано, как устранить проблему зеркалирования в одном из образцов набора инструментов.

Оптимизация для набора инструментов Intel® RealSense™ SDK — часть 2

Во второй части Джекоб показывает устранение проблемы производительности в методе DrawImages.Update(). В этом видео он создает новый, более эффективно работающий с памятью метод вместо метода Intel, потребляющего слишком много памяти.

Использование Intel® RealSense™ SDK непосредственно в Unity* 5 (без набора инструментов)

В этом видео говорится о доступе к Intel RealSense SDK непосредственно из кода C# Unity 5. Набор инструментов Intel RealSense может быть полезен для быстрого тестирования, но разработчики могут добиваться более эффективной работы приложений, реализуя собственные способы взаимодействия с Intel RealSense SDK. Джекоб перечисляет основные действия, необходимые для этого.

 

Intel® RealSense™ SDK + Unity* 5 — полезный совет: следите за кадровой скоростью

В ходе двухлетнего опыта работы с технологией Intel RealSense Джекоб выяснил, что полезно измерять кадровую скорость, с которой RealSense возвращает данные. В этом видеоролике рассматривается один из способов достижения такого результата.

Альтернативные режимы отслеживания рук в Intel® RealSense™ SDK и Unity* 5

В составе пакета Intel RealSense SDK есть несколько примеров отслеживания движения рук путем распознавания суставов. В этом виде Джекоб показывает еще одну методику отслеживания рук в режиме Extremities и итоговое сегментированное изображение. Этот метод работает гораздо быстрее, чем отслеживание с распознаванием суставов.

 

Intel® RealSense™ SDK + Unity* 5 — полезный совет: отображение сегментированных изображений

В этом видеоролике Джекоб берет сегментированные изображения руки низкого разрешения, полученные в предыдущем видеоролике, и увеличивает их размер до пригодного для демонстрации пользователю, но без заметной пикселизации.

Intel® RealSense™ SDK + Unity* 5 — полезный совет: используйте отдельный поток для обновления

Джекоб описывает свой новый ноутбук Asus со встроенной камерой Intel® RealSense™и показывает, как повысить производительность приложения, используя отдельный поток для взаимодействия с Intel RealSense SDK.

Об авторе

Джекоб Пеннок (Jacob Pennock) — специалист по технологии Intel® RealSense™. Он занимает должности старшего творческого разработчика в компании Helios Interactive Technologies и главного игрового дизайнера/ведущего разработчика в компании Livid Interactive.

Создание приложений для технологии Intel® RealSense™. Рекомендации по проектированию пользовательского интерфейса с примерами для Windows*

$
0
0

Введение

Технология Intel® RealSense™ поддерживает две разновидности камер глубины: камера переднего обзора, малой дальности (F200) предназначена для установки на ноутбуки, ультрабуки, трансформеры и моноблоки; камера заднего обзора, большой дальности (R200) предназначена для установки на планшеты и в виде отдельного съемного устройства. Обе камеры как выпускаются в виде автономных периферийных устройств, так и встраиваются в компьютерные устройства, доступные на рынке в настоящее время. При использовании технологии Intel RealSense для разработки приложений для таких устройств следует помнить, что принцип взаимодействия с трехмерными приложениями без тактильной обратной связи существенно отличается от модели работы, к которой привыкли разработчики, создающие приложения для сенсорного управления.

В этой статье мы описываем некоторые распространенные принципы и проблемы пользовательских интерфейсов для камер F200 и R200 и показываем, как можно встраивать в приложения визуальную обратную связь с помощью API Intel® RealSense™ SDK.

Рекомендации по созданию пользовательских интерфейсов и использованию API для камеры F200

Результат 1. Понимание объемного пространства съемки и зон взаимодействия для ноутбуков и моноблоков.

Сценарий использования пользовательского интерфейса

Рассмотрим сценарии использования, показанные на рис. 1.

 Capture volumes.

Рисунок 1.Объемное пространство съемки

Пирамида, исходящая из камеры на этом рисунке, представляет собой то, что называется объемным пространством съемки или полем зрения камеры. Для камеры F200 объемное пространство съемки определяется отклонениями от горизонтальной и вертикальной осей камеры, а также эффективным расстоянием между пользователем и камерой. Если пользователь сдвинется за пределы этой пирамиды, камера не сможет отслеживать режим взаимодействия. Ниже для справки приведена таблица с параметрами поля зрения.

ПараметрДиапазон
Эффективная дальность распознавания жестов0.2–0.6 m
Эффективная дальность распознавания лица0.35–1.2 m
Поле зрения камеры цветного изображения (глубина х по вертикали х по горизонтали), градусы77 x 43 x 70 (конус)
Поле зрения инфракрасной (ИК) камеры, градусы

90x59x73 (конус)

Поле зрения ИК-прожектора = н/д x 56 x 72 (пирамида)
Разрешение цветного изображенияДо 1080p при кадровой скорости 30 кадров в секунду (кадр/с)
Разрешение карты глубиныДо 640 х 480 при 60 кадр/с

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

Почему это важно с точки зрения пользовательского интерфейса? Конечные пользователи понятия не имеют о том, как именно их «видит» камера. Поскольку они знают о зонах взаимодействия, это может привести к раздражению при работе с приложением, поскольку невозможно определить, в чем именно возникла проблема. На изображении слева на рис. 1 рука пользователя находится в поле зрения камера, а на изображении справа — вне поля зрения; в этом случае отслеживание может быть потеряно. Проблема дополнительно осложняется, если в приложении используется управление с помощью обеих рук или сразу несколько режимов управления, например одновременно с помощью лица и рук. Также учитывайте изменение поля зрения камеры при развертывании приложения на устройствах разных типоразмеров, например на ноутбуках и моноблоках: в последнем случае зона взаимодействия будет расположена выше, чем на ноутбуках. На рис. 2 показаны различные сценарии, в которых пользователи находятся перед разными устройствами.

Figure 2. FOV and form factor considerations.
Рисунок 2.Поле зрения камеры и типоразмер устройства

Информация об этих параметрах поможет встроить в приложение эффективный механизм обратной связи, чтобы предоставлять пользователям четкие указания о правильном способе использования устройства и камеры. Теперь посмотрим, как получить некоторые из этих параметров поля зрения в приложении через SDK.

Техническая реализация

Пакет Intel RealSense SDK предоставляет API, позволяющие получать данные поля зрения и дальности камеры. API QueryColorFieldOfView и QueryDepthFieldOfView работают в интерфейсе device вне зависимости от типа устройства. Вот как реализуется код.

Хотя возвращаемая структура данных имеет формат PXCPointF32, возвращаемые значения указывают углы X (обзора по горизонтали) и Y (обзора по вертикали) в градусах. Это — заданные производителем значения для данной модели камеры, а не настроенные программно на устройстве.

Следующим параметром объемного пространства съемки является дальность. API QueryDepthSensorRange возвращает значение дальности в миллиметрах. Это значение также задано производителем по умолчанию для данной модели, а не настроено программно на конкретном устройстве.

Знание этих API и способов их реализации в коде поможет создать эффективную систему обратной связи для пользователей. На рис. 3 и 4 показаны примеры визуальной обратной связи для объемного пространства съемки.
Figure 3. Distance prompts.
Рисунок 3.Подсказки о расстоянии до камеры.
Figure 4. World diagrams.
Рисунок 4.Схематическое изображение окружающего мира

Простые подсказки обозначают ближнюю и дальнюю границы зоны взаимодействия. Без подсказок пользователь просто не будет понимать, что нужно делать, если система перестанет реагировать на его действия. Применяйте фильтрацию данных расстояния и показывайте подсказку после короткой задержки. Кроме того, используйте указания и подсказки вместо оповещений об ошибках. Схематическое изображение окружающего мира поможет пользователям сориентироваться и ознакомиться с понятиями зоны взаимодействия камеры глубины. Рекомендуется использовать такие схематические изображения на экранах справки и в учебных заставках, а также в играх, пользователи которых могут впервые работать с камерой. Для наибольшей эффективности следует показывать схематическое изображение окружающего мира только при обучении пользователей и на экранах справки. Инструкции должны быть простыми и удобопонятными, при их составлении необходимо ориентироваться на предполагаемую аудиторию приложения.

Вместо перечисленных выше API можно использовать оповещения, предоставляемые в каждом SDK для записи определенных действий пользователей. Рассмотрим, к примеру, следующее решение для распознавания лиц. В следующей таблице перечислены оповещения модуля PXC[M]FaceData.

Как вы уже знаете, SDK поддерживает обнаружение до 4 лиц в поле зрения. С помощью идентификатора лица можно получать оповещения, относящиеся к каждому лицу, в зависимости от потребностей приложения. Также отслеживание может быть полностью потеряно (например, если лицо переместилось в поле зрения камеры, а затем вышло из поля зрения со слишком высокой для отслеживания скоростью). В таком сценарии можно использовать данные объемного пространства съемки вместе с оповещениями, чтобы создать надежный механизм обратной связи для пользователей.

Тип оповещенияОписание
ALERT_NEW_FACE_DETECTEDОбнаружено новое лицо.
ALERT_FACE_NOT_DETECTEDВ сцене отсутствует лицо.
ALERT_FACE_OUT_OF_FOVЛицо вне поля зрения камеры.
ALERT_FACE_BACK_TO_FOVЛицо вернулось в поле зрения камеры.
ALERT_FACE_LOSTПотеряно отслеживание лица.

SDK также позволяет обнаруживать наложение, т. е. случаи, когда снимаемый объект загорожен посторонним предметом. Описание неподдерживаемых и частично поддерживаемых сценариев см. в документе Руководство по созданию пользовательских интерфейсов для камеры F200. Вне зависимости от того, какой тип наложения вы пытаетесь отслеживать, следующий набор оповещений окажется весьма полезным.

Тип оповещенияОписание
ALERT_FACE_OCCLUDEDЛицо загорожено.
ALERT_FACE_NO_LONGER_OCCLUDEDЛицо больше не загорожено.
ALERT_FACE_ATTACHED_OBJECTЛицо загорожено каким-либо объектом, например рукой.
ALERT_FACE_OBJECT_NO_LONGER_ATTACHEDЛицо больше не загорожено каким-либо объектом.

Теперь перейдем к оповещениям в модуле отслеживания рук. Они доступны в модуле PXC[M]HandData в составе SDK. Как видите, некоторые из этих оповещений также неявно задействуют определение дальности (помните о разной дальности действия у модулей распознавания лиц и модулей распознавания рук).

Имя оповещенияОписание
ALERT_HAND_OUT_OF_BORDERSОтслеживаемая рука находится вне двухмерной ограничительной рамки или трехмерного ограничительного куба, заданного пользователем.
ALERT_HAND_INSIDE_BORDERSОтслеживаемая рука вернулась внутрь двухмерной ограничительной рамки или трехмерного ограничительного куба, заданного пользователем.
ALERT_HAND_TOO_FARОтслеживаемая рука находится слишком далеко от камеры.
ALERT_HAND_TOO_CLOSEОтслеживаемая рука находится слишком близко к камере.
ALERT_HAND_DETECTEDОтслеживаемая рука распознана, доступна ее отметка.
ALERT_HAND_NOTE_DETECTEDРанее обнаруженная рука потеряна, поскольку она либо вышла из поля зрения, либо загорожена.
And more...См. документацию.

Теперь вы знаете, какие возможности предоставляет SDK, и можете без особых усилий применить их в коде приложения. Пример показан в следующем фрагменте кода:



Замените инструкции wprintf_s на логику реализации визуальной обратной связи. Можно включать не все оповещения, а только некоторые из них, как показано ниже.


На рис. 5 и 6 показаны примеры эффективной визуальной обратной связи с помощью оповещений.

Figure 5. User viewport.
На рис. 5 и 6 показаны примеры эффективной визуальной обратной связи с помощью оповещений.

Figure 6. User overlay.
Рисунок 6.Наложение изображения пользователя

Ссылки на API в документации SDK

QueryColorFieldOfView: https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?querycolorfieldofview_device_pxccapture.html

QueryDepthFieldOfView: https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?querydepthfieldofview_device_pxccapture.html

QueryDepthSensorRange: https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?querydepthsensorrange_device_pxccapture.html

Оповещения о поле зрения модуля распознавания лиц:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?alerttype_alertdata_pxcfacedata.html

Оповещения о поле зрения модуля распознавания рук:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?manuals_handling_alerts.html

Результат 2. Снижение утомляемости пользователей.

Сценарий использования пользовательского интерфейса: выбор подходящего метода ввода для требуемой точности.

При создании приложений с помощью Intel RealSense SDK важно помнить об особенностях режимов ввода. Выбор подходящих режимов ввода для различных сценариев играет важнейшую роль в работе приложения. Ввод с помощью клавиатуры, мыши и сенсорного экрана отличается высокой точностью, тогда как ввод с помощью жестов — низкой точностью. К примеру, для работы с приложениями, где требуется много работать с данными, предпочтительно использовать ввод с помощью клавиатуры и мыши, а не жестов. Попробуйте представить, каково будет пытаться выбрать определенную ячейку в Excel пальцем вместо мыши (см. рис. 7). Такие действия не вызовут ничего, кроме крайнего раздражения и усталости пользователя. При попытке выполнения точных действий пользователи естественным образом напрягают мышцы, что, в свою очередь, приводит к повышению утомляемости.  

 Choice of correct input.
Рисунок 7.Выбор правильного способа ввода  

Для выбора элементов в меню можно использовать сенсорное управление или мышь. Режимы ввода, поддерживаемые пакетом Intel RealSense SDK, реализуют непосредственный, естественный механизм взаимодействия без касаний и позволяют создавать увлекательные приложения. Используйте эти режимы таким образом, чтобы не требовалось множества повторяющихся жестов. Для использования жестов лучше всего подходят постоянные действия, в которых ошибки не приведут к нежелательному риску.

Выбор направления движения жестов

Рекомендуется использовать жесты, направленные по горизонтали или по дуге. Если доступен выбор, то для удобства пользователей старайтесь использовать движения по горизонтали вместо движений по вертикали. Помимо этого, не используйте действия, вынуждающие пользователей поднимать руки выше уровня плеч. Помните про эффект «рук гориллы»?

 Choice of direction for gesture movement.
Рисунок 8.Выбор направления движения жестов

Выбор относительного или абсолютного движения

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

Понимание скорости движения

Составной частью проблемы точности является фактор скорости. Если пользователи слишком быстро двигают руками перед камерой, то возникает риск полной потери отслеживания, поскольку при этом руки могут оказаться вне объемного пространства съемки. При использовании в приложениях жестов с быстрыми движениями повышается утомляемость пользователей и увеличивается риск ошибок. Поэтому очень важно учитывать фактор скорости и ее влияние как на эффективную дальностью (вблизи от камеры, на расстоянии от 20 до 55 см, можно обнаруживать быстрое движение со скоростью до 2 м/с), так и на пространство съемки (при небольшом расстоянии от камеры в поле зрения может находиться только одна рука).

Понимание действий пользователя и взаимодействия с объектами

Естественные движения человека не всегда являются плавными: человеческое тело часто двигается неравномерно и рывками, что интерпретируется камерой как несколько разных взаимодействий. При создании приложений для Intel RealSense SDK следует помнить о взаимосвязи между действиями и объектами. Например, если существуют объекты, которые можно «взять» рукой с помощью жестов, следует учитывать размер таких объектов и их расположение, нужно принимать во внимание расстояние до краев экрана и места, куда можно «перетащить» такие объекты, а также способы обнаружения сбоев отслеживания.

Вот несколько рекомендаций, помогающих преодолеть такие проблемы.

  • Объекты должны быть достаточно крупными, чтобы на них не влияла дрожь или неравномерное движение руки. Расстояние между объектами должно быть достаточно большим, чтобы пользователи не могли случайно взять не тот объект, который нужно.
  • Не располагайте элементы взаимодействия слишком близко к краям экрана, поскольку в этом случае возрастает риск выхода руки пользователя за пределы поля зрения и потери отслеживания, что вызовет у пользователя неминуемое и праведное раздражение.
  • Если в интерфейсе важно перетаскивание объектов, то должно быть очевидно, куда именно можно перетащить взятый объект и куда его можно отпустить.
  • Если при перемещении пользователем объекта происходит сбой отслеживания, перемещаемый объект должен возвращаться на исходное место, а пользователь должен получить уведомление о сбое отслеживания.

Техническая реализация: скорость и точность

Если для приложения не требуются данные о суставах кисти, а чаще используются быстрые движения руки, имеет смысл использовать модуль Blob. В следующей таблице перечислены различные возможные сценарии и предполагаемая точность в каждом из них. При отслеживании всей руки с данными о суставах движение должно быть более медленным, но это ограничение можно обойти, использовав либо отслеживание оконечностей, либо режим Blob. Кроме того, благодаря режиму Blob вы получите целый ряд преимуществ, если приложение предназначается для детей.

Если же в приложении требуется более полный контроль и нужно управлять скоростью движения, то можно получить данные скорости на уровне суставов руки с помощью PXCMHandConfiguration.EnableJointSpeed. Это позволяет получить либо абсолютное значение скорости, вычисляемое на основе текущего и предыдущего положений руки, либо среднюю скорость за определенный период времени. Тем не менее при таком подходе значительно возрастает нагрузка на ЦП и оперативную память, поэтому применять этот способ следует, лишь когда это совершенно необходимо.

Поскольку нельзя заставить пользователей двигаться плавно, без рывков, в состав SDK также включена программа Smoother (PXC[M]Smoother), сглаживающая рывки при движении рук перед камерой. Эта программа использует различные линейные и квадратные алгоритмы. Можно поэкспериментировать с ними и выбрать наиболее подходящий. На рис. 9 ниже видно, что неравномерное движение руки в значительной степени сглаживается этой программой.

 Smoothed and unsmoothed data.

Рисунок 9. Данные со сглаживанием и без сглаживания

Еще один способ обнаружить слишком быстрое движение руки — перечисление TRACKINGSTATUS_HIGH_SPEED в свойстве PXCMHandData.TrackingStatusType. При обнаружении лица быстрые движения могут привести к потере отслеживания. Используйте PXCMFaceData.AlertData.AlertType — ALERT_FACE_LOST, чтобы определять утраченное отслеживание. Если же вы используете жесты рук для управления операционной системой с помощью Touchless Controller, используйте функции SetPointerSensitivity и SetScrollSensitivity в PXC[M]TouchlessController для настройки чувствительности указателя и прокрутки.

Ограничительные рамки

Эффективный механизм, позволяющий добиться плавности действий и взаимодействия с объектами, — применение ограничительных рамок. Они предоставляют пользователям четкие визуальные указания об исходном месте и месте назначения объекта, с которым взаимодействует пользователь.

Модули отслеживания лица и рук в SDK поддерживают API PXCMHandData.IHand.QueryBoundingBoxImage, который возвращает расположение и размеры отслеживаемой руки (двухмерную ограничительную рамку), на карте глубины. API PXCMFaceData.DetectionData.QueryBoundingRect возвращает ограничительную рамку обнаруженного лица. Также можно использовать PXCMHandData.AlertType — ALERT_HAND_OUT_OF_BORDERS, чтобы обнаруживать выход руки за пределы ограничительной рамки.

Ссылки на API в документации SDK

Алгоритм отслеживания Blob:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?manuals_blob_tracking.html

EnableJointSpeed:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?enablejointspeed_pxchandconfiguration.html

Программа Smoother:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?manuals_the_smoother_utility.html

TouchlessController:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?pxctouchlesscontroller.html

SetPointerSensitivity и SetScrollSensitivity:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?member_functions_pxctouchlesscontroller.html

Рекомендации по созданию пользовательских интерфейсов и использованию API для камеры R200

Камера R200 встраивается в планшеты и выпускается в виде съемного устройства. Она предназначена для съемки пространства вокруг пользователя. Среди возможных сценариев использования камеры R200 следует отметить такие решения, как дополненная реальность и съемка всего тела человека. В поле зрения этой камеры попадает окружающий мир, поэтому сущность и набор проблем проектирования пользовательских интерфейсов отличаются от описанных выше для камеры F200. В этом разделе описываются некоторые известные проблемы пользовательских интерфейсов, связанные с модулем Scene Perception (который будет использоваться разработчиками в приложениях дополненной реальности) и с модулем 3D Scanning.

Результат 1. Понимание объемного пространства съемки и зон взаимодействия для планшетов

Сценарий использования пользовательского интерфейса

Как видно на рис. 10, углы обзора камеры R200 по вертикали и по горизонтали, а также дальность ее действия значительно отличаются от аналогичных характеристик камеры F200. Камеру R200 можно использовать в двух разных режимах: в активном режиме (когда пользователь передвигается, снимая сцену) и в пассивном режиме (когда пользователь работает с неподвижным изображением). При съемке объекта или сцены убедитесь, что объект находится в поле зрения камеры, пока пользователь снимает его в активном режиме. Также учтите, что дальность действия этой камеры (в зависимости от того, где она используется: в помещении или на улице) отличается от дальности камеры F200. Как получить эти точки данных во время выполнения, чтобы предоставить пользователю визуальную обратную связь?

 R200 capture volumes.

Рисунок 10.Объемное пространство съемки камеры R200

Техническая реализация

Мы уже обсудили API QueryColorFieldOfView() и QueryDepthFieldOfView() выше в разделе, посвященном камере F200. Эти функции не зависят от устройства, с их помощью можно производить объемную съемку и камерой R200. Тем не менее для обнаружения дальности действия камеры R200 нужно использовать специализированный API, предназначенный только для этого устройства. Чтобы получить такие данные для камеры R200, необходимо использовать API QueryDSMinMaxZ, доступный в составе интерфейса PXCCapture. Он возвращает минимальную и максимальную дальность камеры в миллиметрах.

Ссылки на API в документации SDK

QueryDSMinMaxZ: https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?querydsminmaxz_device_pxccapture.html

Результат 2. Понимание действий пользователя и взаимодействия со сценой.

Сценарий использования пользовательского интерфейса: планирование с учетом особенностей сцены и возможностей камеры

При работе с камерой в активном режиме следует помнить об ограничениях камеры. Данные глубины будут менее точными при съемке сцены с очень яркими областями, с отражающими и с черными поверхностями. Информация о том, в каких случаях возможен сбой отслеживания, поможет встроить в приложение эффективный механизм обратной связи, чтобы мягко напоминать пользователю о необходимых действиях, а не завершать работу с ошибкой.

Техническая реализация

Модули Scene Perception и 3D Scanning обладают разными требованиями, а поэтому в них используются разные механизмы для обнаружения минимальных требований.

  • Scene Perception.Всегда используйте API CheckSceneQuality в модуле PXCScenePerception, чтобы определить, пригодна ли сцена для отслеживания. API возвращает значение между 0 и 1. Чем выше возвращенное значение, тем лучше сцена для отслеживания. Вот как реализуется код:

После того как качество сцены будет сочтено удовлетворительным и начнется отслеживание, следует динамически проверять состояние отслеживания с помощью API TrackingAccuracy в модуле PXCScenePerception. Этот API выдает точность отслеживания.

ИмяОписание
HIGHВысокая точность отслеживания
LOWНизкая точность отслеживания
MEDСредняя точность отслеживания
FAILEDСбой отслеживания

Чтобы добиться максимального качества данных сцены, можно также настроить разрешение вокселей (воксель — это единица разрешения объемного изображения). В зависимости от того, что именно отслеживает камера (пространство размером с комнату, поверхность стола или расположенный близко объект), настраивайте разрешение вокселей согласно приведенной ниже таблице для получения наилучших результатов.

ИмяОписание
LOW_RESOLUTIONНизкое разрешение вокселей. Используйте это разрешение для отслеживания пространства размером с комнату (4/256 м).
MED_RESOLUTIONСреднее разрешение вокселей. Используйте это разрешение для отслеживания поверхности стола (2/256 м).
HIGH_RESOLUTIONВысокое разрешение вокселей. Используйте это разрешение для отслеживания небольших объектов (1/256 м).
  • 3D Scanning Алгоритм 3D Scanning предоставляет оповещения, показанные в приведенной ниже таблице. Для получения этих данных используйте PXC3DScan::AlertEvent.
ИмяОписание
ALERT_IN_RANGEСнимаемый объект находится на подходящем расстоянии.
ALERT_TOO_CLOSEСнимаемый объект находится слишком близко к камере. Предложите пользователю отодвинуть объект от камеры.
ALERT_TOO_FARСнимаемый объект находится слишком далеко от камеры. Предложите пользователю придвинуть объект к камере.
ALERT_TRACKINGСнимаемый объект правильно отслеживается.
ALERT_LOST_TRACKINGОтслеживание снимаемого объекта потеряно.

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

  • Образец учебной программы при запуске. Tutorials.
  • Рисунок 11.Обучение
  • Предварительный просмотр снятой области или предмета.
     Previews.
  • Рисунок 12.Предварительный просмотр
  • Подсказки для пользователя.
     User prompts.
  • Рисунок 13. Подсказки для пользователя

Снижение утомляемости в случае, когда пользователь держит устройство в руках

Большинство приложений будет использовать устройство и при активном, и при неактивном режимах работы камеры. (Эти два режима отличаются следующим образом: камера работает в активном режиме, когда пользователь держит в руках планшет для просмотра сцены через камеру или для съемки; камера работает в неактивном режиме, когда пользователь положил планшет и работает с содержимым на экране, в то время как камера выключена). Для снижения утомляемости пользователей необходимо понимать, каким образом пользователь держит и использует устройство в каждом из указанных режимов, и соответственным образом выбирать зоны взаимодействия. При использовании камеры в активном режиме пользователь устает быстрее, поскольку держит устройство на весу, как показано на рис. 14.

 Device usage in active and inactive modes.

Рисунок 14.Использование устройства в активном и в неактивном режимах

Выбор подходящего режима для действия

Режим использования также напрямую определяет природу взаимодействия с приложением через пользовательский интерфейс. В активном режиме пользователь держит устройство обеими руками. Поэтому любые визуальные элементы приложения, например кнопки, должны находиться в легкодоступных местах на экране. Исследования показывают, что в таких случаях лучше всего использовать края экрана. Рекомендуемые зоны касаний показаны на рис. 15. Кроме того, в активом режиме снижается точность касаний, поэтому активный режим лучше всего подходит для краткосрочной съемки.

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

 Touch zones in active and inactive modes.

Рисунок 15.Зоны касаний в активном и в неактивном режимах

Ссылки на API в документации SDK

Настройка API Scene Perception и данные отслеживания:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?manuals_configuration_and_tra2.html

Оповещения API 3D Scanning:https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?alertevent_pxc3dscan.html

Заключение

При разработке приложений с использованием технологии Intel® RealSense™ разработчики должны с самых ранних этапов принимать во внимание потребности и особенности работы конечных пользователей. Рекомендации, приведенные в этой статье, послужат основой для решения некоторых важных проблем пользовательских интерфейсов и для реализации необходимых компонентов в коде с помощью SDK.

Дополнительные материалы

Рекомендации по созданию пользовательских интерфейсов для камеры F200: https://software.intel.com/sites/default/files/managed/27/50/Intel%20RealSense%20SDK%20Design%20Guidelines%20F200%20v2.pdf

Рекомендации по созданию пользовательских интерфейсов для камеры R200:

https://software.intel.com/sites/default/files/managed/d5/41/Intel%20RealSense%20SDK%20Design%20Guidelines%20R200%20v1_1.pdf

Лучшие методики создания пользовательских интерфейсов в приложениях для камеры F200:

https://software.intel.com/en-us/articles/best-ux-practices-for-intel-realsense-camera-f200-applications

Ссылка на презентацию и запись выступления на конференции IDF:

http://myeventagenda.com/sessions/0B9F4191-1C29-408A-8B61-65D7520025A8/7/5

Об авторах

Мегана Рао (Meghana Rao)

Мегана — разработчик-евангелист в отделе Software and Services корпорации Intel, она сотрудничает с разработчиками и независимыми производителями программного обеспечения, помогая им в использовании технологии Intel® RealSense™ и в разработке приложений для Windows* 8 на ультрабуках, трансформерах и планшетах с архитектурой Intel®. Кроме того, она регулярно выступает на семинарах Intel Application Labs, где рассказывает о проектировании и разработке приложений на платформах Intel. Мегана Рао является автором множества информационных документов, доступных на портале Intel® Developer Zone. Она обладает ученой степенью бакалавра в области компьютерных наук и ученой степенью магистра в области компьютерных наук и управления технологиями. До поступления на работу в корпорацию Intel в 2011 году она работала старшим инженером по программному обеспечению в компании Infineon Technologies India Pvt. Ltd.

Кевин Артур (Kevin Arthur)

Кевин Артур — старший исследователь взаимодействия с пользователями в отделе Perceptual Computing корпорации Intel. Он руководит исследованиями новых сценариев использования и рекомендаций по работе с трехмерными камерами RealSense, включая смешанные сценарии и дополненную реальность. Кевин получил ученую степень доктора компьютерных наук в Университете Северной Каролины в г. Чапел-Хилл, его специальность — взаимодействие человека и компьютера в системах виртуальной реальности. Ранее он занимался разработкой пользовательских интерфейсов и исследованиями программного обеспечения в компаниях Amazon Lab126, Synaptics и Industrial Light & Magic.

Подготовка к созданию приложений для универсальной платформы Windows* с помощью Intel® RealSense™ SDK

$
0
0

Введение

В версии Intel® RealSense™ SDK R5 (v7) наконец-то появилась долгожданная поддержка разработки приложений для универсальной платформы Windows (UWP), и эта статья поможет приступить к работе. Краткий обзор интерфейсов и методов UWP был представлен в документации к выпуску R4, а в выпуске R5 появились программные компоненты, документация и образцы кода, необходимые для разработки приложений UWP, использующих камеру Intel® RealSense™ SR300.

Как указано в статье Новые возможности выпуска Intel® RealSense™ SDK R5 (v7), камеру SR300 можно заказать начиная с I квартала 2016 года. Кроме того, эта камера будет встраиваться в некоторые устройства с процессорами Intel в 2016 году. Поскольку камера SR300 пока недоступна для конечных пользователей, эта статья посвящена главным образом тем вещам, с которыми следует ознакомиться перед началом работы с новым выпуском и с этой камерой.

Что потребуется для начала работы

  • Ноутбук или ПК с операционной системой Microsoft Windows 10
  • Microsoft Visual Studio* 2015 и Microsoft Windows 10 Developer Tools
  • Камера Intel RealSense SR300 (заказы на эти камеры принимаются с I квартала 2016 г.)
  • Intel RealSense SDK R5 (v7)
  • SR300 DCM 3.0 Gold (можно получить только через Центр обновления Windows)

Область и ограничения SDK

  • SDK поддерживает разработку приложений UWP для Windows 10 с помощью C# и XAML.
  • Для приложений UWP в SDK поддерживается только передача необработанного цветного изображения и карты глубины, а также алгоритм отслеживания Blob. Прочие алгоритмы, касающиеся UWP, пока находятся на этапе разработки.
  • Приложения UWP должны статически включать файлы среды выполнения SDK, чтобы версия SDK была зафиксирована во время разработки.
  • Интерфейс Session не раскрывается явно в UWP C#.
  • Система координат камеры в приложениях UWP слегка отличается, дополнительные сведения см. в руководстве по SDK.
  • Невозможно изменить систему координат в приложении UWP.
  • Для сопоставления координат между потоками цветного изображения и глубины в приложениях UWP используйте интерфейс Windows.Devices.Perception.PerceptionDepthCorrelatedCoordinateMapper.
  • В руководстве по SDK отметка (UWP)означает интерфейсы и методы, относящиеся к UWP. Отметка (+UWP)указывает, что данный интерфейс UWP входит в состав функции вместе с интерфейсами других языков.

Примеры классических приложений для Windows

После установки DCM и SDK перезагрузите компьютер, затем убедитесь в правильной работе камеры, запустив один из примеров в Intel RealSense SDK Sample Browser.

Нажмите в Windows 10 кнопку «Пуск» в левом нижнем углу экрана.

Выберите Все приложенияи найдите папку Intel RealSense SDK (рис. 1).

Figure 1. Windows Start menu

Рисунок 1. Меню «Пуск» в Windows

Найдите и запустите Intel RealSense SDK Sample Browser. В верхней части окна SDK Sample Browser (рис. 2) находится вкладка SR300 Samples, содержащая все примеры классических приложений для Windows (т. е. приложений, работающих в классическом режиме Windows, а не в виде приложений UWP). Ознакомьтесь с этими приложениями для изучения всех возможностей камеры SR300.

Figure 2. SDK Sample Browser

Рисунок 2. SDK Sample Browser

Компоненты UWP

Программные компоненты UWP в составе Intel RealSense SDK находятся в папке C:\Program Files (x86)\Intel\RSSDK\UWP. (Примечание. Это путь установки по умолчанию. В вашем случае путь может различаться в зависимости от того, в какую папку был установлен пакет SDK.) Компоненты находятся в следующих вложенных папках внутри папки \UWP:

  • \ExtensionSDKs — DLL-библиотеки, на которые ссылаются приложения UWP.
  • \Samples  — образцы кода DF_BlobViewer_UWP_CS и DF_StreamViewer_UWP_CS.

Создание проекта UWP с нуля

Если вы впервые занимаетесь разработкой приложений UWP, то сначала следует освоить основы создания проектов UWP с нуля. Информативный учебный проект Hello, world! на C#/XAML доступен на этом веб-сайте Microsoft.

Этот учебный проект поможет узнать, как создать простое приложение, предназначенное для UWP и Windows 10. После выполнения учебного проекта Hello, world! и запуска нового приложения UWP оно будет выглядеть примерно так, как показано на рис. 3.

Figure 3. Hello, world! UWP application

Рисунок 3. Приложение UWP Hello, world!

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

#if DEBUG
 
        if (System.Diagnostics.Debugger.IsAttached)
 
        {
 
            this.DebugSettings.EnableFrameRateCounter = true;
 
        }
 
#endif

Можно либо задать для этого свойства значение false:

this.DebugSettings.EnableFrameRateCounter = false;

Либо просто закомментировать эту строку кода:

// this.DebugSettings.EnableFrameRateCounter = true;

Настройка среды разработки для камеры Intel®RealSense™

Чтобы приложение могло использовать камеру Intel RealSense, выполните следующие действия:

  • Установите флажок Веб-камерав разделе «Возможности» в окне «Манифест приложения».
  • Добавьте ссылки на библиотеки Intel RealSense SDK.

В обозревателе решений дважды щелкните Package.appxmanifest, затем перейдите на вкладку Возможности.

Найдите и установите флажок Веб-камера, как показано на рис. 4.

Figure 4. Package.appxmanifest

Рисунок 4. Package.appxmanifest

Теперь нужно добавить ссылки на библиотеки Intel RealSense SDK.

  • Intel.RealSense — эта библиотека содержит основную реализацию экземпляров в SDK, в том числе для управления алгоритмами и для поточной передачи данных с камер.
  • Intel.RealSense.Blob — эта библиотека содержит реализацию модуля отслеживания Blob в SDK.

Щелкните правой кнопкой мыши Ссылкив обозревателе решений и выберите Добавить ссылку, чтобы открыть диспетчер ссылок.

Нажмите кнопку Обзори перейдите в папку, содержащую файлы Intel.RealSense.winmdи Intel.RealSense.Blob.winmd. (Эти файлы метаданных находятся в папке C:\Program Files (x86)\Intel\RSSDK\UWP\ExtensionSDKs\.)

Нажмите кнопку Добавить. Эти библиотеки появятся в разделе «Ссылки» в обозревателе решений.

Изучение примеров UWP

Чтобы лучше ознакомиться с интеграцией возможностей Intel RealSense SDK в приложения, откройте и соберите два примера проектов, входящие в комплект SDK.

  • DF_BlobViewer_UWP_CS
  • DF_StreamViewer_UWP_CS

Примечание. Эти примеры недоступны в приложении SDK Sample Browser, описанном выше. Они находятся в папке C:\Program Files (x86)\Intel\RSSDK\UWP\Samples, их следует скопировать в любую доступную для записи папку, чтобы скомпилировать в Visual Studio 2015.

Заключение

В этой статье приводится краткая сводка по разработке приложений UWP с помощью Intel RealSense SDK. Следите за новостями по мере выпуска камеры SR300.

Об авторе

Брайан Браун — инженер по разработке программных приложений в подразделении Developer Relations корпорации Intel. 

Рекомендации по созданию пользовательских интерфейсов в приложениях для камеры Intel® RealSense™ F200

$
0
0

 

Технология Intel® RealSense™предоставляет новые способы взаимодействия с компьютерными устройствами, в том числе возможность естественного управления с помощью жестов рук. Чтобы помочь разработчикам в ознакомлении с рекомендациями по созданию приложений с естественным пользовательским интерфейсом для камеры F200с помощью Intel® RealSense™ SDK, члены команды Experience Design and Development в отделе Perceptual Computing Group корпорации Intel записали серию из 15 коротких видеороликов. Цель этой серии — помочь вам с самого начала реализовать в своем приложении удачный пользовательский интерфейс. Видеоролики касаются различных областей — от основ (таких как понимание зоны взаимодействия пользователя и особенностей отслеживания рук) до учебных материалов и тестирования. Можно посмотреть всю серию видеороликов или выбрать для просмотра отдельные ролики из приведенного ниже списка.

Посмотреть всю серию

Выберите интересующую тему в полном списке видеороликов

Проведение тестирования с участием пользователей | Камера Intel® RealSense™ F200

При разработке приложения Intel® RealSense™ с естественным пользовательским интерфейсом важно придавать первостепенное значение удобству пользователей. Один из лучших способов узнать, как пользователи работают с возможностями вашего приложения, — провести тестирование с участием пользователей. В этом видеоролике содержатся рекомендации для разработчиков по проведению тестирования с участием пользователей для создания более удобных приложений, предназначенных для использования камеры глубины F200. Рассказывает Лиза Мони (Lisa Mauney).

Создание приложений для управления жестами с помощью двух рук | Камера Intel® RealSense™ F200

Технология Intel® RealSense™ способна распознавать сразу две руки, но при взаимодействии с приложением с помощью двух рук возникает ряд особых затруднений, с которыми вы можете столкнуться, разрабатывая приложения с управлением при помощи жестов для камеры глубины F200. В этом видеоролике содержатся рекомендации и простые решения для устранения возникающих затруднений. Рассказывает Лиза Мони.

Предоставление пользователям учебной информации и инструкций | Камера Intel® RealSense™ F200

При использовании технологии Intel® RealSense™ в приложении вы можете предоставить конечным пользователям один или несколько новых способов взаимодействия с приложением, например с помощью жестов. Для удобства работы с приложением необходимо предоставить пользователям учебную информацию, чтобы они понимали, как именно следует действовать. В этом видеоролике приводятся рекомендации по предоставлению пользователям инструкций и учебной информации. Рассказывает Чандрика Джейант (Chandrika Jayant).

Снижение утомляемости пользователей: перерывы и повторы | Камера Intel® RealSense™ F200

При создании приложений с естественным пользовательским интерфейсом для технологии Intel® RealSense™ необходимо помнить об утомляемости пользователей и встраивать в приложение перерывы, чтобы давать пользователям возможность отдохнуть. В этом видеоролике приводятся рекомендации по созданию приложений для камеры глубины F200. Рассказывает Чандрика Джейант.

Понимание скорости движения | Камера Intel® RealSense™ F200

При разработке приложений с использованием технологии Intel® RealSense™ нужно понимать скорость и точность жестов рук и их влияние на работу пользователя с приложением. В этом видеоролике содержатся рекомендации по реализации в приложениях необходимой обратной связи: это позволит пользователям лучше понять, что и как нужно делать для правильной работы с приложением. Рассказывает Роберт Кукси (Robert Cooksey).

Использование отделения (сегментации) фона | Камера Intel® RealSense™ F200

Одной из возможностей технологии Intel® RealSense™ является сегментация изображения, то есть отделение объекта на переднем плане от фона. В этом видеоролике приводятся рекомендации по использованию этой функциональности в приложениях для камеры глубины F200. Рассказывает Роберт Кукси.

Понимание пространства в мире и пространства на экране | Камера Intel® RealSense™ F200

При создании приложений для технологии Intel® RealSense™ разработчики должны учитывать соотношение между пространством на экране и физическим пространством. В этом видеоролике содержатся рекомендации, помогающие добиться более эффективной работы с пространством при использовании камеры глубины F200. Рассказывает Роберт Кукси.

Устранение проблем с наложением: что делать, если руки загораживают экран или пользователя | Камера Intel® RealSense™ F200

Распространенная проблема приложений с Intel® RealSense™ заключается в наложении жестов, когда рука пользователя заслоняет экран или загораживает другую руку. Если приложение недостаточно продуманно обрабатывает такие ситуации, это может привести к значительному снижению удобства пользователей. В этом видеоролике содержатся рекомендации для разработчиков по устранению проблем с наложением при использовании камеры глубины F200. Рассказывает Лиза Мони.

Снижение утомляемости пользователей: поддержка естественных движений | Камера Intel® RealSense™ F200

При разработке приложений с естественным пользовательским интерфейсом с помощью технологии Intel® RealSense™ следует помнить, что пользователи взаимодействуют с физическим пространством, а потому для управления приложениями следует использовать естественные движения. В этом видеоролике содержатся рекомендации по применению естественных, удобных пользователям движений для управления приложениями, предназначенными для камеры глубины F200. Рассказывает Роберт Кукси.

Понимание зоны взаимодействия | Камера Intel® RealSense™ F200

Для того, чтобы пользователям было удобно работать с вашим приложением Intel® RealSense™, необходимо хорошо понимать физическое пространство, в котором пользователь может взаимодействовать с камерой. В этом видеоролике приводятся рекомендации для наилучшего понимания зон взаимодействия при использовании камеры глубины F200. Рассказывает Чандрика Джейант.

Использование визуальной обратной связи: взаимодействие с объектами | Камера Intel® RealSense™ F200

Пользователи всегда должны знать, с какими отображаемыми на экране объектами они могут взаимодействовать в приложениях Intel® RealSense™. В этом видеоролике содержатся рекомендации по предоставлению визуальной обратной связи, помогающей пользователям правильнее обращаться с объектами на экране приложения. Рассказывает Чандрика Джейант.

Снижение утомляемости пользователей: понимание пределов точности ввода | Камера Intel® RealSense™ F200

В приложениях с естественным пользовательским интерфейсом, построенных на основе технологии Intel® RealSense™, точность ввода ограничивается целым рядом факторов. При разработке приложений важно обеспечить достаточную погрешность для действий пользователя, поскольку движения могут отклоняться от идеального направления или быть неравномерными. Здесь описываются рекомендации по устранению проблем, которые могут возникнуть в связи с недостаточной точностью движения пользователей. Рассказывает Роберт Кукси.

Разработка для различных типоразмеров устройств | Камера Intel® RealSense™ F200

При создании приложений для технологии Intel® RealSense™ важно учитывать все виды, типы и размеры устройств, на которых могут устанавливаться приложения. У каждого вида устройств, будь то ноутбуки, планшеты и моноблоки, есть свои особенности и есть различия в пространственном расположении области взаимодействия (она представляет собой конус, вершиной которого является объектив камеры). В этом видеоролике содержатся рекомендации для разработчиков по использованию камер глубины F200 на разных платформах. Рассказывает Чандрика Джейант.

Использование визуальной обратной связи: указатели | Камера Intel® RealSense™ F200

В приложениях Intel® RealSense™ с естественным пользовательским интерфейсом пользователи должны знать свое расположение относительно границ зоны взаимодействия: за счет этого повышается уверенность и удобство работы с приложением. Один из лучших способов повышения удобства пользователей — отображение на экране указателя (аналогично указателю мыши). В этом видеоролике содержатся рекомендации по отображению на экране указателей положения рук пользователя в приложениях, использующих камеру глубины F200. Рассказывает Чандрика Джейант.

Управление на разной дальности | Камера Intel® RealSense™ F200

Допустимый диапазон дальности камеры F200 достаточно широк и составляет от 20 до 120 см. Реализовывать поддержку всего этого диапазона в приложениях Intel® RealSense™ нет смысла. В этом видеоролике содержатся рекомендации по использованию различных значений дальности камеры F200 в разных сценариях работы с приложениями. Рассказывает Лиза Мони.

Возможности Windows 10*, о которых должны знать все разработчики игр

$
0
0

Рисунок 1. Windows* 10 — это общая операционная система
для целого ряда устройств

В Windows 10 реализован целый ряд новых и улучшенных возможностей. Кроме того, эта операционная система должна объединить широчайший диапазон игровых платформ с приложениями универсальной платформы Windows (UWP). Благодаря расширенной поддержке устройств-трансформеров можно использовать более естественные режимы взаимодействия. Поскольку все платформы работают под управлением вариантов одной и той же операционной системы, все приложения устанавливаются из одного и того же магазина. Что касается игр для ПК, то возможности их установки еще лучше благодаря поддержке Steam*. Каким бы ни был способ установки игр, DirectX* 12 вдохнет в них новую жизнь за счет существенно расширенных возможностей.

Потенциал DirectX 12

DirectX 12 — это самая последняя версия графического пакета API корпорации Microsoft, предназначенного для управления и оптимизации функций мультимедиа, и в частности для обработки графики в играх. Более того, игровые консоли Xbox* произошлиот первоначально задуманного DirectX Box. Неудивительно, что эта технология по-прежнему является фундаментальной для разработки игр.

DirectX* 12 brings PCs console-level optimization

Рисунок 2. Благодаря DirectX* 12 на ПК можно реализовать
оптимизацию уровня игровых консолей

 

В DirectX 12 под управлением Windows 10 реализован целый ряд усовершенствований, снижены издержки при вызовах, использование файла подкачки памяти и потребление ресурсов, благодаря чему игра получает больше ресурсов ЦП и памяти. Игры в режиме переднего плана получают более полный контроль над выполнением их процесса; применяется резервирование памяти, чтобы исключить подкачку текстур и другие потенциальные конфликты с внешними приложениями. Если обойтись без более подробных объяснений, эти усовершенствования обеспечивают пользователю более удобные возможности и позволяют запускать игру на большем количестве компьютеров разной мощности, поддерживая при этом приемлемую производительность.

Одна из важнейших проблем, связанных с появлением любой новой технологии, состоит в том, какую долю существующих материалов и процессов разработки придется переделать для поддержки новой технологии. К счастью, при переходе с DirectX 11 на DirectX 12 процессы остаются неизменными. Можно использовать прежние текстуры и модели, форматы, цели рендеринга, вычислительные модели и т. д. Наиболее важные изменениякасаются кода настраиваемых игровых движков, причем в сети MSDN опубликованы официальные инструкциипо переводу этих движков на новую версию. В большинстве случаев разработчики используют существующий движок, поддержка DirectX 12 уже реализована в Unreal* и Unity* (в частности, со значительным ускорением за счет распределения нагрузки на несколько ядер процессора, но будут и другие усовершенствования). Если учесть встроенную поддержку DirectX 12 в процессорах Intel®  Core™ 6-го поколения, это даст возможность игровым движкам эффективно использовать все ресурсы системы.

Распространение через Steam

Steam — ведущаясистема распространения игр для ПК. С помощью Steam геймеры узнают о новых играх, приобретают и устанавливают их. Кому-то может показаться странным, что корпорация Microsoft поддерживает внешний магазин приложений (вместо своего собственного), но здесь нет конкуренции в одной и той же области: магазин приложений для Windows предназначен для всех устройств под управлением Windows (по данным за прошлый год, их количество превысило 1,5 миллиарда), чтобы можно было покупать приложения на смартфоне, находить и загружать игры для Xbox One и ПК.

Геймеры не будут столь охотно переходить на новую ОС, если окажется, что большая часть их игровой библиотеки содержится в программе, которая может не поддерживаться. К счастью, Steam* в Windows 10 обладает полной обратной совместимостью и не требует никаких изменений (помимо обновления драйверов видеоадаптера).

Существует даже плитка Steam, чтобы создавать плитки для быстрого доступа к отдельным играм. Корпорация Microsoft стремится обеспечить безупречную работу Steam в Windows 10, и это приносит свои плоды: согласно проведенному в Steam анализу оборудования, Windows 10 стала второй по распространенности операционной системой в Steam. Более четверти пользователей перешли на эту ОС в течение всего нескольких месяцев после ее выпуска.

Рисунок 3. Уступая лишь операционной системе Windows* 7 (44,86 %), операционная система Windows 10 продолжает распространяться (ее доля составляет 27,42 %) с темпами, равными суммарным темпам распространения всех остальных операционных систем

Гибкость на трансформерах

Современные устройства-трансформеры могут использоваться как в режиме планшета, идеально подходящего для мобильных игр, так и в режиме ноутбука с высококачественной графикой и высокой производительностью, необходимой для игр на ПК. Сочетание гибких возможностей сенсорного экрана и ноутбука предоставит геймерам универсальное решение с идеальными методами взаимодействия для разных задач. Возможности пользователей по управлению в играх дополнительно расширяются с помощью таких решений, как Intel®  RealSense™ SDK, поддерживающих использование на персональных компьютерах трехмерных камер и голосовых команд (вот краткое руководствопо использованию этой технологии в Windows 10).

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

Интеграция всего мира Windows

Концепция «Написать код приложения один раз и запускать его на любых системах», ранее считавшаяся идеалом, становится более достижимой благодаря распространению приложений для универсальной платформы Windows (UWP). Корпорация Майкрософт проводит стандартизацию всех платформ под знаменами Windows 10, образуя тем самым великолепную возможность для многократного использования кода. Разумеется, у разработчиков по-прежнему есть возможность написать разные версии для разных платформ, но теперь можно написать код игры, которая будет работать на ПК, игровых консолях Xbox One, планшетах, смартфонах и даже очках виртуальной реальности HoloLens*, сможет охватывать целые семейства устройств со схожими аппаратными ресурсами.

One Windows platform

 

Приложения UWPпреодолевают границы между разными платформами, допуская при этом индивидуальную оптимизацию для каждого типа устройств. Можно определять семейство устройств и определенные доступные возможности перед установкой, выбирая двоичный файл для установки, или с помощью контрактов APIво время выполнения, что дает возможность применять адаптивные функции, упрощающие работу на трансформерах и с использованием периферийных устройств.

Одним из существенных отличий для большинства приложений Windows является работа с жизненным циклом приложений. Раньше система не имела информации о том, в каком режиме существует игра (работает, зависла, будет закрыта пользователем); теперь эти изменения могут запускать программные события для повышения удобства игроков. Теперь приложения могут управлять изменениями состояния, а Windows может эффективнее управлять необходимыми для этого ресурсами.

Существует целый ряд ресурсов с технической информацией, например материалы Майкрософт на конференции GDC 2015, касающиеся многих аспектов, не раскрытых в этой статье: Крис Тектор (Chris Tector) и Дон Бокс (Don Box)рассказывают о работе систем в этой парадигме, Билл Шифельбайн (Bill Schiefelbein)демонстрирует участие геймеров и разработчиков игр в новом виде социальной сети на основе приложения Xbox, Виджей Гаджала (Vijay Gajjala) и Брайан Тайлер (Brian Tyler)рассказывают об использовании API Xbox Live для быстрого применения этих новых возможностей, а Крис Карла (Chris Charla)представляет программу для независимых разработчиков ID@XBOX, дающую возможность самостоятельной публикации наравне с остальными (включая даже бесплатное получение двух комплектов разработчика при наличии адреса электронной почты на веб-сайте компании).

Подключение через приложение Xbox

Приложение Xbox (игровой центр на ПК, распространяющий функциональность Xbox Live на другие устройства) объединяет воедино все игровые возможности. Это приложение объединяет друзей-геймеров в подобие интересной, динамичной и увлекательной социальной сети, способствуя развитию культуры игроков.

Рисунок 4. Приложение Xbox* расширяет возможности геймеров

Игроки могут записывать видеоролики и делать снимки экрана в своих играх, чтобы обмениваться ими друг с другом. Дополнительная возможность — запись последних 30 секунд игрового процесса на случай, если вдруг произойдет что-то интересное, но непредвиденное. Поскольку сеть друзей и подписчиков распространяется на разные платформы, любая игра получает одинаковый уровень распространения: даже пользователи, запускающие приложение Xbox на мобильном устройстве, смогут смотреть видеоролики, снятые в игре.

Принцип единого входа, реализованный в учетных записях Xbox, упрощает сопоставление профилей пользователей и возлагает выполнение всех рутинных задач на операционную систему (включая и импорт друзей из Facebook*). Поскольку приложения для Windows снабжены манифестами с явно указанной информацией, система может управлять установкой и обновлением, что экономит немало рабочего времени разработчикам (что особенно важно после выпуска игры в продажу).

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

В Центре разработчиков Windowsпредоставляются панели мониторинга для аналитики, отслеживания информации, такой как данные игроков и покупки; можно динамически создавать различные элементы для привлечения внимания, например достижения, конкурсы и таблицы лидеров. При наличии у разработчиков всей этой информации игроки смогут раскрывать для себя новые аспекты игр и по-новому общаться со своими друзьями в игре.

Дополнительно: передача с Xbox One на ПК

Игровая консоль Xbox One дает возможность не только играть и общаться с друзьями на разных платформах, но и передавать игровой процесс на любой ПК с Windows 10, находящийся в этой же сети. Разумеется, необходимо учитывать ряд особенностей, чтобы обеспечить удобство игры в этом случае, но сама возможность играть без привязки к телевизору очень важна.

Streaming gameplay to anywhere on your network.

Рисунок 5. Передача игры в любое место сети

Обоюдная польза

Если вы — геймер или разработчик игр для ПК или Xbox One, то операционная система Windows 10 окажется вам очень полезна. Возможности, предоставляемые приложением Xbox и интерфейсами API, закладывают основу для более широкого и глубокого привлечения игроков. Новая версия решений Майкрософт отвечает всем требованиям игроком в отношении производительности и простоты использования, чтобы сделать игры более увлекательными и интересными на всех уровнях.

Дополнительные сведения

Происхождение названия Xbox: http://www.economist.com/node/5214861

DirectX 12: http://blogs.msdn.com/b/directx/archive/2014/03/20/directx-12.aspx

Значение DirectX 12 для геймеров и разработчиков: http://www.pcgamer.com/what-directx-12-means-for-gamers-and-developers/

Важные различия между Direct 3D 11 и Direct 3D 12: https://msdn.microsoft.com/ru-ru/library/windows/desktop/dn899194(v=vs.85).aspx

Преобразование приложений с Direct3D 11 на Direct 3D 12: https://msdn.microsoft.com/ru-ru/library/windows/desktop/mt431709(v=vs.85).aspx

Теперь все разработчики могут выпускать игры DirectX 12 с помощью обновленного движка Unreal Engine 4: http://www.windowscentral.com/any-developer-can-now-make-directx-12-game-updated-unreal-engine-4

Основатель Unity: сам по себе API DirectX 12 не дает заметного прироста производительности: http://gamingbolt.com/unity-founder-directx-12-api-alone-doesnt-give-a-significant-performance-boost

Описание продукта. Платформа процессоров Intel®  Core™ 6-го поколения:  http://www.intel.com/content/www/ru/ru/processors/core/6th-gen-core-family-mobile-brief.html

Valve собирает партнеров по игровым консолям для конкуренции с Microsoft и Sony: http://www.bloomberg.com/news/articles/2013-11-04/valve-lines-up-console-partners-in-challenge-to-microsoft-sony

Магазин Microsoft Xbox не пытается убрать Steam из Windows 10: http://venturebeat.com/2015/05/21/microsofts-xbox-store-isnt-trying-to-cut-out-steam-in-windows-10/

Корпорация Майкрософт: на рынке насчитывается полтора миллиарда устройств с Windows: http://www.neowin.net/news/microsoft-we-have-15-billion-windows-devices-in-the-market

Плитка Steam:   https://www.microsoft.com/ru-ru/store/apps/steam-tile/9wzdncrfhzkv

Майкрософт стремится поддерживать Steam и «помочь безупречно работать под управлением Windows 10»: http://www.technobuffalo.com/2015/08/07/microsoft-wants-to-support-steam-and-help-it-run-great-on-windows-10/

Обзор оборудования и программного обеспечения Steam, ноябрь 2015 г.: http://store.steampowered.com/hwsurvey

Intel RealSense: http://www.intel.com/content/www/ru/ru/architecture-and-technology/realsense-overview.html

Приступая к разработке приложений Intel®  RealSense™ SDK для настольных ПК с Windows* 10: https://software.intel.com/ru-ru/articles/get-started-developing-intel-realsense-sdk-for-windows-10-desktop-apps

Windows 10 на Surface Pro 3 — идеальный трансформер: http://www.gizmag.com/windows-10-surface-pro-3-review/38189/

Что такое приложение для универсальной платформы Windows (UWP): https://msdn.microsoft.com/ru-ru/library/windows/apps/dn726767.aspx

Динамическое обнаружение компонентов с помощью контрактов API (10 из 10): https://blogs.windows.com/buildingapps/2015/09/15/dynamically-detecting-features-with-api-contracts-10-by-10/

Универсальность: понимание жизненного цикла приложений для Windows 10: https://visualstudiomagazine.com/articles/2015/09/01/its-universal.aspx

MSDN Channel 9, конференция GDC 2015: https://channel9.msdn.com/Events/GDC/GDC-2015

Разработка игр для Windows 10: https://channel9.msdn.com/Events/GDC/GDC-2015/Developing-Games-for-Windows-10

Игровые возможности конечных пользователей в Windows 10: https://channel9.msdn.com/Events/GDC/GDC-2015/Gaming-Consumer-Experience-on-Windows-10

Разработка с Xbox Live для Windows 10: https://channel9.msdn.com/Events/GDC/GDC-2015/Developing-with-Xbox-Live-for-Windows-10?ocid=SessionsInEvent

Новые возможности для независимых разработчиков: https://channel9.msdn.com/Events/GDC/GDC-2015/New-Opportunities-for-Independent-Developers?ocid=SessionsInEvent

Возможности Xbox в Windows 10: http://www.xbox.com/ru-ru/windows-10/xbox-app

Центр разработчиков Windows: https://dev.windows.com/ru-ru/games

Использование поточной передачи игр в приложении Xbox под управлением Windows 10: https://support.xbox.com/ru-ru/xbox-on-windows/gaming-on-windows/how-to-use-game-streaming

Об авторе

Брэд Хилл (Brad Hill) — инженер по программному обеспечению в подразделении Developer Relations корпорации Intel. Брэд занимается изучением новых технологий на оборудовании Intel и обменивается лучшими методиками с разработчиками ПО на форумах Intel®  Developer Zone и на конференциях разработчиков. Он помогает студентам и разработчикам становиться разработчиками игр и изменять мир к лучшему.

WebAssembly *: первый взгляд

$
0
0

Download WebAssembly article PDF  [PDF 263 KB]

Введение

Эта публикация — первая в серии статей, в которых дается общее представление о WebAssembly (wasm). Этот язык еще не полностью доработан, ожидается немало изменений, но в этой статье вы получите общее представление о текущем состоянии wasm. Мы будем выпускать дальнейшие статьи с описанием изменений по мере их появления.

Цель wasm состоит в повышении производительности JavaScript *. Этот язык определяет новый портативный формат файлов, высокоэффективный с точки зрения размера и времени загрузки, пригодный для компиляции данных для веб-страниц. Он будет использовать существующие веб-API и должен стать составной частью набора веб-технологий. Хотя название WebAssembly содержит приставку веб-, этот язык предназначен не только для браузеров, он должен предоставлять такие же возможности и для использования в других целях. За счет этого wasm может получить более широкое распространение.

Как и во всех языках с динамической типизацией, в JavaScript крайне трудно добиться оптимальной производительности работы, поэтому в течение многих лет на веб-страницах применялась возможность использовать машинный код (C/C++). Альтернативные языки, такие как NaCl и PNaCl, работают на веб-страницах вместе с JavaScript. Наибольшую практическую отдачу обеспечивает asm.js — это подмножество JavaScript с компонентами, при компиляции которых достигается производительность почти на уровне машинного кода.  Но ни одно из этих альтернативных решений не получило повсеместного распространения на веб-страницах для повышения производительности и использования кода. Эту проблему и призван решить язык wasm.

Wasm должен не заменить JavaScript, а предоставить возможность достижения производительности на уровне машинного кода для основных частей приложения (это могут быть как веб-приложение, так и обычное приложение). По этой причине разработчики браузеров, веб-приложений, компиляторов и прочего ПО вместе работают над определением этой технологии. Одна из целей состоит в определении нового двоичного формата кода, независимого от платформ, для веб-страниц.

Если для выполнения кода на веб-страницах удастся добиться производительности, близкой к скорости машинного кода, это может произвести настоящую революцию в появлении новых возможностей в веб-решениях. В машинном коде новые функции зачастую предоставляются в пакетах SDK, для чего применяются соответствующие библиотеки. Веб-страницы не имеют доступа к этим библиотекам по соображениям безопасности. Для реализации поддержки новых возможностей зачастую требуются сложные стандартизованные API в составе веб-браузеров, чтобы устранять сопутствующие проблемы. К примеру, библиотеки JavaScript работают слишком медленно.

При использовании wasm эти стандартные API могут стать намного проще и работать на более низком уровне. При этом библиотеки динамической компоновки wasm, поддерживающие кэширование, многопоточность и обработку множества данных одной инструкцией (SIMD), обеспечат функциональность, недостижимую сегодня. Например, вместо сложных стандартных API для распознавания лиц или построения трехмерного изображения для использования с трехмерными камерами упрощенный стандартизованный API сможет просто предоставлять доступ к потоку необработанных трехмерных данных. Модуль wasm при этом будет осуществлять обработку, которая сейчас осуществляется библиотекой SDK. Это даст возможность загружать и кэшировать распространенные библиотеки динамической компоновки и быстро получать доступ к новым возможностям из Интернета, намного раньше возможного завершения процесса стандартизации.

В данной статье предлагается введение в эту стремительно развивающуюся технологию. В статье приводится общее описание, поскольку многое в спецификации wasm пока еще находится на уровне разработки.

Дополнительные сведения об общих целях и задачах wasm см. здесь:

https://github.com/WebAssembly/design/blob/master/HighLevelGoals.md5.

Общее описание

Проект и спецификация

Первоначальные документы проекта wasm находятся в следующем хранилище, в котором, в частности, есть следующие файлы.

  • AstSemantics.md— содержит описание самого формата.
  • MVP.md— определение «минимального жизнеспособного продукта» — требования для первой итерации wasm.
  • HighLevelGoals.md— общие цели wasm и сценарии, для которых предназначен этот язык.

Для точного определения и проверки решений, записанных в проектный документ, в хранилище specнаходится интерпретатор OCaml языка wasm. Также содержится папка тестового пакета с несколькими начальным тестами wasm. Набор тестов включает различные тесты — от общих вычислений с целыми числами и числами с плавающей запятой до операций с памятью.

Еще несколько инструментов в основном хранилище wasm в github используют этот же набор тестов для регрессивного тестирования. Например, это wasm-to-llvm-prototypeи wasmint.

Прототипы

Базовая страница wasm в githubсодержит различные действующие проекты. Некоторые из них упоминаются в этой статье, но достойны внимания и многие другие. Читателю рекомендуется изучить различные проекты, чтобы увидеть, на что сообщество wasm направляет свои усилия, но все хранилища можно разделить на пять основных групп.

Многие ресурсы в этих хранилищах являются проверочными, т. е. их цель — опробовать что-либо в действии и набрать опыт, они далеко не всегда представляют конечный результат. Инженеры, работающие с хранилищами, часто экспериментируют с wasm, чтобы понять, как все работает. Например, это касается различных тестируемых двоичных форматов, таких как polyfill-prototype-2или двоичный формат v8format.

WebAssembly: первый взгляд

Модули, более крупные составные части

В wasm модули являются наиболее крупными компонентами. Внутри модулей находятся функции и запросы выделения памяти. Модуль wasm — это совокупность распространяемого исполняемого кода. Каждый модуль обладает собственным линейным пространством памяти, функциями импорта и экспорта, а также кодом. Модуль может быть исполняемым файлом, библиотекой динамической компоновки (в будущих версиях wasm) или кодом для выполнения на веб-странице (используется в случаях, когда можно использовать модули ECMAScript 6 *).

Действующие тестовые файлы в тестовом пакете позволяют определять несколько модулей в одном файле, но считается, что в итоговой версии это будет не так. Напротив, чаще всего целая программа будет образовывать один большой модуль. Поэтому большинство программ C/C++ будут преобразованы в одиночные модули wasm.

Функции

В wasm применяется статическая типизация с возвратом; все параметры типизируются. Например, в этой строке из файла i32.wast в хранилище тестового пакетапоказано добавление двух параметров.

(func $add (param $x i32) (param $y i32) (result i32) (i32.add (get_local $x)
    (get_local $y)))

Все они являются 32-разрядными целочисленными значениями. Строка выглядит следующим образом.

  1. Объявление функции с именем $add.
  2. Она содержит два параметра, $x и $y, оба — 32-разрядные целочисленные значения.
  3. Результат — 32-разрядное целочисленное значение.
  4. Тело функции — 32-разрядное сложение.
    • Левая сторона — значение в локальной переменной или параметре $x.
    • Правая сторона — значение в локальной переменной или параметре $y.
  5. Поскольку нет явного узла возврата, возвращается последняя инструкция функции, то есть сложение.

Более подробные сведения о функциях и коде wasm см. ниже в этой статье.

Сходство с AST

Согласно общему определению wasm классифицируется как дерево абстрактного синтаксиса (AST), но также обладает некоторыми механизмами управления потоком и определением локальных переменных, что позволяет обрабатывать временные расчеты. Текущим текстовым форматом в wasm являются С-выражения (символьные выражения), хотя принято решение о том, что в итоговой версии wasm текст будет представлен иначе.

Тем не менее для пояснения работы wasm в этом документе они вполне пригодны. За исключением общих конструкций потока управления, таких как условия if, циклы и блоки, вычисления в wasm имеют формат AST. При этом для следующего вычисления:

(3 * x + x) * (3 * x + x)

используется следующий код wasm.

You could see the following wasm code:

(i32.mul
       (i32.add (i32.mul (i32.const 3) (get_local 0)) (get_local 0))
       (i32.add (i32.mul (i32.const 3) (get_local 0)) (get_local 0))
 )

Это означает, что компилятору из кода wasm в машинный код придется исключать распространенные подчиненные выражения для достижения высокой производительности. Для решения этой проблемы wasm позволяет коду использовать локальные переменные для хранения временных результатов.

Наш пример превращается в следующий код.

(set_local 1
       (i32.add (i32.mul (i32.const 3) (get_local 0)) (get_local 0))
)
 (i32.mul
       (get_local 1)
       (get_local 1)
 )

Ведутся обсуждения того, где следует производить оптимизацию:

  • между исходным кодом, например C/C++, и wasm;
  • между wasm и двоичным кодом, используемым для целевой архитектуры в браузере или в других приложениях.

 

 

Память

Подсистема памяти для wasm называется линейной памятью, где модуль может запросить заданный объем памяти, начиная с адреса 0. Для загрузки в память и для сохранения из памяти можно использовать либо константы для простых примеров кода, либо также переменные с адресами.

Например, следующий код сохраняет целое число 42 по адресу 0.

(i32.store (i32.const 0) (i32.const 42))

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

Прототип wasmLLVM

Прототип wasm — LLVM, инструмент, который я разрабатываю для wasm, предоставляет возможность компилировать код wasm непосредственно в код x86 посредством компилятора LLVM. Изначально предполагалось использовать wasm в веб-браузерах, но есть планы использовать wasm и в других сценариях, не связанных с браузерами.

Общая структура прототипа wasm — LLVM состоит в разборе тестового файла wasm с помощью программ с открытым исходным кодом flex и bison и в построении промежуточного представления. В этом промежуточном представлении есть этап (а в будущем, вероятно, их будет несколько), на котором производится промежуточная обработка перед формированием кода с помощью компилятора LLVM.

 wasm-to-LLVM prototype.

Рисунок 1.Прототип wasmLLVM

На рис. 1 показана базовая структура этой программы: в качестве начальных входных данных используется временный текстовый формат wasm. Такой формат называется С-выражениями. С-выражение проходит анализ лексическим и синтаксическим анализаторами, реализованными с помощью средств flex и bison. После анализа С-выражения создается внутреннее промежуточное представление, затем осуществляется промежуточная обработка перед получением внутреннего представления LLVM. В промежуточном представлении LLVM код отправляется в оптимизатор LLVM, после чего создается код Intel®  x86.

Первый пример на wasm

Здесь приводится простой пример: суммирование всех значений массива. Этот пример показывает, что освоить wasm довольно просто, следует лишь помнить о нескольких особенностях.

Предполагается, что код wasm будет создаваться компилятором, а исходным языком для этого будет C/C++. Не существует отдельного компилятора, который преобразует код C/C++ в wasm, хотя в LLVM уже ведутся работы, связанные с wasm. По всей видимости, и другие компиляторы, такие как GCC и MSVC, будут поддерживать язык и среду wasm. Написание непосредственно кода wasm вряд ли будет распространено, но интересно посмотреть на такой код и понять, как будет устроено взаимодействие языка с браузером/ОС и с архитектурой системы.

Сумма массива

;; Initialization of the two local variables is done as before:
;;   local 1 is the sum variable initialized to 0
;;   local 2 is the induction variable and is set to the
;;   max element and is decremented per iteration
 (loop
        (if_else
          (i32.eq (get_local 2) (i32.const 0))
           (br 1)
            (block
              (set_local 1 (i32.add (get_local 1) (i32.load (get_local 2))))
              (set_local 2 (i32.sub (get_local 2) (i32.const 4)))
            )
        )
        (br 0)
      )

Примечание. Описываемый подход не всегда является оптимальным. Он используется здесь для демонстрации основных компонентов языка wasmи его логики. В другой статье будут описаны различные конструкции, способные лучше имитировать инструкции используемого оборудования.

В приведенном выше примере цикл определяется узлом цикла. Узлы циклов могут определять имена блоков начала и выхода или могут быть анонимными, как здесь. Для лучшего понимания кода в цикле используются две локальные переменные. Local 1 — переменная суммы при обходе массива, а local 2 — обновляемая индукционная переменная. Local 2 фактически представляет указатель на текущую суммируемую ячейку.

 

 

Вот аналогичный код на C.

// Initialization is done before
//   local_1 is the sum variable initialized to 0
//   local_2 is the induction variable and is set to
//   the max element and is decremented per iteration
do {
   if (local_2 == start) {
     break;
   }
   local_1 = local_1 + *local_2;
   local_2--;
} while(1);

Циклы в wasm работают как конструкции do-while в C. Но неявное замыкание цикла отсутствует: в конце цикла wasm необходимо определить явную ветвь. После этого узел «br 0» в конце дает команду на возврат к верхнему узлу цикла: 0 представляет уровень вложенности цикла, на который нужно перейти.

Цикл начинает работу с проверки того, нужна ли дополнительная итерация. Если да, то выполняется «br 1», т. е. выход из начала цикла на один уровень. В этом случае, поскольку существует только один уровень, мы выходим из цикла.

В цикле код использует постепенно уменьшающийся указатель для достижения начала массива. В версии на C существует удобная переменная, названная start. Она представляет массив, суммирование которого выполняет код.

В wasm, поскольку разметка памяти начинается с адреса 0, а данный массив является единственным в этом до крайности упрощенном примере, произвольным образом определено, что начальным адресом массива будет 0. Если поместить массив в какое-нибудь другое место, то это сравнение будет больше похоже на версию на языке С; локальная переменная 2 будет сравниваться со смещением, переданным с помощью параметра.

Обратите внимание на разницу в обработке обновления индукционной переменной между кодом C и кодом wasm. В коде C сам язык дает возможность программисту просто обновлять указатель на единицу, что далее в строке приведет к фактическому уменьшению на четыре. В wasm мы уже работаем на очень низком уровне, поэтому уменьшение на четыре происходит прямо здесь.

Наконец, как мы показали, (get_local 2) является счетчиком цикла, а (get_local 1) — фактической суммой вектора. Поскольку мы суммируем 32-разрядные значения, в операции используются коды операций i32.add и i32.load. В этом примере вектор, который мы суммируем, находится в начале линейной области памяти.

Создание кода wasmLLVM

The wasm-to-llvm-prototype generates the following loop code quite easily:

.LBB4_2:
  movl  %edi, %edx
  addl  (%rdx,%rcx), %eax
  addl  $-4, %edi
  jne .LBB4_2

Это весьма компактный цикл, если учесть первоначальный код wasm в текстовом формате. А вот эквивалентная версия на С.

for (i = 0; i < n; i++) {
    sum += tab[i];
}

Компилятор GNU * Compiler Collection (GCC) версии 4.7.3 выдает при уровне оптимизации -O2 следующий код с аналогичной логикой.

.L11:
  addl  (%rdi,%rdx,4), %eax
  addq  $1, %rdx
  cmpl  %edx, %esi
  jg  .L11

В случае с wasm мы получили цикл с обратным отсчетом и используем результат вычитания напрямую в качестве условия для перехода цикла. В случае с GCC требуется инструкция сравнения. Но в версии GCC не используется дополнительная инструкция перемещения, которая используется в wasm с LLVM.

При уровне оптимизации O3 компилятор GCC применил векторизацию цикла. Видно, что прототип wasm — LLVM необходимо доработать, чтобы он начал создавать оптимальный код (как с векторизацией, так и без нее). Этому будет посвящена другая статья в этой серии.

Заключение

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

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

Об авторе

Жан-Кристоф Бейлер (Jean Christophe Beyler) — инженер по программному обеспечению в отделах Software and Solutions Group (SSG), Systems Technologies & Optimizations (STO) и Client Software Optimization (CSO) корпорации Intel. Он занимается компиляторами для Android и экосистемой Android в целом, а также другими технологиями, связанными с производительностью и компиляторами.

Платформа хранения данных для разработчиков облачных хранилищ

$
0
0

Введение

Разработчики облачных хранилищ сталкиваются с определенными затруднениями при интеграции современных устройств, таких как твердотельные накопители, более быстрая сетевая инфраструктура и современные процессоры. Каждая такая технология развивает какой-то определенный аспект производительности, поэтому для поддержания сбалансированной производительности при оптимизации затрат требуется тщательный анализ и понимание особенностей работы как оборудования, так и программного обеспечения. Для помощи ОЕМ-производителям и поставщикам программного обеспечения в интеграции такого оборудования корпорация Intel создала набор драйверов и разработала полную архитектуру хранилища под названием Storage Performance Development Kit (пакет SPDK). В этой статье приводится краткий обзор пакета SPDK, включая инструкции по получению этого пакета

SPDK: обзор

Цель создания SPDK состоит в повышении эффективности и масштабируемости Этот пакет позволяет снизить издержки при разработке и работе, а также обеспечивает оптимизацию программного уровня для использования всего потенциала средств хранения данных нового поколения, таких как устройств с памятью NVMe (Non-Volatile Memory Express*).

Пакет SPDK реализует две основные технологии для повышения производительности хранилищ: работа в опрашиваемом режиме и на пользовательском уровне. В SPDK применяется ряд методик для оптимизации плана данных с целью повышения вычислительной эффективности. В частности, SPDK избегает переключений контекста подсистемой ввода-вывода и переходит к модели драйвера опрашиваемого режима (PMD), работающего в пользовательской области памяти. Этот процесс позволяет исключить издержки, связанные с прерываниями и копированием данных между областью памяти ядра и пользовательской областью памяти. За счет применения сверхкрупных страниц памяти и выделения статических областей памяти для буферов SPDK исключает "промахи"мимо буфера быстрого преобразования адреса (TLB): все нужные данные всегда находятся в кэше. Благодаря этим программным методикам оптимизации драйвер SPDK NVMe работает в 10 раз эффективнее, чем драйвер NVMe в Linux* по умолчанию; возможно масштабирование для обработки миллионов операций ввода-вывода в секунду (IOPS).

Для разработчиков SPDK предоставляет максимум функциональности при минимуме неудобств. SPDK — это гибкая и масштабируемая платформа, поэтому разработчики могут сосредоточиться на своем приложении, а не на настройке и оптимизации платформы. Весьма либеральная лицензия открытого исходного кода означает практическое отсутствие каких-либо барьеров на пути использования этой технологии как в коммерческих проектах, так и в проектах с открытым исходным кодом. При этом разработчики могут изменять код в соответствии с потребностями своих систем. Сам код хорошо документирован и прост в использовании.

SPDK состоит из множества компонентов, взаимосвязанных и использующих общие элементы пользовательского уровня и работы в опрашиваемом режиме. Каждый из этих компонентов был создан для преодоления определенного узкого места производительности, обнаруженного при создании полной архитектуры SPDK. При этом все разработанные компоненты можно интегрировать и в другие архитектуры, отличные от SPDK, что дает клиентам возможность задействовать технологии, применяемые в SPDK, для ускорения работы собственного программного обеспечения. Например, была создана библиотека сетевых служб пользовательского пространства (UNS) для преодоления ограничений производительности набора TCP/IP ядра Linux. За счет создания работающей на пользовательском уровне опрашиваемой реализации TCP/IP в SPDK удалось добиться гораздо более высоких показателей IOPS, затрачивая намного меньше процессорных циклов на сортировку и обработку TCP/IP-пакетов.

Внешний интерфейс состоит из Data Plane Development Kit (DPDK) и сетевых служб пользовательского пространства (UNS). DPDK образует платформу для высокоскоростной обработки пакетов на уровне сетевого адаптера, что позволяет данным быстрее попадать из сетевого адаптера в пользовательское пространство. После этого за работу принимается код UNS: он раскрывает TCP/IP-пакеты и формирует команды iSCSI.

После этого вычислительная платформа получает содержимое пакетов и преобразует команды iSCSI в команды SCSI блочного уровня. Перед отправкой этих команд к внутренним драйверам в SPDK добавлена платформа API для добавления индивидуальных функций, требуемых клиентам, в рамках платформы SPDK (зеленый прямоугольник на показанном выше рисунке). К таким функциям относятся: кэширование, дедубликация и сжатие данных, шифрование, вычисления для RAID и распределенного хранения. Примеры таких функций входят в состав SPDK, хотя их не следует принимать за реализации, готовые к использованию в рабочей среде — они служат лишь для моделирования реальных сценариев использования.

Наконец, данные попадают к внутренним драйверам, которые осуществляют операции чтения и записи на физические устройства. SPDK включает PMD пользовательского уровня для различных носителей хранения данных: устройства NVMe; универсальные устройства под управлением Linux с традиционными дисковыми накопителями; драйверы памяти для решений с блочной адресацией памяти (например RAM-диски), а также устройства, способные использовать технологию Intel® I/O Acceleration Technology (Crystal Beach DMA). Пакет внутренних драйверов позволяет расширить спектр используемых высокопроизводительных устройств хранения данных, что повышает универсальность всей системы.

Определения компонентов SPDK

  • Модуль сетевых служб пользовательского пространства (UNS) TCP/IP. Этот модуль обрабатывает все сетевые пакеты, полученные от драйвера сетевого адаптера, и передает их через набор TCP/IP на основе FreeBSD*. Библиотека UNS (libuns) включает и интерфейс, совместимый с Sockets, и более гибкий интерфейс для перспективных операций с нулевым копированием.
  • Драйвер NVMe. Этот драйвер пользовательского пространства был написан для того, чтобы разрешить использовать любое устройство NVMe через драйвер пользовательского пространства. Этот драйвер был создан по тем же принципам, что и остальные компоненты SPDK: он работает в опрашиваемом режиме. Основное преимущество этого драйвера пользовательского пространства состоит в чрезвычайно малом времени программных задержек — порядка десятка наносекунд — что снижает издержки ЦП при работе драйвера. Этот драйвер в настоящее время выпущен в качестве открытого исходного кода.
  • Драйвер памяти. Этот драйвер представляет собой внутренний драйвер RAM-дисков (виртуальных дисков в оперативной памяти) для SPDK. Он был разработан главным образом для проведения тестов производительности на уровне, недостижимом для устройств NVMe. Драйвер обрабатывает запросы на чтение или на запись к виртуальным устройствам в оперативной памяти после обработки приложением для хранения данных пользователя.
  • Драйвер CBDMA. Это внутренний драйвер для технологии прямого доступа к памяти (DMA) процессоров Intel® Xeon® (он также известен как технология Intel® QuickData, кодовое обозначение —Crystal Beach DMA). Он дает возможность использовать инфраструктуру прямого доступа к памяти. Драйвер обрабатывает запросы на чтение или на запись к устройствам CBDMA после обработки приложением для хранения данных пользователя. Этот драйвер в настоящее время выпущен в качестве открытого исходного кода.

Примечания.Драйверы NVMe и iSCSI — это расширенные драйверы, работающие в пользовательском пространстве, но обладающие правами ядра, чтобы избегать переключений контекста и прерываний; им не требуются "блокировки".

  • iSCSI. После обработки пакетов на уровне TCP единица данных протокола iSCSI (PDU) поступает в модуль iSCSI. Этот модуль преобразует PDU в блоки дескриптора команд (CDB) SCSI, которые, в свою очередь, будут преобразованы в команды чтения блока или записи блока. Этот iSCSI-таргет идентифицирует запросы SCSI на чтение и запись и определяет подходящие устройства. Затем он передает запрос через API-интерфейс BDAL, чтобы предоставить заказчикам возможность реализации дополнительных важных и полезных функций, включая встроенную дедубликацию, защиту данных с коррекцией ошибок, сжатие, хэширование и т. д. Пример приложения, использующий функции библиотеки Intel® Intelligent Storage Acceleration, входит в состав SPDK в качестве образца для интеграции.

В приведенной ниже таблице показаны сведения о доступности каждого компонента:

НаименованиеДоступность
NVMe


На сайте https://01.org/spdkили https://github.com/spdk

CBDMA
TCP/IP (UNS)



В настоящее время распространяется по лицензии Intel.

iSCSI
Mem driver

Особенности и лицензирование

SPDK совместим не со всеми архитектурами систем хранения данных. Следующие вопросы помогут определить, подходят ли компоненты SPDK к вашей среде хранения данных.

Система хранения данных работает на основе Linux?

В настоящее время пакет SPDK протестирован и поддерживается только на Linux.

Допускает ли архитектура системы внедрение драйверов PMDбез блокировки в поточную модель?

Поскольку драйверы PMD постоянно работают в собственных потоках (вместо перехода в режим сна и высвобождения процессора при бездействии), у них строгие требования к поточной модели.

Система поддерживает пакет DataPlaneDevelopmentKit (DPDK) для работы с нагрузками, состоящими из сетевых пакетов?

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

Допускает ли ваша модель лицензирования использование нераспространяемого исходного кода?

Весь исходный код SPDK предоставляется бесплатно.
Некоторые части SPDK (NVMe и драйверы PMD пользовательского пространства CBDMA) доступны в виде компонентов с открытым исходным кодом, распространяемых по лицензии BSD. Они доступны на сайте https://01.org/spdkили https://github.com/spdk.

Другие компоненты (UNS и целевой объект iSCSI в пользовательском пространстве) в настоящее время лицензируются на условиях лицензии Intel, но будут доступны только в 2016 году.

Примечание.Корпорация Intel не принимает на себя никаких обязательств по поддержке этого программного решения. И корпорация Intel, и сообщество разработчиков программ с открытым исходным кодом для SPDK будут предпринимать коммерчески обоснованные действия для изучения возможных ошибок неизмененных выпущенных программ, но корпорация Intel ни при каких обстоятельствах не будет принимать обязательств перед клиентами в отношении какого-либо обслуживания или поддержки этого программного решения.

Справочные материалы

Ускорение облачной среды на архитектуре Intel®


Об авторе
Тай Ле (Thai Le) — инженер по программному обеспечению в отделе Software Solution Group в корпорации Intel®, специализация — облачные вычисления.

Дополнительные сведения об оптимизации компиляторов см. в нашем уведомлении об оптимизации.


Создание систем хранения данных с открытым исходным кодом в пользовательском пространстве

$
0
0

Аннотация

Требования к системам хранения данных с каждым годом растут, поэтому оборудование таких систем стремительно развивается. Благодаря новейшим высокопроизводительным технологиям, таким как память 3D XPoint™, длительность задержек в системах хранения данных будет измеряться уже не в миллисекундах, а в наносекундах. Однако развитие нового поколения хранилищ означает, что узкими местами в системах ввода-вывода теперь будут не носители данных, а сеть и программное обеспечение, что, по нашему мнению, повлечет ускоренную разработку облачных систем хранения данных пользовательского режима.  Многие коммерческие проекты, такие как Containers *, Ceph *, Swift *, Hadoop *, и проприетарные программные решения уже работают в пользовательском пространстве. Открываются обширные возможности для разработки компонентов систем хранения данных с открытым исходным кодом.

Базовые сведения

Производительность систем хранения данных оценивается по двум основным характеристикам: длительности задержек и пропускной способности. Под задержками понимается длительность ожидания при перемещении данных, а под пропускной способностью — объем данных, передаваемый за заданное время.

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

  1. Задержки чтения и записи очень важны из-за требуемых уровней кэширования как в самом накопителе, так и в буфере подсистемы хранения данных.
  2. Операции чтения и записи выполняются быстрее, если они идут последовательно, а не в произвольном порядке. 
  3. Производительность ввода-вывода ограничивается скоростью вращения дисков и количеством задействованных дисков.
  4. Механические диски и внешние контроллеры замедляют пропускную способность

Эти аппаратные и архитектурные ограничения необходимо учитывать при оптимизации систем хранения данных.

  1. Для ввода-вывода эффективнее использовать модель на основе прерываний.
  2. При использовании оперативной памяти в качестве кэша для жестких дисков снижаются задержки чтения и последовательной записи.
  3. При использовании оперативной памяти в качестве кэша для твердотельных дисков снижается количество аппаратных сбоев и уменьшается время доступа.
  4. Снижение количества устройств между процессором и носителем данных приводит к уменьшению задержек.

Figure 1 – Performance improves as data moves closer to the processor

Рисунок 1. Чем ближе данные к процессору, тем выше производительность

Качественно новое оборудование

Итак, как добиться повышения производительности при снижении задержек? Прежде всего, необходимо рассмотреть оборудование, в особенности плотность данных и требования к электропитанию. Не менее важна возможность убрать промежуточное звено, даже если оно всего одно, и работать напрямую с ЦП.

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

  • Исключение внешнего контроллера (переход от одного промежуточного звена к архитектуре вообще без промежуточных звеньев) с помощью встроенного интерфейса памяти NVMe в процессоре.
  • Исключение необходимости в электропитании для поддержания обновления данных за счет перемещения в постоянную память.
  • Создание новых типов твердотельных накопителей (SSD), включая накопители с технологией Intel Optane™, поддерживающей память 3D XPoint, за счет использования которой можно повысить плотность в 10 раз, а скорость — в 1000 раз по сравнению с памятью NAND.

Figure 2 – Storage performance latency improvement

Рисунок 2. Снижение задержек в системах хранения данных

Как показано на рис. 2, у жестких дисков со скоростью вращения 15 тысяч оборотов в минуту длительность задержки составляет около 2000 микросекунд, с незначительными добавочными задержками контроллера и программного обеспечения.  В твердотельных накопителях отсутствуют задержки, связанные с работой механических частей. Перенос контроллера в ЦП позволил упразднить лишнее промежуточное звено, а программное обеспечение постоянно улучшается. Все эти факторы способствуют значительному снижению задержек.

Преимущества систем хранения данных пользовательского режима с открытым исходным кодом

Усовершенствования сделаны не только в оборудовании. Есть целый ряд соображений в пользу разработки нового поколения систем и архитектур хранения данных в пользовательском пространстве вместо режима ядра.

 

Причина № 1. Повышение надежности, доступности и удобства обслуживания

  • Драйверы пользовательского режима можно перезапускать без перезагрузки компьютера, тогда как для перезапуска любого драйвера режима ядра требуется перезагрузка.
  • Драйверы пользовательского режима позволяют использовать более гибкие средства сбора данных и ведения журналов.

Причина № 2. Простота лицензирования кода пользовательского пространства

  • Пакет Storage Performance Development Kit (SPDK)лицензируется по лицензии BSD (для драйверов NVMe и CBDMA) или по проприетарной лицензии Intel (для набора сетевых решений пользовательского пространства и целевых объектов iSCSI). Код пользовательского пространства можно свободно использовать в проектах без лицензии GPL.

Причина № 3. Эффективность

  • Технические соображения: на обработку прерываний ядра и издержки переключения контекста расходуются ресурсы процессора, тогда как архитектура драйвера опрашиваемого режима NVMe в SPDK работает значительно эффективнее и дает возможность одному ядру процессора обрабатывать миллионы операций ввода-вывода в секунду.
  • Вхождения в буфер быстрого преобразования адреса (TLB) очищаются, а вхождения в кэш удаляются.

Причина № 4. Упрощение архитектуры

  • Использование носителей на основе постоянной памяти с низкими задержками позволяет исключить модули оперативной памяти DIMM с запасным питанием от аккумуляторов.
  • Драйверы пользовательского пространства можно применять напрямую к серверным системам хранения данных и к программно управляемым архитектурам.
  • Поскольку снижаются задержки физических носителей, упраздняется необходимость использования кэша огромного размера в оперативной памяти — такой кэш теперь можно использовать только для самых важных нагрузок.

Выводы

Предоставление разработчикам возможности работать в пользовательском пространстве повышает производительность и упрощает разработку облачных систем хранения данных. Разработчики могут пользоваться всеми возможностями новых технологий постоянной памяти, таких как Intel Optane™. Корпорация Intel применяет высокопроизводительную платформу обработки пакетов с открытым исходным кодом Data Plane Development Kit (DPDK)к среде хранения данных с пакетом Storage Performance Development Kit. Пакет SPDK — это набор драйверов и полная эталонная архитектура хранилища данных, включающая пользовательское пространство Linux для функций, для которых ранее требовалось переключение контекста в ядро.   Пакеты DPDK и SPDK доступны в виде компонентов с открытым исходным кодом.

Справочные материалы

Автор выражает благодарность следующим лицам за вклад в подготовку этой статьи: Джонатану Стерну, Дебре Грэм, Майку Пирсу, Коллину Калбертсону, Виктории Дэвис.

Автор
Тай Ле (Thai Le) — инженер по программному обеспечению (уже более 20 лет работает в корпорации Intel®). Области его работы включают автоматизацию программного обеспечения, анализ производительности и электропитания серверов, облачные вычисления.

Дополнительные сведения об оптимизации компиляторов см. в уведомлении об оптимизации.

Использование устройств: возможности для разработчиков в 2016 году и далее

$
0
0

Автор: Карен Маркус

Недавно специалист по пользовательским интерфейсам корпорации Intel доктор Дария Лои и ее команда провели исследование, чтобы определить, как пользователи в разных странах мира относятся к своим компьютерным устройствам. В ходе исследования, которое получило название "Использование устройств: глобальная перспектива", было установлено, какие устройства являются предпочитаемыми у пользователей, какими устройствами люди пользуются чаще всего, какие устройства используют для определенных задач (и почему) и в чем можно было бы улучшить устройства. В ходе исследования было опрошено 1200 человек из 6 стран мира. Возраст респондентов различался в пределах нескольких десятков лет.

Исследование показало, что хотя такие устройства, как смартфоны, ноутбуки, настольные ПК и планшеты дают пользователям возможность выполнять многие важнейшие задачи как по работе, так и в личной жизни, и у большинства пользователей есть любимое или предпочитаемое устройство (см. рис. 1), все равно еще есть немало областей, где требуются улучшения. В этой статье подробно рассматриваются полученные в ходе исследования факты, а также обсуждаются возможности создания программного обеспечения, которое смогло бы повысить удобство пользователей.

Figure 1. Study responses for favorite device

Рисунок 1.Ответы на вопрос исследования о предпочитаемом устройстве.

Нет единого универсального устройства

Результаты исследования используемых устройств: глобальное исследование показало, что у большинства респондентов (39 %) предпочитаемым устройством является смартфон. За смартфонами следуют ноутбуки (30 %) и настольные ПК (21 %). Но ни одно из этих устройств не обладает интерфейсом, помогающим пользователям выполнять все действия, связанные с работой, личными задачами и развлечениями. Например, смартфоны очень удобны для фотосъемки, прослушивания музыки, участия в социальных сетях и общения с другими, но из-за небольшого размера экрана и низкого (на самом деле или по ощущениям) уровня безопасности они не столь полезны для покупок, управления банковскими счетами, редактирования изображений и электронной почты.

"Смартфон — портативное устройство, поэтому чаще всего люди пользуются именно этими устройствами, — говорит доктор Лои. — Поскольку это предпочитаемое устройство, хотелось бы, чтобы оно было идеальным, но в настоящее время не существует идеального устройства, поэтому люди владеют несколькими разными устройствами. Тем не менее, далеко не все существующие и новые пользователи, особенно молодые или в развивающихся странах, могут позволить себе приобрести несколько устройств, да и не желают носить с собой не одно устройство, а несколько. Поэтому перед нами, разработчиками технологий, встает вопрос: как создать будущее, в котором люди смогут удобно делать все что захотят, не обременяя себя несколькими устройствами? Как помочь пользователям решать все задачи на одном устройстве?"

При попытке сформулировать отчет на этот вопрос разработчикам имеет смысл обратить на те характеристики, которые уже сейчас являются важными для пользователей устройств. Отвечая на вопрос о том, какая характеристика устройств является самой важной, респонденты чаще всего называли операционную систему, затем — производительность, размер экрана, удобство использования и бренд, — именно в этом порядке (см. рис. 2). Лои отмечает, что именно на удобство использования разработчики должны обратить особое внимание: это ключевая характеристика; если пользоваться устройством неудобно, его просто не будут покупать.

Figure 2. Study responses for most important features

Рисунок 2. Ответы на вопрос исследования о наиболее важных характеристиках

Разнообразие устройств

Согласно результатам исследования, для разных функций люди предпочитают использовать разные устройства. Среди этих функций — чтение локально хранящихся книг, журналов и текста; просмотр фотографий, хранящихся как локально, так и в сети; интерактивный чат; интерактивные текстовые платформы; видеочат и видеоконференции; казуальные игры. Для определенного круга задач используются определенные устройства в зависимости от их возможностей.

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

В поездках смартфоны являются предпочитаемым устройством для поиска нужных мест, навигации, фото- и видеосъемки, прослушивания музыки. "Ожидания людей зависят от того, где они находятся, — поясняет Лои. — В зависимости от места люди могут принимать некоторое снижение скорости работы устройств. Ожидания пользователей меняются при изменении контекста. Цель разработчиков — создать приложения, хорошо работающие в любом контексте или способные изменяться таким образом, чтобы предоставлять пользователям нужные возможности всегда, вне зависимости от ситуации".

Смартфоны становятся умнее

Некоторые задачи можно выполнять на разных устройствах, но есть и задачи, которые чаще всего выполняются на одном определенном устройстве. Среди опрошенных 43 % назвали смартфоны в качестве предпочитаемого устройства для повседневных задач, таких как просмотр прогноза погоды, сохранение контактов и использование календаря; 47 % респондентов заявили, что смартфоны лучше всего подходят для поиска нужных мест и навигации; по мнению 62 % пользователей смартфоны — наилучшее устройство для фото- и видеосъемки (см. рис. 3).

Figure 3. Study responses for favorite device for locate and check functions

Рисунок 3.Ответы на вопрос исследования о предпочитаемом устройстве для навигации, поиска и получения новостей

Тем не менее, люди не слишком охотно совершают покупки в интернет-магазинах со своих смартфонов, поскольку чувствуют, что это менее безопасно. Некоторые участники опроса особо упомянули о том, что на смартфоне им не всегда удается увидеть весь экран, а по этой причине они обеспокоены тем, что могут не увидеть кнопку или какой-нибудь другой элемент, о котором им хотелось бы знать, чтобы не сомневаться, что покупка в полной мере соответствует их пожеланиям. "И все же людям хотелось бы выполнять эти задачи на любых устройствах, — отмечает Лои, — и здесь у разработчиков есть возможность создания программного обеспечения и инфраструктуры, позволяющей делать это с полной надежностью и безопасностью. Этот аспект станет особенно важным с учетом того, что корпорации Google и Apple стремятся продвигать свои решения по использованию смартфонов в качестве платежного средства, наподобие банковских карт".

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

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

Производительность ПК — фактор победы

Многие люди всерьез влюблены в свои телефоны, но, несмотря на это, для определенных задач предпочитаемыми устройствами являются все же ноутбуки или моноблоки (см. рис. 4). В частности, 38 % пользователей используют ноутбуки для редактирования мультимедиа, 47 % — для создания и редактирования документов, 36 % — для публикаций в блогах и на веб-сайтах, 41 % — для пользования банковскими услугами и оплаты счетов; 44 % — для просмотра товаров с целью возможной покупки, а 41 % пользователей — для покупки товаров в интернет-магазинах. Лои отмечает, что для всех этих предпочтений важнейшую роль играет размер экрана. "Гораздо удобнее работать с информацией на большом экране, — говорит она. — Кроме того, многие программные продукты либо недоступны для смартфонов, либо стоят недопустимо дорого. Мощная экосистема программного обеспечения, а также преимущества ноутбуков по практичности, физическому размеру и производительности — вот факторы, в силу которых ноутбуки являются предпочитаемым устройством для этих задач".

Figure 4. Study responses for favorite device for online purchasing

Рисунок 4.Ответы на вопрос исследования о предпочитаемом устройстве для покупок в интернет-магазинах

Участники опроса также назвали ноутбуки предпочитаемым устройством для связи и развлечений, в частности: для просмотра видео в Интернете (36 %); для просмотра видео, хранящегося локально (37 %); для отправки, загрузки или передачи мультимедиа (38 %); для работы с электронной почтой (42 %); для голосовой связи через Интернет (VoIP) и других голосовых платформ (35 %, см. рис. 5). "Это области применения, требующие высокой производительности, которой смартфоны пока не обладают. В будущем возможности ПК могут появиться и у более компактных устройств. И вновь, для реализации этой возможности нужна подходящая экосистема, программное обеспечение, промежуточные средства, интерфейсы и инфраструктура — в дополнение к удобным средствам для передачи мультимедиа".

Figure 5. Study responses for favorite device for writing and talking

Рисунок 5. Ответы на вопрос исследования о предпочитаемом устройстве для ввода текста и разговора

Прочие области, в которых респонденты предпочитали мощь и крупные экраны своих ноутбуков: демонстрация презентаций и отчетов (59 %), ресурсоемкие игры (24 % — ноутбуки, 25 % — настольные ПК), просмотр и изучение информации в Интернете 38 %), обучение (47 %), чтение новостей и текста в Интернете (39 %, см. рис. 6). "Некоторые из этих функций, казалось бы, доступны и на смартфонах, но смартфоны обычно гораздо сложнее подключать к другим устройствам (таким как проекторы), чем компьютеры, — замечает Лои, — производительность смартфонов не позволяет запускать на них хоть сколько-нибудь сложные игры; ограниченный размер экрана делает смартфоны непригодными для продолжительной, сосредоточенной многозадачной работы, характерной для изучения информации или обучения".

Figure 6. Study responses for favorite device for reading, learning, and research

Рисунок 6.Ответы на вопрос исследования о предпочитаемом устройстве для чтения и обучения

Мнения о технологиях

Чтобы лучше понять, какие ощущения устройства вызывают у участников опроса, Лои и ее команда поговорили с несколькими респондентами, чтобы получить качественную информацию, способную дополнить количественные данные глобального опроса. Один из важнейших выявленных фактов состоит в том, что люди все сильнее одновременно любят и ненавидят новые технологии. "Люди понимают, что не могут жить без своих устройств, но при этом чувствуют себя рабами своих устройств, — говорит Лои. — Очень часто ощущения описываются таким образом: "я хочу иметь возможность постоянно пользоваться устройствами, чтобы выполнять важные для меня дела, но при этом я хочу, чтобы устройства не маячили перед глазами, когда они не нужны". Например, если пользователь находится на собрании, его смартфон должен учитывать это и отключать входящие звонки. Существует немалый потенциал в области создания машин, способных обучаться поведению пользователей и отключаться, чтобы не мешать в неподходящее время".

"Я жалею, что те времена, когда мы не были круглосуточно на связи, в сети, остались в прошлом". — Арон, возрастная группа старше 20 лет

На положительной стороне диапазона "любовь–ненависть"участники описывали достоинства своих устройств, в том числе следующие: устройства помогают проще выполнять разные задачи в жизни, общаться с другими, взаимодействовать в реальном времени. Но, как отмечает Лои, даже эти положительные стороны устройств можно улучшать еще дальше. "Как можно расширить способы общения с другими людьми, какие новые возможности можно изобрести в дополнение к существующим? — спрашивает Лои. — Какие технические решения можно придумать, чтобы мы ощущалисебя более тесно связанными с другими людьми вне зависимости от физического расстояния?"

"Мне хотелось бы больше общаться с родными, а сейчас мы, кажется, больше разглядываем экраны телефонов, чем разговариваем друг с другом".
— Кэрол, возрастная группа старше 40 лет

Новые технологии вызывают не только одобрение и признание, но и разочарование, и раздражение. Вот некоторые из основных недостатков устройств, на которые жалуются пользователи: слишком быстро расходуется заряд аккумуляторов; устройства работают слишком медленно или "зависают"; устройства подвержены вирусам и утечке конфиденциальных данных; они слишком крупные, чтобы их было действительно удобно с собой носить; они слишком маленькие, чтобы хранить на них всю информацию; устройствами сложно пользоваться. Основная причина раздражения опрошенных — малая мобильность устройств, обусловленная недостаточным временем их автономной работы. "Общество, в котором мы живем, становится все более мобильным, — утверждает Лои. — Это общество полностью опирается на использование мобильных устройств. Но для того, чтобы эти устройства превратились в действительно полезные инструменты, они должны долго работать от аккумулятора. Для большинства респондентов, с которыми я поговорила, необходимость поиска розетки электросети, чтобы зарядить устройство, превратилась уже в навязчивую идею. Это серьезнейшее препятствие, мешающее устройствам быть действительно мобильными и эффективными. В этой области неплохие перспективы есть, помимо прочего, у беспроводной зарядки, но для ее использования должна быть эффективная, надежная и интуитивная экосистема". По словам Лои, пароли — еще одна проблема, требующая решения. В числе других проблем — слишком быстрое изменение технологий; эту проблему можно решить, помогая людям переходить со старых операционных систем и приложений на новые.

"Технологии постоянно меняются, и следовать за ними очень непросто". — Рауль, возрастная группа старше 20 лет

Как же справиться с раздражением? Участники исследования рассказали, в чем технологии могли бы быть полезнее. В частности, технологические решения должны допускать более глубокую индивидуальную подстройку, они должны экономнее расходовать электроэнергию, быть более доступными и повсеместно распространенными, обладать более мощными речевыми функциями и хорошо работать вне зависимости от используемой операционной системы. Людям хочется, чтобы устройства меньше мешали им и меньше действовали на нервы, и могли бы предвидеть определенные потребности пользователя с учетом контекста. "Людям нужен контроль над устройством и возможность выбора, — отмечает Лои. — Еще один важный фактор — простота использования. Удобство работы с приложением — самый важный момент для разработчиков. Если пользователь не может найти какую-либо функцию в приложении, то можно считать, что этой функции там просто нет, и люди не будут покупать такое приложение".

"Мне нужно, чтобы у меня был выбор. Не хочу, чтобы мне указывали, что мне делать". — Фрэнсис, возрастная группа старше 30 лет

Несмотря на раздражение постоянными изменениями, люди с интересом ожидают новых возможностей. Многие участники исследования описывали футуристические функции, которыми могли бы обладать их устройства — как в фильме "Железный человек", по словам некоторых опрошенных. Среди таких возможностей — ввод сообщений не с клавиатуры и не голосом, а с помощью мысли; интерактивные голографические изображения во время чата; сверхчувствительные микрофоны, способные распознавать голосовые команды из любой точки дома. "Идеи и ожидания в отношении будущих технических идей формируются у людей главным образом по социальным сетям и голливудским фильмам, — говорит Лои. — Некоторые просто не понимают, почему эти технологии, относящиеся к области научной (и не очень научной) фантастики, до сих пор не получили широкого распространения. Несмотря на сложность таких технологий, многие ожидают их скорого появления на рынке, во многих случаях — намного раньше, чем это фактически возможно.

"Возможность показывать другим в точности то, что я себе представляю,  скажем, в виде трехмерной голограммы”. — Шила, возрастная группа старше 20 лет

Заключение

За последние годы в области компьютерных технологий пройдено несколько важных этапов, и современные устройства вполне заслуженно нравятся своим пользователям. Тем не менее, есть еще немало областей, в которых удобство устройств можно и нужно повышать. Доктор Лои, специалист корпорации Intel, провела исследование, озаглавленное "Использование устройств: глобальная перспектива". Цель этого исследования состояла в том, чтобы узнать, как люди в разных странах используют свои устройства сейчас, и как они хотели бы использовать их в будущем. В ходе исследования были обозначены следующие области, в которых разработчики могут усовершенствовать свои решения:

  • Упорядочение функциональности, чтобы люди могли выполнять полный круг необходимых задач, нося с собой (и приобретая) меньше устройств.
  • Непрерывное повышение удобства использования.
  • Укрепление безопасности, повышение наглядности работы на смартфонах для покупок в интернет-магазинах.
  • Усовершенствование функций смартфонов (камеры, доступ к музыке) с тем, чтобы можно было использовать смартфоны вместо нескольких специализированных устройств.
  • Реализация возможностей, делающих смартфоны более полезными для обучения.
  • Повышение производительности смартфонов, необходимое для запуска более ресурсоемких приложений; программные пакеты, предназначенные для ПК, должны стать более удобными и доступными для смартфонов.
  • Предоставление пользователям приложений, работающих с учетом контекста.
  • Усовершенствование технологий связи, чтобы люди ощущали себя ближе к своим собеседникам.
  • Продление времени работы устройств от аккумулятора, изобретение новых способов зарядки устройств.
  • Помощь пользователям в переходе со старых приложений и систем на новые.

Самое главное, по мнению доктора Лои, заключается в формировании более продуманной концепции будущего. "Для этого нужно, чтобы все новые разработки опирались на четкое понимание того, что люди делают, чего они хотят, в чем нуждаются, — говорит она. — Работа нашей отрасли должна основываться на четком, подтвержденном данными понимании того, что важно для пользователей".

Об авторе

Карен Маркус (Karen Marcus) — высококлассный маркетинговый и технический писатель с 18-летним стажем. Она создавала описания примеров, брошюры, информационные документы, статьи, тексты для веб-сайтов, сценарии видео и другие материалы для таких компаний, как Intel, IBM, Samsung, HP, Amazon Web Services и Microsoft. Карен прекрасно осведомлена о множестве современных технологий и решений, среди которых: облачные вычисления, корпоративные вычислительные системы, персональные компьютеры, ИТ-аутсорсинг, операционные системы и разработка приложений.

Дополнительные сведения об оптимизации компиляторов см. в нашем уведомлении об оптимизации.

Камера Intel® RealSense™, плата Intel® Edison и JavaScript*

$
0
0

Введение

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

Корпорация Intel разработала технологию Intel® RealSense™, которая включает камеру Intel® RealSense™и пакет Intel® RealSense™ SDK. С помощью этой технологии можно создавать применения, способные распознавать жесты и движение головы, анализировать выражение лица, отделять фон изображения, измерять уровень глубины, распознавать и синтезировать речь и т. д. Представьте, что вы разрабатываете супердатчик, способный обнаруживать и распознавать множество данных. В сочетании с универсальностью комплекта Intel® Edison, используя возможности вывода данных этого комплекта, можно создавать самые разные решения, полезные и развлекательные.

Пакет Intel® RealSense™ SDK поддерживает популярные языки программирования и платформы, такие как C++, C#, Java*, JavaScript*, Processing и Unity*. Это означает, что разработчики могут быстро приступать к работе, используя хорошо знакомую среду программирования.

В статье Питера Ма (Peter Ma) «Использование камеры Intel® RealSense™ 3D с платформой разработки Intel® Edison» приведены два примера приложений на C#. В первом камера Intel® RealSense™ получает входные данные, а для вывода используется плата Intel® Edison. В результате, если сделать определенный жест перед камерой Intel® RealSense™, камера отправит сигнал на плату Intel® Edison, а на плате загорится светодиод.

Во втором примере Питер Ма действует в обратном направлении: плата Intel® Edison используется в качестве входного устройства, а камера Intel® RealSense™ является выходным устройством. Плата Intel® Edison предоставляет данные, поступающие с датчика. Мы получаем эти данные с камеры Intel® RealSense™ в виде синтезированного голоса.

Мне захотелось создать что-то близкое к проекту Питера Ма, но с использованием JavaScript* вместо C#. Я использовала Intel® RealSense™ SDK для чтения и отправки данных жестов руки на сервер node.js, который затем отправляет эти данные на плату Intel® Edison для включения динамика и светодиода, подключенных к этой плате.

О проекте

Этот проект написан на JavaScript*. Если вас интересует использование только простейших жестов, то модуль с нужным алгоритмом уже есть в составе Intel® RealSense™ SDK. В нем вы найдете все необходимое.

Оборудование

Требования:

Плата Intel®Edisonс коммутационной платой Arduino*

Плата Intel® Edison — это недорогая универсальная компьютерная платформа. На ней используется «система на кристалле» с двухъядерным процессором Intel® Atom™, выполненным по 22-микронной технологии и работающим с частотой 500 МГц. Эта плата отличается компактным размером, она поддерживает 40 регистров ввода-вывода GPIO и включает 1 ГБ оперативной памяти LPDDR3, 4 ГБ флеш-памяти EMMC для хранения данных, двухдиапазонный адаптер Wi-Fi и адаптер Bluetooth.

На плате используется ядро Linux*, она совместима с Arduino, поэтому можно запускать Arduino в качестве программ Linux*.


Рисунок 1. Плата Intel®Edisonв комплекте с коммутационной платой

Комплект Grove Starter Kit Plus — Intel® XDK IoT Edition

Комплект Grove Starter Kit Plus — Intel® XDK IoT Edition Intel®разработан для плат Intel® Galileo 2-го поколения, но при использовании коммутационной платы он полностью совместим с платой Intel® Edison.

Комплект содержит датчики, приводы и экраны, например сенсорный датчик, датчик света и датчик звука, а также ЖК-экран, как показано на рис. 2. Это недорогое удобное решение для разработки проектов из области «Интернета вещей».

Приобрести комплект Grove Starter Kit Plus можно здесь: 

 


Рисунок 2. Комплект Grove* Starter Kit Plus — Intel® XDK IoT Edition

Камера Intel®RealSense

Камера Intel® RealSense™ предназначена для взаимодействия с играми, для развлечений, фотосъемки и создания содержимого. Такие камеры встраиваются в устройства или выпускаются в виде отдельных периферийных устройств. Для использования камеры требуется порт USB 3.0, процессор Intel Core 4-го поколения и 8 ГБ места на жестком диске.

Камера (рис. 3) снимает полноцветное изображение с разрешением 1080p и оборудована датчиком глубины, что позволяет получать трехмерное изображение.

Рисунок 3. Камера Intel®RealSense

Здесьможно приобрести полный комплект разработки, в состав которого входит и камера.

Сервер GNU/Linux*

Использование сервера GNU/Linux* не представляет затруднений. Можно использовать старый настольный компьютер или ноутбук или разместить сервер в облаке. Я использовала облачный сервер с сервером Ubuntu*. Если у вас есть разные дистрибутивы Linux*, используйте наиболее удобный для вас.

Программное обеспечение

Перед началом разработки проекта убедитесь, что в системе установлено следующее программное обеспечение. Загрузить программное обеспечение можно по приведенным ссылкам.

Настройка камеры Intel® RealSense™

Чтобы настроить камеру Intel® RealSense™ (F200), подключите ее к порту USB 3.0 и установите драйвер камеры. Перейдите в папку установки Intel® RealSense™ SDK и откройте образец JavaScript* в браузере:

Install_Location\RSSDK\framework\JavaScript\FF_HandsViewer\FF_HandsViewer.html

После открытия файла сценарий определяет используемую вами платформу. Пока сценарий занимается определением платформы, щелкните ссылку в веб-браузере, чтобы установить среду выполнения веб-приложений Intel® RealSense™ SDK.

По завершении установки перезапустите веб-браузер и снова откройте этот же файл. Чтобы убедиться в успешности установки, достаточно поднять руку перед камерой. В веб-браузере должна быть показана визуализация данных жеста руки.

Настройка жестов

Первая строка кода, включающая жесты, выглядит так: 

{"timeStamp":130840014702794340 ,"handId": 4,"state": 0,"frameNumber":1986 ,"name":"spreadfinger"
}

Этот код отправляет "name":"spreadfingers"на сервер для обработки.

Теперь мы напишем код JavaScript*, чтобы передавать данные жестов от камеры Intel® RealSense™ на плату Intel® Edison через сервер node.js.

Работа с JavaScript*

Итак, мы добрались до собственно программирования. Рекомендую сначала переместить всю папку, поскольку при установке в расположение по умолчанию невозможно перезаписать исходную папку.

Скопируйте папку FF_HandsViewerиз этого расположения в какое-нибудь другое место. Расположение папки:

\install_Location\RSSDK\framework\JavaScript\FF_HandsViewer\

Позже вы сможете создать собственную папку проекта, чтобы все было под контролем.

Теперь скопируйте файл realsense.jsиз указанного ниже пути и вставьте его в папку FF_HandsViewer:

Install_Location\RSSDK\framework\common\JavaScript

Чтобы все упростить, создадим файл с именем edisonconnect.js. Этот файл будет принимать данные жестов от камеры Intel® RealSense™ и отправлять их на сервер node.js. Помните, что нужно изменить IP для переменной socket, используя IP-адрес сервера node.js:

// var socket = io ('change this to IP node.js server');

var socket = io('http://192.168.1.9:1337');

function edisonconnect(data){
  console.log(date.name);
  socket.emit('realsense_signal',data);
}

Теперь самый важный этап: нужно дать команду файлу sample.jsна создание данных жестов и запустить поток, чтобы перехватывать эти данные жестов и передавать их в edisonconnect.js. Следить за работой ЦП нет необходимости, поскольку компиляция практически не повлияет ни на кадровую скорость, ни на использование оперативной памяти.

// retrieve the fired gestures
for (g = 0; g < data.firedGestureData.length; g++){
  $('#gestures_status').text('Gesture: ' + JSON.stringify(data.firedGestureData[g]));

  // add script start - passing gesture data to edisonconnect.js
	edisonconnect(data.firedGestureData[g]);
  // add script end
}

После запуска приведенной выше функции и ее вызова для создания данных жестов показанный ниже код завершает основную задачу программы JavaScript*.  После этого нужно заменить путь к файлу realsense.js.

Необходимо сделать следующее: укажите ссылки на файлы socket.ioи edisonconnect.js

<!DOCTYPE html><html><head><title> Intel&reg; RealSense&trade; SDK JavaScript* Sample</title><script src=”https://aubahn.s3.amazonaws.com/autobahnjs/latest/autobahn.min.jgz” </script><script src=”https://promisejs.org/polyfills/promise-6.1.0.js” </script><script src=”https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js” </script><script src=”https://common/JavaScript/realsense.js” </script><script src=”sample.js” </script><script src=”three.js” </script><!-- add script start --><script src=”https://cdn.socket.io/socket.io-1.3.5.js” </script><script src=”edisonconnect.js” </script><!-- add script end → <link rel=”stylesheet” type=”text/css” href=”style.css”></head><body>

Этот код взят из образца в SDK. Он немного переработан для упрощения и удобочитаемости. Этот код отправил данные жестов на сервер. В результате пакет Intel® RealSense™ SDK успешно распознает жест и готов отправить его на сервер.

Настройка сервера

Мы используем сервер GNU/Linux*. Я использую сервер Ubuntu* в качестве ОС, но можно использовать и любой другой дистрибутив GNU/Linux*. Установку сервера мы описывать не будем, поскольку в Интернете можно с легкостью найти все необходимые инструкции.

Войдите через SSH от имени пользователя root, чтобы настроить сервер.

Поскольку сервер только что установлен, нужно обновить список хранилищ и обновить сам сервер. Для этого я использую стандартную команду дистрибутива Ubuntu. Вы можете использовать схожую команду в зависимости от используемого дистрибутива GNU/Linux*.

# apt-get update && apt-get upgrade

После обновления списка хранилищ нужно установить node.js.

# apt-getinstallnodejs

Также нужно установить диспетчер пакетов npm.

# apt-getinstallnpm

И наконец, нужно установить socket.ioexpressиз диспетчера пакетов npm.

# npminstallsocket.ioexpress

Не забудьте создать файлы server.jsи index.html.

# touchserver.jsindex.html

Отредактируйте файл server.js, используя любой текстовый редактор, например vim или nano #.

vimserver.js

Запишите этот код:

var express   = require("express");
var app   	= express();
var port  	= 1337;

app.use(express.static(__dirname + '/'));
var io = require('socket.io').listen(app.listen(port));
console.log("Listening on port " + port);

io.on('connection', function(socket){'use strict';
  console.log('a user connected from ' + socket.request.connection.remoteAddress);

	// Check realsense signal
	socket.on('realsense_signal', function(data){
  	socket.broadcast.emit('realsense_signal',data);
  	console.log('Hand Signal: ' + data.name);
	});
  socket.on('disconnect',function(){
	console.log('user disconnected');
  });
});

varport = 1337; означает, что доступный порт назначен порту 1337. console.log("Listeningonport" + port) ; указывает, были ли получены данные из JavaScript*. Основной код — socket.broadcast.emit('realsense_signal',data);это означает, что данные получены и готовы к вещанию на все прослушивающие порты и клиенты.

Осталось лишь запустить файл server.jsс узлом. Если отображается надпись listeningatport 1337, как показано на приведенном ниже снимке экрана, то все работает правильно.
# node server.js

root@edison:~# node server.js
Listening on port 1337
events.js:85

Настройка платы Intel® Edison

Развернуть комплект The Intel® Edison SDK очень просто. См следующую документацию:

Пора передать код на плату the Intel® Edison. Этот код подключается к серверу и прослушивает вещание с сервера. Он аналогичен коду другого этапа, на котором мы прослушиваем вещание данных с сервера. При получении каких-либо данных жестов на плате Intel® Edison включаются и выключаются цифровые контакты.

Откройте Intel® XDK IoT Edition и создайте новый проект на основе шаблона DigitalWrite, как показано на приведенном ниже снимке экрана.

Отредактируйте строку 9 в файле package.json, добавив зависимости socket.io-client. Если этот файл пуст, найдите папку, в которую он был установлен. Добавление зависимостей приведет к установке клиента socketioclient, если на плате Intel® Edison не было клиента.

"dependencies": {"socket.io-client":"latest" // add this script
}

Найдите файл main.js. Нужно установить подключение к серверу, чтобы убедиться, что сервер готов к прослушиванию. Затем нужно проверить, существуют ли данные жестов с именем spreadfingersв этом файле. В этом случае цифровые контакты 2 и 8 будут переключены в состояние 1 (включено) и обратно.
Измените IP-адрес сервера. Если вы хотите изменить контакты, то не забудьте изменить и mraa.Gpio(selectedpins).

var mraa  = require("mraa");

var pins2 = new mraa.Gpio(2);
	pins2.dir(mraa.DIR_OUT);

var pins8 = new mraa.Gpio(8);
	pins8.dir(mraa.DIR_OUT);

var socket = require('socket.io-client')('http://192.168.1.9:1337');

socket.on('connect', function(){
  console.log('i am connected');
});

socket.on('realsense_signal', function(data){
  console.log('Hand Signal: ' + data.name);
  if(data.name=='spreadfingers'){
	pins2.write(1);
	pins8.write(1);
  } else {
	pins2.write(0);
	pins8.write(0);
  }
});

socket.on('disconnect', function(){
  console.log('i am not connected');
});

Выберите Install/Build, затем выберите Run, убедившись, что плата Intel® Edison подключена к компьютеру.

Теперь убедитесь, что сервер запущен, а компьютер с камерой Intel® Realsense и платой Intel® Edison подключены к Интернету.

Заключение

В этом проекте используется технология Intel® RealSense™. Пример сценария JavaScript* был изменен, чтобы отправлять полученные данные жестов на сервер Node.js. Но этот проект — лишь начало.

Он очень прост в реализации. Сервер передает данные жестов на любые прослушивающие клиенты. Плата Intel® Edison, на которую установлен клиент socket.io-client, прослушивает вещание с сервера. Поэтому при получении данных жестов с именем spreadfingersцифровые контакты будут переключены из состояния 0 в состояние 1 и обратно.

Возможности поистине безграничны. Камера Intel RealSense отличается небольшим весом, удобством установки и использования. Intel® Edison — это мощный встраиваемый ПК. Объединение платы Intel® Edison и камеры Intel® RealSense™ с JavaScript* позволяет получить очень компактное, простое с точки зрения написания кода и удобное в использовании устройство «Интернета вещей». Можно создать что-нибудь полезное и приятное.

Об авторе

Аулиа Факих (Aulia Faqih) — специалист c квалификацией Intel® Software Innovator

Intel® RealSense Innovator, работает в индонезийском городе Джокьякарта и читает лекции в UIN Sunan Kalijaga. Аулиа обожает ставить различные эксперименты с Galileo/Edison, веб-решениями и гаджетами.

Подключаемый модуль Intel® RealSense™ SDK для Unreal Engine* 4

$
0
0

Загрузить PDF

Загрузить пример кода

Введение

Эта статья поможет разработчикам ознакомиться с возможностями подключаемого модуля RealSense для Unreal Engine 4, понять его архитектуру и устройство. Этот подключаемый модуль был разработан в корпорации Intel для поддержки пакета Intel® RealSense™ SDK. Эта статья предназначена для опытных разработчиков, использующих UE4, а также для разработчиков, знакомых с технологией RealSense. Если вы хотите приступить к изучению UE4, ознакомьтесь с документацией и учебными материалами по адресу https://wiki.unrealengine.com/Main_Page.

Также можно загрузить Epic Games Launcher здесьи просмотреть образцы проектов на вкладке Learn.

Дополнительные сведения о технологии RealSense и пакете Intel® RealSense™ SDK см. по адресу https://software.intel.com/ru-ru/realsense/home.

Базовые сведения и область этой работы

Unreal Engine 4 — это четвертое поколение игрового движка компании Epic Games. Впервые он был представлен ограниченной аудитории в 2012 году на конференции Game Developers Conference. В 2014 году уже все желающие разработчики могли получить исходный код этого движка, оплачивая небольшую ежемесячную подписку. Плата за подписку была отменена в 2015 году, теперь исходный код всего движка доступен для всех разработчиков бесплатно.

Исходный код Unreal Engine написан на C++. В версии UE4 разработчики Epic впервые применили визуальные сценарии Blueprint вместо использовавшейся в UE3 системы сценариев Kismet. На рис. 1 показан пример сценария Blueprint.

Рисунок 1. Пример сценария Blueprintв UnrealEngine* 4

Разработчики могут создавать узлы Blueprint для событий, функций, переменных, макросов и т. д. и увязывать их вместе с помощью логических цепочек процессов. Благодаря сценариям Blueprint упрощается работа начинающих разработчиков, обладающих ограниченным опытом программирования, и обеспечивается исключительно быстрое создание прототипов.

Многие игры на движке UE4 реализованы с помощью сочетания программного кода C++ и сценариев Blueprint. Визуальные сценарии позволяют управлять анимационными изображениями, определять сложные деревья поведения искусственного интеллекта и реализовать любые виды игровой логики.

Подключаемый модуль Intel RealSense SDK

Пакет Intel RealSense SDK изначально написан на C++, что дает разработчикам удобную возможность доступа к функциям SDK из кода игр, также написанных на C++. Описываемый подключаемый модуль расширяет возможности разработки в UE4, предоставляя доступ к функциональности SDK посредством сценариев Blueprint.

На момент написания этой статьи подключаемый модуль официально поддерживал следующие функции:

  • Передача необработанного цветного изображения и изображения глубины с камеры.
  • Трехмерное сканирование лиц и объектов.

Также ведется работа о реализации поддержки еще двух компонентов:

  • Отслеживание движений головы.
  • Восприятие сцены.

Конечная цель подключаемого модуля — поддержка всех функций и возможностей полной версии Intel RealSense SDK, применимых к играм. Полный список функций RealSense SDK с упорядочением по камерам и по степени готовности см. в заметках к выпуску RealSense SDK по этому адресу: https://software.intel.com/ru-ru/intel-realsense-sdk/download

Исходный код подключаемого модуля доступен здесь: https://github.com/GameTechDev/UE4RealSensePlugin.

В примере проекта есть карта, предназначенная для демонстрации каждой из возможностей подключаемого модуля; сценарии с комментариями описывают предполагаемое использование компонентов RealSense.

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

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

 

Компоненты RealSense

В этом разделе приводится более подробное описание каждого из компонентов RealSense.

Компоненты UE4

В Unreal Engine предусмотрен особый тип объекта, называемый компонентом. Его назначение — присоединение к другим объектам. Компоненты обычно довольно компактны и автономны, они предоставляют ограниченный набор функций объектам, к которым они присоединены. Их можно присоединять практически к любым вообразимым объектам, включая персонажи игрока, статические объекты, транспортные средства, источники света и элементы интерфейса. Назначение компонентов в том, чтобы предоставлять схожую функциональность несхожим классам объектов.

Чтобы получить представление о широте возможностей компонентов, рассмотрим для примера компонент Scene, применяющий преобразование к объекту, к которому он присоединен. Преобразование — это применение расположения, поворота и масштаба к какому-либо объекту. С помощью преобразования разработчик может разместить объект в каком-либо месте игрового мира. Данный компонент позволяет очень просто добавлять преобразование к чему угодно, даже к свету и звукам.

Подключаемый модуль RealSense устроен в виде набора компонентов, каждый из которых предоставляет доступ к определенным функциям RealSense SDK. Например, компонент Camera Streams предоставляет разработчику доступ к потоку цветного изображения и потоку глубины, передающимся с камеры. В редакторе UE4 список компонентов находится в раскрывающемся меню AddComponent (Добавить компонент) в окне Components (Компоненты) в категории RealSense, как показано на рис. 2.

Рисунок 2. Компоненты подключаемого модуля RealSense в окне Componentsредактора Unreal Engine* 4

Компонент RealSense

Этот компонент является абстрактным родительским классом всех прочих компонентов RealSense. Он предоставляет общую функциональность, необходимую каждому компоненту, но его самого невозможно присоединить к какому-либо объекту в Unreal.

Данные, предоставляемые этим классом, включают следующие (рис. 3).

float ColorHorizontalFOV; // Поле зрение цветной камеры по горизонтали
float ColorVerticalFOV; // Поле зрения цветной камеры по вертикали
float DepthHorizontalFOV; // Поле зрения камеры глубины по горизонтали
float DepthVerticalFOV; // Поле зрения камеры глубины по вертикали
ECameraModel CameraModel; // Модель подключенной камеры: F200, R200 или SR300
FString CameraFirmware; // Версия микропрограммы подключенной камеры

Рисунок 3. Члены-переменные компонента RealSense

Компонент RealSense также предоставляет следующие функции (рис. 4).

void StartCamera(); // Включение камеры RealSense
void StopCamera(); // Включение камеры RealSense
 
bool IsCameraRunning(); // Возвращает значение true, если камера работает
 
// Получение и установка разрешения цветной камеры 
FStreamResolution GetColorCameraResolution();
virtual void SetColorCameraResolution(EColorResolution);
 
// Получение и установка разрешения камеры глубины
FStreamResolution GetDepthCameraResolution();
virtual void SetDepthCameraResolution(EDepthResolution);
 
// Возвращает значение true, если разрешения входного изображения являются допустимым набором.
bool IsStreamSetValid(EColorResolution, EDepthResolution);

Рисунок 4. Члены-функции компонента RealSense

Компонент Camera Streams

Этот компонент предоставляет доступ к необработанному цветному изображению и данным глубины с камеры Intel RealSense, а также удобные объекты Texture для отображения этих изображений.

Данные, предоставляемые этим классом, включают следующие (рис. 5).

TArray<FSimpleColor> ColorBuffer; // Массив 32-разрядных значений цвета (RGBA)
TArray<int32> DepthBuffer; // Массив 16-разрядных значений глубины (в миллиметрах)
UTexture2D* ColorTexture; // Размер равен разрешению цветной камеры.
UTexture2D* DepthTexture; // Размер равен разрешению камеры глубины.

Рисунок 5. Члены-переменные компонента CameraStreams

Компонент Camera Streams также предоставляет следующие функции, переопределяемые из компонента RealSense:

 
// Переопределяет функцию компонента RealSense, инициализирует ColorBuffer и ColorTexture с нужным размером.
virtual void SetColorCameraResolution(EColorResolution) override;
 
// Переопределяет функцию компонента RealSense, инициализирует DepthBuffer и DepthTexture с нужным размером.
virtual void SetDepthCameraResolution(EDepthResolution) override;

Существует небольшая библиотека вспомогательных функций, она называется RealSense Utilities. Одна из таких функций принимает в качестве входных данных буфер цвета (объект Color Buffer) и цветовую текстуру (объект Color Texture) и заполняет эту текстуру данными из буфера. Также существует функция сравнения, работающая с буфером глубины (объект Depth Buffer) и текстурой глубины (объект Depth Texture). Использование этой функции показано на рис. 6.

Рисунок 6. Пример использования функции ColorBuffertoTexture

Посмотрите это краткое учебное руководство, чтобы узнать, как использовать компонент Camera Streams подключаемого модуля RealSense, чтобы получить доступ к потоку цветного изображения с камеры и вывести это изображение на экран.

Компонент Scan 3D

Этот компонент предоставляет доступ к промежуточному модулю трехмерного сканирования в Intel RealSense SDK. В настоящее время подключаемый модуль поддерживает сканирование лиц и объектов, но не поддерживает вывод текстур, выводятся только цвета вертексов.

Данные, предоставляемые этим классом, включают следующие (рис. 7).

 
TArray<FSimpleColor> ScanBuffer; // Массив 32-разрядных значений цвета (RGBA), представляющий предварительный просмотр изображения, полученного от промежуточного модуля трехмерного сканирования.
UTexture2D* ScanTexture; // Размер равен размеру ScanBuffer
 
TArray<FVector> Vertices; // Массив структур Vector3, соответствующих вершинам трехмерной модели
TArray<int32> Triangles; // Массив индексов вертексов, соответствующих треугольникам
TArray<FColor> Colors; // Массив цветов, соответствующих цветам вертексов

Рисунок 7. Члены-переменные компонента Scan 3D

Компонент Scan 3D также предоставляет следующие функции (рис. 8).

// Устанавливает режим сканирования (съемка лица или съемка объектов) и флаг, указывающий, следует ли создать полную трехмерную модель 
void ConfigureScanning(EScan3DMode, bool);
 
void StartScanning(); // Запуск модуля сканирования
void StopScanning(); // Остановка модуля сканирования
void ResetScanning(); // Сброс модуля сканирования
bool IsScanning();// Возвращает значение true, если модуль сканирования запущен
 
void SaveScan(FString); // Сохранить результат сканирования в OBJ-файл с указанным именем файла.
void LoadScan(FString); // Загрузить результат сканирования из указанного OBJ-файла

Рисунок 8. Члены-функции компонента Scan 3D

И наконец, компонент Scan 3D предоставляет одно событие Blueprint (рис. 9).

OnScanComplete(); // Переключается, когда модуль сканирования завершает сохранение

Рисунок 9. Узел события BlueprintOnScanComplete

Функция SaveScan()дает модулю сканирования команду на сохранение с немедленным возвратом после этого. Несколько позже (в новом кадре камеры) поток подключаемого модуля RealSense выполнит операцию сохранения. Разработчики должны использовать событие OnScanComplete()для получения уведомления о том, что сохранение при сканировании завершено.

Архитектура

RealSense Session Manager

Когда в UE4 к объекту присоединяется компонент, этот объект получает новый экземпляр этого класса компонентов. Можно создать множество экземпляров одного и того же класса компонентов и присоединить их к множеству объектов в рамках одного проекта. Но для компонентов RealSense из-за этого возникает проблема. Дело в том, что в системе существует всего одна камера Intel® RealSense™, которой необходимо управлять разработчику. Но поскольку можно создавать множество экземпляров одного и того же класса компонентов, каждый экземпляр компонента RealSense будет получать свою собственную копию данных с камеры.

Для решения этой проблемы в подключаемом модуле RealSense используется объект RealSense Session Manager. Это одноэлементный класс, экземпляр которого автоматически создается при добавлении первого компонента RealSense к какому-либо объекту в игре. Все последующие экземпляры компонента RealSense получают ссылку на RealSense Session Manager при их инициализации. RealSense Session Manager является владельцем главной копии всех данных Intel RealSense SDK. Каждый компонент RealSense прочитывает данные из RealSense Session Manager и записывает данные в него.

Многопоточность

RealSense Session Manager отвечает за управление выделенным потоком подключаемого модуля RealSense. Этот поток обеспечивает работу модулей RealSense SDK с тем, чтобы в игре использовались классы компонента RealSense, основанные на возможностях SDK. Этот поток находится там, где работает цикл AcquireFrame() / ReleaseFrame() SDK. Все задействованные модули обрабатывают полученные кадры.

RealSense Session Manager использует тройной буфер для управления обменом данными между потоком подключаемого модуля RealSense и основным потоком игры UE4. Поток подключаемого модуля RealSense записывает все новые данные в фоновый буфер. После вызова ReleaseFrame()фоновый буфер обменивается данными со средним буфером, заблокированным с помощью взаимоисключающих блокировок (мьютексов). После этого в каждом такте игрового потока кадр переднего плана обменивается со средним буфером, предоставляя свежие данные в Session Manager и во все компоненты RealSense.

Заключение

Подключаемый модуль RealSense предоставляет разработчикам, использующим UE4, простой и удобный интерфейс к Intel RealSense SDK. Возможности пакета SDK становятся доступными для системы сценариев Blueprint, что существенно ускоряет разработку. Благодаря архитектуре на основе набора компонентов разработчики могут добавлять возможности трехмерной съемки практически к любым объектам в игре.

Об авторе

Джефри Дуглас (Geoffrey Douglas) — инженер по разработке игр в подразделении Developer Relations корпорации Intel.

Дополнительные сведения об оптимизации компиляторов см. в уведомлении об оптимизации.

 

Управление роботизированной рукой с помощью камер Intel® RealSense™

$
0
0

Аннотация

Роботизированная рука Roy компании Roemotion*была создана в результате успешно профинансированного проекта на портале Kickstarter, начатого в 2012 году. Описание гласило: «Проект создания движущегося персонажа размером с человека с использованием только механических деталей, полученных способом лазерной резки, и сервоприводов, доступных в широкой продаже в магазинах товаров для хобби и моделирования». В этом эксперименте с помощью пакета Intel® RealSense™ SDK для Windows*было разработано программное обеспечение для управления рукой Roy. Для управления используются API-интерфейсы отслеживания рук, доступные в составе SDK (рис. 1).

Figure 1. Robotic hand control software.

Рисунок 1.Программа для управления роботизированной рукой

Код для этого проекта был разработан на C#/XAML с помощью Microsoft Visual Studio* Community 2015. Программное обеспечение может использовать камеры Intel RealSense F200и SR300 (скоро будет доступна). Чтобы увидеть роботизированную руку, управляемую программным обеспечением, в действии, посмотрите следующее видео на сайте YouTube*: https://youtu.be/VQ93jw4Aocg

О руке Roy

Набор для сборки руки Roy в настоящее время можно приобрести на веб-сайтекомпании Roemotion, Inc. в виде комплекта для сборки. Комплект включает:

  • детали, изготовленные методом лазерной резки;
  • все необходимые крепежные элементы;
  • 8 сервоприводов (таких же, какие используются в управляемых моделях);
  • 6 удлинительных кабелей для сервоприводов.

Как указано на веб-сайте Roemotion, этот комплект не включает электронику для управления. Это обусловлено тем, что изначально смысл проекта заключался в предоставлении людям интересных механических систем для использования с любыми контроллерами. В самом эксперименте используется сторонний сервоконтроллер для управления моторами в роботизированной руке (рис. 2).

Figure 2. Roy robotic arm.

Рисунок 2. Роботизированная рука Roy

В руке установлено 6 сервомоторов: по одному для указательного пальца, среднего пальца, безымянного пальца и мизинца и два для большого пальца. (Примечание. Еще два сервомотора установлены в основании руки для управления движением запястья, но в этом эксперименте мы ими не управляем.)

API-интерфейсы отслеживания рук в Intel® RealSense™ SDK

Как указано в документациик Intel RealSense SDK, модуль отслеживания рук предоставляет трехмерное отслеживание движения рук в реальном времени и может отслеживать одну или две руки, предоставляя данные о точном расположении всех суставов. В рамках этого эксперимента по управлению устройством в реальном времени особый интерес для нас представляют значения сгиба пальцев, полученные с помощью вызовов метода QueryFingerData().

Электроника для управления

В этом эксперименте мы использовали 6-канальный USB-сервоконтроллер Pololu Micro Maestro* (рис. 3) для управления шестью моторами, установленными в руку Roy. Это устройство включает достаточно сложный SDK для разработки управляющих приложений, предназначенных для разных платформ, с использованием разных языков программирования.

Figure 3. Pololu Micro Maestro* servo controller.

Рисунок 3.Сервоконтроллер Pololu Micro Maestro*

Настройка сервоконтроллера

Перед разработкой собственного программного обеспечения для непосредственного управления роботизированной рукой в этом эксперименте сначала нужно было понять диапазон движения каждого пальца с точки зрения параметров управления сервомоторами. В усовершенствованных роботизированных сервомеханизмах со встроенными контроллерами можно опросить код положения перед применением движущего момента. В отличие от таких систем в руке Roy следует подавать электроэнергию на моторы с большой осторожностью, чтобы избежать слишком резких и быстрых движений, из-за которых могут погнуться пальцы и повредиться шестерни.

К счастью, в состав пакета Pololu Micro Maestro SDK входит приложение Control Center, с помощью которого пользователь может настраивать параметры на уровне микропрограммы и сохранять их во флеш-память на плате контроллера. Параметры, определенные опытным путем для этого приложения, показаны на рис. 4.

Figure 4. Pololu Maestro Control Center app.

Рисунок 4.Приложение Pololu Maestro Control Center

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

Еще один важный параметр в данном случае называется On startup or error. Благодаря ему все пальцы по умолчанию (и в случае ошибок) занимают выпрямленное положение, чем исключается возможность зацепления большого и указательного пальцев, если они были согнуты.

Еще два параметра, на которые следует обратить внимание, — параметры Speed и Acceleration, управляющие скоростью и ускорением. С помощью этих параметров можно делать движение более плавным на уровне микропрограммы. Такой подход предпочтительнее, чем высокоуровневые алгоритмы фильтрации, из-за которых увеличиваются задержки и повышается нагрузка на основное программное приложение.

Примечание. В более совершенных роботизированных сервомеханизмах со встроенными контроллерами часто применяется пропорционально-интегрально-дифференциальный алгоритм (ПИД-алгоритм). Он позволяет записывать параметры в микропрограмму во флеш-памяти для тонкой настройки обратной связи на как можно более низком уровне (т. е. как можно ближе к оборудованию), чтобы обеспечить плавное изменение режимов работы моторов, не нагружая при этом высокоуровневое программное обеспечение.

Собственная программа для управления

В этом эксперименте мы разработали собственную программу (рис. 5), исполь­зующую множество функций отслеживания рук, доступных в образцах кода в SDK.

Figure 5. Custom Control Software.

Рисунок 5.Собственная программа для управления

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

  • Данные оповещений.
  • Данные о сгибании.
  • Данные масштаба.

Данные оповещений

Оповещения — самая важная информация для отслеживания в приложении, управляющем устройством (таким как в данном случае роботизированная рука) в реальном времени. Очень важно понимать (и контролировать!), как поведет себя устройство, когда заданные значения окажутся недоступными или недостоверными.

В этом эксперименте приложение отслеживает следующие данные оповещений:

  • Рука обнаружена.
  • Рука откалибрована.
  • Рука находится внутри границ.

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

Как показано в приведенном ниже фрагменте кода, приложение циклически получает количество сработавших оповещений и задает три логические переменные: detectionStatusOk, calibrationStatusOkи borderStatusOk (обратите внимание, что handOutput является экземпляром PXCMHandData).

for (int i = 0; i < handOutput.QueryFiredAlertsNumber(); i++)
{
  PXCMHandData.AlertData alertData;
  if (handOutput.QueryFiredAlertData(i, out alertData) != 
         pxcmStatus.PXCM_STATUS_NO_ERROR) { continue; }
 
  switch (alertData.label)
  {
         case PXCMHandData.AlertType.ALERT_HAND_DETECTED:
               detectionAlert = "Hand Detected";
               detectionStatusOk = true;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_NOT_DETECTED:
               detectionAlert = "Hand Not Detected";
               detectionStatusOk = false;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_CALIBRATED:
               calibrationAlert = "Hand Calibrated";
               calibrationStatusOk = true;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_NOT_CALIBRATED:
               calibrationAlert = "Hand Not Calibrated";
               calibrationStatusOk = false;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_INSIDE_BORDERS:
               bordersAlert = "Hand Inside Borders";
               borderStatusOk = true;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_OUT_OF_BORDERS:
               bordersAlert = "Hand Out Of Borders";
               borderStatusOk = false;
               break;
  }
}

Перед любой попыткой программы управлять сервомеханизмами руки проводится проверка: все три переменные, то есть detectionStatusOk, calibrationStatusOkи borderStatusOk, должны иметь значение True. Если в любой момент времени какой-либо из этих трех флагов получает значение False, то все пальцы переводятся в положение Open по умолчанию для безопасности.

Данные о сгибании

Программа, разработанная в ходе этого эксперимента, вызывает метод QueryFingerData(), который возвращает значение сгиба пальца и радиус кончика пальца. Значение сгиба может составлять от 0 (палец полностью согнут) до 100 (палец выпрямлен).

Приложение получает данные о сгибании каждого пальца в цикле получения и высвобождения кадра, как показано в следующем фрагменте кода (где handData является экземпляром PXCMHandData.IHand).

PXCMHandData.FingerData fingerData;
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_THUMB, out fingerData);
thumbFoldeness = fingerData.foldedness;
lblThumbFold.Content = string.Format("Thumb Fold: {0}", thumbFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_INDEX, out fingerData);
indexFoldeness = fingerData.foldedness;
lblIndexFold.Content = string.Format("Index Fold: {0}", indexFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_MIDDLE, out fingerData);
middleFoldeness = fingerData.foldedness;
lblMiddleFold.Content = string.Format("Middle Fold: {0}", middleFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_RING, out fingerData);
ringFoldeness = fingerData.foldedness;
lblRingFold.Content = string.Format("Ring Fold: {0}", ringFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_PINKY, out fingerData);
pinkyFoldeness = fingerData.foldedness;
lblPinkyFold.Content = string.Format("Pinky Fold: {0}", pinkyFoldeness);

 

 

Данные масштаба

После получения данных о сгибании каждого из пальцев руки пользователя происходит обработка уравнений масштаба, чтобы сопоставить полученные значения с полномасштабными диапазонами движения каждого роботизированного пальца. Все полномасштабные значения (т. е. длительность контрольного импульса в миллисекундах, необходимая для перемещения пальца либо в полностью выпрямленное, либо в полностью согнутое положение) определены в виде констант в классе servo.cs.

// Index finger
public const int INDEX_OPEN = 1808;
public const int INDEX_CLOSED = 800;
public const int INDEX_DEFAULT = 1750;
.
.
.

Индивидуальные константы определяются для каждого пальца роботизированной руки, они сопоставляются с параметрами положений Min и Max сервопривода, которые были записаны во флеш-память платы контроллера Micro Maestro (рис. 4). Аналогичным образом в программе определяется и полномасштабное значение для диапазона данных сгиба пальцев.

int fingerMin = 0;
int fingerMax = 100;

Поскольку диапазон сгиба пальцев одинаков для всех пальцев (т. е. от 0 до 100), достаточно задать диапазон только один раз, после чего его можно использовать для операций масштабирования данных для всех пальцев, как показано ниже.

// Index finger
int indexScaled = Convert.ToInt32((Servo.INDEX_OPEN - Servo.INDEX_CLOSED) * 
   (index - fingerMin) / (fingerMax - fingerMin) + Servo.INDEX_CLOSED);
                
lblIndexScaled.Content = string.Format("Index Scaled: {0}", indexScaled);
Hand.MoveFinger(Servo.HandJoint.Index, Convert.ToUInt16(indexScaled));
.
.
.

Видео

Чтобы увидеть роботизированную руку в действии, посмотрите следующее видео на сайте YouTube*: https://youtu.be/VQ93jw4Aocg

Заключение

Для реализации этого программного эксперимента потребовалось лишь несколько часов после того, как мы протестировали сервомоторы и поняли принцип управления ими. Классическое приложение для Windows 10 было разработано на C#/XAML. В нем используются многие функции, доступные в API-интерфейсах и в образцах кода Intel RealSense SDK.

О технологии Intel® RealSense™

Дополнительные сведения о пакете Intel RealSense SDK для Windows см. по адресу https://software.intel.com/ru-ru/intel-realsense-sdk.

Об авторе

Брайан Браун (Bryan Brown) — инженер по разработке программных приложений в подразделении Developer Relations корпорации Intel.

Viewing all 357 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>