GrabBag/AppUtils/UICommon/Inc/HandEyeCalibWidget.h

219 lines
7.0 KiB
C
Raw Normal View History

#ifndef HANDEYECALIBWIDGET_H
#define HANDEYECALIBWIDGET_H
#include <QWidget>
#include <QVector>
#include <QString>
#include <QComboBox>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
/**
* @brief
*/
struct HandEyeCalibCameraInfo
{
int cameraIndex; // 相机索引1-based
QString displayName; // 显示名称
};
/**
* @brief
*
* eulerOrder 姿
* 姿
* rotX/Y/Z Rx*Ry*Rz Eye
*/
struct HandEyeCalibData
{
int cameraIndex = 0;
double matrix[16] = {
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
};
bool isCalibrated = false;
int eulerOrder = 11; // 默认外旋 ZYX
double rotX = 0.0;
double rotY = 0.0;
double rotZ = 0.0;
double approachOffset = 0.0; // 接近点偏移mm沿目标姿态反方向远离目标点
double offsetX = 0.0; // 目标点补偿偏移 XmmRobot 坐标系
double offsetY = 0.0; // 目标点补偿偏移 Ymm
double offsetZ = 0.0; // 目标点补偿偏移 Zmm
};
/**
* @brief
*
* QWidget UI .ui tab/layout
* App IVrConfig
* INI QSettings [CalibMatrixInfo_0] section
*
* UI ComboBox Label 4x4 GridLayout [] /
* setExtrinsicControlsVisible(true) + X/Y/Z
*/
class HandEyeCalibWidget : public QWidget
{
Q_OBJECT
public:
explicit HandEyeCalibWidget(QWidget *parent = nullptr);
~HandEyeCalibWidget();
/**
* @brief
*/
void setCameraList(const QVector<HandEyeCalibCameraInfo>& cameras);
/**
* @brief
*/
void setCalibData(int cameraIndex, const double matrix[16], bool isCalibrated);
/**
* @brief
*/
void setExtrinsicData(int cameraIndex, int eulerOrder, double rotX, double rotY, double rotZ);
/**
* @brief
*/
void setExtrinsicData(int cameraIndex, int eulerOrder,
double rotX, double rotY, double rotZ,
double approachOffset);
/**
* @brief +
*/
void setExtrinsicData(int cameraIndex, int eulerOrder,
double rotX, double rotY, double rotZ,
double approachOffset,
double offsetX, double offsetY, double offsetZ);
/**
* @brief
* @return
*/
bool getCalibData(int cameraIndex, double outMatrix[16], bool& outIsCalibrated) const;
/**
* @brief +
* @return
*/
bool getExtrinsicData(int cameraIndex, int& outEulerOrder,
double& outRotX, double& outRotY, double& outRotZ) const;
/**
* @brief
* @return
*/
bool getExtrinsicData(int cameraIndex, int& outEulerOrder,
double& outRotX, double& outRotY, double& outRotZ,
double& outApproachOffset) const;
/**
* @brief +
*/
bool getExtrinsicData(int cameraIndex, int& outEulerOrder,
double& outRotX, double& outRotY, double& outRotZ,
double& outApproachOffset,
double& outOffsetX, double& outOffsetY, double& outOffsetZ) const;
/**
* @brief
* @return -1
*/
int currentCameraIndex() const;
/**
* @brief
*/
void setDefaultFilePath(const QString& path);
/**
* @brief
*/
void setMatrixEditable(bool editable);
/**
* @brief / XYZ
*/
void setExtrinsicControlsVisible(bool visible);
/**
* @brief /
*/
void setTargetOffsetVisible(bool visible);
void setApproachOffsetVisible(bool visible);
signals:
/**
* @brief
* @param cameraIndex
* @param matrix 16 double
*/
void calibMatrixLoaded(int cameraIndex, const double* matrix);
/**
* @brief
* @param cameraIndex
* @param matrix 16 double
*/
void saveCalibRequested(int cameraIndex, const double* matrix);
private slots:
void onCameraSelectionChanged(int index);
void onLoadCalibMatrixClicked();
void onSaveCalibMatrixClicked();
private:
void setupUI();
void setupExtrinsicGroup();
void initEulerOrderComboBox();
void displayMatrix(const double* matrix);
void clearMatrix();
void displayIdentityMatrix();
void updateCalibStatus(bool isCalibrated);
void displayExtrinsic(const HandEyeCalibData& data);
void displayDefaultExtrinsic();
// 从矩阵编辑框读取当前矩阵值
bool readMatrixFromUI(double outMatrix[16]) const;
// 从外参编辑框读取当前值并写回缓存
void commitExtrinsicToCache(int cameraIndex);
// 查找缓存中指定相机的数据
HandEyeCalibData* findCalibData(int cameraIndex);
const HandEyeCalibData* findCalibData(int cameraIndex) const;
HandEyeCalibData& ensureCalibData(int cameraIndex);
private:
QComboBox* m_comboCamera;
QLabel* m_labelStatus;
QLineEdit* m_matrixEdits[4][4]; // 4x4 矩阵编辑框
QPushButton* m_btnLoad;
QPushButton* m_btnSave;
QGroupBox* m_groupExtrinsic;
QComboBox* m_comboEulerOrder;
QLineEdit* m_editRotX;
QLineEdit* m_editRotY;
QLineEdit* m_editRotZ;
QLabel* m_labelApproachOffset;
QLineEdit* m_editApproachOffset;
QLabel* m_labelTargetOffset;
QLineEdit* m_editOffsetX;
QLineEdit* m_editOffsetY;
QLineEdit* m_editOffsetZ;
QVector<HandEyeCalibData> m_calibDataCache; // 按相机索引缓存
QString m_defaultFilePath;
bool m_matrixEditable;
};
#endif // HANDEYECALIBWIDGET_H