Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

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命令大全.

Git_Clone大项目超过1G失败解决方案

发表于 2019-03-09

SourceForge.net,又称SF.net,是开源软件的开发者进行开发管理的集中式场所,也是全球最大开源软件开发平台和仓库。FlightGear的源代码就托管在该平台。最近在使用Git克隆FlightGear的子项目fgdata时,老是到1G时失败。具体情况如下:

1
2
3
4
5
6
7
8
9
# git clone fgdata大项目时超过1G就会出错
$ git clone https://git.code.sf.net/p/flightgear/fgdata
Cloning into 'fgdata'...
remote: Counting objects: 61455, done.
remote: Compressing objects: 100% (27321/27321), done.
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

经多种方案尝试,使用如下方法可避免该问题:

1
$ git clone git://git.code.sf.net/p/flightgear/fgdata

参考链接

  1. FGdata downloading error,by flightgear forum.
  2. SourceForge Support,by sourceforge.
  3. git clone 太慢怎么办?, by aneasystone.

Flightgear在Linux/Debian中的下载编译安装教程

发表于 2019-03-08 | 更新于 2021-01-26

编译安装

使用如下脚本在Linux/Debian操作系统下从源代码构建开源飞行模拟器FlightGear.

1
2
3
4
5
6
7
8
9
cd  <your working directory for building FlightGear>
wget -O download_and_compile.sh http://sourceforge.net/p/flightgear/fgmeta/ci/next/tree/download_and_compile.sh?format=raw
chmod +x download_and_compile.sh
mkdir -p stable
mkdir -p next
cd stable
../download_and_compile.sh -s
cd ../next
../download_and_compile.sh -p n

需要注意的是,该脚本git clone fgdata时超过1G时就会报错退出,解决方案见链接4。

此外,如果之前安装过FlightGear的旧版本,编译过程也有可能报错,清理之前旧版本之后即可解决问题。

启动模拟器

启动FlightGear命令如下:

1
2
3
cd <your working directory for building FlightGear>
cd stable
./run_fgfs.sh

fgfs常用选项

fgfs为flightgear的飞行模拟器主程序,在命令行中输入fgfs –launcher即可打开启动器,选择飞机、位置等配置,然后开始模拟飞行。下面介绍fgfs的一些常用选项。

  • –launcher

    打开启动器。

  • –fg-root=path

    告诉flightgear到path下寻找数据文件,如飞机、地景等。

  • –fg-scenery=path

    告诉flightgear到path下寻找地景文件。

  • –fg-aircraft=path

    告诉flightgear到path下寻找飞机文件。

  • –language=code

    指定会话语音, 例如 pl, nl, it, fr, en, de。

  • –aircraft= 飞行器

    载入特定飞行器。

  • –show-aircraft

    打印可用的飞行器列表。

参考链接

  1. Howto:Get Local Copies of Flightgear Source Code,by flightgear wiki.
  2. Scripted Compilation on Linux Debian/Ubuntu, by flightgear wiki.
  3. Building FlightGear,by flightgear wiki.
  4. Git_Clone大项目超过1G失败解决方案,by jack huang.
  5. Building using CMake - Windows,by flightgear.
  6. Visual Studio之RelWithDebInfo模式,“被忽视”的编译模式,by inter_peng.

博弈论简介

发表于 2019-02-26 | 更新于 2021-08-13

博弈论(英语:game theory),又译为对策论,经济学的一个分支,1944年冯·诺伊曼与奥斯卡·摩根斯特恩合著《博弈论与经济行为》,标志着现代系统博弈理论的的初步形成,因此他被称为“博弈论之父”。博弈论被认为是20世纪经济学最伟大的成果之一。目前在生物学、经济学、国际关系、计算机科学、政治学、军事战略和其他很多学科都有广泛的应用。

概述

博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。表面上不同的相互作用可能表现出相似的激励结构(incentive structure),所以它们是同一个游戏的特例。其中一个有名有趣的应用例子是囚徒困境。

