1.设计意图。
本项目计划以Altera CycloneII FPGA为核心,用DE2-70作为开发平台,设计一款基于全景摄像机的真实场景还原系统,用于超视距远程驾驶。本选题是源自对现有的行走机器人的远程视频遥控方案进行改进的想法。我们知道,目前各种作业机器人的视频遥控方案,基本上是照搬安防视频监控的方案,使用的是带云台的CCD摄像机(如图1所示),摄像机的视野范围有限,要想观察到360度的全部场景,需要操控人员不断向摄像机云台传送指令,控制云台的步进电机转动,但是由于步进电机机械传动装置旋转速度的限制,这样的做法很难保证视角切换的实时性,而且这种机械装置在复杂作业环境中的可靠性也是个问题,经常会出现远程操控人员既要不断调整云台的旋转角度,又要遥控机器人的行驶, 忙得手忙脚乱。

图1 传统带云台的CCD摄像机和行走机器人
为了改进上述问题, 我们想到了利用反射式全景摄像机(如图2所示)。这种摄像机的结构很简单,利用普通的CCD摄像机和曲面反射镜组成。曲面反射镜可以将360度的全部景象反射到摄像机镜头中,可以取代传统单摄像机附加的云台机械传动装置,使全景视频采集的实时性有了质的提高。

图2 反射式全景摄像机、反射图像及展开图像
在机器人世界杯足球锦标赛上,由于其对全景成像的实时性要求极高,反射式全景摄像机受到大多数参赛队的青睐(如图3所示)。

图3 RoboCup机器人上使用的反射式全景摄像机
在图2中我们可以看到一幅全景摄像机的拍摄场景,它虽然做到了360的全景采集,但采集的图像是环状平面图,与我们期望的真实场景相差甚远。我们这个系统的核心,就是要将行走机器人上放置的反射式全景摄像机发回的图像进行实时处理,转换成人眼能够接受的真实场景(如图2所示)。同时,作为完整的驾驶仪系统,我们还将黑匣子、视角切换选择等功能整合进来(如图4)。整个系统实现以后,我们会看到类似于极品飞车游戏中的快速场景切换的效果。和极品飞车不同的是,我们的场景是完全真实的。下面我们将具体介绍如何充分利用ALTERA公司提供的软硬件资源实现整个系统。
.jpg)
图4 系统实物连接示意图
2.适用范围
本设计可作为设计范本,应用于各种实时360度场景的再现。在抢险救灾、消防灭火等各种危险环境下,可应用于超视距遥控机器人作业;在消费电子领域,可应用到电动游戏和遥控电动车模,增强趣味性和真实感;同时也特别适合汽车驾驶培训机构对学员进行室内教学训练和考核,大大降低了培训成本并能避免伤害学员人身安全的交通事故的发生。与传统的室内模拟驾驶仪不同的是,本系统是将驾驶室搬到室内,学员视野中呈现的是真实的驾驶场景,从而遥控车辆在室外真实道路上行驶。
3.使用本款Altera器件的原因
本设计的核心是将反射式全景成像CCD摄像机采集的模拟电视信号,经过多种快速视频算法处理,实时地转换成人眼能够接受的真实场景,并添加多种辅助功能以完成整个系统。ASIC和专用的DSP处理器都很难满足本设计的要求。我们使用本款Altera器件的原因是:
- Altera CycloneII 2C70 FPGA核心拥有数量高达70000个逻辑单元,可以非常灵活的构建本系统的所有硬件模块,多达250个的M4K可以满足高速视频缓存的需要。
- Altera提供的NiosⅡ软核及其外设接口可以根据我们的要求定制裁减,完成本设计中硬件难以完成的诸如液晶屏驱动和SD卡读写的软件实现。
- Altera的quartusⅡFPGA硬件开发环境和Nios II IDE软件开发环境功能完备,集成的多种工具方便易用,可以帮助我们在尽可能短的时间内构建整个系统。
- Nios II IDE直接将μcos RTOS集成其中,避免了移植操作系统的麻烦,帮助我们快速开发。
- DE2-70平台上拥有大容量的存储器和丰富的外设接口,为本设计的开发提供了多种可选方案。
同时,Altera提供了丰富的教材和各种应用范例支持,有助于我们深入的理解和快速的掌握。
(Revision: 18 / 2009-09-15 11:20:58)
在整个设计和实现过程中,我们采用了QuartusII 8.0,SOPC Builder和Nios II IDE等多种工具,这些工具可以无缝集成在一起,方便易用。我们的模拟音视频采集处理模块,图像展开模块主要通过Verilog硬件语言编写而成,能够将视频实时的采集、展开,并通过VGA显示。图像区域监视控制器模块,黑匣子模块等是通过SOPC的方式开发。
一、模拟音视频采集处理
我们使用无线音视频收发模组将反射式全景摄像机采集的视频信号传输到DE2-70的模拟视频接口。如下图所示

