QQ登录

只需一步,快速开始

查看: 8602|回复: 4
打印 上一主题 下一主题

Flightgear的航路管理_1

[复制链接]

主题

好友

5144

积分

版主

跳转到指定楼层
楼主
发表于 2014-5-19 21:36:32 |只看该作者 |倒序浏览
2周的时间过的很快,本来想学习下flightgear的视景渲染,结果发现能力不济,没有OSG的基础还是挺难的,然后果断的放下了。于是就有了这部分的介绍。
分割线
=============================================================================
概述
Flightgar内置了飞管功能,目前了解到支持的功能包括:航路管理,导航数据库管理,基本导航参数的计算,以及与飞控的交联。其中航路管理也可以称为飞行计划的管理,本章节主要介绍flightgear的航路管理模块。
Flightgear至少有3个模块是与航路管理功能相关的:
Autopilot模块,该模块包含航路管理的subsystem对象,也即包含航路管理的管理类,同时该模块还定义了机场和跑道等基本数据结构。
Instruments模块,该模块可以获取飞机的实时位置,并对航路进行过点排序。
Navaids模块,该模块包含了航路的基本结构定义,如:航路点、导航台、airway、终端程序、飞行计划等。

航路管理的基本处理流程
在flightgear中,航路是通过FGRouteMgr对象管理的。FGRouteMgr是SGSubsystem的子类,根据之前对flightgear初始化流程的分析可知,flightgear在启动后会调用全局函数fgCreateSubsystems创建所有的subsystem,其中包括FGRouteMgr(globals->add_subsystem( "route-manager", new FGRouteMgr);)。之后会调用每个subsytem的初始化函数init,随后循环的调用subsystem的update函数。因此为了了解FGRouteMgr的处理流程,主要集中在下面3个函数:
构造函数:FGRouteMgr:: FGRouteMgr;
初始化函数:FGRouteMgr:: init;
主循环函数:FGRouteMgr:: update

构造函数
Flightgear在fgCreateSubsystems函数中创建了FGRouteMgr对象时会自动地调用FGRouteMgr的构造函数,在其构造函数中,主要进行了相关命令的绑定,使航路被编辑时动态的调用相关的函数:
SGCommandMgr::instance()->addCommand("load-flightplan",commandLoadFlightPlan);
       SGCommandMgr::instance()->addCommand("save-flightplan",commandSaveFlightPlan);
       SGCommandMgr::instance()->addCommand("activate-flightplan",commandActivateFlightPlan);
       SGCommandMgr::instance()->addCommand("clear-flightplan",commandClearFlightPlan);
       SGCommandMgr::instance()->addCommand("set-active-waypt",commandSetActiveWaypt);
       SGCommandMgr::instance()->addCommand("insert-waypt", commandInsertWaypt);
       SGCommandMgr::instance()->addCommand("delete-waypt", commandDeleteWaypt);
       该部分功能暂且留在此处不去分析,我们来继续分析后续的处理。
初始化函数
Flightgear在创建了FGRouteMgr对象后,会在后续的处理中调用FGRouteMgr的初始化函数init,在init函数中主要实现了相关属性与变量及处理函数的绑定,以及相关属性的初始化,这些属性包括:起飞、目的、备用机场和跑道,终端程序和巡航阶段的信息等。
主循环函数
Flightgear在进入主循环后,会循环的调用FGRouteMgr的处理函数update,在update函数中,FGRouteMgr进行了如下的处理:
1.     根据当前轮载信号和地速,判断当前飞机是否在空中,并设置起飞和着陆时间
2.     根据当前位置和磁差,计算当前航路的待飞距、真/磁方位角、待飞时、当前航段的总长、除了当前航段的航路剩余长度。
3.     根据当前位置和磁差,计算到下一航段终止点的距离,真/磁方位角、待飞时间、航段的总长、除了下一航段的航路剩余总长。
4.     计算剩余航路的总长(也即从当前点算起到航路最后一个点的距离)、剩余航路预计需要的时间

总结
前面的部分介绍了flightgear中航路管理的处理流程,但是存在有个关键的问题,在update函数中,没有任何关于当前航段切换的处理,也就是说在update函数中航段永远不会切换,如果不进行其它处理当前航段始终都是第一个航段,显然关于航段排序的处理是在其它地方进行的.关于这部分将在后续章节中会介绍.



flightgear的FGRouteMgr处理过程中的几个bug:
1.设置起始机场的标高,应该把起始机场标高的处理函数给绑定函数,但是flightgear使用的是目的机场标高的处理函数,修正如下:
departure->tie("field-elevation-ft", SGRawValueMethods<FGRouteMgr, double>(*this,                                                                                &FGRouteMgr::getDestinationFieldElevation, NULL)); -----》
departure->tie("field-elevation-ft", SGRawValueMethods<FGRouteMgr, double>(*this,                                                                    &FGRouteMgr::getDepartureFieldElevation, NULL));

2.计算最后一个航段的到达时间时,传入的距离有问题,应该传入数据的单位是米,但是flightgear传入的是海里,修正如下:
setETAPropertyFromDistance(wpn->getChild("eta"), totalDistanceRemaining); ------》
setETAPropertyFromDistance(wpn->getChild("eta"), totalDistanceRemaining * SG_NM_TO_METER);

不过上面的两个bug不影响flightgear中航路管理模块的处理,只是用户在用这些数据输出时可能会存在问题。

过几天介绍航路管理模块中航路的排序问题,这个问题可能涉及到flightgear的另一模块Instruments,谢谢。

email: zk.sima@gmail.com


分享到: QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏1

主题

好友

5144

积分

版主

沙发
发表于 2014-5-19 21:50:59 |只看该作者
大家多交流,希望看过flightgear源码的前辈指正,也希望熟悉flightgear操作的大侠能介绍下flightgear中关于航路的操作流程
回复

使用道具 举报

主题

好友

23

积分

报考学院待录取

板凳
发表于 2014-6-12 09:05:56 |只看该作者
写的真不错,还在研究中
回复

使用道具 举报

主题

好友

37

积分

报考学院待录取

地板
发表于 2015-1-17 14:23:31 |只看该作者
多谢楼主的分析

不知道文中说的这些飞机的状态、位置信息等怎么从外部输入?比如说GPS的信息能用来生成航路吗?
回复

使用道具 举报

主题

好友

55

积分

航院新生

5#
发表于 2018-4-20 15:36:00 |只看该作者
文章写的很棒,讲解的很清楚,非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入FG

本版积分规则

手机版|联系我们| FlightGear ( 吉ICP备19002044号-7 )

GMT+8, 2024-5-5 12:58

Powered by Discuz! X3.2

© 2001-2013 FlightGear Inc.

返回顶部