Skip to content

Commit c3255cd

Browse files
author
Enrique Fernandez
committed
Make dynamic reconfigure params RT-safe
1 parent 055f305 commit c3255cd

File tree

2 files changed

+72
-25
lines changed

2 files changed

+72
-25
lines changed

diff_drive_controller/include/diff_drive_controller/diff_drive_controller.h

+24-1
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,33 @@ namespace diff_drive_controller
139139
Odometry odometry_;
140140
geometry_msgs::TransformStamped odom_frame_;
141141

142-
/// Dynamic reconfigure server:
142+
/// Dynamic reconfigure server related:
143143
typedef dynamic_reconfigure::Server<DiffDriveControllerConfig> ReconfigureServer;
144144
boost::shared_ptr<ReconfigureServer> cfg_server_;
145145

146+
struct DynamicParams
147+
{
148+
double wheel_separation_multiplier;
149+
double left_wheel_radius_multiplier;
150+
double right_wheel_radius_multiplier;
151+
152+
double k_l;
153+
double k_r;
154+
155+
bool changed;
156+
157+
DynamicParams()
158+
: wheel_separation_multiplier(1.0)
159+
, left_wheel_radius_multiplier(1.0)
160+
, right_wheel_radius_multiplier(1.0)
161+
, k_l(1.0)
162+
, k_r(1.0)
163+
, changed(false)
164+
{}
165+
};
166+
realtime_tools::RealtimeBuffer<DynamicParams> dynamic_params_;
167+
DynamicParams dynamic_params_struct_;
168+
146169
/// Wheel separation, wrt the midpoint of the wheel width:
147170
double wheel_separation_;
148171

diff_drive_controller/src/diff_drive_controller.cpp

+48-24
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ namespace diff_drive_controller
134134
DiffDriveController::DiffDriveController()
135135
: open_loop_(false)
136136
, command_struct_()
137+
, dynamic_params_struct_()
137138
, wheel_separation_(0.0)
138139
, wheel_radius_(0.0)
139140
, wheel_separation_multiplier_(1.0)
@@ -279,6 +280,16 @@ namespace diff_drive_controller
279280
"Measurement Covariance Model params : k_l " << k_l_
280281
<< ", k_r " << k_r_);
281282

283+
dynamic_params_struct_.wheel_separation_multiplier = wheel_separation_multiplier_;
284+
285+
dynamic_params_struct_.left_wheel_radius_multiplier = left_wheel_radius_multiplier_;
286+
dynamic_params_struct_.right_wheel_radius_multiplier = right_wheel_radius_multiplier_;
287+
288+
dynamic_params_struct_.k_l = k_l_;
289+
dynamic_params_struct_.k_r = k_r_;
290+
291+
dynamic_params_.writeFromNonRT(dynamic_params_struct_);
292+
282293
setOdomPubFields(root_nh, controller_nh);
283294

284295
// Set dynamic reconfigure server callback:
@@ -303,6 +314,27 @@ namespace diff_drive_controller
303314

