Skip to content

Commit 6d5eda3

Browse files
committed
Add pid params via hardware parameters.
1 parent cb75106 commit 6d5eda3

File tree

1 file changed

+50
-28
lines changed

1 file changed

+50
-28
lines changed

ign_ros2_control/src/ign_system.cpp

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
#include <ignition/transport/Node.hh>
4545

46+
#include <iostream>
4647

4748
#include <hardware_interface/hardware_info.hpp>
4849

@@ -246,19 +247,47 @@ bool IgnitionSystem::initSim(
246247
this->dataPtr->ecm->Component<ignition::gazebo::components::JointAxis>(
247248
this->dataPtr->joints_[j].sim_joint);
248249
// PID parameters
249-
double p_gain = 1000.0;
250-
double i_gain = 0.0;
251-
double d_gain = 0.0;
250+
double p_gain =
251+
(hardware_info.joints[j].parameters.find("p") ==
252+
hardware_info.joints[j].parameters.end() ) ? 100.0 : stod(
253+
hardware_info.joints[j].parameters.at(
254+
"p"));
255+
double i_gain =
256+
(hardware_info.joints[j].parameters.find("i") ==
257+
hardware_info.joints[j].parameters.end() ) ? 0.0 : stod(
258+
hardware_info.joints[j].parameters.at(
259+
"i"));
260+
double d_gain =
261+
(hardware_info.joints[j].parameters.find("d") ==
262+
hardware_info.joints[j].parameters.end() ) ? 5.0 : stod(
263+
hardware_info.joints[j].parameters.at(
264+
"d"));
252265
// set integral max and min component to 50 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;
266+
double iMax =
267+
(hardware_info.joints[j].parameters.find("iMax") ==
268+
hardware_info.joints[j].parameters.end() ) ? 500.0 : stod(
269+
hardware_info.joints[j].parameters.at(
270+
"iMax"));
271+
double iMin =
272+
(hardware_info.joints[j].parameters.find("iMin") ==
273+
hardware_info.joints[j].parameters.end() ) ? -500 : stod(
274+
hardware_info.joints[j].parameters.at(
275+
"iMin"));
257276
double cmdMax =
258-
std::isnan(jointAxis->Data().Effort()) ? 1000.0 : jointAxis->Data().Effort();
277+
(hardware_info.joints[j].parameters.find("cmdMax") ==
278+
hardware_info.joints[j].parameters.end() ) ? 1000.0 : stod(
279+
hardware_info.joints[j].parameters.at(
280+
"cmdMax"));
259281
double cmdMin =
260-
std::isnan(jointAxis->Data().Effort()) ? -1000.0 : -jointAxis->Data().Effort();
261-
double cmdOffset = 0.0;
282+
(hardware_info.joints[j].parameters.find("cmdMin") ==
283+
hardware_info.joints[j].parameters.end() ) ? -1000.0 : stod(
284+
hardware_info.joints[j].parameters.at(
285+
"cmdMin"));
286+
double cmdOffset =
287+
(hardware_info.joints[j].parameters.find("cmdOffset") ==
288+
hardware_info.joints[j].parameters.end() ) ? 0.0 : stod(
289+
hardware_info.joints[j].parameters.at(
290+
"cmdOffset"));
262291

263292
param_vec.push_back(rclcpp::Parameter{"gains." + joint_name + ".p", p_gain});
264293
param_vec.push_back(rclcpp::Parameter{"gains." + joint_name + ".i", i_gain});
@@ -665,6 +694,7 @@ hardware_interface::return_type IgnitionSystem::write(
665694
params_ = param_listener_->get_params();
666695

667696
for (unsigned int i = 0; i < this->dataPtr->joints_.size(); ++i) {
697+
668698
// assuming every joint has axis
669699
const auto * jointAxis =
670700
this->dataPtr->ecm->Component<ignition::gazebo::components::JointAxis>(
@@ -709,7 +739,6 @@ hardware_interface::return_type IgnitionSystem::write(
709739
double error = this->dataPtr->joints_[i].joint_position - std::clamp(
710740
this->dataPtr->joints_[i].joint_position_cmd, jointAxis->Data().Lower(),
711741
jointAxis->Data().Upper());
712-
713742
error =
714743
copysign(
715744
1.0,
@@ -723,6 +752,10 @@ hardware_interface::return_type IgnitionSystem::write(
723752
error, std::chrono::duration<double>(
724753
period.to_chrono<std::chrono::nanoseconds>()));
725754

755+
igndbg << "target_force ( joint [" <<
756+
this->dataPtr->joints_[i].name << "] ) = " << target_force <<
757+
"\n";
758+
726759
auto forceCmd =
727760
this->dataPtr->ecm->Component<ignition::gazebo::components::JointForceCmd>(
728761
this->dataPtr->joints_[i].sim_joint);
@@ -749,25 +782,10 @@ hardware_interface::return_type IgnitionSystem::write(
749782
*jointEffortCmd = ignition::gazebo::components::JointForceCmd(
750783
{this->dataPtr->joints_[i].joint_effort_cmd});
751784
}
752-
} /*else {
753-
// Fallback case is a velocity command of zero
754-
double target_vel = 0.0;
755-
auto vel =
756-
this->dataPtr->ecm->Component<ignition::gazebo::components::JointVelocityCmd>(
757-
this->dataPtr->joints_[i].sim_joint);
758-
759-
if (vel == nullptr) {
760-
this->dataPtr->ecm->CreateComponent(
761-
this->dataPtr->joints_[i].sim_joint,
762-
ignition::gazebo::components::JointVelocityCmd({target_vel}));
763-
} else if (!vel->Data().empty()) {
764-
vel->Data()[0] = target_vel;
765-
} else if (!vel->Data().empty()) {
766-
vel->Data()[0] = target_vel;
767-
}
768-
}*/
785+
}
769786
}
770787

788+
771789
// set values of all mimic joints with respect to mimicked joint
772790
for (const auto & mimic_joint : this->dataPtr->mimic_joints_) {
773791
for (const auto & mimic_interface : mimic_joint.interfaces_to_mimic) {
@@ -800,6 +818,10 @@ hardware_interface::return_type IgnitionSystem::write(
800818
position_error,
801819
std::chrono::duration<double>(period.to_chrono<std::chrono::nanoseconds>()));
802820

821+
igndbg << "target_force ( mimic joint [" <<
822+
this->dataPtr->joints_[mimic_joint.joint_index].name << "] ) = " << target_force <<
823+
"\n";
824+
803825
auto forceCmd =
804826
this->dataPtr->ecm->Component<ignition::gazebo::components::JointForceCmd>(
805827
this->dataPtr->joints_[mimic_joint.joint_index].sim_joint);

0 commit comments

Comments
 (0)