#ifndef CALIBVIEWMAINWINDOW_H #define CALIBVIEWMAINWINDOW_H #include #include #include #include #include #include #include #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 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