My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
Position3Estimator.h
Go to the documentation of this file.
1/*
2Copyright 2024 by Julian Nubert & Timon Mathis, Robotic Systems Lab & Autonomous 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#ifndef POSITION3_ESTIMATOR_H
9#define POSITION3_ESTIMATOR_H
10
11// std
12#include <chrono>
13
14// ROS
15#include <message_filters/subscriber.h>
16#include <message_filters/sync_policies/exact_time.h>
17#include <message_filters/synchronizer.h>
18#include <nav_msgs/Odometry.h>
19#include <nav_msgs/Path.h>
20#include <sensor_msgs/Imu.h>
21#include <sensor_msgs/NavSatFix.h>
22#include <tf/transform_listener.h>
23
24// Leica Position extension
25#include <geometry_msgs/PointStamped.h>
26
27// Workspace
32
33// Defined Macros
34#define POS_COVARIANCE_VIOLATION_THRESHOLD 0.2
35#define NUM_GNSS_CALLBACKS_UNTIL_START 20
36#define NUM_GNSS_CALLBACKS_UNTIL_YAW_INIT 300
37
38namespace position3_se {
39
41 public:
42 Position3Estimator(std::shared_ptr<ros::NodeHandle> privateNodePtr);
43 // Destructor
45 // Setup
46 void setup();
47
48 protected:
49 // Methods ------------------------------------
50 void initializePublishers(ros::NodeHandle& privateNode) override;
51
52 void initializeSubscribers(ros::NodeHandle& privateNode) override;
53
54 void initializeMessages(ros::NodeHandle& privateNode) override;
55
56 void initializeServices(ros::NodeHandle& privateNode) override;
57
58 void readParams(const ros::NodeHandle& privateNode) override;
59
60 // Callbacks
61 bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request& req,
62 holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response& res) override;
63
64 private:
65 // Callbacks
66 void prismPositionCallback_(const geometry_msgs::PointStamped::ConstPtr& leicaPositionPtr);
67 void gnssPositionCallback_(const sensor_msgs::NavSatFix::ConstPtr& gnssPositionPtr);
68 void gnssOfflinePoseCallback_(const nav_msgs::Odometry::ConstPtr& gnssOfflinePosePtr);
69
70 // Services
71 bool srvTogglePrismUnaryCallback_(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
72 bool srvToggleGnssUnaryCallback_(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
73 bool srvToggleGnssOfflinePoseUnaryCallback_(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
74
75 // Members ----------------------------------
76 // Publishers
77 // Path
81
82 // Messages
83 // Paths
87
88 // Services
89 // Trigger offline smoother optimization
90 ros::ServiceServer srvTogglePrismPositionUnary_;
91 ros::ServiceServer srvToggleGnssPositionUnary_;
93
94 // Subscribers
95 ros::Subscriber subPrismPosition_;
96 ros::Subscriber subGnssPosition_;
97 ros::Subscriber subGnssOfflinePose_;
98 // TF
99 tf::TransformListener tfListener_;
100
101 // Time
102 std::chrono::time_point<std::chrono::high_resolution_clock> startTime_;
103 std::chrono::time_point<std::chrono::high_resolution_clock> currentTime_;
104
105 // GNSS Handler
106 std::shared_ptr<holistic_fusion::GnssHandler> gnssHandlerPtr_;
107
108 // Alignment Parameters
109 Eigen::Matrix<double, 6, 1> initialSe3AlignmentNoise_ = 10 * Eigen::Matrix<double, 6, 1>::Ones();
110 Eigen::Matrix<double, 6, 1> gnssSe3AlignmentRandomWalk_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
111 Eigen::Matrix<double, 6, 1> prismSe3AlignmentRandomWalk_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
112
113 // Manual Alignment Handler
114 std::shared_ptr<holistic_fusion::TrajectoryAlignmentHandler> trajectoryAlignmentHandler_;
115
116 // Rates
117 double prismPositionRate_ = 20.0;
118 double gnssPositionRate_ = 10.0;
119 double gnssOfflinePoseRate_ = 10.0;
120
121 // Noise
122 double prismPositionMeasUnaryNoise_ = 1.0; // in [m]
123 double gnssPositionMeasUnaryNoise_ = 1.0; // in [m]
124 Eigen::Matrix<double, 6, 1> gnssOfflinePoseMeasUnaryNoise_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
125
126 // State Machine
128
129 // Variables
130 // PRISM
132 Eigen::Vector3d initialPrismPosition_ = Eigen::Vector3d::Zero(); // Initial Prism Position in meters
134 static constexpr double PRISM_MOVED_ENOUGH_THRESHOLD = 1.0; // in [m]
135 // GNSS
136 Eigen::Vector3d accumulatedGnssCoordinates_{0.0, 0.0, 0.0};
140 Eigen::Isometry3d T_totalStation_enu_ = Eigen::Isometry3d::Identity();
141 Eigen::Isometry3d T_totalStation_totalStationOld_ = Eigen::Isometry3d::Identity();
142
143 // Frames
145 std::string gnssReferenceFrame_ = "";
146
147 // Flags
148 static constexpr bool constexprUsePrismPositionUnaryFlag_ = true;
149 static constexpr bool constexprUseGnssPositionUnaryFlag_ = false;
150 static constexpr bool constexprUseGnssOfflinePoseUnaryFlag_ = true;
154};
155
156} // namespace position3_se
157
158#endif // end POSITION3_ESTIMATOR_H
Eigen::Isometry3d T_totalStation_totalStationOld_
Position3Estimator(std::shared_ptr< ros::NodeHandle > privateNodePtr)
nav_msgs::PathPtr measPosition_worldGnssPositionPathPtr_
bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request &req, holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response &res) override
void initializeMessages(ros::NodeHandle &privateNode) override
ros::ServiceServer srvToggleGnssPositionUnary_
std::chrono::time_point< std::chrono::high_resolution_clock > currentTime_
std::shared_ptr< holistic_fusion::GnssHandler > gnssHandlerPtr_
void initializeServices(ros::NodeHandle &privateNode) override
void gnssPositionCallback_(const sensor_msgs::NavSatFix::ConstPtr &gnssPositionPtr)
Eigen::Matrix< double, 6, 1 > gnssSe3AlignmentRandomWalk_
void initializePublishers(ros::NodeHandle &privateNode) override
void readParams(const ros::NodeHandle &privateNode) override
std::chrono::time_point< std::chrono::high_resolution_clock > startTime_
void gnssOfflinePoseCallback_(const nav_msgs::Odometry::ConstPtr &gnssOfflinePosePtr)
Eigen::Matrix< double, 6, 1 > gnssOfflinePoseMeasUnaryNoise_
void prismPositionCallback_(const geometry_msgs::PointStamped::ConstPtr &leicaPositionPtr)
Eigen::Matrix< double, 6, 1 > initialSe3AlignmentNoise_
ros::ServiceServer srvToggleGnssOfflinePoseUnary_
ros::ServiceServer srvTogglePrismPositionUnary_
std::shared_ptr< holistic_fusion::TrajectoryAlignmentHandler > trajectoryAlignmentHandler_
nav_msgs::PathPtr measPosition_worldGnssOfflinePosePathPtr_
Eigen::Matrix< double, 6, 1 > prismSe3AlignmentRandomWalk_
static constexpr bool constexprUseGnssPositionUnaryFlag_
static constexpr bool constexprUsePrismPositionUnaryFlag_
static constexpr double PRISM_MOVED_ENOUGH_THRESHOLD
nav_msgs::PathPtr measPosition_worldPrismPositionPathPtr_
bool srvToggleGnssOfflinePoseUnaryCallback_(std_srvs::Trigger::Request &req, std_srvs::Trigger::Response &res)
void initializeSubscribers(ros::NodeHandle &privateNode) override
static constexpr bool constexprUseGnssOfflinePoseUnaryFlag_
bool srvToggleGnssUnaryCallback_(std_srvs::Trigger::Request &req, std_srvs::Trigger::Response &res)
bool srvTogglePrismUnaryCallback_(std_srvs::Trigger::Request &req, std_srvs::Trigger::Response &res)