更改了点激光取值方式

This commit is contained in:
2024-08-30 17:36:15 +08:00
parent 1717f502e1
commit 2ce0d7b876
17 changed files with 121 additions and 84 deletions
@@ -217,10 +217,16 @@ bool Hd_3DCameraLMI_module::sendData(std::vector<cv::Mat>& vecPic, QByteArray &d
if(dataVec.size()>0)
{
m_mutex->lock();
double rangeData = dataVec[dataVec.size()-1];
double avgData = 0;
for (auto data : dataVec)
{
avgData += data;
}
avgData /= dataVec.size();
//double rangeData = dataVec[dataVec.size()-1];
dataVec.clear();
m_mutex->unlock();
data = QByteArray::number(rangeData);
data = QByteArray::number(avgData);
}
return true;
@@ -261,17 +267,18 @@ bool Hd_3DCameraLMI_module::initParas(QByteArray &)
bool Hd_3DCameraLMI_module::run()
{
dataVec.clear();
for(auto i = 0 ;i<20000;i++)
GoSensor_Trigger(sensor);
bool result = false;
//qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << " run start" << id;
try
{
int timeOut = 0;
dataVec.clear();
while (timeOut < 10000)
while (timeOut < 2000)
{
m_mutex->lock();
if (dataVec.size() > 0)
if (dataVec.size() >= 9000)
{
result = true;
m_mutex->unlock();
@@ -281,6 +288,7 @@ bool Hd_3DCameraLMI_module::run()
timeOut += 10;
QThread::msleep(10);
}
std::cout << "size" << dataVec.size() << std::endl;
}
catch (QString ev)
{
@@ -148,7 +148,7 @@ bool sqlManager::updateData(std::string SN,sqlRowDatas data)
dbPtr->Update(getCurrentDate(), data, "SN", SN);
}
mutex.unlock();
return true;
}
//将数据存入数据库
bool sqlManager::addData(std::string SN,std::vector<sqlData> data)
+107 -78
View File
@@ -11,17 +11,17 @@
class detProcess : public QThread
{
public:
detProcess()
{
_threadManager.initialization(this);
_manualDetThread.initialization(this);
_cameraManager.initialization();
_triggerManager.initialization(this);
detProcess()
{
_threadManager.initialization(this);
_manualDetThread.initialization(this);
_cameraManager.initialization();
_triggerManager.initialization(this);
detProcessCallbackRegister();
}
}
//初始化
void run()
{
void run()
{
_cameraManager.start();
_handleAiModelManager.start();
_lightSourceManager.start();
@@ -35,16 +35,16 @@ public:
_triggerManager.start();
res3 = waitrForInitResult(&_triggerManager);
}
std::cout << "_cameraManager-initReuslt-->" << std::to_string(res1) << "\n"
std::cout << "_cameraManager-initReuslt-->" << std::to_string(res1) << "\n"
<< "_handleAiModelManager-initReuslt-->" << std::to_string(res2) << "\n"
<< "_triggerManager-initReuslt-->" << std::to_string(res3) << "\n" << std::endl;
if(res1 == true&&res2 == true && res3 == true)
if (res1 == true && res2 == true && res3 == true)
emit _core._qtFunc.sendInitFinished(InitOK);
else
emit _core._qtFunc.sendInitFinished(InitFailure);
}
}
//等待服务返回OK/NG直到超时
bool waitrForInitResult(serviceModule* ptr,int timeout=-1)
bool waitrForInitResult(serviceModule* ptr, int timeout = -1)
{
if (timeout == -1)//不会超时
{
@@ -52,7 +52,7 @@ public:
{
if (ptr->status == InitFailure)
return false;
else if(ptr->status == InitOK)
else if (ptr->status == InitOK)
return true;
QThread::msleep(100);
}
@@ -75,18 +75,18 @@ public:
}
}
simpleSiemensTcp _simpleSiemensTcp;
detDataManager _detDataManager;//检测中的数据 不需要初始化
imgSaveThreadManager _imgSaveThreadManager;//存图线程 不需要初始化
detThreadManager _threadManager;//异步检测线程 不需要初始化
handleAiModelManager _handleAiModelManager;//模型
cameraManager _cameraManager;//相机
lightSourceManager _lightSourceManager;//光源
detDataManager _detDataManager;//检测中的数据 不需要初始化
imgSaveThreadManager _imgSaveThreadManager;//存图线程 不需要初始化
detThreadManager _threadManager;//异步检测线程 不需要初始化
triggerManager _triggerManager;//MODBUS触发器
manualDetThread _manualDetThread;//手动触发线程
handleAiModelManager _handleAiModelManager;//模型
cameraManager _cameraManager;//相机
lightSourceManager _lightSourceManager;//光源
///////////////////////////////
triggerManager _triggerManager;//MODBUS触发器
manualDetThread _manualDetThread;//手动触发线程
///////////////////////////////
bool startDet = false;
QMutex detMutex;
std::string currentSn;
@@ -99,7 +99,8 @@ public:
_triggerManager.registerCallback(361, 2, [this](QByteArray& byteArray) {detectionSwitch2(byteArray); }, "检测结束1");
_triggerManager.registerCallback(362, 1, [this](QByteArray& byteArray) {detectionEnd(byteArray); }, "检测结束2");
_triggerManager.registerCallback(364, 1, [this](QByteArray& byteArray) {frontBackDet(); }, "检测正反面");
_triggerManager.registerCallback(369, 1, [this](QByteArray& byteArray) {testFunc(); }, "检测正反面");
_threadManager.registerCallback([this](std::shared_ptr<detData>data) {correctionResultHandle(data); });
_threadManager.registerCallback([this](std::shared_ptr<detData>data) {detectionResultHandle(data); });
}
@@ -109,7 +110,7 @@ public:
bool currentBack = false;
//激光校准数据缓存 //SN 数据
pointsOffsetStruct lastPointsOffsetStruct_;
correctionStruct laserDataCache;
correctionStruct laserDataCache;
//总流程开始,机器人发送1至寄存器259
//上位机确认OK之后,清零寄存器259,并发送1至寄存器260
//如产品型号为Product_1且为正面,则上位机发送1至寄存器256,发送0至寄存器257
@@ -132,12 +133,12 @@ public:
//上位机确认机器人到达点位1(264)时,确认OK后,寄存器262至1,261至0,取点完成后,发送寄存器263至1
//校准函数 261
void calibrationFunc(QByteArray& byteArray)
{
{
QThread::msleep(3000);
int armPos = _triggerManager.getValue(264, byteArray);
int xValue1 = _triggerManager.getValue(265, byteArray);
int xValue2 = _triggerManager.getValue(266, byteArray);
int xValue2 = _triggerManager.getValue(266, byteArray);
int xValue3 = _triggerManager.getValue(267, byteArray);
int yValue1 = _triggerManager.getValue(268, byteArray);
@@ -154,31 +155,33 @@ public:
auto cameraPtr = _cameraManager.getCamera("181964");
if (cameraPtr == nullptr)
return;
std::vector<double> values;
for (int i = 0; i < 10; i++)//弃用
{
cameraPtr->trigger();
double rangeData1 = cameraPtr->getCameraValue();
}
for (int i = 0; i < 70; i++)
{
cameraPtr->trigger();
double rangeData1 = cameraPtr->getCameraValue();
values.push_back(rangeData1);
}
cameraPtr->trigger();
double rangeData = cameraPtr->getCameraValue();
//std::vector<double> values;
//for (int i = 0; i < 10; i++)//弃用
//{
// cameraPtr->trigger();
// double rangeData1 = cameraPtr->getCameraValue();
//}
//for (int i = 0; i < 70; i++)
//{
// cameraPtr->trigger();
// double rangeData1 = cameraPtr->getCameraValue();
// values.push_back(rangeData1);
//}
double avgData = 0;
for (auto data : values)
{
avgData += data;
}
avgData /= values.size();
//double avgData = 0;
//for (auto data : values)
//{
// avgData += data;
//}
//avgData /= values.size();
double maxData = *std::max_element(values.begin(), values.end());
double minData = *std::min_element(values.begin(), values.end());
double rangeData = avgData;
qDebug() << " max:" << maxData << " min:" << minData << " avg:" << avgData;
std::cout << " max:" << maxData << " min:" << minData << " avg:" << avgData << std::endl;
//double maxData = *std::max_element(values.begin(), values.end());
//double minData = *std::min_element(values.begin(), values.end());
//double rangeData = avgData;
/*qDebug() << " max:" << maxData << " min:" << minData << " avg:" << avgData;
std::cout << " max:" << maxData << " min:" << minData << " avg:" << avgData << std::endl;*/
qDebug() << "jiaozhun xValue:" << xValue << " yValue:" << yValue << " zValue:" << zValue << " rangeData:" << rangeData;
std::cout << "jiaozhun xValue:" << xValue << " yValue:" << yValue << " zValue:" << zValue << " rangeData:" << rangeData << std::endl;
if (rangeData == 0)
@@ -205,13 +208,13 @@ public:
laserDataCache.in_X_Y0Z_Value.push_back(rangeData);
}
else if (armPos <= 9)
{
{
laserDataCache.in_X_X0Z.push_back(xValue);
laserDataCache.in_Y_X0Z.push_back(yValue);
laserDataCache.in_Z_X0Z.push_back(zValue);
laserDataCache.in_Y_X0Z_Value.push_back(rangeData);
}
_triggerManager.sendFinsMsg("write_short_261_0");//清零
_triggerManager.sendFinsMsg("write_short_262_1");
_triggerManager.sendFinsMsg("write_short_263_1");
@@ -226,7 +229,7 @@ public:
_threadManager.addTask(data);//添加任务
laserDataCache = correctionStruct();
}
}
}
//拍照并检测 300
void captureImageAndDetection(QByteArray& byteArray)
{
@@ -237,7 +240,7 @@ public:
_triggerManager.sendFinsMsg("write_short_300_0");//触发信号清零
_triggerManager.sendFinsMsg("write_short_301_1");//开始检测信号
int Pos = _triggerManager.getValue(303, byteArray);
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(Pos,1);
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(Pos, 1);
std::cout << "arm @Pos:" << Pos;
std::shared_ptr <detData> data = _detDataManager.insertDetData("Camera1", currentSn, 1, 1);
@@ -306,17 +309,17 @@ public:
if (!data.value.compare("NG"))
result = false;
//数据库结果为false时 不根据当前跑料数据判断
if(result == false)
if (result == false)
{
emit _core._qtFunc.uiModuleSummaryDataManager_SetSummaryResultText("NG", Qt::red);
return;
}
//数据库结果为true或者没有查询到数据时时 继续判断
if(productData->ngPinCount >0 || productData->ngCount>0)//NG
if (productData->ngPinCount > 0 || productData->ngCount > 0)//NG
{
emit _core._qtFunc.uiModuleSummaryDataManager_SetSummaryResultText("NG", Qt::red);
_core._appConfig._sqlManager.updateData(currentSn, {{"detResult","NG"}});
_core._appConfig._sqlManager.updateData(currentSn, { {"detResult","NG"} });
}
else
{
@@ -330,7 +333,7 @@ public:
if (currentBack == true)
currentBack = false;
else if (
_core._appConfig.productDatas[currentProductIndex].isBackExist == true
_core._appConfig.productDatas[currentProductIndex].isBackExist == true
&& result == true
&& startDet == true)
{
@@ -352,7 +355,7 @@ public:
void detectionResultHandle(std::shared_ptr<detData>data)
{
data->sqlVec.push_back({ "SN",data->SNcode });
data->sqlVec.push_back({ "ARMPOS",std::to_string(data->armPos)});
data->sqlVec.push_back({ "ARMPOS",std::to_string(data->armPos) });
//发送图片
if (data->resultImgs.size() > 0)
{
@@ -396,7 +399,7 @@ public:
pack.type = 2;
}
if(data->halconOK == true)
if (data->halconOK == true)
emit _core._qtFunc.addDashBoardData(0, data->halconOK);
else if (data->resultImgs.size() >= 2)
{
@@ -407,16 +410,16 @@ public:
pack.type = 1;
}
if (finalOk == true)
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(data->armPos,2);
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(data->armPos, 2);
perConnector _perConnectorData;
_perConnectorData.aiOk = data->aiDetOK;
_perConnectorData.halconOk = data->halconOK;
_perConnectorData.maxPinDetValue = data->maxPinDetValue;
auto productData = _core._productDataCache.get(currentSn);
productData->connectorResults.push_back(_perConnectorData);
data->sqlVec.push_back({ "Result",std::to_string(finalOk)});
data->sqlVec.push_back({ "Result",std::to_string(finalOk) });
}
//ct计算以及发送到界面
auto totalCt = std::chrono::duration_cast<std::chrono::milliseconds>(data->halconEndTime - data->algoStartTime);
@@ -451,28 +454,54 @@ public:
//使用点激光测量检测是否为正面,没数据就是正面
void frontBackDet()
{
_triggerManager.sendFinsMsg("write_short_364_1");
QThread::msleep(1000);
_triggerManager.sendFinsMsg("write_short_364_0");
_triggerManager.sendFinsMsg("write_short_365_0");
auto cameraPtr = _cameraManager.getCamera("181964");
if (cameraPtr == nullptr)
return;
for (int i = 0; i < 10; i++)//弃用
//for (int i = 0; i < 10; i++)//弃用
//{
// cameraPtr->trigger();
// cameraPtr->getCameraValue();
//}
//for (int i = 0; i < 100; i++)//检测是否有数据
//{
// cameraPtr->trigger();
// if (cameraPtr->getCameraValue() > -100)//有数据 是反面
// {
// _triggerManager.sendFinsMsg("write_short_365_2");
// break;
// }
//}
//1是正面,读不到,2是反面,可以读到
cameraPtr->trigger();
double value = cameraPtr->getCameraValue();
std::cout << "camera value" << value;
if (value > -100)//有数据 是反面
{
cameraPtr->trigger();
cameraPtr->getCameraValue();
}
for (int i = 0; i < 100; i++)//检测是否有数据
{
cameraPtr->trigger();
if (cameraPtr->getCameraValue() > -100)//有数据 是反面
{
_triggerManager.sendFinsMsg("write_short_365_2");
break;
}
_triggerManager.sendFinsMsg("write_short_365_2");
return;
}
_triggerManager.sendFinsMsg("write_short_365_1");//无数据 是正面
//正面反面是否继续检测,在机械臂脚本中决定
}
void testFunc()
{
auto cameraPtr = _cameraManager.getCamera("181964");
if (cameraPtr == nullptr)
return;
std::vector<double> values;
for (int i = 0; i < 1000; i++)
{
cameraPtr->trigger();
double v = cameraPtr->getCameraValue();
std::cout << v << std::endl;
}
}
public slots:
void runBackDet()
{
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.