具有竞争或对抗性质的行为称为博弈行为。在这类行为中,参加斗争或竞争的各方各自具有不同的目标或利益。为了达到各自的目标和利益,各方必须考虑对手的各种可能的行动方案,并力图选取对自己最为有利或最为合理的方案。比如日常生活中的下棋,打牌等。博弈论就是研究博弈行为中斗争各方是否存在着最合理的行为方案,以及如何找到这个合理的行为方案的数学理论和方法。

分类

博弈论知识结构

图1 博弈论知识结构

动态博弈

动态博弈是指参与人的行动有先后顺序,而且行动在后者可以观察到行动在先者的选择,并据此作出相应的选择。

静态博弈

静态博弈是指博弈中参与者同时采取行动,或者尽管参与者行动的采取有先后顺序,但后行动的人不知道先采取行动的人采取的是什么行动。

完全信息静态博弈

纳什均衡

纳什均衡,又称为非合作博弈均衡,是博弈论的一个重要术语,以约翰·纳什命名。在一个博弈过程中,无论对方的策略选择如何,当事人一方都会选择某个确定的策略,则该策略被称作支配性策略。如果两个博弈的当事人的策略组合分别构成各自的支配性策略,那么这个组合就被定义为纳什均衡。

术语

  • 局中人(players):在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为 “多人博弈”。

  • 策略(strategies):一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的自始至终全局筹划的一个行动方案,称为这个局中人的一个策略。如果在一个博弈中局中人都总共有有限个策略,则称为“有限博弈”,否则称为“无限博弈”。

  • 得失(payoffs):一局博弈结局时的结果称为得失。每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付(payoff)函数。

  • 次序(orders):各博弈方的决策有先后之分,且一个博弈方要作不止一次的决策选择,就出现了次序问题;其他要素相同次序不同,博弈就不同。

  • 博弈涉及到均衡:均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。所谓纳什均衡,它是一稳定的博弈结果。

参考链接

  1. 博弈论,by wikipedia.
  2. 博弈论, by 智库百科.
  3. 漫画:什么是 “智猪博弈” ?,by 小灰.
  4. Matlab_对策论、微分稳定方程,by Lanyun.
  5. Minimax算法及实例分析,by witnessai1.
  6. 庞特里亚金最大化原理,by wikipedia.
  7. AI的博弈论,一份插图教程,by 磐创AI.

Linux代理工具简介

发表于 2019-02-23 | 更新于 2022-05-20

下面介绍两个Linux代理工具shadowsock和proxychains。

shadowsock

Shadowsocks可以指一种基于Socks5代理方式的加密传输协议,也可以指实现这个协议的各种开发包。当前包使用Python、C、C++、C#、Go语言等编程语言开发,大部分主要实现(iOS平台的除外)采用Apache许可证、GPL、MIT许可证等多种自由软件许可协议开放源代码。Shadowsocks分为服务器端和客户端,在使用之前,需要先将服务器端部署到服务器上面,然后通过客户端连接并创建本地代理。

1
2
3
4
# 安装方法
sudo apt-get install shadowsocks
# 使用方法
nohup /usr/bin/sslocal -c /etc/shadowsocks/server.json

proxychains

ProxyChains是一个开源代理工具,能够强制使任何应用的TCP连接使用SOCKS4,SOCKS或者HTTP(S)代理进行连接。

1
2
3
4
5
6
7
8
# 安装配置
sudo apt install proxychains
sudo gedit /etc/proxychains.conf
socks5 127.0.0.1 1080
# 使用方法
proxychains firefoxt
proxychains aria2c
proxychains wget

参考链接

  1. Shadowsocks,by wikipedia.
  2. SOCKS,by wikipedia.
  3. 将 Tor socks 转换成 http 代理,by linux 中国.
  4. Linux 科学上网,by fanzhongwei.
  5. Debian系列——Ubuntu18.04为例,by github.

分布式系统的CAP理论简介

