#pragma once
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <map>
#include <string>
#include <vector>
namespace g2o_reader {
struct Pose2D {
Eigen::Vector2d translation;
double rotation;
Pose2D() : translation(Eigen::Vector2d::Zero()), rotation(0.0) {}
Pose2D(double x, double y, double theta)
: translation(x, y), rotation(theta) {}
};
struct Pose3D {
Eigen::Quaterniond rotation;
Eigen::Vector3d translation;
Pose3D()
: rotation(Eigen::Quaterniond::Identity()),
translation(Eigen::Vector3d::Zero()) {}
Pose3D(const Eigen::Quaterniond& q, const Eigen::Vector3d& t)
: rotation(q), translation(t) {}
};
struct Constraint2D {
int id_begin;
int id_end;
Pose2D measurement;
Eigen::Matrix3d information;
Constraint2D() : id_begin(0), id_end(0), information(Eigen::Matrix3d::Identity()) {}
};
struct Constraint3D {
int id_begin;
int id_end;
Pose3D measurement;
Eigen::Matrix<double, 6, 6> information;
Constraint3D() : id_begin(0), id_end(0), information(Eigen::Matrix<double, 6, 6>::Identity()) {}
};
struct Graph2D {
std::map<int, Pose2D> poses;
std::vector<Constraint2D> constraints;
};
struct Graph3D {
std::map<int, Pose3D> poses;
std::vector<Constraint3D> constraints;
};
bool ReadG2oFile2D(const std::string& filename, Graph2D& graph);
bool ReadG2oFile3D(const std::string& filename, Graph3D& graph);
enum class GraphType { SE2, SE3, UNKNOWN };
GraphType DetectGraphType(const std::string& filename);
}