GrabBag/App/DiscHolePose/DiscHolePoseConfig/Src/DetectionOutputConverter.cpp

142 lines
4.2 KiB
C++
Raw 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 "IYDiscHolePoseStatus.h"
#include <cmath>
#include <QJsonArray>
#include <QJsonObject>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
// 从法向量计算欧拉角pitch/yaw 由法向量方向确定roll 设为 0
void DetectionOutputConverter::NormalDirToEuler(double nx, double ny, double nz,
double& roll, double& pitch, double& yaw)
{
roll = 0.0;
const double xyLen = std::sqrt(nx * nx + ny * ny);
// pitch 由 z 分量与水平面夹角确定
pitch = std::atan2(-nz, xyLen) * 180.0 / M_PI;
// yaw 由 x/y 分量确定
yaw = std::atan2(ny, nx) * 180.0 / M_PI;
}
ProtocolDetectionOutput DetectionOutputConverter::ConvertDiscHoleResult(
const std::vector<DiscHoleInfo>& discHoleInfoList,
bool success,
int errorCode,
const QString& message,
int cameraIndex)
{
ProtocolDetectionOutput output;
output.type = DETECTION_TYPE_DISC_HOLE;
output.success = success;
output.errorCode = errorCode;
output.message = message;
output.cameraIndex = cameraIndex;
for (const auto& hole : discHoleInfoList) {
DiscHoleDetectOutput holeOutput;
holeOutput.x = hole.centerX;
holeOutput.y = hole.centerY;
holeOutput.z = hole.centerZ;
NormalDirToEuler(hole.normDirX, hole.normDirY, hole.normDirZ,
holeOutput.roll, holeOutput.pitch, holeOutput.yaw);
output.discHoleOutputs.push_back(holeOutput);
}
return output;
}
ProtocolDetectionOutput DetectionOutputConverter::ConvertDiscRackResult(
const std::vector<DiscRackInfo>& discRackInfoList,
bool success,
int errorCode,
const QString& message,
int cameraIndex)
{
ProtocolDetectionOutput output;
output.type = DETECTION_TYPE_DISC_RACK;
output.success = success;
output.errorCode = errorCode;
output.message = message;
output.cameraIndex = cameraIndex;
for (const auto& rack : discRackInfoList) {
DiscRackDetectOutput rackOutput;
rackOutput.x = rack.centerX;
rackOutput.y = rack.centerY;
rackOutput.z = rack.centerZ;
rackOutput.roll = rack.roll;
rackOutput.pitch = rack.pitch;
rackOutput.yaw = rack.yaw;
output.discRackOutputs.push_back(rackOutput);
}
return output;
}
QJsonObject DetectionOutputConverter::DiscHoleOutputToJson(const DiscHoleDetectOutput& output)
{
QJsonObject obj;
obj["X"] = output.x;
obj["Y"] = output.y;
obj["Z"] = output.z;
obj["Roll"] = output.roll;
obj["Pitch"] = output.pitch;
obj["Yaw"] = output.yaw;
return obj;
}
QJsonObject DetectionOutputConverter::DiscRackOutputToJson(const DiscRackDetectOutput& output)
{
QJsonObject obj;
obj["X"] = output.x;
obj["Y"] = output.y;
obj["Z"] = output.z;
obj["Roll"] = output.roll;
obj["Pitch"] = output.pitch;
obj["Yaw"] = output.yaw;
return obj;
}
QJsonObject DetectionOutputConverter::ToJson(const ProtocolDetectionOutput& output)
{
QJsonObject response;
if (output.type == DETECTION_TYPE_DISC_RACK) {
response["MessageType"] = "DiscRackResult";
QJsonObject data;
data["Success"] = output.success;
data["ErrorCode"] = output.errorCode;
data["Message"] = output.message;
data["CameraIndex"] = output.cameraIndex;
QJsonArray arr;
for (const auto& r : output.discRackOutputs) {
arr.append(DiscRackOutputToJson(r));
}
data["Count"] = static_cast<int>(output.discRackOutputs.size());
data["DiscRacks"] = arr;
response["Data"] = data;
} else {
response["MessageType"] = "DiscHoleResult";
QJsonObject data;
data["Success"] = output.success;
data["ErrorCode"] = output.errorCode;
data["Message"] = output.message;
data["CameraIndex"] = output.cameraIndex;
QJsonArray arr;
for (const auto& h : output.discHoleOutputs) {
arr.append(DiscHoleOutputToJson(h));
}
data["Count"] = static_cast<int>(output.discHoleOutputs.size());
data["DiscHoles"] = arr;
response["Data"] = data;
}
response["Timestamp"] = output.timestamp;
return response;
}