JSBSimAPI参考
参考文档JSBSim Flight Dynamics Model: FGFDMExec Class Reference (jsbsim-team.github.io)
1.FGFDMExec类
1.1细节描述
封装JSBSim模拟执行程序。
此类是执行类,通过该类可以实例化、初始化和运行所有其他模拟类。当与 FlightGear(或其他飞行模拟器)集成时,此类通常由模拟器端的接口类实例化。
在模拟初始化时,接口类会创建此执行类的实例。随后,执行人员被指示加载所选的飞机规格文件:
fdmex = new FGFDMExec(...);
result = fdmex->LoadModel( ... );
加载飞机模型时,会解析配置文件,并针对配置文件的每个部分(推进、飞行控制等)调用相应的 Load() 方法(例如 FGFCS::Load())。
在创建执行程序和加载模型之后,将执行初始化。初始化包括将控制输入复制到适当的 JSBSim 数据存储位置,针对用户提供的初始条件集对其进行配置,然后从 JSBSim 复制状态变量。状态变量用于驱动仪表显示,并将车辆模型放置在世界空间中以进行视觉渲染:
copy_to_JSBsim(); // copy control inputs to JSBSim
fdmex->RunIC(); // loop JSBSim once w/o integrating
copy_from_JSBsim(); // update the bus
一旦初始化完成,循环执行过程;
copy_to_JSBsim(); // copy control inputs to JSBSim
fdmex->Run(); // execute JSBSim
copy_from_JSBsim(); // update the bus
通过创建一个紧凑的存根程序,可以在独立模式下使用 JSBSim,该程序有效地执行上面为集成版本概述的相同步骤进程,但有两个例外。首先,不使用 copy _ to _ JSBSim()和copy_from_JSBSim()函数,因为控制输入由脚本工具直接处理,输出由输出(数据日志记录)类处理。其次,脚本文件的名称可以提供给存根程序。脚本(参见FGScript)提供了一种向模拟提供命令输入的方法
FDMExec = new JSBSim::FGFDMExec();
FDMExec->LoadScript( ScriptName ); // the script loads the aircraft and ICs
result = FDMExec->Run();
while (result) { // cyclic execution
result = FDMExec->Run(); // execute JSBSim
}
独立模式对于在更新原始码储存库之前验证更改非常有用。它也有助于运行测试集,揭示模拟飞机性能的某些方面,如距离,爬升时间,起飞距离等。
JSBSim调试指令
这将向任何感兴趣的实体描述通过设置 JSBSIM _ DEBUG 环境变量请求的调试级别。
位掩码值的选择如下:
unset:在这种情况下(默认情况下) ,JSBSim 只会打印出正常预期的消息,实际上是在读取配置文件时回显它们。如果没有设置环境变量,debug _ Ivl 在内部被设置为1。
0: 这要求 jsbSim 不输出任何消息
1:要求整成的JSBSim启动消息
2:当一个类被实例化后消息被输出
4: 当 FGModel 对象执行其 Run ()方法时,将显示一条消息
8: 将定期打印各种运行时状态变量
16: 当设置各种参数时,会检查它们是否正常,当它们超出界限时会打印出一条消息
1.2重要方法介绍
QueryPropertyCatalog()
在python 中函数为query_property_catalog()
string QueryPropertyCatalog(const std::string & check,const std::string & end_of_line = "\n")
// check 要在属性目录中搜索的字符串
// end_of_line 行尾
//返回值:包含目录中所有匹配字符串的回车分隔字符串。
{
string results;
for (auto &catalogElm: PropertyCatalog) {
if (catalogElm.find(in) != string::npos) results += catalogElm + end_of_line;
}
if (results.empty()) return "No matches found"+end_of_line;
return results;
}
检索与提供的字符串匹配的属性。
返回一个字符串,该字符串包含属性目录中与提供的检查字符串匹配的所有字符串的回车返回分隔列表。
SetPropertyValue()
python中为set_property_value()
void SetPropertyValue(const std::string & property,double value)
//设定属性值
//property:需要设置的属性
//value:要设置的值
RunIC()
bool RunIC(void)
//从初始条件对象初始化模拟器,并执行每个调度模型,而不需要集成。
{
SuspendIntegration(); // saves the integration rate, dt, then sets it to 0.0.
Initialize(IC.get());
Models[eInput]->InitModel();
Models[eOutput]->InitModel();
Run();
Propagate->InitializeDerivatives();
ResumeIntegration(); // Restores the integration rate to what it was.
if (debug_lvl > 0) {
MassBalance->GetMassPropertiesReport(0);
cout << endl << fgblue << highint
<< "End of vehicle configuration loading." << endl
<< "-------------------------------------------------------------------------------"
<< reset << std::setprecision(6) << endl;
}
for (unsigned int n=0; n < Propulsion->GetNumEngines(); ++n) {
if (IC->IsEngineRunning(n)) {
try {
Propulsion->InitRunning(n);
} catch (const string& str) {
cerr << str << endl;
return false;
}
}
}
return true;
}
GetPropulsion
在python中为get_propulsion()
返回FGPropulsion指针
2.FGPropulsion类
FGPropulsion类是整个推进系统的容器,由发动机和油箱组成。一旦FGPropulsion类获得了配置文件,它就会读取部分。然后:
- 创建适当的引擎类型实例
- 至少创建一个tank对象,并与发动机相连
在运行时调用每个引擎的 Calculate ()方法。
GetNumEngines()
python中为get_num_engines()
返回飞机的引擎数
GetEngine()
auto GetEngine(unsigned int index) const
//从引擎列表中返回引擎指针
//index:在向量容器中索引引擎的索引
//return:特定引擎的地址,如果没有这样的引擎可用,则为零
assert(index < Engines.size());
return Engines[index];
}
InitRunning()
void InitRunning(int n)
//设置引擎运行。
GetSteadyState()
bool GetSteadyState(void)
//循环发动机直到推力(thrust)输出稳定(用于修整)
3.一个完整的启动JSBSim过程
def reload()#初始化 或者说是重置(reset)
self.jsbsim_exec = jsbsim.FGFDMExec(r"jsbsim的文件路径")#实例化执行类,加载飞机规格文件
self.jsbsim_exec.set_debug_level(0)#不发送任何消息
self.jsbsim_exec.load_model(self.model)#从加载的文件中解析相应的模型(例如"f16)
jsbsim_list = self.jsbsim_exec.query_property_catalog("").split("\n")#获取JSBSim所有属性字符串
self.jsbsim_exec.set_dt(self.dt)#设置仿真步长
self.set_property_value(prop, value)#设定JSBSim初始状态
success = self.jsbsim_exec.run_ic() #初始化模拟器
if not success:
raise RuntimeError("JSBSim failed to init simulation conditions.")
propulsion = self.jsbsim_exec.get_propulsion() #获取“推动器”对象
n = propulsion.get_num_engines()#获取引擎数量
for j in range(n):
propulsion.get_engine(j).init_running()#设置引擎运行
propulsion.get_steady_state()#循环发动机直到推力(thrust)输出稳定(用于修整)
def run():#运行JSBSim
result = self.jsbsim_exec.run() #运行一步JSBSim
self.jsbsim_exec.get_property_value(prop.name_jsbsim)#更新数据