Skip to content

Commit c018f7c

Browse files
committed
Refresh params every loop step.
1 parent 0104d7a commit c018f7c

File tree

2 files changed

+91
-58
lines changed

2 files changed

+91
-58
lines changed

ign_ros2_control/include/ign_ros2_control/ign_system.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ class IgnitionSystem : public IgnitionSystemInterface
9595
std::shared_ptr<ParamListener> param_listener_;
9696
Params params_;
9797

98-
rclcpp::Node::SharedPtr node_;
99-
98+
rclcpp::Node::SharedPtr param_node_;
10099
std::thread spin_thread_;
101100
};
102101

ign_ros2_control/src/ign_system.cpp

Lines changed: 90 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,20 @@ bool IgnitionSystem::initSim(
199199
return false;
200200
}
201201

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+
202209
for (unsigned int j = 0; j < this->dataPtr->n_dof_; j++) {
203210
auto & joint_info = hardware_info.joints[j];
204211
std::string joint_name = this->dataPtr->joints_[j].name = joint_info.name;
205212

213+
// add as one of node parameters
214+
joint_names.push_back(joint_name);
215+
206216
ignition::gazebo::Entity simjoint = enableJoints[joint_name];
207217
this->dataPtr->joints_[j].sim_joint = simjoint;
208218

@@ -230,6 +240,39 @@ bool IgnitionSystem::initSim(
230240
_ecm.CreateComponent(simjoint, ignition::gazebo::components::JointForce());
231241
}
232242

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+
233276
// Accept this joint and continue configuration
234277
RCLCPP_INFO_STREAM(this->nh_->get_logger(), "Loading joint: " << joint_name);
235278

@@ -348,44 +391,6 @@ bool IgnitionSystem::initSim(
348391
if (!std::isnan(initial_position)) {
349392
this->dataPtr->joints_[j].joint_position_cmd = initial_position;
350393
}
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-
389394
} else if (joint_info.command_interfaces[i].name == "velocity") {
390395
RCLCPP_INFO_STREAM(this->nh_->get_logger(), "\t\t velocity");
391396
this->dataPtr->command_interfaces_.emplace_back(
@@ -416,19 +421,32 @@ bool IgnitionSystem::initSim(
416421
}
417422
}
418423

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+
}
420433

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_);});
425435

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);
430448

431-
spin_thread_ = std::thread(spin);
449+
registerSensors(hardware_info);
432450

433451
return true;
434452
}
@@ -506,14 +524,7 @@ CallbackReturn
506524
IgnitionSystem::on_init(const hardware_interface::HardwareInfo & system_info)
507525
{
508526
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+
517528
if (hardware_interface::SystemInterface::on_init(system_info) != CallbackReturn::SUCCESS) {
518529
return CallbackReturn::ERROR;
519530
}
@@ -649,12 +660,35 @@ hardware_interface::return_type IgnitionSystem::write(
649660
const rclcpp::Time & /*time*/,
650661
const rclcpp::Duration & period)
651662
{
663+
// refresh params
664+
param_listener_->refresh_dynamic_parameters();
665+
params_ = param_listener_->get_params();
666+
652667
for (unsigned int i = 0; i < this->dataPtr->joints_.size(); ++i) {
653668
// assuming every joint has axis
654669
const auto * jointAxis =
655670
this->dataPtr->ecm->Component<ignition::gazebo::components::JointAxis>(
656671
this->dataPtr->joints_[i].sim_joint);
657672

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+
658692
if (this->dataPtr->joints_[i].joint_control_method & VELOCITY) {
659693
if (!this->dataPtr->ecm->Component<ignition::gazebo::components::JointVelocityCmd>(
660694
this->dataPtr->joints_[i].sim_joint))

0 commit comments

Comments
 (0)