My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
GnssHandler.cpp
Go to the documentation of this file.
1/*
2Copyright 2024 by Julian Nubert, Robotic Systems Lab, ETH Zurich.
3All rights reserved.
4This file is released under the "BSD-3-Clause License".
5Please see the LICENSE file that has been included as part of this package.
6 */
7
8// C++
9#include <iostream>
10// Package
12
13namespace holistic_fusion {
14
15// Public -------------------------------------------------------------------
17 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Created Gnss Handler instance." << COLOR_END << std::endl;
18}
19
20void GnssHandler::initHandler(const Eigen::Vector3d& accumulatedLeftCoordinates, const Eigen::Vector3d& accumulatedRightCoordinates) {
21 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Initializing the handler." << COLOR_END << std::endl;
22
23 // Initialize Gnss converter
25 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Setting pre-defined reference." << COLOR_END << std::endl;
28 } else {
29 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Setting coordinate origin to current position." << COLOR_END
30 << std::endl;
31 gnssSensor_.setReference(accumulatedLeftCoordinates(0), accumulatedLeftCoordinates(1), accumulatedLeftCoordinates(2), 0.0);
32 }
33
34 // Get Positions
35 Eigen::Vector3d leftPosition, rightPosition;
36 convertNavSatToPositions(accumulatedLeftCoordinates, accumulatedRightCoordinates, leftPosition, rightPosition);
37
38 // Get heading (assuming that connection between antennas is perpendicular to heading)
39 Eigen::Vector3d W_t_heading = computeHeading_(leftPosition, rightPosition);
40 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Heading read from the Gnss is the following: " << W_t_heading << std::endl;
41
42 // Get initial global yaw
44 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Initial global yaw is: " << 180 / M_PI * globalAttitudeYaw_ << std::endl;
45}
46
47void GnssHandler::initHandler(const Eigen::Vector3d& accumulatedCoordinates) {
48 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Initializing the handler position." << COLOR_END << std::endl;
49
50 // Initialize Gnss converter
51 // Case 1: Use pre-defined reference
53 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Setting GNSS reference frame coordinate origin to pre-defined reference."
54 << COLOR_END << std::endl;
57 }
58 // Case 2: Use current position as reference
59 else {
60 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Setting GNSS reference frame coordinate origin to current position."
61 << COLOR_END << std::endl;
62 gnssSensor_.setReference(accumulatedCoordinates(0), accumulatedCoordinates(1), accumulatedCoordinates(2), 0.0);
63 std::cout << YELLOW_START << "GnssHandler" << GREEN_START << " Reference: " << accumulatedCoordinates.transpose() << COLOR_END
64 << std::endl;
65 }
66}
67
68void GnssHandler::convertNavSatToPositions(const Eigen::Vector3d& leftGnssCoordinate, const Eigen::Vector3d& rightGnssCoordinate,
69 Eigen::Vector3d& leftPosition, Eigen::Vector3d& rightPosition) {
71 leftPosition = gnssSensor_.gnssToCartesian(leftGnssCoordinate(0), leftGnssCoordinate(1), leftGnssCoordinate(2));
72
74 rightPosition = gnssSensor_.gnssToCartesian(rightGnssCoordinate(0), rightGnssCoordinate(1), rightGnssCoordinate(2));
75}
76
77void GnssHandler::convertNavSatToPosition(const Eigen::Vector3d& gnssCoordinate, Eigen::Vector3d& position) {
78 position = gnssSensor_.gnssToCartesian(gnssCoordinate(0), gnssCoordinate(1), gnssCoordinate(2));
79}
80
81// Heading is defined as the orthogonal vector pointing from gnssPos2 to gnssPos1, projected to x,y-plane
82// Hence, if left and right gnss, then gnssPos1=leftGnss, gnssPos2=rightGnss
83double GnssHandler::computeYaw(const Eigen::Vector3d& gnssPos1, const Eigen::Vector3d& gnssPos2) {
84 Eigen::Vector3d robotHeading = computeHeading_(gnssPos1, gnssPos2);
85 return computeYawFromHeadingVector_(robotHeading);
86}
87
88void GnssHandler::convertNavSatToPositionLV03(const Eigen::Vector3d& gnssCoordinate, Eigen::Vector3d& position) {
89 position = gnssSensor_.gnssToLv03(gnssCoordinate(0), gnssCoordinate(1), gnssCoordinate(2));
90}
91
92// Private ------------------------------------------------------------------
93
94// Heading is defined as the orthogonal vector pointing from gnssPos2 to gnssPos1, projected to x,y-plane
95Eigen::Vector3d GnssHandler::computeHeading_(const Eigen::Vector3d& gnssPos1, const Eigen::Vector3d& gnssPos2) {
96 // Compute connecting unity vector
97 Eigen::Vector3d W_t_GnssR_GnssL = (gnssPos1 - gnssPos2).normalized();
98
99 // Compute forward pointing vector
100 Eigen::Vector3d zUnityVector = Eigen::Vector3d::UnitZ();
101 Eigen::Vector3d W_t_heading = W_t_GnssR_GnssL.cross(zUnityVector).normalized();
102
103 return W_t_heading;
104}
105
106double GnssHandler::computeYawFromHeadingVector_(const Eigen::Vector3d& headingVector) {
107 return atan2(headingVector(1), headingVector(0));
108}
109
110} // namespace holistic_fusion
#define COLOR_END
#define GREEN_START
#define YELLOW_START
void convertNavSatToPosition(const Eigen::Vector3d &gnssCoordinate, Eigen::Vector3d &position)
static double computeYawFromHeadingVector_(const Eigen::Vector3d &headingVector)
void convertNavSatToPositionLV03(const Eigen::Vector3d &gnssCoordinate, Eigen::Vector3d &position)
Eigen::Vector3d computeHeading_(const Eigen::Vector3d &gnssPos1, const Eigen::Vector3d &gnssPos2)
void initHandler(const Eigen::Vector3d &accumulatedLeftCoordinates, const Eigen::Vector3d &accumulatedRightCoordinates)
double computeYaw(const Eigen::Vector3d &gnssPos1, const Eigen::Vector3d &gnssPos2)
void convertNavSatToPositions(const Eigen::Vector3d &leftGnssCoordinate, const Eigen::Vector3d &rightGnssCoordinate, Eigen::Vector3d &leftPosition, Eigen::Vector3d &rightPosition)