由于马达移动准确性较低,自动调焦完成后,直接移动到m_goodPos效果不好,所以先移动到tmpPos,然后移动到m_goodPos

This commit is contained in:
tangchao0503
2025-08-25 14:09:58 +08:00
parent 1867291c9b
commit ac241f45cc
3 changed files with 54 additions and 11 deletions

View File

@ -32,7 +32,7 @@ void OneMotorControl::onConnectMotor()
}
m_multiAxisController->moveToThread(&m_motorThread);
m_motorThread.start();
connect(&m_motorThread, SIGNAL(finished()), m_multiAxisController, SLOT(deleteLater()));
connect(this->ui.right_btn, SIGNAL(pressed()), this, SLOT(onxMotorRight()));
connect(this->ui.right_btn, SIGNAL(released()), this, SLOT(onxMotorStop()));
@ -59,6 +59,8 @@ void OneMotorControl::onConnectMotor()
connect(this, SIGNAL(testConnectivitySignal(int, int)), m_multiAxisController, SLOT(testConnectivity(int, int)));
connect(m_multiAxisController, SIGNAL(broadcastConnectivity(std::vector<int>)), this, SLOT(display_motors_connectivity(std::vector<int>)));
m_motorThread.start();
emit testConnectivitySignal(0, 1000);
}

View File

@ -118,6 +118,7 @@ void focusWindow::onConnectMotor()
connect(this, SIGNAL(zeroStartSignal(int)), m_multiAxisController, SLOT(zeroStart(int)));
connect(this, SIGNAL(move2MaxLocSignal(int, double, int)), m_multiAxisController, SLOT(moveToMax(int, double, int)));
connect(m_multiAxisController, SIGNAL(broadcastLocationSignal(std::vector<double>)), this, SLOT(display_x_loc(std::vector<double>)));
connect(m_multiAxisController, SIGNAL(motorStopSignal(int, double)), this, SLOT(moveAfterAutoFocus(int, double)));
m_motorThread.start();
//归零
@ -408,10 +409,14 @@ void focusWindow::onAutoFocusFinished()
if (mu < 0 || mu > maxPos)
{
std::cout << "拟合失败!!!!!" << std::endl;
QMessageBox msgBox;
msgBox.setText(QString::fromLocal8Bit("纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!"));
msgBox.exec();
mu = mu_init;
m_goodPos = mu_init;
m_isAutoFocusSuccess = false;
}
else
{
std::cout << "拟合成功!!!!!" << std::endl;
m_goodPos = mu;
m_isAutoFocusSuccess = true;
}
FileOperation* fileOperation = new FileOperation();
@ -420,13 +425,13 @@ void focusWindow::onAutoFocusFinished()
QString format1 = "yyyyMMdd_HHmmss";
QString fileName = now.toString("yyyyMMdd_HHmmss");
QString tmp = QDir::cleanPath(QString::fromStdString(directory) + QDir::separator() + fileName + "_" + QString::number(m_iStepSize) + "interval_" + QString::number(mu) + ".csv");
QString fitDataFile = QDir::cleanPath(QString::fromStdString(directory) + QDir::separator() + fileName + "_" + QString::number(m_iStepSize) + "interval_" + QString::number(mu) + ".csv");
m_coordinator->saveToCsv(fitDataFile);
QString focusFilePath = QString::fromStdString(directory) + "\\focus.csv";
m_coordinator->saveToCsv(tmp);
//移动马达到最佳位置
emit move2LocSignal(0, (double)mu, m_dSpeed, 1000);
//由于马达移动准确性较低自动调焦完成后直接移动到m_goodPos效果不好所以先移动到tmpPos然后移动到m_goodPos
double tmpPos = m_goodPos - positionData[positionData.size() - 1].actualPosition / 10;
m_isMoveAfterAutoFocus = true;
emit move2LocSignal(0, (double)tmpPos, m_dSpeed, 1000);
}
else
{
@ -436,6 +441,37 @@ void focusWindow::onAutoFocusFinished()
this->setDisabled(false);
}
void focusWindow::moveAfterAutoFocus(int motorID, double location)
{
if (!m_isMoveAfterAutoFocus)
{
return;
}
std::cout << "\n已经到达位置:" << location << std::endl;
//移动马达到最佳位置
emit move2LocSignal(0, (double)m_goodPos, m_dSpeed, 1000);
double tmp = abs(location - m_goodPos) / m_goodPos * 100;
if (tmp<5)
{
if (!m_isAutoFocusSuccess)
{
QMessageBox msgBox;
msgBox.setText(QString::fromLocal8Bit("纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!"));
msgBox.exec();
}
else
{
QMessageBox msgBox;
msgBox.setText(QString::fromLocal8Bit("自动调焦成功!"));
msgBox.exec();
}
m_isMoveAfterAutoFocus = false;
}
}
void focusWindow::getGaussianInitParam(const std::vector<double>& pos, const std::vector<double>& index, double& a_init, double& mu_init, double& sigma_init, double& c_init)
{
auto minmax_element = std::minmax_element(index.begin(), index.end());

View File

@ -125,6 +125,9 @@ private:
MotionCaptureCoordinator* m_coordinator;
int m_iStepSize;
double m_goodPos;
bool m_isAutoFocusSuccess;
bool m_isMoveAfterAutoFocus = false;
void getGaussianInitParam(const std::vector<double>& pos, const std::vector<double>& index, double& a_init, double& mu_init, double& sigma_init, double& c_init);
void gaussian_fit(const std::vector<double>& x_data, const std::vector<double>& y_data, double& a, double& mu, double& sigma, double& c);
@ -146,6 +149,8 @@ public Q_SLOTS:
void display_x_loc(std::vector<double> loc);
void onx_rangeMeasurement();
void moveAfterAutoFocus(int motorID, double location);
signals:
void StartManualFocusSignal(int);//1<><31><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>