00001 /* 00002 * File: mrpt_icp_slam_2d_wrapper.h 00003 * Author: Vladislav Tananaev 00004 * 00005 */ 00006 00007 #ifndef MRPT_ICP_SLAM_2D_WRAPPER_H 00008 #define MRPT_ICP_SLAM_2D_WRAPPER_H 00009 00010 // MRPT libraries 00011 #include <mrpt/slam/CMetricMapBuilderICP.h> 00012 #include <mrpt/opengl/COpenGLScene.h> 00013 #include <mrpt/opengl/CGridPlaneXY.h> 00014 #include <mrpt/opengl/stock_objects.h> 00015 #include <mrpt/utils/CConfigFile.h> 00016 #include <mrpt/utils/CFileGZInputStream.h> 00017 #include <mrpt/utils/CFileGZOutputStream.h> 00018 #include <mrpt/system/os.h> 00019 #include <mrpt/system/threads.h> 00020 #include <mrpt/system/filesystem.h> 00021 #include <mrpt/opengl/CPlanarLaserScan.h> // This class lives in the lib [mrpt-maps] and must be included by hand 00022 #include <mrpt/poses/CPosePDFGaussian.h> 00023 #include <mrpt/poses/CPose3DPDF.h> 00024 00025 #include <mrpt/gui/CDisplayWindow3D.h> 00026 00027 #include <stdint.h> 00028 #include <iostream> // std::cout 00029 #include <fstream> // std::ifstream 00030 #include <string> 00031 00032 // add ros libraries 00033 #include <ros/ros.h> 00034 #include <ros/package.h> 00035 #include <tf/transform_listener.h> 00036 #include <tf/transform_broadcaster.h> 00037 // add ros msgs 00038 #include <nav_msgs/OccupancyGrid.h> 00039 #include "nav_msgs/MapMetaData.h" 00040 #include <nav_msgs/Path.h> 00041 #include <std_msgs/String.h> 00042 #include <std_msgs/Header.h> 00043 #include <std_msgs/Int32.h> 00044 #include <nav_msgs/GetMap.h> 00045 #include <geometry_msgs/PoseArray.h> 00046 #include <geometry_msgs/PoseStamped.h> 00047 #include <geometry_msgs/PoseWithCovarianceStamped.h> 00048 #include <sensor_msgs/LaserScan.h> 00049 #include <sensor_msgs/PointCloud.h> 00050 #include <visualization_msgs/MarkerArray.h> 00051 #include <visualization_msgs/Marker.h> 00052 00053 // mrpt bridge libs 00054 #include <mrpt_bridge/pose.h> 00055 #include <mrpt_bridge/map.h> 00056 #include <mrpt_bridge/mrpt_log_macros.h> 00057 #include <mrpt_bridge/laser_scan.h> 00058 #include <mrpt_bridge/time.h> 00059 #include <mrpt_bridge/point_cloud.h> 00060 #include <mrpt/version.h> 00061 #if MRPT_VERSION >= 0x130 00062 #include <mrpt/obs/CActionRobotMovement2D.h> 00063 #include <mrpt/obs/CActionRobotMovement3D.h> 00064 #include <mrpt/obs/CActionCollection.h> 00065 #include <mrpt/obs/CObservationOdometry.h> 00066 #include <mrpt/obs/CSensoryFrame.h> 00067 #include <mrpt/maps/CMultiMetricMap.h> 00068 #include <mrpt/obs/CRawlog.h> 00069 using namespace mrpt::maps; 00070 using namespace mrpt::obs; 00071 #else 00072 #include <mrpt/slam/CActionRobotMovement2D.h> 00073 #include <mrpt/slam/CActionRobotMovement3D.h> 00074 #include <mrpt/slam/CActionCollection.h> 00075 #include <mrpt/slam/CObservationOdometry.h> 00076 #include <mrpt/slam/CSensoryFrame.h> 00077 #include <mrpt/slam/CMultiMetricMap.h> 00078 #include <mrpt/slam/CRawlog.h> 00079 #endif 00080 using namespace mrpt; 00081 using namespace mrpt::slam; 00082 using namespace mrpt::opengl; 00083 using namespace mrpt::gui; 00084 using namespace mrpt::system; 00085 using namespace mrpt::math; 00086 using namespace mrpt::utils; 00087 using namespace mrpt::poses; 00088 using namespace std; 00089 00094 class ICPslamWrapper 00095 { 00096 public: 00100 ICPslamWrapper(); 00101 00105 ~ICPslamWrapper(); 00106 00112 void read_iniFile(std::string ini_filename); 00116 void init3Dwindow(); 00120 void run3Dwindow(); 00121 00125 void get_param(); 00129 void init(); 00135 bool rawlogPlay(); 00141 bool is_file_exists(const std::string &name); 00151 void laserCallback(const sensor_msgs::LaserScan &_msg); 00156 void publishTF(); 00161 void publishMapPose(); 00167 void updateSensorPose(std::string _frame_id); 00173 void updateTrajectoryTimerCallback(const ros::TimerEvent& event); 00179 void publishTrajectoryTimerCallback(const ros::TimerEvent& event); 00180 00181 protected: 00182 CMetricMapBuilderICP mapBuilder; 00183 ros::NodeHandle n_; 00184 double rawlog_play_delay; 00185 bool rawlog_play_; 00186 00187 std::string rawlog_filename; 00188 std::string ini_filename; 00189 std::string global_frame_id; 00190 std::string odom_frame_id; 00191 std::string base_frame_id; 00192 geometry_msgs::PoseStamped pose; 00193 00194 ros::Publisher trajectory_pub_; 00195 nav_msgs::Path path; 00196 00197 ros::Timer update_trajector_timer; 00198 ros::Timer publish_trajectory_timer; 00199 00200 double trajectory_update_rate; 00201 double trajectory_publish_rate; 00202 00203 // Sensor source 00204 std::string sensor_source; 00205 std::map<std::string, mrpt::poses::CPose3D> laser_poses_; 00206 00207 // Subscribers 00208 std::vector<ros::Subscriber> sensorSub_; 00209 00210 const CMultiMetricMap *metric_map_; 00211 // CPose3DPDFPtr curPDF; ///<current robot pose 00212 ros::Publisher pub_map_, pub_metadata_, pub_pose_, pub_point_cloud_; 00213 00214 tf::TransformListener listenerTF_; 00215 tf::TransformBroadcaster tf_broadcaster_; 00216 00217 CTicTac tictac; 00218 float t_exec; 00219 CSensoryFramePtr observations; 00220 CObservationPtr observation; 00221 mrpt::system::TTimeStamp timeLastUpdate_; 00222 00223 ros::Time stamp; 00224 00225 mrpt::gui::CDisplayWindow3DPtr win3D_; 00226 00227 std::vector<CObservation2DRangeScanPtr> lst_current_laser_scans; 00228 bool isObsBasedRawlog; 00229 bool SHOW_PROGRESS_3D_REAL_TIME; 00230 int SHOW_PROGRESS_3D_REAL_TIME_DELAY_MS; 00231 bool SHOW_LASER_SCANS_3D; 00232 bool CAMERA_3DSCENE_FOLLOWS_ROBOT; 00233 }; 00234 00235 #endif /* MRPT_ICP_SLAM_2D_WRAPPER_H */