@@ -199,10 +199,20 @@ bool IgnitionSystem::initSim(
199
199
return false ;
200
200
}
201
201
202
+ // parameters needed for joint control
203
+ std::vector<std::string> joint_names;
204
+ this ->param_node_ = rclcpp::Node::make_shared (
205
+ hardware_info.name ,
206
+ rclcpp::NodeOptions ().allow_undeclared_parameters (true ));
207
+ std::vector<rclcpp::Parameter> param_vec;
208
+
202
209
for (unsigned int j = 0 ; j < this ->dataPtr ->n_dof_ ; j++) {
203
210
auto & joint_info = hardware_info.joints [j];
204
211
std::string joint_name = this ->dataPtr ->joints_ [j].name = joint_info.name ;
205
212
213
+ // add as one of node parameters
214
+ joint_names.push_back (joint_name);
215
+
206
216
ignition::gazebo::Entity simjoint = enableJoints[joint_name];
207
217
this ->dataPtr ->joints_ [j].sim_joint = simjoint;
208
218
@@ -230,6 +240,39 @@ bool IgnitionSystem::initSim(
230
240
_ecm.CreateComponent (simjoint, ignition::gazebo::components::JointForce ());
231
241
}
232
242
243
+ // init PID
244
+ // assuming every joint has axis
245
+ const auto * jointAxis =
246
+ this ->dataPtr ->ecm ->Component <ignition::gazebo::components::JointAxis>(
247
+ this ->dataPtr ->joints_ [j].sim_joint );
248
+ // PID parameters
249
+ double p_gain = 100.0 ;
250
+ double i_gain = 1.0 ;
251
+ double d_gain = 50.0 ;
252
+ // set integral max and min component to 10 percent of the max effort
253
+ double iMax = std::isnan (jointAxis->Data ().Effort ()) ? 500.0 : jointAxis->Data ().Effort () *
254
+ 0.5 ;
255
+ double iMin = std::isnan (jointAxis->Data ().Effort ()) ? 500.0 : -jointAxis->Data ().Effort () *
256
+ 0.5 ;
257
+ double cmdMax =
258
+ std::isnan (jointAxis->Data ().Effort ()) ? 1000.0 : jointAxis->Data ().Effort ();
259
+ double cmdMin =
260
+ std::isnan (jointAxis->Data ().Effort ()) ? -1000.0 : -jointAxis->Data ().Effort ();
261
+ double cmdOffset = 0.0 ;
262
+
263
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .p" , p_gain});
264
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .i" , i_gain});
265
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .d" , d_gain});
266
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .iMax" , iMax});
267
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .iMin" , iMin});
268
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .cmdMax" , cmdMax});
269
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .cmdMin" , cmdMin});
270
+ param_vec.push_back (rclcpp::Parameter{" gains." + joint_name + " .cmdOffset" , cmdOffset});
271
+
272
+ this ->dataPtr ->joints_ [j].pid .Init (
273
+ p_gain, i_gain, d_gain, iMax, iMin, cmdMax, cmdMin,
274
+ cmdOffset);
275
+
233
276
// Accept this joint and continue configuration
234
277
RCLCPP_INFO_STREAM (this ->nh_ ->get_logger (), " Loading joint: " << joint_name);
235
278
@@ -348,44 +391,6 @@ bool IgnitionSystem::initSim(
348
391
if (!std::isnan (initial_position)) {
349
392
this ->dataPtr ->joints_ [j].joint_position_cmd = initial_position;
350
393
}
351
-
352
- // init position PID
353
-
354
- // assuming every joint has axis
355
- const auto * jointAxis =
356
- this ->dataPtr ->ecm ->Component <ignition::gazebo::components::JointAxis>(
357
- this ->dataPtr ->joints_ [i].sim_joint );
358
- // PID parameters
359
- double p_gain = 100.0 ;
360
- double i_gain = 0.0 ;
361
- double d_gain = 50.0 ;
362
- // set integral max and min component to 10 percent of the max effort
363
- double iMax = std::isnan (jointAxis->Data ().Effort ()) ? 1.0 : jointAxis->Data ().Effort () *
364
- 0.1 ;
365
- double iMin = std::isnan (jointAxis->Data ().Effort ()) ? 1.0 : -jointAxis->Data ().Effort () *
366
- 0.1 ;
367
- double cmdMax =
368
- std::isnan (jointAxis->Data ().Effort ()) ? 1000.0 : jointAxis->Data ().Effort ();
369
- double cmdMin =
370
- std::isnan (jointAxis->Data ().Effort ()) ? -1000.0 : -jointAxis->Data ().Effort ();
371
- double cmdOffset = 0.0 ;
372
-
373
- igndbg << " [JointController " << joint_name <<
374
- " ] Position based PID with Force/Torque output:" << std::endl;
375
- igndbg << " p_gain: [" << p_gain << " ]" << std::endl;
376
- igndbg << " i_gain: [" << i_gain << " ]" << std::endl;
377
- igndbg << " d_gain: [" << d_gain << " ]" << std::endl;
378
- igndbg << " i_max: [" << iMax << " ]" << std::endl;
379
- igndbg << " i_min: [" << iMin << " ]" << std::endl;
380
- igndbg << " cmd_max: [" << cmdMax << " ]" << std::endl;
381
- igndbg << " cmd_min: [" << cmdMin << " ]" << std::endl;
382
- igndbg << " cmd_offset: [" << cmdOffset << " ]" << std::endl;
383
-
384
-
385
- this ->dataPtr ->joints_ [j].pid .Init (
386
- p_gain, i_gain, d_gain, iMax, iMin, cmdMax, cmdMin,
387
- cmdOffset);
388
-
389
394
} else if (joint_info.command_interfaces [i].name == " velocity" ) {
390
395
RCLCPP_INFO_STREAM (this ->nh_ ->get_logger (), " \t\t velocity" );
391
396
this ->dataPtr ->command_interfaces_ .emplace_back (
@@ -416,19 +421,32 @@ bool IgnitionSystem::initSim(
416
421
}
417
422
}
418
423
419
- registerSensors (hardware_info);
424
+ rclcpp::Parameter joint_names_parameter (" joints" , joint_names);
425
+ if (!this ->param_node_ ->has_parameter (" joints" )) {
426
+ this ->param_node_ ->set_parameter (joint_names_parameter);
427
+ }
428
+ for (const auto & p : param_vec) {
429
+ if (!this ->param_node_ ->has_parameter (p.get_name ())) {
430
+ this ->param_node_ ->set_parameter (p);
431
+ }
432
+ }
420
433
421
- this ->node_ = rclcpp::Node::make_shared (
422
- hardware_info.name ,
423
- rclcpp::NodeOptions ().allow_undeclared_parameters (
424
- true ).automatically_declare_parameters_from_overrides (true ));
434
+ spin_thread_ = std::thread ([this ]() {rclcpp::spin (this ->param_node_ );});
425
435
426
- auto spin = [this ]()
427
- {
428
- rclcpp::spin (node_);
429
- };
436
+ try {
437
+ // Create the parameter listener and get the parameters
438
+ param_listener_ = std::make_shared<ParamListener>(this ->param_node_ );
439
+ params_ = param_listener_->get_params ();
440
+ } catch (const std::exception & e) {
441
+ fprintf (stderr, " Exception thrown during init stage with message: %s \n " , e.what ());
442
+ return false ;
443
+ }
444
+
445
+ // update the params
446
+ param_vec.push_back (joint_names_parameter);
447
+ param_listener_->update (param_vec);
430
448
431
- spin_thread_ = std::thread (spin );
449
+ registerSensors (hardware_info );
432
450
433
451
return true ;
434
452
}
@@ -506,14 +524,7 @@ CallbackReturn
506
524
IgnitionSystem::on_init (const hardware_interface::HardwareInfo & system_info)
507
525
{
508
526
RCLCPP_WARN (this ->nh_ ->get_logger (), " On init..." );
509
- try {
510
- // Create the parameter listener and get the parameters
511
- param_listener_ = std::make_shared<ParamListener>(this ->node_ );
512
- params_ = param_listener_->get_params ();
513
- } catch (const std::exception & e) {
514
- fprintf (stderr, " Exception thrown during init stage with message: %s \n " , e.what ());
515
- return CallbackReturn::ERROR;
516
- }
527
+
517
528
if (hardware_interface::SystemInterface::on_init (system_info) != CallbackReturn::SUCCESS) {
518
529
return CallbackReturn::ERROR;
519
530
}
@@ -649,12 +660,35 @@ hardware_interface::return_type IgnitionSystem::write(
649
660
const rclcpp::Time & /* time*/ ,
650
661
const rclcpp::Duration & period)
651
662
{
663
+ // refresh params
664
+ param_listener_->refresh_dynamic_parameters ();
665
+ params_ = param_listener_->get_params ();
666
+
652
667
for (unsigned int i = 0 ; i < this ->dataPtr ->joints_ .size (); ++i) {
653
668
// assuming every joint has axis
654
669
const auto * jointAxis =
655
670
this ->dataPtr ->ecm ->Component <ignition::gazebo::components::JointAxis>(
656
671
this ->dataPtr ->joints_ [i].sim_joint );
657
672
673
+ // update PIDs
674
+ this ->dataPtr ->joints_ [i].pid .SetPGain (
675
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].p );
676
+ this ->dataPtr ->joints_ [i].pid .SetIGain (
677
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].i );
678
+ this ->dataPtr ->joints_ [i].pid .SetDGain (
679
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].d );
680
+ this ->dataPtr ->joints_ [i].pid .SetIMax (
681
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].iMax );
682
+ this ->dataPtr ->joints_ [i].pid .SetIMin (
683
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].iMin );
684
+ this ->dataPtr ->joints_ [i].pid .SetCmdMax (
685
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].cmdMax );
686
+ this ->dataPtr ->joints_ [i].pid .SetCmdMin (
687
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].name ].cmdMin );
688
+ this ->dataPtr ->joints_ [i].pid .SetCmdOffset (
689
+ params_.gains .joints_map [this ->dataPtr ->joints_ [i].
690
+ name].cmdOffset );
691
+
658
692
if (this ->dataPtr ->joints_ [i].joint_control_method & VELOCITY) {
659
693
if (!this ->dataPtr ->ecm ->Component <ignition::gazebo::components::JointVelocityCmd>(
660
694
this ->dataPtr ->joints_ [i].sim_joint ))
0 commit comments