8#ifndef HOLISTICFUSIONROS_H
9#define HOLISTICFUSIONROS_H
15#include <geometry_msgs/PoseWithCovarianceStamped.h>
16#include <nav_msgs/Odometry.h>
17#include <nav_msgs/Path.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>
29#include "holistic_fusion_ros_msgs/OfflineOptimizationTrigger.h"
32#define ROS_QUEUE_SIZE 1
33#define NUM_KEEP_MARKER_NAMES 10
34#define NUM_MARKERS_IN_ARRAY 1000
40 explicit HolisticFusionRos(
const std::shared_ptr<ros::NodeHandle>& privateNodePtr);
45 void setup(
const std::shared_ptr<StaticTransforms> staticTransformsPtr);
61 static void addToPathMsg(
const nav_msgs::PathPtr& pathPtr,
const std::string& frameName,
const ros::Time& stamp,
const Eigen::Vector3d& t,
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);
76 Eigen::Matrix<double, 6, 6>& poseCovarianceRos, Eigen::Matrix<double, 6, 6>& twistCovarianceRos,
77 const std::shared_ptr<holistic_fusion::SafeNavStateWithCovarianceAndBias>& optimizedStateWithCovarianceAndBiasPtr);
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);
86 virtual void imuCallback(
const sensor_msgs::Imu::ConstPtr& imuPtr);
90 holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response& res);
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);
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;
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;
124 std::chrono::time_point<std::chrono::high_resolution_clock>
startTime;
125 std::chrono::time_point<std::chrono::high_resolution_clock>
currentTime;
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)
nav_msgs::OdometryPtr optWorldImuMsgPtr_
ros::Publisher pubVelocityMarker_
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)
ros::ServiceServer srvSmootherOptimize_
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
nav_msgs::PathPtr measWorldLidarPathPtr_
ros::Publisher pubAddedImuMeas_
nav_msgs::PathPtr estWorldImuPathPtr_
ros::Publisher pubEstOdomImu_
std::string sensorFrameCorrectedNameId
nav_msgs::OdometryPtr estWorldImuMsgPtr_
nav_msgs::OdometryPtr estOdomImuMsgPtr_
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())
nav_msgs::PathPtr estOdomImuPathPtr_
ros::Publisher pubEstWorldRotVariance_
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)
ros::Publisher pubOptWorldImu_
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)
std::string referenceFrameAlignedNameId
std::string optimizationResultLoggingPath
ros::Publisher pubOptWorldImuPath_
ros::Publisher pubMeasWorldLidarPath_
ros::Publisher pubEstWorldImuPath_
ros::Publisher pubMeasWorldGnssLPath_
ros::Publisher pubLandmarks_
geometry_msgs::Vector3StampedPtr gyroBiasMsgPtr_
ros::NodeHandle privateNode
nav_msgs::PathPtr optWorldImuPathPtr_
virtual void initializePublishers(ros::NodeHandle &privateNode)
virtual void imuCallback(const sensor_msgs::Imu::ConstPtr &imuPtr)
ros::Publisher pubEstWorldPosVariance_
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
ros::Publisher pubEstOdomImuPath_
ros::Publisher pubEstWorldImu_
virtual void initializeMessages(ros::NodeHandle &privateNode)
ros::Publisher pubMeasWorldGnssRPath_
ros::ServiceServer srvLogRealTimeNavStates_
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)
ros::Publisher pubGyroBias_
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)
double lastOptimizedStateTimestamp_
ros::Publisher pubAccelBias_
std::mutex rosPublisherMutex_
void publishImuPaths(const std::shared_ptr< const holistic_fusion::SafeIntegratedNavState > &navStatePtr) const
geometry_msgs::Vector3StampedPtr accelBiasMsgPtr_
tf::TransformBroadcaster tfBroadcaster