基于Qt 的自主航行系统终端设计与实现

2020-11-30 06:53陈珍锐
科学技术创新 2020年34期
关键词:插件船只串口

陈珍锐 刘 鑫

(1、山东交通学院,山东 威海264209 2、威海海洋信息科学与技术研究院,山东 威海264207)

随着现代科学技术的发展,船舶自主航行是未来船舶发展的主要方向[1]。船舶自主航行主要包括两种:一是无人驾驶船舶。该型船舶研究得重点和难点是智能控制技术,其必须能够自主进行环境探测、目标识别、自主避障、路径自主规划等。尽管无人驾驶技术已经被成功运用于飞机和汽车,而将其运用于大型商业船舶还没有先例,直到今年9 月份,由海洋研究组织ProMare 牵头建造一艘无人驾驶全自主船舶“Mayflower AutonomousShip”号(MAS)计划完成横跨大西洋航行[2];二是辅助驾驶船舶。该型船舶能够实现部分开阔海域的自助航行功能,需要船员设定船舶的航行路线,监视船舶的航行方向,对于复杂的水面环境,需要船员操控,其技术难度明显低于无人驾驶船舶;另外该型船舶也能够让船员通过信息终端远程操作船舶的航行,本文所设计终端系统也主要用于该型船舶。

Qt 作为一种跨平台的基于C++的GUI 系统,用于开发图形用户界面和多平台应用程序,这些应用程序可以运行在包括电脑,手机,平板,嵌入式系统等多种平台,该系统成为世界上很多成功的图形用户应用所使用的主要系统。Qt 具有如下特点:Qt 是类MFC的面向对象的C++开发包;具有信号与槽的事件驱动机制;Qt 支持各种编译器,包括GCC C++编译器和VisualStudio套件;并具有广泛的国际化支持[3]。

本软件主要工作是实现船舶自助航行过程中的船舶信息展示,主要包括GPS定位信息,船只的航向航速以及从单片机中采集到的其他信息。通过利用GPS定位信息,能够实时的展示出当前船只所在位置,为当前船只航行参数提供展示。另外,为了能够实现船只的自主航行,实现了船只自主航行中的图形接口,船员点击地图中目标位置后,软件能够确定当前位置与目标之间的距离及方向,船只可以自主的朝向目标位置航行。除此之外,软件还实现了用户终端与单片机之间得多种通信方式,包括有线串口,蓝牙等,为数据的可靠传输提供了保障。另外本软件能够运行于电脑,平板,手机等多种平台,以对船只的实时航行信息进行监视。

1 系统设计

本软件总体结构包括四个部分,分别为航行数据通信模块、用户界面设计、电子地图显示以及自主导航实现。图1 给出了软件的整体基本架构。

软件整体的运行流程如图2 所示。当用户打开软件后,软件的操作界面会显示电子地图,并自动检测通讯线路是否处于开启状态,如果通讯线路没有开启,需要用户手动配置通讯线路,如果已开启通讯线路,那么开始接受来自通讯线路中的GPS和其它传感器的信息,并对获得的这些数据解析,从中提取出经、纬度,航向,速度等信息,并将这些信息实时的显示到系统终端界面。在软件利用这些信息进行导航时,需要实时的检测用户是否设置了航行目标位置,如果用户没有设置目标位置,那么系统只运行在航行信息展示状态,当用户从终端地图中选取了目标位置之后,并开启自助导航后,系统会提取出目标位置相关信息,包括目标位置经纬度,所处方向,当前位置与目标位置之间的距离等,利用这些信息实现自主导航功能。自主导航结速后,系统就会重新进入信息展示状态,等待用户退出系统或设置新的目标位置。

图1 自助航行系统终端整体功能图

图2 基本流程图

1.1 用户界面设计

