激光雷达学习笔记(六)ARM-Linux平台算法移植

在写第一篇激光雷达的日志我就说,激光雷达的算法开发的最终的目标是移植到嵌入式设备上,

因为在机器人定位时,不可能用一个很大很重的设备,因此最理想的还是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,实际确实是如

此。

定制时勾选选项:
devices drivers-->USB Support -->USB Modem ( CDC ACM ) Support
激光雷达学习笔记(六)ARM-Linux平台算法移植_第1张图片
关于编译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上执行即可。

源码和Makefile如下:http://download.csdn.net/detail/renshengrumenglibing/5100854

        文件比较多,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下很类似

效果:

激光雷达学习笔记(六)ARM-Linux平台算法移植_第2张图片

至于交叉编译环境的搭建,大家还是看mini2440的手册吧~就不再絮絮叨叨了。

原创博客,转载请注明出处:http://write.blog.csdn.net/postlist







你可能感兴趣的:(激光雷达学习笔记(六)ARM-Linux平台算法移植)