Соединение Netduino с Kinect

Грэг Дункан

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

Вообразите добавление поддержки NUI в следующее приложение Netduino…

KinectControlledNetduino

Этот код – пример того, как возможность распознавания жестов Kinect может быть использована для управления сервомотором с помощью Netduino.

Замечания

Дэвид Кетье (David Catuhe) проделал сложную работу, чтобы добавить поддержку жестов в Microsoft Kinect SDK. По следующим ссылкам содержаться документы, описывающие, как работает библиотека жестов и откуда ее можно скачать.

Это видео на YouTube показывает что в состоянии сделать код из этого репозитория при полном использовании. Демонстрация видео YouTube.

Замечания по установке

    • Получить Netduino Plus, подсоединенный к компьютеру через USB
    • Подсоединить Netduino Plus в сеть с помощью Ethernet-кабеля
    • Настройте Netduino Plus с помощью MFDeploy, чтобы получить работающее сетевое соединение
    • Подсоедините сервомотор к одному из цифровых выходов Netduino, поддерживающих ШИМ – 5, 6, 9 или 10 в соответствии со спецификацией Netduino
    • Развернуть код в Netduino Plus или отлаживать его напрямую. Отметьте, что порт по умолчанию 8080, поэтому URL будет https://[PLUS.IP.Address.Here]:8080/servo/180, где 180 – угол, между 0 и 180, на который вы хотите повернуть сервомотор.
      • Измените код Kinect GUI так, чтобы он указывал URL Netduinp Plus. Конкретно, есть строка кода в файле WebServoClient.cs, которая читает строку urlBase = "https://YOUR-NETDUINO-IP-HERE:8080/servo/{0}"; которую и требуется изменить.
    • Подключите Kinect
    • Попробуйте понаблюдать за Netduino Plus URL пока сервомотор не ответит.
    • Запустите код GUI. Вы можете захотеть подправить пример кода, приведенного на странице Kinect Toolkit CodePlex, чтобы управлять чувствительностью, или отключает код GUI, вызывающий Netduino URL до тех пор, пока вы не приготовитесь удобно управлять Kinect жестами, а он не будет готов воспроизводить поведение на экране.
    • Если все собрано правильно, вы должны увидеть, как сервомотор правильно отвечает на команды

clip_image002

clip_image004

clip_image006

clip_image008

clip_image010

Замечание: Если ссылки на MicroHTTP/MicroIO нарушены, можно соответствующие DLL в папке WebServo\Libs.

Вот фрагмент кода:

 void OnGestureDetected(string gesture)
{
    Debug.WriteLine(gesture);

    swipeLeft.Background = new SolidColorBrush(Colors.White);
    swipeRight.Background = new SolidColorBrush(Colors.White);

    if (gesture.Equals("SwipeToLeft", StringComparison.CurrentCultureIgnoreCase))
    {
        swipeLeft.Background = new SolidColorBrush(Colors.Red);
        this.client.TurnLeft();
    }

    if (gesture.Equals("SwipeToRight", StringComparison.CurrentCultureIgnoreCase))
    {
        swipeRight.Background = new SolidColorBrush(Colors.Red);
        this.client.TurnRight();
    }
}

void OnVideoFrameReady(object sender, ImageFrameReadyEventArgs e)
{
    kinectDisplay.Source = streamManager.Update(e);
}

void OnSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    ProcessFrame(e.SkeletonFrame);
}

void ProcessFrame(ReplaySkeletonFrame frame)
{
    Dictionary<int, string> stabilities = new Dictionary<int, string>();
    foreach (var skeleton in frame.Skeletons)
    {
        if (skeleton.TrackingState != SkeletonTrackingState.Tracked)
            continue;

        barycenterHelper.Add(skeleton.Position.ToVector3(), skeleton.TrackingID);

        stabilities.Add(skeleton.TrackingID, barycenterHelper.IsStable(skeleton.TrackingID) ? "Stable" : "Unstable");
        if (!barycenterHelper.IsStable(skeleton.TrackingID))
            continue;

        swipeGestureRecognizer.Add(skeleton.Joints
            .First(j => j.ID.Equals(JointID.HandRight)).Position, 
                kinectRuntime.SkeletonEngine);

        postureRecognizer.TrackPostures(skeleton);
    }

    skeletonDisplayManager.Draw(frame);
}
}

Если вы размышляете, как подключить Kinect к следующему проекту Netduino, то этот материал укажет вам путь (по крайней мере, один из них).

Вот несколько ссылок, которые могут оказаться интересными: