2025-01-04 04:12:51 +00:00
|
|
|
|
#include "utils/TransformPath.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <QFile>
|
|
|
|
|
|
#include <QTextStream>
|
2025-11-10 15:36:12 +00:00
|
|
|
|
#include <QRegExp>
|
2025-01-04 04:12:51 +00:00
|
|
|
|
|
|
|
|
|
|
#include "common/SpdLogger.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TransformPath::TransformPath(QObject* parent /*= nullptr*/)
|
|
|
|
|
|
: QObject(parent) {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformPath::TransformPath(std::vector<Transform> transforms, QObject* parent /*= nullptr*/)
|
|
|
|
|
|
: QObject(parent)
|
|
|
|
|
|
, transforms_(std::move(transforms)){
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformPath::~TransformPath() {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TransformPath* TransformPath::LoadFromFile(const QString& path, QObject* parent) {
|
2025-01-21 18:42:57 +00:00
|
|
|
|
LOG_INFO("Loading transform path from file: {}", path.toLocal8Bit().constData());
|
2025-01-04 04:12:51 +00:00
|
|
|
|
QFile file(path);
|
|
|
|
|
|
|
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
2025-01-05 15:12:58 +00:00
|
|
|
|
LOG_WARN("Cannot open file for reading: path:{} error:{}",
|
2025-01-07 18:37:28 +00:00
|
|
|
|
path.toLocal8Bit().constData(), file.errorString().toLocal8Bit().constData());
|
2025-01-04 04:12:51 +00:00
|
|
|
|
return nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QTextStream in(&file);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<Transform> transforms;
|
|
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
std::vector<double> times;
|
|
|
|
|
|
|
2025-01-04 04:12:51 +00:00
|
|
|
|
while (!in.atEnd()) {
|
2025-11-10 15:36:12 +00:00
|
|
|
|
QString line = in.readLine();
|
|
|
|
|
|
if (line.trimmed().isEmpty()) {
|
|
|
|
|
|
continue;
|
2025-01-04 04:12:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-10 15:36:12 +00:00
|
|
|
|
// 期望格式:时间 经度 纬度 高度 方位角(Heading) 俯仰角(Pitch) 翻滚角(Roll)
|
|
|
|
|
|
// 示例:0.700000 \t 119.500000 \t 24.500000 \t 1000.000000 \t 0.000000 \t 0.000000 \t 0.000000
|
|
|
|
|
|
const QStringList parts = line.split(QRegExp("\\s+"), Qt::SkipEmptyParts);
|
|
|
|
|
|
if (parts.size() < 7) {
|
|
|
|
|
|
LOG_WARN("TransformPath: invalid line (need 7 numbers): {}", line.toStdString());
|
|
|
|
|
|
return {};
|
2025-01-04 04:12:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-10 15:36:12 +00:00
|
|
|
|
bool ok = false;
|
|
|
|
|
|
const double time = parts[0].toDouble(&ok); if (!ok) { LOG_WARN("invalid time: {}", parts[0].toStdString()); return {}; }
|
|
|
|
|
|
const double longitude= parts[1].toDouble(&ok); if (!ok) { LOG_WARN("invalid longitude: {}", parts[1].toStdString()); return {}; }
|
|
|
|
|
|
const double latitude = parts[2].toDouble(&ok); if (!ok) { LOG_WARN("invalid latitude: {}", parts[2].toStdString()); return {}; }
|
|
|
|
|
|
const double altitude = parts[3].toDouble(&ok); if (!ok) { LOG_WARN("invalid altitude: {}", parts[3].toStdString()); return {}; }
|
|
|
|
|
|
const double heading = parts[4].toDouble(&ok); if (!ok) { LOG_WARN("invalid heading: {}", parts[4].toStdString()); return {}; }
|
|
|
|
|
|
const double pitch = parts[5].toDouble(&ok); if (!ok) { LOG_WARN("invalid pitch: {}", parts[5].toStdString()); return {}; }
|
|
|
|
|
|
const double roll = parts[6].toDouble(&ok); if (!ok) { LOG_WARN("invalid roll: {}", parts[6].toStdString()); return {}; }
|
|
|
|
|
|
|
|
|
|
|
|
Transform transform;
|
|
|
|
|
|
transform.GetLocation().set(longitude, latitude, altitude);
|
|
|
|
|
|
transform.GetRotation().set(pitch, roll, heading);
|
|
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
times.push_back(time);
|
2025-11-10 15:36:12 +00:00
|
|
|
|
|
2025-01-04 04:12:51 +00:00
|
|
|
|
transforms.push_back(transform);
|
|
|
|
|
|
}
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
TransformPath* tp = new TransformPath(std::move(transforms), parent);
|
|
|
|
|
|
tp->SetTimes(std::move(times));
|
|
|
|
|
|
return tp;
|
2025-01-04 04:12:51 +00:00
|
|
|
|
}
|