My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
HolisticFusionRos.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 HOLISTICFUSIONROS_H
9#define HOLISTICFUSIONROS_H
10
11// std
12#include <chrono>
13
14// ROS
15#include <geometry_msgs/PoseWithCovarianceStamped.h>
16#include <nav_msgs/Odometry.h>
17#include <nav_msgs/Path.h>
18#include <ros/ros.h>
19#include <sensor_msgs/Imu.h>
20#include <std_srvs/Trigger.h>
21#include <tf/transform_broadcaster.h>
22#include <visualization_msgs/Marker.h>
23#include <visualization_msgs/MarkerArray.h>
24
25// Workspace
29#include "holistic_fusion_ros_msgs/OfflineOptimizationTrigger.h"
30
31// Macros
32#define ROS_QUEUE_SIZE 1
33#define NUM_KEEP_MARKER_NAMES 10 // Simply used to detect duplications (with 4 legs 10 is enough)
34#define NUM_MARKERS_IN_ARRAY 1000 // Actual number of markers in array
35
36namespace holistic_fusion {
37
39 public:
40 explicit HolisticFusionRos(const std::shared_ptr<ros::NodeHandle>& privateNodePtr);
41 // Destructor
42 ~HolisticFusionRos() override = default;
43
44 // Setup
45 void setup(const std::shared_ptr<StaticTransforms> staticTransformsPtr);
46
47 protected:
48 // Functions that need implementation
49 virtual void initializePublishers(ros::NodeHandle& privateNode);
50 virtual void initializeSubscribers(ros::NodeHandle& privateNode);
51 virtual void initializeMessages(ros::NodeHandle& privateNode);
52 virtual void initializeServices(ros::NodeHandle& privateNode);
53
54 // Parameter Loading -----------------------------------
55 virtual void readParams(const ros::NodeHandle& privateNode);
56
57 // Commodity Functions to be shared -----------------------------------
58
59 // Static
60 // Add to Topics
61 static void addToPathMsg(const nav_msgs::PathPtr& pathPtr, const std::string& frameName, const ros::Time& stamp, const Eigen::Vector3d& t,
62 int maxBufferLength);
63 static void addToOdometryMsg(const nav_msgs::OdometryPtr& msgPtr, const std::string& fixedFrame, const std::string& movingFrame,
64 const ros::Time& stamp, const Eigen::Isometry3d& T, const Eigen::Vector3d& W_v_W_F,
65 const Eigen::Vector3d& W_w_W_F,
66 const Eigen::Matrix<double, 6, 6>& poseCovariance = Eigen::Matrix<double, 6, 6>::Zero(),
67 const Eigen::Matrix<double, 6, 6>& twistCovariance = Eigen::Matrix<double, 6, 6>::Zero());
69 const geometry_msgs::PoseWithCovarianceStampedPtr& msgPtr, const std::string& frameName, const ros::Time& stamp,
70 const Eigen::Isometry3d& T, const Eigen::Matrix<double, 6, 6>& transformCovariance = Eigen::Matrix<double, 6, 6>::Zero());
71 static void addToLandmarkMarkerArrayMsg(const visualization_msgs::MarkerArrayPtr& markerArrayPtr, const std::string& referenceFrameName,
72 const ros::Time& stamp, const Eigen::Isometry3d& T_R_L, const std::string& transformName);
73
74 // Extract from State
76 Eigen::Matrix<double, 6, 6>& poseCovarianceRos, Eigen::Matrix<double, 6, 6>& twistCovarianceRos,
77 const std::shared_ptr<holistic_fusion::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr);
78 // Markers
79 static void createVelocityMarker(const std::string& referenceFrameName, const ros::Time& stamp, const Eigen::Vector3d& velocity,
80 const Eigen::Vector3d& colorRgb, visualization_msgs::Marker& marker);
81 static void createContactMarker(const std::string& referenceFrameName, const ros::Time& stamp, const Eigen::Vector3d& position,
82 const std::string& nameSpace, const int id, const Eigen::Vector3d& colorRgb,
83 visualization_msgs::Marker& marker);
84
85 // Callbacks
86 virtual void imuCallback(const sensor_msgs::Imu::ConstPtr& imuPtr);
87
88 // Services
89 virtual bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request& req,
90 holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response& res);
91 bool srvLogRealTimeNavStatesCallback(std_srvs::Trigger::Request& req, std_srvs::Trigger::Response& res);
92
93 // Publishing -----------------------------------
94 // Higher Level Functions
95 virtual void publishState(const std::shared_ptr<holistic_fusion::SafeIntegratedNavState>& integratedNavStatePtr,
96 const std::shared_ptr<holistic_fusion::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr);
98 const Eigen::Matrix<double, 6, 6> poseCovarianceRos, const Eigen::Matrix<double, 6, 6> twistCovarianceRos,
99 const Eigen::Vector3d positionVarianceRos, const Eigen::Vector3d orientationVarianceRos,
100 const std::shared_ptr<const holistic_fusion::SafeIntegratedNavState> integratedNavStatePtr,
101 const std::shared_ptr<const holistic_fusion::SafeNavStateWithCovarianceAndBias> optimizedStateWithCovarianceAndBiasPtr);
103 const std::shared_ptr<const holistic_fusion::SafeNavStateWithCovarianceAndBias> optimizedStateWithCovarianceAndBiasPtr,
104 const Eigen::Matrix<double, 6, 6>& poseCovarianceRos, const Eigen::Matrix<double, 6, 6>& twistCovarianceRos);
105
106 // Lower Level Functions
107 void publishTfTreeTransform(const std::string& frameName, const std::string& childFrameName, double timeStamp,
108 const Eigen::Isometry3d& T_frame_childFrame);
109 void publishImuOdoms(const std::shared_ptr<const holistic_fusion::SafeIntegratedNavState>& preIntegratedNavStatePtr,
110 const Eigen::Matrix<double, 6, 6>& poseCovarianceRos, const Eigen::Matrix<double, 6, 6>& twistCovarianceRos) const;
111 void publishDiagVarianceVectors(const Eigen::Vector3d& posVarianceRos, const Eigen::Vector3d& rotVarianceRos,
112 const double timeStamp) const;
113 void publishVelocityMarkers(const std::shared_ptr<const holistic_fusion::SafeIntegratedNavState>& navStatePtr) const;
114 void publishImuPaths(const std::shared_ptr<const holistic_fusion::SafeIntegratedNavState>& navStatePtr) const;
115 void publishAddedImuMeas(const Eigen::Matrix<double, 6, 1>& addedImuMeas, const ros::Time& stamp) const;
116
117 // Measure time
118 long secondsSinceStart();
119
120 // Node
121 ros::NodeHandle privateNode;
122
123 // Time
124 std::chrono::time_point<std::chrono::high_resolution_clock> startTime;
125 std::chrono::time_point<std::chrono::high_resolution_clock> currentTime;
126
127 // Publishers
128 // TF
129 tf::TransformBroadcaster tfBroadcaster;
130
131 // Members
132 std::string referenceFrameAlignedNameId = "_holistic_fusion_aligned";
133 std::string sensorFrameCorrectedNameId = "_holistic_fusion_corrected";
135
136 private:
137 // Publishers
138 // Odometry
139 ros::Publisher pubEstOdomImu_;
140 ros::Publisher pubEstWorldImu_;
141 ros::Publisher pubOptWorldImu_;
142 // Vector3 Variances
145 // Velocity Markers
146 ros::Publisher pubVelocityMarker_;
147 // Path
148 ros::Publisher pubEstOdomImuPath_;
149 ros::Publisher pubEstWorldImuPath_;
150 ros::Publisher pubOptWorldImuPath_;
154 // Imu Bias
155 ros::Publisher pubAccelBias_;
156 ros::Publisher pubGyroBias_;
157 // Added Imu Measurements
158 ros::Publisher pubAddedImuMeas_;
159
160 // PoseStamped --> Needs to be dynamic as we do not know the number of sensors
161 std::map<std::string, ros::Publisher> pubPoseStampedByTopicMap_ = {};
162
163 // Landmarks in Marker Array
164 ros::Publisher pubLandmarks_;
165
166 // Subscribers
167 ros::Subscriber subImu_;
168
169 // Messages
170 // Odometry
171 nav_msgs::OdometryPtr estOdomImuMsgPtr_;
172 nav_msgs::OdometryPtr estWorldImuMsgPtr_;
173 nav_msgs::OdometryPtr optWorldImuMsgPtr_;
174 // Vector3 Variances
175 geometry_msgs::Vector3StampedPtr estWorldPosVarianceMsgPtr_;
176 geometry_msgs::Vector3StampedPtr estWorldRotVarianceMsgPtr_;
177 // Path
178 // Estimated
179 nav_msgs::PathPtr estOdomImuPathPtr_;
180 nav_msgs::PathPtr estWorldImuPathPtr_;
181 nav_msgs::PathPtr optWorldImuPathPtr_;
182 // Measured
183 nav_msgs::PathPtr measWorldLidarPathPtr_;
184 // Imu Bias
185 geometry_msgs::Vector3StampedPtr accelBiasMsgPtr_;
186 geometry_msgs::Vector3StampedPtr gyroBiasMsgPtr_;
187 // Marker Array
188 visualization_msgs::MarkerArrayPtr landmarkMarkersMsgPtr_;
189
190 // Services
191 // Trigger offline smoother optimization
192 ros::ServiceServer srvSmootherOptimize_;
193 // Log Real-Time States
194 ros::ServiceServer srvLogRealTimeNavStates_;
195
196 // Last Optimized State Timestamp
198
199 // Mutex
201};
202} // namespace holistic_fusion
203
204#endif // end HOLISTICFUSIONROS_H
static void addToLandmarkMarkerArrayMsg(const visualization_msgs::MarkerArrayPtr &markerArrayPtr, const std::string &referenceFrameName, const ros::Time &stamp, const Eigen::Isometry3d &T_R_L, const std::string &transformName)
virtual bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request &req, holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response &res)
std::chrono::time_point< std::chrono::high_resolution_clock > startTime
static void createVelocityMarker(const std::string &referenceFrameName, const ros::Time &stamp, const Eigen::Vector3d &velocity, const Eigen::Vector3d &colorRgb, visualization_msgs::Marker &marker)
bool srvLogRealTimeNavStatesCallback(std_srvs::Trigger::Request &req, std_srvs::Trigger::Response &res)
void setup(const std::shared_ptr< StaticTransforms > staticTransformsPtr)
virtual void initializeServices(ros::NodeHandle &privateNode)
std::chrono::time_point< std::chrono::high_resolution_clock > currentTime
static void addToPathMsg(const nav_msgs::PathPtr &pathPtr, const std::string &frameName, const ros::Time &stamp, const Eigen::Vector3d &t, int maxBufferLength)
visualization_msgs::MarkerArrayPtr landmarkMarkersMsgPtr_
void publishOptimizedStateAndBias(const std::shared_ptr< const holistic_fusion::SafeNavStateWithCovarianceAndBias > optimizedStateWithCovarianceAndBiasPtr, const Eigen::Matrix< double, 6, 6 > &poseCovarianceRos, const Eigen::Matrix< double, 6, 6 > &twistCovarianceRos)
void publishImuOdoms(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &preIntegratedNavStatePtr, const Eigen::Matrix< double, 6, 6 > &poseCovarianceRos, const Eigen::Matrix< double, 6, 6 > &twistCovarianceRos) const
geometry_msgs::Vector3StampedPtr estWorldPosVarianceMsgPtr_
std::map< std::string, ros::Publisher > pubPoseStampedByTopicMap_
static void addToOdometryMsg(const nav_msgs::OdometryPtr &msgPtr, const std::string &fixedFrame, const std::string &movingFrame, const ros::Time &stamp, const Eigen::Isometry3d &T, const Eigen::Vector3d &W_v_W_F, const Eigen::Vector3d &W_w_W_F, const Eigen::Matrix< double, 6, 6 > &poseCovariance=Eigen::Matrix< double, 6, 6 >::Zero(), const Eigen::Matrix< double, 6, 6 > &twistCovariance=Eigen::Matrix< double, 6, 6 >::Zero())
void publishVelocityMarkers(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &navStatePtr) const
virtual void initializeSubscribers(ros::NodeHandle &privateNode)
static void createContactMarker(const std::string &referenceFrameName, const ros::Time &stamp, const Eigen::Vector3d &position, const std::string &nameSpace, const int id, const Eigen::Vector3d &colorRgb, visualization_msgs::Marker &marker)
geometry_msgs::Vector3StampedPtr estWorldRotVarianceMsgPtr_
static void extractCovariancesFromOptimizedState(Eigen::Matrix< double, 6, 6 > &poseCovarianceRos, Eigen::Matrix< double, 6, 6 > &twistCovarianceRos, const std::shared_ptr< holistic_fusion::SafeNavStateWithCovarianceAndBias > &optimizedStateWithCovarianceAndBiasPtr)
virtual void readParams(const ros::NodeHandle &privateNode)
geometry_msgs::Vector3StampedPtr gyroBiasMsgPtr_
virtual void initializePublishers(ros::NodeHandle &privateNode)
virtual void imuCallback(const sensor_msgs::Imu::ConstPtr &imuPtr)
void publishNonTimeCriticalData(const Eigen::Matrix< double, 6, 6 > poseCovarianceRos, const Eigen::Matrix< double, 6, 6 > twistCovarianceRos, const Eigen::Vector3d positionVarianceRos, const Eigen::Vector3d orientationVarianceRos, const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > integratedNavStatePtr, const std::shared_ptr< const holistic_fusion::SafeNavStateWithCovarianceAndBias > optimizedStateWithCovarianceAndBiasPtr)
~HolisticFusionRos() override=default
virtual void initializeMessages(ros::NodeHandle &privateNode)
void publishTfTreeTransform(const std::string &frameName, const std::string &childFrameName, double timeStamp, const Eigen::Isometry3d &T_frame_childFrame)
void publishDiagVarianceVectors(const Eigen::Vector3d &posVarianceRos, const Eigen::Vector3d &rotVarianceRos, const double timeStamp) const
HolisticFusionRos(const std::shared_ptr< ros::NodeHandle > &privateNodePtr)
static void addToPoseWithCovarianceStampedMsg(const geometry_msgs::PoseWithCovarianceStampedPtr &msgPtr, const std::string &frameName, const ros::Time &stamp, const Eigen::Isometry3d &T, const Eigen::Matrix< double, 6, 6 > &transformCovariance=Eigen::Matrix< double, 6, 6 >::Zero())
void publishAddedImuMeas(const Eigen::Matrix< double, 6, 1 > &addedImuMeas, const ros::Time &stamp) const
virtual void publishState(const std::shared_ptr< holistic_fusion::SafeIntegratedNavState > &integratedNavStatePtr, const std::shared_ptr< holistic_fusion::SafeNavStateWithCovarianceAndBias > &optimizedStateWithCovarianceAndBiasPtr)
void publishImuPaths(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &navStatePtr) const
geometry_msgs::Vector3StampedPtr accelBiasMsgPtr_
tf::TransformBroadcaster tfBroadcaster