16 pid.proportional_gain = torqueConfigData->pid_proportional_gain;
17 pid.integral_gain = torqueConfigData->pid_integral_gain;
18 pid.derivative_gain = torqueConfigData->pid_derivative_gain;
19 pid.windup_guard = torqueConfigData->pid_windup_guard;
20 pid.max_value = torqueConfigData->pid_max_value;
21 pid.min_value = torqueConfigData->pid_min_value;
22 pid.dis = torqueConfigData->pid_dis;
23 pid.Kd = torqueConfigData->Kd;
24 pid.inertia = torqueConfigData->inertia;
25 pid.scalePI = torqueConfigData->scalePI;
26 pid.scaleTorque = torqueConfigData->scaleTorque;
27 pid.maxTorque = torqueConfigData->maxTorque;
28 pid.actuatorType = torqueConfigData->actuatorType;
29 filter.setImpulseResponse({
30 0.1744f, 0.0205f, 0.0215f, 0.0225f, 0.0235f, 0.0244f, 0.0252f,
31 0.0259f, 0.0265f, 0.0270f, 0.0274f, 0.0276f, 0.0278f, 0.0282f,
32 0.0282f, 0.0278f, 0.0276f, 0.0274f, 0.0270f, 0.0265f, 0.0259f,
33 0.0252f, 0.0244f, 0.0235f, 0.0225f, 0.0215f, 0.0205f, 0.1744f});
127 const std::string& jointName,
131 float actualVelocity,
132 float actualPosition)
135 double scalePI = pid.scalePI;
136 double dt = timeSinceLastIteration.toSecondsDouble();
137 pid.proportional_gain = 0;
138 pid.integral_gain = 0;
140 float actualTorqueF =
141 filter.update(actualTorque);
142 Kd = (-gravity + targetTorque + actualTorqueF) /
148 if ((pid.actuatorType == 1) && (Kd < 6))
156 if (pid.actuatorType == 1)
159 (-0.003721 * std::pow(Kd, 2.0) + 0.43429 * Kd - 1.4408) * (scalePI * 0.45);
163 pid.integral_gain = 1.2 * scalePI;
164 pid.proportional_gain = 0.03;
166 if (pid.integral_gain < 0)
168 pid.integral_gain = 0.5;
170 pid.findAcc(actualVelocity,
dt);
180 (-gravity + targetTorque - Kd * actualVelocity);
187 pid.update(CurrError,
dt);
189 float current = -(pid.control) * 1000.0;
198 double pushbackMargin = 5.0 / 180. *
M_PI;
199 double pushBackTorque = 100;
201 double jointLimitProtection = 0;
202 if (!configData->limitless)
204 double borderHigh = configData->jointLimitHigh - pushbackMargin;
205 double borderLow = configData->jointLimitLow + pushbackMargin;
206 double penetration = 0;
207 if (actualPosition > borderHigh)
209 penetration = actualPosition - borderHigh;
211 else if (actualPosition < borderLow)
213 penetration = actualPosition - borderLow;
215 jointLimitProtection = penetration / pushbackMargin * pushBackTorque;
218 return jointLimitProtection;
float update(const IceUtil::Time &timeSinceLastIteration, const std::string &jointName, float gravity, float actualTorque, float targetTorque, float actualVelocity, float actualPosition)