CSK.Blog--个人原创Weblog

MK802与外部硬件设备的通讯

这是一个文章系列的一部分,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能

欢迎转载,但请保留原始作者信息(Shikai Chen, http://www.csksoft.net),以及指向本文原始出处的链接!

访问目录:基于MK802 MiniPC的扩展开发应用-简介篇(http://www.csksoft.net/blog/post/mk802_dev_intro.html)

 

revision: 2

通过了前几篇文章[1][2][3]的介绍,相信大家已经为MK802准备好了适合的自制系统也了解了应用开发的基本过程。从这篇文章开始我们将正式介绍本系列文章的最终目的:使用MK802与Arduino等外部硬件通讯,制作各类应用。
这篇文章将介绍其中的一个重要步骤:如何实现MK802与外部硬件设备的通讯。这是后续进一步开发的必要环节。

图:利用MK802的2个usb口连接usb外设


图:直接将MK802和Arduino相连

图:在自制舵机云台上安装的USB摄像头(将在后续文章介绍)

点击文章标题浏览全文

基于MK802的应用开发和相关的工具

这是一个文章系列的一部分,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能

欢迎转载,但请保留原始作者信息(Shikai Chen, http://www.csksoft.net),以及指向本文原始出处的链接!

访问目录:基于MK802 MiniPC的扩展开发应用-简介篇(http://www.csksoft.net/blog/post/mk802_dev_intro.html)

 

revision: 1

 

这里将介绍如何在MK802的Linux系统上进行程序开发和开发工程中会用到的一些工具和技巧。虽然文章是针对MK802这个MiniPC写的,但是由于采用了Linux系统,因此文章中介绍的内容其实都是标准Linux系统所支持的,因此自然可以在其他类型的MiniPC(如树梅派)上使用。


在之前的系列文章中我介绍了如何在MK802运行定制的传统Linux发行版。在此基础上,我们就可以使用标准Linux开发的技巧来为MK802开发程序。如果你很了解Linux的开发知识,不妨跳过本系列直接阅读后续的文章。


另外需要提醒大家的是本文并不打算写成一个系统的Linux开发教程,因此对于很多背景知识,还需要大家去学习相关的书籍。这里只是抛砖引玉式的通过一些例子让大家了解为MK802开发的大致过程。

点击文章标题浏览全文

基于MK802 MiniPC的扩展开发应用-软/硬件修改和扩展

这是一个文章系列的一部分,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能

欢迎转载,但请保留原始作者信息(Shikai Chen, http://www.csksoft.net),以及指向本文原始出处的链接!

访问目录:基于MK802 MiniPC的扩展开发应用-简介篇(http://www.csksoft.net/blog/post/mk802_dev_intro.html)

 

revision: 0

这部分将介绍各种针对MK802硬件以及软件的修改技巧,相对来说,这部分介绍的都属于各种杂碎的小技巧,文章构成上比较零碎,并且相对于整个系列文章其他部分独立。
虽然这些都是各种小技巧,有些甚至属于雕虫小技,不过在必要的地方我也会通过问题本身做一些对linux kernel的进一步介绍。

在本文中将介绍的例子有:

  1. 引出MK802的内部调试串口信号,用于kernel的调试和开发
  2. 通过fex脚本配置hdmi的输出分辨率至1080p和其他尺寸以及色彩深度
  3. 在自制系统内利用MK802的内置Flash存储文件
  4. 将CPU主频超频至1.1G,以及实现动态频率调节降低功耗

点击文章标题浏览正文

基于MK802 MiniPC的扩展开发应用-系统自制

这是一个文章系列的一部分,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能

欢迎转载,但请保留原始作者信息(Shikai Chen, http://www.csksoft.net)以及指向本文原始出处的链接!

访问目录:基于MK802 MiniPC的扩展开发应用-简介篇(http://www.csksoft.net/blog/post/mk802_dev_intro.html)

 

为嵌入式设备定制系统是一个需要很多背景知识的技能。这里无法假设各位的背景知识结构,因此在文章组织上,我将默认拥有相关经验的直接操作过程写在最前面。随后是为新手提供的简单的背景介绍。最后的部分是对一些问题的深入探讨。对于一些超出本文范围的内容,我也给出了对应的参考文献,方便感兴趣的人进一步的研究。

为何需要系统自制?


MK802出厂内置的是Android 4.0 (ICS) 系统,虽然这个系统在芯片厂家和设备厂家的优化下具有最好的硬件兼容性,但是对于我们接下来所需要进行的二次开发来说,采用其他传统的Linux发行版将比较方便。

当然也有人会坚持继续采用Android,这点其实没有任何问题,但需要注意这个平台的一些不同之处。对此在本文的后半部分我将专门讨论这一问题,大家可以根据自身情况来做取舍。

所谓系统自制,其实就是让MK802运行由我们为他所定制的基于Linux Kernel的系统,在这个过程中我们将加入后面开发所需要的驱动/组件,删除无关的组件,并作必要的性能优化。从而构建出适合于进行扩展开发所需要的系统环境。

而这个过程将包含如下几个阶段:
1. 配置并编译Linux Kernel/uboot等核心
2. Rootfs的选取和打包
3. 向MK802部署自制系统

MK802支持的系统部署模式


MK802,或者说采用Allwinner A10芯片的设备,支持从两种渠道启动系统:内部NAND Flash以及外部的SD卡。他的具体运作机制,可以参考[7]。这个方式很类似PC的多重启动:在启动过程中,如果发现SD卡中存在有可以用的系统时,则直接从SD卡引导系统。否则才会去加载内置的NAND flash中的系统。

这对我们来说是一个好消息,这样我们的自制系统可以直接保存在一张外部的SD卡上。一方面可以保证原生的Android系统不被破坏,另一方面也有利于对我们的自制系统进行备份。

当然,如果愿意,也是可以将自制系统写入内部的NAND flash。这部分的操作其实与保存在SD卡上类似,可以参考文献[10]。

本文将采用SD卡上系统的模式进行介绍。


图:可以将自制系统安装在SD卡上

会不会破坏设备?无法使用?变砖?

在前文已经介绍了,如果将系统保存在SD卡上,则完全不会破坏MK802自带的Android系统。除此之外,Allwinner A10芯片设计上也有一个很好用的模式:支持USB固件下载[7]。如果内部的NAND flash上的系统被破坏,只要芯片本身没有损坏,则可以通过usb连接PC,通过官方提供的LiveSuite工具进行原始固件恢复[12]。因此即使是将自制系统部署在内部对NAND Flash上,也完全不必担心变砖。
这里提供给大家三个方案供选择:
1- 完全定制自己的系统
这是相对繁琐,最本质的操作过程,但有无可比拟的优势。

2- 使用社区有的编译打包脚本
使用社区提供的编译脚本,简化第一种方案的流程。同时在必要的时候可以重新按照方案1的部分流程做更进一步的定制。不过这里还需要做一些额外的人手干预修改编译行为。

3-使用别人提供的系统镜像

相对简单,但存在一些限制。具体采用哪个方案,大家可以看每个方案前的介绍自己衡量。


 

2012/11/22 updated: 

这里也直接发布出我制作的系统完整镜像,大家可以直接按照方案3的描述,直接将镜像写入自己的SD卡。该系统按照本文的描述进行配置,采用linaro 12.07 ubuntu armhf rootfs以及带有USB摄像头等必要驱动支持的linux kernel。

可以直接使用命令:

gunzip -c mk802_linaro_initial.img.gz | dd of=/dev/<你的SD设备名> bs=64k

将镜像写入SD卡,请确保SD卡容量>=8Gb。具体细节,请阅读方案3

同时,为了方便大家,这里也给出我预先编译的Linux Kernel/Uboot包,他采用方案2描述的hardware pack形式系统,可以参考方案二了解细节。其中包含了对USB Camera、USB串口的支持。

下载地址:http://www.csksoft.net/data/mk802/mk802_hwpack_cskbuild.7z

点击文章标题浏览正文

基于MK802 MiniPC的扩展开发应用-简介篇

这将是一个文章系列的第一篇,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能

欢迎转载,但请保留原始作者信息(Shikai Chen, http://www.csksoft.net)一直指向本文原始出处的链接!

为了增加大家兴趣,首先将相关的演示视频贴出。他们的细节将在后续文章中介绍。

基于MK802,结合Arduino控制的人脸自动追踪云台

基于MK802和Arduino的光源追踪

基于MK802的摄像头画面前景学习和提取

基于MK802的网络带宽统计显示

 

 简介

自从以树梅派(raspberry-pi)为代表的低成本微型电脑问世以来,市面上陆续的就有各种基于Cortex-A8 ARM的Android微型主机出现。其中比较典型的就是MK802,他是国内厂家推出的一款大小与u盘类似的迷你电脑。

图:MK802 MiniPC

 

虽然只有U盘大小,但是它具备了不错的配置: 1Ghz的cortex-A8 ARM处理器: Allwinner A10、最高达1Gb 的DDR3内存、2个usb 口可外接usb设备、内置WIFI网卡,并且使用HDMI接口可输出高达1080p画质的图像。使用的是Google Android 4.0的操作系统。

这样的配置已经和几年前的主流PC性能相仿,而且价格也不贵,一般几百块钱的成本即可买到。并且相比较树梅派来说性能也高出了一截(树梅派使用的是ARM11的处理器,主频仅为700Mhz)。

除了能够出色完成基本的上网、视频播放、游戏娱乐外,这样的配置允许这台U盘大小的机器运行许多以前只能在PC上进行的工作:比如基于OpenCV的计算机视觉运算、视频传输和处理、语言合成和识别、复杂的人工智能算法等等。并且爱好者也可以通过MK802上边的2个USB口以及WIFI与其他设备、传感器或者开发板进行交互,达到更多地功能。

因此它对于电子制作爱好者具有非常大的吸引力。很多方面MK802可以代替一台x86 PC,并且更小的体积/重量以及功耗使得这样的设备可以被航模、无人机、小型机器人这类对体积、重量、功耗非常敏感的设备所搭载,并且强大的运算能力足以胜任一些以前看似不可能再小型设备上进行的算法。


不过厂家推出他的初衷是作为连接电视机用的媒体播放器或者机顶盒使用,因此目前市面上大部分的应用还是围绕着如何用它进行多媒体播放或者日常上网娱乐展开的。鲜有介绍如何基于MK802这类小主机进行扩展开发、使用OpenCV进行视觉识别、与Arduino通讯实现功能扩展的文章。

因此在这个系列的文章中,我尝试结合自己的经验以及整理得到的网上各类有关于MK802的扩展开发的文章,为大家介绍如何基于MK802这类微型主机进行扩展的开发,以及如何与Arduino等开发板进行互连互动,并且使用OpenCV进行计算机视觉方面的应用。希望这个系列对大家能起到参考作用,期待大家充分挖掘出这类迷你PC的潜能,做出更多更有趣的东西。

当然,本文介绍的很多技巧和方法不仅仅适用于MK802,同样任何基于Linux系统的主机(包括PC)都将适用。因此这里提到的方法和代码,也可以在其他类似的迷你主机,例如树梅派、MK802的后续升级版本上使用。

图:本系列文章将介绍的例子:使用MK802结合Arduino,实现的人脸跟踪系统

本系列文章的将分为如下几大部分:

第一部分:MK802的系统自制

这部分将介绍如何自行编译Linux Kernel、uboot等核心软件达到对MK802硬件的完全控制和定制的能力,并且将推荐几个适合于MK802的Linux发行版本(主要是rootfs包)。
这将是对MK802进行二次开发和扩展的一个必要环节。
这部分的一些部分会需要读者具有Linux开发的一些背景知识,不过我也会介绍一些便捷的方式使用其他人预先制作的系统,为新手绕过这个步骤。当然凡事都有两面性,对于使用其他人现成的系统,将在后续的扩展开发中丧失一定的灵活性甚至会造成一定的阻碍。

第二部分:MK802的软/硬件修改和扩展


这部分将介绍一些hack小技巧,来对MK802的软硬件做出一些的改动达到自身的需求。例如引出调试串口信号,这将是对kernel调试非常重要的。这部分的内容相对后续部分独立,如果不感兴趣也可以跳过这部分。

第三部分:基于MK802的应用开发和相关的工具


这里将介绍如何在MK802的Linux系统上进行程序开发和开发工程中会用到的一些工具和技巧。
将介绍如何对MK802这类ARM设备在PC上进行交叉编译,如何部署到目标系统以及如何调试等内容。
这部分是对MK802进行扩展所必须的,不过由于篇幅和时间限制,这部分的介绍只是走马观花式的。其实质是基于Linux这类POSIX系统的开发技巧,以及对gcc工具链的使用知识,这些方面的知识还是需要读者能够参考相关的数据系统的进行学习。

第四部分:MK802与外部硬件设备的通讯


这部分将以Arduino为主要例子,介绍如何通过MK802经过usb口如何与Arduino设备进行互通。同时也会给出其他通讯方式的实现思路。
这部分末尾将介绍一个使用MK802与arduino通讯并驱动舵机云台的例子。

第五部分:在MK802上结合OpenCV库进行计算机视觉处理

这部分将介绍如何在MK802上扩展摄像头、交叉编译OpenCV库并进行使用的过程
这部分末尾将介绍如何通过MK802在一个128x64分辨率的VFD显示屏上显示摄像头画面的例子

第六部分:基于MK802、Arduino和OpenCV库的互动开发


这部分将为了本系列文章的几个配套实例的开发思路。包括人脸的跟踪、光源的跟踪、将路由器网络流量信息展示在于MK802连接的屏幕上。

 

对Wowwee Rovio机器人的拆解和扩展可能性探讨

最近网上发现有一批很低价的rovio出售,于是入手一台,拆开后发现是正品。一直对他的机械系统和定位系统着迷,于是我就在拿到手第一时间完全拆解。

初步分析下来rovio还是蛮适合做二次扩展或者hack的。不过自己恐怕没时间搞,于是写成此文权当给大家一个抛砖引玉的启发吧,期待今后有不少神级的hack/mod出现:-)

简介

Wowwee Rovio[1] 是一款使用WIFI信号控制的视频小车,主要的应用诸如远程监控家里情况、远程视频会议等。相比普通的wifi摄像头,它具备行动能力,操作者可以遥控它对任何可以到达的地点进行观察。

Rovio在dock上充电的画面,图片来自于[2]

不过它的功能还不止wifi小车和摄像头那么简单。从上图即可看到他的机械设计上也有独特之处:使用了3组万向轮。这样的设计使得Rovio可以很灵活的直接向着任意方向平移,而不用事先转向到目标角度。

这样的机械结构对于机器人来说很容易控制,在Robocup机器人足球比赛中,多采用这样的结构:

 

图:Robocup比赛机器人使用的万向轮,图片来自[3]

对于做过机器人的朋友来说,这样的机械底盘一般售价不低,但性能非常好。Rovio的这个机械地盘非常值得利用

另外一个特点是Rovio具有记录当前位置和自动返航回dock充电的功能,这得益于它装备的NorthStar[4]导航系统。这是一个基于红外成像三角定位原理的导航算法。据他的开发者Evolution Robotics称,其导航精度最高可达4cm/4deg[5],而在后面的我的拆解分析中,也可以看到Rovio的NorthStar模块可以被直接拿来使用的可能性也很大。另外值得注意的是,市面上的一款拖地机器人mimt也是采用了northstar定位方案。

 

图:Evolution Robotics网站中对NorthStar定位原理的示意图[4]

下面给出Rovio的大体配置:

  1. ARM9 200Mhz CPU
  2. 使用eCos RealTime OS
  3. 三组万向轮电机,带有里程计
  4. NorthStar II 定位模块
  5. 头部一组红外障碍物检测
  6. Speaker和Mic

拆解后我的基本观点:

  1. 驱动电路和上层电路层次明显,很适合二次扩展
  2. 可将ARM9的控制电路取出,使用WR703等设备配合OpenWRT替换,通过自行开发固件可以达到一样的功能
  3. NothStar模块可以直接驱动(如使用arduino)的可能性很高,可尝试用于其它地方

 

拆解与分析

底盘总体布局

下图为拆开后的总体布局,所有机械和驱动控制电路部分都位于底盘。这样的布局对希望直接使用小车底盘的应用很有帮助。

不过遗憾的是Rovio使用的是玩具用电机,虽然成本便宜,但使用过程中就可发现这种电机的诸多缺点,如扭矩低、噪音大、精度差等

 

供电和充电管理

这部分在一块单独的PCB上完成,包含了负责稳定电池电压的DCDC模块以及给电池充电的模块。

PCB上一共3组线路:电池输入、稳压输出以及充电输入。(此处有误,感谢网友gzhuli指正:电源板的3pin插座不是供电输出,是电量检测和充电检测,CS=电池电压检测,CPC=充电控制,CPS=充电状态检测。)可以方便的被再次利用。

 

 

外设驱动模块

Rovio将所有外部设备(电机、LED、编码器、红外检测等)完全通过一块PCB管理,该PCB从ARM控制板接受控制信号。因此这部分也可以被利用,通过测量控制信号逻辑,应该不难被arduino等驱动起来。

图中的一系列黑色的三极管应该是实现电机驱动的H桥。这里也比较遗憾,可能是为了降低成本才如此设计,但三极管相比较MOSFET来说,驱动效率较低,也不能通过过大电流。但从配备的玩具电机上看,的确也没必要使用较好的手段。不过这里也就可以作为爱好者hack的一个入手点,可以使用大功率的H桥替代。

 

电机和编码器

虽然使用了玩具电机,但rovio给每个电机配置的编码器精度应该还不错。可以用于实现里程计,达到一定精度的航迹推算(Deadreckon)。再另外选配合理的传感器,爱好者应该可以基于Rovio完成SLAM等高级的机器人应用

 

红外障碍传感器和Speaker

Rovio采用一体化红外接受头作为障碍物检测。这点和我们RoboPeak团队的RPMini一样,但Rovio只有前方一组传感器。使用一体化接受头也意味着发射的红外信号时经过调制的。这样可以有效避免环境光对红外障碍检测的干扰。图中最左侧的就是红外发射LED,中间为白色的照明用LED。至于他们的驱动使用,相信有经验的电子爱好者都可以轻松搞定。

 

LED装饰灯驱动部分

位于顶板的装饰用LED,Rovio用了额外的一块驱动PCB,其原理很容易从画面中猜到:经典的三极管扩流方式。这部分如果要自己驱动也非常容易。

ARM控制核心

在拆解中一直没看到Rovio的控制核心,而驱动模块和机械部件的选型也让人觉得这完全就是一款中低端玩具。但实际上Rovio的最核心部件是隐藏在安装摄像头的可伸缩头部的。打开这部分的外壳,就可以看到ARM控制板以及上方的定位模块。这部分的做功就比之前的驱动电路精细一点。当相比我拆解的设备而言(可以参考我之前拆的XV11机器人),做工还是显的粗糙。

 

PCB的正面可以看到使用的ARM芯片以及后面的WIFI模块,反面有一块声卡的DAC芯片以及ROM。这部分的电路对于希望修改rovio的人来说意义不大。因为Rovio的代码并没有公开。可以考虑将其用其他控制器替换。

图中的ARM芯片型号有误,应为:(由gzhuli指正)

CPU是Winbond的W99702,不是PXA270,下面的W99100DG不是ROM而是51核单片机,控制W99702 ISP时序的,进入ISP模式时(先插USB再上电就进入ISP模式)通过一个模拟开关切换接管USB口。

 

NorthStar定位模块

这部分是我认为Rovio真正有价值且区分与一个简单的wifi视频小车的部分。不过这个定位模块并非Rovio所开发,而是由Evolution Robotics提供的模块。但对于爱好者来说这是一个福音。因为这个模块的接口是标准串口!不过由于时间关系我并没有去采集其中的信号。但按照Evolution Robotics的介绍[5],模块是直接输出定位的坐标信息的。在画面中也可以辨认出串口信号的迹象

 

我拆解过程中把该模块从PCB上拆下,这里展现了它的内部构造,可见还是比较精巧的。我想这样的画面对于一些专业领域的朋友来说大致就能知道他的定位原理了。这部分我就不细说了。大家可以先尝试将此模块驱动起来。

我同时也采用了特殊的摄像机拍摄Rovio底座投射出来的红外光斑,这部分画面用普通摄像头和人肉眼是无法观测的。可以看出光斑与Evolution Robotics的原理描述上一致。不过值得注意的是要投射这样亮度的光斑,投射灯的发射功率不低。当我直接拍摄投射器发出的光斑是,因为光强过大,红外相机的中心感光部分直接出现里“溢出”现象。虽然人肉眼无法看到红外线,但如此强度的功率,恐怕还是会对视网膜造成损害。

投射到天花板的2个红外光斑

 投射器发出的强烈光线(肉眼不可见)

到这里拆解的部分就结束了,我后来将小车原样装回,运行正常。

扩展开发和hack的思路

写这篇文章的目的就是希望能起到抛砖引玉的作用,希望大家一起来做扩充。这里就列出我经过分析得出的一些想法给各位借鉴。因为我自己也没尝试过,一些思路未必正确,也欢迎大家通过实践验证不可行时给出回复:-)

对于扩展,有几种途径:

  1. 不修改硬件、尝试修改固件扩充
  2. 不修改硬件和固件、在PC上二次开发
  3. 保留驱动部分电路,替换逻辑控制电路
  4. 完全替换所有电路,使用机械平台
  5. 仅使用NorthStar定位模块

 

这里我将基于我玩机器人的经验,依次给出他们的一些实施思路和相关资源。

 

不修改硬件、尝试修改固件扩充

这点至少在理论上是完全可行的,因为Rovio自身就支持固件更新。因此可以像目前路由器烧录openwrt的模式来支持自己写的第三方固件。但目前Rovio并没有宣称他们开放了源代码。并且Rovio的固件采用了eCos RTOS[7],而非Linux操作系统。这对于普通爱好者来说挑战不小。

 

但如果真要走这条路,那有如下资源可用

a) 有渠道声称官方提供了部分的源代码[8]

b) eCOS是类似GPL的开源授权,OS代码可搞定

c) WIFI模块是mavell的芯片,这部分的驱动代码可以获取

d) 外设的驱动逻辑比较简单

 

不过这样做是难度最大的,差不多是完全重写了固件。这样还不如直接替换逻辑控制电路,采用其他方案,比如使用703N+Linux。

 

不修改硬件和固件、在PC上二次开发

这应该是一种最可行也是目前资源最多的办法。毕竟已经有第三方的控制终端出现,也有不少朋友说Rovio支持CGI方式的外部控制。但这也是灵活度最低的一种方式。首先无法修改固件的总总问题,也无法获得NorthStar的定位信号

 

保留驱动部分电路,替换逻辑控制电路

这是我推崇的一种做法。前面的分析大家应该只到了rovio的驱动电路和控制电路是2个独立的模块。而驱动部分其实无非就是一系列的IO控制信号或者PWM信号(控制电机)。做过机器人的朋友都会对此很熟悉。那么只要搞清楚如何使用驱动模块,就可以在任何其他控制板(arduino、STM32开发板、WR703、MK802、Atom主板...)来驱动Rovio。

这里的实施办法是去使用多通道的逻辑分析仪或者示波器或者万用表,在控制Rovio运行时,对每个IO的电平进行测量。很容易就知道每条控制信号的含义以及如何驱动其对应的设备。

随后找一个自己熟悉的控制板,编写控制逻辑即可。对于可以用的控制板,我有几个推荐方案:

1) WR703N + Arduino

WR703N是TPLink出的一款袖珍无线AP。但有了OpenWRT支持后,可以利用它做更多的事情。加我weibo的朋友应该知道我之前给它写过超频的补丁。网上也有不少人基于他实现wifi摄像头小车。本质上,有了OpenWRT提供的BSP,这就是一个廉价高性能的WIFI MIPS的linux开发板。并且400Mhz的主频和32Mb内存是足够开发rovio的应用了。

但是WR703没有足够的IO口用于Rovio的驱动板通讯,此时可以考虑通过usb串口与一个arduino控制板连接,由arduino完成与rovio驱动板的通讯,甚至可以直接用arduino来接收对所有硬件的控制。arduino可与WR703中的linux程序用串口交互

而在视频传输上,可以用mjpg-streamer轻松实现wifi视频的能力,这部分网上有不少资料,就不再罗嗦了。

2) MK802 + Arduino

这其实与WR703类似,但好处是MK802的运算能力强大很多,这可以允许诸如计算机视觉、SLAM定位地图构建、人物识别和语音交互这类高级应用可以直接运行在Rovio上。但相比较我把这个列为第二推荐的方案。主要是因为MK802的功耗相比703N高了太多。这会影响待机时间。而MK802的高运算速度此处其实不是非常必要。一方面WR703的400Mhz已经足以胜任很多高级算法,即使是跑OpenCV,简单的视觉识别算法也是可以完成的。另外真正复杂的计算,MK802也显得力不从心,此时可以利用wifi摄像头的功能,在无线的另一头使用高性能的PC处理器来完成复杂的视觉计算。

3) Raspiberry-PI (树莓派)

