GrabBag/Tools/CalibView/Inc/CalibViewMainWindow.h
2026-03-29 10:48:35 +08:00

200 lines
4.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef CALIBVIEWMAINWINDOW_H
#define CALIBVIEWMAINWINDOW_H
#include <QMainWindow>
#include <QStatusBar>
#include <QDoubleSpinBox>
#include <QComboBox>
#include <QPushButton>
#include <QTextEdit>
#include <memory>
#include "IHandEyeCalib.h"
class CalibDataWidget;
class CalibResultWidget;
class MainWindow; // RobotView::MainWindow
class VrEyeViewWidget;
/**
* @brief 手眼标定工具主窗口
* 用于测试 HandEyeCalib 模块的各项功能
*/
class CalibViewMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit CalibViewMainWindow(QWidget* parent = nullptr);
~CalibViewMainWindow() override;
signals:
/**
* @brief 标定完成信号
*/
void calibrationCompleted(const HECCalibResult& result);
private slots:
/**
* @brief 执行 Eye-To-Hand 标定(选择方法)
*/
void onEyeToHandCalib();
/**
* @brief 执行 Eye-To-Hand 标定(简单方法 - 仅位置)
*/
void onEyeToHandCalibSimple();
/**
* @brief 执行 Eye-To-Hand 标定(完整位姿方法 - Park算法
*/
void onEyeToHandCalibWithPose();
/**
* @brief 执行 Eye-In-Hand 标定
*/
void onEyeInHandCalib();
/**
* @brief 执行坐标变换测试
*/
void onTransformTest();
void onEulerToDirectionMatrix();
void onDirectionMatrixToEuler();
/**
* @brief 执行 TCP 标定
*/
void onTCPCalib();
/**
* @brief 清除所有数据
*/
void onClearAll();
/**
* @brief 保存标定结果
*/
void onSaveResult();
/**
* @brief 加载标定结果
*/
void onLoadResult();
/**
* @brief 保存标定数据(表格中的坐标数据)
*/
void onSaveCalibData();
/**
* @brief 加载标定数据(表格中的坐标数据)
*/
void onLoadCalibData();
/**
* @brief 打开 RobotView 窗口
*/
void onOpenRobotView();
/**
* @brief 接收 RobotView 的 TCP 位姿
*/
void onRobotTcpPoseReceived(double x, double y, double z,
double rx, double ry, double rz);
/**
* @brief 打开 VrEyeView 窗口
*/
void onOpenVrEyeView();
/**
* @brief 接收 VrEyeView 的标定板检测结果
*/
void onChessboardDetected(double x, double y, double z,
double rx, double ry, double rz);
/**
* @brief 打开批量验证对话框
*/
void onOpenBatchVerify();
private:
/**
* @brief 初始化界面
*/
void setupUI();
/**
* @brief 创建菜单栏
*/
void createMenuBar();
/**
* @brief 创建右侧面板
*/
QWidget* createRightPanel();
/**
* @brief 更新状态栏
*/
void updateStatusBar(const QString& message);
/**
* @brief 追加日志
*/
void appendLog(const QString& message);
void updateDirectionMatrixDisplay(const HECRotationMatrix& R);
bool tryGetDirectionMatrixInput(HECRotationMatrix& R);
QString eulerOrderToString(HECEulerOrder order) const;
// 标定实例
IHandEyeCalib* m_calib;
// 数据输入控件
CalibDataWidget* m_dataWidget;
// 结果显示控件
CalibResultWidget* m_resultWidget;
// 存储加载的完整位姿数据(用于 Park 方法)
std::vector<HECEyeToHandData> m_eyeToHandPoseData;
// 右侧面板 - 坐标变换测试
QDoubleSpinBox* m_sbTransformX;
QDoubleSpinBox* m_sbTransformY;
QDoubleSpinBox* m_sbTransformZ;
QDoubleSpinBox* m_sbRoll;
QDoubleSpinBox* m_sbPitch;
QDoubleSpinBox* m_sbYaw;
QDoubleSpinBox* m_sbDirXX;
QDoubleSpinBox* m_sbDirXY;
QDoubleSpinBox* m_sbDirXZ;
QDoubleSpinBox* m_sbDirYX;
QDoubleSpinBox* m_sbDirYY;
QDoubleSpinBox* m_sbDirYZ;
QDoubleSpinBox* m_sbDirZX;
QDoubleSpinBox* m_sbDirZY;
QDoubleSpinBox* m_sbDirZZ;
QComboBox* m_cbAngleUnit;
QComboBox* m_cbEulerOrder;
QPushButton* m_btnEulerToMatrix;
QPushButton* m_btnMatrixToEuler;
QPushButton* m_btnTransform;
// 右侧面板 - 日志
QTextEdit* m_logEdit;
// 当前标定结果
HECCalibResult m_currentResult;
bool m_hasResult;
// RobotView 窗口实例
MainWindow* m_robotView;
// VrEyeView 窗口实例
VrEyeViewWidget* m_vrEyeView;
};
#endif // CALIBVIEWMAINWINDOW_H