1. FGFS 的IO系统- FGFS是一个做研究的非常优秀的系统,飞行,气动,控制等,做这些免不了要和FG进行数据交换,本文主要说说FG的IO系统,包括FG的IO架构,支持的IO协议,及与FG的通信。
1.1. FG的IO系统架构- FG支持许多IO协议,这些协议均由一个simgear的SGSubsystem模块形式实现的FGIO子系统来进行管理。这些协议在功能和作为可能有相同的以可能不同, 并且这些模块可以同时启动。在一个FG运行实例中可以同时使用多种协议与其进行通信。FG支持的协议有generic,garmin,joyclient,jsclient,native-ctrls,native-fdm,native-gui,native,nmea等等,详细的列表参见fgfs的手册。
1.2. IO架构- 每个协议模块都是一个FGProtocal的子类,实现了相应的操作接口。主程序先根据命令行的参数确定要启用哪些IO协议,然后创建对应的io协议的实例,并以指定的参数初始化。
主程序起动后,使用Options对像来处理命令行参数,所有支持的参数在options.cxx:struct OptionDesc结构中定义, 该结构还定义的参数的类型, 类型是OPTION_CHANNEL的都是IO子系统的。 通过在Options::init() -> parseOption()->addOption()将参数以参数名、参数值创建一个 OptionValue对像实例,保存到一个vector中。 然后主程序调用Options::processOptions() -> Optons: ptionsPrivate::processOption()来处理每个参数。如果参数类型为OPTION_CHANNEL,就将其添加到全局的FGGlobals::channel_options_list中,至此参数处理完成。 主程序在fg_init.cxx:fgInitSubssytems()中加载各个子系统,其中就包括FGIO子系统,最后调用 globals.get_subsystem_mgr().init()初始化所有注册的子系统,对于IO子系统来说,前面已经将从参数指定的要启动的IO协议保存到了列表中,在FGIO::init()中遍历已经从命令行分析到的要使用的IO协议的信息, 根据参数指定的协议创建相应的IO协议的实例,见FGIO::parse_port_config()函数. 每种协议参数配置不尽相同,后面在说.
- FGProtocal主类定义一操作框架的接口, 及几个主要的属性,hz: 数据更新/发送的频率; dir:数据的方向,指定FG是发送还是接收都, in 表示接收,out表示是发送;io:数据收发通道,根据协议不同,通道可以是串口,socket, 文件等,这些属性在FGIO::parse_port_config()的后半部分中设置的。 初始化完成后,就进入工作准备,当主系统调用 FGIO::update()时,IO子系统遍历已经注册的协议,分别调用每个协议的update()函数。 FG启动时设置IO系统的参数一般如下面的格式:
- --protocol=medium,direction,hz,medium_options,...
protocol = 指定的协议名,如 native, nmea, garmin, fgfs, rul, pve, ray等 medium = IO使用的媒体,可以是 serial, socket, file, 有些协议不需要指定该参数,如httpd,就只有一个设定端口的参数。 direction = 数据方向,如 in, out,有些协议只支持输入或输出 hz = 数据更新的频率,单位秒,可以使用浮点数 medium_options 为与选择的IO像媒体相关的选项,如串口(serial)就需要指定串口的名字和波特率。
- 以上这些参数,不是所有的都需要,是根据使用的媒体需定和协议而定的。
1.3. IO协议介绍本节简单介绍一下一些主机IO协议的使用方式, 只选了几个比较典型和我知道是什么的来介绍,有些协议我以不知道具体的情况,就不说了,有了解的同学请补充。下面的协议名已options.cxx中的struct OptionDesc结构中的定义为准,至于标准名是什么不于追究。使用这些协议与FG进行通信,先对 SimGear的属性系统及 flightgear的各种属性有所了解,就很容易使用了,当然有些协议不需要,如joyclient.
1.3.1. atcsim
1.3.2. atlas
1.3.3. httpd
1.3.4. jpg-httpd- 指定jpg-httpd选项后,FG在运行时会在指定的端口创建一个简单的http服务器,当访问一个端口时,FG会返回一张当前FG运行的屏幕的截图。用浏览器访问就能看到截图。
1.3.5. native- Native以是一个二进行协议,不过和前面几个不同的时,数据来由于FG运行时的全局FGInterface类对象evil_global_fdm_state,在flight.hxx文件中定义FDM(Flight Dynamics Model)中的各种数据。这些数据可能更多的是用来调试FG用,如果只是想和FG进行通信,操作飞行器,建议使用其它的一些协议,更方便使用。
1.3.6. native-ctrls- Native-ctrls是一个二进制数据协议,是FG自己定义的,协议的格式在net_ctrls.hxx文件中的FGNetCtrls类定义的数据结构体,数据元素比较多,我就不一一说明了,基本上飞行器飞行相关的数据都有了,使用这个协议可以读取或控制FG中飞行器的各种功能了,如操控的,导航的等等。
1.3.7. native-fdm- Native-FDM的使用方式和Native-ctrls是一样的,只是通信的数据格式有些不同,FDM的数据格式在net_fdm.hxx中的FGNetFDM结构体中定义,结构定的各字段参看源文件中的定义和说明.
1.3.8. native-gui- Native-GUI协议也是和Native-ctrls差不多的,只是数据格式和含义有所不同,Native-GUI的数据格式在net-gui.hxx中的FGNetGUI结构体中定义的,结构定的各字段参看源文件中的定义和说明.
1.3.9. opengc- 数据结构在opengc_data.hxx中的ogcFGData结构中定义的。OpenGC是一个多平台,多模拟器的用于开发高质量玻璃驾驶舱显示器的工具。opengc参数用于指定输出或接收符合OpenGC的数据。
1.3.10. garmin- 使用Garmin协议格式数据,可以用于记录飞行器的GPS位置信息或向提供外部GPS位置信息给FG使用。协议格式可参考相关文档。
记录飞行GPS数据使用参数:
--garmin=file,out,5, recordfile
或可以使用GPS数据控制FG中的飞行器:
--garmin=file,in,5,recordfile
1.3.11. nmea- 使用nmea协议格式的GPS数据,可以用于记录飞行器的GPS位置信息或向提供外部GPS位置信息给FG使用。协议格式可参考相关文档。
1.3.12. genericGeneric是一个基于XML的协议,XML的具体格式见README.protocol文档,该协议格式一般用于记录和回放FGFS的飞机。如要记录飞机过程,可以指定参数:
--generic=file,out,20,recordfile,playback。
要回放飞行记录,可以使用参数:
--generic=file,in,20,recordfile,playback --fdm=external。
1.3.13. props- 指定该参数,FG会在指定的端口创建一个telnet服务器. 使用telnet连接上后,可使用help查看帮助,FG的各种属性就可以向一个文件系统一个操作,可以使用ls列出属性,get/set读/修改属性值。
1.3.14. telnet
1.3.15. pve- PVE协议以字符串的形式输出roll,pitch,heave的值, roll,pitch为角度值。可以用于模拟机坐舱控制等的数据。
1.3.16. joyclient- 能可以使用远程数据当驾驶杆,只支持两个轴,分别控制飞行器的升降舵和副翼。可以通过Socket或者串口,向FG发送数据,数据的格式为两个32位整数,第一个为X轴的位置,第二个数为Y轴的位置,分别取值为0-4096, 为2048为中点,小于2048表示向下偏转对应摇杆的负方向,大于2048表示向上偏转对应摇杆的正值。
1.3.17. jsclient- 这个功能和joyclient差不多,只是支持的轴有4个,并且这4个轴所控制的功能不是固定的,是根据系统中配置的摇杆的前4个轴对应的功能,数据格式为6个32位整数,前4个数对应前4个轴,后两个数现在没有使用。取值为正负0x7FFFFFFF之间。
1.3.18. multiplay- 使用格式为--multiplay=dir,Hz,host,port, --callsign=ABCD,多人联机飞行的连接配置,dir设为in,表示FG作为服务器运行,其他飞友连接到你们电脑一起飞行,这需要其他人能直接访问到你的IP。Hz为数据更新频率,越大数据更新快,但以需要更大的带宽。host和port,如果是服务端,指定在那个地址和端口进行监听,以接受其它人的连接,如果作为客户,指定服务器的地址和端口号。callsign为你的呼号, 在一个服务器上的飞机的呼号不能重复。
1.4. 使用实例
1.4.1. 多机同步显示- 主机设置--native-fdm=socket,out,60,,5505,udp --native-ctrls=socket,out,60,,5506,udp
- 其它从机设置--native-fdm=socket,in,60,,5505,udp --native-ctrls=socket,in,60,,5506,udp --fdm=null
1.4.2. 连机飞行- 连接到mpserver01.flightgear.org进行联机飞机, 呼号为fg0001--multiplay=out,10,mpserver01.flightgear.org,5000 --callsign=fg0001
1.4.3. 记录和回放- 记录-generic=file,out,20,flight.out,playback
- 回放--generic=file,in,20,flight.out,playback --fdm=external
1.4.4. 串口摇杆- 设置FG从串口com1(linux使用ttyS0), 以波特率9600的速率,接收joyclient协议的数据.--joyclient=serial,in,30,com1,9600
1.4.5. 启动http服务 |