基于QNX的图像采集系统的设计与软件实现
2016-05-14王昱霖王文华
王昱霖 王文华
摘 要QNX系统是面向嵌入式应用的高性能实时操作系统,基于QNX的图像采集系统可用于对稳定性和可靠性要求较高的工业及其他特殊环境中。本文简要分析了QNX视频采集系统的驱动原理,定制了用于视频采集的QNX嵌入式系统,并利用C++语言编写了基于工业摄像机抓取图像的上层应用程序,通过抓取一桢图像的实验,验证了该设计方法的可行性。
【关键词】QNX 图像采集 系统定制 驱动开发
1 前沿
随着工控自动化技术的发展,工业领域中的大数据量视频数据采集对实时性和稳定性的要求越来越高。QNX Neutrino实时操作系统是一种功能全面、运行稳健的操作系统,其真正的微内核设计和模块化架构可帮助使用者以极低的成本创建高度优化和超可靠的系统。基于QNX操作系统进行视频数据采集可有效满足工业环境对实时性和稳定性的要求。但QNX作为一款专用的嵌入式操作系统也存在开发难度大,开发周期长等问题,如何能够快速开发基于QNX的工业摄像机使用的驱动程序模块推广应用QNX系统的重要基础。
2 QNX系统介绍
QNX是一个分布式、微内核、抢占式、多用户、多任务、可嵌入式的实时操作系统。被广泛应用到电信、航天仪器、工业自动化等方面[1]。QNX有独特的微内核和进程管理单元,以及基于消息传递的进程通信机制,同时采用内核调度的抢占式优先级进程管理,使得系统保证在任务时间内完成对上下文的快速切换,具有极好的实时性。在QNX Neutrino 环境下,所有驱动程序、应用程序、协议栈和文件系统都在内核以外的内存受保护的用户空间内安全运行。QNX操作系统符合POSIX基本标准和实时标准,使其应用可以方便的进行移植。QNX的微内核仅提供进程通信、进程调度、中断处理和底层网络通信等4中服务。
QNX设备驱动与其他操作系统的设备驱动有所不同,其驱动程序与内核运行在不同的地址空间中,即设备驱动无需编译到内核中去,而是由QNX特有的资源管理器管理,资源管理器负责给不同类型的设备提供接口。同时,不同的设备驱动还可以通过消息传递的方式,经过进程管理器,将消息传递给其他设备驱动。QNX的网络驱动核心是Network Manager, 应用程序调用函数库中的函数,通过消息传递机制访问资源管理器,并通过TCP/IP协议调用资源管理器中的函数与驱动程序进行连接。网络驱动模块的原理图如图1所示。
3 QNX系统定制
开发QNX驱动程序前首先需要定制系统,其过程为:构建Buildfile->编译Buildfile生成系统映像文件->启动目标系统->嵌入式系统软件设计。
其中最重要的就是构建Buildfile。在通常的嵌入式系统中,都需要一个可启动的操作系统映像文件(OS Image)。构建Buildfile的过程就是配置操作系统映像的过程。Buildfile由三部分组成,分别为bootstrap script(启动引导脚本)、startup script(启动脚本)、file list(文件列表)。
首先构建Buildfile。bootstrap script如下所示,
[virtual=x86,bIOS+compress].bootstrap = {
Start-bIOS –Ntarget
PATH=/proc/boot:/bin:/sbin:/usr/bin:/usr/sbin:/usr/photon/bin
LD_LIBRARY_PATH=/proc/boot:/dev/shmem:/lib:/lib/dll:/usr/lib:/usr/lib/dll procnto}
其中“virtual” 表明该Buildfile将构造一个与启动时产生的虚拟地址空间相对应的启动映象。关键词“x86,bIOS” 则分别指处理器(x86)和机器类型(通过bIOS启动)。而“+compress”使得映象文件被压缩,以产生更小的映象文件。startup-bIOS是运行于具有BIOS的PC兼容系统的可执行程序,主要负责利用BIOS检测PC硬件资源。启动脚本是在系统启动后自动执行的一系列命令列表,可在此对系统进行初步配置,如网络配置,显卡设置等操作。
将制作好的Buildfile导入到IDE中,编译生成MyCamera.ifs文件。在开发机上将MyCamera.ifs复制到目标机的/net/Target/.boot中,这样就可以实现目标机自动启动QNX系统,系统定制完成。
4 软件实现
4.1 安装API函数库
本系统采用了德国basler pylon piA2400-17gc摄像头,分辨率为2454*2056,帧速率可以达到17fps,采用千兆网卡接口,位深度为12bits。视频采集卡采用intel PRO1000网卡。使用该摄像头需要在目标机上安装API函数库和设置环境变量,内容如下所示:
sudo md /opt/pylon
sudo tar -C /opt/pylon -xzf pylon-bininst-32.tar.gz
export PYLON_ROOT=/opt/pylon
export GENICAM_ROOT_V2_1=${PYLON_ROOT}
export LD_LIBRARY_PATH=${PYLON_ROOT}/lib:${GENICAM_ROOT_V2_1}/bin/Linux32_i86:$LD_LIBRARY_PATH
mkdir -p $HOME/genicam_xml_cache export GENICAM_CACHE_V2_1=$HOME/genicam_xml_cac-he
4.2 软件编写
利用C++语言编写上层应用程序实现抓取一帧数据并从控制台显示帧数据信息。软件流程图如图2所示。
抓取一帧数据主要程序代码如下,
#include
#include
#include
void pressEnterToExit()
int main(int argc, char* argv[])
{
Pylon::PylonAutoInitTerm autoInitTerm;
CTlFactory&TlFactory=CTlFactory::GetInstance();
Camera_t::DeviceClass()
ITransportLayer*pTl=TlFactory.CreateTl(Camera_t::DeviceClass());
Camera_t Camera(pTl->CreateDevice(devices[0]));
Camera.Open();
Camera_t::StreamGrabber_t StreamGrabber(Camera.GetStreamGrabber(0)); StreamGrabber.Open(); Camera.PixelFormat.SetValue(PixelFormat_Mono8);
Camera.OffsetX.SetValue(0);
Camera.OffsetY.SetValue(0); Camera.Width.SetValue(Camera.Width.GetMax()); Camera.Height.SetValue(Camera.Height.GetMax());
Camera.AcquisitionMode.SetValue(AcquisitionMode_SingleFrame);
Camera.ExposureMode.SetValue(ExposureMode_Timed);
Camera.ExposureTimeRaw.SetValue(100);
const size_t ImageSize = (size_t)(Camera.PayloadSize.GetValue());
uint8_t * const pBuffer = new uint8_t[ ImageSize ]; StreamGrabber.MaxBufferSize.SetValue(ImageSize);
StreamGrabber.MaxNumBuffer.SetValue(1);
StreamGrabber.PrepareGrab();
const StreamBufferHandle hBuffer =
StreamGrabber.RegisterBuffer(pBuffer, ImageSize);
StreamGrabber.QueueBuffer(hBuffer, NULL);
StreamGrabber.DeregisterBuffer(hBuffer);
StreamGrabber.FinishGrab();
StreamGrabber.Close();
Camera.Close();
delete[] pBuffer;
pressEnterToExit();
return 0;
}
4.3 实验验证
代码编写完成后,启动目标机,从启动信息中可以看到IP信息,说明网卡驱动加载完成,通过QNX开发环境IDE编译和仿真,由图3所示,抓取的图像帧信息显示在控制台窗口中,说明该系统可正常进行图像采集。
5 结语
本文简要分析了QNX视频采集系统的驱动原理,定制了视频采集系统的QNX嵌入式系统,利用C++语言编写了基于工业摄像机抓取图像的上层应用程序,通过抓取一桢图像的实验,验证了该方法的可行性,为下一步开发基于QNX的图像处理算法奠定了基础。
参考文献
[1]赵磊.QNX实时操作系统及其应用分析[J].软件导刊,2009(5):22-24.
[2]QNX Software Systems Ltd.System Architecture[DB/OL].http://www.qnx.org,2008.
[3]QNX Neutrino Real-time Operating System: Building Embedded Systems [DB/OL],2004.
[4]王斑,苗克坚.QNX驱动程序的编写[J].测控技术,2006,25(6):54-56.
[5]姜广山,祖家奎.基于QNX的PC104总线设备驱动模块的开发[J].测控技术,2010,23(12):1-4.
作者简介
王昱霖(1993-),男,硕士研究生学历。现在供职于山东科技大学机器人研究中心。研究方向为机器人学、智能控制。
作者单位
山东科技大学机器人研究中心 山东省青岛市 266590