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设备遍历程序

代码如下:
  1. 附录A 使用libusb遍历usb设备程序源码  
  2.   
  3. /**************************************************************************** 
  4. *****desc:    使用libusb库函数编程遍历当前所有的usb设备 
  5. *****author: lxz 
  6. *****create data:   2013,3,20 
  7. *****modify data:   2013,4,25 
  8. ******************************************************************************/  
  9. #include <stdio.h>  
  10. #include <stdlib.h>  
  11. #include "libusb.h"  
  12. #include <pthread.h>  
  13. int main()  
  14. {  
  15.     libusb_device **devs ;             // used to retrieve a list of device   
  16.     libusb_context *ctx = NULL ;       //a libusb session  
  17.     struct libusb_device_descriptor desc ;  
  18.     int r = 1 ;                         //for return value  
  19.     ssize_t cnt ;                       //holding number of devices in list  
  20.     r = libusb_init(&ctx);        //initialize the library for the session we just declared  
  21.     if( r<0)  
  22.     {  
  23.     fprintf(stderr, "failed to initalise libusb\n");  //there was a error  
  24.     exit(1) ;  
  25.      }  
  26.     else  
  27.      {  
  28.     printf("init successful !\n");  
  29.       }  
  30.     libusb_set_debug(ctx,3);   //set verbosity level to 3, as suggested in the documention  
  31.  cnt = libusb_get_device_list(ctx, &devs) ;   //get the list of devices  
  32.     if(cnt <0)  
  33.       {  
  34.     fprintf(stderr, "Get Device Error\n");  
  35.     exit(1);  
  36.       }  
  37.     printf("%d Device in list .\n", cnt) ;  
  38.     ssize_t i ;   //for iterating through the list  
  39.     for(i=0; i<cnt; i++)    
  40.       {  
  41.     r = libusb_get_device_descriptor(devs[i], &desc) ;  
  42.     if(r<0)  
  43.       {  
  44.         printf("failed to get device descriptor\n") ;  
  45.         exit(1);  
  46.       }  
  47.       printf("Number of possible configurations:%d\n", desc.bNumConfigurations);  
  48.       printf("Device Class:%d\n", desc.bDeviceClass);  
  49.       printf("Vendor ID:%d\n", desc.idVendor) ;  
  50.       printf("Product ID :%d\n", desc.idProduct );  
  51.        }  
  52.     return 0;  
  53. }  

编译:



将生成的代码,通过nfs下载到TQ2440开发板中, 在开发板上, 运行刚刚编译的程序,



libusb成功运行在ARM平台上面, 接下来就是对kinect进行操作了。

 详细介绍, 有空再更新



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值