自然树莓派也能做这些事情,并且它直接有GPIO输出,可以将arduino省略。这也是一种不错的方案,并且正好是上述2个方案的折中。

 

对于熟悉这类开发板或者其它类似开发平台的朋友来说,在rovio上实现基本控制、视频传输等应该都是比较方便的。但对于自主返回充电和坐标记录就有一定实现困难。这里就需要将Rovio的NorhStar定位模块驱动起来,这部分的思路我将在后面介绍。

 

完全替换所有电路,使用机械平台

这部分的过程其实就很简单,前面的拆解分析可以看到rovio的机械部分都是很普通的设备,电机、LED等。这些均能使用arduino驱动器来。如果要这样做,其实就等于购买了一个小车底盘。

 

 仅使用NorthStar定位模块

对于Rovio最有价值的NorthStar定位模块这里将额外介绍一下。我相信对于做机器人的朋友来说都遇到一个问题就是如何在室内进行定位。在室外有GPS可用,而室内却不行。此时就需要有几种手段

1) 航迹推算

完全使用里程计(电机的编码器)以及惯性导航设备(如陀螺仪,但Rovio没有)来估算出机器人的运动轨迹。这种方式实现起来比较简单,但实际中航迹推算就像人在沙漠中行走,如果缺乏外部的观测设备,就容易走偏方向,因为无论运行还是测量都是由误差的。航迹推算的问题就是误差会越来越大。

