#include "utils/TransformPath.h" #include #include #include #include "common/SpdLogger.h" TransformPath::TransformPath(QObject* parent /*= nullptr*/) : QObject(parent) { } TransformPath::TransformPath(std::vector transforms, QObject* parent /*= nullptr*/) : QObject(parent) , transforms_(std::move(transforms)){ } TransformPath::~TransformPath() { } TransformPath* TransformPath::LoadFromFile(const QString& path, QObject* parent) { LOG_INFO("Loading transform path from file: {}", path.toLocal8Bit().constData()); QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { LOG_WARN("Cannot open file for reading: path:{} error:{}", path.toLocal8Bit().constData(), file.errorString().toLocal8Bit().constData()); return nullptr; } QTextStream in(&file); std::vector transforms; while (!in.atEnd()) { QString line = in.readLine(); if (line.trimmed().isEmpty()) { continue; } // 期望格式:时间 经度 纬度 高度 方位角(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 {}; } 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; // 位置映射:经度->x,纬度->y,高度->z transform.GetLocation().set(longitude, latitude, altitude); // 旋转向量采用代码库约定顺序(Pitch, Roll, Heading),与 OsgUtils::HPRToQuat/QuatToHPR 保持一致 transform.GetRotation().set(pitch, roll, heading); // 当前 PathComponent 使用 WorkSpace 的 Timestep 作为时间轴,这里暂不保存 time 字段 // 若未来需要按文件时间驱动,可扩展 TransformPath 结构以记录时间。 transforms.push_back(transform); } file.close(); return new TransformPath(std::move(transforms), parent); }