304315
void DiffDriveController::update(const ros::Time& time, const ros::Duration& period)
305316
{
317+
// UPDATE DYNAMIC PARAMS
318+
// Retreive dynamic params:
319+
DynamicParams dynamic_params = *(dynamic_params_.readFromRT());
320+
321+
// Update dynamic params:
322+
wheel_separation_multiplier_ = dynamic_params.wheel_separation_multiplier;
323+
left_wheel_radius_multiplier_ = dynamic_params.left_wheel_radius_multiplier;
324+
right_wheel_radius_multiplier_ = dynamic_params.right_wheel_radius_multiplier;
325+
326+
k_l_ = dynamic_params.k_l;
327+
k_r_ = dynamic_params.k_r;
328+
329+
// Apply multipliers:
330+
const double ws = wheel_separation_multiplier_ * wheel_separation_;
331+
const double wrl = left_wheel_radius_multiplier_ * wheel_radius_;
332+
const double wrr = right_wheel_radius_multiplier_ * wheel_radius_;
333+
334+
// Set the odometry parameters:
335+
odometry_.setWheelParams(ws, wrl, wrr);
336+
odometry_.setMeasCovarianceParams(k_l_, k_r_);
337+
306338
// COMPUTE AND PUBLISH ODOMETRY
307339
if (open_loop_)
308340
{
@@ -385,11 +417,6 @@ namespace diff_drive_controller
385417
limiter_ang_.limit(curr_cmd.ang, last_cmd_.ang, cmd_dt);
386418
last_cmd_ = curr_cmd;
387419

388-
// Apply multipliers:
389-
const double ws = wheel_separation_multiplier_ * wheel_separation_;
390-
const double wrl = left_wheel_radius_multiplier_ * wheel_radius_;
391-
const double wrr = right_wheel_radius_multiplier_ * wheel_radius_;
392-
393420
// Compute wheels velocities:
394421
const double vel_left = (curr_cmd.lin - curr_cmd.ang * ws / 2.0)/wrl;
395422
const double vel_right = (curr_cmd.lin + curr_cmd.ang * ws / 2.0)/wrr;
@@ -450,29 +477,26 @@ namespace diff_drive_controller
450477
void DiffDriveController::reconfigureCallback(
451478
DiffDriveControllerConfig& config, uint32_t level)
452479
{
453-
// @todo make this real-time safe!!!
454-
wheel_separation_multiplier_ = config.wheel_separation_multiplier;
480+
dynamic_params_struct_.wheel_separation_multiplier = config.wheel_separation_multiplier;
455481

456-
left_wheel_radius_multiplier_ = config.left_wheel_radius_multiplier;
457-
right_wheel_radius_multiplier_ = config.right_wheel_radius_multiplier;
482+
dynamic_params_struct_.left_wheel_radius_multiplier = config.left_wheel_radius_multiplier;
483+
dynamic_params_struct_.right_wheel_radius_multiplier = config.right_wheel_radius_multiplier;
458484

459-
k_l_ = config.k_l;
460-
k_r_ = config.k_r;
485+
dynamic_params_struct_.k_l = config.k_l;
486+
dynamic_params_struct_.k_r = config.k_r;
461487

462-
// Set the odometry parameters
463-
const double ws = wheel_separation_multiplier_ * wheel_separation_;
464-
const double wrl = left_wheel_radius_multiplier_ * wheel_radius_;
465-
const double wrr = right_wheel_radius_multiplier_ * wheel_radius_;
466-
odometry_.setWheelParams(ws, wrl, wrr);
467-
ROS_INFO_STREAM_NAMED(name_,
468-
"Odometry params : wheel separation " << ws
469-
<< ", left wheel radius " << wrl
470-
<< ", right wheel radius " << wrr);
488+
dynamic_params_.writeFromNonRT(dynamic_params_struct_);
471489

472-
odometry_.setMeasCovarianceParams(k_l_, k_r_);
473-
ROS_INFO_STREAM_NAMED(name_,
474-
"Measurement Covariance Model params : k_l " << k_l_
475-
<< ", k_r " << k_r_);
490+
ROS_DEBUG_STREAM_NAMED(name_,
491+
"Reconfigured Odometry params. "
492+
<< "wheel separation: " << dynamic_params_struct_.wheel_separation_multiplier << ", "
493+
<< "left wheel radius: " << dynamic_params_struct_.left_wheel_radius_multiplier << ", "
494+
<< "right wheel radius: " << dynamic_params_struct_.left_wheel_radius_multiplier);
495+
496+
ROS_DEBUG_STREAM_NAMED(name_,
497+
"Reconfigured Measurement Covariance Model params. "
498+
<< "k_l: " << dynamic_params_struct_.k_l << ", "
499+
<< "k_r: " << dynamic_params_struct_.k_r);
476500
}
477501

478502
bool DiffDriveController::getWheelNames(ros::NodeHandle& controller_nh,

0 commit comments

Comments
 (0)