这部分的过程有一篇经典的论文推荐WhereamI[9]。

2) 使用激光雷达等高级传感器

如果有这类的设备,室内定位问题很容易解决。目前市面有很成熟的SLAM算法如ICP-SLAM可以解决。

3) 视觉定位法

如RoboPeak使用的全局视觉定位给RPmini提供定位服务:

这类方法需要架设或者投射一些视觉符号给机器人使用。而这里的NorthStar定位也属于这种方式。

Northstar的思路正好与传统的视觉定位相反:它将视觉定位的标记符号(红外光斑)投射到了天花板,而在机器人上采用视觉传感器(Northstar通过简化算法,仅使用了几块感光器件)感受标记符号的光信号,并进而进行几何分析,计算出机器人在一定坐标系下的坐标和方向角。

有了这个概念后,大家应该明白NorthStar大概是用来做什么的了吧?并且前文我提到厂家对于他的定位性能给出的数据还是很具有诱惑力的:最差也可以保障30cm的误差。

这里说下如何使用其这个模块,因为我自己没有尝试,这里的只是可行的思路,如果大家进行了验证,不妨回复本文说明下情况

前面分析中可知NorthStar使用串口通讯,自然可以做的第一件事情就是将串口信号连接PC观察它输出了什么。而一般串口的波特率无法使9600 115200这些常用的。可以逐个尝试。另外就是如果幸运的话,串口的协议大多是基于文本的,这样含义很容易被理解。