图1 反射式全景摄像机和无线音视频发射模块
我们参照Terasic公司提供的TV例程和Karaoke例程非常方便的完成了模拟音视频采集处理模块。视频采集处理模块由SDRAM控制器,YUV to RGB模块和音频模块组成。四端口的SDRAM控制器将视频信号存储到DE2-70的SDRAM存储器中,然后通过两个Read端口,分别读出奇数场和偶数场完成去交织处理。YUV to RGB模块把视频信号转换成RGB信号,供VGA的显示。

图2 模拟视频采集处理模块示意图
音频模块由I2C音频设置模块对DE2-70上的WM8731音频芯片进行设置,完成了音频的采集和输出。

图3 模拟音频采集处理模块示意图
二、图像展开
由正余弦查找表,图像区域选择模块,图像缓存存储器模块,图像校正模块和DPCM编码解码模块组成。图像展开就是把极坐标的图像转换成直角坐标系的图像,更符合人眼的观察视觉。最后,在VGA显示的同时将图像数据传入Nios II处理器系统供SD卡存储。

图4 图像展开算法模块示意图
(1)图像查表展开
下图为正余弦查找表模块、图像缓冲存储器模块和区域选择模块连接示意图。

图5 查表展开算法实现示意图
首先,我们通过matlab程序生成一个正余弦查找表,用于产生图像缓存模块的读取地址,输入到正余弦表的信号是VGA控制器产生的行列扫描信号,指示当前VGA显示的具体位置及目标图像的坐标,通过正余弦变换就可以完成目标图像到原始图像的地址映射,实现图像展开。由于M4K存储介质相对SDRAM,SSRAM的读写存储更迅速,我们选择FPGA片上的M4K存储器作为图像缓冲存储器,并将其配制为真双口。考虑到通用性,选择VGA显示输出。我们用区域选择模块将原始全景图像分为4部分,这样就可以使所需的存储容量减少到原来的1/4,并且,此模块还产生图像缓冲存储器的存储地址将每一块区域的图像进行地址旋转,使得四个区域图像存储到图像缓冲存储器之后都将成为第一象限的形式,如图6所示。这样一来我们仅需90度的正余弦查找表就可以完成360度的全景图像展开,大大节省了硬件资源,同时使变换精度由原来的0.5度提升到0.14度。
另外,变换后供VGA显示的图像尺寸为640*380(经实验此尺寸的还原效果长宽比例最符合实际,剩余640*100的屏幕下方部分显示文字信息),而由于图像缓存中的原四分之一图像只有320*240个像素,图像展开的过程中也被放大,而且图像极坐标展开是非线性变换,不同半径却须相同数量的采样点,这两个原因致使图像展开后锯齿现象严重。FPGA硬件不支持浮点运算,这使得查表过程中像素点定位的精度受到影响,我们据此采用间接回溯查表的方法,即从缓存READ口查表,增加足够整数数据位位宽,保证查表过程中作乘除运算不会出现有效位溢出而造成精度降低,只在最终确定缓存地址时将数据归一化为实际值。这样做最大限度的保持了查找表精度,是放大和非线性造成的锯齿现象得到显著改善。

图6 全景图像分块旋转示意图
(2)图像校正算法
由于全景摄像器的反射镜面是双曲面方程,图像展开后的扭曲变形较大,我们根据双曲面方程的特性,解算出了平面像素跟双曲面像素的对应关系,编写了图像校正模块。我们发现,图像畸变主要在垂直方向,我们用MATLAB依据校正算法生成查找表,当VGA Controller的列扫描信号进入该模块之后会查表产生一个新的列坐标从而完成对图像的校正。经实验证明,校正之后的图像完全能够满足人眼观察的需要。下图所示为图像校正算法之前与之后的图像对比图。

图7 MATLAB仿真图像校正之前与之后图像对比示意图,可见图像中办公桌的畸变得到很好修正
(3)DPCM编解码
由于VGA输出需要RGB三通道的位宽都为10位,将占用大量的M4K资源,在图像存入图像缓存模块之前,进行了简单的DPCM编码,使得RGB三通道的位宽变为5位,节省了一半的存储空间,肉眼观察效果与没有压缩的图像没有差别。
DPCM编码是差动脉冲调制编码的简称,编码方式是对相连的两个采样值之间的差值信号进行编码,编解码原理如下图所示:

图8 DPCM编解码原理示意图
图中,S(n)——当前输入像素采样值;
Sp(n)——由预测编码得到的预测信号值;
E(n)——像素残差信号值(差值信号);
Eq(n)——量化后的预测误差信号值;
Sr(n)——重建像素信号值;
DPCM采用线性预测方式,预测信号由n时刻之前的M个量化后的差值信号线性组合得到:
,其中ki为预测系数
本系统中我们所用的简单的DPCM编码过程如下:(ki=1)
- 初始化:Sp(0)=0;
- E(n)=S(n)-Sp(n);
- E(n)量化编码后得到Eq(n);

