技术标签: HMD-Demo
一:flightgear通过UDP协议输出飞行态势数据
首先创建输出配置文件(xml格式),这里命名output.xml
以下是文件内容:
<?xml version="1.0"?>
<PropertyList>
<generic>
<output>
<line_separator>newline</line_separator>
<var_separator>newline</var_separator>
<binary_mode>false</binary_mode>
<chunk>
<name>MACH Number</name>
<format>M%4.1f</format>
<type>float</type>
<node>/velocities/mach</node>
</chunk>
<chunk>
<name>Ground Speed</name>
<format>GS:%3dkts</format>
<node>/instrumentation/gps/indicated-ground-speed-kt</node>
</chunk>
<chunk>
<name>G Load</name>
<format>G%2.1f</format>
<type>float</type>
<node>/accelerations/pilot/z-accel-fps_sec</node>
<factor>-0.03108095</factor>
<damp>1.0</damp>
</chunk>
<chunk>
<name>AGL</name>
<format>AGL%4.0f</format>
<type>float</type>
<node>/position/altitude-agl-ft</node>
</chunk>
</output>
</generic>
</PropertyList>
<chunk></chunk>之间决定了要输出的内容,其中<name>仅仅是为了区分各个chunk没具体意义,不用管它;<format>是输出格式设置,当输出变量为float类型时需要添加<type>float</type>标记;<node>是输出数据来源,可以在HUD.xml文件中查到,<factor>,<damp>都是对原始数据进行的操作,将它与HUD.xml中相同元素名称对应就可以了。如”G load”在HUD.xml中:
那么output.xml中”G load”中<node>就对应上图中的<property>,上图中有<factor>,<damp>那么output.xml中的”G load”也需要添加。
配置文件建好之后,将文件放在C:\ProgramFiles\FlightGear 2017.3.1\data\Protocol下,然后在flightgear启动界面命令行下添加以下命令:
--httpd=5500
--generic=socket,out,5,localhost,5500,udp,output
5是输出频率单位是赫兹(这个对不对?请赐教),5500是输出端口,udp是协议类型,output是输出文件名(即上面讲到的output.xml的名字)。
二:接收数据
以下是用C++写的接收UDP数据的代码(Copy from others )
#include"stdafx.h"
#include<stdio.h>
#include<winsock.h>
#include<conio.h>
//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上
#pragmacomment(lib,"ws2_32.lib")
int main(intargc,char*argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin, saClient; //设置两个地址,sin用来绑定
//saClient用来从广播地址接收消息
charcRecvBuff[800]; //定义接收缓冲区
intnSize, nbSize;
intiAddrLen = sizeof(saClient);
if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失败返回-1
return-1;
}
sockListener= socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family= AF_INET;
sin.sin_port= htons(5500); //发送端使用的发送端口,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockListener, (SOCKADDRFAR*)&sin, sizeof(sin)) != 0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
return-1;
}
while(1)
{
nSize= sizeof (SOCKADDR_IN);
if((nbSize = recvfrom(sockListener, cRecvBuff, 800, 0,
(SOCKADDRFAR *)&saClient, &nSize)) == SOCKET_ERROR) //若接收失败则提示错误
{
printf("Recive Error");
break;
}
cRecvBuff[nbSize]= '\0'; //字符串终止
printf("%s\n", cRecvBuff); //显示所接收到的字符串
}
return0;
}
三:启动flightgear ,将飞机跑起来,同时运行上述程序即可得下图:
文章浏览阅读455次。Jupyter notebook使用指南在Jupyter notebook中加入R内核在Jupyter notebook中加入Matlab内核在Jupyter notebook中加入R内核step1:安装包devtoolsinstall.packages('devtools')step2:安装内核devtools::install_github('IRkernel/IRkernel')..._importerror:connot import name 'constants
文章浏览阅读1.4k次,点赞5次,收藏13次。基于金沙滩51单片机的电子跑表很久之前学51单片机的时候做的了,现在分享一下。基于金沙滩51单片机,很推荐这款单片机开发板,教程很好。零、完成功能本项目完成以下功能:时钟模式:在数码管上显示分、秒跑表模式:跑表显示范围:0-999.0秒按下启动键开始计时按下暂停键暂停计时按下继续键继续计时按下复位键计时归零壹、硬件电路图下面是项目用到的硬件电路图,完整原理图请点击:金沙滩51单片机原理图数码管电路贰、程序源码注释挺多的,程序挺简单的,就不多介绍了,有问题可以_金沙滩51单片机原理图
文章浏览阅读2.5k次。1465 -- 【高精度】组合公式C(m,n)1634Description C(m,n)就是求n个数中选m个数选择方案数。其计算公式为: C(m,n)=n!/(m!*(n-m)!)Input 输入文件共一行两个数m,n(1<=m<=n<=1000).Output 输出文件共一行一个数为计算结果Sample Input4 5Sample ..._组合公式
文章浏览阅读2.5k次。随着短视频风口的兴起,视频剪辑已然成为自媒体人不可或缺的技能之一。如何更快更好地制作出精美的视频,无疑成为自媒体人极其关注的重点。作为经常剪辑旅游风光的知享君,今天分享这6个视频剪辑神器,助你秒变视频达人。快剪辑作为360出品的产品,快剪辑凭借其简易上手的优势迅速抢占视频剪辑领域市场,加上无强制片头片尾,自然受自媒体人的青睐。特别随着专业级功能的完善,无疑增加了用户的便利,适合小白级用..._剪切自媒体赚钱
文章浏览阅读1.9k次。线程组:可以有线程对象,也可以有线程组。(ThreadGroup)线程组的作用是,可以批量的管理线程或线程组对象,有有效地对线程或线程组对象进行组织。官方文档:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ThreadGroup.html线程对象关联线程组:1级关联。介绍:1级关联就是父对象中有..._java线程组
文章浏览阅读3.5k次,点赞5次,收藏43次。OpenCV+VS2015的详细配置(小白教程)一:下载安装OpenCV和VS2015配置环境变量VS2015中配置OpenCV一:下载安装OpenCV和VS20151.下载OpenCV进入OpenCV官网,下载自己想要版本。这里注意:OpenCV3.0是一个分界线,3.0以前和3.0以后有很大的不同,我建议还是尽量下载3.0以后的版本。这里我下载的是3.4.3。下载后,找到.exe..._vs2015配置opencv
文章浏览阅读435次。我们正在使用sqlalchemy的自动加载功能进行列映射,以防止在我们的代码中进行硬编码。-------欢迎加入python学习交流扣扣裙851211580-------class users(Base): __tablename__ = 'users' __table_args__ = { 'autoload': True, 'mysql_en..._sqlalchemy autoload
文章浏览阅读563次。python2中输入数据,报错NameError,将input改成raw_input后就成功运行了。_python错误nameerror中文怎么改
文章浏览阅读217次。题目:求数base的exponent次方(base是基数,exponent是指数),不得使用库函数。其中。base是float,exponent是int型。实现的一般思路是循环,为保证代码的完整性,首先要把可能的输入想清楚,base可以取一般的正负数、整数、0,而exponent应该为整数(负整数、正整数、0),不能取非整数。而且需要对乘积得到的数进行边界测试,不能超过边界值。题目有要求,不需..._非整数次方含义
文章浏览阅读3.7k次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.for循环2.异步接口总结前言for循环中 循环调用接口 然后等循环结束获取全部数据。1.for循环代码如下(示例):async initMapInfoWindowChart(data) { const { data: res, code: code } = await getData({ id: data.id, }) if (code == 200) {_async+await+promise实现在for循环中同步并获取返回值
文章浏览阅读1.2k次。1、 ORACLE和MySQL的区别oracle是大型数据库,Mysql是中小型数据库,mysql是开源的,Oracle支持大并发,大访问量MYSQL的主键一般使用自动增长,oracle主键自增长需要使用序列MYSQL的单引号双引号都表示字符串ORACLE的单引号表示字符串,双引号是区分大小写的字符串MYSQL用LIMIT分页orcale用rownum分页空字符串的处理使用..._数据库调优 面试题
文章浏览阅读273次。1_多尺度目标检测数据集