diff --git a/docs/source/control/control_system.rst b/docs/source/control/control_system.rst index bfb968a2..23e7fcf5 100644 --- a/docs/source/control/control_system.rst +++ b/docs/source/control/control_system.rst @@ -1,66 +1,135 @@ Common ====== -Control System --------------- +Data Flow +--------- -The figure below shows the structure and data flow of the default control systems used in *motulator*. +The two figures below shows the structure and data flow in a typical simulation model as well as an example of the internal structure of the discrete-time control system. The text in italics refers to the default object names used in the software. In the discrete-time control system, the signals are collected into the following SimpleNamespace objects: -.. figure:: figs/control_system.svg +- The object `fbk` contains feedback signals for the controllers. These signals can be measured quantities (such as the measured DC-bus voltage `fbk.u_dc`) as well as estimated quantities (such as the estimated stator flux linkage `fbk.psi_s`). + +- The object `ref` contains the reference signals, both externally provided (such as `ref.w_m` for the angular speed reference) and internally generated (such as `ref.d_c_abc` for the duty ratios). + +These objects `fbk` and `ref` may propagate through several blocks (implemented as classes in the software), which may add new signals or modify the existing one. At the end of their propagation chain, both objects `fbk` and `ref` are saved to the lists. Therefore, the most relevant internal signals of the control system are directly accessible after the simulation. Furthermore, the states and inputs of the continuous-time system model are also saved. In the post-processing stage, the saved data is converted to the NumPy arrays. + +.. figure:: figs/overall_system.svg :width: 100% :align: center :alt: Block diagram of the control system. - Block diagram of the control system. The continuous-time plant model is also shown in red. Please notice that the observer might not be present in all control systems. + Block diagram illustrating the structure and data flow in a typical simulation model. The lower part of the figure illustrates how the data is saved. The post-processing is done after the simulation. The internal structure of a typical control system is exemplified in the figure below. + +.. figure:: figs/discrete_control_system.svg + :width: 100% + :align: center + :alt: Block diagram of the control system. + + Block diagram exemplifying the internal structure of a typical cascade control system. The object `ref` at the controller output should contain the sampling period `T_s` and the converter duty ratios `d_c_abc` for the carrier comparison. The observer does not necessarily exist in all control systems (or it can be replaced with, e.g., a phase-locked loop). + +Main Control Loop +----------------- -In the figure, :math:`\texttt{monospace}` font is used to denote actual symbol names used in the program. The shaded background represents what is executed during the simulation, while the post-processing is done only after simulation. By default, discrete-time control systems run the following scheme in their main control loops: +By default, discrete-time control systems run the following scheme in their main control loops: - 1. Get the feedback signals for the controllers. This step may contain first getting the measurements and then optionally computing the observer outputs. These measured and estimated signals are collected to the SimpleNamespace object named `fbk`. - 2. Get the reference signals and compute the controller outputs based on the feedback signals `fbk`. These reference signals are collected to the SimpleNamespace object named `ref`. - 3. Update the states of the control system for the next sampling instant. - 4. Save the feedback signals `fbk` and the reference signals `ref` so they can be accessed after the simulation. - 5. Return the sampling period `T_s` and the duty ratios `d_abc` for the carrier comparison. +1. Get the feedback signals `fbk` for the controllers from the outputs of the continuous-time system model `mdl`. This step may contain first getting the measurements and then optionally computing the observer outputs (or otherwise manipulating the measured signals). +2. Get the reference signals `ref` and compute the controller outputs based on the feedback signals `fbk`. Cascade control systems may contain multiple controllers, where the output of the outer controller is the reference signal for the inner controller. +3. Update the states of the control system for the next sampling instant. +4. Save the feedback signals `fbk` and the reference signals `ref` so they can be accessed after the simulation. +5. Return the sampling period `T_s` and the duty ratios `d_c_abc` for the carrier comparison. A template of this main control loop is available in the base class for control systems in :class:`motulator.common.control.ControlSystem`. Using this template is not necessary, but it may simplify the implementation of new control systems. -PI Controller -------------- +2DOF PI Controller +------------------ -The figure below shows a two-degree-of-freedom PI controller, where :math:`k_\mathrm{p}` and :math:`k_\mathrm{i}` are the proportional and integral gains, respectively. Furthermore :math:`u(s)` is the controller output, :math:`r(s)` is the reference signal, :math:`y(s)` is the feedback signal, and :math:`1/s` refers to integration. The controllers continous-time counterpart is: +Proportional-integral (PI) control is widely used in machine drives. A standard one-degree-of-freedom (1DOF) PI controller manipulates only the control error, i.e., it has single input and single output. Its two-degrees-of-freedom (2DOF) variants have two inputs (reference signal and feedback signal), which allows to design disturbance rejection and reference tracking separately [#Sko1996]_. The 2DOF PI controller is available in the :class:`motulator.common.control.PIController` class, which is the base class for the :class:`motulator.drive.control.SpeedController` and :class:`motulator.grid.control.DCBusVoltageController` classes. -.. math:: - u(s) = k_{\mathrm{t}}\,r(s) - k_{\mathrm{p}}\,y(s) + \frac{k_{\mathrm{i}}}{s}\bigg(r(s) - y(s)\bigg) - :label: 2DOFPI +Typical Structure +^^^^^^^^^^^^^^^^^ + +The figure below shows a 2DOF PI controller with an optional feedforward term. Its equivalent state-space form is given by + +.. math:: + \frac{\mathrm{d} u_\mathrm{i}}{\mathrm{d} t} &= k_\mathrm{i}\left(r - y\right) \\ + u &= k_\mathrm{t}r - k_\mathrm{p}y + u_\mathrm{i} + u_\mathrm{ff} + :label: 2dof_pi + +where :math:`r` is the reference signal, :math:`y` is the measured (or estimated) feedback signal, :math:`u_\mathrm{i}` is the the integral state, and :math:`u_\mathrm{ff}` is the optional feedforward signal. Furthermore, :math:`k_\mathrm{t}` is the reference-feedforward gain, :math:`k_\mathrm{p}` is the proportional gain, and :math:`k_\mathrm{i}` is the integral gain. Setting :math:`k_\mathrm{t} = k_\mathrm{p}` and :math:`u_\mathrm{ff} = 0` results in the standard PI controller. This 2DOF PI controller can also be understood as a state feedback controller with integral action and reference feedforward [#Fra1997]_. .. figure:: figs/2dof_pi.svg :width: 100% :align: center - :alt: Two-degree-of-freedom PI controller. + :alt: 2DOF PI controller. + + 2DOF PI controller with an optional feedforward term. The operator :math:`1/s` refers to integration. A discrete-time variant of this controller with the integrator anti-windup is implemented in the :class:`motulator.common.control.PIController` class. + +Disturbance-Observer Structure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The controller :eq:`2dof_pi` can be equally represented using the disturbance-observer structure as + +.. math:: + \frac{\mathrm{d} u_\mathrm{i}}{\mathrm{d} t} &= \alpha_\mathrm{i}\left(u - \hat v\right) \\ + \hat v &= u_\mathrm{i} - (k_\mathrm{p} - k_\mathrm{t})y + u_\mathrm{ff} \\ + u &= k_\mathrm{t}\left(r - y\right) + \hat v + :label: 2dof_pi_disturbance_observer + +where :math:`\alpha_\mathrm{i} = k_\mathrm{i}/k_\mathrm{t}` is the redefined integral gain and :math:`\hat v` is the input-equivalent disturbance estimate. This structure is convenient to prevent the integral windup that originates from the actuator saturation [#Fra1997]_. The actuator output is limited in practice due to physical constraints. Consequently, the realized actuator output is -The standard PI 1DOF controller is obtained by choosing :math:`k_\mathrm{t} = k_\mathrm{p}`. The integrator anti-windup is implemented based on the realized controller output. +.. math:: + \bar{u} = \mathrm{sat}(u) -The PI controller is implemented in the class :class:`motulator.common.control.PIController`. +where :math:`\mathrm{sat}(\cdot)` is the saturation function. If this saturation function is known, the anti-windup of the integrator can be implemented simply as + +.. math:: + \frac{\mathrm{d} u_\mathrm{i}}{\mathrm{d} t} = \alpha_\mathrm{i}\left(\bar{u} - \hat v \right) + :label: anti_windup -Complex-vector PI controller ----------------------------- +The other parts of the above controller are not affected by the saturation. -The figure below shows a 2DOF synchronous-frame complex-vector PI controller which continuous-time counterpart of the controller is [#Bri2000]_: +Discrete-Time Algorithm +^^^^^^^^^^^^^^^^^^^^^^^ + +The discrete-time variant of the controller :eq:`2dof_pi_disturbance_observer` with the anti-windup in :eq:`anti_windup` is given by .. math:: - \boldsymbol{u}(s) = \boldsymbol{k}_{\mathrm{t}}\,\boldsymbol{r}(s) - - \boldsymbol{k}_{\mathrm{p}}\, \boldsymbol{y}(s) + \frac{\boldsymbol{k}_{\mathrm{i}} + \mathrm{j}\omega \boldsymbol{k}_{\mathrm{t}}}{s}\bigg(\boldsymbol{r}(s) - - \boldsymbol{y}(s)\bigg) + \boldsymbol{u}_{\mathrm{ff}}(s) - :label: complexFFPI + u_\mathrm{i}(k+1) &= u_\mathrm{i}(k) + T_\mathrm{s} \alpha_\mathrm{i} \left[\bar{u}(k) - \hat v(k) \right] \\ + \hat v(k) &= u_\mathrm{i}(k) - (k_\mathrm{p} - k_\mathrm{t})y(k) + u_\mathrm{ff}(k) \\ + u(k) &= k_\mathrm{t}\left[r(k) - y(k)\right] + \hat v(k) \\ + \bar{u}(k) &= \mathrm{sat}[u(k)] + :label: discrete_2dof_pi + +where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. This algorithm corresponds to the actual implementation in the :class:`motulator.common.control.PIController` class. + +.. _complex-vector-2dof-pi-controller: + +Complex-Vector 2DOF PI Controller +--------------------------------- -where :math:`\boldsymbol{u}(s)` is the controller output, :math:`\boldsymbol{r}(s)` is the reference signal, :math:`\boldsymbol{y}(s)` is the feedback signal, :math:`\boldsymbol{k}_{\mathrm{t}}` is the feedforward gain, :math:`\boldsymbol{k}_{\mathrm{p}}` and :math:`\boldsymbol{k}_{\mathrm{i}}` are the proportional and integral gains, respectively, and :math:`\boldsymbol{u}_{\mathrm{ff}}(s)` is the optional feedforward signal. +As shown in the figure below, the 2DOF PI controller presented above can be extended for the control of complex-valued space vectors in a coordinate system rotating at the angular speed :math:`\omega` [#Bri1999]_. Depending on the control task, the controlled quantity is typically either a current vector or a flux linkage vector. In the continuous-time domain, the controller in the state-space form is given by + +.. math:: + \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= (\boldsymbol{k}_\mathrm{i} + \mathrm{j}\omega \boldsymbol{k}_\mathrm{t})\left(\boldsymbol{r} - \boldsymbol{y}\right) \\ + \boldsymbol{u} &= \boldsymbol{k}_\mathrm{t}\boldsymbol{r} - \boldsymbol{k}_\mathrm{p}\boldsymbol{y} + \boldsymbol{u}_\mathrm{i} + \boldsymbol{u}_\mathrm{ff} + :label: complex_vector_2dof_pi + +where :math:`\boldsymbol{u}` is the output of the controller, :math:`\boldsymbol{r}` is the reference signal, :math:`\boldsymbol{u}_\mathrm{i}` is the the integral state, and :math:`\boldsymbol{u}_\mathrm{ff}` is the optional feedforward signal. Furthermore, :math:`\boldsymbol{k}_\mathrm{t}` is the reference-feedforward gain, :math:`\boldsymbol{k}_\mathrm{p}` is the proportional gain, and :math:`\boldsymbol{k}_\mathrm{i}` is the integral gain. .. figure:: figs/complex_vector_2dof_pi.svg :width: 100% :align: center - :alt: Two-degree-of-freedom complex-vector PI controller, with feedforward. + :alt: 2DOF complex-vector PI controller, with feedforward. + + 2DOF complex-vector PI controller with an optional feedforward term. -The complex-vector PI controller with feedforward is implemented in the class :class:`motulator.common.control.ComplexPIController`. +The discrete-time implementation of :eq:`complex_vector_2dof_pi` with the anti-windup is given in the :class:`motulator.common.control.ComplexPIController` class, which is the base class for :class:`motulator.drive.control.sm.CurrentController`, :class:`motulator.drive.control.im.CurrentController`, and :class:`motulator.grid.control.CurrentController` classes. The algorithm is similar to the real-valued case given in :eq:`discrete_2dof_pi`. .. rubric:: References -.. [#Bri2000] Briz, Degner, Lorenz, "Analysis and design of current regulators using complex vectors," IEEE Trans. Ind. Appl., 2000, https://doi.org/10.1109/28.845057 \ No newline at end of file +.. [#Sko1996] Skogestad, Postlethwaite, "Multivariable Feedback Control: Analysis and Design," West Sussex, England: John Wiley and Sons, 1996 + +.. [#Fra1997] Franklin, Powell, Workman, "Digital Control of Dynamic Systems," 3rd ed., Menlo Park, CA: Addison-Wesley, 1997 + +.. [#Bri1999] Briz del Blanco, Degner, Lorenz, “Dynamic analysis of current regulators for AC motors using complex vectors,” IEEE Trans.Ind. Appl., 1999, https://doi.org/10.1109/28.806058 + + diff --git a/docs/source/control/drive/current_ctrl.rst b/docs/source/control/drive/current_ctrl.rst index 5237a8a5..5d18f1c7 100644 --- a/docs/source/control/drive/current_ctrl.rst +++ b/docs/source/control/drive/current_ctrl.rst @@ -1,9 +1,9 @@ Current Control =============== -Synchronous-frame two-degrees-of-freedom (2DOF) proportional-integral (PI) current control is commonly used in three-phase AC machine drives [#Har1998]_, [#Bri1999]_, [#Awa2019]_. This control structure allows to compensate for the cross-coupling originating from rotating coordinates as well as to improve disturbance rejection. The structure and design principles are essentially the same as those of 2DOF PI speed control (see :doc:`speed_ctrl`). +Synchronous-frame two-degrees-of-freedom (2DOF) proportional-integral (PI) current control is commonly used in three-phase AC machine drives [#Har1998]_, [#Bri1999]_, [#Awa2019]_, [#Hin2024]_. This control structure allows to compensate for the cross-coupling originating from rotating coordinates as well as to improve disturbance rejection. -In the following, current control of an induction machine is first considered in detail. Then, the same control structure is applied to synchronous machines. Finally, the discrete-time implementation is described. Complex space vectors are used to represent three-phase quantities. +The current controller for an induction machine is available in the :class:`motulator.drive.control.im.CurrentController` class and for a synchronous machine in the :class:`motulator.drive.control.sm.CurrentController` class, both of which inherit from the :class:`motulator.common.control.ComplexPIController` class. In the following, current control of an induction machine is first considered in detail. Then, the same principles are applied to synchronous machines. Complex space vectors are used to represent three-phase quantities. Induction Machines ------------------ @@ -25,26 +25,20 @@ Consequently, the back-emf :math:`\boldsymbol{e}_\mathrm{s}` can be considered a L_\sigma \frac{\mathrm{d} \boldsymbol{i}_\mathrm{s}}{\mathrm{d} t} = \boldsymbol{u}_\mathrm{s} - (R_\sigma + \mathrm{j} \omega_\mathrm{s}L_\sigma)\boldsymbol{i}_\mathrm{s} - \boldsymbol{e}_\mathrm{s} :label: im_current -Equivalently, the stator current dynamics in :eq:`im_current` can be expressed as - -.. math:: - \frac{\mathrm{d} \boldsymbol{\psi}_\sigma}{\mathrm{d} t} &= \boldsymbol{u}_\mathrm{s} - \left(\frac{R_\sigma}{L_\sigma} + \mathrm{j} \omega_\mathrm{s}\right)\boldsymbol{\psi}_\sigma - \boldsymbol{e}_\mathrm{s} \\ - &= \boldsymbol{u}_\mathrm{s} - \mathrm{j} \omega_\mathrm{s}\boldsymbol{\psi}_\sigma - \boldsymbol{v}_\mathrm{s} - :label: im_leakage_flux - -where :math:`\boldsymbol{\psi}_\sigma = L_\sigma \boldsymbol{i}_\mathrm{s}` is the leakage flux linkage and :math:`\boldsymbol{v} = \boldsymbol{e}_\mathrm{s} + R_\sigma \boldsymbol{i}_\mathrm{s}` is the input disturbance. - -2DOF PI Control Structure -^^^^^^^^^^^^^^^^^^^^^^^^^ +2DOF PI Controller +^^^^^^^^^^^^^^^^^^ -First, synchronous-frame 2DOF PI current control is designed and analyzed in the continuous-time domain. The controller can be expressed in a state-space form as [#Awa2019]_ +The design of synchronous-frame 2DOF PI current control is considered in the continuous-time domain, even though the actual implementation is discrete. Two typical gain selections for this control type are known as the internal-model-control (IMC) design [#Har1998]_ and the complex-vector design [#Bri1999]_. Here, only the complex-vector design is considered, see :ref:`complex-vector-2dof-pi-controller`, which is compatible with the :class:`motulator.common.control.ComplexPIController` base class. The controller can be expressed in a state-space form as .. math:: - \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= \boldsymbol{k}'_\mathrm{i}\left(\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{i}_\mathrm{s}\right) \\ - \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}'_\mathrm{t}\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{k}'_\mathrm{p}\boldsymbol{i}_\mathrm{s} + \boldsymbol{u}_\mathrm{i} + \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= (\boldsymbol{k}_\mathrm{i} + \mathrm{j}\omega_\mathrm{s}\boldsymbol{k}_\mathrm{t} )\left(\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{i}_\mathrm{s}\right) \\ + \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}_\mathrm{t}\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{k}_\mathrm{p}\boldsymbol{i}_\mathrm{s} + \boldsymbol{u}_\mathrm{i} :label: cc -where :math:`\boldsymbol{u}_\mathrm{s,ref}` is the output of the controller, i.e., the stator voltage reference, :math:`\boldsymbol{i}_\mathrm{s,ref}` is the stator current reference, and :math:`\boldsymbol{u}_\mathrm{i}` is the the integral state. Furthermore, :math:`\boldsymbol{k}'_\mathrm{t}` is the reference-feedforward gain, :math:`\boldsymbol{k}'_\mathrm{p}` is the proportional gain, and :math:`\boldsymbol{k}'_\mathrm{i}` is the integral gain. Setting :math:`\boldsymbol{k}'_\mathrm{t} = \boldsymbol{k}'_\mathrm{p}` results in the standard PI controller. +where :math:`\boldsymbol{u}_\mathrm{s,ref}` is the output of the controller, i.e., the stator voltage reference, :math:`\boldsymbol{i}_\mathrm{s,ref}` is the stator current reference, :math:`\boldsymbol{u}_\mathrm{i}` is the the integral state, and :math:`\omega_\mathrm{s}` is the angular speed of the coordinate system. Furthermore, :math:`\boldsymbol{k}_\mathrm{t}` is the reference-feedforward gain, :math:`\boldsymbol{k}_\mathrm{p}` is the proportional gain, and :math:`\boldsymbol{k}_\mathrm{i}` is the integral gain. + +.. note:: + The gain definitions used in :eq:`cc` differ from [#Hin2024]_, where a more general controller structure is considered. Closed-Loop System ^^^^^^^^^^^^^^^^^^ @@ -57,134 +51,88 @@ Here, ideal voltage production is assumed, :math:`\boldsymbol{u}_\mathrm{s} = \b The disturbance rejection depends on the closed-loop admittance .. math:: - \boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma s^2 + (R_\sigma + \mathrm{j}\omega_\mathrm{s} L_\sigma + \boldsymbol{k}'_\mathrm{p}) s + \boldsymbol{k}'_\mathrm{i}} + \boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma s^2 + (R_\sigma + \mathrm{j}\omega_\mathrm{s} L_\sigma + \boldsymbol{k}_\mathrm{p}) s + \boldsymbol{k}_\mathrm{i} + \mathrm{j}\omega_\mathrm{s} \boldsymbol{k}_\mathrm{t}} :label: Yc -The closed-loop poles can be arbitrarily placed by means of :math:`\boldsymbol{k}'_\mathrm{p}` and :math:`\boldsymbol{k}'_\mathrm{i}`. The reference-tracking transfer function is +The closed-loop poles can be arbitrarily placed by means of the gains. The reference-tracking transfer function is .. math:: - \boldsymbol{G}_\mathrm{c}(s) = \frac{s \boldsymbol{k}'_\mathrm{t} + \boldsymbol{k}'_\mathrm{i}}{L_\sigma s^2 + (R_\sigma + \mathrm{j}\omega_\mathrm{s} L_\sigma + \boldsymbol{k}'_\mathrm{p}) s + \boldsymbol{k}'_\mathrm{i}} + \boldsymbol{G}_\mathrm{c}(s) = \frac{(s + \mathrm{j}\omega_\mathrm{s}) \boldsymbol{k}_\mathrm{t} + \boldsymbol{k}_\mathrm{i} }{L_\sigma s^2 + (R_\sigma + \mathrm{j}\omega_\mathrm{s} L_\sigma + \boldsymbol{k}_\mathrm{p}) s + \boldsymbol{k}_\mathrm{i} + \mathrm{j}\omega_\mathrm{s} \boldsymbol{k}_\mathrm{t}} :label: Gc -whose zero can be placed by means of the reference-feedforward gain :math:`\boldsymbol{k}'_\mathrm{t}`. +whose zero can be placed by means of the reference-feedforward gain :math:`\boldsymbol{k}_\mathrm{t}`. Gain Selection ^^^^^^^^^^^^^^ -Two typical gain selections, known as the internal-model-control (IMC) design [#Har1998]_ and the complex-vector design [#Bri1999]_, are described in the following. - -IMC Design -"""""""""" - Consider the gains .. math:: - \boldsymbol{k}'_\mathrm{p} = (2\alpha_\mathrm{c} - \mathrm{j}\omega_\mathrm{s}) \hat L_\sigma - \hat R_\sigma \qquad\qquad - \boldsymbol{k}'_\mathrm{i} = \alpha_\mathrm{c}^2 \hat L_\sigma \qquad \qquad - \boldsymbol{k}'_\mathrm{t} = \alpha_\mathrm{c} \hat L_\sigma - -where the hat indicates the parameter estimates. Assuming accurate parameter estimates, the closed-loop transfer functions :eq:`Yc` and :eq:`Gc` reduce to - -.. math:: - \boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma(s + \alpha_\mathrm{c})^2} - \qquad\qquad - \boldsymbol{G}_\mathrm{c}(s) = \frac{\alpha_\mathrm{c}}{s + \alpha_\mathrm{c}} + \boldsymbol{k}_\mathrm{p} = 2\alpha_\mathrm{c} \hat L_\sigma - \hat R_\sigma \qquad\qquad + \boldsymbol{k}_\mathrm{i} = \alpha_\mathrm{c}^2\hat L_\sigma \qquad \qquad + \boldsymbol{k}_\mathrm{t} = \alpha_\mathrm{c} \hat L_\sigma + :label: complex_vector_gains -where :math:`\alpha_\mathrm{c}` is the closed-loop bandwidth for reference tracking. The effect of the resistance is negligible, i.e., :math:`\hat R_\sigma = 0` can be chosen. - -Complex-Vector Design -""""""""""""""""""""" - -Consider the gains - -.. math:: - \boldsymbol{k}'_\mathrm{p} = 2\alpha_\mathrm{c} \hat L_\sigma - \hat R_\sigma \qquad\qquad - \boldsymbol{k}'_\mathrm{i} = \alpha_\mathrm{c}(\alpha_\mathrm{c} + \mathrm{j}\omega_\mathrm{s}) \hat L_\sigma \qquad \qquad - \boldsymbol{k}'_\mathrm{t} = \alpha_\mathrm{c} \hat L_\sigma - -Assuming accurate parameter estimates, the closed-loop transfer functions :eq:`Yc` and :eq:`Gc` reduce to +where :math:`\hat R_\sigma = 0` can be used in practice due to its minor effect and integral action. Assuming accurate parameter estimates, the closed-loop transfer functions :eq:`Yc` and :eq:`Gc` reduce to .. math:: \boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma (s + \alpha_\mathrm{c})(s + \alpha_\mathrm{c} + \mathrm{j}\omega_\mathrm{s})} \qquad\qquad \boldsymbol{G}_\mathrm{c}(s) = \frac{\alpha_\mathrm{c}}{s + \alpha_\mathrm{c}} -It can be seen that both gain designs result in the first-order reference-tracking dynamics. The complex-vector design tends to be slightly more robust to parameter errors than the IMC design since the other closed-loop pole approximately corresponds to the open-loop pole. +It can be seen that this design results in the first-order reference-tracking dynamics. Furthermore, one pole is placed at the real axis at :math:`s=-\alpha_\mathrm{c}`, while another pole moves with the angular frequency of the coordinate system, :math:`s= -\alpha_\mathrm{c} - \mathrm{j}\omega_\mathrm{s}`. The complex-vector design tends to be slightly more robust to parameter errors than the IMC design since the other closed-loop pole approximately corresponds to the open-loop pole. -Flux Linkage as an Internal State -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Based on :eq:`im_leakage_flux`, both the reference current and the measured current can be scaled by the leakage inductance estimate, +This gain selection is used in the :class:`motulator.drive.control.im.CurrentController` class. The stator voltage is limited in practice due to the limited DC-bus voltage of the converter. Consequently, the realized (limited) voltage reference is .. math:: - \boldsymbol{\psi}_{\mathrm{ref}} &= \hat L_\sigma \boldsymbol{i}_\mathrm{s,ref} \\ - \hat{\boldsymbol{\psi}} &= \hat L_\sigma \boldsymbol{i}_\mathrm{s} - :label: flux_mapping_im - -where the notation of the leakage flux has been simplified by dropping the subscript :math:`\sigma` (in order to be able to reuse some of the following equations for synchronous machines). Now the 2DOF PI controller :eq:`cc` can be rewritten as - -.. math:: - \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= \boldsymbol{k}_\mathrm{i}\left(\boldsymbol{\psi}_{\mathrm{ref}} - \hat{\boldsymbol{\psi}}\right) \\ - \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}_\mathrm{t}\boldsymbol{\psi}_{\mathrm{ref}} - \boldsymbol{k}_\mathrm{p}\hat{\boldsymbol{\psi}} + \boldsymbol{u}_\mathrm{i} - :label: cc_flux - -It can be easily seen that the controllers :eq:`cc` and :eq:`cc_flux` are equivalent if :math:`\boldsymbol{k}_\mathrm{p} = \boldsymbol{k}'_\mathrm{p}/\hat L_\sigma`, :math:`\boldsymbol{k}_\mathrm{i} = \boldsymbol{k}'_\mathrm{i}/\hat L_\sigma`, and :math:`\boldsymbol{k}_\mathrm{t} = \boldsymbol{k}'_\mathrm{t}/\hat L_\sigma`. As an example, gains for the complex-vector design reduce to + \bar{\boldsymbol{u}}_\mathrm{s,ref} = \mathrm{sat}(\boldsymbol{u}_\mathrm{s,ref}) -.. math:: - \boldsymbol{k}_\mathrm{p} = 2\alpha_\mathrm{c} \qquad\qquad - \boldsymbol{k}_\mathrm{i} = \alpha_\mathrm{c}(\alpha_\mathrm{c} + \mathrm{j}\omega_\mathrm{s}) \qquad \qquad - \boldsymbol{k}_\mathrm{t} = \alpha_\mathrm{c} - :label: complex_vector_gains_flux +where :math:`\mathrm{sat}(\cdot)` is the saturation function. The limited voltage can be obtained from a pulse-width modulation (PWM) algorithm. The anti-windup of the integrator is included in the implementation of the :class:`motulator.common.control.ComplexPIController` base class. -where :math:`\hat R_\sigma = 0` is assumed. This choice of using the leakage flux linkage as the internal state has some advantages: the gain expressions become simpler; the magnetic saturation would be more convenient to take into account; and the same control structure can be extended to synchronous machines [#Awa2019]_. +Synchronous Machines +-------------------- -Disturbance-Observer Structure -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +System Model +^^^^^^^^^^^^ -The controller :eq:`cc_flux` can be equally represented using the disturbance-observer structure, +Consider the synchronous machine model (see :doc:`/model/drive/machines`) .. math:: - \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= \boldsymbol{\alpha}_\mathrm{i}\left(\boldsymbol{u}_{\mathrm{s,ref}} - \hat{\boldsymbol{v}}_\mathrm{s}\right) \\ - \hat{\boldsymbol{v}}_\mathrm{s} &= \boldsymbol{u}_\mathrm{i} - (\boldsymbol{k}_\mathrm{p} - \boldsymbol{k}_\mathrm{t})\hat{\boldsymbol{\psi}} \\ - \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}_\mathrm{t}\left(\boldsymbol{\psi}_{\mathrm{ref}} - \hat{\boldsymbol{\psi}}\right) + \hat{\boldsymbol{v}}_\mathrm{s} - :label: cc_disturbance - -where :math:`\boldsymbol{\alpha}_\mathrm{i} = \boldsymbol{k}_\mathrm{i}/\boldsymbol{k}_\mathrm{t}` is the redefined integral gain and :math:`\hat{\boldsymbol{v}}_\mathrm{s}` is the estimated input disturbance. This structure is convenient to prevent the integral windup that originates from the actuator saturation [#Fra1997]_. The stator voltage is limited in practice due to the limited DC-bus voltage of the converter. Consequently, the realized (limited) voltage reference is + \frac{\mathrm{d}\boldsymbol{\psi}_\mathrm{s}}{\mathrm{d} t} &= \boldsymbol{u}_\mathrm{s} - R_\mathrm{s}\boldsymbol{i}_\mathrm{s} - \mathrm{j}\omega_\mathrm{m}\boldsymbol{\psi}_\mathrm{s} \\ + \boldsymbol{\psi}_\mathrm{s} &= L_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s}\} + \mathrm{j}L_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s}\} + \psi_\mathrm{f} + :label: sm_model + +where linear magnetics are assumed for simplicity. -.. math:: - \bar{\boldsymbol{u}}_\mathrm{s,ref} = \mathrm{sat}(\boldsymbol{u}_\mathrm{s,ref}) +2DOF PI Controller +^^^^^^^^^^^^^^^^^^ -where :math:`\mathrm{sat}(\cdot)` is the saturation function. The limited voltage can be obtained from a pulse-width modulation (PWM) algorithm. The anti-windup of the integrator can be implemented simply as +An internal change of the state variable from the stator current to the stator flux linkage simplifies the control design for synchronous machines, allowing the same algorithm to be used for both non-salient and salient synchronous machines [#Awa2019]_. Both the reference current and the actual current are scaled by the inductance estimates, .. math:: - \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} = \boldsymbol{\alpha}_\mathrm{i}\left(\bar{\boldsymbol{u}}_\mathrm{s,ref} - \hat{\boldsymbol{v}}_\mathrm{s}\right) - -The other parts of the above controller are not affected by the saturation. The implementation in the :class:`motulator.common.control.ComplexPIController` class is based on this disturbance-observer form. + \boldsymbol{\psi}_\mathrm{s,ref} &= \hat{L}_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s,ref}\} + \mathrm{j} \hat{L}_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s,ref}\} \\ + \hat{\boldsymbol{\psi}_\mathrm{s}} &= \hat{L}_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s}\} + \mathrm{j} \hat{L}_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s}\} + :label: flux_mapping_sm -Synchronous Machines --------------------- +This choice of using the flux linkage as the internal state has some advantages: the gain expressions become simpler; the magnetic saturation would be more convenient to take into account; and the same control structure can be used for salient and nonsalient machines. -The flux-based control algorithms :eq:`cc_flux` and :eq:`cc_disturbance` can be directly used for both non-salient and salient synchronous machines by mapping the stator current to the flux linkage, [#Awa2019]_ +Here, the complex vector design is considered. Hence, the controller :eq:`cc` can be rewritten as .. math:: - \boldsymbol{\psi}_\mathrm{ref} &= \hat{L}_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s,ref}\} + \mathrm{j} \hat{L}_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s,ref}\} \\ - \hat{\boldsymbol{\psi}} &= \hat{L}_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s}\} + \mathrm{j} \hat{L}_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s}\} - :label: flux_mapping_sm - -It is important to notice that :math:`\boldsymbol{i}_\mathrm{s,ref} = \boldsymbol{i}_\mathrm{s}` holds in the steady state even with inductance estimate inaccuracies, since the same inductances are used to map both the reference current and the actual current to the corresponding flux linkages. + \frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= (\boldsymbol{k}_\mathrm{i} + \mathrm{j}\omega_\mathrm{s}\boldsymbol{k}_\mathrm{t} )\left(\boldsymbol{\psi}_\mathrm{s,ref} - \hat{\boldsymbol{\psi}}_\mathrm{s}\right) \\ + \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}_\mathrm{t}\boldsymbol{\psi}_\mathrm{s,ref} - \boldsymbol{k}_\mathrm{p}\hat{\boldsymbol{\psi}}_\mathrm{s} + \boldsymbol{u}_\mathrm{i} + :label: cc_flux -Discrete-Time Algorithm ------------------------ +If the magnetic saturation is not considered, this flux-linkage-based current controller is equivalent to a regular 2DOF PI current controller (even if inductance estimates are inaccurate). Notice that :math:`\boldsymbol{i}_\mathrm{s,ref} = \boldsymbol{i}_\mathrm{s}` holds in the steady state even with inductance estimate inaccuracies, since the same inductances are used to map both the reference current and the actual current to the corresponding flux linkages. -The discrete-time variant of the disturbance-observer form :eq:`cc_disturbance` is given by +The gain design analogous to :eq:`complex_vector_gains` becomes -.. math:: - \boldsymbol{u}_\mathrm{i}(k+1) &= \boldsymbol{u}_\mathrm{i}(k) + T_\mathrm{s} \boldsymbol{\alpha}_\mathrm{i} \left[\bar{\boldsymbol{u}}_\mathrm{s,ref}(k) - \hat{\boldsymbol{v}}_\mathrm{s}(k) \right] \\ - \hat{\boldsymbol{v}}_\mathrm{s}(k) &= \boldsymbol{u}_\mathrm{i}(k) - (\boldsymbol{k}_\mathrm{p} - \boldsymbol{k}_\mathrm{t})\hat{\boldsymbol{\psi}}(k) \\ - \boldsymbol{u}_\mathrm{s,ref}(k) &= \boldsymbol{k}_\mathrm{t}\left[\boldsymbol{\psi}_{\mathrm{ref}}(k) - \hat{\boldsymbol{\psi}}(k)\right] + \hat{\boldsymbol{v}}_\mathrm{s} \\ - \bar{\boldsymbol{u}}_\mathrm{s,ref}(k) &= \mathrm{sat}\left[\boldsymbol{u}_\mathrm{s,ref}(k)\right] +.. math:: + \boldsymbol{k}_\mathrm{p} = 2\alpha_\mathrm{c} - \hat R_\mathrm{s} \qquad\qquad + \boldsymbol{k}_\mathrm{i} = \alpha_\mathrm{c}^2 \qquad \qquad + \boldsymbol{k}_\mathrm{t} = \alpha_\mathrm{c} -where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. Depending on the machine type, either :eq:`flux_mapping_im` or :eq:`flux_mapping_sm` is used to map the stator current to the flux linkage. This discrete-time algorithm corresponds to the implementation in the :class:`motulator.drive.control.sm.CurrentController` class. The default gain selection corresponds to the complex-vector gains in :eq:`complex_vector_gains_flux`. +where :math:`\hat R_\mathrm{s} = 0` can be used in practice. Using :eq:`sm_model`, :eq:`flux_mapping_sm`, and :eq:`cc_flux`, the closed-loop system can be shown to be analogous to the induction machine case. This control design corresponds to the implementation in the :class:`motulator.drive.control.sm.CurrentController` class. .. rubric:: References @@ -194,5 +142,6 @@ where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete- .. [#Awa2019] Awan, Saarakkala, Hinkkanen, "Flux-linkage-based current control of saturated synchronous motors," IEEE Trans. Ind. Appl. 2019, https://doi.org/10.1109/TIA.2019.2919258 -.. [#Fra1997] Franklin, Powell, Workman, "Digital Control of Dynamic Systems," 3rd ed., Menlo Park, CA: Addison-Wesley, 1997 +.. [#Hin2024] Hinkkanen, Harnefors, Kukkola, "Fundamentals of Electric Machine Drives," lecture notes, 2024, https://doi.org/10.5281/zenodo.10609166 + diff --git a/docs/source/control/drive/speed_ctrl.rst b/docs/source/control/drive/speed_ctrl.rst index 92492a9b..fe554813 100644 --- a/docs/source/control/drive/speed_ctrl.rst +++ b/docs/source/control/drive/speed_ctrl.rst @@ -1,75 +1,40 @@ Speed Control ============= -Proportional-integral (PI) control is widely used in machine drives. A standard one-degree-of-freedom (1DOF) PI controller manipulates only the control error, i.e., it has single input and single output. Its two-degrees-of-freedom (2DOF) variants have two inputs (reference signal and feedback signal), which allows to design disturbance rejection and reference tracking separately [#Sko1996]_. In the following, we will use a speed controller as an example, cf. the :class:`motulator.drive.control.SpeedController` class. The presented control design can be extended to many other control tasks as well. +A speed controller is implemented in the :class:`motulator.drive.control.SpeedController` class, whose base class is :class:`motulator.common.control.PIController`. In the following, the tuning of the speed controller is discussed. The presented approach can be extended to many other control tasks as well. -Continuous-Time Design ----------------------- +2DOF PI Controller +------------------ -Even if controllers operate in the discrete-time domain, they are often designed and analyzed in the continuous-time domain. - -Typical Structure -^^^^^^^^^^^^^^^^^ - -The state-space form of a simple 2DOF PI speed controller is given by +Even if controllers operate in the discrete-time domain, they are often designed and analyzed in the continuous-time domain. The state-space form of a simple 2DOF PI speed controller is given by [#Hin2024]_ .. math:: \frac{\mathrm{d} \tau_\mathrm{i}}{\mathrm{d} t} &= k_\mathrm{i}\left(\omega_\mathrm{M,ref} - \omega_\mathrm{M}\right) \\ \tau_\mathrm{M,ref} &= k_\mathrm{t}\omega_\mathrm{M,ref} - k_\mathrm{p}\omega_\mathrm{M} + \tau_\mathrm{i} + :label: speed_ctrl where :math:`\omega_\mathrm{M}` is the measured (or estimated) mechanical angular speed of the rotor, :math:`\omega_\mathrm{M,ref}` is the reference angular speed, and :math:`\tau_\mathrm{i}` is the the integral state. Furthermore, :math:`k_\mathrm{t}` is the reference feedforward gain, :math:`k_\mathrm{p}` is the proportional gain, and :math:`k_\mathrm{i}` is the integral gain. Setting :math:`k_\mathrm{t} = k_\mathrm{p}` results in the standard PI controller. This 2DOF PI controller can also be understood as a state feedback controller with integral action and reference feedforward [#Fra1997]_. -.. - For analysis purposes, the above controller can be presented in the Laplace domain as -.. - .. math:: - \tau_\mathrm{M,ref}(s) = K(s) \left[\omega_\mathrm{M,ref}(s) - \omega_\mathrm{M}(s)\right] + (k_\mathrm{t} - k_\mathrm{p})\omega_\mathrm{M,ref}(s) -.. - where -.. - .. math:: - K(s) = k_\mathrm{p} + \frac{k_\mathrm{i}}{s} -.. - is the standard PI controller. - -Disturbance-Observer Structure -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The above 2DOF PI controller can be equally represented using the disturbance-observer structure, - -.. math:: - \frac{\mathrm{d} \tau_\mathrm{i}}{\mathrm{d} t} &= \alpha_\mathrm{i}\left(\tau_\mathrm{M,ref} - \hat \tau_\mathrm{L}\right) \\ - \hat \tau_\mathrm{L} &= \tau_\mathrm{i} - (k_\mathrm{p} - k_\mathrm{t})\omega_\mathrm{M} \\ - \tau_\mathrm{M,ref} &= k_\mathrm{t}\left(\omega_\mathrm{M,ref} - \omega_\mathrm{M}\right) + \hat \tau_\mathrm{L} - -where :math:`\alpha_\mathrm{i} = k_\mathrm{i}/k_\mathrm{t}` is the redefined integral gain and :math:`\hat \tau_\mathrm{L}` is the input-equivalent disturbance estimate (i.e., the load torque estimate). This structure is convenient to prevent the integral windup that originates from the actuator saturation [#Fra1997]_. The electromagnetic torque is limited in practice due to the maximum current of the inverter (and possibly due to other constraints as well). Consequently, the realized (limited) torque reference is - -.. math:: - \bar{\tau}_\mathrm{M,ref} = \mathrm{sat}(\tau_\mathrm{M,ref}) - -where :math:`\mathrm{sat}(\cdot)` is the saturation function. If this saturation function is known, the anti-windup of the integrator can be implemented simply as +Closed-Loop System +------------------ -.. math:: - \frac{\mathrm{d} \tau_\mathrm{i}}{\mathrm{d} t} = \alpha_\mathrm{i}\left(\bar{\tau}_\mathrm{M,ref} - \hat \tau_\mathrm{L}\right) - -The other parts of the above controller are not affected by the saturation. The implementation in the :class:`motulator.drive.control.SpeedController` class is based on this disturbance-observer form. - -Gain Selection Example -^^^^^^^^^^^^^^^^^^^^^^ - -For simplicity, let us assume ideal torque control (:math:`\tau_\mathrm{M} = \tau_\mathrm{M,ref}`) and a stiff mechanical system [#Har2013]_ +For simplicity, let us assume ideal torque control (:math:`\tau_\mathrm{M} = \tau_\mathrm{M,ref}`) and a stiff mechanical system .. math:: J\frac{\mathrm{d}\omega_\mathrm{M}}{\mathrm{d} t} = \tau_\mathrm{M} - \tau_\mathrm{L} + :label: stiff_mech -where :math:`\tau_\mathrm{M}` is the electromagnetic torque, :math:`\tau_\mathrm{L}` is the load torque, and :math:`J` is the total moment of inertia. In the Laplace domain, the resulting closed-loop system is given by +where :math:`\tau_\mathrm{M}` is the electromagnetic torque, :math:`\tau_\mathrm{L}` is the load torque, and :math:`J` is the total moment of inertia. In the Laplace domain, the closed-loop system resulting from :eq:`speed_ctrl` and :eq:`stiff_mech` is given by .. math:: \omega_\mathrm{M}(s) = \frac{k_\mathrm{t} s + k_\mathrm{i}}{J s^2 + k_\mathrm{p} s + k_\mathrm{i}} \omega_\mathrm{M,ref}(s) - \frac{s}{J s^2 + k_\mathrm{p} s + k_\mathrm{i}} \tau_\mathrm{L}(s) where it can be seen that the gain :math:`k_\mathrm{t}` allows to place the reference-tracking zero. -The gain selection +Gain Selection +-------------- + +The gain selection [#Har2013]_ .. math:: k_\mathrm{t} = \alpha_\mathrm{s} \hat{J} \qquad @@ -83,22 +48,9 @@ results in where :math:`\alpha_\mathrm{s}` is the closed-loop bandwidth of reference tracking and :math:`\hat{J} = J` is assumed. -Discrete-Time Algorithm ------------------------ - -The discrete-time variant of the controller is given by - -.. math:: - \tau_\mathrm{i}(k+1) &= \tau_\mathrm{i}(k) + T_\mathrm{s} \alpha_\mathrm{i} \left[\bar{\tau}_\mathrm{M,ref}(k) - \hat \tau_\mathrm{L}(k) \right] \\ - \hat \tau_\mathrm{L}(k) &= \tau_\mathrm{i}(k) - (k_\mathrm{p} - k_\mathrm{t})\omega_\mathrm{M}(k) \\ - \tau_\mathrm{M,ref}(k) &= k_\mathrm{t}\left[\omega_\mathrm{M,ref}(k) - \omega_\mathrm{M}(k)\right] + \hat \tau_\mathrm{L}(k) \\ - \bar{\tau}_\mathrm{M,ref}(k) &= \mathrm{sat}[\tau_\mathrm{M,ref}(k)] - -where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. This corresponds to the implementation in the :class:`motulator.drive.control.SpeedController` class. - .. rubric:: References -.. [#Sko1996] Skogestad, Postlethwaite, "Multivariable Feedback Control: Analysis and Design," West Sussex, England: John Wiley and Sons, 1996 +.. [#Hin2024] Hinkkanen, Harnefors, Kukkola, "Fundamentals of Electric Machine Drives," lecture notes, 2024, https://doi.org/10.5281/zenodo.10609166 .. [#Fra1997] Franklin, Powell, Workman, "Digital Control of Dynamic Systems," 3rd ed., Menlo Park, CA: Addison-Wesley, 1997 diff --git a/docs/source/control/figs/2dof_pi.svg b/docs/source/control/figs/2dof_pi.svg index fabbbfbb..8e995eec 100644 --- a/docs/source/control/figs/2dof_pi.svg +++ b/docs/source/control/figs/2dof_pi.svg @@ -1,108 +1,102 @@ - - + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:document-rotation="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1"> + id="grid7066" + type="xygrid" + originx="-150" + originy="-415" + units="px" /> + id="defs6783"> + inkscape:connector-curvature="0" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + id="path18502-9" /> + refX="0" + id="DotM" + style="overflow:visible"> + inkscape:connector-curvature="0" + id="path4676" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none" + transform="matrix(0.4,0,0,0.4,2.96,0.4)" /> @@ -110,1325 +104,601 @@ transform="scale(0.7)" d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z" style="fill:context-stroke;fill-rule:evenodd;stroke:none" - id="path53" /> + id="path3392" /> + id="Arrow2Mstart" + style="overflow:visible"> + id="path21014" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + inkscape:connector-curvature="0" /> - + - - + clip-rule="nonzero" + d="M 0,0 H 5.304688 V 3.859375 H 0 Z m 0,0" + id="path9225" /> + + - - + clip-rule="nonzero" + d="M 0,0 H 4.859375 V 5.605469 H 0 Z m 0,0" + id="path7000" /> + + - - + clip-rule="nonzero" + d="M 0,0 H 4.414062 V 3.859375 H 0 Z m 0,0" + id="path1544" /> + + - - + clip-rule="nonzero" + d="M 5,3 H 8 V 7.222656 H 5 Z m 0,0" + id="path4169" /> + + - - + clip-rule="nonzero" + d="M 5,3 H 7 V 7.222656 H 5 Z m 0,0" + id="path3821" /> + + - - + clip-rule="nonzero" + d="m 1,13 h 5 v 4.65625 H 1 Z m 0,0" + id="path1091" /> + + - - + clip-rule="nonzero" + d="M 5,4 H 9 V 8.386719 H 5 Z m 0,0" + id="path4194" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + clip-rule="nonzero" + d="m 5,0 h 5 V 4.921875 H 5 Z m 0,0" + id="path9901" /> + + + + + + image/svg+xml + + + + + - - - - + transform="translate(-260.44921,151.86401)" + id="g4675" /> + + + + + + + + - - - + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5px;line-height:125%;font-family:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline" + transform="matrix(0,0.7272727,-0.7272727,0,216.6121,447.45455)" + id="g3799"> + + + - - - + id="g3825" + transform="matrix(-0.7272727,0,0,-0.7272727,442.54543,266.61212)" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5px;line-height:125%;font-family:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline"> + + - - - - - - + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5px;line-height:125%;font-family:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline" + transform="matrix(0,0.7272727,-0.7272727,0,111.61213,447.45455)" + id="g3835"> + + - - - + transform="rotate(90)" + id="path3841" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.333;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + cx="470" + cy="-315" + rx="7.5000033" + ry="7.4999976" /> + + + + + + + + style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-mid:none" + d="m 447.5,470 h -20" + sodipodi:nodetypes="cc" + id="path1916" + inkscape:export-filename="C:\Documents and Settings\mhinkkan\Desktop\testi.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" + inkscape:connector-curvature="0" /> - + inkscape:label="" + transform="translate(475.04168,459.20834)" + id="g4688"> + + fill="#000000" + fill-opacity="1" + id="g4684"> + id="g4682" + transform="translate(0,3.8610001)"> + d="m 4.375,-2.921875 c 0.046875,-0.234375 0.15625,-0.640625 0.15625,-0.6875 0,-0.109375 -0.078125,-0.25 -0.28125,-0.25 -0.125,0 -0.265625,0.078125 -0.328125,0.1875 C 3.890625,-3.59375 3.28125,-1.15625 3.21875,-0.859375 3.03125,-0.53125 2.671875,-0.125 2.171875,-0.125 1.625,-0.125 1.625,-0.6875 1.625,-0.859375 c 0,-0.40625 0.109375,-0.84375 0.5,-1.84375 0.078125,-0.21875 0.125,-0.34375 0.125,-0.5 0,-0.453125 -0.328125,-0.765625 -0.765625,-0.765625 -0.859375,0 -1.21875,1.28125 -1.21875,1.390625 0,0.078125 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.140625,-0.171875 0.1875,-0.65625 0.53125,-1.09375 0.921875,-1.09375 0.1875,0 0.21875,0.125 0.21875,0.296875 0,0.140625 -0.046875,0.3125 -0.125,0.515625 -0.421875,1.125 -0.53125,1.5 -0.53125,1.921875 0,1 0.8125,1.09375 1.140625,1.09375 0.5,0 0.875,-0.3125 1.09375,-0.59375 0.171875,0.59375 0.765625,0.59375 0.8125,0.59375 0.265625,0 0.484375,-0.125 0.671875,-0.46875 0.15625,-0.296875 0.296875,-0.875 0.296875,-0.90625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.125,0.046875 -0.15625,0.21875 C 4.578125,-0.46875 4.390625,-0.125 4.09375,-0.125 3.875,-0.125 3.8125,-0.3125 3.8125,-0.53125 c 0,-0.171875 0.046875,-0.359375 0.125,-0.671875 L 4.15625,-2.125 Z m 0,0" + id="path4680" /> - - - - - - + inkscape:label="" + transform="translate(475.37501,513.68751)" + id="g5648"> + + fill="#000000" + fill-opacity="1" + id="g14"> + id="use12" + transform="translate(0,3.8610001)"> + d="M 4.5,-3.453125 C 4.515625,-3.5 4.53125,-3.546875 4.53125,-3.609375 c 0,-0.109375 -0.078125,-0.25 -0.28125,-0.25 -0.109375,0 -0.28125,0.0625 -0.34375,0.234375 C 3.890625,-3.59375 3.796875,-3.21875 3.75,-3.015625 l -0.453125,1.78125 c -0.0625,0.265625 -0.0625,0.28125 -0.09375,0.359375 0,0.046875 -0.375,0.75 -1.03125,0.75 C 1.625,-0.125 1.625,-0.6875 1.625,-0.859375 c 0,-0.40625 0.109375,-0.84375 0.5,-1.84375 0.078125,-0.21875 0.125,-0.34375 0.125,-0.5 0,-0.453125 -0.328125,-0.765625 -0.765625,-0.765625 -0.859375,0 -1.21875,1.28125 -1.21875,1.390625 0,0.078125 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.140625,-0.171875 0.1875,-0.671875 0.546875,-1.09375 0.921875,-1.09375 0.21875,0 0.21875,0.171875 0.21875,0.296875 0,0.140625 -0.046875,0.3125 -0.125,0.515625 -0.421875,1.125 -0.53125,1.5 -0.53125,1.921875 0,1 0.8125,1.09375 1.140625,1.09375 0.4375,0 0.75,-0.234375 0.90625,-0.390625 C 2.953125,0.15625 2.859375,0.5625 2.5,1.015625 2.234375,1.375 1.875,1.609375 1.484375,1.609375 1.234375,1.609375 0.9375,1.53125 0.8125,1.28125 1.28125,1.28125 1.34375,0.875 1.34375,0.796875 1.34375,0.59375 1.203125,0.46875 1,0.46875 c -0.203125,0 -0.5,0.171875 -0.5,0.578125 0,0.46875 0.421875,0.796875 0.984375,0.796875 0.90625,0 1.890625,-0.78125 2.140625,-1.828125 z m 0,0" + id="path22" /> - - - - - - + inkscape:label="" + transform="translate(271.35419,459.71051)" + id="g6626"> + + fill="#000000" + fill-opacity="1" + id="g6622"> + id="g6620" + transform="translate(0,3.8610001)"> + d="m 3.625,-3.625 c -0.296875,0.046875 -0.453125,0.296875 -0.453125,0.484375 0,0.171875 0.125,0.328125 0.359375,0.328125 0.234375,0 0.484375,-0.203125 0.484375,-0.546875 0,-0.34375 -0.328125,-0.609375 -0.765625,-0.609375 -0.671875,0 -1.046875,0.5 -1.171875,0.671875 C 1.96875,-3.78125 1.5625,-3.96875 1.234375,-3.96875 c -0.328125,0 -0.53125,0.203125 -0.6875,0.515625 -0.171875,0.328125 -0.28125,0.828125 -0.28125,0.875 0,0.078125 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.046875 0.15625,-0.234375 0.171875,-0.703125 0.359375,-1.03125 0.65625,-1.03125 0.28125,0 0.28125,0.28125 0.28125,0.421875 0,0.1875 -0.078125,0.453125 -0.125,0.6875 -0.0625,0.234375 -0.15625,0.625 -0.1875,0.734375 L 0.8125,-0.421875 C 0.75,-0.203125 0.75,-0.1875 0.75,-0.15625 c 0,0.109375 0.078125,0.25 0.265625,0.25 0.296875,0 0.359375,-0.234375 0.421875,-0.5 C 1.546875,-0.796875 1.546875,-0.8125 1.625,-1.171875 1.96875,-2.515625 2.015625,-2.734375 2.03125,-2.78125 2.09375,-2.890625 2.5,-3.734375 3.25,-3.734375 c 0.203125,0 0.328125,0.0625 0.375,0.109375 z m 0,0" + id="path6618" /> - - - - - - - - - - - - + inkscape:label="" + transform="translate(345.53051,430.19041)" + id="g7613"> + id="g17" + transform="matrix(1.33333,0,0,1.33333,-0.666667,-0.0110003)"> + id="use15" + transform="translate(0,6.2270002)"> + d="m 2.578125,-5.921875 c 0.03125,-0.125 0.03125,-0.140625 0.03125,-0.171875 0,-0.078125 -0.046875,-0.125 -0.140625,-0.125 -0.125,0 -0.90625,0.0625 -1.09375,0.078125 -0.078125,0.015625 -0.1875,0.03125 -0.1875,0.171875 0,0.125 0.109375,0.125 0.25,0.125 0.421875,0 0.421875,0.0625 0.421875,0.140625 0,0.03125 0,0.046875 -0.046875,0.21875 l -1.28125,5.15625 C 0.5,-0.203125 0.5,-0.1875 0.5,-0.15625 c 0,0.140625 0.109375,0.25 0.265625,0.25 0.296875,0 0.359375,-0.25 0.40625,-0.4375 l 0.421875,-1.6875 c 0.609375,0.046875 1.0625,0.296875 1.0625,0.734375 0,0.0625 0,0.09375 -0.015625,0.234375 -0.015625,0.03125 -0.046875,0.15625 -0.046875,0.25 0,0.53125 0.375,0.90625 0.875,0.90625 0.328125,0 0.546875,-0.203125 0.703125,-0.46875 0.234375,-0.328125 0.359375,-0.875 0.359375,-0.90625 0,-0.046875 -0.03125,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.15625,0.203125 -0.109375,0.46875 -0.34375,1.0625 -0.765625,1.0625 -0.25,0 -0.28125,-0.234375 -0.28125,-0.4375 0,-0.21875 0.046875,-0.453125 0.0625,-0.46875 0.015625,-0.046875 0.03125,-0.15625 0.03125,-0.265625 0,-0.625 -0.65625,-0.875 -1.34375,-0.953125 0.265625,-0.171875 0.46875,-0.359375 0.75,-0.640625 0.46875,-0.46875 0.84375,-0.84375 1.3125,-0.84375 0.109375,0 0.234375,0.015625 0.296875,0.109375 -0.40625,0.03125 -0.5,0.359375 -0.5,0.484375 0,0.171875 0.125,0.328125 0.34375,0.328125 0.21875,0 0.5,-0.171875 0.5,-0.5625 0,-0.296875 -0.21875,-0.59375 -0.640625,-0.59375 -0.546875,0 -0.984375,0.4375 -1.359375,0.828125 C 2.21875,-2.71875 2.015625,-2.5 1.671875,-2.359375 Z m 0,0" + id="path29" /> - - - + + fill="#000000" + fill-opacity="1" + id="g21"> + id="use19" + transform="translate(4.7979999,7.223)"> + d="M 1.296875,-2.34375 H 2.28125 V -2.578125 H 1.296875 V -3.6875 h -0.21875 c 0,0.546875 -0.265625,1.125 -0.859375,1.15625 v 0.1875 H 0.8125 V -0.75 c 0,0.625 0.46875,0.8125 0.875,0.8125 0.40625,0 0.71875,-0.328125 0.71875,-0.8125 V -1.078125 H 2.171875 v 0.3125 c 0,0.421875 -0.21875,0.609375 -0.4375,0.609375 -0.4375,0 -0.4375,-0.484375 -0.4375,-0.59375 z m 0,0" + id="path33" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:label="" + transform="translate(345.96801,465.19041)" + id="g8229"> + id="g8219" + transform="matrix(1.33333,0,0,1.33333,-0.666667,-0.0110003)"> + id="g8217" + transform="translate(0,6.2270002)"> + d="m 2.578125,-5.921875 c 0.03125,-0.125 0.03125,-0.140625 0.03125,-0.171875 0,-0.078125 -0.046875,-0.125 -0.140625,-0.125 -0.125,0 -0.90625,0.0625 -1.09375,0.078125 -0.078125,0.015625 -0.1875,0.03125 -0.1875,0.171875 0,0.125 0.109375,0.125 0.25,0.125 0.421875,0 0.421875,0.0625 0.421875,0.140625 0,0.03125 0,0.046875 -0.046875,0.21875 l -1.28125,5.15625 C 0.5,-0.203125 0.5,-0.1875 0.5,-0.15625 c 0,0.140625 0.109375,0.25 0.265625,0.25 0.296875,0 0.359375,-0.25 0.40625,-0.4375 l 0.421875,-1.6875 c 0.609375,0.046875 1.0625,0.296875 1.0625,0.734375 0,0.0625 0,0.09375 -0.015625,0.234375 -0.015625,0.03125 -0.046875,0.15625 -0.046875,0.25 0,0.53125 0.375,0.90625 0.875,0.90625 0.328125,0 0.546875,-0.203125 0.703125,-0.46875 0.234375,-0.328125 0.359375,-0.875 0.359375,-0.90625 0,-0.046875 -0.03125,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.15625,0.203125 -0.109375,0.46875 -0.34375,1.0625 -0.765625,1.0625 -0.25,0 -0.28125,-0.234375 -0.28125,-0.4375 0,-0.21875 0.046875,-0.453125 0.0625,-0.46875 0.015625,-0.046875 0.03125,-0.15625 0.03125,-0.265625 0,-0.625 -0.65625,-0.875 -1.34375,-0.953125 0.265625,-0.171875 0.46875,-0.359375 0.75,-0.640625 0.46875,-0.46875 0.84375,-0.84375 1.3125,-0.84375 0.109375,0 0.234375,0.015625 0.296875,0.109375 -0.40625,0.03125 -0.5,0.359375 -0.5,0.484375 0,0.171875 0.125,0.328125 0.34375,0.328125 0.21875,0 0.5,-0.171875 0.5,-0.5625 0,-0.296875 -0.21875,-0.59375 -0.640625,-0.59375 -0.546875,0 -0.984375,0.4375 -1.359375,0.828125 C 2.21875,-2.71875 2.015625,-2.5 1.671875,-2.359375 Z m 0,0" + id="path8215" /> + clip-path="url(#clipPath8044)" + id="g8227" + transform="matrix(1.33333,0,0,1.33333,-0.666667,-0.0110003)"> - - - - - - - + fill="#000000" + fill-opacity="1" + id="g8225"> + id="g8223" + transform="translate(4.7979999,7.223)"> - - - + d="m 1.359375,-3.6875 c 0,-0.171875 -0.15625,-0.359375 -0.359375,-0.359375 -0.1875,0 -0.359375,0.140625 -0.359375,0.359375 0,0.21875 0.171875,0.359375 0.359375,0.359375 0.203125,0 0.359375,-0.171875 0.359375,-0.359375 z M 0.40625,-2.578125 v 0.234375 c 0.390625,0 0.453125,0.046875 0.453125,0.34375 v 1.515625 c 0,0.25 -0.0625,0.25 -0.46875,0.25 V 0 c 0.171875,-0.015625 0.625,-0.03125 0.6875,-0.03125 0.0625,0 0.515625,0.015625 0.671875,0.03125 v -0.234375 c -0.375,0 -0.421875,0 -0.421875,-0.25 v -2.15625 z m 0,0" + id="path8221" /> - - - - - - - - - - - - - - - - - - - - + inkscape:label="" + transform="translate(381.92709,458.10203)" + id="g8469"> + id="g8461" + transform="matrix(1.33333,0,0,1.33333,-1.59375,0.254333)"> + id="g8459" + transform="translate(1.196,5.7779999)"> + d="m 2.71875,-5.734375 c 0,-0.21875 0,-0.234375 -0.21875,-0.234375 -0.5625,0.5625 -1.390625,0.5625 -1.671875,0.5625 V -5.125 c 0.171875,0 0.71875,0 1.203125,-0.234375 v 4.640625 c 0,0.328125 -0.015625,0.4375 -0.859375,0.4375 H 0.890625 V 0 c 0.3125,-0.03125 1.125,-0.03125 1.484375,-0.03125 0.375,0 1.171875,0 1.5,0.03125 V -0.28125 H 3.59375 c -0.84375,0 -0.875,-0.109375 -0.875,-0.4375 z m 0,0" + id="path31" /> + + clip-path="url(#clipPath9866)" + id="g25" + transform="matrix(1.33333,0,0,1.33333,-1.59375,0.254333)"> - - - - - - - + fill="#000000" + fill-opacity="1" + id="g8466"> + id="use21" + transform="translate(1.353,17.658001)"> + d="m 3.5625,-3.359375 c -0.390625,0.046875 -0.421875,0.34375 -0.421875,0.40625 0,0.15625 0.109375,0.265625 0.28125,0.265625 0.25,0 0.421875,-0.203125 0.421875,-0.5 0,-0.4375 -0.4375,-0.78125 -1.09375,-0.78125 -1.203125,0 -1.546875,0.90625 -1.546875,1.3125 0,0.34375 0.171875,0.515625 0.28125,0.625 0.1875,0.171875 0.421875,0.234375 0.75,0.296875 0.40625,0.078125 0.484375,0.09375 0.65625,0.203125 0.140625,0.109375 0.21875,0.25 0.21875,0.453125 0,0.21875 -0.21875,0.953125 -1.296875,0.953125 -0.203125,0 -0.828125,-0.03125 -1.03125,-0.4375 0.453125,0 0.53125,-0.359375 0.53125,-0.484375 C 1.3125,-1.3125 1.078125,-1.375 0.984375,-1.375 0.8125,-1.375 0.46875,-1.25 0.46875,-0.78125 c 0,0.5625 0.578125,0.875 1.328125,0.875 1.515625,0 1.84375,-1.09375 1.84375,-1.484375 0,-0.34375 -0.1875,-0.5625 -0.296875,-0.65625 -0.234375,-0.25 -0.515625,-0.296875 -0.828125,-0.359375 -0.109375,-0.03125 -0.3125,-0.0625 -0.34375,-0.078125 -0.28125,-0.0625 -0.453125,-0.234375 -0.453125,-0.46875 0,-0.09375 0.0625,-0.390625 0.3125,-0.578125 0.25,-0.203125 0.59375,-0.203125 0.71875,-0.203125 0.3125,0 0.671875,0.09375 0.8125,0.375 z m 0,0" + id="path35" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:label="" + transform="translate(414.65552,494.41868)" + id="g9008"> + id="g8998" + transform="matrix(1.33333,0,0,1.33333,-0.666667,-0.00966644)"> + id="g8996" + transform="translate(0,6.2259998)"> + d="m 2.578125,-5.921875 c 0.03125,-0.125 0.03125,-0.140625 0.03125,-0.171875 0,-0.078125 -0.046875,-0.125 -0.140625,-0.125 -0.125,0 -0.90625,0.0625 -1.09375,0.078125 -0.078125,0.015625 -0.1875,0.03125 -0.1875,0.171875 0,0.125 0.109375,0.125 0.25,0.125 0.421875,0 0.421875,0.0625 0.421875,0.140625 0,0.03125 0,0.046875 -0.046875,0.21875 l -1.28125,5.15625 C 0.5,-0.203125 0.5,-0.1875 0.5,-0.15625 c 0,0.140625 0.109375,0.25 0.265625,0.25 0.296875,0 0.359375,-0.25 0.40625,-0.4375 l 0.421875,-1.6875 c 0.609375,0.046875 1.0625,0.296875 1.0625,0.734375 0,0.0625 0,0.09375 -0.015625,0.234375 -0.015625,0.03125 -0.046875,0.15625 -0.046875,0.25 0,0.53125 0.375,0.90625 0.875,0.90625 0.328125,0 0.546875,-0.203125 0.703125,-0.46875 0.234375,-0.328125 0.359375,-0.875 0.359375,-0.90625 0,-0.046875 -0.03125,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.15625,0.203125 -0.109375,0.46875 -0.34375,1.0625 -0.765625,1.0625 -0.25,0 -0.28125,-0.234375 -0.28125,-0.4375 0,-0.21875 0.046875,-0.453125 0.0625,-0.46875 0.015625,-0.046875 0.03125,-0.15625 0.03125,-0.265625 0,-0.625 -0.65625,-0.875 -1.34375,-0.953125 0.265625,-0.171875 0.46875,-0.359375 0.75,-0.640625 0.46875,-0.46875 0.84375,-0.84375 1.3125,-0.84375 0.109375,0 0.234375,0.015625 0.296875,0.109375 -0.40625,0.03125 -0.5,0.359375 -0.5,0.484375 0,0.171875 0.125,0.328125 0.34375,0.328125 0.21875,0 0.5,-0.171875 0.5,-0.5625 0,-0.296875 -0.21875,-0.59375 -0.640625,-0.59375 -0.546875,0 -0.984375,0.4375 -1.359375,0.828125 C 2.21875,-2.71875 2.015625,-2.5 1.671875,-2.359375 Z m 0,0" + id="path8994" /> + clip-path="url(#clipPath1273)" + id="g9006" + transform="matrix(1.33333,0,0,1.33333,-0.666667,-0.00966644)"> - - - - - - - - - - - - - - - - - - - - + fill="#000000" + fill-opacity="1" + id="g9004"> + id="g9002" + transform="translate(4.7979999,7.223)"> + d="m 1.796875,0.921875 c -0.421875,0 -0.484375,0 -0.484375,-0.25 V -0.28125 C 1.5625,-0.046875 1.84375,0.0625 2.171875,0.0625 3,0.0625 3.71875,-0.53125 3.71875,-1.296875 c 0,-0.71875 -0.625,-1.34375 -1.453125,-1.34375 -0.546875,0 -0.890625,0.265625 -0.96875,0.359375 v -0.359375 l -0.953125,0.0625 v 0.234375 c 0.40625,0 0.46875,0 0.46875,0.28125 v 2.734375 c 0,0.25 -0.046875,0.25 -0.46875,0.25 V 1.15625 c 0.046875,0 0.453125,-0.015625 0.71875,-0.015625 0.265625,0 0.671875,0.015625 0.734375,0.015625 z M 1.3125,-1.984375 c 0.203125,-0.28125 0.53125,-0.4375 0.890625,-0.4375 0.546875,0 0.9375,0.515625 0.9375,1.125 0,0.671875 -0.46875,1.171875 -1,1.171875 -0.46875,0 -0.734375,-0.328125 -0.828125,-0.515625 z m 0,0" + id="path9000" /> - - - - - - - - - - - - - - - - + + + + + id="g32695" + transform="matrix(1.33333,0,0,1.33333,-0.354167,0.145)"> + id="g32693" + transform="translate(0,3.8599999)"> + d="m 4.375,-2.921875 c 0.046875,-0.234375 0.15625,-0.640625 0.15625,-0.6875 0,-0.109375 -0.078125,-0.25 -0.28125,-0.25 -0.125,0 -0.265625,0.078125 -0.328125,0.1875 C 3.890625,-3.59375 3.28125,-1.15625 3.21875,-0.859375 3.03125,-0.53125 2.671875,-0.125 2.171875,-0.125 1.625,-0.125 1.625,-0.6875 1.625,-0.859375 c 0,-0.40625 0.109375,-0.84375 0.5,-1.84375 0.078125,-0.21875 0.125,-0.34375 0.125,-0.5 0,-0.453125 -0.328125,-0.765625 -0.765625,-0.765625 -0.859375,0 -1.21875,1.28125 -1.21875,1.390625 0,0.078125 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.140625,-0.171875 0.1875,-0.65625 0.53125,-1.09375 0.921875,-1.09375 0.1875,0 0.21875,0.125 0.21875,0.296875 0,0.140625 -0.046875,0.3125 -0.125,0.515625 -0.421875,1.125 -0.53125,1.5 -0.53125,1.921875 0,1 0.8125,1.09375 1.140625,1.09375 0.5,0 0.875,-0.3125 1.09375,-0.59375 0.171875,0.59375 0.765625,0.59375 0.8125,0.59375 0.265625,0 0.484375,-0.125 0.671875,-0.46875 0.15625,-0.296875 0.296875,-0.875 0.296875,-0.90625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.125,0.046875 -0.15625,0.21875 C 4.578125,-0.46875 4.390625,-0.125 4.09375,-0.125 3.875,-0.125 3.8125,-0.3125 3.8125,-0.53125 c 0,-0.171875 0.046875,-0.359375 0.125,-0.671875 L 4.15625,-2.125 Z m 0,0" + id="path32691" /> + clip-path="url(#clipPath7894)" + id="g32703" + transform="matrix(1.33333,0,0,1.33333,-0.354167,0.145)"> - - - - - - - - - - - - - + fill="#000000" + fill-opacity="1" + id="g32701"> + id="g32699" + transform="translate(5.303,4.9229999)"> + d="M 3.390625,-2.34375 H 4.1875 V -2.578125 H 3.359375 v -0.65625 c 0,-0.546875 0.328125,-0.78125 0.609375,-0.78125 C 4.046875,-4.015625 4.109375,-4 4.140625,-4 4.09375,-3.96875 4.03125,-3.921875 4.03125,-3.765625 c 0,0.15625 0.109375,0.28125 0.28125,0.28125 0.171875,0 0.28125,-0.125 0.28125,-0.28125 0,-0.28125 -0.265625,-0.453125 -0.625,-0.453125 -0.1875,0 -0.46875,0.046875 -0.71875,0.25 -0.171875,-0.171875 -0.46875,-0.25 -0.84375,-0.25 -0.703125,0 -1.59375,0.296875 -1.59375,1 v 0.640625 H 0.265625 V -2.34375 H 0.8125 v 1.859375 c 0,0.25 -0.046875,0.25 -0.46875,0.25 V 0 C 0.53125,-0.015625 1,-0.03125 1.046875,-0.03125 c 0.25,0 0.484375,0.015625 0.71875,0.03125 v -0.234375 c -0.40625,0 -0.46875,0 -0.46875,-0.25 V -2.34375 h 1.625 v 1.859375 c 0,0.25 -0.0625,0.25 -0.484375,0.25 V 0 C 2.59375,-0.015625 3.03125,-0.03125 3.171875,-0.03125 3.484375,-0.03125 3.890625,0 3.96875,0 v -0.234375 h -0.125 c -0.453125,0 -0.453125,-0.0625 -0.453125,-0.265625 z m -2.125,-0.234375 V -3.21875 c 0,-0.578125 0.625,-0.796875 1.125,-0.796875 0.0625,0 0.34375,0 0.546875,0.078125 -0.015625,0 -0.15625,0.078125 -0.15625,0.25 0,0.078125 0.03125,0.1875 0.15625,0.25 -0.015625,0.0625 -0.015625,0.140625 -0.015625,0.203125 v 0.65625 z m 0,0" + id="path32697" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g38890" + transform="translate(120,-10)"> + + + + - - - - + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5px;line-height:125%;font-family:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline" + transform="matrix(0,0.7272727,-0.7272727,0,131.61216,457.45454)" + id="g33274"> + + diff --git a/docs/source/control/figs/complex_vector_2dof_pi.svg b/docs/source/control/figs/complex_vector_2dof_pi.svg index abefa38a..52ae02a2 100644 --- a/docs/source/control/figs/complex_vector_2dof_pi.svg +++ b/docs/source/control/figs/complex_vector_2dof_pi.svg @@ -1,146 +1,102 @@ - - + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:document-rotation="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1"> + id="grid7066" + type="xygrid" + originx="-150" + originy="-410" + units="px" /> - - - - - - + id="defs6783"> + inkscape:connector-curvature="0" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + id="path18502-9" /> + refX="0" + id="DotM" + style="overflow:visible"> + inkscape:connector-curvature="0" + id="path4676" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none" + transform="matrix(0.4,0,0,0.4,2.96,0.4)" /> @@ -148,1830 +104,846 @@ transform="scale(0.7)" d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z" style="fill:context-stroke;fill-rule:evenodd;stroke:none" - id="path53" /> + id="path3392" /> + id="Arrow2Mstart" + style="overflow:visible"> + id="path21014" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(0.6)" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + inkscape:connector-curvature="0" /> - + - - + clip-rule="nonzero" + d="M 0,0 H 5.304688 V 3.859375 H 0 Z m 0,0" + id="path9225" /> + + - - + clip-rule="nonzero" + d="M 0,0 H 4.859375 V 5.605469 H 0 Z m 0,0" + id="path7000" /> + + - - + clip-rule="nonzero" + d="M 0,0 H 4.414062 V 3.859375 H 0 Z m 0,0" + id="path1544" /> + + - - + clip-rule="nonzero" + d="M 5,3 H 8 V 7.222656 H 5 Z m 0,0" + id="path4169" /> + + - - + clip-rule="nonzero" + d="M 5,3 H 7 V 7.222656 H 5 Z m 0,0" + id="path3821" /> + + - - + clip-rule="nonzero" + d="m 1,13 h 5 v 4.65625 H 1 Z m 0,0" + id="path1091" /> + + - - + clip-rule="nonzero" + d="M 5,4 H 9 V 8.386719 H 5 Z m 0,0" + id="path4194" /> + + - - + clip-rule="nonzero" + d="m 6,4 h 4 V 8.386719 H 6 Z m 0,0" + id="path5652" /> + + - - + clip-rule="nonzero" + d="M 5,3 H 9 V 7.222656 H 5 Z m 0,0" + id="path2812" /> + + - - + clip-rule="nonzero" + d="m 6,0 h 5 V 5.046875 H 6 Z m 0,0" + id="path9522" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + clip-rule="nonzero" + d="M 0,0 H 6.316406 V 3.984375 H 0 Z m 0,0" + id="path3227" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + clip-rule="nonzero" + d="M 0,0 H 5 V 3.984375 H 0 Z m 0,0" + id="path1677" /> + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + id="g20112" + transform="matrix(1.33333,0,0,1.33333,-0.395833,0.0825001)"> + id="g20110" + transform="translate(0,3.9849999)"> + d="m 3.703125,-0.890625 c -0.171875,0.21875 -0.515625,0.609375 -1,0.609375 -0.390625,0 -0.5625,-0.234375 -0.5625,-0.65625 0,-0.53125 0.296875,-1.296875 0.546875,-1.90625 0.046875,-0.125 0.109375,-0.265625 0.109375,-0.40625 0,-0.46875 -0.46875,-0.796875 -1.0625,-0.796875 -0.953125,0 -1.4375,1.171875 -1.4375,1.390625 0,0.140625 0.125,0.140625 0.234375,0.140625 0.140625,0 0.1875,0 0.21875,-0.125 0.3125,-1.03125 0.84375,-1.046875 0.921875,-1.046875 0.0625,0 0.15625,0 0.15625,0.1875 0,0.203125 -0.09375,0.4375 -0.140625,0.546875 -0.375,0.921875 -0.546875,1.40625 -0.546875,1.84375 0,0.90625 0.734375,1.1875 1.484375,1.1875 0.1875,0 0.65625,0 1.171875,-0.5 0.3125,0.453125 0.859375,0.5 1.0625,0.5 0.21875,0 0.515625,-0.0625 0.8125,-0.53125 0.1875,-0.3125 0.34375,-0.796875 0.34375,-0.875 0,-0.140625 -0.15625,-0.140625 -0.234375,-0.140625 -0.1875,0 -0.21875,0.046875 -0.25,0.1875 -0.125,0.515625 -0.28125,1 -0.625,1 -0.15625,0 -0.21875,-0.15625 -0.21875,-0.34375 0,-0.140625 0.109375,-0.515625 0.171875,-0.78125 0.046875,-0.21875 0.1875,-0.765625 0.21875,-0.921875 L 5.25,-3.015625 C 5.296875,-3.203125 5.375,-3.5 5.375,-3.5625 c 0,-0.3125 -0.25,-0.421875 -0.4375,-0.421875 -0.46875,0 -0.59375,0.4375 -0.625,0.609375 l -0.515625,2.046875 c -0.0625,0.25 -0.0625,0.265625 -0.09375,0.4375 z m 0,0" + id="path20108" /> + clip-path="url(#clipPath7364)" + id="g20120" + transform="matrix(1.33333,0,0,1.33333,-0.395833,0.0825001)"> - + fill="#000000" + fill-opacity="1" + id="g20118"> + + + - + inkscape:label="" + transform="translate(501.18751,454.25001)" + id="g21877"> + + fill="#000000" + fill-opacity="1" + id="g21873"> + id="g21871" + transform="translate(0,3.9849999)"> + d="m 3.703125,-0.890625 c -0.171875,0.21875 -0.515625,0.609375 -1,0.609375 -0.390625,0 -0.5625,-0.234375 -0.5625,-0.65625 0,-0.53125 0.296875,-1.296875 0.546875,-1.90625 0.046875,-0.125 0.109375,-0.265625 0.109375,-0.40625 0,-0.46875 -0.46875,-0.796875 -1.0625,-0.796875 -0.953125,0 -1.4375,1.171875 -1.4375,1.390625 0,0.140625 0.125,0.140625 0.234375,0.140625 0.140625,0 0.1875,0 0.21875,-0.125 0.3125,-1.03125 0.84375,-1.046875 0.921875,-1.046875 0.0625,0 0.15625,0 0.15625,0.1875 0,0.203125 -0.09375,0.4375 -0.140625,0.546875 -0.375,0.921875 -0.546875,1.40625 -0.546875,1.84375 0,0.90625 0.734375,1.1875 1.484375,1.1875 0.1875,0 0.65625,0 1.171875,-0.5 0.3125,0.453125 0.859375,0.5 1.0625,0.5 0.21875,0 0.515625,-0.0625 0.8125,-0.53125 0.1875,-0.3125 0.34375,-0.796875 0.34375,-0.875 0,-0.140625 -0.15625,-0.140625 -0.234375,-0.140625 -0.1875,0 -0.21875,0.046875 -0.25,0.1875 -0.125,0.515625 -0.28125,1 -0.625,1 -0.15625,0 -0.21875,-0.15625 -0.21875,-0.34375 0,-0.140625 0.109375,-0.515625 0.171875,-0.78125 0.046875,-0.21875 0.1875,-0.765625 0.21875,-0.921875 L 5.25,-3.015625 C 5.296875,-3.203125 5.375,-3.5 5.375,-3.5625 c 0,-0.3125 -0.25,-0.421875 -0.4375,-0.421875 -0.46875,0 -0.59375,0.4375 -0.625,0.609375 l -0.515625,2.046875 c -0.0625,0.25 -0.0625,0.265625 -0.09375,0.4375 z m 0,0" + id="path21869" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + id="g11" + transform="matrix(1.33333,0,0,1.33333,-0.395833,0.0811666)"> + id="use9" + transform="translate(0,3.9860001)"> + d="M 5.34375,-3.34375 C 5.375,-3.484375 5.375,-3.53125 5.375,-3.5625 c 0,-0.3125 -0.25,-0.421875 -0.4375,-0.421875 -0.46875,0 -0.578125,0.4375 -0.640625,0.671875 L 4.0625,-2.390625 c -0.125,0.5 -0.234375,0.984375 -0.375,1.484375 -0.015625,0.0625 -0.40625,0.625 -0.984375,0.625 -0.390625,0 -0.5625,-0.234375 -0.5625,-0.65625 0,-0.53125 0.296875,-1.296875 0.546875,-1.90625 0.046875,-0.125 0.109375,-0.265625 0.109375,-0.40625 0,-0.46875 -0.46875,-0.796875 -1.0625,-0.796875 -0.953125,0 -1.4375,1.171875 -1.4375,1.390625 0,0.140625 0.125,0.140625 0.234375,0.140625 0.140625,0 0.1875,0 0.21875,-0.125 0.3125,-1.03125 0.84375,-1.046875 0.921875,-1.046875 0.0625,0 0.15625,0 0.15625,0.1875 0,0.203125 -0.09375,0.4375 -0.140625,0.546875 -0.359375,0.90625 -0.546875,1.40625 -0.546875,1.84375 0,0.90625 0.734375,1.1875 1.484375,1.1875 0.140625,0 0.484375,0 0.890625,-0.28125 C 3.3125,0.75 2.65625,1.453125 1.9375,1.453125 c -0.015625,0 -0.28125,0 -0.5,-0.09375 C 1.65625,1.25 1.828125,1.03125 1.828125,0.765625 c 0,-0.328125 -0.25,-0.453125 -0.46875,-0.453125 -0.375,0 -0.671875,0.34375 -0.671875,0.703125 0,0.515625 0.546875,0.796875 1.25,0.796875 1.09375,0 2.28125,-0.703125 2.5625,-1.796875 z m 0,0" + id="path23633" /> - + inkscape:label="" + transform="translate(250.39583,454.60501)" + id="g25408"> + - - - - - - + fill="#000000" + fill-opacity="1" + id="g25404"> + id="g25402" + transform="translate(0,3.9849999)"> + d="M 2.578125,-2.921875 C 2.625,-3.09375 3.046875,-3.6875 3.734375,-3.6875 c 0.171875,0 0.28125,0.046875 0.359375,0.125 -0.3125,0.0625 -0.5625,0.328125 -0.5625,0.640625 0,0.328125 0.25,0.453125 0.46875,0.453125 0.328125,0 0.6875,-0.25 0.6875,-0.75 0,-0.484375 -0.375,-0.828125 -0.921875,-0.828125 C 3.046875,-4.046875 2.59375,-3.5625 2.53125,-3.5 2.34375,-3.875 1.875,-4.046875 1.453125,-4.046875 c -0.234375,0 -0.53125,0.0625 -0.8125,0.515625 -0.21875,0.34375 -0.34375,0.8125 -0.34375,0.875 0,0.140625 0.125,0.140625 0.234375,0.140625 0.1875,0 0.1875,-0.015625 0.25,-0.203125 C 0.9375,-3.375 1.125,-3.6875 1.40625,-3.6875 c 0.140625,0 0.203125,0.109375 0.203125,0.328125 0,0.15625 -0.015625,0.265625 -0.09375,0.5625 -0.0625,0.21875 -0.109375,0.421875 -0.171875,0.6875 L 1,-0.734375 C 0.953125,-0.59375 0.921875,-0.40625 0.921875,-0.34375 c 0,0.3125 0.234375,0.421875 0.421875,0.421875 0.25,0 0.515625,-0.171875 0.609375,-0.484375 0.03125,-0.15625 0.3125,-1.28125 0.375,-1.546875 z m 0,0" + id="path25400" /> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + inkscape:label="" + transform="translate(332.25216,494.69301)" + id="g38041"> + - - - - - - + fill="#000000" + fill-opacity="1" + id="g38028"> + id="g38026" + transform="translate(0,6.2270002)"> + d="M 1.953125,-3.96875 0.5625,-3.859375 v 0.265625 c 0.671875,0 0.75,0.0625 0.75,0.515625 v 3.53125 c 0,0.265625 -0.03125,1.15625 -0.640625,1.15625 -0.03125,0 -0.265625,0 -0.46875,-0.109375 0.28125,-0.078125 0.28125,-0.328125 0.28125,-0.390625 0,-0.234375 -0.171875,-0.40625 -0.40625,-0.40625 -0.265625,0 -0.421875,0.171875 -0.421875,0.421875 0,0.46875 0.515625,0.71875 1.03125,0.71875 0.703125,0 1.265625,-0.59375 1.265625,-1.40625 z m 0,-1.5625 c 0,-0.265625 -0.21875,-0.484375 -0.484375,-0.484375 -0.265625,0 -0.484375,0.21875 -0.484375,0.484375 0,0.28125 0.21875,0.484375 0.484375,0.484375 0.265625,0 0.484375,-0.203125 0.484375,-0.484375 z m 0,0" + id="path41" /> - - - - - - - - - - - - - + id="g29" + transform="matrix(1.33333,0,0,1.33333,0.458333,-0.0110003)"> + id="use27" + transform="translate(2.816,6.2270002)"> + d="m 2.875,-5.90625 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.109375 -0.109375,-0.171875 -0.21875,-0.171875 -0.03125,0 -0.046875,0 -0.0625,0 l -1.140625,0.0625 c -0.125,0 -0.3125,0.015625 -0.3125,0.265625 0,0.03125 0,0.171875 0.234375,0.1875 0.0625,0 0.328125,0.015625 0.375,0.015625 L 0.5,-0.578125 c -0.03125,0.140625 -0.03125,0.21875 -0.03125,0.234375 0,0.234375 0.171875,0.421875 0.453125,0.421875 0.203125,0 0.421875,-0.15625 0.515625,-0.328125 0.046875,-0.078125 0.15625,-0.515625 0.21875,-0.78125 0.078125,-0.28125 0.140625,-0.578125 0.21875,-0.875 0.640625,0.078125 1,0.296875 1,0.65625 0,0.046875 0,0.078125 -0.015625,0.171875 -0.03125,0.09375 -0.046875,0.203125 -0.046875,0.21875 0,0.59375 0.59375,0.9375 1.171875,0.9375 0.9375,0 1.28125,-1.3125 1.28125,-1.40625 0,-0.140625 -0.15625,-0.140625 -0.234375,-0.140625 -0.1875,0 -0.203125,0.046875 -0.234375,0.1875 -0.0625,0.21875 -0.28125,1 -0.75,1 -0.140625,0 -0.234375,-0.09375 -0.234375,-0.375 0,-0.0625 0.015625,-0.21875 0.046875,-0.328125 0.015625,-0.09375 0.046875,-0.203125 0.046875,-0.3125 0,-0.78125 -0.984375,-0.921875 -1.5625,-0.96875 0.1875,-0.140625 0.390625,-0.3125 0.640625,-0.53125 C 3.4375,-3.21875 3.953125,-3.6875 4.46875,-3.6875 c 0.109375,0 0.1875,0.03125 0.21875,0.109375 -0.484375,0.046875 -0.640625,0.421875 -0.640625,0.65625 0,0.328125 0.25,0.453125 0.46875,0.453125 0.28125,0 0.6875,-0.21875 0.6875,-0.8125 C 5.203125,-3.65625 5,-4.046875 4.5,-4.046875 c -0.578125,0 -1.09375,0.40625 -1.65625,0.9375 -0.3125,0.296875 -0.5625,0.515625 -0.828125,0.65625 z m 0,0" + id="path38032" /> - - - - - - - + clip-path="url(#clipPath4144)" + id="g35" + transform="matrix(1.33333,0,0,1.33333,0.458333,-0.0110003)"> + fill="#000000" + fill-opacity="1" + id="g33"> + id="use31" + transform="translate(8.5279999,7.223)"> + d="M 1.296875,-2.34375 H 2.28125 V -2.578125 H 1.296875 V -3.6875 h -0.21875 c 0,0.546875 -0.265625,1.125 -0.859375,1.15625 v 0.1875 H 0.8125 V -0.75 c 0,0.625 0.46875,0.8125 0.875,0.8125 0.40625,0 0.71875,-0.328125 0.71875,-0.8125 V -1.078125 H 2.171875 v 0.3125 c 0,0.421875 -0.21875,0.609375 -0.4375,0.609375 -0.4375,0 -0.4375,-0.484375 -0.4375,-0.59375 z m 0,0" + id="path38036" /> - - - - - - - - + + + + + + + + - - - + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.5px;line-height:125%;font-family:'Nimbus Roman No9 L';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline" + transform="matrix(0,0.7272727,-0.7272727,0,131.61216,457.45454)" + id="g38904"> + + - + inkscape:label="" + transform="translate(364.16666,539.71051)" + id="g40786"> + - - - - - - - - - + fill="#000000" + fill-opacity="1" + id="g40782"> + id="g40780" + transform="translate(0,3.8610001)"> + d="m 5.578125,-3.3125 c 0,-0.265625 -0.09375,-0.65625 -0.40625,-0.65625 -0.234375,0 -0.46875,0.234375 -0.46875,0.453125 0,0.140625 0.046875,0.15625 0.125,0.234375 C 4.9375,-3.171875 5.15625,-2.9375 5.15625,-2.5 c 0,0.546875 -0.578125,1.9375 -1.484375,1.9375 -0.5,0 -0.796875,-0.359375 -0.875,-0.734375 0,-0.125 0.3125,-0.765625 0.3125,-1.09375 0,-0.125 -0.0625,-0.234375 -0.203125,-0.234375 -0.078125,0 -0.15625,0.046875 -0.203125,0.109375 -0.171875,0.203125 -0.25,0.9375 -0.25,1.15625 -0.296875,0.421875 -0.671875,0.78125 -1.21875,0.78125 -0.578125,0 -0.78125,-0.484375 -0.78125,-1 0,-0.6875 0.265625,-1.28125 0.84375,-2.03125 C 1.34375,-3.6875 1.34375,-3.71875 1.34375,-3.765625 c 0,-0.078125 -0.078125,-0.15625 -0.15625,-0.15625 -0.09375,0 -0.171875,0.078125 -0.203125,0.140625 -0.5,0.703125 -0.859375,1.6875 -0.859375,2.546875 0,0.703125 0.25,1.328125 1.03125,1.328125 0.5625,0 1.078125,-0.484375 1.34375,-0.890625 0.125,0.359375 0.328125,0.890625 1.046875,0.890625 0.703125,0 1.15625,-0.5625 1.5,-1.265625 C 5.203125,-1.53125 5.3125,-1.90625 5.40625,-2.28125 5.5,-2.671875 5.578125,-3.046875 5.578125,-3.3125 Z m 0,0" + id="path40778" /> - - - - - + + + id="g16241" + transform="matrix(1.33333,0,0,1.33333,-0.625,-0.00966644)"> + id="g16239" + transform="translate(0,6.2259998)"> + d="m 2.875,-5.90625 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.109375 -0.109375,-0.171875 -0.21875,-0.171875 -0.03125,0 -0.046875,0 -0.0625,0 l -1.140625,0.0625 c -0.125,0 -0.3125,0.015625 -0.3125,0.265625 0,0.03125 0,0.171875 0.234375,0.1875 0.0625,0 0.328125,0.015625 0.375,0.015625 L 0.5,-0.578125 c -0.03125,0.140625 -0.03125,0.21875 -0.03125,0.234375 0,0.234375 0.171875,0.421875 0.453125,0.421875 0.203125,0 0.421875,-0.15625 0.515625,-0.328125 0.046875,-0.078125 0.15625,-0.515625 0.21875,-0.78125 0.078125,-0.28125 0.140625,-0.578125 0.21875,-0.875 0.640625,0.078125 1,0.296875 1,0.65625 0,0.046875 0,0.078125 -0.015625,0.171875 -0.03125,0.09375 -0.046875,0.203125 -0.046875,0.21875 0,0.59375 0.59375,0.9375 1.171875,0.9375 0.9375,0 1.28125,-1.3125 1.28125,-1.40625 0,-0.140625 -0.15625,-0.140625 -0.234375,-0.140625 -0.1875,0 -0.203125,0.046875 -0.234375,0.1875 -0.0625,0.21875 -0.28125,1 -0.75,1 -0.140625,0 -0.234375,-0.09375 -0.234375,-0.375 0,-0.0625 0.015625,-0.21875 0.046875,-0.328125 0.015625,-0.09375 0.046875,-0.203125 0.046875,-0.3125 0,-0.78125 -0.984375,-0.921875 -1.5625,-0.96875 0.1875,-0.140625 0.390625,-0.3125 0.640625,-0.53125 C 3.4375,-3.21875 3.953125,-3.6875 4.46875,-3.6875 c 0.109375,0 0.1875,0.03125 0.21875,0.109375 -0.484375,0.046875 -0.640625,0.421875 -0.640625,0.65625 0,0.328125 0.25,0.453125 0.46875,0.453125 0.28125,0 0.6875,-0.21875 0.6875,-0.8125 C 5.203125,-3.65625 5,-4.046875 4.5,-4.046875 c -0.578125,0 -1.09375,0.40625 -1.65625,0.9375 -0.3125,0.296875 -0.5625,0.515625 -0.828125,0.65625 z m 0,0" + id="path16237" /> + clip-path="url(#clipPath9233)" + id="g16249" + transform="matrix(1.33333,0,0,1.33333,-0.625,-0.00966644)"> - + fill="#000000" + fill-opacity="1" + id="g16247"> + + + + + + id="g41973" + transform="matrix(1.33333,0,0,1.33333,-1.59375,0.254333)"> + id="g41971" + transform="translate(1.196,5.7779999)"> + d="m 2.71875,-5.734375 c 0,-0.21875 0,-0.234375 -0.21875,-0.234375 -0.5625,0.5625 -1.390625,0.5625 -1.671875,0.5625 V -5.125 c 0.171875,0 0.71875,0 1.203125,-0.234375 v 4.640625 c 0,0.328125 -0.015625,0.4375 -0.859375,0.4375 H 0.890625 V 0 c 0.3125,-0.03125 1.125,-0.03125 1.484375,-0.03125 0.375,0 1.171875,0 1.5,0.03125 V -0.28125 H 3.59375 c -0.84375,0 -0.875,-0.109375 -0.875,-0.4375 z m 0,0" + id="path41969" /> - - - + + - - - + fill="#000000" + fill-opacity="1" + id="g41981"> + id="g41979" + transform="translate(1.353,17.658001)"> + d="m 3.5625,-3.359375 c -0.390625,0.046875 -0.421875,0.34375 -0.421875,0.40625 0,0.15625 0.109375,0.265625 0.28125,0.265625 0.25,0 0.421875,-0.203125 0.421875,-0.5 0,-0.4375 -0.4375,-0.78125 -1.09375,-0.78125 -1.203125,0 -1.546875,0.90625 -1.546875,1.3125 0,0.34375 0.171875,0.515625 0.28125,0.625 0.1875,0.171875 0.421875,0.234375 0.75,0.296875 0.40625,0.078125 0.484375,0.09375 0.65625,0.203125 0.140625,0.109375 0.21875,0.25 0.21875,0.453125 0,0.21875 -0.21875,0.953125 -1.296875,0.953125 -0.203125,0 -0.828125,-0.03125 -1.03125,-0.4375 0.453125,0 0.53125,-0.359375 0.53125,-0.484375 C 1.3125,-1.3125 1.078125,-1.375 0.984375,-1.375 0.8125,-1.375 0.46875,-1.25 0.46875,-0.78125 c 0,0.5625 0.578125,0.875 1.328125,0.875 1.515625,0 1.84375,-1.09375 1.84375,-1.484375 0,-0.34375 -0.1875,-0.5625 -0.296875,-0.65625 -0.234375,-0.25 -0.515625,-0.296875 -0.828125,-0.359375 -0.109375,-0.03125 -0.3125,-0.0625 -0.34375,-0.078125 -0.28125,-0.0625 -0.453125,-0.234375 -0.453125,-0.46875 0,-0.09375 0.0625,-0.390625 0.3125,-0.578125 0.25,-0.203125 0.59375,-0.203125 0.71875,-0.203125 0.3125,0 0.671875,0.09375 0.8125,0.375 z m 0,0" + id="path41977" /> - - - - - + + + id="g18371" + transform="matrix(1.33333,0,0,1.33333,-0.625,-0.0110003)"> + id="g18369" + transform="translate(0,6.2270002)"> + d="m 2.875,-5.90625 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.109375 -0.109375,-0.171875 -0.21875,-0.171875 -0.03125,0 -0.046875,0 -0.0625,0 l -1.140625,0.0625 c -0.125,0 -0.3125,0.015625 -0.3125,0.265625 0,0.03125 0,0.171875 0.234375,0.1875 0.0625,0 0.328125,0.015625 0.375,0.015625 L 0.5,-0.578125 c -0.03125,0.140625 -0.03125,0.21875 -0.03125,0.234375 0,0.234375 0.171875,0.421875 0.453125,0.421875 0.203125,0 0.421875,-0.15625 0.515625,-0.328125 0.046875,-0.078125 0.15625,-0.515625 0.21875,-0.78125 0.078125,-0.28125 0.140625,-0.578125 0.21875,-0.875 0.640625,0.078125 1,0.296875 1,0.65625 0,0.046875 0,0.078125 -0.015625,0.171875 -0.03125,0.09375 -0.046875,0.203125 -0.046875,0.21875 0,0.59375 0.59375,0.9375 1.171875,0.9375 0.9375,0 1.28125,-1.3125 1.28125,-1.40625 0,-0.140625 -0.15625,-0.140625 -0.234375,-0.140625 -0.1875,0 -0.203125,0.046875 -0.234375,0.1875 -0.0625,0.21875 -0.28125,1 -0.75,1 -0.140625,0 -0.234375,-0.09375 -0.234375,-0.375 0,-0.0625 0.015625,-0.21875 0.046875,-0.328125 0.015625,-0.09375 0.046875,-0.203125 0.046875,-0.3125 0,-0.78125 -0.984375,-0.921875 -1.5625,-0.96875 0.1875,-0.140625 0.390625,-0.3125 0.640625,-0.53125 C 3.4375,-3.21875 3.953125,-3.6875 4.46875,-3.6875 c 0.109375,0 0.1875,0.03125 0.21875,0.109375 -0.484375,0.046875 -0.640625,0.421875 -0.640625,0.65625 0,0.328125 0.25,0.453125 0.46875,0.453125 0.28125,0 0.6875,-0.21875 0.6875,-0.8125 C 5.203125,-3.65625 5,-4.046875 4.5,-4.046875 c -0.578125,0 -1.09375,0.40625 -1.65625,0.9375 -0.3125,0.296875 -0.5625,0.515625 -0.828125,0.65625 z m 0,0" + id="path18367" /> - - - + + fill="#000000" + fill-opacity="1" + id="g18377"> + id="g18375" + transform="translate(5.7119999,7.223)"> - - - + d="M 1.296875,-2.34375 H 2.28125 V -2.578125 H 1.296875 V -3.6875 h -0.21875 c 0,0.546875 -0.265625,1.125 -0.859375,1.15625 v 0.1875 H 0.8125 V -0.75 c 0,0.625 0.46875,0.8125 0.875,0.8125 0.40625,0 0.71875,-0.328125 0.71875,-0.8125 V -1.078125 H 2.171875 v 0.3125 c 0,0.421875 -0.21875,0.609375 -0.4375,0.609375 -0.4375,0 -0.4375,-0.484375 -0.4375,-0.59375 z m 0,0" + id="path18373" /> - + + + + id="g46016" + transform="matrix(1.33333,0,0,1.33333,-0.625,-0.0110003)"> + id="g46014" + transform="translate(0,6.2270002)"> + d="m 2.875,-5.90625 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.109375 -0.109375,-0.171875 -0.21875,-0.171875 -0.03125,0 -0.046875,0 -0.0625,0 l -1.140625,0.0625 c -0.125,0 -0.3125,0.015625 -0.3125,0.265625 0,0.03125 0,0.171875 0.234375,0.1875 0.0625,0 0.328125,0.015625 0.375,0.015625 L 0.5,-0.578125 c -0.03125,0.140625 -0.03125,0.21875 -0.03125,0.234375 0,0.234375 0.171875,0.421875 0.453125,0.421875 0.203125,0 0.421875,-0.15625 0.515625,-0.328125 0.046875,-0.078125 0.15625,-0.515625 0.21875,-0.78125 0.078125,-0.28125 0.140625,-0.578125 0.21875,-0.875 0.640625,0.078125 1,0.296875 1,0.65625 0,0.046875 0,0.078125 -0.015625,0.171875 -0.03125,0.09375 -0.046875,0.203125 -0.046875,0.21875 0,0.59375 0.59375,0.9375 1.171875,0.9375 0.9375,0 1.28125,-1.3125 1.28125,-1.40625 0,-0.140625 -0.15625,-0.140625 -0.234375,-0.140625 -0.1875,0 -0.203125,0.046875 -0.234375,0.1875 -0.0625,0.21875 -0.28125,1 -0.75,1 -0.140625,0 -0.234375,-0.09375 -0.234375,-0.375 0,-0.0625 0.015625,-0.21875 0.046875,-0.328125 0.015625,-0.09375 0.046875,-0.203125 0.046875,-0.3125 0,-0.78125 -0.984375,-0.921875 -1.5625,-0.96875 0.1875,-0.140625 0.390625,-0.3125 0.640625,-0.53125 C 3.4375,-3.21875 3.953125,-3.6875 4.46875,-3.6875 c 0.109375,0 0.1875,0.03125 0.21875,0.109375 -0.484375,0.046875 -0.640625,0.421875 -0.640625,0.65625 0,0.328125 0.25,0.453125 0.46875,0.453125 0.28125,0 0.6875,-0.21875 0.6875,-0.8125 C 5.203125,-3.65625 5,-4.046875 4.5,-4.046875 c -0.578125,0 -1.09375,0.40625 -1.65625,0.9375 -0.3125,0.296875 -0.5625,0.515625 -0.828125,0.65625 z m 0,0" + id="path46012" /> + clip-path="url(#clipPath4299)" + id="g46024" + transform="matrix(1.33333,0,0,1.33333,-0.625,-0.0110003)"> - + fill="#000000" + fill-opacity="1" + id="g46022"> + + + diff --git a/docs/source/control/figs/complexffpi.svg b/docs/source/control/figs/complexffpi.svg deleted file mode 100644 index 93fe79ab..00000000 --- a/docs/source/control/figs/complexffpi.svg +++ /dev/null @@ -1,4169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/source/control/figs/discrete_control_system.svg b/docs/source/control/figs/discrete_control_system.svg new file mode 100644 index 00000000..ef2e9ba7 --- /dev/null +++ b/docs/source/control/figs/discrete_control_system.svg @@ -0,0 +1,905 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + Outercontroller + ref + ref + ref + Innercontroller + Observer + fbk + fbk + mdl + Getfeedback + + diff --git a/docs/source/control/figs/control_system.svg b/docs/source/control/figs/overall_system.svg similarity index 76% rename from docs/source/control/figs/control_system.svg rename to docs/source/control/figs/overall_system.svg index 2dc2fae2..7e12e345 100644 --- a/docs/source/control/figs/control_system.svg +++ b/docs/source/control/figs/overall_system.svg @@ -1,12 +1,12 @@ + transform="translate(-150,-555)"> - - - - - - - - - - - - - - - - - Outercontroller - ref - ref - ref - Innercontroller - Observer - fbk - fbk - mdl - Getfeedback controlsystemsystem - Signal ref at the control system output should containref.T_s and ref.d_c_abc + id="tspan7913">model Continuous-time data, e.g.mdl.converter.data.u_cs (ndarray) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DEMUX_3 - - - - - - DEMUX_3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/grid/grid_following/README.txt b/examples/grid/grid_following/README.txt index 0151237d..c1665795 100644 --- a/examples/grid/grid_following/README.txt +++ b/examples/grid/grid_following/README.txt @@ -1,17 +1,4 @@ Grid-Following Control ---------------------- -These examples demonstrate grid-following control. - -The current controller in the grid following converters uses 2DOF synchronous-frame complex-vector PI controller, with an additional feedforward term. The structure of the controller is shown in the figure below: - -.. figure:: /control/figs/complexffpi.svg - :width: 60% - :align: center - :alt: Two-degree-of-freedom complex-vector PI controller, with feedforward. - - The complex-vector gain selection is based on [#Bri2000]_. More details about the gain selection can be found in the :doc:`/control/drive/current_ctrl` section. - -.. rubric:: References - -.. [#Bri2000] Briz, Degner, Lorenz, "Analysis and design of current regulators using complex vectors," IEEE Trans. Ind. Appl., 2000,https://doi.org/10.1109/28.845057 \ No newline at end of file +These examples demonstrate grid-following control. The current controller uses 2DOF synchronous-frame complex-vector PI controller, with an additional feedforward term from the low-pass filtered grid voltage. \ No newline at end of file diff --git a/motulator/common/control/_control.py b/motulator/common/control/_control.py index d60a86c1..f8a7ab61 100644 --- a/motulator/common/control/_control.py +++ b/motulator/common/control/_control.py @@ -212,12 +212,13 @@ class PIController: This implements a discrete-time 2DOF PI controller, whose continuous-time counterpart is:: - u = k_t*ref_y - k_p*y + (k_i/s)*(ref_y - y) + u = k_t*ref_y - k_p*y + (k_i/s)*(ref_y - y) + u_ff where `u` is the controller output, `y_ref` is the reference signal, `y` is - the feedback signal, and `1/s` refers to integration. The standard PI - controller is obtained by choosing ``k_t = k_p``. The integrator - anti-windup is implemented based on the realized controller output. + the feedback signal, `u_ff` is the feedforward signal, and `1/s` refers to + integration. The standard PI controller is obtained by choosing + ``k_t = k_p``. The integrator anti-windup is implemented based on the + realized controller output. Notes ----- @@ -247,7 +248,7 @@ def __init__(self, k_p, k_i, k_t=None, max_u=np.inf): # States self.v, self.u_i = 0, 0 - def output(self, ref_y, y): + def output(self, ref_y, y, u_ff=0): """ Compute the controller output. @@ -257,6 +258,8 @@ def output(self, ref_y, y): Reference signal. y : float Feedback signal. + u_ff : float, optional + Feedforward signal. The default is 0. Returns ------- @@ -265,7 +268,7 @@ def output(self, ref_y, y): """ # Estimate of a disturbance input - self.v = self.u_i - (self.k_p - self.k_t)*y + self.v = self.u_i - (self.k_p - self.k_t)*y + u_ff # Controller output u = self.k_t*(ref_y - y) + self.v