[原][JSBSim]基於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端怎么實現的,這個看看它源碼自己研究下就可以嘍!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM