Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

硬件在环与软件在环概念辨析

发表于 2019-04-25

在PX4自驾仪软件的二次开发过程中,涉及硬件在环与软件在环两个概念,不易理解。下面对这两个概念进行辨析。

基本概念

硬件在环

硬件在环(Hardware in the Loop,简称HIL)即硬件在控制环路,是一种半实物仿真。根据控制器和控制对象是否为真实硬件,分为以下两种硬件在环方式:

  • 虚拟控制器+实际对象=快速控制原型(RCP)仿真系统,是系统的一种半实物仿真;
  • 实际控制器+虚拟对象=硬件在回路(HIL)仿真系统,是系统的另一种半实物仿真。

硬件在环主要用于测试控制器系统。

软件在环

软件在环主要测试控制器模型与控制器模型代码实现之间的一致性。

处理器在环

软件在环主要测试控制器模型与控制器模型代码实现在目标处理器上运行之间的一致性。

模型在环

模型在环(Model in the Loop,简称MIL)是用模型驱动进行嵌入式系统的开发时,在开发阶段初期及建模阶段中进行的仿真方式。嵌入式系统需和其运作的环境互动,一般会预期有合理的传感器信号为其输入,也会依输入及系统设计来驱动实体系统。为了使系统正常工作,需要将嵌入式系统的环境纳入仿真考量范围内。若嵌入式系统模型和环境模型连接,一起进行仿真,则即称为模型在环模拟。

模型在环主要用于测试控制算法,其控制器模型和控制器对象都是虚拟的。

参考链接

  1. 请明白人通俗的解释一下什么叫硬件在环?, by zhihu.
  2. 简单说说MIL、SIL、PIL和HIL, by Wangxn665.
  3. 模型在环, by wikipedia.
  4. 硬件在环, by 百度百科.

机器人路径规划、轨迹规划和运动规划概念辨析

发表于 2019-04-17

在机器人自动控制研究中,路径规划、轨迹规划和运动规划三个概念总是混淆不清,难以捉摸。下面结合各种资料,给出我个人的一些理解,对这三个概念进行辨析。

基本概念

路径规划(path planning)

路径是机器人位姿的一定序列,不考虑机器人位姿参数随时间变化的因素。路径规划(一般指位置规划)是找到一系列要经过的路径点,路径点是空间中的位置或关节角度。

轨迹规划(trajectory planning)

路径是机器人位姿的一定序列,不考虑机器人位姿参数随时间变化的因素。路径规划(一般指位置规划)是找到一系列要经过的路径点,路径点是空间中的位置或关节角度,而轨迹规划是赋予路径时间信息。

运动规划(motion planning)

运动规划就是在给定的位置A与位置B之间为机器人找到一条符合约束条件的路径。运动规划包含路径规划和轨迹规划。

运动规划,又称运动插补,是在给定的路径端点之间插入用于控制的中间点序列从而实现沿给定的平稳运动。

运动控制则是主要解决如何控制目标系统准确跟踪指令轨迹的问题,即对于给定的指令轨迹,选择适合的控制算法和参数,产生输出,控制目标实时,准确地跟踪给定的指令轨迹。

参考链接

  1. 运动(motion)规划、路径(path)规划和轨迹(trajectory)规划之区别,by Roger_Ceng.
  2. 运动规划/路径规划/轨迹规划,by 小白鼠2号.
  3. 运动规划 | 简介篇,by qqfly.
  4. 无人车运动规划,路径规划,轨迹规划的区别和联系?, by zhihu.

FlightGear简易飞行教程

发表于 2019-03-29 | 更新于 2021-01-09

FlightGear是一个始于1997年多平台飞行模拟器、自由软件项目。下面简要介绍如何在FlightGear中驾驶飞行。

常用快捷键

飞机操纵

  • 9/3

推力:9增加推力(油门),3减小推力(油门)

  • 4/6

副翼:4向左滚转,6向右滚转

  • 8/2

升降舵:8推杆低头,2拉杆抬头

  • 0/Enter