当然,这样的思路也有不管用的可能,或者就是输出的数据难以被猜出含义。此时就可以找官方的网站寻找资料了。

小结

不小心又扯了那么多,本文我给了几个基于自己经验的对Rovio进行扩展开发的可信手段,希望能对大家有所帮助:-)

参考资料

[1] Wowwee Rovio公司主页

http://www.wowwee.com/en/products/tech/telepresence/rovio/rovio

 

[2] 【視象測試報告】試玩 Wowwee Rovio:識行識走識攝錄的「火星曱甴」!

http://amanda_hoic.mysinablog.com/index.php?op=ViewArticle&articleId=2041357

 

[3] Welcome to Cornell Robocup

http://www.cis.cornell.edu/boom/2005/ProjectArchive/robocup/

 

[4] NorthStar

http://www.evolution.com/products/northstar/

 

[5] NorthStar's Specifications

http://www.evolution.com/products/northstar/spec.masn

 

[6] Mint Cleaner

http://mintcleaner.com/howitworks/northstar/

 

[7] eCos RTOS

http://ecos.sourceware.org/

 

[8] 外界声称的部分Rovio官方源代码

http://www.robocommunity.com/download/17502/Rovio-eCos-Code/

 

[9] Where am I?" --Systems and Methods for Mobile Robot Positioning

