GrabBag/App/ScrewPosition/ScrewPositionConfig/Src/DetectionOutputConverter.cpp

144 lines
4.3 KiB
C++
Raw Permalink 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.

#include "DetectionOutputConverter.h"
#include "IYScrewPositionStatus.h"
#include <QDateTime>
#include <cmath>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
/**
* @brief 将轴向方向向量转换为欧拉角Roll, Pitch, Yaw
*
* 轴向方向向量表示螺杆的朝向,转换为:
* - Pitch: 绕Y轴旋转角俯仰角由Z分量和XY平面分量计算
* - Yaw: 绕Z轴旋转角偏航角由X和Y分量计算
* - Roll: 使用算法输出的旋转角度 rotateAngle
*/
static void AxialDirToEuler(double axialDirX, double axialDirY, double axialDirZ,
double rotateAngle,
double& roll, double& pitch, double& yaw)
{
// Roll 直接使用算法的旋转角度
roll = rotateAngle;
// Pitch = atan2(-z, sqrt(x^2 + y^2)) 俯仰角
double xyLen = std::sqrt(axialDirX * axialDirX + axialDirY * axialDirY);
pitch = std::atan2(-axialDirZ, xyLen) * 180.0 / M_PI;
// Yaw = atan2(y, x) 偏航角
yaw = std::atan2(axialDirY, axialDirX) * 180.0 / M_PI;
}
ProtocolDetectionOutput DetectionOutputConverter::ConvertScrewResult(
const std::vector<ScrewInfo>& screwInfoList,
int cameraIndex,
bool success,
int errorCode,
const QString& message)
{
ProtocolDetectionOutput output;
output.type = DETECTION_TYPE_SCREW;
output.success = success;
output.errorCode = errorCode;
output.message = message;
output.cameraIndex = cameraIndex;
for (const auto& screw : screwInfoList) {
ScrewDetectOutput screwOutput;
screwOutput.x = screw.centerX;
screwOutput.y = screw.centerY;
screwOutput.z = screw.centerZ;
// 轴向方向转欧拉角
AxialDirToEuler(screw.axialDirX, screw.axialDirY, screw.axialDirZ,
screw.rotateAngle,
screwOutput.roll, screwOutput.pitch, screwOutput.yaw);
output.screwOutputs.push_back(screwOutput);
}
return output;
}
ProtocolDetectionOutput DetectionOutputConverter::ConvertToolDiskResult(int cameraIndex)
{
ProtocolDetectionOutput output;
output.type = DETECTION_TYPE_TOOL_DISK;
output.success = false;
output.errorCode = -100;
output.message = "工具盘检测算法接口尚未实现";
output.cameraIndex = cameraIndex;
return output;
}
QJsonObject DetectionOutputConverter::ScrewOutputToJson(const ProtocolDetectionOutput& output)
{
QJsonObject response;
response["MessageType"] = "ScrewResult";
response["Timestamp"] = output.timestamp;
QJsonObject data;
data["Success"] = output.success;
data["ErrorCode"] = output.errorCode;
data["Message"] = output.message;
data["CameraIndex"] = output.cameraIndex;
QJsonArray screwArray;
for (const auto& screw : output.screwOutputs) {
QJsonObject screwObj;
screwObj["X"] = screw.x;
screwObj["Y"] = screw.y;
screwObj["Z"] = screw.z;
screwObj["Roll"] = screw.roll;
screwObj["Pitch"] = screw.pitch;
screwObj["Yaw"] = screw.yaw;
screwArray.append(screwObj);
}
data["Count"] = static_cast<int>(output.screwOutputs.size());
data["Screws"] = screwArray;
response["Data"] = data;
return response;
}
QJsonObject DetectionOutputConverter::ToolDiskOutputToJson(const ProtocolDetectionOutput& output)
{
QJsonObject response;
response["MessageType"] = "ToolResult";
response["Timestamp"] = output.timestamp;
QJsonObject data;
data["Success"] = output.success;
data["ErrorCode"] = output.errorCode;
data["Message"] = output.message;
data["CameraIndex"] = output.cameraIndex;
QJsonArray toolDiskArray;
for (const auto& toolDisk : output.toolDiskOutputs) {
QJsonObject obj;
obj["X"] = toolDisk.x;
obj["Y"] = toolDisk.y;
obj["Z"] = toolDisk.z;
obj["Roll"] = toolDisk.roll;
obj["Pitch"] = toolDisk.pitch;
obj["Yaw"] = toolDisk.yaw;
toolDiskArray.append(obj);
}
data["Count"] = static_cast<int>(output.toolDiskOutputs.size());
data["ToolDisks"] = toolDiskArray;
response["Data"] = data;
return response;
}
QJsonObject DetectionOutputConverter::ToJson(const ProtocolDetectionOutput& output)
{
if (output.type == DETECTION_TYPE_TOOL_DISK) {
return ToolDiskOutputToJson(output);
}
return ScrewOutputToJson(output);
}