@@ -194,14 +194,21 @@ AmclNode::on_configure(const rclcpp_lifecycle::State & /*state*/)
194194 RCLCPP_INFO (get_logger (), " Configuring" );
195195
196196 initParameters ();
197+ if (always_reset_initial_pose_) {
198+ initial_pose_is_known_ = false ;
199+ }
197200 initTransforms ();
198- initMessageFilters ();
199201 initPubSub ();
202+ initMessageFilters ();
200203 initServices ();
201204 initOdometry ();
202205 initParticleFilter ();
203206 initLaserScan ();
204207
208+ param_subscriber_ = std::make_shared<nav2_util::ParameterEventsSubscriber>(shared_from_this ());
209+ param_subscriber_->set_event_callback (
210+ std::bind (&AmclNode::parameterEventCallback, this , std::placeholders::_1));
211+
205212 return nav2_util::CallbackReturn::SUCCESS;
206213}
207214
@@ -343,6 +350,15 @@ AmclNode::on_shutdown(const rclcpp_lifecycle::State & /*state*/)
343350 return nav2_util::CallbackReturn::SUCCESS;
344351}
345352
353+ void
354+ AmclNode::parameterEventCallback (const rcl_interfaces::msg::ParameterEvent::SharedPtr & /* event*/ )
355+ {
356+ initParameters ();
357+ initMessageFilters ();
358+ initOdometry ();
359+ initParticleFilter ();
360+ }
361+
346362void
347363AmclNode::checkLaserReceived ()
348364{
@@ -1040,10 +1056,6 @@ AmclNode::initParameters()
10401056 " this isn't allowed so max_particles will be set to min_particles." );
10411057 max_particles_ = min_particles_;
10421058 }
1043-
1044- if (always_reset_initial_pose_) {
1045- initial_pose_is_known_ = false ;
1046- }
10471059}
10481060
10491061void
@@ -1163,9 +1175,6 @@ AmclNode::initTransforms()
11631175void
11641176AmclNode::initMessageFilters ()
11651177{
1166- laser_scan_sub_ = std::make_unique<message_filters::Subscriber<sensor_msgs::msg::LaserScan>>(
1167- rclcpp_node_.get (), scan_topic_, rmw_qos_profile_sensor_data);
1168-
11691178 laser_scan_filter_ = std::make_unique<tf2_ros::MessageFilter<sensor_msgs::msg::LaserScan>>(
11701179 *laser_scan_sub_, *tf_buffer_, odom_frame_id_, 10 , rclcpp_node_);
11711180
@@ -1193,6 +1202,9 @@ AmclNode::initPubSub()
11931202 std::bind (&AmclNode::mapReceived, this , std::placeholders::_1));
11941203
11951204 RCLCPP_INFO (get_logger (), " Subscribed to map topic." );
1205+
1206+ laser_scan_sub_ = std::make_unique<message_filters::Subscriber<sensor_msgs::msg::LaserScan>>(
1207+ rclcpp_node_.get (), scan_topic_, rmw_qos_profile_sensor_data);
11961208}
11971209
11981210void
@@ -1225,7 +1237,9 @@ AmclNode::initOdometry()
12251237 init_cov_[1 ] = last_published_pose_.pose .covariance [7 ];
12261238 init_cov_[2 ] = last_published_pose_.pose .covariance [35 ];
12271239 }
1228-
1240+ if (motion_model_) {
1241+ motion_model_.reset ();
1242+ }
12291243 motion_model_ = std::unique_ptr<nav2_amcl::MotionModel>(nav2_amcl::MotionModel::createMotionModel (
12301244 robot_model_type_, alpha1_, alpha2_, alpha3_, alpha4_, alpha5_));
12311245
@@ -1235,6 +1249,11 @@ AmclNode::initOdometry()
12351249void
12361250AmclNode::initParticleFilter ()
12371251{
1252+ if (pf_ != nullptr ) {
1253+ pf_free (pf_);
1254+ pf_ = nullptr ;
1255+ }
1256+
12381257 // Create the particle filter
12391258 pf_ = pf_alloc (min_particles_, max_particles_, alpha_slow_, alpha_fast_,
12401259 (pf_init_model_fn_t )AmclNode::uniformPoseGenerator,
0 commit comments