发表于 2019-02-17

分布式系统定义

分布式系统是其组件分布正在连网的计算机上,组件之间通过传递消息进行通信和动作协调的系统[1]。通过该定义可知,分布式系统具有以下重要特征:组件的并发性、缺乏全局时钟、组件故障的独立性。

CAP理论

CAP理论:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition Tolerance)

一致性(Consistency)

在分布式系统中,是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的结果达成一致。更详细的解释就是,当其中某个服务器收到客户端的一组指令时,它必须与其它服务器交流以保证所有的服务器都是以同样的顺序收到同样的指令,这样的话所有的服务器会产生一致的结果,看起来就像是一台机器一样。

分布式系统的一致性算法分为:

  • 弱一致性(最终一致性),例如DNS域名解析。
  • 强一致性,例如主从同步、多数派(读/写)、Paxos、Raft(multi Paxos)、ZAB(multi Paxos)。

可用性(Availability)

对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。所以,一般我们在衡量一个系统的可用性的时候,都是通过停机时间来计算的。

通常我们描述一个系统的可用性时,我们说淘宝的系统可用性可以达到5个9,意思就是说他的可用水平是99.999%,即全年停机时间不超过 $(1-0.99999)36524*60 = 5.256 min$ ,这是一个极高的要求。

分区容错性(Partition Tolerance)

分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

好的分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,或者是机器之间有网络异常,将分布式系统分隔未独立的几个部分,各个部分还能维持分布式系统的运作,这样就具有好的分区容错性。

简单点说,就是在网络中断,消息丢失的情况下,系统如果还能正常工作,就是有比较好的分区容错性。

参考连接

  1. George Coulouris, Jean Dollimore, Tim Kindberg,Gordon Blair,金蓓弘,马应龙,等译. 分布式系统概念与设计[M].2013.
  2. Zookeeper之分布式系统的一致性算法, by 养兔子的大叔.
  3. 分布式计算,by wikipedia.
  4. 分布式系统的CAP理论,by HollisChuang.

最优化算法之动态规划入门

发表于 2019-02-10

动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划中包含三个重要子概念:

  • 最优子结构
  • 边界
  • 状态转移公式

对有重叠子问题和最优子结构性质的问题,在建模之后,即获得其状态转移公式和边界之后,可采用下列算法求解:

  • 递归求解
  • 备忘录算法
  • 动态规划求解

参考链接

  1. 动态规划,by wikipedia.
  2. 漫画:什么是动态规划?,by 程序员小灰.

PID控制算法原理分析

发表于 2019-02-09

最近研究深度强化学习算法,进而对控制理论感兴趣,发现了PID这个广泛使用的控制算法。大概了解记录一下。PID控制器(比例-积分-微分控制器),由比例单元(P)、积分单元(I)和微分单元(D)组成。透过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本上线性,且动态特性不随时间变化的系统。

PID控制器的方块图

图1 PID控制器的方块图

PID是以它的三种纠正算法而命名。受控变数是三种算法(比例、积分、微分)相加后的结果,即为其输出,其输入为误差值(设定值减去测量值后的结果)或是由误差值衍生的信号。若定义 $u(t)$为控制输出,PID算法可以用下式表示:

$$ {u}(t)= {MV}(t)=K_{p}e(t)+K_i\int _{0}^{t}{e(\tau )}{d\tau }+K_d{\frac{d}{dt}}e(t)$$

其中:

$K_{p}$:比例增益,是调适参数

$K_{i}$:积分增益,也是调适参数

$K_{d}$:微分增益,也是调适参数

$e$:误差=设定值(SP)- 回授值(PV)

$t$:目前时间

$\tau$ :积分变数,数值从0到目前时间 $t$

参考链接

  1. PID控制器,by wikipedia.
  2. PID控制算法原理(抛弃公式,从本质上真正理解PID控制),by 确定有穷自动机.
上一页1…434445…53下一页

Jack Huang

528 日志
68 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse