[osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!
Posted 南水之源
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!相关的知识,希望对你有一定的参考价值。
废话没有,上关键代码
头文件
#include <QUdpSocket> #include <qtcpsocket.h> #ifndef vrUDP #define vrUDP #define PLANE_DATA_NUM 30 struct PlanePoseStruct{ double lon; double lat; double height; double heading; double pitch; double rotate; }; class JSBSimSocket : public QObject { Q_OBJECT public: JSBSimSocket(); ~JSBSimSocket(); void initNet(); void sendPlaneControlData(char * data, int length); private slots: void recvPlanePose(); void recvTcpBack(); private: QTcpSocket *m_control_TcpSocket; QUdpSocket *m_get_UdpSocket; QHostAddress m_get_udphost; quint16 m_get_UdpPort; double m_JSBSimData[PLANE_DATA_NUM]; ······· };
源文件
#include "vrUDP.h" JSBSimSocket::JSBSimSocket() { } JSBSimSocket::~JSBSimSocket() { } void JSBSimSocket::initNet() { //用于控制端,基于QT_TCP客服端:飞机控制发送,信息反馈 QHostAddress tcp_host = QHostAddress::LocalHost;//这里请用xml数据 quint16 tcp_port = 8009;//这里请用xml数据 m_control_TcpSocket = new QTcpSocket; m_control_TcpSocket->connectToHost(tcp_host, tcp_port); m_control_TcpSocket->waitForConnected(); connect(m_control_TcpSocket, SIGNAL(readyRead()), this, SLOT(recvTcpBack())); m_control_TcpSocket->waitForReadyRead(); //用于获取飞行姿态,基于QT_UDP的服务器。 m_get_udphost = QHostAddress::Any;//这里请用xml数据 m_get_UdpPort = 8008;//这里请用xml数据 m_get_UdpSocket = new QUdpSocket; m_get_UdpSocket->bind(m_get_udphost,m_get_UdpPort); connect(m_get_UdpSocket,SIGNAL(readyRead()),this,SLOT(recvPlanePose())); } void JSBSimSocket::sendPlaneControlData(char * data, int length) { //发送控制信息 //通信的关键就在于这个data的组织 //具体的通讯内容要参考JSBSim的数据结构 int re = m_control_TcpSocket->write(data); if (re == -1 ) { printf("send error"); } } void JSBSimSocket::recvTcpBack() { char buffer[4096]; qint64 size = m_control_TcpSocket->read(buffer, 4096); if (size > 0) { //这里获取TCP的反馈,可以进行后期交互操作 buffer[size] = ‘\0‘; printf("recvTcpBack:%s", buffer); } } void JSBSimSocket::recvPlanePose() { char buffer[4096]; qint64 size = m_get_UdpSocket->readDatagram(buffer, sizeof(PlanePoseStruct)); if (size > 0) { buffer[size] = ‘\0‘; memcpy(&m_JSBSimData[0], buffer, size); m_PlanePose.lon = m_JSBSimData[0]; m_PlanePose.lat = m_JSBSimData[1]; m_PlanePose.height = m_JSBSimData[2] / 3.2808; m_PlanePose.rotate = m_JSBSimData[3] / 3.14 * 180; m_PlanePose.pitch = m_JSBSimData[4] / 3.14 * 180; m_PlanePose.heading = m_JSBSimData[5] / 3.14 * 180; ··············· } } ···············
简单说一下:
我的功能是控制飞机的驾驶并用TCP告诉JSBSim。
JSBSim算当前飞机姿态,然后通过UDP告诉我飞机姿态
至于,为什么不用TCP一次性搞定,因为。。。我只是想试下TCP|UDP可以么。。。
关于JSBSim端怎么实现的,这个看看它源码自己研究下就可以喽!
最后,请转载的朋友,把[原]字去掉,要不,我看到会笑死
以上是关于[osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!的主要内容,如果未能解决你的问题,请参考以下文章
OsgEarth开发笔记:Qt5.15.2在QtCreator集成Osg3.6.3+OsgEarth3.1+OsgQt的vs2019x64版本开发环境搭建
[osg][osgEarth][原]基于OE自定义自由飞行漫游器(第二版)