本系统在用户界面设计时,考虑到软件需要具有跨平台得特点,使用Qt Quick 开发。要使用Qt Quick,就要用到QML语言,QML 实现并扩展了ECMAScript,是一种说明性脚本语言,用来描述基于Qt 对象系统得用户界面。QML提供了高可读性、声明式的、类似CSS得语法,支持动态属性绑定的ECMAScript 表达式[4]。本软件在使用QML设计用户界面时主要包含三大模块,分别为电子地图展示、软件菜单设置选项和自主航行信息显示。

1.1.1 电子地图展示。电子地图的正确显示是自助航行系统的基础,如果不能正确显示地图信息,用户在配置目标位置信息时就可能是错误的,从而会导致不能准确得到达目标位置,甚至会发生事故。为了能够正确显示地图,Qt 提供了位置应用程序接口(Qt Location),该接口可以用于访问第三方地图开放平台,借助于它们可以显示电子地图,提高开发的效率。然而,Qt 在使用第三方地图时需要借助于插件,目前Qt 提供的插件只能使用国外地图服务,比如ESRI,HERE,OSM等,对于国内的地图开放平台百度、高德等,我们需要制作专门插件,用于接入到国内地图服务平台。

本软件使用了高德地图的插件,虽然Qt 官方没有直接提供该插件,但是开发该插件的过程也并不困难,我们可以根据网上的一些开源项目如QGroundControl 中所包含Qt 位置插件源码,制作高德地图插件。当插件制作完成后需要将其放到Qt 的插件目录geoservice 目录,然后就可以通过使用QML 中plugin 元素来访问该插件,将地图嵌入到应用程序中。其代码如下:

其中"amap"是制作的高德地图服务名称。

QML语言风格类似于用于描述网页格式的CSS 样式表,它提供了很多基本元素和控件来帮我们构建Qt 应用程序,这里的Item是QML提供基本元素的基类,QML会将我们使用到的控件组织成树型结构,这里我们使用Item元素来作为界面的根元素。plugin 元素可以使用name 属性访问地图插件,这里我们的插件名为amap。最后,我们可以使用Map 控件在终端显示地图界面,并实现对地图操作的控制。

1.1.2 菜单选项。在软件启动后,需要对其进行特殊配置,软件才能够正常工作,这就要用到菜单选项。菜单设计可以采用Qt 提供的Button 控件,在QML中使用Button 标签可在用户界面显示对应按钮,用户点击按钮会触发一个clicked()信号,在QML 文件中可以直接指定clicked()信号处理器,响应用户操作。这里按钮除了用于配置软件以外,还可以用于与地图之间交互,如开启导航,实现定位等。

1.1.3 航行信息。在用户界面中,另外重要部分就是系统信息展示,船只在航行中的信息能够以直观的方式展示给用户,以便于用户根据实时检测到的船只信息,能够做出适当得调整。使用QML展示信息的最简单方法是使用Text 控件,Text 控件可以用于显示文本,并且能够使用属性项对显示方式进行配置。这里可以应用Text 控件显示经纬度信息,锚(anchors)属性可以用来控制Text 元素显示位置。在软件中除了使用Text 元素外,我们还使用了QML中提供的CircularGauge 控件。CircularGauge 控件是计量仪工具,使用指针来显示某个输入值,用于模拟机械仪表盘。软件中我们使用该工具实现船只航行方向和速度的指示。另外,在CircularGauge 控件中有一个style 属性可以设置仪表盘的风格,这里需要注意的是在设置style 属性时,需要使用CircularGaugeStyle 元素创建仪表盘的风格,该元素主要用于绘制仪表盘使用。软件在显示速度和角度时都是用到了CircularGaugeStyle 元素,主要用于绘制仪表盘上不同刻度,比如在指南针中只有东西南北四个标记,而在速度显示中需要使用适当的速度间隔标记速度。

1.2 数据通信模块

为了能够实现船只的自助航行,需要单片机来检测船只得航行状态,这些状态信息使用通信模块传递给信息终端。本软件实现与单片机通信方式有两种,分别是有线串口和蓝牙串口通信。

