2222//
2323
2424#include " slam_gmapping/slam_gmapping.h"
25+ using namespace std ::chrono_literals;
2526
2627#define MAP_IDX (sx, i, j ) ((sx) * (j) + (i))
2728
@@ -40,77 +41,102 @@ SlamGmapping::SlamGmapping():
4041 tfB_ = std::make_shared<tf2_ros::TransformBroadcaster>(node_);
4142 map_to_odom_.setIdentity ();
4243 seed_ = static_cast <unsigned long >(time (nullptr ));
43- init ();
44- startLiveSlam ();
4544}
4645
47- void SlamGmapping::init () {
46+ std::error_code SlamGmapping::init () {
4847 gsp_ = new GMapping::GridSlamProcessor ();
4948
49+ // variables initialisation
5050 gsp_laser_ = nullptr ;
5151 gsp_odom_ = nullptr ;
5252 got_first_scan_ = false ;
5353 got_map_ = false ;
5454
5555 throttle_scans_ = 1 ;
56- base_frame_ = " base_link" ;
57- map_frame_ = " map" ;
58- odom_frame_ = " odom" ;
59- transform_publish_period_ = 0.05 ;
60-
6156 map_update_interval_ = tf2::durationFromSec (0.5 );
62- maxUrange_ = 80.0 ; maxRange_ = 0.0 ;
63- minimum_score_ = 0 ;
64- sigma_ = 0.05 ;
65- kernelSize_ = 1 ;
66- lstep_ = 0.05 ;
67- astep_ = 0.05 ;
68- iterations_ = 5 ;
69- lsigma_ = 0.075 ;
70- ogain_ = 3.0 ;
71- lskip_ = 0 ;
72- srr_ = 0.1 ;
73- srt_ = 0.2 ;
74- str_ = 0.1 ;
75- stt_ = 0.2 ;
76- linearUpdate_ = 1.0 ;
77- angularUpdate_ = 0.5 ;
78- temporalUpdate_ = 1.0 ;
79- resampleThreshold_ = 0.5 ;
80- particles_ = 30 ;
81- xmin_ = -10.0 ;
82- ymin_ = -10.0 ;
83- xmax_ = 10.0 ;
84- ymax_ = 10.0 ;
85- delta_ = 0.05 ;
86- occ_thresh_ = 0.25 ;
87- llsamplerange_ = 0.01 ;
88- llsamplestep_ = 0.01 ;
89- lasamplerange_ = 0.005 ;
90- lasamplestep_ = 0.005 ;
91- tf_delay_ = transform_publish_period_;
57+
58+ // ROS parameters initialisation
59+ const auto ec = initParameters ();
60+ if (ec) { return ec; }
61+
62+ return std::error_code ();
63+ } // end of init
64+
65+
66+ std::error_code SlamGmapping::initParameters ()
67+ {
68+ parameters_client_ = std::make_unique<rclcpp::SyncParametersClient>(node_);
69+
70+ // Query and initialise gmapping parameters
71+ while (!parameters_client_->wait_for_service (1s)) {
72+ if (!rclcpp::ok ()) {
73+ RCLCPP_ERROR (node_->get_logger (), " Interrupted while waiting for the service. Exiting." );
74+ return std::make_error_code (std::errc::io_error);
75+ }
76+ RCLCPP_INFO (node_->get_logger (), " service not available, waiting again..." );
77+ }
78+
79+ // frames
80+ base_frame_ = parameters_client_->get_parameter <std::string>(" base_frame" , " base_link" );
81+ map_frame_ = parameters_client_->get_parameter <std::string>(" map_frame" , " map" );
82+ odom_frame_ = parameters_client_->get_parameter <std::string>(" odom_frame" , " odom" );
83+
84+ // various parameters
85+ maxUrange_ = parameters_client_->get_parameter (" maxUrange" , 80.0 );
86+ maxRange_ = parameters_client_->get_parameter (" maxRange" , 0.0 );
87+ minimum_score_ = parameters_client_->get_parameter (" minimum_score" , 0 );
88+ sigma_ = parameters_client_->get_parameter (" sigma" , 0.05 );
89+ kernelSize_ = parameters_client_->get_parameter (" kernelSize" , 1 );
90+ lstep_ = parameters_client_->get_parameter (" lstep" , 0.05 );
91+ astep_ = parameters_client_->get_parameter (" astep" , 0.05 );
92+ iterations_ = parameters_client_->get_parameter (" iterations" , 5 );
93+ lsigma_ = parameters_client_->get_parameter (" lsigma" , 0.075 );
94+ ogain_ = parameters_client_->get_parameter (" ogain" , 3.0 );
95+ lskip_ = parameters_client_->get_parameter (" lskip" , 0 );
96+ srr_ = parameters_client_->get_parameter (" srr" , 0.1 );
97+ srt_ = parameters_client_->get_parameter (" srt" , 0.2 );
98+ str_ = parameters_client_->get_parameter (" str" , 0.1 );
99+ stt_ = parameters_client_->get_parameter (" stt" , 0.2 );
100+ linearUpdate_ = parameters_client_->get_parameter (" linearUpdate" , 1.0 );
101+ angularUpdate_ = parameters_client_->get_parameter (" angularUpdate" , 0.5 );
102+ temporalUpdate_ = parameters_client_->get_parameter (" temporalUpdate" , 1.0 );
103+ resampleThreshold_ = parameters_client_->get_parameter (" resampleThreshold" , 0.5 );
104+ particles_ = parameters_client_->get_parameter (" particles" , 30 );
105+ xmin_ = parameters_client_->get_parameter (" xmin" , -10.0 );
106+ ymin_ = parameters_client_->get_parameter (" ymin" , -10.0 );
107+ xmax_ = parameters_client_->get_parameter (" xmax" , 10.0 );
108+ ymax_ = parameters_client_->get_parameter (" ymax" , 10.0 );
109+ delta_ = parameters_client_->get_parameter (" delta" , 0.05 );
110+ occ_thresh_ = parameters_client_->get_parameter (" occ" , 0.25 );
111+ llsamplerange_ = parameters_client_->get_parameter (" llsamplerange" , 0.01 );
112+ llsamplestep_ = parameters_client_->get_parameter (" llsamplestep" , 0.01 );
113+ lasamplerange_ = parameters_client_->get_parameter (" lasamplerange" , 0.005 );
114+ lasamplestep_ = parameters_client_->get_parameter (" lasamplestep" , 0.005 );
115+
116+ return std::error_code ();
92117}
93118
94- void SlamGmapping::startLiveSlam () {
119+ std::error_code SlamGmapping::startLiveSlam () {
95120 entropy_publisher_ = this ->create_publisher <std_msgs::msg::Float64>(" entropy" );
96121 sst_ = this ->create_publisher <nav_msgs::msg::OccupancyGrid>(" map" );
97122 sstm_ = this ->create_publisher <nav_msgs::msg::MapMetaData>(" map_metadata" );
98123 pose_publisher_ = this ->create_publisher <geometry_msgs::msg::PoseWithCovarianceStamped>(" pose" );
99- scan_filter_sub_ = std::make_shared<message_filters::Subscriber<sensor_msgs::msg::LaserScan>>
100- (node_, " scan" );
124+ scan_filter_sub_ = std::make_shared<message_filters::Subscriber<sensor_msgs::msg::LaserScan>>(node_, " scan" );
101125 scan_filter_ = std::make_shared<tf2_ros::MessageFilter<sensor_msgs::msg::LaserScan>>
102126 (*scan_filter_sub_, *buffer_, odom_frame_, 10 , node_);
103127 scan_filter_->registerCallback (std::bind (&SlamGmapping::laserCallback, this , std::placeholders::_1));
104128 transform_thread_ = std::make_shared<std::thread>
105129 (std::bind (&SlamGmapping::publishLoop, this , transform_publish_period_));
130+
131+ return std::error_code ();
106132}
107133
108134void SlamGmapping::publishLoop (double transform_publish_period){
109135 if (transform_publish_period == 0 )
110136 return ;
111137 rclcpp::Rate r (1.0 / transform_publish_period);
112138 while (rclcpp::ok ()) {
113- publishTransform ();
139+ doPublish ();
114140 r.sleep ();
115141 }
116142}
@@ -524,12 +550,24 @@ void SlamGmapping::updateMap(const sensor_msgs::msg::LaserScan::ConstSharedPtr s
524550 map_mutex_.unlock ();
525551}
526552
527- void SlamGmapping::publishTransform ()
553+ void SlamGmapping::doPublish ()
554+ {
555+ publishTransform ();
556+ publishLatestPose ();
557+ }
558+
559+ void SlamGmapping::publishLatestPose ()
528560{
529- map_to_odom_mutex_. lock ( );
561+ std::lock_guard<std::mutex> g (map_to_odom_mutex_ );
530562
531563 // publish the latest pose
532564 pose_publisher_->publish (latestPose_);
565+ }
566+
567+ void SlamGmapping::publishTransform ()
568+ {
569+ std::lock_guard<std::mutex> g (map_to_odom_mutex_);
570+
533571
534572 rclcpp::Time tf_expiration = get_clock ()->now () + rclcpp::Duration (
535573 static_cast <int32_t >(static_cast <rcl_duration_value_t >(tf_delay_)), 0 );
@@ -544,14 +582,42 @@ void SlamGmapping::publishTransform()
544582 catch (tf2::LookupException& te){
545583 RCLCPP_INFO (this ->get_logger (), te.what ());
546584 }
547- map_to_odom_mutex_.unlock ();
548585}
549586
550- int main (int argc, char * argv[])
587+ static rclcpp::Logger logger = rclcpp::get_logger(" main" );
588+
589+ int main (int argc, char * argv[]) try
551590{
552591 rclcpp::init (argc, argv);
553592
554593 auto slam_gmapping_node = std::make_shared<SlamGmapping>();
594+ {
595+ const auto ec = slam_gmapping_node->init ();
596+ if (ec)
597+ {
598+ RCLCPP_ERROR (logger, " %s / %s / %s" , ec.category ().name (), ec.value (), ec.message ());
599+ return -1 ;
600+ }
601+ }
602+ {
603+ const auto ec = slam_gmapping_node->startLiveSlam ();
604+ if (ec)
605+ {
606+ RCLCPP_ERROR (logger, " %s / %s / %s" , ec.category ().name (), ec.value (), ec.message ());
607+ return -1 ;
608+ }
609+ }
610+
555611 rclcpp::spin (slam_gmapping_node);
556- return (0 );
612+ return 0 ;
613+ }
614+ catch (const std::exception& e)
615+ {
616+ RCLCPP_FATAL (logger, " %s%s\n\n " , " Finished with a known exception:" , e.what ());
617+ return -1 ;
618+ }
619+ catch (...)
620+ {
621+ RCLCPP_FATAL (logger, " %s" , " Uncaught unknown exception!\n " );
622+ return -1 ;
557623}
0 commit comments