ekf_cal  0.4.0
A Kalman filter-based sensor calibration package
ekf_cal_node.hpp
1 // Copyright 2022 Jacob Hartzer
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program. If not, see <https://www.gnu.org/licenses/>.
15 
16 #ifndef APPLICATION__ROS__NODE__EKF_CAL_NODE_HPP_
17 #define APPLICATION__ROS__NODE__EKF_CAL_NODE_HPP_
18 
19 
20 #include <map>
21 #include <memory>
22 #include <string>
23 #include <vector>
24 
25 #include <rclcpp/rclcpp.hpp>
26 #include <sensor_msgs/msg/image.hpp>
27 #include <sensor_msgs/msg/imu.hpp>
28 #include <sensor_msgs/msg/nav_sat_fix.hpp>
29 #include <std_msgs/msg/float64_multi_array.hpp>
30 
31 #include "ekf/ekf.hpp"
32 #include "infrastructure/data_logger.hpp"
33 #include "infrastructure/debug_logger.hpp"
34 #include "sensors/camera.hpp"
35 #include "sensors/gps.hpp"
36 #include "sensors/imu.hpp"
37 #include "sensors/ros/ros_camera.hpp"
38 #include "sensors/ros/ros_gps.hpp"
39 #include "sensors/ros/ros_imu.hpp"
40 #include "trackers/feature_tracker.hpp"
41 
53 class EkfCalNode : public rclcpp::Node
54 {
55 public:
59  EkfCalNode();
60 
64  void Initialize();
65 
69  void LoadSensors();
70 
78  Sensor::Parameters & params,
79  const std::string & prefix,
80  const std::string & name
81  );
82 
87  void LoadImu(const std::string & imu_name);
88 
93  void LoadCamera(const std::string & camera_name);
94 
99  void LoadGps(const std::string & gps_name);
100 
105  Eigen::VectorXd LoadProcessNoise();
106 
112  IMU::Parameters GetImuParameters(const std::string & imu_name);
113 
119  Camera::Parameters GetCameraParameters(const std::string & camera_name);
120 
126  GPS::Parameters GetGpsParameters(const std::string & gps_name);
127 
131  void DeclareSensors();
132 
137  void DeclareSensorParameters(const std::string & sensor_name);
138 
143  void DeclareImuParameters(const std::string & imu_name);
144 
149  void DeclareCameraParameters(const std::string & camera_name);
150 
155  void DeclareTrackerParameters(const std::string & tracker_name);
156 
161  void DeclareIntrinsicParameters(const std::string & intrinsics_prefix);
162 
167  void DeclareFiducialParameters(const std::string & fid_name);
168 
173  Intrinsics GetIntrinsicParameters(const std::string & intrinsics_prefix);
174 
179  void DeclareGpsParameters(const std::string & gps_name);
180 
186  FeatureTracker::Parameters GetTrackerParameters(const std::string & tracker_name);
187 
193  FiducialTracker::Parameters GetFiducialParameters(const std::string & fiducial_name);
194 
200  void ImuCallback(const sensor_msgs::msg::Imu::SharedPtr msg, unsigned int id);
201 
207  void CameraCallback(const sensor_msgs::msg::Image::SharedPtr msg, unsigned int id);
208 
214  void GpsCallback(const sensor_msgs::msg::NavSatFix::SharedPtr msg, unsigned int id);
215 
221  void RegisterImu(std::shared_ptr<RosIMU> imu_ptr, const std::string & topic);
222 
228  void RegisterCamera(std::shared_ptr<RosCamera> camera_ptr, const std::string & topic);
229 
235  void RegisterGps(std::shared_ptr<RosGPS> gps_ptr, const std::string & topic);
236 
240  void PublishState();
241 
242 private:
244  std::vector<rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr> m_imu_subs;
245 
247  std::vector<rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr> m_camera_subs;
248 
250  std::vector<rclcpp::Subscription<sensor_msgs::msg::NavSatFix>::SharedPtr> m_gps_subs;
251 
252  std::vector<std::string> m_imu_list {};
253  std::vector<std::string> m_camera_list {};
254  std::vector<std::string> m_tracker_list {};
255  std::vector<std::string> m_fiducial_list {};
256  std::vector<std::string> m_gps_list {};
257 
258  rclcpp::Publisher<std_msgs::msg::Float64MultiArray>::SharedPtr m_body_state_pub;
259  rclcpp::Publisher<std_msgs::msg::Float64MultiArray>::SharedPtr m_imu_state_pub;
260  rclcpp::TimerBase::SharedPtr m_state_pub_timer;
261 
262  std::shared_ptr<EKF> m_ekf;
263  std::shared_ptr<DebugLogger> m_debug_logger;
264  DataLogger m_state_data_logger;
265 
266  std::map<unsigned int, std::shared_ptr<RosIMU>> m_map_imu{};
267  std::map<unsigned int, std::shared_ptr<RosCamera>> m_map_camera{};
268  std::map<unsigned int, std::shared_ptr<RosGPS>> m_map_gps{};
269  std::map<unsigned int,
270  std::shared_ptr<rclcpp::Publisher<sensor_msgs::msg::Image>>> m_map_image_publishers{};
271 
272  std::string m_log_directory{"~/log/"};
273 };
274 
275 #endif // APPLICATION__ROS__NODE__EKF_CAL_NODE_HPP_
DataLogger class.
Definition: data_logger.hpp:26
A ROS2 node for EKF-based sensor calibration.
Definition: ekf_cal_node.hpp:54
void DeclareCameraParameters(const std::string &camera_name)
Declare camera parameters.
Definition: ekf_cal_node.cpp:290
void DeclareTrackerParameters(const std::string &tracker_name)
Declare tracker parameters.
Definition: ekf_cal_node.cpp:334
void LoadGps(const std::string &gps_name)
Load GPS sensor.
Definition: ekf_cal_node.cpp:533
void DeclareSensorParameters(const std::string &sensor_name)
Declare generic sensor parameters.
Definition: ekf_cal_node.cpp:164
void DeclareSensors()
Declare parameters for all sensors.
Definition: ekf_cal_node.cpp:145
Camera::Parameters GetCameraParameters(const std::string &camera_name)
Function for loading camera parameters.
Definition: ekf_cal_node.cpp:306
FiducialTracker::Parameters GetFiducialParameters(const std::string &fiducial_name)
Load fiducial parameters.
Definition: ekf_cal_node.cpp:400
void PublishState()
State publisher callback.
Definition: ekf_cal_node.cpp:595
void DeclareIntrinsicParameters(const std::string &intrinsics_prefix)
Declare camera intrinsic parameters.
Definition: ekf_cal_node.cpp:260
void CameraCallback(const sensor_msgs::msg::Image::SharedPtr msg, unsigned int id)
Callback method for Camera sensor messages.
Definition: ekf_cal_node.cpp:570
void RegisterGps(std::shared_ptr< RosGPS > gps_ptr, const std::string &topic)
Register GPS sensor.
Definition: ekf_cal_node.cpp:544
void LoadSensors()
Load lists of sensors.
Definition: ekf_cal_node.cpp:186
void ImuCallback(const sensor_msgs::msg::Imu::SharedPtr msg, unsigned int id)
Callback method for IMU sensor messages.
Definition: ekf_cal_node.cpp:558
void RegisterCamera(std::shared_ptr< RosCamera > camera_ptr, const std::string &topic)
Register camera sensor.
Definition: ekf_cal_node.cpp:519
IMU::Parameters GetImuParameters(const std::string &imu_name)
Function for loading IMU parameters.
Definition: ekf_cal_node.cpp:227
void DeclareGpsParameters(const std::string &gps_name)
Declare GPS parameters.
Definition: ekf_cal_node.cpp:436
GPS::Parameters GetGpsParameters(const std::string &gps_name)
Function for loading camera parameters.
Definition: ekf_cal_node.cpp:446
void LoadImu(const std::string &imu_name)
Load IMU sensor.
Definition: ekf_cal_node.cpp:462
void LoadSensorParameters(Sensor::Parameters &params, const std::string &prefix, const std::string &name)
Load sensor common parameters.
Definition: ekf_cal_node.cpp:171
void DeclareFiducialParameters(const std::string &fid_name)
Declare fiducial parameters.
Definition: ekf_cal_node.cpp:382
Intrinsics GetIntrinsicParameters(const std::string &intrinsics_prefix)
Load camera intrinsic parameters.
Definition: ekf_cal_node.cpp:273
EkfCalNode()
Constructor for the Calibration EKF Node.
Definition: ekf_cal_node.cpp:54
void GpsCallback(const sensor_msgs::msg::NavSatFix::SharedPtr msg, unsigned int id)
Callback method for GPS sensor messages.
Definition: ekf_cal_node.cpp:583
void LoadCamera(const std::string &camera_name)
Load camera sensor.
Definition: ekf_cal_node.cpp:488
void Initialize()
Initialize EKF calibration node.
Definition: ekf_cal_node.cpp:92
Eigen::VectorXd LoadProcessNoise()
Load process noise.
Definition: ekf_cal_node.cpp:622
void DeclareImuParameters(const std::string &imu_name)
Declare IMU parameters.
Definition: ekf_cal_node.cpp:208
FeatureTracker::Parameters GetTrackerParameters(const std::string &tracker_name)
Load tracker parameters.
Definition: ekf_cal_node.cpp:350
void RegisterImu(std::shared_ptr< RosIMU > imu_ptr, const std::string &topic)
Register IMU sensor.
Definition: ekf_cal_node.cpp:473
Camera intrinsics data structure.
Definition: types.hpp:49
Camera initialization parameters structure.
Definition: camera.hpp:47
Feature Tracker Initialization parameters structure.
Definition: feature_tracker.hpp:75
Feature Tracker Initialization parameters structure.
Definition: fiducial_tracker.hpp:54
GPS initialization parameters structure.
Definition: gps.hpp:42
IMU initialization parameters structure.
Definition: imu.hpp:39
Sensor parameter structure.
Definition: sensor.hpp:38