8#ifndef ANYMAL_ESTIMATOR_H
9#define ANYMAL_ESTIMATOR_H
15#include <geometry_msgs/Pose.h>
16#include <geometry_msgs/PoseWithCovarianceStamped.h>
17#include <message_filters/subscriber.h>
18#include <message_filters/sync_policies/exact_time.h>
19#include <message_filters/synchronizer.h>
20#include <nav_msgs/Odometry.h>
21#include <nav_msgs/Path.h>
22#include <sensor_msgs/Imu.h>
23#include <sensor_msgs/NavSatFix.h>
24#include <tf/transform_broadcaster.h>
25#include <tf/transform_listener.h>
26#include <visualization_msgs/MarkerArray.h>
29#include "holistic_fusion_anymal_msgs/AnymalState.h"
38#define NUM_GNSS_CALLBACKS_UNTIL_START 20
44 AnymalEstimator(
const std::shared_ptr<ros::NodeHandle>& privateNodePtr);
63 holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response& res)
override;
73 void leggedBetweenCallback_(
const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& leggedOdometryPoseKPtr);
84 std::chrono::time_point<std::chrono::high_resolution_clock>
startTime_;
85 std::chrono::time_point<std::chrono::high_resolution_clock>
currentTime_;
120 static constexpr std::array<const char*, 4>
legNames_ = {
"LF",
"RF",
"LH",
"RH"};
int leggedOdometryOdomCallbackCounter_
ros::Subscriber subGnssUnary_
Eigen::Isometry3d lio_T_M_Lkm1_
double gnssPositionOutlierThreshold_
Eigen::Matrix< double, 6, 1 > initialSe3AlignmentNoise_
Eigen::Matrix< double, 6, 1 > legPoseBetweenNoise_
nav_msgs::PathPtr measGnss_worldGnssPathPtr_
nav_msgs::PathPtr measLio_mapLidarPathPtr_
void leggedBetweenCallback_(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr &leggedOdometryPoseKPtr)
void initializePublishers(ros::NodeHandle &privateNode) override
ros::Publisher pubMeasMapLioPath_
ros::Subscriber subLeggedBetween_
void initializeSubscribers(ros::NodeHandle &privateNode) override
Eigen::Matrix< double, 3, 1 > legVelocityUnaryNoise_
void gnssUnaryCallback_(const sensor_msgs::NavSatFix::ConstPtr &gnssPtr)
double lidarBetweenTimeKm1_
void leggedVelocityUnaryCallback_(const nav_msgs::Odometry::ConstPtr &leggedOdometryKPtr)
bool useLeggedKinematicsFlag_
int lidarUnaryCallbackCounter_
double leggedOdometryVelocityRate_
int leggedOdometryPoseCallbackCounter_
ros::ServiceServer serverTransformGnssToEnu_
std::shared_ptr< holistic_fusion::GnssHandler > gnssHandlerPtr_
static constexpr long legInContactDebounceThreshold_
bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request &req, holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response &res) override
bool useLeggedVelocityUnaryFlag_
int leggedOdometryVelocityDownsampleFactor_
int leggedOdometryPoseDownsampleFactor_
AnymalEstimator(const std::shared_ptr< ros::NodeHandle > &privateNodePtr)
tf::TransformListener tfListener_
void leggedKinematicsCallback_(const holistic_fusion_anymal_msgs::AnymalState::ConstPtr &anymalStatePtr)
Eigen::Isometry3d T_O_Bl_km1_
void lidarBetweenCallback_(const nav_msgs::Odometry::ConstPtr &lidar_odom_ptr)
double leggedOdometryBetweenRate_
static constexpr std::array< const char *, 4 > legNames_
Eigen::Matrix< double, 3, 1 > legKinematicsFootPositionUnaryNoise_
void initializeMessages(ros::NodeHandle &privateNode) override
ros::Subscriber subLeggedKinematics_
int leggedKinematicsCallbackCounter_
std::shared_ptr< holistic_fusion::TrajectoryAlignmentHandler > trajectoryAlignmentHandler_
int leggedKinematicsDownsampleFactor_
std::vector< Eigen::Vector3d > optionalGnssEnuCoordinatesTrajectory_
std::vector< double > optionalGnssEnuCoordinatesTimeStamps_
std::chrono::time_point< std::chrono::high_resolution_clock > currentTime_
std::array< long, legNames_.size()> legInContactForNSteps_
double legOdometryTimeKm1_
ros::Subscriber subLioBetween_
double leggedKinematicsRate_
Eigen::Matrix< double, 6, 1 > lioSe3AlignmentRandomWalk_
Eigen::Vector3d accumulatedGnssCoordinates_
void readParams(const ros::NodeHandle &privateNode) override
ros::Publisher pubMeasWorldGnssPath_
ros::Subscriber subLeggedVelocityUnary_
Eigen::Matrix< double, 6, 1 > lioPoseUnaryNoise_
void initializeServices_(ros::NodeHandle &privateNode)
ros::Subscriber subLioUnary_
void lidarUnaryCallback_(const nav_msgs::Odometry::ConstPtr &lidar_odom_ptr)
ros::Publisher pubFootContactMarkers_
std::array< long, legNames_.size()> legTotalContactsCounter_
Eigen::Matrix< double, 6, 1 > lioPoseBetweenNoise_
std::chrono::time_point< std::chrono::high_resolution_clock > startTime_
int lidarBetweenCallbackCounter_
bool useLeggedBetweenFlag_
static constexpr bool logOptionalGnssEnuCoordinatesFlag_
~AnymalEstimator()=default
ros::NodeHandle privateNode