http://www-personal.umich.edu/~johannb/position.htm

 

给MK802(USB大小的Android4.0小PC)引出串口信号,变成ARM开发版

最近忙各类事情,blog写的不系统,见谅。

这几天搞到了前不久被媒体宣传过的只有U盘大小的Android 4.0小PC。他的样子如下,使用HDMI接口连接显示器再外接一个usb键盘鼠标就能作为PC用了。

托朋友买了台,试用了下果然还不错,虽然是Mali 400MP + Cortex-A8 的配置,不过感觉播放1080p媒体很流畅,3D渲染没怎么测试,不过依照我以前接触mali 400的经验看,不会差到哪里,但也好不到哪里。

硬件上他使用了全智(Allwinner)的A10 CPU,实际为Cortex-A8 + Mali400 MP GPU。1G DDR以及集成的usb WIFI和一个usb host以及一个usb OTG。仅支持HDMI输出音视频。一些内部照片贴在这:

 

如果就想把它当作一台小pc来用,那么就应该到此收手,安心的用了。但相信也有不少朋友和我一样,不满足于这些功能,想完全发挥出这么小巧的arm主板的性能,那还需要做几件事情

1. 拿到kernel source以及相关的driver code。业内称为BSP(board support package)

2. 获得串口调试信息

第一件事情我们已经不用操心了,网上已经有针对A10的kernel code,且可以用于MK802的机器。对于第二件事情,我之前并没在网上看到有人说明如何在MK802上引出串口,但其实看了内部PCB也不难发现办法。在介绍前,我先和不明白引出串口信号的朋友介绍下这样做的目的:

一般做linux kenrel(其实是所有kernel层次)的开发,没有VC IDE debugger这种好用的工具,就连gdb server很多时候都不管用。最常见的办法就是通过printf把日志从串口打印出来调试。(当然如果正在开发串口驱动,那只好通过点亮几个LED灯来调试了,这听上去很疯狂,但这是事实)。虽然也有ICE/JTAG这类硬件调试器,但对于linux kernel这类OS的调试,硬件调试器就显得很不直观,而且很多time critical的逻辑无法通过下断点复现。因此,一般做硬件/kernel/驱动层次开发,有一个用于打印printk信息的串口是非常必要的。

估计又有人问,这和现在有什么关系?我们只是使用MK802,又不是做开发。呵呵,这里我们就是希望做一些“开发”。比如从简单的控制MK802上几个IO(就像arduino那样)到修改usb驱动、优化GPU驱动等等,都是hacker喜欢做的事情。那么,没有串口调试怎么行?

不扯开了,其实串口信号很好引出,具体见下图:

PCB上其实有对应的测试点,但是没有丝印标出信号含义,但其实很容易猜到:右起第二个肉眼就能看出是GND。最右侧通过万用表测量横定是3V3。那自然是VCC。左边2个自然有很大嫌疑是TXD和RXD的TTL电平的串口信号。那么怎么确定那个是TX哪个是RX? 注意左起第二个有一个上拉电阻。一般输入信号才要上拉/下拉。那很可能就是RX。用示波器看了下,果然最左侧有信号发出。果断焊上线路,启动putty,看到了熟悉的uboot画面和kernel dmesg。可惜厂家把tty给禁用了,没法登陆console。但没关系,反正有kernel source,自己编一个即可。从dmesg中也可看出,厂家对系统的优化基本没做,很多内部调试log都还在:-P

Uboot和Kernel启动log

使用putty连接usb串口

将引出的串口信号连接usb转串口适配器

用热熔胶保护,防止短路

最后提醒看的手痒的朋友一声:焊盘间距比较小,小心短路。

http://www.csksoft.net/data/code/mk802_log.txt

小时候收藏的[宝贝]

名曰宝贝,其实在当时就是不少人看来的电子垃圾了。趁着表面印字还没完全被自然氧化腐蚀掉尚可辨认型号的时候拍下照片记录下,或许在不久的将来实物就会消失了... 大家看看有多少熟悉的?





相信从小玩电子的朋友多少有些类似的收藏吧,而且上图这些东西也真的不算啥稀奇货。不过在现在高度IC化的时代,基本也很难看到了。那些体积“巨大”的电解电容现在都换成贴片的铝解或者坦电容了。还有像三极管3DG /3AG系列,现在基本也就教科书里提到,身边用的都是90XX系列。

虽然现在电路高度集成,像我这种业余玩电子的都可以轻易做出复杂的数字电路,不过还是比较喜欢以前那种用分离器件的模拟电路时代。几个晶体管很有技巧的组成了各种功能还是很有趣的,当然背后的公式计算也相对复杂,可惜小时候学识有限,上图很多元件一直没用用起来,很多当时连是啥也不知道。到现在我也还是不明白为啥图中那个绿色的3DG14为啥是四根引脚?这些疑问可别因为这些元件彻底淡出历史而永远无法解决啊。

小时候很喜欢玩高压的东西,对各类气体发光元件很着迷,收集了不少氖气发光管、验钞机的紫外灯管(blacklight)还有相机闪光灯用的放电管。可惜VFD倒是一直没有接触到,倒是现在开始玩VFD了... 现在看,这些气体发光设备到了现在基本都被各种LED代替了,而当时身边能搞到的LED还只有红外、红、黄、绿。以前也幻想过蓝、白、紫LED啥时候能问世,结果没几年就真的出来了。

就此打住,不再怀旧了 

信箱检查器和气象站的微博发送脚本

之前写了一个定时把之前做的太阳能信箱检查器和气象站数据发送微博消息的脚本,现在按照约定公布它的代码。

都是用bash脚本写的,简单粗暴有效:-)不提供技术支持

有兴趣的可以去关注:)

自制低成本3D激光扫描测距仪(3D激光雷达),第二部分

这是本系列文章的第二部分,着重介绍我自制3D激光雷达的制作、校正过程。

对于其中的原理,请参考前一篇文章:

 

目前本制作已经开源,代码托管于google code。请访问项目页面下载

http://code.google.com/p/rp-3d- scanner

自制低成本3D激光扫描测距仪(3D激光雷达),第一部分

http://www.csksoft.net/blog/post/lowcost_3d_laser_ranger_1.html

版权信息:

本文采用CreativeCommons2.5授权许可,欢迎转载,但请保留原始作者信息以及原文链接。

1. 设备设计

核心元件原型

在第一篇文章的原理介绍[1]中,已经大致提到了本次制作的核心元件:摄像头、激光器以及进行扫描的伺服电机的 选型要求。

对于我期望的精度和性能,一般市面常见的USB VGA摄像头即可满足要求。

图:本制作使用的USB摄像头(已经拆除外壳)

对于激光器的选择,主要是考虑他的发射波长和功率。由于我的制作并不用像产品那样考虑激光器功率安全[2]问题 ,因此,采用了200mW的红外一字线激光器。较大功率的优势是可以通过缩短摄像机曝光速率,从而从画面上过滤到环 境光的干扰,同时也可以扫描较远的距离。当然,200mW的激光器功率的确有点太大了,在使用时注意不能用 眼睛直视,并且红外激光器人肉眼不可见,所以需要额外的当心