首先,有线串口通信是本软件的主要通信方式,单片机可以通过串口线连接到终端传递信息。Qt 中提供串口模块实现数据通信。要使用串口模块,需要在工程文件中加入serialport 模块,并在源代码中引入串口的头文件。一般来说,在使用串口时主要分以下四个步骤:

(1)获取当前终端中可连接的所有串口信息。QSerialPortInfo类提供了提供现有串行端口的信息,使用该类的availablePorts 方法会返回系统上可用串行端口列表,该列表的每个QSerialPortInfo对象表示一个串行端口,可以查询端口名称、系统位置、描述和制造商等。

(2)根据串口列表信息,选择适当串口打开。在打开串口时,需要使用QSerialPort 完成与单片机的通信,要使用该类除了需要配置步骤(1)中设置的串口信息外,还需要配置波特率、数据位和校验位等信息用于控制通信数据。最后使用Qt 中的信号槽机制将串口设备信号与处理过程连接,当单片机的数据到达串口时会发送readyRead 信号,根据该信号我们可以定义个槽函数解析数据。

(3)数据交互。当成功打开串口后,就可以实现串口通信。串口通信终端(Qt 程序)除了上面所说得利用Qt 中得信号槽机制处理单片机中的数据外,还可以将数据发送给单片机以实现船舶航行路线控制。Qt 程序向单片机发送数据过程比较简单,只需要使用QSerialPort 对象的write 方法即可,当调用该方法后,数据会被写入到串口并交给单片机进行处理。

(4)关闭串口。使用完串口后,可以使用QSerialPort 对象的close()方法关闭串口。串口可以通过有线连接的方式与船载终端通信,考虑到手机、平板终端访问需要使用到无线传输,所以在设计时除了使用有线串口之外,还可以使用无线WiFi 和蓝牙通信。对于WiFi 通信,我们可以利用其将数据传输到远程服务器存储,然而对于海域中没有网络或网络信号较差的海域,并不能够完全监视船只航行情况,所以无线WiFi 只作为备用通信方式,需要用户选择连接,这里我们只介绍蓝牙通信。要使用蓝牙通信,需要给单片机增加蓝牙模块,这里我们使用HC-08 模块[5]。HC-08 蓝牙串口通信模块采用蓝牙4.0 通信协议,可以实现80m 距离通信,能够满足距离需求。其实使用蓝牙串口与有线串口发送和接受的数据相同,不同的是软件配置方式。在Qt 中使用蓝牙模块需要在工程中引入bluetooth 模块,并在源代码中引入蓝牙头文件。使用蓝牙通信方式与串口操作步骤基本相同。首先,需要打开蓝牙并扫描附近蓝牙设备。Qt 中的QBluetoothLocalDevice 提供了访问本地蓝牙的方法,可以用于获取蓝牙设备地址和名称,设置设备的可见性用于其 它 设 备 连 接 。 同 QBluetoothLocalDevice 相 似 ,QBluetoothDeviceInfo 用于访问远程蓝牙信息。我们可以使用QBluetoothDeviceDiscoveragent 自动搜索可连接范围内的可见蓝牙设备,当搜索到附近的蓝牙设备后,QBluetoothDeviceDiscoveragent类会产生deviceDiscovered(QBluetoothDeviceInfo)信号,其次,通过对应的槽函数处理该信号即可。接着,建立蓝牙设备之间的连接,并通过该连接使用虚拟串口建立蓝牙socket 服务通信。QBluetoothSocket 类可以创建socket 对象,要注意的是在构造函数中的参数需要设定模式为RfcommProtocol 以模拟RS232 串口模式,通过connectToService 方法建立连接。同样在socket 中也提供了丰富的信号,比如成功建立连接信号,成功断开信号,可以定义槽函数处理这些信号。最后,发送和接受数据。当蓝牙成功的建立连接后,就可以利用蓝牙发送和接受数据,使用socket 中的write方法可以将数据直接发送给单片机。当终端设备中接受到来自单片机得数据时,会产生readyRead()信号,我们只需要定义槽函数处理该信号即可。

1.3 自主航行模块

本软件中自主航行模块主要完成的任务是当船员设置目标位置之后,船只能够自助航行到该目标位置。Qt 终端主要完成船只航行定位和设置目标位置两种功能。

要实现船只的自主航行功能,首先很重要的一点是利用GPS信号对船只定位,并且需要获得船只航行方向和速度等基本信息。单片机中包含有GPS 模块,用于接受GPS 信号,常用的GPS 模块大多采用NMEA-0183 协议,在Qt 中我们需要做的是从GPS 信号中解析出这些基本信息后进行终端显示。这里我们主要利用GPS推荐定位信息输出语句($GPRMC),下面是一帧GPS定位的主要数据,其标准格式为:

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12> * hh

该项目主要需要使用的是:<3> 纬度(格式为ddmm. mmmm,即dd 度,mm. mm mm 分);<5>经度(格式为dddmm. mmmm,即ddd 度,mm. mmmm 分);(7)地面速率(000.0~999.9 节);(8)地面航向(000.0~359.9 度,以真北为参考基准)。当成功提取出这些信息后,就可以利用QML中得控件将它们显示到Qt 终端,具体显示方法可以参考2.1 中的航行信息模块。

设置目标位置时需要从地图中选择要到达的目标位置,软件会给出目标位置的经纬度,偏向和距离当前位置的相关信息,当确定相关信息后,船只会自动航行到目标位置。在Qt 中我们可以使用MapQuickItem元素将QML中得组件在地图上展示,这里我们主要使用该组件显示目标位置的标记。另外在用户用鼠标点击目标位置后,还需要获得地图上得坐标,Qt 中提供了不可见元素MouseArea 来实现,该元素可以设置鼠标作用域,在此作用域内可以用于响应鼠标点击事件,并产生点击信号,这里我们处理的是onPressed 信号,通过该信号我们可以获得当前鼠标得坐标位置,然后使用map 对象中的toCoordinate 方法将获得的坐标位置转换为经纬度信息。有了目标位置的经纬度信息之后就可以根据当前船只所在的位置信息和Haversine 公式[6]计算出目标位置距离和航向角。在船只自主航行时,会根据航向角调整船只航行方向。

2 软件测试

本软件系统在测试中需要使用到底层单片机硬件环境,主要用于Qt 软件终端从单片机中接受GPS 信号并能够向单片机中写入信息以实现控制。本软件设计和实现各个模块过程中已经对这些子模块进行了调试,各模块基本符合要求,使用Qt5 设计的自助导航显控界面如图3 所示。最后开发过程中的模拟实验以及真实环境下的实际应用,信息显示、界面操控以及系统的稳定性完全能满足船用导航各方面的需要。

图3 基于Qt 的自主航行终端界面

3 结论

本文详细介绍了使用Qt5 设计自主航行终端的基本过程,包括用户界面设计、数据通信模块、自主航行模块等,实现了船只定位,自主导航等功能。通过实验模拟和实际应用发现,使用Qt 设计终端界面上的显示功能及该系统性能完全满足船用导航终端的需求。然而要实现一个功能完善、界面友好的导航系统还有很多工作要做,本系统还有很多不足,例如可以依据实际的用户需求,丰富界面外观,完善导航系统,加入语音提示以及利用多种传感器设备为用户提供更多、更方便的导航信息等。

猜你喜欢
插件船只串口
基于NPORT的地面综合气象观测系统通信测试方法及故障处理
基于API函数库实现串口数据通信的分析与设计
基于EM9000工控板高性能双串口通信模型设计与实现
自编插件完善App Inventor与乐高机器人通信
基于OSGi的军用指挥软件插件机制研究
船舶电子设备串口数据的软件共享方法
基于jQUerY的自定义插件开发
孟加拉船只“罢工”
插件体系结构软件的原理和实现