本帖最后由 zk_sima 于 2014-5-4 21:44 编辑
前面介绍了Flightgear接口系列_2_FGIO初始化过程
下面,来分析了基本的协议:
1. joyclient协议
实例:
--joyclient=socket,in,50,,5050,udp 该命令表示flightgear需要支持joyclient协议,并通过socket进行io通信,其中flightgear只需要接收数据,频率为50,接收端口为5050,传输层协议为UDP。 注意:joyclient协议只支持io输入,即支持in,不支持out 该协议是用来操作/controls/flight/aileron和/controls/flight/elevator,即副翼和升降舵,输入时两个值都为int型,范围在0~4096;
2.jsclient协议
实例:
--jsclient=socket,in,60,,5050,udp –prop:/jsclient/axis[0]=”/controls/flight/aileron” –prop:/jsclient/axis[1]=” /controls/flight/elevator” –prop:/jsclient/axis[2]=”/controls/flight/rudder” –props:/jsclient/axis[3]=” /controls/engines/engine[0]/throttle” 其中socket:代表jsclient的io通信时通过网络接口socket,in:代表flightgear接收数据,60:代表采集数据的频率为60,5050:代表flightgear在端口5050上接收数据,udp:代表flightgear接收udp数据。即flightgear以频率60,通过udp协议在端口5050接收数据。 接收的第一个数据用于控制副翼,对应属性:/controls/flight/aileron;接收的第二个数据用于控制升降舵,对应属性:/controls/flight/elevator;接收的第三个数据用于控制方向舵,对应属性:/controls/flight/rudder;接收的第四个数据用于控制第一个发动机油门,对应属性:/controls/engines/engine[0]/throttle。 3.native_fdm协议
实例:
--native-fdm=socket,out,100,127.0.0.1,5498,udp
其中socket代表:数据的输入输出时通过网络接口进行的;out代表:数据流为输出,方向为从flightgear到客户端;1代表:数据的发送频率为1HZ;127.0.0.1代表:客户端的ip地址为127.0.0.1,即本地;5050代表:客户端的接收端口为5050;udp代表:数据流是通过udp传输的;
该协议是用于输入输出飞机的动力学模型数据,在联飞、视景扩展等很多地方都会用到该协议。
该协议可能是使用的最多的协议,论坛上有大量的帖子讲到该协议,以及该协议的输入输出数据接口。
该协议的源码在native_fdm.hxx/native_fdm.cxx文件中,数据的结构在net_fdm.hxx/net_fdm.cxx中有定义。
论坛上关于该协议的输入输出实例用到的数据接口及其解析实际上就是net_fdm.hxx/net_fdm.cxx这两个文件,不多说,可以直接参照论坛中其它帖子或者直接在源码中把这两个文件拿来用。
4.generic协议
实例:
--generic=socket,out,1,127.0.0.1,5050,udp,my-generic 其中socket代表:数据的输入输出时通过网络接口进行的;out代表:数据流为输出,方向为从flightgear到客户端;1代表:数据的发送频率为1HZ;127.0.0.1代表:客户端的ip地址为127.0.0.1,即本地;5050代表:客户端的接收端口为5050;udp代表:数据流是通过udp传输的;my-generic代表:在$FG_ROOT/data/Protocol目录下存在my-generic.xml文件,该文件指明了数据传输的内容和方式。该实例中my-generic.xml文件内容如下:<?xml version="1.0"?> <PropertyList> <generic> <output> <binary_mode>true</binary_mode> <byte_order>host</byte_order> <chunk> <name>Pos.Lat</name> <type>double</type> <node>/position/latitude-deg</node> </chunk> <chunk> <name>Pos.Lon</name> <type>double</type> <node>/position/longitude-deg</node> </chunk> <chunk> <name>Pos.qnh</name> <type>double</type> <node>/position/altitude-ft</node> </chunk> </output> </generic> </PropertyList>
其中output节点内的内容代表flightgear输出的内容,每个chunk节点中包含一个值对应flightgear内部的属性。 Generic是flightgear最通用的一个接口,可以满足用于的基本定制需求,能让用户自定义的读写flightgear内部属性。
flightgear中还定义了其它的接口协议,不过目前我只接触上面的这些,尤其是generic协议。
其实协议本身的使用难点不在于协议格式如何,而是协议支持的属性有哪些。如果自定义数据输入输出的话,更需要关心输入输出的属性。
关于这些属性,flightgear的data/docs目录中给出了基本的属性,但是还有很多属性可能需要通过源码或其它方式来获取了。
后面有时间会介绍下如何修改flightgear,使flightgear支持自定义协议。
email: zk.sima@gmail.com |