Skip to content

[AUD-022][High] Unify PID simulator time and frequency parameter semantics #322

Description

@gabrielsantosphilips

Audit finding

  • ID: AUD-022
  • Status: Verified defect
  • Severity: High
  • Confidence: High
  • Audited revision: 2f479320d805a1f9f35ebe4afaaeeded48913a94

Problem

Step/ramp simulation passes UI kp, ki, and kd directly into the discrete incremental recurrence. Bode/root-locus code interprets the same values as continuous Kd*s^2 + Kp*s + Ki coefficients and then discretizes them. No Ki*Ts or Kd/Ts mapping reconciles the models, so views represent different controllers.

Source:

TransferFunction PidSimulator::GetPidTf() const
{
float kp = configuration.tunings.kp;
float ki = configuration.tunings.ki;
float kd = configuration.tunings.kd;
return { { kd, kp, ki }, { 1.0f, 0.0f } };
}
TransferFunction PidSimulator::GetOpenLoopTf() const
and
std::size_t numSamples = referenceSignal.size();
TimeResponse response;
response.time.resize(numSamples);
response.reference = referenceSignal;
response.output.resize(numSamples, 0.0f);
response.controlSignal.resize(numSamples, 0.0f);
response.error.resize(numSamples, 0.0f);
::controllers::PidIncrementalSynchronous<float> pid(configuration.tunings, configuration.limits);
plant->Reset();
for (std::size_t i = 0; i < numSamples; ++i)
{
response.time[i] = static_cast<float>(i) * dt;
float y = plant->Output();
response.output[i] = y;
response.error[i] = referenceSignal[i] - y;
pid.SetPoint(referenceSignal[i]);
float u = pid.Process(y);
response.controlSignal[i] = u;

Allowed Kd=0 also leaves a leading-zero polynomial that the root solver treats as full order.

Acceptance criteria

  • Define one PID gain convention for all views.
  • Derive time, Bode, and root-locus behavior from the same discrete controller.
  • Trim leading polynomial zeros safely.
  • Add cross-view pole and step-response consistency tests.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions