123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #include <ros/ros.h>
- #include <string>
- #include <Eigen/Dense>
- #include <memory>
- #include <message_filters/subscriber.h>
- #include <nav_msgs/Odometry.h>
- #include <sensor_msgs/PointCloud2.h>
- #include <message_filters/sync_policies/approximate_time.h>
- #include <message_filters/synchronizer.h>
- #include <hdl_graph_slam/keyframe_updater.hpp>
- #include <hdl_graph_slam/keyframe.hpp>
- #include <hdl_graph_slam/SaveMap.h>
- #include <hdl_graph_slam/map_cloud_generator.hpp>
- #include <boost/format.hpp>
- #include <hdl_graph_slam/graph_slam.hpp>
- #include <hdl_graph_slam/ros_time_hash.hpp>
- #include <g2o/types/slam3d/vertex_se3.h>
- #include <hdl_graph_slam/information_matrix_calculator.hpp>
- #include <ctime>
- #include <mutex>
- #include <atomic>
- #include <memory>
- #include <iomanip>
- #include <iostream>
- #include <unordered_map>
- #include <boost/format.hpp>
- #include <boost/thread.hpp>
- #include <boost/filesystem.hpp>
- #include <boost/algorithm/string.hpp>
- #include <Eigen/Dense>
- #include <pcl/io/pcd_io.h>
- #include <ros/ros.h>
- #include <geodesy/utm.h>
- #include <geodesy/wgs84.h>
- #include <pcl_ros/point_cloud.h>
- #include <message_filters/subscriber.h>
- #include <message_filters/time_synchronizer.h>
- #include <message_filters/sync_policies/approximate_time.h>
- #include <tf_conversions/tf_eigen.h>
- #include <tf/transform_listener.h>
- #include <std_msgs/Time.h>
- #include <nav_msgs/Odometry.h>
- #include <nmea_msgs/Sentence.h>
- #include <sensor_msgs/Imu.h>
- #include <sensor_msgs/NavSatFix.h>
- #include <sensor_msgs/PointCloud2.h>
- #include <geographic_msgs/GeoPointStamped.h>
- #include <visualization_msgs/MarkerArray.h>
- #include <hdl_graph_slam/FloorCoeffs.h>
- #include <hdl_graph_slam/SaveMap.h>
- #include <hdl_graph_slam/LoadGraph.h>
- #include <hdl_graph_slam/DumpGraph.h>
- #include <nodelet/nodelet.h>
- #include <pluginlib/class_list_macros.h>
- #include <hdl_graph_slam/ros_utils.hpp>
- #include <hdl_graph_slam/ros_time_hash.hpp>
- #include <hdl_graph_slam/graph_slam.hpp>
- #include <hdl_graph_slam/keyframe.hpp>
- #include <hdl_graph_slam/keyframe_updater.hpp>
- #include <hdl_graph_slam/loop_detector.hpp>
- #include <hdl_graph_slam/information_matrix_calculator.hpp>
- #include <hdl_graph_slam/map_cloud_generator.hpp>
- #include <hdl_graph_slam/nmea_sentence_parser.hpp>
- #include <g2o/types/slam3d/edge_se3.h>
- #include <g2o/types/slam3d/vertex_se3.h>
- #include <g2o/edge_se3_plane.hpp>
- #include <g2o/edge_se3_priorxy.hpp>
- #include <g2o/edge_se3_priorxyz.hpp>
- #include <g2o/edge_se3_priorvec.hpp>
- #include <g2o/edge_se3_priorquat.hpp>
- #include <thread> // 多线程
- #include <pcl/filters/voxel_grid.h>
- #include <pcl/filters/passthrough.h>
- #include <pcl/filters/approximate_voxel_grid.h>
- #include <pcl/filters/radius_outlier_removal.h>
- #include <pcl/filters/statistical_outlier_removal.h>
- typedef message_filters::sync_policies::ApproximateTime<nav_msgs::Odometry, sensor_msgs::PointCloud2> ApproxSyncPolicy;
- typedef pcl::PointXYZI PointT;
- class hdl_backend {
- private:
- ros::NodeHandle nh;
-
- int max_keyframes_per_update;
- std::unique_ptr<message_filters::Subscriber<nav_msgs::Odometry>> odom_sub;
- std::unique_ptr<message_filters::Subscriber<sensor_msgs::PointCloud2>> cloud_sub;
- std::unique_ptr<message_filters::Synchronizer<ApproxSyncPolicy>> sync;
- void cloud_callback(const nav_msgs::OdometryConstPtr& odom_msg, const sensor_msgs::PointCloud2::ConstPtr& cloud_msg);
- void map_points_publish_timer_callback(const ros::WallTimerEvent& event) ;
- static hdl_backend instance;
-
-
-
-
- ros::ServiceServer save_map_service_server;
-
- boost::optional<Eigen::Vector3d> zero_utm;
- ros::WallTimer optimization_timer;
- ros::WallTimer map_publish_timer;
-
-
-
-
- std::unordered_map<ros::Time, hdl_graph_slam::KeyFrame::Ptr, RosTimeHash> keyframe_hash;
- public:
- hdl_backend(){};
- ~hdl_backend(){};
- void init();
- std::string base_frame_id;
- std::unique_ptr<hdl_graph_slam::KeyframeUpdater> keyframe_updater;
- std::mutex keyframe_queue_mutex;
- std::deque<hdl_graph_slam::KeyFrame::Ptr> keyframe_queue;
-
-
-
- std::string points_topic;
- ros::Publisher read_until_pub;
- std::mutex main_thread_mutex;
- bool flush_keyframe_queue();
- std::unique_ptr<hdl_graph_slam::LoopDetector> loop_detector;
- std::vector<hdl_graph_slam::KeyFrame::Ptr> keyframes;
- std::deque<hdl_graph_slam::KeyFrame::Ptr> new_keyframes;
- std::unique_ptr<hdl_graph_slam::GraphSLAM> graph_slam;
- g2o::VertexSE3* anchor_node;
- g2o::EdgeSE3* anchor_edge;
- std::unique_ptr<hdl_graph_slam::InformationMatrixCalculator> inf_calclator;
- std::mutex trans_odom2map_mutex;
- Eigen::Matrix4f trans_odom2map;
-
- std::mutex keyframes_snapshot_mutex;
- std::vector<hdl_graph_slam::KeyFrameSnapshot::Ptr> keyframes_snapshot;
- std::atomic_bool graph_updated;
- ros::Publisher odom2map_pub;
- ros::Publisher markers_pub;
- visualization_msgs::MarkerArray create_marker_array(const ros::Time& stamp) const;
- std::string map_frame_id;
- std::string odom_frame_id;
- ros::Publisher map_points_pub;
- ros::Publisher map_points_pub2;
- double map_cloud_resolution;
- std::unique_ptr<hdl_graph_slam::MapCloudGenerator> map_cloud_generator;
-
-
- void optimization_timer_callback();
- long long num_added_keyframe = 0;
- pcl::PointCloud<PointT>::ConstPtr downsample(const pcl::PointCloud<PointT>::ConstPtr& cloud);
- pcl::Filter<PointT>::Ptr downsample_filter;
- double downsample_resolution = 0.02;
- pcl::PointCloud<PointT>::ConstPtr outlier_removal(const pcl::PointCloud<PointT>::ConstPtr& cloud);
- pcl::Filter<PointT>::Ptr outlier_removal_filter;
- ros::Publisher odom_pub;
- void publishMatrixAsPose(ros::Publisher& publisher, const Eigen::Matrix4f& matrix);
- bool save_map_service(hdl_graph_slam::SaveMapRequest& req, hdl_graph_slam::SaveMapResponse& res);
- };
|