- 重复第2步。
解码过程如下:
- 初始化:Sp(0)=0;

- Sr(n)=Sp(n)+Eq(n);
- 重复第2步
我们利用MegaWizard Plug-In Manager中的LPM_FF设置了10bit和5bit的D触发器分别作为编码器和解码器的像素缓冲,其他部分用Verilog语言编写很容易便可以实现。编解码模块图如下:

图9 DPCM编解码模块示意图
三、图像区域监视控制及黑匣子
实现这两个功能的系统框图如下图所示:
.jpg)
图10 Nios II系统框图
这两个功能通过SOPC实现(如图):

图11 SOPC系统图示
- 锁相环pll_0,输入时钟为50M,一个输出提供100MHz的 niosII系统时钟,另一个提供sdram的100MHz时钟,且设置65ns的相移。
- 软核处理器cpu 使用fast版的niosII,确保运算速度最快。
- 系统的存储介质中,2 M的ssram作为niosII的数据存储器,8M的flash作为niosII的程序存储器,32M的sdram作为图像缓存,通过PIO口从硬件处理模块读入单帧数据,供SD卡定时存储需要。
- 两个timer,系统定时器sys_clk_timer, Microc/OS-II的timestamp_timer。
- TFT液晶屏的数据端口 data_0。
- TFT液晶屏的指令端口,rst_0,rs_0,cs_0,rd_0,wr_0。
- 切换展开图像区域的按键端口 front,back,right。
- SD卡的相关端口clk,cmd,dat,dat3。
(1)RTOS
软件系统基于MicroC/OS-II操作系统设计,MicroC/OS-II是一种基于优先级的可抢占式硬实时内核,考虑到Altera公司已经将其移植到了Nios II操作系统平台上,省去了我们的移植工作,加快了我们的开发进程。
MicroC/OS-II的工作可以分为两个任务,一个是图像区域监控的按键采集及区域方向显示,另一个是控制SD卡存储图像数据。由于这两个复杂任务都由纯软件完成,使程序的协同变得困难,必须在niosII处理器中引入任务管理机制,μCOS-II的引入正是为了解决此问题。
(2)图像区域监视控制
此功能的硬件由使用液晶屏和按键组成(如图13)。LTM024D250TFT液晶屏是一块用于手机的彩色屏(如图12),分辨率是240*320,最大65K种颜色。通过Protel制作了它的驱动板,把数据指令引脚连接到DE2-70的外围扩展口上,由PIO口挂载到SOPC总线上。Protel电路图如下所示:

图12 LTM024D250TFT液晶屏驱动板电路图

图13 液晶屏实物图 图14 图像区域监视控制器
这块TFT液晶屏的rgb彩色宽度为16位,5位的red,6位的green,5位的blue。数据端口是8位,是一块支持8位数据总线的TFT液晶屏,下面是它的读写时序:


图15 LCD液晶屏读写时序示意图
我们把MCU上的液晶屏驱动程序成功移植到了niosII软核中。可以实现按键所选区域的显示,做为系统的区域选择监视。首先通过Img2Lcd29取模软件把指示展开区域四个方向的图案转换成16进制的数据,以front.h,back.h,rignt.h,left.h头文件的形式存储这些数据,这些数据通过PIO数据寄存器的写函数传到GPIO口引脚,再输入到TFT液晶屏的数据端口。再根据TFT液晶屏的数据指令读写时序,通过PIO数据寄存器的写函数把相应的数据指令读写电平通过GPIO口传到TFT液晶屏的指令端口,这样16位的RBG数据就可以写进TFT液晶屏的寄存器。选择用niosII的方式,相对直接用硬件语言来驱动方便迅速的多,节省时间,加快了我们的开发进程。
(3)“黑匣子”
我们直接利用DE2-70上的SD卡模块完成本设计的黑匣子功能。SD卡是流行的小型存储器,体积小,容量大。9个引脚,CLK,CMD,DAT-DAT3,VDD,VSS1,VSS2,把串行的传输方式变成并行的传输方式大大提高了传输速度。
通过4线方式,可以使图像数据的写入速度大大提高。SD卡也可以工作在简单的SPI模式下。在我们设计中,SD卡定时30秒存储一帧图像数据,涉及的数据量不大,所以直接利用SPI模式。我们移植了SD卡SPI模式的驱动程序,用PIO口模拟SPI底层通信协议,经测试1M数据的写入需要30s,能够满足SD卡对sdram中105KB图像数据的存储。我们采用FAT16文件系统,最大容量支持2G。
SD卡初始化步骤:
1)延时75clock
2)发送CMD0 ,需要返回0x01 ,进入Idle状态
3)循环发送CMD55+ACMD41,直到返回0x00 ,进入Ready状态。
写步骤:
1)发送CMD24(单块)写命令,返回0x00
2)发送数据开始令牌0xfe + 正式数据512Bytes + CRC 校验2Bytes
(Revision: 21 / 2009-09-17 15:11:27)