學習了3D圖像后,我就像之前學習slam及opencv一樣。設計一個小項目練手。
一,立項
windows端使用QT開發按鍵+tcpip通信。
linux端使用opengl+tcpip通信。
最終聯調,可以實現QT按鈕來控制三維模型的視角投影變換。
意義:可以繼續擴充想象其功能。
QT變成了手機端,那么手機可以控制linux設備。
linux設備端的三維模型可以以AR形式嵌入到攝像頭采集的實體中。
萬丈高樓平地起,我現在練習的就是基礎。只是此次設計沒有用來什么復雜的設計模式進行抽象。將來可以考慮下。
二,任務拆分
建立socket通信架構,需要心跳包及重連機制。參考我之前的代碼架構,進行復用及重構Vscode Linux下opencv及多進程socket(5)小結--Apple的學習筆記
QT開發比較簡單,將linux的tcpip的client端代碼移植入即可,再添加圖像button處理。
集成后聯調,先在單機上使用local ip進行。即opengl+tcpip也在windows上進行,即使用VS2017開發。
三,當前進度:完成60%
已經完成:代碼架構及模塊功能實現,并且通過QT+VS2017(暫時linux端開發)的集成測試。
未完成:VS代碼移植入linux,代碼優化,集成測試,設計文檔制作及小結。
四,當前的設計
當前設計.png
五,QT客戶端類設計
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
/* key command */
enum dir{
FRONT,
BACK,
LEFT,
RIGHT,
STOP
};
Widget(QWidget *parent = nullptr);
~Widget();
/* add picture to the button */
void bindpic(QPushButton *pbtn,QString apath);
/* check key update flag */
bool IsKeyUpdate();
/* get key value */
int getKey();
/* reset key update flag */
void resetKeyUpdate();
private slots:
void on_btnFront_pressed();
void on_btnBack_pressed();
void on_btnLeft_pressed();
void on_btnRight_pressed();
private:
Ui::Widget *ui;
bool m_bPushed[5]; /* button m_bPushed states */
int m_nCurrentKey; /* get current key value */
bool m_bKeyUpdate; /* key update flag */
};
#endif // WIDGET_H
#ifndef CLIENT_HPP
#define CLIENT_HPP
#include "Display3D.h"
/* base class */
class baseSocket
{
public:
enum device
{
E_SERVER = 0,
E_CLIENT = 1
};
baseSocket(){};
~baseSocket(){};
/* get socket ID */
virtual int getConnectfd(void) = 0;
/* create socket */
int socketCreate(int aType, int aWay, int aIp, int aPort, int aDev);
/* Disconnet socket */
int socketDisconnect(int fd);
protected:
struct sockaddr_in clientaddr, serveraddr;
int clientfd, serverfd;
};
class baseClient : public baseSocket
{
public:
baseClient(){};
~baseClient(){};
/* socket connect for client */
int socketConnect(void);
/* get socket id for client */
int getConnectfd(void) override;
private:
};
class clientHandler
{
enum COM_STATE
{
CONNECT,
LOST
};
public:
clientHandler() : m_nState(CONNECT), m_bBeatConnect(FALSE){};
~clientHandler(){};
/* receive heartbeat */
int recvHeat(baseClient *pClientsocket); /* heat beat */
/* check connection if wrong then reconnect */
int HeartDetect(baseClient *pClientsocket);
/* send key command to server */
int sendkey(baseClient *pClientsocket, int aData); /* send key info */
/* judge connect state is active or not */
int IsConnectState();
private:
int m_nState;
bool m_bBeatConnect;
};
#endif
六,效果圖
效果圖.png
七,實現效果
GIF 2020-3-1 15-15-53.gif