添加视觉识别系统Web服务功能

新增功能:
- 在MainWindow中集成视觉识别系统Web服务
- 添加startVisionWebService()和stopVisionWebService()方法
- 无人机视图和无人机控制按钮现在可以启动视觉识别Web界面
- 添加QProcess成员变量管理Python子进程
- 实现进程生命周期管理,包括优雅退出和强制终止
- 完善错误处理和日志记录

技术实现:
- 使用QProcess启动distance-judgement/main_web.py
- 进程信号连接,监控启动、退出和错误状态
- 析构函数中确保进程正确清理
- Web服务运行在localhost:5000端口
pull/8/head
123 1 week ago
parent 9795d92378
commit c95c57adc6

@ -346,6 +346,16 @@ private:
*/ */
void initializeModernStyles(); void initializeModernStyles();
/**
* @brief Web
*/
void startVisionWebService();
/**
* @brief Web
*/
void stopVisionWebService();
private: private:
Ui::MainWindow *m_ui; ///< UI界面指针 Ui::MainWindow *m_ui; ///< UI界面指针
IntelligenceUI *m_intelligenceUI; ///< 情报传达界面指针 IntelligenceUI *m_intelligenceUI; ///< 情报传达界面指针
@ -361,6 +371,9 @@ private:
// DroneControlDialog *m_droneControlDialog; ///< 无人机控制对话框 // DroneControlDialog *m_droneControlDialog; ///< 无人机控制对话框
// RobotDogControlDialog *m_robotDogControlDialog; ///< 机器狗控制对话框 // RobotDogControlDialog *m_robotDogControlDialog; ///< 机器狗控制对话框
// 视觉识别系统相关
QProcess *m_visionProcess; ///< 视觉识别系统进程
// 人脸识别相关成员变量已移除(功能暂未实现) // 人脸识别相关成员变量已移除(功能暂未实现)
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

@ -56,6 +56,7 @@ MainWindow::MainWindow(QWidget *parent)
, m_leftPanelSplitter(nullptr) , m_leftPanelSplitter(nullptr)
, m_intelligenceUI(nullptr) , m_intelligenceUI(nullptr)
, m_faceLightControl(nullptr) , m_faceLightControl(nullptr)
, m_visionProcess(nullptr)
// , m_droneControlDialog(nullptr) // , m_droneControlDialog(nullptr)
// , m_robotDogControlDialog(nullptr) // , m_robotDogControlDialog(nullptr)
{ {
@ -91,6 +92,17 @@ MainWindow::~MainWindow()
// delete m_robotDogControlDialog; // delete m_robotDogControlDialog;
// m_robotDogControlDialog = nullptr; // m_robotDogControlDialog = nullptr;
// } // }
// 停止并清理视觉识别进程
if (m_visionProcess) {
if (m_visionProcess->state() != QProcess::NotRunning) {
m_visionProcess->kill();
m_visionProcess->waitForFinished(3000);
}
delete m_visionProcess;
m_visionProcess = nullptr;
}
delete m_ui; delete m_ui;
} }
@ -781,7 +793,10 @@ void MainWindow::onRobotLocationClicked()
void MainWindow::onUAVViewClicked() void MainWindow::onUAVViewClicked()
{ {
QMessageBox::information(this, "无人机视图", "无人机视图功能正在开发中,暂时无法使用"); SystemLogger::getInstance()->logInfo("无人机视角请求");
// 启动视觉识别系统Web服务
startVisionWebService();
} }
void MainWindow::onRobotViewClicked() void MainWindow::onRobotViewClicked()
@ -1356,15 +1371,8 @@ void MainWindow::onDroneControlRequested()
{ {
SystemLogger::getInstance()->logInfo("无人机控制请求"); SystemLogger::getInstance()->logInfo("无人机控制请求");
// 暂时使用简单的消息框来测试功能 // 启动视觉识别系统Web服务
QMessageBox::information(this, "无人机控制", startVisionWebService();
"无人机控制界面功能正在开发中...\n"
"将包含以下功能:\n"
"• 飞行控制(起飞、降落、悬停)\n"
"• 航线规划和导航\n"
"• 实时视频传输\n"
"• 照片拍摄和传输\n"
"• 人物识别功能");
} }
void MainWindow::onRobotDogControlRequested() void MainWindow::onRobotDogControlRequested()
@ -1382,3 +1390,82 @@ void MainWindow::onRobotDogControlRequested()
"• 设备状态监控"); "• 设备状态监控");
} }
void MainWindow::startVisionWebService()
{
SystemLogger::getInstance()->logInfo("启动视觉识别系统Web服务");
// 如果进程已经在运行,先停止它
if (m_visionProcess && m_visionProcess->state() != QProcess::NotRunning) {
SystemLogger::getInstance()->logWarning("视觉识别系统已在运行,先停止现有进程");
stopVisionWebService();
}
// 创建新的进程对象
if (!m_visionProcess) {
m_visionProcess = new QProcess(this);
// 连接进程信号
connect(m_visionProcess, &QProcess::started, [this]() {
SystemLogger::getInstance()->logInfo("视觉识别系统Web服务启动成功");
QMessageBox::information(this, "无人机视觉系统",
"视觉识别系统正在启动...\n"
"Web界面将在几秒钟后自动打开\n"
"访问地址: https://localhost:5000");
});
connect(m_visionProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[this](int exitCode, QProcess::ExitStatus exitStatus) {
Q_UNUSED(exitStatus)
SystemLogger::getInstance()->logInfo(QString("视觉识别系统Web服务已停止退出代码: %1").arg(exitCode));
});
connect(m_visionProcess, &QProcess::errorOccurred, [this](QProcess::ProcessError error) {
QString errorMsg;
switch (error) {
case QProcess::FailedToStart:
errorMsg = "无法启动Python进程请检查Python环境";
break;
case QProcess::Crashed:
errorMsg = "视觉识别系统进程意外崩溃";
break;
default:
errorMsg = "视觉识别系统进程发生未知错误";
break;
}
SystemLogger::getInstance()->logError(errorMsg);
QMessageBox::critical(this, "启动错误", errorMsg);
});
}
// 设置工作目录和启动参数
QString workingDir = "/home/hzk/Software_Architecture/distance-judgement";
QString pythonScript = "main_web.py";
m_visionProcess->setWorkingDirectory(workingDir);
m_visionProcess->start("python3", QStringList() << pythonScript);
SystemLogger::getInstance()->logInfo("正在启动视觉识别系统...");
}
void MainWindow::stopVisionWebService()
{
if (!m_visionProcess || m_visionProcess->state() == QProcess::NotRunning) {
SystemLogger::getInstance()->logWarning("视觉识别系统进程未运行");
return;
}
SystemLogger::getInstance()->logInfo("停止视觉识别系统Web服务");
// 优雅地终止进程
m_visionProcess->terminate();
// 等待进程结束,如果超时则强制杀死
if (!m_visionProcess->waitForFinished(5000)) {
SystemLogger::getInstance()->logWarning("进程未能正常退出,强制结束");
m_visionProcess->kill();
m_visionProcess->waitForFinished(3000);
}
SystemLogger::getInstance()->logInfo("视觉识别系统Web服务已停止");
}

Loading…
Cancel
Save