高效准确地监测海浪对海洋工程建设、全球气候、环境变化、海洋开发和交通航运安全等有着十分重大的意义。 作为船载装备,船用海浪监测设备在工作时需要由外部导航系统设备连续提供反映本船状态的航速、航向、经度、纬度、纵摇角、横摇角等导航信息,接口方式为以太网络[1],因此在实验室的条件下必须由内嵌船舶操纵运动数学模型的导航接口模拟器提供这些信息设备才能运行。但由于六自由度非线性船舶操纵运动模型十分复杂,需要使用四阶定步长龙格-库塔法求解包含6个非线性强耦合微分方程的微分方程组,使用传统的C/C++进行算法开发将十分困难且效率低下[2, 3]。 为了解决以上问题,文中使用Matcom编译器,将在MATLAB环境下建立的船舶操纵运动数学模型通过VC++、MATLAB混合编程的方式嵌入模拟器中[4],从而快捷高效地完成软件的开发。 1 船舶操纵运动数学建模 1.1 数学模型的建立
导航接口模拟器的核心算法就是船舶操纵运动数学模型。文中沿用分离型结构模型的建模思想[5],在随船平动坐标系下,对船、桨、舵的力学特性进行分析,建立了静水中的六自由度非线性船舶操纵运动数学模型[6]。
船舶操纵运动模型的建立过程:
1)在随船平动坐标系下建立六自由度运动方程:

2)桨力及舵力模型,桨力模型只考虑纵向推力,n为螺旋桨转速:
Xp=KT(J)(1-t)ρn2D4
舵力模型简化为2个力和力矩,δ为舵角:

3)惯性水动力模型简化后保留3个附加质量:

4)粘性水动力模型包括6个方程,经简化后包含以下部分:

船舶操纵运动数学模型建立完成后,选择1艘实船的船型参数,计算相关参数及水动力导数,在Simulink环境下搭建模型并进行仿真[7],如图 1。
![]() |
| 图 1 船舶运动数学模型仿真流程 |
搭建的完整船舶操纵运动模型如图 2,模型的输入为车钟和舵角,输出为船舶运动状态参数。
![]() |
| 图 2 船舶操纵运动Simulink模型 |
对数学模型进行回转运动仿真等实验,以验证其正确性。Simulink模型采用ode45算法,最大步长1 s,仿真时长3 000 s,螺旋桨转速200 r/min,仿真运行500 s航速稳定后,分别以方向舵角为5°、15°、25°、35°的情况进行了仿真,其中15°舵角时的纵向速度、艏向角及船舶回转运动等曲线分别如图 3~5所示,将模型各自由度的运动曲线与实际船舶的运动曲线对比,可验证所建立的船舶运动模型的正确性[8]。
![]() |
| 图 3 15°舵角船舶纵向运动Simulink仿真结果 |
![]() |
| 图 4 15°舵角船舶艏摇运动Simulink仿真结果 |
![]() |
| 图 5 15°舵角船舶回转运动Simulink仿真结果 |
综合海浪监测设备的调试测试需求,分析得到该软件应实现的基本功能如下。
1)船舶运动实时仿真功能:可以初始化船舶导航信息,如初始航速、航向、经纬度等;对船舶进行基本的操纵控制,如加速减速、方向舵操纵等;还可以显示船舶运动状态数据,对实时模型仿真进行控制,如开始、暂停和初始化数学模型等功能。
2)内嵌船舶操纵运动数学模型:数学模型接收初始化参数,以每秒50次的速率计算更新船舶运动状态数据提供给其他模块使用。
3)用户数据报协议(user datagram protocol,UDP)网络通信与导航接口数据发送功能:导航接口模拟器与海浪监测设备的通信为UDP方式,船舶运动数学模型解算得到的导航信息数据要按照导航接口协议打包并通过以太网接口发送给设备。
因为该软件要有很多的界面显示和数据处理任务,所以在降低开发难度的基础上使用VC++ 6.0基于MFC框架进行程序开发。而船舶操纵运动数学模型十分复杂,用C++编写代码十分困难,但是用MATLAB就会相对简单,同时利用Matcom提供的一种将MATLAB程序编译为C++程序的方法使MATLAB可以和VC++进行混合编程,所以在船舶操纵运动数学模型部分使用MATLAB和VC++混合编程实现。 2.2 软件概要设计
根据软件的需求分析,把软件分为了人机交互接口模块、船舶运动数学模型模块、UDP通信与导航接口模块,三大模块之间的关系如图 6所示。
![]() |
| 图 6 软件总体设计结构 |
各模块要执行的任务如下:
1)人机交互接口模块:读入初始化导航参数,进行船舶操纵运动模型车舵控制,船舶运动状态数据显示,船舶运动曲线绘制,数学模型计算控制,UDP通信控制,导航接口数据显示等功能。
2)船舶运动数学模型模块:该模块首先从人机交互接口模块中读取导航初始化参数,船舶操纵的车钟和舵角;然后以每秒50次的速率计算更新船舶运动状态数据,在传递给人机交互接口模块及导航接口通信模块进行显示和数据打包发送。该模块的功能是由MATLAB编程实现,并把M文件通过Matcom编译成C++文件嵌入到VC++中。
3)UDP通信与导航接口模块:该模块首先与设备建立UDP连接,然后从船舶运动数学模型模块获得船舶运动状态数据,按照导航接口协议打包为3个数据包并且以不同的速率通过以太网接口发送数据,提供给设备使用。 2.3 VC++和MATLAB混合编程的实现
软件需求分析中的船舶运动实时仿真功能是由概要设计中的船舶运动数学模型模块实现完成的,该模块是使用MATLAB编程实现,而其他模块都是使用VC++软件编程实现,所以这里需要使用MATLAB和VC++混合编程技术把MATLAB数学模型嵌入到模拟器中。
MATLAB和VC++混合编程技术大致有4种[9, 10],包括VC++调用MATLAB Engine、VC++调用MATLAB编译的DLL或COM组件和使用Matcom编译器。这里选择第4种方案,即使用Matcom编译器完成混合编程。Matcom编译器可以把M文件转化为C++文件,那么通过这个方法可以把船舶操纵运动数学模型对应的M文件编译成C++文件,嵌入VC++工程以供模拟器的调用。
下面阐述了在Matcom中实现VC++、MATLAB混合编程的步骤[11, 12]:
1)使用Matcom编译MATLAB程序
在MATLAB环境下可以直接运行的程序并不能在Matcom中直接编译,需要进行一定的修改。Matcom可编译的MATLAB程序必须以类似如下格式的函数写成:
function [X1,X2,X3,X4,X5,X6,X7,X8]=
Ship(x1,x2,x3);%船舶运动数学模型
其中,X1,X2,X3,X4,X5,X6,X7,X8为函数输出变量,x1,x2,x3为函数输入变量。
2)添加头文件、库文件及动态链接库
利用Matcom编译MATLAB程序之后会生成C++程序文件和.h头文件。把这些文件复制到VC++工程的根目录中,然后把Matcom安装根目录下的matlib.h和v4501v.lib文件也复制到VC++工程的根目录中,在VC++工程中把这些程序文件包含进来。在没有安装Matcom的电脑上运行使用Matcom混编的程序,还需将Matcom安装目录下的v4501v.dll、ago4501.dll文件复制到程序的运行目录下。
编译完成后在程序中调用Matcom生成C++文件还须进行一些工作。
3)输入输出变量定义
double inshi1,inshi2,inshi3; //输入变量,包括车舵,时间等
Mm outshi1,outshi2,outshi3,outshi4,outshi5,outshi6, outshi7,outshi8;//输出变量,船舶运动状态参数
这里需要注意的是,Matcom在VC++中用的数据类型是Mm,这个数据类型类似于MATLAB中的矩阵,其具体描述内容在matlib.h文件中。
4)Matcom库函数初始化
调用Matcom生成的函数前需要初始化matcom库函数,代码如下:
initM(MATCOM_VERSION);
5)调用MATLAB绘图函数
如果在程序中使用到了MATLAB的绘图函数,还需要加入下述代码,否则只能绘图 1次。
if(InitMatcom==T) //InitMatcom是1个是否画图的标志,如果已经画过就置真,然后在画图之前调用clf();清除原图,否则为假。
绘制图形需在对话框中添加1个静态文本框控件,在此控件中绘图,代码如下:
CWnd *picture=NULL;
picture=(CWnd*)GetDlgItem(IDC_DRAWPICTURE);//得到用于显示图像Static text控件的ID
Mm plothandle=winaxes(p1->m_hWnd); //将静态文本的句柄设置赋给画图句柄
6)主功能函数的调用
之前在Matcom中编译的MATLAB函数原型为 function[X1,X2,X3,X4,X5,X6,X7,X8]= Ship(x1,x2,x3);
在VC++中调用规则如下:
Ship(inshi1,inshi2,inshi3,i_o,outshi1,outshi2,outshi3,outshi4,outshi5,outshi6,outshi7,outshi8);
输入变量在前半部分,以i_o为分隔符,输出变量在后半部分。这样每调用1次该函数即计算得到1组新的船舶运动状态数据。
7)结束库函数调用
exitM(); //结束库函数的调用
将整体数学模型按照Matcom混编规则修改完成后,还要对模拟器所要求的实时性仿真做一定的修改。在MATLAB中开发的算法是非实时的,即1次计算仿真一定的时间长度,根据算法设定的步长,得出全部计算结果,而在模拟器中内嵌的算法要求必须是实时且无限长的,因此需要对MATLAB程序以及Matcom编译生成的C++程序进行进一步的修改,使其满足模拟器设计要求。
在具体的实现中要去掉程序中的主循环,使算法函数的一次调用计算只完成1次状态变量的更新,且调用间隔为设定的算法步长,之后使用全局变量保存新得到的计算结果作为下一次的输入,再进行下一次的调用计算。这样实时的程序调用和数据迭代就实现了数学模型的实时计算和结果输出。实时仿真模型的Ship函数在程序中定时调用,就能得到实时的船舶运动状态数据,因此还需要使用Windows提供的SetTimer和OnTimer定时器函数,来保证数学模型的实时调用。 3 软件测试与分析
软件测试需要验证所嵌入的数学模型的实时性与准确性以及与海浪监测设备是否能够正常通信。验证数学模型准确性的主要方法是将嵌入模拟器中的数学模型计算结果与在MATLAB中的仿真结果作对比。通过对比可以验证数学模型的运行是正确和实时的。通信功能的验证主要是连接设备,运行软件对设备进行测试,对照设备显示的数据与模拟器所显示的接口数据是否一致。
![]() |
| 图 7 船舶运动实时仿真界面 |
从测试结果可以验证软件实现了船舶操纵运动实时仿真与导航接口通信功能。该软件完全满足软件需求分析和概要设计的内容。而采用VC++和MATLAB的混合编程极大地提高了程序开发的效率,为在VC++环境下实现复杂的数学模型提供了一条简便高效的实现途径,具有较高的参考价值。 4 结束语
文中的研究实现了基于MMG方法的船舶运动数学建模,提供了一套简化的针对一般水面舰船进行数学建模的通用方法,对不同船型参数船舶的运动建模具有较高的参考价值。在导航接口模拟器中,采用Matcom编译器实现VC++和MATLAB混合编程,完成船舶操纵运动数学模型的嵌入。混合编程的引入充分发挥了MATLAB在数学运算仿真上的优势,提高了软件开发效率。模拟器的设计实现为“船用海浪监测设备”生产和出厂调试、测试提供了一套更为真实可靠的测试工具,也为船舶运动仿真的研究提供了一个简便高效的实现方式。
| [1] | 王福友, 袁赣南, 郝燕玲. 基于X波段雷达海浪监测装置的设计与研究[J]. 宇航计测技术, 2007, 27(6):42-44. |
| [2] | 张秀凤, 尹勇, 金一丞. 规则波中船舶运动六自由度数学模型[J]. 交通运输工程学报, 2007, 7(3):40-43. |
| [3] | 李强, 洪碧光, 李铁山, 等. 基于分离型模型的船舶航迹控制系统仿真[J]. 大连海事大学学报, 2011, 37(3):5-7. |
| [4] | 周杨海, 刘旺开, 黄世明. 人体空中运动模拟在Matlab和VC混编中的实现[J]. 计算机仿真, 2006, 23(7):64-68, 72. |
| [5] | 岳晋, 任光, 曹辉. 基于Simulink的船舶运动模型动态仿真研究[J]. 大连海事大学学报, 2009, 35(4):13-16. |
| [6] | 徐静, 顾解忡, 马宁. 规则波六自由度回转运动预报[J]. 中国舰船研究, 2014, 9(3):20-27. |
| [7] | 黄会营, 段晓明. 船舶运动视景仿真系统设计与实现[J]. 计算机仿真, 2012, 29(1):369-373. |
| [8] | 叶松, 陈永冰. 船舶航向运动模型对比分析[J]. 中国水运, 2014, 14(7):13-14. |
| [9] | 初秀琴, 何蕾, 李玉山. Matlab外部接口的研究与实现[J]. 计算机仿真, 2002, 19(1):107-109. |
| [10] | 罗朝明, 胡顺超, 邓日晓, 等. Visual C++与Matlab混合编程方法的对比分析研究[J]. 现代电子技术, 2013, 36(20):47-50. |
| [11] | 潘孝勇, 姜伟, 杨继隆. Visual C++与Matlab的混合编程[J]. 计算机仿真, 2004, 21(3):140-143. |
| [12] | 孙张阳, 施展. 基于Matcom的VC++与Matlab混合编程的实现[J]. 计算机技术与发展, 2012, 22(7):64-66. |










