@@ -134,6 +134,7 @@ namespace diff_drive_controller
134
134
DiffDriveController::DiffDriveController ()
135
135
: open_loop_(false )
136
136
, command_struct_()
137
+ , dynamic_params_struct_()
137
138
, wheel_separation_(0.0 )
138
139
, wheel_radius_(0.0 )
139
140
, wheel_separation_multiplier_(1.0 )
@@ -279,6 +280,16 @@ namespace diff_drive_controller
279
280
" Measurement Covariance Model params : k_l " << k_l_
280
281
<< " , k_r " << k_r_);
281
282
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
+
282
293
setOdomPubFields (root_nh, controller_nh);
283
294
284
295
// Set dynamic reconfigure server callback:
@@ -303,6 +314,27 @@ namespace diff_drive_controller
303
314
304
315
void DiffDriveController::update (const ros::Time& time, const ros::Duration & period)
305
316
{
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
+
306
338
// COMPUTE AND PUBLISH ODOMETRY
307
339
if (open_loop_)
308
340
{
@@ -385,11 +417,6 @@ namespace diff_drive_controller
385
417
limiter_ang_.limit (curr_cmd.ang , last_cmd_.ang , cmd_dt);
386
418
last_cmd_ = curr_cmd;
387
419
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
-
393
420
// Compute wheels velocities:
394
421
const double vel_left = (curr_cmd.lin - curr_cmd.ang * ws / 2.0 )/wrl;
395
422
const double vel_right = (curr_cmd.lin + curr_cmd.ang * ws / 2.0 )/wrr;
@@ -450,29 +477,26 @@ namespace diff_drive_controller
450
477
void DiffDriveController::reconfigureCallback (
451
478
DiffDriveControllerConfig& config, uint32_t level)
452
479
{
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 ;
455
481
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 ;
458
484
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 ;
461
487
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_);
471
489
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 );
476
500
}
477
501
478
502
bool DiffDriveController::getWheelNames (ros::NodeHandle& controller_nh,
0 commit comments