22 std::vector<std::pair<double, Eigen::Vector3d>> trajectory;
23 std::pair<double, Eigen::Vector3d> onePose;
25 onePose.first = pose.time();
26 onePose.second = pose.position();
27 trajectory.push_back(onePose);
33 std::vector<std::pair<double, Eigen::Vector3d>> trajectory;
34 std::pair<double, Eigen::Vector3d> onePose;
36 onePose.first = pose.time();
37 onePose.second = pose.position();
38 trajectory.push_back(onePose);
57 if (trajectoryA.
poses().size() < trajectoryB.
poses().size()) {
58 std::swap(trajectoryA, trajectoryB);
63 int matchingIndexA = -1;
64 int lastMatchingIndexA = 0;
66 for (
const auto& poseB : trajectoryB.
poses()) {
68 double diff = std::numeric_limits<double>::max();
69 for (
auto it = trajectoryA.
poses().begin(); it != trajectoryA.
poses().end(); ++it) {
70 if ((abs(poseB.time() - it->time())) < diff && abs((poseB.time() - it->time())) < 0.1) {
71 diff = abs(poseB.time() - it->time());
72 matchingIndexA = indexA;
80 newTrajectoryA.
addPose(trajectoryA.
poses().at(matchingIndexA));
88 std::swap(newTrajectoryA, newTrajectoryB);
96 const int numberOfMeasurements = std::min(trajectoryA.
poses().size(), trajectoryB.
poses().size());
97 if (numberOfMeasurements < 2)
return false;
99 Eigen::MatrixXd posesA;
100 Eigen::MatrixXd posesB;
101 posesA.resize(3, numberOfMeasurements);
102 posesB.resize(3, numberOfMeasurements);
104 for (
unsigned i = 0; i < numberOfMeasurements; ++i) {
105 posesA.col(i) = trajectoryA.
poses().at(i).position();
106 posesB.col(i) = trajectoryB.
poses().at(i).position();
110 Eigen::Matrix4d transform = umeyama(posesB, posesA,
false);
111 returnTransform = Eigen::Isometry3d(transform);
113 <<
COLOR_END << returnTransform.matrix() << std::endl;
149 if (copyR3Trajectory.
poses().size() % 10 == 0) {
167 double startTime = std::max(copySe3Trajectory.
poses().front().time(), copyR3Trajectory.
poses().front().time());
168 double endTime = std::min(copySe3Trajectory.
poses().back().time(), copyR3Trajectory.
poses().back().time());
171 << copySe3Trajectory.
poses().size() <<
" / " << copyR3Trajectory.
poses().size() << std::endl;
177 <<
" Trajectories A and B after cutting of size and time: " <<
COLOR_END << copySe3Trajectory.
poses().size() <<
" / "
178 << copyR3Trajectory.
poses().size() << std::endl;
180 int downsampleFactor = 1;
181 if (copySe3Trajectory.
poses().size() > copyR3Trajectory.
poses().size()) {
182 downsampleFactor = std::floor(copySe3Trajectory.
poses().size() / copyR3Trajectory.
poses().size());
183 copySe3Trajectory.
downsample(downsampleFactor);
185 downsampleFactor = std::floor(copyR3Trajectory.
poses().size() / copySe3Trajectory.
poses().size());
186 copyR3Trajectory.
downsample(downsampleFactor);
192 << copySe3Trajectory.
poses().size() <<
" / " << copyR3Trajectory.
poses().size() << std::endl;
199 bool sizeDeviatesTooMuch = (std::abs(
static_cast<int>(copySe3Trajectory.
poses().size() - copyR3Trajectory.
poses().size())) >
200 0.1 * std::min(copySe3Trajectory.
poses().size(), copyR3Trajectory.
poses().size()));
202 if (sizeDeviatesTooMuch) {
205 <<
" Trajectories Associated, as after downsampling they were different in size." <<
COLOR_END << std::endl;
209 newSe3Trajectory = copySe3Trajectory;
210 newR3Trajectory = copyR3Trajectory;
212 <<
" Trajectories copied, as after downsampling they were similar in size." <<
COLOR_END << std::endl;
216 copySe3Trajectory = newSe3Trajectory;
217 copyR3Trajectory = newR3Trajectory;
218 Eigen::Isometry3d alignmentTransform;
221 std::cout <<
"TrajectoryAlignment::initializeYaw trajectoryAlignment failed." << std::endl;
227 Eigen::Matrix3d rotation = alignmentTransform.rotation();
228 double pitch = -asin(rotation(2, 0));
229 double roll = atan2(rotation(2, 1), rotation(2, 2));
230 yaw = atan2(rotation(1, 0) / cos(pitch), rotation(0, 0) / cos(pitch));
232 <<
"," << pitch * 180 / M_PI <<
"," << yaw * 180 / M_PI << std::endl;
234 returnTransform = alignmentTransform;