{
  "node": {
    "id": "term:pid-controller",
    "type": "Term",
    "label": "PID controller",
    "properties": {
      "id": "pid-controller",
      "name": "PID controller",
      "abbr": "PID",
      "aka": [
        "proportional–integral–derivative controller",
        "PI controller"
      ],
      "section": "topic-data",
      "definition": "A feedback controller whose output is a weighted sum of the present error, its accumulated integral and its rate of change. It is the workhorse of battery systems — holding coolant temperature with a pump or compressor, regulating charger current and voltage — and often runs as PI only, without the derivative term.",
      "formula": "u = K_p·e + K_i·∫e dt + K_d·de/dt",
      "related": [
        "feedback-feedforward-control",
        "gain-scheduling",
        "thermal-management",
        "plant-model",
        "model-predictive-control"
      ],
      "example": {
        "title": "Separate three controller contributions",
        "text": "For an illustrative error e = 2, accumulated error 3 s and error slope −0.5/s, gains Kp = 1, Ki = 0.5/s and Kd = 0.2 s give u = 2 + 1.5 − 0.1 = 3.4. Output limits and anti-windup are separate design choices."
      },
      "url": "https://lemonergy.com/learn/glossary/pid-controller/",
      "mentions": [
        "charger",
        "refrigerant-loop"
      ]
    }
  },
  "edges": [
    {
      "id": "edge:5291",
      "source": "term:pid-controller",
      "target": "topic:topic-data",
      "type": "belongsTo",
      "properties": {
        "sourceFile": "terms.json"
      }
    },
    {
      "id": "edge:5292",
      "source": "term:pid-controller",
      "target": "term:feedback-feedforward-control",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:5293",
      "source": "term:pid-controller",
      "target": "term:gain-scheduling",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:5294",
      "source": "term:pid-controller",
      "target": "term:thermal-management",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:5295",
      "source": "term:pid-controller",
      "target": "term:plant-model",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:5296",
      "source": "term:pid-controller",
      "target": "term:model-predictive-control",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:mentions/pid-controller/charger",
      "source": "term:pid-controller",
      "target": "term:charger",
      "type": "mentions",
      "properties": {
        "sourceFile": "terms.json",
        "method": "build_glossary.mention_index + mentions",
        "field": "definition",
        "meaning": "Text mention; not a causal claim"
      }
    },
    {
      "id": "edge:mentions/pid-controller/refrigerant-loop",
      "source": "term:pid-controller",
      "target": "term:refrigerant-loop",
      "type": "mentions",
      "properties": {
        "sourceFile": "terms.json",
        "method": "build_glossary.mention_index + mentions",
        "field": "definition",
        "meaning": "Text mention; not a causal claim"
      }
    },
    {
      "id": "edge:5299",
      "source": "term:pid-controller",
      "target": "visual:pid-terms",
      "type": "illustratedBy",
      "properties": {
        "sourceFile": "visual-pages.json"
      }
    },
    {
      "id": "edge:5300",
      "source": "term:pid-controller",
      "target": "reference:astrom-murray-feedback",
      "type": "cites",
      "properties": {
        "sourceFile": "wiki-references.json",
        "scope": "direct technical reference"
      }
    }
  ],
  "neighbors": [
    {
      "id": "topic:topic-data",
      "type": "Topic",
      "label": "Data, communication and electronics",
      "properties": {
        "id": "topic-data",
        "name": "Data, communication and electronics",
        "lede": "The control units, chips, protocols and file formats through which a battery is measured, controlled and logged.",
        "context": "Separate quantities from encoding and transport.",
        "example": "2500 in a log might mean 25.00 °C, 2.5 V or raw counts. Units and scale must accompany the value.",
        "lesson_url": "https://lemonergy.com/learn/fundamentals/battery-basics/",
        "lesson_label": "Open battery basics"
      }
    },
    {
      "id": "term:feedback-feedforward-control",
      "type": "Term",
      "label": "Feedback and feedforward control",
      "properties": {
        "id": "feedback-feedforward-control",
        "name": "Feedback and feedforward control",
        "aka": [
          "closed-loop control",
          "open-loop control",
          "feedback control",
          "feedforward control"
        ],
        "section": "topic-data",
        "definition": "Two ways of deciding a control input. Feedback measures the result and corrects an error after it appears; feedforward acts in advance on a known disturbance or setpoint, using a model. A battery cooling loop may feed forward the heat expected from the requested current and use feedback on cell temperature to trim the remaining error.",
        "related": [
          "pid-controller",
          "plant-model",
          "model-predictive-control",
          "thermal-management",
          "heat-generation"
        ],
        "url": "https://lemonergy.com/learn/glossary/feedback-feedforward-control/",
        "mentions": []
      }
    },
    {
      "id": "term:gain-scheduling",
      "type": "Term",
      "label": "Gain scheduling",
      "properties": {
        "id": "gain-scheduling",
        "name": "Gain scheduling",
        "section": "topic-data",
        "definition": "Changing a controller’s or estimator’s gains with the operating point, usually by look-up tables indexed by measured variables. Because a cell’s resistance and dynamics change sharply with temperature and SOC, BMS thermal loops and state estimators often switch or interpolate their parameters across those ranges instead of using one fixed tuning.",
        "related": [
          "pid-controller",
          "kalman-filter",
          "equivalent-circuit-model",
          "feedback-feedforward-control",
          "plant-model"
        ],
        "url": "https://lemonergy.com/learn/glossary/gain-scheduling/",
        "mentions": [
          "state-of-charge",
          "bms"
        ]
      }
    },
    {
      "id": "term:thermal-management",
      "type": "Term",
      "label": "Thermal management",
      "properties": {
        "id": "thermal-management",
        "name": "Thermal management",
        "abbr": "TMS",
        "aka": [
          "battery thermal management system",
          "BTMS"
        ],
        "section": "topic-thermal",
        "definition": "Keeping cells in their comfortable range, roughly 15–35 °C, and within a few degrees of each other: liquid cooling plates, refrigerant plates or immersion for heat removal, and heaters or waste heat for warming before fast charging in the cold.",
        "related": [
          "cooling-plate",
          "thermal-interface-material",
          "operating-temperature",
          "heat-generation",
          "preconditioning",
          "temperature-sensor"
        ],
        "url": "https://lemonergy.com/learn/glossary/thermal-management/",
        "mentions": [
          "fast-charging"
        ]
      }
    },
    {
      "id": "term:plant-model",
      "type": "Term",
      "label": "Plant model",
      "properties": {
        "id": "plant-model",
        "name": "Plant model",
        "aka": [
          "system model"
        ],
        "section": "topic-data",
        "definition": "A model of the system being controlled — cells, pack, cooling loop, charger — as distinct from the controller itself. Engineers tune and verify BMS software against it in model-, software- and hardware-in-the-loop tests, so its fidelity, often an equivalent circuit model coupled to a thermal model, limits how much those tests prove.",
        "related": [
          "hil",
          "equivalent-circuit-model",
          "thermal-model",
          "digital-twin",
          "battery-emulator"
        ],
        "url": "https://lemonergy.com/learn/glossary/plant-model/",
        "mentions": [
          "charger",
          "bms",
          "firmware"
        ]
      }
    },
    {
      "id": "term:model-predictive-control",
      "type": "Term",
      "label": "Model predictive control",
      "properties": {
        "id": "model-predictive-control",
        "name": "Model predictive control",
        "abbr": "MPC",
        "section": "topic-data",
        "definition": "Control that uses a model to predict the system’s behaviour over a short horizon, chooses the input sequence that best meets a goal within constraints, applies the first step and repeats. In batteries it suits fast charging — the most current possible without breaching voltage or temperature limits or risking lithium plating — at a higher computing cost than PID.",
        "related": [
          "plant-model",
          "pid-controller",
          "fast-charging",
          "lithium-plating",
          "thermal-management",
          "equivalent-circuit-model"
        ],
        "url": "https://lemonergy.com/learn/glossary/model-predictive-control/",
        "mentions": []
      }
    },
    {
      "id": "term:charger",
      "type": "Term",
      "label": "Charger",
      "properties": {
        "id": "charger",
        "name": "Charger",
        "section": "topic-charging",
        "definition": "The power electronics that convert mains or DC supply into the controlled current and voltage a battery needs. For lithium-ion it runs the CC-CV profile within the limits the BMS communicates, and stops rather than floats when the cell is full.",
        "related": [
          "cc-cv-charging",
          "bms",
          "onboard-charger",
          "dc-fast-charging"
        ],
        "url": "https://lemonergy.com/learn/glossary/charger/",
        "mentions": []
      }
    },
    {
      "id": "term:refrigerant-loop",
      "type": "Term",
      "label": "Refrigerant loop",
      "properties": {
        "id": "refrigerant-loop",
        "name": "Refrigerant loop",
        "aka": [
          "vapour-compression cycle",
          "air-conditioning circuit",
          "evaporator",
          "condenser",
          "compressor",
          "R1234yf",
          "R744"
        ],
        "section": "topic-thermal",
        "definition": "A closed vapour-compression circuit: a compressor raises refrigerant pressure and temperature, a condenser rejects that heat to air, an expansion valve drops the pressure, and an evaporator absorbs heat as the refrigerant boils. Batteries draw on it through a chiller or through refrigerant plates that act as evaporators; R1234yf and CO₂ (R744) are the usual refrigerants.",
        "related": [
          "chiller",
          "heat-pump",
          "heat-exchanger",
          "radiator",
          "thermal-management"
        ],
        "url": "https://lemonergy.com/learn/glossary/refrigerant-loop/",
        "mentions": []
      }
    },
    {
      "id": "visual:pid-terms",
      "type": "Visual",
      "label": "Separate proportional, integral and derivative action",
      "properties": {
        "title": "Separate proportional, integral and derivative action",
        "summary": "Apply PID terms to a prescribed smooth error to see what each contribution does.",
        "readout": "At t = 0⁺, output is 0.9. At long time, the stored integral approaches 1.",
        "formula": "e(t) = exp(−t/10); u = Kp e + Ki ∫e dt + Kd de/dt",
        "note": "Zero initial integral; no actuator limits, anti-windup, derivative filtering, sampled implementation or setpoint discontinuity. The smooth error is an input, not a simulated closed-loop result.",
        "software": {
          "status": "reference",
          "label": "Reference concept",
          "body": "These are controller contributions for a chosen error signal. The chart does not close a loop around a plant, tune gains or demonstrate stability.",
          "href": "../chapter-1/"
        },
        "html": "<figure class=\"visual-figure\"><figcaption>PID contributions to a prescribed error</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-pid-terms-0-title static-pid-terms-0-desc\"><title id=\"static-pid-terms-0-title\">PID contributions to a prescribed error</title><desc id=\"static-pid-terms-0-desc\">Time (s) versus Normalized output contribution. P term; I term; D term. Interpretation follows the graphs.</desc><path d=\"M74,238h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"242\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">-0.6</text><text x=\"74\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">0</text><path d=\"M74,188.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"192.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">0.05</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">12.5</text><path d=\"M74,139h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">0.7</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">25</text><path d=\"M74,89.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">1.35</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">37.5</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">2</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">50</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#2459a8\" stroke-width=\"2.8\" points=\"74.00,116.15 76.68,119.87 79.36,123.40 82.04,126.76 84.72,129.96 87.40,133.00 90.08,135.89 92.76,138.64 95.44,141.26 98.12,143.75 100.80,146.12 103.48,148.37 106.16,150.51 108.84,152.55 111.52,154.49 114.20,156.34 116.88,158.09 119.56,159.76 122.24,161.35 124.92,162.86 127.60,164.29 130.28,165.66 132.96,166.96 135.64,168.19 138.32,169.37 141.00,170.49 143.68,171.55 146.36,172.57 149.04,173.53 151.72,174.44 154.40,175.32 157.08,176.14 159.76,176.93 162.44,177.68 165.12,178.40 167.80,179.07 170.48,179.72 173.16,180.33 175.84,180.92 178.52,181.47 181.20,182.00 183.88,182.50 186.56,182.98 189.24,183.44 191.92,183.87 194.60,184.28 197.28,184.67 199.96,185.04 202.64,185.40 205.32,185.74 208.00,186.06 210.68,186.36 213.36,186.65 216.04,186.93 218.72,187.19 221.40,187.44 224.08,187.68 226.76,187.90 229.44,188.12 232.12,188.32 234.80,188.52 237.48,188.70 240.16,188.88 242.84,189.04 245.52,189.20 248.20,189.35 250.88,189.50 253.56,189.64 256.24,189.77 258.92,189.89 261.60,190.01 264.28,190.12 266.96,190.23 269.64,190.33 272.32,190.42 275.00,190.52 277.68,190.60 280.36,190.69 283.04,190.77 285.72,190.84 288.40,190.91 291.08,190.98 293.76,191.05 296.44,191.11 299.12,191.17 301.80,191.22 304.48,191.27 307.16,191.32 309.84,191.37 312.52,191.42 315.20,191.46 317.88,191.50 320.56,191.54 323.24,191.58 325.92,191.62 328.60,191.65 331.28,191.68 333.96,191.71 336.64,191.74 339.32,191.77 342.00,191.79\"/><polyline fill=\"none\" stroke=\"#6953a8\" stroke-width=\"2.8\" stroke-dasharray=\"7 4\" points=\"74.00,192.31 76.68,188.59 79.36,185.06 82.04,181.70 84.72,178.50 87.40,175.46 90.08,172.57 92.76,169.82 95.44,167.20 98.12,164.71 100.80,162.34 103.48,160.09 106.16,157.95 108.84,155.91 111.52,153.97 114.20,152.13 116.88,150.37 119.56,148.70 122.24,147.12 124.92,145.61 127.60,144.17 130.28,142.80 132.96,141.50 135.64,140.27 138.32,139.09 141.00,137.97 143.68,136.91 146.36,135.90 149.04,134.93 151.72,134.02 154.40,133.15 157.08,132.32 159.76,131.53 162.44,130.78 165.12,130.07 167.80,129.39 170.48,128.74 173.16,128.13 175.84,127.54 178.52,126.99 181.20,126.46 183.88,125.96 186.56,125.48 189.24,125.02 191.92,124.59 194.60,124.18 197.28,123.79 199.96,123.42 202.64,123.06 205.32,122.73 208.00,122.40 210.68,122.10 213.36,121.81 216.04,121.53 218.72,121.27 221.40,121.02 224.08,120.78 226.76,120.56 229.44,120.34 232.12,120.14 234.80,119.95 237.48,119.76 240.16,119.58 242.84,119.42 245.52,119.26 248.20,119.11 250.88,118.96 253.56,118.83 256.24,118.70 258.92,118.57 261.60,118.45 264.28,118.34 266.96,118.23 269.64,118.13 272.32,118.04 275.00,117.94 277.68,117.86 280.36,117.77 283.04,117.70 285.72,117.62 288.40,117.55 291.08,117.48 293.76,117.42 296.44,117.35 299.12,117.30 301.80,117.24 304.48,117.19 307.16,117.14 309.84,117.09 312.52,117.04 315.20,117.00 317.88,116.96 320.56,116.92 323.24,116.88 325.92,116.85 328.60,116.81 331.28,116.78 333.96,116.75 336.64,116.72 339.32,116.69 342.00,116.67\"/><polyline fill=\"none\" stroke=\"#a45b2b\" stroke-width=\"2.8\" points=\"74.00,199.92 76.68,199.55 79.36,199.20 82.04,198.86 84.72,198.54 87.40,198.24 90.08,197.95 92.76,197.67 95.44,197.41 98.12,197.16 100.80,196.93 103.48,196.70 106.16,196.49 108.84,196.28 111.52,196.09 114.20,195.90 116.88,195.73 119.56,195.56 122.24,195.40 124.92,195.25 127.60,195.11 130.28,194.97 132.96,194.84 135.64,194.72 138.32,194.60 141.00,194.49 143.68,194.38 146.36,194.28 149.04,194.19 151.72,194.09 154.40,194.01 157.08,193.92 159.76,193.85 162.44,193.77 165.12,193.70 167.80,193.63 170.48,193.57 173.16,193.51 175.84,193.45 178.52,193.39 181.20,193.34 183.88,193.29 186.56,193.24 189.24,193.19 191.92,193.15 194.60,193.11 197.28,193.07 199.96,193.03 202.64,193.00 205.32,192.96 208.00,192.93 210.68,192.90 213.36,192.87 216.04,192.85 218.72,192.82 221.40,192.79 224.08,192.77 226.76,192.75 229.44,192.73 232.12,192.71 234.80,192.69 237.48,192.67 240.16,192.65 242.84,192.63 245.52,192.62 248.20,192.60 250.88,192.59 253.56,192.57 256.24,192.56 258.92,192.55 261.60,192.54 264.28,192.53 266.96,192.52 269.64,192.51 272.32,192.50 275.00,192.49 277.68,192.48 280.36,192.47 283.04,192.46 285.72,192.45 288.40,192.45 291.08,192.44 293.76,192.43 296.44,192.43 299.12,192.42 301.80,192.42 304.48,192.41 307.16,192.41 309.84,192.40 312.52,192.40 315.20,192.39 317.88,192.39 320.56,192.38 323.24,192.38 325.92,192.38 328.60,192.37 331.28,192.37 333.96,192.37 336.64,192.36 339.32,192.36 342.00,192.36\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Time (s)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"-8\">Normalized output</tspan><tspan x=\"0\" dy=\"16\">contribution</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#2459a8\"></i>P term</span><span><i style=\"background:#6953a8\"></i>I term (dashed)</span><span><i style=\"background:#a45b2b\"></i>D term</span></div></figure>\n<figure class=\"visual-figure\"><figcaption>Sum of contributions</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-pid-terms-1-title static-pid-terms-1-desc\"><title id=\"static-pid-terms-1-title\">Sum of contributions</title><desc id=\"static-pid-terms-1-desc\">Time (s) versus Normalized controller output. P + I + D. Interpretation follows the graphs.</desc><path d=\"M74,238h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"242\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">-0.6</text><text x=\"74\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">0</text><path d=\"M74,188.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"192.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">0.05</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">12.5</text><path d=\"M74,139h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">0.7</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">25</text><path d=\"M74,89.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">1.35</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">37.5</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">2</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">50</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#2459a8\" stroke-width=\"2.8\" points=\"74.00,123.77 76.68,123.40 79.36,123.04 82.04,122.71 84.72,122.39 87.40,122.08 90.08,121.80 92.76,121.52 95.44,121.26 98.12,121.01 100.80,120.77 103.48,120.55 106.16,120.33 108.84,120.13 111.52,119.94 114.20,119.75 116.88,119.58 119.56,119.41 122.24,119.25 124.92,119.10 127.60,118.96 130.28,118.82 132.96,118.69 135.64,118.57 138.32,118.45 141.00,118.34 143.68,118.23 146.36,118.13 149.04,118.03 151.72,117.94 154.40,117.85 157.08,117.77 159.76,117.69 162.44,117.62 165.12,117.55 167.80,117.48 170.48,117.41 173.16,117.35 175.84,117.29 178.52,117.24 181.20,117.18 183.88,117.13 186.56,117.09 189.24,117.04 191.92,117.00 194.60,116.96 197.28,116.92 199.96,116.88 202.64,116.84 205.32,116.81 208.00,116.78 210.68,116.75 213.36,116.72 216.04,116.69 218.72,116.67 221.40,116.64 224.08,116.62 226.76,116.59 229.44,116.57 232.12,116.55 234.80,116.53 237.48,116.51 240.16,116.50 242.84,116.48 245.52,116.46 248.20,116.45 250.88,116.43 253.56,116.42 256.24,116.41 258.92,116.40 261.60,116.38 264.28,116.37 266.96,116.36 269.64,116.35 272.32,116.34 275.00,116.33 277.68,116.32 280.36,116.32 283.04,116.31 285.72,116.30 288.40,116.29 291.08,116.29 293.76,116.28 296.44,116.27 299.12,116.27 301.80,116.26 304.48,116.26 307.16,116.25 309.84,116.25 312.52,116.24 315.20,116.24 317.88,116.23 320.56,116.23 323.24,116.23 325.92,116.22 328.60,116.22 331.28,116.22 333.96,116.21 336.64,116.21 339.32,116.21 342.00,116.21\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Time (s)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"-8\">Normalized controller</tspan><tspan x=\"0\" dy=\"16\">output</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#2459a8\"></i>P + I + D</span></div></figure>"
      }
    },
    {
      "id": "reference:astrom-murray-feedback",
      "type": "Reference",
      "label": "Feedback Systems: An Introduction for Scientists and Engineers, second edition",
      "properties": {
        "title": "Feedback Systems: An Introduction for Scientists and Engineers, second edition",
        "publisher": "Princeton University Press; author-maintained FBSwiki",
        "url": "https://fbswiki.org/wiki/index.php/Feedback_Systems%3A_An_Introduction_for_Scientists_and_Engineers",
        "type": "Textbook",
        "scope": "State-space modeling, feedback and PID control. These mathematical foundations do not establish a particular software implementation.",
        "year": 2021,
        "authors": [
          "Karl J. Åström",
          "Richard M. Murray"
        ],
        "accessed": "2026-10-27"
      }
    }
  ]
}
