制作带图象处理的机器人--UniRoP 写于: 星期三 07 六月 @ 05:09:58 |
||||||||||||
这篇文章详细介绍如何制作带图象处理的机器人UniRoP 系统。这个移动机器人包括一个Renesas(瑞萨科技)M30624微控制器(MCU),红外距离传感器,一个二维加速度传感器和一个光学轮式编码器。 制作带图象处理的机器人--UniRoP 作者:Jens Altenburg 文章来源:Circuit Cellar, May 2006, Issue 190 翻译:中山野鬼 几年前,图象处理是基于PC的应用场合。模式识别,对象检测,图象数据分析等要求处理器有高性能的计算能力和大量的内存空间以及诸如摄象机或帧读取设备(图象采集卡, Frame Grabber,译者著)。而今天,由于手机应用的需求,高性能的光学传感器已经唾手可得。 新的CMOS(译者注:CMOS和CCD是两种通过硅芯片进行电成像的方式,将光信号转换成电型号,CMOS是一种工艺方法,成像原理两者类似,有兴趣的可以参考一些模拟电路和模拟IC设计的资料)图象传感器包括光学传感器和控制电路。因此你只需要再填加一些外围器件就可构造出一个照相机。光学传感器设备和通常你所见的微控制器一样简单。但是如何解决复杂的软件算法和额外的计算能力呢?受采样帧的速率和图象分辨率影响,一般图象传感器每秒要生成上兆BYTE的数据。那么在小型机器人平台上能实现图象处理吗? 早期,PC机的时钟速度为25MHz甚至更低。计算能力并不是处理上述问题的瓶劲。因为图象包含大量的数据,基于MCU(Microcontroller,微控制器,俗称单片计算机或单片机。)系统的真正缺陷是缺乏足够的内存空间。 通过使用M16C控制板(由Renesas, 瑞萨科技推出)来克服上述局限。直接内存访问(DMA)功能解放了CPU而直接将图象传感器的数据写入内。优化过的软件另所使用的内存空间降到最小。 在这片文章中,我将介绍我的UniRoP 系统(参见图1)。这个移动机器人包括一个Renesas (瑞萨科技)M30624微控制器,红外距离传感器,一个二维加速度传感器和一个光学轮式编码器(译者注:通常用在电机执行器件上检测转动角度或者位移的),请参见图2。 图1,UniRoP只有少量的机械部件,PCB同时作为电路控制板和机器人的底盘。尺寸很小,重量只有220克,这个机器人非常适合作为机器人研究平台 (点击放大)。 图2,除了红外传感器和加速器传感器,UniRoP还安装了一个无线电传送模块,一个CMOS图像传感器。软件模块和一个简单的多任务RTOS (Real Time Operate System)显示在图的右上角。 最有意思的部分是这个机器人的CMOS图象传感器。传感器模块是基于OmniVision公司的OV6620CMOS图象传感器。我通过一根20芯的扁平电缆(译者注:类似硬盘线的排线,硬盘为40PIN。此为20PIN)将其和主板连接。 传感器和MCU 图3展示了M30624微控制器如何与图象传感器模块相连的。图象传感器模块的接口是数字信号。8位的数据总线。PCLK和VSYNC信号是用于同步数据传递。字任何图象帧的开头VSYNC信号拉高。在PCLK的每个上升沿传递对应的每个像素点的值。一个I2C总线(译者目前大多数嵌入式系统IC均兼容此类总线,可参阅不同的IC资料获得)控制OV6620内部寄存器。为了提高适应性,图象传感器模块在独立的PCB板通过上述扁平电缆连接和主板。图象传感器模块的接插件为X1。 74HC00反向PCLK的信号。I2C总线需要RX2和RX3这两个拉升电阻。I2C总线信号为标记为SCCB_DATA和SCCB_CLK的引叫传输。HSYNC无意义。RESET用于图象传感器的重置。你可以通过PWDN(译者认为就是POWER DOWN)来降低图象传感器工作模式使得功耗最小。 图3, 图像传感器与微控制器的连接只有数字信号,所以比较简单。像素数据由M30624的P3捕捉,I2C总线用于控制 图像传感器内部的寄存器。DMA通道直接将数据传送到微控制器的RAM中,从而节省了时间和计算能力。(点击放大) RTOS 结构RTOS (译者注:RTOS 为real time operate system,实时操作系统,相对分时多任务操作系统而言,对每个任务的时间控制能力更强,适用于对时间要求较高的,特别是嵌入式系统) 为机器人平台设计一个简单的软件结构是一个真正的挑战。在网上有很多相关的话题,但是大多数是谈论类似避障等简单的任务。 M30624微控制器有足够的能力支持一个多任务实时操作系统。但是大多数初学者在理解这个系统和使用其功能时存在问题。另外每个多任务系统都需要能和微控制器的调试ROM监视器结合起来。 所以,先让我们定义一下我们需要什么。一些功能基于RTOS。另一些不存在冲突的任务可以运行在一个多任务环境下。最简单的方案是基于中断实现多任务系统。所有的软件必须分割为快速执行片段(译者注:这是一种实现多任务操作的解决方案。其原理是当通过中断进行各个任务切换时,如果在执行任务过程中也保持中断的完全工作,则可能导致每个任务在最坏情况下都不能正常完成,因为还没有处理完核心程序甚至还没有处理完中断响应的环境备份工作,就可能出现新的中断调用。解决方案是在进入程序后,关闭中断。并在程序退出时打开中断。为了能更快的切换任务和响应外部中断,则必须要求程序在关闭和打开中断功能的时间尽可能短。因此一种解决方案就如原文这样,将长的程序切成小片)。每个单元将在固定的时间片执行。 为实现上述方式,一个简单的解决方案是采用函数指针列表。(译者注就是指向函数入口地址的数组,参考一些高级C或C++语言编程方法。主要方式为定义一个函数类型。然后定义该类型的指针。而编写好多个该类型的函数后,用指向该类型的指针指向函数,则每次调用对应函数时,可以直接使用该指针完成,优点就是可以根据变量来确定当前程序中调用哪个函数,而不是用IF语句来将这些函数显式写入代码中。)但是出现了一个严重的问题。每个任务被分割为短小的序列。所有这些小块的实时处理时间总和必须小于计数器的一个周期。有时很难通过这种方式进行程序基本单元模块的设计。这种方式最重要的特性是具备精确的时间性(如果每个程序工作正确的话)。 如果你不需要对几个软件单元模块进行处理并切换,那么你的工作将变的简单。图4显示了这个系统的时间调用(译者注:该图显示的是不同优先级的任务操作的时序。横坐标为时间,纵坐标为优先级,对于最第层的task1…task3为标准的任务。其总在每个时间片中对应处理,而更高优先级的任务是一些同步的对外任务,如控制电机和无线传输等,其也在每个时间片中存在。当出现高优先级任务时,将占用那些task…而确保任务的及时响应。从描述看和一半的优先级调用没有太大区别,相对于PC机和一些常规设计而言,而在RTOS中再高权限的优先级的响应,也不能占用那些需要实时性的任务。)一些独立的任务运行在低优先级。每个任务有自己的内存空间(变量、堆栈等)。调度这些任务的计划就是上下文切换(译者注在多数的操作系统设计或原理的书籍中都有这些描述。简单的解释,上下文切换就是完成从一个任务到另一个任务的转换工作。因为大多数CPU都是单核的,所以在停止当前任务和进行下一个任务中,我们需要将包括计算寄存器,堆栈等一系列的和硬件有关联的数据进行保存或者恢复,上下文切换并不包含各个任务之间如何调度)。高优先级中断为那些特殊的时间。 图4, 增加一些更高优先权的函数来扩展多任务内核。调度器必须设定为最低优先级中断,在时间片中运行普通的任务,不另外设定不同的优先级。类似于轮子PID控制等实时功能需要中断。 ImageCraft公司的μexec多任务系统较为简单。我把它作为我的UniRop 系统的预制多任务系统。由于这个系统原先就是为8位的控制器设计,并且大部分代码是基于C语言,所以移植并不复杂。因为中断中存在上下文切换设计,因此汇编代码是必须的。我们需要设计4个汇编函数,分别是UEXC_Resume(), UEXC_StartTimer(), UEXC_SaveregsAndResched(), UEXC_StartNewTask(). 这些函数在Circuit Cellar 的ftp 的system.c文件中。 写到这里,移植代码是已经非常清楚和易于理解的。但是请记住在上下文切换中,需要构件一个中断堆栈以及退出时需要采用reit命令。如果这个工作被更高优先级中断打断,则会有一个新的中断堆栈为新的中断服务。由此会形成一种嵌套运行的现象。 调试器和KD30软件需要使用M30624其中的一个 UARTs来实现通讯。调试器周期的活动并进行通讯。为了降低传输时间,进向的命令序列将中断M30624的应用软件执行。全局中断在接受到命令后立即重新使能,但是监控系统此时并没有完成工作。如果调度计划在上下文切换的时候出现监控函数工作,则整个软件系统将崩溃。应用程序和调试器是独立工作的,但是调度系统并不知道。调试器和uexec在这个软件没有重要改动下,是无法联合使用的。 解决方案很简单。在转换上下文前,调度程序检查中断活动的ROM空间。换句话说,监控系统禁止调度。 调试器运行代码放置在比应用程序更高地址的ROM中。在List 1中,CMP.W 命令决定是监控系统还是应用软件实现中断。结果是,uexec可以很好的独立于监控系统工作 。 搜索和跟踪对象低价机器人平台上通常不具备图象处理能力。我设计这个UniRop因为我需要学习一些简单的图象处理。M30624的一些特点使得我相信我的设计肯定会成功。M30624的包括大31KB的RAM,而且可以实现DMA模式。在Circuit Cellar FTP上的,Videoa1.c程序模块包含了绝大多数简单图象检测所需要的必须函数。 为了检测图象质量,测试软件可以将图象通过RS232传输给PC机。在circuit CellarFTP上的serialcam.exe就是图象检测工具的应用程序。为了最小的占用内存和降低计算功耗,我们将图象大小设置为64*120黑白象素。这个系统的图象质量比较差因为资源过低,无法处理大数据量的图象。而图象处理程序的任务是去检测和显示图中最大的物体。 搜索算法中,最主要的问题在于如何区分图象中的目标与背景(译者注:即图象分割技术)。最初我的实验方法是通过点的亮度来区分对象和背景。我们用一个矩阵来I (m, n)来描述图象。此时需要一个亮度值(S)来区分目标(O)和背景(B)。亮度概率公式如下。 Io为对象的点数。Ib为背景的点数: 亮度分布公式如下: 误差可以方便的通过下式获得: 一个优化的亮度值如下定义: 这个等式用来从背景区分对象。如果这个对象看上去象一个Lamberthian放射器(具备均等的亮度),则你可以忽略公式的后半部分。 列表2给出了一个如何计算S的算法流程。对于B的值,对象和背景是不一样的。所有大于B的值属于对象部分。小于B的值属于背景部分。 所有的等式,看上去是明确的。但是如何用算法实现?图5展示了一些计算结果。图5a是采用在X轴方向用固定亮度进行分割的算法(译者注:就是直方图法。在Y轴上进行灰度(即亮度)统计。通过平均值或其他方式获得阈值,比其小最为背景,比其大作为前景)。部分背景被误认为对象。这样的结果无法使用。 一个红色滤波器放置在镜头前,由此获得了图5b。不幸的是一些点无法检测到。这样好些但是并不达到使用要求。 图5c,在X轴上可以获得正确的数值。这个搜索算法没有采用固定值作为对象和背景分割的阈值。这个阈值可以根据实际亮度情况自我调节。(红色滤波器也起了一定的帮助作用)。
图5,使用不同的方法来提高图像的质量。a. 没有使用红色滤波器得到的图像;b. 使用红色滤波器;c. 这个图像,可以清楚分出Lambertian(点击放大)
捕获的数据通过连接到PC机COM口的RS232电缆传输。因为正常 情况下的COM的传输速率最大只有115Kbps。传输一幅捕获的图象需要很长时间。 简单的图象存储无法完成,因为这需要大量的内存空间。一个可行的解决方案是压缩获得的图象数据。我们需要在传输时间和压缩计算量上做平衡。(图6)
图6,不同的压缩比,效果也不一样,a压缩比最低,效果最好,c压缩比最高,效果最差。(点击放大) JPEG算法通常用来压缩图象,但是这样的压缩算法的计算复杂度并不低。我通常采用块截取编码(BTC)来获得一个压缩流。这个算法比JPEG简单的多。BTC的算法的实现是基于图象在i和j轴上的正交特性。 定义一个8X8的块为计算单元我们称为宏块(MCB: Micro Cell Block)。首先计算这个宏块中的灰度平均值。灰度平均值即为每个点的灰度的累加并除以总共的点数。 BTC的思想是建立一个标准差并计算出两个灰度值a和b。这个公式是平均暗度值,后面的是平均亮度值。标准差如下: 两个灰度值如下: (译者注:就是通过算术平均值加上标准差与前景概率平方的乘积获得亮度值)。 算术平均值减去标准差与背景概率平方的乘积获得获得暗度值。通过上述的暗度和亮度值替代图中的灰度值来作为宏块内部的数据。 (译者注:这种方法原文没有说明清楚。我个人觉得是采用去掉每个点的重复信息(即平均值)来获得缩小每个点灰度级数从而实现压缩。这种非相关性的统计压缩具有速度快计算方便的特点。但是对于噪声大的图象,压缩效果并不很好。如果作为一种非冗余压缩,本身在计算概率和标准差时就存在一定的误差。而原文并没有说出是否采用冗余压缩方式,同时个人认为这种方法对于灰度分布概率均衡的图象没有效果。就是经过灰度均衡,任何灰度值和概率成比例的图象,是没有效果的)。 BTC的计算结果比标准的JPEG的压缩要差。但是计算简单便于时间,具有很好的实时性。例如压缩一个与内容无关的图象,压缩比可以达到6.4:1。 几个类似的应用图7中的PowerBot可以应用于安全检测,它可以检查安装在车底的可疑物体。尽管这个系统比UniRoP大,不过他们的电子部分和控制算法类似。 PowerBot装备了摄像机和独立的无线电通道。PowerBot和摄像机是由基于PC的远程控制软件来控制的。 图7,PowerBot(点击放大) 图8展示了使用PC控制飞行器――Foxbat, 图8,Foxbat(点击放大) ―――――――――――――――――――――――――――――――― 作者介绍:Jens Altenburg是德国CT-Video公司的项目经理, 他于2004年获得自动化博士学位,他的研究兴趣包括电子、机械和模型飞行器。 ――――――――――――――――――――――――――――- 文章来源(有PDF文件提供下载): http://www.circuitcellar.com/library/print/0506/Altenburg190/index.htm 感谢中山野鬼翻译此文! |
共1条
1/1 1 跳转至页
制作带图象处理的机器人--UniRoP
只看楼主 1楼
关键词: 制作 图象处理 机器人 --UniRoP 系统 这
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |