From 8115aea8ee766c28688947ddc6a397963572023d Mon Sep 17 00:00:00 2001 From: detlefarend Date: Sat, 9 Nov 2024 10:58:33 +0100 Subject: [PATCH] BF: Basics of closed-loop control #1046 --- ...$MLPro-BF-Control_class_diagram.drawio.bkp | 1 + ...MLPro-BF-Control_class_diagram.drawio.dtmp | 1 + .../MLPro-BF-Control_class_diagram.drawio | 2 +- src/mlpro/bf/control/basics.py | 11 ++- .../bf/control/controlsystems/__init__.py | 4 +- src/mlpro/bf/control/controlsystems/basic.py | 67 +++++-------------- .../bf/control/controlsystems/cascade.py | 31 +++++++-- src/mlpro/bf/systems/pool/fox.py | 3 +- ...howto_bf_control_001_basic_control_loop.py | 26 +++---- 9 files changed, 73 insertions(+), 73 deletions(-) create mode 100644 doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.bkp create mode 100644 doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.dtmp diff --git a/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.bkp b/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.bkp new file mode 100644 index 000000000..3fa375fe3 --- /dev/null +++ b/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.bkp @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.dtmp b/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.dtmp new file mode 100644 index 000000000..425b97d3f --- /dev/null +++ b/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/.$MLPro-BF-Control_class_diagram.drawio.dtmp @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/MLPro-BF-Control_class_diagram.drawio b/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/MLPro-BF-Control_class_diagram.drawio index 3e52a5682..b6794ef1b 100644 --- a/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/MLPro-BF-Control_class_diagram.drawio +++ b/doc/rtd/content/99_appendices/appendix2/sub/core/mlpro_bf/layer3_application_support/images/MLPro-BF-Control_class_diagram.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/mlpro/bf/control/basics.py b/src/mlpro/bf/control/basics.py index 2eddc8684..8c667d94d 100644 --- a/src/mlpro/bf/control/basics.py +++ b/src/mlpro/bf/control/basics.py @@ -777,6 +777,10 @@ def add_task(self, p_task: Task, p_pred_tasks: list = None): except: pass + if isinstance( p_task, ControlledSystem ): + self.get_so().init( p_ctrlled_var_space = p_task.system.get_state_space(), + p_ctrl_var_space = p_task.system.get_action_space() ) + ## ------------------------------------------------------------------------------------------------- def run( self, @@ -816,11 +820,16 @@ def run( self, ## ------------------------------------------------------------------------------------------------- class ControlSystem (StreamScenario): """ - ... + Template class for custom control systems. Please implement """ C_TYPE = 'Control System' +## ------------------------------------------------------------------------------------------------- + def __init__(self, p_mode, p_cycle_limit=0, p_visualize = False, p_logging=Log.C_LOG_ALL): + super().__init__(p_mode, p_cycle_limit, p_visualize, p_logging) + + ## ------------------------------------------------------------------------------------------------- def setup(self): diff --git a/src/mlpro/bf/control/controlsystems/__init__.py b/src/mlpro/bf/control/controlsystems/__init__.py index 720e0ac8d..915ff285e 100644 --- a/src/mlpro/bf/control/controlsystems/__init__.py +++ b/src/mlpro/bf/control/controlsystems/__init__.py @@ -1,2 +1,2 @@ -from mlpro.bf.control.controlsystems.cascade import CascadeControlSystem -from mlpro.bf.control.controlsystems.basic import ControlSystemBasic \ No newline at end of file +from mlpro.bf.control.controlsystems.cascade import ControllerList, ControlledSystemList, CascadeControlSystem +from mlpro.bf.control.controlsystems.basic import BasicControlSystem \ No newline at end of file diff --git a/src/mlpro/bf/control/controlsystems/basic.py b/src/mlpro/bf/control/controlsystems/basic.py index c01d61697..7eff5bd55 100644 --- a/src/mlpro/bf/control/controlsystems/basic.py +++ b/src/mlpro/bf/control/controlsystems/basic.py @@ -7,10 +7,11 @@ ## -- yyyy-mm-dd Ver. Auth. Description ## -- 2024-10-04 0.1.0 DA Initial implementation ## -- 2024-10-09 0.2.0 DA Refactoring +## -- 2024-11-09 0.3.0 DA Refactoring ## ------------------------------------------------------------------------------------------------- """ -Ver. 0.2.0 (2024-10-09) +Ver. 0.3.0 (2024-11-09) This module provides a simplified container class for a basic synchronous control system containing @@ -23,15 +24,16 @@ from mlpro.bf.various import Log -from mlpro.bf.control import ControlSystem, Controller, ControlledSystem, ControlWorkflow -from mlpro.bf.control.operators import Comparator, Integrator +from mlpro.bf.control import Controller, ControlledSystem +from mlpro.bf.control.controlsystems import CascadeControlSystem +from mlpro.bf.control.operators import Integrator ## ------------------------------------------------------------------------------------------------- ## ------------------------------------------------------------------------------------------------- -class ControlSystemBasic (ControlSystem): +class BasicControlSystem (CascadeControlSystem): """ Simplified container class for a basic synchronous control system containing @@ -49,7 +51,7 @@ class ControlSystemBasic (ControlSystem): If True, an optional intrator is added to control workflow """ - C_TYPE = 'Control System Basic' + C_TYPE = 'Basic Control System' ## ------------------------------------------------------------------------------------------------- def __init__( self, @@ -60,52 +62,17 @@ def __init__( self, p_cycle_limit = 0, p_visualize : bool = False, p_logging = Log.C_LOG_ALL ): - - self._controller = p_controller - self._controlled_system = p_controlled_system - self._ctrl_var_integration = p_ctrl_var_integration - - super().__init__( p_mode = p_mode, - p_cycle_limit = p_cycle_limit, - p_visualize = p_visualize, - p_logging = p_logging ) + controllers = [ p_controller ] -## ------------------------------------------------------------------------------------------------- - def _setup(self, p_mode, p_visualize: bool, p_logging) -> ControlWorkflow: - - # 1 Create a new control cycle - control_workflow = ControlWorkflow( p_mode = p_mode, + if p_ctrl_var_integration: + controllers.append( Integrator( p_range_max = p_controller.get_range(), p_visualize = p_visualize, - p_logging = p_logging ) - - - # 2 Create and add a comparator - comparator = Comparator( p_visualize = p_visualize, p_logging = p_logging ) - control_workflow.add_task( p_task = comparator ) - - - # 3 Add the controller - control_workflow.add_task( p_task = self._controller, p_pred_tasks = [comparator] ) - - - # 4 Optionally create and add an integrator - if self._ctrl_var_integration: - integrator = Integrator( p_visualize = p_visualize, p_logging = p_logging ) - control_workflow.add_task( p_task = integrator, p_pred_tasks = [self._controller] ) - pred_sys = integrator - - else: - pred_sys = self._controller - - - # 5 Add the controlled system - control_workflow.add_task( p_task = self._controlled_system, p_pred_tasks = [pred_sys] ) - self._controlled_system.system.set_mode( p_mode = p_mode ) - - - # 6 Initialize and return the prepared control workflow - control_workflow.get_so().init( p_ctrlled_var_space = self._controlled_system.system.get_state_space(), - p_ctrl_var_space = self._controlled_system.system.get_action_space() ) + p_logging = p_logging ) ) - return control_workflow \ No newline at end of file + super().__init__( p_controllers = controllers, + p_controlled_systems = [ p_controlled_system ], + p_mode = p_mode, + p_cycle_limit = p_cycle_limit, + p_visualize = p_visualize, + p_logging = p_logging ) \ No newline at end of file diff --git a/src/mlpro/bf/control/controlsystems/cascade.py b/src/mlpro/bf/control/controlsystems/cascade.py index a0d3be889..20e74f080 100644 --- a/src/mlpro/bf/control/controlsystems/cascade.py +++ b/src/mlpro/bf/control/controlsystems/cascade.py @@ -5,11 +5,12 @@ ## ------------------------------------------------------------------------------------------------- ## -- History : ## -- yyyy-mm-dd Ver. Auth. Description -## -- 2024-11-08 1.0.0 DA Initial implementation +## -- 2024-11-08 0.1.0 DA Initial implementation +## -- 2024-11-09 1.0.0 DA Extended ControlledSystemList by type System ## ------------------------------------------------------------------------------------------------- """ -Ver. 1.0.0 (2024-11-08) +Ver. 1.0.0 (2024-11-089) This module provides a container class for cascade control systems. @@ -19,12 +20,16 @@ from mlpro.bf.various import Log from mlpro.bf.exceptions import * +from mlpro.bf.systems import System from mlpro.bf.control import * from mlpro.bf.control.operators import Comparator, Converter -ControllerList = List[ Union[ Controller, List[ControlTask] ] ] -ControlledSystemList = List[ Union[ ControlledSystem, List[ControlTask] ] ] + +ControllerList = List[ Union[ Controller, List[ControlTask] ] ] +ControlledSystemList = List[ Union[ System, ControlledSystem, List[ControlTask] ] ] + + ## ------------------------------------------------------------------------------------------------- @@ -77,6 +82,14 @@ def _add_tasks_to_workflow(self, p_workflow : ControlWorkflow, p_tasks, p_pred_t pred_tasks = p_pred_tasks for task in tasks: + if isinstance( task, System ): + # Native systems need to be wrapped + task = ControlledSystem( p_system = task, + p_name = task.get_name(), + p_range_max = task.get_range(), + p_visualize = self.get_visualization(), + p_logging = self.get_log_level() ) + p_workflow.add_task( p_task = task, p_pred_tasks = pred_tasks ) pred_tasks = [ task ] @@ -86,9 +99,15 @@ def _add_tasks_to_workflow(self, p_workflow : ControlWorkflow, p_tasks, p_pred_t ## ------------------------------------------------------------------------------------------------- def _setup(self, p_mode, p_visualize: bool, p_logging) -> ControlWorkflow: + # 0 Intro workflow_prev : ControlWorkflow = None - for i, t_ctrl, t_ctrl_sys in enumerate(list(zip(self._controllers, self._controlled_systems)).reverse()): + + # 1 Create cascaded workflows from config data + workflow_list = list(zip(self._controllers, self._controlled_systems)) + workflow_list.reverse() + + for i, (t_ctrl, t_ctrl_sys) in enumerate(workflow_list): workflow = ControlWorkflow( p_mode = p_mode, p_name = str(i), @@ -122,5 +141,7 @@ def _setup(self, p_mode, p_visualize: bool, p_logging) -> ControlWorkflow: workflow_prev = workflow + + # 2 Return the outer control workflow return workflow diff --git a/src/mlpro/bf/systems/pool/fox.py b/src/mlpro/bf/systems/pool/fox.py index 211a4fda9..89d2826db 100644 --- a/src/mlpro/bf/systems/pool/fox.py +++ b/src/mlpro/bf/systems/pool/fox.py @@ -39,11 +39,12 @@ class Fox (System): C_NAME = 'Fox' C_BOUNDARIES = [-10,10] + C_PLOT_ACTIVE = False ## ------------------------------------------------------------------------------------------------- def __init__( self, p_id=None, - p_name = None, + p_name = C_NAME, p_num_dim: int = 1, p_delay: float = 0.8, p_thr_jump: float = 0.1, diff --git a/test/howtos/bf/control/howto_bf_control_001_basic_control_loop.py b/test/howtos/bf/control/howto_bf_control_001_basic_control_loop.py index 8e7a28fe8..6d86c7303 100644 --- a/test/howtos/bf/control/howto_bf_control_001_basic_control_loop.py +++ b/test/howtos/bf/control/howto_bf_control_001_basic_control_loop.py @@ -8,16 +8,17 @@ ## -- 2024-09-11 0.0.0 DA Creation ## -- 2024-10-09 0.1.0 DA Refactoring ## -- 2024-10-13 0.2.0 DA Refactoring +## -- 2024-11-09 0.3.0 DA Refactoring ## ------------------------------------------------------------------------------------------------- """ -Ver. 0.2.0 (2024-10-13) +Ver. 0.3.0 (2024-11-09) Let's play fox and hunter! You will learn: -1) How to ... +1) How to set up a basic control system with a controller and a controlled system 2) How to ... @@ -32,7 +33,7 @@ from mlpro.bf.ops import Mode from mlpro.bf.control import ControlledSystem -from mlpro.bf.control.controlsystems import ControlSystemBasic +from mlpro.bf.control.controlsystems import BasicControlSystem from mlpro.bf.systems.pool import Fox from mlpro.bf.control.controllers import Hunter @@ -48,7 +49,7 @@ num_dim = 2 logging = Log.C_LOG_ALL visualize = True - step_rate = 1 + step_rate = 2 else: # 1.2 Parameters for internal unit test @@ -61,21 +62,20 @@ # 2 Init control scenario -# 2.1 Control system -mycontrolledsystem = ControlledSystem( p_system = Fox( p_num_dim = num_dim ), - p_name = 'Fox', - p_visualize = visualize, - p_logging = logging ) +# 2.1 Controlled system +mycontrolledsystem = Fox( p_num_dim = num_dim, + p_visualize = visualize, + p_logging = logging ) # 2.2 Controller -mycontroller = Hunter( p_input_space = mycontrolledsystem.system.get_state_space(), - p_output_space = mycontrolledsystem.system.get_action_space(), +mycontroller = Hunter( p_input_space = mycontrolledsystem.get_state_space(), + p_output_space = mycontrolledsystem.get_action_space(), p_name = 'Hunter', p_visualize = visualize, p_logging = logging ) # 2.3 Basic control system -mycontrolsystem = ControlSystemBasic( p_mode = Mode.C_MODE_SIM, +mycontrolsystem = BasicControlSystem( p_mode = Mode.C_MODE_SIM, p_controller = mycontroller, p_controlled_system = mycontrolledsystem, p_ctrl_var_integration = False, @@ -86,7 +86,7 @@ # 3 Set initial setpoint values and reset the controlled system mycontrolsystem.get_control_panel().set_setpoint( p_values = np.zeros(shape=(num_dim)) ) -mycontrolledsystem.system.reset( p_seed = 1 ) +mycontrolledsystem.reset( p_seed = 1 ) # 4 Run some control cycles