星期六, 3月 10, 2012

如何調整 Kinect 底座馬達上下旋轉角度 (For Windows SDK V1)

Photobucket

在一般應用情況底下,Kinect 通常會被擺置在一定的高度上,
(應該很少直接被擺置在地上 ><""")

但有時擺放位置的高度不夠高時,可能在偵測影像應用時,

效果可能會有一點不太理想。

這時除了可以找東西繼續把Kinect 裝置墊高外,

還可以使用Kinect 本身具備調整角度的功能,來改變視角,調整到最佳角度。

這邊KT必須特別 Highlight出來,


目前硬體預設情況下只能調整馬達上下旋轉角度

因為之前有可愛的"萌萌"問到:

「請問KT,如何才可以調整Kinect 左右旋轉角度」、

在研討會上,有人提問:

「為何KT大大只教調整上下角度呢? 可以順便說明一下左右旋轉角度嗎?」...等,

KT感覺應該幫大家轉信給微軟Kinect小組,

好像大家有極大的渴望想要去調整左右旋轉角度。

所以這邊KT再再次的聲明:

「目前硬體預設情況下只能調整馬達上下旋轉角度」

所以如果你真的需要調整左右角度,

積極方法:
可以自己架設一個左右旋轉的底盤,
透過RS-232或USB發送訊號控制馬達旋轉,
搭配Arduino板子應該可以很輕易完成這件事。
(Arduino 板子約在一千塊台幣上下)

被動作法:
發動連署提出需求,希望在下一代的Kinect可以360度旋轉。



所以在預設硬體不改變現狀情況下,KT這邊就簡單說明一下:

「如何調整 Kinect 底座馬達上下旋轉角度」

首先我們先來看一下官文說明文件裡的硬體規格表:

Photobucket

裡面清楚定義到可以垂直(=上下)調整+/-27的傾斜角度,

然後可以在官文說明文件手動搜尋一下"tilt",
Photobucket

即可以得知我們若需要去調整角度,

只需要去設定"ElevationAngle"這個屬性即可改變角度,

若想知道目前角度大小,只需去讀取"ElevationAngle"這個屬性,即可得知 。

所以KT這邊就簡單地去設計一下程式畫面:
由垂直滑桿(Slider),來調整所需的角度,
然後按儲存按鈕,即可將設定值存到ElevationAngle,
來改變Kinect 底座馬達,上下旋轉角度。
Photobucket

影片教學:


程式解說部分,可以參考程式註解。

XAML CODE:

    
        
        

C# CODE:
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect;

namespace KinectAdjustTiltAngle_Demo
{
    public partial class MainWindow : Window
    {
        //Instantiate the Kinect runtime. Required to initialize the device.
        //IMPORTANT NOTE: You can pass the device ID here, in case more than one Kinect device is connected.
        KinectSensor sensor = KinectSensor.KinectSensors[0];
        

        public MainWindow()
        {
            InitializeComponent();

            //宣告「視窗開啟時,將載入的函數」和「視窗關閉,將卸載的函數」
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
            this.Unloaded += new RoutedEventHandler(MainWindow_Unloaded);
        }

        //視窗開啟時,將載入的函數
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            sensor.Start();//開啟Kinect裝置            
            lblCurrentAngle.Content = sensor.ElevationAngle.ToString();//讀取目前Kinect的角度,秀到標籤上

        }
        //視窗關閉,將卸載的函數
        void MainWindow_Unloaded(object sender, RoutedEventArgs e)
        {
            sensor.Stop();
        }       

        private void Btn_AdjustAngle(object sender, RoutedEventArgs e)
        {
            button1.IsEnabled = false;//將按鈕設為失能(Disable),等角度整套設定完再致能(Enabled)

            //設定角度
            if (sensor != null && sensor.IsRunning)
            {
                //將滑桿的值存到 ElevationAngle
                sensor.ElevationAngle = (int)slider1.Value;

                //讀出 Kinect目前ElevationAngl的值,然後秀在畫面標籤上
                lblCurrentAngle.Content = sensor.ElevationAngle;
            }


            //不要太頻繁的去改變角度,會導致程式崩潰,所以這邊使用Sleep函數鎖死一秒,在這一秒裡面不能有任何動作
            System.Threading.Thread.Sleep(new TimeSpan(hours: 0, minutes: 0, seconds: 1));
            button1.IsEnabled = true;//恢復按鈕設定功能 
        }
    }
}

PS.
原本在beta 2 SDK裡太頻繁的去改變角度,會導致程式崩潰,
在beta 2說明文件中有提到:
Photobucket

V1版,好像已改善這問題,V1版的說明文件已移除這段解釋與提醒,

KT目前這邊"狂"改角度好像也不會當掉,

所以如果覺得Sleep那一段很醜,可以拿掉,

單純用按鈕(Enable和Disable)來防即可。

完整範例下載:
1.馬達上下旋轉角度範例


2.彩色影像+馬達上下旋轉角度範例


更多參考資料:
1.Kinect For Windows SDK V1  程式指南手冊


相關文章參考:
HKT線上教學教室 - Kinect 教學目錄

4 則留言 :

  1. 你好
    我在使用這個範例以前
    我已經安裝好Beta版的SDK
    但我發現有些程式比需要改成Beta版中的格式才可以執行
    像是
    "sensor.Start();//開啟Kinect裝置"
    中的sensor在Beta版中應該要如何改呢?
    改成Beta格式的程式會不會有甚麼樣子的問題呢?

    回覆刪除
  2. 關於Beta2 與 v1,移植對照可以參考這篇:

    Kinect for Windows – Code Migration from Beta2 to v1.0 (C#/VB)
    http://robrelyea.wordpress.com/2012/02/01/k4w-code-migration-from-beta2-to-v1-0-managed/

    這邊KT貼心建議,採用正式版V1比較穩定。

    回覆刪除
  3. KT請問一下 V1.5 用此支程式也能跑出一樣的結果嗎 還是會錯誤呢!

    回覆刪除

回覆意見時,麻煩輸入一下暱稱
(隨便取個名字也好~ ^_^)
好讓我方便回覆您的問題,
選擇「名稱/網址」輸入您的暱稱,
麻煩一下,謝謝大家。

關閉廣告 [X]