Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Debian安装配置使用TFTP

发表于 2018-12-30 | 更新于 2019-03-17

简单文件传输协议也称小型文件传输协议(Trivial File Transfer Protocol, TFTP),是一种简化的文件传输协议(FTP),通过少量存储器就能轻松实现。

TFTP技术信息

小型文件传输协议的一些详细资料:

  • 使用UDP(端口69)作为其传输协议(不像FTP使用TCP端口21)。
  • 不能列出目录内容。
  • 无验证或加密机制。
  • 被用于在远程服务器上读取或写入文件。
  • 支持三种不同的传输模式:”netascii”,”octet”和”mail”,前两种匹配FTP协议中的”ASCII”和”image(binary)”模式;第三种从来很少使用,当前已经废弃。

TFTP安装

安装TFTP的客户端和服务器端:

1
sudo apt-get install atftp atftpd

TFTP配置

  1. 创建TFTP服务器目录
1
2
3
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
sudo chmod 777 /tftpboot/*
  1. 编辑TFTP配置文件
1
2
3
4
5
sudo gedit /etc/default/atftpd

# 修改内容如下,主要是修改目录
USE_INETD=false
OPTIONS="--daemon --port 69 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot"
  1. 重启TFTP守护程序
1
sudo /etc/init.d/atftpd restart

TFTP测试

1
2
3
4
5
6
7
8
9
~$ sudo tftp 192.168.43.116
tftp> status
Connected to 192.168.43.116.
Mode: netascii Verbose: off Tracing: off
Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
tftp> get iproad.txt
Received 959 bytes in 0.0 seconds
tftp> put upload.txt
Sent 13 bytes in 0.0 seconds

参考链接

  1. TFTP,by wikipedia.
  2. Using TFTP to Install Malicious Software on the Target,by kail forum.

Cesium中3D模型的驱动方法

发表于 2018-12-26 | 更新于 2023-07-16

Cesium中3D模型的运动可以使用CZML直接驱动,但使用该方法前提是能事先计算出3D模型的运动轨迹,具有很大的局限性。那么如何实时驱动3D模型呢?

Cesium渲染过程分析

Cesium渲染过程的分析可以参考链接1。Cesium的渲染始于虚拟地球组件CesiumWidget的startRenderLoop方法,在该方法中将调用requestAnimationFrame函数开始渲染。

虚拟地球组件CesiumWidget包含Scene组件,在其render方法随后调用Scene的render方法。在场景组件Scene的render方法中提供了preUpdate、postUpdate、preRender、postRender四个事件对象,这四个事件对象将是我们实时驱动3D模型的关键。

preUpdate事件

在Cesium更新渲染周期开始之前以目标帧率触发preUpdate事件。

1
2
3
4
5
6
scene.postUpdate.addEventListener(function() {
// This code will run at 60 FPS
if (changeToPromptRender) {
scene.requestRender();
}
});

postUpdate事件

在场景更新之后,新帧渲染之前以目标帧率触发postUpdate事件。

preRender事件

在场景更新之后,新帧渲染之前触发preRender事件。

1
2
3
4
scene.preRender.addEventListener(function() {
// This code will run when a new frame is rendered
// including when changeToPromptRender is true
});

postRender事件

在新帧渲染之后触发postRender事件。

实时驱动3D模型

从上一节对Cesium渲染过程分析可知,要实时驱动3D模型,应订阅场景Scene的preUpdate事件,在preUpdate事件的处理函数中改变3D模型的位置和姿态。

订阅preUpdate事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//订阅场景的preUpdate事件
viewer.scene.preUpdate.addEventListener(function(scene, time) {
speedVector = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.UNIT_X, speed / 10, speedVector);
position = Cesium.Matrix4.multiplyByPoint(planePrimitive.modelMatrix, speedVector, position);
pathPosition.addSample(Cesium.JulianDate.now(), position);
Cesium.Transforms.headingPitchRollToFixedFrame(position, hpRoll, Cesium.Ellipsoid.WGS84, fixedFrameTransform, planePrimitive.modelMatrix);

if (fromBehind.checked) {
// Zoom to model
Cesium.Matrix4.multiplyByPoint(planePrimitive.modelMatrix, planePrimitive.boundingSphere.center, center);
hpRange.heading = hpRoll.heading;
hpRange.pitch = hpRoll.pitch;
camera.lookAt(center, hpRange);
}
});

获取czml实体的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
viewer.scene.preUpdate.addEventListener(function(scene, time) {
//target是czml实体对象
//获取time时刻target的位置参数
target.position.getValue(time,position)
console.log(position)

target.orientation.getValue(time,orientation)
console.log(orientation)
});

viewer.scene.preUpdate.addEventListener(function(scene, time) {
var pos=target.position.getValue(time)
console.log(pos.toString())
//世界坐标转经纬高
var cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pos);
console.log(cartographicPosition.toString())
});

使用Entity API加载3D模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var viewer = new Cesium.Viewer('cesiumContainer');
var center=Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706,100);
var hpr=Cesium.HeadingPitchRoll.fromDegrees(90,-90,0);
//从headingPitchRoll转四元数
var quatern=Cesium.Transforms.headingPitchRollQuaternion(center,hpr);

var entity = viewer.entities.add({
position :center ,
orientation:quatern ,
model : {
uri : '../../../../Apps/SampleData/models/missile.glb',
scale: 0.1,
minimumPixelSize:50,
maximumScale:5000
}
});
viewer.trackedEntity = entity;

使用Primitive API加载3d模型

1
2
3
4
5
6
7
8
9
10
11
12
var viewer = new Cesium.Viewer('cesiumContainer');

var center1=Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706,100);
var hpr1=Cesium.HeadingPitchRoll.fromDegrees(90,-90,100);
//计算模式矩阵,实现本地坐标系坐标到世界坐标系坐标的转换
var modelMatrix=Cesium.Transforms.headingPitchRollToFixedFrame(center1, hpr1)

var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({
url : '../../../../Apps/SampleData/models/missile.glb',
modelMatrix : modelMatrix,
scale : 1.0
}));

参考链接

  1. Cesium摄像头跟踪飞机实体时晃动问题分析,by jack huang.
  2. Improving Performance with Explicit Rendering, by Gabby Getz.
  3. Cesium 源码打包入门 [ver1.72] ,by mob604756f3c518.

Web安全攻防技术探讨

发表于 2018-12-22 | 更新于 2021-04-02

网络安全(英语:network security)包含网络设备安全、网络信息安全、网络软件安全。在此重点探讨网络软件安全中的Web安全。当前Web安全面临的压力越来越大,一方面是Web应用一统江湖,君临天下,另一方面针对Web应用的攻击越来越多,攻击方法越来越成熟。下面重点介绍常见的Web攻击方法。

XSS

XSS (Cross Site Script,跨站脚本攻击)的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。

非持久型 XSS

持久型 XSS

CSRF

CSRF(Cross-Site Request Forgery,跨站请求伪造攻击)可以盗用你的登陆信息,以你的身份模拟发送各种请求。

SQL 注入

SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

命令行注入

命令行注入漏洞,指的是攻击者能够通过 HTTP 请求直接侵入主机,执行攻击者预设的 shell 命令。

DDoS 攻击

DDoS 又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用。

网络层 DDoS

应用层 DDoS

流量劫持

流量劫持是黑产行业的一大经济支柱。

DNS 劫持

HTTP 劫持

参考链接

  1. Advanced web security topics,by George.
  2. 网络安全,by wikipedia.
  3. 常见 Web 安全攻防总结,by zoumiaojiang.
  4. RSA 的原理与实现,by cjting.
  5. 暗网取证研究,by 苏再添.

科学研究中阅读论文的方法

发表于 2018-12-20 | 更新于 2020-02-28

在科学研究的过程中,选题十分重要。因此在初步确定好选题方向后,应对该选题方向进行调研。调研的主要工作就是寻找该方向的论文,进行阅读、分析、总结,了解该方向的过去和现在,并预测未来可能的发展方向。对于刚上研究生的同学,该采用什么样的方法来整理选题方向上的论文,使之符合逻辑,并且条理清晰呢?偶尔拜读了Flood Sung写的文章”深度学习论文阅读路线图“,觉得深受启发,将其所提出的深度学习论文阅读路线图构建原则记录备忘一下。

路线图的构建原则

有以下四个原则:

  • 从整体到局部。即从Survey的文章,影响大局的文章到具体子问题子领域的文章。
  • 从过去到最前沿。即每个topic的文章是按照时间顺序排列的,这样大家就可以清楚的看到这个方向的研究发展脉络。
  • 从通用到应用。即有些深度学习的文章是面向深度学习通用理论,比如Resnet,可以用在任意的神经网络中,而有些文章则是具体应用,比如Image Caption。
  • 面向最前沿。收集的文章会有很多是最新的,甚至就是几天前出来的,这样能保证路线图是最新的。

每一种topic只选择最有代表性的几篇文章,比如深度增强学习(Deep Reinforcement Learning),这个领域现在有几十篇文章,但只选择几篇,要深入了解甚至做为自己的研究方向,还需要进一步的阅读该领域的文章。

参考链接

  1. 深度学习论文阅读路线图 Deep Learning Papers Reading Roadmap,by Flood Sung.
  2. Deep Learning Papers Reading Roadmap,by Flood Sung.
  3. 【How to read a paper】如何读论文,by 乾龙_Heron.

系统仿真中一些问题的思考

发表于 2018-12-18

系统仿真(system simulation)就是根据系统分析的目的,在分析系统各要素性质及其相互关系的基础上,建立能描述系统结构或行为过程的、且具有一定逻辑关系或数量关系的仿真模型,据此进行试验或定量分析,以获得正确决策所需的各种信息。

系统仿真与仿真游戏的区别

系统仿真与仿真游戏本质上没有区别,都是计算机程序对现实的模拟,所不同的是各自对仿真保真度(Simulation Fidelity)的要求不同。

仿真保真度(Simulation Fidelity)用于描述仿真精度,模拟真实对应物有多近似:

  • 低保真:对系统的最小模拟,接受输入产生输出
  • 中等保真:对刺激能自动响应,有限精度
  • 高保真:接近不可辨识或者尽可能地接近真实系统

通常系统仿真对仿真保真度的要求比仿真游戏要高。

计算步长与采样周期

采用计算机进行数值模拟或系统仿真时,经常需要采用数值解法求解模型方程。系统模型一般采用微分方程描述(也有其它形式),采用数值方法求解,就是采用迭代法逐步逼近。

计算步长

积分与微分是互逆。对一个曲线(包括直线)方程求积分,其实就是求曲线与横轴围成的面积。该面积可以用一系列间隔很小的面积块相加得到。这些小间隔的宽度就是计算步长。显然,纯粹从精度的角度考虑,步长越小越精确,因为近似面积更接近实际图形面积。

采样周期

采样周期是对一个实际信号测量时,相邻两次测量之间的时间间隔。有时候,采样周期和计算步长相似,但采样周期要考虑实际限制,且是时间单位,而计算步长不一定是时间单位,且相对自由些。两者在数值上没必然联系。对于同一问题,且都是时间量纲的话,采样周期大于等于计算步长,前者是后者的整数倍。

系统仿真包含系统模型求解,也就是在每个采样周期内,要解出模型方程。控制系统仿真时在采样周期内要解出两个模型方程:控制器模型和系统模型。

一个采样周期内可对系统模型迭代求解一次或多次。

计算步长和采样周期大小的选择

关于采样周期和计算步长的选择,一般考虑以下因素:

  • 从求解精度考虑,越小越好。

  • 从计算量考虑,越大越好。

采样周期与每秒帧数(Frames Per Second,FPS)

采样周期以秒为单位,则

$$FPS=\frac{1}{采样周期}$$

FPS是指每秒画面重绘的次数,用于衡量画面切换速度。FPS越大,则动画效果越平滑,当FPS小于20时,一般就能明显感受到画面的卡滞现象。

当FPS足够大(比如达到60),再增加帧数人眼也不会感受到明显的变化,反而相应地就要消耗更多资源(比如电影的胶片就需要更长了,或是电脑刷新画面需要消耗计算资源等等)。因此,选择一个适中的FPS即可。

NTSC标准的电视FPS是30,PAL标准的电视FPS是25,电影的FPS标准为24。

WebGL动画

WebGL是一种JavaScript API,用于在不使用插件的情况下在任何兼容的网页浏览器中呈现交互式2D和3D图形。但要产生WebGL动画,需要对运动的场景不停的采样,即不停地拍照。JavaScript的采样函数主要有setInterval方法和requestAnimationFrame方法。

setInterval方法

如果要设置特定的FPS(虽然严格来说,即使使用这种方法,JavaScript也不能保证帧数精确性),可以使用JavaScript DOM定义的方法:

1
setInterval(fn,mesc)

其中,fn是每过msec毫秒执行的函数,如果将fn定义为重绘画面的函数,就能实现动画效果。setInterval函数返回一个变量timer,如果需要停止重绘,需要使用clearInterval方法,并传入该变量timer。

requestAnimationFrame方法

大多数时候,我们并不在意多久重绘一次,这时候就适合用requestAnimationFrame方法了。它告诉浏览器在合适的时候调用指定函数,通常可能达到60FPS。

  • requestAnimationFrame同样有对应的cancelAnimationFrame取消动画
  • 和setInterval不同的是,由于requestAnimationFrame只请求一帧画面,因此,除了在init函数中需要调用,在被其调用的函数中需要再次调用requestAnimationFrame

使用stat.js记录FPS

stat.js是Three.js的作者Mr.Doob的另一个有用的JavaScript库。很多情况下,我们希望知道实时的FPS信息,从而更好地监测动画效果。这时候,stat.js就能提供一个很好的帮助,它占据屏幕中的一小块位置(如左上角),显示实时的FPS信息。

在HTML中引用stat.js:

1
<script type="text/javascript" src="//mrdoob.github.io/stats.js/build/stats.min.js"></script>

再使用如下代码监视实时FPS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var stats = new Stats();
stats.showPanel( 1 ); // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild( stats.dom );

function animate() {

stats.begin();

// monitored code goes here

stats.end();

requestAnimationFrame( animate );

}

requestAnimationFrame( animate );

参考链接

  1. 计算步长和采样周期,by 王永林.
  2. 离散和连续模拟之间的实际区别是什么?,by UF Game.
  3. 系统仿真,by 百度百科.
  4. 开源的物理引擎,by M. Jones.
  5. 数值分析,by wikipedia.
  6. three.js 入门详解(二),by Levi.
  7. WebGL,by wikipedia.
  8. stats.js, by mydoob.
  9. 详解JavaScript中的Event Loop(事件循环)机制,by 暮雨清秋.

撰写学术论文的思考

发表于 2018-12-17 | 更新于 2019-01-17

迫于学业和工作的压力,撰写了不少的学术论文。但是并没有对如何撰写学术论文进行思考。看到清华大学的肖寒
博士在某个问题下的回答后,感觉茅塞顿开:

不过,一般注水的作者相对而言都是新手,因为比较有经验的研究者都知道:“论文的一切都在于贡献,不在于结果”

你的结果只是一个说明你贡献的例证,多那么点少那么点,大家看了毫无区别。你注水除了恶心我们这些后来实验的人,就没什么别的用处了。有那些疯狂调参和使劲弄技巧的时间,真不如拿来整理好你自己的思路,把论文的论述过程做到有理有据!因为 80.2 和 80.3 正常人都没法记住其间区别,但你循循善诱的精致论述会让所有人印象深刻。我希望新手不要本末倒置!

论文重在贡献,迫于学业和工作的压力造的注水论文实在无趣!

参考链接

  1. 看图说话的AI小朋友——图像标注趣谈(下), by 杜客.
  2. 从标题到写作流程:写好一篇论文的十条基本原则,by 机器之心.

node-gyp使用帮助

发表于 2018-12-16 | 更新于 2019-09-26

node-gyp是为了编译nodejs addon模块而构建的跨平台命令行工具。nodejs addon模块使用c++语言编写,在源代码级别进行分发,通过node-gyp实现跨平台的编译安装。

背景知识

node-gyp源于gyp。gyp是一个用来生成项目文件的工具,刚开始设计给chromium项目使用的。它可以从平台无关的配置生成平台相关的Visual Studio、Xcode、Makefile的项目文件,然后调用 vsbuild、xcode、gcc等编译平台来编译。这就不需要花额外的时间处理每个平台不同的项目配置以及项目之间的依赖关系。

nodejs addon模块采用源代码分发,安装需要根据不同平台采用合适的编译器编译安装,这就是node-gyp项目诞生的原由。

安装过程

安装node-gyp

在上线情况下,使用如下命令安装node-gyp:

1
$ npm install -g node-gyp

安装C++编译器

根据操作系统平台的不同,需安装对应的编译器,以方便node-gyp调用。以Windows平台为例,安装VC++编译器有两种方法:

  • 直接安装

    1
    2
    3
    // 以管理员身份打开cmd或powershell

    npm install --global --production windows-build-tools
  • 手动安装

    • 安装Visual C++构建环境: 使用Visual Studio Build Tools的Visual C++ build tools工作负载或者Visual Studio 2017 Community的Desktop development with C++工作负载。
    • 安装Python 2.7,不支持python3,然后运行npm config set python python2.7
    • 在cmd中运行npm config set msvs_version 2017

手动安装Visual C++构建环境的命令如下:

1
2
3
4
5
6
7
# 使用Visual Studio Build Tools的Visual C++ build tools工作负载,确保安装win10sdk,编译nodejs源码时需要

.\vs_buildtools__2041717674.1536666005.exe --layout d:\vc2017_offline --lang zh-CN --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended

# 使用Visual Studio 2017 Community的Desktop development with C++工作负载

.\vs_community__208176120.1522073957.exe --layout e:\vs2017_offline --lang zh-CN --add Microsoft.VisualStudio.Workload.CoreEditor --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended

node-gyp编译测试

以在Win10平台编译nodejs addon模块为例,在离线情况使用如下命令测试node-gyp是否工作正常:

1
2
3
node-gyp configure --nodedir=d:\node-v8.11.3

node-gyp build

参考链接

  1. node-gyp的作用是什么?,by zhihu.
  2. node-gyp, by nodejs
  3. Windows-Build-Tools, by felixrieseberg.
  4. Vistual Studio Community 2017 30天许可证过期,by 井底一蛤蟆.

树莓派使用lirc进行红外遥控测试

发表于 2018-12-15 | 更新于 2022-06-04

在树莓派上使用lirc进行红外遥控测试的步骤比较繁琐,记录一下以备忘。

背景知识

lirc库

LIRC (Linux Infrared remote control,Linux红外线遥控)是一个开放源代码的包。这个包可以让你的Linux系统能够接收及发送红外线信号。

Microsoft Windows上有个功能相同的软件叫WinLIRC。

利用LIRC和红外线接收器,你就几乎可以用所有的红外线遥控器(例如:电视遥控器)来控制你的计算机。举例来说,你可以用遥控器来控制DVD或音乐的播放。

lirc配置文件说明

  • /etc/lirc/lircd.conf为遥控器配置文件
  • /etc/lirc/lircmd.conf为lircmd配置文件,后者可以将遥控器用作鼠标。
  • /etc/lirc/lircrc为irexec配置文件,后者可以在收到遥控器信号号运行设定的程序。

制作遥控器配置文件

使用irrecord命令制作遥控器配置文件lircd.conf。

1
2
3
4
5
# 首先停止lirc服务
sudo service lirc stop

# 制作遥控器配置文件
irrecord -d /dev/lirc0 <model>.conf

测试过程

硬件

  • 树莓派3B+
  • 红外接收器
  • 红外遥控器
  • 杜邦线

接线

红外接收器都有三个引脚:VCC、GND、Data。其中:
VCC:连接5V的引脚
GND:连接接地的引脚
Data:连接GPIO23

lirc配置

  1. 安装lirc:

    1
    sudo apt-get install lirc -y
  2. 修改/etc/modules

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # /etc/modules: kernel modules to load at boot time.
    #
    # This file contains the names of kernel modules that should be loaded
    # at boot time, one per line. Lines beginning with "#" are ignored.

    i2c-dev
    # 添加如下代码
    lirc_dev
    lirc_rpi gpio_in_pin=23 gpio_out_pin=22
  3. 修改/etc/lirc/lirc_options.conf

    1
    2
    3
    # 修改如下两项
    driver = default
    device = /dev/lirc0
  4. 修改/boot/config.txt
    在/boot/config.txt文件中找到#dtoverlay=lirc-rpi,将其修改如下:

    1
    dtoverlay=lirc-rpi:gpio_in_pin=23,gpio_out_pin=22
  5. 重启测试

1
2
3
4
sudo init 6
# 查看lirc是否加载成功
lsmod | grep lirc
ls /dev/lirc0

参考链接

  1. LIRC,by wikipedia.
  2. 树莓派—红外遥控设置,by 逍遥游.
  3. 配置树莓派上的lirc(Raspbian, 2016),by Cnly.
  4. 上拉电阻和下拉电阻的作用,by Mike江.
  5. 上拉电阻和下拉电阻,by imzjy.
  6. Raspberry gPIo,by sparkfun.

飞行力学中坐标系定义

发表于 2018-12-10 | 更新于 2020-01-08

建立飞机的运动学模型的前提是建立合适的坐标系,在此基础上才能定义各种参数描述飞机的状态。下面介绍常用的坐标系及常用描述飞机状态的参数。

常用坐标系

地面固定坐标轴系($AX_gY_gZ_g$)

将地球视为椭球体,则地面固定坐标轴系定义为:

以椭球面上一点为坐标系原点$A$,$Z_g$轴与椭球法线重合,向下为正,$X_g$与$Y_g$轴位于过坐标原地的椭球切平面上,按右手法则建立,$X_g$轴与椭球短半轴重合(北向),$Y_g$轴与地球椭球的长半轴重合(东向)。

在研究坐标转换关系时,常使用飞机牵连铅垂地面固定坐标系$OX_gY_gZ_g$。其原点$O$位于飞机质心,三坐标轴平行于地面固定坐标轴系$AX_gY_gZ_g$的各个轴。飞机姿态——偏航、俯仰、滚转的定义即与飞机牵连铅垂地面固定坐标系有关。

机体坐标系(体轴系$OXYZ$)

机体坐标系定义为:

原点$O$位于质心,$O_X$平行于机身轴线或对称面机翼弦线指向前方(机头方向);$O_Y$垂直于对称面指向右翼;$O_Z$在飞机对称面内,垂直于$O_X$指向下方。符合右手系建立规定。

机体坐标系

图1 飞机牵连铅垂地面固定坐标系(OXgYgZg)与体轴系(OXYZ)

航迹坐标系($OX_kY_kZ_k$)

航迹坐标系定义:

原点$O$位于飞机质心,$OX_k$沿飞机速度方向;$OZ_k$在$OX_k$所在铅垂平面内,垂直于$OX_k$指向下方;$OY_k$垂直于$OX_k$、$OZ_k$ 所在平面指向右方;符合右手系建立规定。

航迹坐标系

图2 航迹坐标系(OXkYkZk)

气流坐标轴系(风轴系$OX_aY_aZ_a$)

气流坐标轴系又称速度坐标轴系,定义为:

原点$O$位于飞机质心,$OX_a$沿飞机速度方向;$OZ_a$在飞机对称面内,垂直于$OX_a$指向下方;$OY_a$垂直于$OX_a$、$OZ_a$ 所在平面指向右方;符合右手系建立规定。

气动力三个分量(升力、阻力、侧力)是根据风轴系定义的,其中升力与阻力分别沿$OZ_a$、$OX_a$的负向。

半机体坐标系($OX_iY_iZ_i$)

半机体坐标系定义为:

原点$O$位于质心,$OX_i$沿飞机速度向飞机对称面内投影方向;$OZ_i$在飞机对称面内,垂直于$OX_i$指向下方;$OY_i$垂直于$OX_i$、$OZ_i$ 所在平面指向右方;符合右手系建立规定。

半机体坐标

图3 风轴系(OXaYaZa)与半机体坐标系(OXiYiZi)

稳定性坐标系($OX_sY_sZ_s$)

稳定性坐标系定义为:

原点$O$位于质心,$OX_s$沿未受扰动的速度在对称面内的投影方向;$OY_s$在飞机对称面内,指向右;$OZ_s$对称平面内垂直于$OX_s$向下;符合右手系建立规定。

半机体坐标

图4 稳定性坐标系(OXsYsZs)

常用飞参

  • 机体坐标系相对于飞机牵连铅垂地面固定坐标系的夹角

    • 偏航角:机体坐标系$x$轴在水平面内投影与$x_g$的夹角,以$\psi$表示
    • 俯仰角:机体坐标系$x$轴与水平面的夹角,以$\theta$表示
    • 滚转角:过机体坐标系$x$轴的铅垂面与机体坐标系$z$轴的夹角,以$\phi$表示
  • 飞行速度矢量相对于体轴系的夹角

    • 迎角:速度矢量在飞机纵向对称面内投影与机体坐标系$x$轴夹角,以$\alpha$表示
    • 侧滑角:速度矢量与飞机纵向对称面的夹角,以$\beta$表示
  • 飞行速度矢量相对于地面的夹角

    • 爬升角:速度与地面水平面夹角,以$\gamma$表示
    • 航迹方位角:速度在地面水平面的投影与$x_g$夹角,以$\chi$表示

参考链接

  1. 无人机飞控通俗演义之 纷繁复杂的飞行力学, by 量子黑洞.
  2. 一起写飞行仿真之 六自由度动力学方程, by 量子黑洞.
  3. 飞行器飞行动力学(二)坐标系与夹角们, by 萝卜.
  4. Cesium中飞行器姿态控制,by jack huang.
  5. MathJax 支持的 Latex 符号总结(希腊字母和希伯来字母),by liyuanbhu
  6. 空间中三维矢量,by tina_ttl.
  7. JSBSim学习笔记(3)—— 基本概念,by 么的聊.

Debian系统安装NVIDIA驱动支持双显卡切换

发表于 2018-12-10

购买笔记本拥有Intel集成显卡和NVIDIA显卡,如何在Debian Linux下启用NVIDIA显卡是一个难题。幸运的是,通过bumblebee软件可在Linux下支持NVIDIA Optimus技术,实现Intel集成显卡和NVIDIA显卡之间的切换使用。

背景知识

NVIDIA Optimus

Optimus是NVIDIA针对笔记本电脑的显示切换技术。它可以实现笔记本电脑中独立显卡与主板内置显卡之间无缝、自动、实时的切换(用户无需重启或手动调整),从而实现能源的节约。

利用Optimus技术后,计算机的显示输出永远都只会通过集成式芯片组的显示核心。独立显卡的显示输出将会被废掉,有关的输出亦会发送到前者。由于显示输出的设备是固定的,所以黑屏现象将会被解决。额外的切换线路亦变得不需要,因为在不需要独立显示核心的时候,系统会索性断绝其电源供应。当系统的显示负载轻的时候,就会完全利用内置的显示核心。当负载增加后,系统就会打开独立显示核心作计算之用。协议分工方面由驱动程序负责,NVIDIA声称可以兼容所有的API。

Bumblebee

Bumblebee 致力于使 NVIDIA Optimus 在 GNU/Linux 系统上可用,实现两块不同的供电配置的显卡同时插入使用,共享同一个 framebuffer。

安装配置过程

禁止加载开源驱动nouveau

1
2
3
4
5
6
7
8
$ vi /etc/modprobe.d/nvidia-installer-disable-nouveau.conf

#上述文件不存在则新建,在文件中添加下面两行文字
blacklist nouveau
options nouveau modeset = 0

#系统重启后使用以下命令查看nouveau驱动是否被禁止
lsmod |grep -i nouveau

安装内核头文件

1
$ sudo apt-get install -y linux-headers-$(uname -r)

安装NVIDIA驱动

1
2
# 关于是否生存xorg.conf文件,选no
$ sudo apt-get install nvidia-driver nvidia-xconfig nvidia-kernel-dkms

安装双显卡切换解决方案包

1
$ apt-get install bumblebee-nvidia primus

添加当前用户到bumblebee用户组

1
$ adduser $USER bumblebee

修改bumblebee配置

1
2
3
4
5
6
7
8
9
10
11
12
$ vi /etc/bumeblebee/bumblebee.conf
: Driver=nvidia

#将/etc/bumeblebee/bumblebee.conf文件中的Driver=* 改成 =nvidia

$ vi /etc/bumblebee/xorg.conf.nvidia
:BusID "PCI:01:00:0"

#在/etc/bumblebee/xorg.conf.nvidia文件中,将Section“Device”部分添加PCI ID

# 可使用如下命令查看NVIDIA显卡的BUS ID
nvidia-xconfig --query-gpu-info | grep 'BusID : ' | cut -d ' ' -f6

重启进入桌面

如果无法进入桌面环境,则安装失败,进入高级修复使用如下命令进行清理。

1
$ sudo apt-get purge nvidia* bumblebee* prime*

bumblebee服务开机不会启动,设置开机启动即可。

1
$ update-rc.d -f bumblebee defaults

使用独显运行程序

bumblebee不能做到集显和独显之间自动切换,系统运行时默认使用集显,当你需要使用独显运行某个程序或者游戏的时候,终端执行如下命令即可:

1
2
$ optirum command #使用独显运行command程序
$ optirum -b primus command #使用独显运行command程序,提升性能

参考链接

  1. kali 在支持双显卡切换机器宏碁(Acer)V3下安装NVIDIA驱动, by 不梦君.
  2. Installing-Nvidia-drivers-on-Kali-Linux, by europa502.
  3. NVIDIA Optimus, by wikipedia.
  4. 在Ubuntu上安装和配置Nvidia Optimus驱动, by Linux中国.
  5. Bumblebee,by archlinux.
上一页1…454647…53下一页

Jack Huang

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