0 引 言
小型无人直升机具有垂直起降、悬停、巡航以及快速转变航向等特性,使得它成为一种理想的无人飞行器,并被广泛地应用于除军事目的以外的诸如交通执法监控、海洋/环境监测以及航空摄影/测量等许多领域。在进行实际自主飞行试验时,由于小型无人直升机本身是一个极其复杂的非线性系统,加之实验环境的变化,因此具有很大的不确定性,稍有不慎,就可能造成飞机的失控甚至坠毁。为了保证实际飞行实验的安全,缩短开发周期,减少开发资金的投入,同时便于对飞行控制系统进行验证与调较,设计一套小型无人直升机的实时仿真系统便显得尤为迫切。详细介绍了基于Linux的小型无人直升机的实时仿真系统整个搭建过程。
1 小型无人直升机实时仿真系统结构
1.1 无人直升机实时仿真系统构建
在此以Raptor90无人直升机为实验平台,如图1所示。
要构建一套切实可行的小型无人直升机仿真系统,需要对小型无人直升机实际飞行过程进行全面的建模。而其中对小型无人直升机系统的数学模型建模又是重中之重。这里主要利用MIT以及Aalborg大学研究人员提出的两套无人直升机的建模方法,结合各自的优点,充分考虑无人直升机在不同模态切换之间的模型差异,对无人直升机进行数学建模,并转换成可以实施的仿真系统模型。仿真系统主要包括直升机数学模型模块、飞行控制系统模块、数据融合模块、控制输入模块,人机图形界面模块以及数据通信模块等。其中直升机数学模型模块主要包括:直升机非线性模型、直升机线性化模型、阵风扰动模型、地形模型、传感器模型以及伺服驱动器模型。直升机非线性模型主要包括主旋翼、伺服小翼、尾旋翼、空气动力学模型以及6自由度刚体动力学模型。直升机线性化模块主要是在直升机非线性模型的基础上根据控制需要进行适当的简化,以便用来对线性控制器的性能进行检验。阵风扰动模型主要用来对小型无人直升机在实际飞行环境中的阵风进行模拟。地形模型主要考虑直升机在起飞和降落过程中与地面之间的相互作用。这当中涉及到地面与桨叶间的涡流效应,对其建模非常复杂,故这里暂时不考虑。传感器模型主要包括GPS定位模型、IMu测量模型和声纳测距模型。伺服驱动模型主要模拟将伺服板接收到的输入信号转换为伺服电机的转动并最终转换成机械动作后直接作用于旋翼的过程。飞行控制系统模块指利用设计的控制算法对直升机进行自主飞行控制。数据融合模块主要指利用卡尔曼滤波算法对各个传感器测量到的数据进行融合计算。控制输入模块主要用于直升机自主飞行时对其飞行状态进行调校。人机图形界面能生动实时地再现直升机的仿真效果。经过以上分析,可以得到小型无人直升机仿真系统的结构图如图2所示。
1.2 图形界面软件工具简介
这里的无人机仿真系统是以Linux操作系统为开发平台,以FLTK(Fast Light Tool Kit)图形用户界面工具箱实现人机界面显示,并用Mesa/C)penGL实现飞行过程的实时三维动态仿真。
FLTK是一个用++编写的图形界面开发工具。FLTK在具有基本的GUI功能之外,还拥有一些特殊的功能,比如跨平台、内置OpenGL功能、尺寸更小等。FLTK使用Fl—Gl—Window这个类将OpenGL的基本功能囊括其中,开发时只要在Fl—Gl—window的draw()里glbegin/glend即可。无人直升机仿真系统的人机界面需要显示直升机3D实时飞行状态,这就需要用到OpenGL这个标准的三维计算机图形接口。OpenGL由SGI公司开发,可以在不同的平台如windows 95,windows NT,Unix,Linux,Mac()s,()s/2等之间进行移植。然而C)penGL不是自由软件,它的版权、商标(OpenGL这个名字)都归SGI公司所有。在Linux下用Mesa来取代OpenGL。Mesa提供与OpenGL几乎完全一致的接口,并且Mesa是遵循GPL协议的自由软件,使得它对新硬件的支持度等方面甚至超过OpenGL。
2 仿真系统程序模块编写
仿真系统程序模块主要包括模块直升机数学模型-模块、控制输入模块、数据融合模、通信模块、飞行控制系统模块以及人机图形界面模块。下面主要对直升机数学模型模块、控制输入模块、通信模块以及人机图形界面模块进行代码编写。
2.1 直升机数学模型模块
首先用类封装各个子模型的主要属性,主要包括主旋翼子模型、伺服小翼子模型、尾旋翼子模型,阵风扰动子模型以及伺服驱动子模型等;然后再把这些子模型封装在一个直升机的类Heli中,看成直升机类的类成员变量;再为直升机类增加适当的成员函数,来完成各子模型的实际功能,这样就构成了直升机整体。之后可以利用此类进行实例的定义及使用。
接下来便可以根据上面的Heli类来代入Rator90直升机的实际参数。
2.2 控制输入模块
在此选择Logitech EXTREME 3D PRO JOYSTIC作为飞行控制输入遥杆。首先,需要将遥杆的驱动程序挂载进内核。在/etc/rc.10cal文件中添加如下语句:
modprobe/lib/modules/2.6.1 1/kernel/drivers/input/joydev.o
即可在每次启动内核时自动加载摇杆驱动模块并检查与其他模块的属性相依。
控制器成功挂载进内核之后,利用几个主要数据读取函数对遥杆的输人数据进行读取:
然后便可通过socket通信模块,把数据转发到仿真平台主程序上,再由主程序处理分配到各个终端。
2.3 通信模块
该仿真系统主要采用Socket(套接字)网络接口编程技术来实现各个模块之间的数据交换,即进程间的通信。Socket主要有2种,使用TCP(传输控制协议)协议的流式Socket通信和使用UDP(用户数据报)协议的数据报Socket通信。TCP协议提供面向连接的、提供端到端检查与纠错全双工字节流传输。UDP协议是非连接的,可提供高速的传输服务,但不提供可靠的传输服务。该仿真程序使用UDP数据报协议,因是在本机内部进行通信,并且一个端口可以同时接收来自几个端口的信息,无疑提高了效率。对通信双方进行类封装,建立基于UDP网络通信的Server和Client类。主要实现代码如下:
2.4 人机图形界面模块
图形界面是最能体现仿真效果的部分。这里采用Linux系统下的FLTK和OpenGL/Mesa图形函数库进行图形界面程序开发,主要代码如下:
3 仿真系统运行结果分析
对仿真系统所有模块的源文件建立Makefile文件,以便今后程序的修改与调试。用Linux下的gcc编译器编译链接,生成各个模块的可执行文件。整个仿真系统运行如下。
图3为直升机运行功能面板。可以联合手柄的按键,设置各个不同的功能键。
图4为直升机3D运行界面以及状态面板。当执行悬停控制程序时,仿真程序会根据使预先设定好的参数,先进行垂直起飞,再飞向目标位置,然后在目标位置上进行定点悬停。同时可以从直升机状态面板上,很直观地看到直升机飞行姿态的变化。
4 结 语
详细介绍了小型无人直升机仿真系统的构建。整个仿真系统是在Linux上搭建的。仿真系统运行结果很好地再现了直升机3D飞行过程,垂直起降以及定点悬停等。整个仿真系统大大缩短了研究周期,减少了资金的投入,并为接下来飞行控制系统的设计与验证提供了良好的基础。