My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
AnymalEstimator.h
Go to the documentation of this file.
1/*
2Copyright 2022 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 ANYMAL_ESTIMATOR_H
9#define ANYMAL_ESTIMATOR_H
10
11// std
12#include <chrono>
13
14// ROS
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>
27
28// Custom Messages
29#include "holistic_fusion_anymal_msgs/AnymalState.h"
30
31// Workspace
36
37// Defined Macros
38#define NUM_GNSS_CALLBACKS_UNTIL_START 20
39
40namespace anymal_se {
41
43 public:
44 AnymalEstimator(const std::shared_ptr<ros::NodeHandle>& privateNodePtr);
45 // Destructor
46 ~AnymalEstimator() = default;
47
48 // Setup
49 void setup();
50
51 protected:
52 // Virtual Functions
53 void initializePublishers(ros::NodeHandle& privateNode) override;
54 void initializeSubscribers(ros::NodeHandle& privateNode) override;
55 void initializeMessages(ros::NodeHandle& privateNode) override;
56 void initializeServices_(ros::NodeHandle& privateNode);
57
58 // Parameter Loading
59 void readParams(const ros::NodeHandle& privateNode) override;
60
61 // Callbacks
62 bool srvOfflineSmootherOptimizeCallback(holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Request& req,
63 holistic_fusion_ros_msgs::OfflineOptimizationTrigger::Response& res) override;
64
65 private:
66 // Callbacks
67 // LIO
68 void lidarUnaryCallback_(const nav_msgs::Odometry::ConstPtr& lidar_odom_ptr);
69 void lidarBetweenCallback_(const nav_msgs::Odometry::ConstPtr& lidar_odom_ptr);
70 // GNSS
71 void gnssUnaryCallback_(const sensor_msgs::NavSatFix::ConstPtr& gnssPtr);
72 // Legged
73 void leggedBetweenCallback_(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& leggedOdometryPoseKPtr);
74 void leggedVelocityUnaryCallback_(const nav_msgs::Odometry::ConstPtr& leggedOdometryKPtr);
75 void leggedKinematicsCallback_(const holistic_fusion_anymal_msgs::AnymalState::ConstPtr& anymalStatePtr);
76
77 // GNSS Handler
78 std::shared_ptr<holistic_fusion::GnssHandler> gnssHandlerPtr_;
79
80 // TrajectoryAlignment Handler
81 std::shared_ptr<holistic_fusion::TrajectoryAlignmentHandler> trajectoryAlignmentHandler_;
82
83 // Time
84 std::chrono::time_point<std::chrono::high_resolution_clock> startTime_;
85 std::chrono::time_point<std::chrono::high_resolution_clock> currentTime_;
86
87 // Config -------------------------------------
88
89 // Rates
90 double lioOdometryRate_ = 5.0;
95 double leggedKinematicsRate_ = 400.0;
97 double gnssRate_ = 10.0;
98
99 // Flags
100 bool useGnssUnaryFlag_ = false;
101 bool useLioUnaryFlag_ = true;
102 bool useLioBetweenFlag_ = false;
106
107 // Alignment Parameters
108 Eigen::Matrix<double, 6, 1> initialSe3AlignmentNoise_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
109 Eigen::Matrix<double, 6, 1> lioSe3AlignmentRandomWalk_ = 0.0 * Eigen::Matrix<double, 6, 1>::Ones();
110
111 // Noise
113 Eigen::Matrix<double, 6, 1> lioPoseUnaryNoise_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
114 Eigen::Matrix<double, 6, 1> lioPoseBetweenNoise_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
115 Eigen::Matrix<double, 6, 1> legPoseBetweenNoise_ = 1.0 * Eigen::Matrix<double, 6, 1>::Ones();
116 Eigen::Matrix<double, 3, 1> legVelocityUnaryNoise_ = 1.0 * Eigen::Matrix<double, 3, 1>::Ones();
117 Eigen::Matrix<double, 3, 1> legKinematicsFootPositionUnaryNoise_ = 1.0 * Eigen::Matrix<double, 3, 1>::Ones();
118
119 // Leg Odometry Handling
120 static constexpr std::array<const char*, 4> legNames_ = {"LF", "RF", "LH", "RH"};
121 std::array<long, legNames_.size()> legInContactForNSteps_ = {0, 0, 0, 0};
122 std::array<long, legNames_.size()> legTotalContactsCounter_ = {0, 0, 0, 0};
123 static constexpr long legInContactDebounceThreshold_ = 3;
124
125 // Callback Members ----------------------------
126 // GNSS
127 Eigen::Vector3d accumulatedGnssCoordinates_{0.0, 0.0, 0.0};
129 std::vector<Eigen::Vector3d> optionalGnssEnuCoordinatesTrajectory_;
131 static constexpr bool logOptionalGnssEnuCoordinatesFlag_ = false;
132 // LIO
133 // Unary
135 // Between
138 Eigen::Isometry3d lio_T_M_Lkm1_ = Eigen::Isometry3d::Identity();
139 // Legged
143 Eigen::Isometry3d T_O_Bl_km1_ = Eigen::Isometry3d::Identity(); // Odometry is in body frame
145
146 // ROS Objects ----------------------------
147
148 // Subscribers
149 // Instances
150 ros::Subscriber subGnssUnary_;
151 ros::Subscriber subLioUnary_;
152 ros::Subscriber subLioBetween_;
153 ros::Subscriber subLeggedBetween_;
154 ros::Subscriber subLeggedVelocityUnary_;
155 ros::Subscriber subLeggedKinematics_;
156 tf::TransformListener tfListener_;
157
158 // Publishers
159 // Path
160 ros::Publisher pubMeasMapLioPath_;
161 ros::Publisher pubMeasWorldGnssPath_;
162 // Markers
164
165 // Messages
166 nav_msgs::PathPtr measLio_mapLidarPathPtr_;
167 nav_msgs::PathPtr measGnss_worldGnssPathPtr_;
168
169 // Servers
170 ros::ServiceServer serverTransformGnssToEnu_;
171};
172
173} // namespace anymal_se
174
175#endif // end ANYMAL_ESTIMATOR_H
Eigen::Isometry3d lio_T_M_Lkm1_
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::Subscriber subLeggedBetween_
void initializeSubscribers(ros::NodeHandle &privateNode) override
Eigen::Matrix< double, 3, 1 > legVelocityUnaryNoise_
void gnssUnaryCallback_(const sensor_msgs::NavSatFix::ConstPtr &gnssPtr)
void leggedVelocityUnaryCallback_(const nav_msgs::Odometry::ConstPtr &leggedOdometryKPtr)
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
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)
static constexpr std::array< const char *, 4 > legNames_
Eigen::Matrix< double, 3, 1 > legKinematicsFootPositionUnaryNoise_
void initializeMessages(ros::NodeHandle &privateNode) override
ros::Subscriber subLeggedKinematics_
std::shared_ptr< holistic_fusion::TrajectoryAlignmentHandler > trajectoryAlignmentHandler_
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_
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)
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_
static constexpr bool logOptionalGnssEnuCoordinatesFlag_