Skip to content

Commit 35aa859

Browse files
author
bpwilcox
committed
add parameter reconfigure callback for Amcl
1 parent 7ddaaf4 commit 35aa859

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

‎nav2_amcl/include/nav2_amcl/amcl_node.hpp‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "nav2_util/lifecycle_node.hpp"
3535
#include "nav2_amcl/motion_model/motion_model.hpp"
3636
#include "nav2_amcl/sensors/laser/laser.hpp"
37+
#include "nav2_util/parameter_events_subscriber.hpp"
3738
#include "nav_msgs/srv/set_map.hpp"
3839
#include "sensor_msgs/msg/laser_scan.hpp"
3940
#include "std_srvs/srv/empty.hpp"
@@ -104,6 +105,10 @@ class AmclNode : public nav2_util::LifecycleNode
104105
tf2::Transform latest_tf_;
105106
void waitForTransforms();
106107

108+
// Parameter Event Subscriber
109+
std::shared_ptr<nav2_util::ParameterEventsSubscriber> param_subscriber_;
110+
void parameterEventCallback(const rcl_interfaces::msg::ParameterEvent::SharedPtr & event);
111+
107112
// Message filters
108113
void initMessageFilters();
109114
std::unique_ptr<message_filters::Subscriber<sensor_msgs::msg::LaserScan>> laser_scan_sub_;

‎nav2_amcl/src/amcl_node.cpp‎

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
346362
void
347363
AmclNode::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

10491061
void
@@ -1163,9 +1175,6 @@ AmclNode::initTransforms()
11631175
void
11641176
AmclNode::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

11981210
void
@@ -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()
12351249
void
12361250
AmclNode::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

Comments
 (0)