From 793c7ce88181192f9165a46d8bd6ec749f65ca4b Mon Sep 17 00:00:00 2001 From: Milan Jelisavcic Date: Fri, 25 Jan 2019 14:13:39 +0100 Subject: [PATCH 01/49] Add skeleton of future unified robot generator --- pyrevolve/generate/revolve_bot.py | 109 ++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 pyrevolve/generate/revolve_bot.py diff --git a/pyrevolve/generate/revolve_bot.py b/pyrevolve/generate/revolve_bot.py new file mode 100644 index 0000000000..1be872ab96 --- /dev/null +++ b/pyrevolve/generate/revolve_bot.py @@ -0,0 +1,109 @@ +""" +Revolve body generator based on RoboGen framework +""" + + +class RevolveBot(): + """ + Basic robot description class that contains robot's body and/or brain + structures, ID and several other necessary parameters. + """ + + def __init__(self, id=None): + self._body = None + self._brain = None + self._id = id + self._parents = [None, None] + self._fitness = None + self._behaviour = None + + def describe_behaviour(self): + """ + + :return: + """ + pass + + def describe_body(self): + """ + + :return: + """ + pass + + def describe_brain(self): + """ + + :return: + """ + pass + + def load(self, robot, type='yaml'): + """ + Load robot's description from a string and parse it to Python structure + :param robot: Robot's description string + :param type: Type of a robot's description format + :return: + """ + if 'yaml' == type: + pass + elif 'protobuf' == type: + pass + + def read(self, path, type='yaml'): + """ + Read robot's description from a file and parse it to Python structure + :param path: Robot's description file path + :param type: Type of a robot's description format + :return: + """ + with open(path, 'r') as robot_file: + robot = robot_file.read() + + self.load(robot, type) + + def save(self, path, type='yaml'): + """ + Save robot's description on a given file path in a specified format + :param path: + :param type: + :return: + """ + robot = '' + if 'proto' == type: + robot = self.to_yaml() + elif 'yaml' == type: + robot = self.to_yaml() + elif 'sdf' == type: + robot = self.to_sdf() + + with open(path, 'w') as robot_file: + robot_file.write(robot) + + def to_proto(self): + """ + + :return: + """ + return '' + + def to_sdf(self): + """ + + :return: + """ + return '' + + def to_yaml(self): + """ + + :return: + """ + return '' + + def render2d(self): + """ + + :return: + """ + pass From 72c824c3baee580f50dd30658f8c5419307ff6e9 Mon Sep 17 00:00:00 2001 From: Maarten911 Date: Fri, 25 Jan 2019 15:32:45 +0100 Subject: [PATCH 02/49] Initiated revolve_module.py + update for revolve_bot.py --- pyrevolve/generate/revolve_module.py | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 pyrevolve/generate/revolve_module.py diff --git a/pyrevolve/generate/revolve_module.py b/pyrevolve/generate/revolve_module.py new file mode 100644 index 0000000000..8e231a7084 --- /dev/null +++ b/pyrevolve/generate/revolve_module.py @@ -0,0 +1,58 @@ +""" +Class containing the body parts to compose a Robogen robot +""" + + +class RevolveModule(): + """ + Base class allowing for constructing Robogen components in an overviewable manner + """ + + def __init__(self): + self.id = None + self.type = None + self.children = [None] + self.orientation = None + self.colour = {"r": 0, "g": 0, "b": 0} + self.substrate_coordinates = None + + def to_sdf(self): + """ + + :return: + """ + + return '' + + +class CoreModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen core module + """ + def __init__(self): + super(RevolveModule, self).__init__() + + +class JointModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen joint module + """ + def __init__(self): + super(RevolveModule, self).__init__() + + +class BrickModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen brick module + """ + def __init__(self): + super(RevolveModule, self).__init__() + + +class BrickSensorModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen brick sensor module + """ + def __init__(self): + super(RevolveModule, self).__init__() + From bcccb7f9f3ddcc93d5fecdd92ade4dbedf4aaf34 Mon Sep 17 00:00:00 2001 From: Maarten911 Date: Fri, 25 Jan 2019 15:35:20 +0100 Subject: [PATCH 03/49] Initiated revolve_module.py + update for revolve_bot.py --- pyrevolve/generate/revolve_bot.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pyrevolve/generate/revolve_bot.py b/pyrevolve/generate/revolve_bot.py index 1be872ab96..1effd9d0d0 100644 --- a/pyrevolve/generate/revolve_bot.py +++ b/pyrevolve/generate/revolve_bot.py @@ -6,7 +6,8 @@ class RevolveBot(): """ Basic robot description class that contains robot's body and/or brain - structures, ID and several other necessary parameters. + structures, ID and several other necessary parameters. Capable of reading + a robot's sdf mode """ def __init__(self, id=None): @@ -62,6 +63,13 @@ def read(self, path, type='yaml'): self.load(robot, type) + def render2d(self): + """ + + :return: + """ + pass + def save(self, path, type='yaml'): """ Save robot's description on a given file path in a specified format @@ -82,13 +90,14 @@ def save(self, path, type='yaml'): def to_proto(self): """ - + We wouln't use proto anymore here, right? :return: """ return '' def to_sdf(self): """ + Converts yaml to sdf :return: """ @@ -96,14 +105,16 @@ def to_sdf(self): def to_yaml(self): """ + Converts sdf to yaml :return: """ return '' - def render2d(self): + def update_substrate(self): """ :return: """ - pass + return '' + From 915ae26507e0ea7a9113be91888551ff9ce791dd Mon Sep 17 00:00:00 2001 From: Karine Date: Thu, 21 Feb 2019 14:36:19 +0100 Subject: [PATCH 04/49] Support YAML format in RevolveBot --- pyrevolve/generate/__init__.py | 6 - pyrevolve/generate/body.py | 347 ------------------ pyrevolve/generate/neural_net.py | 188 ---------- pyrevolve/generate/revolve_module.py | 58 --- pyrevolve/revolve_bot/__init__.py | 20 + .../{generate => revolve_bot}/revolve_bot.py | 89 +++-- pyrevolve/revolve_bot/revolve_module.py | 159 ++++++++ 7 files changed, 229 insertions(+), 638 deletions(-) delete mode 100644 pyrevolve/generate/__init__.py delete mode 100644 pyrevolve/generate/body.py delete mode 100644 pyrevolve/generate/neural_net.py delete mode 100644 pyrevolve/generate/revolve_module.py create mode 100644 pyrevolve/revolve_bot/__init__.py rename pyrevolve/{generate => revolve_bot}/revolve_bot.py (57%) create mode 100644 pyrevolve/revolve_bot/revolve_module.py diff --git a/pyrevolve/generate/__init__.py b/pyrevolve/generate/__init__.py deleted file mode 100644 index 88570c5825..0000000000 --- a/pyrevolve/generate/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import absolute_import - -from .body import BodyGenerator -from .body import FixedOrientationBodyGenerator - -from .neural_net import NeuralNetworkGenerator diff --git a/pyrevolve/generate/body.py b/pyrevolve/generate/body.py deleted file mode 100644 index 122302c90b..0000000000 --- a/pyrevolve/generate/body.py +++ /dev/null @@ -1,347 +0,0 @@ -""" -Body generation utilities, -""" -from __future__ import absolute_import - -import random - -from pyrevolve.spec.msgs import Body - - -def _init_part_list(spec, parts): - specs = {part_type: spec.get(part_type) for part_type in parts} - none_values = [k for k in specs if specs[k] is None] - if none_values: - raise ValueError("Invalid body part(s): {}" - .format(', '.join(none_values))) - - return specs - - -class BodyGenerator(object): - """ - Generates a randomized robot body from - a spec implementation and some configuration. - - This works as follows: - - A number is chosen between 1 and `max_parts` to determine an upper - limit on the number of body parts (other constraints might come into - play first). - - A part is chosen out of the list of available root parts to be used - as the root. This is added to a list of parts to which an item can - be attached - """ - - def __init__( - self, - spec, - root_parts=None, - attach_parts=None, - min_parts=1, - max_parts=50, - fix_num_parts=False, - max_inputs=None, - max_outputs=None - ): - """ - - :param min_parts: Minimum number of parts in each robot - :type min_parts: int - :param fix_num_parts: - :type fix_num_parts: If true, fixes the number of parts to - `max_parts` rather than picking a random value (the - number of parts might still be lower if other - constraints apply). - :param spec: The body implementation spec - :type spec: BodyImplementation - :param root_parts: A list of part specifiers that are allowed as root - parts, or `None` if all parts can be used as such. - :type root_parts: list - :param attach_parts: A list of part specifiers that are allowed as - non-root (i.e. attached) parts, or `None` if all - parts can be used. - :type attach_parts: list - :param max_parts: The maximum number of parts to be used in a robot; - must be specified for the generation to ever halt. - :type max_parts: int - :param max_inputs: The total maximum number of inputs. - :type max_inputs: int - :param max_outputs: The total maximum number of outputs. - :type max_outputs: int - :return: - """ - self.min_parts = min_parts - self.fix_parts = fix_num_parts - self.spec = spec - self.root_parts = root_parts if root_parts is not None \ - else spec.get_all_types() - self.attach_parts = attach_parts if attach_parts is not None \ - else spec.get_all_types() - - # Get the part specifications, check if they are valid - self.root_specs = _init_part_list(self.spec, self.root_parts) - self.attach_specs = _init_part_list(self.spec, self.attach_parts) - - self.max_parts = max_parts - self.max_inputs = max_inputs - self.max_outputs = max_outputs - self.label_counter = 0 - - def generate(self): - """ - Generates a robot body - :return: The robot body - :rtype: Body - """ - body = Body() - root_specs, attach_specs = self.root_specs, self.attach_specs - - # First, pick a number of body parts (this will be an upper limit) - max_parts = self.max_parts if self.fix_parts \ - else self.choose_max_parts() - - root_part_type = self.choose_part( - parts=self.root_parts, - parent_part=None, - root_part=None, - root=True) - root_part = root_specs[root_part_type] - body.root.id = "bodygen-root" - body.root.type = root_part_type - self.initialize_part( - spec=root_part, - new_part=body.root, - parent_part=None, - root_part=body.root, - root=True) - - # A body part counter - counter = 1 - - # Current number of inputs / outputs - inputs = root_part.inputs - outputs = root_part.outputs - - # List of (body part, slot) tuples for free part slots - free = [(body.root, i) for i in range(root_part.arity)] - - attempts = 0 - while attempts < 5: - if counter >= max_parts or not free: - break - - # Construct a list of parts we can use that - # would not break the constraints - usable = self.get_allowed_parts( - attach_specs=attach_specs, - num_parts=counter, - inputs=inputs, - outputs=outputs, - root_part=body.root) - - if not usable: - break - - # Pick a free parent / slot - combination = self.choose_attachment(free, body.root) - free.remove(combination) - parent, slot = combination - - # Pick a new body part and target slot - new_part_type = self.choose_part(usable, parent, body.root) - if not new_part_type: - attempts += 1 - continue - - new_part = attach_specs[new_part_type] - target_slot = self.choose_target_slot(new_part, parent, body.root) - - if target_slot is False: - attempts += 1 - continue - - conn = parent.child.add() - conn.src_slot = slot - conn.dst_slot = target_slot - conn.part.id = "bodygen-{}".format(counter) - conn.part.type = new_part_type - self.initialize_part(new_part, conn.part, parent, body.root) - - # Update counters and free list - inputs += new_part.inputs - outputs += new_part.outputs - counter += 1 - free += [ - (conn.part, i) for i in range(new_part.arity) if i != target_slot - ] - - return body - - def get_allowed_parts( - self, - attach_specs, - num_parts, - inputs, - outputs, - root_part - ): - """ - Overridable function that creates a list of allowed parts for a specific - stage of robot generation. - :param attach_specs: Map of part identifiers to `PartSpec`s - :param num_parts: Current number of parts - :param inputs: Current number of inputs - :param outputs: Current number of outputs - :param root_part: The current body root part - :return: List of identifiers of parts that when added do not violate - some robot rules, - By default, this checks for maximum inputs / outputs. - :rtype: list[str] - """ - return [item for item in attach_specs if ( - inputs + attach_specs[item].inputs <= self.max_inputs and - outputs + attach_specs[item].outputs <= self.max_outputs - )] - - def initialize_part( - self, - spec, - new_part, - parent_part, - root_part, - root=False - ): - """ - :param spec: - :type spec: PartSpec - :param new_part: - :type new_part: BodyPart - :param parent_part: The parent of the new part - :param root_part: The current body root part - :param root: - :return: - """ - # Initialize random parameters - spec.set_parameters(new_part.param, spec.get_random_parameters()) - - # Set random orientation in degrees - new_part.orientation = self.choose_orientation( - new_part=new_part, - parent_part=parent_part, - root_part=root_part, - root=root) - new_part.label = "part-{}".format(self.get_label_counter()) - return new_part - - def get_label_counter(self): - """ - Simple incremental counter for part labels. - :return: - """ - self.label_counter += 1 - return self.label_counter - - def choose_orientation(self, new_part, parent_part, root_part, root=False): - """ - Overridable method to choose the degrees of orientation of the - new part. - :param new_part: - :type new_part: BodyPart - :param parent_part: - :param root_part: The current robot body root part - :param root: Whether the given part is the root part. - :type root: bool - :return: Degrees of orientation - :rtype: float - """ - return random.uniform(0, 360) - - def choose_part( - self, - parts, - parent_part, - root_part, - root=False - ): - """ - Overridable method to choose a body part from a list - of part type identifiers. This method may return - false to indicate that no suitable part is available - to be chosen for the given parent. - :param parts: List of part types that are currently possible - within robot constraints. - :type parts: list[str] - :param parent_part: Parent body part - :param root_part: The robot body - :param root: Whether the part is root - :return: The chosen part or `False` - :rtype: str|bool - """ - return random.choice(parts) - - @staticmethod - def choose_attachment( - attachments, - root_part - ): - """ - Overridable method to choose a parent/slot combination - from a list of attachments. - :param attachments: - :param root_part: The current root of the tree with connections, - for inspection - :return: The chosen parent / slot tuple - :rtype: tuple - """ - return random.choice(attachments) - - @staticmethod - def choose_target_slot( - new_part, - parent, - root_part - ): - """ - Overridable method to choose a target attachment - slot for a new part. - :param new_part: - :type new_part: PartSpec - :param parent: Part parent - :param root_part: Current robot body root - :return: - """ - return random.randint(0, new_part.arity - 1) - - def choose_max_parts(self): - """ - Overridable method to pick the part limit for - the robot to be generated. - :return: - """ - return random.randint(self.min_parts, self.max_parts) - - -class FixedOrientationBodyGenerator(BodyGenerator): - """ - Convenience body generator that supports only a limited number of - orientations. By default, increments of 90 degrees are used. This - type of custom generator is trivial to create, this class serves - also as a simple example on how to to such a thing. - """ - ORIENTATIONS = [0, 90, 180, 270] - - def choose_orientation( - self, - new_part, - parent_part, - root_part, - root=False - ): - """ - :param parent_part: - :param root_part: - :param new_part: - :param root: - :return: - """ - return random.choice(self.ORIENTATIONS) diff --git a/pyrevolve/generate/neural_net.py b/pyrevolve/generate/neural_net.py deleted file mode 100644 index 6f4b86bf4e..0000000000 --- a/pyrevolve/generate/neural_net.py +++ /dev/null @@ -1,188 +0,0 @@ -""" -Random generator for the default neural network -""" -from __future__ import absolute_import -from __future__ import print_function - -import random -import itertools - -from pyrevolve.spec import NeuralNetwork -from pyrevolve.spec import NeuralNetImplementation -from pyrevolve.spec import BodyImplementation - -from pyrevolve.util import decide - - -# Helper function to extract the network interface from a body part and subtree -def _extract_io(body_spec, part): - spec = body_spec.get(part.type) - inputs = ["{}-in-{}".format(part.id, i) for i in range(spec.inputs)] - outputs = ["{}-out-{}".format(part.id, i) for i in range(spec.outputs)] - part_ids = {neuron_id: part.id for neuron_id in inputs + outputs} - - for child in part.child: - ci, co, cp = _extract_io(body_spec, child.part) - inputs += ci - outputs += co - part_ids.update(cp) - - return inputs, outputs, part_ids - - -class NeuralNetworkGenerator(object): - """ - Simple random neural network generator, generates - hidden neurons and connections with a certain probability - from a specified input / output interface. - """ - def __init__(self, spec, max_hidden=20, conn_prob=0.1): - """ - :param conn_prob: Probability of creating a connection (i.e. nonzero - weight) between two neurons. - :type conn_prob: float - :param spec: - :type spec: NeuralNetImplementation - :param max_hidden: - :return: - """ - self.conn_prob = conn_prob - self.spec = spec - - types = spec.get_all_types() - self.layer_types = { - layer: [t for t in types if layer in spec.get(t).layers] - for layer in ("input", "output", "hidden") - } - - self.max_hidden = max_hidden - - def generate(self, inputs, outputs, part_ids=None, num_hidden=None,): - """ - Generates a neural network from the provided interface. - - Note that hidden neurons will get a randomly assigned part ID from - the specified `part_ids` map, provided it isn't empty. - - :param inputs: A list of IDs of all input neurons that should - be generated. - :type inputs: list - :param outputs: List of output IDs to be generated - :type outputs: list - :param part_ids: Maps neuron ID to corresponding part ID. This is - required to set the `partId` field on a neuron. - :type part_ids: dict - :param num_hidden: If specified, this number of hidden neurons will - be generated for the brain. - :return: The generated NeuralNetwork protobuf - :rtype: NeuralNetwork - """ - net = NeuralNetwork() - hidden = [] - - if part_ids is None: - part_ids = {} - - # Create a list of unique part IDs to choose hidden neuron - # part IDs from. - part_list = list(set(part_ids.values())) - - # Initialize network interface, i.e. inputs and outputs - for layer, ids in (("input", inputs), ("output", outputs)): - for neuron_id in ids: - neuron = net.neuron.add() - neuron.id = neuron_id - neuron.layer = layer - - if neuron_id in part_ids: - neuron.partId = part_ids[neuron_id] - - neuron.type = self.choose_neuron_type(layer) - spec = self.spec.get(neuron.type) - self.initialize_neuron(spec, neuron) - - num_hidden = self.choose_num_hidden() if num_hidden is None \ - else num_hidden - for i in range(num_hidden): - neuron = net.neuron.add() - neuron.id = 'brian-gen-hidden-{}'.format(len(hidden)) - - # Assign a part ID to each hidden neuron, provided we - # have a map. - if part_list: - neuron.partId = random.choice(part_list) - - hidden.append(neuron.id) - neuron.layer = "hidden" - neuron.type = self.choose_neuron_type(neuron.layer) - spec = self.spec.get(neuron.type) - self.initialize_neuron(spec, neuron) - - # Initialize neuron connections - conn_start = inputs + hidden + outputs - conn_end = hidden + outputs - - for src, dst in itertools.product(conn_start, conn_end): - if not decide(self.conn_prob): - continue - - weight = self.choose_weight() - - conn = net.connection.add() - conn.src = src - conn.dst = dst - conn.weight = weight - - return net - - def generate_from_body(self, body, body_spec): - """ - Convenience wrapper over `generate` to fetch the network - interface from a robot body. - :param body: - :type body: Body - :param body_spec: - :type body_spec: BodyImplementation - :return: NeuralNetwork - """ - inputs, outputs, part_ids = _extract_io(body_spec, body.root) - return self.generate(inputs, outputs, part_ids) - - @staticmethod - def choose_weight(): - """ - Overridable function to pick a neural connection weight. - By default, this returns a value between 0 and 1 - :return: - :rtype: float - """ - return random.random() - - @staticmethod - def initialize_neuron(spec, neuron): - """ - Initializes a neuron's parameters - :param spec: - :type spec: NeuronSpec - :param neuron: - :type neuron: Neuron - :return: - """ - # Initialize random parameters - spec.set_parameters(neuron.param, spec.get_random_parameters()) - - def choose_neuron_type(self, layer): - """ - Overridable method to pick the neuron type of a new neuron. - :param layer: - :return: - """ - return random.choice(self.layer_types[layer]) - - def choose_num_hidden(self): - """ - Overridable method to pick the number of hidden - neurons. - :return: - """ - return random.randint(0, self.max_hidden) diff --git a/pyrevolve/generate/revolve_module.py b/pyrevolve/generate/revolve_module.py deleted file mode 100644 index 8e231a7084..0000000000 --- a/pyrevolve/generate/revolve_module.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Class containing the body parts to compose a Robogen robot -""" - - -class RevolveModule(): - """ - Base class allowing for constructing Robogen components in an overviewable manner - """ - - def __init__(self): - self.id = None - self.type = None - self.children = [None] - self.orientation = None - self.colour = {"r": 0, "g": 0, "b": 0} - self.substrate_coordinates = None - - def to_sdf(self): - """ - - :return: - """ - - return '' - - -class CoreModule(RevolveModule): - """ - Inherits class RevolveModule. Creates Robogen core module - """ - def __init__(self): - super(RevolveModule, self).__init__() - - -class JointModule(RevolveModule): - """ - Inherits class RevolveModule. Creates Robogen joint module - """ - def __init__(self): - super(RevolveModule, self).__init__() - - -class BrickModule(RevolveModule): - """ - Inherits class RevolveModule. Creates Robogen brick module - """ - def __init__(self): - super(RevolveModule, self).__init__() - - -class BrickSensorModule(RevolveModule): - """ - Inherits class RevolveModule. Creates Robogen brick sensor module - """ - def __init__(self): - super(RevolveModule, self).__init__() - diff --git a/pyrevolve/revolve_bot/__init__.py b/pyrevolve/revolve_bot/__init__.py new file mode 100644 index 0000000000..12bbb64ec8 --- /dev/null +++ b/pyrevolve/revolve_bot/__init__.py @@ -0,0 +1,20 @@ +# Adds OrderedDict as possible yaml input +import yaml +from collections import OrderedDict + +from .revolve_bot import RevolveBot +from .revolve_module import RevolveModule + + +def represent_ordereddict(dumper, data): + value = [] + + for item_key, item_value in data.items(): + node_key = dumper.represent_data(item_key) + node_value = dumper.represent_data(item_value) + + value.append((node_key, node_value)) + + return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', value) + +yaml.add_representer(OrderedDict, represent_ordereddict) diff --git a/pyrevolve/generate/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py similarity index 57% rename from pyrevolve/generate/revolve_bot.py rename to pyrevolve/revolve_bot/revolve_bot.py index 1effd9d0d0..613b4f4097 100644 --- a/pyrevolve/generate/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -1,7 +1,13 @@ """ Revolve body generator based on RoboGen framework """ +import yaml +from collections import OrderedDict +from .revolve_module import CoreModule +from .revolve_module import ActiveHingeModule +from .revolve_module import BrickModule +from .revolve_module import BrickSensorModule class RevolveBot(): """ @@ -14,44 +20,53 @@ def __init__(self, id=None): self._body = None self._brain = None self._id = id - self._parents = [None, None] + self._parents = None self._fitness = None - self._behaviour = None + self._behavioural_measurement = None - def describe_behaviour(self): + def measure_behaviour(self): """ :return: """ pass - def describe_body(self): + def measure_body(self): """ :return: """ pass - def describe_brain(self): + def measure_brain(self): """ :return: """ pass - def load(self, robot, type='yaml'): + def load(self, text, conf_type='yaml'): """ Load robot's description from a string and parse it to Python structure - :param robot: Robot's description string + :param text: Robot's description string :param type: Type of a robot's description format :return: """ - if 'yaml' == type: - pass - elif 'protobuf' == type: - pass + if 'yaml' == conf_type: + self.load_yaml(text) + elif 'sdf' == conf_type: + raise NotImplementedError("Loading from SDF not yet implemented") - def read(self, path, type='yaml'): + def load_yaml(self, text): + """ + Load robot's description from a yaml string + :param text: Robot's yaml description + """ + yaml_bot = yaml.safe_load(text) + self._id = yaml_bot['id'] + self._body = CoreModule.FromYaml(yaml_bot['body']) + + def load_file(self, path, conf_type='yaml'): """ Read robot's description from a file and parse it to Python structure :param path: Robot's description file path @@ -61,16 +76,30 @@ def read(self, path, type='yaml'): with open(path, 'r') as robot_file: robot = robot_file.read() - self.load(robot, type) + self.load(robot, conf_type) - def render2d(self): + def to_sdf(self): """ + Converts yaml to sdf :return: """ - pass + return '' + + def to_yaml(self): + """ + Converts sdf to yaml + + :return: + """ + yaml_dict = OrderedDict() + yaml_dict['id'] = self._id + yaml_dict['body'] = self._body.to_yaml() + yaml_dict['brain'] = {} # TODO dump also brain + + return yaml.dump(yaml_dict) - def save(self, path, type='yaml'): + def save_file(self, path, type='yaml'): """ Save robot's description on a given file path in a specified format :param path: @@ -78,9 +107,7 @@ def save(self, path, type='yaml'): :return: """ robot = '' - if 'proto' == type: - robot = self.to_yaml() - elif 'yaml' == type: + if 'yaml' == type: robot = self.to_yaml() elif 'sdf' == type: robot = self.to_sdf() @@ -88,33 +115,17 @@ def save(self, path, type='yaml'): with open(path, 'w') as robot_file: robot_file.write(robot) - def to_proto(self): - """ - We wouln't use proto anymore here, right? - :return: - """ - return '' - - def to_sdf(self): - """ - Converts yaml to sdf - - :return: - """ - return '' - - def to_yaml(self): + def update_substrate(self): """ - Converts sdf to yaml + Update all coordinates for body components :return: """ return '' - def update_substrate(self): + def render2d(self): """ :return: """ - return '' - + raise NotImplementedError("Render2D not yet implemented") diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py new file mode 100644 index 0000000000..9f37c3728d --- /dev/null +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -0,0 +1,159 @@ +""" +Class containing the body parts to compose a Robogen robot +""" + +from collections import OrderedDict + +class RevolveModule(): + """ + Base class allowing for constructing Robogen components in an overviewable manner + """ + DEFAULT_COLOR = (0.5, 0.5, 0.5) + TYPE = 'NONE' + + def __init__(self): + self.id = None + self.slot = None + self.orientation = None + self.rgb = None #RevolveModule.DEFAULT_COLOR + self.substrate_coordinates = None + self.children = [None, None, None, None] + + def color(self): + return self.rgb if self.rgb is not None else self.DEFAULT_COLOR + + @staticmethod + def FromYaml(yaml_object): + mod_type = yaml_object['type'] + if mod_type == 'CoreComponent' or mod_type == 'Core': + module = CoreModule() + elif mod_type == 'ActiveHinge': + module = ActiveHingeModule() + elif mod_type == 'FixedBrick': + module = BrickModule() + elif mod_type == 'FixedBrickSensor': + module = BrickSensorModule() + else: + raise NotImplementedError('"{} module not yet implemented'.format(mod_type)) + + module.id = yaml_object['id'] + + try: + module.slot = yaml_object['slot'] + except KeyError: + module.slot = 0 + + try: + module.orientation = yaml_object['orientation'] + except KeyError: + module.orientation = 0 + + try: + module.rgb = ( + yaml_object['params']['red'], + yaml_object['params']['green'], + yaml_object['params']['blue'], + ) + except KeyError: + pass + + if 'children' in yaml_object: + for parent_slot in yaml_object['children']: + module.children[parent_slot] = RevolveModule.FromYaml( + yaml_object=yaml_object['children'][parent_slot]) + + return module + + def to_yaml(self): + yaml_dict_object = OrderedDict() + yaml_dict_object['id'] = self.id + yaml_dict_object['type'] = self.TYPE + yaml_dict_object['slot'] = self.slot + yaml_dict_object['orientation'] = self.orientation + + if self.rgb is not None: + yaml_dict_object['params'] = { + 'red': self.rgb[0], + 'green': self.rgb[1], + 'blue': self.rgb[2], + } + + children = self.generate_yaml_children() + if children is not None: + yaml_dict_object['children'] = children + + return yaml_dict_object + + def generate_yaml_children(self): + has_children = False + + children = {} + for i, child in enumerate(self.children): + if child is not None: + children[i] = child.to_yaml() + has_children = True + + return children if has_children else None + + def validate(self): + """ + Tests if the robot tree is valid (recursively) + :return: True if the robot tree is valid + """ + raise NotImplementedError("robot tree validation not yet implemented") + + def to_sdf(self): + """ + + :return: + """ + + return '' + + +class CoreModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen core module + """ + TYPE = "CoreComponent" + + def __init__(self): + super().__init__() + + +class ActiveHingeModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen joint module + """ + TYPE = "ActiveHinge" + + def __init__(self): + super().__init__() + self.children = {1: None} + + def generate_yaml_children(self): + child = self.children[1] + if child is None: + return None + else: + return {1: child.to_yaml()} + + +class BrickModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen brick module + """ + TYPE = "FixedBrick" + + def __init__(self): + super().__init__() + + +class BrickSensorModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen brick sensor module + """ + TYPE = "FixedBrickSensor" + + def __init__(self): + super().__init__() From ae95257c763be12734741582041a3cdda24d9061 Mon Sep 17 00:00:00 2001 From: Karine Date: Thu, 21 Feb 2019 14:52:58 +0100 Subject: [PATCH 05/49] Add unittest for RevolveBot --- pyrevolve/revolve_bot/revolve_bot.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 613b4f4097..7cc444c162 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -99,17 +99,17 @@ def to_yaml(self): return yaml.dump(yaml_dict) - def save_file(self, path, type='yaml'): + def save_file(self, path, conf_type='yaml'): """ Save robot's description on a given file path in a specified format :param path: - :param type: + :param conf_type: :return: """ robot = '' - if 'yaml' == type: + if 'yaml' == conf_type: robot = self.to_yaml() - elif 'sdf' == type: + elif 'sdf' == conf_type: robot = self.to_sdf() with open(path, 'w') as robot_file: From 8d324e028d95220559f3267fe0669a720846e1a0 Mon Sep 17 00:00:00 2001 From: Karine Date: Thu, 21 Feb 2019 18:58:29 +0100 Subject: [PATCH 06/49] loads brain from yaml --- experiments/examples/yaml/simple_robot.yaml | 1 - pyrevolve/revolve_bot/body.py | 349 ++++++++++++++++++++ pyrevolve/revolve_bot/brain_nn.py | 116 +++++++ pyrevolve/revolve_bot/neural_net.py | 188 +++++++++++ pyrevolve/revolve_bot/revolve_bot.py | 18 +- pyrevolve/revolve_bot/revolve_module.py | 49 ++- src/pygazebo | 1 + test.py | 10 + test_py/generate/test_revolvebot.py | 33 ++ 9 files changed, 759 insertions(+), 6 deletions(-) create mode 100644 pyrevolve/revolve_bot/body.py create mode 100644 pyrevolve/revolve_bot/brain_nn.py create mode 100644 pyrevolve/revolve_bot/neural_net.py create mode 160000 src/pygazebo create mode 100755 test.py create mode 100644 test_py/generate/test_revolvebot.py diff --git a/experiments/examples/yaml/simple_robot.yaml b/experiments/examples/yaml/simple_robot.yaml index 78fc467160..e667fa0403 100644 --- a/experiments/examples/yaml/simple_robot.yaml +++ b/experiments/examples/yaml/simple_robot.yaml @@ -1,4 +1,3 @@ ---- !tol/robot # ID of the robot id: 0 # Default diff --git a/pyrevolve/revolve_bot/body.py b/pyrevolve/revolve_bot/body.py new file mode 100644 index 0000000000..2580e17fa9 --- /dev/null +++ b/pyrevolve/revolve_bot/body.py @@ -0,0 +1,349 @@ +""" +Body generation utility class + +The role is to generate a directly-encoded body structure +""" +from __future__ import absolute_import + +import random + +from pyrevolve.spec.msgs import Body + + +def _init_part_list(spec, parts): + specs = {part_type: spec.get(part_type) for part_type in parts} + none_values = [k for k in specs if specs[k] is None] + if none_values: + raise ValueError("Invalid body part(s): {}" + .format(', '.join(none_values))) + + return specs + + +class BodyGenerator(object): + """ + Generates a randomized robot body from + a spec implementation and some configuration. + + This works as follows: + - A number is chosen between 1 and `max_parts` to determine an upper + limit on the number of body parts (other constraints might come into + play first). + - A part is chosen out of the list of available root parts to be used + as the root. This is added to a list of parts to which an item can + be attached + """ + + def __init__( + self, + spec, + root_parts=None, + attach_parts=None, + min_parts=1, + max_parts=50, + fix_num_parts=False, + max_inputs=None, + max_outputs=None + ): + """ + + :param min_parts: Minimum number of parts in each robot + :type min_parts: int + :param fix_num_parts: + :type fix_num_parts: If true, fixes the number of parts to + `max_parts` rather than picking a random value (the + number of parts might still be lower if other + constraints apply). + :param spec: The body implementation spec + :type spec: BodyImplementation + :param root_parts: A list of part specifiers that are allowed as root + parts, or `None` if all parts can be used as such. + :type root_parts: list + :param attach_parts: A list of part specifiers that are allowed as + non-root (i.e. attached) parts, or `None` if all + parts can be used. + :type attach_parts: list + :param max_parts: The maximum number of parts to be used in a robot; + must be specified for the generation to ever halt. + :type max_parts: int + :param max_inputs: The total maximum number of inputs. + :type max_inputs: int + :param max_outputs: The total maximum number of outputs. + :type max_outputs: int + :return: + """ + self.min_parts = min_parts + self.fix_parts = fix_num_parts + self.spec = spec + self.root_parts = root_parts if root_parts is not None \ + else spec.get_all_types() + self.attach_parts = attach_parts if attach_parts is not None \ + else spec.get_all_types() + + # Get the part specifications, check if they are valid + self.root_specs = _init_part_list(self.spec, self.root_parts) + self.attach_specs = _init_part_list(self.spec, self.attach_parts) + + self.max_parts = max_parts + self.max_inputs = max_inputs + self.max_outputs = max_outputs + self.label_counter = 0 + + def generate(self): + """ + Generates a robot body + :return: The robot body + :rtype: Body + """ + body = Body() + root_specs, attach_specs = self.root_specs, self.attach_specs + + # First, pick a number of body parts (this will be an upper limit) + max_parts = self.max_parts if self.fix_parts \ + else self.choose_max_parts() + + root_part_type = self.choose_part( + parts=self.root_parts, + parent_part=None, + root_part=None, + root=True) + root_part = root_specs[root_part_type] + body.root.id = "bodygen-root" + body.root.type = root_part_type + self.initialize_part( + spec=root_part, + new_part=body.root, + parent_part=None, + root_part=body.root, + root=True) + + # A body part counter + counter = 1 + + # Current number of inputs / outputs + inputs = root_part.inputs + outputs = root_part.outputs + + # List of (body part, slot) tuples for free part slots + free = [(body.root, i) for i in range(root_part.arity)] + + attempts = 0 + while attempts < 5: + if counter >= max_parts or not free: + break + + # Construct a list of parts we can use that + # would not break the constraints + usable = self.get_allowed_parts( + attach_specs=attach_specs, + num_parts=counter, + inputs=inputs, + outputs=outputs, + root_part=body.root) + + if not usable: + break + + # Pick a free parent / slot + combination = self.choose_attachment(free, body.root) + free.remove(combination) + parent, slot = combination + + # Pick a new body part and target slot + new_part_type = self.choose_part(usable, parent, body.root) + if not new_part_type: + attempts += 1 + continue + + new_part = attach_specs[new_part_type] + target_slot = self.choose_target_slot(new_part, parent, body.root) + + if target_slot is False: + attempts += 1 + continue + + conn = parent.child.add() + conn.src_slot = slot + conn.dst_slot = target_slot + conn.part.id = "bodygen-{}".format(counter) + conn.part.type = new_part_type + self.initialize_part(new_part, conn.part, parent, body.root) + + # Update counters and free list + inputs += new_part.inputs + outputs += new_part.outputs + counter += 1 + free += [ + (conn.part, i) for i in range(new_part.arity) if i != target_slot + ] + + return body + + def get_allowed_parts( + self, + attach_specs, + num_parts, + inputs, + outputs, + root_part + ): + """ + Overridable function that creates a list of allowed parts for a specific + stage of robot generation. + :param attach_specs: Map of part identifiers to `PartSpec`s + :param num_parts: Current number of parts + :param inputs: Current number of inputs + :param outputs: Current number of outputs + :param root_part: The current body root part + :return: List of identifiers of parts that when added do not violate + some robot rules, + By default, this checks for maximum inputs / outputs. + :rtype: list[str] + """ + return [item for item in attach_specs if ( + inputs + attach_specs[item].inputs <= self.max_inputs and + outputs + attach_specs[item].outputs <= self.max_outputs + )] + + def initialize_part( + self, + spec, + new_part, + parent_part, + root_part, + root=False + ): + """ + :param spec: + :type spec: PartSpec + :param new_part: + :type new_part: BodyPart + :param parent_part: The parent of the new part + :param root_part: The current body root part + :param root: + :return: + """ + # Initialize random parameters + spec.set_parameters(new_part.param, spec.get_random_parameters()) + + # Set random orientation in degrees + new_part.orientation = self.choose_orientation( + new_part=new_part, + parent_part=parent_part, + root_part=root_part, + root=root) + new_part.label = "part-{}".format(self.get_label_counter()) + return new_part + + def get_label_counter(self): + """ + Simple incremental counter for part labels. + :return: + """ + self.label_counter += 1 + return self.label_counter + + def choose_orientation(self, new_part, parent_part, root_part, root=False): + """ + Overridable method to choose the degrees of orientation of the + new part. + :param new_part: + :type new_part: BodyPart + :param parent_part: + :param root_part: The current robot body root part + :param root: Whether the given part is the root part. + :type root: bool + :return: Degrees of orientation + :rtype: float + """ + return random.uniform(0, 360) + + def choose_part( + self, + parts, + parent_part, + root_part, + root=False + ): + """ + Overridable method to choose a body part from a list + of part type identifiers. This method may return + false to indicate that no suitable part is available + to be chosen for the given parent. + :param parts: List of part types that are currently possible + within robot constraints. + :type parts: list[str] + :param parent_part: Parent body part + :param root_part: The robot body + :param root: Whether the part is root + :return: The chosen part or `False` + :rtype: str|bool + """ + return random.choice(parts) + + @staticmethod + def choose_attachment( + attachments, + root_part + ): + """ + Overridable method to choose a parent/slot combination + from a list of attachments. + :param attachments: + :param root_part: The current root of the tree with connections, + for inspection + :return: The chosen parent / slot tuple + :rtype: tuple + """ + return random.choice(attachments) + + @staticmethod + def choose_target_slot( + new_part, + parent, + root_part + ): + """ + Overridable method to choose a target attachment + slot for a new part. + :param new_part: + :type new_part: PartSpec + :param parent: Part parent + :param root_part: Current robot body root + :return: + """ + return random.randint(0, new_part.arity - 1) + + def choose_max_parts(self): + """ + Overridable method to pick the part limit for + the robot to be generated. + :return: + """ + return random.randint(self.min_parts, self.max_parts) + + +class FixedOrientationBodyGenerator(BodyGenerator): + """ + Convenience body generator that supports only a limited number of + orientations. By default, increments of 90 degrees are used. This + type of custom generator is trivial to create, this class serves + also as a simple example on how to to such a thing. + """ + ORIENTATIONS = [0, 90, 180, 270] + + def choose_orientation( + self, + new_part, + parent_part, + root_part, + root=False + ): + """ + :param parent_part: + :param root_part: + :param new_part: + :param root: + :return: + """ + return random.choice(self.ORIENTATIONS) diff --git a/pyrevolve/revolve_bot/brain_nn.py b/pyrevolve/revolve_bot/brain_nn.py new file mode 100644 index 0000000000..7162914d5d --- /dev/null +++ b/pyrevolve/revolve_bot/brain_nn.py @@ -0,0 +1,116 @@ +""" +Class containing the brain parts to compose a robot +""" +from collections import OrderedDict + +class BrainNN(): + """ + Base class allowing for constructing neural network controller components in an overviewable manner + """ + + def __init__(self): + + self.nodes = {} + self.connections = [] + self.params = {} + + def FromYaml(self, yaml_object): + """ + From a yaml object, creates a data struture of interconnected body modules. + Standard names for modules are: + """ + if 'neurons' not in yaml_object: + raise KeyError('Network must have neurons.') + + if 'params' not in yaml_object: + raise KeyError('Network must have params.') + + for k_node in yaml_object['neurons']: + node = Node() + node.generate_node(yaml_object['neurons'][k_node]) + self.nodes[k_node] = node + + if 'connections' in yaml_object: + for edge in yaml_object['connections']: + connection = Connection() + connection.generate_connection(edge) + self.connections.append(connection) + + for k_node in yaml_object['params']: + params = Params() + params.generate_params(yaml_object['params'][k_node]) + self.params[k_node] = node + + return [self.nodes, self.connections, self.params] + + + +class Node(): + + def __init__(self): + + self.id = None + self.layer = None + self.part_id = None + self.type = None + + def generate_node(self, yaml_object_node): + + self.id = yaml_object_node['id'] + self.layer = yaml_object_node['layer'] + self.part_id = yaml_object_node['part_id'] + self.type = yaml_object_node['type'] + + print('----') + print(self.id) + print(self.layer) + print(self.part_id) + print(self.type) + +class Connection(): + + def __init__(self): + self.dst = None + self.src = None + self.weight = None + + def generate_connection(self, yaml_object_connection): + + self.dst = yaml_object_connection['dst'] + self.src = yaml_object_connection['src'] + self.weight = yaml_object_connection['weight'] + + print('---------') + print(self.dst) + print(self.src) + print(self.weight) + + +class Params(): + + def __init__(self): + self.period = None + self.phase_offset = None + self.amplitude = None + self.bias = None + self.gain = None + + def generate_params(self, yaml_object_node): + + if 'period' in yaml_object_node: + self.period = yaml_object_node['period'] + if 'phase_offset' in yaml_object_node: + self.phase_offset = yaml_object_node['phase_offset'] + if 'amplitude' in yaml_object_node: + self.amplitude = yaml_object_node['amplitude'] + if 'bias' in yaml_object_node: + self.bias = yaml_object_node['bias'] + if 'gain' in yaml_object_node: + self.gain = yaml_object_node['gain'] + + print('----') + print(self.period) + print(self.phase_offset) + print(self.amplitude) + print(self.bias) + print(self.gain) \ No newline at end of file diff --git a/pyrevolve/revolve_bot/neural_net.py b/pyrevolve/revolve_bot/neural_net.py new file mode 100644 index 0000000000..6f4b86bf4e --- /dev/null +++ b/pyrevolve/revolve_bot/neural_net.py @@ -0,0 +1,188 @@ +""" +Random generator for the default neural network +""" +from __future__ import absolute_import +from __future__ import print_function + +import random +import itertools + +from pyrevolve.spec import NeuralNetwork +from pyrevolve.spec import NeuralNetImplementation +from pyrevolve.spec import BodyImplementation + +from pyrevolve.util import decide + + +# Helper function to extract the network interface from a body part and subtree +def _extract_io(body_spec, part): + spec = body_spec.get(part.type) + inputs = ["{}-in-{}".format(part.id, i) for i in range(spec.inputs)] + outputs = ["{}-out-{}".format(part.id, i) for i in range(spec.outputs)] + part_ids = {neuron_id: part.id for neuron_id in inputs + outputs} + + for child in part.child: + ci, co, cp = _extract_io(body_spec, child.part) + inputs += ci + outputs += co + part_ids.update(cp) + + return inputs, outputs, part_ids + + +class NeuralNetworkGenerator(object): + """ + Simple random neural network generator, generates + hidden neurons and connections with a certain probability + from a specified input / output interface. + """ + def __init__(self, spec, max_hidden=20, conn_prob=0.1): + """ + :param conn_prob: Probability of creating a connection (i.e. nonzero + weight) between two neurons. + :type conn_prob: float + :param spec: + :type spec: NeuralNetImplementation + :param max_hidden: + :return: + """ + self.conn_prob = conn_prob + self.spec = spec + + types = spec.get_all_types() + self.layer_types = { + layer: [t for t in types if layer in spec.get(t).layers] + for layer in ("input", "output", "hidden") + } + + self.max_hidden = max_hidden + + def generate(self, inputs, outputs, part_ids=None, num_hidden=None,): + """ + Generates a neural network from the provided interface. + + Note that hidden neurons will get a randomly assigned part ID from + the specified `part_ids` map, provided it isn't empty. + + :param inputs: A list of IDs of all input neurons that should + be generated. + :type inputs: list + :param outputs: List of output IDs to be generated + :type outputs: list + :param part_ids: Maps neuron ID to corresponding part ID. This is + required to set the `partId` field on a neuron. + :type part_ids: dict + :param num_hidden: If specified, this number of hidden neurons will + be generated for the brain. + :return: The generated NeuralNetwork protobuf + :rtype: NeuralNetwork + """ + net = NeuralNetwork() + hidden = [] + + if part_ids is None: + part_ids = {} + + # Create a list of unique part IDs to choose hidden neuron + # part IDs from. + part_list = list(set(part_ids.values())) + + # Initialize network interface, i.e. inputs and outputs + for layer, ids in (("input", inputs), ("output", outputs)): + for neuron_id in ids: + neuron = net.neuron.add() + neuron.id = neuron_id + neuron.layer = layer + + if neuron_id in part_ids: + neuron.partId = part_ids[neuron_id] + + neuron.type = self.choose_neuron_type(layer) + spec = self.spec.get(neuron.type) + self.initialize_neuron(spec, neuron) + + num_hidden = self.choose_num_hidden() if num_hidden is None \ + else num_hidden + for i in range(num_hidden): + neuron = net.neuron.add() + neuron.id = 'brian-gen-hidden-{}'.format(len(hidden)) + + # Assign a part ID to each hidden neuron, provided we + # have a map. + if part_list: + neuron.partId = random.choice(part_list) + + hidden.append(neuron.id) + neuron.layer = "hidden" + neuron.type = self.choose_neuron_type(neuron.layer) + spec = self.spec.get(neuron.type) + self.initialize_neuron(spec, neuron) + + # Initialize neuron connections + conn_start = inputs + hidden + outputs + conn_end = hidden + outputs + + for src, dst in itertools.product(conn_start, conn_end): + if not decide(self.conn_prob): + continue + + weight = self.choose_weight() + + conn = net.connection.add() + conn.src = src + conn.dst = dst + conn.weight = weight + + return net + + def generate_from_body(self, body, body_spec): + """ + Convenience wrapper over `generate` to fetch the network + interface from a robot body. + :param body: + :type body: Body + :param body_spec: + :type body_spec: BodyImplementation + :return: NeuralNetwork + """ + inputs, outputs, part_ids = _extract_io(body_spec, body.root) + return self.generate(inputs, outputs, part_ids) + + @staticmethod + def choose_weight(): + """ + Overridable function to pick a neural connection weight. + By default, this returns a value between 0 and 1 + :return: + :rtype: float + """ + return random.random() + + @staticmethod + def initialize_neuron(spec, neuron): + """ + Initializes a neuron's parameters + :param spec: + :type spec: NeuronSpec + :param neuron: + :type neuron: Neuron + :return: + """ + # Initialize random parameters + spec.set_parameters(neuron.param, spec.get_random_parameters()) + + def choose_neuron_type(self, layer): + """ + Overridable method to pick the neuron type of a new neuron. + :param layer: + :return: + """ + return random.choice(self.layer_types[layer]) + + def choose_num_hidden(self): + """ + Overridable method to pick the number of hidden + neurons. + :return: + """ + return random.randint(0, self.max_hidden) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 7cc444c162..2ebf85b42c 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -4,10 +4,14 @@ import yaml from collections import OrderedDict +from pyrevolve.sdfbuilder import SDF +from pyrevolve.sdfbuilder import Model + from .revolve_module import CoreModule from .revolve_module import ActiveHingeModule from .revolve_module import BrickModule from .revolve_module import BrickSensorModule +from .brain_nn import BrainNN class RevolveBot(): """ @@ -65,6 +69,9 @@ def load_yaml(self, text): yaml_bot = yaml.safe_load(text) self._id = yaml_bot['id'] self._body = CoreModule.FromYaml(yaml_bot['body']) + # KKK: should we trycatch lack of body/brain? + brain = BrainNN() + self._brain = brain.FromYaml(yaml_bot['brain']) def load_file(self, path, conf_type='yaml'): """ @@ -84,7 +91,16 @@ def to_sdf(self): :return: """ - return '' + sdf = SDF() + + model = Model(name=self._id) + # TODO: Traverse through body elements, retrieve s and + # create s between them + elements = None + model.add_elements(elements) + + sdf.add_element(model) + return sdf def to_yaml(self): """ diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 9f37c3728d..2f99b7525a 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -1,9 +1,15 @@ """ Class containing the body parts to compose a Robogen robot """ - from collections import OrderedDict +from pyrevolve.sdfbuilder import Link +from pyrevolve.sdfbuilder.structure import Box +from pyrevolve.sdfbuilder.structure import Collision +from pyrevolve.sdfbuilder.structure import Visual +from pyrevolve.sdfbuilder.structure import Mesh + +# KKK:????KEEP IT??? class Module(): class RevolveModule(): """ Base class allowing for constructing Robogen components in an overviewable manner @@ -23,9 +29,18 @@ def color(self): return self.rgb if self.rgb is not None else self.DEFAULT_COLOR @staticmethod + # KKK: has self been forgotten here ? def FromYaml(yaml_object): + """ + From a yaml object, creates a data struture of interconnected body modules. + Standard names for modules are: + CoreComponent + ActiveHinge + FixedBrick + FixedBrickSensor + """ mod_type = yaml_object['type'] - if mod_type == 'CoreComponent' or mod_type == 'Core': + if mod_type == 'CoreComponent': module = CoreModule() elif mod_type == 'ActiveHinge': module = ActiveHingeModule() @@ -100,14 +115,13 @@ def validate(self): Tests if the robot tree is valid (recursively) :return: True if the robot tree is valid """ - raise NotImplementedError("robot tree validation not yet implemented") + raise NotImplementedError("Robot tree validation not yet implemented") def to_sdf(self): """ :return: """ - return '' @@ -120,6 +134,33 @@ class CoreModule(RevolveModule): def __init__(self): super().__init__() + def to_sdf(self): + """ + Converts the CoreComponent to SDF format + :return: + """ + # TODO: Scale needs to be checked + scale = 0.5 + mesh = Mesh( + uri="model://rg_robot/meshes/CoreComponent.dae", + scale=scale + ) + + visual = Visual(name="visual_{}".format(self.id), geometry=mesh) + collision = Collision( + name="collision_{}".format(self.id), + geometry=Box(1.0, 1.0, 1.0, mass=0.3) + ) + + link = Link( + name="link_{}".format(self.id), + self_collide=True, + elements=[visual, collision] + ) + link.make_color(r=self.rgb[0], g=self.rgb[1], b=self.rgb[2], a=1.0) + + return link + class ActiveHingeModule(RevolveModule): """ diff --git a/src/pygazebo b/src/pygazebo new file mode 160000 index 0000000000..658698dda8 --- /dev/null +++ b/src/pygazebo @@ -0,0 +1 @@ +Subproject commit 658698dda8ce5f0debb99453783e921ee6f44f80 diff --git a/test.py b/test.py new file mode 100755 index 0000000000..85507b9ac6 --- /dev/null +++ b/test.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + +import pyrevolve.revolve_bot + +if __name__ == "__main__": + robot = pyrevolve.revolve_bot.RevolveBot() + # robot.load_file("/home/karinemiras/projects/revolve/models/robot_26.yaml") + robot.load_file("/home/karinemiras/projects/revolve/experiments/examples/yaml/robot_5.yaml") + + #robot.save_file("/tmp/test.yaml") \ No newline at end of file diff --git a/test_py/generate/test_revolvebot.py b/test_py/generate/test_revolvebot.py new file mode 100644 index 0000000000..dc730681f7 --- /dev/null +++ b/test_py/generate/test_revolvebot.py @@ -0,0 +1,33 @@ +from __future__ import absolute_import + +import unittest + +from pyrevolve.revolve_bot import RevolveBot + +class TestRevolveBot(unittest.TestCase): + """ + Basic tests for RobolveBot body and brain generation + """ + + def test_load_save_yaml(self): + """ + We load a YAML file and save it + """ + + revolve_bot = RevolveBot() + revolve_bot.load_file( + path='experiments/examples/yaml/simple_robot.yaml', + conf_type='yaml' + ) + revolve_bot.save_file( + path='/tmp/revolve_bot.yaml', + conf_type='yaml' + ) + + revolve_bot2 = RevolveBot() + revolve_bot2.load_file( + path='/tmp/revolve_bot.yaml', + conf_type='yaml' + ) + + self.assertEqual(revolve_bot, revolve_bot2) From 83510eaacc0e5bb71a49cfe9e530da2338257140 Mon Sep 17 00:00:00 2001 From: Karine Date: Fri, 22 Feb 2019 13:55:24 +0100 Subject: [PATCH 07/49] write brain to yaml --- pyrevolve/revolve_bot/brain_nn.py | 78 +++++++++++++++++++--------- pyrevolve/revolve_bot/revolve_bot.py | 19 +++---- test.py | 2 +- 3 files changed, 65 insertions(+), 34 deletions(-) diff --git a/pyrevolve/revolve_bot/brain_nn.py b/pyrevolve/revolve_bot/brain_nn.py index 7162914d5d..3f88a01b1b 100644 --- a/pyrevolve/revolve_bot/brain_nn.py +++ b/pyrevolve/revolve_bot/brain_nn.py @@ -20,7 +20,7 @@ def FromYaml(self, yaml_object): Standard names for modules are: """ if 'neurons' not in yaml_object: - raise KeyError('Network must have neurons.') + raise KeyError('Network must have nodes.') if 'params' not in yaml_object: raise KeyError('Network must have params.') @@ -39,10 +39,58 @@ def FromYaml(self, yaml_object): for k_node in yaml_object['params']: params = Params() params.generate_params(yaml_object['params'][k_node]) - self.params[k_node] = node - - return [self.nodes, self.connections, self.params] - + self.params[k_node] = params + + + + def to_yaml(self): + + yaml_dict_brain = OrderedDict() + + yaml_dict_neurons = OrderedDict() + for node in self.nodes: + yaml_dict_neurons[node] = { + 'id': self.nodes[node].id, + 'layer': self.nodes[node].layer, + 'part_id': self.nodes[node].part_id, + 'type': self.nodes[node].type + } + yaml_dict_brain['neurons'] = yaml_dict_neurons + + + yaml_dict_connections = [] + if self.connections: + for edge in self.connections: + yaml_dict_connections.append({ + 'dst': edge.dst, + 'src': edge.src, + 'weight': edge.weight, + }) + + yaml_dict_brain['connections'] = yaml_dict_connections + + yaml_dict_params = OrderedDict() + for node in self.params: + yaml_dict_params[node] = {} + + if self.params[node].bias != None: + yaml_dict_params[node]['bias'] = self.params[node].bias + + if self.params[node].gain != None: + yaml_dict_params[node]['gain'] = self.params[node].gain + + if self.params[node].period != None: + yaml_dict_params[node]['period'] = self.params[node].period + + if self.params[node].phase_offset != None: + yaml_dict_params[node]['phase_offset'] = self.params[node].phase_offset + + if self.params[node].amplitude != None: + yaml_dict_params[node]['amplitude'] = self.params[node].amplitude + + yaml_dict_brain['params'] = yaml_dict_params + + return yaml_dict_brain class Node(): @@ -61,12 +109,6 @@ def generate_node(self, yaml_object_node): self.part_id = yaml_object_node['part_id'] self.type = yaml_object_node['type'] - print('----') - print(self.id) - print(self.layer) - print(self.part_id) - print(self.type) - class Connection(): def __init__(self): @@ -80,11 +122,6 @@ def generate_connection(self, yaml_object_connection): self.src = yaml_object_connection['src'] self.weight = yaml_object_connection['weight'] - print('---------') - print(self.dst) - print(self.src) - print(self.weight) - class Params(): @@ -106,11 +143,4 @@ def generate_params(self, yaml_object_node): if 'bias' in yaml_object_node: self.bias = yaml_object_node['bias'] if 'gain' in yaml_object_node: - self.gain = yaml_object_node['gain'] - - print('----') - print(self.period) - print(self.phase_offset) - print(self.amplitude) - print(self.bias) - print(self.gain) \ No newline at end of file + self.gain = yaml_object_node['gain'] \ No newline at end of file diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 2ebf85b42c..45f6621b31 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -49,7 +49,7 @@ def measure_brain(self): """ pass - def load(self, text, conf_type='yaml'): + def load(self, text, conf_type, brain_type): """ Load robot's description from a string and parse it to Python structure :param text: Robot's description string @@ -57,11 +57,11 @@ def load(self, text, conf_type='yaml'): :return: """ if 'yaml' == conf_type: - self.load_yaml(text) + self.load_yaml(text, brain_type) elif 'sdf' == conf_type: raise NotImplementedError("Loading from SDF not yet implemented") - def load_yaml(self, text): + def load_yaml(self, text, brain_type): """ Load robot's description from a yaml string :param text: Robot's yaml description @@ -70,10 +70,11 @@ def load_yaml(self, text): self._id = yaml_bot['id'] self._body = CoreModule.FromYaml(yaml_bot['body']) # KKK: should we trycatch lack of body/brain? - brain = BrainNN() - self._brain = brain.FromYaml(yaml_bot['brain']) + if brain_type == 'nn': + self._brain = BrainNN() + self._brain.FromYaml(yaml_bot['brain']) - def load_file(self, path, conf_type='yaml'): + def load_file(self, path, conf_type='yaml', brain_type='nn'): """ Read robot's description from a file and parse it to Python structure :param path: Robot's description file path @@ -83,7 +84,7 @@ def load_file(self, path, conf_type='yaml'): with open(path, 'r') as robot_file: robot = robot_file.read() - self.load(robot, conf_type) + self.load(robot, conf_type, brain_type) def to_sdf(self): """ @@ -104,14 +105,14 @@ def to_sdf(self): def to_yaml(self): """ - Converts sdf to yaml + Converts robot data structure to yaml :return: """ yaml_dict = OrderedDict() yaml_dict['id'] = self._id yaml_dict['body'] = self._body.to_yaml() - yaml_dict['brain'] = {} # TODO dump also brain + yaml_dict['brain'] = self._brain.to_yaml() return yaml.dump(yaml_dict) diff --git a/test.py b/test.py index 85507b9ac6..ec520a7bd6 100755 --- a/test.py +++ b/test.py @@ -7,4 +7,4 @@ # robot.load_file("/home/karinemiras/projects/revolve/models/robot_26.yaml") robot.load_file("/home/karinemiras/projects/revolve/experiments/examples/yaml/robot_5.yaml") - #robot.save_file("/tmp/test.yaml") \ No newline at end of file + robot.save_file("/tmp/test.yaml") \ No newline at end of file From be6d7bccf08b2c091b4ce8374e7d190071c847d7 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 4 Mar 2019 13:34:26 +0100 Subject: [PATCH 08/49] Improved yaml parser --- pyrevolve/revolve_bot/brain_nn.py | 40 +++++++++++-------------- pyrevolve/revolve_bot/revolve_bot.py | 37 +++++++++++++++-------- pyrevolve/revolve_bot/revolve_module.py | 35 ++++++++++------------ src/pygazebo | 1 - 4 files changed, 58 insertions(+), 55 deletions(-) delete mode 160000 src/pygazebo diff --git a/pyrevolve/revolve_bot/brain_nn.py b/pyrevolve/revolve_bot/brain_nn.py index 3f88a01b1b..0b0699d8d8 100644 --- a/pyrevolve/revolve_bot/brain_nn.py +++ b/pyrevolve/revolve_bot/brain_nn.py @@ -3,22 +3,25 @@ """ from collections import OrderedDict -class BrainNN(): + +class BrainNN: """ Base class allowing for constructing neural network controller components in an overviewable manner """ def __init__(self): - self.nodes = {} self.connections = [] self.params = {} - def FromYaml(self, yaml_object): + @staticmethod + def FromYaml(yaml_object): """ From a yaml object, creates a data struture of interconnected body modules. Standard names for modules are: """ + brain = BrainNN() + if 'neurons' not in yaml_object: raise KeyError('Network must have nodes.') @@ -28,23 +31,20 @@ def FromYaml(self, yaml_object): for k_node in yaml_object['neurons']: node = Node() node.generate_node(yaml_object['neurons'][k_node]) - self.nodes[k_node] = node + brain.nodes[k_node] = node if 'connections' in yaml_object: for edge in yaml_object['connections']: connection = Connection() connection.generate_connection(edge) - self.connections.append(connection) + brain.connections.append(connection) for k_node in yaml_object['params']: params = Params() params.generate_params(yaml_object['params'][k_node]) - self.params[k_node] = params - - + brain.params[k_node] = params def to_yaml(self): - yaml_dict_brain = OrderedDict() yaml_dict_neurons = OrderedDict() @@ -57,7 +57,6 @@ def to_yaml(self): } yaml_dict_brain['neurons'] = yaml_dict_neurons - yaml_dict_connections = [] if self.connections: for edge in self.connections: @@ -73,19 +72,19 @@ def to_yaml(self): for node in self.params: yaml_dict_params[node] = {} - if self.params[node].bias != None: + if self.params[node].bias is not None: yaml_dict_params[node]['bias'] = self.params[node].bias - if self.params[node].gain != None: + if self.params[node].gain is not None: yaml_dict_params[node]['gain'] = self.params[node].gain - if self.params[node].period != None: + if self.params[node].period is not None: yaml_dict_params[node]['period'] = self.params[node].period - if self.params[node].phase_offset != None: + if self.params[node].phase_offset is not None: yaml_dict_params[node]['phase_offset'] = self.params[node].phase_offset - if self.params[node].amplitude != None: + if self.params[node].amplitude is not None: yaml_dict_params[node]['amplitude'] = self.params[node].amplitude yaml_dict_brain['params'] = yaml_dict_params @@ -93,10 +92,8 @@ def to_yaml(self): return yaml_dict_brain -class Node(): - +class Node: def __init__(self): - self.id = None self.layer = None self.part_id = None @@ -109,8 +106,8 @@ def generate_node(self, yaml_object_node): self.part_id = yaml_object_node['part_id'] self.type = yaml_object_node['type'] -class Connection(): +class Connection: def __init__(self): self.dst = None self.src = None @@ -123,8 +120,7 @@ def generate_connection(self, yaml_object_connection): self.weight = yaml_object_connection['weight'] -class Params(): - +class Params: def __init__(self): self.period = None self.phase_offset = None @@ -143,4 +139,4 @@ def generate_params(self, yaml_object_node): if 'bias' in yaml_object_node: self.bias = yaml_object_node['bias'] if 'gain' in yaml_object_node: - self.gain = yaml_object_node['gain'] \ No newline at end of file + self.gain = yaml_object_node['gain'] diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 45f6621b31..05163854b7 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -27,6 +27,7 @@ def __init__(self, id=None): self._parents = None self._fitness = None self._behavioural_measurement = None + self._battery_level = None def measure_behaviour(self): """ @@ -49,42 +50,51 @@ def measure_brain(self): """ pass - def load(self, text, conf_type, brain_type): + def load(self, text, conf_type): """ Load robot's description from a string and parse it to Python structure :param text: Robot's description string - :param type: Type of a robot's description format + :param conf_type: Type of a robot's description format :return: """ if 'yaml' == conf_type: - self.load_yaml(text, brain_type) + self.load_yaml(text) elif 'sdf' == conf_type: raise NotImplementedError("Loading from SDF not yet implemented") - def load_yaml(self, text, brain_type): + def load_yaml(self, text): """ Load robot's description from a yaml string :param text: Robot's yaml description """ yaml_bot = yaml.safe_load(text) - self._id = yaml_bot['id'] + self._id = yaml_bot['id'] if 'id' in yaml_bot else None self._body = CoreModule.FromYaml(yaml_bot['body']) - # KKK: should we trycatch lack of body/brain? - if brain_type == 'nn': - self._brain = BrainNN() - self._brain.FromYaml(yaml_bot['brain']) - def load_file(self, path, conf_type='yaml', brain_type='nn'): + if 'brain' in yaml_bot: + yaml_brain = yaml_bot['brain'] + if 'type' not in yaml_brain: + raise IOError("brain type not defined, please fix it") + brain_type = yaml_brain['type'] + + if brain_type == 'neural-network': + self._brain = BrainNN() + self._brain.FromYaml(yaml_brain) + + else: + self._brain = None + + def load_file(self, path, conf_type='yaml'): """ Read robot's description from a file and parse it to Python structure :param path: Robot's description file path - :param type: Type of a robot's description format + :param conf_type: Type of a robot's description format :return: """ with open(path, 'r') as robot_file: robot = robot_file.read() - self.load(robot, conf_type, brain_type) + self.load(robot, conf_type) def to_sdf(self): """ @@ -112,7 +122,8 @@ def to_yaml(self): yaml_dict = OrderedDict() yaml_dict['id'] = self._id yaml_dict['body'] = self._body.to_yaml() - yaml_dict['brain'] = self._brain.to_yaml() + if self._brain is not None: + yaml_dict['brain'] = self._brain.to_yaml() return yaml.dump(yaml_dict) diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 2f99b7525a..3d15ae39a1 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -9,17 +9,16 @@ from pyrevolve.sdfbuilder.structure import Visual from pyrevolve.sdfbuilder.structure import Mesh -# KKK:????KEEP IT??? class Module(): -class RevolveModule(): + +class RevolveModule: """ Base class allowing for constructing Robogen components in an overviewable manner """ DEFAULT_COLOR = (0.5, 0.5, 0.5) - TYPE = 'NONE' + TYPE = None def __init__(self): self.id = None - self.slot = None self.orientation = None self.rgb = None #RevolveModule.DEFAULT_COLOR self.substrate_coordinates = None @@ -29,7 +28,6 @@ def color(self): return self.rgb if self.rgb is not None else self.DEFAULT_COLOR @staticmethod - # KKK: has self been forgotten here ? def FromYaml(yaml_object): """ From a yaml object, creates a data struture of interconnected body modules. @@ -40,7 +38,7 @@ def FromYaml(yaml_object): FixedBrickSensor """ mod_type = yaml_object['type'] - if mod_type == 'CoreComponent': + if mod_type == 'CoreComponent' or mod_type == 'Core': module = CoreModule() elif mod_type == 'ActiveHinge': module = ActiveHingeModule() @@ -49,15 +47,10 @@ def FromYaml(yaml_object): elif mod_type == 'FixedBrickSensor': module = BrickSensorModule() else: - raise NotImplementedError('"{} module not yet implemented'.format(mod_type)) + raise NotImplementedError('"{}" module not yet implemented'.format(mod_type)) module.id = yaml_object['id'] - try: - module.slot = yaml_object['slot'] - except KeyError: - module.slot = 0 - try: module.orientation = yaml_object['orientation'] except KeyError: @@ -80,10 +73,13 @@ def FromYaml(yaml_object): return module def to_yaml(self): + if self.TYPE is None: + raise RuntimeError('Module TYPE is not implemented for "{}",' + ' this should be defined.'.format(self.__class__)) + yaml_dict_object = OrderedDict() yaml_dict_object['id'] = self.id yaml_dict_object['type'] = self.TYPE - yaml_dict_object['slot'] = self.slot yaml_dict_object['orientation'] = self.orientation if self.rgb is not None: @@ -93,13 +89,13 @@ def to_yaml(self): 'blue': self.rgb[2], } - children = self.generate_yaml_children() + children = self._generate_yaml_children() if children is not None: yaml_dict_object['children'] = children return yaml_dict_object - def generate_yaml_children(self): + def _generate_yaml_children(self): has_children = False children = {} @@ -115,14 +111,14 @@ def validate(self): Tests if the robot tree is valid (recursively) :return: True if the robot tree is valid """ - raise NotImplementedError("Robot tree validation not yet implemented") + raise RuntimeError("Robot tree validation not yet implemented") def to_sdf(self): """ :return: """ - return '' + raise NotImplementedError("Module.to_sdf() not implemented") class CoreModule(RevolveModule): @@ -157,7 +153,8 @@ def to_sdf(self): self_collide=True, elements=[visual, collision] ) - link.make_color(r=self.rgb[0], g=self.rgb[1], b=self.rgb[2], a=1.0) + rgb = self.color() + link.make_color(r=rgb[0], g=rgb[1], b=rgb[2], a=1.0) return link @@ -172,7 +169,7 @@ def __init__(self): super().__init__() self.children = {1: None} - def generate_yaml_children(self): + def _generate_yaml_children(self): child = self.children[1] if child is None: return None diff --git a/src/pygazebo b/src/pygazebo deleted file mode 160000 index 658698dda8..0000000000 --- a/src/pygazebo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 658698dda8ce5f0debb99453783e921ee6f44f80 From c7d2febe6372712634e21b9747300be54f75081e Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 4 Mar 2019 14:00:01 +0100 Subject: [PATCH 09/49] Added Touch sensor --- pyrevolve/revolve_bot/revolve_module.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 3d15ae39a1..7ee63f2482 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -46,6 +46,8 @@ def FromYaml(yaml_object): module = BrickModule() elif mod_type == 'FixedBrickSensor': module = BrickSensorModule() + elif mod_type == 'TouchSensor': + module = TouchSensorModule() else: raise NotImplementedError('"{}" module not yet implemented'.format(mod_type)) @@ -195,3 +197,14 @@ class BrickSensorModule(RevolveModule): def __init__(self): super().__init__() + + +class TouchSensorModule(RevolveModule): + """ + Inherits class RevolveModule. Creates Robogen sensor module + """ + TYPE = "TouchSensor" + + def __init__(self): + super().__init__() + From 96155e8c18a2fda1801fe794de0c86812c2fd4fd Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 4 Mar 2019 14:02:45 +0100 Subject: [PATCH 10/49] if no brain type, assume neural network brain --- pyrevolve/revolve_bot/revolve_bot.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 05163854b7..d043711d94 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -74,8 +74,10 @@ def load_yaml(self, text): if 'brain' in yaml_bot: yaml_brain = yaml_bot['brain'] if 'type' not in yaml_brain: - raise IOError("brain type not defined, please fix it") - brain_type = yaml_brain['type'] + # raise IOError("brain type not defined, please fix it") + brain_type = 'neural-network' + else: + brain_type = yaml_brain['type'] if brain_type == 'neural-network': self._brain = BrainNN() From bd1d0e7d5acfdc8841ab505a3dad52bdabc123b4 Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Thu, 7 Mar 2019 13:07:19 +0100 Subject: [PATCH 11/49] Working -v rendering robots in 2d --- canvas.py | 265 +++++++++++++++++++++++ img/body_0.png | Bin 0 -> 2894 bytes img/body_1.png | Bin 0 -> 2858 bytes img/body_10.png | Bin 0 -> 10353 bytes img/body_11.png | Bin 0 -> 2700 bytes img/body_12.png | Bin 0 -> 2545 bytes img/body_13.png | Bin 0 -> 1868 bytes img/body_14.png | Bin 0 -> 3743 bytes img/body_15.png | Bin 0 -> 4761 bytes img/body_16.png | Bin 0 -> 3333 bytes img/body_17.png | Bin 0 -> 2871 bytes img/body_18.png | Bin 0 -> 4885 bytes img/body_19.png | Bin 0 -> 3881 bytes img/body_2.png | Bin 0 -> 9103 bytes img/body_20.png | Bin 0 -> 4350 bytes img/body_21.png | Bin 0 -> 1555 bytes img/body_22.png | Bin 0 -> 2171 bytes img/body_23.png | Bin 0 -> 4980 bytes img/body_24.png | Bin 0 -> 2858 bytes img/body_25.png | Bin 0 -> 3426 bytes img/body_26.png | Bin 0 -> 4399 bytes img/body_27.png | Bin 0 -> 2644 bytes img/body_28.png | Bin 0 -> 1425 bytes img/body_29.png | Bin 0 -> 1659 bytes img/body_3.png | Bin 0 -> 2488 bytes img/body_30.png | Bin 0 -> 6134 bytes img/body_31.png | Bin 0 -> 1267 bytes img/body_32.png | Bin 0 -> 960 bytes img/body_33.png | Bin 0 -> 5284 bytes img/body_34.png | Bin 0 -> 2309 bytes img/body_35.png | Bin 0 -> 5001 bytes img/body_36.png | Bin 0 -> 3099 bytes img/body_37.png | Bin 0 -> 5113 bytes img/body_38.png | Bin 0 -> 960 bytes img/body_39.png | Bin 0 -> 4440 bytes img/body_4.png | Bin 0 -> 1267 bytes img/body_40.png | Bin 0 -> 2678 bytes img/body_41.png | Bin 0 -> 6291 bytes img/body_43.png | Bin 0 -> 2784 bytes img/body_44.png | Bin 0 -> 1248 bytes img/body_45.png | Bin 0 -> 1729 bytes img/body_46.png | Bin 0 -> 4483 bytes img/body_47.png | Bin 0 -> 1468 bytes img/body_48.png | Bin 0 -> 4731 bytes img/body_5.png | Bin 0 -> 3123 bytes img/body_50.png | Bin 0 -> 4165 bytes img/body_51.png | Bin 0 -> 2965 bytes img/body_52.png | Bin 0 -> 2318 bytes img/body_53.png | Bin 0 -> 568 bytes img/body_54.png | Bin 0 -> 4676 bytes img/body_55.png | Bin 0 -> 3356 bytes img/body_56.png | Bin 0 -> 4690 bytes img/body_57.png | Bin 0 -> 3655 bytes img/body_58.png | Bin 0 -> 2010 bytes img/body_59.png | Bin 0 -> 1661 bytes img/body_6.png | Bin 0 -> 6096 bytes img/body_60.png | Bin 0 -> 4211 bytes img/body_61.png | Bin 0 -> 4866 bytes img/body_62.png | Bin 0 -> 2585 bytes img/body_63.png | Bin 0 -> 7311 bytes img/body_64.png | Bin 0 -> 9359 bytes img/body_65.png | Bin 0 -> 2700 bytes img/body_66.png | Bin 0 -> 7781 bytes img/body_67.png | Bin 0 -> 1990 bytes img/body_68.png | Bin 0 -> 457 bytes img/body_69.png | Bin 0 -> 2083 bytes img/body_7.png | Bin 0 -> 1894 bytes img/body_70.png | Bin 0 -> 6374 bytes img/body_71.png | Bin 0 -> 4053 bytes img/body_72.png | Bin 0 -> 2764 bytes img/body_73.png | Bin 0 -> 1095 bytes img/body_74.png | Bin 0 -> 1366 bytes img/body_75.png | Bin 0 -> 4395 bytes img/body_76.png | Bin 0 -> 1603 bytes img/body_77.png | Bin 0 -> 4269 bytes img/body_78.png | Bin 0 -> 5988 bytes img/body_79.png | Bin 0 -> 3768 bytes img/body_8.png | Bin 0 -> 2442 bytes img/body_80.png | Bin 0 -> 5160 bytes img/body_81.png | Bin 0 -> 1675 bytes img/body_82.png | Bin 0 -> 7028 bytes img/body_83.png | Bin 0 -> 5968 bytes img/body_84.png | Bin 0 -> 8037 bytes img/body_85.png | Bin 0 -> 1366 bytes img/body_86.png | Bin 0 -> 3139 bytes img/body_87.png | Bin 0 -> 1903 bytes img/body_88.png | Bin 0 -> 3324 bytes img/body_89.png | Bin 0 -> 5963 bytes img/body_9.png | Bin 0 -> 2103 bytes img/body_90.png | Bin 0 -> 3141 bytes img/body_91.png | Bin 0 -> 1175 bytes img/body_92.png | Bin 0 -> 5470 bytes img/body_93.png | Bin 0 -> 2073 bytes img/body_94.png | Bin 0 -> 2470 bytes img/body_95.png | Bin 0 -> 6623 bytes img/body_96.png | Bin 0 -> 3930 bytes img/body_97.png | Bin 0 -> 4316 bytes img/body_98.png | Bin 0 -> 7481 bytes img/body_99.png | Bin 0 -> 1855 bytes pyrevolve/revolve_bot/render/__init__.py | 0 pyrevolve/revolve_bot/render/canvas.py | 265 +++++++++++++++++++++++ pyrevolve/revolve_bot/render/grid.py | 149 +++++++++++++ pyrevolve/revolve_bot/render/render.py | 120 ++++++++++ pyrevolve/revolve_bot/revolve_bot.py | 46 ++-- test.py | 18 +- 105 files changed, 842 insertions(+), 21 deletions(-) create mode 100644 canvas.py create mode 100644 img/body_0.png create mode 100644 img/body_1.png create mode 100644 img/body_10.png create mode 100644 img/body_11.png create mode 100644 img/body_12.png create mode 100644 img/body_13.png create mode 100644 img/body_14.png create mode 100644 img/body_15.png create mode 100644 img/body_16.png create mode 100644 img/body_17.png create mode 100644 img/body_18.png create mode 100644 img/body_19.png create mode 100644 img/body_2.png create mode 100644 img/body_20.png create mode 100644 img/body_21.png create mode 100644 img/body_22.png create mode 100644 img/body_23.png create mode 100644 img/body_24.png create mode 100644 img/body_25.png create mode 100644 img/body_26.png create mode 100644 img/body_27.png create mode 100644 img/body_28.png create mode 100644 img/body_29.png create mode 100644 img/body_3.png create mode 100644 img/body_30.png create mode 100644 img/body_31.png create mode 100644 img/body_32.png create mode 100644 img/body_33.png create mode 100644 img/body_34.png create mode 100644 img/body_35.png create mode 100644 img/body_36.png create mode 100644 img/body_37.png create mode 100644 img/body_38.png create mode 100644 img/body_39.png create mode 100644 img/body_4.png create mode 100644 img/body_40.png create mode 100644 img/body_41.png create mode 100644 img/body_43.png create mode 100644 img/body_44.png create mode 100644 img/body_45.png create mode 100644 img/body_46.png create mode 100644 img/body_47.png create mode 100644 img/body_48.png create mode 100644 img/body_5.png create mode 100644 img/body_50.png create mode 100644 img/body_51.png create mode 100644 img/body_52.png create mode 100644 img/body_53.png create mode 100644 img/body_54.png create mode 100644 img/body_55.png create mode 100644 img/body_56.png create mode 100644 img/body_57.png create mode 100644 img/body_58.png create mode 100644 img/body_59.png create mode 100644 img/body_6.png create mode 100644 img/body_60.png create mode 100644 img/body_61.png create mode 100644 img/body_62.png create mode 100644 img/body_63.png create mode 100644 img/body_64.png create mode 100644 img/body_65.png create mode 100644 img/body_66.png create mode 100644 img/body_67.png create mode 100644 img/body_68.png create mode 100644 img/body_69.png create mode 100644 img/body_7.png create mode 100644 img/body_70.png create mode 100644 img/body_71.png create mode 100644 img/body_72.png create mode 100644 img/body_73.png create mode 100644 img/body_74.png create mode 100644 img/body_75.png create mode 100644 img/body_76.png create mode 100644 img/body_77.png create mode 100644 img/body_78.png create mode 100644 img/body_79.png create mode 100644 img/body_8.png create mode 100644 img/body_80.png create mode 100644 img/body_81.png create mode 100644 img/body_82.png create mode 100644 img/body_83.png create mode 100644 img/body_84.png create mode 100644 img/body_85.png create mode 100644 img/body_86.png create mode 100644 img/body_87.png create mode 100644 img/body_88.png create mode 100644 img/body_89.png create mode 100644 img/body_9.png create mode 100644 img/body_90.png create mode 100644 img/body_91.png create mode 100644 img/body_92.png create mode 100644 img/body_93.png create mode 100644 img/body_94.png create mode 100644 img/body_95.png create mode 100644 img/body_96.png create mode 100644 img/body_97.png create mode 100644 img/body_98.png create mode 100644 img/body_99.png create mode 100644 pyrevolve/revolve_bot/render/__init__.py create mode 100644 pyrevolve/revolve_bot/render/canvas.py create mode 100644 pyrevolve/revolve_bot/render/grid.py create mode 100644 pyrevolve/revolve_bot/render/render.py diff --git a/canvas.py b/canvas.py new file mode 100644 index 0000000000..dedb320f3d --- /dev/null +++ b/canvas.py @@ -0,0 +1,265 @@ +import cairo +import math + +class Canvas: + # Current position of last drawn element + x_pos = 0 + y_pos = 0 + + # Orientation of robot + orientation = 1 + + # Direction of last movement + previous_move = -1 + + # Coordinates and orientation of movements + movement_stack = [] + + # Positions for the sensors + sensors = [] + + + def __init__(self, width, height, scale): + """Instantiate context and surface""" + self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width*scale, height*scale) + context = cairo.Context(self.surface) + context.scale(scale, scale) + self.context = context + self.width = width + self.height = height + self.scale = scale + + + def get_position(self): + """Return current position on x and y axis""" + return [Canvas.x_pos, Canvas.y_pos] + + def set_position(self, x, y): + """Set position of x and y axis""" + Canvas.x_pos = x + Canvas.y_pos = y + + def set_orientation(self, orientation): + """Set new orientation of robot""" + if orientation in [0, 1, 2, 3]: + Canvas.orientation = orientation + else: + return False + + def calculate_orientation(self): + """Calculate new orientation based on current orientation and last movement direction""" + if (Canvas.previous_move == -1 or + (Canvas.previous_move == 1 and Canvas.orientation == 1) or + (Canvas.previous_move == 2 and Canvas.orientation == 3) or + (Canvas.previous_move == 3 and Canvas.orientation == 2) or + (Canvas.previous_move == 0 and Canvas.orientation == 0)): + self.set_orientation(1) + elif ((Canvas.previous_move == 2 and Canvas.orientation == 1) or + (Canvas.previous_move == 0 and Canvas.orientation == 3) or + (Canvas.previous_move == 1 and Canvas.orientation == 2) or + (Canvas.previous_move == 3 and Canvas.orientation == 0)): + self.set_orientation(2) + elif ((Canvas.previous_move == 0 and Canvas.orientation == 1) or + (Canvas.previous_move == 3 and Canvas.orientation == 3) or + (Canvas.previous_move == 2 and Canvas.orientation == 2) or + (Canvas.previous_move == 1 and Canvas.orientation == 0)): + self.set_orientation(0) + elif ((Canvas.previous_move == 3 and Canvas.orientation == 1) or + (Canvas.previous_move == 1 and Canvas.orientation == 3) or + (Canvas.previous_move == 0 and Canvas.orientation == 2) or + (Canvas.previous_move == 2 and Canvas.orientation == 0)): + self.set_orientation(3) + + def move_by_slot(self, slot): + """Move in direction by slot id""" + if slot == 0: + self.move_down() + elif slot == 1: + self.move_up() + elif slot == 2: + self.move_right() + elif slot == 3: + self.move_left() + + def move_right(self): + """Set position one to the right in correct orientation""" + if Canvas.orientation == 1: + Canvas.x_pos += 1 + elif Canvas.orientation == 2: + Canvas.y_pos += 1 + elif Canvas.orientation == 0: + Canvas.x_pos -= 1 + elif Canvas.orientation == 3: + Canvas.y_pos -= 1 + Canvas.previous_move = 2 + + def move_left(self): + """Set position one to the left""" + if Canvas.orientation == 1: + Canvas.x_pos -= 1 + elif Canvas.orientation == 2: + Canvas.y_pos -= 1 + elif Canvas.orientation == 0: + Canvas.x_pos += 1 + elif Canvas.orientation == 3: + Canvas.y_pos += 1 + Canvas.previous_move = 3 + + def move_up(self): + """Set position one upwards""" + if Canvas.orientation == 1: + Canvas.y_pos -= 1 + elif Canvas.orientation == 2: + Canvas.x_pos += 1 + elif Canvas.orientation == 0: + Canvas.y_pos += 1 + elif Canvas.orientation == 3: + Canvas.x_pos -= 1 + Canvas.previous_move = 1 + + def move_down(self): + """Set position one downwards""" + if Canvas.orientation == 1: + Canvas.y_pos += 1 + elif Canvas.orientation == 2: + Canvas.x_pos -= 1 + elif Canvas.orientation == 0: + Canvas.y_pos -= 1 + elif Canvas.orientation == 3: + Canvas.x_pos += 1 + Canvas.previous_move = 0 + + def move_back(self): + """Move back to previous state on canvas""" + if len(Canvas.movement_stack) > 1: + Canvas.movement_stack.pop() + last_movement = Canvas.movement_stack[-1] + Canvas.x_pos = last_movement[0] + Canvas.y_pos = last_movement[1] + Canvas.orientation = last_movement[2] + + def draw_controller(self): + """Draw a controller (yellow) in the middle of the canvas""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) + self.context.set_source_rgb(255, 255, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def draw_hinge(self): + """Draw a hinge (blue) on the previous object""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) + self.context.set_source_rgb(1, 0, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + self.calculate_orientation() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def draw_module(self): + """Draw a module (red) on the previous object""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) + self.context.set_source_rgb(0, 0, 255) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + self.calculate_orientation() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def calculate_sensor_rectangle_position(self): + """Calculate squeezed sensor rectangle position based on current orientation and last movement direction""" + if (Canvas.previous_move == -1 or + (Canvas.previous_move == 1 and Canvas.orientation == 1) or + (Canvas.previous_move == 2 and Canvas.orientation == 3) or + (Canvas.previous_move == 3 and Canvas.orientation == 2) or + (Canvas.previous_move == 0 and Canvas.orientation == 0)): + return Canvas.x_pos, Canvas.y_pos + 0.9, 1, 0.1 + elif ((Canvas.previous_move == 2 and Canvas.orientation == 1) or + (Canvas.previous_move == 0 and Canvas.orientation == 3) or + (Canvas.previous_move == 1 and Canvas.orientation == 2) or + (Canvas.previous_move == 3 and Canvas.orientation == 0)): + return Canvas.x_pos, Canvas.y_pos, 0.1, 1 + elif ((Canvas.previous_move == 0 and Canvas.orientation == 1) or + (Canvas.previous_move == 3 and Canvas.orientation == 3) or + (Canvas.previous_move == 2 and Canvas.orientation == 2) or + (Canvas.previous_move == 1 and Canvas.orientation == 0)): + return Canvas.x_pos, Canvas.y_pos, 1, 0.1 + elif ((Canvas.previous_move == 3 and Canvas.orientation == 1) or + (Canvas.previous_move == 1 and Canvas.orientation == 3) or + (Canvas.previous_move == 0 and Canvas.orientation == 2) or + (Canvas.previous_move == 2 and Canvas.orientation == 0)): + return Canvas.x_pos + 0.9, Canvas.y_pos, 0.1, 1 + + def save_sensor_position(self): + """Save sensor position in list""" + x, y, x_scale, y_scale = self.calculate_sensor_rectangle_position() + Canvas.sensors.append([x, y, x_scale, y_scale]) + self.calculate_orientation() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def draw_sensors(self): + """Draw all sensors""" + for sensor in Canvas.sensors: + self.context.rectangle(sensor[0], sensor[1], sensor[2], sensor[3]) + self.context.set_source_rgb(0, 128, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + + def calculate_connector_to_parent_position(self): + """Calculate position of connector node on canvas""" + parent = Canvas.movement_stack[-2] + parent_orientation = parent[2] + + if ((Canvas.previous_move == 1 and parent_orientation == 1) or + (Canvas.previous_move == 3 and parent_orientation == 2) or + (Canvas.previous_move == 0 and parent_orientation == 0) or + (Canvas.previous_move == 2 and parent_orientation == 3)): + # Connector is on top of parent + return parent[0] + 0.5, parent[1] + elif ((Canvas.previous_move == 2 and parent_orientation == 1) or + (Canvas.previous_move == 1 and parent_orientation == 2) or + (Canvas.previous_move == 3 and parent_orientation == 0) or + (Canvas.previous_move == 0 and parent_orientation == 3)): + # Connector is on right side of parent + return parent[0] + 1, parent[1] + 0.5 + elif ((Canvas.previous_move == 3 and parent_orientation == 1) or + (Canvas.previous_move == 0 and parent_orientation == 2) or + (Canvas.previous_move == 2 and parent_orientation == 0) or + (Canvas.previous_move == 1 and parent_orientation == 3)): + # Connector is on left side of parent + return parent[0], parent[1] + 0.5 + elif ((Canvas.previous_move == 0 and parent_orientation == 1) or + (Canvas.previous_move == 2 and parent_orientation == 2) or + (Canvas.previous_move == 1 and parent_orientation == 0) or + (Canvas.previous_move == 3 and parent_orientation == 3)): + # Connector is on bottom of parent + return parent[0] + 0.5, parent[1] + 1 + + def draw_connector_to_parent(self): + """Draw a circle between child and parent""" + x, y = self.calculate_connector_to_parent_position() + self.context.arc(x, y, 0.1, 0, math.pi*2) + self.context.set_source_rgb(0, 0, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + + def save_png(self, file_name): + """Store image representation of canvas""" + self.surface.write_to_png(file_name) + + def reset_canvas(self): + """Reset canvas variables to default values""" + Canvas.x_pos = 0 + Canvas.y_pos = 0 + Canvas.orientation = 1 + Canvas.previous_move = -1 + Canvas.movement_stack = [] + Canvas.sensors = [] \ No newline at end of file diff --git a/img/body_0.png b/img/body_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e44b5ee30bafae25afe752a8601f53a6405b92a0 GIT binary patch literal 2894 zcmds(YgAKL7RS?oReS&rT{4Kg^b+hMf&~Ra0$62)D+)STpd};9D^sC>0Rtg~7)61i z1n(^`6Gf_~!TU)Q+HXeWPOsc_In^X`!KK`leUr@dgJC)0oudn!cQ^Ec5Pwnn@%Ez({JGsTx74`( z5qR!l%afaQH**hJ8Sd4^w;yv-Ud$<5Wy_G|Y?{DrftuX{5B`)3Wu|NY3ThrT!5^vQqO`2Z$u7tGIc z?5rCKP^qF%O<)p{EAjk{vFc0Qes8)R(g#-1dUZLs2NL}tKIjWD_aR+iw(Q)|y!Oj( z?QeG@I^f_j)e$HJqWY+`Q}s@b)8`>)Sm3J~qY@%W#FLg51SSFTGht*8P`l@TntTmd zm<>~jH5>HM!;mo?Jw3t}LrsQcJ(dWEnN&qD?T}_q)*MVVjo7Wv+pr0xE*VR+g>V!3 zk?StP7Q;?*LvwugKy*aCYJ)g-luLaa_r-Z)50v6KnoMlW+^G5j+Owx3F%YWsqVgid zP&7eNu<%DQ-AXCoO!Xe4yCaEvDoB6t602YLQYJ{f7tn-icI2Rc|06ZHS{TkMUd#qG zQBdpk2ZOyWJ}ODoH>>ZQ%v(&#b~P=AvsizVYLO-64)0WUZMgP|UJ6z0`ZAs5JTn!D zlNEP=ZZ1!1^m0hae~I}ZRq+!n4I-B7BqG6aI-_kdC>7QRz%w$Jo8<&1JME$im0;0n z3ug1Gwq8_fZPZNf+!D3_aSzl6s1~c&&xiyoFEN%@RuB_3{fOJPB6R5Oik`NK;NvA64 zhti-BfN6;YgQ?ysA1De;6`J)#ivMy#6$w2DTLfLj#H_1&s08Q+G@nZ3BL1XFQL@`@ z^sbH|Ypl+YOZ8TTLigR8W&qx%a}EXS)`T^K6@ zbYT0-kvMETi!RAYjGEk$$HpsUf>~$D*1(bu`aZ<@y`n;_Ne-jQiPoCrbw%0oF;G(4 z?o&Hm#x2NokibthkP(&rb^NmO357P?9bh*eA}l~O?h;#NSVJLdQ8@FWylcVy(pr?8 zVz6jpKDCaq^YC3>Ls~v2B20^@WJR$j2c(g6b&pQ|JV=|v&9Ho zxrrWw7J*U+&#F9hMj^r&bNZUGQAL~l;VQAeyV&A{s$*)|Nn-y^y=&v_D!}U~p?1{7 zaaW!yGPqZ2Px^_5eT_a0c7L18G^n!3hp5L@%Bg7ySZj?HVh>hWYuF4be}Hii!MJXtq1(aL z#2thj1DFD%rCZ6;mn^Szz7LTuU%`CgXNmGbUAMh{A7f7b)LH z-xxYtm>~&QaRptgqrLO-P@-2*x+FryZG!vA;y@g2)@SqBsvY_03;Z9j21`X))5Cg}k^YVXKFPl(#?l zG+d{R;5Bz^Xzf2f{0gI5T&do_Ql$?9^8b7(OTac&PZ@M VYmLAB-FkWo{>j&~;_%ta{{-p8p?&}W literal 0 HcmV?d00001 diff --git a/img/body_1.png b/img/body_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2590094c9ef3a6a3d40c26a1c3d286b52cfa09e4 GIT binary patch literal 2858 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 literal 0 HcmV?d00001 diff --git a/img/body_11.png b/img/body_11.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5d1901e6dc6228fa4ab4604209d1056abb6ddb GIT binary patch literal 2700 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 literal 0 HcmV?d00001 diff --git a/img/body_13.png b/img/body_13.png new file mode 100644 index 0000000000000000000000000000000000000000..e383cf06288ab91b67962d3ea6a427f08ff62362 GIT binary patch literal 1868 zcmd5->oXe&5D(K(I%r+1r$?&SnR4eQdR1ESh@PlZCm!`^5bi2RD~cddA&jb`&SR?6 z)FU2sk~WDTiiiu^YYB>0F4EAT;!%-!RU)L}Vmfo5?hokh{C4-l?)-LkW_R;_;T{J1 z$MgXJfPv@FFn<6*t3(rX_v>hE?~(Qyjnld6An}u0Ajh?!PI_eMBdS%y?{SgYjm3%gPKRhrDl8>|Lm_BZSNjf9C4YqSTdZDqv z|3giVRgQkYe}Q2RS+Ct|^nFJy_OV^}$62TLO2GlctOVuS+}3KE%Vy<*laH3Bg)c*1 zq0oz3)B7i!(=lhAaLScdVDvQ9ECLTW{~YHy<$fd)78XY>5xG;Q83dsA)Q$G>(3?7^ zRQ+NrAuZBt1kkf<3DoX6_&+FV_(a{dN|mlop$`oAbR$2c`>-*xJXYm5dd2tDk&iyQoFIs&p`rAaXkyiED)dur++_OG?ZweLUw&)R%KS;LU$Y?K+q44s zv&?a5s7mGKbAi7cN7#5{!*naU>nv~ud|ju(qb~^SJ#jJ_*!kt1&Ja$7n!yfo4l{2A zAri>miUy}5!QV!LHL*O;)dVAt;p}E0JNz?M6ZtXLjUmfv5BRpFdBd^tOK&UOsxAeVqm@Fjxz74c(3 z6Oy2yI_W_xwboohzB>FNtmDLN4F1yw;bgyp+zud7+aSg&HoHie9US|y&BFT*szq>tj4CGHGVMf$I4=JCRiV3 z5TzDNTP67ryx2w*k{P$^_|e~iglOP=kS*-T2i+c@e8Ck#?5XIYFx*pIg)I$ z(fGuaSUr)uqHei`EpIdM^wS_q7o{9pw1y zHuj>@CM1apy2b`d{&~ME3rNddk*Dz0A4!@mcygK79~(_kD9C7#OX@r5!mxLra^~gY z!}xd~(_hY+xs;eECbRM~_NDs~Le%W-B>6?GJrou;(7vwpt744N#+0m literal 0 HcmV?d00001 diff --git a/img/body_14.png b/img/body_14.png new file mode 100644 index 0000000000000000000000000000000000000000..62098978e3aef2eb48a1614edbd950504b4e375a GIT binary patch literal 3743 zcmeHKX;4#H7Jeey(6pf9K({u*!EL4&(3)Zkn;;5`4K9QLVH-CT43W?z5Fn(r5ouD+s3<|se5#uuu2$>g~DtqQ<|Cs3?)~i>q?mg$8 z_nmXkch0><`@%z3e7yE!0036(4h=p4087rBU#sQF3{B?IhJ2PE3JVDaOy=ijDf=P- z*hcOS4vfrVP7Xu}n8{^B!xdeD+ZKcyv%U}QuKCRV&(@5MHCG;| zu}MmdW6Q5Li!log>eBdvNiWe+U+4V#G)UsxOag_03$q|>i=dsEBp5Z3G zJ`nQ}9<@;1aQ#AKH_bsLEG?S);#%PKJWxPcVi(2Un;30=Wu3-1cL9{av+WtSBe zO+5XMT@|j3;0Q1>%|%}?5B)421|c@CUvc6nYVJjs{C+SgYdaxa9<+13m7y$a zrpCD2*?Y$%1PA=Flxyd}hqc8$XkOc4*)3*a5p#{(m5Os@NsjgNwVuR3%%}f^==&l1 z-WEg)>V8&?NVODnbL5kizZNV+FdVJ1VwU|IH4=c^6x3!S(Q?G{mT^4ANMZjyd!iIJ znf8ucvwCDL>Q~yudf|-h0u9RpiELB{f|5>S(wh5nZ#?~i%-Q1bU&c|Xx@rP9?iT;6 zIPINn@6CUIxA&hPwah}-muZ+Jv!!;#(q+V7M^1)Kk9eP-EQ!@6N5ag>{^?Q6>ht!* zItowi7dk~f4(|vfeJe4CVjJRGwgvHY`OSnAZ`XTcrLlgs#2suV0$Gj3kF;ZZcy9){ z4!n=2CP+$kA^N-;3aNPRUA%IYh~YHrN4CE4QfxdvW5xU|bO6TURTi1!V|A@y(~~@7 zT&*7h%|FeYKDlePs4O9+-cSf7aSmf3GTw3FlmeHe+bTL>3}Zx0 z&(;s5jduTKQKR8}(S%*ZUzhw3s9`rnSqiZ4`+$8Qp@eD@L#<#bsqU(J^-3B~950Q_ zlS!Vv++7iX%A2ftpZ-o0>GFfo0B*VlDhBnO!N~l|w8(rkI_>j;w}J2gbO9Rmc{ctJ z8t|3=B9sbhmCWq^)^?8wd|s_#+(BP^8IizIa68m9ltaJ_j#0hsSFNNSO~WP<97^gJ zGaG*q(b5r{i<{$R0;(v9HHm;aO6}Z|)2>cPs}&PdW!6@WtF?E;oRmxJK!F2aSdOfi zE{59f!Kg~A_>>fu=U%rp9aGf*%t-}dNJ~aalH_vs#KlxF01ln=xgg}2Fvh{18Y2cC z0fFZCOGrAEVS~;)2mbhYP^$ctadM~ z03988LM0qe0EP~FiDC;2b13tbwr**L>Jd?7VSwsPfFi^RtLaQ#57_vsBsC?<+&w+^ zHj2LGOO`|rReLxWiyl9O9^ZrO0=EMW+12i=yc4B&l2~~Am9(7+mGZBnM}y$`)0uVO zAYyNvv}f9d*g%m|jOTZ+PtD4oX);Kge%-=E`f~Alr=*(FMR?z9|LWFty@`RLY zhS_iuddqsC*m%tl3)g!jqx8g@_Jg=Y9#!%%kGB~~FDWLkM&drBLi&d!Umk2}nRLP2 zEFP-)jF8k^(UFk8P00GY{nO9W6_=Ip)5SwhTqk zd76G{48j#=B!}_-pQc|b1}`lld3`9=oc$-7(0z!*#dr6ya8>dGXm*+ABm)8ZuI%p| z$%QF!=Z{YKQe^7QUWT5q*M-QZ)KXGjoUIE*D3imdT&0NGKYJ);21v9FumnW_di%hS5yOVe$tUsJ=WaPB zqeQ2HPPJ3W@@|LZzsvI63rlJB2`wJc2NYSbEuu}B=bP3rs zYN%90psjQ{!Vz_eV)#l;3CD*F6>aI^EfS{$EU?k^)Mr)m<6?v=52S*-xHX72yNq@y z!rYwl7u!qLzvL{R1+=4Ux30r^aZ+B+QzZB#1j{P~ibO#nDpn}KBi*^6Jo`pM_ECom z8KV%0)!bxXCZv9el#lAsa;~SUvd~$@+~40it7FVH%pUWbn|P}i{y+mxHg!cPaB1s hp(Nyl^DSDx;uWy7x+ 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 F|2q+AQfUAH literal 0 HcmV?d00001 diff --git a/img/body_16.png b/img/body_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b77daa9c08e2eaf7f903675a4d59779067a6d6 GIT binary patch literal 3333 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 literal 0 HcmV?d00001 diff --git a/img/body_17.png b/img/body_17.png new file mode 100644 index 0000000000000000000000000000000000000000..349a6708c43b5ae43482c7572318ff7b0e7c840a GIT binary patch literal 2871 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 RFF^}?-yXtl?oOY?{{d&9hVK9X literal 0 HcmV?d00001 diff --git a/img/body_19.png b/img/body_19.png new file mode 100644 index 0000000000000000000000000000000000000000..3229f567d346cf2c6ab298b253a7aee65d113ce0 GIT binary patch literal 3881 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 literal 0 HcmV?d00001 diff --git a/img/body_2.png b/img/body_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2a536fd9bdc3f8725938ee1290c86a067ade4ce6 GIT binary patch literal 9103 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 literal 0 HcmV?d00001 diff --git a/img/body_20.png b/img/body_20.png new file mode 100644 index 0000000000000000000000000000000000000000..7cab380843acf53b46ce099dd3c185e53f7925a5 GIT binary patch literal 4350 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 b#(iH`CpMUpuOUA)fK#5n$1DDN{>%RbehGo) literal 0 HcmV?d00001 diff --git a/img/body_21.png b/img/body_21.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d93684e957cb88a720e32942dd46fd2f8b9fc4 GIT binary patch literal 1555 zcmd5+|5MU;946b!G{4-fn@Oi;B39GP{E``Bsg;1=BEmt;zNsZ;-f3#4!Ya+WW-Z8% zUy-Oo6GBf7i43V+u8+nnGThbfwtrx|_ucFL`r-9@p4UCk-E%oU zc8{G6+y(}N*Zj1vNq#ts8C9)SllKFo!;>Em}=Dj#lxN?qA#th_K#~deQOw-j(h!u5&mH z>t6`F@m~zM4Pj5&6xdnqNpNw=iZVJpc1|_5=QHZTH_p? zLd(!+0A-oGc>b~!Fko8->$D_#q5Q5FA5>QL{DK3?&6O0~N2G5t`nNL;IVUzi;C_p7%GNm-$b^G}jE)0s9ZZ@?cO!xe5c8ED`MtMcmtwndw&D3)VPE_G5 z9(2V?-+YMY?-RphaUA?y*MK>ubki)QXA3RVB7lY{RHn;$gJ)%vri1yrB*kWRrzw7f^XzyzHp;HPbgFHCj)wau8Ph=hQ*tKjwJtF zg}!|zDNH}NwEFmSgZvW)wIFnUUVop=d!;{T$Ppmu<65>y*d3is^ffXzi$mNlAjcqc zCm-3gcRRL^ia_>u6v>I12Oe{q+;LmMS#&jpMNNf_@Q3Ajx+&5C;aIu72^ZO!8;Vto zn6020mF9()OGjWGfERG(Y9fxWATlwEKJA=lQmQ>(Saz`EG;bI&4+acGAwlxgUWT{l z2@o+5mCZ0cnTVi&EF@!D&oZH>mxcF2USb*_bMFe0w}73yv$LC}6D@B))J8~|&SqiR zU>uE&*vgm(-@NdGYiDW~`A`W%mfMu-&XPeXTOxTEmQiA?jBP=Ut@JId0%fXUu!9nZ zb~6Nf=xP-+D1!QA4Sy4jmvsk1g|#nh3^P)ALG6Jy|Bux8cXGAfD;0jqYmP`%jDEVVTsB45Zrrw`YI^A#OUlDAyJ907 I!VjJQ6WE3J#sB~S literal 0 HcmV?d00001 diff --git a/img/body_22.png b/img/body_22.png new file mode 100644 index 0000000000000000000000000000000000000000..d7999ed4b537c5f5a491a3a507d77234f6ef39e3 GIT binary patch literal 2171 zcmdT_Yfw|y7LJxG)Zz;tEm5>KBsfIVf&>o)QUq&G4PaYZFd`rVElm&;BP8;gf-kND zopXRnLW;IU?pz8aCLtUlNTe|yhy+X48|Fxg?xs=EF-?0jw|dd{H(&$c32UA@IVOW#Y?-Ytb#EZ z#}B}epa@?1lu?&j{HB{`Mi)VjU_2S!eg5uwtbi7J@g~6utK;=t;T;*e7qY=c7cu|F z{LGq1ZawY~e>74iPatbSu*fm8FebqcQQ9`*kr}2%Y zjRxqn6upC8!|ND~-wt{WSl2H;>h{dZ9(cHVQBhWsw@&swsMBnLh{DA^BL%6$tNetB#1j@vBzFhg?3b#I(TciC5oNEpJ=<3OpLI&K=$B zw6E(6#9Q z2#SWG!BE9dh=0X2&)HQEWX=z3wOr*&kYlECtTaP2pRUZ)*~<2;V|yG8oku^hd<>=P z%MUN*tXhS(UO>BkLPy$#O6+B_%Jm;i&;;ISn68M9rWbBYzpj3Yj|!F+o1@6$Xc6)<>Um9^QV?|Iz+jpFLw1obGT$ zO%wEPuFr-HSY|T`W@gOD*uS@%ihmyLlZ}j+JFgk;{K+BV%UCIW(*vj~ucjc+%YpfI zAPw6kxIznDJo%RlfeoH?<+Yg;ET)XS)HgOd89FZ$o>B5bnDILhj(aa6l~-QfV84Dh zlnE7tFuQBb`fxZhCOL!f_tw-cTW>0$$?#brc2sIuSVh1KE_@qVdvW95)_?w54Nl{M zl2O;1d|U=ZDTyKVN~@fHH!0CMF2`0I6*TmAb+A92DdS|8B#_ZN$+Otd)>K4d){(Mr3 zwvz~?rp~Dt*4AA0N2R6E>=-Ql3O;u(fkk}wd|{LsP8AVJ1QV^Z8EL!hKZ=c_-ZZGP`ehQ>orBK9c}We2vGUze%T^Up%be9xCdxG+;S!fjSC>d@97*& zEoiwlF;@8bQbX{zoj0sNzMY@Eg_V02nkekFD;{kCTKAgMqrZE&+|>j&^)Wj$c?yBtMYjDiV%& z^_7_QxH=iKw*PFLBq-JW*+D4wI&hrP{%f1KlBqM3FWWe{KP;qnUtI3L02J=d AG5`Po literal 0 HcmV?d00001 diff --git a/img/body_23.png b/img/body_23.png new file mode 100644 index 0000000000000000000000000000000000000000..60f0458644e90a41f8201a50b5bba121068a0c53 GIT binary patch literal 4980 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 OK0WMxhR#}KI%wQYO~ zBLvCTE%q!AGYe~&NTFDZEp0`7SmkIP!%~p8Q?M0}2jNy~fzn+I$S?Z?y1ak*e(pX$ z+`aDo{(SFS@nuS4a8PIv4u=aq_*ueXY|X{t)|_9r8mr9P*KEd?wK++N2{^A$zi6Z) z94^RqFk#Y{^VrUicW;WTd?#J)6o(&tl ztHihNtmj;*+@~x!`-Pa4y`{bJz@`p%{{Gb`;*4`6H;gCvn(45)k%ei4MoDxK9IU4| zp~@~!Dj1=SW|cl;4n;;8Dc5JhCx|(3{C~7T#y=x-pR~V#832GjhpRzB`*f8S+?m7Q zh0elEfDA@lcDrEsG|!%IhhZ5gh(Z5&z^#FxE=Y2biuj5B6on_nE-SG?oYo1FhP^9S=>UGkI5ftjb=#5Ic7J_s^!tvR$cyOVthP&QW z;dDSDYUa6%0{4`$d_P|0;*~~E@zScdp%a*U+25g{9ZhmXjy(9vOYASCx zIu+_AW=ej}?9}aHar%=Y;SP_`8MIIVN&M}RZ>(F>h^AqH!Qs!0!54-*l3E6lrc}-g z1yt&MH7V~aXw9sPvDEJc(B3IqUgM*jxR213F|5nA_gPeba+q4=v@zBX3cn;V(q~=+yv%;2BpnVp80=uCexD(bxA^;CaAQZU7XqI{6 z*xi{OcwvFP7jA&6!Dhqhy#P?%Ls3|-o_{=8nMS|a!eDE&J&|2=->01kNOcPM1H=*OF*!Buz;Jxxvfz6Z29XCTTj8Y`R5Y9v3NE^@HZzqC)w^ zZ31%clctXYQdv5x;xPf?V0;mNri=#!tNegjD}W>tjhiiUcD{Rb zOF*iHUO!kQV#i{9)qbX^JQ4eYC8t(kG1sD(!S4~6S)x5HOAcayn6c^>{p{Zxw*{um zvP0uH^r~8n@4nx_rMO~HSu3zUsLd-8#Q;P75nTktjLk6T@=t#Mc3^6(U&?u$YcUXz z-s65IYy`2mE;{9#O+Ty;>f%a7F+glgUjyDFAW?;KYV@6;z|;(KL|r5=W{B9Mt;_oj z7S~0mUc>sJ?yp32aUa4WiaCfS7yCHxkZ6&c1NEOi=WMi)Xv#Ld>L0VuK;H;rab0w3 z33f;+X|hSS*>wH%SE57q=OwYtjEGusweUl_z|}r^y+^?W%F9`(T|+I=>|t=j^Wvh# zN?Ya=LwPx~NKV~F_TAchnV1@ymvKVmoQi2f-bV)7SlJExTAd^seW0Nq1Z2(R2P!K8 z>1L^_<#jQ@&TEU;@1cg+Ygm6$8!I)1F;eI40WBTWr|n9dV9@0Lz# zVz|X5uE15&2C*D=kIQjEkx1+Jp1TVeVJE^m740w@K>&|uO^?)2V(|F30oaYQ+|%hg z?X;_J2X883zVQfav^QO~JCeUURc4UZ8(_+end0m#kiAvR#7;HOZeQ^Hjs_#%P1eM~ s4DElvRSLy5l-|)kvtt6E+6)U9S&Aik zqCj|xjG|S`0)znJ;iD0+C>U9QXm~BJ0)~g&0FovRa}!&2STplueocGtTKk-H&pzM% z&fe$jy-#gndM#SGbRiChTLgJ~Y{TK^`(phE3k)%d#>7TqjbSLm%L6y7doMPW3NcMH z$m8oB@%f`YcLe!U$;}gOOLs>%+!trn{gAu!LPpyBVPc$r(B)0EyI*a3v+DFZ(phiX zrTyX)xOJthP^R5B`#ZaLR5S*^itu8slW{L!B@BGNB&>Ps&T76zluTU38BK^Qbl?R! z99|QQ7w{gvh<}BrR7ROOM4X7SUE`QX%u9qjpBa4xkr@>hw7MKm0W(5YBHTMU6#fOx zRrK2sGz6Zp-v0<>c+Jck_y%0BJs&=pgI|+C5?6zQf^xyvU}VfDAd%O>DbG`l?_6I} z_^mpw#ET@suzH4M@HZG9l^a`ONptP?t0?teA@Ner8(@O#%{+6EZ?48HgTwWh>&%5) znD!YaH-?###JMaLZ7z|?RtCR6SP{|Rfh{B9RXw+94tcRydMHgAtp zMxa_Xe8Cp(=_5u#OdFN39Phl9Dy%O;e1Jq27R{Z!D92lFB-0(VQ9|3m;RUChC zFHRWvxI=p2*coPKa>}(jjzevdOM>z-(prH0bPAasMd%=qfqH^=h?j#HL7mMTM&`>I zEEhNr8VlDxz5YTLw)!KwzK4I~RKzq*oo#zQ9XHL1yYF`YR?T$$VM2Xf)(8oZP#rU-$U7$W!#a3UPG%vJj7?Ndt5G`bysX-e2P%g=?pM3iA zd*Ztu2;Bzg#>cOICdpQ@YduV8hX452Uy(iVo;j{*@ae$Ddifq!AI2_7OBQlmT6hyV z?P2C~4CX$y<>V?#&W#5FF<*{S7$$70(!V;wCFa%D@qwguwDjUR=sPfUavHo)UN1`0 zs*ZN4SHli`i5!vpl7mfXS#!z6V(Nd_sn?vladQ!;VKKyWlE1PU+zbrZL*)b-S5{*7 zL1Y&vuDrX$!gp7{(Es)FpIy%Iwy%IBrMHjV9CrWVqO5ZHNNuZDAeom^9CvL+5jh&KrzQ?7$|pb-jR^ zo9{zrpf^+7)*Lhg^}=Sg^`+*wa}1OCch}g3-2m_AU6}0L{cN3P!V)UCnNhl(!#-*c`Qo%2-Fx^JA4-^Sl+X{{KIWRYo3THrW zk2M#F{92(Z;CN#JLTZk;FAUdDFO_5=9R$wumqiVENaBRgVk^EbkEUE1BPOg8P_yKm z$YbBrjak-L?&)&r#_idazs5PMepla9?{#}0%G@duM-FAS)%9rXd)zvaiql~6FcRXq z^iRbJs#-hko_uUpiU@v$)B$KY@ z#*#Cv3LahZB2{A5!LLIN8}uPjqTRzoyCE$N)^6+yV4zqx^rB+XD3>+SWHO5nr@|e9 zJ{4>^DYvdF9<1*Ul=m&2FkbfTe{ADbq3GStXQlBeQIOUSo;8kbC#jZw zES1?En#l$DzWs7+k1466(ImCnFJ=~u&?zSp;J=9}u(rv0<{kIRkwji=L5KFQ{UJ%| zx&mf&L(xF*86n{SAtB_pVgjM)YL_RiY>0`EZ-@l>mT$QmRQl@X)+9IG!p|9K4y7m@ z?erGj$F+m68T`n0h2I&~n6!uLYN3mlrwHQ*Yh~dp;0pwQJm$5Z^j-_lhZjpfCQ(FG zb)Gc}CBH|V_5paXAx~wy*`%^OexwZ~4Vt$}g^%@%5(kAN#BL_bS-BPQ1@wLL*44Zb zELupz8Y)g6%wMLj$c~!&lT>`^XbGW9sNqhqPh=r^6F1W=GW92;ET8R^d9=QsXoPL- zk5!ue5zEd0+db)01oqr7&kK)4D30Rw(*`qit=Y1{swG5~a+z)p@??7axGDJCe*zI& BSUdm# literal 0 HcmV?d00001 diff --git a/img/body_26.png b/img/body_26.png new file mode 100644 index 0000000000000000000000000000000000000000..8181adf8a667512507e998492d097256106f2fe1 GIT binary patch literal 4399 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 C?4%0k(?!dd`0dNCq2D88U! zT^)3bqQi_W@DpO47B#WyD`blruxlVvkiopUR<}|0)N$oO?;hsKlI1k9DmVeLi$0&( znSqTsQ|A>NE>^#Lyz>v@#%JNGM~{8-HWx^8EVlAHw!Mi}%B$~Z-Zlt$v~PT#iuIx> zD(R?v?Msf2QmmKFG(}PU@f7u7B9qok^wVLP;O_o~Zr_RR*fHW#Od&BrY}%0Yuq=3q zS2;e3lmW?fdbc{St!IGBB<>hWT|w9w;%`N9R_if9S*6`qfJ2!8`w%d525_z`fF}@S zUWUQ@0#<>Om=vJmEdXo#1}Xe3q?|xV`>GW0qRPu|8tbKJBq- zi|2q$Q7_0Ao30@OR#I{^FJ36hfFSr${_TDT{SV)Js28&t+DKAioRAE4XE2a-t|z`P zWUhLSGAGK4H>DZ_8N-YZc^ktf!2@ctM3&%kUE4UG!YO?D8;Lh#+(+hv)KaQKqEL1s zBLtL|LV^3@KKKgfKI89Gdx85Q#F`v~*z8=mOhzv>I(vrkmre0#_G z1$qdRwO{k>OKcC2-M-C2*u7Se{g5wu&yKd4iY!zqsE(+iOGQp%8|%>{$M$drDdKI6 z*5)FA9%6p2F|V=c!rfel{~{b-<@k82%i}ofCsyI;>e(7p+7^jCJ&yaL+^hsUq}n?b zD%@&hF%B`_H25zzwP#)wt!;v553>x$>#PnGR2#a|2wnN2-qU@uC#a#PRdk`o3vYR9 z<-}Gkykw^Ep-6p37c@?rhD zZkS%H_XkkAiB3vz zCZPOF8@Y{SK8u{y_nF@r`2XrZ!*%IV^P**&^anhx#bl<)$#I2rQcP|<3u|UKHa%gLCO2t1& C{g(p( literal 0 HcmV?d00001 diff --git a/img/body_29.png b/img/body_29.png new file mode 100644 index 0000000000000000000000000000000000000000..52b84d9f7dbb8a9008c226e6df12b5d6dc787f8d GIT binary patch literal 1659 zcmd5+ZA?>V6ut;y)d&uiqJq%i1>C}9It2{01*O8Z1&l6$$XB5tIz+5ekrp93MXiH+ z!J35%I#i5ME0yokmaQV(fTHEAP+Oc-O{GvRSo(o>mt@JZWdGfHlk>jkeUj&#=lpms z?um(XTDEQ(002%-wG#@eR+?8tM~%&T3=3HYMLXAX$B@)|r&|ZFl=H;~L9mA6=K5^$q5_uJHFP zIfH#}NW0g5?;+K@ZMXWGWzSQt9X1eZc(Y=B`Bzcc?X2JcdbQd7L_VIVewszK%gObv z7a=*ivm9`YB3#Gxzw`tY?Prs)-En0DSqO_@43C2Od|FFYe-8lz!Tb~D_sn)~$20IVODVgR2dOTsRe0DHV~Kqcl2l^$MJ01OF1j10polA#Wik_|F&!poer zuepL2g0K}CF08gv5|&+ZnO003Q$)?Eqt%^I*?Mw{H0Co`1Hl5AM={icQi?G24b?A= zi0pzzkouN&Xdz#>nQLo~G@SAm26IP7XBh-9>zYA>=@@-FQP?`#J(&@w{$$+=lkIs& zE_wR3b7=u8*}Dwgu{r05rKHDO=kc7I_ySH+JKS0LQCk42LY@&T7J?CdxhZGg91gh( z3h12DtN5~U>imP=HV0Z*Y&95klu>iaV*^!3}E(C%g-n3s8{}6+8Y)aXz895k3y#hZCff@uSizZ zm*K~=n@dUOeQ@^eC-rF)v!+V%3F5Cii1YMkg2rOrKd@p9k}L>SA3tB!2&Oj$Z4ZIg zJ*AdcC+bmZOfOJPh~{#~ll2L(v`O?r6B;egb7syB6|P_}j|_8sZ^)dFo{KY9EQnRF zecxtwFcp{ZmP2B+^9G!Kws|a4ZmDh79xAfwp2u3P2d~^jDWCEnuDeA32OZY8pp-mF z=_Yv)N#vtj$#b9qZkxcP6D=ZjJhW*MPKx?h$Gp!hx`8H|D)K|x8P}?Kv)YvN0$1kT z;NKI`t&FM*4WK#S)<;oKH=W8JtNkU8nLtZevW0V?6<+0MNqtL$Q|F}p8r5!jnlp2& z{4lD89OfwOn0p9x5CX15qyp7ridES}W+2=Xkq>y>bR&nf-CA=5XRCe!0unIao zWTNb2Y)3u~c_tdO1p}VgwWTG?b(W8s=e3$SEiLo)psm;k(SpSk!{7#ja&>a7VWSF9 z=<+ZIrKhr{-`mOEWECXfd|sd8;ja{ z+{}=_aN`1`JeN0O`^^aQML?D@@f1TNMvwQ*F|z{5%!!MNEZ7(RKl zro6yW(qfsJo^=`M8oi(SottY>c#coc23%KAx4#>{5&P)HJgREte~N@BGrWM8T`jMI tMo~u;ZZ)n2oU^e4e|yxp{~z(*rX}i~oDNeQ^(BiFL8O?7`#aLk`~|Y)un7PF literal 0 HcmV?d00001 diff --git a/img/body_3.png b/img/body_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ea90ecceecb068f5754c9c37c4317495f76f8cfb GIT binary patch literal 2488 zcmchZYfzI{8pk6=pmGtV1Go^BMPVET?8*`Y4Jd-CSir^Hhy-F-VQY}6Az+AzMlDrt zb*-X6K%5#%-VlN*L;}G?s?c`!W^_)3#X8z}#InO-v zKfmXk-y4s0Uh$U|2n51;_t(*h2*k3@?}vk(Rbl6svaFLGZ4WjYvGl%Qm)BiFAU;35 zJ9-E1c-7<(rkKLYQ#`AYmrfin?%tMCyZoYm%KCxBr*J;CdnL=GYNN9+&fgf+-0K~jmbQHvBy90i!WC{mq;+B|M(*O-WqJ%@3+i7Rjs)evx!9XQR~=n zZ1vonj;TgYg|lxN0HDdf3cb%@2mrthjJq#0VPzzN-aT~2%S9;CK7D$t|2j1Bgq)hH zn(0buBIJuFHq2rc%H;?}!|KgcPwsN3o#Imm9Nf1!DQ&*rOc(J5n1l_fyC04G0A`3TlXv6eva9@1Xs6vYcF(&<`|f@9&x%Ni7e;FVa~e839?J zBCG~n0vSmIezx?_Bi@NmP8Z3J9lQXpl@Tbq6AQ=SSU3S}13QcMuQspKi`^$0q)<~A z)HY=y2`yJkph2h)nxqUlo5Pgk>r6d#Erag|G_)mRDET2%iCbKibSQ!65m+r3Nb6u|&LN=`z z6}!Kj(;MDAL;EA^t9c)lhqZZn9&Z=@=IgE=@2ZTAp2gI_hkj*`D;ZfRav`u4+$k~I z`mGW!=lthE-jqBnM@S%Kjcp|e(!d4Ktxe`N!QwXCu8d4J7+BEb>=Nzou}Dnb3meT^ zJhn25)lLSq%zrNDHiy`+)OH8=m#1pG*7kcb9_P>C7Z1a`;G>#uhQ(Jer2dt}QJi;! zAMaz$4B^Xg31eZKW|#ha&)Hv*Bczuc!2nQNSzsxG^k71H%POgdl2#}p)B!}Ggn!1o z^z_|84Y6O~2Nr=$uy(`5Z?HpSEpCJD1{xQaEvuYco0DfI;x;-@6rmq%_aHifrb?Kdkl9DtqHJEdG?VA|5286GTPXb23 zSpDs=&eAYHegZb^zioP=@@jjfn4f>3?I)JY?ZLOOh21QB9C&h|mA`1o;IkKiI|55O zpUqrok2g~R%xu6^PRso0(lE^fd9?$rz0z)XshQt6*L*W;y3=xVBe^`iLi#8>PCKFs zVPs{{S&QQZNcxb2ds`3M8vp5W&Nh<9;I#Bs>G&=}NpmzZ@_bFnMnQbfwz5H^;DdC}s58+xE~YY#dR6aFzHNWt*88CHuAH@NiPT9xafq!|+JPg-3mmI+TG$jpVk! zrrm_SlbYO4^25Wk#d&O#xsAVc_PIe-ws;VhB+C@Zwnb}rUsnyp`K-42({X4%>u81F z2rf0VWARBMiYtGmxaD!1Noj~DHWIwzmU5CsB4R-*1t`S@6V&*^D-!<+-%|0F=O4XU z5yfiSnAndR=}69}$PUIZ+Frr&jmrc+TQlx$1>6CbVk`2-_rmevMcP<6i*@8m2{nY< zytfR;Xp#R5DeA?oRJFP~#faUF42(yY>`gqg!Li_m$B&e0s9Bwr{5U z2Vvtp&iM?T7@0nF*wj%fRH(C4E6#x3mC_M>4Q?rU5vwVSwy2**GDW&s5*b|sg zF1G{Uo?F_X2U3ICZvHb_7Ry|qZYJ|lGonsr?Dv^t2@L3V?%J2$|L%L&`qnN rm~F(;$vq--g=Dvf^n{n$cnjRNADe-ru)7CO%peMdkh%z=naD literal 0 HcmV?d00001 diff --git a/img/body_30.png b/img/body_30.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ac6d25a6b3551d616d5d4c11fea06e3842dcb6 GIT binary patch literal 6134 zcmeAS@N?(olHy`uVBq!ia0vp^Cm0x*TR7N&tS4G^B0!2Q$=lt9;Xep2*t>i(1B3W# zPZ!6KiaBrZSZ9Z1?>YW){UViTVXGRO^ZdkF^?PrMSa|=;C@}PSRSD_O<)Ztf{;7>JmMu^8#`0Vccfs!O zGSZPtcYQK_!{ZWL?O7VSYD(&Z(1U+(B`CbQRh-~`@b5MzeXe)c+44pBrrSSj+{wuQ zQJZ^8<^PR&qC0r^Xzob&{4814=F$99m#ypXixZNF?QRAe~EcwR&y0& z%NH7R%5tsMd~rv*Y5wc*Y%!~S?19($0{))YOXanQDA;c%(XngW{8!EGOMRG(S-)pD zH?B|@*AzZ!QLyuXU9Pdf*C$K{VF~j&AH+1)-bzz=byDL)!#^cSb~z?xSGBC^jVscR zuXq=4(wV}ugIPw?GN7BsrFRaS9OLd4eH_w~>*Ie*SX_M+vsAJ}%9?8rb6R8ODvo6h zZ@@nb-LgKuf1`>e=oKz{k8M%0mZieL3v3ET4`-(We=aP z=u#aK$$2!*j;7h6R&bA|+0isRnr27a2BU2Q+BQ)}%h}O#cC?%wEoVo|+0k-#blhNc z+yHraZ#cCL{#pN9b=~dX>;1RqF4o5w?%MxU|6fYkVV7r#A0^Mo{}NZrdhoY8;jh-}7HrXU$#uxLTm}?E%IYB34xlYt|k-*!=VxXc#Q}_xHm`Tz39dQ%_7=cBd}a z05}%*=%~@ep8ms6Pyc;?*^D{RUoWO%oUyp^Qz>gLAeg5PDEJ&qlFa8A~uXvvR=wFUyFMZZjJs#tcHg}S%&_VkCZul*z8 zH#e((Ul4E%P1cs{{k?;4bbS271$}%EetUa$)~r=>v*)$#-1%zj?58I-p0j@W>huYY zn4Ljuudjc2(>Nk()x6t#rTJu~{(0~0Y+Ny8=FE{abcUQAFxkKia^S!8=L2_+t&fap k+1VSny#DAPn?L%dOwC?OZ;p!r2l5#_UHx3vIVCg!0Q}C@aR2}S literal 0 HcmV?d00001 diff --git a/img/body_31.png b/img/body_31.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5ef9648182816d700a5b13c3693a18d91e8d87 GIT binary patch literal 1267 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCr*JR-mLA^$+3-RtDet z!@M+~u3fw7eTTyN%q9YJSaSS{MF%vz3;<+2>D&!_d{gc!4T3zD0%_^~Y@^(|1Y=!31 zqvgtVtMvA^xli7|^wk}$*n?~1KCfs?=1tkK?nl{!_xfLox%k!Vy|3;J-PII5_tOTj z)UJ7lXD@ocuStCJ9+0NH5z%`exvo7Xbu6LuFJJGX_kIUAd)^Bw1v+KT+GQ1Ct2ee8 zM#R=1uDn=&{^3)V{FPSQz09wLJ>RqDYQ$lQHR}%9^Ys19a{()VWp>SgZFM$hTGu{n z=I!d0V4F8?oAs~^Vty@?xa<8|_Hs3tOx5wZQN5-;2Veb?nB{tZFRM1(O?Q))h9&bR z13j|qLb`S{JKTpxa#sr0H1b>%jX(J2MZW37e^0tOK+9lcCYZ1)jfY}^R9vQ{kCgkpHnmwMmQT6{C5{(jWgXXiIm{TAt4!0SE1kvs3t z_xu0SHn7NAtomF2Koyv_s#mkE6^lG}NoX#gyZg0O>)oWSQsn~+>ks6AVE)5uy&-C| z{Z#qR=%ugoz6x4fuUYrYT%zqo$sg6kCeesS`-d{`rq=o#1;*FAF!`eM8!!FvcJfS= z&>379SWN7FqwI9zp};n;eM)V2)=qj_u;a|NFkoRY;rSo#$B9J`_pJUK2`t4JJYD@< J);T3K0RYCxN>Bg* literal 0 HcmV?d00001 diff --git a/img/body_32.png b/img/body_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d984bf58b6319438b91e3c2bcc4b1715465c964a GIT binary patch literal 960 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}zW6z+CF- z;uumf=k2Z2xwivETrWO8@Og?-dBU^>eTyc=913PHV$W2RO-XqAn8%5Y!=62kTj9V# z>6nH?VvcuMfCkb7{9D|gWkJ;;>BAr|1gp+TyN^~#3!t-YG3&2F5pj4T)U zckuRR3w;~gq=O};O=(1)`){T{zs(6=Hs@be!4bDVZY49o}%{ZQ1^vXJlkvpF60}U(Nr)(dT>iIm_j9isH&8#Hu_$&AR^k?i|6FQFG1L z#uvd_4>+_f2_r%Kk{OUevlJv*DRLY__bIh`90&0$qBNjPne!8eQ)^V j?2T%ABxR5t399!Q6(Wp|rdWJ52Jt;z{an^LB{Ts5ozNYX literal 0 HcmV?d00001 diff --git a/img/body_33.png b/img/body_33.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6d7d0a44b9a4b7c0b12138bc034c503b97e595 GIT binary patch literal 5284 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 literal 0 HcmV?d00001 diff --git a/img/body_34.png b/img/body_34.png new file mode 100644 index 0000000000000000000000000000000000000000..36c7e32ab32f33cfd48c6e5846871d5d8f38f57b GIT binary patch literal 2309 zcmeHJk5iI&7-v6BOUs+9ajk|{Z-C9z4JMg{+1c9!X--=g)h89tMM%55~oA#$db_qU#KwIq2Wv(w3oO&MpQ$7BlVsPPHjv494do z7#p*-KsI_eM!fyu8$Um0lXvC@P?iS-6Z00$yLEzV-e|cK`px~&>uqGA$gnK%lm%*5BIh1x8HYQNm%|oDbH0ty0k8{E07`%5aM%4i7>sK=ocN}Dq4PWH7C(iTEO*QBtEYV2(vS2X z-4^gqsFGXTyE+e5nEXMZ+{A^qxiN1cg+`>}TKrUerBn*P{vnfn6BYbG&MkN5JPM zTBO=%Tw8rmNF}O8yE>4r!a4B>og_P#=fOdKUQK;B1)&$8O`=t1GSq<6e2jhQlN%|F zZ#|+)5u}0b0Vabpsfspuy2T6irNVx|xfYR<>MoEyU(nXwk4THpu1CFp!hqTq_X<`a z=Gl&KLCi0Y(<3@2@Z_K0UdKpkJv8v@7d_Z@PLb@OC1f+&3v5nnZ+S!3j3 zVJ+FnV<={@nU;_q@TJ$s#OzBFcxi9JpblubRxo(oW9em1;r!ubug^t(M^ncYfHaG0 z5q=H5fo4?!X2Xm*4(y!7TNxG-E7$xwQR!XF_7`gCp>{j0lmy-AI;aiCT<)!YRf zgs2CGmaMM*C)Zw-P}cC{T^uvhb}Y!8eLlX71@MW2SHO~IuFozLdxq+>ZRwl&m@6(N)EoEttxF%hO&^zko&f_V``^~YP>TwLLMSMCBflauiz)oXS<(v4AgAEl|QysAyGEkZd3%kot!57Bq%vAc>%@ zdR4R+TXZnc9-+u?-Vj1eAR*M3v?8RGEzMZIC;b;fR3L_-<&zIrei8c3MxO#7-i4Lw%)|pe z7w=xJuabdP0_I=k0FCR$vb(s>y4uQ7@;KV(-aS&nfvZpp)X*>XD(HS;87Guk^rAjEvd^4K?j>AKHfFaLuhxc?;AFMlJsjx5nJTHOr@4Gvdr^3T6~-y8iH zqhlX))$rTDSWJ_yMh%@LuasBTmF9f9ZIE?=|M65hmxmq2KEif$>l_9?lWr-f=hta! z9jvuw^N64BQalEOAYB%BKR3EOEt*=?$afN~^EPG1DIUu!!HK*<&Lp^oQ|+xP5&QLg ziM-5v4=^#(?JsRB13da~jkWQm73bmiGidT~g`XliDp*2u9s;$M7g|-&<|T}9xRi%&gCL8Tjj0*rDZF+-{$_5sFMZL zGXYMed4xxJSl?|`jIy!$=?`F}*n84*Q+DksZUz**KmEZuWW2=bQK9T^1NpK8f8k2_ zpB4*F+8#}_qSHuBR@GCu+jqn>$Jj|kw_^#L1Eu@mW>|cFmsd`EClNxv08A9~_Qq0x z4fusdELJQDDWPI4y;R||@OP??pmdP=sjiDi^z$0xAUH7?wfrM?*tGx2qCEgd_ zPSG!Wy(~MUiq>~bRXY@pqplevm_cnF=!?^Dc`Hz|7S4v(!q0&-XGIy7$!;Wz+rroJ zzm2^0*_*|u)+6seDTK{%I~)jahHH>ulzUjve-EiaDv?vtT?<#7Uf;%t_!0*Qe*t5R zJS_QT7h?0g?%R9azm4C@2m6|fjb^Cw;TKB>78a0GXrQ6FK849Sp*5)H<^ombg#o4_ zrdFpX>nBEv6zMjDxIt5?1?2C|{0X3e<<1)RoR<~4?3q?;4jggYPw5l7ARl5 zY9gLw^1hvzRIoxB#f>IjgH(`gsQD#PCDb)_} z!Z!FTLUFBw@pNVkH>4|)u1$?@eD-HOaA7_G2f)ElGo7@aX{^T#Gj$G|N2hmA=T#Op zn!&u;nOsZ%Xm~$XhDEA%wq)r1wXkR3FU(u@R9Nd2!{<>f6^hw<^Hs zan6J_3HecPVpkU5)-HIR8FR6@;_(Dw^V2fq4$_V}V;~{bbu>G`gLs&skR{8h^5pU~ z(#jcuz(Ro__$4xpTtmKJdeCdp{hPI??NlBuoR*PnNiGLP5>pM98wizyg`i*4hIjK9 z-}geLNIe1p@qme=hWFfyhg5#~VJyxzFVuz9W!ZhmJUM?uJUxGH?=*{97i7P`m)r3i z3$pw+7bcB5g*nE>9P^xn{sufGl)=1Cgg-&o-kSdqcU?y{3<-CtlLeaD449P$xG40t zg#;UZ9mXdd_))0e%h<>4YhyIi2$h{IO3gQ}5~pd^yo!zbu&5%PJ?Nb%>li?jg+I^2 zOa+thcVqoQgaY%mK8vLbbN0m~Izt;1dS-$P22sa1+=K61A9V1S&OKM z9|S5Q_Tg!f&;2HHk2q^dO&Lt-L7zFA_DI7HYA%PYz5V3{r+AbHgv(5s(wX`9?qPx$ zdC@F<7KGaR9MtJHy7#X5UvdqjQ-XqVBtUngg(l~9;{qv!rM?8Aa{g5Pr`=h3W?)p zWaFTammK`-FrG0|GgTkn^*hmepfiKnK+`6=4zxv=AIrmr9_Mxvnnzwt>k7Xfxo%8j zs&!W&IHTW8^EI*y3BBCRERiVQWY2cT*;GG9raDEv#d7pa&o%gZ=4K~}z!@2jkT}z# zOUjQb`K&hA$&S8Zmf3_5uazJDOQd#AmtbY~wL>H*J%ts_D#T;Y2*d~WT90GnbHa{H z(sp-zgr;D5TNODT-;J$E6OB}XmY_j~ ze(1si0KNl%hV0^k)GG-=!RpSt4aYaeu{Yh?s+j|CgZP*1>O2=?YD3qxxN{Io2S5 zKFb=J|C^AZ3?SDDX|79TcZ+bc*)iUoYxHWizGx!e7BK75q4c^il|%KkVrBwgL=Z$n zr(W`BrujqHB9HEe?tGV!e_FZZ_vHn$*-bS&v5w8$mwUD2NoEd3@S<&#^)vIIQkG8w zSPDjkLLj%Qy&P>1N4w%to63*BsW-PonP{g`sD*Azm0CrkkcYRQ$4w;n;Vj?&C(gGz z#-*5ai?F%(lXd@vZ)cl#No3Owl<&eSs(ej&h-R$rk>}-T8cSp7MKv89Vvn3=_7<{AUvbx5kjezQ9y(h zXb2BGC{&W5EG7sTq6p}MfD{Pw5=#@nL_mX}NlDTrSlZ6?2jJ{?&;9nyo!R-$-uceC z_>C`av(7FZ6biK&@8Na~*@-BW*7?siBJ7!!*5}BkebNi(hElIQ*Z9>S3Z?rL?{@Ut z?@MRL>&Ri###wLXsn#Ni=g2PL`0Y1U+FQ?E?8jH#NG!U-Px1w|4|u7MmZ-Frhz5?s zsk6;j4>0{boQFNGJ-8kc(hNUk>1q4tl>OS)tLg3g=|}rP^O=ivs8bs{Hs*X{sJl=9xYhljjE^D_$5Wte-(wmp(wJt+mU2MW zKe94Uk?)ZoPA(|Lt3We(yq%vAoY*Vy>Df`S9}iWOUJa+?(+j*KXsxGZ1lf=z zajuw7Qtp=r$nr!mOWh5MMnwj2h3|Z*t-q19ON52{dGzH2a;j`l>fDF6$XN`N9ZkF$ zRc>Z#HX*3pW_`?1sv9I>(D%}VRKUpg4uuk(?#u7&7cGb@ZukVSV+-hL+UyZfV7p+| zU2~FF=6#`M$y?SCS$<>q`gf$aU7}u?{waS62it-bwsN=ZZj1rwRjuMZf-6PDr(|#4v zz6b>QMBC&mV}2&)_#X2>$=ufPGu!LRM|T2c1_SC{XWQ2Owdz>pj8}#ejqz3nK*%kM zKG1cfJ|&pQ$sHWtLq5S)=>xi_78@Q18?prM!kVBk8;H;@NytCQc-8cHgj7`O>`kgx zbv%O8X2{dJA>nUjh`7wI4_QLTzX-xL5PmU6q$RF1QUJQ;e)N$s4c$0_0yKvUHM~ zU`M$pdk&)As+^QfOq1AnTTb{7h^?4q)2^0=nwNYC(XoHAu;U^gAT6h1{hr zK2a>Txc5bBaHMr!;bj7Vd$XyfI6#=+mO>d|u}{4}`0B#C?>afNA z;hTat@ped0OP1Z9jGa6&Ml@C%-(#{fnCu))TqOu!h3j2dF}3bTn3cjbFxlCNho)$J zbj3k=3E+;n6>tkR%DzHQ7}z%_jl`yoru62?H~U9+R?p`;S0b5Jn0Gq?#>q}N8o&T@H0Mp#++%M8*Y zMv7}p#fF41S`;rQl1ez7vF2hl3kOKmS?zmRDN?DhnLrV pi}?Qu85|!EZ6?qznLHuMO}k`yCS`pm=*YB>!n^yr)qZ_E^Doaf6ukfd literal 0 HcmV?d00001 diff --git a/img/body_37.png b/img/body_37.png new file mode 100644 index 0000000000000000000000000000000000000000..cd877cede6355a7b4bb42d252f8aca918e796fcc GIT binary patch literal 5113 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 literal 0 HcmV?d00001 diff --git a/img/body_38.png b/img/body_38.png new file mode 100644 index 0000000000000000000000000000000000000000..d984bf58b6319438b91e3c2bcc4b1715465c964a GIT binary patch literal 960 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}zW6z+CF- z;uumf=k2Z2xwivETrWO8@Og?-dBU^>eTyc=913PHV$W2RO-XqAn8%5Y!=62kTj9V# z>6nH?VvcuMfCkb7{9D|gWkJ;;>BAr|1gp+TyN^~#3!t-YG3&2F5pj4T)U zckuRR3w;~gq=O};O=(1)`){T{zs(6=Hs@be!4bDVZY49o}%{ZQ1^vXJlkvpF60}U(Nr)(dT>iIm_j9isH&8#Hu_$&AR^k?i|6FQFG1L z#uvd_4>+_f2_r%Kk{OUevlJv*DRLY__bIh`90&0$qBNjPne!8eQ)^V j?2T%ABxR5t399!Q6(Wp|rdWJ52Jt;z{an^LB{Ts5ozNYX literal 0 HcmV?d00001 diff --git a/img/body_39.png b/img/body_39.png new file mode 100644 index 0000000000000000000000000000000000000000..0a551af2f16b98bbde04435035e90ead82d1480b GIT binary patch literal 4440 zcmeHLX;c&E8crZ+l(K0HS`Z>tsYd~;RS<}vQV|qz$)fBi$Q3Z`M1z6272H6|6)qPL zEkz^)35!`EB*X6A+`nW;26q8y=mO8|^H!^z6 zBtD{eq>H+Ji0NeAblI|QDRRNZW2^$G$I?)!Erl2i!wiiM^YlP1F*8N&_MIHhym_W5(bOvuCs+2_`*a2gN7p&~K@EyIl zFc^X%n9kW63Gj2t1j=NKZa*8XxxcCLI4{xF~>oNZd zBleM?WTeZ^93kk;&3l$tY)G?0@H4_LK2H-0zOcWo__-tbrjxOHs&{YF4T`eVtSG^u z^HfcKCLl+G&5axF%iD#-zP(zpBw_Ugslp=2qB~9=eqo)%)+e2Nx{H>JEs{XpSmLu{@Tk@0(U$*yOt7i6S6)!AfTV#MG7z}hr< zvnm>vLUXK5W|bWk%4=+-t8iA~7C;m;CMM%02P&HCpnAWZ!)-B7EoJ!@q35U~3q!reFddN_X{q8hi3oNZ@u8uw-C4jw`J z-duq7dQwi3yk6Vy6H-uP(?0sG4&gx`mL_oFc1Kf*?xC@qvZ&|C3yW6ZthP2&;M?l; zEOK+eNARxnX2H8?ug;%mb*k1u<%8@9pH=mv{NW@;?p%A*3qpY97cN7cOj9A;Er)?#prs5q71Ia#NW$*_Wv_4_J@Waf?Aue6?wn(0rrG=oKmuq3=qB0%wMzcR4wU>c;ZMrI zmryJ~Ua2BfFc0fMg_mnuMj~Y_U-T63{9)Eg&l`hK?%Sb>>`+o1akjo${X!E579<`W zUPYg#Jj+3U-2{=C8N{MhcUiz0TA#+@nc{>o}h|O}XE{f?$ z4wdzIitm`2j*rk%M6?@?JESV_y_R& zgDp?05wdPxe9C_dqAGJdZRx)Wq{U39=bmS%O%d@G=@7&Ouvz;-Y7lZ>d&|EXQ_Yg; zZK=eZ-53;|LIn4*2+arL@nLxg&=kBZFkUENmOApSYrI2t@>g3hlXwY53gKl-N_$KG ziJAVJF_A<5B_qa53CM|wULghK@TLlbtbd8QK$In!zjs?SqbNdPEnOCOM z!WmgY>c*jl$1{$oQmbqFeO$aOG0KKRE2#1^N2GKu8bO{x$IJ>6<5FmMV8-J`rd@A> z+C3vGG^2A%%NMw+m(QX5ddlJ|5l8GI9>-#1HX}5iv8~&$<2ObjSweW)HGTjf$L+RF z{GL{>dGwt=I&eAel3TDaL@t3Y{X$9|r)cw_nEB2YHJkPBcK^!Slnh{JF>?!tTHK?R z>8e9^Cv1+gj<90@aSa5rWYqjxueMfTrxvDKG6(KV^FU5uWyDlboJ5yXb%ejsdFSQ_Rmr>R?w zA4*sw2?%a5IGMNr%TwYkblt zzjD$3?R2ZJgjoPk&4ZG>ElAC7{Krds*SU^Q_N%XLu2+9`i#AeDo7K&CX_`1VMw|^% zJKR>(LWbawc|hFJF;cG8tkHuJwqdS_1#Arvo<6)NcQLpIBDeMq_fNf(9tk*ia~tQ6&nZCjd$4>6LnQD&rdGjEzYf`=wD$g%z$CNiG_O#(bT z_$`KS(0MAh8(?=W_J20t=46oDmJSf&fn>mD*>EgMX?n$|@p$dE6Gu`8Yeg}j6Hw~l z`l%RksBN$k9>{xoT$aqC)oFC=x1&{O5OnIT_VRn09$L>M!C`gbD)S3E52tU86Ev@jRG+siCY<*1#R=( z-t8%IYZ$nISm1&n)39TDb;~>PJi@OY_h7II%?sczE( zC(`nlE)285M4Yiss|ra!@%ejxnU^dG^YPfE8mUmi5~WBR9W|6HI#kif)_B7l{Su?F zWqNf6Ia>k>93{`|0ZEoh^{jHgQ)v7o8LTAr@ta-9!5xM3Ym$sF8cMBE#!l$XK@RVBzz?{sz3vS) kYBcgs;%~C`W=~|G?Y32&@;gL!nTyH$8$VChwy@Lx0n(#-mLA^$+3-RtDet z!@M+~u3fw7eTTyN%q9YJSaSS{MF%vz3;<+2>D&!_d{gc!4T3zD0%_^~Y@^(|1Y=!31 zqvgtVtMvA^xli7|^wk}$*n?~1KCfs?=1tkK?nl{!_xfLox%k!Vy|3;J-PII5_tOTj z)UJ7lXD@ocuStCJ9+0NH5z%`exvo7Xbu6LuFJJGX_kIUAd)^Bw1v+KT+GQ1Ct2ee8 zM#R=1uDn=&{^3)V{FPSQz09wLJ>RqDYQ$lQHR}%9^Ys19a{()VWp>SgZFM$hTGu{n z=I!d0V4F8?oAs~^Vty@?xa<8|_Hs3tOx5wZQN5-;2Veb?nB{tZFRM1(O?Q))h9&bR z13j|qLb`S{JKTpxa#sr0H1b>%jX(J2MZW37e^0tOK+9lcCYZ1)jfY}^R9vQ{kCgkpHnmwMmQT6{C5{(jWgXXiIm{TAt4!0SE1kvs3t z_xu0SHn7NAtomF2Koyv_s#mkE6^lG}NoX#gyZg0O>)oWSQsn~+>ks6AVE)5uy&-C| z{Z#qR=%ugoz6x4fuUYrYT%zqo$sg6kCeesS`-d{`rq=o#1;*FAF!`eM8!!FvcJfS= z&>379SWN7FqwI9zp};n;eM)V2)=qj_u;a|NFkoRY;rSo#$B9J`_pJUK2`t4JJYD@< J);T3K0RYCxN>Bg* literal 0 HcmV?d00001 diff --git a/img/body_40.png b/img/body_40.png new file mode 100644 index 0000000000000000000000000000000000000000..b959415d1d0bc5be26fed2d7bfc6fafc5cf271e4 GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/img/body_44.png b/img/body_44.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa7b1063e6199272ed6ab8336361faeb8c2bd97 GIT binary patch literal 1248 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCr*JR|xVgt@jRU(;k!o!C{g7b?icc0Gug6P>%?;SXEZ{)R{` zC-vWqYq~3TXF6UNn!r`M+I*7Ubw07Cq)C$}ADOfL`Ok?Lncx3)mUCUFsiPmPx43Ur zXj;~k_F6ZN&>08U3a#7~nxy_=Sxj1W^^JCyf+DA#$G&Yi&+(Au)Q(Uk^}MM!%zAi! zvw3=*O7P@5Jc#h)vm5w19(|BN^bju&p*7};D2h3w?%vQomIx$y$&X9y^^tE z`|)#pU#*mt@7(>!KIdSyMEm=P))KPcCQ4pxu)Wb})pI~L@9L!JuSy~RDI{raSuIRs2t7nGo)aad|^>L#0?Ozuib`A^Mv3F@){!i1=AKd#|=Er~B zz+=@Sx})`4@Xo9CcUG0Nz23Rm*vxFle*Z5=zklHUWA9^P3GLG-`Iag zYiCW~)p-Z2lFGN=eZMwpXZu`6naPE_bL+(~cLDXC2kG;jK7CL1^iMbUKU}r`c*-5s zC38=$-8EtRS}UUnUvY5}F3tI}jrV_7`5cRNxV7@mD(=eLtCX9smJ~ZLp7`k|+n<}) zla1c7UGjSx7JK4$n5^WQWmoLuE*{=~VL{c;@4K$Pw)wq3Wy35lRkzFke2-|{vDx35R9w|MkHr+;hU8ss-IIHD;=!z0^V4f=o^F;u7!%)r zaz~|y_0;H6#r){flnwK4-154-M(K}1L$Xnx_SN4P)=oP8JnXIH8g(;sN$JmZ7=0WBy*BWg?q_G(z+t+=fwRkik@e22)V!`)(v@)*-x*F${f%EM)cqM&_A5oojWbBU7tBGjq}>ydc)ka z2d#V_ht1s?%Ejg#Br(`<>(kUzPZQ$>9k-tH>HP#O02Xo?0}FuA?OtzK{;|GW)wMd| TrPTspk;UNY>gTe~DWM4fv~eZ@ literal 0 HcmV?d00001 diff --git a/img/body_45.png b/img/body_45.png new file mode 100644 index 0000000000000000000000000000000000000000..c40f485d709fd05910cb7fe586d127ebdc973d1c GIT binary patch literal 1729 zcmeAS@N?(olHy`uVBq!ia0vp^DGUsZ6F8WFtm|Kbb^s~1ByV>YhW{YAVDIwDK!Gw( z7srr_IdAV8X3Kn&ZU5-Lt~F-9?iRnnr%P4DTVq;)&cX<%jV(!>M}>xlz~;sL6{n^bi0@;3 zp!!4dPss<@|H+O?wcPU$seceScVIu`4?~&5R)56mn4h!V=Qto|Blqiv@E;bn^ZN^! z^bgK=zrWM`kLhdv58gklZEF5qw`s|LAp7I-%e!B7l9Oxs_P4oTuKlR|L-fznqj6uF z*^d1ZyEk{&6=D8|u|M9q#+FQK+-Ns->AWB6f9n2i_eoD!bN}yy*H=E z^q0^-)7QoS8S7_1*A12yea#&)^Xty^2kSrYNzKx3PII$wKmWkq*!H{o2ksv~=jdDA zJa|g`!>g6`w|{>ywVC&Fr}hV_JvPs~{mM=(`2PNSV)C`c<`0ie`2K!z+~#{Tz8>eY zXfuCa*=?Y9?ezw`*Tv=u>GQU89KM%cYZAPkv&QCs^fFVOYwZR1?6YO&x`ND7|hvk~OjP*6~X^oA~O_MlEx_wsGUMoQb6g zYo11@$Vz1Y6pLg(7PZgyTHwZMMH5Ry)+~)lX`Omncaz_9hI4X<4z8?!{JX&Bb#ed0 z)q?-kud1!SptgF$mf3687kqe?2@Hhqmj9}beLeG7bYE5P`?z`Eebp^( zTK3w?+1tH6{`Gav8LLyfcAo5&X3o2JTYBrsUu^y9vZ=Oq&(1n7UejzA8J}KzE$~_| zZy6hJSMTkVzZuiwCUeU7OQ*_iKlw}X`CpCKzpUhYz}%|7+2*n9PqsvFkB~M$WmPiy zYwo(Zx!bP){2a6UShO>{iF^L0edpia&dD{b{I|S*GG}!3ot=lP7rRFu|KEOeske;m z#_h+ynN8-LJ$uc%O}kD#Q=80r`}Ujn#U&;`(qDD9{@|(0?Y$dYR=%^me|LH12ZjfS zSoPv$zUe)jDW-Jods&&->T|)z{!8gi96F^XvP%=6eo9>zBUyXY$im{mejQVZx?g5} RhQKVikX30ZYDtkic;uz1SV7()n8-t@byb9I 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 literal 0 HcmV?d00001 diff --git a/img/body_48.png b/img/body_48.png new file mode 100644 index 0000000000000000000000000000000000000000..40c6e76f8b7f2e2eb24fdbf8ba87bac547935881 GIT binary patch literal 4731 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 Q_Ra=~uHG({C(ft+2X>4?5&!@I literal 0 HcmV?d00001 diff --git a/img/body_52.png b/img/body_52.png new file mode 100644 index 0000000000000000000000000000000000000000..7d79dffce38d74fc5e6c018e8c30f331fa42f476 GIT binary patch literal 2318 zcmeHJX;hO}8V-u0vR00yr5~_s|NE0%EVhPKTGzlgUYjm_6 zZICj`C|jAa6UmnqO^}3ukzpy+WE}aBEeb`Xeldi_4tGA_{ z-MCd*?LLuTlr?-f^vU1MBe6Nhel4b|$%p=aA<0cA+WrxBxM1*>pBL-J)5VWW!KjD* zyY2A8@=fk!G|Tvge1D>esp3TB@-|4cB-FFle#(d8Ny(8PuilX?@raCezwg)>O7}9X z>hSx&`8QIqk47DM?YDG}vFNe6>md{i4>|D8lkh_*FtGCH5fN8q4$tLzNs|7${BquA zsNgheQ}v1FJa{A2I)|S_f@1I`bm0(gRkLRQ3#~ z-Z@te5x`QQHW}Hs%er&(hYPjAYRN?X(#5EKWL?7{<&={d1pW969DjWazVp=%%ylGU0I=PWs%aJ z6M@>$Jgh-jm#49pJUfAt2=pVoO9z$o+gwS8r+oeZ46J#A_3G4JwTLEl@1fBd zwPwC&jMr1us+}Oh*|5S>-gJurstD*WY{O0735SxR@_L(`iPGHZPvA;)y)n1&ThlBJ z&Ig|!vY-I83{5+&|6Whg>8w`ke$D8;LY3Y;IK;|nFHp^8b023cm5kZuA%i}z zqb*=bhqLvYSw5Z}yygHtCkeoM*OGs)A73AE1ttTO8x=Ejw!i>i4pWn_)(t!h{@10$W1DqFs!npl@tX8g8XZ!fpDRE3)j{M0`NcL*o&O# zsRPAJ1r9!2Z@-J7I=-_D*v#@av>O)yz&OxKiipO^p`bg#Lx+`-BeF(lW?ak4+5|Wm z3j1lNBS8|BgqI6wRPw}CLKg)bhll{#QJ3KIZ`&{3%Xh#$sNO!+<_rQ%Or1R!wnAB# zJ{~&$ng=JszpLE@n9>Q6N0og)+hN{h6Sy0Qun=K0R1xRPzCcyfFyMZ{8BV6ZJ0pJb zsZ3nEyrOIl{3WdW{vzhVq=pyjt3(Zy!T!>{O+1+H0>_{bkF*zEy1|1P>{3)ph#|GS zBCX{Yxn~yajNrCTNL#*s3!SfwvXm!Wr`Y}iJ?RPKJ|E73XIsYm%h>Np_ZCi6V>mfY zF#5JYJ3MKrB?6kk4xDAa>e8<3yV*STVArF;dO_jTNl`O0b$co&v)YxNnzJp$ zYRsDzv7?G^1lty}&sn=f(h9olhabw}j=*=a&t|6A*NK$nU?6IbYoghm@l8!p1FaYa zj=Vbnf5^gg*GOqrAht)8Bc#g)cAI)D^ZO3_f<`0q>@pGl6ut~$-x7EXJ_U5X!D)iA z4Jksk8#26CMp5f@+E_-G*jSZ9rQ5T>8>F;=EMNyHD+5CYp0ESkKy_z$ zR^ii3IEpX68KaoVkwXKwW@U3Dqurt$55>IIL3 zLD$Xrpj(Fm^rraQK44)oI@!O85I$ySXw} ziAHD!)t}ej3zLJYcoTy1>cr$9SGj&0|Aq3ELg93~?4^ym$*B9yO1z^-h%xd*bm2b% DMvf{> literal 0 HcmV?d00001 diff --git a/img/body_53.png b/img/body_53.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9d7d8078f4c6e6188eaf4d25a97d345e971f0d GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyD)~H?N;%%>Lo*xA%`7=k&=PFu%R$Y<#Cphw6mmo6nx9`@pvEjq!Q+{04V50S=}{ z1vv45uSouOOu6EJ$u5Ko~WgSp`;A2i9*)OWXhFSFVdQ&MBb@03y$o;Q#;t literal 0 HcmV?d00001 diff --git a/img/body_54.png b/img/body_54.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1b6962a0b392ec9117042681c8c254dba29884 GIT binary patch literal 4676 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 literal 0 HcmV?d00001 diff --git a/img/body_55.png b/img/body_55.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8752b082952c4b5fe30f5cf9e9f80deeae5338 GIT binary patch literal 3356 zcmdT{X;>528XiDJONF-Fnpy=~ebCz?P>UoOOcBLKrGS+spoGvOL6U|XU?4EJMVn& zeDC>A<|$9&);HdN0|0=nCyu+F1^|P3^xn656WZd~;`$VQZ2H=r=mxCoOR2EpHUPZY zcf!rpC$VT|_<1h*C8KSQmu=HxIj)BBN7DVFV;Mf|Hu6_}HG531d}saj-WdP!l>G5CShlXE z0P@088ji>gaUU_d9YWrUZ)gP z;`{<%G}HD?EMe|(oz@k~G^bAPgd3L$wTQ4MT=gM!;~6whAYvvL-n(8bs_Zuj4 z?`QCD-KEg)UAX_GHi_wi?{eGb)f@0-r+hk>Qy5f+M=a~zzF@DgS79PQ2ff+Gvd>iau+%vZ_>C z7_{J!>z)srrQMC>-_Z5I*HoAV=@+=Eg(QlCOw5*;B~(UxTH zyHQ%7VTzqB`$#+e&}#L3<4ZruqsyA0lL=m-J9pq_^(dWCl!6Klrn;#8WjB3RSZ~`D zqvlfuRjNQc(jP#yFjH?mK6FXgU}{l_f{4`)_uGpKy19Qq0T)ax);2WyNeN9$!&L$* zt6(o2j*b{Pq{sR77Q78Sb#b*<<2#`E- zqH|#Aj8Nk_GeXeQ#UdaJa%Pt94B{EOli9SS_uw4r!T4rSn7#7TP)n0%QRT9lne4?; zz4{qkMY4}EX!QG^<}5|5DF136VCqWkAe<4NwK$J|u=rJYIDPD}P#Z+}<*DCnByvc1 zUbw7|v*MAHcXAy))WR;OiG&b6=9n$`xHNh-erVoK(Qq-1?(Q7_-(QMd<5VcjEN zLE}*2Tkv$DE_`rD`pjgnZYE(kUe41EO7nyzP`t7?Zn?uAel^?el&3;fAPd%7NZcCD zsCu3KkBe5YtPa<9T;e00q6z7cwNjDZ z59Mr^$paV%#zBA+PNYW+GW`vRV5u=aCYy&3SOvMd>$ao4Pg2e>PLm5R2rVEo6zRal zHPu@8+U;=bSAoZHRfo+(*S^F9(d_c~-2llG;U^t@ORFq{#XNF&&X-6*&WU zz~Djo;x}?};KQ>#ABW)u%EPqbP3x4=1ZU7XH`oBTMS3sRNd0io@)BK`+_w3H*CHp zsRR#0AP{@yvpDmM{GCS&NcRW^oEvF7s|n_H%2RXvjfaPRLeN#*?eB0mDI`y_DlC<+qY z2lm;_a9Bm5*1(ewl_qr+V9WE*8CNl0PM1ECiNAiKNbzO;NRSq|;!66n9m6X~) zQ^QxwO`2KkAWrIOh^#6pKC>>L)D#^AWO`8z28m1e-~@;#;OYira2wh@I=BDt=7O(N w>GHGf0qg_&(*OVf literal 0 HcmV?d00001 diff --git a/img/body_56.png b/img/body_56.png new file mode 100644 index 0000000000000000000000000000000000000000..37277464921c92b9fe0a267e2aaa045be6877aad GIT binary patch literal 4690 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 literal 0 HcmV?d00001 diff --git a/img/body_57.png b/img/body_57.png new file mode 100644 index 0000000000000000000000000000000000000000..33357e285dc6c7f17ed1fe61a612b122d2b8b352 GIT binary patch literal 3655 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 Kt$xpEXZ{5#6r(`^ literal 0 HcmV?d00001 diff --git a/img/body_59.png b/img/body_59.png new file mode 100644 index 0000000000000000000000000000000000000000..99cced381d1453e8fd3e7e5c49b13ac60b4bbe17 GIT binary patch literal 1661 zcmeAS@N?(olHy`uVBq!ia0y~yU~U1jQ#hD_WMD&PF_2rsqA&l#C!BX0r(4aNq%M%I zRk6BVFZQ2z_uj3IOGKITMXS888VW4 zm>4b`lVD|7&}+!W;2@nW!q8xLOoM?TcaSN3)?0mY?>q0FJJV0jpJcDresXJy_Rf2? zOD|qp<+s{u?W--TE(006Qdh5y**$IT+8FWIQ`;10s=A-^eD3;bcZ&W^&$7wdCsl6x zmQ9*{viXVYci!X0TP}HNuf6s(W9e1>D_N87-hK1t$+NRI6%)kui%Oo%DM&L;{xaqB z^CwkCwzVhxCrh8a{I0t1VaC#_VNq*OU-Vi%FYNN29TS)P|DJxIqu;RV)6d#XwZFVy zE#Efz_}%SSvts+gqB56W-6gX&&U^J+o4Pyp|BjXQTogVRe`@_Id0+D%wF_Yiwn(|I zUU}Z#Ut;m(NF#gy0tKW3mvFY_%kZ^ z`NhRG8#Zo?OPnTSX>aX6d2dQp)%MIy(`{bwdoBS_XWLX~Pf9$O9Q}u64)bj!B69!LLKbLh*2~7Y%PY9d< literal 0 HcmV?d00001 diff --git a/img/body_6.png b/img/body_6.png new file mode 100644 index 0000000000000000000000000000000000000000..ead7efe8d6c97c0718f6f3b367be2b4f4d785ef8 GIT binary patch literal 6096 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 literal 0 HcmV?d00001 diff --git a/img/body_60.png b/img/body_60.png new file mode 100644 index 0000000000000000000000000000000000000000..527d06283891338af1641519565fe64f0ec70108 GIT binary patch literal 4211 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 literal 0 HcmV?d00001 diff --git a/img/body_62.png b/img/body_62.png new file mode 100644 index 0000000000000000000000000000000000000000..3828ce99e11d99c7d1a82a4e18d7a72a97b3c9ee GIT binary patch literal 2585 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 literal 0 HcmV?d00001 diff --git a/img/body_64.png b/img/body_64.png new file mode 100644 index 0000000000000000000000000000000000000000..71ea68c1b2faa850ef93261f3da45cb78462123c GIT binary patch literal 9359 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 YndGECd28kmpD+TfENsp1o6%zb1*SX0F8}}l literal 0 HcmV?d00001 diff --git a/img/body_65.png b/img/body_65.png new file mode 100644 index 0000000000000000000000000000000000000000..da86cab67c91c95210c942748f5454705b2f8795 GIT binary patch literal 2700 zcmd_s=TnnO7y$4$2?-b?IqJ$!d0fcz8L@`nXb1&+QcaGy9aL(?`?lb#kpLu>;681RSE=Mb) z0RUKTZ)fEUjrRcn_JLMWMSveIog|ggvRfP-`qx37F zD{n73XDsd2%zR5G!<(!$D>W-edhN$P8k$ht)q?UtZihv}BN4R>^RWZvE&d9#ie~8W zXAeszmEt|;;GvSUXU85Ha7?(x-F;xD%9QIxCaa1LN`j7wf)}s>ia6IEW0kxWIZ*7q zhF&|a)c*U4PCbOvI`?c`%C_6^d~DV;V<^lw=slGZ7{c*?UR;FOM=cI@YXv(C3g+dR7{n%@5A#QT0r`o$c)a_sqPAOiwp)ELYVs7PZ6PSAv3g?p^pD>g&7Ba?MOPy;Og3oZkub?-!o1(=!t3hfsTX-Z|^8JYFp}eSxUf4C5`HEbR zr#2nFl3`WVA_ERRZt$*oH@d2aL}p=-uGb9Qep&4(Uf(L-74ldSehnHyHD(FJHwNqW{oA`InIkcjbOdZjLu_X z=kudH13b{hT1!I8aM{Nq`joj8glcsZXAOOUl~A%t)~hr%&L!%GUv-N>ikj9N^+|Cx z=i|?&IQ1LFVW`5=tzQ&puK!lC;~fXxn)g3Y3|&iY-%&+OEH?7UdPwvu_b3#gQs`&CZ8?j;5-LnwcN_ zsCcrG^5fCKVN_B2N}D~SB=1AP(}%_8-H9o!Um&ynTwYJWDjTJ>953X2+Cz#;%*aU4 zw3{0_qPf2brwHW`T)Jz$g9CN$?YmPAhoLNotVv$Ek({@iyz20axl4I@kQn=Jl_VZK zy6oi3*txkNI_(~@vnSh-I_cSHw+cHrPcx&H&3azK%hd#Z+}dA{h?8}v{1%vzQN|u< zmgaM4w|%uyg=3d^{)kQX|P;K;uq=##H@6FDS+vr|4 zJZM=LrDkGU{vl-z^Sl;CT-<+`=<;ZO{wMPO<7es9oo?RO!x*d-=t*$J(07nPikw&3 Tf8GcBUIO;kj#k%pkfZ+ra1$G{ literal 0 HcmV?d00001 diff --git a/img/body_66.png b/img/body_66.png new file mode 100644 index 0000000000000000000000000000000000000000..5d04aef2ca6dac0ae14b8067cafdb6beabd7355c GIT binary patch literal 7781 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 N^>p=fS?83{1OS?#o8ABb literal 0 HcmV?d00001 diff --git a/img/body_69.png b/img/body_69.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9dcd3f9d7fdfb44990f4c9e1637d6f8036cbb6 GIT binary patch literal 2083 zcmeHI`#aNn9RD)syP{b=E<@O}PLfdM%#^W{OIl83E-lq*rOrf{o|q$xVRUy*7njIo zGqWbrT&9gDB3T@wVdl{}x>-{Vnaf$}A2`39=lpP<_w&5ppZDwic|Y&V^ZtC^7x(*k z!L&`Z0RVvE_jnKhK*L6TezFQwbHdn2pjv>(y}dku<*!sMVCDb-bO`UUDa%D&f3&_)V7~!)DGGh@>D) zP@deVbJ-}98y*#QKa0_A-jXwF8&G;nobc#V7Z$1TygJ=>NZRe-kkfeu^(N-8jMkBw z3g%kCTPUwc&rEx1Pih%A4!8x4MZ2VK6xgO%Sfz=w_1j4JOUHN{AKMYLj~m(G?bqa$ z8G+t}HUFFcNn2tuE=gq~KHLT(j!#@NQ`jpy+BdzuBg&4=jFFj842b3NtCaVoV~gMr zAQ5`XOznDwR~8khk~;SU_<}iKb3rd|H5R%w+Eg^_I-@_Q$3yUkpOg)gd1Yp@^)fvf znSCzk(82O}R-7pxEo|89KqT;;g$SXej5A3{PmBfar+g`yX=Sr7Ls0* zJUOK)H^4@%jfH&L2QOKkcmFWh0qZGV{_=U-K3@e$-TY}`paLxe6@$s-ygIEbW(;{v z8r1LPMRowwq|hxtFX_***7v9X$XRH#^p*Ag_&WA!0mczj&4`LzPWD(&O^1-U^ULut z5gIyL>TZ`lxI8tnc{GyhbnjlvU1zi>qU&&>?&!TokxR?U#_-5%T=6k{iLNQDE4Zs2 zG{q9-E2%E3N=CO*rTzNd-MP+DYrj_4%Gll;_CVHGz9csODaGOk=S1^OmMR=`G_97b z!hP$&>EoJ_WAbgm)rK}(Tj$~$8oM5u(GX3d|s(0h=#9z~xzEzJ@inh0bs>(2<7b2u z)1lZwRy>nd#}1EPr`wbn{7kIMd9L&O&0SVgaFPnykD z%6>1cm~(wGZiyi1qy(m9AAJUmma?o`;0VHcwSKB=DfF3^!cX*R_r7V`FG8=aWrkoC z2xXn$&C7+!NGteh;jR_;#Q@xs!(IAz{wv}9?Izs9j`70I(6?i<4Jnnv9i`kM*I-KL zN`+XvgR%lgO8p8fp}hD8pU~v*OT=V9dw9!u+xFg2>-!nf;qEI+T@`M&nu45!IUc)hhZ#C(@wTEKkgukM9)<$P}~;G4^`#ED+>)6*YrSqrmQkqs+ zZ>o9g-r-9p>=^Gc?0a5+{FQ5Th`;E0#&W&_J=s(?Z{;2Adz`m!mbzwEz_=s6M9H-I z;H3#=4WE0&R@+AJHJv9u)8j1AElZ?(#8=y%ZKT99XQeErFem>E+tM8zd&S{;Em&_w&AH0it&p!Eu;nkC0gUTBB8}3{$ z_U^(j<3GFJ8L}L>6?IqG#C^8tuG;-;FSIVzD^dUQt5)2vq|xbmjrczU#`<;t%h#4n zpZ20`ciiNHwQDYXl><6YDm2^cCaa$)$TbHq3B)a}QZCk1Z#dfY`sE7a2&qfIr*wvK z?+8keHSGlY{~mK1_ZnmN7@ZA$vyLQWdKe!_?-5@scJ=rfA82?qU0-?5zgK8&Fq3_FEpepbDI zn?q?#jcj?CRJ;0J(`A_tn(uw(y;|?|aS1S%nU{Zj(d1d^xW+jHgDeV zoFCXe*j_!CRUaMw;fv-RYxeSYGGB74CLRoGzRP@%aa;Spxwmf@JZ!RFdpK>wl>qAl zm2RC^=dIPXsF#~(uWvTxmqA3<3h5qUU{aiS@a*iz{)-Pv=$Kw<=P5eBYW~~Y9d)&T zGEF3!m$FrPeDz9@l$M@%*-8g!@fTBr(44Kw#~&PQPCA__4-zR~HTzxan>Po_?~6wJ z{RW!5plG*t!^%w%=`9RXs`JmD;o0*gXyel@{2&u~Ux-ELmW%t%)!H`aTjGW*4(pkU zkA_(nGKqn^Vax#Rbgj-T)J zyuR+>%gb`HGg#QXe>EPx_cc7O?q~76y4~+8w;W&IGN?-NW5D#5(ZhE^?t$SN-VYA4 neSF#37xJ##wli4C{xFYrJK!(zVdqm|#mV65>gTe~DWM4fFzHB$ literal 0 HcmV?d00001 diff --git a/img/body_70.png b/img/body_70.png new file mode 100644 index 0000000000000000000000000000000000000000..0e273a5282910fbc9ddcc88964e2a3780c9e4b2c GIT binary patch literal 6374 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 literal 0 HcmV?d00001 diff --git a/img/body_72.png b/img/body_72.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ec4d4616584c631653cae713ce54bcf873af15 GIT binary patch literal 2764 zcmdT`dr(tn7QYBfkS(<6E@*kAur2Hgh|2H`kD>@#EkYqgdB52TOLztdCOqs+DiGK% zW5x1xfd&F5JVXK#f+EC<@>mQ(LV|=x!X*!4NRULxUOLl`vorm-&fYtB?%dz`&iT&w z`_Av4??zyNzk&Y8`TzhJoImIL6#!^$L64oDE`&He@Oc8gbmK1g`vRK%yOB<+0s#Hu z^S(YId9`A$Px-=X{_s-64ciADvaT0@K4wgEKiAx^gMEF>KH1gx+`_l6Hvep`6*mj? zYY)3DoC$A^_=1A`Df1ywsAc6QZtML_$8zBW#vGYgP@Pl$r*f0YK1U9^9!8v<8zJ4w zAKiO1DVi{ba`?ZwK1fgCY6GGfC671~pDZ1-Owa!L86y$y7TH>(D;Vq{;wHT{fAIOL|l23B(dc9ODNUX|s#$9}<=g?D2 zmnR(742x(id*h+LOn2ZgtyY{5L_bau+A38Wij^vbjLCq@9Wv>vFBM{t1oPlnW9is# z70scPDebAeu0U?b{w2Mpkvi3KLGe~zW-F(HehMyV(nOe#xkVO)d)$w{i7W4W=9Q|W zgG)@~b&%=@`l=T*=~%K#+Y_@e3KIf-Yn9x_c?kF8SAK zg-tp9$27S`>qI$}mB&1vi7kI8?b5+F{OVRT(mMhoWjik3D(+oQ^6p3&g*#aRA&cSr z=F?6w=E{>#T5)rFH5aE)D{o}jW#a0;hgf`quZ5}83tdDMeLB;qt1{yk(obLV2%^$4 z=pY7T;4&^{^J0zY2G}dHw^E+uolxB_ zM6OvgGu&fL5azKKZjVX-RDGG?z=3@04yt}ILxeieL*Ul}rGvrLp|DDiuL_a$F!~Jt zxvj>Xsz-U$1-2Mh?jY&_~K^ny0p6R}l#?!zaj_ZVy_oL?EWoUnU1yU6l*-y5!T)p)=Z8>7 zDqw4}=G%B!8dlOM==Z-xE^OO_B1O0Fb*svJ1Vl{Ngk)JifrM>`w>SYah{b-4RK@Pc zY>3jt7XRURi)OVS*dL#UEd)qry)8-#sR-_bL{f;38`6(D13SX+8uR2vm2Ky1#)jq9 zbr3DGzn8)9oqDRxx?LQ*<-xu|6V1Lg*xv)sVEPr$Iew`+?Y>f?mV*eGtBE5- zv$iZRr`H`-chyK-#e$2t0g_!_oAKh0I49Ja-Lh~122``5;-_;MC}}8zr|$8l?0GEy zF!t9H!_Gs=htP)qA}#z@Oa6VU{yn$X_b7F7h+sRTfg)P2=oq_6?Q{uU(g1fYkv6oc S$n^bl;rX)xzLe83CI1Dmd8?iP literal 0 HcmV?d00001 diff --git a/img/body_73.png b/img/body_73.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5ef38fedb6703cc24ef99c595df62f0f8e4061 GIT binary patch literal 1095 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyDQlzh*+co`x{hPYK4>@kU3A%nO?z>b-w~pPP@8*3CXSWr%$%tCpa<(Wxy0J^V zVX=>bfdB^&3lnqW0S7SC?DpB>35%1quhM=U+mwH+;@{72=jTQPji~)oIQMtEQ(xEJ ztj}AoXQij_?cT6qZ|rS(s|)>IbMH7Ns0c`Ku&^;THaa9I(1^KV=R4LFyUWGv8UNl) z|N8tD|JDB0^6M(~SvHwfSC>9^i`^gBFL!lg^4ABBf7kActqq;KsxI{JCaaC-QvdgJ zrtsSRTCpx>@_3%O)kDy+1!~?|$6re)Z|A z`KP10(uGcR-PuvN!(v`Vz~6r#k}VV(*POVWFaPG;N1guFuiNDhGjgV|zPq=!oqxLd z`_r%1pO!xEprHNXr25v48~0QmU*$jDysyzA?7`>r;?uvR-dz1oKVOEqam@iE|Nd2~ z{mBXwL@lbf`RRO&ohW>je;P#X(&<_C^_8FZt*YCyr;vwb6O;bFh~<8|`S-rB{tPky z)3e#9J5yHw`ugyAfdfDgFCHDOdOkN_{N%}3VP7Y!zCYrlp#AOD>aPdcOP~4V=Gy-L9({G@EB~w7_dn*@ z_$p)kD$gYTX`xlxZPa`NNjuh(vW_3!Vl z;^lew)`-Wgm>+7s+FCbG{ip9cnb#^4lpp;0xvOgHyy|s&Vd0EH|Y6CgYu@QtDnm{r-UW|!?VYs literal 0 HcmV?d00001 diff --git a/img/body_74.png b/img/body_74.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e1f5b8c9d99d9f2c378637ee4f0004fbfc36a8 GIT binary patch literal 1366 zcmeAS@N?(olHy`uVBq!ia0y~yVEh7Pr*JR<$^T13wSW{`lDE4H!+#K5uy^@n1_oAc zPZ!6KiaBrZ?$4Gkmudg#?zuoMXz$KdUTn^4$pzbw&F*h{`C=)H&9pPB3;#Em>{|Sr z-(@mqN!N9URjNy5gEy4x`ew8_N&kNlR9?{aI>GzCwfDZu&*zDo|Kh&Cr+J=+VnOd# z(@i|RSKn{8P|^M^WxSBTdq?P`ebK6~cZY6bymQK^YVRg}BW^b4O^SOrtv3{AoA5Bq zlPzy*&V#U%RRxRRSbI!TJHNv_$l+M*BqpPGlSC#IPG8c{vs;BV<&LVR!ec#8M#*wd zt`h^NBri=eGVGh~s@(kk^z%3FKK;NiRlqHFYF|+5+k?h8TAlA?@oe{c9#+ZQkT-p@ z@OlaptybegBZdujT)rC#`*+5_I4OMXdgbqF&CTBR z&lu|3^&cM3-V?!U+gMt`J>CCl*!!KKR@--3J^r_Fx_;${hQo)K$lJB#KbWo=zj9OD zA!d)+r`F!lni}ofQfUAD$Bf?IE1Tw9HSqqZ&I(_(Ci#ZPKbCn#t4s2xuG<#fn|9~? z&3oscYV^|wVJ}~8yBcxq@0r)vW#q+es$(|q7uwghD0pWmAJA!e(Y>j6 z&WrrJbxw3&-kBAv|5V+5Rdw#1()L*jkL#9QPRv{P;HKq|oJG@D?%)%ddunY_!RnII z+gUn~>(WwNCr@rl|KE6Cy=rDxbR(*XI{KHhL~VW>>iB*!65Y<@y1Zz$%pI-RyW6Br z@0kDjMc~AJ<_~vk#w>dzC;Cff7ciK;!q2aDGk*8nrsl-k+dKWYKDZ5*b@~VOAw>4f z*^gf`_w6%J6t|moYpPZ@-@IpkpxSSPw97}uKK=Ok%D($;b~T1~r9-c4+4%jF*)=s< zwP-*xJ`4*_zoTFFUhc5s zUA?({XP^DP{^o8=Wrh=bmBE+aObp)>IAUKoeBOV3;m)hAceLh4$4*^;Q~LLt_nS8# zzPr1I)p|qxH|{N~{=7NNcjxHZJEzv3s@YXn?7wl#k!Nb2DF{uh61;GW=tGbgy0G U2Gh|5U_r^?>FVdQ&MBb@02|1iP5=M^ literal 0 HcmV?d00001 diff --git a/img/body_75.png b/img/body_75.png new file mode 100644 index 0000000000000000000000000000000000000000..e936cbb1748f29807c67cc47576c823ce481ae2d GIT binary patch literal 4395 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 xgBuzc6FVhFTXY@OTUhQ9y+ literal 0 HcmV?d00001 diff --git a/img/body_77.png b/img/body_77.png new file mode 100644 index 0000000000000000000000000000000000000000..a63435a7fd4e3b49a370640504ec1b50161e68a7 GIT binary patch literal 4269 zcmeHKeOQv`8h=sKZM9t5mTrFZZI+pnmdP|Nou)0x_Oh0RU3?o;7Get*}}T{#k#!Ei@RIHvi5wu}c8p zqi@54HzTqbn%*0HCV?q_MXa@l$!|tD&MUgxa5~&Vv|z9FuA}$17zaC4MFQ_!S@ao< z-j*gh|KH(?v9d-vJ`SW?30UGAu1sL@8M{mlS^kBkVeM7&L?q?6Xm zBbJNQw-xf;I|x%b%&NQ=gssGXE}=#WH9n7KEB%Ly#l?(mF5A*;M2{~m2Y2W3J+Awx z9WL((Z5cfY%h;>^yb4AUMNHp*|I)=L$$G@0y`An^lDN@b#Z3dX%gNFe`5tX$opY?l zflZbc05GotgazDMwHO5F^}%}p;C0O6f7zUIPz$M=yGZqBf@IQ@E*cN%CsbFVk~*Fz zVwl@iBDQPW9X(L%p_2qHZPjdnl--kZ2?o6XBtEt|hA59rZHb*mHpMhyocYa>lqT4Q z;ma6h5ziTQL$2N(k z1W}W$Dib=1+LyUX22Y;uS5wx~Cw#I!l1s!_1m*WCG7W0`N&S8K?$oD(Ml92}x@-S| z#xcjj8*y3ZUC7mnoD9NHe~2fVTGhPEq%6eALe?SZ$W%d3m(NoAtrhe=MdB-Ryo(*= zR5-+OWUy3yiLJVSvV6J`&Eca0Sfr}8hIBoGOCet!_}o9+ zXVDYP=mQ~+17)~M_a$FSeSENc)&3pp;i}&dH1M3Qu4&wW9nR9%JuK}e!O`}&m(cUy zA-lkty9g_8{;ZZXG?HJHtqN6BwV|v*3kRKppx?z8hcP6~`SLR%7}&k~fu8 z=Z!JVtI|CA$YE|Ok`?BXG3!>r5~ms`!FGq^q*BQgn{g@w5=|>{Q{Qt_PfenAV-#<= za|Wz?b?)SEO8j>^^nYmFe~|ffg;`4QjdP_FDqA&mI@sK*u5Pz-asfr;^bM&Bug4RF z(sJ)9vgv9|wSrfG?yG8!b1qK^QF>*~{RHrOBH_T1eY`{1rl=;QNkSqgn{X}M<|zLi zrkqn@ho8GI23iAW8wYGGZCNR%=?nEysqOqU&-jI)4~Kz4)g{&awQqXYNYNQ9t@cwv z0q|;-s$T8qgB^?il@Lu3$mO2L|zWgNp_4Qav>h}bi5R{8nKti}I$&t66MD;P| z$ZJ6PQx?X4r{|%fvcVERqJ}IpyI(@CgLywC5fLqn1OD+Bma!x1sK&pU|+PgntI!)h|L7+G3hw-4eHxKC`s`V|o~@-mZyZi!Pj7cU!31$xd%ebT#xAwEO>{fy=bb z5>Q?9UYtMkLW4${yGVnJS23usPFHNW{q{9PA|d^zo>l~M7f-{TsRXOKj}h-2?>Uo) z4r#1?b;fmLkCht80M8^1Qh;11h+I6e+;s@k%@dXo z=nin{;j>k79Bm3Aq(3CHlWt1W4+b&jI(!9=E7s%-B7_F@x^A`OYXr4cp^cvIrtoS? zbKG&8lokCWa!UY^jkK#+ow8)`U=r0V6H+hCk$UE=H|O)Gh)R5`;pHbD?+iPCP|f^$ zzWN=PE7Q({%1`1~>r6?C!-Af=^{ewe?*A;b0aHnd<+Y$UyU6-BjR(rK3Dn%qP8 zm86<$#>$l&p#QcDAE_`WDqo>$!fW&Qb*#!iW*+aH+PKo9d#J_=<6t5;h4m}@XS_`Y zzvEnKsv9O{^6PRiS|_mBm4TK1icOj%8O~^OD~g>_AZhv)!$TkkWjYcF&?nf4& zv9hd>E5pD&PR$S_<}8v8?9oN&Z>iefqNTx|j*<}9tRw5d-hn-xd5)K<-ghE+=sXBk ze$9=fu{PUW00PnKI}rpp;R2nf(^ON__nNkfyKN3&(QW!P+~L^E8~YG;(dGskZ|BB!<4%$fQY6R~Lm6w2 zhc7+)S1^YEqj`Gvdf>za??OtLfdjS4`g)P=%fP!0S?8WO^mied$)=+>UwCFFY8L=B zTLKB}-T8XWouD(h<^Srw+nB1SmZp_y;|2x;grkyVa!$$xh=K?b>6(sx5=N$&*+9_N31%~}m+IJ7lufo2H2(H-@ H|NY+qo9;l` literal 0 HcmV?d00001 diff --git a/img/body_78.png b/img/body_78.png new file mode 100644 index 0000000000000000000000000000000000000000..da404a5093e9f0f790c8523f4e286605865d37a2 GIT binary patch literal 5988 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 X8gy+_Hue$t6eS(pM+>j{G@;-xUb7qm literal 0 HcmV?d00001 diff --git a/img/body_8.png b/img/body_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0de414dd9a89cba5de8a883ea48ceb7c3f14272b GIT binary patch literal 2442 zcmeHJ`&Uy}7QR#zkt%h{07^k=1F;LNgGQbS4@)JNM}oBjA}@Jp@I~N)#*kPTSfy2j z;7yYV2@jP*Ssjhx6;mMET8LL(ifi#Eh+F|1ASHps5QMoE{bBxqnKeJmI%}PC);?$N z^PO*>Z?AJHoD#Ho)AmgO0Bi=yfnNfE$pSWixN!s4J8b)K8XGnwh6DuytADo2)*3DV znEQc&0bgAZ&5rgI#4g&m&(ofht4okfNB1J~Uz>y1b5sAqFgNK>cf8STYLk16VA3xm zWakw6M1ql4lg?*YF6`;1ylPR*&QCrhNbYCYUZUS zKkk_E@9-?n1*G7;c*(Wj`cNK(%mLr))8R2^F9A9R%0nO$l8xu6xYF1#jRMEP8yW;c zrB8raWrH3j3ejPLx?~JFQ7U-OabjlY>rV+Q*M;}t!8i(}byyh_f|SV>CN=i4$*z+w z$oxojC*usI`<0w$*Tu&+_8LNMwDulw%jmCO_0H44_X{=4bsQ{U7olRCUuNzWf3L`1 zc3)QXZM@+|oAyKi7H6s+XR*6n>Viz|F88n~01sY_&s}9DYE)Sq#xpZ&=-098`7O)O zE+JwSN%@Z*M7=;xPqVA2D&thB@0Oqk;Cs>wCxq>wbrDWlq+@U0K0(MnTsFOEJ!7kI z_DL+|+YQ)?;Gou`#8kbb)PhvP)I^;!9aAax_RH7L25}#G6kY5MUz8}@X;wols zGLiZC-k}*c+|7X`@M}f{I}bhcXH9kGVvKYjraHN}%$7+R^t$Zqx5i#Odc%i{FJ7RXB`B01H_0(q4d_R{qav*CF!dzG%XmjVj5wa{jAYCV=frJ=VUkyFXAknqCz!k97ZWk zXKT%Rzk{PY66%n(D=H?`!JRB_pO|C@ST?~TswM*NBJAO@1!x2u$vuOQ0wHgt78mk5 zCL?tq>Bx+mt6#Gs68TB&JUom%3Wk<4q2Ir%OD>Lc6@{f1F3H*S*U_I@En0cI&AW_^I zS#%I0ji(Vw5@Ou&QdG&9=Hm9$7zA^pKbN4%Fg3dM3A)QUd8pR9N9gf}?hqAgCfL`5j5lpvw;HSkozD(l7Fg9J zymRFXMw&mKwolQz$KU#{_Fq3Z}a3Snn5*@_$$)@!_D& zz2*Vx`%h2G&CW$PaXF{f;cF@;|=+h4fXWn4>gkFWI z5rX&a7VT5NUDO?+blX<#lS@K_nqXo%<{p|94;SK^Yvk|fK02HfUnjXbdGbMw>dn3`dO}c7nd&9WTKL! zzOH|kR?5+qg=zO!bbt|DV)3NV`=1nL6F-??s4usxUrWl!dCoV<=NiooLr1mgBZZsY z)CJVbb~$^vF%-=dZZ#D84Eg0%uTcK>VGm6(5LpKDOP-u?i+=N}V8kq86`ki0Dq@$u zyw_jCdZ(NVu1sWS-nbJ3*yaD&q!I`)%X!b#9@z9j=Kqf2*f<$drHn~;f_o`-KnmvJ2aqxJ`0(&crn@HFA(Z2g_;SXba5%#$Pz%M9)w+|f4{TDIHJn#Sj literal 0 HcmV?d00001 diff --git a/img/body_80.png b/img/body_80.png new file mode 100644 index 0000000000000000000000000000000000000000..7573f415fff22ed015cca6dd62e605fc0194c763 GIT binary patch literal 5160 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%0D8|@ttIpTTyqnzkQY7l%Fg)uHq7_4L7~VBD9XbC? zhHt-uB-7+C8NPjsrKMLGSx3qgtoypD zNH8j%ko+R3w@WPgKj=R$#HKq62MW`b3auV(CfLmiJjNYInqlXr#3`XZZ}LJA`c3fDbrD(U8g zCShsfxm{J%*|KAZ#oOpOJZ)blG7<&? z|Kb&2kywuS(+9u`5v$B(AeF)vcEa*fcF&w{3v;O|p_(BgSI)*~|NB||{!Ga_(Zj#z zby=)@Zs??w*>bk8BQ<^ND4E$Wy7^bNhr=ne5nGkg-9{^~^#zz*p=0FOOa?`&t2Rn1 zz3T^_`4F7^u;%T;^FRY-7Q~Xkn;g=-$k+e@F~x<|qbU$JP+a@XHY(Qg^7&@AjrZ?% z-V#7pXBm;jH`9v@caMemN0vvXVqJA>tf;&vq<%xi3I#@Ta*Z*T|1L8KO z1UcBqXjN@SW`xprl^kc?v9p`+mPEJcTpID>>YJK`X;5_#0x>xzyU0e}&DShKEi+*yKugs6kD@WYrY3iTu^7}^h|G%oS zJv(J;A~i(3y722J5?Lkc`>R^L=#<&$MvX7k;=5ALxOWT^?ZvMBK%EaFC#<9Za=a+P zWG+hfX^P2QIR7#i6{L2v>9~=-@Q7>H1yDYXn35ZHE-6x(fcuH2FHVE!=JIA!kLbhT zBC@Xuxt3!(Y>?uc5?k&7zH3qg#78&b0g*BqnPDos5yf~59jCra(x-grnO4gXGqP^x zvliOfeOkdC;EX5GgAaIh%6oEojD*)kBHy~0-~=>)Pe>(eiK^y-P>y?m3d;Db(Ek~W zQV?*rugVK7)QmlcE|H`iLTDViNM&1#mZIY}#4oa58+g70^9L2pzaM=6XU+~4ZL@9X z4Bdk+L1nNK$IYV|6L&hGa}eIC0>Bku2sli#5HM*{9sW%_YyKYd$xkA-YdfYuESLiD z03AC7jOkTY!8>D!(wcG3`u?uV?a$1QT>NbY^YnP@&__mg%jy@36`*hWVvHXS9amuL zSrvBDOXd3yNxOpE_aF-U;|HzC2$M~Vj&+@dcSiG=c;tW=IV!q&UVkmZEiW2DA~B?y zkc-$!d!DHo@CXtj?M$&@m#JtN+R|}&Sh5abFzws8$G>7QX04$$Y5mJrjKiBY1=)O= zqcd*OtMmoiiYLgqFLxWC8B-hk|S+4;z1Y%CLTqGzw3BUbcc zg7NUEiZ|C2z>+(Q#`4M?mO}jtHb2Y>A>i^xfDF(g@>*?k(HyByzzl)2mq(XC9Q6ZuBw()V3D0; z`pAhtA@6_d+fZ8P6$|xD=JcWR0MV1>-?XG&M1s5ZszZ-%!Xq`vh^q=ccB`uh9z;H) Pp|)-g4d!l){p7y@^{i&s literal 0 HcmV?d00001 diff --git a/img/body_83.png b/img/body_83.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ff67dccc52723e1c6a36e0da02b63ae669694c GIT binary patch literal 5968 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 Oa5(B{Q}r*>wf_UEgUapz literal 0 HcmV?d00001 diff --git a/img/body_84.png b/img/body_84.png new file mode 100644 index 0000000000000000000000000000000000000000..177073cabacc6e83f7aad275157260e0d1899ca5 GIT binary patch literal 8037 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 U2Gh|5U_r^?>FVdQ&MBb@02|1iP5=M^ literal 0 HcmV?d00001 diff --git a/img/body_86.png b/img/body_86.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1b4f0c80c057bee5560895ea5034aa993af124 GIT binary patch literal 3139 zcmd^C`BPI_7JhjzBtQbF2sFEcXv-cYMnEp*%S0ivFF_KR#Ip&iCheMlPR+qB_OL!e8f;5k~P;nys zI;v~1;Tnml(OO}9vJ1M$Zu-YM`Sd8x-X&m%8~Ohm1TP^tdIsbJR?%Zuq++0$rsqsz z(28MtBpFpJS?ZPtCeCn#T9qhga1J#GPVE2kdrRMGxhEk|1*i#Fp;&YUq^A2xe;vq^|S>NPXa_FKW!FOTXv1j(#T$T$3zJTN;89UW`e0x^Y zt-feiIKHr|RC1YrqG_K`Cq`iKCV|9Vtyk*3HCZqkGCjYy>Oq0aeLt1qdqiX*Zg}r$ zp6U3=9I%VojCp@-N&RFehFXA_%QV|!pR#7La!%P`0Iqugp+xKeruN7?;7okUX(>(< zkSWf2dzP_OuFj_a*P+2_!<&j!^`G=M<3pJoURrq-rIiho16Lgli|+R+F@Rh!1Za5J zEqOLLa!k0J8ip12lesz8fGqSHRwEoyXdwy?Pi65rq$5k`U+&8{eVf<3nzy(YIXor0 zJIf+*<~YKA)GhZqJxmjnIwk`4VtA#^alh?ay34R<{MFGCG>VJxld6T*II*j{5E*1? znABe|(_sCMA%SRBIz~#b6^D7BeoHDeXz0+W9Mt}N4-p=G!0lon}et5<7VxS zQ_ol7RagUA@FKAbrgN;z!FC4LJut1T)XicsPF@tTk(5+xMaBR;OtOrUiNW@059haG zpUUQv<1b(I;&q9tJ8V^UGv)jl{EtJ6TSS$xnoMRJHtbqp!{kt>3ftJXe<3Jhhm(7c zztgMlEKGajWd26$Lb(;G43)_UmG0J`IknU?W)|J6 z$-L4t=bP15XSdWDqoWGf5QXnc=eR!B$L=OaHQaA+@6Asl{hAgWl-N)2;Rd&RS5MJG zUqBhe6%~IgcC@p23nOWPC=%C^d%=<9(#`nLh$Ne(WzfebFFQx)$}N#BArqVs`9! z4*V~5j#F}3D2Ot_>qFr%-UB@VqL#3gW~Bu zl=tq*{|p7|q}8w*$MeJj>bTU)bwLI;l41mUqFo`%h-hd(qHcaGC|*Ug!;G55d-Wu^ z+IV76OEox)XqhfipXxVo1Zf4siQeJ`yYhK={q!jAJv4`&!aj!n2@5@sPHBNhORNfw zDf`Kg;6@!YL|%WVmu)C&VZYHlF*T!ZeW(iKjcL{~c~+Eo`p-s>ImI|mN4`askY5(h zw2Ge7pb6EhMlMV;ufvpz7QKp$?9;<}2dRQYYAOFH8aANUnGW-!j9DzJ5{vyuRXf!N z2CA&S7Oj70cVA)E)T2K&V~9vra#Uf(q2)QF=w)DNhz?;p-)t!J>T=5`|GLXl>7M_;ofbzdR%-oALGQY=TAj@2UyHgEM}9)DMRvY2PB3W*5G# zvJ;G6;IVQm?&Y0g4bwPqkb)of6sOv0c0Y6j{O=*Dd3~fY`F!xhm7N?Rza^2LhzbQN z1{*W+MIhE^k3nM+ZCvlD-<0iTLdH{S#*(V5b<^6b z8MnI=t-vwtx|BCoRv6}h@=0Fgupd*`Ow3~h{%VN<3L@ngv4CEU9=L@sx~i!3VR2@* zYrgRvJ(}L*WK`T?9p|5*?wY&t5@5)~6~%Y@@8FB<6cv9^kl#M7tZdKnu3x-3sCL#9 zGK{ja?Gf)H2TN&K=pG1_5Iy3UNMQP*=((32_I0rhbfeeIljI#1f(aJ;Xq*lgmiyeM zLrB-y6T1xTF?VG!7U3@Zb)_}W8<&xa&8eXmn!~)X1riHj5c(=>_`zML7QNFtpILk;-$SsxpK1Fp-pKfH&^D7&;>{3`$) Mj=I{EA0{XL2iv+5JOBUy literal 0 HcmV?d00001 diff --git a/img/body_87.png b/img/body_87.png new file mode 100644 index 0000000000000000000000000000000000000000..b8203169d8f5cb6bc00bcf9831950eb1bd08900f GIT binary patch literal 1903 zcmdT_YfO_@82%j5E?!`X83>5Dh;;>N2?!fsDK=1^{3k-rt7+07jDtkNNyFWd9{BKOccrQGtFwz|!(6Z|AT80A+*s*%gvm z{7Qa{a^R)a-8X*Fsr(;^(ML#m=P$s!H$Sz1IgORolwc1HS#Dq-JrJ9`xq4%Ync1nW zeMc`vvPt`QU0BH-I-GJR)M+g#Huym@1MqVXS>_OiV`@2PCmKs$v<8$+U*@DJD5}8sk2o zc-J2nKURdMND?rh{aCPsQwV9G05DJ<6#!U7wip558LiC#fcTT6#)vx(!z+OD73bUlU`OYFTI@;v*?oili!JkXHCrJT z9ZGc?@=sbvzxF6=M45Z!hO=1Q=%UUcn5ChnhPyn6yKFORg7~d0qNR}PWN9hfDm~kZ zEkgH{)|WPml367&c0)l@R%49YP=Ly&fZ6O_mf|k%fd_dq0uSot@b=m@DjP5JuBf?> zDR@{~*Ioj{!$Ou{fm)k*vA`qFeSkZf{cu*MAUe7(<(1-7-Kef}u05|GBvumJuMi{z zNJIX>mS2W7+)={D-FY`iQHCr^zjB=v7%#p+1D^<@OA?}!Q1RVo6Km>lD z`w5qYeVd*}x0JnEfO}?6;~hz(f(kOjj3OdMf6Zw1>kz{VNrxSSlmq1_L$-N|L$T^+%`WyVH2hH;RMQo zKAENF#MF!JSPGp|-no4+0M@Vht4A@+2{EiSF;`jZ)781^xCAFElU6%ul)qnql$C%P zGd30G&|7jqRU}f_B9u5TV$o{rYOxM`E_zsd;E?>JW;f&OST`;7#nGALO$2^KAeVxH z^$j1`atq^+A6F|uBrevT%W-+<6qwDPMzdnvbT*{GCKkT#s(aAkPbW`g)7C~^__luN z^?GV?!DvL5F_R-oW{Q!$tAE0LcDCc=5d0WAPY|-_O5&*c9Vk>c?!_gq0kR8L-wiTt z=9wo%UQCjDtUuRWI1hL9g*T4tgi<+;KX?aejf@(TjGA7nDx@{9N#ryPF`rS4{3HLL zLHWtyezMUZ%Be7UbO!6XTZ{7awQN=RY6p2QwdyFwr1y@BG}L{>1yn{2Z<)cpt%?+! i!Qfr?+sbhE(h6goD3|YiPKf-V0Nyvqr~3QI(|-WCG=(|< literal 0 HcmV?d00001 diff --git a/img/body_88.png b/img/body_88.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4a0ad70c1892ecbf0bdd64359bd7460165df69 GIT binary patch literal 3324 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 literal 0 HcmV?d00001 diff --git a/img/body_89.png b/img/body_89.png new file mode 100644 index 0000000000000000000000000000000000000000..229a3f9aef8d321ad489be28c82fca4ae61d4202 GIT binary patch literal 5963 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 R^tv1XjvV&&;(rv9{%1@6jqLyc literal 0 HcmV?d00001 diff --git a/img/body_9.png b/img/body_9.png new file mode 100644 index 0000000000000000000000000000000000000000..1f3324cfd91ea226f3e57d08363968a0ad11ba79 GIT binary patch literal 2103 zcmd^BYf#b&5dQ=A$Mbm?Ug6tu5>NAil2&RyQWFF*OnaJ=Saw=TVTOeXS(;rTK1#F9 z9$H;KG9VdO3MNzJWn#fqno*J_wlALH@h>xo&D|3?Ck8$Zq`O(kiL$I z4gdi9IBYA$S@=iAMG^I!ygZYJl>Q{Pf13k!keKtbyzdI37f(?;kY?Z{SP zg8w0*sFpw$KAX{@kET^$MS?`uSiU={rZM{~slnHsX(~8OKBqKN^o+J0U$PI{BCrvA zp|=XphRFFdL6sIUsc?o~Bg&)*`5Ae+%6J4?HJPpWQ*Sd9TC5TD$! zP14wN%J8(M_45YrQ9E9IRE)num^r=m+npIQ!&jRAtIjYHp42qrlGCgbDM3`i|guD`+e-q+iCK0tKTaC z=cQGmRUyOK!Em|JUYp27OPRy?(U88!s=Xop$=4-zwV$;W7}-p~r&K^`q1btSF6gI~IrtOvz=gDq2(Rf_bZ*Y_T=9okY8^CMlpM7B(iKz}H{RmNH0Rve(m`D= zF;g-0qoa%=YMy7do}k z7paYV)+T9ZAP%&(YZEpzJnb#C1%WRDUVu)vTW<|GMG+9V2K|DBYI8U3cTjXbxpg<1s;klaVLv;Ltpk=dY|k`;F-JWXo->4T1hMyxweNuJ^FmAF;TB@YNQr*B*HC8 zf^=~7tJ9@WQnZQH`Wn6?XpD#B5<*PGxOI!>JcjhgdL1`37v z2TzQV%#~Z@Zzu3{xmMI%?OOq)u;`AuY#6H#`;wN2^gm1>_IqZOY^urJ8g}o$-)v4W z-C!70cgkId`TEXL`Rnqo{@L{C;j@4CgdczY)Dp$Va;3Atz_6tZPgOJ21;ycBJyvB3 z0|l}kR00*yl>*c@aOKMCheeCVtnw|p7-kkePPEZUSB@|h#sHPro9*cD7r(Tle{~<&ILKldO@gY& z_a?ec>r-kLf8}|CVTE@Gx@qjV&C2)dZp-eLFz(Q=}5+dwMZn^JwKUjb;`qFIL0|gPrq5>V79L4C@N5yB@`Be ztsT(=4V}chJ@Iw3nGrNvD+$zeb`9tN*(smN;js*4kjiCA9w|r)1&x8>@vWp~8r~SF z`h#5{K!~#m1V-2W1hm^k*|0sD6I>`UPkS$JPW0vBC;$0;ke44L{UcdO3_OJJf z(e4$Ma`(&^F1$DNK05o(#kTMjxZLldQ>r=3>eR9i8K|rEnoj`01rh_Q){{^C1;b=^ A!~g&Q literal 0 HcmV?d00001 diff --git a/img/body_90.png b/img/body_90.png new file mode 100644 index 0000000000000000000000000000000000000000..4f29a049387dd3fb81ae7ff6188e764aa505ebb2 GIT binary patch literal 3141 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 W(o5DgODE000DyK=+)H-_pZy27M>p62 literal 0 HcmV?d00001 diff --git a/img/body_91.png b/img/body_91.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce66ee76a6ff8fc489939cd5868c41f06a46cc2 GIT binary patch literal 1175 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_lb&KStCwd@J^4cV(;CM9hYVQ;jMMWIq-O=R#olOq`9ipO zQL$#m-o)zJX_Jd)-i<9Qn^Csr9nhycKmB3io=_64+vsZ1x6g>*|5VTf6&<~z8lTlq zFaHeDs`IbdEB}D|hj`XqyG3m21^n~=%`boI|0^h9bz#}Dz123lKO$l!9)|8e6dv&Y zx%2A{tom-XfpNSWM6SHf$^E!!Lvm?)i>%a!i{F29Ent)WkXIu9^y&d`$F;|fvAyTA z2=jNl@$h5Ad+i493Zt&*Pr9dr3JMQSX6m~-S+MNKw&&&M*H<4tsF8PayN`651w}F zoqCMp_Fv}Sob@>eZa=&?DgWm5Cb#D8ty0>(g4<62Ir&#P&T^jJv-{Cnx4=dOJ&Sjl z-8LI)^ySNUbRb4AzW_8^?T+L--JjEHH8ae12Cvw7Ng{E#|AIMhr*7V01hvxowAaF8 zUdb)8`%Zp%=k?$r)ajExY-mXSngSGVo9P%I+{V6m2hiy{tWS;jA%T!6RVVY}?$iT< zKE3Z2?UAa`^bqRno1yg}!dCKO=={UwwflCbJrH=;_hZ2wsRYd#Gar7Ku)9@uwe|l^ z|Dxg#8RZ;E-5x)|X915ptKNsbUzRF(YD~AZ+H~Oc<`pMM~twSk56%)wrvGmcE& z8`zh(>VMdqJ*_FIbEoB`mZhrSzFF9AJ+SVN*Nwv>Hcjpy*#EHIzyIu}-5Rks%LV_w zh~fIT>+C|6)4i0$e#x`=Hbs z_xXlmt4`b8@3BkL33-?@^X%Cd*2f&To~jq)To7N>a6tuF(lB_s`njxgN@xNAheIC^ literal 0 HcmV?d00001 diff --git a/img/body_92.png b/img/body_92.png new file mode 100644 index 0000000000000000000000000000000000000000..98554abd5431175f462d8e207a38ad9a14df5d2c GIT binary patch literal 5470 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 Ms<&Is=fNre0WS?ki2wiq literal 0 HcmV?d00001 diff --git a/img/body_95.png b/img/body_95.png new file mode 100644 index 0000000000000000000000000000000000000000..396e0ab8dc56ae34a73ed5cfab3c59760ec8ae57 GIT binary patch literal 6623 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 aYuTW~@^3X>81k4#0Cd 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 Qy8`%sw{cC`>gddW0bt)3d;kCd literal 0 HcmV?d00001 diff --git a/img/body_98.png b/img/body_98.png new file mode 100644 index 0000000000000000000000000000000000000000..39ffec77827ae4ae2b01f88ca70e5d7dabcf01e9 GIT binary patch literal 7481 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 literal 0 HcmV?d00001 diff --git a/pyrevolve/revolve_bot/render/__init__.py b/pyrevolve/revolve_bot/render/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pyrevolve/revolve_bot/render/canvas.py b/pyrevolve/revolve_bot/render/canvas.py new file mode 100644 index 0000000000..4594007591 --- /dev/null +++ b/pyrevolve/revolve_bot/render/canvas.py @@ -0,0 +1,265 @@ +import cairo +import math + +class Canvas: + # Current position of last drawn element + x_pos = 0 + y_pos = 0 + + # Orientation of robot + orientation = 1 + + # Direction of last movement + previous_move = -1 + + # Coordinates and orientation of movements + movement_stack = [] + + # Positions for the sensors + sensors = [] + + + def __init__(self, width, height, scale): + """Instantiate context and surface""" + self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width*scale, height*scale) + context = cairo.Context(self.surface) + context.scale(scale, scale) + self.context = context + self.width = width + self.height = height + self.scale = scale + + + def get_position(self): + """Return current position on x and y axis""" + return [Canvas.x_pos, Canvas.y_pos] + + def set_position(self, x, y): + """Set position of x and y axis""" + Canvas.x_pos = x + Canvas.y_pos = y + + def set_orientation(self, orientation): + """Set new orientation of robot""" + if orientation in [0, 1, 2, 3]: + Canvas.orientation = orientation + else: + return False + + def calculate_orientation(self): + """Calculate new orientation based on current orientation and last movement direction""" + if (Canvas.previous_move == -1 or + (Canvas.previous_move == 1 and Canvas.orientation == 1) or + (Canvas.previous_move == 2 and Canvas.orientation == 3) or + (Canvas.previous_move == 3 and Canvas.orientation == 2) or + (Canvas.previous_move == 0 and Canvas.orientation == 0)): + self.set_orientation(1) + elif ((Canvas.previous_move == 2 and Canvas.orientation == 1) or + (Canvas.previous_move == 0 and Canvas.orientation == 3) or + (Canvas.previous_move == 1 and Canvas.orientation == 2) or + (Canvas.previous_move == 3 and Canvas.orientation == 0)): + self.set_orientation(2) + elif ((Canvas.previous_move == 0 and Canvas.orientation == 1) or + (Canvas.previous_move == 3 and Canvas.orientation == 3) or + (Canvas.previous_move == 2 and Canvas.orientation == 2) or + (Canvas.previous_move == 1 and Canvas.orientation == 0)): + self.set_orientation(0) + elif ((Canvas.previous_move == 3 and Canvas.orientation == 1) or + (Canvas.previous_move == 1 and Canvas.orientation == 3) or + (Canvas.previous_move == 0 and Canvas.orientation == 2) or + (Canvas.previous_move == 2 and Canvas.orientation == 0)): + self.set_orientation(3) + + def move_by_slot(self, slot): + """Move in direction by slot id""" + if slot == 0: + self.move_down() + elif slot == 1: + self.move_up() + elif slot == 2: + self.move_right() + elif slot == 3: + self.move_left() + + def move_right(self): + """Set position one to the right in correct orientation""" + if Canvas.orientation == 1: + Canvas.x_pos += 1 + elif Canvas.orientation == 2: + Canvas.y_pos += 1 + elif Canvas.orientation == 0: + Canvas.x_pos -= 1 + elif Canvas.orientation == 3: + Canvas.y_pos -= 1 + Canvas.previous_move = 2 + + def move_left(self): + """Set position one to the left""" + if Canvas.orientation == 1: + Canvas.x_pos -= 1 + elif Canvas.orientation == 2: + Canvas.y_pos -= 1 + elif Canvas.orientation == 0: + Canvas.x_pos += 1 + elif Canvas.orientation == 3: + Canvas.y_pos += 1 + Canvas.previous_move = 3 + + def move_up(self): + """Set position one upwards""" + if Canvas.orientation == 1: + Canvas.y_pos -= 1 + elif Canvas.orientation == 2: + Canvas.x_pos += 1 + elif Canvas.orientation == 0: + Canvas.y_pos += 1 + elif Canvas.orientation == 3: + Canvas.x_pos -= 1 + Canvas.previous_move = 1 + + def move_down(self): + """Set position one downwards""" + if Canvas.orientation == 1: + Canvas.y_pos += 1 + elif Canvas.orientation == 2: + Canvas.x_pos -= 1 + elif Canvas.orientation == 0: + Canvas.y_pos -= 1 + elif Canvas.orientation == 3: + Canvas.x_pos += 1 + Canvas.previous_move = 0 + + def move_back(self): + """Move back to previous state on canvas""" + if len(Canvas.movement_stack) > 1: + Canvas.movement_stack.pop() + last_movement = Canvas.movement_stack[-1] + Canvas.x_pos = last_movement[0] + Canvas.y_pos = last_movement[1] + Canvas.orientation = last_movement[2] + + def draw_controller(self): + """Draw a controller (yellow) in the middle of the canvas""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) + self.context.set_source_rgb(255, 255, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def draw_hinge(self): + """Draw a hinge (blue) on the previous object""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) + self.context.set_source_rgb(1, 0, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + self.calculate_orientation() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def draw_module(self): + """Draw a module (red) on the previous object""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) + self.context.set_source_rgb(0, 0, 255) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + self.calculate_orientation() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def calculate_sensor_rectangle_position(self): + """Calculate squeezed sensor rectangle position based on current orientation and last movement direction""" + if (Canvas.previous_move == -1 or + (Canvas.previous_move == 1 and Canvas.orientation == 1) or + (Canvas.previous_move == 2 and Canvas.orientation == 3) or + (Canvas.previous_move == 3 and Canvas.orientation == 2) or + (Canvas.previous_move == 0 and Canvas.orientation == 0)): + return Canvas.x_pos, Canvas.y_pos + 0.9, 1, 0.1 + elif ((Canvas.previous_move == 2 and Canvas.orientation == 1) or + (Canvas.previous_move == 0 and Canvas.orientation == 3) or + (Canvas.previous_move == 1 and Canvas.orientation == 2) or + (Canvas.previous_move == 3 and Canvas.orientation == 0)): + return Canvas.x_pos, Canvas.y_pos, 0.1, 1 + elif ((Canvas.previous_move == 0 and Canvas.orientation == 1) or + (Canvas.previous_move == 3 and Canvas.orientation == 3) or + (Canvas.previous_move == 2 and Canvas.orientation == 2) or + (Canvas.previous_move == 1 and Canvas.orientation == 0)): + return Canvas.x_pos, Canvas.y_pos, 1, 0.1 + elif ((Canvas.previous_move == 3 and Canvas.orientation == 1) or + (Canvas.previous_move == 1 and Canvas.orientation == 3) or + (Canvas.previous_move == 0 and Canvas.orientation == 2) or + (Canvas.previous_move == 2 and Canvas.orientation == 0)): + return Canvas.x_pos + 0.9, Canvas.y_pos, 0.1, 1 + + def save_sensor_position(self): + """Save sensor position in list""" + x, y, x_scale, y_scale = self.calculate_sensor_rectangle_position() + Canvas.sensors.append([x, y, x_scale, y_scale]) + self.calculate_orientation() + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + + def draw_sensors(self): + """Draw all sensors""" + for sensor in Canvas.sensors: + self.context.rectangle(sensor[0], sensor[1], sensor[2], sensor[3]) + self.context.set_source_rgb(0, 128, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + + def calculate_connector_to_parent_position(self): + """Calculate position of connector node on canvas""" + parent = Canvas.movement_stack[-2] + parent_orientation = parent[2] + + if ((Canvas.previous_move == 1 and parent_orientation == 1) or + (Canvas.previous_move == 3 and parent_orientation == 2) or + (Canvas.previous_move == 0 and parent_orientation == 0) or + (Canvas.previous_move == 2 and parent_orientation == 3)): + # Connector is on top of parent + return parent[0] + 0.5, parent[1] + elif ((Canvas.previous_move == 2 and parent_orientation == 1) or + (Canvas.previous_move == 1 and parent_orientation == 2) or + (Canvas.previous_move == 3 and parent_orientation == 0) or + (Canvas.previous_move == 0 and parent_orientation == 3)): + # Connector is on right side of parent + return parent[0] + 1, parent[1] + 0.5 + elif ((Canvas.previous_move == 3 and parent_orientation == 1) or + (Canvas.previous_move == 0 and parent_orientation == 2) or + (Canvas.previous_move == 2 and parent_orientation == 0) or + (Canvas.previous_move == 1 and parent_orientation == 3)): + # Connector is on left side of parent + return parent[0], parent[1] + 0.5 + elif ((Canvas.previous_move == 0 and parent_orientation == 1) or + (Canvas.previous_move == 2 and parent_orientation == 2) or + (Canvas.previous_move == 1 and parent_orientation == 0) or + (Canvas.previous_move == 3 and parent_orientation == 3)): + # Connector is on bottom of parent + return parent[0] + 0.5, parent[1] + 1 + + def draw_connector_to_parent(self): + """Draw a circle between child and parent""" + x, y = self.calculate_connector_to_parent_position() + self.context.arc(x, y, 0.1, 0, math.pi*2) + self.context.set_source_rgb(0, 0, 0) + self.context.fill_preserve() + self.context.set_source_rgb(0, 0, 0) + self.context.set_line_width(0.01) + self.context.stroke() + + def save_png(self, file_name): + """Store image representation of canvas""" + self.surface.write_to_png('img/%s.png' % file_name) + + def reset_canvas(self): + """Reset canvas variables to default values""" + Canvas.x_pos = 0 + Canvas.y_pos = 0 + Canvas.orientation = 1 + Canvas.previous_move = -1 + Canvas.movement_stack = [] + Canvas.sensors = [] \ No newline at end of file diff --git a/pyrevolve/revolve_bot/render/grid.py b/pyrevolve/revolve_bot/render/grid.py new file mode 100644 index 0000000000..7cde9dae96 --- /dev/null +++ b/pyrevolve/revolve_bot/render/grid.py @@ -0,0 +1,149 @@ +class Grid: + # Current position of last drawn element + x_pos = 0 + y_pos = 0 + + # Orientation of robot + orientation = 1 + + # Direction of last movement + previous_move = -1 + + # Coordinates and orientation of movements + movement_stack = [[0,0,1]] + + # Coordinates of visited positions + visited_coordinates = [] + + def get_position(self): + """Return current position on x and y axis""" + return [Grid.x_pos, Grid.y_pos] + + def set_position(self, x, y): + """Set position of x and y axis""" + Grid.x_pos = x + Grid.y_pos = y + + def set_orientation(self, orientation): + """Set new orientation on grid""" + if orientation in [0, 1, 2, 3]: + Grid.orientation = orientation + else: + return False + + def calculate_orientation(self): + """Set orientation by previous move and orientation""" + if (Grid.previous_move == -1 or + (Grid.previous_move == 1 and Grid.orientation == 1) or + (Grid.previous_move == 2 and Grid.orientation == 3) or + (Grid.previous_move == 3 and Grid.orientation == 2) or + (Grid.previous_move == 0 and Grid.orientation == 0)): + self.set_orientation(1) + elif ((Grid.previous_move == 2 and Grid.orientation == 1) or + (Grid.previous_move == 0 and Grid.orientation == 3) or + (Grid.previous_move == 1 and Grid.orientation == 2) or + (Grid.previous_move == 3 and Grid.orientation == 0)): + self.set_orientation(2) + elif ((Grid.previous_move == 0 and Grid.orientation == 1) or + (Grid.previous_move == 3 and Grid.orientation == 3) or + (Grid.previous_move == 2 and Grid.orientation == 2) or + (Grid.previous_move == 1 and Grid.orientation == 0)): + self.set_orientation(0) + elif ((Grid.previous_move == 3 and Grid.orientation == 1) or + (Grid.previous_move == 1 and Grid.orientation == 3) or + (Grid.previous_move == 0 and Grid.orientation == 2) or + (Grid.previous_move == 2 and Grid.orientation == 0)): + self.set_orientation(3) + + def move_by_slot(self, slot): + """Move in direction by slot id""" + if slot == 0: + self.move_down() + elif slot == 1: + self.move_up() + elif slot == 2: + self.move_right() + elif slot == 3: + self.move_left() + + def move_right(self): + """Set position one to the right in correct orientation""" + if Grid.orientation == 1: + Grid.x_pos += 1 + elif Grid.orientation == 2: + Grid.y_pos += 1 + elif Grid.orientation == 0: + Grid.x_pos -= 1 + elif Grid.orientation == 3: + Grid.y_pos -= 1 + Grid.previous_move = 2 + + def move_left(self): + """Set position one to the left""" + if Grid.orientation == 1: + Grid.x_pos -= 1 + elif Grid.orientation == 2: + Grid.y_pos -= 1 + elif Grid.orientation == 0: + Grid.x_pos += 1 + elif Grid.orientation == 3: + Grid.y_pos += 1 + Grid.previous_move = 3 + + def move_up(self): + """Set position one upwards""" + if Grid.orientation == 1: + Grid.y_pos -= 1 + elif Grid.orientation == 2: + Grid.x_pos += 1 + elif Grid.orientation == 0: + Grid.y_pos += 1 + elif Grid.orientation == 3: + Grid.x_pos -= 1 + Grid.previous_move = 1 + + def move_down(self): + """Set position one downwards""" + if Grid.orientation == 1: + Grid.y_pos += 1 + elif Grid.orientation == 2: + Grid.x_pos -= 1 + elif Grid.orientation == 0: + Grid.y_pos -= 1 + elif Grid.orientation == 3: + Grid.x_pos += 1 + Grid.previous_move = 0 + + def move_back(self): + if len(Grid.movement_stack) > 1: + Grid.movement_stack.pop() + last_movement = Grid.movement_stack[-1] + Grid.x_pos = last_movement[0] + Grid.y_pos = last_movement[1] + Grid.orientation = last_movement[2] + + def add_to_visited(self): + """Add current position to visited coordinates list""" + self.calculate_orientation() + Grid.visited_coordinates.append([Grid.x_pos, Grid.y_pos]) + Grid.movement_stack.append([Grid.x_pos, Grid.y_pos, Grid.orientation]) + + def calculate_grid_dimensions(self): + min_x = 0 + max_x = 0 + min_y = 0 + max_y = 0 + for coorinate in Grid.visited_coordinates: + min_x = coorinate[0] if coorinate[0] < min_x else min_x + max_x = coorinate[0] if coorinate[0] > max_x else max_x + min_y = coorinate[1] if coorinate[1] < min_y else min_y + max_y = coorinate[1] if coorinate[1] > max_y else max_y + return [min_x, max_x, min_y, max_y] + + def reset_grid(self): + Grid.x_pos = 0 + Grid.y_pos = 0 + Grid.orientation = 1 + Grid.previous_move = -1 + Grid.movement_stack = [[0,0,1]] + Grid.visited_coordinates = [] \ No newline at end of file diff --git a/pyrevolve/revolve_bot/render/render.py b/pyrevolve/revolve_bot/render/render.py new file mode 100644 index 0000000000..07dfeddc57 --- /dev/null +++ b/pyrevolve/revolve_bot/render/render.py @@ -0,0 +1,120 @@ +import cairo +from canvas import Canvas +from .grid import Grid + +class Render: + + def __init__(self): + """Instantiate grid""" + self.grid = Grid() + + + def get_keys(self, body): + """Returns the postition of the slots of the children""" + return list(body.keys()) + + def get_children(self, body): + """Return children of body, False if no children present""" + if 'children' in body: + return body['children'] + else: + return False + + def get_type(self, body): + """Return the type of the module""" + return body['type'] + + def get_id(self, body): + """Return the id of the module""" + return body['id'] + + def parse_body_to_draw(self, body, canvas): + """Parse the body to the canvas to draw the png""" + children_keys = self.get_keys(body) + for key in children_keys: + # Move in direction of specified slot + canvas.move_by_slot(key) + type = self.get_type(body[key]) + if type == 'ActiveHinge': + canvas.draw_hinge() + canvas.draw_connector_to_parent() + elif type == 'FixedBrick': + canvas.draw_module() + canvas.draw_connector_to_parent() + elif type == 'TouchSensor': + canvas.save_sensor_position() + #canvas.draw_sensor() + else: + # Unknown element, move back to previous state and jump out of loop + self.grid.move_back() + continue + + children = self.get_children(body[key]) + if not children: + # Element has no children, move back to previous state and jump out of the loop + canvas.move_back() + continue + + keys = self.get_keys(children) + if keys: + # Traverse children of element to draw on canvas + self.parse_body_to_draw(children, canvas) + # Parent has no more children, move back to previous state + canvas.move_back() + + def traverse_path_of_robot(self, body): + """Traverse path of robot to obtain visited coordinates""" + children_keys = self.get_keys(body) + for key in children_keys: + # Move in direction of specified slot + self.grid.move_by_slot(key) + type = self.get_type(body[key]) + if type == 'ActiveHinge' or type == 'FixedBrick' or type == 'TouchSensor': + self.grid.add_to_visited() + else: + # Unknown element, move back to previous state and jump out of the loop + self.grid.move_back() + continue + + children = self.get_children(body[key]) + if not children: + # Element has no children, move back to previous state and jump out of the loop + self.grid.move_back() + continue + + keys = self.get_keys(children) + if keys: + # Traverse path of children of element + self.traverse_path_of_robot(children) + # Parent has no more children, move back to previous state + self.grid.move_back() + + def render_robot(self, children, image_path): + try: + # Calculate dimensions of drawing and core position + self.traverse_path_of_robot(children) + robot_dim = self.grid.calculate_grid_dimensions() + width = abs(robot_dim[0] - robot_dim[1]) + 1 + height = abs(robot_dim[2] - robot_dim[3]) + 1 + core_position = [width - robot_dim[1] - 1, height - robot_dim[3] - 1] + + # Draw canvas + cv = Canvas(width, height, 100) + cv.set_position(core_position[0], core_position[1]) + cv.draw_controller() + + # Draw body of robot + self.parse_body_to_draw(children, cv) + + # Draw sensors after, so that they don't get overdrawn + cv.draw_sensors() + + cv.save_png(image_path) + + # Reset variables to default values + cv.reset_canvas() + self.grid.reset_grid() + + + except Exception as e: + print('Exception {}'.format(e)) \ No newline at end of file diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index d043711d94..83c83830de 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -13,6 +13,8 @@ from .revolve_module import BrickSensorModule from .brain_nn import BrainNN +from .render.render import Render + class RevolveBot(): """ Basic robot description class that contains robot's body and/or brain @@ -71,20 +73,24 @@ def load_yaml(self, text): self._id = yaml_bot['id'] if 'id' in yaml_bot else None self._body = CoreModule.FromYaml(yaml_bot['body']) - if 'brain' in yaml_bot: - yaml_brain = yaml_bot['brain'] - if 'type' not in yaml_brain: - # raise IOError("brain type not defined, please fix it") - brain_type = 'neural-network' - else: - brain_type = yaml_brain['type'] + try: + if 'brain' in yaml_bot: + yaml_brain = yaml_bot['brain'] + if 'type' not in yaml_brain: + # raise IOError("brain type not defined, please fix it") + brain_type = 'neural-network' + else: + brain_type = yaml_brain['type'] - if brain_type == 'neural-network': - self._brain = BrainNN() - self._brain.FromYaml(yaml_brain) + if brain_type == 'neural-network': + self._brain = BrainNN() + self._brain.FromYaml(yaml_brain) - else: + else: + self._brain = None + except: self._brain = None + print('Failed to load brain, setting to None') def load_file(self, path, conf_type='yaml'): """ @@ -152,10 +158,18 @@ def update_substrate(self): :return: """ return '' - - def render2d(self): + + def render2d(self, img_path): """ - - :return: + Render 2d representation of robot and store as png + :param img_path: path of storing png file """ - raise NotImplementedError("Render2D not yet implemented") + if self._body == None: + raise RuntimeError('Body not initialized') + else: + try: + render = Render() + children = self._body._generate_yaml_children() + render.render_robot(children, img_path) + except: + print('Failed rendering 2d robot') \ No newline at end of file diff --git a/test.py b/test.py index ec520a7bd6..88252dbf01 100755 --- a/test.py +++ b/test.py @@ -2,9 +2,17 @@ import pyrevolve.revolve_bot +import sys if __name__ == "__main__": - robot = pyrevolve.revolve_bot.RevolveBot() - # robot.load_file("/home/karinemiras/projects/revolve/models/robot_26.yaml") - robot.load_file("/home/karinemiras/projects/revolve/experiments/examples/yaml/robot_5.yaml") - - robot.save_file("/tmp/test.yaml") \ No newline at end of file + + + for x in range(0, 100): + try: + robot = pyrevolve.revolve_bot.RevolveBot() + robot_path = "/home/vm/Downloads/offspringpop1/robot_{}.yaml".format(x) + robot.load_file(robot_path) + robot.render2d('img/body_{}.png'.format(x)) + except Exception as e: + print('Exception {}'.format(e)) + + From c6e3f1e9fe96d830c334e4b7e89820e7a37ce4f9 Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Thu, 7 Mar 2019 13:07:59 +0100 Subject: [PATCH 12/49] Delete img's --- img/body_0.png | Bin 2894 -> 0 bytes img/body_1.png | Bin 2858 -> 0 bytes img/body_10.png | Bin 10353 -> 0 bytes img/body_11.png | Bin 2700 -> 0 bytes img/body_12.png | Bin 2545 -> 0 bytes img/body_13.png | Bin 1868 -> 0 bytes img/body_14.png | Bin 3743 -> 0 bytes img/body_15.png | Bin 4761 -> 0 bytes img/body_16.png | Bin 3333 -> 0 bytes img/body_17.png | Bin 2871 -> 0 bytes img/body_18.png | Bin 4885 -> 0 bytes img/body_19.png | Bin 3881 -> 0 bytes img/body_2.png | Bin 9103 -> 0 bytes img/body_20.png | Bin 4350 -> 0 bytes img/body_21.png | Bin 1555 -> 0 bytes img/body_22.png | Bin 2171 -> 0 bytes img/body_23.png | Bin 4980 -> 0 bytes img/body_24.png | Bin 2858 -> 0 bytes img/body_25.png | Bin 3426 -> 0 bytes img/body_26.png | Bin 4399 -> 0 bytes img/body_27.png | Bin 2644 -> 0 bytes img/body_28.png | Bin 1425 -> 0 bytes img/body_29.png | Bin 1659 -> 0 bytes img/body_3.png | Bin 2488 -> 0 bytes img/body_30.png | Bin 6134 -> 0 bytes img/body_31.png | Bin 1267 -> 0 bytes img/body_32.png | Bin 960 -> 0 bytes img/body_33.png | Bin 5284 -> 0 bytes img/body_34.png | Bin 2309 -> 0 bytes img/body_35.png | Bin 5001 -> 0 bytes img/body_36.png | Bin 3099 -> 0 bytes img/body_37.png | Bin 5113 -> 0 bytes img/body_38.png | Bin 960 -> 0 bytes img/body_39.png | Bin 4440 -> 0 bytes img/body_4.png | Bin 1267 -> 0 bytes img/body_40.png | Bin 2678 -> 0 bytes img/body_41.png | Bin 6291 -> 0 bytes img/body_43.png | Bin 2784 -> 0 bytes img/body_44.png | Bin 1248 -> 0 bytes img/body_45.png | Bin 1729 -> 0 bytes img/body_46.png | Bin 4483 -> 0 bytes img/body_47.png | Bin 1468 -> 0 bytes img/body_48.png | Bin 4731 -> 0 bytes img/body_5.png | Bin 3123 -> 0 bytes img/body_50.png | Bin 4165 -> 0 bytes img/body_51.png | Bin 2965 -> 0 bytes img/body_52.png | Bin 2318 -> 0 bytes img/body_53.png | Bin 568 -> 0 bytes img/body_54.png | Bin 4676 -> 0 bytes img/body_55.png | Bin 3356 -> 0 bytes img/body_56.png | Bin 4690 -> 0 bytes img/body_57.png | Bin 3655 -> 0 bytes img/body_58.png | Bin 2010 -> 0 bytes img/body_59.png | Bin 1661 -> 0 bytes img/body_6.png | Bin 6096 -> 0 bytes img/body_60.png | Bin 4211 -> 0 bytes img/body_61.png | Bin 4866 -> 0 bytes img/body_62.png | Bin 2585 -> 0 bytes img/body_63.png | Bin 7311 -> 0 bytes img/body_64.png | Bin 9359 -> 0 bytes img/body_65.png | Bin 2700 -> 0 bytes img/body_66.png | Bin 7781 -> 0 bytes img/body_67.png | Bin 1990 -> 0 bytes img/body_68.png | Bin 457 -> 0 bytes img/body_69.png | Bin 2083 -> 0 bytes img/body_7.png | Bin 1894 -> 0 bytes img/body_70.png | Bin 6374 -> 0 bytes img/body_71.png | Bin 4053 -> 0 bytes img/body_72.png | Bin 2764 -> 0 bytes img/body_73.png | Bin 1095 -> 0 bytes img/body_74.png | Bin 1366 -> 0 bytes img/body_75.png | Bin 4395 -> 0 bytes img/body_76.png | Bin 1603 -> 0 bytes img/body_77.png | Bin 4269 -> 0 bytes img/body_78.png | Bin 5988 -> 0 bytes img/body_79.png | Bin 3768 -> 0 bytes img/body_8.png | Bin 2442 -> 0 bytes img/body_80.png | Bin 5160 -> 0 bytes img/body_81.png | Bin 1675 -> 0 bytes img/body_82.png | Bin 7028 -> 0 bytes img/body_83.png | Bin 5968 -> 0 bytes img/body_84.png | Bin 8037 -> 0 bytes img/body_85.png | Bin 1366 -> 0 bytes img/body_86.png | Bin 3139 -> 0 bytes img/body_87.png | Bin 1903 -> 0 bytes img/body_88.png | Bin 3324 -> 0 bytes img/body_89.png | Bin 5963 -> 0 bytes img/body_9.png | Bin 2103 -> 0 bytes img/body_90.png | Bin 3141 -> 0 bytes img/body_91.png | Bin 1175 -> 0 bytes img/body_92.png | Bin 5470 -> 0 bytes img/body_93.png | Bin 2073 -> 0 bytes img/body_94.png | Bin 2470 -> 0 bytes img/body_95.png | Bin 6623 -> 0 bytes img/body_96.png | Bin 3930 -> 0 bytes img/body_97.png | Bin 4316 -> 0 bytes img/body_98.png | Bin 7481 -> 0 bytes img/body_99.png | Bin 1855 -> 0 bytes 98 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/body_0.png delete mode 100644 img/body_1.png delete mode 100644 img/body_10.png delete mode 100644 img/body_11.png delete mode 100644 img/body_12.png delete mode 100644 img/body_13.png delete mode 100644 img/body_14.png delete mode 100644 img/body_15.png delete mode 100644 img/body_16.png delete mode 100644 img/body_17.png delete mode 100644 img/body_18.png delete mode 100644 img/body_19.png delete mode 100644 img/body_2.png delete mode 100644 img/body_20.png delete mode 100644 img/body_21.png delete mode 100644 img/body_22.png delete mode 100644 img/body_23.png delete mode 100644 img/body_24.png delete mode 100644 img/body_25.png delete mode 100644 img/body_26.png delete mode 100644 img/body_27.png delete mode 100644 img/body_28.png delete mode 100644 img/body_29.png delete mode 100644 img/body_3.png delete mode 100644 img/body_30.png delete mode 100644 img/body_31.png delete mode 100644 img/body_32.png delete mode 100644 img/body_33.png delete mode 100644 img/body_34.png delete mode 100644 img/body_35.png delete mode 100644 img/body_36.png delete mode 100644 img/body_37.png delete mode 100644 img/body_38.png delete mode 100644 img/body_39.png delete mode 100644 img/body_4.png delete mode 100644 img/body_40.png delete mode 100644 img/body_41.png delete mode 100644 img/body_43.png delete mode 100644 img/body_44.png delete mode 100644 img/body_45.png delete mode 100644 img/body_46.png delete mode 100644 img/body_47.png delete mode 100644 img/body_48.png delete mode 100644 img/body_5.png delete mode 100644 img/body_50.png delete mode 100644 img/body_51.png delete mode 100644 img/body_52.png delete mode 100644 img/body_53.png delete mode 100644 img/body_54.png delete mode 100644 img/body_55.png delete mode 100644 img/body_56.png delete mode 100644 img/body_57.png delete mode 100644 img/body_58.png delete mode 100644 img/body_59.png delete mode 100644 img/body_6.png delete mode 100644 img/body_60.png delete mode 100644 img/body_61.png delete mode 100644 img/body_62.png delete mode 100644 img/body_63.png delete mode 100644 img/body_64.png delete mode 100644 img/body_65.png delete mode 100644 img/body_66.png delete mode 100644 img/body_67.png delete mode 100644 img/body_68.png delete mode 100644 img/body_69.png delete mode 100644 img/body_7.png delete mode 100644 img/body_70.png delete mode 100644 img/body_71.png delete mode 100644 img/body_72.png delete mode 100644 img/body_73.png delete mode 100644 img/body_74.png delete mode 100644 img/body_75.png delete mode 100644 img/body_76.png delete mode 100644 img/body_77.png delete mode 100644 img/body_78.png delete mode 100644 img/body_79.png delete mode 100644 img/body_8.png delete mode 100644 img/body_80.png delete mode 100644 img/body_81.png delete mode 100644 img/body_82.png delete mode 100644 img/body_83.png delete mode 100644 img/body_84.png delete mode 100644 img/body_85.png delete mode 100644 img/body_86.png delete mode 100644 img/body_87.png delete mode 100644 img/body_88.png delete mode 100644 img/body_89.png delete mode 100644 img/body_9.png delete mode 100644 img/body_90.png delete mode 100644 img/body_91.png delete mode 100644 img/body_92.png delete mode 100644 img/body_93.png delete mode 100644 img/body_94.png delete mode 100644 img/body_95.png delete mode 100644 img/body_96.png delete mode 100644 img/body_97.png delete mode 100644 img/body_98.png delete mode 100644 img/body_99.png diff --git a/img/body_0.png b/img/body_0.png deleted file mode 100644 index e44b5ee30bafae25afe752a8601f53a6405b92a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2894 zcmds(YgAKL7RS?oReS&rT{4Kg^b+hMf&~Ra0$62)D+)STpd};9D^sC>0Rtg~7)61i z1n(^`6Gf_~!TU)Q+HXeWPOsc_In^X`!KK`leUr@dgJC)0oudn!cQ^Ec5Pwnn@%Ez({JGsTx74`( z5qR!l%afaQH**hJ8Sd4^w;yv-Ud$<5Wy_G|Y?{DrftuX{5B`)3Wu|NY3ThrT!5^vQqO`2Z$u7tGIc z?5rCKP^qF%O<)p{EAjk{vFc0Qes8)R(g#-1dUZLs2NL}tKIjWD_aR+iw(Q)|y!Oj( z?QeG@I^f_j)e$HJqWY+`Q}s@b)8`>)Sm3J~qY@%W#FLg51SSFTGht*8P`l@TntTmd zm<>~jH5>HM!;mo?Jw3t}LrsQcJ(dWEnN&qD?T}_q)*MVVjo7Wv+pr0xE*VR+g>V!3 zk?StP7Q;?*LvwugKy*aCYJ)g-luLaa_r-Z)50v6KnoMlW+^G5j+Owx3F%YWsqVgid zP&7eNu<%DQ-AXCoO!Xe4yCaEvDoB6t602YLQYJ{f7tn-icI2Rc|06ZHS{TkMUd#qG zQBdpk2ZOyWJ}ODoH>>ZQ%v(&#b~P=AvsizVYLO-64)0WUZMgP|UJ6z0`ZAs5JTn!D zlNEP=ZZ1!1^m0hae~I}ZRq+!n4I-B7BqG6aI-_kdC>7QRz%w$Jo8<&1JME$im0;0n z3ug1Gwq8_fZPZNf+!D3_aSzl6s1~c&&xiyoFEN%@RuB_3{fOJPB6R5Oik`NK;NvA64 zhti-BfN6;YgQ?ysA1De;6`J)#ivMy#6$w2DTLfLj#H_1&s08Q+G@nZ3BL1XFQL@`@ z^sbH|Ypl+YOZ8TTLigR8W&qx%a}EXS)`T^K6@ zbYT0-kvMETi!RAYjGEk$$HpsUf>~$D*1(bu`aZ<@y`n;_Ne-jQiPoCrbw%0oF;G(4 z?o&Hm#x2NokibthkP(&rb^NmO357P?9bh*eA}l~O?h;#NSVJLdQ8@FWylcVy(pr?8 zVz6jpKDCaq^YC3>Ls~v2B20^@WJR$j2c(g6b&pQ|JV=|v&9Ho zxrrWw7J*U+&#F9hMj^r&bNZUGQAL~l;VQAeyV&A{s$*)|Nn-y^y=&v_D!}U~p?1{7 zaaW!yGPqZ2Px^_5eT_a0c7L18G^n!3hp5L@%Bg7ySZj?HVh>hWYuF4be}Hii!MJXtq1(aL z#2thj1DFD%rCZ6;mn^Szz7LTuU%`CgXNmGbUAMh{A7f7b)LH z-xxYtm>~&QaRptgqrLO-P@-2*x+FryZG!vA;y@g2)@SqBsvY_03;Z9j21`X))5Cg}k^YVXKFPl(#?l zG+d{R;5Bz^Xzf2f{0gI5T&do_Ql$?9^8b7(OTac&PZ@M VYmLAB-FkWo{>j&~;_%ta{{-p8p?&}W diff --git a/img/body_1.png b/img/body_1.png deleted file mode 100644 index 2590094c9ef3a6a3d40c26a1c3d286b52cfa09e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2858 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 diff --git a/img/body_11.png b/img/body_11.png deleted file mode 100644 index cb5d1901e6dc6228fa4ab4604209d1056abb6ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2700 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 diff --git a/img/body_13.png b/img/body_13.png deleted file mode 100644 index e383cf06288ab91b67962d3ea6a427f08ff62362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1868 zcmd5->oXe&5D(K(I%r+1r$?&SnR4eQdR1ESh@PlZCm!`^5bi2RD~cddA&jb`&SR?6 z)FU2sk~WDTiiiu^YYB>0F4EAT;!%-!RU)L}Vmfo5?hokh{C4-l?)-LkW_R;_;T{J1 z$MgXJfPv@FFn<6*t3(rX_v>hE?~(Qyjnld6An}u0Ajh?!PI_eMBdS%y?{SgYjm3%gPKRhrDl8>|Lm_BZSNjf9C4YqSTdZDqv z|3giVRgQkYe}Q2RS+Ct|^nFJy_OV^}$62TLO2GlctOVuS+}3KE%Vy<*laH3Bg)c*1 zq0oz3)B7i!(=lhAaLScdVDvQ9ECLTW{~YHy<$fd)78XY>5xG;Q83dsA)Q$G>(3?7^ zRQ+NrAuZBt1kkf<3DoX6_&+FV_(a{dN|mlop$`oAbR$2c`>-*xJXYm5dd2tDk&iyQoFIs&p`rAaXkyiED)dur++_OG?ZweLUw&)R%KS;LU$Y?K+q44s zv&?a5s7mGKbAi7cN7#5{!*naU>nv~ud|ju(qb~^SJ#jJ_*!kt1&Ja$7n!yfo4l{2A zAri>miUy}5!QV!LHL*O;)dVAt;p}E0JNz?M6ZtXLjUmfv5BRpFdBd^tOK&UOsxAeVqm@Fjxz74c(3 z6Oy2yI_W_xwboohzB>FNtmDLN4F1yw;bgyp+zud7+aSg&HoHie9US|y&BFT*szq>tj4CGHGVMf$I4=JCRiV3 z5TzDNTP67ryx2w*k{P$^_|e~iglOP=kS*-T2i+c@e8Ck#?5XIYFx*pIg)I$ z(fGuaSUr)uqHei`EpIdM^wS_q7o{9pw1y zHuj>@CM1apy2b`d{&~ME3rNddk*Dz0A4!@mcygK79~(_kD9C7#OX@r5!mxLra^~gY z!}xd~(_hY+xs;eECbRM~_NDs~Le%W-B>6?GJrou;(7vwpt744N#+0m diff --git a/img/body_14.png b/img/body_14.png deleted file mode 100644 index 62098978e3aef2eb48a1614edbd950504b4e375a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3743 zcmeHKX;4#H7Jeey(6pf9K({u*!EL4&(3)Zkn;;5`4K9QLVH-CT43W?z5Fn(r5ouD+s3<|se5#uuu2$>g~DtqQ<|Cs3?)~i>q?mg$8 z_nmXkch0><`@%z3e7yE!0036(4h=p4087rBU#sQF3{B?IhJ2PE3JVDaOy=ijDf=P- z*hcOS4vfrVP7Xu}n8{^B!xdeD+ZKcyv%U}QuKCRV&(@5MHCG;| zu}MmdW6Q5Li!log>eBdvNiWe+U+4V#G)UsxOag_03$q|>i=dsEBp5Z3G zJ`nQ}9<@;1aQ#AKH_bsLEG?S);#%PKJWxPcVi(2Un;30=Wu3-1cL9{av+WtSBe zO+5XMT@|j3;0Q1>%|%}?5B)421|c@CUvc6nYVJjs{C+SgYdaxa9<+13m7y$a zrpCD2*?Y$%1PA=Flxyd}hqc8$XkOc4*)3*a5p#{(m5Os@NsjgNwVuR3%%}f^==&l1 z-WEg)>V8&?NVODnbL5kizZNV+FdVJ1VwU|IH4=c^6x3!S(Q?G{mT^4ANMZjyd!iIJ znf8ucvwCDL>Q~yudf|-h0u9RpiELB{f|5>S(wh5nZ#?~i%-Q1bU&c|Xx@rP9?iT;6 zIPINn@6CUIxA&hPwah}-muZ+Jv!!;#(q+V7M^1)Kk9eP-EQ!@6N5ag>{^?Q6>ht!* zItowi7dk~f4(|vfeJe4CVjJRGwgvHY`OSnAZ`XTcrLlgs#2suV0$Gj3kF;ZZcy9){ z4!n=2CP+$kA^N-;3aNPRUA%IYh~YHrN4CE4QfxdvW5xU|bO6TURTi1!V|A@y(~~@7 zT&*7h%|FeYKDlePs4O9+-cSf7aSmf3GTw3FlmeHe+bTL>3}Zx0 z&(;s5jduTKQKR8}(S%*ZUzhw3s9`rnSqiZ4`+$8Qp@eD@L#<#bsqU(J^-3B~950Q_ zlS!Vv++7iX%A2ftpZ-o0>GFfo0B*VlDhBnO!N~l|w8(rkI_>j;w}J2gbO9Rmc{ctJ z8t|3=B9sbhmCWq^)^?8wd|s_#+(BP^8IizIa68m9ltaJ_j#0hsSFNNSO~WP<97^gJ zGaG*q(b5r{i<{$R0;(v9HHm;aO6}Z|)2>cPs}&PdW!6@WtF?E;oRmxJK!F2aSdOfi zE{59f!Kg~A_>>fu=U%rp9aGf*%t-}dNJ~aalH_vs#KlxF01ln=xgg}2Fvh{18Y2cC z0fFZCOGrAEVS~;)2mbhYP^$ctadM~ z03988LM0qe0EP~FiDC;2b13tbwr**L>Jd?7VSwsPfFi^RtLaQ#57_vsBsC?<+&w+^ zHj2LGOO`|rReLxWiyl9O9^ZrO0=EMW+12i=yc4B&l2~~Am9(7+mGZBnM}y$`)0uVO zAYyNvv}f9d*g%m|jOTZ+PtD4oX);Kge%-=E`f~Alr=*(FMR?z9|LWFty@`RLY zhS_iuddqsC*m%tl3)g!jqx8g@_Jg=Y9#!%%kGB~~FDWLkM&drBLi&d!Umk2}nRLP2 zEFP-)jF8k^(UFk8P00GY{nO9W6_=Ip)5SwhTqk zd76G{48j#=B!}_-pQc|b1}`lld3`9=oc$-7(0z!*#dr6ya8>dGXm*+ABm)8ZuI%p| z$%QF!=Z{YKQe^7QUWT5q*M-QZ)KXGjoUIE*D3imdT&0NGKYJ);21v9FumnW_di%hS5yOVe$tUsJ=WaPB zqeQ2HPPJ3W@@|LZzsvI63rlJB2`wJc2NYSbEuu}B=bP3rs zYN%90psjQ{!Vz_eV)#l;3CD*F6>aI^EfS{$EU?k^)Mr)m<6?v=52S*-xHX72yNq@y z!rYwl7u!qLzvL{R1+=4Ux30r^aZ+B+QzZB#1j{P~ibO#nDpn}KBi*^6Jo`pM_ECom z8KV%0)!bxXCZv9el#lAsa;~SUvd~$@+~40it7FVH%pUWbn|P}i{y+mxHg!cPaB1s hp(Nyl^DSDx;uWy7x+ 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 F|2q+AQfUAH diff --git a/img/body_16.png b/img/body_16.png deleted file mode 100644 index c3b77daa9c08e2eaf7f903675a4d59779067a6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3333 zcmeHKX;2es8g4|v3nHuK#StAFBFhRJP@Dis#49#v;;5^lLWD#RQ6!vVh_EukxG2$X zIl^IZsTC~+1yqOxa72kMM^Nr7>e>SllK=q{AOSY8&es0jAG@_brniNFzxB7XX z=Y8tCx}Q!nTfBBL003sto}C8(z-ZKP|6!qt0ohXF`Nr@t3Gk-v1ZHNhyvhOu0G2+7 zc6uJVkfZFC@>|C$CByCemmUl}>624?=zU}&c+b+GK=dzMvSVPNtz7QqxjZ9DbWXcs z#wf7a;c9kDJn(muqKcpAf4N%;-*8B4T_8vee%bRnrmyYF%3tEX{~(PON;Z%Le>4_~ z$>&Lo#z%rHtB}IacT6*oI9ShxTR8-ylWhu$&6xc48JJOPGcQ5#Bt&5ZB%q7jfEDZH z!2X0h<84Nl&4C3Ae*^w&e7sNLoF;zY#Otn|&)Pd5nEFDI_dEO4$MkrsFC|6*d9+^BDgK1NR6woYophwu zc-t;t)2WL|M+(crx1#-KQsV@_NbAuMXyw}5We#Z29H6MmVMk%>tE8<@VyELIyWtUN zx@V|9-4Ta3PbC=xrNP=&6Eim=`wu4#>f7EXg7HxGqv)9cgD5k7gW$qKy3@?fvr6x0 z@8u=b&dI#QnWDjpoHczXa#b@%z@etG2szDpMNyh5bo<-|8({RWU-R&dLy3ovb!K4u zYes;)RlcTVh+eR-B?A^Wf3yPRKWIIvY3%cf5$TAy^Bch28%{)a@$69=q}eQ32uwEf znh@-0l9o^PYSG&Hc&oS9{Taw}F)#;`1lR%Cc#Voft$(i>ocbPpz~?vu@}KMHlc7{Q zkpSBZr!9Ra6Jl4Db<;{|A^U=hwxK-8{6$;`Sp!hpZi9oN%uvvW5zf_xFzjL-WmzUK z^a4>{eD|H7wgRAw=7u{k)H~lASiCF}*to69C=c*7O_=u^@SpM#%_qMAiwHgpb*tu4 zd^$D(O0T(E0M}T3m#YNW3Ahw8_~NHegWXJBFl-7L^pJ}cf+-v77Xr<$2XP`Mq)q{= z8R{~SNf2dY`0k8~Zec|(76aX;tG{eS=Dmn)*xTd;l5S%3ByJxrf?Bg<*vWQch}gIQ zAZK39WA0P$hOg7cOD!QkK6e0UY2z9EEzY5(Or+|%gW{Um-vM%lL5~?|K-FhISZkSM z43GyX^7wijw^8r!>MVA)0e(N=CU18UpQ%i%fGFp`iJa+O(ljLYg(xAjK!Ela@WBS$ zFt6xt!$`loE1bhn_a_BC8x__hAF0i~e4bQ3HJoA*^igOY8m|v{wPw5^u^V5#nqyLR z>eH8k(x{=29jv&r<7II5^p?)9GZC_v+tqbUI|jM6Pu$klj`UA&B~di%K&Z{RC%_sX zwK)3WYs$rvl{z{43s@09lFg2a>hY|Sn&QFgsdM3je%T`$rT6quGS*%l8sQfr;S(g( zFIo#EHiA@hy>;N;!N;G&75Rh=7M|?0uU~oxPkOJC#ljvJZg}XJh82W>cxS-Irb*l$T6j)Gyv*mN4NG;W_hcNAfF60A9m=V-1Xl{%-^K zF;`)k z=4#;?diWMJ5v+q`boF8QH8DBYI2&rTC1qoml9G#5uPLO2d_`b3?FcM}*&7UUs1CsMg}l+%l)#!Z9?6ubRgNHm4#ucF zJo?a~Rq_YmoT;R)e8)Mj*<50!bx1x3&XxI2elT+EjJnpchCG4~F~k`}IY(}>s>s5w zFKt)yPvMoFG^T>3SvYy?Y^a@6wSG3@sAwHj6}+Xzs=GeSm;TsXclr%wG5}u+H5Fhz zqHks-PyGAKrcv$=vYimR(i#fW!0T=Pc(abV8V_s9 zqxZ`%ktZgRVTdP zhgoZg>*oqMdI~Q)Ra^P3Xnz~%@#B`OPA(^s3p*riMZS}USTUcs_?XO{(KY=w*5+x| zw1VZVdACZJ>3f;7z`+3xs2RLco{9A zZBY%yjy=bqt^8ovcvy+JMZEMTw^nK3D)(atYKR5}J+RU9@!D;8{jr{mLl&n-d51M_-Z)ld@PTkYiwpJTh=Ex3i8Q~`Sx+*l@7`3Ii}t9PoA3hl;3>#h%i{0p&xKUt8EQA zJwQyigxU~s26m*FUpy_ZO diff --git a/img/body_17.png b/img/body_17.png deleted file mode 100644 index 349a6708c43b5ae43482c7572318ff7b0e7c840a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2871 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 RFF^}?-yXtl?oOY?{{d&9hVK9X diff --git a/img/body_19.png b/img/body_19.png deleted file mode 100644 index 3229f567d346cf2c6ab298b253a7aee65d113ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3881 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 diff --git a/img/body_2.png b/img/body_2.png deleted file mode 100644 index 2a536fd9bdc3f8725938ee1290c86a067ade4ce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9103 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 diff --git a/img/body_20.png b/img/body_20.png deleted file mode 100644 index 7cab380843acf53b46ce099dd3c185e53f7925a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4350 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 b#(iH`CpMUpuOUA)fK#5n$1DDN{>%RbehGo) diff --git a/img/body_21.png b/img/body_21.png deleted file mode 100644 index d7d93684e957cb88a720e32942dd46fd2f8b9fc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1555 zcmd5+|5MU;946b!G{4-fn@Oi;B39GP{E``Bsg;1=BEmt;zNsZ;-f3#4!Ya+WW-Z8% zUy-Oo6GBf7i43V+u8+nnGThbfwtrx|_ucFL`r-9@p4UCk-E%oU zc8{G6+y(}N*Zj1vNq#ts8C9)SllKFo!;>Em}=Dj#lxN?qA#th_K#~deQOw-j(h!u5&mH z>t6`F@m~zM4Pj5&6xdnqNpNw=iZVJpc1|_5=QHZTH_p? zLd(!+0A-oGc>b~!Fko8->$D_#q5Q5FA5>QL{DK3?&6O0~N2G5t`nNL;IVUzi;C_p7%GNm-$b^G}jE)0s9ZZ@?cO!xe5c8ED`MtMcmtwndw&D3)VPE_G5 z9(2V?-+YMY?-RphaUA?y*MK>ubki)QXA3RVB7lY{RHn;$gJ)%vri1yrB*kWRrzw7f^XzyzHp;HPbgFHCj)wau8Ph=hQ*tKjwJtF zg}!|zDNH}NwEFmSgZvW)wIFnUUVop=d!;{T$Ppmu<65>y*d3is^ffXzi$mNlAjcqc zCm-3gcRRL^ia_>u6v>I12Oe{q+;LmMS#&jpMNNf_@Q3Ajx+&5C;aIu72^ZO!8;Vto zn6020mF9()OGjWGfERG(Y9fxWATlwEKJA=lQmQ>(Saz`EG;bI&4+acGAwlxgUWT{l z2@o+5mCZ0cnTVi&EF@!D&oZH>mxcF2USb*_bMFe0w}73yv$LC}6D@B))J8~|&SqiR zU>uE&*vgm(-@NdGYiDW~`A`W%mfMu-&XPeXTOxTEmQiA?jBP=Ut@JId0%fXUu!9nZ zb~6Nf=xP-+D1!QA4Sy4jmvsk1g|#nh3^P)ALG6Jy|Bux8cXGAfD;0jqYmP`%jDEVVTsB45Zrrw`YI^A#OUlDAyJ907 I!VjJQ6WE3J#sB~S diff --git a/img/body_22.png b/img/body_22.png deleted file mode 100644 index d7999ed4b537c5f5a491a3a507d77234f6ef39e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2171 zcmdT_Yfw|y7LJxG)Zz;tEm5>KBsfIVf&>o)QUq&G4PaYZFd`rVElm&;BP8;gf-kND zopXRnLW;IU?pz8aCLtUlNTe|yhy+X48|Fxg?xs=EF-?0jw|dd{H(&$c32UA@IVOW#Y?-Ytb#EZ z#}B}epa@?1lu?&j{HB{`Mi)VjU_2S!eg5uwtbi7J@g~6utK;=t;T;*e7qY=c7cu|F z{LGq1ZawY~e>74iPatbSu*fm8FebqcQQ9`*kr}2%Y zjRxqn6upC8!|ND~-wt{WSl2H;>h{dZ9(cHVQBhWsw@&swsMBnLh{DA^BL%6$tNetB#1j@vBzFhg?3b#I(TciC5oNEpJ=<3OpLI&K=$B zw6E(6#9Q z2#SWG!BE9dh=0X2&)HQEWX=z3wOr*&kYlECtTaP2pRUZ)*~<2;V|yG8oku^hd<>=P z%MUN*tXhS(UO>BkLPy$#O6+B_%Jm;i&;;ISn68M9rWbBYzpj3Yj|!F+o1@6$Xc6)<>Um9^QV?|Iz+jpFLw1obGT$ zO%wEPuFr-HSY|T`W@gOD*uS@%ihmyLlZ}j+JFgk;{K+BV%UCIW(*vj~ucjc+%YpfI zAPw6kxIznDJo%RlfeoH?<+Yg;ET)XS)HgOd89FZ$o>B5bnDILhj(aa6l~-QfV84Dh zlnE7tFuQBb`fxZhCOL!f_tw-cTW>0$$?#brc2sIuSVh1KE_@qVdvW95)_?w54Nl{M zl2O;1d|U=ZDTyKVN~@fHH!0CMF2`0I6*TmAb+A92DdS|8B#_ZN$+Otd)>K4d){(Mr3 zwvz~?rp~Dt*4AA0N2R6E>=-Ql3O;u(fkk}wd|{LsP8AVJ1QV^Z8EL!hKZ=c_-ZZGP`ehQ>orBK9c}We2vGUze%T^Up%be9xCdxG+;S!fjSC>d@97*& zEoiwlF;@8bQbX{zoj0sNzMY@Eg_V02nkekFD;{kCTKAgMqrZE&+|>j&^)Wj$c?yBtMYjDiV%& z^_7_QxH=iKw*PFLBq-JW*+D4wI&hrP{%f1KlBqM3FWWe{KP;qnUtI3L02J=d AG5`Po diff --git a/img/body_23.png b/img/body_23.png deleted file mode 100644 index 60f0458644e90a41f8201a50b5bba121068a0c53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4980 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 OK0WMxhR#}KI%wQYO~ zBLvCTE%q!AGYe~&NTFDZEp0`7SmkIP!%~p8Q?M0}2jNy~fzn+I$S?Z?y1ak*e(pX$ z+`aDo{(SFS@nuS4a8PIv4u=aq_*ueXY|X{t)|_9r8mr9P*KEd?wK++N2{^A$zi6Z) z94^RqFk#Y{^VrUicW;WTd?#J)6o(&tl ztHihNtmj;*+@~x!`-Pa4y`{bJz@`p%{{Gb`;*4`6H;gCvn(45)k%ei4MoDxK9IU4| zp~@~!Dj1=SW|cl;4n;;8Dc5JhCx|(3{C~7T#y=x-pR~V#832GjhpRzB`*f8S+?m7Q zh0elEfDA@lcDrEsG|!%IhhZ5gh(Z5&z^#FxE=Y2biuj5B6on_nE-SG?oYo1FhP^9S=>UGkI5ftjb=#5Ic7J_s^!tvR$cyOVthP&QW z;dDSDYUa6%0{4`$d_P|0;*~~E@zScdp%a*U+25g{9ZhmXjy(9vOYASCx zIu+_AW=ej}?9}aHar%=Y;SP_`8MIIVN&M}RZ>(F>h^AqH!Qs!0!54-*l3E6lrc}-g z1yt&MH7V~aXw9sPvDEJc(B3IqUgM*jxR213F|5nA_gPeba+q4=v@zBX3cn;V(q~=+yv%;2BpnVp80=uCexD(bxA^;CaAQZU7XqI{6 z*xi{OcwvFP7jA&6!Dhqhy#P?%Ls3|-o_{=8nMS|a!eDE&J&|2=->01kNOcPM1H=*OF*!Buz;Jxxvfz6Z29XCTTj8Y`R5Y9v3NE^@HZzqC)w^ zZ31%clctXYQdv5x;xPf?V0;mNri=#!tNegjD}W>tjhiiUcD{Rb zOF*iHUO!kQV#i{9)qbX^JQ4eYC8t(kG1sD(!S4~6S)x5HOAcayn6c^>{p{Zxw*{um zvP0uH^r~8n@4nx_rMO~HSu3zUsLd-8#Q;P75nTktjLk6T@=t#Mc3^6(U&?u$YcUXz z-s65IYy`2mE;{9#O+Ty;>f%a7F+glgUjyDFAW?;KYV@6;z|;(KL|r5=W{B9Mt;_oj z7S~0mUc>sJ?yp32aUa4WiaCfS7yCHxkZ6&c1NEOi=WMi)Xv#Ld>L0VuK;H;rab0w3 z33f;+X|hSS*>wH%SE57q=OwYtjEGusweUl_z|}r^y+^?W%F9`(T|+I=>|t=j^Wvh# zN?Ya=LwPx~NKV~F_TAchnV1@ymvKVmoQi2f-bV)7SlJExTAd^seW0Nq1Z2(R2P!K8 z>1L^_<#jQ@&TEU;@1cg+Ygm6$8!I)1F;eI40WBTWr|n9dV9@0Lz# zVz|X5uE15&2C*D=kIQjEkx1+Jp1TVeVJE^m740w@K>&|uO^?)2V(|F30oaYQ+|%hg z?X;_J2X883zVQfav^QO~JCeUURc4UZ8(_+end0m#kiAvR#7;HOZeQ^Hjs_#%P1eM~ s4DElvRSLy5l-|)kvtt6E+6)U9S&Aik zqCj|xjG|S`0)znJ;iD0+C>U9QXm~BJ0)~g&0FovRa}!&2STplueocGtTKk-H&pzM% z&fe$jy-#gndM#SGbRiChTLgJ~Y{TK^`(phE3k)%d#>7TqjbSLm%L6y7doMPW3NcMH z$m8oB@%f`YcLe!U$;}gOOLs>%+!trn{gAu!LPpyBVPc$r(B)0EyI*a3v+DFZ(phiX zrTyX)xOJthP^R5B`#ZaLR5S*^itu8slW{L!B@BGNB&>Ps&T76zluTU38BK^Qbl?R! z99|QQ7w{gvh<}BrR7ROOM4X7SUE`QX%u9qjpBa4xkr@>hw7MKm0W(5YBHTMU6#fOx zRrK2sGz6Zp-v0<>c+Jck_y%0BJs&=pgI|+C5?6zQf^xyvU}VfDAd%O>DbG`l?_6I} z_^mpw#ET@suzH4M@HZG9l^a`ONptP?t0?teA@Ner8(@O#%{+6EZ?48HgTwWh>&%5) znD!YaH-?###JMaLZ7z|?RtCR6SP{|Rfh{B9RXw+94tcRydMHgAtp zMxa_Xe8Cp(=_5u#OdFN39Phl9Dy%O;e1Jq27R{Z!D92lFB-0(VQ9|3m;RUChC zFHRWvxI=p2*coPKa>}(jjzevdOM>z-(prH0bPAasMd%=qfqH^=h?j#HL7mMTM&`>I zEEhNr8VlDxz5YTLw)!KwzK4I~RKzq*oo#zQ9XHL1yYF`YR?T$$VM2Xf)(8oZP#rU-$U7$W!#a3UPG%vJj7?Ndt5G`bysX-e2P%g=?pM3iA zd*Ztu2;Bzg#>cOICdpQ@YduV8hX452Uy(iVo;j{*@ae$Ddifq!AI2_7OBQlmT6hyV z?P2C~4CX$y<>V?#&W#5FF<*{S7$$70(!V;wCFa%D@qwguwDjUR=sPfUavHo)UN1`0 zs*ZN4SHli`i5!vpl7mfXS#!z6V(Nd_sn?vladQ!;VKKyWlE1PU+zbrZL*)b-S5{*7 zL1Y&vuDrX$!gp7{(Es)FpIy%Iwy%IBrMHjV9CrWVqO5ZHNNuZDAeom^9CvL+5jh&KrzQ?7$|pb-jR^ zo9{zrpf^+7)*Lhg^}=Sg^`+*wa}1OCch}g3-2m_AU6}0L{cN3P!V)UCnNhl(!#-*c`Qo%2-Fx^JA4-^Sl+X{{KIWRYo3THrW zk2M#F{92(Z;CN#JLTZk;FAUdDFO_5=9R$wumqiVENaBRgVk^EbkEUE1BPOg8P_yKm z$YbBrjak-L?&)&r#_idazs5PMepla9?{#}0%G@duM-FAS)%9rXd)zvaiql~6FcRXq z^iRbJs#-hko_uUpiU@v$)B$KY@ z#*#Cv3LahZB2{A5!LLIN8}uPjqTRzoyCE$N)^6+yV4zqx^rB+XD3>+SWHO5nr@|e9 zJ{4>^DYvdF9<1*Ul=m&2FkbfTe{ADbq3GStXQlBeQIOUSo;8kbC#jZw zES1?En#l$DzWs7+k1466(ImCnFJ=~u&?zSp;J=9}u(rv0<{kIRkwji=L5KFQ{UJ%| zx&mf&L(xF*86n{SAtB_pVgjM)YL_RiY>0`EZ-@l>mT$QmRQl@X)+9IG!p|9K4y7m@ z?erGj$F+m68T`n0h2I&~n6!uLYN3mlrwHQ*Yh~dp;0pwQJm$5Z^j-_lhZjpfCQ(FG zb)Gc}CBH|V_5paXAx~wy*`%^OexwZ~4Vt$}g^%@%5(kAN#BL_bS-BPQ1@wLL*44Zb zELupz8Y)g6%wMLj$c~!&lT>`^XbGW9sNqhqPh=r^6F1W=GW92;ET8R^d9=QsXoPL- zk5!ue5zEd0+db)01oqr7&kK)4D30Rw(*`qit=Y1{swG5~a+z)p@??7axGDJCe*zI& BSUdm# diff --git a/img/body_26.png b/img/body_26.png deleted file mode 100644 index 8181adf8a667512507e998492d097256106f2fe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4399 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 C?4%0k(?!dd`0dNCq2D88U! zT^)3bqQi_W@DpO47B#WyD`blruxlVvkiopUR<}|0)N$oO?;hsKlI1k9DmVeLi$0&( znSqTsQ|A>NE>^#Lyz>v@#%JNGM~{8-HWx^8EVlAHw!Mi}%B$~Z-Zlt$v~PT#iuIx> zD(R?v?Msf2QmmKFG(}PU@f7u7B9qok^wVLP;O_o~Zr_RR*fHW#Od&BrY}%0Yuq=3q zS2;e3lmW?fdbc{St!IGBB<>hWT|w9w;%`N9R_if9S*6`qfJ2!8`w%d525_z`fF}@S zUWUQ@0#<>Om=vJmEdXo#1}Xe3q?|xV`>GW0qRPu|8tbKJBq- zi|2q$Q7_0Ao30@OR#I{^FJ36hfFSr${_TDT{SV)Js28&t+DKAioRAE4XE2a-t|z`P zWUhLSGAGK4H>DZ_8N-YZc^ktf!2@ctM3&%kUE4UG!YO?D8;Lh#+(+hv)KaQKqEL1s zBLtL|LV^3@KKKgfKI89Gdx85Q#F`v~*z8=mOhzv>I(vrkmre0#_G z1$qdRwO{k>OKcC2-M-C2*u7Se{g5wu&yKd4iY!zqsE(+iOGQp%8|%>{$M$drDdKI6 z*5)FA9%6p2F|V=c!rfel{~{b-<@k82%i}ofCsyI;>e(7p+7^jCJ&yaL+^hsUq}n?b zD%@&hF%B`_H25zzwP#)wt!;v553>x$>#PnGR2#a|2wnN2-qU@uC#a#PRdk`o3vYR9 z<-}Gkykw^Ep-6p37c@?rhD zZkS%H_XkkAiB3vz zCZPOF8@Y{SK8u{y_nF@r`2XrZ!*%IV^P**&^anhx#bl<)$#I2rQcP|<3u|UKHa%gLCO2t1& C{g(p( diff --git a/img/body_29.png b/img/body_29.png deleted file mode 100644 index 52b84d9f7dbb8a9008c226e6df12b5d6dc787f8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659 zcmd5+ZA?>V6ut;y)d&uiqJq%i1>C}9It2{01*O8Z1&l6$$XB5tIz+5ekrp93MXiH+ z!J35%I#i5ME0yokmaQV(fTHEAP+Oc-O{GvRSo(o>mt@JZWdGfHlk>jkeUj&#=lpms z?um(XTDEQ(002%-wG#@eR+?8tM~%&T3=3HYMLXAX$B@)|r&|ZFl=H;~L9mA6=K5^$q5_uJHFP zIfH#}NW0g5?;+K@ZMXWGWzSQt9X1eZc(Y=B`Bzcc?X2JcdbQd7L_VIVewszK%gObv z7a=*ivm9`YB3#Gxzw`tY?Prs)-En0DSqO_@43C2Od|FFYe-8lz!Tb~D_sn)~$20IVODVgR2dOTsRe0DHV~Kqcl2l^$MJ01OF1j10polA#Wik_|F&!poer zuepL2g0K}CF08gv5|&+ZnO003Q$)?Eqt%^I*?Mw{H0Co`1Hl5AM={icQi?G24b?A= zi0pzzkouN&Xdz#>nQLo~G@SAm26IP7XBh-9>zYA>=@@-FQP?`#J(&@w{$$+=lkIs& zE_wR3b7=u8*}Dwgu{r05rKHDO=kc7I_ySH+JKS0LQCk42LY@&T7J?CdxhZGg91gh( z3h12DtN5~U>imP=HV0Z*Y&95klu>iaV*^!3}E(C%g-n3s8{}6+8Y)aXz895k3y#hZCff@uSizZ zm*K~=n@dUOeQ@^eC-rF)v!+V%3F5Cii1YMkg2rOrKd@p9k}L>SA3tB!2&Oj$Z4ZIg zJ*AdcC+bmZOfOJPh~{#~ll2L(v`O?r6B;egb7syB6|P_}j|_8sZ^)dFo{KY9EQnRF zecxtwFcp{ZmP2B+^9G!Kws|a4ZmDh79xAfwp2u3P2d~^jDWCEnuDeA32OZY8pp-mF z=_Yv)N#vtj$#b9qZkxcP6D=ZjJhW*MPKx?h$Gp!hx`8H|D)K|x8P}?Kv)YvN0$1kT z;NKI`t&FM*4WK#S)<;oKH=W8JtNkU8nLtZevW0V?6<+0MNqtL$Q|F}p8r5!jnlp2& z{4lD89OfwOn0p9x5CX15qyp7ridES}W+2=Xkq>y>bR&nf-CA=5XRCe!0unIao zWTNb2Y)3u~c_tdO1p}VgwWTG?b(W8s=e3$SEiLo)psm;k(SpSk!{7#ja&>a7VWSF9 z=<+ZIrKhr{-`mOEWECXfd|sd8;ja{ z+{}=_aN`1`JeN0O`^^aQML?D@@f1TNMvwQ*F|z{5%!!MNEZ7(RKl zro6yW(qfsJo^=`M8oi(SottY>c#coc23%KAx4#>{5&P)HJgREte~N@BGrWM8T`jMI tMo~u;ZZ)n2oU^e4e|yxp{~z(*rX}i~oDNeQ^(BiFL8O?7`#aLk`~|Y)un7PF diff --git a/img/body_3.png b/img/body_3.png deleted file mode 100644 index ea90ecceecb068f5754c9c37c4317495f76f8cfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2488 zcmchZYfzI{8pk6=pmGtV1Go^BMPVET?8*`Y4Jd-CSir^Hhy-F-VQY}6Az+AzMlDrt zb*-X6K%5#%-VlN*L;}G?s?c`!W^_)3#X8z}#InO-v zKfmXk-y4s0Uh$U|2n51;_t(*h2*k3@?}vk(Rbl6svaFLGZ4WjYvGl%Qm)BiFAU;35 zJ9-E1c-7<(rkKLYQ#`AYmrfin?%tMCyZoYm%KCxBr*J;CdnL=GYNN9+&fgf+-0K~jmbQHvBy90i!WC{mq;+B|M(*O-WqJ%@3+i7Rjs)evx!9XQR~=n zZ1vonj;TgYg|lxN0HDdf3cb%@2mrthjJq#0VPzzN-aT~2%S9;CK7D$t|2j1Bgq)hH zn(0buBIJuFHq2rc%H;?}!|KgcPwsN3o#Imm9Nf1!DQ&*rOc(J5n1l_fyC04G0A`3TlXv6eva9@1Xs6vYcF(&<`|f@9&x%Ni7e;FVa~e839?J zBCG~n0vSmIezx?_Bi@NmP8Z3J9lQXpl@Tbq6AQ=SSU3S}13QcMuQspKi`^$0q)<~A z)HY=y2`yJkph2h)nxqUlo5Pgk>r6d#Erag|G_)mRDET2%iCbKibSQ!65m+r3Nb6u|&LN=`z z6}!Kj(;MDAL;EA^t9c)lhqZZn9&Z=@=IgE=@2ZTAp2gI_hkj*`D;ZfRav`u4+$k~I z`mGW!=lthE-jqBnM@S%Kjcp|e(!d4Ktxe`N!QwXCu8d4J7+BEb>=Nzou}Dnb3meT^ zJhn25)lLSq%zrNDHiy`+)OH8=m#1pG*7kcb9_P>C7Z1a`;G>#uhQ(Jer2dt}QJi;! zAMaz$4B^Xg31eZKW|#ha&)Hv*Bczuc!2nQNSzsxG^k71H%POgdl2#}p)B!}Ggn!1o z^z_|84Y6O~2Nr=$uy(`5Z?HpSEpCJD1{xQaEvuYco0DfI;x;-@6rmq%_aHifrb?Kdkl9DtqHJEdG?VA|5286GTPXb23 zSpDs=&eAYHegZb^zioP=@@jjfn4f>3?I)JY?ZLOOh21QB9C&h|mA`1o;IkKiI|55O zpUqrok2g~R%xu6^PRso0(lE^fd9?$rz0z)XshQt6*L*W;y3=xVBe^`iLi#8>PCKFs zVPs{{S&QQZNcxb2ds`3M8vp5W&Nh<9;I#Bs>G&=}NpmzZ@_bFnMnQbfwz5H^;DdC}s58+xE~YY#dR6aFzHNWt*88CHuAH@NiPT9xafq!|+JPg-3mmI+TG$jpVk! zrrm_SlbYO4^25Wk#d&O#xsAVc_PIe-ws;VhB+C@Zwnb}rUsnyp`K-42({X4%>u81F z2rf0VWARBMiYtGmxaD!1Noj~DHWIwzmU5CsB4R-*1t`S@6V&*^D-!<+-%|0F=O4XU z5yfiSnAndR=}69}$PUIZ+Frr&jmrc+TQlx$1>6CbVk`2-_rmevMcP<6i*@8m2{nY< zytfR;Xp#R5DeA?oRJFP~#faUF42(yY>`gqg!Li_m$B&e0s9Bwr{5U z2Vvtp&iM?T7@0nF*wj%fRH(C4E6#x3mC_M>4Q?rU5vwVSwy2**GDW&s5*b|sg zF1G{Uo?F_X2U3ICZvHb_7Ry|qZYJ|lGonsr?Dv^t2@L3V?%J2$|L%L&`qnN rm~F(;$vq--g=Dvf^n{n$cnjRNADe-ru)7CO%peMdkh%z=naD diff --git a/img/body_30.png b/img/body_30.png deleted file mode 100644 index e6ac6d25a6b3551d616d5d4c11fea06e3842dcb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6134 zcmeAS@N?(olHy`uVBq!ia0vp^Cm0x*TR7N&tS4G^B0!2Q$=lt9;Xep2*t>i(1B3W# zPZ!6KiaBrZSZ9Z1?>YW){UViTVXGRO^ZdkF^?PrMSa|=;C@}PSRSD_O<)Ztf{;7>JmMu^8#`0Vccfs!O zGSZPtcYQK_!{ZWL?O7VSYD(&Z(1U+(B`CbQRh-~`@b5MzeXe)c+44pBrrSSj+{wuQ zQJZ^8<^PR&qC0r^Xzob&{4814=F$99m#ypXixZNF?QRAe~EcwR&y0& z%NH7R%5tsMd~rv*Y5wc*Y%!~S?19($0{))YOXanQDA;c%(XngW{8!EGOMRG(S-)pD zH?B|@*AzZ!QLyuXU9Pdf*C$K{VF~j&AH+1)-bzz=byDL)!#^cSb~z?xSGBC^jVscR zuXq=4(wV}ugIPw?GN7BsrFRaS9OLd4eH_w~>*Ie*SX_M+vsAJ}%9?8rb6R8ODvo6h zZ@@nb-LgKuf1`>e=oKz{k8M%0mZieL3v3ET4`-(We=aP z=u#aK$$2!*j;7h6R&bA|+0isRnr27a2BU2Q+BQ)}%h}O#cC?%wEoVo|+0k-#blhNc z+yHraZ#cCL{#pN9b=~dX>;1RqF4o5w?%MxU|6fYkVV7r#A0^Mo{}NZrdhoY8;jh-}7HrXU$#uxLTm}?E%IYB34xlYt|k-*!=VxXc#Q}_xHm`Tz39dQ%_7=cBd}a z05}%*=%~@ep8ms6Pyc;?*^D{RUoWO%oUyp^Qz>gLAeg5PDEJ&qlFa8A~uXvvR=wFUyFMZZjJs#tcHg}S%&_VkCZul*z8 zH#e((Ul4E%P1cs{{k?;4bbS271$}%EetUa$)~r=>v*)$#-1%zj?58I-p0j@W>huYY zn4Ljuudjc2(>Nk()x6t#rTJu~{(0~0Y+Ny8=FE{abcUQAFxkKia^S!8=L2_+t&fap k+1VSny#DAPn?L%dOwC?OZ;p!r2l5#_UHx3vIVCg!0Q}C@aR2}S diff --git a/img/body_31.png b/img/body_31.png deleted file mode 100644 index fd5ef9648182816d700a5b13c3693a18d91e8d87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1267 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCr*JR-mLA^$+3-RtDet z!@M+~u3fw7eTTyN%q9YJSaSS{MF%vz3;<+2>D&!_d{gc!4T3zD0%_^~Y@^(|1Y=!31 zqvgtVtMvA^xli7|^wk}$*n?~1KCfs?=1tkK?nl{!_xfLox%k!Vy|3;J-PII5_tOTj z)UJ7lXD@ocuStCJ9+0NH5z%`exvo7Xbu6LuFJJGX_kIUAd)^Bw1v+KT+GQ1Ct2ee8 zM#R=1uDn=&{^3)V{FPSQz09wLJ>RqDYQ$lQHR}%9^Ys19a{()VWp>SgZFM$hTGu{n z=I!d0V4F8?oAs~^Vty@?xa<8|_Hs3tOx5wZQN5-;2Veb?nB{tZFRM1(O?Q))h9&bR z13j|qLb`S{JKTpxa#sr0H1b>%jX(J2MZW37e^0tOK+9lcCYZ1)jfY}^R9vQ{kCgkpHnmwMmQT6{C5{(jWgXXiIm{TAt4!0SE1kvs3t z_xu0SHn7NAtomF2Koyv_s#mkE6^lG}NoX#gyZg0O>)oWSQsn~+>ks6AVE)5uy&-C| z{Z#qR=%ugoz6x4fuUYrYT%zqo$sg6kCeesS`-d{`rq=o#1;*FAF!`eM8!!FvcJfS= z&>379SWN7FqwI9zp};n;eM)V2)=qj_u;a|NFkoRY;rSo#$B9J`_pJUK2`t4JJYD@< J);T3K0RYCxN>Bg* diff --git a/img/body_32.png b/img/body_32.png deleted file mode 100644 index d984bf58b6319438b91e3c2bcc4b1715465c964a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 960 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}zW6z+CF- z;uumf=k2Z2xwivETrWO8@Og?-dBU^>eTyc=913PHV$W2RO-XqAn8%5Y!=62kTj9V# z>6nH?VvcuMfCkb7{9D|gWkJ;;>BAr|1gp+TyN^~#3!t-YG3&2F5pj4T)U zckuRR3w;~gq=O};O=(1)`){T{zs(6=Hs@be!4bDVZY49o}%{ZQ1^vXJlkvpF60}U(Nr)(dT>iIm_j9isH&8#Hu_$&AR^k?i|6FQFG1L z#uvd_4>+_f2_r%Kk{OUevlJv*DRLY__bIh`90&0$qBNjPne!8eQ)^V j?2T%ABxR5t399!Q6(Wp|rdWJ52Jt;z{an^LB{Ts5ozNYX diff --git a/img/body_33.png b/img/body_33.png deleted file mode 100644 index 1e6d7d0a44b9a4b7c0b12138bc034c503b97e595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5284 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 diff --git a/img/body_34.png b/img/body_34.png deleted file mode 100644 index 36c7e32ab32f33cfd48c6e5846871d5d8f38f57b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2309 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 diff --git a/img/body_37.png b/img/body_37.png deleted file mode 100644 index cd877cede6355a7b4bb42d252f8aca918e796fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5113 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 diff --git a/img/body_38.png b/img/body_38.png deleted file mode 100644 index d984bf58b6319438b91e3c2bcc4b1715465c964a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 960 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}zW6z+CF- z;uumf=k2Z2xwivETrWO8@Og?-dBU^>eTyc=913PHV$W2RO-XqAn8%5Y!=62kTj9V# z>6nH?VvcuMfCkb7{9D|gWkJ;;>BAr|1gp+TyN^~#3!t-YG3&2F5pj4T)U zckuRR3w;~gq=O};O=(1)`){T{zs(6=Hs@be!4bDVZY49o}%{ZQ1^vXJlkvpF60}U(Nr)(dT>iIm_j9isH&8#Hu_$&AR^k?i|6FQFG1L z#uvd_4>+_f2_r%Kk{OUevlJv*DRLY__bIh`90&0$qBNjPne!8eQ)^V j?2T%ABxR5t399!Q6(Wp|rdWJ52Jt;z{an^LB{Ts5ozNYX diff --git a/img/body_39.png b/img/body_39.png deleted file mode 100644 index 0a551af2f16b98bbde04435035e90ead82d1480b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4440 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 J);T3K0RYCxN>Bg* diff --git a/img/body_40.png b/img/body_40.png deleted file mode 100644 index b959415d1d0bc5be26fed2d7bfc6fafc5cf271e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 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 diff --git a/img/body_44.png b/img/body_44.png deleted file mode 100644 index eaa7b1063e6199272ed6ab8336361faeb8c2bd97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCr*JR|xVgt@jRU(;k!o!C{g7b?icc0Gug6P>%?;SXEZ{)R{` zC-vWqYq~3TXF6UNn!r`M+I*7Ubw07Cq)C$}ADOfL`Ok?Lncx3)mUCUFsiPmPx43Ur zXj;~k_F6ZN&>08U3a#7~nxy_=Sxj1W^^JCyf+DA#$G&Yi&+(Au)Q(Uk^}MM!%zAi! zvw3=*O7P@5Jc#h)vm5w19(|BN^bju&p*7};D2h3w?%vQomIx$y$&X9y^^tE z`|)#pU#*mt@7(>!KIdSyMEm=P))KPcCQ4pxu)Wb})pI~L@9L!JuSy~RDI{raSuIRs2t7nGo)aad|^>L#0?Ozuib`A^Mv3F@){!i1=AKd#|=Er~B zz+=@Sx})`4@Xo9CcUG0Nz23Rm*vxFle*Z5=zklHUWA9^P3GLG-`Iag zYiCW~)p-Z2lFGN=eZMwpXZu`6naPE_bL+(~cLDXC2kG;jK7CL1^iMbUKU}r`c*-5s zC38=$-8EtRS}UUnUvY5}F3tI}jrV_7`5cRNxV7@mD(=eLtCX9smJ~ZLp7`k|+n<}) zla1c7UGjSx7JK4$n5^WQWmoLuE*{=~VL{c;@4K$Pw)wq3Wy35lRkzFke2-|{vDx35R9w|MkHr+;hU8ss-IIHD;=!z0^V4f=o^F;u7!%)r zaz~|y_0;H6#r){flnwK4-154-M(K}1L$Xnx_SN4P)=oP8JnXIH8g(;sN$JmZ7=0WBy*BWg?q_G(z+t+=fwRkik@e22)V!`)(v@)*-x*F${f%EM)cqM&_A5oojWbBU7tBGjq}>ydc)ka z2d#V_ht1s?%Ejg#Br(`<>(kUzPZQ$>9k-tH>HP#O02Xo?0}FuA?OtzK{;|GW)wMd| TrPTspk;UNY>gTe~DWM4fv~eZ@ diff --git a/img/body_45.png b/img/body_45.png deleted file mode 100644 index c40f485d709fd05910cb7fe586d127ebdc973d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 zcmeAS@N?(olHy`uVBq!ia0vp^DGUsZ6F8WFtm|Kbb^s~1ByV>YhW{YAVDIwDK!Gw( z7srr_IdAV8X3Kn&ZU5-Lt~F-9?iRnnr%P4DTVq;)&cX<%jV(!>M}>xlz~;sL6{n^bi0@;3 zp!!4dPss<@|H+O?wcPU$seceScVIu`4?~&5R)56mn4h!V=Qto|Blqiv@E;bn^ZN^! z^bgK=zrWM`kLhdv58gklZEF5qw`s|LAp7I-%e!B7l9Oxs_P4oTuKlR|L-fznqj6uF z*^d1ZyEk{&6=D8|u|M9q#+FQK+-Ns->AWB6f9n2i_eoD!bN}yy*H=E z^q0^-)7QoS8S7_1*A12yea#&)^Xty^2kSrYNzKx3PII$wKmWkq*!H{o2ksv~=jdDA zJa|g`!>g6`w|{>ywVC&Fr}hV_JvPs~{mM=(`2PNSV)C`c<`0ie`2K!z+~#{Tz8>eY zXfuCa*=?Y9?ezw`*Tv=u>GQU89KM%cYZAPkv&QCs^fFVOYwZR1?6YO&x`ND7|hvk~OjP*6~X^oA~O_MlEx_wsGUMoQb6g zYo11@$Vz1Y6pLg(7PZgyTHwZMMH5Ry)+~)lX`Omncaz_9hI4X<4z8?!{JX&Bb#ed0 z)q?-kud1!SptgF$mf3687kqe?2@Hhqmj9}beLeG7bYE5P`?z`Eebp^( zTK3w?+1tH6{`Gav8LLyfcAo5&X3o2JTYBrsUu^y9vZ=Oq&(1n7UejzA8J}KzE$~_| zZy6hJSMTkVzZuiwCUeU7OQ*_iKlw}X`CpCKzpUhYz}%|7+2*n9PqsvFkB~M$WmPiy zYwo(Zx!bP){2a6UShO>{iF^L0edpia&dD{b{I|S*GG}!3ot=lP7rRFu|KEOeske;m z#_h+ynN8-LJ$uc%O}kD#Q=80r`}Ujn#U&;`(qDD9{@|(0?Y$dYR=%^me|LH12ZjfS zSoPv$zUe)jDW-Jods&&->T|)z{!8gi96F^XvP%=6eo9>zBUyXY$im{mejQVZx?g5} RhQKVikX30ZYDtkic;uz1SV7()n8-t@byb9I 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 diff --git a/img/body_48.png b/img/body_48.png deleted file mode 100644 index 40c6e76f8b7f2e2eb24fdbf8ba87bac547935881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4731 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 Q_Ra=~uHG({C(ft+2X>4?5&!@I diff --git a/img/body_52.png b/img/body_52.png deleted file mode 100644 index 7d79dffce38d74fc5e6c018e8c30f331fa42f476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2318 zcmeHJX;hO}8V-u0vR00yr5~_s|NE0%EVhPKTGzlgUYjm_6 zZICj`C|jAa6UmnqO^}3ukzpy+WE}aBEeb`Xeldi_4tGA_{ z-MCd*?LLuTlr?-f^vU1MBe6Nhel4b|$%p=aA<0cA+WrxBxM1*>pBL-J)5VWW!KjD* zyY2A8@=fk!G|Tvge1D>esp3TB@-|4cB-FFle#(d8Ny(8PuilX?@raCezwg)>O7}9X z>hSx&`8QIqk47DM?YDG}vFNe6>md{i4>|D8lkh_*FtGCH5fN8q4$tLzNs|7${BquA zsNgheQ}v1FJa{A2I)|S_f@1I`bm0(gRkLRQ3#~ z-Z@te5x`QQHW}Hs%er&(hYPjAYRN?X(#5EKWL?7{<&={d1pW969DjWazVp=%%ylGU0I=PWs%aJ z6M@>$Jgh-jm#49pJUfAt2=pVoO9z$o+gwS8r+oeZ46J#A_3G4JwTLEl@1fBd zwPwC&jMr1us+}Oh*|5S>-gJurstD*WY{O0735SxR@_L(`iPGHZPvA;)y)n1&ThlBJ z&Ig|!vY-I83{5+&|6Whg>8w`ke$D8;LY3Y;IK;|nFHp^8b023cm5kZuA%i}z zqb*=bhqLvYSw5Z}yygHtCkeoM*OGs)A73AE1ttTO8x=Ejw!i>i4pWn_)(t!h{@10$W1DqFs!npl@tX8g8XZ!fpDRE3)j{M0`NcL*o&O# zsRPAJ1r9!2Z@-J7I=-_D*v#@av>O)yz&OxKiipO^p`bg#Lx+`-BeF(lW?ak4+5|Wm z3j1lNBS8|BgqI6wRPw}CLKg)bhll{#QJ3KIZ`&{3%Xh#$sNO!+<_rQ%Or1R!wnAB# zJ{~&$ng=JszpLE@n9>Q6N0og)+hN{h6Sy0Qun=K0R1xRPzCcyfFyMZ{8BV6ZJ0pJb zsZ3nEyrOIl{3WdW{vzhVq=pyjt3(Zy!T!>{O+1+H0>_{bkF*zEy1|1P>{3)ph#|GS zBCX{Yxn~yajNrCTNL#*s3!SfwvXm!Wr`Y}iJ?RPKJ|E73XIsYm%h>Np_ZCi6V>mfY zF#5JYJ3MKrB?6kk4xDAa>e8<3yV*STVArF;dO_jTNl`O0b$co&v)YxNnzJp$ zYRsDzv7?G^1lty}&sn=f(h9olhabw}j=*=a&t|6A*NK$nU?6IbYoghm@l8!p1FaYa zj=Vbnf5^gg*GOqrAht)8Bc#g)cAI)D^ZO3_f<`0q>@pGl6ut~$-x7EXJ_U5X!D)iA z4Jksk8#26CMp5f@+E_-G*jSZ9rQ5T>8>F;=EMNyHD+5CYp0ESkKy_z$ zR^ii3IEpX68KaoVkwXKwW@U3Dqurt$55>IIL3 zLD$Xrpj(Fm^rraQK44)oI@!O85I$ySXw} ziAHD!)t}ej3zLJYcoTy1>cr$9SGj&0|Aq3ELg93~?4^ym$*B9yO1z^-h%xd*bm2b% DMvf{> diff --git a/img/body_53.png b/img/body_53.png deleted file mode 100644 index 8a9d7d8078f4c6e6188eaf4d25a97d345e971f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyD)~H?N;%%>Lo*xA%`7=k&=PFu%R$Y<#Cphw6mmo6nx9`@pvEjq!Q+{04V50S=}{ z1vv45uSouOOu6EJ$u5Ko~WgSp`;A2i9*)OWXhFSFVdQ&MBb@03y$o;Q#;t diff --git a/img/body_54.png b/img/body_54.png deleted file mode 100644 index 8f1b6962a0b392ec9117042681c8c254dba29884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4676 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 diff --git a/img/body_55.png b/img/body_55.png deleted file mode 100644 index 0f8752b082952c4b5fe30f5cf9e9f80deeae5338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3356 zcmdT{X;>528XiDJONF-Fnpy=~ebCz?P>UoOOcBLKrGS+spoGvOL6U|XU?4EJMVn& zeDC>A<|$9&);HdN0|0=nCyu+F1^|P3^xn656WZd~;`$VQZ2H=r=mxCoOR2EpHUPZY zcf!rpC$VT|_<1h*C8KSQmu=HxIj)BBN7DVFV;Mf|Hu6_}HG531d}saj-WdP!l>G5CShlXE z0P@088ji>gaUU_d9YWrUZ)gP z;`{<%G}HD?EMe|(oz@k~G^bAPgd3L$wTQ4MT=gM!;~6whAYvvL-n(8bs_Zuj4 z?`QCD-KEg)UAX_GHi_wi?{eGb)f@0-r+hk>Qy5f+M=a~zzF@DgS79PQ2ff+Gvd>iau+%vZ_>C z7_{J!>z)srrQMC>-_Z5I*HoAV=@+=Eg(QlCOw5*;B~(UxTH zyHQ%7VTzqB`$#+e&}#L3<4ZruqsyA0lL=m-J9pq_^(dWCl!6Klrn;#8WjB3RSZ~`D zqvlfuRjNQc(jP#yFjH?mK6FXgU}{l_f{4`)_uGpKy19Qq0T)ax);2WyNeN9$!&L$* zt6(o2j*b{Pq{sR77Q78Sb#b*<<2#`E- zqH|#Aj8Nk_GeXeQ#UdaJa%Pt94B{EOli9SS_uw4r!T4rSn7#7TP)n0%QRT9lne4?; zz4{qkMY4}EX!QG^<}5|5DF136VCqWkAe<4NwK$J|u=rJYIDPD}P#Z+}<*DCnByvc1 zUbw7|v*MAHcXAy))WR;OiG&b6=9n$`xHNh-erVoK(Qq-1?(Q7_-(QMd<5VcjEN zLE}*2Tkv$DE_`rD`pjgnZYE(kUe41EO7nyzP`t7?Zn?uAel^?el&3;fAPd%7NZcCD zsCu3KkBe5YtPa<9T;e00q6z7cwNjDZ z59Mr^$paV%#zBA+PNYW+GW`vRV5u=aCYy&3SOvMd>$ao4Pg2e>PLm5R2rVEo6zRal zHPu@8+U;=bSAoZHRfo+(*S^F9(d_c~-2llG;U^t@ORFq{#XNF&&X-6*&WU zz~Djo;x}?};KQ>#ABW)u%EPqbP3x4=1ZU7XH`oBTMS3sRNd0io@)BK`+_w3H*CHp zsRR#0AP{@yvpDmM{GCS&NcRW^oEvF7s|n_H%2RXvjfaPRLeN#*?eB0mDI`y_DlC<+qY z2lm;_a9Bm5*1(ewl_qr+V9WE*8CNl0PM1ECiNAiKNbzO;NRSq|;!66n9m6X~) zQ^QxwO`2KkAWrIOh^#6pKC>>L)D#^AWO`8z28m1e-~@;#;OYira2wh@I=BDt=7O(N w>GHGf0qg_&(*OVf diff --git a/img/body_56.png b/img/body_56.png deleted file mode 100644 index 37277464921c92b9fe0a267e2aaa045be6877aad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4690 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 diff --git a/img/body_57.png b/img/body_57.png deleted file mode 100644 index 33357e285dc6c7f17ed1fe61a612b122d2b8b352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3655 zcmeHKc~n|w7Jsp(rcJ7`HrR;@6O-zk<3iewbp@trj7_x|jSDK^8cmATD1r-ai6NmqMT0=x=aD(n({twUndu*M-XHIs`|kJd z@BV)G-tT+Y&R~OHdHL|m006vl`u&sP0APUwfIaT}UW6@?BCla-dY}@X(zVedx7I2344G8c7IUQrgEp)YI9R7xtk%%zFEBSbHVD6aA(sm zY&vFpM2PIV(H4Q>5ZP^Mm6Q%y>iR6aPnQCV5t!_K$8{Y35zj8=C9m$R8}epuS~G{F z&{X(qmIPW1GZ++sC{V!6jBr)tk2_tw;TMmJBal{qT%H_HCM@z}(CL*!h(%b8c$a2N zO0Tg~%PIQVglUD+1KEcUMaL+($TpN|g2_Nbe=G6dIK)l0#Hb5eD=CKwE@SkDkWS=X#;M$q>WaHCI#QRyxa z(E}?cmpqcn4X@(dau&i-+iP=GtVxP^Bi6uJ2wvg^gFk!B2n54$Jrt*AT1&}4(4uy??-8kZJ#{m z$pBh<%{`R+TZtLAB=+5R;RCVP+@dv&xsT;E)&@A0<*)w0%ZHAtNvRxpOH2=}@e*D2 ziV8~L^t*9?xn@UJPls)1FLyWUKVa0JYDlV_S0;Ca=n|{Wjd&)NgSI%gl}VK+`d-of z@_<3nXR59|1ePz$hVb7q@xE_QHRIpMK2%q@#=Nzw%Ql7d?Jn{iAxP_{=D?b_H+MRo zzxOE;Vy%n0m#aaQ+(|&jdT(-${?l&(<=)O74`lQGEJ%Cd1$Q!L8vJ$Bnuk5VQswV~ zvyMjG-%;-jufbt4V~fsXIHyaU7B*;{Y3l9V88J9+_A2v`*lJ#*xyvB73TzneBq~Hi zMSpBnTGRDwY_Vo?7}23`y6_kiW2{SrNa&;o-ul5EO77{28*bUZo7tuM_mDn$&I#WA`hr8)S_Zhil26>&sF9_wKcq$ zSoQ10HR!`|3(`MHs>vrqv**Y-B&c>*uKu z?^z--w2o*&dIg^UO&gIzR>Qbeor37wSP$aoYsp|M4DtHyxPVHU*RDFN0e)c>jaJMR zNfb$CcH_xTP*OV+5TSG%2x@+JtWQ zT$#Bn8Z$FebqCw_up)hbsI3L>1!5bTP}H|UFklT)hTBqsz`A7FprL^;fXK1zvt4EV z774?scob1Q4vmMnp0T-BDKZk{dzZ!^fkMPBh8uDy+xtp%1`R3y7~{r49FX4X0NOcu zw9Sy0RzAa2OkJHm!UL4y>NwA~89mh?y+l^NVX?o|!%&8vP~)fX8({JI`w)##p#6jk ztC5$^&M=F;^5B!$ggv|~#8&KqrraRI@PJ-Pb%oQ|_2x1CVx+z2FV|U}eann9;1x}X zQTdvEyUb-h%piiF=ihhP_|TvOM_TmQh?3}OOwP==!>Fke!y_U0-AMbmEeA4hhP1LL z&AO!U-Q`Me>)$4%Lp6zWPqS2L8p8|vqfl%+@&+=o8x3{m!hioFc?Q8#I{FQ|EOX0{hn z3@3&I$B2d`isJk7=QMH*=MDHE23r)@yE9?$f*h2aCFs1(tYvP-1~^mPX!Jf)8W>%% zN=)}QhoyZZjBR9L1y}E!1!XoWtkcfa0u1Rw@v6l08~hbTdjQ-O5mVn=P1_~a#bpfu59Kafz@Z}ETAe})OFT8IPy7WJkO zFV1?VXlA41i>M!aCr$2i2dLkbYYGkN6wc6DpAsKPst8?_DMH1Rgf-%&PUCP$sRXSU zUnJZpHi$Hh8jdEEo|y?Lt_4j@D`q@<{#N>as3@Xnl7ilXj-jK`f^6tp^mt}*_GhLf z5u|U|*iFrXX2W)8MhhyQz7GpJYOYLgrmJ5pUaX#Y_@@%b9$V2#s5riq3-FL>Nkjjw zT&;?}9qkc*sr8UNJ(xjH|wykmF{##-UOY$4fGe>xK|ZMGyo^AU-0=6%2|LWTa3bv^+#+5e#`dN)f5T zm75@>JbVH(g^+?p>;!^UF}+w3VTy&2fF(##9zh~-G2mS6tgiVqpJ&!t>zwo9xAxfv3hxD47=mU>V!}_4S2h}uC&%j0KgoEXuBi1 z0DAC`~FEn?C8XJ)o<)tlSd}{>!5bDkJ-#B)@SZ_%4 z_z^^Z7FMz-!>3ngj27MQ5P30YGENQPCLHLv38pvC&mLA*|9zLc123;gvPGA>KxfoH3LE2);A0Px9S?h4>U#BN?0jm%-Ey=5{S^!`}ud) zdXRelo>;GLVl6~@f8Z;6QKfd5O+wXv{O#HDJj%k!<7D_ywP2RT9}cO;$xZ5}G@0sk z6k9$)pHoN8y4oL*1oh}co+hq0_){KbRx3g3b z2{DPhmV&l7{wNAkH&rD6qJQEkf5j~?r^rn17Zd8^!muJld{j6=emW zx>4&_`(UAmZHi;P6WRt%3<}_QV4ph4(~tW+%?wP+mMps0+!r&xyn2{Bs?Y3K#rP74 z*tI*nvrNKbga=GVZOu|9UX5_xk=Or;lg`UzMBLntXwNzSN8!)A3n>d#M+k5kX-!vW zRj6W4rj2fJOp^Am&)?3noZ2$LoMBW&hzn{wZaKqZa-~{P*`s+dp+PfNt!!|dkm_(Q za+%xTc+emWL`;ze;a=BwWTBpP`nX1Z6y5W~u5o%`)!bf}_loZZn$Pu^x^|N{Lt-*l zb+w4zX7f1F72D^e;k*^I*M8q;fu#l0Jb&L4Er#RPRb zIAuc_?E3L~{8yt5r7f-((>2QG@n~NS%-KJcN3+|Sn{72)gH@^{DnVY`5Oy{MSB3(U z&^Km%w-(=&d4_z{F8=N?p9dfe72c9u>nxYGvUBlAo1fDTl z?anPG*BF=ej=)un?Py6UK!j04l)WT8;Y(_FEX+w>5g1)i;`L(lFp-SWa4@KBe5>`jMfX46h2@17e<$d1AY$9l&HLOOcH;hvC?RO} zATh(@MpJvczN45^^;9f9oPdYhg@>Evjz;(C%6jYZrWNcS&~*pB9{=Z&h7V(6pkQl; zSDqCyUewguoks0QyXm-bMQ-+FAqfjcH7S$L@kvHw6BWdg|M<%nkmfnS+~#Jx4K%mn8jnOz4nQY#VV#%5mpFbH zeVkshb8c9OC@}%pZA(W+Y99ruA6}3MD<99ii01?VhEYmN~Wy5@8a5wP((To54+(;h<(c8n$$@s(z zA&9*4DGMxwb<+3uS@j}Sg5K76aZ`QsX$!2^uYWE5iEp)Y(Qzv==ki8j?{<7#0nk1s Kt$xpEXZ{5#6r(`^ diff --git a/img/body_59.png b/img/body_59.png deleted file mode 100644 index 99cced381d1453e8fd3e7e5c49b13ac60b4bbe17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1661 zcmeAS@N?(olHy`uVBq!ia0y~yU~U1jQ#hD_WMD&PF_2rsqA&l#C!BX0r(4aNq%M%I zRk6BVFZQ2z_uj3IOGKITMXS888VW4 zm>4b`lVD|7&}+!W;2@nW!q8xLOoM?TcaSN3)?0mY?>q0FJJV0jpJcDresXJy_Rf2? zOD|qp<+s{u?W--TE(006Qdh5y**$IT+8FWIQ`;10s=A-^eD3;bcZ&W^&$7wdCsl6x zmQ9*{viXVYci!X0TP}HNuf6s(W9e1>D_N87-hK1t$+NRI6%)kui%Oo%DM&L;{xaqB z^CwkCwzVhxCrh8a{I0t1VaC#_VNq*OU-Vi%FYNN29TS)P|DJxIqu;RV)6d#XwZFVy zE#Efz_}%SSvts+gqB56W-6gX&&U^J+o4Pyp|BjXQTogVRe`@_Id0+D%wF_Yiwn(|I zUU}Z#Ut;m(NF#gy0tKW3mvFY_%kZ^ z`NhRG8#Zo?OPnTSX>aX6d2dQp)%MIy(`{bwdoBS_XWLX~Pf9$O9Q}u64)bj!B69!LLKbLh*2~7Y%PY9d< diff --git a/img/body_6.png b/img/body_6.png deleted file mode 100644 index ead7efe8d6c97c0718f6f3b367be2b4f4d785ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6096 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 diff --git a/img/body_60.png b/img/body_60.png deleted file mode 100644 index 527d06283891338af1641519565fe64f0ec70108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4211 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 diff --git a/img/body_62.png b/img/body_62.png deleted file mode 100644 index 3828ce99e11d99c7d1a82a4e18d7a72a97b3c9ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 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 diff --git a/img/body_64.png b/img/body_64.png deleted file mode 100644 index 71ea68c1b2faa850ef93261f3da45cb78462123c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9359 zcmeI2X;4#H8isFjlK_DPm0iNpVxx!%q6iv7Xc|Nei$K^!AV{-lSb{VVK_!7vTxd{P zlvUaVP*Fe@vDvPo1{Hx}3m{-+Mf+{UO9OMuh@t z^L!RRCqcSUGx)|{C}n=K8yIB2f%bH0y%-mSk%3GI#lTfcCE#gEi+ouMDH=gQ1|!s1 zy3l&QWliTW$C;f8dGp?zM)VLtdplKxKg*74nV4PZm>rdkQ8lbAYLznga7S%J-czlu zKp&z_6RhBgZlI~vo#5U%qU3d9w7?B>{eEMc7s1^GjFfCVlEE&}jvN{_;Mg9dy40S@ zW*7KSs4lnmyMg`kSzHuo&+!DKu}yCztF?@ZB>FcKwvly!FtGn=guK?ooDW5^Qf%QM z!_P`mv7yB+Z|7Vt3sXA)~_W0_W2UhX18yte35 z=hm{5xa)~3x8`1N^OZ4jW_Zd-nX3@Z1kdXoG}-B~6B#u1;g?P?&GqqzboKI&z{@^_ zc#dsM2e!#wZQBXjyX<9enpAjU#FtgndT_%}>FjS2=ZBXpbT1_!rr9#z8@8*%d(;Fr zvp}llKe7|J*X9XETwd+|9cu)m8;g;R$TsR)YsCDBffIR`jbMx=7twsl=R#y_$Cb6b zy*2&zi~l^+G507A3Oyrq2tKU7#qUg?O8rCT`R~z~4S)SHkEuZ{hHpg_v62KFGO`XJ zO9xsm!h7cnUKI-lN2vK5>$uH}Kp;{EGT`a!?O~Co>K(TVM$ruMO7sb!7NA3Ff`fO} z+|j|vc=i>r`^dPIIq5hm3t?ifvOD5|ZTN8bdS>s}f`kXHtrRbdn(2{eu=~O`ZeJ7b z3mQ>ELId53{7>kt6j$FaCNywXs#j-43%$RVatXvE_8znABQVz!b?iM-xA@|i?kh5i z#*Jzjh3NA0c-5NB8;r_@GN2L1lzHQJvvDLzM~A1%r$0{rUWcasqksCa*p7sL$37)p zUzwR-25K_OjfZeUc7uMu_NlfCfS%-*yq1jEsrv6`YAf7JTc!-o?ukelHmpjq;kiCO zZlkv*d{n$cS(=iL^20XKW8v4yMN8&|5u*mm%7Zm|46UfG=Z~zU(rnw{cTowQ)8e)9 z56F>rvmr6VSADog>(0DFjk!LiSIjo0_dp!HN4uqsLHq%gwGsNBF=Ju8Lviz4UYoX; zCPP>~Noz+7J@jZ1m%7-sv!e=h?jl(x>hxQ=cyJ_8Nz5d-1XYbR=~NSnFCZ6;i&X^8rtMd7G}THRY?GH4Jjv5w zv4l0iWxaxifT=ENyOQ=&1?W4TJRdQGEJVb#)9;-Ml&h2=U_9|Z<=4Q9f47!_nK2K4 z*Y#pg$8GKrUg%0e$}M;sT80Pc?hqPwj;E&WsW{%&nr9`xH94QlSBm@6c=1`u`yGsj zt6GR}@(dfjX%YUO-lcSQPlb87)14FpUeKzH42tu4)iqEiY<;|6o(z0xL+TmwYy$l+ z=@*eJ%2?4*5!yekjK!A9_PwLls261y?q3b7(D2Ok(atZqhPmYQ%+nFk`?z3$omr+C z9or)v&ztWFer@)Kt3KRif9LI}!!EWD`h&q^)AkY#YKZYx-*s1)U47YFZ&|~t6d=Pg z{9xCWqZL9~5jiW1Q8POXH+C1c=w@4_HndgGM((j}ah<25z^9Emj(7E*ChV?YZt^&( zga~dQQRz?%a=mwrC{FO7(S5IpxqjHMt8e>>3;C`NH1)s!fSF0T#f!6!kDYOiSqNyL`yT&m5XPfq0fXB*v30#w^$u zmCuzp@iZBV%-t8WrZPt$po>l;v5IatWZ+nrs~709E0Utyl?>%YbPld{nV zI>|GCfiq};_h$hdT;te@WDi^$>1wLk%$t7Kq<7-3FQbaMcH&D**Mk^X{Y-UO)Rs^&npcQp!MIG8dnUF<5D*{>((EjNi+JH^A zg8+asT0RT#Kf1L~OlZMyS|2kPBJ^n?ivL%b3+2@PFh36VpWPw}-4$XvNzzf9-cBu% z7Ut`Itn%>d&mr;cgec)mlJ8(@MYU9;^V=f2IGpGTrwn^OO)>6^Ne9^3ww}?aA3Z-+ zA0H=Nj?PL~@?O%xu^~k9BMDAoYUbB`Ig!9VckbAP<|c2yyxx_@uHb0;zUQ2QIlGPSXD1PiiG3q`Yx)gwr)*ICiXWMCWqJ_R1JF z+pNvC_x38DjXJhuY#fad!+(u|lU%ONFYL}Dau=5NZ-~6QKIrleQ&4^u` zziVLNMA}8dg@tu|7)#UO$P2H*P2ZnT!Mz2YRgwH*xx)L-%__#OHQKbU)wsg%Ps-RD z*0>^>H1e!z+S$PBlV6L{hvs- z7OzHr^0AFS6IvSGc1@`vvP}FC>LBSv&|S2`Hs;3Je)!w}K1{$J7Rcn&_f?@Ww>2F#2|s)_~6b>N@uS0w>cDXIlQ@KW?}DJSw9hBhzMlVu5CXBe^p z3Rw@Ag(SB+fx5ccDCF2WKfl#SKH9%3qm?Dt-UocpgVxs2Ez0UD6OeX8x|ctPGUsIX z?!^Y}C+c4uAChGx^>0v8j+>tzczW(Zw8Nm#ekMCx4DVP|IxR`8Bhyb*@3|K>*KUM) ztkD2up`2N6ccS6&OqTCe5RA07aq_mdtM4Tg7AkUbnJA@;Ur!UjIl2(PFdh@@{*X5l zs{0-ff=b98f;lhfIr#}$IKeW!DSY>Tj%i0{mCJ-CLmuKRG;LOI;Z>a!Qv*r!Ml9)C YndGECd28kmpD+TfENsp1o6%zb1*SX0F8}}l diff --git a/img/body_65.png b/img/body_65.png deleted file mode 100644 index da86cab67c91c95210c942748f5454705b2f8795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2700 zcmd_s=TnnO7y$4$2?-b?IqJ$!d0fcz8L@`nXb1&+QcaGy9aL(?`?lb#kpLu>;681RSE=Mb) z0RUKTZ)fEUjrRcn_JLMWMSveIog|ggvRfP-`qx37F zD{n73XDsd2%zR5G!<(!$D>W-edhN$P8k$ht)q?UtZihv}BN4R>^RWZvE&d9#ie~8W zXAeszmEt|;;GvSUXU85Ha7?(x-F;xD%9QIxCaa1LN`j7wf)}s>ia6IEW0kxWIZ*7q zhF&|a)c*U4PCbOvI`?c`%C_6^d~DV;V<^lw=slGZ7{c*?UR;FOM=cI@YXv(C3g+dR7{n%@5A#QT0r`o$c)a_sqPAOiwp)ELYVs7PZ6PSAv3g?p^pD>g&7Ba?MOPy;Og3oZkub?-!o1(=!t3hfsTX-Z|^8JYFp}eSxUf4C5`HEbR zr#2nFl3`WVA_ERRZt$*oH@d2aL}p=-uGb9Qep&4(Uf(L-74ldSehnHyHD(FJHwNqW{oA`InIkcjbOdZjLu_X z=kudH13b{hT1!I8aM{Nq`joj8glcsZXAOOUl~A%t)~hr%&L!%GUv-N>ikj9N^+|Cx z=i|?&IQ1LFVW`5=tzQ&puK!lC;~fXxn)g3Y3|&iY-%&+OEH?7UdPwvu_b3#gQs`&CZ8?j;5-LnwcN_ zsCcrG^5fCKVN_B2N}D~SB=1AP(}%_8-H9o!Um&ynTwYJWDjTJ>953X2+Cz#;%*aU4 zw3{0_qPf2brwHW`T)Jz$g9CN$?YmPAhoLNotVv$Ek({@iyz20axl4I@kQn=Jl_VZK zy6oi3*txkNI_(~@vnSh-I_cSHw+cHrPcx&H&3azK%hd#Z+}dA{h?8}v{1%vzQN|u< zmgaM4w|%uyg=3d^{)kQX|P;K;uq=##H@6FDS+vr|4 zJZM=LrDkGU{vl-z^Sl;CT-<+`=<;ZO{wMPO<7es9oo?RO!x*d-=t*$J(07nPikw&3 Tf8GcBUIO;kj#k%pkfZ+ra1$G{ diff --git a/img/body_66.png b/img/body_66.png deleted file mode 100644 index 5d04aef2ca6dac0ae14b8067cafdb6beabd7355c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7781 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 N^>p=fS?83{1OS?#o8ABb diff --git a/img/body_69.png b/img/body_69.png deleted file mode 100644 index 2b9dcd3f9d7fdfb44990f4c9e1637d6f8036cbb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2083 zcmeHI`#aNn9RD)syP{b=E<@O}PLfdM%#^W{OIl83E-lq*rOrf{o|q$xVRUy*7njIo zGqWbrT&9gDB3T@wVdl{}x>-{Vnaf$}A2`39=lpP<_w&5ppZDwic|Y&V^ZtC^7x(*k z!L&`Z0RVvE_jnKhK*L6TezFQwbHdn2pjv>(y}dku<*!sMVCDb-bO`UUDa%D&f3&_)V7~!)DGGh@>D) zP@deVbJ-}98y*#QKa0_A-jXwF8&G;nobc#V7Z$1TygJ=>NZRe-kkfeu^(N-8jMkBw z3g%kCTPUwc&rEx1Pih%A4!8x4MZ2VK6xgO%Sfz=w_1j4JOUHN{AKMYLj~m(G?bqa$ z8G+t}HUFFcNn2tuE=gq~KHLT(j!#@NQ`jpy+BdzuBg&4=jFFj842b3NtCaVoV~gMr zAQ5`XOznDwR~8khk~;SU_<}iKb3rd|H5R%w+Eg^_I-@_Q$3yUkpOg)gd1Yp@^)fvf znSCzk(82O}R-7pxEo|89KqT;;g$SXej5A3{PmBfar+g`yX=Sr7Ls0* zJUOK)H^4@%jfH&L2QOKkcmFWh0qZGV{_=U-K3@e$-TY}`paLxe6@$s-ygIEbW(;{v z8r1LPMRowwq|hxtFX_***7v9X$XRH#^p*Ag_&WA!0mczj&4`LzPWD(&O^1-U^ULut z5gIyL>TZ`lxI8tnc{GyhbnjlvU1zi>qU&&>?&!TokxR?U#_-5%T=6k{iLNQDE4Zs2 zG{q9-E2%E3N=CO*rTzNd-MP+DYrj_4%Gll;_CVHGz9csODaGOk=S1^OmMR=`G_97b z!hP$&>EoJ_WAbgm)rK}(Tj$~$8oM5u(GX3d|s(0h=#9z~xzEzJ@inh0bs>(2<7b2u z)1lZwRy>nd#}1EPr`wbn{7kIMd9L&O&0SVgaFPnykD z%6>1cm~(wGZiyi1qy(m9AAJUmma?o`;0VHcwSKB=DfF3^!cX*R_r7V`FG8=aWrkoC z2xXn$&C7+!NGteh;jR_;#Q@xs!(IAz{wv}9?Izs9j`70I(6?i<4Jnnv9i`kM*I-KL zN`+XvgR%lgO8p8fp}hD8pU~v*OT=V9dw9!u+xFg2>-!nf;qEI+T@`M&nu45!IUc)hhZ#C(@wTEKkgukM9)<$P}~;G4^`#ED+>)6*YrSqrmQkqs+ zZ>o9g-r-9p>=^Gc?0a5+{FQ5Th`;E0#&W&_J=s(?Z{;2Adz`m!mbzwEz_=s6M9H-I z;H3#=4WE0&R@+AJHJv9u)8j1AElZ?(#8=y%ZKT99XQeErFem>E+tM8zd&S{;Em&_w&AH0it&p!Eu;nkC0gUTBB8}3{$ z_U^(j<3GFJ8L}L>6?IqG#C^8tuG;-;FSIVzD^dUQt5)2vq|xbmjrczU#`<;t%h#4n zpZ20`ciiNHwQDYXl><6YDm2^cCaa$)$TbHq3B)a}QZCk1Z#dfY`sE7a2&qfIr*wvK z?+8keHSGlY{~mK1_ZnmN7@ZA$vyLQWdKe!_?-5@scJ=rfA82?qU0-?5zgK8&Fq3_FEpepbDI zn?q?#jcj?CRJ;0J(`A_tn(uw(y;|?|aS1S%nU{Zj(d1d^xW+jHgDeV zoFCXe*j_!CRUaMw;fv-RYxeSYGGB74CLRoGzRP@%aa;Spxwmf@JZ!RFdpK>wl>qAl zm2RC^=dIPXsF#~(uWvTxmqA3<3h5qUU{aiS@a*iz{)-Pv=$Kw<=P5eBYW~~Y9d)&T zGEF3!m$FrPeDz9@l$M@%*-8g!@fTBr(44Kw#~&PQPCA__4-zR~HTzxan>Po_?~6wJ z{RW!5plG*t!^%w%=`9RXs`JmD;o0*gXyel@{2&u~Ux-ELmW%t%)!H`aTjGW*4(pkU zkA_(nGKqn^Vax#Rbgj-T)J zyuR+>%gb`HGg#QXe>EPx_cc7O?q~76y4~+8w;W&IGN?-NW5D#5(ZhE^?t$SN-VYA4 neSF#37xJ##wli4C{xFYrJK!(zVdqm|#mV65>gTe~DWM4fFzHB$ diff --git a/img/body_70.png b/img/body_70.png deleted file mode 100644 index 0e273a5282910fbc9ddcc88964e2a3780c9e4b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6374 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 diff --git a/img/body_72.png b/img/body_72.png deleted file mode 100644 index d2ec4d4616584c631653cae713ce54bcf873af15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2764 zcmdT`dr(tn7QYBfkS(<6E@*kAur2Hgh|2H`kD>@#EkYqgdB52TOLztdCOqs+DiGK% zW5x1xfd&F5JVXK#f+EC<@>mQ(LV|=x!X*!4NRULxUOLl`vorm-&fYtB?%dz`&iT&w z`_Av4??zyNzk&Y8`TzhJoImIL6#!^$L64oDE`&He@Oc8gbmK1g`vRK%yOB<+0s#Hu z^S(YId9`A$Px-=X{_s-64ciADvaT0@K4wgEKiAx^gMEF>KH1gx+`_l6Hvep`6*mj? zYY)3DoC$A^_=1A`Df1ywsAc6QZtML_$8zBW#vGYgP@Pl$r*f0YK1U9^9!8v<8zJ4w zAKiO1DVi{ba`?ZwK1fgCY6GGfC671~pDZ1-Owa!L86y$y7TH>(D;Vq{;wHT{fAIOL|l23B(dc9ODNUX|s#$9}<=g?D2 zmnR(742x(id*h+LOn2ZgtyY{5L_bau+A38Wij^vbjLCq@9Wv>vFBM{t1oPlnW9is# z70scPDebAeu0U?b{w2Mpkvi3KLGe~zW-F(HehMyV(nOe#xkVO)d)$w{i7W4W=9Q|W zgG)@~b&%=@`l=T*=~%K#+Y_@e3KIf-Yn9x_c?kF8SAK zg-tp9$27S`>qI$}mB&1vi7kI8?b5+F{OVRT(mMhoWjik3D(+oQ^6p3&g*#aRA&cSr z=F?6w=E{>#T5)rFH5aE)D{o}jW#a0;hgf`quZ5}83tdDMeLB;qt1{yk(obLV2%^$4 z=pY7T;4&^{^J0zY2G}dHw^E+uolxB_ zM6OvgGu&fL5azKKZjVX-RDGG?z=3@04yt}ILxeieL*Ul}rGvrLp|DDiuL_a$F!~Jt zxvj>Xsz-U$1-2Mh?jY&_~K^ny0p6R}l#?!zaj_ZVy_oL?EWoUnU1yU6l*-y5!T)p)=Z8>7 zDqw4}=G%B!8dlOM==Z-xE^OO_B1O0Fb*svJ1Vl{Ngk)JifrM>`w>SYah{b-4RK@Pc zY>3jt7XRURi)OVS*dL#UEd)qry)8-#sR-_bL{f;38`6(D13SX+8uR2vm2Ky1#)jq9 zbr3DGzn8)9oqDRxx?LQ*<-xu|6V1Lg*xv)sVEPr$Iew`+?Y>f?mV*eGtBE5- zv$iZRr`H`-chyK-#e$2t0g_!_oAKh0I49Ja-Lh~122``5;-_;MC}}8zr|$8l?0GEy zF!t9H!_Gs=htP)qA}#z@Oa6VU{yn$X_b7F7h+sRTfg)P2=oq_6?Q{uU(g1fYkv6oc S$n^bl;rX)xzLe83CI1Dmd8?iP diff --git a/img/body_73.png b/img/body_73.png deleted file mode 100644 index eb5ef38fedb6703cc24ef99c595df62f0f8e4061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1095 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyDQlzh*+co`x{hPYK4>@kU3A%nO?z>b-w~pPP@8*3CXSWr%$%tCpa<(Wxy0J^V zVX=>bfdB^&3lnqW0S7SC?DpB>35%1quhM=U+mwH+;@{72=jTQPji~)oIQMtEQ(xEJ ztj}AoXQij_?cT6qZ|rS(s|)>IbMH7Ns0c`Ku&^;THaa9I(1^KV=R4LFyUWGv8UNl) z|N8tD|JDB0^6M(~SvHwfSC>9^i`^gBFL!lg^4ABBf7kActqq;KsxI{JCaaC-QvdgJ zrtsSRTCpx>@_3%O)kDy+1!~?|$6re)Z|A z`KP10(uGcR-PuvN!(v`Vz~6r#k}VV(*POVWFaPG;N1guFuiNDhGjgV|zPq=!oqxLd z`_r%1pO!xEprHNXr25v48~0QmU*$jDysyzA?7`>r;?uvR-dz1oKVOEqam@iE|Nd2~ z{mBXwL@lbf`RRO&ohW>je;P#X(&<_C^_8FZt*YCyr;vwb6O;bFh~<8|`S-rB{tPky z)3e#9J5yHw`ugyAfdfDgFCHDOdOkN_{N%}3VP7Y!zCYrlp#AOD>aPdcOP~4V=Gy-L9({G@EB~w7_dn*@ z_$p)kD$gYTX`xlxZPa`NNjuh(vW_3!Vl z;^lew)`-Wgm>+7s+FCbG{ip9cnb#^4lpp;0xvOgHyy|s&Vd0EH|Y6CgYu@QtDnm{r-UW|!?VYs diff --git a/img/body_74.png b/img/body_74.png deleted file mode 100644 index b4e1f5b8c9d99d9f2c378637ee4f0004fbfc36a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1366 zcmeAS@N?(olHy`uVBq!ia0y~yVEh7Pr*JR<$^T13wSW{`lDE4H!+#K5uy^@n1_oAc zPZ!6KiaBrZ?$4Gkmudg#?zuoMXz$KdUTn^4$pzbw&F*h{`C=)H&9pPB3;#Em>{|Sr z-(@mqN!N9URjNy5gEy4x`ew8_N&kNlR9?{aI>GzCwfDZu&*zDo|Kh&Cr+J=+VnOd# z(@i|RSKn{8P|^M^WxSBTdq?P`ebK6~cZY6bymQK^YVRg}BW^b4O^SOrtv3{AoA5Bq zlPzy*&V#U%RRxRRSbI!TJHNv_$l+M*BqpPGlSC#IPG8c{vs;BV<&LVR!ec#8M#*wd zt`h^NBri=eGVGh~s@(kk^z%3FKK;NiRlqHFYF|+5+k?h8TAlA?@oe{c9#+ZQkT-p@ z@OlaptybegBZdujT)rC#`*+5_I4OMXdgbqF&CTBR z&lu|3^&cM3-V?!U+gMt`J>CCl*!!KKR@--3J^r_Fx_;${hQo)K$lJB#KbWo=zj9OD zA!d)+r`F!lni}ofQfUAD$Bf?IE1Tw9HSqqZ&I(_(Ci#ZPKbCn#t4s2xuG<#fn|9~? z&3oscYV^|wVJ}~8yBcxq@0r)vW#q+es$(|q7uwghD0pWmAJA!e(Y>j6 z&WrrJbxw3&-kBAv|5V+5Rdw#1()L*jkL#9QPRv{P;HKq|oJG@D?%)%ddunY_!RnII z+gUn~>(WwNCr@rl|KE6Cy=rDxbR(*XI{KHhL~VW>>iB*!65Y<@y1Zz$%pI-RyW6Br z@0kDjMc~AJ<_~vk#w>dzC;Cff7ciK;!q2aDGk*8nrsl-k+dKWYKDZ5*b@~VOAw>4f z*^gf`_w6%J6t|moYpPZ@-@IpkpxSSPw97}uKK=Ok%D($;b~T1~r9-c4+4%jF*)=s< zwP-*xJ`4*_zoTFFUhc5s zUA?({XP^DP{^o8=Wrh=bmBE+aObp)>IAUKoeBOV3;m)hAceLh4$4*^;Q~LLt_nS8# zzPr1I)p|qxH|{N~{=7NNcjxHZJEzv3s@YXn?7wl#k!Nb2DF{uh61;GW=tGbgy0G U2Gh|5U_r^?>FVdQ&MBb@02|1iP5=M^ diff --git a/img/body_75.png b/img/body_75.png deleted file mode 100644 index e936cbb1748f29807c67cc47576c823ce481ae2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4395 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 xgBuzc6FVhFTXY@OTUhQ9y+ diff --git a/img/body_77.png b/img/body_77.png deleted file mode 100644 index a63435a7fd4e3b49a370640504ec1b50161e68a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4269 zcmeHKeOQv`8h=sKZM9t5mTrFZZI+pnmdP|Nou)0x_Oh0RU3?o;7Get*}}T{#k#!Ei@RIHvi5wu}c8p zqi@54HzTqbn%*0HCV?q_MXa@l$!|tD&MUgxa5~&Vv|z9FuA}$17zaC4MFQ_!S@ao< z-j*gh|KH(?v9d-vJ`SW?30UGAu1sL@8M{mlS^kBkVeM7&L?q?6Xm zBbJNQw-xf;I|x%b%&NQ=gssGXE}=#WH9n7KEB%Ly#l?(mF5A*;M2{~m2Y2W3J+Awx z9WL((Z5cfY%h;>^yb4AUMNHp*|I)=L$$G@0y`An^lDN@b#Z3dX%gNFe`5tX$opY?l zflZbc05GotgazDMwHO5F^}%}p;C0O6f7zUIPz$M=yGZqBf@IQ@E*cN%CsbFVk~*Fz zVwl@iBDQPW9X(L%p_2qHZPjdnl--kZ2?o6XBtEt|hA59rZHb*mHpMhyocYa>lqT4Q z;ma6h5ziTQL$2N(k z1W}W$Dib=1+LyUX22Y;uS5wx~Cw#I!l1s!_1m*WCG7W0`N&S8K?$oD(Ml92}x@-S| z#xcjj8*y3ZUC7mnoD9NHe~2fVTGhPEq%6eALe?SZ$W%d3m(NoAtrhe=MdB-Ryo(*= zR5-+OWUy3yiLJVSvV6J`&Eca0Sfr}8hIBoGOCet!_}o9+ zXVDYP=mQ~+17)~M_a$FSeSENc)&3pp;i}&dH1M3Qu4&wW9nR9%JuK}e!O`}&m(cUy zA-lkty9g_8{;ZZXG?HJHtqN6BwV|v*3kRKppx?z8hcP6~`SLR%7}&k~fu8 z=Z!JVtI|CA$YE|Ok`?BXG3!>r5~ms`!FGq^q*BQgn{g@w5=|>{Q{Qt_PfenAV-#<= za|Wz?b?)SEO8j>^^nYmFe~|ffg;`4QjdP_FDqA&mI@sK*u5Pz-asfr;^bM&Bug4RF z(sJ)9vgv9|wSrfG?yG8!b1qK^QF>*~{RHrOBH_T1eY`{1rl=;QNkSqgn{X}M<|zLi zrkqn@ho8GI23iAW8wYGGZCNR%=?nEysqOqU&-jI)4~Kz4)g{&awQqXYNYNQ9t@cwv z0q|;-s$T8qgB^?il@Lu3$mO2L|zWgNp_4Qav>h}bi5R{8nKti}I$&t66MD;P| z$ZJ6PQx?X4r{|%fvcVERqJ}IpyI(@CgLywC5fLqn1OD+Bma!x1sK&pU|+PgntI!)h|L7+G3hw-4eHxKC`s`V|o~@-mZyZi!Pj7cU!31$xd%ebT#xAwEO>{fy=bb z5>Q?9UYtMkLW4${yGVnJS23usPFHNW{q{9PA|d^zo>l~M7f-{TsRXOKj}h-2?>Uo) z4r#1?b;fmLkCht80M8^1Qh;11h+I6e+;s@k%@dXo z=nin{;j>k79Bm3Aq(3CHlWt1W4+b&jI(!9=E7s%-B7_F@x^A`OYXr4cp^cvIrtoS? zbKG&8lokCWa!UY^jkK#+ow8)`U=r0V6H+hCk$UE=H|O)Gh)R5`;pHbD?+iPCP|f^$ zzWN=PE7Q({%1`1~>r6?C!-Af=^{ewe?*A;b0aHnd<+Y$UyU6-BjR(rK3Dn%qP8 zm86<$#>$l&p#QcDAE_`WDqo>$!fW&Qb*#!iW*+aH+PKo9d#J_=<6t5;h4m}@XS_`Y zzvEnKsv9O{^6PRiS|_mBm4TK1icOj%8O~^OD~g>_AZhv)!$TkkWjYcF&?nf4& zv9hd>E5pD&PR$S_<}8v8?9oN&Z>iefqNTx|j*<}9tRw5d-hn-xd5)K<-ghE+=sXBk ze$9=fu{PUW00PnKI}rpp;R2nf(^ON__nNkfyKN3&(QW!P+~L^E8~YG;(dGskZ|BB!<4%$fQY6R~Lm6w2 zhc7+)S1^YEqj`Gvdf>za??OtLfdjS4`g)P=%fP!0S?8WO^mied$)=+>UwCFFY8L=B zTLKB}-T8XWouD(h<^Srw+nB1SmZp_y;|2x;grkyVa!$$xh=K?b>6(sx5=N$&*+9_N31%~}m+IJ7lufo2H2(H-@ H|NY+qo9;l` diff --git a/img/body_78.png b/img/body_78.png deleted file mode 100644 index da404a5093e9f0f790c8523f4e286605865d37a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5988 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 X8gy+_Hue$t6eS(pM+>j{G@;-xUb7qm diff --git a/img/body_8.png b/img/body_8.png deleted file mode 100644 index 0de414dd9a89cba5de8a883ea48ceb7c3f14272b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2442 zcmeHJ`&Uy}7QR#zkt%h{07^k=1F;LNgGQbS4@)JNM}oBjA}@Jp@I~N)#*kPTSfy2j z;7yYV2@jP*Ssjhx6;mMET8LL(ifi#Eh+F|1ASHps5QMoE{bBxqnKeJmI%}PC);?$N z^PO*>Z?AJHoD#Ho)AmgO0Bi=yfnNfE$pSWixN!s4J8b)K8XGnwh6DuytADo2)*3DV znEQc&0bgAZ&5rgI#4g&m&(ofht4okfNB1J~Uz>y1b5sAqFgNK>cf8STYLk16VA3xm zWakw6M1ql4lg?*YF6`;1ylPR*&QCrhNbYCYUZUS zKkk_E@9-?n1*G7;c*(Wj`cNK(%mLr))8R2^F9A9R%0nO$l8xu6xYF1#jRMEP8yW;c zrB8raWrH3j3ejPLx?~JFQ7U-OabjlY>rV+Q*M;}t!8i(}byyh_f|SV>CN=i4$*z+w z$oxojC*usI`<0w$*Tu&+_8LNMwDulw%jmCO_0H44_X{=4bsQ{U7olRCUuNzWf3L`1 zc3)QXZM@+|oAyKi7H6s+XR*6n>Viz|F88n~01sY_&s}9DYE)Sq#xpZ&=-098`7O)O zE+JwSN%@Z*M7=;xPqVA2D&thB@0Oqk;Cs>wCxq>wbrDWlq+@U0K0(MnTsFOEJ!7kI z_DL+|+YQ)?;Gou`#8kbb)PhvP)I^;!9aAax_RH7L25}#G6kY5MUz8}@X;wols zGLiZC-k}*c+|7X`@M}f{I}bhcXH9kGVvKYjraHN}%$7+R^t$Zqx5i#Odc%i{FJ7RXB`B01H_0(q4d_R{qav*CF!dzG%XmjVj5wa{jAYCV=frJ=VUkyFXAknqCz!k97ZWk zXKT%Rzk{PY66%n(D=H?`!JRB_pO|C@ST?~TswM*NBJAO@1!x2u$vuOQ0wHgt78mk5 zCL?tq>Bx+mt6#Gs68TB&JUom%3Wk<4q2Ir%OD>Lc6@{f1F3H*S*U_I@En0cI&AW_^I zS#%I0ji(Vw5@Ou&QdG&9=Hm9$7zA^pKbN4%Fg3dM3A)QUd8pR9N9gf}?hqAgCfL`5j5lpvw;HSkozD(l7Fg9J zymRFXMw&mKwolQz$KU#{_Fq3Z}a3Snn5*@_$$)@!_D& zz2*Vx`%h2G&CW$PaXF{f;cF@;|=+h4fXWn4>gkFWI z5rX&a7VT5NUDO?+blX<#lS@K_nqXo%<{p|94;SK^Yvk|fK02HfUnjXbdGbMw>dn3`dO}c7nd&9WTKL! zzOH|kR?5+qg=zO!bbt|DV)3NV`=1nL6F-??s4usxUrWl!dCoV<=NiooLr1mgBZZsY z)CJVbb~$^vF%-=dZZ#D84Eg0%uTcK>VGm6(5LpKDOP-u?i+=N}V8kq86`ki0Dq@$u zyw_jCdZ(NVu1sWS-nbJ3*yaD&q!I`)%X!b#9@z9j=Kqf2*f<$drHn~;f_o`-KnmvJ2aqxJ`0(&crn@HFA(Z2g_;SXba5%#$Pz%M9)w+|f4{TDIHJn#Sj diff --git a/img/body_80.png b/img/body_80.png deleted file mode 100644 index 7573f415fff22ed015cca6dd62e605fc0194c763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5160 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%0D8|@ttIpTTyqnzkQY7l%Fg)uHq7_4L7~VBD9XbC? zhHt-uB-7+C8NPjsrKMLGSx3qgtoypD zNH8j%ko+R3w@WPgKj=R$#HKq62MW`b3auV(CfLmiJjNYInqlXr#3`XZZ}LJA`c3fDbrD(U8g zCShsfxm{J%*|KAZ#oOpOJZ)blG7<&? z|Kb&2kywuS(+9u`5v$B(AeF)vcEa*fcF&w{3v;O|p_(BgSI)*~|NB||{!Ga_(Zj#z zby=)@Zs??w*>bk8BQ<^ND4E$Wy7^bNhr=ne5nGkg-9{^~^#zz*p=0FOOa?`&t2Rn1 zz3T^_`4F7^u;%T;^FRY-7Q~Xkn;g=-$k+e@F~x<|qbU$JP+a@XHY(Qg^7&@AjrZ?% z-V#7pXBm;jH`9v@caMemN0vvXVqJA>tf;&vq<%xi3I#@Ta*Z*T|1L8KO z1UcBqXjN@SW`xprl^kc?v9p`+mPEJcTpID>>YJK`X;5_#0x>xzyU0e}&DShKEi+*yKugs6kD@WYrY3iTu^7}^h|G%oS zJv(J;A~i(3y722J5?Lkc`>R^L=#<&$MvX7k;=5ALxOWT^?ZvMBK%EaFC#<9Za=a+P zWG+hfX^P2QIR7#i6{L2v>9~=-@Q7>H1yDYXn35ZHE-6x(fcuH2FHVE!=JIA!kLbhT zBC@Xuxt3!(Y>?uc5?k&7zH3qg#78&b0g*BqnPDos5yf~59jCra(x-grnO4gXGqP^x zvliOfeOkdC;EX5GgAaIh%6oEojD*)kBHy~0-~=>)Pe>(eiK^y-P>y?m3d;Db(Ek~W zQV?*rugVK7)QmlcE|H`iLTDViNM&1#mZIY}#4oa58+g70^9L2pzaM=6XU+~4ZL@9X z4Bdk+L1nNK$IYV|6L&hGa}eIC0>Bku2sli#5HM*{9sW%_YyKYd$xkA-YdfYuESLiD z03AC7jOkTY!8>D!(wcG3`u?uV?a$1QT>NbY^YnP@&__mg%jy@36`*hWVvHXS9amuL zSrvBDOXd3yNxOpE_aF-U;|HzC2$M~Vj&+@dcSiG=c;tW=IV!q&UVkmZEiW2DA~B?y zkc-$!d!DHo@CXtj?M$&@m#JtN+R|}&Sh5abFzws8$G>7QX04$$Y5mJrjKiBY1=)O= zqcd*OtMmoiiYLgqFLxWC8B-hk|S+4;z1Y%CLTqGzw3BUbcc zg7NUEiZ|C2z>+(Q#`4M?mO}jtHb2Y>A>i^xfDF(g@>*?k(HyByzzl)2mq(XC9Q6ZuBw()V3D0; z`pAhtA@6_d+fZ8P6$|xD=JcWR0MV1>-?XG&M1s5ZszZ-%!Xq`vh^q=ccB`uh9z;H) Pp|)-g4d!l){p7y@^{i&s diff --git a/img/body_83.png b/img/body_83.png deleted file mode 100644 index d7ff67dccc52723e1c6a36e0da02b63ae669694c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5968 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 Oa5(B{Q}r*>wf_UEgUapz diff --git a/img/body_84.png b/img/body_84.png deleted file mode 100644 index 177073cabacc6e83f7aad275157260e0d1899ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8037 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 U2Gh|5U_r^?>FVdQ&MBb@02|1iP5=M^ diff --git a/img/body_86.png b/img/body_86.png deleted file mode 100644 index 0a1b4f0c80c057bee5560895ea5034aa993af124..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3139 zcmd^C`BPI_7JhjzBtQbF2sFEcXv-cYMnEp*%S0ivFF_KR#Ip&iCheMlPR+qB_OL!e8f;5k~P;nys zI;v~1;Tnml(OO}9vJ1M$Zu-YM`Sd8x-X&m%8~Ohm1TP^tdIsbJR?%Zuq++0$rsqsz z(28MtBpFpJS?ZPtCeCn#T9qhga1J#GPVE2kdrRMGxhEk|1*i#Fp;&YUq^A2xe;vq^|S>NPXa_FKW!FOTXv1j(#T$T$3zJTN;89UW`e0x^Y zt-feiIKHr|RC1YrqG_K`Cq`iKCV|9Vtyk*3HCZqkGCjYy>Oq0aeLt1qdqiX*Zg}r$ zp6U3=9I%VojCp@-N&RFehFXA_%QV|!pR#7La!%P`0Iqugp+xKeruN7?;7okUX(>(< zkSWf2dzP_OuFj_a*P+2_!<&j!^`G=M<3pJoURrq-rIiho16Lgli|+R+F@Rh!1Za5J zEqOLLa!k0J8ip12lesz8fGqSHRwEoyXdwy?Pi65rq$5k`U+&8{eVf<3nzy(YIXor0 zJIf+*<~YKA)GhZqJxmjnIwk`4VtA#^alh?ay34R<{MFGCG>VJxld6T*II*j{5E*1? znABe|(_sCMA%SRBIz~#b6^D7BeoHDeXz0+W9Mt}N4-p=G!0lon}et5<7VxS zQ_ol7RagUA@FKAbrgN;z!FC4LJut1T)XicsPF@tTk(5+xMaBR;OtOrUiNW@059haG zpUUQv<1b(I;&q9tJ8V^UGv)jl{EtJ6TSS$xnoMRJHtbqp!{kt>3ftJXe<3Jhhm(7c zztgMlEKGajWd26$Lb(;G43)_UmG0J`IknU?W)|J6 z$-L4t=bP15XSdWDqoWGf5QXnc=eR!B$L=OaHQaA+@6Asl{hAgWl-N)2;Rd&RS5MJG zUqBhe6%~IgcC@p23nOWPC=%C^d%=<9(#`nLh$Ne(WzfebFFQx)$}N#BArqVs`9! z4*V~5j#F}3D2Ot_>qFr%-UB@VqL#3gW~Bu zl=tq*{|p7|q}8w*$MeJj>bTU)bwLI;l41mUqFo`%h-hd(qHcaGC|*Ug!;G55d-Wu^ z+IV76OEox)XqhfipXxVo1Zf4siQeJ`yYhK={q!jAJv4`&!aj!n2@5@sPHBNhORNfw zDf`Kg;6@!YL|%WVmu)C&VZYHlF*T!ZeW(iKjcL{~c~+Eo`p-s>ImI|mN4`askY5(h zw2Ge7pb6EhMlMV;ufvpz7QKp$?9;<}2dRQYYAOFH8aANUnGW-!j9DzJ5{vyuRXf!N z2CA&S7Oj70cVA)E)T2K&V~9vra#Uf(q2)QF=w)DNhz?;p-)t!J>T=5`|GLXl>7M_;ofbzdR%-oALGQY=TAj@2UyHgEM}9)DMRvY2PB3W*5G# zvJ;G6;IVQm?&Y0g4bwPqkb)of6sOv0c0Y6j{O=*Dd3~fY`F!xhm7N?Rza^2LhzbQN z1{*W+MIhE^k3nM+ZCvlD-<0iTLdH{S#*(V5b<^6b z8MnI=t-vwtx|BCoRv6}h@=0Fgupd*`Ow3~h{%VN<3L@ngv4CEU9=L@sx~i!3VR2@* zYrgRvJ(}L*WK`T?9p|5*?wY&t5@5)~6~%Y@@8FB<6cv9^kl#M7tZdKnu3x-3sCL#9 zGK{ja?Gf)H2TN&K=pG1_5Iy3UNMQP*=((32_I0rhbfeeIljI#1f(aJ;Xq*lgmiyeM zLrB-y6T1xTF?VG!7U3@Zb)_}W8<&xa&8eXmn!~)X1riHj5c(=>_`zML7QNFtpILk;-$SsxpK1Fp-pKfH&^D7&;>{3`$) Mj=I{EA0{XL2iv+5JOBUy diff --git a/img/body_87.png b/img/body_87.png deleted file mode 100644 index b8203169d8f5cb6bc00bcf9831950eb1bd08900f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 zcmdT_YfO_@82%j5E?!`X83>5Dh;;>N2?!fsDK=1^{3k-rt7+07jDtkNNyFWd9{BKOccrQGtFwz|!(6Z|AT80A+*s*%gvm z{7Qa{a^R)a-8X*Fsr(;^(ML#m=P$s!H$Sz1IgORolwc1HS#Dq-JrJ9`xq4%Ync1nW zeMc`vvPt`QU0BH-I-GJR)M+g#Huym@1MqVXS>_OiV`@2PCmKs$v<8$+U*@DJD5}8sk2o zc-J2nKURdMND?rh{aCPsQwV9G05DJ<6#!U7wip558LiC#fcTT6#)vx(!z+OD73bUlU`OYFTI@;v*?oili!JkXHCrJT z9ZGc?@=sbvzxF6=M45Z!hO=1Q=%UUcn5ChnhPyn6yKFORg7~d0qNR}PWN9hfDm~kZ zEkgH{)|WPml367&c0)l@R%49YP=Ly&fZ6O_mf|k%fd_dq0uSot@b=m@DjP5JuBf?> zDR@{~*Ioj{!$Ou{fm)k*vA`qFeSkZf{cu*MAUe7(<(1-7-Kef}u05|GBvumJuMi{z zNJIX>mS2W7+)={D-FY`iQHCr^zjB=v7%#p+1D^<@OA?}!Q1RVo6Km>lD z`w5qYeVd*}x0JnEfO}?6;~hz(f(kOjj3OdMf6Zw1>kz{VNrxSSlmq1_L$-N|L$T^+%`WyVH2hH;RMQo zKAENF#MF!JSPGp|-no4+0M@Vht4A@+2{EiSF;`jZ)781^xCAFElU6%ul)qnql$C%P zGd30G&|7jqRU}f_B9u5TV$o{rYOxM`E_zsd;E?>JW;f&OST`;7#nGALO$2^KAeVxH z^$j1`atq^+A6F|uBrevT%W-+<6qwDPMzdnvbT*{GCKkT#s(aAkPbW`g)7C~^__luN z^?GV?!DvL5F_R-oW{Q!$tAE0LcDCc=5d0WAPY|-_O5&*c9Vk>c?!_gq0kR8L-wiTt z=9wo%UQCjDtUuRWI1hL9g*T4tgi<+;KX?aejf@(TjGA7nDx@{9N#ryPF`rS4{3HLL zLHWtyezMUZ%Be7UbO!6XTZ{7awQN=RY6p2QwdyFwr1y@BG}L{>1yn{2Z<)cpt%?+! i!Qfr?+sbhE(h6goD3|YiPKf-V0Nyvqr~3QI(|-WCG=(|< diff --git a/img/body_88.png b/img/body_88.png deleted file mode 100644 index 2a4a0ad70c1892ecbf0bdd64359bd7460165df69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3324 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 diff --git a/img/body_89.png b/img/body_89.png deleted file mode 100644 index 229a3f9aef8d321ad489be28c82fca4ae61d4202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5963 zcmeI0dsI_*w#N^k;-iGBz0zw-=!{mb3zcdW5C|D6mQi}4J|GcDf?BHbei#CQ1cdf- zkwR{@h%`X3lmZDPAVLTs2@Yyh9zo^sCPAqIPQVD^@Hio4PG~!G@7S*SWA5Dhk1Ky< zt$lX(`DL&D+55YHS)clPTdm)^9smHVBY*Td4ghAe0ANmBy9TvVXhd;n1C>hq=Pr z_wpbLO|lM{>pCP>0zgb+ItH*<>k7Q_-Z=0jDqG#-tMk4iO) zpf)f+p1crxCACAv>9wb8?N2S z)QaWf!xhU?TvUW=o(UVES}5PGe<$#68E!qI;0pXx!{S4kj?RNamyKbt&a%-F=#${q zA%mbZFKB-HT(rOHex56Eb;`3VnxLSi?v;(I6LMs`Z*BvKY}{JJ!FG?Dwj@HP%{4#^ zGU?fs+HIfQzC@0yPx{;)Xs??okqxR(X?#S-44>bIfe_mO>@3CKeoL_S2GqNOZwY8( zZt?>N3C%g;BylJfFB=Vj!{EWyy}^$`Znk*X0??1&IZKU+?G-m>s|Ye4W=o*f3%(0I z`m!fzpdO+d;$e9B#i}$(ya5QaH@5f3p%%*f%?{ID#n?XJ}V6*_Phk&db z_(ySsvHHb5TE9JwSfJ`IH)A=GZC7{mn|QEnb+1KQJ(1eQBZn1Ka4N~<5Llm#9EUPJrF)2~cCZ2Rg@f=4RUTZv?6oPzD)}U=vs>zivN*z~9eN^gDo9 zAX!TXvq3hvEt21;ecnD7ui}yu)AZ(P2m0701l$RdU=P7&z)PP37fi)6_0kQIxh`Dva)$%CU3s0cDl$vr5zy!;=`VwNUJU3lpDGb^C}oN&l2jb;BD#(%UI zt)TYRtElBjHv9!O;oHB4T39mm@1j;MS@#>L5i=xf{}#2nYL9UtZ%iz^u8NHp-&1Y* zxxki>W@azirt+E1Ev`V#$2@C;P_#1VX|Me9`x*{mqNz!!OcVjg5@t$js!CLpH)_ z!BmWO%J{Rnse0QNmsl>xShguH`SptoSPX^SfPGI=s<5Q)QNQXY8qJgb*JramEN@xTWNT_gF}cmY-oxO+3!jd6{q3}YsO<8i$*e!^CH z2k11>c=HJwpXe6`y z;qgxY{4K%OK+oyto&tJh=y%K?=t(9@8FTNAt15jRYdZU(pbb?PfTqsU6YnokJ~g?N z(i6Y7HES6_`xUP^Qn!9apM^{~IVL92A6S{Sa3_zTJ)lZig}o4em*IG>fuj$A|70;_ z157Hht0hnYM5l_Hx^@hV@e~m(-QYawypG$f5$&@aad8o8tWxOK1l1r`>#sejjmFO{ zLY2+?tq01};@U%=bTV)HZdGnuXNK364<9El4 zmGZswQLv2b>V*E&Oyp6i^_~Wn9D>g(nK`^AA$0AAyh;$)m!-P5ChP zqL^NWoTk=wbX>vDe`;A&?NQMgpsJRViUvR@Ru+qMZ-=cqcJ_r6D+Bw`E8+HH*c5;J zxZ6xN#2E-S4lmL0y7sxmQo8z*R+EVQ_~Zjt>B|f1)4%sdJ?(-YoE>+2SqFuK9AtYr zj}6-K1OfQe61{7&$MF94QBVCX-3MP=b}WW*)*@fi#mMLE)Cs1mkQ;qc7M$oU?>G3h zx?{g+ZEy9$t{USpwvBtM6X2Bj#QqOYV`QmeE zSKLGcvfBw`N=(?QjwSjiTD>rBi(!;?$k)U<O>Z}V++$AnKLUB7?&AZ5zI6Ti=~{*KLq0_gc6!Jqb_M=slS0R7LGb)d&gPH1lX z6jbYkZyH&~9VZE}w7g86D_N6IzyZ54TuAp%?&2EDu z;IMh!;kYJxHJ#pXWg9+^x6&oPiTTiabJCk=_Hs(>L^eEBl6>VFuTXf@8QO(h8|=6= zx7^Peb?ow(LeuOSFCDN?mu^3}boe}uBP<_F2nSNx5v9&;s zSxQFBhZG|nuql2^xZZ@NQIa~TLImK6q)ItI#U%&v3&pz4JxW>%GG5P`{8k5UB|Z2T zID;oCbcp=c(p`EV$?NJ?Na9g z;GEz}ix2v-s|+T_Y;QN0U;zef*J-=9$;d;IhaQ_kVpIo4oMU4(jhGj7V;wa)|C z=k8gwxTB3*99dj1{pKAo`j^IS^rxP=4Vy?=>FxHKFlwlLu#qhcQct7d{RIIsQcTDD zq#$^IE<3zh&l_zN1r*%>)`e320EAZ5q5K^Y`xSK<&BI4T`7E{Z=Rfkd`I~`eO&XF) z8d`BLkL7DdLdxWR(8$maW7+SHX-3K&7Ltdj8k_sa@=6VOAZ=ZM;caB|ZW@)$*3K;d zn65Ev39ND*X9*YgI`|wUkOE_H05RL&QUaA-%R*3gR`-~t9SCG}$xalJLyGD^;TEDL z&~qMsW&R*l9^?Lsh9r2w;AOZ72g0*g-Z4+h>(4GBNQjbCxX0?tdNNwh^VQIoCS{Jw zg>`iBLlB1Is5k!omV&_P$BqfL;x6^wq2BmVOv|)M$SmB#@})wYlBcXxs+f~Hw8}4R z1>_3lYD4Ls_m#k>=yqTWEWBRk{_$OQg~-HLh#c+{|CPw>UnR1E@OO!PG{F8XA`kRs zze407l))6!rFv8(It#;>B25CvRA7ROjn`GvW02gWg2HbhCB_QBx$BFPp)g&0B5?gY z=$R_)sO!m(D@8hfscjk8cUPnG5Gb%QX{%>Hg3!ZU=UC@xVf*M9ZHP;*W{O9?^=WEK zijU1t214*f6>?0^;D5bBU_FH32^7_o2hevY-x@M;hJl7W+21+F6yhs5{1GixI6C90 zk(@Sfxm=Cxouz;GoZlI)D^hZTO;ly(SsJFD@L{1l$GAQ#+hWZO%0~CTWB3!26&>u6 z{N}9oWVsD-ECQ}Jfd`{ah{GjoV@xi`aLxB~fsja444ODwz4+fb^Y6d<8=RpV@cLip z?DULFVAuS_Sq*JvJ=^wrJ^No-&tBhzm~KK?)R^gKeBtyo)2K&=wa`dN z0qk2?;mEATGA>vywnupf>cP)FIK-IZZ8EN+^s0AbXHbm+L5CuK+O)GH65%|^zZ~q zO1B?}-%I9|bI2({K+V?Vjk8=EN|m#!${X7s9II+8_>iq&XsYQ?zqFL$fxfbp@u%p9 zHPpp8Qe#cl+@cOHP(c}y{uI7LJdm4lRjh0&hhMhB5^ZGeypl&#R?e$b zDU&*mpuBkI@qQqegRb`8q^9k!=i&d$Rc_1-1UAKm_70Xn5J=JjX$;tC7XKg6wwXwO R^tv1XjvV&&;(rv9{%1@6jqLyc diff --git a/img/body_9.png b/img/body_9.png deleted file mode 100644 index 1f3324cfd91ea226f3e57d08363968a0ad11ba79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2103 zcmd^BYf#b&5dQ=A$Mbm?Ug6tu5>NAil2&RyQWFF*OnaJ=Saw=TVTOeXS(;rTK1#F9 z9$H;KG9VdO3MNzJWn#fqno*J_wlALH@h>xo&D|3?Ck8$Zq`O(kiL$I z4gdi9IBYA$S@=iAMG^I!ygZYJl>Q{Pf13k!keKtbyzdI37f(?;kY?Z{SP zg8w0*sFpw$KAX{@kET^$MS?`uSiU={rZM{~slnHsX(~8OKBqKN^o+J0U$PI{BCrvA zp|=XphRFFdL6sIUsc?o~Bg&)*`5Ae+%6J4?HJPpWQ*Sd9TC5TD$! zP14wN%J8(M_45YrQ9E9IRE)num^r=m+npIQ!&jRAtIjYHp42qrlGCgbDM3`i|guD`+e-q+iCK0tKTaC z=cQGmRUyOK!Em|JUYp27OPRy?(U88!s=Xop$=4-zwV$;W7}-p~r&K^`q1btSF6gI~IrtOvz=gDq2(Rf_bZ*Y_T=9okY8^CMlpM7B(iKz}H{RmNH0Rve(m`D= zF;g-0qoa%=YMy7do}k z7paYV)+T9ZAP%&(YZEpzJnb#C1%WRDUVu)vTW<|GMG+9V2K|DBYI8U3cTjXbxpg<1s;klaVLv;Ltpk=dY|k`;F-JWXo->4T1hMyxweNuJ^FmAF;TB@YNQr*B*HC8 zf^=~7tJ9@WQnZQH`Wn6?XpD#B5<*PGxOI!>JcjhgdL1`37v z2TzQV%#~Z@Zzu3{xmMI%?OOq)u;`AuY#6H#`;wN2^gm1>_IqZOY^urJ8g}o$-)v4W z-C!70cgkId`TEXL`Rnqo{@L{C;j@4CgdczY)Dp$Va;3Atz_6tZPgOJ21;ycBJyvB3 z0|l}kR00*yl>*c@aOKMCheeCVtnw|p7-kkePPEZUSB@|h#sHPro9*cD7r(Tle{~<&ILKldO@gY& z_a?ec>r-kLf8}|CVTE@Gx@qjV&C2)dZp-eLFz(Q=}5+dwMZn^JwKUjb;`qFIL0|gPrq5>V79L4C@N5yB@`Be ztsT(=4V}chJ@Iw3nGrNvD+$zeb`9tN*(smN;js*4kjiCA9w|r)1&x8>@vWp~8r~SF z`h#5{K!~#m1V-2W1hm^k*|0sD6I>`UPkS$JPW0vBC;$0;ke44L{UcdO3_OJJf z(e4$Ma`(&^F1$DNK05o(#kTMjxZLldQ>r=3>eR9i8K|rEnoj`01rh_Q){{^C1;b=^ A!~g&Q diff --git a/img/body_90.png b/img/body_90.png deleted file mode 100644 index 4f29a049387dd3fb81ae7ff6188e764aa505ebb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3141 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 W(o5DgODE000DyK=+)H-_pZy27M>p62 diff --git a/img/body_91.png b/img/body_91.png deleted file mode 100644 index 3ce66ee76a6ff8fc489939cd5868c41f06a46cc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1175 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#hD_lb&KStCwd@J^4cV(;CM9hYVQ;jMMWIq-O=R#olOq`9ipO zQL$#m-o)zJX_Jd)-i<9Qn^Csr9nhycKmB3io=_64+vsZ1x6g>*|5VTf6&<~z8lTlq zFaHeDs`IbdEB}D|hj`XqyG3m21^n~=%`boI|0^h9bz#}Dz123lKO$l!9)|8e6dv&Y zx%2A{tom-XfpNSWM6SHf$^E!!Lvm?)i>%a!i{F29Ent)WkXIu9^y&d`$F;|fvAyTA z2=jNl@$h5Ad+i493Zt&*Pr9dr3JMQSX6m~-S+MNKw&&&M*H<4tsF8PayN`651w}F zoqCMp_Fv}Sob@>eZa=&?DgWm5Cb#D8ty0>(g4<62Ir&#P&T^jJv-{Cnx4=dOJ&Sjl z-8LI)^ySNUbRb4AzW_8^?T+L--JjEHH8ae12Cvw7Ng{E#|AIMhr*7V01hvxowAaF8 zUdb)8`%Zp%=k?$r)ajExY-mXSngSGVo9P%I+{V6m2hiy{tWS;jA%T!6RVVY}?$iT< zKE3Z2?UAa`^bqRno1yg}!dCKO=={UwwflCbJrH=;_hZ2wsRYd#Gar7Ku)9@uwe|l^ z|Dxg#8RZ;E-5x)|X915ptKNsbUzRF(YD~AZ+H~Oc<`pMM~twSk56%)wrvGmcE& z8`zh(>VMdqJ*_FIbEoB`mZhrSzFF9AJ+SVN*Nwv>Hcjpy*#EHIzyIu}-5Rks%LV_w zh~fIT>+C|6)4i0$e#x`=Hbs z_xXlmt4`b8@3BkL33-?@^X%Cd*2f&To~jq)To7N>a6tuF(lB_s`njxgN@xNAheIC^ diff --git a/img/body_92.png b/img/body_92.png deleted file mode 100644 index 98554abd5431175f462d8e207a38ad9a14df5d2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5470 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 Ms<&Is=fNre0WS?ki2wiq diff --git a/img/body_95.png b/img/body_95.png deleted file mode 100644 index 396e0ab8dc56ae34a73ed5cfab3c59760ec8ae57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6623 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 aYuTW~@^3X>81k4#0Cd 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 Qy8`%sw{cC`>gddW0bt)3d;kCd diff --git a/img/body_98.png b/img/body_98.png deleted file mode 100644 index 39ffec77827ae4ae2b01f88ca70e5d7dabcf01e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7481 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 From 09ba52097099c28cc28a2fd8382cbb8c92e39570 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Fri, 8 Mar 2019 13:23:22 +0100 Subject: [PATCH 13/49] Loading SDF work in progress only basic creation works: - only up to depth one - all in one link (no axis) --- experiments/examples/manager.py | 31 +++ experiments/examples/yaml/gecko.yaml | 1 + experiments/examples/yaml/snake.yaml | 1 + experiments/examples/yaml/spider.yaml | 1 + pyrevolve/SDF/__init__.py | 14 ++ pyrevolve/SDF/geometry.py | 99 ++++++++++ pyrevolve/SDF/link.py | 54 ++++++ pyrevolve/SDF/pose.py | 244 ++++++++++++++++++++++++ pyrevolve/revolve_bot/revolve_bot.py | 196 ++++++++++++++++++- pyrevolve/revolve_bot/revolve_module.py | 210 +++++++++++++++++++- pyrevolve/tol/manage/world.py | 42 ++-- 11 files changed, 859 insertions(+), 34 deletions(-) create mode 100644 pyrevolve/SDF/__init__.py create mode 100644 pyrevolve/SDF/geometry.py create mode 100644 pyrevolve/SDF/link.py create mode 100644 pyrevolve/SDF/pose.py diff --git a/experiments/examples/manager.py b/experiments/examples/manager.py index a8336f2bb6..3d9f146104 100755 --- a/experiments/examples/manager.py +++ b/experiments/examples/manager.py @@ -10,6 +10,7 @@ from pygazebo.pygazebo import DisconnectError +from pyrevolve import revolve_bot from pyrevolve import parser from pyrevolve.angle import Tree from pyrevolve.convert.yaml import yaml_to_proto @@ -19,6 +20,36 @@ async def run(): + """ + The main coroutine, which is started below. + """ + # Parse command line / file input arguments + robot = revolve_bot.RevolveBot() + robot.load_file("experiments/examples/yaml/spider.yaml") + robot.save_file("/tmp/test.yaml") + settings = parser.parse_args() + + world = await World.create(settings) + await world.pause(True) + delete_future = await world.delete_model(robot._id) + await delete_future + + sdf_model = robot.to_sdf(nice_format=' ') + print(sdf_model) + with open('/tmp/test.sdf.xml', 'w') as sdf_file: + sdf_file.write(str(sdf_model)) + + await asyncio.sleep(0.5) + insert_future = await world.insert_model(str(sdf_model)) + await insert_future + + await world.pause(False) + + # while True: + # await asyncio.sleep(1.0) + + +async def run_old(): """ The main coroutine, which is started below. """ diff --git a/experiments/examples/yaml/gecko.yaml b/experiments/examples/yaml/gecko.yaml index 1eb4c083ef..365660be8d 100644 --- a/experiments/examples/yaml/gecko.yaml +++ b/experiments/examples/yaml/gecko.yaml @@ -1,4 +1,5 @@ --- +id: example_gecko body: id : Core type : Core diff --git a/experiments/examples/yaml/snake.yaml b/experiments/examples/yaml/snake.yaml index f8ce87e666..8fe8f62881 100644 --- a/experiments/examples/yaml/snake.yaml +++ b/experiments/examples/yaml/snake.yaml @@ -1,4 +1,5 @@ --- +id: example_snake body: id : Core type : Core diff --git a/experiments/examples/yaml/spider.yaml b/experiments/examples/yaml/spider.yaml index 8b225ebf8d..0ab75362fb 100644 --- a/experiments/examples/yaml/spider.yaml +++ b/experiments/examples/yaml/spider.yaml @@ -1,4 +1,5 @@ --- +id: example_spider body: id : Core type : Core diff --git a/pyrevolve/SDF/__init__.py b/pyrevolve/SDF/__init__.py new file mode 100644 index 0000000000..6a15695d66 --- /dev/null +++ b/pyrevolve/SDF/__init__.py @@ -0,0 +1,14 @@ +from .pose import Pose, Posable +from .link import Link, BoxLink, Inertial +from .geometry import Visual, Collision, MeshGeometry, BoxGeometry + +import xml.etree.ElementTree + + +def sub_element_text(parent, name, text): + el = xml.etree.ElementTree.SubElement(parent, name) + if type(text) is float or type(text) is int: + el.text = '{:e}'.format(text) + else: + el.text = str(text) + return el diff --git a/pyrevolve/SDF/geometry.py b/pyrevolve/SDF/geometry.py new file mode 100644 index 0000000000..8fa925b0c0 --- /dev/null +++ b/pyrevolve/SDF/geometry.py @@ -0,0 +1,99 @@ +import xml.etree.ElementTree +from pyrevolve import SDF + + +class MeshGeometry(xml.etree.ElementTree.Element): + def __init__(self, mesh_uri): + super().__init__('geometry') + mesh = xml.etree.ElementTree.SubElement(self, 'mesh') + SDF.sub_element_text(mesh, 'uri', mesh_uri) + + +class BoxGeometry(xml.etree.ElementTree.Element): + def __init__(self, box_size): + super().__init__('geometry') + self._box = (box_size[0], box_size[1], box_size[2]) + mesh = xml.etree.ElementTree.SubElement(self, 'box') + SDF.sub_element_text(mesh, 'size', + '{:e} {:e} {:e}'.format(box_size[0], box_size[1], box_size[2])) + + @property + def box(self): + return self._box + + +class Material(xml.etree.ElementTree.Element): + def __init__(self, ambient=(0, 0, 0, 1), diffuse=(0, 0, 0, 1), specular=(0, 0, 0, 1)): + super().__init__('material') + SDF.sub_element_text(self, 'ambient', + '{} {} {} {}'.format(ambient[0], ambient[1], ambient[2], ambient[3])) + SDF.sub_element_text(self, 'diffuse', + '{} {} {} {}'.format(diffuse[0], diffuse[1], diffuse[2], diffuse[3])) + SDF.sub_element_text(self, 'specular', + '{} {} {} {}'.format(specular[0], specular[1], specular[2], specular[3])) + + +class Visual(SDF.Posable): + def __init__(self, name, position=None, rotation=None): + super().__init__('visual', { + 'name': '{}_visual'.format(name) + }, position, rotation) + material = Material( + ambient=(0.94, 0.98, 0.05, 1.0), + diffuse=(0.94, 0.98, 0.05, 1.0), + specular=(0.1, 0.1, 0.1, 1.0), + ) + self.append(material) + + +class SurfaceProperties(xml.etree.ElementTree.Element): + def __init__(self): + super().__init__('surface') + contact_tag = xml.etree.ElementTree.SubElement(self, 'contact') + friction_tag = xml.etree.ElementTree.SubElement(self, 'friction') + + contact_ode_tag = xml.etree.ElementTree.SubElement(contact_tag, 'ode') + SDF.sub_element_text(contact_ode_tag, 'kd', 10000000.0 / 3) + SDF.sub_element_text(contact_ode_tag, 'kp', 90000) + + friction_ode_tag = xml.etree.ElementTree.SubElement(friction_tag, 'ode') + SDF.sub_element_text(friction_ode_tag, 'mu', 1.0) + SDF.sub_element_text(friction_ode_tag, 'mu2', 1.0) + SDF.sub_element_text(friction_ode_tag, 'slip1', 0.01) + SDF.sub_element_text(friction_ode_tag, 'slip2', 0.01) + + friction_bullet_tag = xml.etree.ElementTree.SubElement(friction_tag, 'bullet') + SDF.sub_element_text(friction_bullet_tag, 'friction', 1.0) + SDF.sub_element_text(friction_bullet_tag, 'friction2', 1.0) + + +class Collision(SDF.Posable): + def __init__(self, name, position=None, rotation=None): + super().__init__( + 'collision', + {'name': '{}_collision'.format(name)}, + position, + rotation + ) + + self._box_geometry = None + + surface_properties = SurfaceProperties() + self.append(surface_properties) + + def append(self, module): + super().append(module) + if type(module) is BoxGeometry: + if self._box_geometry is not None: + raise RuntimeError("Adding to many boxes to this collision, only one supported") + self._box_geometry = module.box + + @property + def boundaries(self): + if self._box_geometry is None: + raise RuntimeError("This Collision element has no BoxGeometry set") + return ( + (self._box_geometry[0] / -2, self._box_geometry[0] / 2), # X + (self._box_geometry[1] / -2, self._box_geometry[1] / 2), # Y + (self._box_geometry[2] / -2, self._box_geometry[2] / 2), # Z + ) diff --git a/pyrevolve/SDF/link.py b/pyrevolve/SDF/link.py new file mode 100644 index 0000000000..697c7adaf1 --- /dev/null +++ b/pyrevolve/SDF/link.py @@ -0,0 +1,54 @@ +import xml.etree.ElementTree +from pyrevolve import SDF + + +class Link(SDF.Posable): + def __init__(self, name, self_collide=True, position=None, rotation=None): + super().__init__( + 'link', + {'name': name}, + position, + rotation, + ) + + SDF.sub_element_text(self, 'self_collide', self_collide) + + +class BoxLink(Link): + def __init__(self, name, self_collide=True, position=None, rotation=None): + super().__init__( + 'link_component_{}__box'.format(name), + self_collide, + position, + rotation, + ) + + self.size = (0, 0, 0, 0, 0, 0) + + def append(self, subelement): + if type(subelement) is SDF.Collision: + # box = subelement. + pass + + super().append(subelement) + + def align_center_of_mass(self): + raise NotImplementedError("TODO") + + def calculate_inertial(self): + raise NotImplementedError("TODO") + + +class Inertial(xml.etree.ElementTree.Element): + def __init__(self, mass, inertia_xx, inertia_xy, inertia_xz, inertia_yy, inertia_yz, inertia_zz): + super().__init__('inertial') + + SDF.sub_element_text(self, 'mass', mass) + + inertia = xml.etree.ElementTree.SubElement(self, 'inertia') + SDF.sub_element_text(inertia, 'ixx', inertia_xx) + SDF.sub_element_text(inertia, 'ixy', inertia_xy) + SDF.sub_element_text(inertia, 'ixz', inertia_xz) + SDF.sub_element_text(inertia, 'iyy', inertia_yy) + SDF.sub_element_text(inertia, 'iyz', inertia_yz) + SDF.sub_element_text(inertia, 'izz', inertia_zz) diff --git a/pyrevolve/SDF/pose.py b/pyrevolve/SDF/pose.py new file mode 100644 index 0000000000..64cd91fb37 --- /dev/null +++ b/pyrevolve/SDF/pose.py @@ -0,0 +1,244 @@ +import sys +import xml.etree.ElementTree + +from pyrevolve.sdfbuilder import math + + +class Pose(xml.etree.ElementTree.Element): + def __init__(self, position: math.Vector3 = None, rotation: math.Quaternion = None): + super().__init__('pose') + self.position = math.Vector3() if position is None else position + self.rotation = math.Quaternion() if rotation is None else rotation + + @property + def text(self): + x, y, z = self.position.x, self.position.y, self.position.z + roll, pitch, yaw = self.rotation.get_rpy() + + return "{:e} {:e} {:e} {:e} {:e} {:e}".format( + x, y, z, + roll, pitch, yaw, + ) + + +class Posable(xml.etree.ElementTree.Element): + def __init__(self, tag, attrib={}, position=None, rotation=None, **extra): + super().__init__(tag, attrib, **extra) + self._pose = Pose(position, rotation) + self.append(self._pose) + + @property + def pose(self): + return self._pose + + @pose.setter + def pose(self, pose: Pose): + self.set_position(pose.position) + self.set_position(pose.position) + + def get_position(self): + return self._pose.position.copy() + + def get_rotation(self): + return self._pose.rotation.copy() + + def set_position(self, position: math.Vector3): + self._pose.position = position.copy() + + def set_rotation(self, rotation: math.Quaternion): + self._pose.rotation = rotation.copy() + + def translate(self, translation: math.Vector3): + self._pose.position = self._pose.position + translation + + def rotate(self, rotation: math.Quaternion): + self._pose.rotation = rotation * self._pose.rotation + + def rotate_around(self, axis: math.Vector3, angle: float, relative_to_child: bool = True): + """ + Rotates this Posable `angle` degrees around the given directional vector + :param axis: + :param angle: + :param relative_to_child: If True, the axis is expressed in the + child frame. + :return: + """ + if relative_to_child: + axis = self.to_parent_direction(axis) + + quat = math.Quaternion.from_angle_axis(angle, axis) + self.rotate(quat) + + def to_parent_direction(self, vec): + """ + Returns the given direction vector / rotation quaternion relative to + the parent frame. + :param vec: Vector or quaternion in the local frame + :type vec: math.Vector3|math.Quaternion + :return: + :rtype: math.Vector3|math.Quaternion + """ + return self._pose.rotation * vec + + def to_local_direction(self, vec): + """ + Returns the given direction vector / rotation quaternion relative to + the local frame + :param vec: Direction vector or orientation in the parent frame + :type vec: math.Vector3|math.Quaternion + :return: + :rtype: math.Vector3|math.Quaternion + """ + return self._pose.rotation.conjugated() * vec + + def to_parent_frame(self, point: math.Vector3): + """ + Returns the given point relative to the parent frame + :param point: Point in the local frame + :return: + :rtype: math.Vector3 + """ + position = self._pose.position + return self.to_parent_direction(point) + position + + def to_local_frame(self, point: math.Vector3): + """ + Returns the given point relative to the local frame + :param point: Point in the parent frame + :return: + :rtype: math.Vector3 + """ + rotation = self._pose.rotation.conjugated() + position = self._pose.position + return rotation * (point - position) + + def to_sibling_frame(self, point: math.Vector3, sibling): + """ + Takes a point and converts it to the frame of a sibling + :param point: + :param sibling: + :type sibling: Posable + :return: The point in the sibling's frame + :rtype: math.Vector3 + """ + # Do this the easy way: convert to parent, then + # back to sibling + in_parent = self.to_parent_frame(point) + return sibling.to_local_frame(in_parent) + + def to_sibling_direction(self, vec, sibling): + """ + Returns the given direction vector / orientation quaternion relative + to the frame of a sibling + :param vec: Direction vector / orientation quaternion in the child frame + :type vec: math.Vector3|math.Quaternion + :param sibling: The sibling posable + :type sibling: Posable + :return: + :rtype: math.Vector3|math.Quaternion + """ + in_parent = self.to_parent_direction(vec) + return sibling.to_local_direction(in_parent) + + def align(self, + my, + at, + of, + relative_to_child: bool = True): + """ + Rotates and translates this Posable, such that the ends of the + vectors `my.pos` and `at.pos` touch, aligning such that `my.normal` points in + the opposite direction of `at.normal` and `my_tangent` and + `at.tangent` align. + + The two Posables need to be in the same parent frame for this to work. + + You can choose to specify the positions and orientations either in + the parent frame or in the child frame using the final argument to + this method. Be aware that representing orientation vectors in the + parent frame merely means that they are already rotated with respect + to their parent, not translated. + :param my: BoxSlot (pos, norm, tang) to move + :type my: BoxSlot + :param at: BoxSlot (pos, norm, tang) target where to attach it + :type at: BoxSlot + :param of: + :type of: Posable + :param relative_to_child: + :return: + """ + if not my.normal.orthogonal_to(my.tangent): + raise ValueError("`my.normal` and `my_tangent` should be orthogonal.") + + if not at.normal.orthogonal_to(at.tangent): + raise ValueError("`at.normal` and `at.tangent` should be orthogonal.") + + # Convert all vectors to local frame if not currently there, + # we will need this as reference after rotation. + if not relative_to_child: + my.pos = self.to_local_frame(my.pos) + my.normal = self.to_local_direction(my.normal) + my.tangent = self.to_local_direction(my.tangent) + + at.pos = of.to_local_frame(at.pos) + at.normal = of.to_local_direction(at.normal) + at.tangent = of.to_local_direction(at.tangent) + + # This explains how to do the alignment easily: + # http://stackoverflow.com/questions/21828801/how-to-find-correct-rotation-from-one-vector-to-another + + # We define coordinate systems in which "normal", "tangent" and + # "normal x tangent" are the x, y and z axes ("normal x tangent" is + # the cross product). We then determine two rotation matrices, + # one for the rotation of the standard basis to "my" (R1): + my_x = my.normal.normalized() + my_y = my.tangent.normalized() + my_z = my_x.cross(my_y) + + # Note that we are going to determine an absolute rotation, + # so we need the vectors in the local frame rather than in the parent + # frame. We also determine a rotation matrix for the rotation of + # "at" (R2): + at_x = of.to_parent_direction(-at.normal).normalized() + at_y = of.to_parent_direction(at.tangent).normalized() + at_z = at_x.cross(at_y) + + # For which we do use the parent frame. We now want to provide the + # rotation matrix from R1 to R2. The easiest way to visualize this is + # if we first perform the inverse rotation from R1 back to the + # standard basis, and then rotate to R2. + r1 = math.RotationMatrix() + r2 = math.RotationMatrix() + + # Warning: `RotationMatrix` is a Matrix4 that can potentially do + # translations. We want to assign the first block of these matrices + # only. Syntax is numpy arrays. + r1[:3, 0], r1[:3, 1], r1[:3, 2] = my_x, my_y, my_z + r2[:3, 0], r2[:3, 1], r2[:3, 2] = at_x, at_y, at_z + + # The columns of r1 are orthonormal, so we can simply transpose the + # matrix to get the inverse rotation + r1.transpose() + + # The final rotation is the inverse of r1, followed by r2 + # (left multiplication) + rotation = r2 * r1 + self.set_rotation(rotation.get_quaternion()) + + my_parent_normal = self.to_parent_direction(my.normal) + at_parent_normal = of.to_parent_direction(-at.normal) + if not my_parent_normal.parallel_to(at_parent_normal): + print("Vector angle: %f" % my_parent_normal.angle(at_parent_normal), file=sys.stderr) + raise AssertionError("Normal vectors failed to align!") + + parent_tangent = self.to_parent_direction(my.tangent) + at_parent_tangent = of.to_parent_direction(at.tangent) + if not parent_tangent.parallel_to(at_parent_tangent): + print("Vector angle: %f" % parent_tangent.angle(at_parent_tangent), file=sys.stderr) + raise AssertionError("Tangent vectors failed to align!") + + # Finally, translate so that `my` lands at `at` + my_pos = self.to_parent_frame(my.pos) + at_pos = of.to_parent_frame(at.pos) + translation = at_pos - my_pos + self.translate(translation) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index d043711d94..3f5d5af28c 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -2,18 +2,25 @@ Revolve body generator based on RoboGen framework """ import yaml +import math from collections import OrderedDict from pyrevolve.sdfbuilder import SDF -from pyrevolve.sdfbuilder import Model +from pyrevolve.sdfbuilder import math as SDFmath +from pyrevolve.sdfbuilder import Model, Element, Link, FixedJoint +from pyrevolve.sdfbuilder.util import number_format from .revolve_module import CoreModule from .revolve_module import ActiveHingeModule from .revolve_module import BrickModule from .revolve_module import BrickSensorModule +from .revolve_module import Orientation from .brain_nn import BrainNN -class RevolveBot(): +import xml.etree.ElementTree + + +class RevolveBot: """ Basic robot description class that contains robot's body and/or brain structures, ID and several other necessary parameters. Capable of reading @@ -98,7 +105,130 @@ def load_file(self, path, conf_type='yaml'): self.load(robot, conf_type) - def to_sdf(self): + def to_sdf(self, nice_format=None): + return self._to_sdf_PYTHON_XML(nice_format) + + @staticmethod + def _sdf_attach_module(module_slot, module_orientation: float, + visual, collision, + parent_slot, parent_collision): + """ + Attaches `module` to `parent` using `parent_slot`. + It modifies the pose of `visual` and `collision` to move them attached to the + `parent_collision` + :param module_slot: + :param module_orientation: degrees of rotation of the component + :param visual: + :param collision: + :param parent_slot: + :param parent_collision: + :return: + """ + + if module_orientation is not None: + # Rotate the module_slot.tangent vector over the normal + # with the given number of radians to apply + # the rotation. Rotating this vector around + # the normal should not break their orthogonality. + orientation = module_orientation / 180.0 * math.pi + rot = SDFmath.Quaternion.from_angle_axis(orientation, module_slot.normal) + module_slot.tangent = rot * module_slot.tangent + + visual.align( + module_slot, + parent_slot, + parent_collision, + relative_to_child=True + ) + collision.set_position(visual.get_position()) + collision.set_rotation(visual.get_rotation()) + + def _to_sdf_PYTHON_XML(self, nice_format): + from xml.etree import ElementTree + from pyrevolve import SDF + + sdf_root = ElementTree.Element('sdf', {'version': '1.6'}) + + assert (self._id is not None) + model = ElementTree.SubElement(sdf_root, 'model', { + 'name': str(self._id) + }) + + # TODO make this pose parametric + pose = SDF.Pose(SDFmath.Vector3(0, 0, 0.05)) + model.append(pose) + + link = SDF.BoxLink('Core') + model.append(link) + + visual, collision, inertial = self._body.to_sdf('') + link.append(visual) + link.append(collision) + link.append(inertial) + + parent_module = self._body + parent_collision = collision + + for slot, module in self._body.iter_children(): + if module is None: + continue + + if type(module) is ActiveHingeModule: + print("adding joint") + child_link = SDF.BoxLink('{}Leg'.format(slot)) + # model.append(child_link) + + visual_frame, collision_frame,\ + visual_servo, collision_servo = module.to_sdf('{}'.format(slot)) + + slot = Orientation(slot) + if slot != Orientation.WEST: + pass + + module_slot = module.boxslot_frame(Orientation.SOUTH) + parent_slot = parent_module.boxslot(slot) + self._sdf_attach_module(module_slot, module.orientation, + visual_frame, collision_frame, + parent_slot, parent_collision) + + module_slot = module.boxslot_servo(Orientation.SOUTH) + parent_slot = module.boxslot_frame(Orientation.NORTH) + self._sdf_attach_module(module_slot, None, + visual_servo, collision_servo, + parent_slot, collision_frame) + + link.append(visual_frame) + link.append(collision_frame) + + link.append(visual_servo) + link.append(collision_servo) + # child_link.append(visual_servo) + # child_link.append(collision_servo) + + else: + print("adding block") + visual, collision, inertial = module.to_sdf() + + link.append(visual) + link.append(collision) + + def prettify(rough_string, indent='\t'): + """Return a pretty-printed XML string for the Element. + """ + import xml.dom.minidom + reparsed = xml.dom.minidom.parseString(rough_string) + return reparsed.toprettyxml(indent=indent) + + # tree = xml.etree.ElementTree.ElementTree(sdf) + res = xml.etree.ElementTree.tostring(sdf_root, encoding='utf8', method='xml') + print(res) + + if nice_format is not None: + res = prettify(res, nice_format) + + return res + + def _to_sdf_REVOLVE_XML(self): """ Converts yaml to sdf @@ -109,12 +239,70 @@ def to_sdf(self): model = Model(name=self._id) # TODO: Traverse through body elements, retrieve s and # create s between them - elements = None + elements = [ + self._sdf_brain_plugin_conf() + ] model.add_elements(elements) sdf.add_element(model) return sdf + def _sdf_brain_plugin_conf( + self, + update_rate=5, + controller_plugin='libRobotControlPlugin.so' + ): + """ + creates the plugin node with the brain configuration inside + :param update_rate: Update rate as used by the default controller + :type update_rate: float + + :param controller_plugin: Name of the shared + library of the model plugin + :type controller_plugin: str + + :return: The sdf model + """ + plugin = Element( + tag_name='plugin', + attributes={ + 'name': 'robot_controller', + 'filename': controller_plugin + }) + + config = Element( + tag_name='rv:robot_config', + attributes={ + 'xmlns:rv': 'https://github.com/ci-group/revolve' + }) + plugin.add_element(config) + + # update rate + config.add_element(Element( + tag_name='rv:update_rate', + body=number_format(update_rate))) + + # brain + if self._brain is not None: + brain_config = self._brain.to_sdf() + config.add_element(brain_config) + + # TODO sensors + + # TODO motors + + # battery + if self._battery_level is not None: + battery = Element(tag_name='rv:battery') + battery_level = Element( + tag_name='rv:level', + body=self._battery_level + ) + battery.add_element(battery_level) + config.add_element(battery) + + return plugin + def to_yaml(self): """ Converts robot data structure to yaml diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 7ee63f2482..fef5472925 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -2,12 +2,22 @@ Class containing the body parts to compose a Robogen robot """ from collections import OrderedDict +from enum import Enum from pyrevolve.sdfbuilder import Link -from pyrevolve.sdfbuilder.structure import Box +from pyrevolve.sdfbuilder import math as SDFmath +from pyrevolve.sdfbuilder.structure import Box from pyrevolve.sdfbuilder.structure import Collision from pyrevolve.sdfbuilder.structure import Visual from pyrevolve.sdfbuilder.structure import Mesh +from pyrevolve import SDF + + +class Orientation(Enum): + SOUTH = 0 + NORTH = 1 + EAST = 2 + WEST = 3 class RevolveModule: @@ -16,11 +26,15 @@ class RevolveModule: """ DEFAULT_COLOR = (0.5, 0.5, 0.5) TYPE = None + VISUAL_MESH = None + COLLISION_BOX = None + MASS = None + INERTIA = None def __init__(self): self.id = None self.orientation = None - self.rgb = None #RevolveModule.DEFAULT_COLOR + self.rgb = None # RevolveModule.DEFAULT_COLOR self.substrate_coordinates = None self.children = [None, None, None, None] @@ -85,7 +99,7 @@ def to_yaml(self): yaml_dict_object['orientation'] = self.orientation if self.rgb is not None: - yaml_dict_object['params'] = { + yaml_dict_object['params'] = { 'red': self.rgb[0], 'green': self.rgb[1], 'blue': self.rgb[2], @@ -94,9 +108,12 @@ def to_yaml(self): children = self._generate_yaml_children() if children is not None: yaml_dict_object['children'] = children - + return yaml_dict_object + def iter_children(self): + return enumerate(self.children) + def _generate_yaml_children(self): has_children = False @@ -115,12 +132,44 @@ def validate(self): """ raise RuntimeError("Robot tree validation not yet implemented") - def to_sdf(self): + def to_sdf(self, tree_depth): """ :return: """ - raise NotImplementedError("Module.to_sdf() not implemented") + return self._brick_to_sdf(tree_depth) + + def _brick_to_sdf(self, tree_depth=''): + name = 'component_{}{}__box'.format(tree_depth, self.TYPE) + visual = SDF.Visual(name) + geometry = SDF.MeshGeometry(self.VISUAL_MESH) + visual.append(geometry) + + collision = SDF.Collision(name) + geometry = SDF.BoxGeometry(self.COLLISION_BOX) + collision.append(geometry) + + inertial = SDF.Inertial(self.MASS, + self.INERTIA[0], + self.INERTIA[1], + self.INERTIA[2], + self.INERTIA[3], + self.INERTIA[4], + self.INERTIA[5]) + + return visual, collision, inertial + + def boxslot(self, orientation=None): + orientation = Orientation.SOUTH if orientation is None else orientation + return BoxSlot(self.boundaries(), orientation) + + def boundaries(self, box_geometry=None): + box_geometry = self.COLLISION_BOX if box_geometry is None else box_geometry + return ( + (box_geometry[0] / -2.0, box_geometry[0] / 2.0), # X + (box_geometry[1] / -2.0, box_geometry[1] / 2.0), # Y + (box_geometry[2] / -2.0, box_geometry[2] / 2.0), # Z + ) class CoreModule(RevolveModule): @@ -128,15 +177,26 @@ class CoreModule(RevolveModule): Inherits class RevolveModule. Creates Robogen core module """ TYPE = "CoreComponent" + VISUAL_MESH = 'model://rg_robot/meshes/CoreComponent.dae' + COLLISION_BOX = (0.09, 0.09, 0.045) + MASS = 1.064000e-01 # TODO fix + INERTIA = ( # TODO fix + 1.143069e-04, + 0.000000e+00, + -1.763242e-38, + 7.888603e-05, + 4.198228e-22, + 1.596582e-04, + ) def __init__(self): super().__init__() - def to_sdf(self): + def to_sdf_old(self): """ Converts the CoreComponent to SDF format :return: - """ + """ # TODO: Scale needs to be checked scale = 0.5 mesh = Mesh( @@ -165,12 +225,19 @@ class ActiveHingeModule(RevolveModule): """ Inherits class RevolveModule. Creates Robogen joint module """ - TYPE = "ActiveHinge" + TYPE = 'ActiveHinge' + VISUAL_MESH_FRAME = 'model://rg_robot/meshes/ActiveHinge_Frame.dae' + VISUAL_MESH_SERVO = 'model://rg_robot/meshes/ActiveCardanHinge_Servo_Holder.dae' + COLLISION_BOX_FRAME = (2.000000e-02, 3.400000e-02, 1.000000e-02) + COLLISION_BOX_SERVO = (2.450000e-02, 3.400000e-02, 1.000000e-02) def __init__(self): super().__init__() self.children = {1: None} + def iter_children(self): + return self.children.items() + def _generate_yaml_children(self): child = self.children[1] if child is None: @@ -178,12 +245,66 @@ def _generate_yaml_children(self): else: return {1: child.to_yaml()} + def to_sdf(self, tree_depth): + name_frame = 'component_{}{}__frame'.format(tree_depth, self.TYPE) + name_servo = 'component_{}{}__servo'.format(tree_depth, self.TYPE) + + offset = SDFmath.Vector3(self.COLLISION_BOX_FRAME[0] / 2) + + visual_frame = SDF.Visual(name_frame) + visual_frame.translate(offset) + geometry = SDF.MeshGeometry(self.VISUAL_MESH_FRAME) + visual_frame.append(geometry) + + collision_frame = SDF.Collision(name_frame) + collision_frame.translate(offset) + geometry = SDF.BoxGeometry(self.COLLISION_BOX_FRAME) + collision_frame.append(geometry) + + visual_servo = SDF.Visual(name_servo) + visual_servo.translate(offset) + geometry = SDF.MeshGeometry(self.VISUAL_MESH_SERVO) + visual_servo.append(geometry) + + collision_servo = SDF.Collision(name_servo) + collision_servo.translate(offset) + geometry = SDF.BoxGeometry(self.COLLISION_BOX_SERVO) + collision_servo.append(geometry) + + return visual_frame, collision_frame, \ + visual_servo, collision_servo + + def boxslot_frame(self, orientation=None): + orientation = Orientation.SOUTH if orientation is None else orientation + boundaries = self.boundaries(self.COLLISION_BOX_FRAME) + return BoxSlotJoints( + boundaries, + orientation, + (SDFmath.Vector3(0, 0, 0), SDFmath.Vector3(-0.0091, 0, 0)) + ) + + def boxslot_servo(self, orientation=None): + orientation = Orientation.SOUTH if orientation is None else orientation + boundaries = self.boundaries(self.COLLISION_BOX_SERVO) + return BoxSlotJoints(boundaries, orientation) + class BrickModule(RevolveModule): """ Inherits class RevolveModule. Creates Robogen brick module """ TYPE = "FixedBrick" + VISUAL_MESH = 'model://rg_robot/meshes/FixedBrick.dae' + COLLISION_BOX = (-1.0, 1.0, 3.550000e-02) + MASS = 0.1 # TODO fix + INERTIA = ( # TODO fix + 1.143069e-04, + 0.000000e+00, + -1.763242e-38, + 7.888603e-05, + 4.198228e-22, + 1.596582e-04, + ) def __init__(self): super().__init__() @@ -208,3 +329,74 @@ class TouchSensorModule(RevolveModule): def __init__(self): super().__init__() + +class BoxSlot: + def __init__(self, boundaries, orientation: Orientation): + self.pos = self._calculate_box_slot_pos(boundaries, orientation) + self.normal = self.pos.normalized() + self.tangent = self._calculate_box_slot_tangent(orientation) + + def _calculate_box_slot_pos(self, boundaries, slot: Orientation): + # boundaries = collision_elem.boundaries + if slot == Orientation.SOUTH: + return SDFmath.Vector3(0, boundaries[1][0], 0) + elif slot == Orientation.NORTH: + return SDFmath.Vector3(0, boundaries[1][1], 0) + elif slot == Orientation.EAST: + return SDFmath.Vector3(boundaries[0][1], 0, 0) + elif slot == Orientation.WEST: + return SDFmath.Vector3(boundaries[0][0], 0, 0) + else: + raise RuntimeError('invalid module orientation: {}'.format(slot)) + + @staticmethod + def _calculate_box_slot_tangent(slot: Orientation): + """ + Return slot tangent + """ + if slot == Orientation.SOUTH: + return SDFmath.Vector3(0, 0, 1) + elif slot == Orientation.NORTH: + return SDFmath.Vector3(0, 0, 1) + elif slot == Orientation.EAST: + return SDFmath.Vector3(0, 0, 1) + elif slot == Orientation.WEST: + return SDFmath.Vector3(0, 0, 1) + # elif slot == 4: + # # Right face tangent: back face + # return SDFmath.Vector3(0, 1, 0) + # elif slot == 5: + # # Left face tangent: back face + # return SDFmath.Vector3(0, 1, 0) + else: + raise RuntimeError("Invalid orientation") + + +class BoxSlotJoints(BoxSlot): + + def __init__(self, boundaries, orientation: Orientation, offset = (SDFmath.Vector3(), SDFmath.Vector3())): + self.offset = offset + super().__init__(boundaries, orientation) + + def _calculate_box_slot_pos(self, boundaries, slot: Orientation): + # boundaries = collision_elem.boundaries + if slot == Orientation.SOUTH: + return SDFmath.Vector3(boundaries[0][0], 0, 0) + self.offset[0] + # return SDFmath.Vector3(0, boundaries[0][0], 0) + elif slot == Orientation.NORTH: + return SDFmath.Vector3(boundaries[0][1], 0, 0) + self.offset[1] + # return SDFmath.Vector3(0, boundaries[0][1], 0) + else: + raise RuntimeError('invalid module orientation: {}'.format(slot)) + + @staticmethod + def _calculate_box_slot_tangent(slot: Orientation): + """ + Return slot tangent + """ + if slot == Orientation.SOUTH: + return SDFmath.Vector3(0, 0, 1) + elif slot == Orientation.NORTH: + return SDFmath.Vector3(0, 0, 1) + else: + raise RuntimeError("Invalid orientation") diff --git a/pyrevolve/tol/manage/world.py b/pyrevolve/tol/manage/world.py index d433d9756f..08681b55bd 100644 --- a/pyrevolve/tol/manage/world.py +++ b/pyrevolve/tol/manage/world.py @@ -6,16 +6,16 @@ from pyrevolve import parser, str_to_address, make_revolve_config from pyrevolve.angle import Tree, Crossover, Mutator, WorldManager -from pyrevolve.angle.robogen.spec import make_planar +# from pyrevolve.angle.robogen.spec import make_planar from pyrevolve.sdfbuilder import SDF, Model, Pose, Link from pyrevolve.util import multi_future from .. import logger from .. import constants from .robot import Robot -from ..build import get_builder, to_sdfbot +# from ..build import get_builder, to_sdfbot from ..scenery import Wall -from ..spec import get_tree_generator +# from ..spec import get_tree_generator # Construct a message base from the time. This should make it unique enough # for consecutive use when the script is restarted. @@ -49,26 +49,26 @@ def __init__(self, conf, _private): world_address=str_to_address(conf.world_address), # analyzer_address=str_to_address(conf.analyzer_address), output_directory=conf.output_directory, - builder=get_builder(conf), + builder=None, state_update_frequency=conf.pose_update_frequency, - generator=get_tree_generator(conf), + generator=None, restore=conf.restore_directory ) self.conf = conf - self.crossover = Crossover( - body_gen=self.generator.body_gen, - brain_gen=self.generator.brain_gen - ) - self.mutator = Mutator( - body_gen=self.generator.body_gen, - brain_gen=self.generator.brain_gen, - p_duplicate_subtree=conf.p_duplicate_subtree, - p_swap_subtree=conf.p_swap_subtree, - p_delete_subtree=conf.p_delete_subtree, - p_remove_brain_connection=conf.p_remove_brain_connection, - p_delete_hidden_neuron=conf.p_delete_hidden_neuron - ) + # self.crossover = Crossover( + # body_gen=self.generator.body_gen, + # brain_gen=self.generator.brain_gen + # ) + # self.mutator = Mutator( + # body_gen=self.generator.body_gen, + # brain_gen=self.generator.brain_gen, + # p_duplicate_subtree=conf.p_duplicate_subtree, + # p_swap_subtree=conf.p_swap_subtree, + # p_delete_subtree=conf.p_delete_subtree, + # p_remove_brain_connection=conf.p_remove_brain_connection, + # p_delete_hidden_neuron=conf.p_delete_hidden_neuron + # ) # Set to true whenever a reproduction sequence is going on # to prevent another one from starting (which cannot happen now @@ -198,7 +198,7 @@ def to_sdfbot(self, robot, robot_name, initial_battery=0.0): return to_sdfbot( robot=robot, name=robot_name, - builder=self.builder, + builder=None, conf=self.conf, battery_charge=initial_battery ) @@ -247,8 +247,8 @@ async def attempt_mate(self, ra, rb): logger.debug("Crossover succeeded, applying mutation...") self.mutator.mutate(child, in_place=True) - if self.conf.enforce_planarity: - make_planar(child.root) + # if self.conf.enforce_planarity: + # make_planar(child.root) _, outputs, _ = child.root.io_count(recursive=True) if not outputs: From f9ec6b2a40f5db17d11d906faefa7706209c7118 Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Mon, 11 Mar 2019 12:53:43 +0100 Subject: [PATCH 14/49] added id and hinge color to drawing --- canvas.py | 265 ------------------------- grid.py | 149 ++++++++++++++ pyrevolve/revolve_bot/render/canvas.py | 43 +++- pyrevolve/revolve_bot/render/render.py | 19 +- 4 files changed, 197 insertions(+), 279 deletions(-) delete mode 100644 canvas.py create mode 100644 grid.py diff --git a/canvas.py b/canvas.py deleted file mode 100644 index dedb320f3d..0000000000 --- a/canvas.py +++ /dev/null @@ -1,265 +0,0 @@ -import cairo -import math - -class Canvas: - # Current position of last drawn element - x_pos = 0 - y_pos = 0 - - # Orientation of robot - orientation = 1 - - # Direction of last movement - previous_move = -1 - - # Coordinates and orientation of movements - movement_stack = [] - - # Positions for the sensors - sensors = [] - - - def __init__(self, width, height, scale): - """Instantiate context and surface""" - self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width*scale, height*scale) - context = cairo.Context(self.surface) - context.scale(scale, scale) - self.context = context - self.width = width - self.height = height - self.scale = scale - - - def get_position(self): - """Return current position on x and y axis""" - return [Canvas.x_pos, Canvas.y_pos] - - def set_position(self, x, y): - """Set position of x and y axis""" - Canvas.x_pos = x - Canvas.y_pos = y - - def set_orientation(self, orientation): - """Set new orientation of robot""" - if orientation in [0, 1, 2, 3]: - Canvas.orientation = orientation - else: - return False - - def calculate_orientation(self): - """Calculate new orientation based on current orientation and last movement direction""" - if (Canvas.previous_move == -1 or - (Canvas.previous_move == 1 and Canvas.orientation == 1) or - (Canvas.previous_move == 2 and Canvas.orientation == 3) or - (Canvas.previous_move == 3 and Canvas.orientation == 2) or - (Canvas.previous_move == 0 and Canvas.orientation == 0)): - self.set_orientation(1) - elif ((Canvas.previous_move == 2 and Canvas.orientation == 1) or - (Canvas.previous_move == 0 and Canvas.orientation == 3) or - (Canvas.previous_move == 1 and Canvas.orientation == 2) or - (Canvas.previous_move == 3 and Canvas.orientation == 0)): - self.set_orientation(2) - elif ((Canvas.previous_move == 0 and Canvas.orientation == 1) or - (Canvas.previous_move == 3 and Canvas.orientation == 3) or - (Canvas.previous_move == 2 and Canvas.orientation == 2) or - (Canvas.previous_move == 1 and Canvas.orientation == 0)): - self.set_orientation(0) - elif ((Canvas.previous_move == 3 and Canvas.orientation == 1) or - (Canvas.previous_move == 1 and Canvas.orientation == 3) or - (Canvas.previous_move == 0 and Canvas.orientation == 2) or - (Canvas.previous_move == 2 and Canvas.orientation == 0)): - self.set_orientation(3) - - def move_by_slot(self, slot): - """Move in direction by slot id""" - if slot == 0: - self.move_down() - elif slot == 1: - self.move_up() - elif slot == 2: - self.move_right() - elif slot == 3: - self.move_left() - - def move_right(self): - """Set position one to the right in correct orientation""" - if Canvas.orientation == 1: - Canvas.x_pos += 1 - elif Canvas.orientation == 2: - Canvas.y_pos += 1 - elif Canvas.orientation == 0: - Canvas.x_pos -= 1 - elif Canvas.orientation == 3: - Canvas.y_pos -= 1 - Canvas.previous_move = 2 - - def move_left(self): - """Set position one to the left""" - if Canvas.orientation == 1: - Canvas.x_pos -= 1 - elif Canvas.orientation == 2: - Canvas.y_pos -= 1 - elif Canvas.orientation == 0: - Canvas.x_pos += 1 - elif Canvas.orientation == 3: - Canvas.y_pos += 1 - Canvas.previous_move = 3 - - def move_up(self): - """Set position one upwards""" - if Canvas.orientation == 1: - Canvas.y_pos -= 1 - elif Canvas.orientation == 2: - Canvas.x_pos += 1 - elif Canvas.orientation == 0: - Canvas.y_pos += 1 - elif Canvas.orientation == 3: - Canvas.x_pos -= 1 - Canvas.previous_move = 1 - - def move_down(self): - """Set position one downwards""" - if Canvas.orientation == 1: - Canvas.y_pos += 1 - elif Canvas.orientation == 2: - Canvas.x_pos -= 1 - elif Canvas.orientation == 0: - Canvas.y_pos -= 1 - elif Canvas.orientation == 3: - Canvas.x_pos += 1 - Canvas.previous_move = 0 - - def move_back(self): - """Move back to previous state on canvas""" - if len(Canvas.movement_stack) > 1: - Canvas.movement_stack.pop() - last_movement = Canvas.movement_stack[-1] - Canvas.x_pos = last_movement[0] - Canvas.y_pos = last_movement[1] - Canvas.orientation = last_movement[2] - - def draw_controller(self): - """Draw a controller (yellow) in the middle of the canvas""" - self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) - self.context.set_source_rgb(255, 255, 0) - self.context.fill_preserve() - self.context.set_source_rgb(0, 0, 0) - self.context.set_line_width(0.01) - self.context.stroke() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) - - def draw_hinge(self): - """Draw a hinge (blue) on the previous object""" - self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) - self.context.set_source_rgb(1, 0, 0) - self.context.fill_preserve() - self.context.set_source_rgb(0, 0, 0) - self.context.set_line_width(0.01) - self.context.stroke() - self.calculate_orientation() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) - - def draw_module(self): - """Draw a module (red) on the previous object""" - self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) - self.context.set_source_rgb(0, 0, 255) - self.context.fill_preserve() - self.context.set_source_rgb(0, 0, 0) - self.context.set_line_width(0.01) - self.context.stroke() - self.calculate_orientation() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) - - def calculate_sensor_rectangle_position(self): - """Calculate squeezed sensor rectangle position based on current orientation and last movement direction""" - if (Canvas.previous_move == -1 or - (Canvas.previous_move == 1 and Canvas.orientation == 1) or - (Canvas.previous_move == 2 and Canvas.orientation == 3) or - (Canvas.previous_move == 3 and Canvas.orientation == 2) or - (Canvas.previous_move == 0 and Canvas.orientation == 0)): - return Canvas.x_pos, Canvas.y_pos + 0.9, 1, 0.1 - elif ((Canvas.previous_move == 2 and Canvas.orientation == 1) or - (Canvas.previous_move == 0 and Canvas.orientation == 3) or - (Canvas.previous_move == 1 and Canvas.orientation == 2) or - (Canvas.previous_move == 3 and Canvas.orientation == 0)): - return Canvas.x_pos, Canvas.y_pos, 0.1, 1 - elif ((Canvas.previous_move == 0 and Canvas.orientation == 1) or - (Canvas.previous_move == 3 and Canvas.orientation == 3) or - (Canvas.previous_move == 2 and Canvas.orientation == 2) or - (Canvas.previous_move == 1 and Canvas.orientation == 0)): - return Canvas.x_pos, Canvas.y_pos, 1, 0.1 - elif ((Canvas.previous_move == 3 and Canvas.orientation == 1) or - (Canvas.previous_move == 1 and Canvas.orientation == 3) or - (Canvas.previous_move == 0 and Canvas.orientation == 2) or - (Canvas.previous_move == 2 and Canvas.orientation == 0)): - return Canvas.x_pos + 0.9, Canvas.y_pos, 0.1, 1 - - def save_sensor_position(self): - """Save sensor position in list""" - x, y, x_scale, y_scale = self.calculate_sensor_rectangle_position() - Canvas.sensors.append([x, y, x_scale, y_scale]) - self.calculate_orientation() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) - - def draw_sensors(self): - """Draw all sensors""" - for sensor in Canvas.sensors: - self.context.rectangle(sensor[0], sensor[1], sensor[2], sensor[3]) - self.context.set_source_rgb(0, 128, 0) - self.context.fill_preserve() - self.context.set_source_rgb(0, 0, 0) - self.context.set_line_width(0.01) - self.context.stroke() - - def calculate_connector_to_parent_position(self): - """Calculate position of connector node on canvas""" - parent = Canvas.movement_stack[-2] - parent_orientation = parent[2] - - if ((Canvas.previous_move == 1 and parent_orientation == 1) or - (Canvas.previous_move == 3 and parent_orientation == 2) or - (Canvas.previous_move == 0 and parent_orientation == 0) or - (Canvas.previous_move == 2 and parent_orientation == 3)): - # Connector is on top of parent - return parent[0] + 0.5, parent[1] - elif ((Canvas.previous_move == 2 and parent_orientation == 1) or - (Canvas.previous_move == 1 and parent_orientation == 2) or - (Canvas.previous_move == 3 and parent_orientation == 0) or - (Canvas.previous_move == 0 and parent_orientation == 3)): - # Connector is on right side of parent - return parent[0] + 1, parent[1] + 0.5 - elif ((Canvas.previous_move == 3 and parent_orientation == 1) or - (Canvas.previous_move == 0 and parent_orientation == 2) or - (Canvas.previous_move == 2 and parent_orientation == 0) or - (Canvas.previous_move == 1 and parent_orientation == 3)): - # Connector is on left side of parent - return parent[0], parent[1] + 0.5 - elif ((Canvas.previous_move == 0 and parent_orientation == 1) or - (Canvas.previous_move == 2 and parent_orientation == 2) or - (Canvas.previous_move == 1 and parent_orientation == 0) or - (Canvas.previous_move == 3 and parent_orientation == 3)): - # Connector is on bottom of parent - return parent[0] + 0.5, parent[1] + 1 - - def draw_connector_to_parent(self): - """Draw a circle between child and parent""" - x, y = self.calculate_connector_to_parent_position() - self.context.arc(x, y, 0.1, 0, math.pi*2) - self.context.set_source_rgb(0, 0, 0) - self.context.fill_preserve() - self.context.set_source_rgb(0, 0, 0) - self.context.set_line_width(0.01) - self.context.stroke() - - def save_png(self, file_name): - """Store image representation of canvas""" - self.surface.write_to_png(file_name) - - def reset_canvas(self): - """Reset canvas variables to default values""" - Canvas.x_pos = 0 - Canvas.y_pos = 0 - Canvas.orientation = 1 - Canvas.previous_move = -1 - Canvas.movement_stack = [] - Canvas.sensors = [] \ No newline at end of file diff --git a/grid.py b/grid.py new file mode 100644 index 0000000000..7cde9dae96 --- /dev/null +++ b/grid.py @@ -0,0 +1,149 @@ +class Grid: + # Current position of last drawn element + x_pos = 0 + y_pos = 0 + + # Orientation of robot + orientation = 1 + + # Direction of last movement + previous_move = -1 + + # Coordinates and orientation of movements + movement_stack = [[0,0,1]] + + # Coordinates of visited positions + visited_coordinates = [] + + def get_position(self): + """Return current position on x and y axis""" + return [Grid.x_pos, Grid.y_pos] + + def set_position(self, x, y): + """Set position of x and y axis""" + Grid.x_pos = x + Grid.y_pos = y + + def set_orientation(self, orientation): + """Set new orientation on grid""" + if orientation in [0, 1, 2, 3]: + Grid.orientation = orientation + else: + return False + + def calculate_orientation(self): + """Set orientation by previous move and orientation""" + if (Grid.previous_move == -1 or + (Grid.previous_move == 1 and Grid.orientation == 1) or + (Grid.previous_move == 2 and Grid.orientation == 3) or + (Grid.previous_move == 3 and Grid.orientation == 2) or + (Grid.previous_move == 0 and Grid.orientation == 0)): + self.set_orientation(1) + elif ((Grid.previous_move == 2 and Grid.orientation == 1) or + (Grid.previous_move == 0 and Grid.orientation == 3) or + (Grid.previous_move == 1 and Grid.orientation == 2) or + (Grid.previous_move == 3 and Grid.orientation == 0)): + self.set_orientation(2) + elif ((Grid.previous_move == 0 and Grid.orientation == 1) or + (Grid.previous_move == 3 and Grid.orientation == 3) or + (Grid.previous_move == 2 and Grid.orientation == 2) or + (Grid.previous_move == 1 and Grid.orientation == 0)): + self.set_orientation(0) + elif ((Grid.previous_move == 3 and Grid.orientation == 1) or + (Grid.previous_move == 1 and Grid.orientation == 3) or + (Grid.previous_move == 0 and Grid.orientation == 2) or + (Grid.previous_move == 2 and Grid.orientation == 0)): + self.set_orientation(3) + + def move_by_slot(self, slot): + """Move in direction by slot id""" + if slot == 0: + self.move_down() + elif slot == 1: + self.move_up() + elif slot == 2: + self.move_right() + elif slot == 3: + self.move_left() + + def move_right(self): + """Set position one to the right in correct orientation""" + if Grid.orientation == 1: + Grid.x_pos += 1 + elif Grid.orientation == 2: + Grid.y_pos += 1 + elif Grid.orientation == 0: + Grid.x_pos -= 1 + elif Grid.orientation == 3: + Grid.y_pos -= 1 + Grid.previous_move = 2 + + def move_left(self): + """Set position one to the left""" + if Grid.orientation == 1: + Grid.x_pos -= 1 + elif Grid.orientation == 2: + Grid.y_pos -= 1 + elif Grid.orientation == 0: + Grid.x_pos += 1 + elif Grid.orientation == 3: + Grid.y_pos += 1 + Grid.previous_move = 3 + + def move_up(self): + """Set position one upwards""" + if Grid.orientation == 1: + Grid.y_pos -= 1 + elif Grid.orientation == 2: + Grid.x_pos += 1 + elif Grid.orientation == 0: + Grid.y_pos += 1 + elif Grid.orientation == 3: + Grid.x_pos -= 1 + Grid.previous_move = 1 + + def move_down(self): + """Set position one downwards""" + if Grid.orientation == 1: + Grid.y_pos += 1 + elif Grid.orientation == 2: + Grid.x_pos -= 1 + elif Grid.orientation == 0: + Grid.y_pos -= 1 + elif Grid.orientation == 3: + Grid.x_pos += 1 + Grid.previous_move = 0 + + def move_back(self): + if len(Grid.movement_stack) > 1: + Grid.movement_stack.pop() + last_movement = Grid.movement_stack[-1] + Grid.x_pos = last_movement[0] + Grid.y_pos = last_movement[1] + Grid.orientation = last_movement[2] + + def add_to_visited(self): + """Add current position to visited coordinates list""" + self.calculate_orientation() + Grid.visited_coordinates.append([Grid.x_pos, Grid.y_pos]) + Grid.movement_stack.append([Grid.x_pos, Grid.y_pos, Grid.orientation]) + + def calculate_grid_dimensions(self): + min_x = 0 + max_x = 0 + min_y = 0 + max_y = 0 + for coorinate in Grid.visited_coordinates: + min_x = coorinate[0] if coorinate[0] < min_x else min_x + max_x = coorinate[0] if coorinate[0] > max_x else max_x + min_y = coorinate[1] if coorinate[1] < min_y else min_y + max_y = coorinate[1] if coorinate[1] > max_y else max_y + return [min_x, max_x, min_y, max_y] + + def reset_grid(self): + Grid.x_pos = 0 + Grid.y_pos = 0 + Grid.orientation = 1 + Grid.previous_move = -1 + Grid.movement_stack = [[0,0,1]] + Grid.visited_coordinates = [] \ No newline at end of file diff --git a/pyrevolve/revolve_bot/render/canvas.py b/pyrevolve/revolve_bot/render/canvas.py index 4594007591..f03f68c1f8 100644 --- a/pyrevolve/revolve_bot/render/canvas.py +++ b/pyrevolve/revolve_bot/render/canvas.py @@ -18,6 +18,12 @@ class Canvas: # Positions for the sensors sensors = [] + # Id of drawn element + current_module_id = 0 + + # Rotating orientation in regard to parent module + rotating_orientation = 0 + def __init__(self, width, height, scale): """Instantiate context and surface""" @@ -137,6 +143,15 @@ def move_back(self): Canvas.x_pos = last_movement[0] Canvas.y_pos = last_movement[1] Canvas.orientation = last_movement[2] + Canvas.rotating_orientation = last_movement[3] + + def sign_id(self): + """Sign module with the id on the upper left corner of block""" + self.context.set_font_size(0.3) + self.context.move_to(Canvas.x_pos, Canvas.y_pos + 0.4) + self.context.set_source_rgb(0, 0, 0) + self.context.show_text(str(Canvas.current_module_id)) + self.context.stroke() def draw_controller(self): """Draw a controller (yellow) in the middle of the canvas""" @@ -146,29 +161,39 @@ def draw_controller(self): self.context.set_source_rgb(0, 0, 0) self.context.set_line_width(0.01) self.context.stroke() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + self.sign_id() + Canvas.current_module_id += 1 + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) def draw_hinge(self): """Draw a hinge (blue) on the previous object""" + self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) - self.context.set_source_rgb(1, 0, 0) + if (Canvas.rotating_orientation % 180 == 0): + self.context.set_source_rgb(1.0, 0.4, 0.4) + else: + self.context.set_source_rgb(1, 0, 0) self.context.fill_preserve() self.context.set_source_rgb(0, 0, 0) self.context.set_line_width(0.01) self.context.stroke() self.calculate_orientation() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + self.sign_id() + Canvas.current_module_id += 1 + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) def draw_module(self): """Draw a module (red) on the previous object""" self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) - self.context.set_source_rgb(0, 0, 255) + self.context.set_source_rgb(0, 0, 1) self.context.fill_preserve() self.context.set_source_rgb(0, 0, 0) self.context.set_line_width(0.01) self.context.stroke() self.calculate_orientation() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + self.sign_id() + Canvas.current_module_id += 1 + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) def calculate_sensor_rectangle_position(self): """Calculate squeezed sensor rectangle position based on current orientation and last movement direction""" @@ -199,7 +224,7 @@ def save_sensor_position(self): x, y, x_scale, y_scale = self.calculate_sensor_rectangle_position() Canvas.sensors.append([x, y, x_scale, y_scale]) self.calculate_orientation() - Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation]) + Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) def draw_sensors(self): """Draw all sensors""" @@ -253,7 +278,7 @@ def draw_connector_to_parent(self): def save_png(self, file_name): """Store image representation of canvas""" - self.surface.write_to_png('img/%s.png' % file_name) + self.surface.write_to_png('%s' % file_name) def reset_canvas(self): """Reset canvas variables to default values""" @@ -262,4 +287,6 @@ def reset_canvas(self): Canvas.orientation = 1 Canvas.previous_move = -1 Canvas.movement_stack = [] - Canvas.sensors = [] \ No newline at end of file + Canvas.sensors = [] + Canvas.current_module_id = 0 + Canvas.rotating_orientation = 0 \ No newline at end of file diff --git a/pyrevolve/revolve_bot/render/render.py b/pyrevolve/revolve_bot/render/render.py index 07dfeddc57..e6f4f63580 100644 --- a/pyrevolve/revolve_bot/render/render.py +++ b/pyrevolve/revolve_bot/render/render.py @@ -1,5 +1,5 @@ import cairo -from canvas import Canvas +from .canvas import Canvas from .grid import Grid class Render: @@ -28,22 +28,29 @@ def get_id(self, body): """Return the id of the module""" return body['id'] + def get_orientation(self, body): + """Return the orientation of the module (hinge)""" + return body['orientation'] + def parse_body_to_draw(self, body, canvas): """Parse the body to the canvas to draw the png""" children_keys = self.get_keys(body) for key in children_keys: # Move in direction of specified slot canvas.move_by_slot(key) - type = self.get_type(body[key]) - if type == 'ActiveHinge': + mod_type = self.get_type(body[key]) + r_orientation = self.get_orientation(body[key]) + if mod_type == 'ActiveHinge': + Canvas.rotating_orientation += r_orientation canvas.draw_hinge() canvas.draw_connector_to_parent() - elif type == 'FixedBrick': + elif mod_type == 'FixedBrick': + Canvas.rotating_orientation += r_orientation canvas.draw_module() canvas.draw_connector_to_parent() - elif type == 'TouchSensor': + elif mod_type == 'TouchSensor': + Canvas.rotating_orientation += r_orientation canvas.save_sensor_position() - #canvas.draw_sensor() else: # Unknown element, move back to previous state and jump out of loop self.grid.move_back() From e85323588e0ff657e825bfd050692a933b165286 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 11 Mar 2019 13:36:24 +0100 Subject: [PATCH 15/49] Loading SDF work in progress - loading all links correct - missing joints - missing inertials and mass --- pyrevolve/SDF/__init__.py | 2 +- pyrevolve/SDF/geometry.py | 1 + pyrevolve/SDF/link.py | 71 +++++++++--- pyrevolve/revolve_bot/__init__.py | 2 +- pyrevolve/revolve_bot/revolve_bot.py | 137 +++++++++++++++--------- pyrevolve/revolve_bot/revolve_module.py | 100 ++++++++++++----- 6 files changed, 223 insertions(+), 90 deletions(-) diff --git a/pyrevolve/SDF/__init__.py b/pyrevolve/SDF/__init__.py index 6a15695d66..594ed04df9 100644 --- a/pyrevolve/SDF/__init__.py +++ b/pyrevolve/SDF/__init__.py @@ -1,5 +1,5 @@ from .pose import Pose, Posable -from .link import Link, BoxLink, Inertial +from .link import Link, Inertial from .geometry import Visual, Collision, MeshGeometry, BoxGeometry import xml.etree.ElementTree diff --git a/pyrevolve/SDF/geometry.py b/pyrevolve/SDF/geometry.py index 8fa925b0c0..d1aee9b086 100644 --- a/pyrevolve/SDF/geometry.py +++ b/pyrevolve/SDF/geometry.py @@ -35,6 +35,7 @@ def __init__(self, ambient=(0, 0, 0, 1), diffuse=(0, 0, 0, 1), specular=(0, 0, 0 class Visual(SDF.Posable): def __init__(self, name, position=None, rotation=None): + #TODO take color as param super().__init__('visual', { 'name': '{}_visual'.format(name) }, position, rotation) diff --git a/pyrevolve/SDF/link.py b/pyrevolve/SDF/link.py index 697c7adaf1..c1964d7ac5 100644 --- a/pyrevolve/SDF/link.py +++ b/pyrevolve/SDF/link.py @@ -1,5 +1,9 @@ import xml.etree.ElementTree +import numpy as np + from pyrevolve import SDF +from pyrevolve.sdfbuilder import math as SDFmath +from pyrevolve.sdfbuilder.physics.inertial import transform_inertia_tensor class Link(SDF.Posable): @@ -12,23 +16,13 @@ def __init__(self, name, self_collide=True, position=None, rotation=None): ) SDF.sub_element_text(self, 'self_collide', self_collide) - - -class BoxLink(Link): - def __init__(self, name, self_collide=True, position=None, rotation=None): - super().__init__( - 'link_component_{}__box'.format(name), - self_collide, - position, - rotation, - ) - self.size = (0, 0, 0, 0, 0, 0) + self.inertial = None + self.collisions = [] def append(self, subelement): if type(subelement) is SDF.Collision: - # box = subelement. - pass + self.collisions.append(subelement) super().append(subelement) @@ -36,7 +30,56 @@ def align_center_of_mass(self): raise NotImplementedError("TODO") def calculate_inertial(self): - raise NotImplementedError("TODO") + """ + Calculates and sets this Link's inertial properties by + iterating all collision elements inside of it and combining + their Geometry's inertias. + + Note that in order for an inertia tensor to make sense in Gazebo, + the center of mass needs to be aligned with the `Link` center of mass. + This method prints an error if this is currently not the case. + :return: + """ + if not np.allclose(self.get_center_of_mass().norm(), 0): + print("WARNING: calculating inertial for link with nonzero center of mass.", file=sys.stderr) + + i_final = np.zeros((3, 3)) + total_mass = 0.0 + for collision in self.collisions: + rotation = collision.get_rotation() + position = collision.get_position() + geometry = collision.geometry + mass = geometry.get_mass() + total_mass += mass + i_final += transform_inertia_tensor( + mass, + geometry.get_inertial().get_matrix(), + position, + rotation + ) + + self.inertial = Inertial.from_mass_matrix(total_mass, i_final) + + def get_center_of_mass(self): + """ + Calculate the center of mass of all the collisions inside + this link. + :return: The center of mass as determined by all the collision geometries + :rtype: Vector3 + """ + com = SDFmath.Vector3(0, 0, 0) + total_mass = 0.0 + for collision in self.collisions: + geometry = collision.geometry + col_com = collision.to_parent_frame(geometry.get_center_of_mass()) + mass = geometry.get_mass() + com += mass * col_com + total_mass += mass + + if total_mass > 0: + com /= total_mass + + return com class Inertial(xml.etree.ElementTree.Element): diff --git a/pyrevolve/revolve_bot/__init__.py b/pyrevolve/revolve_bot/__init__.py index 12bbb64ec8..feaa16e140 100644 --- a/pyrevolve/revolve_bot/__init__.py +++ b/pyrevolve/revolve_bot/__init__.py @@ -3,7 +3,7 @@ from collections import OrderedDict from .revolve_bot import RevolveBot -from .revolve_module import RevolveModule +from .revolve_module import RevolveModule, BoxSlot def represent_ordereddict(dumper, data): diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 3f5d5af28c..a597bf9f92 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -15,6 +15,7 @@ from .revolve_module import BrickModule from .revolve_module import BrickSensorModule from .revolve_module import Orientation +from .revolve_module import BoxSlot from .brain_nn import BrainNN import xml.etree.ElementTree @@ -140,8 +141,78 @@ def _sdf_attach_module(module_slot, module_orientation: float, parent_collision, relative_to_child=True ) - collision.set_position(visual.get_position()) collision.set_rotation(visual.get_rotation()) + old_translation = collision.get_position() + collision.set_position(visual.get_position()) + collision.translate(collision.to_parent_direction(old_translation)) + + def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_collision, slot_chain=''): + from pyrevolve import SDF + slot_chain = '{}{}'.format(slot_chain, parent_slot.orientation.short_repr()) + links = [] + + my_link = parent_link + my_collision = None + + if type(module) is ActiveHingeModule: + print("adding joint") + child_link = SDF.Link('{}_Leg'.format(slot_chain)) + links.append(child_link) + + visual_frame, collision_frame, \ + visual_servo, collision_servo, joint = module.to_sdf('{}_'.format(slot_chain)) + + # parent_slot = Orientation(parent_slot) + if parent_slot != Orientation.WEST: + pass + + # parent_slot = parent_module.boxslot(parent_slot) + module_slot = module.boxslot_frame(Orientation.SOUTH) + self._sdf_attach_module(module_slot, module.orientation, + visual_frame, collision_frame, + parent_slot, parent_collision) + + parent_slot = module.boxslot_frame(Orientation.NORTH) + module_slot = module.boxslot_servo(Orientation.SOUTH) + self._sdf_attach_module(module_slot, None, + visual_servo, collision_servo, + parent_slot, collision_frame) + + parent_link.append(visual_frame) + parent_link.append(collision_frame) + + child_link.append(visual_servo) + child_link.append(collision_servo) + + my_link = child_link + my_collision = collision_servo + + else: + print("adding block") + visual, collision = module.to_sdf('') + + module_slot = module.boxslot(Orientation.SOUTH) + self._sdf_attach_module(module_slot, module.orientation, + visual, collision, + parent_slot, parent_collision) + + parent_link.append(visual) + parent_link.append(collision) + + + + = collision + + # recursions on children + for my_slot, child_module in module.iter_children(): + if child_module is None: + continue + + my_slot = module.boxslot(Orientation(my_slot)) + children_links = self._module_to_sdf(child_module, my_link, my_slot, my_collision, slot_chain) + links.extend(children_links) + + return links def _to_sdf_PYTHON_XML(self, nice_format): from xml.etree import ElementTree @@ -158,60 +229,28 @@ def _to_sdf_PYTHON_XML(self, nice_format): pose = SDF.Pose(SDFmath.Vector3(0, 0, 0.05)) model.append(pose) - link = SDF.BoxLink('Core') - model.append(link) - - visual, collision, inertial = self._body.to_sdf('') - link.append(visual) - link.append(collision) - link.append(inertial) + core_link = SDF.Link('Core') + links = [core_link] + core_visual, core_collision = self._body.to_sdf('') + core_link.append(core_visual) + core_link.append(core_collision) + # core_link.append(inertial) parent_module = self._body - parent_collision = collision + parent_collision = core_collision - for slot, module in self._body.iter_children(): - if module is None: + for core_slot, child_module in self._body.iter_children(): + if child_module is None: continue + core_slot = parent_module.boxslot(Orientation(core_slot)) + children_links = self._module_to_sdf(child_module, core_link, core_slot, core_collision) + links.extend(children_links) - if type(module) is ActiveHingeModule: - print("adding joint") - child_link = SDF.BoxLink('{}Leg'.format(slot)) - # model.append(child_link) - - visual_frame, collision_frame,\ - visual_servo, collision_servo = module.to_sdf('{}'.format(slot)) - - slot = Orientation(slot) - if slot != Orientation.WEST: - pass - - module_slot = module.boxslot_frame(Orientation.SOUTH) - parent_slot = parent_module.boxslot(slot) - self._sdf_attach_module(module_slot, module.orientation, - visual_frame, collision_frame, - parent_slot, parent_collision) - - module_slot = module.boxslot_servo(Orientation.SOUTH) - parent_slot = module.boxslot_frame(Orientation.NORTH) - self._sdf_attach_module(module_slot, None, - visual_servo, collision_servo, - parent_slot, collision_frame) - - link.append(visual_frame) - link.append(collision_frame) - - link.append(visual_servo) - link.append(collision_servo) - # child_link.append(visual_servo) - # child_link.append(collision_servo) - - else: - print("adding block") - visual, collision, inertial = module.to_sdf() - - link.append(visual) - link.append(collision) + for core_link in links: + # TODO core_link.calculate_inertial() + model.append(core_link) + # XML RENDER PHASE # def prettify(rough_string, indent='\t'): """Return a pretty-printed XML string for the Element. """ diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index fef5472925..6ba894754c 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -19,6 +19,16 @@ class Orientation(Enum): EAST = 2 WEST = 3 + def short_repr(self): + if self == self.SOUTH: + return 'S' + elif self == self.NORTH: + return 'N' + elif self == self.EAST: + return 'E' + elif self == self.WEST: + return 'W' + class RevolveModule: """ @@ -149,22 +159,14 @@ def _brick_to_sdf(self, tree_depth=''): geometry = SDF.BoxGeometry(self.COLLISION_BOX) collision.append(geometry) - inertial = SDF.Inertial(self.MASS, - self.INERTIA[0], - self.INERTIA[1], - self.INERTIA[2], - self.INERTIA[3], - self.INERTIA[4], - self.INERTIA[5]) - - return visual, collision, inertial + return visual, collision def boxslot(self, orientation=None): orientation = Orientation.SOUTH if orientation is None else orientation - return BoxSlot(self.boundaries(), orientation) + return BoxSlot(self.possible_slots(), orientation) - def boundaries(self, box_geometry=None): - box_geometry = self.COLLISION_BOX if box_geometry is None else box_geometry + def possible_slots(self): + box_geometry = self.COLLISION_BOX return ( (box_geometry[0] / -2.0, box_geometry[0] / 2.0), # X (box_geometry[1] / -2.0, box_geometry[1] / 2.0), # Y @@ -178,7 +180,8 @@ class CoreModule(RevolveModule): """ TYPE = "CoreComponent" VISUAL_MESH = 'model://rg_robot/meshes/CoreComponent.dae' - COLLISION_BOX = (0.09, 0.09, 0.045) + SLOT_COORDINATES = 0.089 / 2.0 + COLLISION_BOX = (0.089, 0.089, 0.045) MASS = 1.064000e-01 # TODO fix INERTIA = ( # TODO fix 1.143069e-04, @@ -220,6 +223,13 @@ def to_sdf_old(self): return link + def possible_slots(self): + return ( + (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # X + (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # Y + (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # Z + ) + class ActiveHingeModule(RevolveModule): """ @@ -228,8 +238,13 @@ class ActiveHingeModule(RevolveModule): TYPE = 'ActiveHinge' VISUAL_MESH_FRAME = 'model://rg_robot/meshes/ActiveHinge_Frame.dae' VISUAL_MESH_SERVO = 'model://rg_robot/meshes/ActiveCardanHinge_Servo_Holder.dae' - COLLISION_BOX_FRAME = (2.000000e-02, 3.400000e-02, 1.000000e-02) - COLLISION_BOX_SERVO = (2.450000e-02, 3.400000e-02, 1.000000e-02) + COLLISION_BOX_FRAME = (2.20e-02, 3.575e-02, 1.0e-02) + COLLISION_BOX_SERVO = (2.45e-02, 2.575e-02, 1.5e-02) + # COLLISION_BOX_SERVO = (2.925000e-02, 3.400000e-02, 1.000000e-02) + COLLISION_BOX_SERVO_OFFSET = ( + SDFmath.Vector3(0, 0, 0), + SDFmath.Vector3(-0.0091, 0, 0), + ) def __init__(self): super().__init__() @@ -249,45 +264,71 @@ def to_sdf(self, tree_depth): name_frame = 'component_{}{}__frame'.format(tree_depth, self.TYPE) name_servo = 'component_{}{}__servo'.format(tree_depth, self.TYPE) - offset = SDFmath.Vector3(self.COLLISION_BOX_FRAME[0] / 2) + # offset = SDFmath.Vector3(self.COLLISION_BOX_FRAME[0] / 2) visual_frame = SDF.Visual(name_frame) - visual_frame.translate(offset) geometry = SDF.MeshGeometry(self.VISUAL_MESH_FRAME) visual_frame.append(geometry) collision_frame = SDF.Collision(name_frame) - collision_frame.translate(offset) geometry = SDF.BoxGeometry(self.COLLISION_BOX_FRAME) collision_frame.append(geometry) visual_servo = SDF.Visual(name_servo) - visual_servo.translate(offset) geometry = SDF.MeshGeometry(self.VISUAL_MESH_SERVO) visual_servo.append(geometry) collision_servo = SDF.Collision(name_servo) - collision_servo.translate(offset) + collision_servo.translate(SDFmath.Vector3(0.002375, 0, 0)) geometry = SDF.BoxGeometry(self.COLLISION_BOX_SERVO) collision_servo.append(geometry) + # TODO + joint = None + return visual_frame, collision_frame, \ - visual_servo, collision_servo + visual_servo, collision_servo, \ + joint + + def possible_slots_frame(self): + box_geometry = self.COLLISION_BOX_FRAME + return ( + (box_geometry[0] / -2.0, box_geometry[0] / 2.0 - 0.001), # X + (0, 0), # Y + (0, 0), # Z + ) + + def possible_slots_servo(self): + box_geometry = self.COLLISION_BOX_SERVO + return ( + (box_geometry[0] / -2.0, box_geometry[0] / 2.0), # X + (0, 0), # Y + (0, 0), # Z + ) def boxslot_frame(self, orientation=None): orientation = Orientation.SOUTH if orientation is None else orientation - boundaries = self.boundaries(self.COLLISION_BOX_FRAME) + boundaries = self.possible_slots_frame() return BoxSlotJoints( boundaries, orientation, - (SDFmath.Vector3(0, 0, 0), SDFmath.Vector3(-0.0091, 0, 0)) + self.COLLISION_BOX_SERVO_OFFSET ) def boxslot_servo(self, orientation=None): orientation = Orientation.SOUTH if orientation is None else orientation - boundaries = self.boundaries(self.COLLISION_BOX_SERVO) + boundaries = self.possible_slots_servo() return BoxSlotJoints(boundaries, orientation) + def boxslot(self, orientation=None): + orientation = Orientation.SOUTH if orientation is None else orientation + if orientation is Orientation.SOUTH: + return self.boxslot_frame(orientation) + elif orientation is Orientation.NORTH: + return self.boxslot_servo(orientation) + else: + raise RuntimeError("Invalid orientation") + class BrickModule(RevolveModule): """ @@ -295,7 +336,8 @@ class BrickModule(RevolveModule): """ TYPE = "FixedBrick" VISUAL_MESH = 'model://rg_robot/meshes/FixedBrick.dae' - COLLISION_BOX = (-1.0, 1.0, 3.550000e-02) + SLOT_COORDINATES = 3.8e-2 / 2.0 + COLLISION_BOX = (4.1e-2, 4.1e-2, 3.55e-02) MASS = 0.1 # TODO fix INERTIA = ( # TODO fix 1.143069e-04, @@ -309,6 +351,13 @@ class BrickModule(RevolveModule): def __init__(self): super().__init__() + def possible_slots(self): + return ( + (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # X + (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # Y + (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # Z + ) + class BrickSensorModule(RevolveModule): """ @@ -332,6 +381,7 @@ def __init__(self): class BoxSlot: def __init__(self, boundaries, orientation: Orientation): + self.orientation = orientation self.pos = self._calculate_box_slot_pos(boundaries, orientation) self.normal = self.pos.normalized() self.tangent = self._calculate_box_slot_tangent(orientation) From d0a4d5ba1b9aa05890b540a49551d4764739c0cd Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 11 Mar 2019 13:47:37 +0100 Subject: [PATCH 16/49] ops --- pyrevolve/revolve_bot/revolve_bot.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index a597bf9f92..d0166ee38a 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -199,9 +199,7 @@ def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_colli parent_link.append(visual) parent_link.append(collision) - - - = collision + my_collision = collision # recursions on children for my_slot, child_module in module.iter_children(): From 69c76feb04e4fa5d94648392c1c97d8ab95f616e Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Mon, 11 Mar 2019 17:16:55 +0100 Subject: [PATCH 17/49] reformatted code - using children enum --- pyrevolve/revolve_bot/render/canvas.py | 25 ++--- pyrevolve/revolve_bot/render/render.py | 137 +++++++++--------------- pyrevolve/revolve_bot/revolve_bot.py | 3 +- pyrevolve/revolve_bot/revolve_module.py | 19 ++++ 4 files changed, 79 insertions(+), 105 deletions(-) diff --git a/pyrevolve/revolve_bot/render/canvas.py b/pyrevolve/revolve_bot/render/canvas.py index f03f68c1f8..00bb1a3c0a 100644 --- a/pyrevolve/revolve_bot/render/canvas.py +++ b/pyrevolve/revolve_bot/render/canvas.py @@ -18,9 +18,6 @@ class Canvas: # Positions for the sensors sensors = [] - # Id of drawn element - current_module_id = 0 - # Rotating orientation in regard to parent module rotating_orientation = 0 @@ -145,12 +142,16 @@ def move_back(self): Canvas.orientation = last_movement[2] Canvas.rotating_orientation = last_movement[3] - def sign_id(self): + def sign_id(self, mod_id): """Sign module with the id on the upper left corner of block""" self.context.set_font_size(0.3) self.context.move_to(Canvas.x_pos, Canvas.y_pos + 0.4) self.context.set_source_rgb(0, 0, 0) - self.context.show_text(str(Canvas.current_module_id)) + if type(mod_id) is int: + self.context.show_text(str(mod_id)) + else: + mod_id = ''.join(x for x in mod_id if x.isdigit()) + self.context.show_text(mod_id) self.context.stroke() def draw_controller(self): @@ -161,11 +162,10 @@ def draw_controller(self): self.context.set_source_rgb(0, 0, 0) self.context.set_line_width(0.01) self.context.stroke() - self.sign_id() - Canvas.current_module_id += 1 + self.sign_id(0) Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) - def draw_hinge(self): + def draw_hinge(self, mod_id): """Draw a hinge (blue) on the previous object""" self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) @@ -178,11 +178,10 @@ def draw_hinge(self): self.context.set_line_width(0.01) self.context.stroke() self.calculate_orientation() - self.sign_id() - Canvas.current_module_id += 1 + self.sign_id(mod_id) Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) - def draw_module(self): + def draw_module(self, mod_id): """Draw a module (red) on the previous object""" self.context.rectangle(Canvas.x_pos, Canvas.y_pos, 1, 1) self.context.set_source_rgb(0, 0, 1) @@ -191,8 +190,7 @@ def draw_module(self): self.context.set_line_width(0.01) self.context.stroke() self.calculate_orientation() - self.sign_id() - Canvas.current_module_id += 1 + self.sign_id(mod_id) Canvas.movement_stack.append([Canvas.x_pos, Canvas.y_pos, Canvas.orientation, Canvas.rotating_orientation]) def calculate_sensor_rectangle_position(self): @@ -288,5 +286,4 @@ def reset_canvas(self): Canvas.previous_move = -1 Canvas.movement_stack = [] Canvas.sensors = [] - Canvas.current_module_id = 0 Canvas.rotating_orientation = 0 \ No newline at end of file diff --git a/pyrevolve/revolve_bot/render/render.py b/pyrevolve/revolve_bot/render/render.py index e6f4f63580..d96c3528e3 100644 --- a/pyrevolve/revolve_bot/render/render.py +++ b/pyrevolve/revolve_bot/render/render.py @@ -9,109 +9,68 @@ def __init__(self): self.grid = Grid() - def get_keys(self, body): - """Returns the postition of the slots of the children""" - return list(body.keys()) - - def get_children(self, body): - """Return children of body, False if no children present""" - if 'children' in body: - return body['children'] - else: - return False - - def get_type(self, body): - """Return the type of the module""" - return body['type'] - - def get_id(self, body): - """Return the id of the module""" - return body['id'] - - def get_orientation(self, body): - """Return the orientation of the module (hinge)""" - return body['orientation'] - - def parse_body_to_draw(self, body, canvas): + def parse_body_to_draw(self, canvas, module, slot): """Parse the body to the canvas to draw the png""" - children_keys = self.get_keys(body) - for key in children_keys: - # Move in direction of specified slot - canvas.move_by_slot(key) - mod_type = self.get_type(body[key]) - r_orientation = self.get_orientation(body[key]) - if mod_type == 'ActiveHinge': - Canvas.rotating_orientation += r_orientation - canvas.draw_hinge() - canvas.draw_connector_to_parent() - elif mod_type == 'FixedBrick': - Canvas.rotating_orientation += r_orientation - canvas.draw_module() - canvas.draw_connector_to_parent() - elif mod_type == 'TouchSensor': - Canvas.rotating_orientation += r_orientation - canvas.save_sensor_position() - else: - # Unknown element, move back to previous state and jump out of loop - self.grid.move_back() - continue - - children = self.get_children(body[key]) - if not children: - # Element has no children, move back to previous state and jump out of the loop - canvas.move_back() - continue - - keys = self.get_keys(children) - if keys: - # Traverse children of element to draw on canvas - self.parse_body_to_draw(children, canvas) - # Parent has no more children, move back to previous state - canvas.move_back() + if module.type == 'CoreComponent' or module.type == 'Core': + canvas.draw_controller() + elif module.type == 'ActiveHinge': + canvas.move_by_slot(slot) + Canvas.rotating_orientation += module.orientation + canvas.draw_hinge(module.id) + canvas.draw_connector_to_parent() + elif module.type == 'FixedBrick': + canvas.move_by_slot(slot) + Canvas.rotating_orientation += module.orientation + canvas.draw_module(module.id) + canvas.draw_connector_to_parent() + elif module.type == 'TouchSensor': + canvas.move_by_slot(slot) + Canvas.rotating_orientation += module.orientation + canvas.save_sensor_position() + + if module.has_children(): + # Traverse children of element to draw on canvas + for core_slot, child_module in module.iter_children(): + if child_module is None: + continue + self.parse_body_to_draw(canvas, child_module, core_slot) + canvas.move_back() + else: + # Element has no children, move back to previous state + canvas.move_back() - def traverse_path_of_robot(self, body): - """Traverse path of robot to obtain visited coordinates""" - children_keys = self.get_keys(body) - for key in children_keys: - # Move in direction of specified slot - self.grid.move_by_slot(key) - type = self.get_type(body[key]) - if type == 'ActiveHinge' or type == 'FixedBrick' or type == 'TouchSensor': - self.grid.add_to_visited() - else: - # Unknown element, move back to previous state and jump out of the loop - self.grid.move_back() - continue - - children = self.get_children(body[key]) - if not children: - # Element has no children, move back to previous state and jump out of the loop - self.grid.move_back() - continue - - keys = self.get_keys(children) - if keys: - # Traverse path of children of element - self.traverse_path_of_robot(children) - # Parent has no more children, move back to previous state - self.grid.move_back() + def traverse_path_of_robot(self, module, slot): + """Traverse path of robot to obtain visited coordinates""" + if module.type == 'ActiveHinge' or module.type == 'FixedBrick' or module.type == 'TouchSensor': + self.grid.move_by_slot(slot) + self.grid.add_to_visited() + + if module.has_children(): + # Traverse path of children of module + for core_slot, child_module in module.iter_children(): + if child_module is None: + continue + self.traverse_path_of_robot(child_module, core_slot) + self.grid.move_back() + else: + # Element has no children, move back to previous state + self.grid.move_back() - def render_robot(self, children, image_path): + def render_robot(self, body, image_path): try: # Calculate dimensions of drawing and core position - self.traverse_path_of_robot(children) + self.traverse_path_of_robot(body, 0) robot_dim = self.grid.calculate_grid_dimensions() width = abs(robot_dim[0] - robot_dim[1]) + 1 height = abs(robot_dim[2] - robot_dim[3]) + 1 core_position = [width - robot_dim[1] - 1, height - robot_dim[3] - 1] - + # Draw canvas cv = Canvas(width, height, 100) cv.set_position(core_position[0], core_position[1]) - cv.draw_controller() # Draw body of robot - self.parse_body_to_draw(children, cv) + self.parse_body_to_draw(cv, body, 0) # Draw sensors after, so that they don't get overdrawn cv.draw_sensors() diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index cabef2f1a4..4049066828 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -392,7 +392,6 @@ def render2d(self, img_path): else: try: render = Render() - children = self._body._generate_yaml_children() - render.render_robot(children, img_path) + render.render_robot(self._body, img_path) except: print('Failed rendering 2d robot') \ No newline at end of file diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 6ba894754c..3d5b33e78c 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -43,6 +43,7 @@ class RevolveModule: def __init__(self): self.id = None + self.type = None self.orientation = None self.rgb = None # RevolveModule.DEFAULT_COLOR self.substrate_coordinates = None @@ -77,6 +78,8 @@ def FromYaml(yaml_object): module.id = yaml_object['id'] + module.type = yaml_object['type'] + try: module.orientation = yaml_object['orientation'] except KeyError: @@ -173,6 +176,22 @@ def possible_slots(self): (box_geometry[2] / -2.0, box_geometry[2] / 2.0), # Z ) + def has_children(self): + """ + Check wheter module has children + :return: True if module has children + """ + has_children = False + + if self.children == {1: None}: return False + + + for i, child in enumerate(self.children): + if child is not None: + has_children = True + + return has_children + class CoreModule(RevolveModule): """ From 7d6ca3ae5cca8a88e125ba2d9d90579bbf52f3a2 Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Mon, 11 Mar 2019 17:56:25 +0100 Subject: [PATCH 18/49] change type checking to class type --- pyrevolve/revolve_bot/render/render.py | 12 ++++++------ pyrevolve/revolve_bot/revolve_module.py | 3 --- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pyrevolve/revolve_bot/render/render.py b/pyrevolve/revolve_bot/render/render.py index d96c3528e3..3c8a63f3e2 100644 --- a/pyrevolve/revolve_bot/render/render.py +++ b/pyrevolve/revolve_bot/render/render.py @@ -1,6 +1,7 @@ import cairo from .canvas import Canvas from .grid import Grid +from ..revolve_module import RevolveModule, CoreModule, BrickModule, ActiveHingeModule, TouchSensorModule, BrickSensorModule class Render: @@ -11,19 +12,19 @@ def __init__(self): def parse_body_to_draw(self, canvas, module, slot): """Parse the body to the canvas to draw the png""" - if module.type == 'CoreComponent' or module.type == 'Core': + if isinstance(module, CoreModule): canvas.draw_controller() - elif module.type == 'ActiveHinge': + elif isinstance(module, ActiveHingeModule): canvas.move_by_slot(slot) Canvas.rotating_orientation += module.orientation canvas.draw_hinge(module.id) canvas.draw_connector_to_parent() - elif module.type == 'FixedBrick': + elif isinstance(module, BrickModule): canvas.move_by_slot(slot) Canvas.rotating_orientation += module.orientation canvas.draw_module(module.id) canvas.draw_connector_to_parent() - elif module.type == 'TouchSensor': + elif isinstance(module, TouchSensorModule) or isinstance(module, BrickSensorModule): canvas.move_by_slot(slot) Canvas.rotating_orientation += module.orientation canvas.save_sensor_position() @@ -41,7 +42,7 @@ def parse_body_to_draw(self, canvas, module, slot): def traverse_path_of_robot(self, module, slot): """Traverse path of robot to obtain visited coordinates""" - if module.type == 'ActiveHinge' or module.type == 'FixedBrick' or module.type == 'TouchSensor': + if isinstance(module, ActiveHingeModule) or isinstance(module, BrickModule) or isinstance(module, TouchSensorModule) or isinstance(module, BrickSensorModule): self.grid.move_by_slot(slot) self.grid.add_to_visited() @@ -64,7 +65,6 @@ def render_robot(self, body, image_path): width = abs(robot_dim[0] - robot_dim[1]) + 1 height = abs(robot_dim[2] - robot_dim[3]) + 1 core_position = [width - robot_dim[1] - 1, height - robot_dim[3] - 1] - # Draw canvas cv = Canvas(width, height, 100) cv.set_position(core_position[0], core_position[1]) diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 3d5b33e78c..612fa3740c 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -43,7 +43,6 @@ class RevolveModule: def __init__(self): self.id = None - self.type = None self.orientation = None self.rgb = None # RevolveModule.DEFAULT_COLOR self.substrate_coordinates = None @@ -78,8 +77,6 @@ def FromYaml(yaml_object): module.id = yaml_object['id'] - module.type = yaml_object['type'] - try: module.orientation = yaml_object['orientation'] except KeyError: From 589ef2d9f19ae3d4a0ff178ed24069e620861152 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 11 Mar 2019 18:21:35 +0100 Subject: [PATCH 19/49] SDF generation, inertial and mass - implemented inertial for SDF links - implemented mass for SDF links --- pyrevolve/SDF/__init__.py | 3 +- pyrevolve/SDF/geometry.py | 36 +++++++--- pyrevolve/SDF/inertial.py | 95 +++++++++++++++++++++++++ pyrevolve/SDF/link.py | 52 +++++++------- pyrevolve/SDF/pose.py | 4 +- pyrevolve/revolve_bot/revolve_bot.py | 7 +- pyrevolve/revolve_bot/revolve_module.py | 45 ++++++------ 7 files changed, 178 insertions(+), 64 deletions(-) create mode 100644 pyrevolve/SDF/inertial.py diff --git a/pyrevolve/SDF/__init__.py b/pyrevolve/SDF/__init__.py index 594ed04df9..2160b13469 100644 --- a/pyrevolve/SDF/__init__.py +++ b/pyrevolve/SDF/__init__.py @@ -1,5 +1,6 @@ from .pose import Pose, Posable -from .link import Link, Inertial +from .link import Link +from .inertial import Inertial from .geometry import Visual, Collision, MeshGeometry, BoxGeometry import xml.etree.ElementTree diff --git a/pyrevolve/SDF/geometry.py b/pyrevolve/SDF/geometry.py index d1aee9b086..6305022af3 100644 --- a/pyrevolve/SDF/geometry.py +++ b/pyrevolve/SDF/geometry.py @@ -23,7 +23,10 @@ def box(self): class Material(xml.etree.ElementTree.Element): - def __init__(self, ambient=(0, 0, 0, 1), diffuse=(0, 0, 0, 1), specular=(0, 0, 0, 1)): + def __init__(self, + ambient=(0, 0, 0, 1), + diffuse=(0, 0, 0, 1), + specular=(0, 0, 0, 1)): super().__init__('material') SDF.sub_element_text(self, 'ambient', '{} {} {} {}'.format(ambient[0], ambient[1], ambient[2], ambient[3])) @@ -69,14 +72,15 @@ def __init__(self): class Collision(SDF.Posable): - def __init__(self, name, position=None, rotation=None): + def __init__(self, name, mass, position=None, rotation=None): super().__init__( - 'collision', - {'name': '{}_collision'.format(name)}, - position, - rotation + tag='collision', + attrib={'name': '{}_collision'.format(name)}, + position=position, + rotation=rotation ) + self.mass = mass self._box_geometry = None surface_properties = SurfaceProperties() @@ -94,7 +98,21 @@ def boundaries(self): if self._box_geometry is None: raise RuntimeError("This Collision element has no BoxGeometry set") return ( - (self._box_geometry[0] / -2, self._box_geometry[0] / 2), # X - (self._box_geometry[1] / -2, self._box_geometry[1] / 2), # Y - (self._box_geometry[2] / -2, self._box_geometry[2] / 2), # Z + (self._box_geometry[0] / -2.0, self._box_geometry[0] / 2.0), # X + (self._box_geometry[1] / -2.0, self._box_geometry[1] / 2.0), # Y + (self._box_geometry[2] / -2.0, self._box_geometry[2] / 2.0), # Z ) + + def get_inertial(self): + """ + Return solid box inertial + """ + r = self.mass / 12.0 + x, y, z = self._box_geometry + ixx = r * (y ** 2 + z ** 2) + iyy = r * (x ** 2 + z ** 2) + izz = r * (x ** 2 + y ** 2) + return SDF.Inertial(mass=self.mass, inertia_xx=ixx, inertia_yy=iyy, inertia_zz=izz) + + def get_center_of_mass(self): + return self.get_position() diff --git a/pyrevolve/SDF/inertial.py b/pyrevolve/SDF/inertial.py new file mode 100644 index 0000000000..39249ef15b --- /dev/null +++ b/pyrevolve/SDF/inertial.py @@ -0,0 +1,95 @@ +import xml.etree +import numpy as np + +from pyrevolve import SDF + + +class Inertial(SDF.Posable): + def __init__(self, mass, position=None, rotation=None, + inertia_xx=1.0, inertia_xy=0.0, inertia_xz=0.0, + inertia_yy=1.0, inertia_yz=0.0, + inertia_zz=1.0): + super().__init__('inertial', position=position, rotation=rotation) + self.ixx, self.ixy, self.ixz = (inertia_xx, inertia_xy, inertia_xz) + self.iyy, self.iyz = (inertia_yy, inertia_yz) + self.izz = inertia_zz + self.mass = mass + + SDF.sub_element_text(self, 'mass', mass) + + inertia = xml.etree.ElementTree.SubElement(self, 'inertia') + SDF.sub_element_text(inertia, 'ixx', inertia_xx) + SDF.sub_element_text(inertia, 'ixy', inertia_xy) + SDF.sub_element_text(inertia, 'ixz', inertia_xz) + SDF.sub_element_text(inertia, 'iyy', inertia_yy) + SDF.sub_element_text(inertia, 'iyz', inertia_yz) + SDF.sub_element_text(inertia, 'izz', inertia_zz) + + @staticmethod + def from_mass_matrix(mass, m): + """ + :param mass: + :param m: + :return: + """ + return Inertial(mass, position=None, rotation=None, + inertia_xx=m[0, 0], inertia_xy=m[0, 1], inertia_xz=m[0, 2], + inertia_yy=m[1, 1], inertia_yz=m[1, 2], + inertia_zz=m[2, 2]) + + def transformed(self, displacement, rotation): + """ + Returns a new inertial from this one, which is + transformed to a new reference frame given by a + displacement and rotation vector. + :param displacement: + :param rotation: + :return: + """ + transformed = transform_inertia_tensor(self.mass, self.get_matrix(), + displacement, rotation) + return self.from_mass_matrix(self.mass, transformed) + + def get_matrix(self): + """ + :return: + """ + return np.array([ + [self.ixx, self.ixy, self.ixz], + [self.ixy, self.iyy, self.iyz], + [self.ixz, self.iyz, self.izz] + ]) + + +def transform_inertia_tensor(mass, tensor, displacement, rotation): + """ + Transforms an inertia tensor to a new reference frame using + the parallel axis theorem. + + https://en.wikipedia.org/wiki/Parallel_axis_theorem + :param mass: + :type mass: float + :param tensor: The inertia tensor as a numpy array + :type tensor: ndarray + :param displacement: The displacement vector `d`, where `d` is + the new center of mass minus the current + center of mass (i.e. traveling `d` from the + current center of mass gives the new center + of mass). + :type displacement: Vector3 + :param rotation: The rotation that takes a point in the current tensor + reference frame to one in the new reference frame. + :type rotation: Quaternion + :return: + """ + # Short hand + i1 = tensor + t1 = displacement + + # Get a matrix for the rotation and calculate the + # rotated inertia tensor. + r1 = rotation.get_matrix()[:3, :3] + it = r1.dot(i1).dot(r1.T) + + # J matrix as on Wikipedia + return it + mass * (t1.dot(t1) * np.eye(3) - np.outer(t1.data, t1.data)) diff --git a/pyrevolve/SDF/link.py b/pyrevolve/SDF/link.py index c1964d7ac5..814428d039 100644 --- a/pyrevolve/SDF/link.py +++ b/pyrevolve/SDF/link.py @@ -1,18 +1,18 @@ -import xml.etree.ElementTree import numpy as np +import sys from pyrevolve import SDF +from pyrevolve.SDF.inertial import transform_inertia_tensor from pyrevolve.sdfbuilder import math as SDFmath -from pyrevolve.sdfbuilder.physics.inertial import transform_inertia_tensor class Link(SDF.Posable): def __init__(self, name, self_collide=True, position=None, rotation=None): super().__init__( - 'link', - {'name': name}, - position, - rotation, + tag='link', + attrib={'name': name}, + position=position, + rotation=rotation, ) SDF.sub_element_text(self, 'self_collide', self_collide) @@ -20,6 +20,11 @@ def __init__(self, name, self_collide=True, position=None, rotation=None): self.inertial = None self.collisions = [] + def iter_elements(self, condition): + for elem in self.iter(): + if condition(elem): + yield elem + def append(self, subelement): if type(subelement) is SDF.Collision: self.collisions.append(subelement) @@ -27,7 +32,11 @@ def append(self, subelement): super().append(subelement) def align_center_of_mass(self): - raise NotImplementedError("TODO") + translation = self.get_center_of_mass() + self.set_position(translation*2.0) + for el in self.iter_elements(lambda elem: isinstance(elem, SDF.Posable)): + el.translate(-translation) + return translation def calculate_inertial(self): """ @@ -40,6 +49,9 @@ def calculate_inertial(self): This method prints an error if this is currently not the case. :return: """ + if self.inertial is not None: + raise RuntimeError("Inertial for this link already existing") + if not np.allclose(self.get_center_of_mass().norm(), 0): print("WARNING: calculating inertial for link with nonzero center of mass.", file=sys.stderr) @@ -48,17 +60,17 @@ def calculate_inertial(self): for collision in self.collisions: rotation = collision.get_rotation() position = collision.get_position() - geometry = collision.geometry - mass = geometry.get_mass() + mass = collision.mass total_mass += mass i_final += transform_inertia_tensor( mass, - geometry.get_inertial().get_matrix(), + collision.get_inertial().get_matrix(), position, rotation ) - self.inertial = Inertial.from_mass_matrix(total_mass, i_final) + self.inertial = SDF.Inertial.from_mass_matrix(total_mass, i_final) + self.append(self.inertial) def get_center_of_mass(self): """ @@ -70,9 +82,8 @@ def get_center_of_mass(self): com = SDFmath.Vector3(0, 0, 0) total_mass = 0.0 for collision in self.collisions: - geometry = collision.geometry - col_com = collision.to_parent_frame(geometry.get_center_of_mass()) - mass = geometry.get_mass() + col_com = collision.get_center_of_mass() + mass = collision.mass com += mass * col_com total_mass += mass @@ -82,16 +93,3 @@ def get_center_of_mass(self): return com -class Inertial(xml.etree.ElementTree.Element): - def __init__(self, mass, inertia_xx, inertia_xy, inertia_xz, inertia_yy, inertia_yz, inertia_zz): - super().__init__('inertial') - - SDF.sub_element_text(self, 'mass', mass) - - inertia = xml.etree.ElementTree.SubElement(self, 'inertia') - SDF.sub_element_text(inertia, 'ixx', inertia_xx) - SDF.sub_element_text(inertia, 'ixy', inertia_xy) - SDF.sub_element_text(inertia, 'ixz', inertia_xz) - SDF.sub_element_text(inertia, 'iyy', inertia_yy) - SDF.sub_element_text(inertia, 'iyz', inertia_yz) - SDF.sub_element_text(inertia, 'izz', inertia_zz) diff --git a/pyrevolve/SDF/pose.py b/pyrevolve/SDF/pose.py index 64cd91fb37..08c6e81c55 100644 --- a/pyrevolve/SDF/pose.py +++ b/pyrevolve/SDF/pose.py @@ -23,8 +23,8 @@ def text(self): class Posable(xml.etree.ElementTree.Element): def __init__(self, tag, attrib={}, position=None, rotation=None, **extra): - super().__init__(tag, attrib, **extra) - self._pose = Pose(position, rotation) + super().__init__(tag, attrib=attrib, **extra) + self._pose = Pose(position=position, rotation=rotation) self.append(self._pose) @property diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index d0166ee38a..2d5843e56a 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -244,9 +244,10 @@ def _to_sdf_PYTHON_XML(self, nice_format): children_links = self._module_to_sdf(child_module, core_link, core_slot, core_collision) links.extend(children_links) - for core_link in links: - # TODO core_link.calculate_inertial() - model.append(core_link) + for link in links: + link.align_center_of_mass() + link.calculate_inertial() + model.append(link) # XML RENDER PHASE # def prettify(rough_string, indent='\t'): diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 6ba894754c..478d021960 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -13,6 +13,20 @@ from pyrevolve import SDF +# MEASUREMENT CONVERSION +def mm(x): + return x / 1000.0 + + +def cm(x): + return x / 100.0 + + +def grams(x): + return x / 1000.0 + + +# Module Orientation class Orientation(Enum): SOUTH = 0 NORTH = 1 @@ -155,7 +169,7 @@ def _brick_to_sdf(self, tree_depth=''): geometry = SDF.MeshGeometry(self.VISUAL_MESH) visual.append(geometry) - collision = SDF.Collision(name) + collision = SDF.Collision(name, self.MASS) geometry = SDF.BoxGeometry(self.COLLISION_BOX) collision.append(geometry) @@ -182,15 +196,7 @@ class CoreModule(RevolveModule): VISUAL_MESH = 'model://rg_robot/meshes/CoreComponent.dae' SLOT_COORDINATES = 0.089 / 2.0 COLLISION_BOX = (0.089, 0.089, 0.045) - MASS = 1.064000e-01 # TODO fix - INERTIA = ( # TODO fix - 1.143069e-04, - 0.000000e+00, - -1.763242e-38, - 7.888603e-05, - 4.198228e-22, - 1.596582e-04, - ) + MASS = grams(90) def __init__(self): super().__init__() @@ -245,6 +251,8 @@ class ActiveHingeModule(RevolveModule): SDFmath.Vector3(0, 0, 0), SDFmath.Vector3(-0.0091, 0, 0), ) + MASS_FRAME = grams(1.7) + MASS_SERVO = grams(9) def __init__(self): super().__init__() @@ -270,7 +278,7 @@ def to_sdf(self, tree_depth): geometry = SDF.MeshGeometry(self.VISUAL_MESH_FRAME) visual_frame.append(geometry) - collision_frame = SDF.Collision(name_frame) + collision_frame = SDF.Collision(name_frame, self.MASS_FRAME) geometry = SDF.BoxGeometry(self.COLLISION_BOX_FRAME) collision_frame.append(geometry) @@ -278,7 +286,7 @@ def to_sdf(self, tree_depth): geometry = SDF.MeshGeometry(self.VISUAL_MESH_SERVO) visual_servo.append(geometry) - collision_servo = SDF.Collision(name_servo) + collision_servo = SDF.Collision(name_servo, self.MASS_SERVO) collision_servo.translate(SDFmath.Vector3(0.002375, 0, 0)) geometry = SDF.BoxGeometry(self.COLLISION_BOX_SERVO) collision_servo.append(geometry) @@ -338,15 +346,7 @@ class BrickModule(RevolveModule): VISUAL_MESH = 'model://rg_robot/meshes/FixedBrick.dae' SLOT_COORDINATES = 3.8e-2 / 2.0 COLLISION_BOX = (4.1e-2, 4.1e-2, 3.55e-02) - MASS = 0.1 # TODO fix - INERTIA = ( # TODO fix - 1.143069e-04, - 0.000000e+00, - -1.763242e-38, - 7.888603e-05, - 4.198228e-22, - 1.596582e-04, - ) + MASS = grams(10.2) def __init__(self): super().__init__() @@ -374,6 +374,7 @@ class TouchSensorModule(RevolveModule): Inherits class RevolveModule. Creates Robogen sensor module """ TYPE = "TouchSensor" + MASS = grams(3) def __init__(self): super().__init__() @@ -424,7 +425,7 @@ def _calculate_box_slot_tangent(slot: Orientation): class BoxSlotJoints(BoxSlot): - def __init__(self, boundaries, orientation: Orientation, offset = (SDFmath.Vector3(), SDFmath.Vector3())): + def __init__(self, boundaries, orientation: Orientation, offset=(SDFmath.Vector3(), SDFmath.Vector3())): self.offset = offset super().__init__(boundaries, orientation) From 11beb3ec0847571abb72ded132b8cd466c8577be Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Mon, 11 Mar 2019 18:41:40 +0100 Subject: [PATCH 20/49] minor SDF rendering improvements - improved tag naming - activehinge does not influence the slot chain any more (it only has one free slot, so it's obvious without naming it) - added some stub for joint creation --- experiments/examples/manager.py | 4 ++-- pyrevolve/revolve_bot/revolve_bot.py | 32 ++++++++++++------------- pyrevolve/revolve_bot/revolve_module.py | 6 ++--- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/experiments/examples/manager.py b/experiments/examples/manager.py index 3d9f146104..1a2fd18ba1 100755 --- a/experiments/examples/manager.py +++ b/experiments/examples/manager.py @@ -39,11 +39,11 @@ async def run(): with open('/tmp/test.sdf.xml', 'w') as sdf_file: sdf_file.write(str(sdf_model)) - await asyncio.sleep(0.5) + await asyncio.sleep(1.5) insert_future = await world.insert_model(str(sdf_model)) await insert_future - await world.pause(False) + await world.pause(True) # while True: # await asyncio.sleep(1.0) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 2d5843e56a..9c05046051 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -148,8 +148,8 @@ def _sdf_attach_module(module_slot, module_orientation: float, def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_collision, slot_chain=''): from pyrevolve import SDF - slot_chain = '{}{}'.format(slot_chain, parent_slot.orientation.short_repr()) links = [] + joints = [] my_link = parent_link my_collision = None @@ -157,14 +157,9 @@ def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_colli if type(module) is ActiveHingeModule: print("adding joint") child_link = SDF.Link('{}_Leg'.format(slot_chain)) - links.append(child_link) visual_frame, collision_frame, \ - visual_servo, collision_servo, joint = module.to_sdf('{}_'.format(slot_chain)) - - # parent_slot = Orientation(parent_slot) - if parent_slot != Orientation.WEST: - pass + visual_servo, collision_servo, joint = module.to_sdf('{}'.format(slot_chain)) # parent_slot = parent_module.boxslot(parent_slot) module_slot = module.boxslot_frame(Orientation.SOUTH) @@ -184,12 +179,15 @@ def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_colli child_link.append(visual_servo) child_link.append(collision_servo) + links.append(child_link) + joints.append(joint) + my_link = child_link my_collision = collision_servo else: print("adding block") - visual, collision = module.to_sdf('') + visual, collision = module.to_sdf(slot_chain) module_slot = module.boxslot(Orientation.SOUTH) self._sdf_attach_module(module_slot, module.orientation, @@ -207,10 +205,13 @@ def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_colli continue my_slot = module.boxslot(Orientation(my_slot)) - children_links = self._module_to_sdf(child_module, my_link, my_slot, my_collision, slot_chain) + if type(module) is not ActiveHingeModule: + slot_chain = '{}{}'.format(slot_chain, my_slot.orientation.short_repr()) + children_links, children_joints = self._module_to_sdf(child_module, my_link, my_slot, my_collision, slot_chain) links.extend(children_links) + joints.extend(children_joints) - return links + return links, joints def _to_sdf_PYTHON_XML(self, nice_format): from xml.etree import ElementTree @@ -229,20 +230,19 @@ def _to_sdf_PYTHON_XML(self, nice_format): core_link = SDF.Link('Core') links = [core_link] + joints = [] core_visual, core_collision = self._body.to_sdf('') core_link.append(core_visual) core_link.append(core_collision) - # core_link.append(inertial) - - parent_module = self._body - parent_collision = core_collision for core_slot, child_module in self._body.iter_children(): if child_module is None: continue - core_slot = parent_module.boxslot(Orientation(core_slot)) - children_links = self._module_to_sdf(child_module, core_link, core_slot, core_collision) + core_slot = self._body.boxslot(Orientation(core_slot)) + slot_chain = core_slot.orientation.short_repr() + children_links, children_joints = self._module_to_sdf(child_module, core_link, core_slot, core_collision, slot_chain) links.extend(children_links) + joints.extend(children_joints) for link in links: link.align_center_of_mass() diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 478d021960..f729cb8de1 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -164,7 +164,7 @@ def to_sdf(self, tree_depth): return self._brick_to_sdf(tree_depth) def _brick_to_sdf(self, tree_depth=''): - name = 'component_{}{}__box'.format(tree_depth, self.TYPE) + name = 'component_{}_{}__box'.format(tree_depth, self.TYPE) visual = SDF.Visual(name) geometry = SDF.MeshGeometry(self.VISUAL_MESH) visual.append(geometry) @@ -269,8 +269,8 @@ def _generate_yaml_children(self): return {1: child.to_yaml()} def to_sdf(self, tree_depth): - name_frame = 'component_{}{}__frame'.format(tree_depth, self.TYPE) - name_servo = 'component_{}{}__servo'.format(tree_depth, self.TYPE) + name_frame = 'component_{}_{}__frame'.format(tree_depth, self.TYPE) + name_servo = 'component_{}_{}__servo'.format(tree_depth, self.TYPE) # offset = SDFmath.Vector3(self.COLLISION_BOX_FRAME[0] / 2) From 1d9a5bb4ccaee54950b7215fd99015a90fe2339a Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Tue, 12 Mar 2019 14:13:20 +0100 Subject: [PATCH 21/49] Loading SDF finally works loading morphology is working, loading brain parameters is still not present. --- pyrevolve/SDF/__init__.py | 7 +++-- pyrevolve/SDF/joint.py | 36 +++++++++++++++++++++++ pyrevolve/SDF/link.py | 39 +++++++++++++++++++++++-- pyrevolve/SDF/pose.py | 8 +++++ pyrevolve/revolve_bot/revolve_bot.py | 13 +++++++-- pyrevolve/revolve_bot/revolve_module.py | 15 +++++----- 6 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 pyrevolve/SDF/joint.py diff --git a/pyrevolve/SDF/__init__.py b/pyrevolve/SDF/__init__.py index 2160b13469..1cdd118f6d 100644 --- a/pyrevolve/SDF/__init__.py +++ b/pyrevolve/SDF/__init__.py @@ -1,9 +1,10 @@ +import xml.etree.ElementTree + from .pose import Pose, Posable from .link import Link -from .inertial import Inertial from .geometry import Visual, Collision, MeshGeometry, BoxGeometry - -import xml.etree.ElementTree +from .inertial import Inertial +from .joint import Joint def sub_element_text(parent, name, text): diff --git a/pyrevolve/SDF/joint.py b/pyrevolve/SDF/joint.py new file mode 100644 index 0000000000..9c40bb3510 --- /dev/null +++ b/pyrevolve/SDF/joint.py @@ -0,0 +1,36 @@ +import xml.etree.ElementTree +from pyrevolve import SDF +from pyrevolve.sdfbuilder import math as SDFmath + + +class Joint(SDF.Posable): + def __init__(self, name: str, parent_link: SDF.Link, child_link: SDF.Link, axis: SDFmath.Vector3, position=None, + rotation=None): + super().__init__( + 'joint', + {'name': name, 'type': 'revolute'}, + position=position, + rotation=rotation, + ) + SDF.sub_element_text(self, 'parent', parent_link.name) + SDF.sub_element_text(self, 'child', child_link.name) + self.axis = JointAxis(axis) + self.append(self.axis) + + +class JointAxis(xml.etree.ElementTree.Element): + def __init__(self, axis: SDFmath.Vector3): + super().__init__('axis') + self.xyz = SDF.sub_element_text(self, 'xyz', + '{:e} {:e} {:e}'.format(axis[0], axis[1], axis[2])) + SDF.sub_element_text(self, 'use_parent_model_frame', '0') + limit = xml.etree.ElementTree.SubElement(self, 'limit') + + # TODO calibrate this (load from configuration?) + SDF.sub_element_text(limit, 'lower', -7.853982e-01) + SDF.sub_element_text(limit, 'upper', 7.853982e-01) + SDF.sub_element_text(limit, 'effort', 1.765800e-01) + SDF.sub_element_text(limit, 'velocity', 5.235988e+00) + + def set_xyz(self, xyz: SDFmath.Vector3): + self.xyz.text = '{:e} {:e} {:e}'.format(xyz[0], xyz[1], xyz[2]) diff --git a/pyrevolve/SDF/link.py b/pyrevolve/SDF/link.py index 814428d039..ae7815de05 100644 --- a/pyrevolve/SDF/link.py +++ b/pyrevolve/SDF/link.py @@ -7,7 +7,7 @@ class Link(SDF.Posable): - def __init__(self, name, self_collide=True, position=None, rotation=None): + def __init__(self, name: str, self_collide=True, position=None, rotation=None): super().__init__( tag='link', attrib={'name': name}, @@ -15,27 +15,53 @@ def __init__(self, name, self_collide=True, position=None, rotation=None): rotation=rotation, ) - SDF.sub_element_text(self, 'self_collide', self_collide) + self.name = name self.size = (0, 0, 0, 0, 0, 0) self.inertial = None self.collisions = [] + self.joints = [] + + SDF.sub_element_text(self, 'self_collide', self_collide) def iter_elements(self, condition): + """ + Iterates all the elements that pass the condition statement + :param condition: Condition to choose which element to iterate over + :type condition: lambda function + :return: + """ for elem in self.iter(): if condition(elem): yield elem def append(self, subelement): + """ + Appends an xml element to this object. + + If it's a collision, it saves it internally (for calculating the center of mass) + :param subelement: XML Element to append + """ if type(subelement) is SDF.Collision: self.collisions.append(subelement) super().append(subelement) def align_center_of_mass(self): + """ + Aligns the children posable objects relative to the center of mass of this link. + + It calculates the center of mass, and apply this as the center of the Link. + All children posable are relative to the position of the Link, so their position needs + to be adjusted. + :return: the position of the center of mass + :rtype: SDFmath.Vector3 + """ translation = self.get_center_of_mass() self.set_position(translation*2.0) for el in self.iter_elements(lambda elem: isinstance(elem, SDF.Posable)): el.translate(-translation) + for joint in self.joints: + joint.translate(-translation) return translation def calculate_inertial(self): @@ -92,4 +118,11 @@ def get_center_of_mass(self): return com - + def add_joint(self, joint): + """ + Add Joints to the internal list of joints. + These joints position will be changed when the function `align_center_of_mass` is called. + :param joint: joint whose children is this link + :type joint: SDF.Joint + """ + self.joints.append(joint) diff --git a/pyrevolve/SDF/pose.py b/pyrevolve/SDF/pose.py index 08c6e81c55..8c9a68ba15 100644 --- a/pyrevolve/SDF/pose.py +++ b/pyrevolve/SDF/pose.py @@ -37,9 +37,17 @@ def pose(self, pose: Pose): self.set_position(pose.position) def get_position(self): + """ + :return: copy of the internal position + :rtype: math.Vector3 + """ return self._pose.position.copy() def get_rotation(self): + """ + :return: copy of the internal rotation + :rtype: math.Quaternion + """ return self._pose.rotation.copy() def set_position(self, position: math.Vector3): diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 9c05046051..ddd5663430 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -159,7 +159,7 @@ def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_colli child_link = SDF.Link('{}_Leg'.format(slot_chain)) visual_frame, collision_frame, \ - visual_servo, collision_servo, joint = module.to_sdf('{}'.format(slot_chain)) + visual_servo, collision_servo, joint = module.to_sdf('{}'.format(slot_chain), parent_link, child_link) # parent_slot = parent_module.boxslot(parent_slot) module_slot = module.boxslot_frame(Orientation.SOUTH) @@ -173,11 +173,17 @@ def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_colli visual_servo, collision_servo, parent_slot, collision_frame) + joint.set_rotation(visual_servo.get_rotation()) + old_position = joint.get_position() + joint.set_position(visual_servo.get_position()) + joint.translate(joint.to_parent_direction(old_position)) + parent_link.append(visual_frame) parent_link.append(collision_frame) child_link.append(visual_servo) child_link.append(collision_servo) + child_link.add_joint(joint) links.append(child_link) joints.append(joint) @@ -244,6 +250,9 @@ def _to_sdf_PYTHON_XML(self, nice_format): links.extend(children_links) joints.extend(children_joints) + for joint in joints: + model.append(joint) + for link in links: link.align_center_of_mass() link.calculate_inertial() @@ -257,9 +266,7 @@ def prettify(rough_string, indent='\t'): reparsed = xml.dom.minidom.parseString(rough_string) return reparsed.toprettyxml(indent=indent) - # tree = xml.etree.ElementTree.ElementTree(sdf) res = xml.etree.ElementTree.tostring(sdf_root, encoding='utf8', method='xml') - print(res) if nice_format is not None: res = prettify(res, nice_format) diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index f729cb8de1..5f2dde0b98 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -268,12 +268,11 @@ def _generate_yaml_children(self): else: return {1: child.to_yaml()} - def to_sdf(self, tree_depth): + def to_sdf(self, tree_depth, parent_link, child_link): name_frame = 'component_{}_{}__frame'.format(tree_depth, self.TYPE) + name_joint = 'component_{}_{}__joint'.format(tree_depth, self.TYPE) name_servo = 'component_{}_{}__servo'.format(tree_depth, self.TYPE) - # offset = SDFmath.Vector3(self.COLLISION_BOX_FRAME[0] / 2) - visual_frame = SDF.Visual(name_frame) geometry = SDF.MeshGeometry(self.VISUAL_MESH_FRAME) visual_frame.append(geometry) @@ -291,12 +290,14 @@ def to_sdf(self, tree_depth): geometry = SDF.BoxGeometry(self.COLLISION_BOX_SERVO) collision_servo.append(geometry) - # TODO - joint = None + joint = SDF.Joint(name_joint, + parent_link, child_link, + SDFmath.Vector3(0, 1, 0)) + + joint.set_position(SDFmath.Vector3(-0.0085, 0, 0)) return visual_frame, collision_frame, \ - visual_servo, collision_servo, \ - joint + visual_servo, collision_servo, joint def possible_slots_frame(self): box_geometry = self.COLLISION_BOX_FRAME From 7b987c36dee5302582bf0cff55e76dc49999c361 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Thu, 14 Mar 2019 15:36:05 +0100 Subject: [PATCH 22/49] Loading SDF work in progress only basic creation works: - only up to depth one - all in one link (no axis) --- pyrevolve/SDF/__init__.py | 2 + pyrevolve/SDF/joint.py | 8 +- pyrevolve/SDF/link.py | 5 +- .../{sdfbuilder => SDF}/math/__init__.py | 2 +- pyrevolve/{sdfbuilder => SDF}/math/classes.py | 0 .../math/transformations.py | 2 +- pyrevolve/SDF/pose.py | 53 ++-- pyrevolve/SDF/revolve_bot_sdf_builder.py | 240 +++++++++++++++++ pyrevolve/angle/manage/robot.py | 2 +- pyrevolve/angle/manage/world.py | 2 +- pyrevolve/gazebo/__init__.py | 6 +- pyrevolve/revolve_bot/revolve_bot.py | 246 +----------------- pyrevolve/revolve_bot/revolve_module.py | 78 ++---- pyrevolve/tol/manage/robot.py | 2 +- pyrevolve/tol/manage/world.py | 28 +- pyrevolve/tol/scenery/__init__.py | 2 +- pyrevolve/tol/scenery/wall.py | 2 +- 17 files changed, 323 insertions(+), 357 deletions(-) rename pyrevolve/{sdfbuilder => SDF}/math/__init__.py (70%) rename pyrevolve/{sdfbuilder => SDF}/math/classes.py (100%) rename pyrevolve/{sdfbuilder => SDF}/math/transformations.py (99%) create mode 100644 pyrevolve/SDF/revolve_bot_sdf_builder.py diff --git a/pyrevolve/SDF/__init__.py b/pyrevolve/SDF/__init__.py index 1cdd118f6d..fdb780999e 100644 --- a/pyrevolve/SDF/__init__.py +++ b/pyrevolve/SDF/__init__.py @@ -5,6 +5,8 @@ from .geometry import Visual, Collision, MeshGeometry, BoxGeometry from .inertial import Inertial from .joint import Joint +from . import math +from .revolve_bot_sdf_builder import revolve_bot_to_sdf def sub_element_text(parent, name, text): diff --git a/pyrevolve/SDF/joint.py b/pyrevolve/SDF/joint.py index 9c40bb3510..4f6b4a3337 100644 --- a/pyrevolve/SDF/joint.py +++ b/pyrevolve/SDF/joint.py @@ -1,10 +1,10 @@ import xml.etree.ElementTree from pyrevolve import SDF -from pyrevolve.sdfbuilder import math as SDFmath +import pyrevolve.SDF.math class Joint(SDF.Posable): - def __init__(self, name: str, parent_link: SDF.Link, child_link: SDF.Link, axis: SDFmath.Vector3, position=None, + def __init__(self, name: str, parent_link: SDF.Link, child_link: SDF.Link, axis: SDF.math.Vector3, position=None, rotation=None): super().__init__( 'joint', @@ -19,7 +19,7 @@ def __init__(self, name: str, parent_link: SDF.Link, child_link: SDF.Link, axis: class JointAxis(xml.etree.ElementTree.Element): - def __init__(self, axis: SDFmath.Vector3): + def __init__(self, axis: SDF.math.Vector3): super().__init__('axis') self.xyz = SDF.sub_element_text(self, 'xyz', '{:e} {:e} {:e}'.format(axis[0], axis[1], axis[2])) @@ -32,5 +32,5 @@ def __init__(self, axis: SDFmath.Vector3): SDF.sub_element_text(limit, 'effort', 1.765800e-01) SDF.sub_element_text(limit, 'velocity', 5.235988e+00) - def set_xyz(self, xyz: SDFmath.Vector3): + def set_xyz(self, xyz: SDF.math.Vector3): self.xyz.text = '{:e} {:e} {:e}'.format(xyz[0], xyz[1], xyz[2]) diff --git a/pyrevolve/SDF/link.py b/pyrevolve/SDF/link.py index ae7815de05..fa58a71413 100644 --- a/pyrevolve/SDF/link.py +++ b/pyrevolve/SDF/link.py @@ -3,7 +3,6 @@ from pyrevolve import SDF from pyrevolve.SDF.inertial import transform_inertia_tensor -from pyrevolve.sdfbuilder import math as SDFmath class Link(SDF.Posable): @@ -54,7 +53,7 @@ def align_center_of_mass(self): All children posable are relative to the position of the Link, so their position needs to be adjusted. :return: the position of the center of mass - :rtype: SDFmath.Vector3 + :rtype: SDF.math.Vector3 """ translation = self.get_center_of_mass() self.set_position(translation*2.0) @@ -105,7 +104,7 @@ def get_center_of_mass(self): :return: The center of mass as determined by all the collision geometries :rtype: Vector3 """ - com = SDFmath.Vector3(0, 0, 0) + com = SDF.math.Vector3(0, 0, 0) total_mass = 0.0 for collision in self.collisions: col_com = collision.get_center_of_mass() diff --git a/pyrevolve/sdfbuilder/math/__init__.py b/pyrevolve/SDF/math/__init__.py similarity index 70% rename from pyrevolve/sdfbuilder/math/__init__.py rename to pyrevolve/SDF/math/__init__.py index 746227efef..09c57674a8 100644 --- a/pyrevolve/sdfbuilder/math/__init__.py +++ b/pyrevolve/SDF/math/__init__.py @@ -2,4 +2,4 @@ Vector, Quaternion and RotationMatrix classes written as wrappers over `transformations.py` (see that file for license/origin). """ -from .classes import Vector3, Quaternion, RotationMatrix \ No newline at end of file +from .classes import Vector3, Quaternion, RotationMatrix diff --git a/pyrevolve/sdfbuilder/math/classes.py b/pyrevolve/SDF/math/classes.py similarity index 100% rename from pyrevolve/sdfbuilder/math/classes.py rename to pyrevolve/SDF/math/classes.py diff --git a/pyrevolve/sdfbuilder/math/transformations.py b/pyrevolve/SDF/math/transformations.py similarity index 99% rename from pyrevolve/sdfbuilder/math/transformations.py rename to pyrevolve/SDF/math/transformations.py index 05c2f93359..d433933f2d 100644 --- a/pyrevolve/sdfbuilder/math/transformations.py +++ b/pyrevolve/SDF/math/transformations.py @@ -1717,4 +1717,4 @@ def is_same_transform(matrix0, matrix1): matrix0 /= matrix0[3, 3] matrix1 = numpy.array(matrix1, dtype=numpy.float64, copy=True) matrix1 /= matrix1[3, 3] - return numpy.allclose(matrix0, matrix1) \ No newline at end of file + return numpy.allclose(matrix0, matrix1) diff --git a/pyrevolve/SDF/pose.py b/pyrevolve/SDF/pose.py index 8c9a68ba15..2c41726364 100644 --- a/pyrevolve/SDF/pose.py +++ b/pyrevolve/SDF/pose.py @@ -1,14 +1,15 @@ import sys import xml.etree.ElementTree -from pyrevolve.sdfbuilder import math +from pyrevolve import SDF +import pyrevolve.SDF.math class Pose(xml.etree.ElementTree.Element): - def __init__(self, position: math.Vector3 = None, rotation: math.Quaternion = None): + def __init__(self, position: SDF.math.Vector3 = None, rotation: SDF.math.Quaternion = None): super().__init__('pose') - self.position = math.Vector3() if position is None else position - self.rotation = math.Quaternion() if rotation is None else rotation + self.position = SDF.math.Vector3() if position is None else position + self.rotation = SDF.math.Quaternion() if rotation is None else rotation @property def text(self): @@ -39,30 +40,30 @@ def pose(self, pose: Pose): def get_position(self): """ :return: copy of the internal position - :rtype: math.Vector3 + :rtype: SDF.math.Vector3 """ return self._pose.position.copy() def get_rotation(self): """ :return: copy of the internal rotation - :rtype: math.Quaternion + :rtype: SDF.math.Quaternion """ return self._pose.rotation.copy() - def set_position(self, position: math.Vector3): + def set_position(self, position: SDF.math.Vector3): self._pose.position = position.copy() - def set_rotation(self, rotation: math.Quaternion): + def set_rotation(self, rotation: SDF.math.Quaternion): self._pose.rotation = rotation.copy() - def translate(self, translation: math.Vector3): + def translate(self, translation: SDF.math.Vector3): self._pose.position = self._pose.position + translation - def rotate(self, rotation: math.Quaternion): + def rotate(self, rotation: SDF.math.Quaternion): self._pose.rotation = rotation * self._pose.rotation - def rotate_around(self, axis: math.Vector3, angle: float, relative_to_child: bool = True): + def rotate_around(self, axis: SDF.math.Vector3, angle: float, relative_to_child: bool = True): """ Rotates this Posable `angle` degrees around the given directional vector :param axis: @@ -74,7 +75,7 @@ def rotate_around(self, axis: math.Vector3, angle: float, relative_to_child: boo if relative_to_child: axis = self.to_parent_direction(axis) - quat = math.Quaternion.from_angle_axis(angle, axis) + quat = SDF.math.Quaternion.from_angle_axis(angle, axis) self.rotate(quat) def to_parent_direction(self, vec): @@ -82,9 +83,9 @@ def to_parent_direction(self, vec): Returns the given direction vector / rotation quaternion relative to the parent frame. :param vec: Vector or quaternion in the local frame - :type vec: math.Vector3|math.Quaternion + :type vec: SDF.math.Vector3|SDF.math.Quaternion :return: - :rtype: math.Vector3|math.Quaternion + :rtype: SDF.math.Vector3|SDF.math.Quaternion """ return self._pose.rotation * vec @@ -93,41 +94,41 @@ def to_local_direction(self, vec): Returns the given direction vector / rotation quaternion relative to the local frame :param vec: Direction vector or orientation in the parent frame - :type vec: math.Vector3|math.Quaternion + :type vec: SDF.math.Vector3|SDF.math.Quaternion :return: - :rtype: math.Vector3|math.Quaternion + :rtype: SDF.math.Vector3|SDF.math.Quaternion """ return self._pose.rotation.conjugated() * vec - def to_parent_frame(self, point: math.Vector3): + def to_parent_frame(self, point: SDF.math.Vector3): """ Returns the given point relative to the parent frame :param point: Point in the local frame :return: - :rtype: math.Vector3 + :rtype: SDF.math.Vector3 """ position = self._pose.position return self.to_parent_direction(point) + position - def to_local_frame(self, point: math.Vector3): + def to_local_frame(self, point: SDF.math.Vector3): """ Returns the given point relative to the local frame :param point: Point in the parent frame :return: - :rtype: math.Vector3 + :rtype: SDF.math.Vector3 """ rotation = self._pose.rotation.conjugated() position = self._pose.position return rotation * (point - position) - def to_sibling_frame(self, point: math.Vector3, sibling): + def to_sibling_frame(self, point: SDF.math.Vector3, sibling): """ Takes a point and converts it to the frame of a sibling :param point: :param sibling: :type sibling: Posable :return: The point in the sibling's frame - :rtype: math.Vector3 + :rtype: SDF.math.Vector3 """ # Do this the easy way: convert to parent, then # back to sibling @@ -139,11 +140,11 @@ def to_sibling_direction(self, vec, sibling): Returns the given direction vector / orientation quaternion relative to the frame of a sibling :param vec: Direction vector / orientation quaternion in the child frame - :type vec: math.Vector3|math.Quaternion + :type vec: SDF.math.Vector3|SDF.math.Quaternion :param sibling: The sibling posable :type sibling: Posable :return: - :rtype: math.Vector3|math.Quaternion + :rtype: SDF.math.Vector3|SDF.math.Quaternion """ in_parent = self.to_parent_direction(vec) return sibling.to_local_direction(in_parent) @@ -215,8 +216,8 @@ def align(self, # rotation matrix from R1 to R2. The easiest way to visualize this is # if we first perform the inverse rotation from R1 back to the # standard basis, and then rotate to R2. - r1 = math.RotationMatrix() - r2 = math.RotationMatrix() + r1 = SDF.math.RotationMatrix() + r2 = SDF.math.RotationMatrix() # Warning: `RotationMatrix` is a Matrix4 that can potentially do # translations. We want to assign the first block of these matrices diff --git a/pyrevolve/SDF/revolve_bot_sdf_builder.py b/pyrevolve/SDF/revolve_bot_sdf_builder.py new file mode 100644 index 0000000000..6dd078b2d9 --- /dev/null +++ b/pyrevolve/SDF/revolve_bot_sdf_builder.py @@ -0,0 +1,240 @@ +import math +import xml.etree.ElementTree + +from pyrevolve import SDF +from pyrevolve.revolve_bot.revolve_module import ActiveHingeModule, Orientation, BoxSlot + + +def revolve_bot_to_sdf(robot, nice_format): + from xml.etree import ElementTree + from pyrevolve import SDF + + sdf_root = ElementTree.Element('sdf', {'version': '1.6'}) + + assert (robot._id is not None) + model = ElementTree.SubElement(sdf_root, 'model', { + 'name': str(robot._id) + }) + + # TODO make this pose parametric + pose = SDF.Pose(SDF.math.Vector3(0, 0, 0.25)) + model.append(pose) + + core_link = SDF.Link('Core') + links = [core_link] + joints = [] + core_visual, core_collision = robot._body.to_sdf('') + core_link.append(core_visual) + core_link.append(core_collision) + + for core_slot, child_module in robot._body.iter_children(): + if child_module is None: + continue + core_slot = robot._body.boxslot(Orientation(core_slot)) + slot_chain = core_slot.orientation.short_repr() + children_links, children_joints = _module_to_sdf(child_module, + core_link, + core_slot, + core_collision, + slot_chain) + links.extend(children_links) + joints.extend(children_joints) + + for joint in joints: + model.append(joint) + + for link in links: + link.align_center_of_mass() + link.calculate_inertial() + model.append(link) + + # ADD BRAIN + plugin_elem = _sdf_brain_plugin_conf(robot._brain) + model.append(plugin_elem) + + # XML RENDER PHASE # + def prettify(rough_string, indent='\t'): + """Return a pretty-printed XML string for the Element. + """ + import xml.dom.minidom + reparsed = xml.dom.minidom.parseString(rough_string) + return reparsed.toprettyxml(indent=indent) + + res = xml.etree.ElementTree.tostring(sdf_root, encoding='utf8', method='xml') + + if nice_format is not None: + res = prettify(res, nice_format) + + return res + + +def _sdf_attach_module(module_slot, module_orientation: float, + visual, collision, + parent_slot, parent_collision): + """ + Attaches `module` to `parent` using `parent_slot`. + It modifies the pose of `visual` and `collision` to move them attached to the + `parent_collision` + :param module_slot: + :param module_orientation: degrees of rotation of the component + :param visual: + :param collision: + :param parent_slot: + :param parent_collision: + :return: + """ + + if module_orientation is not None: + # Rotate the module_slot.tangent vector over the normal + # with the given number of radians to apply + # the rotation. Rotating this vector around + # the normal should not break their orthogonality. + orientation = module_orientation / 180.0 * math.pi + rot = SDF.math.Quaternion.from_angle_axis(orientation, module_slot.normal) + module_slot.tangent = rot * module_slot.tangent + + visual.align( + module_slot, + parent_slot, + parent_collision, + relative_to_child=True + ) + collision.set_rotation(visual.get_rotation()) + old_translation = collision.get_position() + collision.set_position(visual.get_position()) + collision.translate(collision.to_parent_direction(old_translation)) + + +def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, slot_chain=''): + """ + Recursive function that takes a module and returns a list of SDF links and joints that + that module and his children have generated. + :param module: Module to parse + :type module: RevolveModule + :param parent_link: SDF `Link` of the parent + :param parent_slot: Slot of the parent which this module should attach to + :param parent_collision: Parent collision box, needed for the alignment. + :param slot_chain: Text that names the joints, it encodes the path that was made to arrive to that element. + :return: + """ + links = [] + joints = [] + + my_link = parent_link + my_collision = None + + if type(module) is ActiveHingeModule: + print("adding joint") + child_link = SDF.Link('{}_Leg'.format(slot_chain)) + + visual_frame, collision_frame, \ + visual_servo, collision_servo, \ + joint = module.to_sdf('{}'.format(slot_chain), parent_link, child_link) + + # parent_slot = parent_module.boxslot(parent_slot) + module_slot = module.boxslot_frame(Orientation.SOUTH) + _sdf_attach_module(module_slot, module.orientation, + visual_frame, collision_frame, + parent_slot, parent_collision) + + parent_slot = module.boxslot_frame(Orientation.NORTH) + module_slot = module.boxslot_servo(Orientation.SOUTH) + _sdf_attach_module(module_slot, None, + visual_servo, collision_servo, + parent_slot, collision_frame) + + joint.set_rotation(visual_servo.get_rotation()) + old_position = joint.get_position() + joint.set_position(visual_servo.get_position()) + joint.translate(joint.to_parent_direction(old_position)) + + parent_link.append(visual_frame) + parent_link.append(collision_frame) + + child_link.append(visual_servo) + child_link.append(collision_servo) + child_link.add_joint(joint) + + links.append(child_link) + joints.append(joint) + + my_link = child_link + my_collision = collision_servo + + else: + print("adding block") + visual, collision = module.to_sdf(slot_chain) + + module_slot = module.boxslot(Orientation.SOUTH) + _sdf_attach_module(module_slot, module.orientation, + visual, collision, + parent_slot, parent_collision) + + parent_link.append(visual) + parent_link.append(collision) + + my_collision = collision + + # recursions on children + for my_slot, child_module in module.iter_children(): + if child_module is None: + continue + + my_slot = module.boxslot(Orientation(my_slot)) + if type(module) is not ActiveHingeModule: + slot_chain = '{}{}'.format(slot_chain, my_slot.orientation.short_repr()) + children_links, children_joints = _module_to_sdf(child_module, + my_link, + my_slot, + my_collision, + slot_chain) + links.extend(children_links) + joints.extend(children_joints) + + return links, joints + + +def _sdf_brain_plugin_conf( + robot_brain, + battery_level=None, + update_rate: float = 8.0, + controller_plugin: str = 'libRobotControlPlugin.so' +): + """ + Creates the plugin node with the brain configuration inside + + :param robot_brain: Brain of the robot to send to the simulator + :param battery_level: + :param update_rate: Update rate as used by the default controller + :param controller_plugin: Name of the shared library of the model plugin + :return: The sdf plugin element + :rtype: xml.etree.ElementTree.Element + """ + plugin = xml.etree.ElementTree.Element( + 'plugin', + attrib={ + 'name': 'robot_controller', + 'filename': controller_plugin, + 'xmlns:rv': 'https://github.com/ci-group/revolve', + }) + + config = xml.etree.ElementTree.SubElement(plugin, 'rv:robot_config') + + # update rate + SDF.sub_element_text(config, 'rv:update_rate', update_rate) + + # brain + if robot_brain is not None: + brain_config = robot_brain.to_sdf() + config.append(brain_config) + + # TODO sensors + + # TODO motors + + # battery + if battery_level is not None: + battery = xml.etree.ElementTree.SubElement(config, 'rv:battery') + SDF.sub_element_text(battery, 'rv:level', battery_level) + + return plugin diff --git a/pyrevolve/angle/manage/robot.py b/pyrevolve/angle/manage/robot.py index f63ec80bd0..059523acda 100644 --- a/pyrevolve/angle/manage/robot.py +++ b/pyrevolve/angle/manage/robot.py @@ -4,7 +4,7 @@ import numpy as np from collections import deque -from pyrevolve.sdfbuilder.math import Vector3 +from pyrevolve.SDF.math import Vector3 from pyrevolve.util import Time diff --git a/pyrevolve/angle/manage/world.py b/pyrevolve/angle/manage/world.py index ac5d0c2092..e99482d890 100644 --- a/pyrevolve/angle/manage/world.py +++ b/pyrevolve/angle/manage/world.py @@ -12,7 +12,7 @@ from datetime import datetime from pygazebo.msg import gz_string_pb2 -from pyrevolve.sdfbuilder.math import Vector3 +from pyrevolve.SDF.math import Vector3 from pyrevolve.spec.msgs import BoundingBox from pyrevolve.spec.msgs import ModelInserted from pyrevolve.spec.msgs import RobotStates diff --git a/pyrevolve/gazebo/__init__.py b/pyrevolve/gazebo/__init__.py index 265a67d7eb..911cb2e4bf 100644 --- a/pyrevolve/gazebo/__init__.py +++ b/pyrevolve/gazebo/__init__.py @@ -1,7 +1,7 @@ from __future__ import absolute_import -from .analyze import BodyAnalyzer -from .analyze import analyze_body -from .analyze import get_analysis_robot +# from .analyze import BodyAnalyzer +# from .analyze import analyze_body +# from .analyze import get_analysis_robot from .connect import connect, RequestHandler diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index ddd5663430..012c32617f 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -5,10 +5,7 @@ import math from collections import OrderedDict -from pyrevolve.sdfbuilder import SDF -from pyrevolve.sdfbuilder import math as SDFmath -from pyrevolve.sdfbuilder import Model, Element, Link, FixedJoint -from pyrevolve.sdfbuilder.util import number_format +from pyrevolve import SDF from .revolve_module import CoreModule from .revolve_module import ActiveHingeModule @@ -107,246 +104,7 @@ def load_file(self, path, conf_type='yaml'): self.load(robot, conf_type) def to_sdf(self, nice_format=None): - return self._to_sdf_PYTHON_XML(nice_format) - - @staticmethod - def _sdf_attach_module(module_slot, module_orientation: float, - visual, collision, - parent_slot, parent_collision): - """ - Attaches `module` to `parent` using `parent_slot`. - It modifies the pose of `visual` and `collision` to move them attached to the - `parent_collision` - :param module_slot: - :param module_orientation: degrees of rotation of the component - :param visual: - :param collision: - :param parent_slot: - :param parent_collision: - :return: - """ - - if module_orientation is not None: - # Rotate the module_slot.tangent vector over the normal - # with the given number of radians to apply - # the rotation. Rotating this vector around - # the normal should not break their orthogonality. - orientation = module_orientation / 180.0 * math.pi - rot = SDFmath.Quaternion.from_angle_axis(orientation, module_slot.normal) - module_slot.tangent = rot * module_slot.tangent - - visual.align( - module_slot, - parent_slot, - parent_collision, - relative_to_child=True - ) - collision.set_rotation(visual.get_rotation()) - old_translation = collision.get_position() - collision.set_position(visual.get_position()) - collision.translate(collision.to_parent_direction(old_translation)) - - def _module_to_sdf(self, module, parent_link, parent_slot: BoxSlot, parent_collision, slot_chain=''): - from pyrevolve import SDF - links = [] - joints = [] - - my_link = parent_link - my_collision = None - - if type(module) is ActiveHingeModule: - print("adding joint") - child_link = SDF.Link('{}_Leg'.format(slot_chain)) - - visual_frame, collision_frame, \ - visual_servo, collision_servo, joint = module.to_sdf('{}'.format(slot_chain), parent_link, child_link) - - # parent_slot = parent_module.boxslot(parent_slot) - module_slot = module.boxslot_frame(Orientation.SOUTH) - self._sdf_attach_module(module_slot, module.orientation, - visual_frame, collision_frame, - parent_slot, parent_collision) - - parent_slot = module.boxslot_frame(Orientation.NORTH) - module_slot = module.boxslot_servo(Orientation.SOUTH) - self._sdf_attach_module(module_slot, None, - visual_servo, collision_servo, - parent_slot, collision_frame) - - joint.set_rotation(visual_servo.get_rotation()) - old_position = joint.get_position() - joint.set_position(visual_servo.get_position()) - joint.translate(joint.to_parent_direction(old_position)) - - parent_link.append(visual_frame) - parent_link.append(collision_frame) - - child_link.append(visual_servo) - child_link.append(collision_servo) - child_link.add_joint(joint) - - links.append(child_link) - joints.append(joint) - - my_link = child_link - my_collision = collision_servo - - else: - print("adding block") - visual, collision = module.to_sdf(slot_chain) - - module_slot = module.boxslot(Orientation.SOUTH) - self._sdf_attach_module(module_slot, module.orientation, - visual, collision, - parent_slot, parent_collision) - - parent_link.append(visual) - parent_link.append(collision) - - my_collision = collision - - # recursions on children - for my_slot, child_module in module.iter_children(): - if child_module is None: - continue - - my_slot = module.boxslot(Orientation(my_slot)) - if type(module) is not ActiveHingeModule: - slot_chain = '{}{}'.format(slot_chain, my_slot.orientation.short_repr()) - children_links, children_joints = self._module_to_sdf(child_module, my_link, my_slot, my_collision, slot_chain) - links.extend(children_links) - joints.extend(children_joints) - - return links, joints - - def _to_sdf_PYTHON_XML(self, nice_format): - from xml.etree import ElementTree - from pyrevolve import SDF - - sdf_root = ElementTree.Element('sdf', {'version': '1.6'}) - - assert (self._id is not None) - model = ElementTree.SubElement(sdf_root, 'model', { - 'name': str(self._id) - }) - - # TODO make this pose parametric - pose = SDF.Pose(SDFmath.Vector3(0, 0, 0.05)) - model.append(pose) - - core_link = SDF.Link('Core') - links = [core_link] - joints = [] - core_visual, core_collision = self._body.to_sdf('') - core_link.append(core_visual) - core_link.append(core_collision) - - for core_slot, child_module in self._body.iter_children(): - if child_module is None: - continue - core_slot = self._body.boxslot(Orientation(core_slot)) - slot_chain = core_slot.orientation.short_repr() - children_links, children_joints = self._module_to_sdf(child_module, core_link, core_slot, core_collision, slot_chain) - links.extend(children_links) - joints.extend(children_joints) - - for joint in joints: - model.append(joint) - - for link in links: - link.align_center_of_mass() - link.calculate_inertial() - model.append(link) - - # XML RENDER PHASE # - def prettify(rough_string, indent='\t'): - """Return a pretty-printed XML string for the Element. - """ - import xml.dom.minidom - reparsed = xml.dom.minidom.parseString(rough_string) - return reparsed.toprettyxml(indent=indent) - - res = xml.etree.ElementTree.tostring(sdf_root, encoding='utf8', method='xml') - - if nice_format is not None: - res = prettify(res, nice_format) - - return res - - def _to_sdf_REVOLVE_XML(self): - """ - Converts yaml to sdf - - :return: - """ - sdf = SDF() - - model = Model(name=self._id) - # TODO: Traverse through body elements, retrieve s and - # create s between them - elements = [ - self._sdf_brain_plugin_conf() - ] - model.add_elements(elements) - - sdf.add_element(model) - return sdf - - def _sdf_brain_plugin_conf( - self, - update_rate=5, - controller_plugin='libRobotControlPlugin.so' - ): - """ - creates the plugin node with the brain configuration inside - :param update_rate: Update rate as used by the default controller - :type update_rate: float - - :param controller_plugin: Name of the shared - library of the model plugin - :type controller_plugin: str - - :return: The sdf model - """ - plugin = Element( - tag_name='plugin', - attributes={ - 'name': 'robot_controller', - 'filename': controller_plugin - }) - - config = Element( - tag_name='rv:robot_config', - attributes={ - 'xmlns:rv': 'https://github.com/ci-group/revolve' - }) - plugin.add_element(config) - - # update rate - config.add_element(Element( - tag_name='rv:update_rate', - body=number_format(update_rate))) - - # brain - if self._brain is not None: - brain_config = self._brain.to_sdf() - config.add_element(brain_config) - - # TODO sensors - - # TODO motors - - # battery - if self._battery_level is not None: - battery = Element(tag_name='rv:battery') - battery_level = Element( - tag_name='rv:level', - body=self._battery_level - ) - battery.add_element(battery_level) - config.add_element(battery) - - return plugin + return SDF.revolve_bot_to_sdf(self, nice_format) def to_yaml(self): """ diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 5f2dde0b98..cbdf5422d6 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -4,12 +4,6 @@ from collections import OrderedDict from enum import Enum -from pyrevolve.sdfbuilder import Link -from pyrevolve.sdfbuilder import math as SDFmath -from pyrevolve.sdfbuilder.structure import Box -from pyrevolve.sdfbuilder.structure import Collision -from pyrevolve.sdfbuilder.structure import Visual -from pyrevolve.sdfbuilder.structure import Mesh from pyrevolve import SDF @@ -201,34 +195,6 @@ class CoreModule(RevolveModule): def __init__(self): super().__init__() - def to_sdf_old(self): - """ - Converts the CoreComponent to SDF format - :return: - """ - # TODO: Scale needs to be checked - scale = 0.5 - mesh = Mesh( - uri="model://rg_robot/meshes/CoreComponent.dae", - scale=scale - ) - - visual = Visual(name="visual_{}".format(self.id), geometry=mesh) - collision = Collision( - name="collision_{}".format(self.id), - geometry=Box(1.0, 1.0, 1.0, mass=0.3) - ) - - link = Link( - name="link_{}".format(self.id), - self_collide=True, - elements=[visual, collision] - ) - rgb = self.color() - link.make_color(r=rgb[0], g=rgb[1], b=rgb[2], a=1.0) - - return link - def possible_slots(self): return ( (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # X @@ -248,8 +214,8 @@ class ActiveHingeModule(RevolveModule): COLLISION_BOX_SERVO = (2.45e-02, 2.575e-02, 1.5e-02) # COLLISION_BOX_SERVO = (2.925000e-02, 3.400000e-02, 1.000000e-02) COLLISION_BOX_SERVO_OFFSET = ( - SDFmath.Vector3(0, 0, 0), - SDFmath.Vector3(-0.0091, 0, 0), + SDF.math.Vector3(0, 0, 0), + SDF.math.Vector3(-0.0091, 0, 0), ) MASS_FRAME = grams(1.7) MASS_SERVO = grams(9) @@ -286,15 +252,15 @@ def to_sdf(self, tree_depth, parent_link, child_link): visual_servo.append(geometry) collision_servo = SDF.Collision(name_servo, self.MASS_SERVO) - collision_servo.translate(SDFmath.Vector3(0.002375, 0, 0)) + collision_servo.translate(SDF.math.Vector3(0.002375, 0, 0)) geometry = SDF.BoxGeometry(self.COLLISION_BOX_SERVO) collision_servo.append(geometry) joint = SDF.Joint(name_joint, parent_link, child_link, - SDFmath.Vector3(0, 1, 0)) + SDF.math.Vector3(0, 1, 0)) - joint.set_position(SDFmath.Vector3(-0.0085, 0, 0)) + joint.set_position(SDF.math.Vector3(-0.0085, 0, 0)) return visual_frame, collision_frame, \ visual_servo, collision_servo, joint @@ -391,13 +357,13 @@ def __init__(self, boundaries, orientation: Orientation): def _calculate_box_slot_pos(self, boundaries, slot: Orientation): # boundaries = collision_elem.boundaries if slot == Orientation.SOUTH: - return SDFmath.Vector3(0, boundaries[1][0], 0) + return SDF.math.Vector3(0, boundaries[1][0], 0) elif slot == Orientation.NORTH: - return SDFmath.Vector3(0, boundaries[1][1], 0) + return SDF.math.Vector3(0, boundaries[1][1], 0) elif slot == Orientation.EAST: - return SDFmath.Vector3(boundaries[0][1], 0, 0) + return SDF.math.Vector3(boundaries[0][1], 0, 0) elif slot == Orientation.WEST: - return SDFmath.Vector3(boundaries[0][0], 0, 0) + return SDF.math.Vector3(boundaries[0][0], 0, 0) else: raise RuntimeError('invalid module orientation: {}'.format(slot)) @@ -407,37 +373,37 @@ def _calculate_box_slot_tangent(slot: Orientation): Return slot tangent """ if slot == Orientation.SOUTH: - return SDFmath.Vector3(0, 0, 1) + return SDF.math.Vector3(0, 0, 1) elif slot == Orientation.NORTH: - return SDFmath.Vector3(0, 0, 1) + return SDF.math.Vector3(0, 0, 1) elif slot == Orientation.EAST: - return SDFmath.Vector3(0, 0, 1) + return SDF.math.Vector3(0, 0, 1) elif slot == Orientation.WEST: - return SDFmath.Vector3(0, 0, 1) + return SDF.math.Vector3(0, 0, 1) # elif slot == 4: # # Right face tangent: back face - # return SDFmath.Vector3(0, 1, 0) + # return SDF.math.Vector3(0, 1, 0) # elif slot == 5: # # Left face tangent: back face - # return SDFmath.Vector3(0, 1, 0) + # return SDF.math.Vector3(0, 1, 0) else: raise RuntimeError("Invalid orientation") class BoxSlotJoints(BoxSlot): - def __init__(self, boundaries, orientation: Orientation, offset=(SDFmath.Vector3(), SDFmath.Vector3())): + def __init__(self, boundaries, orientation: Orientation, offset=(SDF.math.Vector3(), SDF.math.Vector3())): self.offset = offset super().__init__(boundaries, orientation) def _calculate_box_slot_pos(self, boundaries, slot: Orientation): # boundaries = collision_elem.boundaries if slot == Orientation.SOUTH: - return SDFmath.Vector3(boundaries[0][0], 0, 0) + self.offset[0] - # return SDFmath.Vector3(0, boundaries[0][0], 0) + return SDF.math.Vector3(boundaries[0][0], 0, 0) + self.offset[0] + # return SDF.math.Vector3(0, boundaries[0][0], 0) elif slot == Orientation.NORTH: - return SDFmath.Vector3(boundaries[0][1], 0, 0) + self.offset[1] - # return SDFmath.Vector3(0, boundaries[0][1], 0) + return SDF.math.Vector3(boundaries[0][1], 0, 0) + self.offset[1] + # return SDF.math.Vector3(0, boundaries[0][1], 0) else: raise RuntimeError('invalid module orientation: {}'.format(slot)) @@ -447,8 +413,8 @@ def _calculate_box_slot_tangent(slot: Orientation): Return slot tangent """ if slot == Orientation.SOUTH: - return SDFmath.Vector3(0, 0, 1) + return SDF.math.Vector3(0, 0, 1) elif slot == Orientation.NORTH: - return SDFmath.Vector3(0, 0, 1) + return SDF.math.Vector3(0, 0, 1) else: raise RuntimeError("Invalid orientation") diff --git a/pyrevolve/tol/manage/robot.py b/pyrevolve/tol/manage/robot.py index f256cc8706..ca5f0ab981 100644 --- a/pyrevolve/tol/manage/robot.py +++ b/pyrevolve/tol/manage/robot.py @@ -1,7 +1,7 @@ from __future__ import absolute_import from __future__ import division -from pyrevolve.sdfbuilder.math import Vector3 +from pyrevolve.SDF.math import Vector3 from pyrevolve.angle import Robot as RvRobot from pyrevolve.util import Time diff --git a/pyrevolve/tol/manage/world.py b/pyrevolve/tol/manage/world.py index 08681b55bd..18e4e1d4b2 100644 --- a/pyrevolve/tol/manage/world.py +++ b/pyrevolve/tol/manage/world.py @@ -7,14 +7,14 @@ from pyrevolve import parser, str_to_address, make_revolve_config from pyrevolve.angle import Tree, Crossover, Mutator, WorldManager # from pyrevolve.angle.robogen.spec import make_planar -from pyrevolve.sdfbuilder import SDF, Model, Pose, Link +# from pyrevolve.sdfbuilder import SDF, Model, Pose, Link from pyrevolve.util import multi_future from .. import logger from .. import constants from .robot import Robot # from ..build import get_builder, to_sdfbot -from ..scenery import Wall +# from ..scenery import Wall # from ..spec import get_tree_generator # Construct a message base from the time. This should make it unique enough @@ -265,15 +265,15 @@ async def attempt_mate(self, ra, rb): return child, ret[1] -class Highlight(Model): - """ - Model to highlight newly inserted robots / selected parents - """ - - def __init__(self, name, color, **kwargs): - super(Highlight, self).__init__(name, static=True, **kwargs) - self.highlight = Link("hl_link") - self.highlight.make_cylinder(10e10, 0.4, 0.001, collision=False) - r, g, b, a = color - self.highlight.make_color(r, g, b, a) - self.add_element(self.highlight) +# class Highlight(Model): +# """ +# Model to highlight newly inserted robots / selected parents +# """ +# +# def __init__(self, name, color, **kwargs): +# super(Highlight, self).__init__(name, static=True, **kwargs) +# self.highlight = Link("hl_link") +# self.highlight.make_cylinder(10e10, 0.4, 0.001, collision=False) +# r, g, b, a = color +# self.highlight.make_color(r, g, b, a) +# self.add_element(self.highlight) diff --git a/pyrevolve/tol/scenery/__init__.py b/pyrevolve/tol/scenery/__init__.py index 038ecec40c..4f29d114a9 100644 --- a/pyrevolve/tol/scenery/__init__.py +++ b/pyrevolve/tol/scenery/__init__.py @@ -1,5 +1,5 @@ from __future__ import absolute_import -from .birth_clinic import BirthClinic +# from .birth_clinic import BirthClinic from .wall import Wall diff --git a/pyrevolve/tol/scenery/wall.py b/pyrevolve/tol/scenery/wall.py index a51a30aeeb..0e7bb1af7c 100644 --- a/pyrevolve/tol/scenery/wall.py +++ b/pyrevolve/tol/scenery/wall.py @@ -1,7 +1,7 @@ from __future__ import absolute_import from pyrevolve.sdfbuilder import Model, Posable, Link -from pyrevolve.sdfbuilder.math import Vector3 +from pyrevolve.SDF.math import Vector3 class Wall(Model): From 50160b74c87f33c73682e9de9599e30a19557740 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Thu, 14 Mar 2019 15:48:39 +0100 Subject: [PATCH 23/49] Bugfixes: - partially present brain would crash the plugin - not updating the name when moving in Hinge connections would create naming conflicts, disabling some robotic joints. - removed deprecated sdfbuilder code --- pyrevolve/SDF/revolve_bot_sdf_builder.py | 8 +- pyrevolve/sdfbuilder/README.md | 25 - pyrevolve/sdfbuilder/__init__.py | 12 - pyrevolve/sdfbuilder/collision.py | 4 - pyrevolve/sdfbuilder/element.py | 193 -------- pyrevolve/sdfbuilder/examples/__init__.py | 0 .../sdfbuilder/examples/complex_align.py | 91 ---- pyrevolve/sdfbuilder/examples/features.py | 84 ---- pyrevolve/sdfbuilder/examples/simple_align.py | 34 -- pyrevolve/sdfbuilder/geometry.py | 16 - pyrevolve/sdfbuilder/inertial.py | 23 - pyrevolve/sdfbuilder/joint/__init__.py | 2 - pyrevolve/sdfbuilder/joint/fixed.py | 38 -- pyrevolve/sdfbuilder/joint/joint.py | 155 ------ pyrevolve/sdfbuilder/link.py | 301 ------------ pyrevolve/sdfbuilder/model.py | 35 -- pyrevolve/sdfbuilder/physics/__init__.py | 2 - pyrevolve/sdfbuilder/physics/friction.py | 92 ---- pyrevolve/sdfbuilder/physics/inertial.py | 114 ----- pyrevolve/sdfbuilder/posable.py | 453 ------------------ pyrevolve/sdfbuilder/sdf.py | 37 -- pyrevolve/sdfbuilder/sensor/__init__.py | 1 - pyrevolve/sdfbuilder/sensor/sensor.py | 48 -- pyrevolve/sdfbuilder/structure/__init__.py | 2 - pyrevolve/sdfbuilder/structure/geometries.py | 334 ------------- pyrevolve/sdfbuilder/structure/structure.py | 146 ------ pyrevolve/sdfbuilder/test/__init__.py | 0 pyrevolve/sdfbuilder/test/test_element.py | 43 -- pyrevolve/sdfbuilder/test/test_link.py | 62 --- pyrevolve/sdfbuilder/test/test_math.py | 27 -- pyrevolve/sdfbuilder/test/test_posable.py | 84 ---- pyrevolve/sdfbuilder/test/test_structure.py | 142 ------ pyrevolve/sdfbuilder/util/__init__.py | 4 - pyrevolve/sdfbuilder/util/funcs.py | 14 - pyrevolve/sdfbuilder/visual.py | 5 - 35 files changed, 4 insertions(+), 2627 deletions(-) delete mode 100644 pyrevolve/sdfbuilder/README.md delete mode 100644 pyrevolve/sdfbuilder/__init__.py delete mode 100644 pyrevolve/sdfbuilder/collision.py delete mode 100644 pyrevolve/sdfbuilder/element.py delete mode 100644 pyrevolve/sdfbuilder/examples/__init__.py delete mode 100644 pyrevolve/sdfbuilder/examples/complex_align.py delete mode 100644 pyrevolve/sdfbuilder/examples/features.py delete mode 100644 pyrevolve/sdfbuilder/examples/simple_align.py delete mode 100644 pyrevolve/sdfbuilder/geometry.py delete mode 100644 pyrevolve/sdfbuilder/inertial.py delete mode 100644 pyrevolve/sdfbuilder/joint/__init__.py delete mode 100644 pyrevolve/sdfbuilder/joint/fixed.py delete mode 100644 pyrevolve/sdfbuilder/joint/joint.py delete mode 100644 pyrevolve/sdfbuilder/link.py delete mode 100644 pyrevolve/sdfbuilder/model.py delete mode 100644 pyrevolve/sdfbuilder/physics/__init__.py delete mode 100644 pyrevolve/sdfbuilder/physics/friction.py delete mode 100644 pyrevolve/sdfbuilder/physics/inertial.py delete mode 100644 pyrevolve/sdfbuilder/posable.py delete mode 100644 pyrevolve/sdfbuilder/sdf.py delete mode 100644 pyrevolve/sdfbuilder/sensor/__init__.py delete mode 100644 pyrevolve/sdfbuilder/sensor/sensor.py delete mode 100644 pyrevolve/sdfbuilder/structure/__init__.py delete mode 100644 pyrevolve/sdfbuilder/structure/geometries.py delete mode 100644 pyrevolve/sdfbuilder/structure/structure.py delete mode 100644 pyrevolve/sdfbuilder/test/__init__.py delete mode 100644 pyrevolve/sdfbuilder/test/test_element.py delete mode 100644 pyrevolve/sdfbuilder/test/test_link.py delete mode 100644 pyrevolve/sdfbuilder/test/test_math.py delete mode 100644 pyrevolve/sdfbuilder/test/test_posable.py delete mode 100644 pyrevolve/sdfbuilder/test/test_structure.py delete mode 100644 pyrevolve/sdfbuilder/util/__init__.py delete mode 100644 pyrevolve/sdfbuilder/util/funcs.py delete mode 100644 pyrevolve/sdfbuilder/visual.py diff --git a/pyrevolve/SDF/revolve_bot_sdf_builder.py b/pyrevolve/SDF/revolve_bot_sdf_builder.py index 6dd078b2d9..2bda53d220 100644 --- a/pyrevolve/SDF/revolve_bot_sdf_builder.py +++ b/pyrevolve/SDF/revolve_bot_sdf_builder.py @@ -49,8 +49,9 @@ def revolve_bot_to_sdf(robot, nice_format): model.append(link) # ADD BRAIN - plugin_elem = _sdf_brain_plugin_conf(robot._brain) - model.append(plugin_elem) + if robot._brain is not None: + plugin_elem = _sdf_brain_plugin_conf(robot._brain) + model.append(plugin_elem) # XML RENDER PHASE # def prettify(rough_string, indent='\t'): @@ -181,8 +182,7 @@ def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, continue my_slot = module.boxslot(Orientation(my_slot)) - if type(module) is not ActiveHingeModule: - slot_chain = '{}{}'.format(slot_chain, my_slot.orientation.short_repr()) + slot_chain = '{}{}'.format(slot_chain, my_slot.orientation.short_repr()) children_links, children_joints = _module_to_sdf(child_module, my_link, my_slot, diff --git a/pyrevolve/sdfbuilder/README.md b/pyrevolve/sdfbuilder/README.md deleted file mode 100644 index 87f9de6229..0000000000 --- a/pyrevolve/sdfbuilder/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# SDF Builder -Pragmatic utility library for building SDF files, written in Python. - -# Why? -Because writing SDF files manually causes a headache, changing little things often requires changes -everywhere. SDF Builder simplifies this by allowing you to align elements with each other rather than -positioning them absolutely. - -# Features -- Wrappers over the most common SDF elements (well.. see examples) -- Simple vector math library based on good old `transformations.py` -- Item alignment, specify how two elements (links, collisions, etc) align with each other rather than setting their exact positions. -- Compound inertia tensors, just add positioned `Collision` elements to - your `Link`s, `Link.calculate_inertial()` will set the correct inertia - tensor for you. - -# Examples -You can find some examples uses in the `sdfbuilder/examples` directory. The best -place to start is probably `features.py` which shows off a bunch of features at -the same time. - -# Notes -I wrote SDF Builder primarily for me, meaning it will be focused on features I found most useful. Of course -I'd be happy to help other people out there use it, so if you have a feature request or find a bug, -do not hesitate to create an issue! diff --git a/pyrevolve/sdfbuilder/__init__.py b/pyrevolve/sdfbuilder/__init__.py deleted file mode 100644 index 5e627bbbf8..0000000000 --- a/pyrevolve/sdfbuilder/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .element import Element -from .model import Model -from .link import Link -from .posable import Pose, Posable, PosableGroup -from .sdf import SDF -from .joint import Joint, FixedJoint, Axis, Limit -from .geometry import Geometry -from .collision import Collision -from .visual import Visual -from .inertial import Inertial - -#TODO restructure this folders as shown in gazebo documentation diff --git a/pyrevolve/sdfbuilder/collision.py b/pyrevolve/sdfbuilder/collision.py deleted file mode 100644 index 6a5a0c04fe..0000000000 --- a/pyrevolve/sdfbuilder/collision.py +++ /dev/null @@ -1,4 +0,0 @@ -from .posable import Posable - -class Collision(Posable): - TAG_NAME = "collision" diff --git a/pyrevolve/sdfbuilder/element.py b/pyrevolve/sdfbuilder/element.py deleted file mode 100644 index 92eae82dfc..0000000000 --- a/pyrevolve/sdfbuilder/element.py +++ /dev/null @@ -1,193 +0,0 @@ -""" -Basic SDF builder element. -""" -from xml.sax.saxutils import quoteattr -from .util import number_format as nf -import copy - - -class Element(object): - """ - Basic element class - """ - - """ - Tag name to override in subclass. If the tag name is None, - the wrapper is not rendered. - """ - TAG_NAME = None - - def __init__(self, **kwargs): - """ - Create a new Element with the given attributes. - - :param tag_name: Can be used to dynamically add a tag name different - from the class tag name. - :param attributes: The element attributes - :param elements: Initial list of sub-elements - :param body: Element body - :return: - """ - self.attributes = kwargs.get("attributes", {}) - self.tag_name = kwargs.get("tag_name", None) - self.body = kwargs.get("body", "") - self.elements = kwargs.get("elements", []) - - def add_element(self, element): - """ - Adds a child element. - :param element: - :return: - """ - self.elements.append(element) - - def add_elements(self, elements): - """ - Convenience method to add multiple elements at once as a list. - :param elements: - :return: - """ - self.elements += elements - - def has_element(self, class_type): - """ - Returns whether or not this element contains a child - element of the given type - :param class_type: - :return: - """ - return len(self.get_elements_of_type(class_type)) > 0 - - def filter_elements(self, func, recursive=False): - """ - Returns all elements of the given class type - :param func: Selector function or class instance - :param recursive: Search recursively - :return: - :rtype: list - """ - elements = [] - - for el in self.elements: - if func(el): - elements.append(el) - - if recursive and hasattr(el, 'filter_elements') and callable(el.filter_elements): - elements += el.filter_elements(func, recursive=recursive) - - return elements - - def get_elements_of_type(self, obj, recursive=False): - """ - Returns all direct child elements of the - given class type. - :param obj: - :param recursive: Search recursively - :return: Elements matching the given type - """ - func = lambda element: isinstance(element, obj) - return self.filter_elements(func, recursive=recursive) - - def remove_elements(self, func, recursive=False): - """ - Removes all elements that match the given filter function. - :param func: Selector function or class instance - :param recursive: Remove recursively from child elements - :return: List of all removed elements - :rtype: list - """ - to_remove = self.filter_elements(func) - for el in to_remove: - self.elements.remove(el) - - if not recursive: - return to_remove - - for el in self.elements: - if hasattr(el, 'remove_elements') and callable(el.remove_elements): - to_remove += el.remove_elements(func, recursive) - - return to_remove - - def remove_elements_of_type(self, obj, recursive=False): - """ - Removes all elements matching the given type. - :param obj: - :param recursive: - :return: - """ - func = lambda element: isinstance(element, obj) - return self.remove_elements(func, recursive) - - def render_attributes(self): - """ - Returns the dictionary of attributes that should - be rendered. You can safely add your own attributes - to this list by calling super when overriding this - method. - :return: - """ - if self.attributes is None: - return {} - return self.attributes.copy() - - def render_elements(self): - """ - Returns the list of elements that should be rendered. - :return: - """ - return self.elements[:] - - def render_body(self): - """ - Returns the string representation of this element's body. - By default, this is the concatenation of all subelements. - You can override this method to call super and add your - own body. - :return: - """ - elements = self.render_elements() - return "\n".join(str(element) for element in elements) + self.body - - def render(self): - """ - Renders this element according to its properties. - :return: - """ - all_attrs = self.render_attributes() - - body = self.render_body() - tag_name = self.get_tag_name() - - if not tag_name: - return body - else: - attrs = " ".join([a+"="+quoteattr( - # Use number format if a number is detected - nf(all_attrs[a]) if isinstance(all_attrs[a], float) else str(all_attrs[a]) - ) for a in all_attrs]) - tag_open = tag_name + " " + attrs if len(attrs) else tag_name - return "<%s />" % tag_open if len(body) == 0 else "<%s>%s" % (tag_open, body, tag_name) - - def get_tag_name(self): - """ - :return: - :rtype: str - """ - return self.TAG_NAME if self.tag_name is None else self.tag_name - - def copy(self, deep=True): - """ - Wrapper over __copy__() - :return: - """ - return copy.deepcopy(self) if deep else copy.copy(self) - - def __str__(self): - """ - Create the XML representation of this element. By default, this - calls `render` without arguments. The way to add just-in-time elements - to a custom element is by overriding this to change the render call. - :return: String XML representation - """ - return self.render() diff --git a/pyrevolve/sdfbuilder/examples/__init__.py b/pyrevolve/sdfbuilder/examples/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pyrevolve/sdfbuilder/examples/complex_align.py b/pyrevolve/sdfbuilder/examples/complex_align.py deleted file mode 100644 index fb85d605ad..0000000000 --- a/pyrevolve/sdfbuilder/examples/complex_align.py +++ /dev/null @@ -1,91 +0,0 @@ -from sdfbuilder import Link, PosableGroup, SDF, Model -from sdfbuilder.math import Vector3 -from math import pi - -link = Link("my_link") - -minibox = Link("my_minibox") - -# Link one is a vertical box -link.make_box(1.0, 2, 2, 4) - -# Minibox is... well, a mini box -minibox.make_box(0.1, 0.2, 0.2, 0.2) - -minibox.align( - # Bottom left corner of minibox - Vector3(-0.1, -0.1, -0.1), - - # Normal vector - Vector3(-0.1, -0.1, -0.1), - - # Tangent vector - Vector3(-0.1, -0.1, 0.2), - - # Top left of link - Vector3(-1, -1, 2), - - # Normal vector - Vector3(0, 0, 1), - - # Tangent vector - Vector3(1, 0, 0), - - # Link to align with - link, - - # All vectors relative to child frame - relative_to_child=True -) - -# Add link and minibox to a posable group so we can move -# them around together. -group = PosableGroup() -group.add_element(link) -group.add_element(minibox) - -# Move and rotate the group to confuse the mechanism -# (this should just be undone at the align later) -group.rotate_around(Vector3(1, 1, 0), 0.1 * pi) -group.translate(Vector3(0.6, 0.7, 0.8)) - -# Create a new, larger box called link 2 -link2 = Link("my_link_2") -link2.make_box(2.0, 4, 3, 3) - -# Translate and rotate just to add some extra complexity -link2.translate(Vector3(0.5, 0.5, 2)) -link2.rotate_around(Vector3(1, 1, 1), 0.5 * pi) - -# Now align the group so its right center lands at -# the top center of link 2 -group.align( - # Center of the right face of box 1 - Vector3(1, 0, 0), - - # Vector normal to box 2 right face - Vector3(1, 0, 0), - - # Vector normal to box 2 top face should align with...(*) - Vector3(0, 0, 1), - - # Center of the top face of box 2 - Vector3(0, 0, 1.5), - - # Vector normal to box 2 top face - Vector3(0, 0, 1), - - # (*)...vector normal to box 2 right face - Vector3(1, 0, 0), - - # the link to align with - link2 -) - -if __name__ == '__main__': - sdf = SDF() - model = Model("my_model") - model.add_element(group) - model.add_element(link2) - sdf.add_element(model) - print(str(sdf)) diff --git a/pyrevolve/sdfbuilder/examples/features.py b/pyrevolve/sdfbuilder/examples/features.py deleted file mode 100644 index eb69f5268e..0000000000 --- a/pyrevolve/sdfbuilder/examples/features.py +++ /dev/null @@ -1,84 +0,0 @@ -from sdfbuilder import SDF, Model, Link, PosableGroup -from sdfbuilder.structure import Box, Cylinder, Collision, Visual, StructureCombination -from sdfbuilder.math import Vector3 -from sdfbuilder.joint import Joint -import math - -# Create a box geometry -box_geom = Box(1.0, 1.0, 1.0, mass=0.5) - -# Create a collision and a visual element using this box geometry -# A collision / visual's pose is determined by its geometry, so -# never use the same geometry object twice or you will get weird -# behavior when rotating. -box_col = Collision("box_collision", box_geom) -box_vis = Visual("box_visual", box_geom.copy()) - -# Add the two to a PosableGroup, so we can conveniently move them -# around together. -box = PosableGroup(elements=[box_col, box_vis]) - -# Now create a Cylinder visual/collision combi. You didn't think that the above would -# be the easiest way to do it now did you? The above was just to show you -# how that works. -cyl_geom = Cylinder(radius=0.25, length=0.5, mass=0.1) -cylinder = StructureCombination("cylinder", cyl_geom) - -# Align the cylinder such that... -cylinder.align( - # .. its bottom .. - Vector3(0, 0, -0.5 * cyl_geom.length), - - # .. and normal vector .. - Vector3(0, 0, -1), - - # .. under rotation of the tangent vector .. - Vector3(0, 1, 0), - - # .. align with the top .. - Vector3(0, 0, 0.5 * box_geom.size[2]), - - # .. and normal vector (other direction) .. - Vector3(0, 0, 1), - - # .. rotation of the tangent vector .. - Vector3(0, 1, 0), - - # .. of the box. - box -) - -# Now, create a link and add both items to it -link = Link("my_link", elements=[box, cylinder]) - -# Calculate the correct inertial properties given -# the collision elements. -link.align_center_of_mass() -link.calculate_inertial() - -# Rotate the link 45 degrees around the x-axis, specified in the parent frame -# just to demonstrate how that works (and to demonstrate align is still -# going to work after the rotation). -link.rotate_around(Vector3(1, 0, 0), math.radians(45), relative_to_child=False) - -# Okay, not sure what this is supposed to be, but let's another wheel-like cylinder in -# a new link, and connect them with joints -wheel_geom = Cylinder(0.75, 0.1, mass=0.1) -wheel = StructureCombination("wheel", wheel_geom) -wheel_link = Link("my_wheel", elements=[wheel]) - -attachment_point = Vector3(0, 0, 0.5 * wheel_geom.length) -wheel_link.align(attachment_point, Vector3(0, 0, 1), Vector3(0, 1, 0), - Vector3(0, 0, 0.5 * box_geom.size[0] + cyl_geom.length), - Vector3(0, 0, 1), Vector3(1, 0, 0), link) - -# Create a joint link, and set its position (which is in the child frame) -joint = Joint("revolute", link, wheel_link, axis=Vector3(0, 0, 1)) -joint.set_position(attachment_point) - -# Create a model and a wrapping SDF element, and output -# Move the model up so it won't intersect with the ground when inserted. -model = Model("my_robot", elements=[link, wheel_link, joint]) -model.set_position(Vector3(0, 0, math.sqrt(0.5))) -sdf = SDF(elements=[model]) -print(str(sdf)) diff --git a/pyrevolve/sdfbuilder/examples/simple_align.py b/pyrevolve/sdfbuilder/examples/simple_align.py deleted file mode 100644 index a63e92fe78..0000000000 --- a/pyrevolve/sdfbuilder/examples/simple_align.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import print_function - -from pyrevolve.sdfbuilder import Link -from pyrevolve.sdfbuilder import Model -from pyrevolve.sdfbuilder import SDF -from pyrevolve.sdfbuilder.math import Vector3 - -# Create two similar boxes -link1 = Link("box1") -link1.make_box(1.0, 0.1, 0.3, 0.5) - -link2 = Link("box2") -link2.make_box(1.0, 0.1, 0.3, 0.5) - -# Align the top of box2 with the front of box1 -link2.align( - Vector3(0, 0, 0.25), - Vector3(0, 0, -1), - Vector3(1, 0, 0), - - Vector3(0, -0.15, 0), - Vector3(0, 1, 0), - Vector3(0, 0, 1), - - link1 -) - -if __name__ == '__main__': - sdf = SDF() - model = Model("my_model") - model.add_element(link1) - model.add_element(link2) - sdf.add_element(model) - print(str(sdf)) diff --git a/pyrevolve/sdfbuilder/geometry.py b/pyrevolve/sdfbuilder/geometry.py deleted file mode 100644 index fa3c8219a6..0000000000 --- a/pyrevolve/sdfbuilder/geometry.py +++ /dev/null @@ -1,16 +0,0 @@ -from .element import Element - -class Geometry(Element): - TAG_NAME = "geometry" - -class Sphere(Element): - TAG_NAME = "sphere" - def __init__(self, radius=1.0): - radius = _Radius(radius=radius) - super().__init__(elements=[radius]) - -class _Radius(Element): - TAG_NAME = "radius" - def __init__(self, radius: float): - body = "{}".format(radius) - super().__init__(body=body) diff --git a/pyrevolve/sdfbuilder/inertial.py b/pyrevolve/sdfbuilder/inertial.py deleted file mode 100644 index 8e45a2fa47..0000000000 --- a/pyrevolve/sdfbuilder/inertial.py +++ /dev/null @@ -1,23 +0,0 @@ -from .element import Element -from .posable import Posable - -class Inertial(Posable): - """ - Children: - - [opt] Mass - - [opt] Inertia - - [opt] Frame - - [opt] Pose - """ - TAG_NAME = "inertial" - -class Mass(Element): - TAG_NAME = "mass" - def __init__(self, value: float): - body = "{}".format(value) - super().__init__(body=body) - -class Inertia(Element): - TAG_NAME = "inertia" - def __init__(self, ixx=1.0, ixy=0.0, ixz=0.0, iyy=1.0, iyz=0.0, izz=1.0): - raise NotImplementedError() #TODO http://sdformat.org/spec?ver=1.6&elem=link diff --git a/pyrevolve/sdfbuilder/joint/__init__.py b/pyrevolve/sdfbuilder/joint/__init__.py deleted file mode 100644 index 9100aebb2b..0000000000 --- a/pyrevolve/sdfbuilder/joint/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .joint import Joint, Axis, Limit -from .fixed import FixedJoint \ No newline at end of file diff --git a/pyrevolve/sdfbuilder/joint/fixed.py b/pyrevolve/sdfbuilder/joint/fixed.py deleted file mode 100644 index d0476672a0..0000000000 --- a/pyrevolve/sdfbuilder/joint/fixed.py +++ /dev/null @@ -1,38 +0,0 @@ -from .joint import Joint, Limit -from ..util import number_format as nf - -class FixedJoint(Joint): - """ - Implements a shortcut fixed joint; SDF currently does not support - such a joint, so this is really a revolute joint with fixed limits. - """ - - def __init__(self, parent, child, axis=None, name=None, cfm=1e-7, erp=0.1): - """ - - :param parent: - :param child: - :return: - """ - super(FixedJoint, self).__init__("revolute", parent, child, axis=axis, name=name) - self.axis.limit = Limit(lower=0, upper=0, effort=0, velocity=0) - self.cfm = cfm - self.erp = erp - - def render_elements(self): - """ - Add error reduction / constraint force mixing parameters. - :return: - """ - els = super(FixedJoint, self).render_elements() - physics = [] - if self.cfm is not None: - physics.append("%s" % nf(self.cfm)) - - if self.erp is not None: - physics.append("%s" % nf(self.erp)) - - if physics: - els += ["" + "".join(physics) + ""] - - return els diff --git a/pyrevolve/sdfbuilder/joint/joint.py b/pyrevolve/sdfbuilder/joint/joint.py deleted file mode 100644 index 188bd2660d..0000000000 --- a/pyrevolve/sdfbuilder/joint/joint.py +++ /dev/null @@ -1,155 +0,0 @@ -from ..link import Link -from ..posable import Posable -from ..element import Element -from ..math import Vector3 -from ..util import number_format as nf - - -class Joint(Posable): - """ - Joint base class, though using the base class should - suffice for most uses. - """ - # Joint tag name - TAG_NAME = "joint" - - # Joint has a pose, but it is not in the parent frame - PARENT_FRAME = False - - def __init__(self, joint_type, parent, child, pose=None, axis=None, axis2=None, name=None, **kwargs): - """ - :param axis: - :param axis2: - :param joint_type: - :type joint_type: str - :param parent: - :type parent: Link - :param child: - :type child: Link - :param name: - :param kwargs: - :return: - """ - if name is None: - name = "joint_"+parent.name+"_"+child.name - - super(Joint, self).__init__(name=name, pose=pose, **kwargs) - - self.parent = parent - self.child = child - self.type = joint_type - - if isinstance(axis, Vector3): - axis = Axis(axis=axis) - - if isinstance(axis2, Vector3): - axis2 = Axis(axis=axis2, tag_name='axis2') - - self.axis = Axis() if axis is None else axis - self.axis2 = axis2 - - def render_elements(self): - """ - Adds joint elements to be rendered - """ - elements = [""+self.parent.name+"", - ""+self.child.name+"", - self.axis] - - if self.axis2 is not None: - self.axis2.tag_name = 'axis2' - elements.append(self.axis2) - - return super(Joint, self).render_elements() + elements - - def render_attributes(self): - """ - Add type to the attributes to be rendered - """ - attrs = super(Joint, self).render_attributes() - attrs['type'] = self.type - return attrs - - -class Axis(Element): - """ - Defines a joint axis - """ - # Note that this might just as well be used for - # an axis2, just override the property in init. - TAG_NAME = "axis" - - def __init__(self, axis=None, limit=None, use_parent_model_frame=False, **kwargs): - """ - :param axis: - :type axis: Vector3 - :param limit: - :type limit: Limit - :param use_parent_model_frame: - :type use_parent_model_frame: bool - """ - super(Axis, self).__init__(**kwargs) - - if axis is None: - axis = Vector3(1, 0, 0) - - self.axis = axis.normalized() - self.limit = limit - self.use_parent_model_frame = use_parent_model_frame - - def render_elements(self): - """ - Add xyz and limit elements - """ - elements = super(Axis, self).render_elements() - - x, y, z = self.axis.x, self.axis.y, self.axis.z - xyz = "%s %s %s" % (nf(x), nf(y), nf(z)) - elements += [xyz, "%d" % self.use_parent_model_frame] - - if self.limit: - elements.append(self.limit) - - return elements - - -class Limit(Element): - """ - Defines a joint axis limit - """ - # Limit tag name - TAG_NAME = "limit" - - def __init__(self, lower=None, upper=None, effort=None, velocity=None, - stiffness=None, dissipation=None, **kwargs): - """ - :param lower: - :param upper: - :param effort: - :param velocity: - :param stiffness: - :param dissipation: - :return: - """ - super(Limit, self).__init__(**kwargs) - - self.lower = lower - self.upper = upper - self.effort = effort - self.velocity = velocity - self.stiffness = stiffness - self.dissipation = dissipation - - def render_elements(self): - """ - Add local properties to the elements to be rendered. - :return: - """ - elements = super(Limit, self).render_elements() - - for attr in ['lower', 'upper', 'effort', 'velocity', 'stiffness', 'dissipation']: - val = getattr(self, attr, None) - if val is not None: - elements.append("<%s>%s" % (attr, nf(val), attr)) - - return elements \ No newline at end of file diff --git a/pyrevolve/sdfbuilder/link.py b/pyrevolve/sdfbuilder/link.py deleted file mode 100644 index 6c5abc5969..0000000000 --- a/pyrevolve/sdfbuilder/link.py +++ /dev/null @@ -1,301 +0,0 @@ -from __future__ import print_function - -import sys -import numpy as np - -from .physics.inertial import transform_inertia_tensor -from .math import Vector3 -from .posable import Posable -from .element import Element -from .physics import Inertial -from .structure import Collision, Visual -from .structure.geometries import Box -from .structure.geometries import Cylinder -from .structure.geometries import Sphere - - -class Link(Posable): - """ - Represents a link object - """ - TAG_NAME = 'link' - - def __init__(self, name, **kwargs): - """ - - :param name: - :param kwargs: - :return: - """ - super(Link, self).__init__(name=name, **kwargs) - - # Only create inertial if required - self.inertial = kwargs.get("inertial", None) - - self.self_collide = kwargs.get("self_collide", None) - - def render_elements(self): - """ - :return: - """ - elements = super(Link, self).render_elements() - - if self.inertial is not None: - elements.append(self.inertial) - - if self.self_collide is not None: - elements.append(Element( - tag_name="self_collide", - body=str(self.self_collide))) - - return elements - - def ensure_inertial(self): - """ - Creates an inertial element if this - link does not have one. - :return: - """ - if self.inertial is None: - self.inertial = Inertial() - - def make_color_script(self, color): - """ - Applies `add_color_script` with the given color to all visuals in this link. - :param color: - :type color: str - :return: - """ - for visual in self.get_elements_of_type(Visual): - visual.add_color_script(color) - - def make_color(self, r, g, b, a): - """ - Applies `add_color` with the given values to all visuals in this link. - :param r: - :param g: - :param b: - :param a: - :return: - """ - for visual in self.get_elements_of_type(Visual): - visual.add_color(r, g, b, a) - - def make_box( - self, - mass, - x, - y, - z, - collision=True, - visual=True, - inertia=True, - name_prefix=""): - """ - Shortcut method to `make_geometry` with a box. - - :param mass: - :param x: - :param y: - :param z: - :param collision: Add a box collision - :param visual: Add a box visual - :param inertia: Set box inertia - :param name_prefix: - :return: Newly created visual and collision elements, if applicable - """ - return self.make_geometry( - geometry=Box(x, y, z, mass), - collision=collision, - visual=visual, - inertia=inertia, - name_prefix=name_prefix) - - def make_cylinder( - self, - mass, - radius, - length, - collision=True, - visual=True, - inertia=True, - name_prefix="", - tube=False, - r1=None): - """ - Shortcut method to `make_geometry` with a cylinder. - :param mass: - :param radius: - :param length: - :param collision: - :param visual: - :param inertia: - :param name_prefix: - :param tube: Whether the cylinder should have a tube inertial - :param r1: If `tube` is `True`, inner radius of the tube - :return: - """ - return self.make_geometry( - geometry=Cylinder(radius, length, mass=mass, tube=tube, r1=r1), - collision=collision, - visual=visual, - inertia=inertia, - name_prefix=name_prefix) - - def make_sphere( - self, - mass, - radius, - collision=True, - visual=True, - inertia=True, - name_prefix="", - solid=True): - """ - Shortcut method to `make_geometry` with a cylinder. - :param mass: - :param radius: - :param collision: - :param visual: - :param inertia: - :param name_prefix: - :param solid: Whether the sphere is solid - :return: - """ - return self.make_geometry( - geometry=Sphere(radius, mass=mass, solid=solid), - collision=collision, - visual=visual, - inertia=inertia, - name_prefix=name_prefix) - - def calculate_inertial(self): - """ - Calculates and sets this Link's inertial properties by - iterating all collision elements inside of it and combining - their Geometry's inertias. - - Note that in order for an inertia tensor to make sense in Gazebo, - the center of mass needs to be aligned with the `Link` center of mass. - This method prints an error if this is currently not the case. - :return: - """ - if not np.allclose(self.get_center_of_mass().norm(), 0): - print("WARNING: calculating inertial for link with nonzero center of mass.", file=sys.stderr) - - collisions = self.get_elements_of_type(Collision, recursive=True) - i_final = np.zeros((3, 3)) - total_mass = 0.0 - for col in collisions: - rotation = col.get_rotation() - position = col.get_position() - geometry = col.geometry - mass = geometry.get_mass() - total_mass += mass - i_final += transform_inertia_tensor( - mass, - geometry.get_inertial().get_matrix(), - position, - rotation - ) - - self.inertial = Inertial.from_mass_matrix(total_mass, i_final) - - def get_center_of_mass(self): - """ - Calculate the center of mass of all the collisions inside - this link. - :return: The center of mass as determined by all the collision geometries - :rtype: Vector3 - """ - collisions = self.get_elements_of_type(Collision, recursive=True) - com = Vector3(0, 0, 0) - total_mass = 0.0 - for col in collisions: - geometry = col.geometry - col_com = col.to_parent_frame(geometry.get_center_of_mass()) - mass = geometry.get_mass() - com += mass * col_com - total_mass += mass - - if total_mass > 0: - com /= total_mass - - return com - - def align_center_of_mass( - self, - types=(Posable,), - recursive=False, - elements=None): - """ - Aligns all elements within this link to get the center of mass - to be at the link's origin. By default, all first level `Posable` - elements are moved, but this can be changed depending on what is needed. - - :param types: Element types to search for and translate, - first argument to `get_elements_of_type`. Defaults to - any posable. - :type types: class-or-tuple - :param recursive: Second argument to `get_elements_of_type`. Defaults to false. - :type recursive: bool - :param elements: Direct iterable of elements to apply transformation to if standard - `get_elements_of_type` does not apply. - :type elements: iterable - :return: - :rtype: The translation used on all elements - """ - translation = -self.get_center_of_mass() - elms = self.get_elements_of_type(types, recursive=recursive) if elements is None else elements - for el in elms: - el.translate(translation) - - return translation - - def make_geometry( - self, - geometry, - collision=True, - visual=True, - inertia=True, - name_prefix=""): - """ - Gives a link a certain geometry by creating visual and collision objects - as desired. This should only be called once for a Link, unless - created items are cleaned up. If `inertia` is set to `True`, the link - will instantiate its inertia tensor to that of the geometry. Note that - the geometry must be fully initialized for this to work, as the inertia - tensor is not updated if the geometry is changed later. - - :param geometry: - :type geometry: Geometry|CompoundGeometry - :param collision: Add a box collision - :type collision: bool - :param visual: Add a box visual - :type visual: bool - :param inertia: Set box inertia - :type inertia: bool - :param name_prefix: Prefix for element names (before "visual" / "collision") - :type name_prefix: str - :return: List of all created items - """ - return_value = [] - - if inertia: - # We're given the inertia tensor as it is relative to the geometry's - # center of mass, and we need it relative to the origin. - rotation = geometry.get_rotation().conjugated() - displacement = -geometry.to_parent_frame(geometry.get_center_of_mass()) - self.inertial = geometry.get_inertial().transformed(displacement, rotation) - - if collision: - col = Collision(name=name_prefix+"collision", geometry=geometry) - return_value.append(col) - self.add_element(col) - - if visual: - vis = Visual(name=name_prefix+"visual", geometry=geometry) - return_value.append(vis) - self.add_element(vis) - - return return_value diff --git a/pyrevolve/sdfbuilder/model.py b/pyrevolve/sdfbuilder/model.py deleted file mode 100644 index 15791648f6..0000000000 --- a/pyrevolve/sdfbuilder/model.py +++ /dev/null @@ -1,35 +0,0 @@ -from .posable import Posable -from .joint import Joint - - -class Model(Posable): - """ - SDF "model" type - """ - TAG_NAME = 'model' - - def __init__(self, name, static=False, **kwargs): - """ - - :param name: - :param kwargs: - :return: - """ - super(Model, self).__init__(name, **kwargs) - self.static = static - - def get_joints(self): - """ - Returns all child elements in this model which are joints. - :return: - """ - return self.get_elements_of_type(Joint) - - def render_elements(self): - """ - Returns all elements plus the "static" property. - :return: - """ - #TODO change static to true/false (minor case) - static = "\n%d\n" % int(self.static) - return super(Model, self).render_elements() + [static] diff --git a/pyrevolve/sdfbuilder/physics/__init__.py b/pyrevolve/sdfbuilder/physics/__init__.py deleted file mode 100644 index 92ee041d5a..0000000000 --- a/pyrevolve/sdfbuilder/physics/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .inertial import Inertial -from .friction import Friction \ No newline at end of file diff --git a/pyrevolve/sdfbuilder/physics/friction.py b/pyrevolve/sdfbuilder/physics/friction.py deleted file mode 100644 index 38762babaa..0000000000 --- a/pyrevolve/sdfbuilder/physics/friction.py +++ /dev/null @@ -1,92 +0,0 @@ -from ..element import Element -from ..util import number_format as nf - - -class Friction(Element): - """ - Friction helper element that outputs for both ODE - and Bullet where applicable. - """ - - TAG_NAME = "friction" - - def __init__( - self, - friction=None, - friction2=None, - fdir1=None, - slip1=None, - slip2=None, - rolling_friction=None, - **kwargs): - """ - - :param friction1: - :param friction2: - :param fdir1: - :type fdir1: Vector3 - :param slip1: - :param slip2: - :param rolling_friction: - :return: - """ - super(Friction, self).__init__(**kwargs) - - self.friction = friction - self.friction2 = friction2 - self.fdir1 = fdir1 - self.slip1 = slip1 - self.slip2 = slip2 - self.rolling_friction = rolling_friction - - # Elements to be rendered for ODE / Bullet; custom elements - # can simply be added here. - self.ode_elements = [] - self.bullet_elements = [] - - def render_elements(self): - """ - Add ODE / Bullet elements to the elements to render. - :return: - """ - elements = super(Friction, self).render_elements() - - ode = Element(tag_name="ode") - ode.add_elements(self.ode_elements) - bullet = Element(tag_name="bullet") - bullet.add_elements(self.bullet_elements) - - if self.friction is not None: - f1 = nf(self.friction) - ode.add_element("{}\n".format(f1)) - bullet.add_element("{}\n".format(f1)) - - if self.friction2 is not None: - f2 = nf(self.friction2) - ode.add_element("{}\n".format(f2)) - bullet.add_element("{}\n".format(f2)) - - if self.fdir1 is not None: - x, y, z = self.fdir1 - fdir = "{} {} {}".format(nf(x), nf(y), nf(z)) - ode.add_element("{}\n".format(fdir)) - bullet.add_element("{}\n".format(fdir)) - - if self.slip1 is not None: - ode.add_element("{}\n".format(nf(self.slip1))) - - if self.slip2 is not None: - ode.add_element("{}\n".format(nf(self.slip2))) - - if self.rolling_friction is not None: - bullet.add_element( - element="{}\n".format( - nf(self.rolling_friction))) - - if len(ode.elements): - elements.append(ode) - - if len(bullet.elements): - elements.append(bullet) - - return elements diff --git a/pyrevolve/sdfbuilder/physics/inertial.py b/pyrevolve/sdfbuilder/physics/inertial.py deleted file mode 100644 index 4a3f829b67..0000000000 --- a/pyrevolve/sdfbuilder/physics/inertial.py +++ /dev/null @@ -1,114 +0,0 @@ -from ..element import Element -from ..util import number_format as nf -import numpy as np - - -def transform_inertia_tensor(mass, tensor, displacement, rotation): - """ - Transforms an inertia tensor to a new reference frame using - the parallel axis theorem. - - https://en.wikipedia.org/wiki/Parallel_axis_theorem - :param mass: - :type mass: float - :param tensor: The inertia tensor as a numpy array - :type tensor: ndarray - :param displacement: The displacement vector `d`, where `d` is - the new center of mass minus the current - center of mass (i.e. traveling `d` from the - current center of mass gives the new center - of mass). - :type displacement: Vector3 - :param rotation: The rotation that takes a point in the current tensor - reference frame to one in the new reference frame. - :type rotation: Quaternion - :return: - """ - # Short hand - i1 = tensor - t1 = displacement - - # Get a matrix for the rotation and calculate the - # rotated inertia tensor. - r1 = rotation.get_matrix()[:3, :3] - it = r1.dot(i1).dot(r1.T) - - # J matrix as on Wikipedia - return it + mass * (t1.dot(t1) * np.eye(3) - np.outer(t1.data, t1.data)) - - -class Inertial(Element): - """ - Convenience class for inertial elements - """ - TAG_NAME = 'inertial' - - def __init__(self, mass=1.0, ixx=0, iyy=0, izz=0, ixy=0, ixz=0, iyz=0, **kwargs): - """ - :param mass: - :param ixx: - :param iyy: - :param izz: - :param ixy: - :param ixz: - :param iyz: - :param kwargs: - """ - super(Inertial, self).__init__(**kwargs) - - self.ixx, self.ixy, self.ixz = (ixx, ixy, ixz) - self.iyy, self.iyz = (iyy, iyz) - self.izz = izz - self.mass = mass - - def render_body(self): - """ - Adds inertia to body before render. - :return: - """ - body = super(Inertial, self).render_body() - body += "%s" % nf(self.mass) - body += ("" - "%s" - "%s" - "%s" - "%s" - "%s" - "%s" - "" % (nf(self.ixx), nf(self.ixy), nf(self.ixz), - nf(self.iyy), nf(self.iyz), nf(self.izz))) - return body - - @staticmethod - def from_mass_matrix(mass, m): - """ - :param mass: - :param m: - :return: - """ - return Inertial(mass, ixx=m[0, 0], ixy=m[0, 1], - ixz=m[0, 2], iyy=m[1, 1], iyz=m[1, 2], - izz=m[2, 2]) - - def transformed(self, displacement, rotation): - """ - Returns a new inertial from this one, which is - transformed to a new reference frame given by a - displacement and rotation vector. - :param displacement: - :param rotation: - :return: - """ - transformed = transform_inertia_tensor(self.mass, self.get_matrix(), - displacement, rotation) - return self.from_mass_matrix(self.mass, transformed) - - def get_matrix(self): - """ - :return: - """ - return np.array([ - [self.ixx, self.ixy, self.ixz], - [self.ixy, self.iyy, self.iyz], - [self.ixz, self.iyz, self.izz] - ]) diff --git a/pyrevolve/sdfbuilder/posable.py b/pyrevolve/sdfbuilder/posable.py deleted file mode 100644 index 8842ab6129..0000000000 --- a/pyrevolve/sdfbuilder/posable.py +++ /dev/null @@ -1,453 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import -import sys -from .element import Element -from .math import Vector3, Quaternion, RotationMatrix -from .util import number_format as nf - - -class Pose(Element): - """ - An SDF "pose" element, which is an x, y, z position plus a roll, pitch, yaw. - """ - - TAG_NAME = 'pose' - - def __init__(self, position=None, rotation=None, **kwargs): - """ - """ - super(Pose, self).__init__(**kwargs) - - # Zero position and identity rotation - self.position = Vector3() if position is None else position - self.rotation = Quaternion() if rotation is None else rotation - - def render_body(self): - """ - :return: - """ - body = super(Pose, self).render_body() - roll, pitch, yaw = self.rotation.get_rpy() - x, y, z = self.position.x, self.position.y, self.position.z - - body += "%s %s %s %s %s %s" % (nf(x), nf(y), nf(z), - nf(roll), nf(pitch), nf(yaw)) - - return body - - -class Posable(Element): - """ - Posable is a base class for elements with a name and a pose. - """ - - # Whether the pose for this element is in the parent frame or not. A - # joint, for instance, has a pose, but it is expressed in the child link - # frame. A parent posable can use this property to decide not to affect this - # element with transformations. - PARENT_FRAME = True - - # It might be desirable to have posable functionality without rendering a - # pose tag (in a compound geometry for instance). In this case, set this - # to false in subclasses. - RENDER_POSE = True - - def __init__(self, name, pose=None, **kwargs): - """ - :param name: - :type name: str - :param pose: Initial pose, origin with zero rotation if not specified. - :type pose: Pose - :param kwargs: - :return: - """ - super(Posable, self).__init__(**kwargs) - - self._pose = Pose() if pose is None else pose - self.name = name - - def set_pose(self, pose): - """ - Shortcut call over `set_position` and `set_rotation` for a given pose. - :param pose: - :type pose: Pose - :return: - """ - self.set_position(pose.position) - self.set_rotation(pose.rotation) - - def set_rotation(self, rotation): - """ - :type rotation: Quaternion - :param rotation: Rotation Quaternion - :return: - - """ - self._pose.rotation = rotation.copy() - - def get_rotation(self): - """ - Return the rotation quaternion of this posable's pose - :return: - :rtype: Quaternion - """ - return self._pose.rotation.copy() - - def set_position(self, position): - """ - :type position: Vector3 - :param position: - :return: - """ - self._pose.position = position.copy() - - def get_position(self): - """ - Return the 3-vector position of this posable's pose - :return: - :rtype: Vector3 - """ - return self._pose.position.copy() - - def get_pose(self): - """ - :return: Pose object. Warning: this is not a copy. - :rtype: Pose - """ - return self._pose - - def translate(self, translation): - """ - :type translation: Vector3 - :param translation: - :return: - """ - self.set_position(self.get_position() + translation) - - def rotate(self, rotation): - """ - :type rotation: Quaternion - :param rotation: - :return: - """ - self.set_rotation(rotation * self.get_rotation()) - - def render_attributes(self): - """ - Adds name to the render attributes - :return: - :rtype: dict - """ - attrs = super(Posable, self).render_attributes() - - if self.name is not None: - attrs.update({"name": self.name}) - - return attrs - - def render_elements(self): - """ - Adds _pose to the render elements - :return: - :rtype: list - """ - pose = self.get_pose() - elmns = [pose] if self.RENDER_POSE and pose else [] - return elmns + super(Posable, self).render_elements() - - def rotate_around(self, axis, angle, relative_to_child=True): - """ - Rotates this posable `angle` degrees around the given directional vector - :param axis: - :type axis: Vector3 - :param angle: - :type angle: float - :param relative_to_child: If true, the axis is expressed in the - child frame. - :type relative_to_child: bool - :return: - """ - if relative_to_child: - axis = self.to_parent_direction(axis) - - quat = Quaternion.from_angle_axis(angle, axis) - self.rotate(quat) - - def to_parent_direction(self, vec): - """ - Returns the given direction vector / rotation quaternion relative to - the parent frame. - :param vec: Vector or quaternion in the local frame - :type vec: Vector3|Quaternion - :return: - :rtype: Vector3|Quaternion - """ - return self.get_rotation() * vec - - def to_local_direction(self, vec): - """ - Returns the given direction vector / rotation quaternion relative to - the local frame - :param vec: Direction vector or orientation in the parent frame - :type vec: Vector3|Quaternion - :return: - :rtype: Vector3|Quaternion - """ - return self.get_rotation().conjugated() * vec - - def to_parent_frame(self, point): - """ - Returns the given point relative to the parent frame - :param point: Point in the local frame - :type point: Vector3 - :return: - :rtype: Vector3 - """ - pos = self.get_position() - return self.to_parent_direction(point) + pos - - def to_local_frame(self, point): - """ - Returns the given point relative to the local frame - :param point: Point in the parent frame - :type point: Vector3 - :return: - :rtype: Vector3 - """ - rot = self.get_rotation().conjugated() - pos = self.get_position() - return rot * (point - pos) - - def to_sibling_frame(self, point, sibling): - """ - Takes a point and converts it to the frame of a sibling - :param point: - :type point: Vector3 - :param sibling: - :type sibling: Posable - :return: The point in the sibling's frame - :rtype: Vector3 - """ - # Do this the easy way: convert to parent, then - # back to sibling - in_parent = self.to_parent_frame(point) - return sibling.to_local_frame(in_parent) - - def to_sibling_direction(self, vec, sibling): - """ - Returns the given direction vector / orientation quaternion relative - to the frame of a sibling - :param vec: Direction vector / orientation quaternion in the child frame - :type vec: Vector3|Quaternion - :param sibling: The sibling posable - :type sibling: Posable - :return: - :rtype: Vector3|Quaternion - """ - in_parent = self.to_parent_direction(vec) - return sibling.to_local_direction(in_parent) - - def align(self, my, my_normal, my_tangent, at, - at_normal, at_tangent, of, relative_to_child=True): - """ - Rotates and translates this posable, such that the ends of the - vectors `my` and `at` touch, aligning such that `my_normal` points in - the opposite direction of `at_normal` and `my_tangent` and - `at_tangent` align. - - The two posables need to be in the same parent frame for this to work. - - You can choose to specify the positions and orientations either in - the parent frame or in the child frame using the final argument to - this method. Be aware that representing orientation vectors in the - parent frame merely means that they are already rotated with respect - to their parent, not translated. - :param my: - :type my: Vector3 - :param my_normal: - :type my_normal: Vector3 - :param my_tangent: - :type my_tangent: Vector3 - :param at: - :type at: Vector3 - :param at_normal: - :type at_normal: Vector3 - :param at_tangent: - :type at_tangent: Vector3 - :param of: - :type of: Posable - :param relative_to_child: - :type relative_to_child: bool - :return: - """ - if not my_normal.orthogonal_to(my_tangent): - raise ValueError("`my_normal` and `my_tangent` should be orthogonal.") - - if not at_normal.orthogonal_to(at_tangent): - raise ValueError("`at_normal` and `at_tangent` should be orthogonal.") - - # Convert all vectors to local frame if not currently there, - # we will need this as reference after rotation. - if not relative_to_child: - my = self.to_local_frame(my) - my_normal = self.to_local_direction(my_normal) - my_tangent = self.to_local_direction(my_tangent) - - at = of.to_local_frame(at) - at_normal = of.to_local_direction(at_normal) - at_tangent = of.to_local_direction(at_tangent) - - # This explains how to do the alignment easily: - # http://stackoverflow.com/questions/21828801/how-to-find-correct-rotation-from-one-vector-to-another - - # We define coordinate systems in which "normal", "tangent" and - # "normal x tangent" are the x, y and z axes ("normal x tangent" is - # the cross product). We then determine two rotation matrices, - # one for the rotation of the standard basis to "my" (R1): - my_x = my_normal.normalized() - my_y = my_tangent.normalized() - my_z = my_x.cross(my_y) - - # Note that we are going to determine an absolute rotation, - # so we need the vectors in the local frame rather than in the parent - # frame. We also determine a rotation matrix for the rotation of - # "at" (R2): - at_x = of.to_parent_direction(-at_normal).normalized() - at_y = of.to_parent_direction(at_tangent).normalized() - at_z = at_x.cross(at_y) - - # For which we do use the parent frame. We now want to provide the - # rotation matrix from R1 to R2. The easiest way to visualize this is - # if we first perform the inverse rotation from R1 back to the - # standard basis, and then rotate to R2. - r1 = RotationMatrix() - r2 = RotationMatrix() - - # Warning: `RotationMatrix` is a Matrix4 that can potentially do - # translations. We want to assign the first block of these matrices - # only. Syntax is numpy arrays. - r1[:3, 0], r1[:3, 1], r1[:3, 2] = my_x, my_y, my_z - r2[:3, 0], r2[:3, 1], r2[:3, 2] = at_x, at_y, at_z - - # The columns of r1 are orthonormal, so we can simply transpose the - # matrix to get the inverse rotation - r1.transpose() - - # The final rotation is the inverse of r1, followed by r2 - # (left multiplication) - rotation = r2 * r1 - self.set_rotation(rotation.get_quaternion()) - - my_parent_normal = self.to_parent_direction(my_normal) - at_parent_normal = of.to_parent_direction(-at_normal) - if not my_parent_normal.parallel_to(at_parent_normal): - print("Vector angle: %f" % my_parent_normal.angle(at_parent_normal), file=sys.stderr) - raise AssertionError("Normal vectors failed to align!") - - parent_tangent = self.to_parent_direction(my_tangent) - at_parent_tangent = of.to_parent_direction(at_tangent) - if not parent_tangent.parallel_to(at_parent_tangent): - print("Vector angle: %f" % parent_tangent.angle(at_parent_tangent), file=sys.stderr) - raise AssertionError("Tangent vectors failed to align!") - - # Finally, translate so that `my` lands at `at` - my_pos = self.to_parent_frame(my) - at_pos = of.to_parent_frame(at) - translation = at_pos - my_pos - self.translate(translation) - - -class PosableGroup(Posable): - """ - A PosableGroup allows grouping a set of posables with the same parent - without introducing a new coordinate frame (i.e. without putting - them inside a link or a model). This lets you conveniently move - the items within the group together, whilst their position remains - relative to the groups parent. - """ - - # We don't want to render outer posable group - TAG_NAME = None - - # Do not render the `Pose` element - RENDER_POSE = False - - def __init__(self, name=None, pose=None, **kwargs): - """ - Overrides init to make name optional, it is not useful - for posable groups. - :param name: - :type name: str - :param pose: - :type pose: Pose - :param kwargs: - :return: - """ - super(PosableGroup, self).__init__(name=name, pose=pose, **kwargs) - - def set_position(self, position): - """ - Sets the position of this posable group, translating all the - posables within it. - - :param position: - :type position: Vector3 - :return: - """ - translation = position - self.get_position() - - # Get posables from the element list. It is good practice - # to only have posables here, but we can easily make sure. - posables = self.get_affected_posables() - - for posable in posables: - posable.translate(translation) - - # Store root position - super(PosableGroup, self).set_position(position) - - def get_affected_posables(self): - """ - Returns all sub elements which are posable and have their - pose in the parent frame. - :return: - """ - return [posable for posable in self.elements - if isinstance(posable, Posable) and posable.PARENT_FRAME] - - def set_rotation(self, rotation): - """ - Set the rotation of this posable group, moving all the posables - within it accordingly. - - :param rotation: - :type rotation: Quaternion - :return: - """ - root_position = self.get_position() - inv_rotation = self.get_rotation().conjugated() - - posables = self.get_affected_posables() - for posable in posables: - # Get the position and rotation of the child relative to this - # posable's root (i.e. as if the posable was in [0, 0] with no - # rotation) - orig_position = inv_rotation * (posable.get_position() - root_position) - - # The original rotation follows from multiplying the child's - # rotation with this group's inverse rotation - orig_rotation = inv_rotation * posable.get_rotation() - - # New position means rotating the original point according to the - # new rotation, and adding the current position - new_position = (rotation * orig_position) + root_position - - # New rotation is acquired by multiplying the new rotation with - # the existing rotation - new_rotation = rotation * orig_rotation - - posable.set_position(new_position) - posable.set_rotation(new_rotation) - - # We should still store our own root rotation - super(PosableGroup, self).set_rotation(rotation) diff --git a/pyrevolve/sdfbuilder/sdf.py b/pyrevolve/sdfbuilder/sdf.py deleted file mode 100644 index 05d4d86d4b..0000000000 --- a/pyrevolve/sdfbuilder/sdf.py +++ /dev/null @@ -1,37 +0,0 @@ -from .element import Element - - -class SDF(Element): - """ - Root SDF element - """ - TAG_NAME = "sdf" - - def __init__(self, version="1.5", encoding=None, **kwargs): - """ - - :param version: - :param kwargs: - :return: - """ - super(SDF, self).__init__(**kwargs) - self.version = version - self.encoding = encoding - - def render_attributes(self): - """ - Adds version attribute - :return: - """ - attrs = super(SDF, self).render_attributes() - attrs["version"] = self.version - return attrs - - def render(self): - """ - Adds XML header to render - :return: - """ - body = super(SDF, self).render() - enc = (' encoding="%s"' % self.encoding) if self.encoding else "" - return ("\n" % enc)+body \ No newline at end of file diff --git a/pyrevolve/sdfbuilder/sensor/__init__.py b/pyrevolve/sdfbuilder/sensor/__init__.py deleted file mode 100644 index cc5bac568e..0000000000 --- a/pyrevolve/sdfbuilder/sensor/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .sensor import Sensor \ No newline at end of file diff --git a/pyrevolve/sdfbuilder/sensor/sensor.py b/pyrevolve/sdfbuilder/sensor/sensor.py deleted file mode 100644 index ca09a47a2a..0000000000 --- a/pyrevolve/sdfbuilder/sensor/sensor.py +++ /dev/null @@ -1,48 +0,0 @@ -from ..posable import Posable -from ..element import Element -from ..util import number_format as nf - - -class Sensor(Posable): - """ - Sensor base class, using the base class should - suffice in most cases since writing the XML is - just as easy. - """ - # Sensor tag name - TAG_NAME = "sensor" - - def __init__(self, name, sensor_type, pose=None, update_rate=None, always_on=True, **kwargs): - """ - :param name: - :param sensor_type: - :param pose: - :param update_rate: - :param always_on: - :param kwargs: - """ - super(Sensor, self).__init__(name, pose, **kwargs) - self.update_rate = update_rate - self.always_on = always_on - self.type = sensor_type - - def render_attributes(self): - """ - Add type to the attributes to be rendered - """ - attrs = super(Sensor, self).render_attributes() - attrs['type'] = self.type - return attrs - - def render_elements(self): - """ - :return: - """ - els = [] - if self.update_rate is not None: - els.append(Element(tag_name="update_rate", body=nf(self.update_rate))) - - if self.always_on is not None: - els.append(Element(tag_name="always_on", body="1" if self.always_on else "0")) - - return super(Sensor, self).render_elements() + els diff --git a/pyrevolve/sdfbuilder/structure/__init__.py b/pyrevolve/sdfbuilder/structure/__init__.py deleted file mode 100644 index 6dbd67a0c8..0000000000 --- a/pyrevolve/sdfbuilder/structure/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .structure import Structure, Visual, Collision, Material, StructureCombination -from .geometries import Geometry, CompoundGeometry, Box, Cylinder, Sphere, Mesh diff --git a/pyrevolve/sdfbuilder/structure/geometries.py b/pyrevolve/sdfbuilder/structure/geometries.py deleted file mode 100644 index 3b851faba8..0000000000 --- a/pyrevolve/sdfbuilder/structure/geometries.py +++ /dev/null @@ -1,334 +0,0 @@ -""" -Simple geometries such as box, cylinder and sphere. -""" -from __future__ import division -from ..math import Vector3 -from ..posable import Posable, PosableGroup -from ..util import number_format as nf -from ..physics.inertial import Inertial, transform_inertia_tensor -import numpy as np - - -class BaseGeometry(object): - """ - Defines an interface for geometries. - """ - - def get_inertial(self): - """ - If implemented in the base class, returns an inertial corresponding to - this simple shape. This inertial can then be used in a link. - - The inertial is relative to the geometry's center of mass. - :return: - :rtype: Inertial - """ - raise NotImplementedError("`get_inertial` is not implemented.") - - def get_center_of_mass(self): - """ - Return the center of mass for this geometry. - - :return: Center of mass in the local frame. - :rtype: Vector3 - """ - raise NotImplementedError("`get_center_of_mass` is not implemented.") - - def get_mass(self): - """ - Return the mass of this geometry. - :return: Mass - :rtype: float - """ - raise NotImplementedError("`get_mass` is not implemented.") - - -class Geometry(Posable, BaseGeometry): - """ - Base geometry class. We've made this posable for a convenient use with - the CompoundGeometry class. - """ - TAG_NAME = 'geometry' - RENDER_POSE = False - - def __init__(self, mass=None, pose=None, **kwargs): - """ - :param pose: - :param mass: Mass of this geometry. If you're only using it - as a visual, you can probably leave this empty. - :type mass: float - :return: - """ - super(Geometry, self).__init__(None, pose, **kwargs) - self.mass = mass - - def get_mass(self): - """ - Return the mass of this geometry. - """ - return self.mass - - def get_center_of_mass(self): - """ - For most geometries, the center of mass will simply lie at the origin. - This is therefore returned by default for simple geometries. - """ - return Vector3(0, 0, 0) - - -class CompoundGeometry(PosableGroup, BaseGeometry): - """ - A helper class for combining multiple geometries - """ - - def get_mass(self): - """ - Returns the total mass of all geometries. - :return: - """ - return sum(geometry.get_mass() for geometry in self.geometries) - - def get_center_of_mass(self): - """ - :return: - :rtype: Vector3 - """ - total_mass = 0.0 - center_mass = Vector3(0, 0, 0) - for geometry in self.geometries: - # Get the geometry's center of mass and translate it to the - # frame of the posable. Since the `CompoundGeometry` is a - # `PosableGroup`, this can be achieved by sibling translation. - geom_center = geometry.to_sibling_frame( - geometry.get_center_of_mass(), - self - ) - - mass = geometry.get_mass() - total_mass += mass - center_mass += mass * geom_center - - return center_mass / total_mass - - def __init__(self, **kwargs): - """ - CompoundGeometry constructor - """ - super(CompoundGeometry, self).__init__(**kwargs) - self.geometries = [] - - def add_geometry(self, geometry): - """ - Adds a geometry to the group along with all the possible - arguments required to get its inertia. - :param geometry: - :type geometry: Geometry|CompoundGeometry - """ - self.geometries.append(geometry) - - def get_inertial(self): - """ - Returns the inertia tensor for all the combined positioned - geometries in this compound geometry. - - Uses the first part of this question: - http://physics.stackexchange.com/questions/17336/how-do-you-combine-two-rigid-bodies-into-one - """ - # Calculate the center of mass - center_mass = self.get_center_of_mass() - - # The final inertia matrix - i_final = np.zeros((3, 3)) - for geometry in self.geometries: - # We need the center of mass again - geom_center = geometry.to_sibling_frame( - geometry.get_center_of_mass(), - self - ) - - # We have the inertia tensor in the object's frame, - # i.e. as if it isn't rotated. We want to return it - # in this object's frame, i.e. as if the compound isn't - # rotated. The rotation for that is the total rotation - # of the object, with the rotation of the compound cancelled - # out. Conceptually, we now start with the inertia tensor - # as if the object has zero rotation, and calculate the tensor - # resulting from rotating the object around its actual rotation. - rotation = self.get_rotation().conjugated() * geometry.get_rotation() - j1 = transform_inertia_tensor( - geometry.get_mass(), - geometry.get_inertial().get_matrix(), - center_mass - geom_center, - rotation - ) - i_final += j1 - - total_mass = self.get_mass() - inertial = Inertial.from_mass_matrix(total_mass, i_final) - return inertial - - -class Box(Geometry): - """ - Represents a box geometry, i.e. - a geometry *with* a box object - """ - def __init__(self, x, y, z, mass=None, **kwargs): - """ - - :param x: - :param y: - :param z: - :param kwargs: - :return: - """ - super(Box, self).__init__(mass=mass, **kwargs) - self.size = (x, y, z) - - def render_elements(self): - """ - Add box tag - :return: - """ - elements = super(Box, self).render_elements() - - x, y, z = self.size - elements.append("%s %s %s" % (nf(x), nf(y), nf(z))) - return elements - - def get_inertial(self): - """ - Return solid box inertial - """ - mass = self.get_mass() - r = mass / 12.0 - x, y, z = self.size - ixx = r * (y**2 + z**2) - iyy = r * (x**2 + z**2) - izz = r * (x**2 + y**2) - return Inertial(mass=mass, ixx=ixx, iyy=iyy, izz=izz) - - -class Cylinder(Geometry): - """ - Cylinder geometry - """ - def __init__(self, radius, length, mass=None, tube=False, r1=None, **kwargs): - """ - Cylinder geometry. The cylinder is defined as being a circle - with the given radius in x / y directions, whilst having the - given length in the z direction. - - :param radius: (x and y directions) - :type radius: float - :param length: Length (z-direction) - :type length: float - :param tube: If true, the inertial properties for this geometry will be those of a tube. - :type tube: bool - :param r1: If `tube` is true, the radius of the inner cylinder of the tube - :param kwargs: - """ - super(Cylinder, self).__init__(mass=mass, **kwargs) - self.tube, self.r1 = tube, r1 - self.radius, self.length = radius, length - - def render_elements(self): - """ - Add box tag - :return: - """ - elements = super(Cylinder, self).render_elements() - - elements.append("%s%s" - % (nf(self.radius), nf(self.length))) - return elements - - def get_inertial(self): - """ - Return cylinder inertial. You can specify `tube=True` alongside - the radius of the center hole to get the inertia of a cylindrical tube. - """ - if self.tube: - if self.r1 is None: - raise AttributeError("Tube inertia requires `r1` radius for cylinder.") - - r = self.radius**2 + self.r1**2 - else: - r = self.radius**2 - - mass = self.get_mass() - ixx = (3 * r + self.length**2) * mass / 12.0 - izz = 0.5 * mass * r - return Inertial(mass=mass, ixx=ixx, iyy=ixx, izz=izz) - - -class Sphere(Geometry): - """ - Sphere geometry - """ - def __init__(self, radius, mass=None, solid=True, **kwargs): - """ - Create a new sphere geometry - :param radius: (x and y directions) - :type radius: float - :param solid: Whether this is a solid or hollow sphere, influences only inertia - :type solid: bool - :param kwargs: - """ - super(Sphere, self).__init__(mass=mass, **kwargs) - self.solid = solid - self.radius = radius - - def render_elements(self): - """ - Add box tag - :return: - """ - elements = super(Sphere, self).render_elements() - - elements.append("%s" - % nf(self.radius)) - return elements - - def get_inertial(self): - """ - Return cylinder inertial - """ - mass = self.mass - frac = 5.0 if self.solid else 3.0 - ixx = (2 * mass * self.radius**2) / frac - return Inertial(mass=mass, ixx=ixx, iyy=ixx, izz=ixx) - - -class Mesh(Geometry): - """ - Mesh geometry. Since we cannot determine the inertia - of meshes here, you need to extend this class with - the full geometry methods in order to use this for - anything else than a visual. - """ - - def __init__(self, uri, scale=None, **kwargs): - super(Mesh, self).__init__(**kwargs) - self.uri = uri - self.scale = scale - - def render_elements(self): - """ - Adds the mesh geometry - :return: - """ - elements = super(Mesh, self).render_elements() - - if self.scale is not None: - try: - x, y, z = self.scale - except TypeError: - x = y = z = self.scale - - scale = "%s %s %s" % (nf(x), nf(y), nf(z)) - else: - scale = "" - - elements.append("%s%s" % (self.uri, scale)) - return elements diff --git a/pyrevolve/sdfbuilder/structure/structure.py b/pyrevolve/sdfbuilder/structure/structure.py deleted file mode 100644 index 014c4aef82..0000000000 --- a/pyrevolve/sdfbuilder/structure/structure.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -Collision / visual and geometry like classes -""" -from ..posable import Posable -from ..posable import PosableGroup -from ..element import Element -from .geometries import CompoundGeometry - - -class Structure(Posable): - """ - Base class for collision/visual elements - """ - def __init__(self, name, geometry, **kwargs): - """ - - :param name: - :param geometry: - :type geometry: CompoundGeometry|Geometry - :param kwargs: - :return: - """ - super(Structure, self).__init__(name, **kwargs) - - # Only the geometry of a structure has a pose - self._pose = None - self.geometry = geometry - - # Delegate all position and rotation calls to the geometry object - def set_position(self, position): - self.geometry.set_position(position) - - def set_rotation(self, rotation): - self.geometry.set_rotation(rotation) - - def get_position(self): - return self.geometry.get_position() - - def get_rotation(self): - return self.geometry.get_rotation() - - def get_pose(self): - return self.geometry.get_pose() - - def render_elements(self): - """ - :return: - """ - return super(Structure, self).render_elements() + [self.geometry] - - def render(self): - """ - Override render to create a list of sub elements instead of a - parent element if the child is a compound. - :return: - """ - if not isinstance(self.geometry, CompoundGeometry): - return super(Structure, self).render() - - geometries = self.geometry.geometries - - elements = [] - for i in range(len(geometries)): - # Create a new element of self-type that inherits - # all this structure's properties. - # Note that if one of these geometries is again a compound - # geometry, its render method will do the same thing as this - # and produce a list of objects. - elements.append(self.__class__( - name=self.name+"_"+str(i), - geometry=geometries[i], - elements=self.elements, - body=self.body, - attributes=self.attributes - )) - - return "".join(str(el) for el in elements) - - -class Collision(Structure): - TAG_NAME = 'collision' - - -class Visual(Structure): - TAG_NAME = 'visual' - - def add_color_script(self, color): - """ - Adds a new Material element to this Visual that has a color - script for the given color. - :param color: One of Gazebo's supported colors, see - `https://bitbucket.org/osrf/gazebo/src/52abccccfec20a5f96da9dc0aeda830b48a66269/media/materials/scripts/gazebo.material?at=default` - :return: - """ - if color.index('/') < 0: - color = "Gazebo/"+color.title() - - self.add_element(Material( - body="\n" - "".format(color))) - - def add_color(self, r, g, b, a=1): - """ - Simple color setter that adds a `Material` element with the - ambient / diffuse values at the given r,g,b,a values and - specular set to (0.1, 0.1, 0.1, a). - :return: - """ - color = '{r} {g} {b} {a}'.format(r=r, g=g, b=b, a=a) - specular = '0.1 0.1 0.1 {}'.format(a) - self.add_element(Material( - body="\n" - " {ambient}\n" - " {diffuse}\n" - " {specular}\n".format( - ambient=color, - diffuse=color, - specular=specular))) - - -class StructureCombination(PosableGroup): - """ - PosableGroup wrapper over a visual and a collision element - that share a Geometry. - """ - - def __init__(self, name, geometry, **kwargs): - """ - :param name: - :type name: str - :param geometry: - :type geometry: Geometry - :param kwargs: - :return: - """ - super(StructureCombination, self).__init__(name, **kwargs) - self.geometry = geometry - self.collision = Collision(name+"_collision", geometry.copy()) - self.visual = Visual(name+"_visual", geometry.copy()) - self.add_elements([self.collision, self.visual]) - - -class Material(Element): - TAG_NAME = 'material' diff --git a/pyrevolve/sdfbuilder/test/__init__.py b/pyrevolve/sdfbuilder/test/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pyrevolve/sdfbuilder/test/test_element.py b/pyrevolve/sdfbuilder/test/test_element.py deleted file mode 100644 index fef778ff8c..0000000000 --- a/pyrevolve/sdfbuilder/test/test_element.py +++ /dev/null @@ -1,43 +0,0 @@ -from sdfbuilder import Element -import unittest - - -class A(Element): - pass - - -class B(Element): - pass - - -class C(B): - pass - - -class TestElement(unittest.TestCase): - def test_filter(self): - root = Element() - sub1 = A() - sub2 = B() - - sub1a = A() - sub1b = B() - sub1c = C() - sub2a = A() - sub2b = B() - - sub2ab = B() - - sub1.add_elements([sub1a, sub1b, sub1c]) - sub2.add_elements([sub2a, sub2b]) - sub2a.add_element(sub2ab) - root.add_elements([sub1, sub2]) - - check = root.get_elements_of_type(B, recursive=False) - self.assertEquals([sub2], check) - - check = root.get_elements_of_type(B, recursive=True) - self.assertEquals([sub1b, sub1c, sub2, sub2ab, sub2b], check) - -if __name__ == '__main__': - unittest.main() diff --git a/pyrevolve/sdfbuilder/test/test_link.py b/pyrevolve/sdfbuilder/test/test_link.py deleted file mode 100644 index 40f9207225..0000000000 --- a/pyrevolve/sdfbuilder/test/test_link.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import absolute_import -import math -from sdfbuilder.math import Vector3 -from sdfbuilder import Link -import unittest -from sdfbuilder.structure import Collision, Box - - -class TestLink(unittest.TestCase): - def test_link_inertia(self): - """ - A similar test to what is done in structure.py to test - compound inertia, only now we do it in a link. - :return: - """ - # First, the comparison inertial - total_mass = 100 - simple_box = Box(4, 8, 12, mass=total_mass) - i1 = simple_box.get_inertial() - - # Same split as in structure.py test, only now - # we're making sure it is distributed around the - # origin since box inertial above is relative to - # its center of mass - link = Link("test_link") - y_axis = Vector3(0, 1, 0) - deg90 = 0.5 * math.pi - - # Split 5 / 7 in z-direction - frac = total_mass / 12.0 - total_up = 5 * frac - total_down = 7 * frac - - # We split the upper part 6 / 2 in the y-direction - # and align in the center. - frac_up = total_up / 8.0 - sub1 = Collision("sub1", geometry=Box(5, 6, 4, mass=6 * frac_up)) - sub1.rotate_around(y_axis, deg90) - sub1.translate(Vector3(0, 1, 3.5)) - link.add_element(sub1) - - sub2 = Collision("sub2", geometry=Box(5, 2, 4, mass=2 * frac_up)) - sub2.rotate_around(y_axis, deg90) - sub2.translate(Vector3(0, -3, 3.5)) - link.add_element(sub2) - - sub3 = Collision("sub3", geometry=Box(4, 8, 7, mass=total_down)) - sub3.translate(Vector3(0, 0, -2.5)) - link.add_element(sub3) - - link.calculate_inertial() - self.assertEqualTensors(i1, link.inertial) - - def assertEqualTensors(self, i1, i2): - self.assertAlmostEquals(i1.ixx, i2.ixx) - self.assertAlmostEquals(i1.ixy, i2.ixy) - self.assertAlmostEquals(i1.ixz, i2.ixz) - self.assertAlmostEquals(i1.iyy, i2.iyy) - self.assertAlmostEquals(i1.iyy, i2.iyy) - -if __name__ == '__main__': - unittest.main() diff --git a/pyrevolve/sdfbuilder/test/test_math.py b/pyrevolve/sdfbuilder/test/test_math.py deleted file mode 100644 index b1a14c2a39..0000000000 --- a/pyrevolve/sdfbuilder/test/test_math.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Math tests, this clearly needs more stuff. -""" -import unittest -from sdfbuilder.math import Quaternion - - -class TestMath(unittest.TestCase): - """ - Tests the math components - """ - - def test_euler_angles(self): - """ - Tests Euler angles from a quaternion that used to fail. Other Euler - angles are tested from visual inspection in the `posable` test case. - :return: - """ - q = Quaternion(-0.5, 0.5, 0.5, 0.5) - roll, pitch, yaw = q.get_rpy() - self.assertAlmostEquals(-1.5707963267948968, roll, msg="Invalid roll.") - self.assertAlmostEquals(-1.5707963267948968, pitch, msg="Invalid roll.") - self.assertAlmostEquals(0, yaw, msg="Invalid yaw") - - -if __name__ == '__main__': - unittest.main() diff --git a/pyrevolve/sdfbuilder/test/test_posable.py b/pyrevolve/sdfbuilder/test/test_posable.py deleted file mode 100644 index 99dbe45d83..0000000000 --- a/pyrevolve/sdfbuilder/test/test_posable.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Tests a relatively complex align feature -""" -from __future__ import absolute_import -import unittest -from sdfbuilder import Link -from sdfbuilder.math import Vector3 -from math import pi, sqrt - - -class TestPosable(unittest.TestCase): - """ - Tests various aspects of the Posable class, such as - alignment and rotation. - """ - def test_direction_conversion(self): - """ - Tests converting vectors between direction frames. - :return: - """ - link = Link("my_link") - point = Vector3(0, 0, 1) - - # At this point, it should be the same in the - # parent direction - x, y, z = link.to_parent_direction(point) - self.assertAlmostEqual(x, point.x) - self.assertAlmostEqual(y, point.y) - self.assertAlmostEqual(z, point.z) - - # Now rotate the link 90 degrees over (1, 1, 0), - # this should cause the local vector (0, 1, 1) - # to land at 0.5 * [sqrt(2), -sqrt(2), 0] - link.rotate_around(Vector3(1, 1, 0), 0.5 * pi, relative_to_child=False) - hs2 = 0.5 * sqrt(2) - x, y, z = link.to_parent_direction(point) - self.assertAlmostEqual(x, hs2) - self.assertAlmostEqual(y, -hs2) - self.assertAlmostEqual(z, 0) - - def test_complex_align(self): - """ - Create a structure with some complicated rotation / - align transformations and tests the resulting positions. - :return: - """ - from sdfbuilder.examples.complex_align import link, minibox, link2 - - # Now, the asserts. These positions have been verified through - # visual inspection and then copied from the SDF - we might thus - # say this functions as a regression test. - - # First, the position of the first link. - roll, pitch, yaw = link.get_rotation().get_rpy() - x, y, z = link.get_position() - self.assertAlmostEqual(x, 2.776709, msg="Incorrect x position.") - self.assertAlmostEqual(y, -0.1100423, msg="Incorrect y position.") - self.assertAlmostEqual(z, 2.8333333, msg="Incorrect z position.") - self.assertAlmostEqual(roll, 1.8325957145940461, msg="Incorrect roll.") - self.assertAlmostEqual(pitch, 0.3398369, msg="Incorrect pitch.") - self.assertAlmostEqual(yaw, 2.8797932657906435, msg="Incorrect yaw.") - - # Now, position of the minibox - roll, pitch, yaw = minibox.get_rotation().get_rpy() - x, y, z = minibox.get_position() - self.assertAlmostEqual(x, 4.655811238272279, msg="Incorrect x position.") - self.assertAlmostEqual(y, 1.291709623134523, msg="Incorrect y position.") - self.assertAlmostEqual(z, 1.7256842193500852, msg="Incorrect z position.") - self.assertAlmostEqual(roll, -2.1377528428632186, msg="Incorrect roll.") - self.assertAlmostEqual(pitch, -0.6933926357494202, msg="Incorrect pitch.") - self.assertAlmostEqual(yaw, 1.0364317772632718, msg="Incorrect yaw.") - - # Finally, position of link2 - roll, pitch, yaw = link2.get_rotation().get_rpy() - x, y, z = link2.get_position() - self.assertAlmostEqual(x, 0.5, msg="Incorrect x position.") - self.assertAlmostEqual(y, 0.5, msg="Incorrect y position.") - self.assertAlmostEqual(z, 2, msg="Incorrect z position.") - self.assertAlmostEqual(roll, 1.2199169159226388, msg="Incorrect roll.") - self.assertAlmostEqual(pitch, 0.24650585550379217, msg="Incorrect pitch.") - self.assertAlmostEqual(yaw, 1.2199169159226388, msg="Incorrect yaw.") - -if __name__ == '__main__': - unittest.main() diff --git a/pyrevolve/sdfbuilder/test/test_structure.py b/pyrevolve/sdfbuilder/test/test_structure.py deleted file mode 100644 index ba69fe20f1..0000000000 --- a/pyrevolve/sdfbuilder/test/test_structure.py +++ /dev/null @@ -1,142 +0,0 @@ -from __future__ import absolute_import -import unittest -import math -from sdfbuilder.math import Vector3 -from sdfbuilder.structure.geometries import Box, CompoundGeometry - - -class TestGeometry(unittest.TestCase): - """ - Tests mostly the compound geometry - """ - def test_box_inertia(self): - """ - """ - x, y, z = 10, 20, 30 - mass = 250 - box = Box(x, y, z, mass=mass) - inert = box.get_inertial() - - self.assertAlmostEquals(inert.ixx, mass * (y**2 + z**2) / 12.0) - self.assertAlmostEquals(inert.iyy, mass * (x**2 + z**2) / 12.0) - self.assertAlmostEquals(inert.izz, mass * (x**2 + y**2) / 12.0) - self.assertAlmostEquals(inert.ixy, 0) - self.assertAlmostEquals(inert.ixz, 0) - self.assertAlmostEquals(inert.iyz, 0) - - def test_compound_center_mass(self): - """ - Born from a numerical oddity in the compound inertial - test; checks the center of mass for a compound geometry. - """ - compound = CompoundGeometry() - y_axis = Vector3(0, 1, 0) - deg90 = 0.5 * math.pi - - frac_up = 57.5 - sub1 = Box(5, 6, 4, mass=6 * frac_up) - sub1.rotate_around(y_axis, deg90) - sub1.translate(Vector3(0, 1, 2.5)) - compound.add_geometry(sub1) - - sub2 = Box(5, 2, 4, mass=2 * frac_up) - sub2.rotate_around(y_axis, deg90) - sub2.translate(Vector3(0, -3, 2.5)) - compound.add_geometry(sub2) - - x, y, z = compound.get_center_of_mass() - self.assertAlmostEquals(x, 0) - self.assertAlmostEquals(y, 0) - self.assertAlmostEquals(z, 2.5) - - def test_compound_inertia(self): - """ - Performs a simple compound geometry inertia check - by comparing two aligned boxes with one big box, - with the same mass distribution and total mass. - """ - total_mass = 100 - simple_box = Box(4, 8, 12, mass=total_mass) - i1 = simple_box.get_inertial() - - # # First the most trivial case - two same size - # # boxes with half the mass. - compound = CompoundGeometry() - sub1 = Box(4, 8, 12, mass=0.5 * total_mass) - sub2 = Box(4, 8, 12, mass=0.5 * total_mass) - compound.add_geometry(sub1) - compound.add_geometry(sub2) - i2 = compound.get_inertial() - self.assertEqualTensors(i1, i2) - - # Next, we try to boxes positioned on top - # of each other, with the mass divided over them. - compound = CompoundGeometry() - sub1 = Box(4, 8, 5, mass=total_mass * 5.0 / 12) - sub2 = Box(4, 8, 7, mass=total_mass * 7.0 / 12) - sub1.translate(Vector3(0, 0, 2.5)) - sub2.translate(Vector3(0, 0, -3.5)) - compound.add_geometry(sub1) - compound.add_geometry(sub2) - i2 = compound.get_inertial() - self.assertEqualTensors(i1, i2) - - # Finally, something involving rotation, and different sizes. - # Note that we get the inertia tensor relative to the compound's - # center of mass, so it doesn't actually matter exactly how it's - # aligned on the axes. - compound = CompoundGeometry() - y_axis = Vector3(0, 1, 0) - deg90 = 0.5 * math.pi - - # Split 5 / 7 in z-direction - frac = total_mass / 12.0 - total_up = 5 * frac - total_down = 7 * frac - - # We split the upper part 6 / 2 in the y-direction - # The alignment with the lower part in y *does* matter, - # it should still be centered. We translate sub1 - # +1 so the total mass on the + side is 4, - # and translate sub2 -3 to align with its left side. - frac_up = total_up / 8.0 - sub1 = Box(5, 6, 4, mass=6 * frac_up) - sub1.rotate_around(y_axis, deg90) - sub1.translate(Vector3(0, 1, 2.5)) - compound.add_geometry(sub1) - - sub2 = Box(5, 2, 4, mass=2 * frac_up) - sub2.rotate_around(y_axis, deg90) - sub2.translate(Vector3(0, -3, 2.5)) - compound.add_geometry(sub2) - - sub3 = Box(4, 8, 7, mass=total_down) - sub3.translate(Vector3(0, 0, -3.5)) - compound.add_geometry(sub3) - - i2 = compound.get_inertial() - self.assertEqualTensors(i1, i2) - - # Let's try this same thing again, only combining - # sub1 and sub2 in a nested compound geometry - compound = CompoundGeometry() - inner_compound = CompoundGeometry() - - inner_compound.add_geometry(sub1) - inner_compound.add_geometry(sub2) - - compound.add_geometry(inner_compound) - compound.add_geometry(sub3) - - i2 = compound.get_inertial() - self.assertEqualTensors(i1, i2) - - def assertEqualTensors(self, i1, i2): - self.assertAlmostEquals(i1.ixx, i2.ixx) - self.assertAlmostEquals(i1.ixy, i2.ixy) - self.assertAlmostEquals(i1.ixz, i2.ixz) - self.assertAlmostEquals(i1.iyy, i2.iyy) - self.assertAlmostEquals(i1.iyy, i2.iyy) - -if __name__ == '__main__': - unittest.main() diff --git a/pyrevolve/sdfbuilder/util/__init__.py b/pyrevolve/sdfbuilder/util/__init__.py deleted file mode 100644 index cf8999032e..0000000000 --- a/pyrevolve/sdfbuilder/util/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Utility functions sub module -""" -from .funcs import * \ No newline at end of file diff --git a/pyrevolve/sdfbuilder/util/funcs.py b/pyrevolve/sdfbuilder/util/funcs.py deleted file mode 100644 index 0d815896c7..0000000000 --- a/pyrevolve/sdfbuilder/util/funcs.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -General utility functions -""" - - -def number_format(number): - """ - Number format utility. We include this so we can - potentially alter the way / precision of displayed - numbers in a central place. - :param number: - :return: String representation of the number - """ - return "%e" % number diff --git a/pyrevolve/sdfbuilder/visual.py b/pyrevolve/sdfbuilder/visual.py deleted file mode 100644 index 33854cf277..0000000000 --- a/pyrevolve/sdfbuilder/visual.py +++ /dev/null @@ -1,5 +0,0 @@ -from .posable import Posable - -class Visual(Posable): - TAG_NAME = "visual" - From ecc2d0855239df00ad41a9f9485ac81616330bcd Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Thu, 14 Mar 2019 17:01:28 +0100 Subject: [PATCH 24/49] RobotManager modifying the manager and robot manager files to use the new revolveBot (also added position as a parameter when inserting the robot) --- experiments/examples/manager.py | 68 ++------- pyrevolve/SDF/revolve_bot_sdf_builder.py | 13 +- pyrevolve/angle/__init__.py | 2 +- pyrevolve/angle/manage/__init__.py | 2 +- .../manage/{robot.py => robotmanager.py} | 37 +---- pyrevolve/angle/manage/world.py | 135 ++++++------------ pyrevolve/revolve_bot/revolve_bot.py | 30 +++- .../tol/manage/{robot.py => robotmanager.py} | 29 ++-- pyrevolve/tol/manage/world.py | 24 +--- 9 files changed, 105 insertions(+), 235 deletions(-) rename pyrevolve/angle/manage/{robot.py => robotmanager.py} (84%) rename pyrevolve/tol/manage/{robot.py => robotmanager.py} (90%) diff --git a/experiments/examples/manager.py b/experiments/examples/manager.py index 1a2fd18ba1..0c585d9da6 100755 --- a/experiments/examples/manager.py +++ b/experiments/examples/manager.py @@ -12,10 +12,7 @@ from pyrevolve import revolve_bot from pyrevolve import parser -from pyrevolve.angle import Tree -from pyrevolve.convert.yaml import yaml_to_proto -from pyrevolve.sdfbuilder import Pose -from pyrevolve.sdfbuilder.math import Vector3 +from pyrevolve.SDF.math import Vector3 from pyrevolve.tol.manage import World @@ -24,66 +21,21 @@ async def run(): The main coroutine, which is started below. """ # Parse command line / file input arguments + settings = parser.parse_args() + + # Load a robot from yaml robot = revolve_bot.RevolveBot() robot.load_file("experiments/examples/yaml/spider.yaml") - robot.save_file("/tmp/test.yaml") - settings = parser.parse_args() + # Connect to the simulator and pause world = await World.create(settings) await world.pause(True) - delete_future = await world.delete_model(robot._id) - await delete_future - - sdf_model = robot.to_sdf(nice_format=' ') - print(sdf_model) - with open('/tmp/test.sdf.xml', 'w') as sdf_file: - sdf_file.write(str(sdf_model)) - - await asyncio.sleep(1.5) - insert_future = await world.insert_model(str(sdf_model)) - await insert_future - - await world.pause(True) - - # while True: - # await asyncio.sleep(1.0) - - -async def run_old(): - """ - The main coroutine, which is started below. - """ - # Parse command line / file input arguments - settings = parser.parse_args() - - with open("experiments/examples/yaml/snake.yaml", 'r') as yaml_file: - bot_yaml = yaml_file.read() - settings.genome = "\n".join(bot_yaml.splitlines()).replace("\'", "\"") - - world = await World.create(settings) - - # These are useful when working with YAML - body_spec = world.builder.body_builder.spec - brain_spec = world.builder.brain_builder.spec - - # Create a robot from YAML - proto_bot = yaml_to_proto( - body_spec=body_spec, - nn_spec=brain_spec, - yaml=bot_yaml) - robot_tree = Tree.from_body_brain( - body=proto_bot.body, - brain=proto_bot.brain, - body_spec=body_spec) - pose = Pose(position=Vector3(0, 0, 0.05)) - future = await (world.insert_robot( - py_bot=robot_tree, - pose=pose, - # name="robot_26" - )) - robot_manager = await future + # Insert the robot in the simulator + insert_future = await world.insert_robot(robot, Vector3(0, 0, 0.05)) + robot_manager = await insert_future + # Resume simulation await world.pause(False) # Start a run loop to do some stuff @@ -91,7 +43,7 @@ async def run_old(): # Print robot fitness every second print("Robot fitness is {fitness}".format( fitness=robot_manager.fitness())) - await asyncio.sleep(10.0) + await asyncio.sleep(1.0) def main(): diff --git a/pyrevolve/SDF/revolve_bot_sdf_builder.py b/pyrevolve/SDF/revolve_bot_sdf_builder.py index 2bda53d220..65c04ce0ca 100644 --- a/pyrevolve/SDF/revolve_bot_sdf_builder.py +++ b/pyrevolve/SDF/revolve_bot_sdf_builder.py @@ -5,20 +5,19 @@ from pyrevolve.revolve_bot.revolve_module import ActiveHingeModule, Orientation, BoxSlot -def revolve_bot_to_sdf(robot, nice_format): +def revolve_bot_to_sdf(robot, robot_pose, nice_format): from xml.etree import ElementTree from pyrevolve import SDF sdf_root = ElementTree.Element('sdf', {'version': '1.6'}) - assert (robot._id is not None) + assert (robot.id is not None) model = ElementTree.SubElement(sdf_root, 'model', { - 'name': str(robot._id) + 'name': str(robot.id) }) - # TODO make this pose parametric - pose = SDF.Pose(SDF.math.Vector3(0, 0, 0.25)) - model.append(pose) + pose_elem = SDF.Pose(robot_pose) + model.append(pose_elem) core_link = SDF.Link('Core') links = [core_link] @@ -125,7 +124,6 @@ def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, my_collision = None if type(module) is ActiveHingeModule: - print("adding joint") child_link = SDF.Link('{}_Leg'.format(slot_chain)) visual_frame, collision_frame, \ @@ -163,7 +161,6 @@ def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, my_collision = collision_servo else: - print("adding block") visual, collision = module.to_sdf(slot_chain) module_slot = module.boxslot(Orientation.SOUTH) diff --git a/pyrevolve/angle/__init__.py b/pyrevolve/angle/__init__.py index 99fb65c62d..e0d5feab10 100644 --- a/pyrevolve/angle/__init__.py +++ b/pyrevolve/angle/__init__.py @@ -6,5 +6,5 @@ from .generate import TreeGenerator from .evolve import Crossover, Mutator from .representation import Tree, Node -from .manage import WorldManager, Robot +from .manage import WorldManager, RobotManager __author__ = 'Elte Hupkes' diff --git a/pyrevolve/angle/manage/__init__.py b/pyrevolve/angle/manage/__init__.py index c2c478b06f..256324bb2a 100644 --- a/pyrevolve/angle/manage/__init__.py +++ b/pyrevolve/angle/manage/__init__.py @@ -1,4 +1,4 @@ from __future__ import absolute_import -from .robot import Robot +from .robotmanager import RobotManager from .world import WorldManager diff --git a/pyrevolve/angle/manage/robot.py b/pyrevolve/angle/manage/robotmanager.py similarity index 84% rename from pyrevolve/angle/manage/robot.py rename to pyrevolve/angle/manage/robotmanager.py index 059523acda..b58b0dccba 100644 --- a/pyrevolve/angle/manage/robot.py +++ b/pyrevolve/angle/manage/robotmanager.py @@ -8,43 +8,34 @@ from pyrevolve.util import Time -class Robot(object): +class RobotManager(object): """ Class to manage a single robot with the WorldManager """ def __init__( self, - name, - tree, robot, position, time, battery_level=0.0, speed_window=60, warmup_time=0, - parents=None ): """ :param speed_window: - :param name: - :param tree: - :param robot: Protobuf robot + :param robot: RevolveBot :param position: :type position: Vector3 :param time: :type time: Time :param battery_level: :type battery_level: float - :param parents: - :type parents: set :return: """ self.warmup_time = warmup_time self.speed_window = speed_window - self.tree = tree self.robot = robot - self.name = name self.starting_position = position self.starting_time = time self.battery_level = battery_level @@ -53,8 +44,6 @@ def __init__( self.last_update = time self.last_mate = None - self.parent_ids = set() \ - if parents is None else set(p.robot.id for p in parents) self._ds = deque(maxlen=speed_window) self._dt = deque(maxlen=speed_window) self._positions = deque(maxlen=speed_window) @@ -68,25 +57,9 @@ def __init__( self._idx = 0 self._count = 0 - def write_robot(self, details_file, csv_writer): - """ - Writes this robot to a file. This simply writes the - protobuf bot to a file, which can later be recovered - - :param world: The world - :param details_file: - :param csv_writer: - :type csv_writer: csv.writer - :return: - :rtype: bool - """ - with open(details_file, 'wb') as f: - f.write(self.robot.SerializeToString()) - - row = [self.robot.id] - row += list(self.parent_ids) if self.parent_ids else ['', ''] - row += [self.get_battery_level()] - csv_writer.writerow(row) + @property + def name(self): + return str(self.robot.id) def update_state(self, world, time, state, poses_file): """ diff --git a/pyrevolve/angle/manage/world.py b/pyrevolve/angle/manage/world.py index e99482d890..e29059f42a 100644 --- a/pyrevolve/angle/manage/world.py +++ b/pyrevolve/angle/manage/world.py @@ -16,7 +16,7 @@ from pyrevolve.spec.msgs import BoundingBox from pyrevolve.spec.msgs import ModelInserted from pyrevolve.spec.msgs import RobotStates -from .robot import Robot +from .robotmanager import RobotManager from ...gazebo import manage from ...gazebo import RequestHandler from ...logging import logger @@ -75,7 +75,7 @@ def __init__( self.builder = builder self.generator = generator - self.robots = {} + self.robot_managers = {} self.robot_id = 0 self.start_time = None @@ -278,7 +278,7 @@ async def restore_snapshot(self, data): :param data: :return: """ - self.robots = data['robots'] + self.robot_managers = data['robots'] self.robot_id = data['robot_id'] self.start_time = data['start_time'] self.last_time = data['last_time'] @@ -290,7 +290,7 @@ async def get_snapshot_data(self): :return: """ return { - "robots": self.robots, + "robots": self.robot_managers, "robot_id": self.robot_id, "start_time": self.start_time, "last_time": self.last_time @@ -322,17 +322,17 @@ def robot_list(self): """ Returns the list of registered robots :return: - :rtype: list[Robot] + :rtype: list[RobotManager] """ - return list(self.robots.values()) + return list(self.robot_managers.values()) def get_robot_by_name(self, name): """ :param name: :return: - :rtype: Robot|None + :rtype: RobotManager|None """ - return self.robots.get(name, None) + return self.robot_managers.get(name, None) async def generate_valid_robot(self, max_attempts=100): """ @@ -382,11 +382,8 @@ async def analyze_tree(self, tree): async def insert_robot( self, - py_bot, - pose, - name=None, - initial_battery=0.0, - parents=None + revolve_bot, + pose=Vector3(0, 0, 0.05), ): """ Inserts a robot into the world. This consists of two steps: @@ -400,44 +397,27 @@ async def insert_robot( i.e. the message that confirms the robot has been inserted, a future is returned. - :param py_bot: - :type py_bot: Python tree structure of a robot + :param revolve_bot: + :type revolve_bot: RevolveBot :param pose: Insertion pose of a robot - :type pose: Pose - :param name: (Unique) name of a robot - :type name: str - :param initial_battery: Initial battery level - :param parents: + :type pose: Pose|Vector3 :return: A future that resolves with the created `Robot` object. """ - robot_id = self.get_robot_id() - robot_name = "gen__"+str(robot_id) \ - if name is None else str(name) - - proto_bot = py_bot.to_protobot(robot_id) - sdf_bot = self.to_sdfbot( - robot=proto_bot, - robot_name=robot_name, - initial_battery=initial_battery) - sdf_bot.elements[0].set_pose(pose) + sdf_bot = revolve_bot.to_sdf(pose).decode('utf8') if self.output_directory: robot_file_path = os.path.join( self.output_directory, - 'robot_{}.sdf'.format(robot_id) + 'robot_{}.sdf'.format(revolve_bot.id) ) with open(robot_file_path, 'w') as f: - f.write(str(sdf_bot)) + f.write(sdf_bot) future = Future() insert_future = await self.insert_model(sdf_bot) # TODO: Unhandled error in exception handler. Fix this. insert_future.add_done_callback(lambda fut: self._robot_inserted( - robot_name=robot_name, - tree=py_bot, - robot=proto_bot, - initial_battery=initial_battery, - parents=parents, + robot=revolve_bot, msg=fut.result(), return_future=future )) @@ -464,7 +444,7 @@ def to_sdfbot( async def delete_robot(self, robot): """ :param robot: - :type robot: Robot + :type robot: RobotManager :return: """ # Immediately unregister the robot so no it won't be used @@ -480,7 +460,7 @@ async def delete_all_robots(self): :return: """ futures = [] - for bot in list(self.robots.values()): + for bot in list(self.robot_managers.values()): future = await (self.delete_robot(bot)) futures.append(future) @@ -488,11 +468,7 @@ async def delete_all_robots(self): def _robot_inserted( self, - robot_name, - tree, robot, - initial_battery, - parents, msg, return_future ): @@ -500,12 +476,7 @@ def _robot_inserted( Registers a newly inserted robot and marks the insertion message response as handled. - :param tree: - :param robot_name: - :param tree: - :param robot: - :param initial_battery: - :param parents: + :param robot: RevolveBot :param msg: :type msg: pygazebo.msgs.response_pb2.Response :param return_future: Future to resolve with the created robot object. @@ -519,81 +490,57 @@ def _robot_inserted( p = model.pose.position position = Vector3(p.x, p.y, p.z) - robot = self.create_robot_manager( - robot_name, - tree, + robot_manager = self.create_robot_manager( robot, position, - time, - initial_battery, - parents + time ) - self.register_robot(robot) - return_future.set_result(robot) + self.register_robot(robot_manager) + return_future.set_result(robot_manager) def create_robot_manager( self, - robot_name, - tree, robot, position, time, - battery_level, - parents ): """ - :param robot_name: - :param tree: :param robot: :param position: :param time: - :param battery_level: - :param parents: :return: - :rtype: Robot + :rtype: RobotManager """ - return Robot( - name=robot_name, - tree=tree, + return RobotManager( robot=robot, position=position, time=time, - battery_level=battery_level, - parents=parents ) - def register_robot(self, robot): + def register_robot(self, robot_manager): """ Registers a robot with its Gazebo ID in the local array. - :param robot: - :type robot: Robot + :param robot_manager: + :type robot_manager: RobotManager :return: """ - logger.debug("Registering robot {}.".format(robot.name)) + logger.debug("Registering robot {}.".format(robot_manager.name)) - if robot.name in self.robots: - raise ValueError("Duplicate robot: {}".format(robot.name)) + if robot_manager.name in self.robot_managers: + raise ValueError("Duplicate robot: {}".format(robot_manager.name)) - self.robots[robot.name] = robot - if self.output_directory: - # Write robot details and CSV row to files - proto_file = '{}/robot_{}.pb'.format( - self.output_directory, - robot.robot.id) - robot.write_robot( - details_file=proto_file, - csv_writer=self.write_robots) + self.robot_managers[robot_manager.name] = robot_manager - def unregister_robot(self, robot): + def unregister_robot(self, robot_manager): """ Unregisters the robot with the given ID, usually happens when it is deleted. - :param robot: - :type robot: Robot + :param robot_manager: + :type robot_manager: RobotManager :return: """ - logger.debug("Unregistering robot {}.".format(robot.name)) - del self.robots[robot.name] + logger.debug("Unregistering robot {}.".format(robot_manager.name)) + del self.robot_managers[robot_manager.name] async def reset(self, **kwargs): """ @@ -660,11 +607,11 @@ def _update_states(self, msg): self.start_time = t for state in states.robot_state: - robot = self.robots.get(state.name, None) - if not robot: + robot_manager = self.robot_managers.get(state.name, None) + if not robot_manager: continue - robot.update_state(self, t, state, self.write_poses) + robot_manager.update_state(self, t, state, self.write_poses) self.call_update_triggers() diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 012c32617f..b8320e78de 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -34,6 +34,32 @@ def __init__(self, id=None): self._behavioural_measurement = None self._battery_level = None + @property + def id(self): + return self._id + + @property + def body(self): + return self._body + + @property + def brain(self): + return self._brain + + def size(self): + robot_size = 1 + self._recursive_size_measurement(self._body) + print("calculating robot size: {}".format(robot_size)) + return robot_size + + def _recursive_size_measurement(self, module): + count = 0 + for _, child in module.iter_children(): + if child is not None: + count += 1 + self._recursive_size_measurement(child) + + return count + + def measure_behaviour(self): """ @@ -103,8 +129,8 @@ def load_file(self, path, conf_type='yaml'): self.load(robot, conf_type) - def to_sdf(self, nice_format=None): - return SDF.revolve_bot_to_sdf(self, nice_format) + def to_sdf(self, pose=SDF.math.Vector3(0, 0, 0.25), nice_format=None): + return SDF.revolve_bot_to_sdf(self, pose, nice_format) def to_yaml(self): """ diff --git a/pyrevolve/tol/manage/robot.py b/pyrevolve/tol/manage/robotmanager.py similarity index 90% rename from pyrevolve/tol/manage/robot.py rename to pyrevolve/tol/manage/robotmanager.py index ca5f0ab981..ebe32d60e7 100644 --- a/pyrevolve/tol/manage/robot.py +++ b/pyrevolve/tol/manage/robotmanager.py @@ -3,14 +3,11 @@ from pyrevolve.SDF.math import Vector3 -from pyrevolve.angle import Robot as RvRobot +from pyrevolve.angle import RobotManager as RvRobotManager from pyrevolve.util import Time -from ..util.analyze import count_connections, count_extremities, count_joints, \ - count_motors - -class Robot(RvRobot): +class RobotManager(RvRobotManager): """ Class to manage a single robot """ @@ -18,47 +15,37 @@ class Robot(RvRobot): def __init__( self, conf, - name, - tree, robot, position, time, - battery_level=0.0, - parents=None + battery_level=0.0 ): """ :param conf: - :param name: - :param tree: - :param robot: Protobuf robot + :param robot: RevolveBot :param position: :type position: Vector3 :param time: :type time: Time - :param parents: - :type parents: tuple(Robot, Robot) :param battery_level: Battery charge for this robot :type battery_level: float :return: """ speed_window = int(conf.evaluation_time * conf.pose_update_frequency) - super(Robot, self).__init__( - name=name, - tree=tree, + super(RobotManager, self).__init__( robot=robot, position=position, time=time, battery_level=battery_level, speed_window=speed_window, warmup_time=conf.warmup_time, - parents=parents ) # Set of robots this bot has mated with self.mated_with = {} self.last_mate = None self.conf = conf - self.size = len(tree) + self.size = robot.size() self.battery_level = battery_level self.initial_charge = battery_level @@ -67,7 +54,7 @@ def will_mate_with(self, other): Decides whether or not to mate with the other given robot based on its position and speed. :param other: - :type other: Robot + :type other: RobotManager :return: """ if self.age() < self.conf.warmup_time: @@ -207,7 +194,7 @@ def did_mate_with(self, other): """ Called when this robot mated with another robot successfully. :param other: - :type other: Robot + :type other: RobotManager :return: """ self.last_mate = self.last_update diff --git a/pyrevolve/tol/manage/world.py b/pyrevolve/tol/manage/world.py index 18e4e1d4b2..603df93cd5 100644 --- a/pyrevolve/tol/manage/world.py +++ b/pyrevolve/tol/manage/world.py @@ -12,7 +12,7 @@ from .. import logger from .. import constants -from .robot import Robot +from .robotmanager import RobotManager # from ..build import get_builder, to_sdfbot # from ..scenery import Wall # from ..spec import get_tree_generator @@ -98,38 +98,26 @@ def robots_header(self): Extends the robots header with a max age :return: """ - return Robot.header() + return RobotManager.header() def create_robot_manager( self, - robot_name, - tree, robot, position, - t, - battery_level, - parents + time, ): """ Overriding with robot manager with more capabilities. - :param robot_name: - :param tree: :param robot: :param position: - :param t: - :param battery_level: - :param parents: + :param time: :return: """ - return Robot( + return RobotManager( conf=self.conf, - name=robot_name, - tree=tree, robot=robot, position=position, - time=t, - battery_level=battery_level, - parents=parents + time=time, ) async def add_highlight(self, position, color): From dd1d9a5fa5a7edea1068ec254f4ab6e6cc3140db Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Thu, 14 Mar 2019 17:06:23 +0100 Subject: [PATCH 25/49] Measurements --- img/body_0.png | Bin 0 -> 4433 bytes img/body_1.png | Bin 0 -> 7605 bytes img/body_10.png | Bin 0 -> 18690 bytes img/body_11.png | Bin 0 -> 4187 bytes img/body_12.png | Bin 0 -> 4913 bytes img/body_13.png | Bin 0 -> 3798 bytes img/body_14.png | Bin 0 -> 7728 bytes img/body_15.png | Bin 0 -> 8988 bytes img/body_16.png | Bin 0 -> 7499 bytes img/body_17.png | Bin 0 -> 5103 bytes img/body_18.png | Bin 0 -> 7748 bytes img/body_19.png | Bin 0 -> 7567 bytes img/body_2.png | Bin 0 -> 17553 bytes img/body_20.png | Bin 0 -> 8131 bytes img/body_21.png | Bin 0 -> 3346 bytes img/body_22.png | Bin 0 -> 3263 bytes img/body_23.png | Bin 0 -> 11315 bytes img/body_24.png | Bin 0 -> 7859 bytes img/body_25.png | Bin 0 -> 8592 bytes img/body_26.png | Bin 0 -> 7629 bytes img/body_27.png | Bin 0 -> 6535 bytes img/body_28.png | Bin 0 -> 3569 bytes img/body_29.png | Bin 0 -> 3675 bytes img/body_3.png | Bin 0 -> 3960 bytes img/body_30.png | Bin 0 -> 11297 bytes img/body_31.png | Bin 0 -> 3223 bytes img/body_32.png | Bin 0 -> 1621 bytes img/body_33.png | Bin 0 -> 8128 bytes img/body_34.png | Bin 0 -> 8504 bytes img/body_35.png | Bin 0 -> 9304 bytes img/body_36.png | Bin 0 -> 8007 bytes img/body_37.png | Bin 0 -> 10622 bytes img/body_38.png | Bin 0 -> 1621 bytes img/body_39.png | Bin 0 -> 7086 bytes img/body_4.png | Bin 0 -> 2566 bytes img/body_40.png | Bin 0 -> 5605 bytes img/body_41.png | Bin 0 -> 11818 bytes img/body_43.png | Bin 0 -> 6672 bytes img/body_44.png | Bin 0 -> 3210 bytes img/body_45.png | Bin 0 -> 3713 bytes img/body_46.png | Bin 0 -> 8721 bytes img/body_47.png | Bin 0 -> 2444 bytes img/body_48.png | Bin 0 -> 8140 bytes img/body_5.png | Bin 0 -> 4850 bytes img/body_50.png | Bin 0 -> 7411 bytes img/body_51.png | Bin 0 -> 7030 bytes img/body_52.png | Bin 0 -> 3823 bytes img/body_53.png | Bin 0 -> 1234 bytes img/body_54.png | Bin 0 -> 8313 bytes img/body_55.png | Bin 0 -> 5474 bytes img/body_56.png | Bin 0 -> 8852 bytes img/body_57.png | Bin 0 -> 7487 bytes img/body_58.png | Bin 0 -> 4833 bytes img/body_59.png | Bin 0 -> 5802 bytes img/body_6.png | Bin 0 -> 12455 bytes img/body_60.png | Bin 0 -> 9612 bytes img/body_61.png | Bin 0 -> 8488 bytes img/body_62.png | Bin 0 -> 5336 bytes img/body_63.png | Bin 0 -> 15334 bytes img/body_64.png | Bin 0 -> 18123 bytes img/body_65.png | Bin 0 -> 4220 bytes img/body_66.png | Bin 0 -> 15287 bytes img/body_67.png | Bin 0 -> 4929 bytes img/body_68.png | Bin 0 -> 1103 bytes img/body_69.png | Bin 0 -> 4209 bytes img/body_7.png | Bin 0 -> 2929 bytes img/body_70.png | Bin 0 -> 15196 bytes img/body_71.png | Bin 0 -> 7400 bytes img/body_72.png | Bin 0 -> 4589 bytes img/body_73.png | Bin 0 -> 1806 bytes img/body_74.png | Bin 0 -> 3620 bytes img/body_75.png | Bin 0 -> 9383 bytes img/body_76.png | Bin 0 -> 4017 bytes img/body_77.png | Bin 0 -> 8315 bytes img/body_78.png | Bin 0 -> 9843 bytes img/body_79.png | Bin 0 -> 11598 bytes img/body_8.png | Bin 0 -> 5605 bytes img/body_80.png | Bin 0 -> 10954 bytes img/body_81.png | Bin 0 -> 6363 bytes img/body_82.png | Bin 0 -> 12674 bytes img/body_83.png | Bin 0 -> 12363 bytes img/body_84.png | Bin 0 -> 14822 bytes img/body_85.png | Bin 0 -> 3436 bytes img/body_86.png | Bin 0 -> 6016 bytes img/body_87.png | Bin 0 -> 7049 bytes img/body_88.png | Bin 0 -> 7843 bytes img/body_89.png | Bin 0 -> 11328 bytes img/body_9.png | Bin 0 -> 4014 bytes img/body_90.png | Bin 0 -> 7175 bytes img/body_91.png | Bin 0 -> 2114 bytes img/body_92.png | Bin 0 -> 9862 bytes img/body_93.png | Bin 0 -> 5082 bytes img/body_94.png | Bin 0 -> 4284 bytes img/body_95.png | Bin 0 -> 13178 bytes img/body_96.png | Bin 0 -> 9513 bytes img/body_97.png | Bin 0 -> 10151 bytes img/body_98.png | Bin 0 -> 16095 bytes img/body_99.png | Bin 0 -> 5996 bytes pyrevolve/revolve_bot/measure.py | 304 +++++++++++++++++++++++++ pyrevolve/revolve_bot/render/grid.py | 31 ++- pyrevolve/revolve_bot/render/render.py | 74 ++++-- pyrevolve/revolve_bot/revolve_bot.py | 11 +- test.py | 28 ++- 103 files changed, 408 insertions(+), 40 deletions(-) create mode 100644 img/body_0.png create mode 100644 img/body_1.png create mode 100644 img/body_10.png create mode 100644 img/body_11.png create mode 100644 img/body_12.png create mode 100644 img/body_13.png create mode 100644 img/body_14.png create mode 100644 img/body_15.png create mode 100644 img/body_16.png create mode 100644 img/body_17.png create mode 100644 img/body_18.png create mode 100644 img/body_19.png create mode 100644 img/body_2.png create mode 100644 img/body_20.png create mode 100644 img/body_21.png create mode 100644 img/body_22.png create mode 100644 img/body_23.png create mode 100644 img/body_24.png create mode 100644 img/body_25.png create mode 100644 img/body_26.png create mode 100644 img/body_27.png create mode 100644 img/body_28.png create mode 100644 img/body_29.png create mode 100644 img/body_3.png create mode 100644 img/body_30.png create mode 100644 img/body_31.png create mode 100644 img/body_32.png create mode 100644 img/body_33.png create mode 100644 img/body_34.png create mode 100644 img/body_35.png create mode 100644 img/body_36.png create mode 100644 img/body_37.png create mode 100644 img/body_38.png create mode 100644 img/body_39.png create mode 100644 img/body_4.png create mode 100644 img/body_40.png create mode 100644 img/body_41.png create mode 100644 img/body_43.png create mode 100644 img/body_44.png create mode 100644 img/body_45.png create mode 100644 img/body_46.png create mode 100644 img/body_47.png create mode 100644 img/body_48.png create mode 100644 img/body_5.png create mode 100644 img/body_50.png create mode 100644 img/body_51.png create mode 100644 img/body_52.png create mode 100644 img/body_53.png create mode 100644 img/body_54.png create mode 100644 img/body_55.png create mode 100644 img/body_56.png create mode 100644 img/body_57.png create mode 100644 img/body_58.png create mode 100644 img/body_59.png create mode 100644 img/body_6.png create mode 100644 img/body_60.png create mode 100644 img/body_61.png create mode 100644 img/body_62.png create mode 100644 img/body_63.png create mode 100644 img/body_64.png create mode 100644 img/body_65.png create mode 100644 img/body_66.png create mode 100644 img/body_67.png create mode 100644 img/body_68.png create mode 100644 img/body_69.png create mode 100644 img/body_7.png create mode 100644 img/body_70.png create mode 100644 img/body_71.png create mode 100644 img/body_72.png create mode 100644 img/body_73.png create mode 100644 img/body_74.png create mode 100644 img/body_75.png create mode 100644 img/body_76.png create mode 100644 img/body_77.png create mode 100644 img/body_78.png create mode 100644 img/body_79.png create mode 100644 img/body_8.png create mode 100644 img/body_80.png create mode 100644 img/body_81.png create mode 100644 img/body_82.png create mode 100644 img/body_83.png create mode 100644 img/body_84.png create mode 100644 img/body_85.png create mode 100644 img/body_86.png create mode 100644 img/body_87.png create mode 100644 img/body_88.png create mode 100644 img/body_89.png create mode 100644 img/body_9.png create mode 100644 img/body_90.png create mode 100644 img/body_91.png create mode 100644 img/body_92.png create mode 100644 img/body_93.png create mode 100644 img/body_94.png create mode 100644 img/body_95.png create mode 100644 img/body_96.png create mode 100644 img/body_97.png create mode 100644 img/body_98.png create mode 100644 img/body_99.png create mode 100644 pyrevolve/revolve_bot/measure.py diff --git a/img/body_0.png b/img/body_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c37af81b1f60218d8a1bc763d2b7a818cdcac4 GIT binary patch literal 4433 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 NJaBk_m9^)^{{kI^p%VZA literal 0 HcmV?d00001 diff --git a/img/body_1.png b/img/body_1.png new file mode 100644 index 0000000000000000000000000000000000000000..75062cf9a5b2e5350c6bcfcf313b85492dbb9c4a GIT binary patch literal 7605 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 Wl%V$!=b3L{0Bg$&XRFV6qW%j$*A0CD literal 0 HcmV?d00001 diff --git a/img/body_13.png b/img/body_13.png new file mode 100644 index 0000000000000000000000000000000000000000..7287eccbfff01118205b96c6be942e5512da3998 GIT binary patch literal 3798 zcmds4XHXMdmrjVGDjjJi2nJ~iC|v_cdkIpd^GXB+RC<#lQ36sGqy#Xa6onuNXeiPN zghaZ4AWcH=od5zN5Wc*-`}^D7nfWwaof#!NqT9&m^#RW7b4w_{6zzj^h_TsD?fBhDYHK%_wiLPn8OJ zR^6o*4S%<``YC<^e<=dP-bs4s8VRw)IIv)oMUL82=l>EFRXZ3*Rn%>be9O-2RzK(s z-XsTT9*pm1EddQMu>VIJm%$4|hAT$(Y}LCx${60OQEm|$?2f~+CC8K<+LNU(xy0ET z#w8!Vuzv47#27c&e0a->q$F9?wl8qI_?`TU5X|6IQ}7}Nhd9e=U=Cx9gGq6NbTPay zfMNzOzXDQVdgkHz#jzMSB-(?gRLiZqHpY

lJ4k&(F;+K4j+GlO~nDTWDfj&kGz1 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 literal 0 HcmV?d00001 diff --git a/img/body_14.png b/img/body_14.png new file mode 100644 index 0000000000000000000000000000000000000000..044db94210f5355f966cf9441484a8c0a5219a61 GIT binary patch literal 7728 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 J{<3=ce*l9NVKM*! literal 0 HcmV?d00001 diff --git a/img/body_15.png b/img/body_15.png new file mode 100644 index 0000000000000000000000000000000000000000..114869613fef6cd06d0751cdd76d690f91b4f0ba GIT binary patch literal 8988 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 LswxydG5PQhbrEji literal 0 HcmV?d00001 diff --git a/img/body_17.png b/img/body_17.png new file mode 100644 index 0000000000000000000000000000000000000000..cef072d6dcfc50733733d51816032b644f5aef54 GIT binary patch literal 5103 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 X5b-U{&ie@b!2`ifEH9T|L?!$UmtUoR literal 0 HcmV?d00001 diff --git a/img/body_18.png b/img/body_18.png new file mode 100644 index 0000000000000000000000000000000000000000..375c0305a9f74fa040a2220faebb1095981b0c60 GIT binary patch literal 7748 zcmdT}d011|wnxwcrGVBVl_^@SwiN-dG75x>KwD9iA%rm?LPTaEL;@kAg;Yi8AcH~( z%2gl}AagJbMxhD>P!eWBM5YsxpdmpLlDtE|+jrl+@80*%`{R8t`SRsEYp=8RTEDaR zS--XRjk9MwbU!xwSWQh$_xtZodaJ2zS>60;eFRE+IozAz-$&<9d7M;JZGOucmA|Q} znXZ3-@>}04rGlyS;YbvAVI93CaND+%x`)3F4*jlK``*>n&-WIE4xT)4gAiZ*W0Py? zek083R~Bw5<7KO!QB^}J7E`ZvY7?FyxlpRu;235ui_@fnW*yMG|2H4^+VJUZo$75D znriKuSi5GvK64MfrMA;z=?!h?lFs>Va>8b79Gq@#8eXE0-=T#TYtJ>Qa)vUG%UGdk`&jlqzWDiCI*#_dn*9=0B z$_&l`n0D>b@3*HGM)b>|q93a04=vhNE5Gea=>G)AKUvP~ zn)0vdwE&HH>)kc~nTmR$z(ev5-{mC`?C}43W_44w11{wnom;j32lxJ2$>S}aq}x-w zG3aa|) zj>GMQBzso>i>$hgJT+q>kNn`H#EguF&2&nPVqqlG(I!v4YeL0ilbXM__ zf(>Nahj2KCum;e~S!|2!rGcoUl@~1M(o$_pKW!ypBo1sXey@EByb*0XxidtvM(R(d zLdW-sknO!Rd2n>rGMa}μUNJ-N+qDLSIdfHABR23oVW+uD!y=jx7`6R?Dkuy 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 literal 0 HcmV?d00001 diff --git a/img/body_20.png b/img/body_20.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4040eb1fcc3de5253ab8b276d4887c3544bf0b GIT binary patch literal 8131 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 literal 0 HcmV?d00001 diff --git a/img/body_22.png b/img/body_22.png new file mode 100644 index 0000000000000000000000000000000000000000..cceba87647ff45cf1ad27cb80536cd1902129268 GIT binary patch literal 3263 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 b^VI{^T1L6e#!JE<3Bci$i*4meRN}t?5S$jb literal 0 HcmV?d00001 diff --git a/img/body_23.png b/img/body_23.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0f919b0f6cba2412975431b489ed632746072e GIT binary patch literal 11315 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 literal 0 HcmV?d00001 diff --git a/img/body_24.png b/img/body_24.png new file mode 100644 index 0000000000000000000000000000000000000000..b05ba0f99c78b9a58383a8794413b0288cfcbd94 GIT binary patch literal 7859 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 literal 0 HcmV?d00001 diff --git a/img/body_25.png b/img/body_25.png new file mode 100644 index 0000000000000000000000000000000000000000..58443c193efedbd21342c1baf72674bcf1115832 GIT binary patch literal 8592 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 I$TjZY0P7IF`2YX_ literal 0 HcmV?d00001 diff --git a/img/body_27.png b/img/body_27.png new file mode 100644 index 0000000000000000000000000000000000000000..5261d83acfeef82b1c26a255f43ebb0d760ab020 GIT binary patch literal 6535 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 ah`;?|TvuAFDL0^%fxz1OTE(~RqW%lI;4m}* literal 0 HcmV?d00001 diff --git a/img/body_28.png b/img/body_28.png new file mode 100644 index 0000000000000000000000000000000000000000..418e3e2c09905b7fa1ecdebedfa4782be2a40570 GIT binary patch literal 3569 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 G9{&%Yzq*V7 literal 0 HcmV?d00001 diff --git a/img/body_29.png b/img/body_29.png new file mode 100644 index 0000000000000000000000000000000000000000..de0d2ce252f6ed87b89c2dc8dda9f6a8c93068a4 GIT binary patch literal 3675 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 HUGMz^k%HM< literal 0 HcmV?d00001 diff --git a/img/body_3.png b/img/body_3.png new file mode 100644 index 0000000000000000000000000000000000000000..456e5df7b223c6f3759f771a63ca808eb1886856 GIT binary patch literal 3960 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 literal 0 HcmV?d00001 diff --git a/img/body_32.png b/img/body_32.png new file mode 100644 index 0000000000000000000000000000000000000000..51e0f4774f733dce92510062a011993cd2c46586 GIT binary patch literal 1621 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VX;4}uH!E}sk(;PP~F z45^s&_Riky*ixC}AN_Mouds*c{FuP^N}oJI?wepcS+?c>f}e3ZJv*x< z*nQOfHY`itBmCy@lUGllynFbBJ!#8R;gkK})9sqitlwEEq5f#O%Z6pC6E3RX5TCqz zGEckkyw;68Y$q=%B-h@b(=ng#JBD4THsj`T{rG%7<@>vo<9#W4dNb$x=Izp~{BZEe z*Xxt*|GlVkn!)EU^LFR^ecom7e5U>T=yE!Le{LK*pUV1uv-W)U+mst^ZhUA9M_B({ zySX;sB8omFeE#|My1KvZ)H_w#pPo)XIXmA>o?kX=-9Ed27CT?9%1dwa6j~!!{dB5X z*!Me=-`t;{bN5!=-<{7Vxy$?7{nGgP=kt@L()$d=eum5l``@t&Z2-~f{p8YJnzIJc<;>HFM_rrlq;PxBou-kjl@W&rhCVi4|TmPg*@}Lm<%p*h1IOAGhD1 z_21j#)XLzuzfNhZ8w;2C0)03u`_|W;pCkT1dvo*Kyz5V=t51)!f*QO1?zMIPbAXP% z9>3lER``DYYtlgHS-;P@-p;pn@Au38`v2@A@>y0dm#bP4yZ`^cTh-s+?*8#RVXxqt zc~uV@zx}zoulD4|Wbymo&zhgSop1hHH+t4`^8;0?5w@i_Q%`zq3^l`8NEkkI$=IRypa#!RC|c^Ht05Otkr1QgmAPWO%%4{+@|7 zA6++pU$^_#frB99%&cd>xqI7A>F1M^Po7TKzf=Bx@5$Zot8Qt$o-fZ?o%j0Mlf(Rz zx8L)UtFzeo@z}HDN2T*J-WBit7WL_*`n>1ojy>R7-7s_JlauPR#dA{Dk)4{+a~$q; zPbZbh#n+j0Bo3=|FaEBhuikucNqeHq>C@WXM+K$ZC(muZ<^z-#Xr6jqgL~%r8Zk9% zp5$ATpA_(|U*jg}woC1t=(Q3a<9G4TTF>|6KF>R=TB}W)k~J1*C+Ubtn_sC Kb6Mw<&;$VG8J)=h literal 0 HcmV?d00001 diff --git a/img/body_33.png b/img/body_33.png new file mode 100644 index 0000000000000000000000000000000000000000..d96c70169f8e49ba854a99109a2cb88b645deb5b GIT binary patch literal 8128 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 LtXuYzS1qB2Vq(h_#(m`72H6S(g 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 literal 0 HcmV?d00001 diff --git a/img/body_36.png b/img/body_36.png new file mode 100644 index 0000000000000000000000000000000000000000..61736a35481d157eebb455c40744d77a1c1ef912 GIT binary patch literal 8007 zcmd6MXH-+&)@}glRS}S`!V4%x1d$R1QHqKL6=~81rAbkG4Lu@FI#L3tfJi6-q(cIs zD+B}*I)o0P1TYXv;KuX50nsPTPMI%5lbkB8lGy$i-ue|1>WB@?u_`asbQ{U{3DX`}- zF=uOgSyVpaIOW2_+pvoa-Q|Fq2c_ON8m+F6wN?nP=p*y>61`bH1`bMUZNeovpy) z9s>&76o+nP?rRFOqN9#*H&-Iukf}k!tX6081fY?R%U%-0dM$lO=(Yuuu9VjDyb&^7=7}Jdsx&X zt?odely{1)T=bC9ZLH#qjP8yms$@@3N+RQ_(x?u$pcl8aMAp-rVkE=Z#dx@K($(9O zM^lvCcRrsMt`1>?w__YnVsZ~xK22DH$#$|CNHljmpV!tO>E?^Fe~fp%U7@NNEw$=RvKt&foiJs?|b=S zaNi3G__<|btBj#Dr=uUW($mrk{l8vPQZw-1NV&qv%xwJBFo%gQ3#js3D0yq2=L~h$ z)vJ?fZGKYL8jh>2sglB9N-g%M1N2(0YtY#7L8^sAa*lRh>|~yF@1aJllZn3G7o*ympO?!fpfw=Rwl;U4h}@>66{5 z#?aeF7$T2lMtr^M6#?flo|cMrW~&S9c@S@iRnbvrd-QVbUb`7M`z`(@X=R!){==+L zUw={7QZW!_!OFTN0Hn*#N>^UZ`FDw> zrAXu6-ogNq3q9!9=^rmUKHs03Ic-UP+@$Yw|6k^f|A*A_|G#9mR6k>EWT0ZVJ^E8= z>1{{X&Euq`4;>w4kTqPiNf8i;#bU}ziXAssy4Q%f1BnnWsjFOI9aTC0ixmFxCD}`C@@8>c! ze4WNb*@nqu!x7Af(T@mGcW&n(m(t>=-96TX(DCu7KRDU#;hW{fysrlPIi9JgV4C+W zf5&Tf4@DtU9s{oP$4%c?T6#sQh8a4S=JuHDWY;0>K9y~L_n{8H^dS#cKu6f*_k{k* z%f7uGKT^v!t9m(`pHW%JDt@TCpfujYL`xyIOF!-{NzrY3SBecw3LA-o(|qeEdYBkt zrdL7?dvgDs=tb7WV?c!t)T@JS*KpgvVi0>p$V`S7of5h_~Eht zSNP-LD&#r@?@Nwt{e3tYF4ay{A`CFnsW~bDSCiAhE@IDaF@D+LC2< z$WK;6Ah8UXOCiyePkftht%(hUBF?v`2X(kzexXo)Bk_h9RXA1y%mq!f43bX-ER<2WV;C6(`5=wrS>HJ;{%CCuXy87`gvab6j^2I?i~h z#1w;D{nf{nHIxH$m#l90ac7>K+}|bsL{EW?OwRfgzkg{$K*- z-KNP6JHee`Ct2x4_FS*FL6DJB>I(X1>!w}*^H~RReC~F1yXm9kAEqpU%oc%7zr1~E z&zV7USaoMBMfGnqIT3_I)~ZiCAVglcO_K$??qmoIEHJMe+PdDV(TAXW=coSO`)SxxB1)*A=}1<2?KdWIagjf z{DZm&)Qy0F%wk9hiO?9F>*%5##mT~w42Vz_hBkYGPMz=)66|%@DUq;p>YyaJbeGo? zr7_ABH^9o?s^KeCnG?Hub})TQ7!pKdS>+l9UhyI}qKS>xg29I8W *&qXV6hm}FR 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 literal 0 HcmV?d00001 diff --git a/img/body_37.png b/img/body_37.png new file mode 100644 index 0000000000000000000000000000000000000000..fd26fd403c9ef87980cf99b3071ef9662a208125 GIT binary patch literal 10622 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 Kb6Mw<&;$VG8J)=h literal 0 HcmV?d00001 diff --git a/img/body_39.png b/img/body_39.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a103c91d3bdcadc61a8b1f8cee83178615c2cc GIT binary patch literal 7086 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 F{|Q;oyet3! literal 0 HcmV?d00001 diff --git a/img/body_40.png b/img/body_40.png new file mode 100644 index 0000000000000000000000000000000000000000..45e9f89cad0fe51e7c0089230918e6a4d6447f5e GIT binary patch literal 5605 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 literal 0 HcmV?d00001 diff --git a/img/body_43.png b/img/body_43.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9adbeba8d4e131de30e97534c90a5fbe3064af GIT binary patch literal 6672 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 literal 0 HcmV?d00001 diff --git a/img/body_44.png b/img/body_44.png new file mode 100644 index 0000000000000000000000000000000000000000..9aabed5eed772047bbf6e1bc03ad88861f8ad768 GIT binary patch literal 3210 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 z zpnLymxxY3u)MON{7U?DwY{(BpSw9vfbzrd@%cktR3V(jX zi4zp|YKL50Ymt#e-JA;Ot{yg?dDMTwrhVt;mrLcg#BlKW+vm0?AHQE)QW6KB%?@7# z#G2-5w9aZzjlHY$q2zZCS4mV?p*tCOuwbXUKq>atEvCFfd7T$fpMD;5Hkd^DMFc=A z=S{lrkpxW`AGs72wb6&}o1V2?7t0N}WdcTaa^GG>)09Ouy?;M-=4^pM){ph5Wxa3T zF0p};ng_^qD&_l}x@VBLcq{GyJ3;@8rvHpo*n+XP%{q3|{|7X_KUXc~K-uzervzA< L+rVnfkcoc+rJdQK literal 0 HcmV?d00001 diff --git a/img/body_46.png b/img/body_46.png new file mode 100644 index 0000000000000000000000000000000000000000..0bea89d1999e0068ffa4416c50179325cf127cea GIT binary patch literal 8721 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 Yln(!jr(eJN{k;O5vU9ervhhp$1LdHGMF0Q* literal 0 HcmV?d00001 diff --git a/img/body_48.png b/img/body_48.png new file mode 100644 index 0000000000000000000000000000000000000000..1090996c02968fde9a9445f5f53232dd1c5e2980 GIT binary patch literal 8140 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 aFt??lZ{ccpJW!qonHX4}uQ}&_>wf?-0bG0l literal 0 HcmV?d00001 diff --git a/img/body_5.png b/img/body_5.png new file mode 100644 index 0000000000000000000000000000000000000000..67c4d4ce2c313924bbbaf28e34c1bc68eb974024 GIT binary patch literal 4850 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 JUmSD({civnrGx+g literal 0 HcmV?d00001 diff --git a/img/body_50.png b/img/body_50.png new file mode 100644 index 0000000000000000000000000000000000000000..d1cde539fb2f853ddfd4b347e605806018d98ed1 GIT binary patch literal 7411 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 Ma@$C|N(&bKAHT|S;s5{u literal 0 HcmV?d00001 diff --git a/img/body_51.png b/img/body_51.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd33f148b20ddc81c51649e7c7fec03e3be33f3 GIT binary patch literal 7030 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 W%g~+S*9N>u1L literal 0 HcmV?d00001 diff --git a/img/body_52.png b/img/body_52.png new file mode 100644 index 0000000000000000000000000000000000000000..2f215f283483fc82f9e3991c65d1601065703b6e GIT binary patch literal 3823 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 I_1*9N8wbDNumAu6 literal 0 HcmV?d00001 diff --git a/img/body_53.png b/img/body_53.png new file mode 100644 index 0000000000000000000000000000000000000000..5d22ed83e1999d075950ff79578f9d5232fa4d27 GIT binary patch literal 1234 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu_bxCyDz- z45^s&_U_*7xv4V8ALjeybcBZRWX$G!rO?DB78TCy`pan{AD^q^A7-nPD<^%#%-Px5 z3s(qPg}Qc_uvCfoER@yS!dl4nmDka6h1tF>R~~Mh({e0c>E+4FGduMx=2)MsePI6N z@X5LA{GLD;P!94oFRbG~U^Mx^O-AQLFsssRz4sDTE2hl(Csl%L=QSP+DRSSR-e4xo zA;QAM+UVe@5Fh|%UUxJ*mU6AE_0P|mE4Lkg@LMt6)X3iLbkFnMU!%%hmwz`#+&$Ff zV0JDgY`>G;RGYa=F2DS!v*zTLDaIUAP)$NI6oYx<|AAiVlV3`T9yk~oPVDJZyS-ig zyzTTo-{XqjM(tO>v*%9WjUxNMQ}%pt`gAk>wEh3X{AZK%^eUgvee&dF%JIH`XLiiw zTypf^4`s^|jhXZF?dm=peDZYqWOsSreLvMI|NnjV^Uls^cb|6aPpW?R^8K0Fy$(@t z-frJr_~y>cGw0MEKfb$u|F5i~4+)=sK0n#YeR5;+N$LDA>DSJll3cR%-=EDt+x#az zeE5uKlS$u_%I!1e`5ikptN(tL_Rpu&d*>E!7WVKydsfx{|D848-}}qe*F3Ei7C!m# z@Y$+D!=Fzk_s+}@;8?OWEq(WEX7*Qmz4zC>3dw&a8N!sgvRi!j>$|&O?>%pGIW~UR zmD!bSQyrpSyAKyMtlz)68`JEjp!@Yk^4+h8oc4a- z{eBnw=cVhD{{qeNx4RiT-#YxgZFSkx>l^EU9@tyG`?bIQ+VAJitodVg&0j%xYr6mU zU&qh*e7YL0{r>mA-%pNorrDZZ`%|jFz26}!>-4lITd&Xh`t|k6ZvA^z5&Mgl{`_2$wc=_`TKqQ%hyhR_@$x$Z^Ww=V oSzm3rxldln`h7!SuHPr~>7Tbr7XHhA1S%gqUHx3vIVCg!0Gg*6-v9sr literal 0 HcmV?d00001 diff --git a/img/body_54.png b/img/body_54.png new file mode 100644 index 0000000000000000000000000000000000000000..63eda6f142c5c6e57f51f3f7aabb74737d7df7cc GIT binary patch literal 8313 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 literal 0 HcmV?d00001 diff --git a/img/body_56.png b/img/body_56.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5e4a646225db909661c302635177aad94b691a GIT binary patch literal 8852 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 cV~ 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 Y=oPm!y`xpa8&Lp6RY#@#KJ3-M0UEIB^#A|> literal 0 HcmV?d00001 diff --git a/img/body_58.png b/img/body_58.png new file mode 100644 index 0000000000000000000000000000000000000000..888cd4d6499ebda050f5ca2784559f24d7051e98 GIT binary patch literal 4833 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 literal 0 HcmV?d00001 diff --git a/img/body_59.png b/img/body_59.png new file mode 100644 index 0000000000000000000000000000000000000000..5782c1e38b00622cdcb2aef81069d0f41ce6b763 GIT binary patch literal 5802 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 U=j#Uhgy1tkLq$iqQqdauUvMA?c>n+a literal 0 HcmV?d00001 diff --git a/img/body_6.png b/img/body_6.png new file mode 100644 index 0000000000000000000000000000000000000000..494e53a34ad66c008469296a9325c18b85eb2be6 GIT binary patch literal 12455 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 literal 0 HcmV?d00001 diff --git a/img/body_60.png b/img/body_60.png new file mode 100644 index 0000000000000000000000000000000000000000..ca7b88299bc480022f3fe63ff43afc0cc714d3e6 GIT binary patch literal 9612 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 Qkd*_#^v(6kuem(_7c(V62LJ#7 literal 0 HcmV?d00001 diff --git a/img/body_62.png b/img/body_62.png new file mode 100644 index 0000000000000000000000000000000000000000..c382deea885528698ae1f26bbf739323e4b5a648 GIT binary patch literal 5336 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 E0Zz0TKL7v# literal 0 HcmV?d00001 diff --git a/img/body_63.png b/img/body_63.png new file mode 100644 index 0000000000000000000000000000000000000000..eadc03aeaa260f1360bbf30946b9be72bd8b8882 GIT binary patch literal 15334 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 bj?pBAdO0iAtr+^905d&iY4YT6_}IS#$aZtF literal 0 HcmV?d00001 diff --git a/img/body_66.png b/img/body_66.png new file mode 100644 index 0000000000000000000000000000000000000000..2af4595c39acd32e7610363a7f592940d95774b3 GIT binary patch literal 15287 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 WW7lj^VZfWXAaxb3TSYf4pZy=0KH6~r literal 0 HcmV?d00001 diff --git a/img/body_67.png b/img/body_67.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e2673f26e9f555d298fd889b204dd6b277d4fd GIT binary patch literal 4929 zcmeHLXH-*bmkuBSfzW#iD$+y&r9(gwB^1R=2|=lX5Q=m$^kRZsibRl5l%|M)gpLq; z2uKt#C`u1RE>&tUR0T5m?tHV>{G6F}f6h8*opaWD&w2N|pXWJyzk4VDVFd+oNpb-I z0Fb%aH5&kc)q(l^ffLBQY8DkWF>gS3OXxKK<6lQ{N7*v~KycUmnz3DY{`z!G5NxM_ zw1qUg%4&XosOi0ca0V;OdzGj>NSC=BN!D39ByVPQ!}M|!fsYjW>QdN!a!v!D$9t(`SYDm)zFp!&TQJKxqi94-Y>GjfymR3oEx|`)mh? z_WY(6JybqZ1hq_!V2)j}U4JMkX`^}#ps7hHZcKf8)?9yT+|4}m>~$}cym_W@9w_^) zxy?Oohs?9)8594+fQVsNhoD2ubJ+sG{bZ+fD=2R+`{CQ~2$gt0n+gR3ZB{>e&66vB z$L#7{xxCRlc!BbpC4@A+$%&8s{!`wRRxAR!=0@*~Sqls-YkKu4I4sQRU;{~?Fn@-> z|E;{y@)Mful>Q`Ymo`;kaI1Z^>p%f&V8DX+TfEU3GU2HV&ogY1KJUzhfv~QQc2_&A zhn&4pz(rr`DZ3035h(9t(@l3`9L-<&IxKzwr}z`O(J5>987ESKC>5Af%vP-`Yyr3?ak?O!g8- zD)kBn>JFdigwKz_55Dy#{}6t`0#B3Z*%pusXDojils0@G{O;ZP*dOu%j&0iO! zkN!(|Qvw75rm^$#dueR2&A=v^bE#-}seA4R0kIuNdKH(xr`o=uk(#tOB99{g;K}w0 zU?uwa{Q-=vug>G;T~;NvBzen7Z8$&K{=#imAw}YBPi^=`N~{5oRCaU+LS^$zbW*qw zUjDMnwcJ0d63TdUvt*Z+3s2PGSDvW+48e^5_|Hje8%G zgU6=t4^M1Vl(mw^T&DJ-xZ|kf4$mX&-{t^U#c5*bR2fu42EmiykCys|eeDY1TOd){ z9=~x&jYNv?N1b9M$u+PHHI=O{JZi8P(?`K2>h7BC?X#8Pzb^h9Xd_7(wnIk-q;U_w zE3#9&^5QxG6ieN-^9qAEtd(V0k5w-hV*H#z!l?;z2U~Z)YZVKOV;K_;S2b`CrWtM2 z0`a)}hx^-H8G?-wp?mvwj0ud4)M)q0^74V6NKFpVPf#5dBp1mWUJxYoYvyo|I>cBj zi}xGI8ivPv5%Zo#4PUs7mWmhAK9`GmbK_v(Iko#D!a;cG!u6$zq+K9H-*j5^7jTC;gJt zfX6RivwKZw5MmCtx&$VjLHEBVU_Sr0;k7Webd(xn{3RwmRP$+jnlCPQ7FHMx*Ou;A zd+GpVFAG-VWVaR33s={4Iyd9E=yr4=km_WddqA&2D^w0N$EVwT!$zzVmQGf!VGrtn z>D8evB>LP4TC2ZM4wo1v@;TE!SfY7z{Ni!+d#*c^lK_0giru2?1M7a6`A36-MT^p} zm^RKpIm!U=Zr{hiGub7o)DznL0T=gK@T@xkn5o0kiU|Rkz&M>R8VlT4dTDJR!rRy! z`swFFdu|u>$W}-(WHZSqD+Fd!@9Rq(lYHNtpV>(xUNJ^76ys7==|ku&OwQ2voV5Xj^eaFWKIeHR#h)v9HypI>r3;h}*$E zw3Mf^CW#ph(u!h4y~t}v9bL+~3%0JVldbh{WOFz%Y%1KH%?nsA5!@D3Hct24qa#xK z7GfZ$$h+FeC>DbGlxOn(l&sCmwdV%SQSI*6shiH7hwGQi{@U?SYs}q9N=O43iPuRR z<8?HUk~Lkb`-3TuisDXxbRX%7C7ug*&UbOvcm6b@ai9m6mC{LT>hf% zAa4U>zh!iC%$2Xw-q=rt60`Sl^M#&J?4bwk_VSj=6{%5C0syH85FW>3z3~_QktzH%}V~O9HxV|T%zs)ypboE zjR^nc<4}JB9C2c_iaUo3n#PG}TpUUoidKNE-QL1>7qrlp@5rxm2C2;okdrvYUhvxV z1+Q>&Y}_HX9yIf->Qy|LF?te|K!IeAA;2h(P)JTmQ+?*to11glzarlb#4JZE%lufI zpJDDx5J!=`VGq>HacQXa_4yDzx|wlJ#M6>$-gH?$m3rz!DM|>pU0aWZlL-oBZ!yYG z4r>(PmF=kf*pG*Dkm% zxoGW+$cI8X40vU|c86m7=DHX$KB)u6B$ucsm2t< zee!<8qJXP)L}T|&oo>Hd;+_pIji%e~npkttRTl-IjSyZ!4AZ0s)8za78C+)PJAnD4V09i zqFf@CiP`o3!N(ho?s-t@FF(CeQIx-}2uPjO$s^Utjtl$yO$h0L=t}n6kjbfu#tUCXk;)l=|37_a|pY zMZ-#?|2C0+C6!6*xSRZ$MXGFFbGBg}<0uar{A$VC>&$y~OoDtYI76r0Wx`GVFT>tw zyoDBR#@lhA5bu)w{C_=7ZNS`Cf ze`(4#4F0N)albw!moq0QYeWhB3QgCdRkevq$pRTrG#gj55-K@VjTIVxWo$VcAXIJa}Yn#)tzlj-A zN}681T3*ln7YXGF*Z)nM8jDHljKzi8+T|)GE2c;+8zJXZZtI5mqAz$(<*ckqNY3Jt zBYFicVD309^Qv5AB3c0~e4X242CC&LPqDMk7GbKhS6CjC!j=80z!KJbvimm7*@gTp zbm>y#pA8C&0=KdtzHSqj%0rT{;!GrB_`~CmrA;5R^0DTSE+~EdFLm45(Z1tuI~jT1 zn15Tpit^~A5n%A0)#3o~mI#*gM>x$GPm!^ImC{vSsj+SDCasR4#Xs#7`(An4>G7S% z9CRDq2F<~eZ)9EON|@-})<#xy&;|GB(I?X?D?MC1vqGV5#m2NhwOc#gb zrqo|Dg~3BfX%goPG?JM0m@+JC*P!OjpioCKKVJy$ZBs#s;O;EzBhTH)8NU7rJLQxK;AZmj5!DWC{=y`wCOQWO@NpG z8NCLsi!og+bGGUWD-$TpK!AU&WI%6%=xVJ>3n}&fKWp#a0Bfhgch~345M>dsaZvC( z$GlBmKSEGu+do|T{)1KYKRA`Ax+=%q*J=}hW~gcnJ+X0sA8_-EM(wGQbKgq;M-2xF zc!r1lWGN>n^eGI-7MmF&&(*iorCsKLYJD;k=WkU943jEiOy;|TRFeZ)?gXSyr(?D`h_5bZ6QJ&ON7{|^ZC cH!(O4Q;w$mdr;??Ju!g!b*pRDSKS`{2VkQ*R{#J2 literal 0 HcmV?d00001 diff --git a/img/body_68.png b/img/body_68.png new file mode 100644 index 0000000000000000000000000000000000000000..c5241bfa6142f7f537b387aea2b0b9749dad659b GIT binary patch literal 1103 zcmeAS@N?(olHy`uVBq!ia0vp^DL{OJgAGW^*|;18Qfx`y?k)`fL2$v|<&zm0SXew= z978JRyuGzMJ2;Tx_{aDhlMr1E-5(tfk_8r)3S7A;=5j@8heb!z7yg2Rw^#C%EK1%e z@M%3-(h(5Ib?qQmSwWz{@<+mfjx|@qPM2DInRnz$$cfkO-+woH`}q|;II#VtZ;>)1 z&}vcv?}W)FcV77_oLU*)`73HKug4^{C3}7y$v$#)!|QxN39!|TxcvtR*TSu!HP8TnB)<@-s|t*pp6=$T$hgZ zUTS2%bhP`@`uMZ=(#oFvpY!8`qg9#DuKN8o|K8p%=;`-fy!g`B*O!+0p1qY;HidQO z+^KzXQ`OWD|1EvJBzXCf+}lg0>n}Y${qWl>Ar)V3Dilgfwj|yDzj2|Ws;5xj=jT&B z9^TmMee(DBj~i72KmFW1srL7yVm9{E^3PYim5>UWG|&0jvn89;5ARs3JI8s~u2YXo zOIm(@`&Lk&;_~auO38Y&n-ke2<)_=#@jO1v(_r$1^=8ufrB^pP`#M zVR!lCl=}Lwu1ovx?+kvgn;I?kg?tf zhpn43O+Ww0wN0A5n`*1)%$c`t-;1xWE0pwO+ixv(tg3qStN_dK7U3)Q=|H+olL^Xk^#fRCPgS9|X&_up0I zYE|NKYlGq+>*)PhbP0l+XkKnqA$X literal 0 HcmV?d00001 diff --git a/img/body_69.png b/img/body_69.png new file mode 100644 index 0000000000000000000000000000000000000000..e0ba5ec0b5b5dc6f3a44a6cfb96af0f6248f094c GIT binary patch literal 4209 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 literal 0 HcmV?d00001 diff --git a/img/body_70.png b/img/body_70.png new file mode 100644 index 0000000000000000000000000000000000000000..c18032c06ed47d8bce1fe58b9ccc836f96fe8d20 GIT binary patch literal 15196 zcmdU$cTiMam#@3Y859tZB+^KdEJ?DU&`6LVAV?Ac5y?46K>-O33P=(`P(*T$-5`>K zAUQQba%hko?{41j{q8qaQ*)>8%$=&Mf1ILwpL5pPd!4n{?^&x~KhRJnC%H-jfk4RN zDoWZA2<|lq1R6_306x*fK_d$G{D7`@MY{05)|Wz+5NVZ7k2Nytsl-sWf$`m-gdG2v3OcjQ0;5= zv)6Q|#brTcF?Cvi65c^hYCdKBAbI&V9`dw{u`#2Am|EEQRp9Y(fu-uB8-us%{Je+DptdBnC z6hwDioTfxxG9J1T!<-q}V_Xp%UIB*O9Uz~a)ZW#w=j_32Gf z!hZaGg0om>BjUCDvge}cP6m43hNcs~4cv5`yr9G&H+kv@Bx(fw_-B_T8Uh?RrEp(m zGY#UN@L|qzCJAMRm5N**sZ(j3ksS~}xNI3z+&?8$lz1du~7ug6lBB%7>q=^uk} zrbg;h2!{);m3^eni=EhyYibS--|8b0XWnaC8Oz8JPOuv5e#fvWdX|1!u4)|{9&8C- zd7kd@3}UucWbS*kRw|j5ALU_abl85hTQ|_()Hz=1vP-RrnFz*DpuG~dJ?&JobbIOS znVAH}Dy%i4u*g5M_b00?Ng!$9DDw0CTqCX+ETfU~8H5FY`V{z@vlcE!vwhtc-56v` z=sCF=_?3tvPL8Bb-qG+~lWx7`ebWOjzMJz~UkheSoaQJzyU%MdcMAMxiA_c--k92t zea9~Nm(rdNrRrkA%8$X1*p;1sCJA*hh=jF&`gGH%yM_70po;P`YG+T zI~c{ka(-ohvqvt&*8kKt{Y#Y)DNLJM8^-n6rD5@{C>Kh6SGYEmgtl}xim zi+)mLOKFf%;3{#javlr%xP7rUs5OX?Sc5!T9P1@JxB8MN&O`_(SRt&}B=+}?+mCyn zK!~U1hKKg-0{+NsO2T|0QS`SH!WVlNyEyKTfT`6t@lQT?8hYeUnRLTcvS(F_!aBf1 zeA=)WCos59nx*Ds8@Gv2{*gHwrLn)H^=WHBQDtfT-SYC2^}|IS*{3R8qN!vJh)=*c zgT@vC+(oAY$+YdjUfj*gkM(gd5CSS|6e1zMBKJjxU&3&DO3CE=FvHnzga^jP%v7n~ zyUV4N(=l)k4qXm`JJS>WP22O8D;*}9cB4%_d+v~e+q=3wd;+W(H|qPU2j72vfvl~s z&Fiz71YEZ)WMCRsUhd6#QK+HASKR`+&Q176ebgi%VYonjG(8S`7pH02vD+b8T62++ zlE1m8y))vsp?h1E(;BvRSL-+{Uo4L|9F+}3AB=s~lqq+pJxcTF*Nac^;nA+xXWo10 z^aK)@5VAn6R!)k-Ux;B@aO=f6PoIz_Jy3bS+W#{<-MReva6!~yriISGCnRdQ+>M4it?WmKb^ia#15^G4pi2QSsIOUmz(NzbO1wNb8x`6|17U< z$f6fvr-GK_0!>JE;K4(tP`TXm@$6h8exj3`n0>q%i<=k=^xcyoZkg>r+n&=S=!B|* zbQb@bGfeLH`thNAZXMh*wfkN?cPj3$|NQ)sz0mYQY+~!Hd2Ua;v@};&);if38s*Mq z%4_UIR^Jg&V18{FTBR+aS$bNYO4Xm{p+fPF{^FkL(z%B~{dd+12f2CCZf54k=Q{&n zjik{+mX$+K8^f;9FbzamHeWvF)GHe?Z82eXWIm1j?H_Y3v`wc7_WN@san7{g+iQUn znvQmD^k#IZtJltn>Y%O9Wld&i^H3B&FQDdUeoL`n5{25)h{Nh z8eS5y8dOHtREXtJu=b>=tM5=T$!OUZ>GW@n;hu0S5CxgZx%w@1v|~35$!CNZlVI^Z z5h9J^t7+RO2ElK83!(h@ChP{JPgyWqD!gw(PU@u3{)Dj34>TS#H%^qjj^40mdEA&z zNO_xiwQHuiy0HXtKan3lxLhG&QuQ+Nd#T&cHdj7|XA#EzVt@RpAgo~IIe{!*zRJ`& zO_7Al@26~J^uSYS8-3*~!HAu(}{XVrTPm%jIH+=GVANN733R9mg zx2$(_D{1?224tf-W`b~=2pb2!Cam*DZ;yH5Ik=@EJ8izI1RciT5R$7NLCc${R?9x^ z(aLdqxRB=8!42Xk4l-w9K~YaZvmE@}Z2D8GDanC2%3kYdlug&1IwwUde7I&oYsov8 zl+C1@SmHPTMIi+9^H}{@HrU4JEqBa|v0s&bqg77Hyh^Q4f4n*)wK8Qfa}LrKup1vb zcVSn~`F4X_N)-BVCp;zwhtm9jJ_+khSJO-C54j2_;h1kU@{${5!q(~*?3%;)Gfwk; znJ1&mxz<(JnbjY5tSo3US-Smc)k!bB-J~VBJU@W<7%upmACEfwCW`tEMKAWn?^YT0 z$8Z&%!aMeS`X59_-}TX_3)t-vaoyj6U;@-LG_-=u1;>qroSsY{vBor>iaD%J$)HzP z#>NavoY<+4pKJ>j9+RU!hStlz zt%#W2$Ym76v@%N(_}W|OP_ufUI9=>dhF+5AjwpPsce&KJU~(A(X#uiSkDvNC4`{MF z3wgUJ6N;bgRr-mTO^R6%{BFl5{uFN{g0j)CpP9RgHYa0MUMyyVOD^dk8=<{WW@H95 zkvbn&_`Ml(Y;F)|Q2KoDV~PnXuTM@}rR0pBYwMMgxpk@gQ4ESLMdoF0?j_#C{J@G2 zyk7Gb+Hm3+-G@TIvRG}({d-wh3@SGQTeUeMp3hhH#%d|*SXSb#(^|^5w-tXJHSH{) zoP4YFY{(4K_gFJKYNm9VlU#K4e#Bq|_Smf&x4N{t2Yw4}alY-2UaxkMxP&r$+8uj3 zNR&&I-{qut3xA~v)=L@d&!24{7P2%?pYO|W2|e^K5e6xO0zNVePhtM&yoDyG18(&@ zv&=h`M>*qTleLe0k_KG)GX#TJyHi>dO0v|MKA^@%etj1=@!Kux75G|c{mAbW8q>`n zVugeVmwgCS&daOX5N|YpP3zz7z!1O6LtU~7o#G2u2&5&ko%Y9JghlGZ=MjK}1q zg(zy)(8x2>oKK=jch3|pQv}{_?DJ7zxexSU4WdIm)9OU zF2y)y@TUj0@c~m5zLz9URC!36k(+vbin8u7qno$D@-UE+UrWYFqqtw#;nn_W=7qz! zxNknSc}VNR%kzwCS43o{ML;Ev6ar2v z!)AzZmAFsDzc$@dyw+nRB{f>%A&@9{#6{V7XjKy#na05=E_`0xIx;oo|BJHLOs;>u z>KOWhJ&9s&#+8mvv31`b-yK#8(y?slO+xz{2mD(Hz^R>e)X4>M@}s_?9!>QjyF1_g ze3!bi=Q$FCAdu(c3O z5B}gF=Z<-0;wh0P*Xgwbx(b1^yjfe!rkt?aL>Z=&L&}z@b|6R8xt3{V1<+R zFY3ob4AFZ%8Y_m)k_y+OSH{PlQEoLk9Scch?&E$YwJSRy-k&5{Q*p)4F3pU8MpELU zcV)<>J%?U@GL5BEBConC;`4oL<&PlcfqkN{gIm6bHz$$6U?4hE~S3I+E!HTC@{WeuVBmJ77Wd~-!^rokwP`E@jqgRZgT zL>84M2o=ZH{72Yzu}_hV?^k-#H#ZXF7&=6Wjs|n@GgF5h|L$VEQP8YHjJBac8{a@K zWkYIGt=kW>2*rb;N&isxGJi-VSwrdw=^}PI%COTBLIaHvOq%qDUq|)l@q~qWqU;~j z($Zj59@4giT%5(3;19VUl$rUE)-(j`?U!YMAhm%cLiU}m*Y3_L1t0VBR#$zzzLPh* zf`}m5NDl#f}BrTAwxYq>&DU zdAaxR56B#4HP+s9pKj_E#qkueKYEgxYX(O|x0cPX6FwHMc)8juEi!=LGFGiF!`89j4rhy&hXzcq4kGu_Uhl%NXggHbW`4d?Zgn{aLV+0t{tKo#w0V?p?- zBRyIAw$4$0nYu7|2maRB#W}Yk879EzB959wb1DdD#kxH#$06yy9=)DAnPtPCbf|=& zq5Q{Sny+^C}^qRo;t?i(+p?3D@*SP})QcX$8#H8>h` zv-nGO@>M{Zu6xqevwm)W%Aj2I(lI8m3}Q;KLGIKgXh$MyZ-cqgR9D+|ZS*4$<%NzQ z!+Bam1r>F3yZO}tx2M;YJG>a*lX{8RrcN47W~Qw&_i~;5!;EN&6zz}pg!zmVVS|t( zb@*8|cZlfc>GD56Vls>+&F|!_()VqL5%|}-@fyp_tjUpVZ&y8;Rhp7=f5A2P@>@

;XwJV}u(itZ#-%-L8K6&KFJ$g(&)En4)sZ0KHm@s-3$$96hzzfo# zfD?`eb9e{zE%lAAo}tsjUa=QuUW&LtTxCY-Ya6twFQztg=4g;x))n!6w*?LZD<#@o zB9s>wl)9MWXG5R0W;SHJy^~~~>%L+S0~snU@_w9%Gc*C>5h@rB#y+3rkh}LvC!Y-orvZVa4P>X z?6w6#3mX$YH((_1mIo9+bJbs5>pJ=p0o@(dz)#4&2RsOvWg|d8EMM|IdQvGX0P*xr z@1aoHhil(E`kS!^)`Xg!MpF~Bwcxo7nlf1_AhMYp;dk-(yHh;wuw_fcq0c&0`3pX) zC|b_ATs47{OtuELBXNT9GYw<5k1huf6uf(K5Sx8)H1g|<8b7ZE*!=mJnakYWS+;gL zUgLp$>E^e*j${lJJb-F^HPQ;rg0}xa%mvxIk-T_aWsd>X&v6j2LH%F`DEZy9GRhAbQ z)}}Z$hdKSg%=kLaD#=QF2?HS6=9Nm|yB?+n-T@XecBYm@gCo$I52-o4v(RT2@Smfi(4 zEZoN2eC#a6`3-bFTZC-@KXqry&UVhFSGKdiJB9L}Y_ig*a=TMK#dBuNR^&k@41PNm zu*vzrW6WH+&$+*q^a;j1BOv$FOAkXstjIZBVLfk)k;6dwGti5-1OuNIcUbruQ)5o& z-Ps)d4D+5ymdr4Y^lUt~1T>@Ovpw^nQb7ggO ze6)RNNDqtr(ofrzJ$sXc*iQ84#c)-Ijvj2g-`dZ45kQX#SaDrmS)S<)_>ra z=#dH7=2YY2mz^(vbG)|&kg!%Fy^bQLOcCB+{N6|ll^@4m{j7_AA&Q}SzF+&wH^Y|o z&P3K>iDnX#gU!P~hsaQ3Kd3DF5BImK^=-=~uc+u;xUTY`; z-2vVRe0itqsC|L@ouU~<1ni4Gh#-pziMV~Zeso`2lcBKOQ!dNn0eOWS63JzmayMRw z$}$Ls&N>yf^zkE^KJaX3)Y*nTfYb!Rt9NjIEi`Ift@Rj~8f*ctPL=C~gsjg-bzQ*80hu17_;HXNt_e;Bt|juR z84Ko-nfHQfJgjAGsz*ci{CK*ww4OPzlT#yGdLh>|2nq}5<2We7cVuwXBe0b`JY}=g z`?}TA^0>y;W_tHpy>~A96hP$(&%MzT^y#LxN&_LoKq2mdWyh&;`}kMn6SNERx*3`j zj{{E941oJH%>s@Rz(e1ttLr+9Hbp-@NHWlFYBce-xpBYiDnV@O@0LX^Z}H#0-A3s? z(V}nO&~RS%-R=^R4A^;gyQbDFrys!h!SIw?Evj zHYPZ^OJMsNFrvL(yF!~6^JV?o=?x240VA8*KlmnMh50q~&G%rqF$d@(tTsIYG!1Z2 zVJ&B}6LLTeqoC=wxDB|z%u596*Ca@`1C;gBU~ow3z3BN6YEBmSys3+O5e62_@3jUY z$c8RcP7+Qw7M5%WVt%fIA={1oHLn^2mN_6mMO~HeUkG5DseXcHCB`{QYj15JpNMeq zL1ep*_|3hMcU-HtIrrBS7uz1#T|Jy(ba1p#C!aPg4a+d~`W?6$-tva?^J4a~c7@C- z4~gZ=mww~cY0e~xtmbcGdeu|z`I`vBH%m7gI?pyj<|043NcBl6A5#RA4syU%Go;Z8 zpo%a(QtZ3gfB$gzp?+Lj?_!JHc-6{Q>oUd#xWm3QZoa0yChk-U%5aw5?MH;9MReWR zNn56(WPLsv5&xa9wsz{acDE5Y=n(GxVXHhUxV9SLNY?|rdL$wFAWWY7uYM!bPw)bZ zJ=e0B+*cb&<*4>GF^Aw?5Wk8}!oA!V;#T=2aBbi242fcg+MELZkhf0>aaA;I2+nw` z(;%{M!JRFK+T#4iTQ76D=hiJ4;6(P@D0jFYnwxUKwQI=umNH%z3t2u%sRApUa1Qa- zTs+hXwo#^i`HQq&XBdy6t-$a2NKcv%4ofnag+Y@C$fe&ppRcLWUWZ2%kNr4f$7DrD z2phoN1q0`4G#fh-0O5N{dXF%7JAb+~JU7PiUDS%jTt_}`OCHE4Nh~y2I}sZc!T!Zup7Q)AA!2IP^mxUd>b4zt{#+3II zUfnt%!k5dP6>pxUm0Bxn8=XuLp9D6W4iwWJTs_sn;GFPjpm^aVopj)(U~M=%x}^EV z5YQ8B5XVLf)bl0M8=BF1-}8S@Nm!p?!^ud^lCj^I&4g=@vgV5nSH>gi}d{T1c{cdoW6*B^e76tLO z`dkAKSC2m((ad!v7KGt0_JA$!o$deO^cNzoQtr7F10`=?--j+fEqW(mK%NgVF}rWe z`!}`%hO5jk{t4;ip96KrmYAV}-^oYb01UL@-gx^?Thd=TBSZEy@KNb4iGQFgfm^pA zwLuw|nYycj&?>F0K^{Tt@`QrH=qG?7oy?)AFC3~F?q))c;wUwXLwQmMF}FX5 zpftFV&Z0_6TJ5)>)*xX)5Fl)yI{hSD3!vLbTia@%->QaEQtiE+S)a1l57!onttxpq z43owWs4#^^eb%vZPNIQkMDo-QT^KXgg_TvGDOZHg9T0 z83x%QeNI+cSIDkYIG>s#p`JpUTHe z`8-hd9&zHk%mRTh;$wRO$gV|vaSyh&jh6G>c@FOU7t6}i{3pwzm-Q~cyt9M(Q+ywh z-6aypm2*WT3G?%7bykSab6Y}FjV``|Z_G~*mIlctsGB4}!Q2>o&AUvUqO8gTL!<4J zU-ifV9WhEsU4M=lBeD{X2kNW?SZ$~-7@{rl{`PHyff3Igy65u1L2QUQfE_qPp%UpZ zI7vKINoeOPiez*K%R>JJQ9TjA=4oWau<{DrPMUzK<$(<9?$XS&&9&?TH%zWe%R@gS z#`R2-wrPrAFaLQZnvMN+FRz(sI`NtFy|r*)MHjH*>c7vRW?$V!hElZxTg`<7xx%cV zGMR6NCI_0=w6d_I%IeKk+9%?WnxN6lXt0J&77#5mbwX7|#&7vWu{OVdV_6zVe?OEJ z34XuS8EAtQpNOWX5G}RId-QDCusC$|qf!Ded6O5?M~R62?O$RDu1bgd>dA`U2hYAN zAe@{#ca|?;RGLu8?1Sjwe`ukTVBN8aU6pe5o{ZdtkxHVu^ptuyt%X6oYr-1*J zW_x0Tbp^+!KFIMFE%UF#wfBsG?uq~f0zk|mv_Pz(K5M0lKT!(fm2$d}mlv_KPt~!{ z%VE3PTweSE$poPJTpjXn0O-M{#j|6E8z$9=p&kuT>>U{&B}Nu01^?UddKVv`q2S;E z3z+!Q2@CMYh(O4?jR>fKnBq5(-o#(Hr=14lmXew7LzV*{a&!AR_S32D4>Kq<_Vxcn z>6?1J+$?z94jAczp01Md3h|$-fcZ>bHj^z%3u*?@k65F-hRIXnjT;1VnfDk`FcS zfpBHhd&hD?DxMI~$$E?8?*Bz9Zi0}g3qs<=PZXg1|HK)9TfL9Lax2OE2pU4b@r}v# zjI23<)}g&~ci9pWm;E6BM$%87o9f8-*w|y41tf4;C>6M}n`=={u~6AoKMKn*JjvTg zo$7qeEMLumXZdL>l@6xR6*DIAf$+1UN= z&f)h4lqrV4hyDyFUbW=U<0&AJUr_vs5`n8`aa&sIY9z%j3lo%qO$vPBx*J+b2=-u$ z70gVX$J)q)AEZX=#%b8Q!5k0-81cn4ai5vHbe1(y(9;*q1hV^UrMJR&`1D3&*?doB zHfN}Ha>Im8Mu2LGn0c&SFrq7Ijx$ZV zAs`bq-}|h^210npJ*SBa=7{%?uwAy*K|-3WXTmb(iO61~X*~@G(EpC}cvo`54T1nG zTY&MIORZi$hy(oUyWKgc31!DlTmUNH$cKLw1;YQ$mo)!m{a3z%a0m)tKpx-8S3@Lp z&sJQ3&{uzl<7b@OsVa^EmK=2Yy4jh+aBZ>3fwN{CPY&*<{|>lsfW?7*CKl`glBIuQ zVJ`*vFUaR7)Iw@3v zq;oy4faE}eVV~6`l>a~9G?zQ`)>V5M$`i253)+%4eb!!s&L_p(^!L>tVem&;p#1>& z|B3nWUc-2YaV=;f!bc7-bj@_qnMizYZ1(#Z2Wnnvy8Z`8tAuqk_YnyzS(>u#009jg zc~lA976v^LuKgopV;$2C2iGAS#Eqt){Fe7McQNo7=oATy15Do!4^vmyGd)<^Ev$wg zC<~AS)kukNWeMTaz9Iu0;N|K9vuO2(sr|0S4?*iL`WuPwN}dh!*qb&;Cu~j9F{eS5 z`r$Kj)4uVaQpDqd>I>ft0DtWcswINW>y9bI{4TTdY{SxsC&|0))JofF*@lA&7s!N= z%MFnCcRAigWLG(vx~_qFcb;PIOdKfk5Xen@>okn@btbqrS+&4zcMxGD*Ts!0Fkowg zoUDFI)Lz36KxDrH-^pUX`wGHdqyOF`NP*lRwMG3z*xeq#pIg|rxksk{hn8ZZ;-GF!7}fc=IZv?WXefJ#XZS5JfTa6x z6p{=UmquhGQX>_d-g7t?na)0LLC)OZfF`t~~2*9sO@81oX z<2Jb1MdvO78-9<|nRZnQG#q>`JpS$w&>8Szf(S{iZ~VLI0V2B(Yf8*N8bU$Z0v?TV zb$@LpC}C9yVxnroM1kcOWgc$Km=n(4+mRq;i2FrH2%ZfAYx(gbCx_icq9MN_9biyG zX))j%xGJyyP9UUlt}kbo%}4NJsaG<;A|k<3)^+8}&dIK+^0r5{z}2LS8~&G?O#g?H ziT}Q?*#BXJVZz3Nuoe{H$$D!O?G^Pt(9iT@QP^G!AX_3cL1uu)@Vv74K^G z3$np`1Uj?!+}&}obxYuuAnmo!kc=1TNm2mqtzo?HVBDwJ5J~Vas?Ob&Y1_B;?DXH$ ze~EyGW`mwQ#GQ(#bN3eH_UOmQ#|g<;32pza%Dbe?1=n7{CLT(ij906?Muo=^xrWR! z6+IgEd0%D#O6q?A3?9Yq{%kgzD^C>Mc8Oocn1C(}P{Xw{)z^RZ79{#Iz&08L=+Fou zVXX(CwJNtlEEFU!9oR5I(*AM&g?`B3Uz!ZNbHPWkm2x&f<5lhx&1C6=5`^tlMny(V zknLeNG^)A^7fvs>=){b~RuF*iFlm9UFcxyfs)lGc8FAvGLty)$k-J?^+_H#Zx3&Tx zC)?>F0PjPcPn8QRqA50vYTt>wZ&KKG2@d`mR5)+E1n+nbcI8(opl5q~p*t(LM0ns6 z5&G=dyu<2qmn$0%+CNxR|1HC}JM|m*SCiEC{1+y1>WFtjZ<(+-5(siUV?WFA}aczdQ?#x6yDI2&&}_BeNcGyLl9&8RP+hi0aG7S zzo#W~I7ky*Yvc;fc@=l_U6uag&+w@Pj*A5nio`_wLtJr76`8>EubE-9F*P9Rm%j`)6yj1d9zB6$abTQ(84L*)P1*G@ooO-2UOr|7slDCl&ZjG2V`2J++( zvw2RD2C51Sn#M>~^mI@!^-V23ym<}>)85B6#buP9WCzzVCT27!XJ>XIJ(mL<%6SPIUPxW^3$vSoVQ7OvLoL{}Zt9;n*#T=@Kb=PV2jBgz0v;_sG7k z3*QP#2Xz7U#OvriwJWq1*0`0BVQRb>T^Zzle6I&?3@#;3MnnnHfPvsd90LuGM-!AV zSH*o`JPwp1x&wZl(2?C>E5El%iGwe%px{WZ^86qW{j61y5>;f5I=vfdw!iUN^-V@0 zWE$@*^_nl2O9NS*hGSYQY6drWb4HHxM6ttyQt5%dFFA(Y{G!up_1 z-rd$LG6~M=NkvEJ)C==^bv0#2&(VYWtcT&+8HEKDwJ>gvhuJSSI}K=8Dp@@Nif#>J z23vG;AD#Sj+hbPWUaf+Gx`WxX^+Eq`-d(T1I+-((CTJJ=?LPiQ+~3K($_N;gn=Z4^ zX!snRz^#0i`I?$7j%WxMek#em;h$7;8W;8Ol5%9=-u#}48T$kBH5FO0I5X#`;4QN8 zgTi*7Y-`~fTc&*c0J#?xxIUiwjr{iQ4@H8;9IDmklBdw8c&I3Yh>kl14M<;l)Gdm0 zyr{^MYjA`syv=} z;C>lzdt__RQR*qtCyGXu1a#@FCobBLcfw*8TJgKAJu z{>0$*0{*I*FhzlT4)zo*n`zM1igAiMPvhHVf{>?h_#|pgxpewcK4Z_&4>T+ZG0GIuyLm)atd2d7aD?!BAVk=eOM08=u?O=_BLZ@AOxh;Xk)q22 zQotW-X{q&=L6b4afobN@vfU_8l3u=l=I{2>-pMd1OvXD##*ONx*g?l76CZwz12QAK z7LZ6+GKy+<_nl`4lbh(wa5Rc=rhGV9r}$npS@f&N0W!V|BC(jf@xFW$a$Y?=4>9o8_4q6CANQ(CqQ$dbeGkr9ceYF zL7Klu?^u|cNSJZ*)KSN~tg?Bw#c_YKZ;a&d5G5++aH*^4m%3v~n+K7s6|H5-2>mlo z1JsHAhqq{@bSsLrRtdEGnlcT=Fy#R`;TdT)vnP`j&;}bATNIh+nOD`G;WJy(Ch*IX zU@sqtAyI+I0e=xq5~F3D(6%&cf8Gv{)m>*aW{LR=s{*Eo9Rd4Ya+1}kWNui3x6m8D zK2Ax_ife;kajEO~AIJB$ky#vgt4|%QKTy_&m#{9o)tz3P!h)+3`c5D`#epK)mkBie z+&Ib&8btG98$u^pKr?0oYNt6`1(6^{cI}dlLpVO^1r6dbXfZQ2xZ7eNh1ztcS}$T{ zBgtZQS3+b@m_c5*&9;P)g1jrphd@qkjnArx)g5<_oymOn;zA&Ay!5DSX{6v#;=NdK za?mY_NQog^vgj_*E|~8>atUb73@8letG?p>`<`>6P}?R(es?|Ut_+$hpuf_5|KcK( z;3A&u!AB{k`g<|?jnIo*SfM;srD*cwy5_uv3;2bjdIwp#K2c(C!Sn9Bo1}g&F*+MxAb@h zPn#QHTSx!*$!0@0mzIeg>g>(ju_JC?`|dsxqd-!7F$-%}kk`naoOq!-OUWd2DbwQn4;EsTz#gBRxQ0UPFrj54b{G1$JJ zixIR$naq3auz#6GZk}Le7KX-X4wLzcst0lD#@m%qMO9D^FrY#u3opzXXfoCvW9nuZR4 zs;-bYqQ~4qZ645%nalOBdHyxMG6b$$B!F;p2hB8tbb~Z-29NdY4_wlq z?t^;!+ua-o%+q%g-D> z*qXAK%KG19{u9|9$U?!W{|3bT|A8vJEGk;$Xr9wah0IZZfP1s+1%v8X=xN)H6o?c; i{W(?~ax0&n(^>yqyu+>j4E$Uc0>7)FRB*>E_Zh0jW`n zN|S_UAb=nx!O#PjKww_(_sv?f=HB@+|K?lsC2Oy&wcq#boPEwd&wlnkF?aQ09Bcw? zAP|THuBC|pf#{?`AbKP#GoYEcFsTasFh9_NX@ZW9zpvYhQ$Qf0T)3vXQ9urv5aMdI zo4d9#6!54fUc}kX4yi>Slaf4J%!SZ0Z*00dCyr*jh(>Fd`mtx1g&K+KC3&r_8k^iE z`n7PD1vE{%yBoPBH(vkY-av@r@ydO~r*!2HY--mZbO`!W7dg+`+12zWUY-B0+M_IS zGT_%$??L|q6#O*H{vXBF&nSyIS9=}Af%*Mk{RsW^4hC5k`E4^y56e;MI9Z#ZpejW9 z0`=sV&F9SU_>9I`I>tU1X9+j2KxT1QY_|FgvpiP`=iKG=ZiJ_SfhTS1RHJ$yhg&3;j}(YVij1^rytA?QfUsbf@P?B{ z4YtT+ydxqc#izJ1D(ciwxMyi)nt%(WD)jp5a|6yQ+yCKz|86dSt2@h;s3Y4Z4*lb` zf`3(N?v;U8VwL6+w7w3l;gU&SdLo7w2Cb^UN8QXQ>Pb`{-t2$X)tmiTdq_o!cCduy zxZZSCEJ=p3?^9G%;b?ggG?*teAEHCuQq6F0zD=DMDat=o*jQ3p6HjROTT5qSo60?_ zB@w=0d$etkVfWtg<#vxC!il(0eY9Y$ZB0$y-kC(WlyB44bVB#htNm<+4C6J*&H;+t z=ir|U`b+*-mZNhawt_7zM&xkn;tyQ;1~_1P!etzGx8 z+WssSLk^=OW_0KdJ$Wj~nhtB*=vg4Mh_vpso1)s7LtxYu}&aH2(G01aZHcO;r^D%s%1AE{2G65-48vAtv;oVP|V4C1wwO6Ckh%=JS`2k2{f{@nj6Aky4HBC zhB`YJ$Oi`_{ftfVzyrhK1#;}JT}U$W*CwQzh%2&@^Yx~4KaT`chz8cvDt^E4`*}Bg z_cZp?W>_8ygfAGTrDdRJ0+;anhdXGyP?01jz`@bc`_m{I#bvF%Rn$fs`ufIRY&Dn4M%O6+ zN|^4ats3QDwY@wBJcN2!&>FP#t%f;T|HIxR;!ikHQuU>Nj@B;=W8WJde_Bh=z0yV{ zEx^R1HLx>BwBFs8eRtx_QEqYk`7KZFWzV7_ti@xv>i#RABN{gU06ypAx$~>bw@Ty) z>FhigxSA=T_))%dDW!eqeHV*dn&&g7&J*GPx)S$vlHr_p16pTb00D!|t=ZdS-`>W4 zj9eXz>{qXmyA%`_HYv%v&Zlzm zHaaBw;PkNm9a51R2t{eiw$@9nxq@QJjb={O)V#nuS=SBlE#u@;+q0OD&s=9@fK!|c z%~q`Ykk{VcRXX>A4=Yt&h*EiYAw04W0)Z#0T&C127uiBR^qr20BA3D^pqe&hB8sgio%pAVP^nMhr28$6jk-MCAWMQ%sNFaULgJsFXcHaXdTLXo6VbEB z(Dvx?AWJWnzt|@;CTMTn780pJiq{k}la)O)LSYxd=D`<`{J_?;FF1=WyOKbw^|BYxH`em=;y?ruEGP~mTB*WeX)jr zW@l`u{eTaPkxK)XZecPlEo-&Y&;%t{!okOPQukTuGhp>@pgOE7%W>OqA^Qa;dc2`& zv1`W+=8GI3Foc{}ClBp-viIyQ1j_Y|{r!7$gh_h%mn33SB^~c(+NRfl)WvTkYEYyY zH|2K0_>`(F*ImH6u&-|y8}FSOIa{5+uRc%6=58)7xWzFOist#v{U-uv;!WMpy`K2| zoUK?7*F$o4D=C>(;7ZW|V(>evBd@G<_#OmuGvKf_OG%0HWBC@rVQG;xh();He`?2i zTF4t_$nB}2?Kv#`^eiL$Uu9}+*0wgll1v~_3E%58RLlo+ad)LJz^SVQ{}p1(s#l=) zxe(U$Xy`$YAl~z!Y0?gqhq?47x_i!4b*5fH5{5o?`hx<;tV%+Sva6HXt1^fFZ*#A% z`tJ6>%F4*EzEW8kR9E_iJPb1BlIGlZsWPB5{gKM`*LnQi-2S^x*{bK0N|T4WEcm9+ z=n^V;=T{N=xc6mNomWp>nZ>;uxMgl1|c_nml$K}$+=i^HHe z@-s4rhh8p1Oq#Rhs7H|RXz@A$%&>kUp$3$x{x2-t9>Ji82|KIq5P#oNI~%oRqx9_Z z+Y%DyNXuWF4?mw`WKWSl6YJz+k$nx_P$DZ}oIX?>=4h0hD#+?64mJgXP_n#iJHWok z>j0G@8D-DN&f6$?3Y$d@qVzr>#cHbTP(H8Mh+h(lS$-9=za5c&np{$j!`9XLB)&L- zfk^9q-VuW}klv5`_<4BrBSVa=70MFA=qe|g?^O#yv!Z@`83TaS*eN#RaL*k|VjfkZ zKviIr8pTW|FKb~Q9v@Hm*|_e85A7(8+7G}4M}cF)(f#10epKnxW6YYwU*Ic`4HDx9 z&W5+md0h!$z;}77^Xx+ktN=fSCv|FOYO|j1scdVpuw{ARYiJ<;mVrP>sEqE10SLF> z^5LhqN1JrM!Ih=K8%^isb5m49Gh6u=7nVXpQ0ifm-f_f-*7*rL+ZR{A1*yP+m?lNF zDo306jMYwC33EnUr#1|d&5}Cf3&2-9UaP(LUTlK)WM*lI3a^ljrB`+9>Yk{i@t-D5 zo7D@M4LNZX8>|E<{@OXyM331_w*y{x#LacP5B>fwgHy!h-o?Uc+y!GW09W3tHC zu&;f>z@Th#NZt+a{!vj6zW>B9CE?VHjQGM>ri16*( z|8OuVRkExsRV4Eu?OCgunqYaka3<@$-!K}8_WNd~#FGG2u|(kS8vgjlA|)r!@2-q~ zxT%-lWoTk`?lpivUl+e4wRkWZ*wsr?xUIengNx=k2D-Mp7UdGkyzIQ4ZXB6O)u|aS zR_b9U|6A7$94@(VHI+=#}U&|q1!uNHQLyC&CT7-*g*XJ5e)oNNbs!T zj|L|^@_r=%qdCkE5Ui&!NKCGc1E>{L_U;bLP`;_RL$Qib2=9yU&CMU`8&WO!XU~K) z^-dWYY33v$EPYsPm@)K!6*MGZ;;!^N000oQFDXIA1-GJQEbjsvf1swe#m3g)y5mag z4rlsM-Y`No3~K;rA*BP4-_8x$AAu@t*H-6>fXDW#WXNkIEa&9pdlZJA=J;KH!Gr&X zybwSZ32(j?A@@R5u3WxitOt+LuB#t~Diosi^T&SVf#KM#j-xgW1_pfK5v{eHRbBwI zSz{1Nx`)4OR$85&Q7$gIR94+BLE8#rz}Ez$@636UZ+dE|?$0vNzPq8DuSzE|1I#zi zszHlAHa2ZRa6j{lB+-JMpY-Vv6|zh4mw*Exr&*IU9FX>{;Ic#iA6>}%L_zcn%BdyS z-|$Y97_ujAVbKZ?e$j22!>9!fx1YjDC6u{uEGyk%&=*DaKz9%KGa5y*RA<`MpDLU~ zMgfU4XmwT{j_~xmwx$sg2djy@NtmgYJtCP3#7IuZ?nUSC=e($|zn{mZbtT;XTjUR0 zTE@8bIPnk#$J+7nQAw5P56XN=L5zKw(^{IlYxttYDj7I7pWv6>h}x-_F<>fW!N~u7 zP;nRvixwxo-1LH4TPRiSzkjN$Ruk8BrX2bvNu1b0@QOt>K8QT%V!OxMk!7bgv|h6s zO7n%p_mF;MKOWNo^jw(Dro11v1hh-WPC_1Y)hku&Nz*E$bFmS2y3m7>;0c%=vEgZu^{rRgKDP%**k3V!KZ`EcVdLA8mhRpC98#A(>joo4gJzBS}h0#`jL=(Vt z>q7rd5&upR|4tGAdMN@K?2iWWG=P52YpW)XHfnE%gLAaKy^NrCQDC6*a(Ub~I^5e1 zvbtTPOgdPvxojP{z}s=y>wyeC5lz9z@CGds{3$82Pt>K9sgCxYml*rzpCo@}XQvR~ zo*(!+FxsCZ1TYmUEt1_C;F=7>CHfQ!5d#2cwMdXw{;L}}^2@MPQ6xBRWp`!9q!P=& z*l+0Rx0AV_BP=xX0iZxYUI5_d+BFDqoD-V52oKx-@wNqKzfTMLV=-Ixcavm=tCFx| z{KG6$$_XN<682A@hyvVNO5ygF>T)Ga1sxsy88Y`%S>(Af^6mi-HA9!lX{k-q#_8EB zt7>X&o*aEO0NIv%;N^3^tm)hq<`$4Mv2g8YBrStPl0lx) zl4Hf<;sO!Ym)?Bie3BPq-*dhFo%ld?=yk4dp>2DQX!F>jENI9F_7pneCy4a?G2`c7 z8f;rEk5PL!%i8yRYh?_s-O4j@Rk;G7q_liam2ci_9o4=Z9MmNSmhG+mRh&>lT@nW9 z7xYLH@8RAN>+2s8qx;f{N6_`B^k!!G$>BFFeq_YMhh1duLVp@dtvWc29^Ph-A<+z5n>Mjdaj z<0J`WHA^7dux-h`6jZv`|_7Bh5(Ts#HhDTelKnGUXmf_1Jo)KZw^k2 zi@Q^!d^s~s@sIepI7e%T;vHW<)Lc87pO4s^f7GhdOFZ`{%gCSc&ldnVMRu`1F}L2q zcljfe@5z(S04WEyHhXi+*VL(WtUte+#l6)qOnPwj=XytW+$E@)mjkJK^;csoo`a8xyjlo5C6XtW|I(10!wV@eUlaRaRuxzjij zmHHddZUH7(zOn*26?;SR>^pj(Y2)hVl5JEW15lKP%F2O%HW=*tmdnFZMn&SCyBF~_K^AaiieDpT-<@1w1{z{Etc@fOVCV-+Q4`C=kjqyH5Y3aC~p?`Q_yJ?k~ zk$*(lV`4fkEK)*3ZsKtTO}AF|#0dywiQwj@komA#Z&0wWvJlD;dlT)TPJcZisQ)0G zesu8F{LUFWXSPV63bbi$)739uH}{OJkR`zm16~iI#gH78%K0BPlXkOgjC~df!0QD- z2c`wun`x!;1gZBXDX7=8U^(C?Q-pbkO&Iu+tUoZwEqNqhvHy3|=uYFNs7TLpnMCPw`8sp7C*Q3%9xJe~RzMpAKpu@=D4OD4R`Fo=ti>w~8vi ze^z*Ve)dK0lsrC)Z0=ej$g-iO=%JkE?dEZj0JYtjfP&y#bWWYz>FPtm z$^piI_MXprmsJ}ag{)b@V`hdJ-tmOn_oGo;f|L`SEfZsvzO)N-#%`o zH3AWFB^zon(?s(_!{{wx008d~3^*(K>*MO`wmX3Pg>GR}5N5LwDB!8nEo<7zhrPM} z&c|55OE=xQG7sLy0V!qu^Ya6he83oOz_C?@q~^a{M9u(?@!DWsnm9B7rw0^%3Rmjs zi9mb*q6*bP8a%!`9sJmGW-DcQzd^iIK{DD#RLoPGwG(LnC@-(2OApUnG4mqOzlPlK+q{ugOlcAwZulX@SrppEVYVWY&PL65lp9|$9GU1sW{7-F71 j1*T8tIXbDU1QeA?5*3lAKq!}7aC}0sxP)Gt~5)cA62?62_CYa=fUa!~c*H!&~y+7~WyY9Mcox9II z-`@M2y}s|>{=vrs`i1Ei5C{b7`Ii%?A&}2LXdi2X&$T0mI*z^4zCJ(i<#7U{S-;Dv zRd*qfEss4<9P>|mDB%&7BC&YEvalD>G4$VRdSbh~bA|lV2%kfQ$&jyefS;Vq__C?cP zhPw_2LFcJ5vs4=dGU{rF5NYj~3kjnQMDbrMn3vzNm$< z?Qp(%(=BM2?6D!l(VN3zeZ32RW84qj755YLXt}OOzJ&SIur90TsRWvQ_^%b)&=5#N zijFzt8|}w#J%eOO5hTk9vh}Nx&%$){oFU%bbHU8EI}hPFE~VQPm7o+SuyrtD{WQ)U z0SeZie|c7F0PC)d;Y>E+*B;Z#0U`aPe^fVT)meqI(dh`WZaJvN6~%eCw}$v0_?YZKyLHB$KfBnNM#(#yIrV$r{5vE zc2xh`#?A8(yU+dy*neOob{JU|*O2P#WOULQ-`agaK#gy05~FsNTCWD`=g@PB=?%&Z zuoJ*C4T%xNQ%$o%lfcQ-?OjR`_=#y8AV9l5N>2pwOc6;Cgu>D;MuT2V49O&bQJr7B z&zBSuKy7Wu`EBS8j>&v)C{U-MUs=iRooI}p+-7@mty6S?ACq6DQA(1v!mLz!l z{H|&Mfh_bVG?uL{7VT^G*R-Xd0&}67kLRgeKUd*bQbJ72r*yCd&}HV%{a|8E@6%DK z*F>LWqHI{UaCccSLU9*6umhyjGxZUUNBGI34Xf%225aMP>&N2RrFT}PW&R~7)w0gz zvngdUUk?}5l?J-DhTE!aiN1jZN1SE|kOPFnW}e}$F+}xAa2R+G)H|4YDG*GMiDxXE47`RF58uR?mUCc{{cO|`8`Qeqo#>fIYbfB7>U@=&?y{hWD@Gtv3;He zDn$U+&&^@6p8s|;V0UVb{)ixSaXT7lj{gvEgvS=K8yqr0CRW_oC!^VrTo#K0YiL4& zzqDF?%&n-&5fOy1nL47d>U)u`ddWs=(wP`(nH!ph@#^!e(Yi-Oj79T>5Nzx1B2;24(&S+9vw%K5dwm$; z^^1pSReXETfwZx1Uf;%~u>Q~hLf6hQ%=2bRZ~wifCyN)i_p3*)sG6WAUusKBndh8a z*z7&pc~sDjP2*B=MKsk9iyd*1s*f{+Hir3|Qjv($ydyaER_1K(-kifoLap*q_ROEV z-o!^OCo#Q9`r86c$xYfEK0)3Rx6^RNih_Wy(>snoyTdz+ZUhv@ z`-q$Wj_tNDxlHjOT-Bp58YFyrb7N+)9g~Ka8m#8pW_}EFE+TfA8Z}9wvO=V#PmwKM z1gl(j8sGV$7*>f>0b)fBQy~goZzK7C>QsZ^oq|oPCp0QSeG{FSYeS4aQlTAHcIyMA zrY@LZjk;F@3B!L9Sl|um$UYP0g}rytiy#pg2CXl9Qrqvn5eJ!e&a|2j2-Qd|H~l{- zW9o*fXU%K}Zwr|?8^*C<+VMnEaLG+F=pTrzYm98S*ft;3GDcyuHkgcoY__D8-N6Uv zja@YgkksYOwJZT;9!!q$iW+Q+qzHG9u=@f7YXt(kJM&Y|9kV*&atqki^6-@+f$J*< zoTPjT#MP(zHT+OuN=tg{2`>1unStyaxPL46fLXexPHHM2w|&tNq5`Jotn(s-^mfJE z)VHtVkeb?b{$p)da)BAKGO716kF5N~K-Sc5x!3$E4jjmy@pnLmUK+P2R8LvV`;t1l z!pEn*?62I3Y!D!3iw`qNA&0EV1-uT?3Qfe5TFkvc0M+4ny=4dU$}_8{-o5KE&5SW` zdUd|Adog@B_oE!cu@?Isjy*m0*HSvJVbh$!p~%76p}-B2lB<%_HpA(Xt9y9GTsjqK%Eb zSQ|1r6nTcs`-zExb#ey3M+~&y&zv_f_|P^%?Vuwx%eNFEs|SPKaT=8SzD6EYFl##b z$kNKR!qU0-+1B}_M8zz|P)1!O@|)zZt*NviOxmUo5oQsfn+GaN2k&FkAzq?CupFX7 ztq5m}Y0liFX8kJ5ne8O)`~%wg4N1{F{AwDfqe(fPRvhH)0vqrsa7VDB#99=z@5>oI z`&u`#M+qm6_t=q7->5)xzLpo<_A`K=ahP-BUHT--_;i)f*gJKHQq@bBTNV zI2aK#u$YtIK-N>5J;bL-ChYlg3u37Yf9^hg0(z!B|Gxn{8_is{;%6&va(7|((Jym5 z&Wp4Q@QlsF&u;wS)b?>Y;W!=x-lxPxEuguMJ0Jg3)GL(^%!I*Oyvtx<9BM7B{iXYr+R$CH;2yRa;pnTgGlt*{ zkwi4f3m!dy3&%zl*q-npjtav}!4vrwYD9&xlWNeQ!yCpBg z4^NzOf#;>n4?5$>s*x?Iog*gi9wq^-Aki;g*_g4`*xIeWX5W-MwL3RXvB&l>pE7GF zq$pqE!HmJegBijgSbD=A73$^nX2anK&JX$M8~uc*$qb3GO8cCspxSckG$I z_xChMqV!B=d9Pwc~cwI-?aQjlPv!r?I$n>qYA5-qougv#c zS{OXp&~E9hqyNo6Sm+G7rn8CA*?0zhPR#O}pfQRgIEzSskT=3j+WFX`J6otst2MA{^h!2U3tRE_tp$n=?UG z@UzduR%|4{$jw%|ye7|ZPv}UD9C7BRQpg(qg+Zec{Mw zClgX;%wy}rOIL;Y&s{5h%60Rm$=R^lyxE(;@PCE=CYbB^sFRXTGvI_jSWn-J8t2%X z60=Zh_)STJx1MwN#r&GOm>8{%@**Yj*B?<9+B*5$lIz6Fx0DG``>$Sv4PQrnxn8{b zYB;il+c1d#HYgggwg6nml5_WLorj2~9|A1k7vR_I5qM*I?-eI)N8bZ2yrktQNv!kh zvaG0XA2TSLR!A%+AxfyLzXEHCmrNtJ%tMkAqI!$L_dmNpy#M`P_8u<197MUqT!9(Z z8q6Il*WD`P1NON#I&<2Px32sIgbuTeqm8gdMp;JQuS7%_*qk3Cu7}c{u`xMpSLV|x z_;fMMsACNrNL=1+QFKicNKI%_-v`7SSUR~oN3u4id0}y2UN+}m@5+|>?k$TBq*Vrs z(C8eSMd_Y4NPcIK;tTpliA(|z&$`crHR?IX>#a>(4g{Y7yxe^ows~tsW;FvTeNd}e z1KzJY-93_JHKNP(MH(Xs(Je-_Q(BAi)PT_HQk06Ft(XjN+o<&_>jxxFAmOYlPP@)P zwF-V;R9`T0zI=m=`c)2G)K4v_tOJezc zUvBSi)b@8FtM#ZQ0B?;cpDK`Lig6-aGjSyMR+~1>zZZ_)V~1)t-Apn$Tt(%Im`AE=RC^`@D$hV&i%$3%a>Q^4z)Ww-OJl%ax)Ey7I F{+~!N-6;S7 literal 0 HcmV?d00001 diff --git a/img/body_73.png b/img/body_73.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb9c2a18e999432dc004c6243e94467bd57e47f GIT binary patch literal 1806 zcmcgtX;2af6z1>>ueQq)70R-8tHDgg3&kr%MolwyEsdp&yv-8@6>`@jQ|V$;$!yfj z%p~(jOu<~0%9|l0(;zLyBf$H_b!YeA?*81JcYHJN_~!lkUe+mhXLX1+1ONc2V_Y1) zwvhWrs3>jaD!->iTcCu;Iy(Y3|FGib@>^SlHjJa4H<2+j9B}#Gf-XlESulYqtY6;o zeK@2lFthA~r_a!cX;+rt&-ALyy5ilE^upo0#aaXKvt?Q(V(9_jy3@W8aQn91SY`!| zm9IKuav(R{Cp7zXtDwOT{cOdM62Fg*7HKJ_NqI^;R6L=mxV5LDTV3+ z1m6HD9Z*zrgzU}Sb@_p&t#XA{G9c_&f=Uj*7O$v(#CMAWFp>iGk$2ipI>GvCVh+c~ z-LcBN+2cN8{SBJbJn<@KyWvH+7w7MMM%xW>|Jb-|OuO-&d8~?AWO}Z~BX69*_{FG( zc@&^!qkiHzlxHMG3IWm+I8>jj|CN{9mfaFdOs~_ktZX)Q>ci7UcfQL+k<3s@qzC27 zfkYr3fe7j9nBOVv4btovb|^-#7>5Z!8yn)KLs+4FP1FGujpm6O#|L_;)cJ3-9Z=?F z&wUq=>7s4y25>etm2QMB(bnSfJP22w1gJXa*^@|%>lgA`hZEYSs@tq2oYNkyMJT7- zAwM%fCq{K3PNR^t5pULmqm zIVV}p_np(jJcjYnBgx32#G!DR-P9mqC@n29?;t-f1P&w9W*8A=?YSD4gY(G@lRKsez;kw(B6?ZG50Cj3j#Xvh(JogDEZa>FfC16unutnkHfVsOlch8DBo$ zq=L*xN3aZsRzw*xyZhvu_wMGQ+zUbtk?mn~84Z^O4%xnw6w0zGc>x z+;>A?u=swowDF-fccy`GKUK#9Bw^bw00})DQCl!cz8)J_ZQ^?d+_)M-T$k0Ntksr= zkt-KBJ~q~-&ZjctXS7qJ5#6Sv-;@)VMX}|$RNI#ed!7WUTP3_wM{>kG>GX4Hzq7b^ zBq?;y?T}Fk2WBu0jahX@7@3GxbUBaxHTbv=MXw4D77^6&F=f?ode~~EIBrVVuGL(~ zd?yF4n-S&9cRKy1jA+(wti#RCy1BYo+%+^jAfo1ibJ8QT^mN>2%KHXHfHE>N(6Vz)D+;u%;iodKm}2MO z?btq-T&%FM!Hf%K?MRwG(C?|w@%63m1$%(l`c)A%54igkUqqb~X~5j4vXd7DW9AQ| zfy+p#zR<(8$nDlX7pgmhlA-4+(b=rd=A?1X&*{1D2ODzxPWi`7ul;s>62w$|!5BPM zK&S4yxG5L3AD`5bt_j%JFLBY3fnn71m|XEWg~e`pkcoqm7p1k89Ep`fhzRztr#Way z)a=EU2IF4+s@10-PS8LMRH6I8oUsDqwdBh#BN}L|d3*X)$gWN_gc)mC`;}Pba)f#G z&rRl~?k=Be`4tihY-}kSveyOZQ{9sgTHRRZ3cE^;MrMYNfcPkKpQN zdW#(~7B%JqWh$5}g;mPJ3cAp)%%8vvOU0&y@?Mt@A8@kI^Hlr^ab?jEr3|eV1^Hz0 z1`j_};VtZU=Gl|M;6C21mOObUTGI&4VvG$Edpr%m72ryrGCrP;$jITuuQN&lw^Z?8 zRqQ`%P#?M#?iEiTC8+^*tW}P9*bxM2Dij+bJHE!upliO5we{ct7$1{&*>u9}dF3C7Vj+z+WvI@>!nRtw}a*OF) zi&T{Mcfx!*75(?|B-!&F7`3}^A8f{WrKnRtv&)g1IT=gG3n2w15IxnvJn%m#K?+F zrrZ!uw?lq%u(A@DJ|{XjOy7OVT?p%lvqO@xmVR3k#y||)M>4shqT(O(>i`uwkyGv{ zP5}XIC@4rk;N<;=XGykcJ&uMQF;=T`a-whi#RRHlUo<8qal9QjGQ4zW=8Bxlt^X6W zJ7fr*pW2KL`N=CG;o*7qYQ}z8Pfzf&YOamUV<)IbOloW-L|+EL;#L-yBBOSjCJn@t zhaK?9{q-4h!cH;lkt}&3Hw(vXy)2ee^Eavr|AA^13Ms(Y@O#( zozj(*bkg=KcwdRw6dT*y8?(2Uw6k~e^$K-aquZPbmc0m`ERCC`@NxVMKhVxi45Hm; zNR;QUI;g@%O5tM0S!gGjqN2eeHdptJ@32d@tvee{%$sw40sESdNBlQ0EG#6rsq_CT z9eKzQW5hc@G+QYhTS5E@PAt5jwA4!?kvcl+T3Xu4xu8J^NUUwVEj zD!%GO&6NE&pgZlvW~-6y$;hZ*;?n(bSK4%srEyPix~o1*_h;?&v6G=z9gV-#_LtWA zBk!1S$%M5k=2wMlDL1a28a$1M5KV|ne#~6t*5(`f2DG2zACT$Y#3k_I#eCzh zr|`i9qb1)R9C%atPRaD)bdp<6W#f8rI_DJGm&Z-edz*>Z@_ZPAVf?eF^E#%X7eF_g zo!e*k_bFsPP1=Ii>ULIv9Ba%eV)w1U0!cyO%<0O}Xao_=VD*Lxw_t}IRB0nfKyH<3 zYErVG_)~*K4g{-Wkemw$RY+iC@K6aUFFrIf&;0aZU7fE95)%k00;Z z6xhDtd&b7#Kzw*g9bxbQ>|cMQU78iVuoXn*ZE|XSvi~!I0JRJ#l*c%d)>+^a;ZVf3 ze31;39{?n&X+CT4=D1Eu6ib1)Xhi!Xym^{fkfa>-t#P4X${^~_wPgxA~ zRy@&H2IwF~yUlCriiO_}R#U_KbEGClvk3|o zE9BXZsMe!L76$Z;U0gyUS}1;`B6@aX@fU{9_Qi3RJF=FcY%Ouvs`mMFv%>gG0~5Sy zFYnAZIvrO|>mLd%w8VT?M{6%p(TMIjc4!NWncQJmD1>!9t1V7{D1qKR5y9CSsaHpQ zXy!$VHE_;$bbS{#KxIwD0&{fEJPL@2cnHN&FlHsvVJgR0kixhGA%mw8!o4zJ5hpOQB!7@|-Kvos>?Fkbim4tj8zBH6Ow zy^*@HTPcN()g>gZ+cAtX9lz=z9~R>^8B7{+Ew!v-_MNa0qCL)`#xjE#@yw0u#CAST!aBckg8F^hwH(#hxqKiabQJGL@)_!dX!!DI zgKFKrcE7ht=L+QG5eDWoPY>Hu9h&XPXL{h@Md*K->XgR?07&uuo@9k;FISx{a!$z7 z<;BJAf&A{ixwS5=ZvIKJ;1%`WJa*ep*BJa!VWJL{HsxU57z3ht%HF}{OV}0*_=g3C zGpkk=v$kfcrWS#s81!Kd5~zYwP-D@1?A!3-MYz@97Zhoc3t=>r#4 z(+~F8$Ceu=_NNtL&+Y4ysZ8rJ6^>k9zpHa6l7AGYxz#Ce1rW`zZiO`K`goiOn9eLR z^?|N3fyqGH@#H-OZG~|XA8BV`!Xp`Q)6LCqTLt~+xJI|H&&+HNyQC}Phbxu0CMUbJ za;}X79OrZ^of1MS=USXP7B>HcwYbrT{+NmIxaZ^Z`~7>dPmKo~i(L#JshFRPiyvA~ zy=i}s6f2KSteEJV)G(fXz>pdgS{3qd+LjX$F)mRlnuLOsMyq32ed+Z1<&G(N-UL}* zT&%mSC!Ljic~f6uIm$OF7J}52^5o(=?6-FMZ2_iPU`vZvj#USt&67QyozjZtPx$#d zZ%E}G9PnMM?7ZIF)NgB4tUq(+uA}tQ@YLGzOshs~(3>_kd{AgC)`SVt9%^p}N(0A)ownXa4n2ril?pU@>`+1y=MAE8FIl09h&J zfh}mOOj@fm!<@cmh^hkOqEda4=LT+an(Mn7#JeLIm>+g5Sh@y^v=Xu2Ezn1MbPo6! zYNT4ZtYht5I^H$EQuN_kKYVK`;r@K1bGliX*j;%r`@tt5(DbpFHy-9yIbv^TDdb$c z=Lt3Ht%Hf+dcu=?dgikyDzD-ZQSYscLpXO2g}d(^+yxyg_4ZDFH+pcbQqH}vn%jH^ z+}WEqRZ*Krubwe>(rSnD^M1aniT{~lUJOoYSkVrt(c1MNX?mKg(*@Fgv6oa_{NnZ_8lMUQ`az4R9!Z2SQLb; z3K0||xC|?#y7%V~4jq!1==9PDZ3&FjqT?nsaCjWcDUn>afUl^|t`V-j1yhf=T9t?Q zo%gKCcZ0;-u$1VWhC6k2wPetL&TR*|)+df$yqEzEy|n@Ie+NWuqb`w-a0yw z)_X)Uo;cBa-no0Oae$zntRoDE|1XY)5n#^@N08P8ylijQsp}nmfs4y@`NN!Pgt76V zFsEB={wHqN_Zl~~101(KLQgznOzrK4%Fx2Novr3?Pm<5q{vuC`GWLCl$PM)K2f?5% zRa|)H-+z}9lz4lN;AqhT8Bo8VV9&-z$zcj~>@Cs+5BPr_z3ZH9e2Kq|{6);cUg1&@ ztDq2b{nB5a3Pk3GzILmU4Lv`wBQd)=VvY1zIiF7IBzs7w9Ouyv?E^71qu<8JWNA-KJfY z#XX7?A2x@n2>k&3GSG+%sZ$+VAVDBthx;`V#F!)PONw3zBfL4Mb>oIQ>hojhj?uNs zYu3)68y)ZthozpME7kMW1X5frke@p3y1R!-L?QJ>wfWJ`ILZyOEU@S7X$d0m%QyZt zzT3OWry+^*N*5P)3JRLbtjPm^7Sl4a?VuKE%P5Vyk2|uX3(H%f>Xn`9%>NX-_1Llz zebaMsX|yh-sn$CNv4ko61~Jg_j%~`#z4uHsTubSzwYiS*3<`}7H~m_ds@uCX|E-A| z;R^lFAphx-5JtiDf|9&q;*3S{Ly=*@3$aqRxID+qtP(gs>{7>h}iCR5K-xIlV^y2|_=jn{8yFaJga?u;YUTtu6{KsrG f_sGy|ip3T@GT64=JbdZ!+XpZ)f*4llKZ^M`K-3~$ literal 0 HcmV?d00001 diff --git a/img/body_75.png b/img/body_75.png new file mode 100644 index 0000000000000000000000000000000000000000..a56440c0c3040fa2e7c94f54465b0ea14f8c2e93 GIT binary patch literal 9383 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

abo<6PT)Q~!ZU=crx5GX<+APr|r zCuvp&F8{Ot$E)mtRR8IJn54G|-q*77 zFTyV-IDXvDahywcunA@E|3E86P?_Pco#j>)$`_<-bT>>qemvcJjP72egjh4H?GXY- zQ9gNIMAIlCYGFT>W@6cj7V%-IB56v2P`JrJm;?*$VC4$CkStVs?tPDdBo zE!B?MWG#$91ZnCwSOS1Eox#pexn+DZu3zJfz50{L+pa%NF!R;9CCfwV$FhHK?t7{o zKe2fsQ#AkQ3;?&gRl;y1rWI{vxmnbq`d#O%l07}n0ZOP2jQ;;_xhHm7J$~#nHfdzY z5db8dN1z~C7%}SOu{WH1Bnb7GyK?XU&YJx1dBE}4B~W$1b(>O1+m>+h2%x2@r%|D1 H|NK7yd~=TM literal 0 HcmV?d00001 diff --git a/img/body_76.png b/img/body_76.png new file mode 100644 index 0000000000000000000000000000000000000000..927b9433ace4ed62d9c9ff3d15f9fb4a184aa004 GIT binary patch literal 4017 zcmds4X*3&5_fJKwCE6;gq*~NY(IUjw#u8duyQj8Vs`jmj+9^scwG~xb-Rz-C#ZK*O zELBS^A*nqfb|UiTdA_`#-v9Z3d(U~#%$d1!=FXkp{O+AObK@Tv=&-TyvH$=8Hn=X# z2mmuc@1KkVac< zAN2D23kA&w3Cz{iX8caBFRrf<0Au^gohs!Po3{MLE4F)c%1@pb1}IbRu9TN6=SBW? zHGBP6vKh%fN4EOx^t8n=eMj8yR~)>$=ThL4&{=hZDogxGdb;X0a@gR;M(>oWb91`w zB*;0uWrrLo1W)@Psz$I28XhxRD?s>7TFk zJn$6P*Y`*{{}EXnk59Pt;L(*pF}kAS$hU(w9Lb#i8iT)ze}$dy_+(v=0!d;V@I{?! zG&H*Z35~3V5WIj#Ano&m{}c4T)zS(vQxlA6D9})iStUS2pY`5bdQ;QN5J<>Q?rSI^ zHNglp%ye=aM`G~)NZq5-HFF!fKvrRfpxk|e18%OVF#rqjx~eviij>w%gNy6w=Y+3* z332-^sb+4*6<7=@_*S0eF*xY%=J}N-EhV$RRZ#|rN=P~qJK`mai?I7S@?yQ{l)CAW z)eN4eE|C?XYzkg#LDW-9o5R=*#O^}`5t6MS^~h=IYXv~2!}sJDJq>&7rZ{88jbG z@y|z*w7F26o_GV6*B3?XR*fd>ZyyG2=bc9&0%rzLE7y@c>iNA|T2@vTJ@NVA02*aW6!Pi{@yR?1H*>t*fAYBZLbEri z(aL0`ZA+pSjEomNwg zvz5Fk#i5VBlb7Bf(o2+w%;>w6IuHP*ar=PV+zwl-Pm3=(<%9OZ>kIIVPqzmedd9nD)QHsN3b z1O;vFj)}xE(wko~RA7f?yO9`A9I>Rt_$M%m z${bGalQ=>L?TnJcj`lH@WjAX%@qb8}t7B*$Fo2tzt14{ajvkq;{^MllJ)gmsDpPv{ zUB;fT_lKu>-RFH-LypG^)ju@yHJ|R;HGBewkueL>4-;(nI^q-I@5rph;poG-vB}>G z?}S&O8B5FZZYKxD2J8slOHLu(zA@C!#7bothP#IO>AZoiH=Yr+nDn#;Uz064O)CeP?lAO__5xzQ}Ohgn>21 z`On{}2^F6jau1UE9@DN(^=_O_kdLf-uDbfr1)VR?A{+x^4c|W7kKW$4`$?~a;F!h~ zl(IG&>eP8Y@{>>5oIcz7B8tw;%(T<$A+e~uLfwNg=%HM%d7mZ7hG58gQ=A_ zL?9##ijWqK*jbSf+9~aD=>90JUtf8vrgo=ho{~%p0sy$~^!R%+hf%;lo>HnzW)_C4 z9iO2xf);@au_?dPBgx3L+%pbV0R)V&>rV(p-fryjx zT8oF~-RM9fzAo3(zQp`ms-A5mCpRNHFR#tYVmS@Mi~KCKR`r>+eFQ1(Iae7;pg3S# ze2)H<)e-AyHm#Yl7ah8NXYsvIxo|aVaKDsLcj5w?k=?sLmhIWzewX!PQ5yT}(}K}f zEJeV1bWDEISmF>c<8w`4~wnrRjZB5`;F(g(@3f0SlUGc9r!M=H9nl_yTk! zEw<&!w1n(OE4cH_3_%Te3CW+0W~v_pF~{u=mQKR!+|ojju9_+BlGwytm3{;Hl$@XX z)NvUrB?PrQmhH8V`Y-s~w|10cyM`js>^$?nv$O*)pQ@z@U%GUH&T57=FUZ>S!@nS& zEf4LYC#;{lB#tMlt+t$eb67YfM-%eFD9XOE%2*1RZ6B1_`d7^wekjnTT6ucBb1`x2 zaJx{g^ZP5V%V62M;C?Rfe9d~9E!@M)!>R3+OjRLOyJmaQ{*9SZg@1-YJqS;1h|XlF z^^9quNLl<0=w!)Owxq6EVQ|F<;C!vFOQ$ zMZFm^u<>#!SZD{0ZORPvJ6PXO(#L3Td~Vr@qC=b>wF!IV<}T={EAM?MMMlk^bd58` zVS-yhL)*tor#fFtZ)(K0=O?am8SL(E;rLaC)={Q@OFRPYcG$j((%P)!H(YCv{u(-* zGfcUPmT5lJLLRJ__T+76S(`CbH1kUG?cvia9dx!#e|N;UUFzNb2_lTZSOC%S3e6F#Z2h9gsHt37hCXia*`}9!@n^M8`WfQ7b0P!cgKHsS!)wlH(uO! z!!E={2laF%G9PDO2z@}edjUGn8p7zk(X+Ki{~G`Tb~7t8rqIR1qS8)6o|BJ7d(q2t z5WhnM|JyN_@7}%CG?Wkiee2fN))g=B#)e$kczPXUF^mI!ae0NJ#$u(vgybWx0Y~V~ z_&+(E2kJHg7J}9z7#2z3H1kiKdqO%qVP_}kG07fThfiCOk!JMp@O(1Wl~jGO>m7nk z{v%(hx@i2!Hf6%!@<*7eDddtNY ztP34lvll>==4J;+ldf2kp>%nws*9T2Q50)eq>6>gsx$MNy^OfG#&YyOE@kQF`<0>YBZC*Nf0&1nrSj;?n#FK{rj6 zU*)5L%#@)hO24i0yJ|5P)+kJ7j-U|AU+J{%9uG-!45`H4Xn z`@Lk-at>6y|1d;7=hJ>|t8M(9^AZXHC|jGWU9O1JR(H`S`Y@znVhRLIot?9siCCq9EX zOLIK-8^%m@J2RL$jCCsnjtXILbTl?JO)q6+zyh0%-c^N)mN4BYNz|i7^LJ}Ysp=Bu zi`T6S+xL6GG@qE2C)|J~M3Q5}-oC3%czWlvQVzbk&QDOu*z?hCXLjN9W#=CUJ7%3p z6F!&$;=0%f=fy-bGMnkB&1q1=)U3PVklK* z7ltu>^_O{BQp9J*1Vs=3V?3twm6*3w!ZnG3e%w*#tGMdtp9ra;G-j-WrOK?YNW;3$ ztVfgzBE_<-S<8g2UMA|_urxPrA4h7Q&vBEfdr_k}!yyiHPeGt=dc2tpxME^LFTVp; z2?%4=%jB>M;sK8|uoVep=N#}X*M2a8Q|YwBEVMR%T$V2qm2z6`O5$5zQ(iu?_@UFd z?dn=oUL4<$I3wr5TV}R0v&wh#*aXfIt#RNb+{--f_oyXS{pf`SE_dG2RPhuZw5zbbWg<)c$ZFeE+tp zrc}y+{!ClsuljATXc;d$SmAmH2eQg~e112$NEx~CC)@R|s%WdmoT`1pA&tcifBVI0 zczb>CdQ}9=WHa3U-Jtip`+R@9H*AU`bcwORbZ5o+#tWQgg-1cx{{QEHMj%1a2VU#b zXH}WenV|`R%!MIvq282`KF=%4RpXDf4niOUQ^Y{`v_FWubBDCgKp?J#H5{T6Xk;=O zvH=1~Jr7ZUK+Ydb0G|}?0^1WlZQT!nyuG<;C)n2jVCP}aAntd<^DWtbbMRnJOtJKd ze{9w~3?mh|DIXg+xfaF$!O!(wQd>9R?Xb~|otK#CmW6;#a)&CTKqs(GduqojnQ5>% zX41GfS_vyvYy6mm3iKH#D!m{qYg)PmRpt3rFA z`FI$Q=)1}j++#grF*Vcd<6cl-QR$*+egpR)E4`znqn^*__8%VSv&!{}p7`?DF0|x; z9nhkk30e``_se*k<9E_aEy^ty|1gdH#3{ze_@?|`(PHv!PhkZ|CK1s&n$^Q=p_l| zvU#jcs{RQG%SH~u^qp7GsJ^YA7}!hA$*iRi7Os&?$?GEZieQplKo z>65jI!$@;5Xmt02SB?k?@!6@!+OT*BOH#nrnDl_`1_g*Jd)FDu<(x#tcn=k%FZfMq z9Ej~yGK&rTv>Kuh+|oF4Mpo<_>Pqp3tK^_f!p2Fc(~?D){j8URlHs3=g|D>-gDqO! zlrs_;hg*F9a2yQTB~oM5Eq+N-7Rp{)TZTF)PE^n$@LC--$}tVuN(UhuHf4{}8D|5! zhQ$8R@rf#Hqu9M(Q6o+gQpWcj$60sJx@r+%C1hCC$GtJ794IO53HIFc_H@LihfQi3 zP%;4cs}07>qNmTzCTViXY;KpCU+1%Lf8W&zbM89}iMq*5bx3u;PHTL-{+v5SfD!S* z9k(WXgY1#U`+TCA{x)vO(7^1|>#a#gUsU*HzY>{ch=ZP)3wTKvniVoRX^_xak6VI` zDnxipRpdKCP9-6*-gE2ECrK6MT{p9DQIa-qqaX5GsNK?tL;`$B;#DCs-);F6V>==BipGA(( zis|-P|CHqONEX9%+OI?T2rXIYN>cyAdyQ|%_rC3pkWNL!9~z=^vC0QLX#Ggsaokl1 z>m}q3Ua}ZA+ehu+FiZ;<&nvmx*q5SVM5(~P*B)p+ zh-!J&kYwLLqDiR^Jocu;9JzF{Gbzt+7V+T8DgQgc3;s$yDZYk{q| zx%1Qw1a5UgYKN2+hi>crP+RQw^!7YH9FaK3bm0W=_OPSGlcxWkDvgcz za`U%AtC#L4&6@HSo)C@_yy2Lf;dl@1kY4}hqfC-fhc%goYn^8W*^$}2{?KD;d)sZ} z16;n}7o{-DY;?=*@Nd#gN?b&rqvzab{V)JbTrK)Afmtp!_dHNpX)fi_IP-Rl)uw!H zFx;Ioo%n7#wasq#|!IrF%Lrvs~JPwCe4s3*YRd~LI_ zF%`8lneULQ4;IR#!MYe6Vnb`_0DfYoE2(LVOf2yizv99WF!Hd~yZd2CW~_VRK<6@` zkvX?sv`+$Q4liV!PKLTbMOWyOc|MuKdWzgpdc$JQjk)WQem60z;T1xRGBiY@;YjCG z`#ePhTK&SQc$v^5K)l%`l}E@8jgL7Fk*2)sc@o z2cbj3Rcm$z#K+64RW@60vIe~=0X-#-S*PO3f#qS{<;D#!0_n8^c2Hfj7aTB+?0m)> zB$warC(an!MO`GB3I_UkL67^t)$n;VGogOrjB=sKo-&F>ip!l?ogA?Xpkd3d_g-2y zREEa(cfA=fsjPLgS~Iq%809%(!)97ir&~U}q2c}g7~vkp1NL+tHbWs;cSGwB&e1;k z_~?-c_D)M)w}=Ix7+#mv3PLaHXoviHdUIEf4T;g%qf0Gg^BQR=3aPSQb5@6<1pL(U zOW+RlQ1HZ8a*_&CXbsCO#1oIHyn>qQ+2sCs##Ja_FCV_tvstY-tPo{9TsgIP6+4T@ z@jKZ;3yup>b_?rESy_y?CSmWg8hgXQ`W-kx#ioOWIDU~ac#`(nEQ?lW68^!AMuIn?tnQ?%{nO-a~8ylf}J0NhMe359VSoY6ao>eH?H#s)bOew}jZK&(HdSTxrwFp94rl&lIqrXTv8{?v0w z@^P2zp`B;W2Y-87>&sdZP&fp59GA^07~L_|@suM%T=%yY!wa8%l}>g(EruSw3&PaH zlf(1}MDNyYh31K~g_-5J5ms%_=|VqSG>#n*kpDGt9R>K6k|}Fp=pM9>3oP?I43X(0 zJZGKo^bAD(ok2SO2XXEaI73Z*47JKYRP_d2iFy)FVH%`b2aKbv$aj8dWDG3fn_9GxZ1Uxxc%eVL z?|ZVA5nZb*XMBel@d&vnhA>`Q$A}7Zo@v?sQjXhS3uiw#U$#5<%k5GM<6IwcW;)s2 zBibxazr}pzg;s-CXRiSFJ9b45T-xjZ1#qE#jy>BB%pys=+7>O!idJWRb-~h;9WM0f zHnAgy9x?N+gI@itEBTltdxzXnmfX?p;Nk$wXgP|qBH7pAb(v&7nO(eavx_boa7P&@ z7VTF=lANPW!WLMp-J{x~Q-?r=E&))}4aD6WT7U1WD96$Ld=7X>xGZ$!ha+02o0Q6? zSVI!w0=hKsGxgBE&5jtfgVyOA@1GgU+>PS8I{_ae!bgewl<--=WHK*3fY|(aW!o26}LfqSRR2T7(wP|c?22? z9vnGWTOZOI z0VQ-f@V-udTn1E(*3*PuFMT8qE?|7-AMw*$E3a+auOIyN9=6jED;Q*I9GLCzf04XH zNtMU&g(qtVpOFJyhMgS>f4>dA{9es;sVdbLbiE>KOvy~F-aQSrIe}y)?+Oqkz&TB+ zI*c%6kIq=wmDO`knK53iiJzL)jD8NSmcKd@KDZ_q)POEaT0pK*CpC3VP~XkkgX|5G zdRdI6S@R$3SXPy4CK>q@PFzg{f~;nzj5&XH@a6x_icti zmU#s3eQs`s*xKF>C@`l6-?A82}`x4@?gF`A7ydrj!~yP#h3PqGW33{vNx zYcnl-D+-1M6F;%awHz&cOxhi9k>HpL@@1cRfY1U@fA(2gGQZ5?BN6e2vlq*fV8~ir zkk0u^!jQr2-v-?NH)0Ued|;q0zoF$7rJg!*ie-~UD^Q$y!wn+PN^2Mrz#A#Mc~P88 zUN)=u+qAOh>pJ(DZ5Q(J(WXg9H3(!l{c`>Y*+RN7M`pFLec9XT^f;8(oAR-pt-Ax0 z0|6W{L588x@*C#o2Gz!l>hqmJA;U3ij65D8FzN?$(>_=CY-k1v7uvVjg~Y$j2IVZ* z9IfkG=1mfnQ8XGKliFbN50|2g09eRXblEgXyBuOtbZo^cfk?m+zLVxyahgW@KLz>!mie@zWm z>y|Jl1jZ~39I9D$LNKwb`h;sCxm;AsmA&TG_lKc0Hmt!}h4!%P^jasF*B@eY5CFji z45jXI&NK0AF ztkQkdMiH|ulEG!bOBZg?RNyf9$W?mj*w(QN?z>N`Id9wm5$DCD;$rnIi=w@0u-8*B z<|V?FV_CAAo9ik1zzyx#N~)ipG$%sKk{}H+!+ky2?$|pFrp&c4)Q+Fj7KvuwvjDu1 zJ7U7&*fo#!y8_e}Mw^a)wI8x|fU`cSB1kyQvx%1Z- z8*8I|&YdxFP5oMzrGz?tWLihVlKUo48cvrvstY7{#q9ZOPyvq5n-?QsLP_wVX;tFfxmtfZ)Be6c8$>64-c zPIpk#t6j8~S+pc(KUDl3qL2{x zAta?a=BHm&F*S|GeqVeG#pPOoqNeni0n}CS)uA* zDY7FL7^%z9%-s#NytRZ4RZdmeGS$!~nURj*f%0kY-5)Oy#; z@45)gP?M1wl0l!Al1}(p{a}efgH~J-F6x||lxA6p2pI7f_OlpH;hcM+JstGe=PKHyqvMd51e$4nolUnWzF-Sm>I z4T&8~FOyzJ<`~H#^?@1HSDBL$Q;49O*=%11cT!3nb4riV$gGJ0cN40%T(_t>swOMY z>`llP_}9oEA#ZPo`hagq${HzXbxWL0ZF$V$A`~IWo&mQg5v}@f&sU-?oG(6j^gc)r ziwWqD!DCCx$BEpk7z%>pUzfL*-|o~O8|^ysi&oBY(1R}u^~C5XW|KsvBS3jMV{J4p zT07SGqV-<|YQPT#^h8%eaek{jNewsc2;87MbM(RIN8h)B*CH|V!mM6>B#m*@m|R$oOfu8z0Is$K zdZ>MEgl`NAWpTq--Y|cDrZw_E8k}nbd}C;(ructuxP)Eo6-4~!X{dxP4^6%`jF~5v ze6PaA@rMpAB+i5vg?l)I-2B!h23s507GqKu{q3>veK_^1son_?LswFH`6%m}rJ#az zg195^n$@!Z42Z9K;a@4pv(N9py*5CrFl9tfhATbuQ)vX_u085T%N^^tX=d)h02!g`YKD&ZJgTc?jxpr^iNLjdtl^j6rnvDRa zyrTRBY1H1LV(QZQEW3g=SZLzAy%8f1E?OgY%f0-2T16L8n{^@M5&V#s_Y2LZX~bXt ztK9!zyb=HJE*Af#?~WF;8z2eds`{ZCHFh}P#lQ7*#V9~NmDY{K;xml5>*KJ17kUGv z5~Zm_u^5zJLh7;JZLD@%TIQ@z6^WB*zHzX1ON egII=GrZA{ye35DJ_Y?Ad7p!c5t2pa=>wf@vH*T{4 literal 0 HcmV?d00001 diff --git a/img/body_78.png b/img/body_78.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad892a3eca9f26439ff4e76e9abe32372d26be9 GIT binary patch literal 9843 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 Tt^^!BMFyaCO)iw_IN$wmmJvye literal 0 HcmV?d00001 diff --git a/img/body_79.png b/img/body_79.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b2eed442510d3c229a2e320fb06ad95a4778cd GIT binary patch literal 11598 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 RH*jtXf*6`!tunY1^$#fIZF&Fz literal 0 HcmV?d00001 diff --git a/img/body_80.png b/img/body_80.png new file mode 100644 index 0000000000000000000000000000000000000000..90b5e9d4eccb0a124c4548546c2d49c7064bbff2 GIT binary patch literal 10954 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 literal 0 HcmV?d00001 diff --git a/img/body_83.png b/img/body_83.png new file mode 100644 index 0000000000000000000000000000000000000000..99cfe5d72d0ff083a0b39e25a364299dc19543a5 GIT binary patch literal 12363 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 GAO8on0sp1| literal 0 HcmV?d00001 diff --git a/img/body_85.png b/img/body_85.png new file mode 100644 index 0000000000000000000000000000000000000000..0563402ad80b5df25a2ae1cf6b49d84b3ede3171 GIT binary patch literal 3436 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 literal 0 HcmV?d00001 diff --git a/img/body_86.png b/img/body_86.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5e74331007f5581f731ea635460a9b47a4bd7a GIT binary patch literal 6016 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 gojgh!|C{7T>Vi*Y=P90`a&JOaK4? literal 0 HcmV?d00001 diff --git a/img/body_87.png b/img/body_87.png new file mode 100644 index 0000000000000000000000000000000000000000..59fb69bc283c8ebe0543524d935259074b9d72de GIT binary patch literal 7049 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 literal 0 HcmV?d00001 diff --git a/img/body_88.png b/img/body_88.png new file mode 100644 index 0000000000000000000000000000000000000000..73f4f932a6120b0bc28a399694d7c3437a87e74e GIT binary patch literal 7843 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 X#vCW<>MsDibq1*_X(?98n}7HZ90AOH literal 0 HcmV?d00001 diff --git a/img/body_89.png b/img/body_89.png new file mode 100644 index 0000000000000000000000000000000000000000..e62f21fb074018363d55e33eb346255c364bef93 GIT binary patch literal 11328 zcmeHtc{J32-}jiY?^&}agY1$u45iW#%3k&)iI_-aj4_2aQ6pq0`>wJJ(^OQ%STbZA zl_l$77>qH`*YEmW&$+MbJlB1G_w!tT+|N1palXen-}!t$@AqeWz2BeL>;3S&wK)%` zI41}M;(?z%WeWl^Q9vNDGdnBr<~d2|F7S`_vZeVc5M%!@x3xG41UdwQpE_Y5p1CxR zY;+Apt*lb7tYmeyeK>Veo&W4Pes&DM{mEKor3Xx9EG`Anr%#W1Cz@BGYU(Pjgph+n zDV8}yU8Q#|m@E@5gp6JZ2|WFP=;OyCcoZJUik`iUZ4DVoH9+rPT`}gMwGq27t!Gdd z?hGaA9P^Lr7458p(He$==#IQS-S5HAS-PU9b08wcF886O{ey9u9+|;noFb5}0ritu zd(4>vw`eF_90qa27O)?j!$MEvOjDssVAf_R{D3Aw9{wmAqYk%a=Dr2T9`?+�oL} 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 literal 0 HcmV?d00001 diff --git a/img/body_90.png b/img/body_90.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d8b3c5881bd7419fa212e4e6621de4293587fb GIT binary patch literal 7175 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 diff --git a/img/body_90.png b/img/body_90.png deleted file mode 100644 index f0d8b3c5881bd7419fa212e4e6621de4293587fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7175 zcmd^kXH-*Nw{8Fd=?YSmDg=-s9q9xFUkFv{NK+7L(n~-HMP3k4dK0N)Kp+(99U>qg z)zE7QCG_5FINR^M_m2DHoI`8{$F2t)-{ zSJeZ72;zXR;7t->WUCg}2K;n!hE2K+H{0Rb>O;jICL}I7{#5l|2{? zGP@?}#ZV!6i$gtPQb`0WsWd?;V%b(OPMCqrNzpN_&~g9v34MP&Z=_zQd`2&1&yrI} z#G_0@RU~REgqgD<43QY8^caOm9~gsvJK0Ku=(yg`+#3IuotJ%rTrbR6IrIxW$_qL? zlV7byR4l`!=qb&sf<;Inq9} z6V&#+A7xN!|C~;9P(f-o>}Ek}i7mRy;aDvkxWaAaKdEc&xuf|@7eI>M~EtEKl9Q)*j`0txZM8hFrD7z3EL`7#tb<3BK(W9f{ z(lR@^3eizX$w+Mtp-6e%C%?rm&;G-;8Mn^6NsJ8n^;0v+HyEzY$K}n8$6L48kfjSf ziMl#g&tzWS|Gv&tn@P|l^R9X+UzuQk5H+jRek*-z1Kvy$KvPF{s`ylXfq1zH&dS>7 zce&S&zbw<%zN{{coNGFuw(`f(v(+!r3VE-OR{7d5c80d8^w5VAzM?0Ze+J4R>LcYj zEWM^9BEyS3rI9CF%F7>ONha-Ml1mX65J)rEYm5B(vkC^Qbhr*Q8XHAVjsA>Teq9=P z?vT~Ed{5DLA#zPf=G&&d%QCyAFF|mH>bvFAQVHXv59A?oF%|tC26qxXF`ncbTG-dv zx4Bp*L9)x7lNAM&K1w&Zm3{4=ryf+9;5zUpy}6k4y~WOtcRkWAoSkP(Ec*3#npFH@ zQm|sne$R39#03q{=~Vn8#C~%XdkIaH&TGo(s&&zZL1hYVp87O==!S-ppj!#w+-T|h zGEabp%?lG;d;V@{_r@{LNeyh13x(5&J&FgKS2KUWR2=$y_=HQM*Q@<`6J~Qd=>(Stl{cDr?)p+;R zG-lu-GM8XRZh62KbGqkHs; sdf_element std::map< std::string, sdf::ElementPtr > neuronMap; + std::map< std::string, std::vector > neuronPartIdMap; - // List of all hidden neurons for convenience + // List of all hidden neurons (ids) for convenience std::vector< std::string > hiddenNeurons; - // Set for tracking all collected input/output neurons + // Set for tracking all collected input/output neurons (ids) std::set< std::string > toProcess; + auto controller_settings = _settings->GetElement("rv:controller"); + // Fetch the first neuron; note the HasElement call is necessary to // prevent SDF from complaining if no neurons are present. - auto neuron = _settings->HasElement("rv:neuron") - ? _settings->GetElement("rv:neuron") + auto neuron = controller_settings->HasElement("rv:neuron") + ? controller_settings->GetElement("rv:neuron") : sdf::ElementPtr(); while (neuron) { @@ -109,8 +113,9 @@ NeuralNetwork::NeuralNetwork( } auto layer = neuron->GetAttribute("layer")->GetAsString(); auto neuronId = neuron->GetAttribute("id")->GetAsString(); + auto neuronPartId = neuron->GetAttribute("part_id")->GetAsString(); - if (this->layerMap_.count(neuronId)) + if (this->layerMap_.count(neuronId) == 1) { std::cerr << "Duplicate neuron ID '" << neuronId << "'" << std::endl; throw std::runtime_error("Robot brain error"); @@ -119,6 +124,12 @@ NeuralNetwork::NeuralNetwork( this->layerMap_[neuronId] = layer; neuronMap[neuronId] = neuron; + if (neuronPartIdMap.find(neuronPartId) == neuronPartIdMap.end()) { + neuronPartIdMap[neuronPartId] = std::vector(); + } + neuronPartIdMap[neuronPartId].push_back(neuron); + + // INPUT LAYER if ("input" == layer) { if (this->nInputs_ >= MAX_INPUT_NEURONS) @@ -132,6 +143,7 @@ NeuralNetwork::NeuralNetwork( toProcess.insert(neuronId); ++(this->nInputs_); } + // OUTPUT LAYER else if ("output" == layer) { if (this->nOutputs_ >= MAX_OUTPUT_NEURONS) @@ -145,6 +157,7 @@ NeuralNetwork::NeuralNetwork( toProcess.insert(neuronId); ++(this->nOutputs_); } + // HIDDEN LAYER else if ("hidden" == layer) { if (hiddenNeurons.size() >= MAX_HIDDEN_NEURONS) @@ -157,7 +170,7 @@ NeuralNetwork::NeuralNetwork( } hiddenNeurons.push_back(neuronId); - ++(this->nHidden_); + ++(this->nHidden_); } else { @@ -171,70 +184,80 @@ NeuralNetwork::NeuralNetwork( // Create motor output neurons at the correct position // We iterate a part's motors and just assign every // neuron we find in order. - std::map< std::string, unsigned int > outputCountMap; unsigned int outputsIndex = 0; for (const auto &motor : _motors) { - auto partId = motor->PartId(); - if (not outputCountMap.count(partId)) + std::string partId = motor->PartId(); + auto details = neuronPartIdMap.find(partId); + if (details == neuronPartIdMap.end()) { - outputCountMap[partId] = 0; + std::cerr << "Required output neuron " << partId + << " for motor could not be located" << std::endl; + throw std::runtime_error("Robot brain error"); } + const auto &neuron_list = details->second; + auto neuron_iter = neuron_list.cbegin(); + for (unsigned int i = 0, l = motor->Outputs(); i < l; ++i) { - std::stringstream neuronId; - neuronId << partId << "-out-" << outputCountMap[partId]; - ++outputCountMap[partId]; - - auto details = neuronMap.find(neuronId.str()); - if (details == neuronMap.end()) - { - std::cerr << "Required output neuron " << neuronId.str() - << " for motor could not be located" << std::endl; - throw std::runtime_error("Robot brain error"); - } + while (not ((*neuron_iter)->GetAttribute("layer")->GetAsString() == "output")) + { + ++neuron_iter; + if (neuron_iter == neuron_list.cend()) + { + std::cerr << "Required input neuron " << partId + << " for sensor could not be located" << std::endl; + throw std::runtime_error("Robot brain error"); + } + } + std::string neuronId = (*neuron_iter)->GetAttribute("id")->GetAsString(); neuronHelper(&this->params_[outputsIndex * MAX_NEURON_PARAMS], &this->types_[outputsIndex], - details->second); - this->positionMap_[neuronId.str()] = outputsIndex; - toProcess.erase(neuronId.str()); + *neuron_iter); + this->positionMap_[neuronId] = outputsIndex; + toProcess.erase(neuronId); ++outputsIndex; + ++neuron_iter; } } // Create sensor input neurons - std::map< std::string, unsigned int > inputCountMap; unsigned int inputsIndex = 0; for (const auto &sensor : _sensors) { auto partId = sensor->PartId(); - - if (not inputCountMap.count(partId)) + auto details = neuronPartIdMap.find(partId); + if (details == neuronPartIdMap.end()) { - inputCountMap[partId] = 0; + std::cerr << "Required input neuron list " << partId + << " for sensor could not be located" << std::endl; + throw std::runtime_error("Robot brain error"); } + const auto &neuron_list = details->second; + auto neuron_iter = neuron_list.cbegin(); for (unsigned int i = 0, l = sensor->Inputs(); i < l; ++i) { - std::stringstream neuronId; - neuronId << partId << "-in-" << inputCountMap[partId]; - ++inputCountMap[partId]; - - auto details = neuronMap.find(neuronId.str()); - if (details == neuronMap.end()) + while (not ((*neuron_iter)->GetAttribute("layer")->GetAsString() == "input")) { - std::cerr << "Required input neuron " << neuronId.str() - << " for sensor could not be located" << std::endl; - throw std::runtime_error("Robot brain error"); + ++neuron_iter; + if (neuron_iter == neuron_list.cend()) + { + std::cerr << "Required input neuron " << partId + << " for sensor could not be located" << std::endl; + throw std::runtime_error("Robot brain error"); + } } + std::string neuronId = (*neuron_iter)->GetAttribute("id")->GetAsString(); // Input neurons can currently not have a type, so // there is no need to process it. - this->positionMap_[neuronId.str()] = inputsIndex; - toProcess.erase(neuronId.str()); + this->positionMap_[neuronId] = inputsIndex; + toProcess.erase(neuronId); ++inputsIndex; + ++neuron_iter; } } diff --git a/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp b/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp index 879a5758ea..a223de119f 100644 --- a/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp +++ b/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp @@ -27,8 +27,8 @@ namespace gz = gazebo; using namespace revolve::gazebo; ///////////////////////////////////////////////// -MotorFactory::MotorFactory(::gazebo::physics::ModelPtr _model) - : model_(_model) +MotorFactory::MotorFactory(::gazebo::physics::ModelPtr model) + : model_(std::move(model)) { } @@ -37,29 +37,30 @@ MotorFactory::~MotorFactory() = default; ///////////////////////////////////////////////// MotorPtr MotorFactory::Motor( - sdf::ElementPtr _motorSdf, + const sdf::ElementPtr &_motorSdf, const std::string &_type, - const std::string &_motorId, - const std::string &_partId) + const std::string &_partId, + const std::string &_motorId) { MotorPtr motor; if ("position" == _type) { - motor.reset(new PositionMotor(model_, _motorId, _partId, _motorSdf)); + motor.reset(new PositionMotor(this->model_, _partId, _motorId, _motorSdf)); } else if ("velocity" == _type) { - motor.reset(new VelocityMotor(model_, _motorId, _partId, _motorSdf)); + motor.reset(new VelocityMotor(this->model_, _partId, _motorId, _motorSdf)); } return motor; } ///////////////////////////////////////////////// -MotorPtr MotorFactory::Create(sdf::ElementPtr _motorSdf) +MotorPtr MotorFactory::Create(const sdf::ElementPtr &_motorSdf) { auto typeParam = _motorSdf->GetAttribute("type"); auto partIdParam = _motorSdf->GetAttribute("part_id"); +// auto partNameParam = _motorSdf->GetAttribute("part_name"); auto idParam = _motorSdf->GetAttribute("id"); if (not typeParam or not partIdParam or not idParam) @@ -69,6 +70,7 @@ MotorPtr MotorFactory::Create(sdf::ElementPtr _motorSdf) throw std::runtime_error("Motor error"); } +// auto partName = partNameParam->GetAsString(); auto partId = partIdParam->GetAsString(); auto type = typeParam->GetAsString(); auto id = idParam->GetAsString(); diff --git a/cpprevolve/revolve/gazebo/motors/MotorFactory.h b/cpprevolve/revolve/gazebo/motors/MotorFactory.h index ef02f4d38a..e771030a0a 100644 --- a/cpprevolve/revolve/gazebo/motors/MotorFactory.h +++ b/cpprevolve/revolve/gazebo/motors/MotorFactory.h @@ -38,7 +38,7 @@ namespace revolve /// \brief[in] _partId Module identifier /// \brief[in] _motorId Motor identifier /// \brief[in] _outputs Number of motor outputs - public: explicit MotorFactory(::gazebo::physics::ModelPtr _model); + public: explicit MotorFactory(::gazebo::physics::ModelPtr model); /// \brief Destructor public: virtual ~MotorFactory(); @@ -48,13 +48,13 @@ namespace revolve /// required attributes already checked, usually you should override /// this when adding new motor types. public: virtual MotorPtr Motor( - sdf::ElementPtr _motorSdf, - const std::string &_type, - const std::string &_motorId, - const std::string &_partId); + const sdf::ElementPtr &_motorSdf, + const std::string &_type, + const std::string &_partId, + const std::string &_motorId); /// \brief Creates a motor for the given model for the given SDF element. - public: virtual MotorPtr Create(sdf::ElementPtr _motorSdf); + public: virtual MotorPtr Create(const sdf::ElementPtr &_motorSdf); /// \brief Internal reference to the robot model protected: ::gazebo::physics::ModelPtr model_; diff --git a/cpprevolve/revolve/gazebo/motors/PositionMotor.cpp b/cpprevolve/revolve/gazebo/motors/PositionMotor.cpp index cd4177820f..16a86b613f 100644 --- a/cpprevolve/revolve/gazebo/motors/PositionMotor.cpp +++ b/cpprevolve/revolve/gazebo/motors/PositionMotor.cpp @@ -30,8 +30,8 @@ PositionMotor::PositionMotor( gz::physics::ModelPtr _model, const std::string &_partId, const std::string &_motorId, - sdf::ElementPtr _motor) - : JointMotor(_model, _partId, _motorId, _motor, 1) + const sdf::ElementPtr _motor) + : JointMotor(std::move(_model), _partId, _motorId, _motor, 1) , positionTarget_(0) , noise_(0) { diff --git a/cpprevolve/revolve/gazebo/motors/PositionMotor.h b/cpprevolve/revolve/gazebo/motors/PositionMotor.h index 24b28c3d57..75031070e3 100644 --- a/cpprevolve/revolve/gazebo/motors/PositionMotor.h +++ b/cpprevolve/revolve/gazebo/motors/PositionMotor.h @@ -44,15 +44,15 @@ namespace revolve ::gazebo::physics::ModelPtr _model, const std::string &_partId, const std::string &_motorId, - sdf::ElementPtr _motor); + const sdf::ElementPtr _motor); /// \brief Destructor - public: virtual ~PositionMotor(); + public: virtual ~PositionMotor() override; /// \brief public: virtual void Update( double *_outputs, - double _step); + double _step) override; /// \brief World update event function // protected: void OnUpdate(const ::gazebo::common::UpdateInfo info); diff --git a/cpprevolve/revolve/gazebo/plugin/RobotController.cpp b/cpprevolve/revolve/gazebo/plugin/RobotController.cpp index 5b3e2c5141..4ec270b847 100644 --- a/cpprevolve/revolve/gazebo/plugin/RobotController.cpp +++ b/cpprevolve/revolve/gazebo/plugin/RobotController.cpp @@ -203,11 +203,11 @@ void RobotController::LoadBrain(const sdf::ElementPtr _sdf) auto brain = _sdf->GetElement("rv:brain"); auto controller = brain->GetElement("rv:controller")->GetAttribute("type")->GetAsString(); auto learner = brain->GetElement("rv:learner")->GetAttribute("type")->GetAsString(); - if ("ann" == learner) + if ("offline" == learner and "ann" == controller) { brain_.reset(new NeuralNetwork(this->model_, brain, motors_, sensors_)); } - else if ("rlpower" == learner) + else if ("rlpower" == learner and "spline" == controller) { brain_.reset(new RLPower(this->model_, brain, motors_, sensors_)); } diff --git a/cpprevolve/revolve/gazebo/sensors/SensorFactory.cpp b/cpprevolve/revolve/gazebo/sensors/SensorFactory.cpp index 093f34512c..187d8c040d 100644 --- a/cpprevolve/revolve/gazebo/sensors/SensorFactory.cpp +++ b/cpprevolve/revolve/gazebo/sensors/SensorFactory.cpp @@ -51,7 +51,7 @@ SensorPtr SensorFactory::Sensor( { sensor.reset(new LightSensor(this->model_, _sensorSdf, _partId, _sensorId)); } - else if ("touch" == _type) + else if ("contact" == _type) // touch sensor { sensor.reset(new TouchSensor(this->model_, _sensorSdf, _partId, _sensorId)); } @@ -67,6 +67,10 @@ SensorPtr SensorFactory::Sensor( _partId, _sensorId)); } + else + { + std::clog << "Sensor type \"" << _type << "\" not recognized. Ignoring sensor" << std::endl; + } return sensor; } diff --git a/pyrevolve/SDF/__init__.py b/pyrevolve/SDF/__init__.py index c2471f2135..66eca34712 100644 --- a/pyrevolve/SDF/__init__.py +++ b/pyrevolve/SDF/__init__.py @@ -5,7 +5,7 @@ from .geometry import Visual, Collision, MeshGeometry, BoxGeometry from .inertial import Inertial from .joint import Joint -from .sensor import CameraSensor, TouchSensor +from .sensor import CameraSensor, TouchSensor, IMUSensor from . import math from .revolve_bot_sdf_builder import revolve_bot_to_sdf diff --git a/pyrevolve/SDF/joint.py b/pyrevolve/SDF/joint.py index 4f6b4a3337..c3ae7d574e 100644 --- a/pyrevolve/SDF/joint.py +++ b/pyrevolve/SDF/joint.py @@ -1,22 +1,72 @@ +import uuid import xml.etree.ElementTree from pyrevolve import SDF import pyrevolve.SDF.math class Joint(SDF.Posable): - def __init__(self, name: str, parent_link: SDF.Link, child_link: SDF.Link, axis: SDF.math.Vector3, position=None, - rotation=None): + def __init__(self, + _id: str, + name: str, + parent_link: SDF.Link, + child_link: SDF.Link, + axis: SDF.math.Vector3, + coordinates=None, + motorized=False, + position=None, + rotation=None + ): super().__init__( 'joint', - {'name': name, 'type': 'revolute'}, + { + 'id': _id, + 'name': name, + 'type': 'revolute' + }, position=position, rotation=rotation, ) + self._id = _id + self._name = name + self._motorized = motorized + self._coordinates = coordinates + SDF.sub_element_text(self, 'parent', parent_link.name) SDF.sub_element_text(self, 'child', child_link.name) self.axis = JointAxis(axis) self.append(self.axis) + def is_motorized(self): + return self._motorized + + def to_robot_config_sdf(self): + assert (self.is_motorized()) + + servomotor = xml.etree.ElementTree.Element('rv:servomotor', { + 'type': 'position', + 'id': "{}__rotate".format(self._id), + 'part_id': self._id, + 'part_name': self._name, + # 'x': self.x, + # 'y': self.y, + 'joint': self._name, + # noise: 0.1, + }) + + if self._coordinates is not None: + servomotor.attrib['coordinates'] = ';'.join(str(i) for i in self._coordinates) + + pid = xml.etree.ElementTree.SubElement(servomotor, 'rv:pid') + SDF.sub_element_text(pid, 'rv:p', 0.9) + SDF.sub_element_text(pid, 'rv:i', 0.0) + SDF.sub_element_text(pid, 'rv:d', 0.0) + SDF.sub_element_text(pid, 'rv:i_max', 0.0) + SDF.sub_element_text(pid, 'rv:i_min', 0.0) + # SDF.sub_element_text(pid, 'rv:cmd_max', 0.0) + # SDF.sub_element_text(pid, 'rv:cmd_min', 0.0) + + return servomotor + class JointAxis(xml.etree.ElementTree.Element): def __init__(self, axis: SDF.math.Vector3): diff --git a/pyrevolve/SDF/revolve_bot_sdf_builder.py b/pyrevolve/SDF/revolve_bot_sdf_builder.py index 21253a45a1..bc972d90b8 100644 --- a/pyrevolve/SDF/revolve_bot_sdf_builder.py +++ b/pyrevolve/SDF/revolve_bot_sdf_builder.py @@ -20,9 +20,13 @@ def revolve_bot_to_sdf(robot, robot_pose, nice_format): model.append(pose_elem) core_link = SDF.Link('Core') + core_visual, core_collision, imu_core_sensor = robot._body.to_sdf('', core_link) + links = [core_link] joints = [] - core_visual, core_collision = robot._body.to_sdf('') + actuators = [] + sensors = [imu_core_sensor] + core_link.append(core_visual) core_link.append(core_collision) @@ -31,16 +35,23 @@ def revolve_bot_to_sdf(robot, robot_pose, nice_format): continue core_slot = robot._body.boxslot(Orientation(core_slot)) slot_chain = core_slot.orientation.short_repr() - children_links, children_joints = _module_to_sdf(child_module, - core_link, - core_slot, - core_collision, - slot_chain) + + children_links, \ + children_joints, \ + children_sensors = _module_to_sdf(child_module, + core_link, + core_slot, + core_collision, + slot_chain) + links.extend(children_links) joints.extend(children_joints) + sensors.extend(children_sensors) for joint in joints: model.append(joint) + if joint.is_motorized(): + actuators.append(joint) for link in links: link.align_center_of_mass() @@ -48,9 +59,8 @@ def revolve_bot_to_sdf(robot, robot_pose, nice_format): model.append(link) # ADD BRAIN - if robot._brain is not None: - plugin_elem = _sdf_brain_plugin_conf(robot._brain) - model.append(plugin_elem) + plugin_elem = _sdf_brain_plugin_conf(robot._brain, sensors, actuators, robot_genome=None) + model.append(plugin_elem) # XML RENDER PHASE # def prettify(rough_string, indent='\t'): @@ -64,6 +74,8 @@ def prettify(rough_string, indent='\t'): if nice_format is not None: res = prettify(res, nice_format) + else: + res = res.decode() return res @@ -119,10 +131,12 @@ def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, """ links = [] joints = [] + sensors = [] my_link = parent_link my_collision = None + # ACTIVE HINGE if type(module) is ActiveHingeModule: child_link = SDF.Link('{}_Leg'.format(slot_chain)) @@ -176,8 +190,9 @@ def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, my_link = child_link my_collision = collisions_servo[0] + # OTHERS else: - visual, collision = module.to_sdf(slot_chain, my_link) + visual, collision, sensor = module.to_sdf(slot_chain, my_link) module_slot = module.boxslot(Orientation.SOUTH) _sdf_attach_module(module_slot, module.orientation, @@ -189,29 +204,38 @@ def _module_to_sdf(module, parent_link, parent_slot: BoxSlot, parent_collision, my_collision = collision - # recursions on children + if sensor is not None: + sensors.append(sensor) + + # RECURSION ON CHILDREN for my_slot, child_module in module.iter_children(): if child_module is None: continue my_slot = module.boxslot(Orientation(my_slot)) slot_chain = '{}{}'.format(slot_chain, my_slot.orientation.short_repr()) - children_links, children_joints = _module_to_sdf(child_module, - my_link, - my_slot, - my_collision, - slot_chain) + + children_links, \ + children_joints, \ + children_sensors = _module_to_sdf(child_module, + my_link, + my_slot, + my_collision, + slot_chain) links.extend(children_links) joints.extend(children_joints) + sensors.extend(children_sensors) - return links, joints + return links, joints, sensors def _sdf_brain_plugin_conf( robot_brain, - battery_level=None, + sensors, + actuators, + robot_genome=None, update_rate: float = 8.0, - controller_plugin: str = 'libRobotControlPlugin.so' + controller_plugin: str = 'libRobotControlPlugin.so', ): """ Creates the plugin node with the brain configuration inside @@ -236,18 +260,38 @@ def _sdf_brain_plugin_conf( # update rate SDF.sub_element_text(config, 'rv:update_rate', update_rate) + # battery + # if battery_level is not None: + # battery = xml.etree.ElementTree.SubElement(config, 'rv:battery') + # SDF.sub_element_text(battery, 'rv:level', battery_level) + # brain - if robot_brain is not None: - brain_config = robot_brain.to_sdf() - config.append(brain_config) + robot_brain_sdf = xml.etree.ElementTree.SubElement(config, 'rv:brain') - # TODO sensors + robot_learner = robot_brain.learner_sdf() + if robot_learner is None: + xml.etree.ElementTree.SubElement(robot_brain_sdf, 'rv:learner', {'type': 'None'}) + else: + robot_brain_sdf.append(robot_learner) - # TODO motors + robot_controller = robot_brain.controller_sdf() + if robot_controller is None: + xml.etree.ElementTree.SubElement(robot_brain_sdf, 'rv:controller', {'type': 'None'}) + else: + robot_brain_sdf.append(robot_controller) - # battery - if battery_level is not None: - battery = xml.etree.ElementTree.SubElement(config, 'rv:battery') - SDF.sub_element_text(battery, 'rv:level', battery_level) + # sensors + sensors_elem = xml.etree.ElementTree.SubElement(robot_brain_sdf, 'rv:sensors') + for sensor in sensors: + sensors_elem.append(sensor.to_robot_config_sdf()) + + # actuators + actuators_elem = xml.etree.ElementTree.SubElement(robot_brain_sdf, 'rv:actuators') + for actuator in actuators: + actuators_elem.append(actuator.to_robot_config_sdf()) + + # robot genome + if robot_genome is not None: + SDF.sub_element_text(config, 'rv:genome', str(robot_genome)) return plugin diff --git a/pyrevolve/SDF/sensor.py b/pyrevolve/SDF/sensor.py index 98960cac95..885d2c1f5d 100644 --- a/pyrevolve/SDF/sensor.py +++ b/pyrevolve/SDF/sensor.py @@ -3,24 +3,51 @@ class Sensor(SDF.Posable): + SENSOR_TYPE = None + """ Generic SDF sensor. Parent element: Link or Joint """ - def __init__(self, name: str, sensor_type: str, position=None, rotation=None): + def __init__(self, name: str, link, module, position=None, rotation=None): super().__init__( 'sensor', { 'name': name, - 'type': sensor_type, + 'type': self.SENSOR_TYPE, }, position, rotation, ) + self._name = name + self._link = link + self._module = module + + def to_robot_config_sdf(self): + return xml.etree.ElementTree.Element('rv:sensor', { + 'link': self._link.name, + 'sensor': self._name, + 'type': self.SENSOR_TYPE, + 'id': '{}_sensor'.format(self._link.name), + 'part_id': self._module.id, + }) + + +class IMUSensor(Sensor): + SENSOR_TYPE = 'imu' + """ + IMU Sensor + + Parent element: Link or Joint + """ + def __init__(self, name: str, link, module): + super().__init__(name, link, module) + SDF.sub_element_text(self, 'always_on', True) class CameraSensor(Sensor): + SENSOR_TYPE = 'camera' """ Camera Sensor @@ -59,25 +86,27 @@ def __init__(self, SDF.sub_element_text(clip, 'near', clip_near) SDF.sub_element_text(clip, 'far', clip_far) + SDF.sub_element_text(self, 'always_on', True) + class TouchSensor(Sensor): + SENSOR_TYPE = 'contact' """ Touch Sensor element. It references a collision element and transforms it into a touch sensor. Parent element: Link or Joint """ - def __init__(self, name: str, collision_element): + def __init__(self, name: str, collision_element, link, module): """ Constructor :param name: name of the sensor :param collision_element: name or reference of the collision element :type collision_element: str|SDF.Collision """ - super().__init__( - name, - 'contact', - ) + super().__init__(name, link, module) collision_element = collision_element if type(collision_element) is str else collision_element.name contact = xml.etree.ElementTree.SubElement(self, 'contact') SDF.sub_element_text(contact, 'collision', collision_element) # SDF.sub_element_text(contact, 'topic', 'topic_{}'.format(collision_element)) + # SDF.sub_element_text(self, 'update_rate', 8.0) + SDF.sub_element_text(self, 'always_on', True) diff --git a/pyrevolve/angle/manage/world.py b/pyrevolve/angle/manage/world.py index e29059f42a..6a09bdc274 100644 --- a/pyrevolve/angle/manage/world.py +++ b/pyrevolve/angle/manage/world.py @@ -403,7 +403,7 @@ async def insert_robot( :type pose: Pose|Vector3 :return: A future that resolves with the created `Robot` object. """ - sdf_bot = revolve_bot.to_sdf(pose).decode('utf8') + sdf_bot = revolve_bot.to_sdf(pose) if self.output_directory: robot_file_path = os.path.join( diff --git a/pyrevolve/revolve_bot/brain/__init__.py b/pyrevolve/revolve_bot/brain/__init__.py new file mode 100644 index 0000000000..09c1b19705 --- /dev/null +++ b/pyrevolve/revolve_bot/brain/__init__.py @@ -0,0 +1,3 @@ +from .base import Brain +from .brain_nn import BrainNN +from .rlpower_splines import BrainRLPowerSplines diff --git a/pyrevolve/revolve_bot/brain/base.py b/pyrevolve/revolve_bot/brain/base.py new file mode 100644 index 0000000000..b6b3aa7c7f --- /dev/null +++ b/pyrevolve/revolve_bot/brain/base.py @@ -0,0 +1,24 @@ +import pyrevolve.revolve_bot.brain + + +class Brain(object): + + @staticmethod + def from_yaml(yaml_brain): + brain_type = yaml_brain['type'] + + if brain_type == 'neural-network': + return pyrevolve.revolve_bot.brain.BrainNN.from_yaml(yaml_brain) + elif brain_type == 'rlpower-splines': + return pyrevolve.revolve_bot.brain.BrainRLPowerSplines.from_yaml(yaml_brain) + else: + return Brain() + + def to_yaml(self): + return {} + + def learner_sdf(self): + return None + + def controller_sdf(self): + return None diff --git a/pyrevolve/revolve_bot/brain_nn.py b/pyrevolve/revolve_bot/brain/brain_nn.py similarity index 65% rename from pyrevolve/revolve_bot/brain_nn.py rename to pyrevolve/revolve_bot/brain/brain_nn.py index 0b0699d8d8..0b89b99159 100644 --- a/pyrevolve/revolve_bot/brain_nn.py +++ b/pyrevolve/revolve_bot/brain/brain_nn.py @@ -1,10 +1,13 @@ """ Class containing the brain parts to compose a robot """ +import xml.etree.ElementTree from collections import OrderedDict +import pyrevolve.SDF +from .base import Brain -class BrainNN: +class BrainNN(Brain): """ Base class allowing for constructing neural network controller components in an overviewable manner """ @@ -15,7 +18,7 @@ def __init__(self): self.params = {} @staticmethod - def FromYaml(yaml_object): + def from_yaml(yaml_object): """ From a yaml object, creates a data struture of interconnected body modules. Standard names for modules are: @@ -30,20 +33,22 @@ def FromYaml(yaml_object): for k_node in yaml_object['neurons']: node = Node() - node.generate_node(yaml_object['neurons'][k_node]) + node.load_yaml(yaml_object['neurons'][k_node]) brain.nodes[k_node] = node if 'connections' in yaml_object: for edge in yaml_object['connections']: connection = Connection() - connection.generate_connection(edge) + connection.load_yaml(edge) brain.connections.append(connection) for k_node in yaml_object['params']: params = Params() - params.generate_params(yaml_object['params'][k_node]) + params.load_yaml(yaml_object['params'][k_node]) brain.params[k_node] = params + return brain + def to_yaml(self): yaml_dict_brain = OrderedDict() @@ -91,6 +96,37 @@ def to_yaml(self): return yaml_dict_brain + def learner_sdf(self): + #TODO this is selecting the controller not the learner! + return xml.etree.ElementTree.Element('rv:learner', {'type': 'offline'}) + + def controller_sdf(self): + controller = xml.etree.ElementTree.Element('rv:controller', {'type': 'ann'}) + node_map = {} + + for name, node in self.nodes.items(): + assert(name == node.id) + neuron = xml.etree.ElementTree.SubElement(controller, 'rv:neuron', { + 'layer': node.layer, + 'type': node.type, + 'id': node.id, + 'part_id': node.part_id, + }) + node_map[node.id] = neuron + + for connection in self.connections: + xml.etree.ElementTree.SubElement(controller, 'rv:neural_connection', { + 'src': str(connection.src), + 'dst': str(connection.dst), + 'weight': str(connection.weight), + }) + + for node_id, param in self.params.items(): + node = node_map[node_id] + param.to_sdf(node) + + return controller + class Node: def __init__(self): @@ -99,8 +135,7 @@ def __init__(self): self.part_id = None self.type = None - def generate_node(self, yaml_object_node): - + def load_yaml(self, yaml_object_node): self.id = yaml_object_node['id'] self.layer = yaml_object_node['layer'] self.part_id = yaml_object_node['part_id'] @@ -113,8 +148,7 @@ def __init__(self): self.src = None self.weight = None - def generate_connection(self, yaml_object_connection): - + def load_yaml(self, yaml_object_connection): self.dst = yaml_object_connection['dst'] self.src = yaml_object_connection['src'] self.weight = yaml_object_connection['weight'] @@ -128,8 +162,7 @@ def __init__(self): self.bias = None self.gain = None - def generate_params(self, yaml_object_node): - + def load_yaml(self, yaml_object_node): if 'period' in yaml_object_node: self.period = yaml_object_node['period'] if 'phase_offset' in yaml_object_node: @@ -140,3 +173,15 @@ def generate_params(self, yaml_object_node): self.bias = yaml_object_node['bias'] if 'gain' in yaml_object_node: self.gain = yaml_object_node['gain'] + + def to_sdf(self, node_elem): + if self.period is not None: + pyrevolve.SDF.sub_element_text(node_elem, 'rv:period', self.period) + if self.phase_offset is not None: + pyrevolve.SDF.sub_element_text(node_elem, 'rv:phase_offset', self.phase_offset) + if self.amplitude is not None: + pyrevolve.SDF.sub_element_text(node_elem, 'rv:amplitude', self.amplitude) + if self.bias is not None: + pyrevolve.SDF.sub_element_text(node_elem, 'rv:bias', self.bias) + if self.gain is not None: + pyrevolve.SDF.sub_element_text(node_elem, 'rv:gain', self.gain) diff --git a/pyrevolve/revolve_bot/brain/rlpower_splines.py b/pyrevolve/revolve_bot/brain/rlpower_splines.py new file mode 100644 index 0000000000..a80b70587a --- /dev/null +++ b/pyrevolve/revolve_bot/brain/rlpower_splines.py @@ -0,0 +1,18 @@ +import xml.etree.ElementTree +from .base import Brain + + +class BrainRLPowerSplines(Brain): + + @staticmethod + def from_yaml(yaml_object): + return BrainRLPowerSplines() + + def to_yaml(self): + return {} + + def learner_sdf(self): + return xml.etree.ElementTree.Element('rv:learner', {'type': 'rlpower'}) + + def controller_sdf(self): + return xml.etree.ElementTree.Element('rv:controller', {'type': 'spline'}) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 44dba25344..a167c3291b 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -2,24 +2,16 @@ Revolve body generator based on RoboGen framework """ import yaml -import math from collections import OrderedDict from pyrevolve import SDF -from .revolve_module import CoreModule -from .revolve_module import ActiveHingeModule -from .revolve_module import BrickModule -from .revolve_module import BrickSensorModule -from .revolve_module import Orientation -from .revolve_module import BoxSlot -from .brain_nn import BrainNN +from .revolve_module import CoreModule, Orientation +from .brain import Brain, BrainNN, BrainRLPowerSplines from .render.render import Render from .measure import Measure -import xml.etree.ElementTree - class RevolveBot: """ @@ -62,7 +54,6 @@ def _recursive_size_measurement(self, module): return count - def measure_behaviour(self): """ @@ -113,18 +104,12 @@ def load_yaml(self, text): yaml_brain = yaml_bot['brain'] if 'type' not in yaml_brain: # raise IOError("brain type not defined, please fix it") - brain_type = 'neural-network' - else: - brain_type = yaml_brain['type'] - - if brain_type == 'neural-network': - self._brain = BrainNN() - self._brain.FromYaml(yaml_brain) - + yaml_brain['type'] = 'neural-network' + self._brain = Brain.from_yaml(yaml_brain) else: - self._brain = None + self._brain = Brain() except: - self._brain = None + self._brain = Brain() print('Failed to load brain, setting to None') def load_file(self, path, conf_type='yaml'): @@ -140,6 +125,8 @@ def load_file(self, path, conf_type='yaml'): self.load(robot, conf_type) def to_sdf(self, pose=SDF.math.Vector3(0, 0, 0.25), nice_format=None): + if type(nice_format) is bool: + nice_format = '\t' if nice_format else None return SDF.revolve_bot_to_sdf(self, pose, nice_format) def to_yaml(self): @@ -167,7 +154,7 @@ def save_file(self, path, conf_type='yaml'): if 'yaml' == conf_type: robot = self.to_yaml() elif 'sdf' == conf_type: - robot = self.to_sdf() + robot = self.to_sdf(nice_format=True) with open(path, 'w') as robot_file: robot_file.write(robot) @@ -257,7 +244,7 @@ def render2d(self, img_path): Render 2d representation of robot and store as png :param img_path: path of storing png file """ - if self._body == None: + if self._body is None: raise RuntimeError('Body not initialized') else: try: diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index dee260f0c6..5bc4aef2f6 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -151,6 +151,19 @@ def validate(self): raise RuntimeError("Robot tree validation not yet implemented") def to_sdf(self, tree_depth='', parent_link=None, child_link=None): + """ + Transform the module in sdf elements. + + IMPORTANT: It does not append VISUAL and COLLISION elements to the parent link + automatically. It does append automatically the SENSOR element. + TODO: make the append automatic for VISUAL AND COLLISION AS WELL. + + :param tree_depth: current tree depth as string (for naming) + :param parent_link: link of the parent (may be needed for certain modules) + :param child_link: link of the child (may be needed for certain modules, like hinges) + :return: visual SDF element, collision SDF element, sensor SDF element. + Sensor SDF element may be None. + """ name = 'component_{}_{}__box'.format(tree_depth, self.TYPE) visual = SDF.Visual(name, self.rgb) geometry = SDF.MeshGeometry(self.VISUAL_MESH) @@ -160,7 +173,7 @@ def to_sdf(self, tree_depth='', parent_link=None, child_link=None): geometry = SDF.BoxGeometry(self.COLLISION_BOX) collision.append(geometry) - return visual, collision + return visual, collision, None def boxslot(self, orientation=None): orientation = Orientation.SOUTH if orientation is None else orientation @@ -210,6 +223,12 @@ def possible_slots(self): (-self.SLOT_COORDINATES, self.SLOT_COORDINATES), # Z ) + def to_sdf(self, tree_depth='', parent_link=None, child_link=None): + imu_sensor = SDF.IMUSensor('core-imu_sensor', parent_link, self) + visual, collision, _ = super().to_sdf(tree_depth, parent_link, child_link) + parent_link.append(imu_sensor) + return visual, collision, imu_sensor + class ActiveHingeModule(RevolveModule): """ @@ -272,9 +291,13 @@ def to_sdf(self, tree_depth='', parent_link=None, child_link=None): geometry = SDF.BoxGeometry(self.COLLISION_BOX_SERVO_2) collision_servo_2.append(geometry) - joint = SDF.Joint(name_joint, - parent_link, child_link, - SDF.math.Vector3(0, 1, 0)) + joint = SDF.Joint(self.id, + name_joint, + parent_link, + child_link, + axis=SDF.math.Vector3(0, 1, 0), + coordinates=self.substrate_coordinates, + motorized=True) joint.set_position(SDF.math.Vector3(-0.0085, 0, 0)) @@ -399,10 +422,10 @@ def to_sdf(self, tree_depth='', parent_link=None, child_link=None): # collision.translate(SDF.math.Vector3(0.01175, 0.001, 0)) collision.append(geometry) - sensor = SDF.TouchSensor(name_sensor, collision) + sensor = SDF.TouchSensor(name_sensor, collision, parent_link, self) parent_link.append(sensor) - return visual, collision + return visual, collision, sensor class BoxSlot: From 839ff8a2e070eaadee6d1d5ac2b980a87bd5ffcd Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Wed, 3 Apr 2019 12:08:30 +0200 Subject: [PATCH 43/49] Remove const for compilation problem --- cpprevolve/revolve/gazebo/motors/MotorFactory.cpp | 4 ++-- cpprevolve/revolve/gazebo/motors/MotorFactory.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp b/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp index a223de119f..0aee478484 100644 --- a/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp +++ b/cpprevolve/revolve/gazebo/motors/MotorFactory.cpp @@ -37,7 +37,7 @@ MotorFactory::~MotorFactory() = default; ///////////////////////////////////////////////// MotorPtr MotorFactory::Motor( - const sdf::ElementPtr &_motorSdf, + sdf::ElementPtr _motorSdf, const std::string &_type, const std::string &_partId, const std::string &_motorId) @@ -56,7 +56,7 @@ MotorPtr MotorFactory::Motor( } ///////////////////////////////////////////////// -MotorPtr MotorFactory::Create(const sdf::ElementPtr &_motorSdf) +MotorPtr MotorFactory::Create(sdf::ElementPtr _motorSdf) { auto typeParam = _motorSdf->GetAttribute("type"); auto partIdParam = _motorSdf->GetAttribute("part_id"); diff --git a/cpprevolve/revolve/gazebo/motors/MotorFactory.h b/cpprevolve/revolve/gazebo/motors/MotorFactory.h index e771030a0a..f9863d7151 100644 --- a/cpprevolve/revolve/gazebo/motors/MotorFactory.h +++ b/cpprevolve/revolve/gazebo/motors/MotorFactory.h @@ -48,13 +48,13 @@ namespace revolve /// required attributes already checked, usually you should override /// this when adding new motor types. public: virtual MotorPtr Motor( - const sdf::ElementPtr &_motorSdf, + sdf::ElementPtr _motorSdf, const std::string &_type, const std::string &_partId, const std::string &_motorId); /// \brief Creates a motor for the given model for the given SDF element. - public: virtual MotorPtr Create(const sdf::ElementPtr &_motorSdf); + public: virtual MotorPtr Create(sdf::ElementPtr _motorSdf); /// \brief Internal reference to the robot model protected: ::gazebo::physics::ModelPtr model_; From 8f49e85a8f6ecb55cca1d607bf05cdf2a0842707 Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Wed, 3 Apr 2019 15:24:41 +0200 Subject: [PATCH 44/49] brain measurements --- .../{measure.py => measure/measure_body.py} | 38 ++- .../revolve_bot/measure/measure_brain.py | 239 ++++++++++++++++++ pyrevolve/revolve_bot/revolve_bot.py | 20 +- 3 files changed, 286 insertions(+), 11 deletions(-) rename pyrevolve/revolve_bot/{measure.py => measure/measure_body.py} (90%) create mode 100644 pyrevolve/revolve_bot/measure/measure_brain.py diff --git a/pyrevolve/revolve_bot/measure.py b/pyrevolve/revolve_bot/measure/measure_body.py similarity index 90% rename from pyrevolve/revolve_bot/measure.py rename to pyrevolve/revolve_bot/measure/measure_body.py index 8f65654e57..29a4964eb0 100644 --- a/pyrevolve/revolve_bot/measure.py +++ b/pyrevolve/revolve_bot/measure/measure_body.py @@ -1,10 +1,10 @@ import math -from .render.render import Render -from .render.grid import Grid -from .revolve_module import ActiveHingeModule, BrickModule, TouchSensorModule, BrickSensorModule, CoreModule +from ..render.render import Render +from ..render.grid import Grid +from ..revolve_module import ActiveHingeModule, BrickModule, TouchSensorModule, BrickSensorModule, CoreModule -class Measure: +class MeasureBody: def __init__(self, body): self.body = body self.branching_modules_count = 0 @@ -20,12 +20,14 @@ def __init__(self, body): self.height = None self.absolute_size = None self.size = None + self.sensors = None self.symmetry = None self.hinge_count = 0 self.active_hinges_count = 0 self.brick_count = 0 self.brick_sensor_count = 0 self.touch_sensor_count = 0 + self.free_slots = 0 self.max_permitted_modules = None def count_branching_bricks(self, module=None): @@ -226,6 +228,32 @@ def measure_proportion(self): self.proportion = self.height / self.width return self.proportion + def count_free_slots(self, module=None): + """ + Count amount of free slots in body + """ + if module is None: + module = self.body + children_count = 0 + for core_slot, child_module in module.iter_children(): + if child_module is None: + continue + if not isinstance(child_module, TouchSensorModule): + children_count += 1 + self.count_free_slots(child_module) + if isinstance(module, CoreModule): + self.free_slots += (4-children_count) + if isinstance(module, BrickModule): + self.free_slots += (3-children_count) + + def measure_sensors(self, module=None): + """ + Measurement describes the proportion of free slots that contain sensors + """ + self.count_free_slots() + self.sensors = self.touch_sensor_count / self.free_slots + return self.sensors + def measure_absolute_size(self, module=None): """ Count total amount of modules in body excluding sensors @@ -304,6 +332,7 @@ def measure_all(self): self.measure_coverage() self.measure_symmetry() self.measure_branching() + self.measure_sensors() return self.measurement_to_dict() def measurement_to_dict(self): @@ -330,5 +359,6 @@ def measurement_to_dict(self): 'height': self.height, 'absolute_size': self.absolute_size, 'size': self.size, + 'sensors': self.sensors, 'symmetry': self.symmetry } diff --git a/pyrevolve/revolve_bot/measure/measure_brain.py b/pyrevolve/revolve_bot/measure/measure_brain.py new file mode 100644 index 0000000000..8520335e35 --- /dev/null +++ b/pyrevolve/revolve_bot/measure/measure_brain.py @@ -0,0 +1,239 @@ +import numpy as np +import math +# belong to TODO +import fnmatch + + +class MeasureBrain: + def __init__(self, brain, max_param): + self.brain = brain + self.max_param = max_param + self.count_oscillators = None + self.periods = None + self.phase_offsets = None + self.amplitudes = None + self.avg_period = None + self.dev_period = None + self.avg_phase_offset = None + self.dev_phase_offset = None + self.avg_amplitude = None + self.dev_amplitude = None + self.avg_intra_dev_params = None + self.avg_inter_dev_params = None + self.sensors_reach = None + self.recurrence = None + self.synaptic_reception = None + + def sigmoid(self, value): + """ + Return sigmoid of value + """ + return 1 / (1 + math.exp(-value)) + + def collect_sets_of_params(self): + """ + Create lists of parameter values + """ + params = self.brain.params + if self.periods is None: + self.periods = [params[param].period for param in params] + if self.phase_offsets is None: + self.phase_offsets = [params[param].phase_offset for param in params] + if self.amplitudes is None: + self.amplitudes = [params[param].amplitude for param in params] + + def calc_count_oscillators(self): + """ + Calculate amount of oscillators in brain + """ + oscillators = 0 + nodes = self.brain.nodes + for node in nodes: + if nodes[node].type == 'Oscillator': + oscillators += 1 + self.count_oscillators = oscillators + + def measure_avg_period(self): + """ + Measure average (median) Period among the oscillators of the controller + """ + if self.periods is None: + self.collect_sets_of_params() + median = np.median(self.periods) + self.avg_period = median / self.max_param + return self.avg_period + + def measure_dev_period(self): + """ + Measure standard deviation of Period among the oscillators of the controller + """ + if self.periods is None: + self.collect_sets_of_params() + self.dev_period = self.sigmoid(np.std(self.periods)) + return self.dev_period + + def measure_avg_phase_offset(self): + """ + Measure average (median) Phase Offset among the oscillators of the controller + """ + if self.phase_offsets is None: + self.collect_sets_of_params() + median = np.median(self.phase_offsets) + self.avg_phase_offset = median / self.max_param + return self.avg_phase_offset + + def measure_dev_phase_offset(self): + """ + Measure standard deviation of Phase Offset among the oscillators of the controller + """ + if self.phase_offsets is None: + self.collect_sets_of_params() + self.dev_phase_offset = self.sigmoid(np.std(self.phase_offsets)) + return self.dev_phase_offset + + def measure_avg_amplitude(self): + """ + Measure average (median) Amplitude among the oscillators of the controller + """ + if self.amplitudes is None: + self.collect_sets_of_params() + median = np.median(self.amplitudes) + self.avg_amplitude = median / self.max_param + return self.avg_amplitude + + def measure_dev_amplitude(self): + """ + Measure standard deviation of Amplitude among the oscillators of the controller + """ + if self.amplitudes is None: + self.collect_sets_of_params() + self.dev_amplitude = self.sigmoid(np.std(self.amplitudes)) + return self.dev_amplitude + + def measure_avg_intra_dev_params(self): + """ + Describes the average (median) among the oscillators, regarding the standard deviation of Period, Phase Offset, and Amplitude, + """ + params = self.brain.params + dt = [np.std([params[param].period, params[param].phase_offset, params[param].amplitude]) for param in params] + self.avg_intra_dev_params = self.sigmoid(np.median(dt)) + return self.avg_intra_dev_params + + def measure_avg_inter_dev_params(self): + """ + Measure average (mean) of the parameters Period, Phase Offset, and Amplitude, regarding their deviations among the oscillator + """ + if self.periods is None or self.phase_offsets is None or self.amplitudes is None: + self.collect_sets_of_params() + self.avg_inter_dev_params = self.sigmoid((np.std(self.periods) + np.std(self.phase_offsets) + np.std(self.amplitudes)) / 3) + return self.avg_inter_dev_params + + def measure_sensors_reach(self): + """ + Describes how connected the sensors are to the oscillators + """ + if self.count_oscillators is None: + self.calc_count_oscillators() + + connections = [] + nodes = self.brain.nodes + # TODO REMOVE condition WHEN duplicated nodes bug is fixed -- duplicated nodes end in '-[0-9]+' or '-core[0-9]+' (node2-2, node2-core1) + duplicates = fnmatch.filter(nodes, 'node*-*') + for node in nodes: + if node not in duplicates and nodes[node].type == 'Input': + connections_of_node = 0 + for connection in self.brain.connections: + if connection.src == nodes[node].id: + connections_of_node += 1 + connections.append(connections_of_node/self.count_oscillators) + if not connections: + self.sensors_reach = 0 + return 0 + self.sensors_reach = np.median(connections) + return self.sensors_reach + + def measure_recurrence(self): + """ + Describes the proportion of oscillators that have a recurrent connection + """ + connections = self.brain.connections + recurrent = 0 + for connection in connections: + if connection.src == connection.dst: + recurrent += 1 + + if self.count_oscillators is None: + self.calc_count_oscillators() + + if recurrent is 0: + self.recurrence = 0 + return 0 + else: + self.recurrence = recurrent/self.count_oscillators + + return self.recurrence + + def measure_synaptic_reception(self): + """ + Describes the average (median) balance between inhibitory and excitatory connections from the sensors to the oscillators in the controller + """ + balance_set = [] + nodes = self.brain.nodes + connections = self.brain.connections + for node in nodes: + if nodes[node].type == 'Oscillator': + inhibitory = [] + excitatory = [] + for connection in connections: + if connection.dst == nodes[node].id and connection.src != nodes[node].id: + if connection.weight < 0: + inhibitory.append(abs(connection.weight)) + if connection.weight > 0: + excitatory.append(connection.weight) + inhibitory_sum = np.sum(inhibitory) + excitatory_sum = np.sum(excitatory) + min_value = min(inhibitory_sum, excitatory_sum) + max_value = max(inhibitory_sum, excitatory_sum) + if min_value == 0 or max_value == 0: + balance_set.append(0) + else: + balance_set.append(min_value / max_value) + self.synaptic_reception = np.median(balance_set) + return self.synaptic_reception + + def measure_all(self): + """ + Perform all brain measuerments + """ + self.collect_sets_of_params() + self.calc_count_oscillators() + self.measure_avg_period() + self.measure_dev_period() + self.measure_avg_phase_offset() + self.measure_dev_phase_offset() + self.measure_avg_amplitude() + self.measure_dev_amplitude() + self.measure_avg_intra_dev_params() + self.measure_avg_inter_dev_params() + self.measure_sensors_reach() + self.measure_recurrence() + self.measure_synaptic_reception() + return self.measurements_to_dict() + + def measurements_to_dict(self): + """ + Return measurements as dictionary + """ + return { + 'avg_period': self.avg_period, + 'dev_period': self.dev_period, + 'avg_phase_offset': self.avg_phase_offset, + 'dev_phase_offset': self.dev_phase_offset, + 'avg_amplitude': self.avg_amplitude, + 'dev_amplitude': self.dev_amplitude, + 'avg_intra_dev_params': self.avg_intra_dev_params, + 'avg_inter_dev_params': self.avg_inter_dev_params, + 'sensors_reach': self.sensors_reach, + 'recurrence': self.recurrence, + 'synaptic_reception': self.synaptic_reception + } diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 77f4b55cb5..5c91803f2b 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -17,7 +17,8 @@ from .render.render import Render from .render.brain_graph import BrainGraph -from .measure import Measure +from .measure.measure_body import MeasureBody +from .measure.measure_brain import MeasureBrain import xml.etree.ElementTree @@ -63,7 +64,6 @@ def _recursive_size_measurement(self, module): return count - def measure_behaviour(self): """ @@ -73,20 +73,26 @@ def measure_behaviour(self): def measure_body(self): """ - :return: + :return: dict of body measurements """ try: - measure = Measure(self._body) + measure = MeasureBody(self._body) return measure.measure_all() except Exception as e: print('Exception: {}'.format(e)) def measure_brain(self): """ - - :return: + :return: dict of brain measurements """ - pass + if self._brain == None: + raise RuntimeError('Brain not initialized') + else: + try: + measure = MeasureBrain(self._brain, 10) + return measure.measure_all() + except: + print('Failed measuring brain') def load(self, text, conf_type): """ From 81218c4159137c3d2de6ba83b322864234cf4d90 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Wed, 3 Apr 2019 16:15:46 +0200 Subject: [PATCH 45/49] Rotated default orientation of the touch sensor The old revolve had the touch sensor rotated 90 degrees from the current implementation. Having a different tangent solved the problem. --- pyrevolve/revolve_bot/revolve_module.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/pyrevolve/revolve_bot/revolve_module.py b/pyrevolve/revolve_bot/revolve_module.py index 5bc4aef2f6..ce6e2d36f6 100644 --- a/pyrevolve/revolve_bot/revolve_module.py +++ b/pyrevolve/revolve_bot/revolve_module.py @@ -398,8 +398,8 @@ def __init__(self): def boxslot(self, orientation=None): orientation = Orientation.SOUTH if orientation is None else orientation - assert(orientation is Orientation.SOUTH) - return BoxSlot(self.possible_slots(), Orientation.WEST) + assert (orientation is Orientation.SOUTH) + return BoxSlotTouchSensor(self.possible_slots()) def possible_slots(self): return ( @@ -499,3 +499,24 @@ def _calculate_box_slot_tangent(slot: Orientation): return SDF.math.Vector3(0, 0, 1) else: raise RuntimeError("Invalid orientation") + + +class BoxSlotTouchSensor(BoxSlot): + def __init__(self, boundaries): + super().__init__(boundaries, Orientation.SOUTH) + + def _calculate_box_slot_pos(self, boundaries, slot: Orientation): + if slot == Orientation.SOUTH: + return SDF.math.Vector3(boundaries[0][0], 0, 0) + else: + raise RuntimeError('invalid module orientation: {}'.format(slot)) + + @staticmethod + def _calculate_box_slot_tangent(slot: Orientation): + """ + Return slot tangent + """ + if slot == Orientation.SOUTH: + return SDF.math.Vector3(0, 1, 0) + else: + raise RuntimeError("Invalid orientation") From 984d60f0ccc67b63ab758218e35ace67eb48a555 Mon Sep 17 00:00:00 2001 From: sayf akhatou Date: Thu, 4 Apr 2019 12:11:00 +0200 Subject: [PATCH 46/49] calling any function multiple times will produce same results in body measurements --- pyrevolve/revolve_bot/measure/measure_body.py | 73 ++++++++++++------- pyrevolve/revolve_bot/revolve_bot.py | 4 +- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/pyrevolve/revolve_bot/measure/measure_body.py b/pyrevolve/revolve_bot/measure/measure_body.py index 29a4964eb0..b0e4a35746 100644 --- a/pyrevolve/revolve_bot/measure/measure_body.py +++ b/pyrevolve/revolve_bot/measure/measure_body.py @@ -7,11 +7,11 @@ class MeasureBody: def __init__(self, body): self.body = body - self.branching_modules_count = 0 + self.branching_modules_count = None self.branching = None - self.extremities = 0 + self.extremities = None self.limbs = None - self.extensiveness = 0 + self.extensiveness = None self.length_of_limbs = None self.coverage = None self.joints = None @@ -22,19 +22,21 @@ def __init__(self, body): self.size = None self.sensors = None self.symmetry = None - self.hinge_count = 0 - self.active_hinges_count = 0 - self.brick_count = 0 - self.brick_sensor_count = 0 - self.touch_sensor_count = 0 - self.free_slots = 0 + self.hinge_count = None + self.active_hinges_count = None + self.brick_count = None + self.brick_sensor_count = None + self.touch_sensor_count = None + self.free_slots = None self.max_permitted_modules = None - def count_branching_bricks(self, module=None): + def count_branching_bricks(self, module=None, init=True): """ Count amount of fully branching modules in body """ try: + if init: + self.branching_modules_count = 0 if module is None: module = self.body @@ -45,7 +47,7 @@ def count_branching_bricks(self, module=None): continue if not isinstance(child_module, TouchSensorModule) and not isinstance(child_module, BrickSensorModule): children_count += 1 - self.count_branching_bricks(child_module) + self.count_branching_bricks(child_module, False) if (isinstance(module, BrickModule) and children_count == 3) or (isinstance(module, CoreModule) and children_count == 4): self.branching_modules_count += 1 except Exception as e: @@ -61,16 +63,16 @@ def measure_branching(self): if self.absolute_size < 5: self.branching = 0 return self.branching - self.count_branching_bricks() + if self.branching_modules_count is None: + self.count_branching_bricks() if self.branching_modules_count == 0: self.branching = 0 return 0 - practical_limit_branching_bricks = math.floor((self.absolute_size-2)/3) self.branching = self.branching_modules_count / practical_limit_branching_bricks return self.branching - def calculate_extremities_extensiveness(self, module=None, extremities=False, extensiveness=False): + def calculate_extremities_extensiveness(self, module=None, extremities=False, extensiveness=False, init=True): """ Calculate extremities or extensiveness in body @param extremities: calculate extremities in body if true @@ -79,6 +81,10 @@ def calculate_extremities_extensiveness(self, module=None, extremities=False, ex try: if module is None: module = self.body + if init and extremities: + self.extremities = 0 + if init and extensiveness: + self.extensiveness = 0 children_count = 0 for core_slot, child_module in module.iter_children(): @@ -86,10 +92,7 @@ def calculate_extremities_extensiveness(self, module=None, extremities=False, ex continue if not isinstance(child_module, TouchSensorModule): children_count += 1 - if extremities: - self.calculate_extremities_extensiveness(child_module, True, False) - if extensiveness: - self.calculate_extremities_extensiveness(child_module, False, True) + self.calculate_extremities_extensiveness(child_module, extremities, extensiveness, False) if children_count == 0 and not (isinstance(module, CoreModule) or isinstance(module, TouchSensorModule)) and extremities: self.extremities += 1 if children_count == 1 and not (isinstance(module, CoreModule) or isinstance(module, TouchSensorModule)) and extensiveness: @@ -110,7 +113,9 @@ def measure_limbs(self): practical_limit_limbs = self.absolute_size - 1 else: practical_limit_limbs = 2 * math.floor((self.absolute_size - 6) / 3) + ((self.absolute_size - 6) % 3) + 4 - self.calculate_extremities_extensiveness(None, True, False) + + if self.extremities is None: + self.calculate_extremities_extensiveness(None, True, False) if self.extremities == 0: self.limbs = 0 return 0 @@ -127,7 +132,8 @@ def measure_length_of_limbs(self): if self.absolute_size < 3: self.length_of_limbs = 0 return 0 - self.calculate_extremities_extensiveness(None, False, True) + if self.extensiveness is None: + self.calculate_extremities_extensiveness(None, False, True) practical_limit_extensiveness = self.absolute_size - 2 self.length_of_limbs = self.extensiveness / practical_limit_extensiveness return self.length_of_limbs @@ -179,20 +185,22 @@ def measure_coverage(self): self.coverage = self.absolute_size / (self.width*self.height) return self.coverage - def count_active_hinges(self, module=None): + def count_active_hinges(self, module=None, init=True): """ Count amount of active hinges """ try: if module is None: module = self.body + if init: + self.active_hinges_count = 0 if module.has_children(): if isinstance(module, ActiveHingeModule): self.active_hinges_count += 1 for core_slot, child_module in module.iter_children(): if child_module is None: continue - self.count_active_hinges(child_module) + self.count_active_hinges(child_module, False) except Exception as e: print('Failed calculating count') print('Exception: {}'.format(e)) @@ -207,7 +215,8 @@ def measure_joints(self): if self.absolute_size < 3: self.joints = 0 return 0 - self.count_active_hinges() + if self.active_hinges_count is None: + self.count_active_hinges() practical_limit_active_hinges = self.absolute_size - 2 if self.active_hinges_count == 0: self.joints = 0 @@ -228,19 +237,21 @@ def measure_proportion(self): self.proportion = self.height / self.width return self.proportion - def count_free_slots(self, module=None): + def count_free_slots(self, module=None, init=True): """ Count amount of free slots in body """ if module is None: module = self.body + if init: + self.free_slots = 0 children_count = 0 for core_slot, child_module in module.iter_children(): if child_module is None: continue if not isinstance(child_module, TouchSensorModule): children_count += 1 - self.count_free_slots(child_module) + self.count_free_slots(child_module, False) if isinstance(module, CoreModule): self.free_slots += (4-children_count) if isinstance(module, BrickModule): @@ -250,7 +261,8 @@ def measure_sensors(self, module=None): """ Measurement describes the proportion of free slots that contain sensors """ - self.count_free_slots() + if self.free_slots is None: + self.count_free_slots() self.sensors = self.touch_sensor_count / self.free_slots return self.sensors @@ -268,11 +280,16 @@ def measure_absolute_size(self, module=None): print('Failed measuring absolute size') print('Exception: {}'.format(e)) - def calculate_count(self, module=None): + def calculate_count(self, module=None, init=True): """ Count amount of modules for each distinct type """ try: + if init: + self.hinge_count = 0 + self.brick_count = 0 + self.brick_sensor_count = 0 + self.touch_sensor_count = 0 if module is None: module = self.body elif isinstance(module, ActiveHingeModule): @@ -288,7 +305,7 @@ def calculate_count(self, module=None): for core_slot, child_module in module.iter_children(): if child_module is None: continue - self.calculate_count(child_module) + self.calculate_count(child_module, False) except Exception as e: print('Failed calculating count') print('Exception: {}'.format(e)) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 203159bf3c..f7234ce1c4 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -67,6 +67,8 @@ def measure_body(self): """ :return: dict of body measurements """ + if self._body is None: + raise RuntimeError('Brain not initialized') try: measure = MeasureBody(self._body) return measure.measure_all() @@ -252,7 +254,7 @@ def render_brain(self, img_path): Render image of brain @param img_path: path to where to store image """ - if self._brain == None: + if self._brain is None: raise RuntimeError('Brain not initialized') else: try: From ff1c69fe03e4456acd24694e8265589423dd2611 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Thu, 4 Apr 2019 14:30:36 +0200 Subject: [PATCH 47/49] Improved RevolveBot - Removed redundant data from object - Improved error printing for drawing functions --- pyrevolve/revolve_bot/revolve_bot.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pyrevolve/revolve_bot/revolve_bot.py b/pyrevolve/revolve_bot/revolve_bot.py index 5ebdfa5db5..b3ad889226 100644 --- a/pyrevolve/revolve_bot/revolve_bot.py +++ b/pyrevolve/revolve_bot/revolve_bot.py @@ -2,6 +2,7 @@ Revolve body generator based on RoboGen framework """ import yaml +import traceback from collections import OrderedDict from pyrevolve import SDF @@ -21,14 +22,11 @@ class RevolveBot: a robot's sdf mode """ - def __init__(self, id=None): + def __init__(self, _id=None): + self._id = _id self._body = None self._brain = None - self._id = id - self._parents = None - self._fitness = None - self._behavioural_measurement = None - self._battery_level = None + # self._battery_level = None @property def id(self): @@ -245,15 +243,17 @@ def render_brain(self, img_path): Render image of brain @param img_path: path to where to store image """ - if self._brain == None: + if self._brain is None: raise RuntimeError('Brain not initialized') else: try: brain_graph = BrainGraph(self._brain, img_path) brain_graph.brain_to_graph() brain_graph.save_graph() - except: - print('Failed rendering brain') + except Exception as e: + print('Failed rendering brain. Exception:') + print(e) + print(traceback.format_exc()) def render2d(self, img_path): """ @@ -266,5 +266,7 @@ def render2d(self, img_path): try: render = Render() render.render_robot(self._body, img_path) - except: - print('Failed rendering 2d robot') + except Exception as e: + print('Failed rendering 2d robot. Exception:') + print(e) + print(traceback.format_exc()) From 2c0f71b1df88b0d0ffc1ff99e369615511ae6e04 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Thu, 4 Apr 2019 16:04:37 +0200 Subject: [PATCH 48/49] Added tutorial3 and improved manager to remove same robot it's easier to run multiple times the manager also added rlpower-splines brain to example robots --- .../revolve/gazebo/plugin/RobotController.cpp | 2 + experiments/examples/manager.py | 6 +- experiments/examples/tutorial3.py | 69 +++++++++++++++++++ experiments/examples/yaml/gecko.yaml | 2 + experiments/examples/yaml/snake.yaml | 4 +- experiments/examples/yaml/spider.yaml | 2 + 6 files changed, 83 insertions(+), 2 deletions(-) create mode 100755 experiments/examples/tutorial3.py diff --git a/cpprevolve/revolve/gazebo/plugin/RobotController.cpp b/cpprevolve/revolve/gazebo/plugin/RobotController.cpp index 4ec270b847..05116c23e3 100644 --- a/cpprevolve/revolve/gazebo/plugin/RobotController.cpp +++ b/cpprevolve/revolve/gazebo/plugin/RobotController.cpp @@ -203,6 +203,8 @@ void RobotController::LoadBrain(const sdf::ElementPtr _sdf) auto brain = _sdf->GetElement("rv:brain"); auto controller = brain->GetElement("rv:controller")->GetAttribute("type")->GetAsString(); auto learner = brain->GetElement("rv:learner")->GetAttribute("type")->GetAsString(); + std::cout << "Loading controller " << controller << " and learner " << learner; + if ("offline" == learner and "ann" == controller) { brain_.reset(new NeuralNetwork(this->model_, brain, motors_, sensors_)); diff --git a/experiments/examples/manager.py b/experiments/examples/manager.py index 0c585d9da6..3dacc321c2 100755 --- a/experiments/examples/manager.py +++ b/experiments/examples/manager.py @@ -26,13 +26,17 @@ async def run(): # Load a robot from yaml robot = revolve_bot.RevolveBot() robot.load_file("experiments/examples/yaml/spider.yaml") + robot.update_substrate() # Connect to the simulator and pause world = await World.create(settings) await world.pause(True) + await (await world.delete_model(robot.id)) + await asyncio.sleep(2.5) + # Insert the robot in the simulator - insert_future = await world.insert_robot(robot, Vector3(0, 0, 0.05)) + insert_future = await world.insert_robot(robot, Vector3(0, 0, 0.25)) robot_manager = await insert_future # Resume simulation diff --git a/experiments/examples/tutorial3.py b/experiments/examples/tutorial3.py new file mode 100755 index 0000000000..a4da82853a --- /dev/null +++ b/experiments/examples/tutorial3.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +import os +import sys +import asyncio + +# Add `..` folder in search path +current_dir = os.path.dirname(os.path.abspath(__file__)) +newpath = os.path.join(current_dir, '..', '..') +sys.path.append(newpath) + +from pygazebo.pygazebo import DisconnectError + +from pyrevolve import revolve_bot +from pyrevolve import parser +from pyrevolve.SDF.math import Vector3 +from pyrevolve.tol.manage import World + + +async def run(): + """ + The main coroutine, which is started below. + """ + # Parse command line / file input arguments + settings = parser.parse_args() + + # Load a robot from yaml + robot = revolve_bot.RevolveBot() + robot.load_file("experiments/examples/yaml/spider.yaml") + + # Connect to the simulator and pause + world = await World.create(settings) + await world.pause(True) + + # Insert the robot in the simulator + insert_future = await world.insert_robot(robot, Vector3(0, 0, 0.05)) + robot_manager = await insert_future + + # Resume simulation + await world.pause(False) + + # Start a run loop to do some stuff + while True: + # Print robot fitness every second + print("Robot fitness is {fitness}".format( + fitness=robot_manager.fitness())) + await asyncio.sleep(1.0) + + +def main(): + def handler(loop, context): + exc = context['exception'] + if isinstance(exc, DisconnectError) \ + or isinstance(exc, ConnectionResetError): + print("Got disconnect / connection reset - shutting down.") + sys.exit(0) + raise context['exception'] + + try: + loop = asyncio.get_event_loop() + loop.set_exception_handler(handler) + loop.run_until_complete(run()) + except KeyboardInterrupt: + print("Got CtrlC, shutting down.") + + +if __name__ == '__main__': + print("STARTING") + main() + print("FINISHED") diff --git a/experiments/examples/yaml/gecko.yaml b/experiments/examples/yaml/gecko.yaml index 365660be8d..b67f55207d 100644 --- a/experiments/examples/yaml/gecko.yaml +++ b/experiments/examples/yaml/gecko.yaml @@ -124,3 +124,5 @@ body: green: 0.74 blue: 0.33 orientation : 0 +brain: + type: rlpower-splines diff --git a/experiments/examples/yaml/snake.yaml b/experiments/examples/yaml/snake.yaml index 8fe8f62881..6e9d7a59a4 100644 --- a/experiments/examples/yaml/snake.yaml +++ b/experiments/examples/yaml/snake.yaml @@ -75,4 +75,6 @@ body: red: 0.94 green: 0.98 blue: 0.05 - orientation : 0 \ No newline at end of file + orientation : 0 +brain: + type: rlpower-splines \ No newline at end of file diff --git a/experiments/examples/yaml/spider.yaml b/experiments/examples/yaml/spider.yaml index 0ab75362fb..c150f8efbe 100644 --- a/experiments/examples/yaml/spider.yaml +++ b/experiments/examples/yaml/spider.yaml @@ -144,3 +144,5 @@ body: green: 0.26 blue: 0.72 orientation : 0 +brain: + type: rlpower-splines From 5b809071d558685524cbf358a9f0a664632e9025 Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Thu, 4 Apr 2019 17:36:06 +0200 Subject: [PATCH 49/49] Fixed unit tests --- Dockerfile | 3 +- pyrevolve/revolve_bot/brain/base.py | 4 +- pyrevolve/revolve_bot/brain/brain_nn.py | 2 + .../revolve_bot/brain/rlpower_splines.py | 5 +- test_py/generate/test_body.py | 133 ------------------ test_py/generate/test_neural_network.py | 80 ----------- test_py/generate/test_revolvebot.py | 30 ++-- 7 files changed, 32 insertions(+), 225 deletions(-) delete mode 100644 test_py/generate/test_body.py delete mode 100644 test_py/generate/test_neural_network.py diff --git a/Dockerfile b/Dockerfile index 425227b377..960c4c077e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,8 @@ RUN apt-get install -y build-essential \ python \ python3-pip \ libyaml-cpp-dev \ - xsltproc + xsltproc \ + libcairo2-dev RUN apt-get install -y libgazebo9-dev gazebo9 RUN apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/pyrevolve/revolve_bot/brain/base.py b/pyrevolve/revolve_bot/brain/base.py index b6b3aa7c7f..2a7fef81c2 100644 --- a/pyrevolve/revolve_bot/brain/base.py +++ b/pyrevolve/revolve_bot/brain/base.py @@ -7,9 +7,9 @@ class Brain(object): def from_yaml(yaml_brain): brain_type = yaml_brain['type'] - if brain_type == 'neural-network': + if brain_type == pyrevolve.revolve_bot.brain.BrainNN.TYPE: return pyrevolve.revolve_bot.brain.BrainNN.from_yaml(yaml_brain) - elif brain_type == 'rlpower-splines': + elif brain_type == pyrevolve.revolve_bot.brain.BrainRLPowerSplines.TYPE: return pyrevolve.revolve_bot.brain.BrainRLPowerSplines.from_yaml(yaml_brain) else: return Brain() diff --git a/pyrevolve/revolve_bot/brain/brain_nn.py b/pyrevolve/revolve_bot/brain/brain_nn.py index 0b89b99159..f58c0643ec 100644 --- a/pyrevolve/revolve_bot/brain/brain_nn.py +++ b/pyrevolve/revolve_bot/brain/brain_nn.py @@ -11,6 +11,7 @@ class BrainNN(Brain): """ Base class allowing for constructing neural network controller components in an overviewable manner """ + TYPE = 'neural-network' def __init__(self): self.nodes = {} @@ -51,6 +52,7 @@ def from_yaml(yaml_object): def to_yaml(self): yaml_dict_brain = OrderedDict() + yaml_dict_brain['type'] = self.TYPE yaml_dict_neurons = OrderedDict() for node in self.nodes: diff --git a/pyrevolve/revolve_bot/brain/rlpower_splines.py b/pyrevolve/revolve_bot/brain/rlpower_splines.py index a80b70587a..4a794fa880 100644 --- a/pyrevolve/revolve_bot/brain/rlpower_splines.py +++ b/pyrevolve/revolve_bot/brain/rlpower_splines.py @@ -3,13 +3,16 @@ class BrainRLPowerSplines(Brain): + TYPE = 'rlpower-splines' @staticmethod def from_yaml(yaml_object): return BrainRLPowerSplines() def to_yaml(self): - return {} + return { + 'type': self.TYPE + } def learner_sdf(self): return xml.etree.ElementTree.Element('rv:learner', {'type': 'rlpower'}) diff --git a/test_py/generate/test_body.py b/test_py/generate/test_body.py deleted file mode 100644 index 49d10626f8..0000000000 --- a/test_py/generate/test_body.py +++ /dev/null @@ -1,133 +0,0 @@ -from __future__ import absolute_import - -import random -import unittest - -from pyrevolve.generate import BodyGenerator -from pyrevolve.spec import BodyImplementation, PartSpec, ParamSpec, NormalDistParamSpec - -# Some imaginary body specification -body_spec = BodyImplementation( - { - "Core": PartSpec( - arity=2, - outputs=2, - inputs=2 - ), - "2Params": PartSpec( - arity=2, - inputs=2, - outputs=2, - params=[ - ParamSpec( - "param_a", - default=-1, - min_value=-2, - max_value=0, - max_inclusive=False - ), - NormalDistParamSpec( - "param_b", - mean=15, - stddev=5, - default=15 - ) - ] - ), - "SomePart": PartSpec(arity=1, inputs=3, outputs=3) - } -) - - -# Simple function to count the number of parts in a body -def _count_parts(root): - count = len(root.child) - for child in root.child: - count += _count_parts(child.part) - - return count - - -class TestBodyGenerator(unittest.TestCase): - """ - Some simple tests regarding body generation - """ - - def test_constraints(self): - """ - In this test, we build a body generator with a maximum - number of inputs / outputs that is already satisfied - by the root component, and ensure no further generation - is done. - - :return: - """ - # Seed so we can reproduce if this goes wrong - seed = random.randint(0, 10000) - random.seed(seed) - - gen = BodyGenerator( - body_spec, - root_parts=["Core"], - attach_parts=["2Params"], - max_inputs=2, - max_outputs=10, - max_parts=100, - fix_num_parts=True - ) - - body = gen.generate() - self.assertEquals("Core", body.root.type, - "Root type should be 'Core' (seed %d)." % seed) - self.assertEquals(0, len(body.root.child), - "Too many inputs were generated (seed %d)." % seed) - - gen.max_inputs = 100 - gen.max_outputs = 2 - - body = gen.generate() - self.assertEquals( - 0, len(body.root.child), - "Too many outputs were generated (seed {}).".format(seed)) - - # This leaves enough room for a 2Params child, but not enough for a - # SomePart child - gen.max_outputs = 4 - body = gen.generate() - self.assertEquals( - _count_parts(body.root), 1, - "One child part should be present (seed {}).".format(seed)) - self.assertEquals( - "2Params", body.root.child[0].part.type, - "Child part should be of type 2Params (seed {}).".format(seed)) - - gen.max_inputs = gen.max_outputs = 100 - gen.max_parts = 1 - body = gen.generate() - self.assertEquals( - 0, _count_parts(body.root), - "No child parts should be present (seed {}).".format(seed)) - - # def test_valid(self): - # """ - # Generates a body and ensures it is completely initialized. - # :return: - # """ - # # Seed so we can reproduce if this goes wrong - # seed = random.randint(0, 10000) - # random.seed(seed) - # - # gen = BodyGenerator( - # body_spec, - # root_parts=["Core"], - # attach_parts=["2Params"], - # max_inputs=100, - # max_outputs=100, - # max_parts=10, - # fix_num_parts=True - # ) - # - # body = gen.generate() - # self.assertTrue( - # body.IsInitialized(), - # "Incomplete body (seed {}).".format(seed)) diff --git a/test_py/generate/test_neural_network.py b/test_py/generate/test_neural_network.py deleted file mode 100644 index 72e5e5eeaf..0000000000 --- a/test_py/generate/test_neural_network.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import absolute_import - -import random -import unittest - -from pyrevolve.generate import NeuralNetworkGenerator -from pyrevolve.spec import NeuralNetImplementation, NeuronSpec - - -brain_spec = NeuralNetImplementation( - { - "Simple": NeuronSpec(params=["bias"], layers=["hidden"]), - "Oscillator": NeuronSpec( - params=["period", "phase_offset", "amplitude"], - layers=["hidden", "output"] - ) - } -) - - -class TestNeuralNetGenerator(unittest.TestCase): - """ - Some simple tests for generating a neural network - """ - - def test_valid(self): - """ - Tests a valid neural network is generated - :return: - """ - seed = random.randint(0, 10000) - random.seed(seed) - - gen = NeuralNetworkGenerator( - brain_spec, - max_hidden=20 - ) - - inputs = ['input-1', 'input-2'] - outputs = ['output-1', 'output-2', 'output-3'] - brain = gen.generate(inputs=inputs, outputs=outputs) - self.assertTrue( - brain.IsInitialized(), - "Incomplete brain (seed {seed}).".format(seed=seed)) - - def get_neuron(neuron_id): - return [neuron for neuron in brain.neuron if neuron.id == neuron_id] - - # All inputs should be present - for neuron_id in inputs: - neurons = get_neuron(neuron_id) - self.assertTrue( - len(neurons) == 1, - "Neuron {n_id} not present.".format(n_id=neuron_id)) - self.assertEqual( - "input", neurons[0].layer, - "Neuron {n_id} should have 'input' (seed {seed}).".format( - n_id=neuron_id, - seed=seed - )) - - # All outputs should be present and have type oscillator - for neuron_id in outputs: - neurons = get_neuron(neuron_id) - self.assertTrue( - len(neurons) == 1, - "Neuron {n_id} not present.".format(n_id=neuron_id)) - self.assertEqual( - "output", neurons[0].layer, - "Neuron {n_id} should have 'output' (seed {seed}).".format( - n_id=neuron_id, - seed=seed - )) - self.assertEqual( - "Oscillator", neurons[0].type, - "Output neuron {n_id} should all be oscillators (seed " - "{seed}).".format( - n_id=neuron_id, - seed=seed - )) diff --git a/test_py/generate/test_revolvebot.py b/test_py/generate/test_revolvebot.py index dc730681f7..6451b7bc4f 100644 --- a/test_py/generate/test_revolvebot.py +++ b/test_py/generate/test_revolvebot.py @@ -1,22 +1,27 @@ -from __future__ import absolute_import - import unittest from pyrevolve.revolve_bot import RevolveBot + class TestRevolveBot(unittest.TestCase): """ Basic tests for RobolveBot body and brain generation """ + def revolve_bot_equal(self, roba, robb): + self._revolve_bot_body_equal(roba._body, robb._body) + self._revolve_bot_brain_equal(roba._brain, robb._brain) - def test_load_save_yaml(self): - """ - We load a YAML file and save it - """ + def _revolve_bot_body_equal(self, bodya, bodyb): + self.assertEqual(type(bodya), type(bodyb)) + + def _revolve_bot_brain_equal(self, braina, brainb): + self.assertEqual(type(braina), type(brainb)) + + def _proto_test(self, filename): revolve_bot = RevolveBot() revolve_bot.load_file( - path='experiments/examples/yaml/simple_robot.yaml', + path=filename, conf_type='yaml' ) revolve_bot.save_file( @@ -30,4 +35,13 @@ def test_load_save_yaml(self): conf_type='yaml' ) - self.assertEqual(revolve_bot, revolve_bot2) + self.revolve_bot_equal(revolve_bot, revolve_bot2) + + def test_load_save_yaml(self): + """ + We load a YAML file and save it + """ + self._proto_test('experiments/examples/yaml/simple_robot.yaml') + self._proto_test('experiments/examples/yaml/spider.yaml') + self._proto_test('experiments/examples/yaml/gecko.yaml') + self._proto_test('experiments/examples/yaml/snake.yaml')