在写第一篇激光雷达的日志我就说,激光雷达的算法开发的最终的目标是移植到嵌入式设备上,
因为在机器人定位时,不可能用一个很大很重的设备,因此最理想的还是ARM平台,(工控机也可以
考虑,几乎不存在移植的问题,在工控机上直接安装Windows,连开发都可以在上面完成),裸奔还
是跑操作系统呢?如果激光雷达的接口是串口,那么裸奔是一个好的选择,可以最大限度的利用CPU,
但是URG-04LX的接口是USB-Serial和串口,UTM-30LX的接口只有USB-Serial,所以为了提高开发
效率,最终还是准备移植到ARM-Linux平台。
一、移植面临的问题
1、驱动程序
ARM-Linux平台是否有激光雷达USB-Serial的驱动程序?
2、交叉编译
如何将上位机的程序编译到ARM-Linux平台上?
3、算法优化
ARM-Linux硬件的能力有限,PC端的程序如果要在ARM上运行必须进行优化,
减少内存消耗和时间消耗。
4、实时显示
在ARM上运行时为了向PC端一样能实时显示计算的效果,最好能够实时显示
计算的结果
下面就会围绕这几个问题逐步去解决,(目前只是解决了一部分,还需继续努力)
二、驱动程序
1、Linux下驱动测试
首先在的电脑上进行Linux驱动测试,系统是Ubuntu10.04,插上电脑。
查看设备: ls /dev
dev下多了ttyACM0的设备
安装串口调试助手或者minicom,进行串口通信,向激光雷达发送命令II,
此时成功返回数据,说明在PC-Linux下设备驱动是有的,开发起来没有太大的难度,显示控件选的是
OpenCV,刚好也是跨平台的,显示控件也不是问题。
2、ARM-Linux下驱动测试
ARM:mini2440
将激光雷达查到ARM上,识别为USB device而不是USB-Serial,说明ARM-Linux下没有设备需要
的驱动程序。
没有驱动的话,有两种解决方式,一种是找到对用的驱动文件,编译为.ko文件,拷贝到ARM并加
载驱动模块,另一种是重新定制Linux内核,定制Linux时勾选上需要的驱动,重新编译Linux Kernal。
我是直接选择的第二种方法,将ARM-Linux重新编译了一遍。
URG的官网上有提到Linux下驱动的事,URG-Series has CDC-ACM device
controller. Thus ACM class driver is used for the device.
因此我猜测增加对cdc-acm的支持应该就可以识别激光雷达为USB-Serial,实际确实是如 www.it165.net
此。
定制时勾选选项:
devices drivers-->USB Support -->USB Modem ( CDC ACM ) Support
关于编译Linux内核环境的配置以及该如何进行编译,可以参照mini2440的用户手册,感觉网
上很多人的博客也是从这上面抄的,或者说照着做一遍然后就出来献丑~~
内核编译之后,需要将Linux kernal下载到ARM上,需要用到串口助手和dnw两个软件,
配置方式如下:
minicom: http://blog.csdn.net/renshengrumenglibing/article/details/7049471
dnw: http://blog.csdn.net/renshengrumenglibing/article/details/7049735
下载Linux Kernal之后,启动Linux,插上激光雷达
ls /dev
可以看到dev下多一个ttyACM0的设备,此时说明ARM-Linux下的U转串驱动搞定,下一步就是
数据采集了。
三、采集程序
鉴于PC-Linux和ARM Linux的易移植性,一般是在PC端开发程序,gcc或者g++编译,调试
成功之后将编译器由gcc g++替换为arm-none-linux-gnueabi-gcc 或者arm-none-linux-gnueabi-g++
进行交叉编译,然后拷贝到ARM-Linux上执行即可。
文件比较多,gcc编译,为了省事还是编写Makefile
mdScan : md_scan.c
g++ md_scan.c detect_os.h math_utils.h ring_buffer.c ring_buffer.h scip_handler.c scip_handler.h serial_ctrl.c serial_ctrl.h serial_errno.h serial_t.h serial_t_lin.h serial_utils.c serial_utils.h urg_ctrl.c urg_ctrl.h urg_delay.c urg_delay.h urg_errno.c urg_errno.h urg_parameter_t.h urg_t.h urg_ticks.c urg_ticks.h -lm -o mdScan
clean:
rm -f mdScan
#arm-none-linux-gnueabi-gcc
当需要在ARM-Linux下执行时,将g++ 换成arm-none-linux-gnueabi-gcc,然后拷贝到ARM-Linux下即可
执行
进入该文件夹,编译:make
执行 ./mdScan
执行效果:eeeeeeeeeeeeee忘了截图了
直接看ARM采集的数据吧,ARM下执行需要拷贝过去,然后在终端进行操控,跟PC-Linux下很类似
效果:
至于交叉编译环境的搭建,大家还是看mini2440的手册吧~就不再絮絮叨叨了。