Pole Placement Analysis
The pole placement analysis is used to design observer-based state-feedback controllers through linearization and pole placement techniques. The analysis linearizes the plant model at a specified operating point and designs both controller and observer gains to achieve desired closed-loop pole locations with specified damping and bandwidth characteristics.
Method Overview
The pole placement analysis in DyadControlSystems follows a systematic approach to controller design:
Linearization: The plant is linearized at the specified operating point with optional loop openings
Plant Augmentation: If integral action is requested, the plant is augmented with integrating disturbance models using
add_low_frequency_disturbance
Discretization: If discrete-time control is specified, the plant is discretized using the chosen method
Controller Pole Design: Poles are modified to meet minimum damping and bandwidth constraints
Observer Pole Design: Observer poles are placed to be faster than controller poles
Controller Synthesis: State feedback gain
L
and observer gainK
are computed using pole placementFinal Controller: An observer-based controller is constructed combining state feedback and state estimation
Integral Action
The analysis supports integral action through plant augmentation with integrating disturbances. This is achieved by:
Specifying
integrator_indices
to indicate which control inputs should have integral actionProviding
integrator_poles
to set the observer poles for the integrator statesThe plant is automatically augmented using
add_low_frequency_disturbance
This approach provides disturbance rejection and eliminates steady-state errors for constant references and disturbances.
Example Definition
The following example demonstrates pole placement controller design for a DC motor system with integral action:
analysis DCMotorPolePlacementAnalysis
extends DyadControlSystems.PolePlacementAnalysis(
measurement = ["y"],
control_input = ["u"],
loop_openings = ["y", "r"],
min_damping = 0.707,
controller_speed_factor = 2.0,
observer_speed_factor = 5.0,
integrator_indices = [1],
integrator_poles = [-10.0],
duration = 1.0
)
model = DyadExampleComponents.TestDCMotorLoadControlled()
end
using DyadExampleComponents, DyadInterface
solution = DCMotorPolePlacementAnalysis()
┌ Warning: Initialization system is overdetermined. 2 equations for 0 unknowns. Initialization will default to using least squares. `SCCNonlinearProblem` can only be used for initialization of fully determined systems and hence will not be used here. To suppress this warning pass warn_initialize_determined = false. To make this warning into an error, pass fully_determined = true
└ @ ModelingToolkit ~/.julia/packages/ModelingToolkit/Z9mEq/src/systems/diffeqs/abstractodesystem.jl:1522
┌ Warning: Connected signals have different names
│ ##y#1122 -> ##u#1124
└ @ RobustAndOptimalControl ~/.julia/packages/RobustAndOptimalControl/KfD3M/src/named_systems2.jl:423
using Plots
using DyadInterface: artifacts
fig_step = artifacts(solution, :StepResponse)
fig_gang = artifacts(solution, :GangOfFour)
fig_bode = artifacts(solution, :BodePlot)
fig_pz = artifacts(solution, :PZMaps)
We can examine the controller and observer gains:
L = artifacts(solution, :ControllerGain)
K = artifacts(solution, :ObserverGain)
L, K
(3×1 DataFrame
Row │ u1
│ Float64
─────┼─────────
1 │ 1.51995
2 │ 0.50225
3 │ 1.0, 1×3 DataFrame
Row │ x1 x2 x3
│ Float64 Float64 Float64
─────┼───────────────────────────
1 │ 1014.5 7157.56 510.0)
Analysis Arguments
The following arguments define a pole placement analysis:
Required Arguments
model
: The system model to be controlled.measurement::Vector{String}
: Names of the measured output signals.control_input::Vector{String}
: Names of the control input signals.
Controller Design Parameters
min_damping::Real = 0.707
: Minimum damping ratio for controller poles. Poles with lower damping will be modified.controller_speed_factor::Real = 1.0
: Factor by which to speed up controller poles after damping modification.observer_speed_factor::Real = 5.0
: Factor by which observer poles are faster than controller poles.min_bandwidth::Real = -1.0
: Minimum bandwidth below which poles are moved to this bandwidth. Set to -1 for no limit.max_bandwidth::Real = -1.0
: Maximum bandwidth beyond which poles are not modified. Set to -1 for no limit.direct_controller::Bool = false
: Whether or not to use direct feedthrough in the controller.
Integral Action Parameters
integrator_indices::Vector{Int} = []
: Indices of control inputs that should be augmented with integrating disturbances for integral action. This is a vector of integers corresponding to the indices ofcontrol_input
.integrator_poles::Vector{Real} = []
: Observer poles for the integrator states. Must have the same length asintegrator_indices
.
System Parameters
loop_openings::Vector{String} = []
: Names of loop openings to break feedback loops during linearization.t::Real = 0.0
: The time at which to perform the linearization of the system.
Discretization Parameters
disc::String = "cont"
: Discretization method. Use "cont" for continuous-time, or "zoh", "tustin", "foh" for discrete-time.Ts::Real = -1.0
: Sampling time for discretization. Required whendisc != "cont"
. Set to -1 for automatic selection.
Analysis Parameters
wl::Real = -1
: The lower frequency bound for analysis plots. Set to -1 for automatic selection.wu::Real = -1
: The upper frequency bound for analysis plots. Set to -1 for automatic selection.num_frequencies::Int = 3000
: The number of frequencies to be used in frequency-domain analysis.duration::Real = -1.0
: The duration of the step-response analysis. Set to -1 for automatic selection.
Pole Placement Algorithm
The controller design follows this systematic approach:
Linearization: The plant is linearized at the specified operating point with loop openings
Plant Augmentation: If
integrator_indices
is specified, the plant is augmented with integrating disturbances usingadd_low_frequency_disturbance
to provide integral actionDiscretization: If
disc != "cont"
, the plant is discretized using the specified method and sampling timePole Analysis: Original poles are computed and analyzed for damping characteristics
Controller Pole Design:
Poles below
min_bandwidth
are moved to the minimum bandwidth (if specified)Poles with damping below
min_damping
are modified to have the specified minimum dampingWell-damped poles are left unchanged (poles with damping ≥
min_damping
)Poles above
max_bandwidth
are ignored (if specified)All poles are then scaled by
controller_speed_factor
Observer Pole Design: Observer poles are set to be
observer_speed_factor
times faster than controller poles, with additional poles fromintegrator_poles
for the augmented disturbance statesController Synthesis: State feedback gain
L
and observer gainK
are computed usingplace
Final Controller: An observer-controller is created using
observer_controller
Controller Design Considerations
Damping and Bandwidth
Minimum Damping: Ensures adequate transient response by modifying poorly damped complex poles
Bandwidth Constraints:
min_bandwidth
moves slow poles to improve response speed, whilemax_bandwidth
preserves high-frequency poles for robustnessSpeed Factors: Allow independent tuning of controller and observer dynamics
Integral Action
Disturbance Rejection: Integral action eliminates steady-state errors from constant disturbances
Reference Tracking: Provides zero steady-state error for step references
Observer Poles: Integrator states require separate observer pole specification for proper estimation
Artifacts
A PolePlacementAnalysis returns the following artifacts:
Standard Plots
:StepResponse
: Step response showing reference tracking, disturbance rejection, and control input response.:GangOfFour
: Gang of four transfer functions (S, PS, CS, T) showing closed-loop sensitivity properties.:BodePlot
: Bode plot of the open-loop transfer function showing gain and phase characteristics.:MarginPlot
: Gain and phase margins indicating stability robustness.:PZMaps
: Pole-zero maps of the open-loop and closed-loop systems.
Tables
:ControllerGain
: DataFrame of the state feedback gain matrix L.:ObserverGain
: DataFrame of the observer gain matrix K.
Design Guidelines
Avoid making fast process poles slower to avoid high sensitivity.
Slow process zeros should be matched by closed-loop poles to avoid high sensitivity.
Significant movement of high-frequency poles may lead to poor robustness due to high-frequency model uncertainty.
Slow unstable zeros and fast unstable poles lead to fundamental limitations on the performance.
See "Pole placement" by Bo Bernharsson and Karl Johan Åström for more details.
Notes
The system must be controllable and observable for pole placement to work
Complex conjugate pairs are handled as single entities.
High-frequency poles can be preserved by setting
max_bandwidth
for robustness against high-frequency uncertainty.For exact manual pole placement, use Dyad Studio and call
place
manually, see