Kinect移植到嵌入式ARM平臺上面

        我畢業設計做的libusb移植, 而kinect通信是基於libusb,所以,就做了一個kinect+libusb在嵌入式平臺上面的移植, 經過幾個月忙碌,終於將畢業設計給完成了,寫下一點心得, 也算是我多年在csdn索取資源的回饋。  

本系統主要由兩個部件構成:嵌入式硬件平臺和USB設備,通過USB總線建立起它們之間通訊,如圖2.16所示,USB設備Kinect中包含一個USB集線器,在Kinect內部通過Hub將紅外攝像頭、彩色攝像頭、電機等設備連接到Kinect內部USB總線上面,最後將Kinect設備連接到ARM9嵌入式硬件平臺的Roothub上面。

   

                       圖2.16 系統硬件連接圖

 

本系統的軟件系統設計主要核心部分是Libusb,它爲USB設備驅動程序開發提供一系列API,它封裝了許多USB協議和底層內核交互代碼,將驅動開發從內核空間搬移到用戶空間。爲了實現Libusb運行在嵌入式linux平臺上面,需要USB文件系統和linux底層USB驅動代碼作爲底層接口支持,而這些接口最終依賴於一個嵌入式linux操作系統。總的來說,本系統軟件層次如下圖2.17所示:


                            圖2.17 系統軟件設計圖


詳細步驟:

step1: 搭建一個嵌入式linux平臺

 本人用的是TQ2440 , 這個就直接用了出廠的源程序, 不過需要注意的是, libusb是基於usb文件系統的,所以移植的時候一定要包含進來


step2: 編譯libusb

這一步很重要,需要使用交叉編譯器ARM-linux編譯, 下載libusb, 進入其官網http://www.libusb.org/選擇最新版,下載

具體的安裝編譯步驟如下:

1.      解壓libusb-1.0.9.tar到當前文件中:

#tar –vxf libusb-1.0.9.tar –C ./

2.      使用cd命令進入到解壓後的文件夾中,運行配置文件:

#./configure CC=arm-linux-gccCXX=arm-linux-g++  /

--build=i686-linux --host=arm-linux

其中--build=i686-linux表示軟件是在X86平臺下編譯的,--host=arm-linux表示使用的是交叉編譯器arm-linux-進行編譯,系統默認是將軟安裝到/usr/local/lib目錄下,需要更改使用--prefix=/path/to/install。

3.      編譯安裝:

#make

#make install

4.      進入/usr/local/lib/目錄查看是否生成目標文件。

#cd /usr/local/lib/

可以看到在該目錄下,多出一個libusb的文件夾,裏面有一個include和lib目錄。

5.      掛載NFS,通過nfs將include目錄和lib目下的文件拷貝到開發板上

#mount –t nfs 192.168.0.7:/opt/nfs /mnt/nfs

這裏192.168.0.7爲開發板的地址。


step3: 使用libusb編寫一個usb設備遍歷程序

代碼如下:

附錄A 使用libusb遍歷usb設備程序源碼

/****************************************************************************
*****desc:    使用libusb庫函數編程遍歷當前所有的usb設備
*****author: lxz
*****create data:   2013,3,20
*****modify data:	2013,4,25
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "libusb.h"
#include <pthread.h>
int main()
{
    libusb_device **devs ;             // used to retrieve a list of device 
    libusb_context *ctx = NULL ;       //a libusb session
    struct libusb_device_descriptor desc ;
    int r = 1 ;                         //for return value
    ssize_t cnt ;                       //holding number of devices in list
    r = libusb_init(&ctx);        //initialize the library for the session we just declared
    if( r<0)
    {
	fprintf(stderr, "failed to initalise libusb\n");  //there was a error
	exit(1) ;
     }
    else
     {
	printf("init successful !\n");
      }
    libusb_set_debug(ctx,3);   //set verbosity level to 3, as suggested in the documention
 cnt = libusb_get_device_list(ctx, &devs) ;   //get the list of devices
    if(cnt <0)
      {
	fprintf(stderr, "Get Device Error\n");
	exit(1);
      }
    printf("%d Device in list .\n", cnt) ;
    ssize_t i ;   //for iterating through the list
    for(i=0; i<cnt; i++)  
      {
	r = libusb_get_device_descriptor(devs[i], &desc) ;
	if(r<0)
	  {
	    printf("failed to get device descriptor\n") ;
	    exit(1);
	  }
      printf("Number of possible configurations:%d\n", desc.bNumConfigurations);
	  printf("Device Class:%d\n", desc.bDeviceClass);
	  printf("Vendor ID:%d\n", desc.idVendor) ;
	  printf("Product ID :%d\n", desc.idProduct );
       }
    return 0;
}

編譯:



將生成的代碼,通過nfs下載到TQ2440開發板中, 在開發板上, 運行剛剛編譯的程序,



libusb成功運行在ARM平臺上面, 接下來就是對kinect進行操作了。

 詳細介紹, 有空再更新



 











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章