@@ -325,13 +325,17 @@ AmclNode::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
325
325
// Get rid of the inputs first (services and message filter input), so we
326
326
// don't continue to process incoming messages
327
327
global_loc_srv_.reset ();
328
+ initial_guess_srv_.reset ();
328
329
nomotion_update_srv_.reset ();
330
+ executor_thread_.reset (); // to make sure initial_pose_sub_ completely exit
329
331
initial_pose_sub_.reset ();
330
332
laser_scan_connection_.disconnect ();
333
+ tf_listener_.reset (); // listener may access lase_scan_filter_, so it should be reset earlier
331
334
laser_scan_filter_.reset ();
332
335
laser_scan_sub_.reset ();
333
336
334
337
// Map
338
+ map_sub_.reset (); // map_sub_ may access map_, so it should be reset earlier
335
339
if (map_ != NULL ) {
336
340
map_free (map_);
337
341
map_ = nullptr ;
@@ -341,7 +345,6 @@ AmclNode::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
341
345
342
346
// Transforms
343
347
tf_broadcaster_.reset ();
344
- tf_listener_.reset ();
345
348
tf_buffer_.reset ();
346
349
347
350
// PubSub
@@ -493,6 +496,15 @@ AmclNode::globalLocalizationCallback(
493
496
pf_init_ = false ;
494
497
}
495
498
499
+ void
500
+ AmclNode::initialPoseReceivedSrv (
501
+ const std::shared_ptr<rmw_request_id_t >/* request_header*/ ,
502
+ const std::shared_ptr<nav2_msgs::srv::SetInitialPose::Request> req,
503
+ std::shared_ptr<nav2_msgs::srv::SetInitialPose::Response>/* res*/ )
504
+ {
505
+ initialPoseReceived (std::make_shared<geometry_msgs::msg::PoseWithCovarianceStamped>(req->pose ));
506
+ }
507
+
496
508
// force nomotion updates (amcl updating without requiring motion)
497
509
void
498
510
AmclNode::nomotionUpdateCallback (
@@ -1102,20 +1114,20 @@ AmclNode::initParameters()
1102
1114
// Semantic checks
1103
1115
if (laser_likelihood_max_dist_ < 0 ) {
1104
1116
RCLCPP_WARN (
1105
- get_logger (), " You've set laser_likelihood_max_dist to be negtive ,"
1117
+ get_logger (), " You've set laser_likelihood_max_dist to be negative ,"
1106
1118
" this isn't allowed so it will be set to default value 2.0." );
1107
1119
laser_likelihood_max_dist_ = 2.0 ;
1108
1120
}
1109
1121
if (max_particles_ < 0 ) {
1110
1122
RCLCPP_WARN (
1111
- get_logger (), " You've set max_particles to be negtive ,"
1123
+ get_logger (), " You've set max_particles to be negative ,"
1112
1124
" this isn't allowed so it will be set to default value 2000." );
1113
1125
max_particles_ = 2000 ;
1114
1126
}
1115
1127
1116
1128
if (min_particles_ < 0 ) {
1117
1129
RCLCPP_WARN (
1118
- get_logger (), " You've set min_particles to be negtive ,"
1130
+ get_logger (), " You've set min_particles to be negative ,"
1119
1131
" this isn't allowed so it will be set to default value 500." );
1120
1132
min_particles_ = 500 ;
1121
1133
}
@@ -1129,7 +1141,7 @@ AmclNode::initParameters()
1129
1141
1130
1142
if (resample_interval_ <= 0 ) {
1131
1143
RCLCPP_WARN (
1132
- get_logger (), " You've set resample_interval to be zero or negtive ,"
1144
+ get_logger (), " You've set resample_interval to be zero or negative ,"
1133
1145
" this isn't allowed so it will be set to default value to 1." );
1134
1146
resample_interval_ = 1 ;
1135
1147
}
@@ -1542,6 +1554,10 @@ AmclNode::initServices()
1542
1554
" reinitialize_global_localization" ,
1543
1555
std::bind (&AmclNode::globalLocalizationCallback, this , _1, _2, _3));
1544
1556
1557
+ initial_guess_srv_ = create_service<nav2_msgs::srv::SetInitialPose>(
1558
+ " set_initial_pose" ,
1559
+ std::bind (&AmclNode::initialPoseReceivedSrv, this , _1, _2, _3));
1560
+
1545
1561
nomotion_update_srv_ = create_service<std_srvs::srv::Empty>(
1546
1562
" request_nomotion_update" ,
1547
1563
std::bind (&AmclNode::nomotionUpdateCallback, this , _1, _2, _3));
0 commit comments