图:制作所使用的红外一字线激光器

在使用了红外激光器后,可以通过给摄像头加装红外滤光片。它可以将肉眼可见光过滤,仅允许激光器发出的红外 光进入摄像头。从而有效地过滤环境光带来的干扰。对于红外滤光片,最佳的选择是使用与激光器发射波长相匹配的滤 光片,比如如果使用的是808nm的激光器,那么滤光片选择808nm的窄带滤光片最合适,这样做可以最大程度的降低干扰 。因为现实中,日光、白炽灯、遥控器也都会发出红外光谱。

但是这样的滤光片一般价格偏贵,在本制作中,我使用了800nm截至的低通滤光片。它允许任何波长低于800nm的红 外光通过。不过实际效果还是不错的。

图:本制作采用的低通红外光滤光片

对于用于扫描的伺服电机,由于摄像头的帧率是30fps。扫描速度不需要很快,因此这里使用了普通的标准舵机。他 的优势是可以直接控制定位到特定角度,驱动也相对容易。不过精度不高,对于0.3度的角度定位,已经有些吃力了。 这也是值得改进的地方。

图:本制作选用的舵机

这里统一列出他们的参数:

摄像头:VGA画质的USB摄像头,30fps (市面普遍可以购买的型号)。非广角

激光器:50mW 红外一字线激光 808nm

滤光片:10mm直径红外低通滤光片

舵机:HS-322hd 43g标准舵机

安装考虑

这里主要针对原理[1]中提到的几个参数的选择,决定激光器、摄像头的安装方式。在[1]中,我提到了摄像头焦距 和摄像头-激光器距离(s)的乘积f*s应当满足:

fs>=700

一般市面USB非广角镜头的摄像头的焦距在4.5mm左右,因此,s一般选择160mm左右。也就是说,摄像头和激光器的 间距在160mm或者以上。当然,如果觉得这间距太大了,也可以稍微缩小,正如[1]提到的,目前摄像头的像素尺寸一般 比较小。

另外一个在安装中要考虑的参数是激光器夹角beta。[1]中同样提到他的值在83deg左右。对此,安装的时候不必也 不能死板的测量角度并安装,这是因为除非使用了工业精工级别的激光器,否则激光器发出的激光射线也存在夹角。

beta角度可以在安装完成后进行多次修正,保证在较远处,画面中仍然可以看到激光轨迹,再进行固定。

2. 机械和结构部分

对摄像头的改装

由于我们使用了红外激光器,因此需要对摄像头做一些修改。

首先是要移除摄像头镜片中的红外截止滤光片。该滤光片的作用与前文提到的红外滤光片功能恰好相反:它将红外 光谱过滤。一般摄像头内都会含有这种滤光片。如果不移除,则只能够感受到很微弱的红外信号。(题外话,可以用拆 除截至滤光片的摄像头观察kinect投射出来的红外图案)

 

图:位于摄像头镜头中的红外截止滤光片

其次就是将前面提到的红外低通/带通滤光片安装到摄像头中,这里采用比较山寨的组装方式:用胶布固 定在镜头前面,不过效果也可以接受。

图:将红外低通滤光片安装在摄像头上

制作激光器、摄像头的固定平台

这里使用了轻质的木板来安装摄像头和激光器。选择它的主要原因是容易加工。如果有条件,可以考虑使用热缩涨 比率小的金属或者塑料材料来固定。

图:使用木板作为固定摄像头、激光器的材料

在木板上打孔,保证激光器和摄像头能正好装入,2个孔之间的距离是前文提到的160mm左右。不过不必 很精确,因为它的精确数值可以通过校正得到。这样安装的时候就比较省心。在给激光器打孔的时候要注意角度的问题 。

图:木板打孔后,将摄像头和激光器装入

 

 

图:在木板底部打孔,安装螺丝柱,用于固定在舵机转盘上

底座和舵机安装

我是用了用于安装仪器的塑料盒子作为扫描仪的底座,这类盒子可以在taobao上找到。

图:选用的塑料盒子和舵机

将盒子顶板开孔,使得舵机能够放进去:

图:将盒子开孔

图:将舵机嵌入盒子顶板

最后将之前的摄像头固定支架安装于舵机上:

 

3. 电子系统制作

这里的电子系统主要功能是从PC接受指令并控制舵机转到指定角度的。由于摄像头已经是USB接口了,所以这里的电 子系统不用去处理摄像头的信号。

目前PC外设使用USB几乎已经成为了一种标准,为了使得设备使用尽可能方便,如果能做到免驱动,那就更加完美了 。

这里我才用了我们RoboPeak机器人团队设计的一款AVR开源控制版:RoboPeak Usb Connector[2]来实现这部分功能。它使用单片AVR(Atmega88)芯片通过软 件方式模拟出USB协议栈,并且使用了HID协议使得无需在PC上安装驱动程序。对于这部分的细节属于固件实现部分,将 在后文提到。

图: 我们RoboPeak团队的开源USB方案:RP USB Connector(蓝色PCB)

这里列出本制作中电子系统所实现的功能

实现了一个HID类的USB设备,无需第三方驱动程序支持

支持通过USB接受指令,控制舵机运转到指定角度

可通过USB指令,开启/关闭激光器

通过一个双米字LED显示屏,显示当前舵机的角度

支持用户通过设备上按钮手工设置舵机角度

对于USB设备的实现、接收处理USB指令等属于固件范畴的职责,这里将不做讨论。这里使用了RP USB Connector, 因此其固件已经支持了此部分的基础操作,也可以在他的介绍页面[2]查看详情。

米字LED数码管的驱动

由于2个米字形LED含有16多个独立的LED需要独立控制,RP USB Connector上并没有如此多空闲IO口。因此这里的做 法是很传统的采用74595串行转并行输出芯片。RP USB Connector上通过SPI总线进行控制。

图:使用2个74595芯片驱动双米字LED数码管

扩充RP Usb Connector

由于RP Usb Connector主要功能是做为AVR芯片编程器和通用USB开发版的,上面并没有舵机控制和激光 器控制功能(需要三极管扩流)。因此需要做一块额外的电路扩充它的功能。电路比较简单,这里就不介绍了,可以参 考本章节模块给出的电路图。

图:在RP USB Connector基础上做扩充电路

制作角度手工控制面板

这部分做的比较粗糙,主要就是在塑料盒子外边加装按钮,就不多介绍了,给一些制作的照片。

图:按钮(正面)

图:按钮(背面)

总装

最后将所有线路连接起来,并关闭盒子,设备的安装就大功告成。

这里给出一个早期的视频:

 

电子系统电路原理图:

RoboPeak USB Connector电路图:

这部分请访问位于google code托管的开源项目:http://code.google.com/p/rp-usb-connector/

扩展电路/LED驱动电路原理图:

目前本制作的所有源代码和电路也已经托管于Googe code, 请访问如下地址下载:

http://code.google.com/p/rp-3d- scanner

4. 固件以及PC通讯

这里的固件自然就是运行在RoboPeak USB Connector AVR芯片上的固件代码了。这里只大致列出实现的思路和原理 。具体的细节以及基础知识不做介绍。源代码可以在本制作的google code项目页面[3]上找到。