方向舵:0向右偏航,Enter向右偏航

  • 5

居中副翼/升降舵/方向舵

  • ]/[

放/收襟翼

  • g/G

收/放起落架

  • b/B

刹车(全部轮胎)/或释放刹车

视角变换

  • x/X

放大/缩小

  • v/V

切换飞行员的观测模式

  • Tab

循环切换鼠标模式:正常模式(默认)、控制模式和查看模式。

自动驾驶

  • Ctrl + A

高度保持开关

  • Ctrl + G

下滑角跟随开关

  • Ctrl + H

航向保持开关

  • Ctrl + N

NAV 开关

  • Ctrl + T

地形跟随开关

  • Ctrl + U

高度增加 1000 英尺(紧急情况)

起飞教程

起飞步骤如下:

1.启动引擎

在驾驶舱内通过按键启动飞机引擎的过程很麻烦,且各种类型飞机引擎启动过程不一样。幸运的是,FlightGear的飞机菜单中会有自动启动或快速启动的子菜单,点击它们自动启动飞机引擎和各种航电设备。

2.释放刹车

使用快捷键B释放刹车。

3.滑跑起飞

飞机尽量在跑道中央进行滑跑起飞,使用快捷键“0/Enter”控制飞机方向舵,使飞机在跑道中央滑跑; 当飞机达到起飞速度(一般200~300km/h)时,先使用快捷键“5”居中副翼/升降舵/方向舵,以降低飞机在空中操纵的难度,再使用快捷键“8/2”操纵飞机升降舵,注意应避免仰角过大。

注意,FlightGear 2020.3 版本中F16不支持数字小键盘!

武器使用教程

各种战斗机可通过飞机菜单选择不同武器加载方案。但各种战斗机的武器使用方法不一样,对应武器发射的快捷键也不一样,可通过菜单“Help->Aircraft Help”查看具体飞机的自定义快捷键。下面以官方飞机库中的F15和F16为例说明武器使用方法。

F15

F15武器使用步骤如下:

1.打开Master ARM开关

该军械总开关防止武器误发射,使用快捷键Ctrl+w控制。

2.选择武器

可选择航炮和导弹等武器,使用快捷键m控制

3.发射航炮或释放导弹

使用快捷键e控制,注意航炮按e就发射,而导弹按e得持续3秒钟才能释放导弹。

4.使用诱饵弹

使用快捷键Ctrl+q释放诱饵弹。

F16

F16武器使用步骤如下:

1.打开Master ARM开关

该开关防止武器误发射,使用快捷键m控制。

2.选择武器

可选择航炮和导弹等武器,使用快捷键w控制

3.发射航炮或释放导弹

使用快捷键e控制,注意航炮按e就发射,而导弹按e得持续3秒钟才能释放导弹。

4.使用诱饵弹

使用快捷键q释放诱饵弹。

参考链接

  1. FlightGear,by wikipedia.
  2. FlightGear基本飞行操作快捷键,by zxc.
  3. “illegal argument” on some specific aircrafts,by flightgear forum.

JSBSim编程实践之入门

发表于 2019-03-27 | 更新于 2020-01-07

JSBSim是一个开源跨平台的飞行动力学模型(FDM)软件库,用于模拟航空航天飞行器的飞行动力学。 该库已被纳入飞行模拟软件包FlightGear和OpenEaagles。JSBSim可以独立运行,通过命令行参数指定飞行器和初始状态,进行简单情境下的飞行动力学仿真,也可以将JSBSim作为代码库,编程实现飞行器模型加载,设置输入,获得输出。下面即介绍在Linux平台编程调用JSBSim库的方法和步骤。

基础知识

gcc与g++

GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。

通常gcc用于编译链接c代码文件,而g++用于编译链接c++代码文件,但它们的使用方法很类似。下面介绍gcc和g++的常用选项。

  • 添加头文件搜索路径
1
gcc foo.c -I /home/xiaowp/include -o foo
  • 添加动态库搜索路径
1
gcc foo.c -L /home/xiaowp/lib -lfoo -o foo
  • 添加静态库搜索路径
1
gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo

编程实践

最简仿真

下面是JSBSim参考手册中的最简单实例,因JSBSim的不断开发,JSBSim参考手册中该编程实例有点过时,因此进行了少量修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <FGFDMExec.h>
#include <sg_path.hxx>

using namespace std;

int main(int argc, char **argv)
{
JSBSim::FGFDMExec FDMExec;
bool result = true;

FDMExec.LoadScript(SGPath::fromUtf8(argv[1]));

while (result) result = FDMExec.Run();
}

从上述代码可知,调用JSBSim的主要方法是利用FGFDMExec类,通过实例化一个FGFDMExec类,就相当于获得了一个运行JSBSim仿真的工具箱,通过这个工具箱就可以调用JSBSim的大部分功能,实现我们要的仿真目标。

接下来对该实例进行编译链接,使用如下命令:

1
2
# jsbsim_script.cpp是上述实例的代码文件
g++ jsbsim_script.cpp -I ../jsbsim/src/ -I../jsbsim/src/simgear/misc -L ../jsbsim/build/src/ -static -l JSBSim -o jsbsim_script

测试该实例,使用如下命令:

1
2
3
4
# jsbsim是JSBSim项目文件夹
# JSBSimTest是JSBSim测试实例所在文件夹
cd jsbsim
../JSBSimTest/jsbsim_script ./scripts/c1723.xml

参考链接

  1. JSBSim编程实践,by 32768.
  2. 战斗机与引擎速查,by 么的聊.
  3. JSBSim学习笔记(3)—— 基本概念,by 么的聊.
  4. JSBSim学习笔记(6)——飞行控制系统,by 么的聊.
  5. Linux平台编译安装测试JSBSim,by jack huang.
  6. JSBSim Reference Manual ,by jsbsim.
  7. gcc和g++头文件和库路径的寻找和添加,by 周学伟.
  8. GCC,by wikipedia.
  9. WHAT IS THE DIFFERENCE BETWEEN GCC AND G++,by KITTY GUPTA.

四旋翼无人机制作简易教程

发表于 2019-03-25 | 更新于 2019-07-08

四轴飞行器又称四旋翼、四转子,是一种多轴飞行器,有四个旋翼来悬停、维持姿态及平飞。和固定翼飞机不同,它通过旋翼提供的推力使飞机升空。它的四个旋翼大小相同,分布位置接近对称。对于简单的设计来说,仅仅通过调整不同旋翼之间的相对速度来调节不同位置的推力,并克服每个旋翼之间的反扭力矩,就可以控制飞机维持姿态、或完成各种机动飞行。下面简单介绍四旋翼无人机的制作过程。

无人机硬件装配

组装一件无人机所需配件及其连接示意图如图1所示。

四旋翼无人机机硬件连接图

图1 四旋翼无人机机硬件连接图

所需配件主要有:

  • 机身骨架
  • 一对正浆和一对反浆。注意浆的固定方向与电机旋转方向要一致。
  • 遥控器及接收机
  • 无刷电机及电调
  • ppm sum receiver
  • pixhawk 1,内含安全开关和蜂鸣器
  • gps
  • 锂电池
  • 云台和摄像头(可选)
  • telemetry无线收发装置与图传(可选)

无人机软件调试

遥控器与接收机之间对码

遥控器和接收机之间是配对的,使用之前必须对码,可根据遥控器的使用说明书进行操作。其连接示意图如图2所示。

航模遥控器与接收机对码示意图

图2 航模遥控器与接收机对码示意图

电子调速器的油门行程和进角设置

电子调速器主要控制马达的转速,其调试连接示意图如图3所示。

电子调速器连接示意图

图3 电子调速器连接示意图

如图3所示将电子调速器连接后,即开始设置油门行程和电子调速器进角。设置油门行程即让电子调速器知道遥控器的油门输入范围。而电子调速器进角有高中低之分,类似于汽车档位。低进角速度慢但扭力大,高进角速度快但扭力小,一般设置电子调速器中进角即可满足大多数要求。具体设置说明参照电子调速器使用说明书。

pixhawk飞控平台的设置

Pixhawk是PX4飞行堆栈的标准微控制器平台。在pixhawk硬件平台上可运行PX4和ArduPilot两种不同的自动驾驶仪软件套件。如果在pixhawk平台上安装px4自驾仪软件,则使用QGroundControl地面站软件进行设置;如果在pixhawk平台上安装ArduPilot自驾仪软件,则使用MissionPlanner地面站软件进行设置。

Pixhawk和GPS按照方向捆绑好后,按照地面站软件的指示进行设置。设置好之后,长按Pixhawk的安全开关,再将遥控器油门拉动底并推向最右方,即可解锁Pixhawk。

参考链接

  1. 四轴飞行器,by wikipedia.
  2. PX4 autopilot, by px4 homepage.
  3. Crazepony开源四轴飞行器,by crazepony.
  4. ArduPilot,by wikipedia.
  5. PX4 autopilot,by wikipedia.
  6. 从建模分析到控制器设计,四轴飞行器是怎样炼成的?,by 机器人.

FlightGear多人服务器的本地安装配置

发表于 2019-03-20

FGMS或FlightGear多人游戏服务器是FlightGear的独立网络服务器,并根据GPL许可。 它允许通过FGFS内的网络与其他飞行员一起飞行。

FGMS服务器列表类型主要有:

  • 中继服务器 - 网络中的其他服务器。 每个都必须有完整的列表(减去自己)以获得适当的网络功能。
  • 交叉馈送服务器 - 服务器从本地用户和其他服务器接收的所有内容都将转发到交叉馈送服务器。 用于在同一主机上运行多个连接的fgms实例,例如用于提供跟踪和未跟踪服务,而不会产生额外的外部流量。
  • 跟踪服务器 - 服务器每10秒向跟踪器发送一个每个本地用户的摘要更新。
  • HUB服务器 - 通常服务器不会将从服务器接收的数据包发送到其他中继。 HUB服务器将数据从服务器发送到它知道的所有中继。

特别呼号:

  • “obsXXXX”(用您喜欢的任何字符替换X)允许连接的FlightGear客户端查看全球所有其他MP飞行员(位置数据和聊天消息),但对他们和MPmap保持不可见。
  • “mpdummy”阻止在FGTracker上跟踪飞行员。 不推荐 - 如果多个用户使用此呼号,服务器将忽略一些用户。 改为连接到未跟踪的服务器。

安装配置FGMS服务器

下载FGMS服务器源码

1
git clone git://git.code.sf.net/p/fgms/src fgms-src

安装配置FGMS服务器源码

1
2
3
4
5
6
7
8
9
cd fgms-src
mkdir build
cd build
cmake ..
make
cd ..
cp contrib/etc/fgms_production.skel.conf build/fgms.cfg
cd build
./fgms

安装配置FGMS跟踪服务器源码

下载FGMS跟踪服务器源码

1
git clone git://git.code.sf.net/p/fgms/fgtracker fgms-fgtracker

FlightGear联网飞行配置

联机前,请选择合适的服务器名(通常是mpserver0?.flightgear.org)和端口号(通常是5000),然后按照以下方式启动FlightGear。

使用向导程序

在向导程序上专门有一个联网飞行选项,只要选中选项,填入服务器名和端口号以及你的昵称就可以了,你的昵称最长可以使7个字符。同时必须确定AI models选项选中,否则无法看到别的联网飞机。

使用命令行方式

基本命令如下:

1
2
3
4
--multiplay=out,10,<server>,<portnumber>
--multiplay=in,10,<client>,<portnumber>
--callsign=<anything>
--enable-ai-models

备注:

  1. 为端口号,比如5000.
  2. 为服务器名,比如mpserver01.flightgear.org.
  3. 是你的计算机名,或者是你的联网的IP地址,比如本地IP地址192.168.0.1
  4. 是你自己的昵称, 最多7个字符比如NFGFS.
    当程序开始运行后,你可以在服务器地图上看到自己,如果看不到,检查一下程序是否有报错信息,按照下面将要介绍的内容检查错误。

参考链接

  1. Howto:Multiplayer,by flightgear home.
  2. FlightGear Multiplayer Server,by flightgear home.

Linux平台编译安装测试JSBSim

发表于 2019-03-20 | 更新于 2019-11-16

JSBSim是一个开源跨平台的飞行动力学模型(FDM)软件库,用于模拟航空航天飞行器的飞行动力学。 该库已被纳入飞行模拟软件包FlightGear和OpenEaagles。 它也可以从一个小型独立程序调用,以创建批处理模拟工具。 JSBSim是用C ++编写的,使用XML配置文件。下面介绍如何在Linux平台编译按照测试JSBSim。

基础知识

cmake

代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。

Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。

Make工具有很多,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  1. 编写 CMake 配置文件 CMakeLists.txt 。
  2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目录。
  3. 使用 make 命令进行编译。

编译JSBSim

下载JSBSim源代码

1
git clone https://github.com/JSBSim-Team/jsbsim.git

编译JSBSim

1
2
3
4
5
6
7
8
9
10
11
12
# 跳转到jsbsim源码目录
cd jsbsim
# 创建build文件夹用于编译jsbsim
mkdir build
cd build
# 生成Makefile文件
cmake ..
# 编译
make
# 编译完成后跳转到jsbsim所在目录测试
cd src
./jsbsim

测试jsbsim

1
2
3
4
# 跳转到jsbsim源码目录
cd jsbsim
# 测试jsbsim
./build/src/JSBSim scripts/c1723.xml

参考链接

  1. JSBSim, by wikipedia.
  2. Make 命令教程,by 阮一峰
  3. CMake 入门实战,by hahack.
  4. JSBSim使用教程, by 32768.
  5. cmake 添加头文件目录,链接动态、静态库,by 王彬彬.
  6. cmake:install制作简单的安装脚本,by 10km.

FlightGear飞行模拟器中创建新飞机的方法

发表于 2019-03-17 | 更新于 2021-02-08

FlightGear中创建新飞机粗略地分成四步:创建飞机的3D模型,创建飞机的飞行动力学模型,创建飞机操作动画,实现飞机各子系统。具体而言,又可分成两个主要的开发领域:飞行动力学模型开发和飞机3D模型开发。

飞机3D模型开发

主要包括飞机外形、驾驶舱的3D模型开发,为飞行动力学模型设计的动画,声音等。

加载飞机模型

通过OpenSceneGraph,FlightGear支持许多不同的3D文件格式,包括VRML1,AC3D,DXF等等。 但是,.ac是大多数FG模型中使用的标准。

主FlightGear属性树中的属性/ sim / model / path控制将加载的模型; 它需要一个字符串值,从$ FG ROOT给出模型的相对路径。

加载新模型的最简单方法是使用–prop:命令行选项在启动时设置属性; 例如,要使用已安装在$ FG_ROOT / Models / my-cessna.ac中的3D飞机模型,您可以像这样调用FlightGear(在类Unix系统下):

1
fgfs --prop:/sim/model/path=Models/my-cessna.ac

(注意:通常模型使用的所有纹理必须出现在同一目录中。如果my-cessna.ac使用纹理cessna01.rgb和cessna02.rgb,你还应该在$ FG_ROOT / Models /中安装这些纹理。

如果要将3D模型永久设置为飞机的默认值而不是在命令行上指定,则需要编辑飞机设置文件。 在$ FG_ROOT / Aircraft /目录中有一系列以-set.xml结尾的文件,例如c172-set.xml,dc3-yasim-set.xml和beech99-uiuc-set.xml。 当您使用–aircraft选项启动FlightGear时,它会从其中一个文件中读取属性; 例如

1
fgfs --aircraft=dc3-yasim

将$ FG_ROOT / Aircraft / dc3-yasim-set.xml中的属性加载到主FlightGear属性树中。 这些文件与$ FG_ROOT / preferences.xml和FlightGear保存文件具有相同的XML属性列表格式。 对于任何单机类型,可能有许多具有不同启动条件,声音,面板,3D模型等的XML文件,因此您最好复制现有的,重命名它,然后更改模型内部路径元素内的值SIM卡:

1
2
3
4
5
6
7
8
<PropertyList>
<sim>
<model>
<path>Models/my-cessna.ac</path>
<texture-path>./Textures</texture-path>
</model>
</sim>
</PropertyList>

飞机动力学模型开发

FlightGear主要使用JSBSim 和 YASim两个开源的飞行动力学模型,也有极少数使用UIUC飞行动力学模型。

YASim

FDM是控制模拟器内飞行物理的数学模型。 物理3D飞机模型与飞行动力学无关 - 实质上它只是一张要看的图片。 这是FDM决定模型如何飞行。

为何选择YASim? YASim使用飞机的几何形状来生成基本飞行特征。 虽然这表明了一种“现实的”或开箱即用的方法,但在获得接近现实主义的结果之前,这只是一种粗略的近似,需要进行大量的调整。 如果您的飞机有稳定的飞行数据,例如风洞数据,或者您希望最终生成超逼真的模拟,那么JSBSim可能是更好的方法。 如果你缺乏这样的数据但是知道飞机的几何形状并且能够获得与真实飞行员相同的飞行特性和限制,那么YASim可以提供足以满足大多数模拟需求的解决方案。

JSBSim

JSBSim是一个开源飞行动力学模型(FDM)软件库,用于模拟航空航天飞行器的飞行动力学。 该库已被纳入飞行模拟软件包FlightGear和OpenEaagles。 它也可以从一个小型独立程序调用,以创建批处理模拟工具。 JSBSim自1996年以来一直在开发和使用,并且已经构建在当今使用的所有最流行的平台上,包括运行Linux,Macintosh和Microsoft Windows操作系统的平台。 JSBSim是用C ++编写的,使用XML配置文件。

飞机模型开发规范说明

规则和指导

  • FlightGear中的所有图像的大小应为2的幂(例如64 * 64,128 * 256或16 * 1024)。大多数计算机无法处理大于4096像素的纹理。从FlightGear 1.9开始,图像不再需要以.rgb格式保存。现在.png是FlightGear开发人员中最常用的.png。

  • 请注意,我们在代码中使用空格,一些开发人员使用相应的选项卡,以使我们的代码易于(呃)阅读。每一行开始一个新标签,我们按空格键一次,这样你就可以得到一种楼梯。只要您在所有文件中始终如一地使用它,使用何种方法并不重要。但是JSBSim FDM使用的XML文件必须使用空格而不是制表符。

  • 在大多数操作系统上,文件名和目录区分大小写。 Windows不区分大小写,因此当您在Windows计算机上进行开发时,您不会发现任何问题。在其他操作系统上,“波音”和“波音”之间存在差异。由于FlightGear用于多个平台,请确保您的代码正确使用大写字母!

目录结构说明

创建一个新的飞机模型,应该在$FG_ROOT/Aircraft/路径下创建文件夹,以飞机名称命名。例如在$FG_ROOT/Aircraft/路径下创建一个Su30的文件夹,开始构建Su30飞机模型。在飞机根目录下,其目录结构如下:

  • -set.xml file

描述飞机依赖关系的最重要文件是aircraft-set.xml文件。

  • .xml file (FDM)

该文件包含飞机的整个(或部分)飞行动力学模型。有YASim、JSBSim、UIUC三种不同的飞行动力学模型,他们都有自己的优缺点。

由于数据有限,YASim通常被认为是最好的方式。 当您访问真实的风洞数据和/或需要更多灵活性时,JSBSim可能是更好的选择。

  • Engines/ directory

仅适用于JSBSim飞机。 在此目录中,存储引擎和推进器/螺旋桨文件。

  • Models/ directory

该目录包含所有与模型相关的文件; 例如纹理,模型和动画文件(.xml)。 在-set.xml文件中,我们将路径设置为一个.xml文件。 该文件应链接(间接)到飞机所需的每个其他模型文件(包括可能的3D驾驶舱)。 整个飞机可以建模为一个文件,但大多数开发人员更喜欢拆分。 例如,驾驶舱可以由几个文件构建,每个文件只存在一个仪器或面板。 这样很容易(重新)移动飞机的某些部件。 您可以像这样设置模型文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<PropertyList>

<path>Aircraft.ac</path>

<model>
<name>Cockpit</name>
<path>Aircraft/.../Models/cockpit.xml</path>
<offsets>
<x-m> -5.25</x-m>
<y-m> 0.00</y-m>
<z-m> 1.30</z-m>
</offsets>
</model>

<animation>
<type>rotate</type>
<object-name>AileronLeft</object-name>
<property>/controls/flight/aileron</property>
<factor>-65</factor>
<center>
<x-m> 2.09</x-m>
<y-m>-5.50</y-m>
<z-m>-1.50</z-m>
</center>
<axis>
<x>1</x>
<y>0</y>
<z>0</z>
</axis>
</animation>

</PropertyList>

cockpit.xml文件可以包含相似结构,所有工具都是单独的模型。 模型的数量不受限制,动画的数量也不限。

  • Nasal/ directory

所有针对飞机的Nasal脚本都放在此目录中,但某些系统或仪器特定的Nasal脚本除外。 如果某个Nasal脚本对所有飞机都有用(例如天气或多人相关),它可以放在$ FG_ROOT / Nasal目录中。 可以在$ FG_ROOT / Aircraft / Generic目录中找到可在多架飞机上使用的Nasal脚本(例如空中加油)。

  • Sounds/ directory

声音对于增加你实际进入模拟的感觉非常重要。 在此目录中,存储了特定于飞行器的所有声音文件。 可以在多个飞机上使用的声音(例如,点击开关或雷声)可在$ FG_ROOT / Sounds目录中找到。

  • Tutorials/ directory

FlightGears教程系统是学习如何启动飞机引擎等的有用功能。 它允许您创建一个分步教程,指导用户完成某个过程。 它甚至可以指示应按下哪些开关!

参考链接

  1. Howto:Make an aircraft,by flightgear home.
  2. Howto:3D Aircraft Models,by flightgear home.
  3. Howto:Animate models,by flightgear home.
  4. YASim,by flightgear home.
  5. JSBSim,by flightgear home.
  6. Welcome to the aircraft developer portal!,by flightgear.
  7. Howto:Creating 3D instruments,by flightgear.

FlightGear安装飞机和场景的方法

发表于 2019-03-13

FlightGear可安装额外的飞行器和地景。

安装地景

FlightGear的详细地景可以覆盖整个世界。默认的FlightGear安装包只包括旧金山周边一小块区域,因此想要飞到其他地方,得下载额外的地景。

每一块地景被打包成一个压缩包,每经纬度10度为一块。每一个压缩包以10×10经纬度命名,如w130n50.tgz。

下载FlightGear地景参考链接1。下载后的地景复制到$FG_ROOT/Scenery或者$FG_SCENERY下。

使用如下命令解压地景,将在$FG_ROOT/Scenery产生Objects和Terrain两个文件夹,分别为卫星地图和地形数据。

1
2
3
cd $FG_ROOT/Scenery
tar -xvf e110n30.tgz
rm e110n30.tgz

安装飞行器

默认的FlightGear安装包只有少数几个飞行器,可以从参考链接2中获得大量的飞行器。

下载的飞行器复制到$FG_ROOT/Aircraft文件夹下。

参考链接

  1. 下载FlightGear地景, by flightgear.
  2. 下载FlightGear飞行器, by flightgear.

Python爬虫获取网页链接

发表于 2019-03-13

最近研究开源飞行模拟器,想将其世界地景全部下载下来。一个个手动下载太麻烦,于是想先用python的requests和Beautiful Soup组件获取地景链接,再以每行一个地景链接写入文本文档,最后使用axel多线程自动下载每一个地景包。

基础知识

requests组件

Requests是一个Python HTTP库,在Apache 2许可证下发布。该项目的目标是使HTTP请求更简单,更人性化。

下面是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text # doctest: +ELLIPSIS
u'{"type":"User"...'
>>> r.json() # doctest: +ELLIPSIS
{u'private_gists': 419, u'total_private_repos': 77, ...}

Beautiful Soup组件

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml。

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment。

  • Tag 对象与XML或HTML原生文档中的tag相同,有最重要的属性: name和attributes。
  • BeautifulSoup 对象表示的是一个文档的全部内容,但并不是真正的HTML或XML的tag,所以它没有name和attribute属性。
  • Beautiful Soup用 NavigableString 类来包装tag中的字符串。
  • Comment 对象是一个特殊类型的 NavigableString 对象:

下面是BeautifulSoup的一个简单示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)

print(soup.prettify())
# <html>
# <head>
# <title>
# The Dormouse's story
# </title>
# </head>
# <body>
# <p class="title">
# <b>
# The Dormouse's story
# </b>
# </p>
# <p class="story">
# Once upon a time there were three little sisters; and their names were
# <a class="sister" href="http://example.com/elsie" id="link1">
# Elsie
# </a>
# ,
# <a class="sister" href="http://example.com/lacie" id="link2">
# Lacie
# </a>
# and
# <a class="sister" href="http://example.com/tillie" id="link2">
# Tillie
# </a>
# ; and they lived at the bottom of a well.
# </p>
# <p class="story">
# ...
# </p>
# </body>
# </html>

axel工具

axel是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。

axel语法:

1
axel [options] url1 [url2] [url...]

axel选项:

1
2
3
4
5
6
7
8
9
10
11
12
--max-speed=x , -s x         最高速度x
--num-connections=x , -n x 连接数x
--output=f , -o f 下载为本地文件f
--search[=x] , -S [x] 搜索镜像
--header=x , -H x 添加头文件字符串x(指定 HTTP header)
--user-agent=x , -U x 设置用户代理(指定 HTTP user agent)
--no-proxy , -N 不使用代理服务器
--quiet , -q 静默模式
--verbose ,-v 更多状态信息
--alternate , -a Alternate progress indicator
--help ,-h 帮助
--version ,-V 版本信息

代码实现

获取地景链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import requests
from bs4 import BeautifulSoup

# 下载指定URI链接
def getUriContent(uri):
try:
fgWorldScenery = requests.get(link, timeout=10)
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
else:
print("Http Request Success!")
return fgWorldScenery.text

# 获取所有地景链接,存入列表
def getTargetLinks(html):
soup = BeautifulSoup(html)
list=[]
#print(soup.prettify())
for child in soup.find_all('area'):
list.append(child['href'])
print("Get Target Links Success!")
return list

# 将地景链接逐行写入文件
def writeToFile(linkList):
file = open('./sceneLink.txt','w')
for link in linkList:
file.write(link)
file.write('\t\n')
print("Write Target Link To File Success!")
file.close()

if __name__ == "__main__":
link = "http://www.flightgear.org/legacy-Downloads/scenery-v2.12.html"
html=getUriContent(link)
linkList=getTargetLinks(html)
writeToFile(linkList)

下载世界地景

1
2
3
4
for line in $(cat sceneLink.txt)
do
axel -n 10 $line
done

参考链接

  1. requests快速上手,by requests.
  2. Python 基础教程, by runoob.
  3. Python之父教你写main()函数,by 编程派.
  4. Beautiful Soup 4.2.0 文档,by BeautifulSoup.
  5. FlightGear安装飞机和场景的方法,by jack huang.
  6. axel命令,by Linux命令大全.
上一页1…434445…54下一页

Jack Huang

535 日志
69 标签
© 2026 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse