My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
ExcavatorEstimator.h
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#ifndef EXCAVATOR_ESTIMATOR_H
9#define EXCAVATOR_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// Workspace
29
30// Defined Macros
31#define NUM_GNSS_CALLBACKS_UNTIL_START 20
32#define GNSS_POSITION_COVARIANCE_VIOLATION_THRESHOLD 0.2 // 10000
33#define GNSS_HEADING_COVARIANCE_VIOLATION_THRESHOLD 1.0 // 10000
34
35namespace excavator_se {
36
38 public:
39 ExcavatorEstimator(std::shared_ptr<ros::NodeHandle> privateNodePtr);
40 // Destructor
42 // Setup
43 void setup();
44
45 protected:
46 // Methods ------------------------------------
47 void initializePublishers(ros::NodeHandle& privateNode) override;
48
49 void initializeSubscribers(ros::NodeHandle& privateNode) override;
50
51 void initializeMessages(ros::NodeHandle& privateNode) override;
52
53 void readParams(const ros::NodeHandle& privateNode) override;
54
55 // Publish State
56 virtual void publishState(
57 const std::shared_ptr<holistic_fusion::SafeIntegratedNavState>& preIntegratedNavStatePtr,
58 const std::shared_ptr<holistic_fusion::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr) override;
59
60 private:
61 // Callbacks
62 void lidarOdometryCallback_(const nav_msgs::Odometry::ConstPtr& lidar_odom_ptr);
63 void gnssCallback_(const sensor_msgs::NavSatFix::ConstPtr& leftGnssPtr, const sensor_msgs::NavSatFix::ConstPtr& rightGnssPtr);
64
65 // Members ----------------------------------
66 // Publishers
67 // Path
68 ros::Publisher pubMeasMapLioPath_;
69 ros::Publisher pubMeasWorldGnssLPath_;
70 ros::Publisher pubMeasWorldGnssRPath_;
71
72 // Messages
73 // Paths
74 nav_msgs::PathPtr measLio_mapImuPathPtr_;
75 nav_msgs::PathPtr measGnss_worldGnssLPathPtr_;
76 nav_msgs::PathPtr measGnss_worldGnssRPathPtr_;
77
78 // Subscribers
79 ros::Subscriber subImu_;
80 ros::Subscriber subLidarOdometry_;
81 message_filters::Subscriber<sensor_msgs::NavSatFix> subGnssLeft_;
82 message_filters::Subscriber<sensor_msgs::NavSatFix> subGnssRight_;
83 tf::TransformListener tfListener_;
84
85 // GNSS Sync Policy
86 typedef message_filters::sync_policies::ExactTime<sensor_msgs::NavSatFix, sensor_msgs::NavSatFix> GnssExactSyncPolicy;
87 boost::shared_ptr<message_filters::Synchronizer<GnssExactSyncPolicy>> gnssExactSyncPtr_; // ROS Exact Sync Policy Message Filter
88
89 // Time
90 std::chrono::time_point<std::chrono::high_resolution_clock> startTime_;
91 std::chrono::time_point<std::chrono::high_resolution_clock> currentTime_;
92
93 // GNSS Handler
94 std::shared_ptr<holistic_fusion::GnssHandler> gnssHandlerPtr_;
95
96 // Rates
97 double lioOdometryRate_ = 5.0;
98 double gnssRate_ = 20.0;
99
100 // Alignment Parameters
101 Eigen::Matrix<double, 6, 1> initialSe3AlignmentStdDev_ = 10 * Eigen::Matrix<double, 6, 1>::Ones();
102 Eigen::Matrix<double, 6, 1> lioSe3AlignmentRandomWalk_ = 0.01 * Eigen::Matrix<double, 6, 1>::Ones();
103
104 // Noise
105 Eigen::Matrix<double, 6, 1> lioPoseUnaryNoise_;
106 double gnssPositionUnaryNoise_ = 1.0; // in [m]
107 double gnssHeadingUnaryNoise_ = 1.0; // in [rad]
108
111 bool useLeftGnssFlag_ = true;
112 bool useRightGnssFlag_ = true;
113 bool useGnssYawFlag_ = true;
114};
115} // namespace excavator_se
116#endif // end EXCAVATOR_ESTIMATOR_H
void readParams(const ros::NodeHandle &privateNode) override
message_filters::Subscriber< sensor_msgs::NavSatFix > subGnssLeft_
Eigen::Matrix< double, 6, 1 > lioSe3AlignmentRandomWalk_
std::chrono::time_point< std::chrono::high_resolution_clock > currentTime_
Eigen::Matrix< double, 6, 1 > lioPoseUnaryNoise_
message_filters::sync_policies::ExactTime< sensor_msgs::NavSatFix, sensor_msgs::NavSatFix > GnssExactSyncPolicy
void initializeSubscribers(ros::NodeHandle &privateNode) override
virtual void publishState(const std::shared_ptr< holistic_fusion::SafeIntegratedNavState > &preIntegratedNavStatePtr, const std::shared_ptr< holistic_fusion::SafeNavStateWithCovarianceAndBias > &optimizedStateWithCovarianceAndBiasPtr) override
std::chrono::time_point< std::chrono::high_resolution_clock > startTime_
nav_msgs::PathPtr measGnss_worldGnssRPathPtr_
message_filters::Subscriber< sensor_msgs::NavSatFix > subGnssRight_
void gnssCallback_(const sensor_msgs::NavSatFix::ConstPtr &leftGnssPtr, const sensor_msgs::NavSatFix::ConstPtr &rightGnssPtr)
nav_msgs::PathPtr measGnss_worldGnssLPathPtr_
void initializePublishers(ros::NodeHandle &privateNode) override
Eigen::Matrix< double, 6, 1 > initialSe3AlignmentStdDev_
ExcavatorEstimator(std::shared_ptr< ros::NodeHandle > privateNodePtr)
void lidarOdometryCallback_(const nav_msgs::Odometry::ConstPtr &lidar_odom_ptr)
boost::shared_ptr< message_filters::Synchronizer< GnssExactSyncPolicy > > gnssExactSyncPtr_
void initializeMessages(ros::NodeHandle &privateNode) override
std::shared_ptr< holistic_fusion::GnssHandler > gnssHandlerPtr_