学习了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,代码优化,集成测试,设计文档制作及小结。
四,当前的设计
五,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