固件实现的功能

如前文所述,固件实现了:

  1. 通过软件方式模拟出USB1.1协议栈(使用了v-usb库[4])
  2. 实现了HID(Human Input Device)类的USB设备进行通讯,在PC上无需外驱动
  3. 控制舵机角度
  4. 驱动LED数码管显示

同时,固件代码采用了我之前写的Arduino-Lite[5]轻量级AVR固件库。因此如果需要使用这里的固件代码,请在 google code上下载并配置Arduino-Lite[6]。

接下来我将跳出一些典型问题介绍

HID-USB设备的模拟及与PC通讯

RoboPeak USB Connector使用的是不含有USB接口的AVR芯片。因此,USB通讯支持是采用软件方式进行的。索性目前 v-usb开源库[4]已经提供了很优秀的封装。

软件模拟usb的优势在于可以降低设备成本(带有USB的AVR芯片成本较高),缺点是稳定性和速率上不如硬件实现。 对于本制作,稳定性和速度并不关键。

在使用USB与PC通讯时有一个烦恼的问题是驱动。直接为系统编写驱动程序会提升本制作的难度,同时对于64位 Windows系统,微软要求驱动程序进行签名。目前也有一种可以在用户态实现usb驱动的方案:libusb。但是,同样在64 位Windows系统上,这个做法就不管用了。

这里采用了另一种思路:利用那些OS自带驱动支持的USB类设备。(USB协议中预先定义了几类USB设备的种类,比如 Mass Storage就是平时用的移动硬盘、UVC设备常用于实现摄像头、HID设备用于实现键盘鼠标。OS往往会自带驱动支持 这类设备)。这里我也使用了HID类设备。理由如下:

  1. 协议比较简单,通讯单位也是数据包
  2. 支持USB1.1低速率规范,可以用v-usb实现
  3. 在Windows、Linux、Mac上均可以通过OS提供的用户态API与HID设备通讯

采用了HID设备后,及时在计算机上第一次使用本扫描仪,OS也能直接识别,不会要求安装驱动或者配置文件。

图:本扫描仪在PC上识别为HID设备

 

接下来的问题是如何利用HID设备进行通讯了。这里的做法千差万别。为了提高通讯质量,这里我使用 了带有checksum交验的,基于数据包的通讯协议,将它运行在HID协议之上。因为本固件是基于RP USB Connector固件 的缘故,我直接采用了用于AVR芯片烧录器的STK500v2协议。

图:本制作的通讯构架

舵机驱动逻辑

在AVR上有很多舵机驱动库,这里我使用的是RoboPeak对Arduino自带舵机库的修改版本,该版本使用 Arduino-Lite进行了重写,精度上也较高。但这部分不影响具体效果,因此就不多介绍了。

数码管驱动逻辑

在RP USB Connector上引出了SPI总线,因此很自然的我使用SPI协议驱动74595芯片,直接通过AVR控制 数码管的每个LED,从而支持显示任意的图案。

要注意的是,由于双米字管的每个字符上相同位置的LED公用信号线,因此在驱动上需要采用传统的扫 描方式,轮流点亮LED。

5. 图像处理和渲染

图像处理部分就是第一篇文章[1]所介绍的几个步骤:

  1. 获取摄像头原始画面
  2. 通过摄像头校正参数,消除画面扭曲
  3. 提取和识别激光光斑的位置
  4. 通过激光光斑的位置,代入距离求解公式,算出对应点真实距离

本制作使用了OpenCV库简化图像计算的开发难度。同时这样也有利于代码的跨平台移植。对于摄像头的校正,会在 后文介绍。

这部分的细节已经在第一篇文章中详细介绍了,因此这里给出程序运作中的截图作为示意:

图:对摄像头画面进行扭曲校正并识别激光点的过程

 

由于采用了红外激光器,在加装滤光片后,背景光干扰被有效的去处。画面上除了激光光斑外,几乎看不到别的内 容。红外激光在摄像头中以偏紫色的色彩显示。

上图中显示了画面中心点的激光中心坐标值。这样做的目的是用于后期进行测距参数的校正。而使用中心点的原因 在第一篇文章中已经介绍。

渲染点云

在视频中看到了实时扫描并显示点云的画面。在明白了扫描原理后,这点就没什么特别的了。基本上都是基本的3D 渲染得技巧。我使用了Irrlicht[7]开源3D引擎简化了这部分的实现工作。

除了自行编写软件外,也有很多工具可以用来查看3D点云。比如开源的MeshLab[8],Blender[9]以及Matlab。在后 文我将给出可以在Meshlab中观看的点云数据。

要产生可被这类软件读取的文件很容易,像MeshLab支持如下格式的文本点云数据

x1,y1,z1

x2,y2,z2

...

xn,yn,zn

 

6. 校正

当完成所有部分制作和PC端软件后,就可以进行校正工作了。校正主要分为:相机校正和测距校正。

相机校正

我使用自己打印的Chessboard图案,分别在不同距离和位置下拍摄了不同画面。校正工具使用了matlab的Camera Calibration Toolbox。它的信息请参考第一篇文章的参考文献[10]。OpenCV也包含了相机校正功能,也可以直接使用 。

图:用棋盘图在不同位置下拍摄画面

图:使用matlab进行校正时识别出的Inner Corner

图:校正计算的外部参数(对本制作无用)

在完成校正后,将得到如下的校正参数:

Calibration results (with uncertainties):

Focal Length:          fc = [ 935.44200   929.73860 ] ? [ 11.29945   10.64268 ]
Principal point:       cc = [ 149.00014   233.25474 ] ? [ 17.13538   11.11605 ]
Skew:             alpha_c = [ 0.00000 ] ? [ 0.00000  ]   => angle of pixel axes = 90.00000 ? 0.00000 degrees
Distortion:            kc = [ - 0.13196   -0.05787   -0.00358   -0.01149  0.00000 ] ? [ 0.04542   0.12717   0.00195   0.00565  0.00000 ]
Pixel error:          err = [ 0.24198   0.25338 ]

Note: The numerical errors are approximately three times the standard deviations (for reference).

对于这里的应用,之需要关心Focal Length、Principal point、Distortion的几组参数。可以使用OpenCV的 cvInitUndistortMap/cvRemap读取校正参数并完成画面扭曲消除。

测距参数校正

 

需要校正的参数请参考前一篇原理文章。要开始测距校正,首先要求PC客户端软 件已经能够得到激光光斑中心位置了。这里给出对画面中心位置激光光斑测距参数校正的过程。至于这样做的理由,已 经在第一篇文章中详细介绍了。其他的参数可以用相同的思路进行。

理想的校正环境是比较空旷的区域,前方有垂直的白墙用于反射激光光斑。并配 备高精度的测距仪器参考。我没有这样的条件,也没有必要如此,因此采用了比较山寨的参考设备:卷尺。

图:进行测距参数校正

上图正是在制作本测距仪时进行校正所拍摄的照片。所需要的设备就是一把卷尺 ,当然最好能够足够长,有5-6m。这样可以校正到较远的距离。一般校正到5米是必须的。

校正至少需要采集2个参数:实际的距离值,激光光斑中心点位置。校正采集到的数据自然是越多也好 ,但一般6个以上的点即可。

如下是本制作校正采集的数据:

Dist X
146.8 14.79
246.8 259.63
346.8 356.72
446.8 420.24
5 46.8 457.9
746.8 503.58
946.8 528.9
1146.8 546.71
1546.8 567.54
1846.8 576.87
2246.8 586.08
3046.8 597.04
4046.8 604.6
5546.8 611.9

在完成了数据采集后,可以在matlab等工具帮助下,进行曲线拟合。拟合的曲线公式正式前一篇文章提 到的式(4)。可以看出采集的数据和理论曲线非常吻合:

图:对校正数据进行的拟合

 

7. 结果和讨论

本制作的结果在文章开始的时候已经给出了,简单说,就是达到了我的预期:-)

指标如下:

绝对测距精度:1m内-/+10mm与实际值的偏差,5m处最大80mm与实际值的偏差
扫描角度: 0-180度
最小步进 :0.3度
扫描分辨率: 480 points per sample
扫描速度:30 samples per sec (180度,1度步进需时6秒)
成本:~¥150

这里给出前面图像和视频中出现的我的扫描像的点云数据,可以在MeshLab中导入察看:

同时也给出一些额外的图片和视频:

图:在Matlab中查看点云(点击查看原始图像)

视频:另一段实时扫面渲染

视频:matlab中观察点云

 

性能分析

这里主要看看扫描精度实现的情况。如果之前校正用的基准数据没有任何误差(实际不可能),激光光点提取算法没有问题,那么实际工作时刻的误差主要就体现在拟合的曲线与实际的函数曲线的差距。换句话说,就是拟合得到的参数于实际正确的参数(我们并不知道)。

当然,上面2个假设实际都是不成立的,不过,我们先加设他们都没有误差,先来分析校正曲线与实际曲线的误差:

 

Dist   X      Calc        Diff
146.8  14.79  123.3103843 23.48961566
246.8  259.63 231.8752505 14.92474953
346.8  356.72 328.8075565 17.99244355
446.8  420.24 440.8004392 5.99956081
546.8  457.9  546.254414  0.545586001
746.8  503.58 758.5428124 -11.74281238
946.8  528.9  958.9149139 -12.11491386
1146.8 546.71 1172.910412 -26.11041169
1546.8 567.54 1578.227294 -31.42729368
1846.8 576.87 1862.988106 -16.18810582
2246.8 586.08 2262.96604  -16.16604012
3046.8 597.04 3030.93851  15.86149048
4046.8 604.6  3948.153444 98.64655635
5546.8 611.9  5564.223928 -17.42392847

上表是在之前校正中收集的数据基础上得到的,其中Calc列的数据是通过校正后的拟合曲线,通过式(4)的计算得到的测距数据,而Diff就是计算得到的距离和真实距离(Dist)的差值。这里的单位除了X列外都是毫米。

从数据上很直观的可以看到在4046mm处进行测距时,计算结果和实际值相差了98.64mm。相比这个,对于近距离的数据,误差也比较大。对于第二个现象,在前一篇文章的文献[3]猜测这是由于镜头扭曲造成的。但是,大家可能会有疑问了,我的实现不是已经做过相机校正了吗?为何还会有镜头扭曲?这里给出几个可能的解释

  1. 相机校正结果存在误差,造成仍旧有细微扭曲
  2. 相机校正也是基于实现设计出来的数学模型,实际情况有很多其他因素均能导致画面扭曲,但他们无法通过目前的校正修正
  3. 红外光的折射率与自然光不同,校正是针对自然光频率范围进行的,因此对于红外光,扭曲依然存在

实际的情况可能是这些原因中的几种组合。

另外,别忘了我们之前做的2个假设,实际他们也是不成立的。在得到了这个误差表后,接下来的问题是:可否继续校正来弥补这个误差?前一篇文章的文献[3]表示这也是可以做得,至少有了上面的表格后,可以在对应的距离下直接校正出正确结果。不过这样做的有效性有待验证。

 

除了测距精度外,这里也提一下扫描的分辨率。在前文中我提到过目前的舵机可以实现0.3度的角度定位精度。但实际上对于近距离物体扫描,这是不够的。目前的设备比较适合进行大范围扫描,这也比较符合他作为激光雷达的用途。

8. 下一步工作

目前本制作已搞一段落。这里说说我的制作动机和下一步打算。

其实动机在前一篇文章中已经点到,就是用于我们RoboPeak团队的机器人,进行SLAM。这也是接下来我即将进行的事情。当然,其实能做的事情还有很多,比如:

进行多视角扫描,并合成为一个全局点云

其实商业的扫描仪都会支持这个应用。目前一次3D扫描只能采集物体的一个表面,而他的背面则无法扫描。如果对物体的背面也进行3D扫描,那就能得到完整的3D模型了。

要实现它,可以有2种办法:

  1. 旋转物体本身,扫描仪固定
  2. 扫描仪在不同方位扫描目标物体

1的实现和原理很简单,2的核心问题是如何将2次扫描的点云对应起来?除了人肉拼接外,实际上也有比较成熟的算法,这类算法成为Surface Registration。如ICP-Slam也是采用了这样的算法。

 

提高扫描精度和速度

更高的精度和速度永远是对这个作品的需求,这就不多解释了。我在原理部分也提到了改善性能的方法。

基于3D点云进行物体识别

这个应用就很类似于Kinect。其实实现的算法也是相同的。

这里也提一下一个可用的工具和库:PCL (Point Cloud Library)[10]。他也是又机器人公司WillowGarage推出的开源库。其中包含了可以实现上述扩展的基础库。可以尝试。

 

好了,这个系列的文章就告一个段落了,感谢能耐住性子看到这里的朋友们:-) 如果你们愿意,可以在我Blog上的本文留个言让我知道:-) 每次写好这类文章,都感慨写文章要比制作复杂漫长,其中要把自己的想法转化成大家能懂得语言,对我这个表达能力较差的人来说还是蛮辛苦的。

时隔几个月,我blog终于迎来一次比较大的更新。希望自己也能坚持下去,不过,业余时间的确也比以前少了些。不知道我下一篇文章是何时发布呢?当然,我业余时间的另一个投入就是我们RoboPeak团队,大家也可今后在我们团队动态中了解我正在做的事情:-)

参考文献

[1] 自制低成本3D激光扫描测距仪(3D激光雷达),第一部分
http://www.csksoft.net/blog/post/lowcost_3d_laser_ranger_1.html

 

[2]: Driverless USB AVR/51 ISP Programmer powered by RoboPeak
http://code.google.com/p/rp-usb-connector/

 

[3]: 本制作在Google Code的开源项目页面
http://code.google.com/p/rp-3d-scanner

 

[4]: V-USB, Virtual USB port for AVR microcontrollers
http://www.obdev.at/products/vusb/index.html

 

[5]: Arduino-Lite, Lightweight AVR library developed by RoboPeak
http://www.robopeak.net/blog/?p=131

 

[6]: Arduino-Lite Project
http://code.google.com/p/arduino-lite/

 

[7]: Irrlicht Engine - A free open source 3d engine
http://irrlicht.sourceforge.net/

 

[8]: MeshLab OpenSource Project
http://meshlab.sourceforge.net/

 

[9]: Blender OpenSource Project
http://www.blender.org/

 

[10]: PCL - Point Cloud Library
http://pointclouds.org/

 

分页:[«]2[3][4][5][6][7][8][9][10][11][12][13][14][15][16][»]

日历

<< 2015-6 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)