From 48d852dddb463b3b39d9ea48a3ce8bb3004873dc Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 28 Feb 2026 13:21:09 +0100 Subject: [PATCH 01/74] add prototype dataflow of whistle detection Co-authored-by: EnigmaBellatrix --- .../capsules/game_status_capsule.py | 9 ++++++++ .../decisions/whistle_detected.py | 22 ++++++++++++++++++ .../bitbots_body_behavior/body_behavior.py | 8 +++++++ .../bitbots_body_behavior/package.xml | 23 ++++++++++--------- 4 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 0f52543a6..159c7ab07 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -18,6 +18,7 @@ def __init__(self, node, blackboard=None): self.last_goal_from_us_time = -86400.0 self.last_goal_time = -86400.0 self.free_kick_kickoff_team: Optional[bool] = None + self.whistle_detected: bool = False def get_gamestate(self) -> int: return self.gamestate.game_state @@ -119,3 +120,11 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg + + def whistle_detected(self) -> bool: + return self.whistle_detected + + + def whistle_detection_callback(self, msg) -> None: # MSG type is assumed to be bool for now, prototyping + self.whistle_detected = msg.data + diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py new file mode 100644 index 000000000..d3026c781 --- /dev/null +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py @@ -0,0 +1,22 @@ +from bitbots_blackboard.body_blackboard import BodyBlackboard +from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement + + +class WhistleDetected(AbstractDecisionElement): + blackboard: BodyBlackboard + + def __init__(self, blackboard, dsd, parameters): + super().__init__(blackboard, dsd, parameters) + + def perform(self, reevaluate=False): + """ + Determines whether we are confident regarding the ball's position. + :param reevaluate: + :return: + """ + if self.blackboard.world_model.ball_has_been_seen(): # TODO + return "YES" + return "NO" + + def get_reevaluate(self): + return False diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py index c529e74a6..13e174a59 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py @@ -11,6 +11,7 @@ from rclpy.experimental.events_executor import EventsExecutor from rclpy.node import Node from soccer_vision_3d_msgs.msg import RobotArray +from std_msgs.msg import Bool from bitbots_body_behavior import behavior_dsd from bitbots_msgs.msg import RobotControlState, TeamData @@ -75,6 +76,13 @@ def __init__(self, node: Node): qos_profile=1, callback_group=MutuallyExclusiveCallbackGroup(), ) + node.create_subscription( + Bool, + "whistle_detected", + blackboard.gamestate.whistle_detection_callback, + qos_profile=1, + callback_group=MutuallyExclusiveCallbackGroup(), + ) def loop(self): try: diff --git a/src/bitbots_behavior/bitbots_body_behavior/package.xml b/src/bitbots_behavior/bitbots_body_behavior/package.xml index c0256d7dc..2b1a522f7 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/package.xml +++ b/src/bitbots_behavior/bitbots_body_behavior/package.xml @@ -30,16 +30,17 @@ soccer_vision_3d_msgs tf_transformations tf2 - ament_mypy + std_msgs + ament_mypy - python3-pytest + python3-pytest - - - - starts - python3 - - ament_python - - + + + + starts + python3 + + ament_python + + From cbe8f5f1701d433fc7de84176566d8b8dbafc5ac Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 28 Feb 2026 13:35:45 +0100 Subject: [PATCH 02/74] add whistle detector package --- .../whistle_detector/package.xml | 31 +++++++++++++++ .../whistle_detector/setup.cfg | 4 ++ .../whistle_detector/setup.py | 32 +++++++++++++++ .../whistle_detector/__init__.py | 4 ++ .../whistle_detector/whistle_detector.py | 39 +++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 src/bitbots_world_model/whistle_detector/package.xml create mode 100644 src/bitbots_world_model/whistle_detector/setup.cfg create mode 100644 src/bitbots_world_model/whistle_detector/setup.py create mode 100644 src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py create mode 100755 src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py diff --git a/src/bitbots_world_model/whistle_detector/package.xml b/src/bitbots_world_model/whistle_detector/package.xml new file mode 100644 index 000000000..8e169de29 --- /dev/null +++ b/src/bitbots_world_model/whistle_detector/package.xml @@ -0,0 +1,31 @@ + + + + bitbots_whistle_detector + 0.0.0 + The Bitbots Whistle Detector package + + Hamburg Bit-Bots + + MIT + + Hamburg Bit-Bots + + rosidl_default_generators + rosidl_default_runtime + rclpy + std_msgs + std_srvs + ament_mypy + + python3-pytest + + + + python3 + unknown + + ament_python + + + diff --git a/src/bitbots_world_model/whistle_detector/setup.cfg b/src/bitbots_world_model/whistle_detector/setup.cfg new file mode 100644 index 000000000..36739e90d --- /dev/null +++ b/src/bitbots_world_model/whistle_detector/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/bitbots_whistle_detector +[install] +install_scripts=$base/lib/bitbots_whistle_detector diff --git a/src/bitbots_world_model/whistle_detector/setup.py b/src/bitbots_world_model/whistle_detector/setup.py new file mode 100644 index 000000000..677af0d66 --- /dev/null +++ b/src/bitbots_world_model/whistle_detector/setup.py @@ -0,0 +1,32 @@ +import glob + +from setuptools import find_packages, setup + + + +package_name = "bitbots_whistle_detector" + + +setup( + name=package_name, + packages=find_packages(exclude=["test"]), + data_files=[ + ("share/ament_index/resource_index/packages", ["resource/" + package_name]), + ("share/" + package_name, ["package.xml"]), + ], + install_requires=[ + "launch", + "setuptools", + ], + tests_require=["pytest"], + zip_safe=True, + keywords=["ROS"], + license="MIT", + entry_points={ + "console_scripts": [ + "whistle_detector = bitbots_whistle_detector.whistle_detector:main", + ], + }, +) + +# https://roboticsbackend.com/ros2-rclpy-parameter-callback/ diff --git a/src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py b/src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py new file mode 100644 index 000000000..4d2e15007 --- /dev/null +++ b/src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py @@ -0,0 +1,4 @@ +# Setting up runtime type checking for this package +from beartype.claw import beartype_this_package + +beartype_this_package() diff --git a/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py b/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py new file mode 100755 index 000000000..6262f3083 --- /dev/null +++ b/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py @@ -0,0 +1,39 @@ +#! /usr/bin/env python3 +from typing import Optional + +import numpy as np +import rclpy +from rclpy.callback_groups import MutuallyExclusiveCallbackGroup +from rclpy.duration import Duration +from rclpy.experimental.events_executor import EventsExecutor +from rclpy.node import Node +from rclpy.time import Time +from std_msgs.msg import Bool, Header + + + +class WhistleDetector(Node): + + + def __init__(self) -> None: + """ + creates filter and subscribes to messages which are needed + """ + super().__init__("ball_filter") + self.logger = self.get_logger() + + self.whistle_publisher = self.create_publisher(Bool, "whistle_detected", 1) + + + +def main(args=None) -> None: + rclpy.init(args=args) + + node = WhistleDetector() + executor = EventsExecutor() + executor.add_node(node) + try: + executor.spin() + except KeyboardInterrupt: + pass + node.destroy_node() From cefd8caf053170b102f7d0cc1c87c32df4e9662b Mon Sep 17 00:00:00 2001 From: Clemens Date: Mon, 2 Mar 2026 16:19:14 +0100 Subject: [PATCH 03/74] added publishers for gamecontroller response with dynamic data --- .../bitbots_hcm/hcm_dsd/decisions/fallen.py | 17 +++++++++++ .../bitbots_team_communication.py | 4 +++ .../bitbots_ball_filter/ball_filter.py | 29 ++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py index 0429ed5bf..5faf6438e 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py @@ -20,9 +20,16 @@ def __init__(self, blackboard, dsd, parameters): ) self.fallen_angular_velocity_thresh = self.blackboard.node.get_parameter("fallen_angular_velocity_thresh").value + # publishes if robot is fallen + self.is_fallen_publisher = self.create_publisher( + bool, "hsl_gamecontroller/is_fallen", 1 + ) + + def perform(self, reevaluate=False): # Check of the fallen detection is active if not self.blackboard.is_stand_up_active: + self.publish_if_fallen(False) return "NOT_FALLEN" # Get angular velocity from the IMU @@ -30,6 +37,7 @@ def perform(self, reevaluate=False): # Check if the robot is rotating if np.mean(np.abs(angular_velocity)) >= 0.2: + self.publish_if_fallen(False) return "NOT_FALLEN" # Convert quaternion to fused angles @@ -37,18 +45,27 @@ def perform(self, reevaluate=False): # Decides which side is facing downwards. if fused_pitch > self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_FRONT" if fused_pitch < -self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_BACK" if fused_roll > self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_RIGHT" if fused_roll < -self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_LEFT" + self.publish_if_fallen(False) return "NOT_FALLEN" + + def publish_if_fallen(self, is_fallen): + # publishes if robot is fallen + self.is_fallen_publisher.publish(is_fallen) def get_reevaluate(self): return True diff --git a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py index 98b848626..18abf9c97 100755 --- a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py +++ b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py @@ -104,6 +104,9 @@ def try_to_establish_connection(self): def create_publishers(self): self.team_data_publisher = self.node.create_publisher(TeamData, self.topics["team_data_topic"], qos_profile=1) + self.pose_stamped_publisher = self.node.create_publisher( + PoseWithCovarianceStamped, "hsl_gamecontroller/pose_stamped", 1 + ) def create_subscribers(self): self.node.create_subscription( @@ -174,6 +177,7 @@ def gamestate_cb(self, msg: GameState): self.gamestate = msg def pose_cb(self, msg: PoseWithCovarianceStamped): + self.pose_stamped_publisher.publish(msg) self.pose = msg def cmd_vel_cb(self, msg: Twist): diff --git a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py index fd3763146..286107e89 100755 --- a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py +++ b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py @@ -17,6 +17,8 @@ from std_msgs.msg import Header from std_srvs.srv import Trigger from tf2_geometry_msgs import PointStamped, PoseStamped +from soccer_model_msgs.msg import Ball as BallWithCovariance +from std_msgs.msg import Float32 from bitbots_ball_filter.ball_filter_parameters import bitbots_ball_filter as parameters @@ -39,6 +41,7 @@ def __init__(self) -> None: # Initialize parameters self.update_params() self.logger.info(f"Using frame '{self.config.filter.frame}' for ball filtering") + self.last_ball_time = self.get_clock().now() self.camera_info: Optional[CameraInfo] = None @@ -49,6 +52,12 @@ def __init__(self) -> None: self.ball_pose_publisher = self.create_publisher( PoseWithCovarianceStamped, self.config.ros.ball_position_publish_topic, 1 ) + self.ball_pose_with_covariance_publisher = self.create_publisher( + BallWithCovariance, "hsl_gamecontroller/ball_with_covariance", 1 + ) + self.ball_age_publisher = self.create_publisher( + Float32 , "hsl_gamecontroller/ball_age", 1 + ) # Create callback group self.callback_group = MutuallyExclusiveCallbackGroup() @@ -141,6 +150,7 @@ def ball_callback(self, msg: BallArray) -> None: # Store the ball measurement self.ball_state_position = numpify(ball_measurement_map.point) self.ball_state_covariance = covariance + self.last_ball_time = Time.from_msg(ball_msg.header.stamp) ball_measurement_updated = True # Get our estimate in the base footprint frame for easier distance calculation @@ -246,7 +256,7 @@ def filter_step(self) -> None: # Increase covariance self.ball_state_covariance[:2, :2] += np.eye(2) * self.config.filter.covariance.process_noise - # Build message + # Build message pose_msg = PoseWithCovarianceStamped() pose_msg.header = Header( stamp=Time.to_msg(self.get_clock().now()), @@ -259,6 +269,23 @@ def filter_step(self) -> None: pose_msg.pose.pose.orientation.w = 1.0 self.ball_pose_publisher.publish(pose_msg) + # Build message for Ball with Covariance + ball_msg = BallWithCovariance() + ball_msg.header = Header( + stamp=Time.to_msg(self.get_clock().now()), + frame_id=self.config.filter.frame, + ) + ball_msg.point.point = msgify(Point, self.ball_state_position) + covariance = np.zeros((6, 6)) + covariance[:3, :3] = self.ball_state_covariance + ball_msg.point.covariance = covariance.flatten() + self.ball_pose_with_covariance_publisher.publish(ball_msg) + + # Build message for Ball age + ball_age_msg = Float32() + ball_age_msg.data = np.float32(self.get_clock().now() - self.last_ball_time) + self.ball_age_publisher.publish(ball_age_msg) + def main(args=None) -> None: rclpy.init(args=args) From 0757d163c61841bfb8acf99d669df217de9a8de2 Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 13:30:07 +0100 Subject: [PATCH 04/74] update pixi.toml --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index d062e8bfa..9377a0953 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "robostack-jazzy", # Robostack jazzy channel for ROS packages + "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/tree/pixi_update_hsl_gamecontroller", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" From 54335cf70490be991833171cfcd952e26e3503bf Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 13:35:30 +0100 Subject: [PATCH 05/74] pixi toml update 2.0 --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 9377a0953..2d220e90b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/tree/pixi_update_hsl_gamecontroller", # Robostack jazzy channel for ROS packages + "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/blob/pixi_update_hsl_gamecontroller/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" From 68a365279e61778df4f01adcb0dce8eaf6eef2fe Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 13:39:35 +0100 Subject: [PATCH 06/74] pixi toml upfate 3.0 --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 2d220e90b..26b68bf7c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/blob/pixi_update_hsl_gamecontroller/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages + "file:///homes/22wulff/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" From 7ff2541d080d15e6da7f6b9b992fe034b9258836 Mon Sep 17 00:00:00 2001 From: Valerie Date: Thu, 5 Mar 2026 16:50:19 +0100 Subject: [PATCH 07/74] put project whistle detection code into whistle detector node --- .../whistle_detector/whistle_detector.py | 177 +++++++++++++++++- 1 file changed, 167 insertions(+), 10 deletions(-) diff --git a/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py b/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py index 6262f3083..b73a4fb2b 100755 --- a/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py +++ b/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py @@ -2,28 +2,185 @@ from typing import Optional import numpy as np +import torch +import pyaudio + import rclpy -from rclpy.callback_groups import MutuallyExclusiveCallbackGroup -from rclpy.duration import Duration -from rclpy.experimental.events_executor import EventsExecutor from rclpy.node import Node -from rclpy.time import Time -from std_msgs.msg import Bool, Header +from rclpy.experimental.events_executor import EventsExecutor +from std_msgs.msg import Bool +import torch.nn as nn +from torchvision import models +import torch +import torch.nn.functional as F -class WhistleDetector(Node): +def get_model(device): # -> models.resnet.ResNet: + #model = models.resnet18(weights="ResNet18_Weights.DEFAULT") + #num_ftrs = model.fc.in_features + #model.fc = nn.Linear(num_ftrs, 2) + + #model = models.mobilenet_v3_small(num_classes=2) + model = models.efficientnet_b0(weights="DEFAULT") + #model.classifier[0] = nn.Dropout(p=0.2) #p=0.2 is default + in_features = model.classifier[1].in_features + model.classifier[1] = nn.Linear(in_features, 2) + return model.to(device) + +def resample( + waveform: torch.Tensor, sample_rate: int, target_sample_rate: int +) -> torch.Tensor: + """ + Resamples a waveform to a target sample rate. + + :param waveform: Waveform + :type waveform: torch.Tensor + :param sample_rate: Sample rate of the waveform + :type sample_rate: int + :param target_sample_rate: Target sample rate + :type target_sample_rate: int + :return: Resampled waveform + :rtype: torch.Tensor + """ + channel = 0 + return torchaudio.transforms.Resample(sample_rate, target_sample_rate)( + waveform[channel, :].view(1, -1) + ) + +def convert_waveform_to_spectogram( + sample_rate: int, chunk: torch.Tensor +) -> torch.Tensor: + """ + Converts a waveform to a mel spectrogram. + + :param sample_rate: Sample rate of the waveform + :type sample_rate: int + :param chunk: Waveform + :type chunk: torch.Tensor + :return: Mel spectrogram + :rtype: torch.Tensor + """ + # Repeat the mel spectrogram 3 times to match the number of channels to the expected input of the model + # TODO: Discuss whether to change the model to accept 1 channel + return ( + torchaudio.transforms.MelSpectrogram(sample_rate, n_mels=64)(chunk) + .log2() + .repeat(3, 1, 1) + ) + +class Net(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(3, 6, 5) + self.pool = nn.MaxPool2d(2, 2) + self.conv2 = nn.Conv2d(6, 16, 5) + self.fc1 = nn.Linear(16 * 5 * 5, 120) + self.fc2 = nn.Linear(120, 84) + self.fc3 = nn.Linear(84, 10) + + def forward(self, x): + x = self.pool(F.relu(self.conv1(x))) + x = self.pool(F.relu(self.conv2(x))) + x = torch.flatten(x, 1) # flatten all dimensions except batch + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3 + +CHUNK = 1024 +FORMAT = pyaudio.paFloat32 +CHANNELS = 1 +SAMPLE_RATE = 44100 +TARGET_SAMPLE_RATE = 10_000 + +CHECKPOINT_PATH = "models/blabla.pth" #TODO: wait for model from teammate + + +class WhistleDetector(Node): def __init__(self) -> None: - """ - creates filter and subscribes to messages which are needed - """ - super().__init__("ball_filter") + super().__init__("whistle_detector") self.logger = self.get_logger() self.whistle_publisher = self.create_publisher(Bool, "whistle_detected", 1) + # device + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.logger.info(f"Using device: {self.device}") + + # load model + self.model = get_model(self.device) + self.model.load_state_dict( + torch.load(CHECKPOINT_PATH, map_location=self.device) + ) + self.model.to(self.device) + self.model.eval() + + # audio setup + self.p = pyaudio.PyAudio() + self.stream = self.p.open( + format=FORMAT, + channels=CHANNELS, + rate=SAMPLE_RATE, + input=True, + frames_per_buffer=CHUNK, + ) + + # timer for processing + self.timer = self.create_timer(0.02, self.process_audio) # ~50Hz + + self.logger.info("Whistle detector initialized") + + def process_audio(self) -> None: + try: + data = self.stream.read(CHUNK, exception_on_overflow=False) + except Exception as e:10× lighter and faster than EfficientNet + self.logger.warn(f"Audio read error: {e}") + return + + audio_np = np.frombuffer(data, dtype=np.float32) + + audio_tensor = torch.from_numpy(audio_np) + audio_tensor = audio_tensor.unsqueeze(0) + + # resample + resampled = resample( + audio_tensor, + sample_rate=SAMPLE_RATE, + target_sample_rate=TARGET_SAMPLE_RATE, + ) + + # mel spectrogram + mel = convert_waveform_to_spectogram( + SAMPLE_RATE, + resampled, + ) + + mel[mel.isinf()] = 0 + + mel = mel.unsqueeze(0).to(self.device) + + with torch.no_grad(): + output = self.model(mel).squeeze() + + whistle = bool(output[1] > output[0]) + + if whistle: + msg = Bool() + msg.data = whistle + + self.whistle_publisher.publish(msg) + + def destroy_node(self): + try: + self.stream.stop_stream() + self.stream.close() + self.p.terminate() + except Exception: + pass + + super().destroy_node() def main(args=None) -> None: From 06b222457f52ba3f310a3ae6ff5977d266b785ec Mon Sep 17 00:00:00 2001 From: Valerie Date: Thu, 5 Mar 2026 16:51:12 +0100 Subject: [PATCH 08/74] add model to share in setup py --- src/bitbots_world_model/whistle_detector/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_world_model/whistle_detector/setup.py b/src/bitbots_world_model/whistle_detector/setup.py index 677af0d66..fa6c6a1c3 100644 --- a/src/bitbots_world_model/whistle_detector/setup.py +++ b/src/bitbots_world_model/whistle_detector/setup.py @@ -11,8 +11,8 @@ name=package_name, packages=find_packages(exclude=["test"]), data_files=[ - ("share/ament_index/resource_index/packages", ["resource/" + package_name]), ("share/" + package_name, ["package.xml"]), + ("share/" + package_name , ["models/"]) ], install_requires=[ "launch", From dd78ca26a78ff036752dbe20ca8037f33c4d32a4 Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 18:16:34 +0100 Subject: [PATCH 09/74] game_state_capsule updated --- pixi.toml | 2 +- .../capsules/game_status_capsule.py | 61 +++++++++---------- .../behavior_dsd/decisions/last_player.py | 23 ------- .../behavior_dsd/main.dsd | 9 +-- 4 files changed, 31 insertions(+), 64 deletions(-) delete mode 100644 src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py diff --git a/pixi.toml b/pixi.toml index 26b68bf7c..fdde94a3d 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "file:///homes/22wulff/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages + "robostack-jazzy", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 0f52543a6..2705a5c23 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -12,6 +12,7 @@ class GameStatusCapsule(AbstractBlackboardCapsule): def __init__(self, node, blackboard=None): super().__init__(node, blackboard) self.team_id: int = get_parameters_from_other_node(self._node, "parameter_blackboard", ["team_id"])["team_id"] + self.own_id: int = get_parameters_from_other_node(self._node, "parameter_blackboard", ["bot_id"])["bot_id"] self.gamestate = GameState() self.last_update: float = 0.0 self.unpenalized_time: float = 0.0 @@ -20,25 +21,29 @@ def __init__(self, node, blackboard=None): self.free_kick_kickoff_team: Optional[bool] = None def get_gamestate(self) -> int: - return self.gamestate.game_state + #Init, ready, set, playing, finished, standby + return self.gamestate.main_state - def get_secondary_state(self) -> int: - return self.gamestate.secondary_state + def get_gamePhase(self) -> int: + #Timeout, Normal, Penaltyshoot + return self.gamestate.gamePhase - def get_secondary_state_mode(self) -> int: - return self.gamestate.secondary_state_mode + def get_setPlay(self) -> int: + #None, Kick In, Goalkick, Cornerkick, Pushing Freekick, Penaltykick + return self.gamestate.setPlay def get_secondary_team(self) -> int: - return self.gamestate.secondary_state_team + #Team ID, wer in set Play den Baall hat + return self.gamestate.kickingTeam def has_kickoff(self) -> bool: - return self.gamestate.has_kick_off + #vegelcih mit eigener Teamnummer + return self.gamestate.kickingTeam == self.team_id def has_penalty_kick(self) -> bool: - return ( - self.gamestate.secondary_state == GameState.STATE_PENALTYKICK - or self.gamestate.secondary_state == GameState.STATE_PENALTYSHOOT - ) and self.gamestate._secondary_state_team == self.team_id + return( + self.gamestate.set_play == GameState.SET_PLAY_PENALTY_KICK + and self.gamestate.kickingTeam == self.team_id) def get_our_goals(self) -> int: return self.gamestate.own_score @@ -55,28 +60,20 @@ def get_seconds_since_any_goal(self) -> float: def get_seconds_remaining(self) -> float: # Time from the message minus time passed since receiving it return max( - self.gamestate.seconds_remaining - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0 + self.gamestate.secs_remaining - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0 ) def get_secondary_seconds_remaining(self) -> float: """Seconds remaining for things like kickoff""" # Time from the message minus time passed since receiving it return max( - self.gamestate.secondary_seconds_remaining + self.gamestate.secondary_time - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0, ) - def get_seconds_since_last_drop_ball(self) -> Optional[float]: - """Returns the seconds since the last drop in""" - if self.gamestate.drop_in_time == -1: - return None - else: - # Time from the message plus seconds passed since receiving it - return self.gamestate.drop_in_time + (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update) - def get_seconds_since_unpenalized(self) -> float: - return self._node.get_clock().now().nanoseconds / 1e9 - self.unpenalized_time + return self._node.get_clock().now().nanoseconds / 1e9 - self.seconds_till_unpenalized def get_is_penalized(self) -> bool: return self.gamestate.penalized @@ -87,9 +84,6 @@ def received_gamestate(self) -> bool: def get_team_id(self) -> int: return self.team_id - def get_red_cards(self) -> int: - return self.gamestate.team_mates_with_red_card - def gamestate_callback(self, gamestate_msg: GameState) -> None: if self.gamestate.penalized and not gamestate_msg.penalized: self.unpenalized_time = self._node.get_clock().now().nanoseconds / 1e9 @@ -101,21 +95,24 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: if gamestate_msg.rival_score > self.gamestate.rival_score: self.last_goal_time = self._node.get_clock().now().nanoseconds / 1e9 + '''Was soll das? self.free_kick_kickoff wird nirgends weiter verwendet... if ( - gamestate_msg.secondary_state_mode == 2 - and self.gamestate.secondary_state_mode != 2 - and gamestate_msg.game_state == GameState.GAMESTATE_PLAYING + gamestate_msg.main_state == GameState.STATE_SET + and self.gamestate.setPlay != 2 + and gamestate_msg.state == GameState.STATE_PLAYING ): # secondary action is now executed but we will not see this in the new messages. # it will look like a normal kick off, but we need to remember that this is some sort of free kick # we set the kickoff value accordingly, then we will not be allowed to move if it is a kick for the others - self.free_kick_kickoff_team = gamestate_msg.secondary_state_team - - if gamestate_msg.secondary_state_mode != 2 and gamestate_msg.secondary_seconds_remaining == 0: + self.free_kick_kickoff_team = gamestate_msg.kickingTeam + + + if gamestate_msg.setPlay != 2 and gamestate_msg.secondaryTime == 0: self.free_kick_kickoff_team = None + if self.free_kick_kickoff_team is not None: gamestate_msg.has_kick_off = self.free_kick_kickoff_team == self.team_id - + ''' self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py deleted file mode 100644 index 04e32b588..000000000 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py +++ /dev/null @@ -1,23 +0,0 @@ -from bitbots_blackboard.body_blackboard import BodyBlackboard -from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement - - -class LastPlayer(AbstractDecisionElement): - blackboard: BodyBlackboard - - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - - def perform(self, reevaluate=False): - # Get nessesary data - red_cards = self.blackboard.gamestate.get_red_cards() - own_id = self.blackboard.misc.bot_id - - # Use generator comprehension to check if all red cards are true except our own - if all(x for i, x in enumerate(red_cards) if i != own_id): - return "YES" - else: - return "NO" - - def get_reevaluate(self): - return True diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 3b0287230..673ba6789 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -82,13 +82,6 @@ $PassStarted NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassAcceptPosition NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassPreparePosition -#GoalieRole -$CurrentScore - BEHIND --> $LastPlayer - YES --> #StrikerRole - NO --> #GoalieBehavior - ELSE --> #GoalieBehavior - #PenaltyShootoutBehavior $SecondaryStateTeamDecider OUR --> @StandAndWaitRandom + min:10 + max:30, @KickBallDynamic + r:true + type:penalty, @Stand @@ -152,7 +145,7 @@ $BallSeen NO_NORMAL --> #StandAndLook NO_FREEKICK --> #Placing YES --> $ConfigRole - GOALIE --> #GoalieRole + GOALIE --> #GoalieBehavior ELSE --> $CountActiveRobotsWithoutGoalie ONE --> $RankToBallNoGoalie FIRST --> #StrikerRole From 9f3d3f7f6a1d031b15d1ece108df4f955b38a4f1 Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 18:38:11 +0100 Subject: [PATCH 10/74] integration of new gamestate msg in behavior, secondary state is still missing --- .../capsules/game_status_capsule.py | 2 +- .../behavior_dsd/decisions/game_state_decider.py | 12 +++++++----- .../bitbots_body_behavior/behavior_dsd/main.dsd | 2 ++ .../localization_dsd/decisions/game_state.py | 2 ++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 2705a5c23..33e3efed9 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -95,7 +95,7 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: if gamestate_msg.rival_score > self.gamestate.rival_score: self.last_goal_time = self._node.get_clock().now().nanoseconds / 1e9 - '''Was soll das? self.free_kick_kickoff wird nirgends weiter verwendet... + '''Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt if ( gamestate_msg.main_state == GameState.STATE_SET and self.gamestate.setPlay != 2 diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py index bef4e355d..ffc52efcb 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py @@ -18,16 +18,18 @@ def perform(self, reevaluate=False): game_state_number = self.blackboard.gamestate.get_gamestate() # todo this is a temporary hack to make GUI work - if game_state_number == GameState.GAMESTATE_INITIAL: + if game_state_number == GameState.STATE_INITIAL: return "INITIAL" - elif game_state_number == GameState.GAMESTATE_READY: + elif game_state_number == GameState.STATE_READY: return "READY" - elif game_state_number == GameState.GAMESTATE_SET: + elif game_state_number == GameState.STATE_SET: return "SET" - elif game_state_number == GameState.GAMESTATE_PLAYING: + elif game_state_number == GameState.STATE_PLAYING: return "PLAYING" - elif game_state_number == GameState.GAMESTATE_FINISHED: + elif game_state_number == GameState.STATE_FINISHED: return "FINISHED" + elif game_state_number == GameState.STATE_STANDBY: + return "STANDBY" def get_reevaluate(self): """ diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 673ba6789..62c9707b4 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -186,3 +186,5 @@ $IsPenalized PLACING --> #Placing NORMAL --> #NormalBehavior OVERTIME --> #NormalBehavior + STANDBY --> #StandAndLook + diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py index e28adbd82..b93996df7 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py @@ -44,6 +44,8 @@ def perform(self, reevaluate=False): return "PLAYING" elif game_state_number == GameState.GAMESTATE_FINISHED: return "FINISHED" + elif game_state_number == GameState.STATE_STANDBY: + return "STANDBY" def get_reevaluate(self): """ From 574895f2ef64d25449e5818f19bc932358becd9d Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Mon, 9 Mar 2026 23:06:05 +0100 Subject: [PATCH 11/74] refactor(game_controller): only send ball `PointStamped` to `game_controller_hsl` as the new [Gamecontroller] only expectes an `(x, y)` coordinate. [Gamecontroller]: https://github.com/RoboCup-HumanoidSoccerLeague/GameController/ --- .../bitbots_ball_filter/ball_filter.py | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py index 286107e89..0ab0c0ecc 100755 --- a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py +++ b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py @@ -14,11 +14,9 @@ from ros2_numpy import msgify, numpify from sensor_msgs.msg import CameraInfo from soccer_vision_3d_msgs.msg import Ball, BallArray -from std_msgs.msg import Header +from std_msgs.msg import Float32, Header from std_srvs.srv import Trigger from tf2_geometry_msgs import PointStamped, PoseStamped -from soccer_model_msgs.msg import Ball as BallWithCovariance -from std_msgs.msg import Float32 from bitbots_ball_filter.ball_filter_parameters import bitbots_ball_filter as parameters @@ -52,12 +50,10 @@ def __init__(self) -> None: self.ball_pose_publisher = self.create_publisher( PoseWithCovarianceStamped, self.config.ros.ball_position_publish_topic, 1 ) - self.ball_pose_with_covariance_publisher = self.create_publisher( - BallWithCovariance, "hsl_gamecontroller/ball_with_covariance", 1 - ) - self.ball_age_publisher = self.create_publisher( - Float32 , "hsl_gamecontroller/ball_age", 1 + self.game_controller_ball_position_publisher = self.create_publisher( + PointStamped, "hsl_gamecontroller/ball_position", 1 ) + self.ball_age_publisher = self.create_publisher(Float32, "hsl_gamecontroller/ball_age", 1) # Create callback group self.callback_group = MutuallyExclusiveCallbackGroup() @@ -256,7 +252,7 @@ def filter_step(self) -> None: # Increase covariance self.ball_state_covariance[:2, :2] += np.eye(2) * self.config.filter.covariance.process_noise - # Build message + # Build message pose_msg = PoseWithCovarianceStamped() pose_msg.header = Header( stamp=Time.to_msg(self.get_clock().now()), @@ -269,21 +265,19 @@ def filter_step(self) -> None: pose_msg.pose.pose.orientation.w = 1.0 self.ball_pose_publisher.publish(pose_msg) - # Build message for Ball with Covariance - ball_msg = BallWithCovariance() - ball_msg.header = Header( + ball_position_msg = PointStamped() + ball_position_msg.point = msgify(Point, self.ball_state_position) + ball_position_msg.header = Header( stamp=Time.to_msg(self.get_clock().now()), frame_id=self.config.filter.frame, ) - ball_msg.point.point = msgify(Point, self.ball_state_position) - covariance = np.zeros((6, 6)) - covariance[:3, :3] = self.ball_state_covariance - ball_msg.point.covariance = covariance.flatten() - self.ball_pose_with_covariance_publisher.publish(ball_msg) + self.game_controller_ball_position_publisher.publish(ball_position_msg) # Build message for Ball age ball_age_msg = Float32() - ball_age_msg.data = np.float32(self.get_clock().now() - self.last_ball_time) + nanoseconds_since_last_ball = np.float32((self.get_clock().now() - self.last_ball_time).nanoseconds) + ball_age_msg.data = nanoseconds_since_last_ball / 1e9 + self.ball_age_publisher.publish(ball_age_msg) From 3be654749962e02958d0f817af265c9d651fb5d3 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 12:09:17 +0100 Subject: [PATCH 12/74] fix wrong package structure --- .../whistle_detector/package.xml | 31 --- .../whistle_detector/setup.cfg | 4 - .../whistle_detector/setup.py | 32 --- .../whistle_detector/__init__.py | 4 - .../whistle_detector/whistle_detector.py | 196 ------------------ 5 files changed, 267 deletions(-) delete mode 100644 src/bitbots_world_model/whistle_detector/package.xml delete mode 100644 src/bitbots_world_model/whistle_detector/setup.cfg delete mode 100644 src/bitbots_world_model/whistle_detector/setup.py delete mode 100644 src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py delete mode 100755 src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py diff --git a/src/bitbots_world_model/whistle_detector/package.xml b/src/bitbots_world_model/whistle_detector/package.xml deleted file mode 100644 index 8e169de29..000000000 --- a/src/bitbots_world_model/whistle_detector/package.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - bitbots_whistle_detector - 0.0.0 - The Bitbots Whistle Detector package - - Hamburg Bit-Bots - - MIT - - Hamburg Bit-Bots - - rosidl_default_generators - rosidl_default_runtime - rclpy - std_msgs - std_srvs - ament_mypy - - python3-pytest - - - - python3 - unknown - - ament_python - - - diff --git a/src/bitbots_world_model/whistle_detector/setup.cfg b/src/bitbots_world_model/whistle_detector/setup.cfg deleted file mode 100644 index 36739e90d..000000000 --- a/src/bitbots_world_model/whistle_detector/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[develop] -script_dir=$base/lib/bitbots_whistle_detector -[install] -install_scripts=$base/lib/bitbots_whistle_detector diff --git a/src/bitbots_world_model/whistle_detector/setup.py b/src/bitbots_world_model/whistle_detector/setup.py deleted file mode 100644 index fa6c6a1c3..000000000 --- a/src/bitbots_world_model/whistle_detector/setup.py +++ /dev/null @@ -1,32 +0,0 @@ -import glob - -from setuptools import find_packages, setup - - - -package_name = "bitbots_whistle_detector" - - -setup( - name=package_name, - packages=find_packages(exclude=["test"]), - data_files=[ - ("share/" + package_name, ["package.xml"]), - ("share/" + package_name , ["models/"]) - ], - install_requires=[ - "launch", - "setuptools", - ], - tests_require=["pytest"], - zip_safe=True, - keywords=["ROS"], - license="MIT", - entry_points={ - "console_scripts": [ - "whistle_detector = bitbots_whistle_detector.whistle_detector:main", - ], - }, -) - -# https://roboticsbackend.com/ros2-rclpy-parameter-callback/ diff --git a/src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py b/src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py deleted file mode 100644 index 4d2e15007..000000000 --- a/src/bitbots_world_model/whistle_detector/whistle_detector/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Setting up runtime type checking for this package -from beartype.claw import beartype_this_package - -beartype_this_package() diff --git a/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py b/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py deleted file mode 100755 index b73a4fb2b..000000000 --- a/src/bitbots_world_model/whistle_detector/whistle_detector/whistle_detector.py +++ /dev/null @@ -1,196 +0,0 @@ -#! /usr/bin/env python3 -from typing import Optional - -import numpy as np -import torch -import pyaudio - -import rclpy -from rclpy.node import Node -from rclpy.experimental.events_executor import EventsExecutor - -from std_msgs.msg import Bool - -import torch.nn as nn -from torchvision import models -import torch -import torch.nn.functional as F - - -def get_model(device): # -> models.resnet.ResNet: - #model = models.resnet18(weights="ResNet18_Weights.DEFAULT") - #num_ftrs = model.fc.in_features - #model.fc = nn.Linear(num_ftrs, 2) - - #model = models.mobilenet_v3_small(num_classes=2) - model = models.efficientnet_b0(weights="DEFAULT") - #model.classifier[0] = nn.Dropout(p=0.2) #p=0.2 is default - in_features = model.classifier[1].in_features - model.classifier[1] = nn.Linear(in_features, 2) - return model.to(device) - -def resample( - waveform: torch.Tensor, sample_rate: int, target_sample_rate: int -) -> torch.Tensor: - """ - Resamples a waveform to a target sample rate. - - :param waveform: Waveform - :type waveform: torch.Tensor - :param sample_rate: Sample rate of the waveform - :type sample_rate: int - :param target_sample_rate: Target sample rate - :type target_sample_rate: int - :return: Resampled waveform - :rtype: torch.Tensor - """ - channel = 0 - return torchaudio.transforms.Resample(sample_rate, target_sample_rate)( - waveform[channel, :].view(1, -1) - ) - -def convert_waveform_to_spectogram( - sample_rate: int, chunk: torch.Tensor -) -> torch.Tensor: - """ - Converts a waveform to a mel spectrogram. - - :param sample_rate: Sample rate of the waveform - :type sample_rate: int - :param chunk: Waveform - :type chunk: torch.Tensor - :return: Mel spectrogram - :rtype: torch.Tensor - """ - # Repeat the mel spectrogram 3 times to match the number of channels to the expected input of the model - # TODO: Discuss whether to change the model to accept 1 channel - return ( - torchaudio.transforms.MelSpectrogram(sample_rate, n_mels=64)(chunk) - .log2() - .repeat(3, 1, 1) - ) - -class Net(nn.Module): - def __init__(self): - super().__init__() - self.conv1 = nn.Conv2d(3, 6, 5) - self.pool = nn.MaxPool2d(2, 2) - self.conv2 = nn.Conv2d(6, 16, 5) - self.fc1 = nn.Linear(16 * 5 * 5, 120) - self.fc2 = nn.Linear(120, 84) - self.fc3 = nn.Linear(84, 10) - - def forward(self, x): - x = self.pool(F.relu(self.conv1(x))) - x = self.pool(F.relu(self.conv2(x))) - x = torch.flatten(x, 1) # flatten all dimensions except batch - x = F.relu(self.fc1(x)) - x = F.relu(self.fc2(x)) - x = self.fc3 - -CHUNK = 1024 -FORMAT = pyaudio.paFloat32 -CHANNELS = 1 -SAMPLE_RATE = 44100 -TARGET_SAMPLE_RATE = 10_000 - -CHECKPOINT_PATH = "models/blabla.pth" #TODO: wait for model from teammate - - -class WhistleDetector(Node): - - def __init__(self) -> None: - super().__init__("whistle_detector") - self.logger = self.get_logger() - - self.whistle_publisher = self.create_publisher(Bool, "whistle_detected", 1) - - # device - self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - self.logger.info(f"Using device: {self.device}") - - # load model - self.model = get_model(self.device) - self.model.load_state_dict( - torch.load(CHECKPOINT_PATH, map_location=self.device) - ) - self.model.to(self.device) - self.model.eval() - - # audio setup - self.p = pyaudio.PyAudio() - self.stream = self.p.open( - format=FORMAT, - channels=CHANNELS, - rate=SAMPLE_RATE, - input=True, - frames_per_buffer=CHUNK, - ) - - # timer for processing - self.timer = self.create_timer(0.02, self.process_audio) # ~50Hz - - self.logger.info("Whistle detector initialized") - - def process_audio(self) -> None: - try: - data = self.stream.read(CHUNK, exception_on_overflow=False) - except Exception as e:10× lighter and faster than EfficientNet - self.logger.warn(f"Audio read error: {e}") - return - - audio_np = np.frombuffer(data, dtype=np.float32) - - audio_tensor = torch.from_numpy(audio_np) - audio_tensor = audio_tensor.unsqueeze(0) - - # resample - resampled = resample( - audio_tensor, - sample_rate=SAMPLE_RATE, - target_sample_rate=TARGET_SAMPLE_RATE, - ) - - # mel spectrogram - mel = convert_waveform_to_spectogram( - SAMPLE_RATE, - resampled, - ) - - mel[mel.isinf()] = 0 - - mel = mel.unsqueeze(0).to(self.device) - - with torch.no_grad(): - output = self.model(mel).squeeze() - - whistle = bool(output[1] > output[0]) - - if whistle: - msg = Bool() - msg.data = whistle - - self.whistle_publisher.publish(msg) - - def destroy_node(self): - try: - self.stream.stop_stream() - self.stream.close() - self.p.terminate() - except Exception: - pass - - super().destroy_node() - - -def main(args=None) -> None: - rclpy.init(args=args) - - node = WhistleDetector() - executor = EventsExecutor() - executor.add_node(node) - try: - executor.spin() - except KeyboardInterrupt: - pass - node.destroy_node() From 9538674ea206f784bcb4245d8150870d26485313 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 12:11:14 +0100 Subject: [PATCH 13/74] fix package naming --- .../bitbots_whistle_detector/__init__.py | 4 +++ .../bitbots_whistle_detector/package.xml | 32 +++++++++++++++++++ .../bitbots_whistle_detector/setup.cfg | 4 +++ .../bitbots_whistle_detector/setup.py | 31 ++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py create mode 100644 src/bitbots_world_model/bitbots_whistle_detector/package.xml create mode 100644 src/bitbots_world_model/bitbots_whistle_detector/setup.cfg create mode 100644 src/bitbots_world_model/bitbots_whistle_detector/setup.py diff --git a/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py b/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py new file mode 100644 index 000000000..4d2e15007 --- /dev/null +++ b/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py @@ -0,0 +1,4 @@ +# Setting up runtime type checking for this package +from beartype.claw import beartype_this_package + +beartype_this_package() diff --git a/src/bitbots_world_model/bitbots_whistle_detector/package.xml b/src/bitbots_world_model/bitbots_whistle_detector/package.xml new file mode 100644 index 000000000..d27df16c8 --- /dev/null +++ b/src/bitbots_world_model/bitbots_whistle_detector/package.xml @@ -0,0 +1,32 @@ + + + + bitbots_whistle_detector + 0.0.0 + The Bitbots Whistle Detector package + + Hamburg Bit-Bots + + MIT + + Hamburg Bit-Bots + + rosidl_default_generators + rosidl_default_runtime + rclpy + std_msgs + std_srvs + audio_common_msgs + ament_mypy + + python3-pytest + + + + python3 + unknown + + ament_python + + + diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.cfg b/src/bitbots_world_model/bitbots_whistle_detector/setup.cfg new file mode 100644 index 000000000..36739e90d --- /dev/null +++ b/src/bitbots_world_model/bitbots_whistle_detector/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/bitbots_whistle_detector +[install] +install_scripts=$base/lib/bitbots_whistle_detector diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.py b/src/bitbots_world_model/bitbots_whistle_detector/setup.py new file mode 100644 index 000000000..9834e2e1d --- /dev/null +++ b/src/bitbots_world_model/bitbots_whistle_detector/setup.py @@ -0,0 +1,31 @@ +import glob + +from setuptools import find_packages, setup + + + +package_name = "bitbots_whistle_detector" + + +setup( + name=package_name, + packages=[package_name], + data_files=[ + ("share/" + package_name, ["package.xml"]), + ], + install_requires=[ + "launch", + "setuptools", + ], + tests_require=["pytest"], + zip_safe=True, + keywords=["ROS"], + license="MIT", + entry_points={ + "console_scripts": [ + "whistle_detector = bitbots_whistle_detector.whistle_detector:main", + ], + }, +) + +# https://roboticsbackend.com/ros2-rclpy-parameter-callback/ From 60b3fce7709130144e54cabcc8f3d72076c11fdb Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 12:11:30 +0100 Subject: [PATCH 14/74] add whistle detection based on frequency bands --- .../whistle_detector.py | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py diff --git a/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py b/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py new file mode 100755 index 000000000..f9620b119 --- /dev/null +++ b/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py @@ -0,0 +1,82 @@ +#! /usr/bin/env python3 +from typing import Optional + +import numpy as np + +import rclpy +from rclpy.node import Node +from rclpy.experimental.events_executor import EventsExecutor + +from std_msgs.msg import Bool +from audio_common_msgs.msg import AudioStamped +from rclpy.qos import qos_profile_sensor_data + + + +class WhistleDetector(Node): + + def __init__(self) -> None: + super().__init__("whistle_detector") + self.logger = self.get_logger() + + self.whistle_publisher = self.create_publisher(Bool, "whistle_detected", 1) + + self.audio_buffer = np.array([], dtype=np.float32) + self.sample_rate = 16000 + self.chunk_size = 512 + + self.audio_sub = self.create_subscription(AudioStamped, "/audio", self.audio_cb, qos_profile=qos_profile_sensor_data) + self.timer = self.create_timer(0.02, self.process_audio) + + self.logger.info("Whistle detector initialized") + + def audio_cb(self, msg): + audio_np = np.frombuffer(msg.audio.audio_data.int16_data, dtype=np.int16).astype(np.float32) + audio_np /= 32768.0 # normalize, as from ints in range +/- 32768 to +/-1.0 + + self.audio_buffer = np.concatenate([self.audio_buffer, audio_np]) + + if len(self.audio_buffer) > self.chunk_size: + self.audio_buffer = self.audio_buffer[-self.chunk_size:] + + + def process_audio(self) -> None: + if len(self.audio_buffer) < self.chunk_size: + return + + audio = self.audio_buffer.copy() + + whistle_detected = self.detect_whistle(audio, self.sample_rate) + + if whistle_detected: + msg = Bool(data=True) + self.whistle_publisher.publish(msg) + + def detect_whistle(self, audio, sample_rate): + spectrum = np.abs(np.fft.rfft(audio)) + freqs = np.fft.rfftfreq(len(audio), 1/sample_rate) + + band = (freqs > 2000) & (freqs < 4500) # Google: range of whistle frequencies + + whistle_energy = np.sum(spectrum[band]) + total_energy = np.sum(spectrum) + + if total_energy == 0: + return False + + ratio = whistle_energy / total_energy + + return ratio > 0.5 # TODO: Tune, worked well on my Laptop + + + +def main(args=None) -> None: + rclpy.init(args=args) + + node = WhistleDetector() + executor = EventsExecutor() + executor.add_node(node) + try: + executor.spin() + except KeyboardInterrupt: + pass From 3d3373ffb8f309c510b618de4467d31f2d2b699b Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 12:35:56 +0100 Subject: [PATCH 15/74] add launch files --- src/bitbots_misc/bitbots_bringup/launch/highlevel.launch | 2 ++ src/bitbots_motion/bitbots_head_mover/launch/test.launch | 3 +++ .../bitbots_whistle_detector/launch/whistle_detector.launch | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/launch/whistle_detector.launch diff --git a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch index fc277868b..cf512d35f 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch @@ -54,6 +54,8 @@ + + diff --git a/src/bitbots_motion/bitbots_head_mover/launch/test.launch b/src/bitbots_motion/bitbots_head_mover/launch/test.launch index e45e4106f..144152dd3 100644 --- a/src/bitbots_motion/bitbots_head_mover/launch/test.launch +++ b/src/bitbots_motion/bitbots_head_mover/launch/test.launch @@ -32,6 +32,9 @@ + + + diff --git a/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/launch/whistle_detector.launch b/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/launch/whistle_detector.launch new file mode 100644 index 000000000..1d39902bc --- /dev/null +++ b/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/launch/whistle_detector.launch @@ -0,0 +1,4 @@ + + + + From 1a3eef4c92b7a28f413edbecce65de3820ef9f3d Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 12:36:34 +0100 Subject: [PATCH 16/74] add plugin dir for pipewire --- pixi.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pixi.toml b/pixi.toml index d062e8bfa..dde891077 100644 --- a/pixi.toml +++ b/pixi.toml @@ -232,6 +232,7 @@ RMW_IMPLEMENTATION = "rmw_cyclonedds_cpp" COLCON_LOG_LEVEL = "30" PYTHONWARNINGS="ignore:::setuptools.command.install,ignore:::setuptools.command.easy_install,ignore:::pkg_resources,ignore:easy_install command is deprecated,ignore:setup.py install is deprecated" WEBOTS_HOME = "$CONDA_PREFIX/share/webots" +ALSA_PLUGIN_DIR = "/usr/lib/x86_64-linux-gnu/alsa-lib" [feature.ros.activation] scripts = ["install/setup.sh"] From 04457bfb4613985debec94b45fe31aa95288d973 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 13:18:38 +0100 Subject: [PATCH 17/74] update dsd for whistle detection and decision --- .../capsules/game_status_capsule.py | 6 +-- .../decisions/whistle_detected.py | 9 ++--- .../behavior_dsd/main.dsd | 37 +++++++++++-------- .../bitbots_whistle_detector/setup.py | 2 + 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 159c7ab07..1baf66f9f 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -121,10 +121,6 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg - def whistle_detected(self) -> bool: - return self.whistle_detected - - def whistle_detection_callback(self, msg) -> None: # MSG type is assumed to be bool for now, prototyping - self.whistle_detected = msg.data + self.whistle_detected = msg.data # This stays true after the first whistle detection which is incorrect diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py index d3026c781..c209310e8 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py @@ -7,14 +7,11 @@ class WhistleDetected(AbstractDecisionElement): def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) + self.bb = blackboard + self.bb.game_state_capsule.whistle_detected = False def perform(self, reevaluate=False): - """ - Determines whether we are confident regarding the ball's position. - :param reevaluate: - :return: - """ - if self.blackboard.world_model.ball_has_been_seen(): # TODO + if self.bb.game_state_capsule.whistle_detected: return "YES" return "NO" diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 3b0287230..324454791 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -162,6 +162,16 @@ $BallSeen SECOND --> #SupporterRole THIRD --> #DefensePositioning +#PlayingBehavior +$SecondaryStateDecider + PENALTYSHOOT --> #PenaltyShootoutBehavior + TIMEOUT --> #StandAndLook + ELSE --> $SecondaryStateModeDecider + ELSE --> #StandAndLook + PLACING --> #Placing + NORMAL --> #NormalBehavior + OVERTIME --> #NormalBehavior + -->BodyBehavior $IsPenalized YES --> #DoNothing @@ -175,21 +185,18 @@ $IsPenalized NO --> $DoOnce NOT_DONE --> @ChangeAction + action:waiting + r:false, @LookAtFieldFeatures + r:false, @Stand + duration:2 DONE --> #PositioningReady - SET --> $SecondaryStateDecider - PENALTYSHOOT --> $SecondaryStateTeamDecider - OUR --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @Stand // we need to also see the goalie - OTHER --> $BallSeen - YES --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @TrackBall + r:false, @PlayAnimationGoalieArms + r:false, @Stand // goalie only needs to care about the ball - NO --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @LookAtFieldFeatures + r:false, @PlayAnimationGoalieArms + r:false, @Stand - ELSE --> #StandAndLook + SET --> $WhistleDetected + YES --> #PlayingBehavior + NO --> $SecondaryStateDecider + PENALTYSHOOT --> $SecondaryStateTeamDecider + OUR --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @Stand // we need to also see the goalie + OTHER --> $BallSeen + YES --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @TrackBall + r:false, @PlayAnimationGoalieArms + r:false, @Stand // goalie only needs to care about the ball + NO --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @LookAtFieldFeatures + r:false, @PlayAnimationGoalieArms + r:false, @Stand + ELSE --> #StandAndLook FINISHED --> $CurrentScore AHEAD --> @Stand + duration:0.5 + r:false, @PlaySound + file:fanfare.wav, @PlayAnimationCheering + r:false, @GetWalkready + r:false, @LookForward, @Stand ELSE --> #Init - PLAYING --> $SecondaryStateDecider - PENALTYSHOOT --> #PenaltyShootoutBehavior - TIMEOUT --> #StandAndLook - ELSE --> $SecondaryStateModeDecider - ELSE --> #StandAndLook - PLACING --> #Placing - NORMAL --> #NormalBehavior - OVERTIME --> #NormalBehavior + PLAYING --> #PlayingBehavior + + diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.py b/src/bitbots_world_model/bitbots_whistle_detector/setup.py index 9834e2e1d..a04e0c01e 100644 --- a/src/bitbots_world_model/bitbots_whistle_detector/setup.py +++ b/src/bitbots_world_model/bitbots_whistle_detector/setup.py @@ -12,11 +12,13 @@ packages=[package_name], data_files=[ ("share/" + package_name, ["package.xml"]), + ("share/" + package_name + "/launch", glob.glob("launch/*.launch")), ], install_requires=[ "launch", "setuptools", ], + tests_require=["pytest"], zip_safe=True, keywords=["ROS"], From bf5c422be23a53bcf0b3f4ee99a817c7cdd0c885 Mon Sep 17 00:00:00 2001 From: Clemens Date: Mon, 2 Mar 2026 16:19:14 +0100 Subject: [PATCH 18/74] added publishers for gamecontroller response with dynamic data --- .../bitbots_hcm/hcm_dsd/decisions/fallen.py | 17 +++++++++++ .../bitbots_team_communication.py | 4 +++ .../bitbots_ball_filter/ball_filter.py | 29 ++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py index 0429ed5bf..5faf6438e 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py @@ -20,9 +20,16 @@ def __init__(self, blackboard, dsd, parameters): ) self.fallen_angular_velocity_thresh = self.blackboard.node.get_parameter("fallen_angular_velocity_thresh").value + # publishes if robot is fallen + self.is_fallen_publisher = self.create_publisher( + bool, "hsl_gamecontroller/is_fallen", 1 + ) + + def perform(self, reevaluate=False): # Check of the fallen detection is active if not self.blackboard.is_stand_up_active: + self.publish_if_fallen(False) return "NOT_FALLEN" # Get angular velocity from the IMU @@ -30,6 +37,7 @@ def perform(self, reevaluate=False): # Check if the robot is rotating if np.mean(np.abs(angular_velocity)) >= 0.2: + self.publish_if_fallen(False) return "NOT_FALLEN" # Convert quaternion to fused angles @@ -37,18 +45,27 @@ def perform(self, reevaluate=False): # Decides which side is facing downwards. if fused_pitch > self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_FRONT" if fused_pitch < -self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_BACK" if fused_roll > self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_RIGHT" if fused_roll < -self.fallen_orientation_thresh: + self.publish_if_fallen(True) return "FALLEN_LEFT" + self.publish_if_fallen(False) return "NOT_FALLEN" + + def publish_if_fallen(self, is_fallen): + # publishes if robot is fallen + self.is_fallen_publisher.publish(is_fallen) def get_reevaluate(self): return True diff --git a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py index 98b848626..18abf9c97 100755 --- a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py +++ b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py @@ -104,6 +104,9 @@ def try_to_establish_connection(self): def create_publishers(self): self.team_data_publisher = self.node.create_publisher(TeamData, self.topics["team_data_topic"], qos_profile=1) + self.pose_stamped_publisher = self.node.create_publisher( + PoseWithCovarianceStamped, "hsl_gamecontroller/pose_stamped", 1 + ) def create_subscribers(self): self.node.create_subscription( @@ -174,6 +177,7 @@ def gamestate_cb(self, msg: GameState): self.gamestate = msg def pose_cb(self, msg: PoseWithCovarianceStamped): + self.pose_stamped_publisher.publish(msg) self.pose = msg def cmd_vel_cb(self, msg: Twist): diff --git a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py index fd3763146..286107e89 100755 --- a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py +++ b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py @@ -17,6 +17,8 @@ from std_msgs.msg import Header from std_srvs.srv import Trigger from tf2_geometry_msgs import PointStamped, PoseStamped +from soccer_model_msgs.msg import Ball as BallWithCovariance +from std_msgs.msg import Float32 from bitbots_ball_filter.ball_filter_parameters import bitbots_ball_filter as parameters @@ -39,6 +41,7 @@ def __init__(self) -> None: # Initialize parameters self.update_params() self.logger.info(f"Using frame '{self.config.filter.frame}' for ball filtering") + self.last_ball_time = self.get_clock().now() self.camera_info: Optional[CameraInfo] = None @@ -49,6 +52,12 @@ def __init__(self) -> None: self.ball_pose_publisher = self.create_publisher( PoseWithCovarianceStamped, self.config.ros.ball_position_publish_topic, 1 ) + self.ball_pose_with_covariance_publisher = self.create_publisher( + BallWithCovariance, "hsl_gamecontroller/ball_with_covariance", 1 + ) + self.ball_age_publisher = self.create_publisher( + Float32 , "hsl_gamecontroller/ball_age", 1 + ) # Create callback group self.callback_group = MutuallyExclusiveCallbackGroup() @@ -141,6 +150,7 @@ def ball_callback(self, msg: BallArray) -> None: # Store the ball measurement self.ball_state_position = numpify(ball_measurement_map.point) self.ball_state_covariance = covariance + self.last_ball_time = Time.from_msg(ball_msg.header.stamp) ball_measurement_updated = True # Get our estimate in the base footprint frame for easier distance calculation @@ -246,7 +256,7 @@ def filter_step(self) -> None: # Increase covariance self.ball_state_covariance[:2, :2] += np.eye(2) * self.config.filter.covariance.process_noise - # Build message + # Build message pose_msg = PoseWithCovarianceStamped() pose_msg.header = Header( stamp=Time.to_msg(self.get_clock().now()), @@ -259,6 +269,23 @@ def filter_step(self) -> None: pose_msg.pose.pose.orientation.w = 1.0 self.ball_pose_publisher.publish(pose_msg) + # Build message for Ball with Covariance + ball_msg = BallWithCovariance() + ball_msg.header = Header( + stamp=Time.to_msg(self.get_clock().now()), + frame_id=self.config.filter.frame, + ) + ball_msg.point.point = msgify(Point, self.ball_state_position) + covariance = np.zeros((6, 6)) + covariance[:3, :3] = self.ball_state_covariance + ball_msg.point.covariance = covariance.flatten() + self.ball_pose_with_covariance_publisher.publish(ball_msg) + + # Build message for Ball age + ball_age_msg = Float32() + ball_age_msg.data = np.float32(self.get_clock().now() - self.last_ball_time) + self.ball_age_publisher.publish(ball_age_msg) + def main(args=None) -> None: rclpy.init(args=args) From 9d0a396840d59f8aed0422e8502d9a009db45fee Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 13:30:07 +0100 Subject: [PATCH 19/74] update pixi.toml --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 7a10314d2..00590d377 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "robostack-jazzy", # Robostack jazzy channel for ROS packages + "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/tree/pixi_update_hsl_gamecontroller", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" From bb496bc1587480bfa02f5b39a1c1d6ac5866b95f Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 13:35:30 +0100 Subject: [PATCH 20/74] pixi toml update 2.0 --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 00590d377..6674277f6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/tree/pixi_update_hsl_gamecontroller", # Robostack jazzy channel for ROS packages + "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/blob/pixi_update_hsl_gamecontroller/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" From f59771f130e40535149fb55f58dfc4fd32c80e8e Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 13:39:35 +0100 Subject: [PATCH 21/74] pixi toml upfate 3.0 --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 6674277f6..5ed64987e 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "https://github.com/bit-bots/robostack-jazzy-custom-pkgs/blob/pixi_update_hsl_gamecontroller/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages + "file:///homes/22wulff/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" From 47d13fbb341bd840088a06ecfdb7eb9de4136644 Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 18:16:34 +0100 Subject: [PATCH 22/74] game_state_capsule updated --- pixi.toml | 2 +- .../capsules/game_status_capsule.py | 61 +++++++++---------- .../behavior_dsd/decisions/last_player.py | 23 ------- .../behavior_dsd/main.dsd | 9 +-- 4 files changed, 31 insertions(+), 64 deletions(-) delete mode 100644 src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py diff --git a/pixi.toml b/pixi.toml index 5ed64987e..1318ba792 100644 --- a/pixi.toml +++ b/pixi.toml @@ -3,7 +3,7 @@ authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages - "file:///homes/22wulff/rosdistro_additional_recipes.yaml", # Robostack jazzy channel for ROS packages + "robostack-jazzy", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel ] name = "bitbots_main" diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 0f52543a6..2705a5c23 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -12,6 +12,7 @@ class GameStatusCapsule(AbstractBlackboardCapsule): def __init__(self, node, blackboard=None): super().__init__(node, blackboard) self.team_id: int = get_parameters_from_other_node(self._node, "parameter_blackboard", ["team_id"])["team_id"] + self.own_id: int = get_parameters_from_other_node(self._node, "parameter_blackboard", ["bot_id"])["bot_id"] self.gamestate = GameState() self.last_update: float = 0.0 self.unpenalized_time: float = 0.0 @@ -20,25 +21,29 @@ def __init__(self, node, blackboard=None): self.free_kick_kickoff_team: Optional[bool] = None def get_gamestate(self) -> int: - return self.gamestate.game_state + #Init, ready, set, playing, finished, standby + return self.gamestate.main_state - def get_secondary_state(self) -> int: - return self.gamestate.secondary_state + def get_gamePhase(self) -> int: + #Timeout, Normal, Penaltyshoot + return self.gamestate.gamePhase - def get_secondary_state_mode(self) -> int: - return self.gamestate.secondary_state_mode + def get_setPlay(self) -> int: + #None, Kick In, Goalkick, Cornerkick, Pushing Freekick, Penaltykick + return self.gamestate.setPlay def get_secondary_team(self) -> int: - return self.gamestate.secondary_state_team + #Team ID, wer in set Play den Baall hat + return self.gamestate.kickingTeam def has_kickoff(self) -> bool: - return self.gamestate.has_kick_off + #vegelcih mit eigener Teamnummer + return self.gamestate.kickingTeam == self.team_id def has_penalty_kick(self) -> bool: - return ( - self.gamestate.secondary_state == GameState.STATE_PENALTYKICK - or self.gamestate.secondary_state == GameState.STATE_PENALTYSHOOT - ) and self.gamestate._secondary_state_team == self.team_id + return( + self.gamestate.set_play == GameState.SET_PLAY_PENALTY_KICK + and self.gamestate.kickingTeam == self.team_id) def get_our_goals(self) -> int: return self.gamestate.own_score @@ -55,28 +60,20 @@ def get_seconds_since_any_goal(self) -> float: def get_seconds_remaining(self) -> float: # Time from the message minus time passed since receiving it return max( - self.gamestate.seconds_remaining - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0 + self.gamestate.secs_remaining - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0 ) def get_secondary_seconds_remaining(self) -> float: """Seconds remaining for things like kickoff""" # Time from the message minus time passed since receiving it return max( - self.gamestate.secondary_seconds_remaining + self.gamestate.secondary_time - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0, ) - def get_seconds_since_last_drop_ball(self) -> Optional[float]: - """Returns the seconds since the last drop in""" - if self.gamestate.drop_in_time == -1: - return None - else: - # Time from the message plus seconds passed since receiving it - return self.gamestate.drop_in_time + (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update) - def get_seconds_since_unpenalized(self) -> float: - return self._node.get_clock().now().nanoseconds / 1e9 - self.unpenalized_time + return self._node.get_clock().now().nanoseconds / 1e9 - self.seconds_till_unpenalized def get_is_penalized(self) -> bool: return self.gamestate.penalized @@ -87,9 +84,6 @@ def received_gamestate(self) -> bool: def get_team_id(self) -> int: return self.team_id - def get_red_cards(self) -> int: - return self.gamestate.team_mates_with_red_card - def gamestate_callback(self, gamestate_msg: GameState) -> None: if self.gamestate.penalized and not gamestate_msg.penalized: self.unpenalized_time = self._node.get_clock().now().nanoseconds / 1e9 @@ -101,21 +95,24 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: if gamestate_msg.rival_score > self.gamestate.rival_score: self.last_goal_time = self._node.get_clock().now().nanoseconds / 1e9 + '''Was soll das? self.free_kick_kickoff wird nirgends weiter verwendet... if ( - gamestate_msg.secondary_state_mode == 2 - and self.gamestate.secondary_state_mode != 2 - and gamestate_msg.game_state == GameState.GAMESTATE_PLAYING + gamestate_msg.main_state == GameState.STATE_SET + and self.gamestate.setPlay != 2 + and gamestate_msg.state == GameState.STATE_PLAYING ): # secondary action is now executed but we will not see this in the new messages. # it will look like a normal kick off, but we need to remember that this is some sort of free kick # we set the kickoff value accordingly, then we will not be allowed to move if it is a kick for the others - self.free_kick_kickoff_team = gamestate_msg.secondary_state_team - - if gamestate_msg.secondary_state_mode != 2 and gamestate_msg.secondary_seconds_remaining == 0: + self.free_kick_kickoff_team = gamestate_msg.kickingTeam + + + if gamestate_msg.setPlay != 2 and gamestate_msg.secondaryTime == 0: self.free_kick_kickoff_team = None + if self.free_kick_kickoff_team is not None: gamestate_msg.has_kick_off = self.free_kick_kickoff_team == self.team_id - + ''' self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py deleted file mode 100644 index 04e32b588..000000000 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/last_player.py +++ /dev/null @@ -1,23 +0,0 @@ -from bitbots_blackboard.body_blackboard import BodyBlackboard -from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement - - -class LastPlayer(AbstractDecisionElement): - blackboard: BodyBlackboard - - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - - def perform(self, reevaluate=False): - # Get nessesary data - red_cards = self.blackboard.gamestate.get_red_cards() - own_id = self.blackboard.misc.bot_id - - # Use generator comprehension to check if all red cards are true except our own - if all(x for i, x in enumerate(red_cards) if i != own_id): - return "YES" - else: - return "NO" - - def get_reevaluate(self): - return True diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 3b0287230..673ba6789 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -82,13 +82,6 @@ $PassStarted NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassAcceptPosition NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassPreparePosition -#GoalieRole -$CurrentScore - BEHIND --> $LastPlayer - YES --> #StrikerRole - NO --> #GoalieBehavior - ELSE --> #GoalieBehavior - #PenaltyShootoutBehavior $SecondaryStateTeamDecider OUR --> @StandAndWaitRandom + min:10 + max:30, @KickBallDynamic + r:true + type:penalty, @Stand @@ -152,7 +145,7 @@ $BallSeen NO_NORMAL --> #StandAndLook NO_FREEKICK --> #Placing YES --> $ConfigRole - GOALIE --> #GoalieRole + GOALIE --> #GoalieBehavior ELSE --> $CountActiveRobotsWithoutGoalie ONE --> $RankToBallNoGoalie FIRST --> #StrikerRole From 9bfb6df00a075ae10519c871792901eed674c72c Mon Sep 17 00:00:00 2001 From: Clemens Date: Thu, 5 Mar 2026 18:38:11 +0100 Subject: [PATCH 23/74] integration of new gamestate msg in behavior, secondary state is still missing --- .../capsules/game_status_capsule.py | 2 +- .../behavior_dsd/decisions/game_state_decider.py | 12 +++++++----- .../bitbots_body_behavior/behavior_dsd/main.dsd | 2 ++ .../localization_dsd/decisions/game_state.py | 2 ++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 2705a5c23..33e3efed9 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -95,7 +95,7 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: if gamestate_msg.rival_score > self.gamestate.rival_score: self.last_goal_time = self._node.get_clock().now().nanoseconds / 1e9 - '''Was soll das? self.free_kick_kickoff wird nirgends weiter verwendet... + '''Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt if ( gamestate_msg.main_state == GameState.STATE_SET and self.gamestate.setPlay != 2 diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py index bef4e355d..ffc52efcb 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py @@ -18,16 +18,18 @@ def perform(self, reevaluate=False): game_state_number = self.blackboard.gamestate.get_gamestate() # todo this is a temporary hack to make GUI work - if game_state_number == GameState.GAMESTATE_INITIAL: + if game_state_number == GameState.STATE_INITIAL: return "INITIAL" - elif game_state_number == GameState.GAMESTATE_READY: + elif game_state_number == GameState.STATE_READY: return "READY" - elif game_state_number == GameState.GAMESTATE_SET: + elif game_state_number == GameState.STATE_SET: return "SET" - elif game_state_number == GameState.GAMESTATE_PLAYING: + elif game_state_number == GameState.STATE_PLAYING: return "PLAYING" - elif game_state_number == GameState.GAMESTATE_FINISHED: + elif game_state_number == GameState.STATE_FINISHED: return "FINISHED" + elif game_state_number == GameState.STATE_STANDBY: + return "STANDBY" def get_reevaluate(self): """ diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 673ba6789..62c9707b4 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -186,3 +186,5 @@ $IsPenalized PLACING --> #Placing NORMAL --> #NormalBehavior OVERTIME --> #NormalBehavior + STANDBY --> #StandAndLook + diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py index e28adbd82..b93996df7 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py @@ -44,6 +44,8 @@ def perform(self, reevaluate=False): return "PLAYING" elif game_state_number == GameState.GAMESTATE_FINISHED: return "FINISHED" + elif game_state_number == GameState.STATE_STANDBY: + return "STANDBY" def get_reevaluate(self): """ From 1c162a622dce08b6ab0b1bbde1f560d14d7f02a5 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Mon, 9 Mar 2026 23:06:05 +0100 Subject: [PATCH 24/74] refactor(game_controller): only send ball `PointStamped` to `game_controller_hsl` as the new [Gamecontroller] only expectes an `(x, y)` coordinate. [Gamecontroller]: https://github.com/RoboCup-HumanoidSoccerLeague/GameController/ --- .../bitbots_ball_filter/ball_filter.py | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py index 286107e89..0ab0c0ecc 100755 --- a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py +++ b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py @@ -14,11 +14,9 @@ from ros2_numpy import msgify, numpify from sensor_msgs.msg import CameraInfo from soccer_vision_3d_msgs.msg import Ball, BallArray -from std_msgs.msg import Header +from std_msgs.msg import Float32, Header from std_srvs.srv import Trigger from tf2_geometry_msgs import PointStamped, PoseStamped -from soccer_model_msgs.msg import Ball as BallWithCovariance -from std_msgs.msg import Float32 from bitbots_ball_filter.ball_filter_parameters import bitbots_ball_filter as parameters @@ -52,12 +50,10 @@ def __init__(self) -> None: self.ball_pose_publisher = self.create_publisher( PoseWithCovarianceStamped, self.config.ros.ball_position_publish_topic, 1 ) - self.ball_pose_with_covariance_publisher = self.create_publisher( - BallWithCovariance, "hsl_gamecontroller/ball_with_covariance", 1 - ) - self.ball_age_publisher = self.create_publisher( - Float32 , "hsl_gamecontroller/ball_age", 1 + self.game_controller_ball_position_publisher = self.create_publisher( + PointStamped, "hsl_gamecontroller/ball_position", 1 ) + self.ball_age_publisher = self.create_publisher(Float32, "hsl_gamecontroller/ball_age", 1) # Create callback group self.callback_group = MutuallyExclusiveCallbackGroup() @@ -256,7 +252,7 @@ def filter_step(self) -> None: # Increase covariance self.ball_state_covariance[:2, :2] += np.eye(2) * self.config.filter.covariance.process_noise - # Build message + # Build message pose_msg = PoseWithCovarianceStamped() pose_msg.header = Header( stamp=Time.to_msg(self.get_clock().now()), @@ -269,21 +265,19 @@ def filter_step(self) -> None: pose_msg.pose.pose.orientation.w = 1.0 self.ball_pose_publisher.publish(pose_msg) - # Build message for Ball with Covariance - ball_msg = BallWithCovariance() - ball_msg.header = Header( + ball_position_msg = PointStamped() + ball_position_msg.point = msgify(Point, self.ball_state_position) + ball_position_msg.header = Header( stamp=Time.to_msg(self.get_clock().now()), frame_id=self.config.filter.frame, ) - ball_msg.point.point = msgify(Point, self.ball_state_position) - covariance = np.zeros((6, 6)) - covariance[:3, :3] = self.ball_state_covariance - ball_msg.point.covariance = covariance.flatten() - self.ball_pose_with_covariance_publisher.publish(ball_msg) + self.game_controller_ball_position_publisher.publish(ball_position_msg) # Build message for Ball age ball_age_msg = Float32() - ball_age_msg.data = np.float32(self.get_clock().now() - self.last_ball_time) + nanoseconds_since_last_ball = np.float32((self.get_clock().now() - self.last_ball_time).nanoseconds) + ball_age_msg.data = nanoseconds_since_last_ball / 1e9 + self.ball_age_publisher.publish(ball_age_msg) From 056339b8cf2320ce5dde50eaad4f7bc290aa8747 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Tue, 10 Mar 2026 14:40:01 +0100 Subject: [PATCH 25/74] added secondary state stuff to Behaviour --- .../capsules/game_status_capsule.py | 15 +++--- .../decisions/game_state_decider.py | 4 +- .../decisions/secondary_state_decider.py | 50 ++++++------------- .../behavior_dsd/main.dsd | 28 ++--------- .../localization_dsd/decisions/game_state.py | 6 +-- 5 files changed, 32 insertions(+), 71 deletions(-) diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 33e3efed9..8e71c7b26 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -20,16 +20,16 @@ def __init__(self, node, blackboard=None): self.last_goal_time = -86400.0 self.free_kick_kickoff_team: Optional[bool] = None - def get_gamestate(self) -> int: - #Init, ready, set, playing, finished, standby + def get_game_state(self) -> int: + #Init, ready, set, playing, finished return self.gamestate.main_state - def get_gamePhase(self) -> int: - #Timeout, Normal, Penaltyshoot + def get_game_phase(self) -> int: + #Timeout, Normal, Extratime, Penaltyshoot return self.gamestate.gamePhase - def get_setPlay(self) -> int: - #None, Kick In, Goalkick, Cornerkick, Pushing Freekick, Penaltykick + def get_set_play(self) -> int: + #None, Direct Freekick, Indirect Freekick, Penalty, Throw in, Goalkick, Cornerkick, return self.gamestate.setPlay def get_secondary_team(self) -> int: @@ -39,6 +39,9 @@ def get_secondary_team(self) -> int: def has_kickoff(self) -> bool: #vegelcih mit eigener Teamnummer return self.gamestate.kickingTeam == self.team_id + + def is_stopped(self) -> bool: + return self.gamestate.stopped def has_penalty_kick(self) -> bool: return( diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py index ffc52efcb..8119608af 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py @@ -16,7 +16,7 @@ def perform(self, reevaluate=False): :return: """ - game_state_number = self.blackboard.gamestate.get_gamestate() + game_state_number = self.blackboard.gamestate.get_game_state() # todo this is a temporary hack to make GUI work if game_state_number == GameState.STATE_INITIAL: return "INITIAL" @@ -28,8 +28,6 @@ def perform(self, reevaluate=False): return "PLAYING" elif game_state_number == GameState.STATE_FINISHED: return "FINISHED" - elif game_state_number == GameState.STATE_STANDBY: - return "STANDBY" def get_reevaluate(self): """ diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py index 7ed7d761e..a9f49e636 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py @@ -15,27 +15,28 @@ def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) def perform(self, reevaluate=False): - state_number = self.blackboard.gamestate.get_secondary_state() + set_play_number = self.blackboard.gamestate.get_set_play() + game_phase_number = self.blackboard.gamestate.get_game_phase # todo this is a temporary hack to make GUI work - if state_number == GameState.STATE_NORMAL: + if game_phase_number == GameState.GAME_PHASE_NORMAL and set_play_number == GameState.SET_PLAY_NONE: return "NORMAL" - elif state_number == GameState.STATE_PENALTYSHOOT: + elif game_phase_number == GameState.GAME_PHASE_PENALTY_SHOOT_OUT and set_play_number == GameState.SET_PLAY_NONE: return "PENALTYSHOOT" - elif state_number == GameState.STATE_OVERTIME: + elif game_phase_number == GameState.GAME_PHASE_EXTRA_TIME and set_play_number == GameState.SET_PLAY_NONE: return "OVERTIME" - elif state_number == GameState.STATE_TIMEOUT: + elif game_phase_number == GameState.GAME_PHASE_TIMEOUT and set_play_number == GameState.SET_PLAY_NONE: return "TIMEOUT" - elif state_number == GameState.STATE_DIRECT_FREEKICK: + elif set_play_number == GameState.SET_PLAY_DIRECT_FREE_KICK: return "DIRECT_FREEKICK" - elif state_number == GameState.STATE_INDIRECT_FREEKICK: + elif set_play_number == GameState.SET_PLAY_INDIRECT_FREE_KICK: return "INDIRECT_FREEKICK" - elif state_number == GameState.STATE_PENALTYKICK: + elif set_play_number == GameState.SET_PLAY_PENALTY_KICK: return "PENALTYKICK" - elif state_number == GameState.STATE_CORNER_KICK: + elif set_play_number == GameState.SET_PLAY_CORNER_KICK: return "CORNER_KICK" - elif state_number == GameState.STATE_GOAL_KICK: + elif set_play_number == GameState.SET_PLAY_GOAL_KICK: return "GOAL_KICK" - elif state_number == GameState.STATE_THROW_IN: + elif set_play_number == GameState.SET_PLAY_THROW_IN: return "THROW_IN" def get_reevaluate(self): @@ -57,9 +58,9 @@ def __init__(self, blackboard, dsd, parameters): self.team_id = self.blackboard.gamestate.get_team_id() def perform(self, reevaluate=False): - state_number = self.blackboard.gamestate.get_secondary_state() + game_phase_number = self.blackboard.gamestate.get_game_phase() # we have to handle penalty shoot differently because the message is strange - if state_number == GameState.STATE_PENALTYSHOOT: + if game_phase_number == GameState.GAME_PHASE_PENALTY_SHOOT_OUT: if self.blackboard.gamestate.has_kickoff(): return "OUR" return "OTHER" @@ -73,26 +74,3 @@ def get_reevaluate(self): Secondary state Team can change during the game """ return True - - -class SecondaryStateModeDecider(AbstractDecisionElement): - """ - Decides which mode in the secondary state we are. - """ - - blackboard: BodyBlackboard - - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - - def perform(self, reevaluate=False): - state_mode = self.blackboard.gamestate.get_secondary_state_mode() - if state_mode == GameState.MODE_PREPARATION: - return "PREPARATION" - elif state_mode == GameState.MODE_PLACING: - return "PLACING" - elif state_mode == GameState.MODE_END: - return "END" - - def get_reevaluate(self): - return True diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 62c9707b4..2e8907f1a 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -104,31 +104,13 @@ $DoOnce OUR --> #SearchBall OTHER --> @AvoidBallActive, @LookAtFieldFeatures, @WalkInPlace + duration:2, @GoToRelativePosition + x:1 + y:0 + t:0, @Stand YES --> $SecondaryStateDecider - CORNER_KICK --> $SecondaryStateTeamDecider - OUR --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:striker - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:supporter - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - OTHER --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:others - THROW_IN --> $SecondaryStateTeamDecider - OUR --> $RankToBallNoGoalie - FIRST --> $DoOnce - NOT_DONE --> @ChangeAction + action:going_to_ball, @LookAtFieldFeatures, @AvoidBallActive, @GoToBall + target:gradient + distance:0.3 + blocking:false - DONE --> $ReachedAndAlignedToPathPlanningGoalPosition + threshold:0.03 + latch:true - NO --> @GoToBall + target:gradient + distance:0.3 - YES --> @LookForward, @ChangeAction + action:kicking, @Stand + duration:1.5 + r:false, @PlayAnimationDynup + direction:descend_no_arms, @PlayAnimationGrabBall + r:false, @PlayAnimationDynup + direction:rise_no_arms, @PlayAnimationThrow + r:false, @GetWalkready + r:false, @Stand - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToPassPreparePosition - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - OTHER --> $RankToBallNoGoalie + CORNER_KICK --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:others + THROW_IN --> $RankToBallNoGoalie FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition ELSE --> $SecondaryStateTeamDecider OUR --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToBall + target:gradient + distance:0.5 - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToPassPreparePosition - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - OTHER --> $RankToBallNoGoalie FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition @@ -181,9 +163,9 @@ $IsPenalized PLAYING --> $SecondaryStateDecider PENALTYSHOOT --> #PenaltyShootoutBehavior TIMEOUT --> #StandAndLook - ELSE --> $SecondaryStateModeDecider - ELSE --> #StandAndLook - PLACING --> #Placing + ELSE --> $SecondaryStateTeamDecider + OWN --> #NormalBehavior //Nutzt immer normalBehaviour wenn wir die aktion ausführen, könnte man spezifischeres Verhalten definieren + OTHER --> #Placing NORMAL --> #NormalBehavior OVERTIME --> #NormalBehavior STANDBY --> #StandAndLook diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py index b93996df7..67759ad04 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py @@ -32,7 +32,7 @@ def perform(self, reevaluate=False): :param reevaluate: :return: """ - game_state_number = self.blackboard.gamestate.get_gamestate() + game_state_number = self.blackboard.gamestate.get_game_state() if game_state_number == GameState.GAMESTATE_INITIAL: return "INITIAL" @@ -145,11 +145,11 @@ class InitialToReady(AbstractLocalizationDecisionElement): def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) - self.previous_game_state_number = self.blackboard.gamestate.get_gamestate() + self.previous_game_state_number = self.blackboard.gamestate.get_game_state() def perform(self, reevaluate=False): previous_game_state_number = self.previous_game_state_number - game_state_number = self.blackboard.gamestate.get_gamestate() + game_state_number = self.blackboard.gamestate.get_game_state() self.previous_game_state_number = game_state_number self.publish_debug_data("Previous game state", previous_game_state_number) From bb7d064989e0f2a01d1755c033f4f40c8b3599da Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Tue, 10 Mar 2026 17:35:31 +0100 Subject: [PATCH 26/74] stopped from game_controller --- .../capsules/game_status_capsule.py | 12 ++-- .../bitbots_hcm/hcm_dsd/decisions/stop.py | 15 +++++ .../bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd | 62 ++++++++++--------- .../bitbots_hcm/hcm_dsd/hcm_blackboard.py | 1 + .../bitbots_hcm/humanoid_control_module.py | 4 ++ 5 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index c94763226..adaad32e8 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -2,6 +2,7 @@ from bitbots_utils.utils import get_parameters_from_other_node from game_controller_hl_interfaces.msg import GameState +from std_msgs.msg import Bool from bitbots_blackboard.capsules import AbstractBlackboardCapsule @@ -20,6 +21,9 @@ def __init__(self, node, blackboard=None): self.last_goal_from_us_time = -86400.0 self.last_goal_time = -86400.0 self.free_kick_kickoff_team: Optional[bool] = None + self.game_controller_stop: Bool = False + #publish stopped msg for hcm + self.stop_pub = self.node.create_publisher(Bool, "game_controller/stop_msg", 1) def get_game_state(self) -> int: #Init, ready, set, playing, finished @@ -70,14 +74,12 @@ def get_seconds_remaining(self) -> float: # Time from the message minus time passed since receiving it return max( self.gamestate.secs_remaining - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0 - self.gamestate.secs_remaining - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0 ) def get_secondary_seconds_remaining(self) -> float: """Seconds remaining for things like kickoff""" # Time from the message minus time passed since receiving it return max( - self.gamestate.secondary_time self.gamestate.secondary_time - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0, @@ -107,7 +109,10 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: if gamestate_msg.rival_score > self.gamestate.rival_score: self.last_goal_time = self._node.get_clock().now().nanoseconds / 1e9 - '''Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt + self.game_controller_stop = gamestate_msg.stopped + + self.stop_pub.publish(self.game_controller_stop) + '''Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt if ( gamestate_msg.main_state == GameState.STATE_SET @@ -135,6 +140,5 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: if self.free_kick_kickoff_team is not None: gamestate_msg.has_kick_off = self.free_kick_kickoff_team == self.team_id ''' - ''' self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py index 1e5556e62..e33750d78 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py @@ -15,3 +15,18 @@ def perform(self, reevaluate=False): def get_reevaluate(self): return True + +class GameControllerStop(AbstractHCMDecisionElement): + """ + Handles manual stops + """ + + def perform(self, reevaluate=False): + if self.blackboard.game_controller_stop: + # we do an action sequence to go into stop and to stay there + return "STOPPED" + else: + return "FREE" + + def get_reevaluate(self): + return True diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd index 2e0b29b04..0693424ee 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd @@ -21,33 +21,35 @@ $StartHCM TEACH --> @RobotStateRecord, @SetTorque + stiff:false, @Wait HOLD --> @SetTorque + stiff:true, @Wait FINISHED --> @SetTorque + stiff:true + r:false, @RobotStateControllable, @PlayAnimationDynup + direction:walkready + r:false - OFF --> $Stop - STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait - FREE -->$CheckIMU - IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup - PROBLEM --> @RobotStateHardwareProblem, @WaitForIMU - OKAY --> $CheckPressureSensor - PRESSURE_NOT_STARTED --> @RobotStateStartup, @WaitForPressureStartup - PROBLEM --> @RobotStateHardwareProblem, @WaitForPressure - OKAY --> $PickedUp - PICKED_UP --> @RobotStatePickedUp, @PlayAnimationDynup + direction:walkready + r:false, @Wait - ON_GROUND --> $Fallen - FALLEN_FRONT --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationStandupFront, @SetSquat + squat:true - FALLEN_BACK --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @SetFootZero, @PlayAnimationFallingBack, @PlayAnimationStandupBack, @SetSquat + squat:true - FALLEN_RIGHT --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontRight - FALLEN_LEFT --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontLeft - NOT_FALLEN --> $Falling - FALLING_LEFT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingLeft, @Wait - FALLING_RIGHT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingRight, @Wait - FALLING_FRONT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait - FALLING_BACK --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingBack, @Wait - NOT_FALLING --> $InSquat - YES --> @RobotStateGettingUp, @Complain, @PlayAnimationDynup + direction:rise, @SetSquat + squat:false - NO --> $PlayingExternalAnimation - ANIMATION_RUNNING --> @StopWalking, @RobotStateAnimationRunning, @Wait - ANIMATION_SERVER_TIMEOUT --> @CancelAnimation - FREE --> $RecentWalkingGoals - STAY_WALKING --> @RobotStateWalking, @Wait - NOT_WALKING --> $RecentKickGoals - KICKING --> @RobotStateKicking, @Wait - NOT_KICKING --> @RobotStateControllable, @Wait + OFF --> $GameControllerStop + STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @Wait + FREE -> $Stop + STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait + FREE -->$CheckIMU + IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup + PROBLEM --> @RobotStateHardwareProblem, @WaitForIMU + OKAY --> $CheckPressureSensor + PRESSURE_NOT_STARTED --> @RobotStateStartup, @WaitForPressureStartup + PROBLEM --> @RobotStateHardwareProblem, @WaitForPressure + OKAY --> $PickedUp + PICKED_UP --> @RobotStatePickedUp, @PlayAnimationDynup + direction:walkready + r:false, @Wait + ON_GROUND --> $Fallen + FALLEN_FRONT --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationStandupFront, @SetSquat + squat:true + FALLEN_BACK --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @SetFootZero, @PlayAnimationFallingBack, @PlayAnimationStandupBack, @SetSquat + squat:true + FALLEN_RIGHT --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontRight + FALLEN_LEFT --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontLeft + NOT_FALLEN --> $Falling + FALLING_LEFT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingLeft, @Wait + FALLING_RIGHT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingRight, @Wait + FALLING_FRONT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait + FALLING_BACK --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingBack, @Wait + NOT_FALLING --> $InSquat + YES --> @RobotStateGettingUp, @Complain, @PlayAnimationDynup + direction:rise, @SetSquat + squat:false + NO --> $PlayingExternalAnimation + ANIMATION_RUNNING --> @StopWalking, @RobotStateAnimationRunning, @Wait + ANIMATION_SERVER_TIMEOUT --> @CancelAnimation + FREE --> $RecentWalkingGoals + STAY_WALKING --> @RobotStateWalking, @Wait + NOT_WALKING --> $RecentKickGoals + KICKING --> @RobotStateKicking, @Wait + NOT_KICKING --> @RobotStateControllable, @Wait diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py index 3ac8d4dae..2437bda85 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py @@ -25,6 +25,7 @@ def __init__(self, node: Node): # Basic state self.current_state: T_RobotControlState = RobotControlState.STARTUP self.stopped: bool = False + self.game_controller_stop: bool = False # Save start time self.start_time: Time = self.node.get_clock().now() diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py index 14a4a38d4..05663e0e4 100755 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py @@ -80,6 +80,7 @@ def __init__(self, use_sim_time, simulation_active, visualization_active): self.node.create_subscription(Bool, "core/power_switch_status", self.power_cb, 1) self.node.create_subscription(Bool, "hcm_deactivate", self.deactivate_cb, 1) self.node.create_subscription(DiagnosticArray, "diagnostics_agg", self.diag_cb, 1) + self.node.create_subscription(Bool, "game_controller/stop_msg", self.stop_cb, 1) # Create services self.node.create_service(SetBool, "record_mode", self.set_record_mode_callback) @@ -122,6 +123,9 @@ def deactivate_cb(self, msg: Bool): """Deactivates the HCM.""" self.hcm_deactivated = msg.data + def stop_cb(self, msg: Bool): + self.blackboard.game_controller_stop = msg.data + def set_manual_penalize_mode_callback(self, req: ManualPenalize.Request, resp: ManualPenalize.Response): """Callback for the manual penalize service.""" if req.penalize == ManualPenalize.Request.OFF: From d97d0a9314c77694865ad6888360e51afa7fa3c5 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 18:42:58 +0100 Subject: [PATCH 27/74] fix wrong anming of capsule in whistle decision --- .../behavior_dsd/decisions/whistle_detected.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py index c209310e8..981d2356f 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py @@ -8,12 +8,12 @@ class WhistleDetected(AbstractDecisionElement): def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) self.bb = blackboard - self.bb.game_state_capsule.whistle_detected = False + self.bb.gamestate.whistle_detected = False def perform(self, reevaluate=False): - if self.bb.game_state_capsule.whistle_detected: + if self.bb.gamestate.whistle_detected: return "YES" return "NO" def get_reevaluate(self): - return False + return True From 1ae1ac2370bd719a5a933a067d204e3a86bda559 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 18:43:11 +0100 Subject: [PATCH 28/74] fix wrong placement of launch file --- .../launch/whistle_detector.launch | 0 src/bitbots_world_model/bitbots_whistle_detector/setup.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/bitbots_world_model/bitbots_whistle_detector/{bitbots_whistle_detector => }/launch/whistle_detector.launch (100%) diff --git a/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/launch/whistle_detector.launch b/src/bitbots_world_model/bitbots_whistle_detector/launch/whistle_detector.launch similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/launch/whistle_detector.launch rename to src/bitbots_world_model/bitbots_whistle_detector/launch/whistle_detector.launch diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.py b/src/bitbots_world_model/bitbots_whistle_detector/setup.py index a04e0c01e..bcf344f6b 100644 --- a/src/bitbots_world_model/bitbots_whistle_detector/setup.py +++ b/src/bitbots_world_model/bitbots_whistle_detector/setup.py @@ -1,5 +1,5 @@ import glob - +from setuptools import find_packages, setup from setuptools import find_packages, setup @@ -9,7 +9,7 @@ setup( name=package_name, - packages=[package_name], + packages=find_packages(exclude=["test"]), data_files=[ ("share/" + package_name, ["package.xml"]), ("share/" + package_name + "/launch", glob.glob("launch/*.launch")), From 47da9a5c909072613a4b43ac0ff2f2368e4d2048 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 19:02:18 +0100 Subject: [PATCH 29/74] create lib dir --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index bdadc991f..1c63f8feb 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ fabric.properties ### ROS template build/ bin/ -lib/ msg_gen/ srv_gen/ msg/*Action.msg From f9418d446bdede92e8948871234e8a422b5a5520 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 19:05:08 +0100 Subject: [PATCH 30/74] git subrepo clone git@github.com:ros-drivers/audio_common.git src/lib/ subrepo: subdir: "src/lib" merged: "6a8499665" upstream: origin: "git@github.com:ros-drivers/audio_common.git" branch: "master" commit: "6a8499665" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "ea10886" --- src/lib/.github/labeler.yml | 14 + src/lib/.github/workflows/labeler.yml | 17 + src/lib/.github/workflows/main.yml | 28 ++ src/lib/.gitignore | 1 + src/lib/.gitrepo | 12 + src/lib/LICENSE | 29 ++ src/lib/README.md | 37 ++ src/lib/audio_capture/.gitignore | 1 + src/lib/audio_capture/CHANGELOG.rst | 220 +++++++++ src/lib/audio_capture/CMakeLists.txt | 24 + src/lib/audio_capture/launch/capture.launch | 30 ++ .../launch/capture_to_file.launch | 26 + .../audio_capture/launch/capture_wave.launch | 26 + src/lib/audio_capture/mainpage.dox | 21 + src/lib/audio_capture/package.xml | 31 ++ src/lib/audio_capture/src/audio_capture.cpp | 263 ++++++++++ src/lib/audio_common/CHANGELOG.rst | 120 +++++ src/lib/audio_common/CMakeLists.txt | 4 + src/lib/audio_common/package.xml | 25 + src/lib/audio_common_msgs/.gitignore | 1 + src/lib/audio_common_msgs/CHANGELOG.rst | 127 +++++ src/lib/audio_common_msgs/CMakeLists.txt | 22 + src/lib/audio_common_msgs/mainpage.dox | 11 + src/lib/audio_common_msgs/msg/AudioData.msg | 1 + .../msg/AudioDataStamped.msg | 2 + src/lib/audio_common_msgs/msg/AudioInfo.msg | 12 + src/lib/audio_common_msgs/package.xml | 22 + src/lib/audio_play/.gitignore | 1 + src/lib/audio_play/CHANGELOG.rst | 217 ++++++++ src/lib/audio_play/CMakeLists.txt | 24 + src/lib/audio_play/launch/play.launch | 29 ++ .../audio_play/launch/record_to_file.launch | 25 + src/lib/audio_play/mainpage.dox | 22 + src/lib/audio_play/package.xml | 32 ++ src/lib/audio_play/src/audio_play.cpp | 196 ++++++++ src/lib/sound_play/CHANGELOG.rst | 418 ++++++++++++++++ src/lib/sound_play/CMakeLists.txt | 45 ++ src/lib/sound_play/README.md | 67 +++ src/lib/sound_play/action/SoundRequest.action | 7 + .../include/sound_play/sound_play.h | 410 ++++++++++++++++ src/lib/sound_play/mainpage.dox | 23 + src/lib/sound_play/msg/SoundRequest.msg | 30 ++ src/lib/sound_play/package.xml | 55 +++ .../sound_play/resources/flitevox/.gitignore | 1 + src/lib/sound_play/scripts/is_speaking.py | 55 +++ src/lib/sound_play/scripts/play.py | 62 +++ src/lib/sound_play/scripts/playbuiltin.py | 66 +++ src/lib/sound_play/scripts/playpackage.py | 63 +++ src/lib/sound_play/scripts/say.py | 84 ++++ src/lib/sound_play/scripts/shutup.py | 59 +++ .../sound_play/scripts/soundclient_example.py | 91 ++++ src/lib/sound_play/scripts/soundplay_node.py | 462 ++++++++++++++++++ src/lib/sound_play/scripts/test.py | 128 +++++ .../scripts/test/test_sound_client.py | 17 + .../scripts/test_actionlib_client.py | 60 +++ src/lib/sound_play/setup.py | 9 + src/lib/sound_play/sound_play_plugin.yaml | 4 + src/lib/sound_play/soundplay_node.launch | 27 + src/lib/sound_play/sounds/BACKINGUP.ogg | Bin 0 -> 12861 bytes src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg | Bin 0 -> 11050 bytes .../sounds/NEEDS_PLUGGING_BADLY.ogg | Bin 0 -> 35782 bytes .../sound_play/sounds/NEEDS_UNPLUGGING.ogg | Bin 0 -> 35535 bytes .../sounds/NEEDS_UNPLUGGING_BADLY.ogg | Bin 0 -> 78198 bytes src/lib/sound_play/sounds/say-beep.wav | Bin 0 -> 4058 bytes src/lib/sound_play/src/sound_play/__init__.py | 36 ++ .../src/sound_play/festival_plugin.py | 61 +++ .../sound_play/src/sound_play/flite_plugin.py | 57 +++ .../sound_play/src/sound_play/libsoundplay.py | 374 ++++++++++++++ .../src/sound_play/sound_play_plugin.py | 30 ++ .../sound_play/src/sound_play/sound_type.py | 154 ++++++ src/lib/sound_play/test.launch | 9 + src/lib/sound_play/test/CMakeLists.txt | 4 + src/lib/sound_play/test/test.cpp | 147 ++++++ 73 files changed, 4788 insertions(+) create mode 100644 src/lib/.github/labeler.yml create mode 100644 src/lib/.github/workflows/labeler.yml create mode 100644 src/lib/.github/workflows/main.yml create mode 100644 src/lib/.gitignore create mode 100644 src/lib/.gitrepo create mode 100644 src/lib/LICENSE create mode 100644 src/lib/README.md create mode 100644 src/lib/audio_capture/.gitignore create mode 100644 src/lib/audio_capture/CHANGELOG.rst create mode 100644 src/lib/audio_capture/CMakeLists.txt create mode 100644 src/lib/audio_capture/launch/capture.launch create mode 100644 src/lib/audio_capture/launch/capture_to_file.launch create mode 100644 src/lib/audio_capture/launch/capture_wave.launch create mode 100644 src/lib/audio_capture/mainpage.dox create mode 100644 src/lib/audio_capture/package.xml create mode 100644 src/lib/audio_capture/src/audio_capture.cpp create mode 100644 src/lib/audio_common/CHANGELOG.rst create mode 100644 src/lib/audio_common/CMakeLists.txt create mode 100644 src/lib/audio_common/package.xml create mode 100644 src/lib/audio_common_msgs/.gitignore create mode 100644 src/lib/audio_common_msgs/CHANGELOG.rst create mode 100644 src/lib/audio_common_msgs/CMakeLists.txt create mode 100644 src/lib/audio_common_msgs/mainpage.dox create mode 100644 src/lib/audio_common_msgs/msg/AudioData.msg create mode 100644 src/lib/audio_common_msgs/msg/AudioDataStamped.msg create mode 100644 src/lib/audio_common_msgs/msg/AudioInfo.msg create mode 100644 src/lib/audio_common_msgs/package.xml create mode 100644 src/lib/audio_play/.gitignore create mode 100644 src/lib/audio_play/CHANGELOG.rst create mode 100644 src/lib/audio_play/CMakeLists.txt create mode 100644 src/lib/audio_play/launch/play.launch create mode 100644 src/lib/audio_play/launch/record_to_file.launch create mode 100644 src/lib/audio_play/mainpage.dox create mode 100644 src/lib/audio_play/package.xml create mode 100644 src/lib/audio_play/src/audio_play.cpp create mode 100644 src/lib/sound_play/CHANGELOG.rst create mode 100644 src/lib/sound_play/CMakeLists.txt create mode 100644 src/lib/sound_play/README.md create mode 100644 src/lib/sound_play/action/SoundRequest.action create mode 100644 src/lib/sound_play/include/sound_play/sound_play.h create mode 100644 src/lib/sound_play/mainpage.dox create mode 100644 src/lib/sound_play/msg/SoundRequest.msg create mode 100644 src/lib/sound_play/package.xml create mode 100644 src/lib/sound_play/resources/flitevox/.gitignore create mode 100755 src/lib/sound_play/scripts/is_speaking.py create mode 100755 src/lib/sound_play/scripts/play.py create mode 100755 src/lib/sound_play/scripts/playbuiltin.py create mode 100755 src/lib/sound_play/scripts/playpackage.py create mode 100755 src/lib/sound_play/scripts/say.py create mode 100755 src/lib/sound_play/scripts/shutup.py create mode 100755 src/lib/sound_play/scripts/soundclient_example.py create mode 100755 src/lib/sound_play/scripts/soundplay_node.py create mode 100755 src/lib/sound_play/scripts/test.py create mode 100644 src/lib/sound_play/scripts/test/test_sound_client.py create mode 100755 src/lib/sound_play/scripts/test_actionlib_client.py create mode 100644 src/lib/sound_play/setup.py create mode 100644 src/lib/sound_play/sound_play_plugin.yaml create mode 100644 src/lib/sound_play/soundplay_node.launch create mode 100644 src/lib/sound_play/sounds/BACKINGUP.ogg create mode 100644 src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg create mode 100644 src/lib/sound_play/sounds/NEEDS_PLUGGING_BADLY.ogg create mode 100644 src/lib/sound_play/sounds/NEEDS_UNPLUGGING.ogg create mode 100644 src/lib/sound_play/sounds/NEEDS_UNPLUGGING_BADLY.ogg create mode 100644 src/lib/sound_play/sounds/say-beep.wav create mode 100644 src/lib/sound_play/src/sound_play/__init__.py create mode 100644 src/lib/sound_play/src/sound_play/festival_plugin.py create mode 100644 src/lib/sound_play/src/sound_play/flite_plugin.py create mode 100644 src/lib/sound_play/src/sound_play/libsoundplay.py create mode 100644 src/lib/sound_play/src/sound_play/sound_play_plugin.py create mode 100644 src/lib/sound_play/src/sound_play/sound_type.py create mode 100644 src/lib/sound_play/test.launch create mode 100644 src/lib/sound_play/test/CMakeLists.txt create mode 100644 src/lib/sound_play/test/test.cpp diff --git a/src/lib/.github/labeler.yml b/src/lib/.github/labeler.yml new file mode 100644 index 000000000..941f46ff3 --- /dev/null +++ b/src/lib/.github/labeler.yml @@ -0,0 +1,14 @@ +github-action: + - .github/**/* +audio_capture: + - audio_capture/**/* +audio_common: + - audio_common/**/* +audio_common_msgs: + - audio_common_msgs/**/* +audio_play: + - audio_play/**/* +sound_play: + - sound_play/**/* +readme: + - REAEME.md diff --git a/src/lib/.github/workflows/labeler.yml b/src/lib/.github/workflows/labeler.yml new file mode 100644 index 000000000..72e4b415f --- /dev/null +++ b/src/lib/.github/workflows/labeler.yml @@ -0,0 +1,17 @@ +name: "Pull Request Labeler" +on: +- pull_request_target + +permissions: + contents: read + +jobs: + triage: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v3 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/src/lib/.github/workflows/main.yml b/src/lib/.github/workflows/main.yml new file mode 100644 index 000000000..784d44e64 --- /dev/null +++ b/src/lib/.github/workflows/main.yml @@ -0,0 +1,28 @@ +name: ROS1 CI +on: + push: + pull_request: + schedule: + - cron: "0 0 * * *" +jobs: + industrial_ci: + strategy: + matrix: + env: + - ROS_DISTRO: melodic + ROS_REPO: testing + CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Debug' + - ROS_DISTRO: melodic + ROS_REPO: testing + CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Release' + - ROS_DISTRO: noetic + ROS_REPO: testing + CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Debug' + - ROS_DISTRO: noetic + ROS_REPO: testing + CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Release' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: 'ros-industrial/industrial_ci@master' + env: ${{matrix.env}} diff --git a/src/lib/.gitignore b/src/lib/.gitignore new file mode 100644 index 000000000..0d20b6487 --- /dev/null +++ b/src/lib/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/src/lib/.gitrepo b/src/lib/.gitrepo new file mode 100644 index 000000000..4a1cd7989 --- /dev/null +++ b/src/lib/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = git@github.com:ros-drivers/audio_common.git + branch = master + commit = 6a84996653eada328f6ea7b14e1804e9876aa3af + parent = 47da9a5c909072613a4b43ac0ff2f2368e4d2048 + method = merge + cmdver = 0.4.9 diff --git a/src/lib/LICENSE b/src/lib/LICENSE new file mode 100644 index 000000000..c319170e5 --- /dev/null +++ b/src/lib/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2009, Willow Garage, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/lib/README.md b/src/lib/README.md new file mode 100644 index 000000000..29b0ea27b --- /dev/null +++ b/src/lib/README.md @@ -0,0 +1,37 @@ +# ROS audio\_common Package + +[![ROS1 CI](https://github.com/ros-drivers/audio_common/actions/workflows/main.yml/badge.svg)](https://github.com/ros-drivers/audio_common/actions/workflows/main.yml) +[![ROS2 CI](https://github.com/ros-drivers/audio_common/actions/workflows/ros2.yml/badge.svg)](https://github.com/ros-drivers/audio_common/actions/workflows/ros2.yml) + +This repository contains the ROS audio\_common package. + +For user documentation, please refer to the [ROS Wiki page for audio\_common](http://wiki.ros.org/audio_common) + +## Deb Build Status + +| Package | Melodic (Bionic) | Noetic (Focal) | Noetic (Buster) | +|:---------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| audio_common (arm64) | [![Build Status](http://build.ros.org/job/Mbin_ubv8_uBv8__audio_common__ubuntu_bionic_arm64__binary/badge/icon)](http://build.ros.org/job/Mbin_ubv8_uBv8__audio_common__ubuntu_bionic_arm64__binary) | [![Build Status](http://build.ros.org/job/Nbin_ufv8_uFv8__audio_common__ubuntu_focal_arm64__binary/badge/icon)](http://build.ros.org/job/Nbin_ufv8_uFv8__audio_common__ubuntu_focal_arm64__binary) | [![Build Status](http://build.ros.org/job/Nbin_dbv8_dBv8__audio_common__debian_buster_arm64__binary/badge/icon)](http://build.ros.org/job/Nbin_dbv8_dBv8__audio_common__debian_buster_arm64__binary) | +| audio_common (armhf) | [![Build Status](http://build.ros.org/job/Mbin_ubhf_uBhf__audio_common__ubuntu_bionic_armhf__binary/badge/icon)](http://build.ros.org/job/Mbin_ubhf_uBhf__audio_common__ubuntu_bionic_armhf__binary) | [![Build Status](http://build.ros.org/job/Nbin_ufhf_uFhf__audio_common__ubuntu_focal_armhf__binary/badge/icon)](http://build.ros.org/job/Nbin_ufhf_uFhf__audio_common__ubuntu_focal_armhf__binary) | --- | +| audio_common (i386) | --- | --- | --- | +| audio_common (amd64) | [![Build Status](http://build.ros.org/job/Mbin_uB64__audio_common__ubuntu_bionic_amd64__binary/badge/icon)](http://build.ros.org/job/Mbin_uB64__audio_common__ubuntu_bionic_amd64__binary) | [![Build Status](http://build.ros.org/job/Nbin_uF64__audio_common__ubuntu_focal_amd64__binary/badge/icon)](http://build.ros.org/job/Nbin_uF64__audio_common__ubuntu_focal_amd64__binary) | [![Build Status](http://build.ros.org/job/Nbin_db_dB64__audio_common__debian_buster_amd64__binary/badge/icon)](http://build.ros.org/job/Nbin_db_dB64__audio_common__debian_buster_amd64__binary) | + +## ROS1 source build + +On ROS Kinetic, Melodic and Noetic, the [master](https://github.com/ros-drivers/audio_common/tree/master) branch is recommended. + +## ROS2 source build + +On ROS2, the [ros2](https://github.com/ros-drivers/audio_common/tree/ros2) branch is recommended + +## Development, Branch and Release Policy + +The `master` branch is currently considered the development branch, and is released into ROS Kinetic, Melodic and Noetic with version numbers in the 0.3.x range. +`master` is accepting new, non-breaking features and bug fixes. + +Large, breaking changes such as changes to dependencies or the package API will be considered, +but they will probably be staged into a development branch for release into the next major release of ROS (ROS L) + +## Support + +Please ask support questions on [ROS Answers](http://answers.ros.org/questions/). diff --git a/src/lib/audio_capture/.gitignore b/src/lib/audio_capture/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/src/lib/audio_capture/.gitignore @@ -0,0 +1 @@ +build diff --git a/src/lib/audio_capture/CHANGELOG.rst b/src/lib/audio_capture/CHANGELOG.rst new file mode 100644 index 000000000..799d52b16 --- /dev/null +++ b/src/lib/audio_capture/CHANGELOG.rst @@ -0,0 +1,220 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package audio_capture +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +0.3.18 (2024-08-13) +------------------- + +0.3.17 (2023-06-08) +------------------- +* Merge pull request `#220 `_ from v4hn/master +* on real systems publish system clock time in capture node +* The capture node is hard-coded to alsasrc +* Contributors: Shingo Kitagawa, v4hn + +0.3.16 (2022-12-23) +------------------- +* Merge pull request `#204 `_ from knorth55/audio-capture-stamped +* add todo comment +* publish audio stamped in audio_capture.cpp +* Merge pull request `#216 `_ from knorth55/launch-update +* update audio_capture launch +* Contributors: Shingo Kitagawa + +0.3.15 (2022-08-29) +------------------- + +0.3.14 (2022-08-18) +------------------- + +0.3.13 (2022-04-07) +------------------- + +0.3.12 (2021-09-01) +------------------- +* Merge branch 'master' into master +* Contributors: Shingo Kitagawa + +0.3.11 (2021-04-08) +------------------- + +0.3.10 (2021-01-07) +------------------- +* add bitrate in capture launch +* [audio_capture] Publish audio info once before publishing /audio +* Contributors: Naoya Yamaguchi, Shingo Kitagawa + +0.3.9 (2020-10-22) +------------------ +* Merge pull request `#160 `_ from knorth55/add-device-play +* use ROS_INFO instead of printf +* Contributors: Shingo Kitagawa + +0.3.8 (2020-09-13) +------------------ + +0.3.7 (2020-08-08) +------------------ +* Merge pull request `#150 `_ from sktometometo/fix_mp3_options + Fix property of lamemp3enc element in audio_capture so that the bitrate parameter work properly. +* fix property of lamemp3enc element so that it will use the specified bitrate +* Merge pull request `#146 `_ from knorth55/mp3-support +* use space instead of tab +* use same caps +* support channls for mp3 +* Merge pull request `#145 `_ from knorth55/mp3-channel-rate + [audio_capture] add sample_format in audio_capture +* Merge pull request `#147 `_ from knorth55/fix-filesink + [audio_capture] fix filesink for wave format +* add sample_format arg in capture_to_file.launch +* fix filesink for wave format +* add sample_format in audio_capture +* Contributors: Koki Shinjo, Shingo Kitagawa + +0.3.6 (2020-05-29) +------------------ +* Merge pull request `#141 `_ from knorth55/add-maintainer + add maintainer +* add maintainer +* Contributors: Shingo Kitagawa + +0.3.5 (2020-04-28) +------------------ + +0.3.4 (2020-04-02) +------------------ +* Merge branch 'master' of github.com:ros-drivers/audio_common +* Contributors: Gerard Canal + +0.3.3 (2018-05-22) +------------------ + +0.3.2 (2018-05-02) +------------------ +* [sound_play] add option to select audio device to play / record (`#87 `_) + * [sound_play] add option to select audio device to play + * [sound_play] reformat README to markdown; add usage to set device via rosparam + * audio_capture: add option for selecting device to use + * audio_play: add option to select device for playing audio + * add device argument to launch files + Conflicts: + audio_capture/launch/capture.launch + audio_capture/launch/capture_to_file.launch + audio_capture/src/audio_capture.cpp + audio_play/launch/play.launch + sound_play/scripts/soundplay_node.py +* Merge pull request `#102 `_ from EndPointCorp/fix_capture_leak + Fix audio_capture leak +* Fix audio_capture sample/buffer leak +* Merge pull request `#90 `_ from prarobo/master + Error checking code and improvements to launch files +* Bug fix +* fix(audio_capture): capturing wave using gst1.0 + 0.10-style raw audio caps were being created, according to GStreamer warning. Should be audio/x-raw,format=(string).. now. +* Merge pull request `#1 `_ from prarobo/fixes + Error checking code and improvements to launch files +* Removed default device +* Added error checking code +* Added parameters to launch files +* Contributors: Austin, Matt Vollrath, Prasanna Kannappan, Rokus, Yuki Furuta, prarobo + +0.3.1 (2016-08-28) +------------------ +* Update to new gstreamer rosdeps +* #70 can launch these in different namespaces with different microphones, and both are operating. +* #70 can switch between different microphones, but the first microphone doesn't like the hw:1, it only works with device:="" - so must be doing something wrong still. +* Add changelogs +* [audio_capture] add error handler +* [audio_capture] add option to publish captured audio data as wav format + Conflicts: + audio_capture/src/audio_capture.cpp +* Fixed memory leak (see #18). +* Removed trailing whitespace. +* Fixed problem that CMake uses gstreamer-0.1 instead of gstreamer-1.0 +* Added gstreamer 1.0 dependecies +* Ported to gstreamer 1.0 + package.xml dependencies still missing +* Update maintainer email +* Contributors: Benny, Felix Duvallet, Furushchev, Lucas Walter, trainman419 + +0.2.11 (2016-02-16) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.10 (2016-01-21) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.9 (2015-12-02) +------------------ +* Add changelogs +* [audio_capture] add error handler +* [audio_capture] add option to publish captured audio data as wav format +* Fixed memory leak (see `#18 `_). +* Removed trailing whitespace. +* Contributors: Felix Duvallet, Furushchev, trainman419 + +0.2.8 (2015-10-02) +------------------ +* Update maintainer email +* Contributors: trainman419 + +0.2.7 (2014-07-25) +------------------ +* audio_capture.cpp has to wait for generated AudioData headers +* Contributors: v4hn + +0.2.6 (2014-02-26) +------------------ +* audio_capture and play _require\_ gstreamer, it's not optional +* Contributors: v4hn + +0.2.5 (2014-01-23) +------------------ +* "0.2.5" +* Contributors: trainman419 + +0.2.4 (2013-09-10) +------------------ +* Update CMakeLists.txt +* audio_capture: install launchfiles +* Contributors: David Gossow + +0.2.3 (2013-07-15) +------------------ +* Fix install rule for audio_capture. +* Contributors: Austin Hendrix + +0.2.2 (2013-04-10) +------------------ + +0.2.1 (2013-04-08 13:59) +------------------------ + +0.2.0 (2013-04-08 13:49) +------------------------ +* Finish catkinizing audio_common. +* Catkinize audio_play. +* Catkinize audio_capture. +* Fix typo in package.xml +* Versions and more URLs. +* Convert manifests to package.xml +* Convert audio_capture manifest to package.xml +* Ditch old makefiles. +* Updates manifest +* Updated manifests for rodep2 +* oneiric build fixes, bump version to 0.1.6 +* Removed redundant thread::thread +* Added a rosdep.yaml file +* Fixed to use audio_common_msgs +* Added ability to use different festival voices +* Updated documentation +* Added ability to capture to file +* Fixed ignore files +* Added hgignore files +* Audio_capture and audio_play working +* Making separate audio_capture and audio_play packages +* Moved audio_transport to audio_capture +* Contributors: Austin Hendrix, Brian Gerkey, Nate Koenig, nkoenig diff --git a/src/lib/audio_capture/CMakeLists.txt b/src/lib/audio_capture/CMakeLists.txt new file mode 100644 index 000000000..0bc0b116c --- /dev/null +++ b/src/lib/audio_capture/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(audio_capture) + +find_package(catkin REQUIRED COMPONENTS roscpp audio_common_msgs) + +find_package(PkgConfig) +pkg_check_modules(GST1.0 gstreamer-1.0 REQUIRED) + +find_package(Boost REQUIRED COMPONENTS thread) + +include_directories(${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GST1.0_INCLUDE_DIRS}) + +catkin_package() + +add_executable(audio_capture src/audio_capture.cpp) +target_link_libraries(audio_capture ${catkin_LIBRARIES} ${GST1.0_LIBRARIES} ${Boost_LIBRARIES}) +add_dependencies(audio_capture ${catkin_EXPORTED_TARGETS}) + +install(TARGETS audio_capture + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) + +install(DIRECTORY launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) diff --git a/src/lib/audio_capture/launch/capture.launch b/src/lib/audio_capture/launch/capture.launch new file mode 100644 index 000000000..6495bb214 --- /dev/null +++ b/src/lib/audio_capture/launch/capture.launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/audio_capture/launch/capture_to_file.launch b/src/lib/audio_capture/launch/capture_to_file.launch new file mode 100644 index 000000000..d81ef6534 --- /dev/null +++ b/src/lib/audio_capture/launch/capture_to_file.launch @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/audio_capture/launch/capture_wave.launch b/src/lib/audio_capture/launch/capture_wave.launch new file mode 100644 index 000000000..5daf779c9 --- /dev/null +++ b/src/lib/audio_capture/launch/capture_wave.launch @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/audio_capture/mainpage.dox b/src/lib/audio_capture/mainpage.dox new file mode 100644 index 000000000..4733f766e --- /dev/null +++ b/src/lib/audio_capture/mainpage.dox @@ -0,0 +1,21 @@ +/** +\mainpage +\htmlinclude manifest.html + +\b audio_capture is a package that records audio from a microphone and makes it available to other ROS nodes. + +\section codeapi Code API + + + + +*/ diff --git a/src/lib/audio_capture/package.xml b/src/lib/audio_capture/package.xml new file mode 100644 index 000000000..d517ef4b5 --- /dev/null +++ b/src/lib/audio_capture/package.xml @@ -0,0 +1,31 @@ + + audio_capture + 0.3.18 + + Transports audio from a source to a destination. Audio sources can come + from a microphone or file. The destination can play the audio or save it + to an mp3 file. + + Austin Hendrix + Shingo Kitagawa + Nate Koenig + BSD + http://ros.org/wiki/audio_capture + https://github.com/ros-drivers/audio_common + https://github.com/ros-drivers/audio_common/issues + + catkin + + roscpp + audio_common_msgs + libgstreamer1.0-dev + libgstreamer-plugins-base1.0-dev + + roscpp + audio_common_msgs + gstreamer1.0 + gstreamer1.0-alsa + gstreamer1.0-plugins-base + gstreamer1.0-plugins-good + gstreamer1.0-plugins-ugly + diff --git a/src/lib/audio_capture/src/audio_capture.cpp b/src/lib/audio_capture/src/audio_capture.cpp new file mode 100644 index 000000000..0ef67a878 --- /dev/null +++ b/src/lib/audio_capture/src/audio_capture.cpp @@ -0,0 +1,263 @@ +#include +#include +#include +#include + +#include + +#include "audio_common_msgs/AudioData.h" +#include "audio_common_msgs/AudioDataStamped.h" +#include "audio_common_msgs/AudioInfo.h" + +namespace audio_transport +{ + class RosGstCapture + { + public: + RosGstCapture() + { + _bitrate = 192; + + std::string dst_type; + + // Need to encoding or publish raw wave data + ros::param::param("~format", _format, "mp3"); + ros::param::param("~sample_format", _sample_format, "S16LE"); + + // The bitrate at which to encode the audio + ros::param::param("~bitrate", _bitrate, 192); + + // only available for raw data + ros::param::param("~channels", _channels, 1); + ros::param::param("~depth", _depth, 16); + ros::param::param("~sample_rate", _sample_rate, 16000); + + // The destination of the audio + ros::param::param("~dst", dst_type, "appsink"); + + // The source of the audio + //ros::param::param("~src", source_type, "alsasrc"); + std::string device; + ros::param::param("~device", device, ""); + + _pub = _nh.advertise("audio", 10, true); + _pub_stamped = _nh.advertise("audio_stamped", 10, true); + _pub_info = _nh.advertise("audio_info", 1, true); + + _loop = g_main_loop_new(NULL, false); + _pipeline = gst_pipeline_new("ros_pipeline"); + GstClock *clock = gst_system_clock_obtain(); + g_object_set(clock, "clock-type", GST_CLOCK_TYPE_REALTIME, NULL); + gst_pipeline_use_clock(GST_PIPELINE_CAST(_pipeline), clock); + gst_object_unref(clock); + + _bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline)); + gst_bus_add_signal_watch(_bus); + g_signal_connect(_bus, "message::error", + G_CALLBACK(onMessage), this); + g_object_unref(_bus); + + // We create the sink first, just for convenience + if (dst_type == "appsink") + { + _sink = gst_element_factory_make("appsink", "sink"); + g_object_set(G_OBJECT(_sink), "emit-signals", true, NULL); + g_object_set(G_OBJECT(_sink), "max-buffers", 100, NULL); + g_signal_connect( G_OBJECT(_sink), "new-sample", + G_CALLBACK(onNewBuffer), this); + } + else + { + ROS_INFO("file sink to %s", dst_type.c_str()); + _sink = gst_element_factory_make("filesink", "sink"); + g_object_set( G_OBJECT(_sink), "location", dst_type.c_str(), NULL); + } + + _source = gst_element_factory_make("alsasrc", "source"); + // if device isn't specified, it will use the default which is + // the alsa default source. + // A valid device will be of the foram hw:0,0 with other numbers + // than 0 and 0 as are available. + if (device != "") + { + // ghcar *gst_device = device.c_str(); + g_object_set(G_OBJECT(_source), "device", device.c_str(), NULL); + } + + GstCaps *caps; + caps = gst_caps_new_simple("audio/x-raw", + "format", G_TYPE_STRING, _sample_format.c_str(), + "channels", G_TYPE_INT, _channels, + "width", G_TYPE_INT, _depth, + "depth", G_TYPE_INT, _depth, + "rate", G_TYPE_INT, _sample_rate, + "signed", G_TYPE_BOOLEAN, TRUE, + NULL); + + gboolean link_ok; + if (_format == "mp3"){ + _filter = gst_element_factory_make("capsfilter", "filter"); + g_object_set( G_OBJECT(_filter), "caps", caps, NULL); + gst_caps_unref(caps); + + _convert = gst_element_factory_make("audioconvert", "convert"); + if (!_convert) { + ROS_ERROR_STREAM("Failed to create audioconvert element"); + exitOnMainThread(1); + } + + _encode = gst_element_factory_make("lamemp3enc", "encoder"); + if (!_encode) { + ROS_ERROR_STREAM("Failed to create encoder element"); + exitOnMainThread(1); + } + g_object_set( G_OBJECT(_encode), "target", 1, NULL); + g_object_set( G_OBJECT(_encode), "bitrate", _bitrate, NULL); + + gst_bin_add_many( GST_BIN(_pipeline), _source, _filter, _convert, _encode, _sink, NULL); + link_ok = gst_element_link_many(_source, _filter, _convert, _encode, _sink, NULL); + } else if (_format == "wave") { + if (dst_type == "appsink") { + g_object_set( G_OBJECT(_sink), "caps", caps, NULL); + gst_caps_unref(caps); + gst_bin_add_many( GST_BIN(_pipeline), _source, _sink, NULL); + link_ok = gst_element_link_many( _source, _sink, NULL); + } else { + _filter = gst_element_factory_make("wavenc", "filter"); + gst_bin_add_many( GST_BIN(_pipeline), _source, _filter, _sink, NULL); + link_ok = gst_element_link_many( _source, _filter, _sink, NULL); + } + } else { + ROS_ERROR_STREAM("format must be \"wave\" or \"mp3\""); + exitOnMainThread(1); + } + /*} + else + { + _sleep_time = 10000; + _source = gst_element_factory_make("filesrc", "source"); + g_object_set(G_OBJECT(_source), "location", source_type.c_str(), NULL); + + gst_bin_add_many( GST_BIN(_pipeline), _source, _sink, NULL); + gst_element_link_many(_source, _sink, NULL); + } + */ + + if (!link_ok) { + ROS_ERROR_STREAM("Unsupported media type."); + exitOnMainThread(1); + } + + gst_element_set_state(GST_ELEMENT(_pipeline), GST_STATE_PLAYING); + + _gst_thread = boost::thread( boost::bind(g_main_loop_run, _loop) ); + + audio_common_msgs::AudioInfo info_msg; + info_msg.channels = _channels; + info_msg.sample_rate = _sample_rate; + info_msg.sample_format = _sample_format; + info_msg.bitrate = _bitrate; + info_msg.coding_format = _format; + _pub_info.publish(info_msg); + } + + ~RosGstCapture() + { + g_main_loop_quit(_loop); + gst_element_set_state(_pipeline, GST_STATE_NULL); + gst_object_unref(_pipeline); + g_main_loop_unref(_loop); + } + + void exitOnMainThread(int code) + { + exit(code); + } + + void publish( const audio_common_msgs::AudioData &msg ) + { + _pub.publish(msg); + } + + void publishStamped( const audio_common_msgs::AudioDataStamped &msg ) + { + _pub_stamped.publish(msg); + } + + static GstFlowReturn onNewBuffer (GstAppSink *appsink, gpointer userData) + { + audio_common_msgs::AudioData msg; + audio_common_msgs::AudioDataStamped stamped_msg; + + RosGstCapture *server = reinterpret_cast(userData); + GstMapInfo map; + + GstSample *sample; + g_signal_emit_by_name(appsink, "pull-sample", &sample); + + GstBuffer *buffer = gst_sample_get_buffer(sample); + + if( ros::Time::isSimTime() ) + { + stamped_msg.header.stamp = ros::Time::now(); + } + else + { + GstClockTime buffer_time = gst_element_get_base_time(server->_source)+GST_BUFFER_PTS(buffer); + stamped_msg.header.stamp.fromNSec(buffer_time); + } + + gst_buffer_map(buffer, &map, GST_MAP_READ); + msg.data.resize( map.size ); + + memcpy( &msg.data[0], map.data, map.size ); + stamped_msg.audio = msg; + + gst_buffer_unmap(buffer, &map); + gst_sample_unref(sample); + + server->publish(msg); + server->publishStamped(stamped_msg); + + return GST_FLOW_OK; + } + + static gboolean onMessage (GstBus *bus, GstMessage *message, gpointer userData) + { + RosGstCapture *server = reinterpret_cast(userData); + GError *err; + gchar *debug; + + gst_message_parse_error(message, &err, &debug); + ROS_ERROR_STREAM("gstreamer: " << err->message); + g_error_free(err); + g_free(debug); + g_main_loop_quit(server->_loop); + server->exitOnMainThread(1); + return FALSE; + } + + private: + ros::NodeHandle _nh; + ros::Publisher _pub; + ros::Publisher _pub_stamped; + ros::Publisher _pub_info; + + boost::thread _gst_thread; + + GstElement *_pipeline, *_source, *_filter, *_sink, *_convert, *_encode; + GstBus *_bus; + int _bitrate, _channels, _depth, _sample_rate; + GMainLoop *_loop; + std::string _format, _sample_format; + }; +} + +int main (int argc, char **argv) +{ + ros::init(argc, argv, "audio_capture"); + gst_init(&argc, &argv); + + audio_transport::RosGstCapture server; + ros::spin(); +} diff --git a/src/lib/audio_common/CHANGELOG.rst b/src/lib/audio_common/CHANGELOG.rst new file mode 100644 index 000000000..638153081 --- /dev/null +++ b/src/lib/audio_common/CHANGELOG.rst @@ -0,0 +1,120 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package audio_common +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +0.3.18 (2024-08-13) +------------------- + +0.3.17 (2023-06-08) +------------------- + +0.3.16 (2022-12-23) +------------------- + +0.3.15 (2022-08-29) +------------------- + +0.3.14 (2022-08-18) +------------------- + +0.3.13 (2022-04-07) +------------------- + +0.3.12 (2021-09-01) +------------------- +* Merge branch 'master' into master +* Contributors: Shingo Kitagawa + +0.3.11 (2021-04-08) +------------------- + +0.3.10 (2021-01-07) +------------------- + +0.3.9 (2020-10-22) +------------------ + +0.3.8 (2020-09-13) +------------------ + +0.3.7 (2020-08-08) +------------------ + +0.3.6 (2020-05-29) +------------------ +* Merge pull request `#141 `_ from knorth55/add-maintainer + add maintainer +* add maintainer +* Contributors: Shingo Kitagawa + +0.3.5 (2020-04-28) +------------------ + +0.3.4 (2020-04-02) +------------------ +* Merge branch 'master' of github.com:ros-drivers/audio_common +* Contributors: Gerard Canal + +0.3.3 (2018-05-22) +------------------ + +0.3.2 (2018-05-02) +------------------ + +0.3.1 (2016-08-28) +------------------ +* Add changelogs +* Update maintainer email +* Contributors: trainman419 + +0.2.11 (2016-02-16) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.10 (2016-01-21) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.9 (2015-12-02) +------------------ +* Add changelogs +* Contributors: trainman419 + +0.2.8 (2015-10-02) +------------------ +* Update maintainer email +* Contributors: trainman419 + +0.2.7 (2014-07-25) +------------------ + +0.2.6 (2014-02-26) +------------------ + +0.2.5 (2014-01-23) +------------------ +* "0.2.5" +* Contributors: trainman419 + +0.2.4 (2013-09-10) +------------------ + +0.2.3 (2013-07-15) +------------------ + +0.2.2 (2013-04-10) +------------------ + +0.2.1 (2013-04-08 13:59) +------------------------ +* Fix metapackage for REP 127. +* Contributors: Austin Hendrix + +0.2.0 (2013-04-08 13:49) +------------------------ +* Versions and more URLs. +* Convert stack.xml to metapackage package.xml +* Start catkinizing. +* Contributors: Austin Hendrix diff --git a/src/lib/audio_common/CMakeLists.txt b/src/lib/audio_common/CMakeLists.txt new file mode 100644 index 000000000..d0f5151e0 --- /dev/null +++ b/src/lib/audio_common/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8.3) +project(audio_common) +find_package(catkin REQUIRED) +catkin_metapackage() diff --git a/src/lib/audio_common/package.xml b/src/lib/audio_common/package.xml new file mode 100644 index 000000000..f82716434 --- /dev/null +++ b/src/lib/audio_common/package.xml @@ -0,0 +1,25 @@ + + audio_common + 0.3.18 + + Common code for working with audio in ROS + + Austin Hendrix + Shingo Kitagawa + Blaise Gassend + BSD + http://ros.org/wiki/audio_common + https://github.com/ros-drivers/audio_common + https://github.com/ros-drivers/audio_common/issues + + catkin + + audio_capture + audio_common_msgs + audio_play + sound_play + + + + + diff --git a/src/lib/audio_common_msgs/.gitignore b/src/lib/audio_common_msgs/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/src/lib/audio_common_msgs/.gitignore @@ -0,0 +1 @@ +build diff --git a/src/lib/audio_common_msgs/CHANGELOG.rst b/src/lib/audio_common_msgs/CHANGELOG.rst new file mode 100644 index 000000000..27f3a76bd --- /dev/null +++ b/src/lib/audio_common_msgs/CHANGELOG.rst @@ -0,0 +1,127 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package audio_common_msgs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +0.3.18 (2024-08-13) +------------------- + +0.3.17 (2023-06-08) +------------------- + +0.3.16 (2022-12-23) +------------------- +* Merge pull request `#202 `_ from knorth55/audio-stamped-msg +* add AudioDataStamped.msg +* Contributors: Shingo Kitagawa + +0.3.15 (2022-08-29) +------------------- + +0.3.14 (2022-08-18) +------------------- + +0.3.13 (2022-04-07) +------------------- + +0.3.12 (2021-09-01) +------------------- +* Merge branch 'master' into master +* Contributors: Shingo Kitagawa + +0.3.11 (2021-04-08) +------------------- + +0.3.10 (2021-01-07) +------------------- +* Change comment style in AudioInfo.msg +* [audio_common_msgs] AudioInfo.msg to add audio meta data +* Contributors: Naoya Yamaguchi + +0.3.9 (2020-10-22) +------------------ + +0.3.8 (2020-09-13) +------------------ + +0.3.7 (2020-08-08) +------------------ + +0.3.6 (2020-05-29) +------------------ +* Merge pull request `#141 `_ from knorth55/add-maintainer + add maintainer +* add maintainer +* Contributors: Shingo Kitagawa + +0.3.5 (2020-04-28) +------------------ + +0.3.4 (2020-04-02) +------------------ +* Merge branch 'master' of github.com:ros-drivers/audio_common +* Contributors: Gerard Canal + +0.3.3 (2018-05-22) +------------------ + +0.3.2 (2018-05-02) +------------------ + +0.3.1 (2016-08-28) +------------------ +* Add changelogs +* Update maintainer email +* Contributors: trainman419 + +0.2.11 (2016-02-16) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.10 (2016-01-21) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.9 (2015-12-02) +------------------ +* Add changelogs +* Contributors: trainman419 + +0.2.8 (2015-10-02) +------------------ +* Update maintainer email +* Contributors: trainman419 + +0.2.7 (2014-07-25) +------------------ + +0.2.6 (2014-02-26) +------------------ + +0.2.5 (2014-01-23) +------------------ +* "0.2.5" +* Contributors: trainman419 + +0.2.4 (2013-09-10) +------------------ + +0.2.3 (2013-07-15) +------------------ + +0.2.2 (2013-04-10) +------------------ + +0.2.1 (2013-04-08 13:59) +------------------------ + +0.2.0 (2013-04-08 13:49) +------------------------ +* Catkinize audio_common_msgs. +* Versions and more URLs. +* Convert manifests to package.xml +* Ditch old makefiles. +* Fixed audio_msgs names to audio_common_msgs +* Renamed audio_msgs to audio_common_msgs +* Contributors: Austin Hendrix, Nate Koenig diff --git a/src/lib/audio_common_msgs/CMakeLists.txt b/src/lib/audio_common_msgs/CMakeLists.txt new file mode 100644 index 000000000..3b06fdb6d --- /dev/null +++ b/src/lib/audio_common_msgs/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(audio_common_msgs) + +find_package(catkin REQUIRED + COMPONENTS + message_generation + std_msgs +) + +add_message_files(DIRECTORY msg FILES + AudioData.msg + AudioDataStamped.msg + AudioInfo.msg + ) + +generate_messages( + DEPENDENCIES + std_msgs +) + +catkin_package(CATKIN_DEPENDS message_runtime) diff --git a/src/lib/audio_common_msgs/mainpage.dox b/src/lib/audio_common_msgs/mainpage.dox new file mode 100644 index 000000000..24249e466 --- /dev/null +++ b/src/lib/audio_common_msgs/mainpage.dox @@ -0,0 +1,11 @@ +/** +\mainpage +\htmlinclude manifest.html + +\b audio_common_msgs contain messages for transimitting audio via ROS. + + +\section codeapi Code API + + +*/ diff --git a/src/lib/audio_common_msgs/msg/AudioData.msg b/src/lib/audio_common_msgs/msg/AudioData.msg new file mode 100644 index 000000000..dd2331bbe --- /dev/null +++ b/src/lib/audio_common_msgs/msg/AudioData.msg @@ -0,0 +1 @@ +uint8[] data diff --git a/src/lib/audio_common_msgs/msg/AudioDataStamped.msg b/src/lib/audio_common_msgs/msg/AudioDataStamped.msg new file mode 100644 index 000000000..30e7e2b16 --- /dev/null +++ b/src/lib/audio_common_msgs/msg/AudioDataStamped.msg @@ -0,0 +1,2 @@ +std_msgs/Header header +audio_common_msgs/AudioData audio diff --git a/src/lib/audio_common_msgs/msg/AudioInfo.msg b/src/lib/audio_common_msgs/msg/AudioInfo.msg new file mode 100644 index 000000000..ca4b55e34 --- /dev/null +++ b/src/lib/audio_common_msgs/msg/AudioInfo.msg @@ -0,0 +1,12 @@ +# This message contains the audio meta data + +# Number of channels +uint8 channels +# Sampling rate [Hz] +uint32 sample_rate +# Audio format (e.g. S16LE) +string sample_format +# Amount of audio data per second [bits/s] +uint32 bitrate +# Audio coding format (e.g. WAVE, MP3) +string coding_format diff --git a/src/lib/audio_common_msgs/package.xml b/src/lib/audio_common_msgs/package.xml new file mode 100644 index 000000000..75c129679 --- /dev/null +++ b/src/lib/audio_common_msgs/package.xml @@ -0,0 +1,22 @@ + + audio_common_msgs + 0.3.18 + + Messages for transmitting audio via ROS + + Austin Hendrix + Shingo Kitagawa + Nate Koenig + BSD + http://ros.org/wiki/audio_common_msgs + https://github.com/ros-drivers/audio_common + https://github.com/ros-drivers/audio_common/issues + + catkin + + message_generation + std_msgs + + message_runtime + std_msgs + diff --git a/src/lib/audio_play/.gitignore b/src/lib/audio_play/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/src/lib/audio_play/.gitignore @@ -0,0 +1 @@ +build diff --git a/src/lib/audio_play/CHANGELOG.rst b/src/lib/audio_play/CHANGELOG.rst new file mode 100644 index 000000000..2f1e56a42 --- /dev/null +++ b/src/lib/audio_play/CHANGELOG.rst @@ -0,0 +1,217 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package audio_play +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +0.3.18 (2024-08-13) +------------------- +* Merge pull request `#238 `_ from Kanazawanaoaki/add-record-to-file-launch +* Add record to file launch +* Contributors: Kanazawanaoaki, Shingo Kitagawa + +0.3.17 (2023-06-08) +------------------- + +0.3.16 (2022-12-23) +------------------- +* Merge pull request `#216 `_ from knorth55/launch-update +* update play.launch +* Merge pull request `#206 `_ from knorth55/fix-205 +* unref buffer in audio_play to avoid memory leak +* Contributors: Shingo Kitagawa + +0.3.15 (2022-08-29) +------------------- + +0.3.14 (2022-08-18) +------------------- + +0.3.13 (2022-04-07) +------------------- +* Merge pull request `#179 `_ from tkmtnt7000/PR-remap-audio-topic +* audio_play: add audio_topic option +* Contributors: Naoto Tsukamoto, Shingo Kitagawa + +0.3.12 (2021-09-01) +------------------- +* Merge branch 'master' into master +* Contributors: Shingo Kitagawa + +0.3.11 (2021-04-08) +------------------- + +0.3.10 (2021-01-07) +------------------- + +0.3.9 (2020-10-22) +------------------ +* Merge pull request `#160 `_ from knorth55/add-device-play +* refactor audio_play to use same code +* add audioresample in audio_play +* apply caps for both formats +* add device for wave format +* add sync false for alsasink +* use alsasink +* add depth rosparam +* add device arg in play.launch +* fix audio_play to save file +* Contributors: Shingo Kitagawa + +0.3.8 (2020-09-13) +------------------ +* Merge pull request `#151 `_ from knorth55/do-timestamp-false + [audio_play] set do_timestamp false +* set do_timestamp false +* Contributors: Shingo Kitagawa + +0.3.7 (2020-08-08) +------------------ +* Merge pull request `#146 `_ from knorth55/mp3-support +* support format, rate, channels in mp3 +* Merge pull request `#127 `_ from knorth55/audio-play-wave + [audio_play] support wave format +* add sample_format param in audio_play +* add channels and sample_rate in audio_play/play.launch +* add channels and sample_rate in audio_play.cpp +* add format arg in play.launch +* support wave in audio_play +* Merge pull request `#144 `_ from ros-drivers/knorth55-patch-1 +* add gstreamer1.0-alsa for run_depend in audio_play +* Contributors: Shingo Kitagawa + +0.3.6 (2020-05-29) +------------------ +* Merge pull request `#141 `_ from knorth55/add-maintainer + add maintainer +* add maintainer +* Contributors: Shingo Kitagawa + +0.3.5 (2020-04-28) +------------------ + +0.3.4 (2020-04-02) +------------------ +* audio_play fix for reproducing livestream sound (`#122 `_) + * Added capability to read from a udpsrc. To generalize it, possibly similarly to gscam. + * Added parameter to control do-timestamp, as this fixes the problem with audio_play not being able to play livestream sound. + * Aligning with the base master, removing the changes from the branch that included the udpsrc. + Co-authored-by: Alberto Quattrini Li +* Merge branch 'master' of github.com:ros-drivers/audio_common +* Contributors: Alberto Quattrini Li, Gerard Canal + +0.3.3 (2018-05-22) +------------------ + +0.3.2 (2018-05-02) +------------------ +* [sound_play] add option to select audio device to play / record (`#87 `_) + * [sound_play] add option to select audio device to play + * [sound_play] reformat README to markdown; add usage to set device via rosparam + * audio_capture: add option for selecting device to use + * audio_play: add option to select device for playing audio + * add device argument to launch files + Conflicts: + audio_capture/launch/capture.launch + audio_capture/launch/capture_to_file.launch + audio_capture/src/audio_capture.cpp + audio_play/launch/play.launch + sound_play/scripts/soundplay_node.py +* Merge pull request `#101 `_ from EndPointCorp/audio_play_dont_pause_pipeline + audio_play: Fix mp3 clip overlap by never pausing the pipeline +* audio_play: Don't pause the pipeline + This prevents glitches when playing short mp3 clips. +* Merge pull request `#90 `_ from prarobo/master + Error checking code and improvements to launch files +* Merge pull request `#1 `_ from prarobo/fixes + Error checking code and improvements to launch files +* Added parameters to launch files +* Contributors: Austin, Matt Vollrath, Prasanna Kannappan, Yuki Furuta, prarobo + +0.3.1 (2016-08-28) +------------------ +* Update to new gstreamer rosdeps +* #70 can launch these in different namespaces with different microphones, and both are operating. +* Add changelogs +* Changed message level to warning +* Fixed problem that CMake uses gstreamer-0.1 instead of gstreamer-1.0 +* Fixed underflow. + Before the sink buffer underflows the pipeline is paused. When data is received again the pipeline is set to playing again. +* Added gstreamer 1.0 dependecies +* Ported to gstreamer 1.0 + package.xml dependencies still missing +* Change audio sink to autoaudiosink +* Update maintainer email +* Contributors: Benny, Hans Gaiser, Lucas Walter, trainman419 + +0.2.11 (2016-02-16) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.10 (2016-01-21) +------------------- +* Add changelogs +* Contributors: trainman419 + +0.2.9 (2015-12-02) +------------------ +* Add changelogs +* Contributors: trainman419 + +0.2.8 (2015-10-02) +------------------ +* Changed message level to warning +* Fixed underflow. + Before the sink buffer underflows the pipeline is paused. When data is received again the pipeline is set to playing again. +* Change audio sink to autoaudiosink +* Update maintainer email +* Contributors: Benny, Hans Gaiser, trainman419 + +0.2.7 (2014-07-25) +------------------ + +0.2.6 (2014-02-26) +------------------ +* audio_capture and play _require\_ gstreamer, it's not optional +* Contributors: v4hn + +0.2.5 (2014-01-23) +------------------ +* "0.2.5" +* Contributors: trainman419 + +0.2.4 (2013-09-10) +------------------ + +0.2.3 (2013-07-15) +------------------ +* Fix dependencies and install rules. +* Contributors: Austin Hendrix + +0.2.2 (2013-04-10) +------------------ + +0.2.1 (2013-04-08 13:59) +------------------------ + +0.2.0 (2013-04-08 13:49) +------------------------ +* Finish catkinizing audio_common. +* Catkinize audio_play. +* Fix typo in package.xml +* Versions and more URLs. +* Convert manifests to package.xml +* Ditch old makefiles. +* Updates manifest +* Updated manifests for rodep2 +* oneiric build fixes, bump version to 0.1.6 +* Removed another duplicate thread::thread +* Added a rosdep.yaml file +* Fixed to use audio_common_msgs +* Added ability to use different festival voices +* Updated documentation +* Update to audio_play +* Fixed ignore files +* Added hgignore files +* Audio_capture and audio_play working +* Making separate audio_capture and audio_play packages +* Contributors: Austin Hendrix, Brian Gerkey, Nate Koenig, nkoenig diff --git a/src/lib/audio_play/CMakeLists.txt b/src/lib/audio_play/CMakeLists.txt new file mode 100644 index 000000000..50f48e7a4 --- /dev/null +++ b/src/lib/audio_play/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(audio_play) + +find_package(catkin REQUIRED COMPONENTS roscpp audio_common_msgs) + +find_package(PkgConfig) +pkg_check_modules(GST1.0 gstreamer-1.0 REQUIRED) + +find_package(Boost REQUIRED COMPONENTS thread) + +include_directories(${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GST1.0_INCLUDE_DIRS}) + +catkin_package() + +add_executable(audio_play src/audio_play.cpp) +target_link_libraries(audio_play ${catkin_LIBRARIES} ${GST1.0_LIBRARIES} ${Boost_LIBRARIES}) +add_dependencies(audio_play ${catkin_EXPORTED_TARGETS}) + +install(TARGETS audio_play + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) + +install(DIRECTORY launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) diff --git a/src/lib/audio_play/launch/play.launch b/src/lib/audio_play/launch/play.launch new file mode 100644 index 000000000..2a11ead4b --- /dev/null +++ b/src/lib/audio_play/launch/play.launch @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/audio_play/launch/record_to_file.launch b/src/lib/audio_play/launch/record_to_file.launch new file mode 100644 index 000000000..d1ccc69ab --- /dev/null +++ b/src/lib/audio_play/launch/record_to_file.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/audio_play/mainpage.dox b/src/lib/audio_play/mainpage.dox new file mode 100644 index 000000000..5c05407c2 --- /dev/null +++ b/src/lib/audio_play/mainpage.dox @@ -0,0 +1,22 @@ +/** +\mainpage +\htmlinclude manifest.html + +\b audio_play is a package that listens to a node that produces audio_msgs, and plays them through a connected speaker. + + +\section codeapi Code API + + + + +*/ diff --git a/src/lib/audio_play/package.xml b/src/lib/audio_play/package.xml new file mode 100644 index 000000000..4ef6a95e9 --- /dev/null +++ b/src/lib/audio_play/package.xml @@ -0,0 +1,32 @@ + + audio_play + 0.3.18 + + Outputs audio to a speaker from a source node. + + Austin Hendrix + Shingo Kitagawa + Nate Koenig + BSD + http://ros.org/wiki/audio_play + https://github.com/ros-drivers/audio_common + https://github.com/ros-drivers/audio_common/issues + + catkin + + roscpp + audio_common_msgs + libgstreamer1.0-dev + libgstreamer-plugins-base1.0-dev + + roscpp + audio_common_msgs + gstreamer1.0 + gstreamer1.0-alsa + gstreamer1.0-plugins-base + gstreamer1.0-plugins-ugly + gstreamer1.0-plugins-good + + + + diff --git a/src/lib/audio_play/src/audio_play.cpp b/src/lib/audio_play/src/audio_play.cpp new file mode 100644 index 000000000..fe127c2ab --- /dev/null +++ b/src/lib/audio_play/src/audio_play.cpp @@ -0,0 +1,196 @@ +#include +#include +#include +#include + +#include "audio_common_msgs/AudioData.h" + +namespace audio_transport +{ + class RosGstPlay + { + public: + RosGstPlay() + { + GstPad *audiopad; + GstCaps *caps; + + std::string dst_type; + std::string device; + bool do_timestamp; + std::string format; + int channels; + int depth; + int sample_rate; + std::string sample_format; + + // The destination of the audio + ros::param::param("~dst", dst_type, "alsasink"); + ros::param::param("~device", device, std::string()); + ros::param::param("~do_timestamp", do_timestamp, true); + ros::param::param("~format", format, "mp3"); + ros::param::param("~channels", channels, 1); + ros::param::param("~depth", depth, 16); + ros::param::param("~sample_rate", sample_rate, 16000); + ros::param::param("~sample_format", sample_format, "S16LE"); + + _sub = _nh.subscribe("audio", 10, &RosGstPlay::onAudio, this); + + _loop = g_main_loop_new(NULL, false); + + _pipeline = gst_pipeline_new("app_pipeline"); + _source = gst_element_factory_make("appsrc", "app_source"); + g_object_set(G_OBJECT(_source), "do-timestamp", (do_timestamp) ? TRUE : FALSE, NULL); + + //_playbin = gst_element_factory_make("playbin2", "uri_play"); + //g_object_set( G_OBJECT(_playbin), "uri", "file:///home/test/test.mp3", NULL); + caps = gst_caps_new_simple( + "audio/x-raw", + "format", G_TYPE_STRING, sample_format.c_str(), + "rate", G_TYPE_INT, sample_rate, + "channels", G_TYPE_INT, channels, + "width", G_TYPE_INT, depth, + "depth", G_TYPE_INT, depth, + "signed", G_TYPE_BOOLEAN, TRUE, + "layout", G_TYPE_STRING, "interleaved", + NULL); + + if (dst_type == "alsasink") + { + _audio = gst_bin_new("audiobin"); + _convert = gst_element_factory_make("audioconvert", "convert"); + audiopad = gst_element_get_static_pad(_convert, "sink"); + _resample = gst_element_factory_make("audioresample", "resample"); + + _sink = gst_element_factory_make("alsasink", "sink"); + g_object_set(G_OBJECT(_sink), "sync", FALSE, NULL); + if (!device.empty()) { + g_object_set(G_OBJECT(_sink), "device", device.c_str(), NULL); + } + gst_bin_add_many( GST_BIN(_audio), _convert, _resample, _sink, NULL); + gst_element_link_many(_convert, _resample, _sink, NULL); + gst_element_add_pad(_audio, gst_ghost_pad_new("sink", audiopad)); + } + else + { + ROS_INFO("file sink to %s", dst_type.c_str()); + _sink = gst_element_factory_make("filesink", "sink"); + g_object_set(G_OBJECT(_sink), "location", dst_type.c_str(), NULL); + } + + if (format == "mp3") + { + if (dst_type == "alsasink") + { + _decoder = gst_element_factory_make("decodebin", "decoder"); + g_signal_connect(_decoder, "pad-added", G_CALLBACK(cb_newpad),this); + + _filter = gst_element_factory_make("capsfilter", "filter"); + g_object_set( G_OBJECT(_filter), "caps", caps, NULL); + + gst_bin_add_many(GST_BIN(_pipeline), _source, _decoder, _filter, _audio, NULL); + gst_element_link_many(_source, _decoder, _filter, _audio, NULL); + gst_object_unref(audiopad); + gst_caps_unref(caps); + } + else + { + gst_bin_add_many(GST_BIN(_pipeline), _source, _sink, NULL); + gst_element_link(_source, _sink); + } + } + else if (format == "wave") + { + g_object_set( G_OBJECT(_source), "caps", caps, NULL); + g_object_set (G_OBJECT (_source), "format", GST_FORMAT_TIME, NULL); + if (dst_type == "alsasink") + { + gst_bin_add_many( GST_BIN(_pipeline), _source, _audio, NULL); + gst_element_link_many( _source, _audio, NULL); + gst_object_unref(audiopad); + } + else + { + _filter = gst_element_factory_make("wavenc", "filter"); + gst_bin_add_many(GST_BIN(_pipeline), _source, _filter, _sink, NULL); + gst_element_link_many( _source, _filter, _sink, NULL); + } + gst_caps_unref(caps); + } + else + { + ROS_ERROR("Unsupported format: %s", format.c_str()); + } + + gst_element_set_state(GST_ELEMENT(_pipeline), GST_STATE_PLAYING); + //gst_element_set_state(GST_ELEMENT(_playbin), GST_STATE_PLAYING); + + _gst_thread = boost::thread( boost::bind(g_main_loop_run, _loop) ); + } + + private: + + void onAudio(const audio_common_msgs::AudioDataConstPtr &msg) + { + GstBuffer *buffer = gst_buffer_new_and_alloc(msg->data.size()); + gst_buffer_fill(buffer, 0, &msg->data[0], msg->data.size()); + GstFlowReturn ret; + + g_signal_emit_by_name(_source, "push-buffer", buffer, &ret); + gst_buffer_unref(buffer); + } + + static void cb_newpad (GstElement *decodebin, GstPad *pad, + gpointer data) + { + RosGstPlay *client = reinterpret_cast(data); + + GstCaps *caps; + GstStructure *str; + GstPad *audiopad; + + /* only link once */ + audiopad = gst_element_get_static_pad (client->_audio, "sink"); + if (GST_PAD_IS_LINKED (audiopad)) + { + g_object_unref (audiopad); + return; + } + + /* check media type */ + caps = gst_pad_query_caps (pad, NULL); + str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "audio")) { + gst_caps_unref (caps); + gst_object_unref (audiopad); + return; + } + + gst_caps_unref (caps); + + /* link'n'play */ + gst_pad_link (pad, audiopad); + + g_object_unref (audiopad); + } + + ros::NodeHandle _nh; + ros::Subscriber _sub; + boost::thread _gst_thread; + + GstElement *_pipeline, *_source, *_sink, *_decoder, *_convert, *_audio, *_resample, *_filter; + GstElement *_playbin; + GMainLoop *_loop; + }; +} + + +int main (int argc, char **argv) +{ + ros::init(argc, argv, "audio_play"); + gst_init(&argc, &argv); + + audio_transport::RosGstPlay client; + + ros::spin(); +} diff --git a/src/lib/sound_play/CHANGELOG.rst b/src/lib/sound_play/CHANGELOG.rst new file mode 100644 index 000000000..54d23f048 --- /dev/null +++ b/src/lib/sound_play/CHANGELOG.rst @@ -0,0 +1,418 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package sound_play +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +0.3.18 (2024-08-13) +------------------- +* Merge pull request `#249 `_ from peci1/patch-1 + festival_plugin: add support for different encodings +* festival_plugin: add support for different encodings +* Contributors: Martin Pecka, Shingo Kitagawa + +0.3.17 (2023-06-08) +------------------- +* Merge pull request `#231 `_ from knorth55/no-wait-mode +* dont wait when rospy.Duration(0) is set for timeout +* Merge pull request `#229 `_ from furushchev/flite-plugin-lazy-load + FlitePlugin: Lazy loading default voice path +* FlitePlugin: Lazy loading default voice path +* Contributors: Shingo Kitagawa, Yuki Furuta + +0.3.16 (2022-12-23) +------------------- +* Merge pull request `#203 `_ from nakane11/timeout +* refactor libsoundplay.py +* Add timeout to wait_for_server and wait_for_result +* Contributors: Aoi Nakane, Shingo Kitagawa + +0.3.15 (2022-08-29) +------------------- +* Merge pull request `#200 `_ from knorth55/yaml-missing +* show error and skip loading when plugin yaml is missing +* Merge pull request `#199 `_ from knorth55/install-plugin-yaml +* fix missing install in CMakeLists.txt +* Contributors: Shingo Kitagawa + +0.3.14 (2022-08-18) +------------------- +* Merge pull request `#193 `_ from knorth55/refactor-soundplay-node +* refactor soundplay_node.py +* Merge pull request `#192 `_ from knorth55/fix-file-open-issue +* fix typo causing file open issue +* Merge pull request `#191 `_ from knorth55/flite-default-voice-dir +* add default voice dir for flite_plugin +* Merge pull request `#190 `_ from ros-drivers/knorth55-patch-1 +* Update soundplay_node.py +* Merge pull request `#187 `_ from knorth55/fix-typo +* fix typo in soundplay_node.py +* Merge pull request `#185 `_ from knorth55/sound-play-flite-plugin + add flite plugin for sound_play +* Merge pull request `#183 `_ from knorth55/sound-play-plugin + add soundplay plugin feature +* add flite in sound_play dependency +* refactor FestivalPlugin +* add flite plugin +* change default_voice to None +* add plugin arg in soundplay_node.launch +* refactor codes +* add output screen in soundplay_node.launch +* add soundplay plugin attribute +* Merge pull request `#184 `_ from knorth55/default-voice +* add default_voice in soundplay_node.launch +* Merge pull request `#182 `_ from iory/is-speaking +* Improve is_speaking by checking goal status +* Merge pull request `#181 `_ from knorth55/refactor-is-speaking +* refactor is_speaking.py +* Contributors: JSK fetch user, Shingo Kitagawa, iory + +0.3.13 (2022-04-07) +------------------- +* Merge pull request `#176 `_ from iory/is-speeching +* Add is_speaking.py to catkin_install_python +* Fixed name speeching to speaking +* Add is_speeching node for checking robot is speaking +* Contributors: Shingo Kitagawa, iory + +0.3.12 (2021-09-01) +------------------- +* Merge pull request `#175 `_ from iory/rate + Modified loop rate for action execution +* Modified loop rate for action execution +* Merge pull request `#131 `_ from yann-bourrigault/master + Handle playing sound in loop +* import GObject in try section +* Merge pull request `#174 `_ from iory/cache + Add arg2 information for cache +* Add arg2 information for cache +* Merge pull request `#173 `_ from knorth55/replace-sound-client +* Merge pull request `#172 `_ from knorth55/start-action-after-init + [sound_play] start ActionServer after initialize in soundplay_node.py +* Merge pull request `#171 `_ from knorth55/set-aborted + [sound_play] add proper set_aborted in soundplay_node.py +* add replace in sendMsg +* start actionserver after initialize in soundplay_node.py +* add proper set_aborted in soundplay_node.py +* Merge branch 'master' into master +* Handle playing sound repeatedly +* Contributors: Shingo Kitagawa, Yann BOURRIGAULT, iory + +0.3.11 (2021-04-08) +------------------- +* Merge pull request `#167 `_ from k-okada/fix_155 +* Use rospy.myargv() instead of sys.argv to support remapping +* Contributors: Kei Okada, Shingo Kitagawa + +0.3.10 (2021-01-07) +------------------- + +0.3.9 (2020-10-22) +------------------ + +0.3.8 (2020-09-13) +------------------ +* Merge pull request `#155 `_ from garaemon/use-myargv + Use rospy.myargv() instead of sys.argv to support remapping +* Use rospy.myargv() instead of sys.argv to support remapping +* Merge pull request `#154 `_ from mikaelarguedas/fix_say_python3 +* update to support no iso-8859-15 language (`#1 `_) + * support non iso-8859-15 language + * encode only for python2 +* convert items to an iterator +* make cleanup compatible with Python 3 +* catch AttributeError to handle python3 strings +* Contributors: Mikael Arguedas, Ryohei Ueda, Shingo Kitagawa + +0.3.7 (2020-08-08) +------------------ +* Merge pull request `#149 `_ from garaemon/specify-topic-to-play-sound + Support use different topic and actionlib to play sound +* Support use different topic and actionlib to play sound + * Add two keywords to the constructor of SoundClient class in order to + specify actionlib namespace and topic name to play sound. + * See `#119 `_. +* Merge pull request `#144 `_ from ros-drivers/knorth55-patch-1 +* add gstreamer1.0-alsa exec_depend in sound_play +* Contributors: Ryohei Ueda, Shingo Kitagawa + +0.3.6 (2020-05-29) +------------------ +* Merge pull request `#140 `_ from knorth55/support-python3 + fix syntax for python3 +* Merge pull request `#141 `_ from knorth55/add-maintainer + add maintainer +* add maintainer +* fix syntax for python3 +* Contributors: Shingo Kitagawa + +0.3.5 (2020-04-28) +------------------ +* Merge pull request `#133 `_ from knorth55/noetic-build +* remove unnecessary shebang +* use setuptools instead of distutils.core +* use package format=3 for python3 +* refactor CMakeLists.txt +* use catkin_install_python for python shebang +* Merge pull request `#135 `_ from knorth55/add-travis +* disable sound_play test +* Contributors: Shingo Kitagawa + +0.3.4 (2020-04-02) +------------------ +* Merge pull request `#126 `_ from itohdak/fix-Gstreamer-memory-leak + [sound_play/scripts/soundplay_node.py] fix Gstreamer memory leak +* Merge pull request `#123 `_ from 708yamaguchi/fix-encode + Do not encode text when using langages which ISO-8859-15 does not support +* [sound_play/scripts/soundplay_node.py] fix Gstreamer memory leak +* do not encode text when using langages which ISO-8859-15 does not support +* Merge pull request `#118 `_ from v4hn/patch-1 + use default audio output by default +* use default audio output by default + Not specifying a sound device defaults to *the first* sound device starting from Ubuntu 16.04., not to the one configured as default. + The change is backward compatible and tested on ROS indigo and kinetic on a PR2 robot. +* Merge pull request `#110 `_ from gerardcanal/master + Encoded text to be said in ISO-8859-15 +* Merge branch 'master' of github.com:ros-drivers/audio_common +* Sound play: Encoded file to be said in ISO-8859-15 so that accents in languages such as Spanish, Catalan or French are correctly pronounced (based on http://festcat.talp.cat/en/usage.php which says festival expects ISO-8859-15 encoding) +* Contributors: Austin, Gerard Canal, Michael Görner, Naoya Yamaguchi, Shingo Kitagawa, itohdak + +0.3.3 (2018-05-22) +------------------ +* Fix gstreamer errors. Fixes `#108 `_ +* Contributors: trainman419 + +0.3.2 (2018-05-02) +------------------ +* [sound_play] add option to select audio device to play / record (`#87 `_) + * [sound_play] add option to select audio device to play + * [sound_play] reformat README to markdown; add usage to set device via rosparam + * audio_capture: add option for selecting device to use + * audio_play: add option to select device for playing audio + * add device argument to launch files + Conflicts: + audio_capture/launch/capture.launch + audio_capture/launch/capture_to_file.launch + audio_capture/src/audio_capture.cpp + audio_play/launch/play.launch + sound_play/scripts/soundplay_node.py +* Merge pull request `#95 `_ from yujinrobot/volume_check + [sound_play] volume check for cached sounds +* [sound_play] checks if sound's Gst instance's volume has changed and resets it +* Contributors: Austin, Naveed Usmani, Yuki Furuta + +0.3.1 (2016-08-28) +------------------ +* Update to new gstreamer rosdeps +* Update sound_play to gstreamer 1.0 +* remove chance of uninitialised variable being called in a subscriber callback. +* Add changelogs +* Issue: The error checks for missing publisher/action client in sendMsg were inverted. + The non-blocking brach tested the action client while the blocking branch + tested the publisher. + Fix: Inverted the blocking boolean for both branchs. +* sound_play: Fix build with -DCATKIN_ENABLE_TESTING=OFF. + https://bugs.gentoo.org/show_bug.cgi?id=567466 +* [soundplay_node] fix resources not being released on dict cleanup + This was resulting in the number of sink inputs reaching the maximum threshold, + (32 on ubuntu 14.04 with pulseaudio 4.0) after which no more sounds could be + played by the node. It would only happen if the rate of sounds being played was + slower than the dictionary cleanup. +* depend on actionlib. +* Introduce unit test to ensure soundclient is started correctly. +* Example of using the explicit blocking parameter to override the class setting. +* SoundClient can also explicitly specify whether or not to block while playing the sound. + Each play/repeat/say/... method can take an option blocking=True|False argument (using **kwargs), which over-rides the class-wide setting. +* Merge pull request #62 from felixduvallet/set_queue_size + Set queue_size in soundplay_node Publisher +* do both in same script. +* Added script showing the various blocking/non-blocking ways of using SoundClient. +* removed trailing whitespace only +* loginfo -> logdebug. +* Slightly more condensed version of thresholding. +* Enable blocking calls inside libsoundplay's SoundClient. + This makes use of the actionlib interface provided by soundplay_node, by ensuring SoundClient receives a response before returning. + Turn this on by: SoundClient(blocking=true). +* Use new-style python classes (inherits from object). +* removed trailing whitespace. +* Set the volume in each of the sound_play actionlib tests. + This makes the script actually play the sounds it requests. +* Specify queue size explicitly. + Removed warning message printed each time soundplay_node was started. +* remove trailing whitespace only. +* Change wiki urls +* Fix test target name collision. Fixes #49 +* sound_play: cpp header conforms to the style guide +* sound_play: update scripts to allow volume to be set +* sound_play: updated tests to include volume changes +* sound_play: add ability to specify volume at which to play sounds + Also changed error to warning as per todo +* sound_play: fix indentation and comment inconsistencies +* sound_play: remove some raw prints cluttering output +* sound_play: added queue_size to SoundClient init + Should prevent warning being displayed whenever the client is created. + Fixes issue #43 +* add simple-actionlib functionality to sound_play +* sound_play: Added functions to play files relative to a package path +* Update maintainer email +* Contributors: Alexis Ballier, Austin, Daniel Stonier, David V. Lu, Felix Duvallet, Matthias Nieuwenhuisen, Michal Staniaszek, Neowizard, aginika, trainman419 + +0.2.11 (2016-02-16) +------------------- +* Add changelogs +* Fix bug in say.py. Fixes `#72 `_ +* Contributors: trainman419 + +0.2.10 (2016-01-21) +------------------- +* Add changelogs +* Issue: The error checks for missing publisher/action client in sendMsg were inverted. + The non-blocking brach tested the action client while the blocking branch + tested the publisher. + Fix: Inverted the blocking boolean for both branchs. +* sound_play: Fix build with -DCATKIN_ENABLE_TESTING=OFF. + https://bugs.gentoo.org/show_bug.cgi?id=567466 +* Contributors: Alexis Ballier, Neowizard, trainman419 + +0.2.9 (2015-12-02) +------------------ +* Add changelogs +* [soundplay_node] fix resources not being released on dict cleanup + This was resulting in the number of sink inputs reaching the maximum threshold, + (32 on ubuntu 14.04 with pulseaudio 4.0) after which no more sounds could be + played by the node. It would only happen if the rate of sounds being played was + slower than the dictionary cleanup. +* depend on actionlib. +* Introduce unit test to ensure soundclient is started correctly. +* Example of using the explicit blocking parameter to override the class setting. +* SoundClient can also explicitly specify whether or not to block while playing the sound. + Each play/repeat/say/... method can take an option blocking=True|False argument (using **kwargs), which over-rides the class-wide setting. + Conflicts: + sound_play/src/sound_play/libsoundplay.py +* do both in same script. +* Added script showing the various blocking/non-blocking ways of using SoundClient. +* removed trailing whitespace only + Conflicts: + sound_play/scripts/say.py +* loginfo -> logdebug. +* Enable blocking calls inside libsoundplay's SoundClient. + This makes use of the actionlib interface provided by soundplay_node, by ensuring SoundClient receives a response before returning. + Turn this on by: SoundClient(blocking=true). + Conflicts: + sound_play/src/sound_play/libsoundplay.py +* Use new-style python classes (inherits from object). + Conflicts: + sound_play/src/sound_play/libsoundplay.py +* removed trailing whitespace. + Conflicts: + sound_play/src/sound_play/libsoundplay.py +* Revert "Set the volume in each of the sound_play actionlib tests." + This reverts commit 55ab08c882809fc6d21affb849a7dac9f1901867. + Indigo-devel does not have the volume API +* Set the volume in each of the sound_play actionlib tests. + This makes the script actually play the sounds it requests. +* Specify queue size explicitly. + Removed warning message printed each time soundplay_node was started. +* remove trailing whitespace only. +* Fix wiki links +* Contributors: David V. Lu, Felix Duvallet, Michal Staniaszek, trainman419 + +0.2.8 (2015-10-02) +------------------ +* Fix test target name collision. Fixes `#49 `_ +* sound_play: remove some raw prints cluttering output +* sound_play: added queue_size to SoundClient init + Should prevent warning being displayed whenever the client is created. + Fixes issue `#43 `_ +* add simple-actionlib functionality to sound_play +* sound_play: Added functions to play files relative to a package path +* Update maintainer email +* Contributors: Matthias Nieuwenhuisen, Michal Staniaszek, aginika, trainman419 + +0.2.7 (2014-07-25) +------------------ + +0.2.6 (2014-02-26) +------------------ +* Fix path resolution in python soundplay lib. +* now importing roslib. closes `#33 `_ +* Contributors: Piyush Khandelwal, trainman419 + +0.2.5 (2014-01-23) +------------------ +* "0.2.5" +* Install sounds. Fixes `#29 `_. +* install sound_play.h and export include folder +* Contributors: ahendrix, trainman419, v4hn + +0.2.4 (2013-09-10) +------------------ +* Fix cmake ordering. +* Contributors: Austin Hendrix + +0.2.3 (2013-07-15) +------------------ +* Fix python. +* Contributors: Austin Hendrix + +0.2.2 (2013-04-10) +------------------ +* Actually add proper dependency on message generation. +* Reorder CMakeLists.txt. +* Contributors: Austin Hendrix + +0.2.1 (2013-04-08 13:59) +------------------------ + +0.2.0 (2013-04-08 13:49) +------------------------ +* Finish catkinizing audio_common. +* Start catkinizing sound_play. +* Fix typo in package.xml +* Versions and more URLs. +* Convert manifests to package.xml +* Ditch old makefiles. +* Use festival default voice from libsoundplay. +* Set myself as the maintainer. +* Fix filehandle leak and add debug statements. +* Updates manifest +* Updated manifests for rodep2 +* Fixed sound_play +* Added test wave +* Cleaned up the test script +* Added default voice to say command +* Updated the gstreamer rosdeps +* Removed comment +* Added diagnostic_msgs to sound_play +* Added a rosdep.yaml file +* Added ability to use different festival voices +* Added exit(1) when import of pygame fails. This makes the error message easier to notice. +* Added Ubuntu platform tags to manifest +* Added a link to the troubleshooting wiki page in the diagnostic message as requested by `#4070 `_. +* Took out the deprecated API. +* Sound play now publishes header timestamp in message. `#3822 `_ +* Cleaned up temp file generation when doing text to speach. Now uses the tempfile module. +* Adding missing export of headers for sound_play C++ API +* Changing node name for sound play diagnostics, `#3599 `_ +* Added test.launch to run sound server and a test client. +* Remove use of deprecated rosbuild macros +* Replaced review tag with standardized message +* Updated review status +* Added a launch file to start soundplay_node.py +* Made the sound_play client libraries be more explicit about what to do when the node is not running. +* Updated manifest description +* Updated copyright year +* fixed XML typo +* updated package description +* Added a copyright message. +* Removed debugging message from sound_play node. +* Added tests for new sound_play python API and fixed a few bugs. +* Fixed missing self arguments in sound_play libsoundplay.py +* Upgraded the python sound_play API +* Converted non-camelCase methods to camelCase in sound_play C++ API +* Changed Lock to RLock to fix `#2801 `_ +* Made the deprecation of SoundHandle into a warning. +* Added debug messages +* Updated soundplay_node to publish diagnostics and increased the number of active channels. +* Added diagnostic_msgs dependency to sound_play +* sound_play: Renamed SoundHandle to SoundClient. Added Sound-centric C++ API. Changed byte to int8 in msg file. Updated documentation. +* migration part 1 +* Contributors: Austin Hendrix, Nate Koenig, blaise, blaisegassend, eitan, gerkey, kwc, nkoenig, watts, wheeler diff --git a/src/lib/sound_play/CMakeLists.txt b/src/lib/sound_play/CMakeLists.txt new file mode 100644 index 000000000..98f3fe18a --- /dev/null +++ b/src/lib/sound_play/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(sound_play) + +find_package(catkin REQUIRED COMPONENTS message_generation roscpp actionlib_msgs) + +add_action_files(DIRECTORY action FILES SoundRequest.action) +add_message_files(DIRECTORY msg FILES SoundRequest.msg) + +include_directories(include ${catkin_INCLUDE_DIRS}) + +catkin_python_setup() + +generate_messages(DEPENDENCIES actionlib_msgs) + +catkin_package(CATKIN_DEPENDS message_runtime actionlib_msgs + INCLUDE_DIRS include) + +catkin_install_python(PROGRAMS + scripts/is_speaking.py + scripts/playbuiltin.py + scripts/play.py + scripts/say.py + scripts/shutup.py + scripts/soundplay_node.py + scripts/test.py + scripts/test_actionlib_client.py + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) + +install(FILES + soundplay_node.launch + sound_play_plugin.yaml + test.launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) + +install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}) + +install(DIRECTORY sounds + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) + +# if(CATKIN_ENABLE_TESTING) +# catkin_add_nosetests(scripts/test) +# add_subdirectory(test) +# endif() diff --git a/src/lib/sound_play/README.md b/src/lib/sound_play/README.md new file mode 100644 index 000000000..44694e736 --- /dev/null +++ b/src/lib/sound_play/README.md @@ -0,0 +1,67 @@ +sound_play +========= + +## Dependencies + +- python-pygame +- festival +- festvox-don +- alsa-base +- alsa-tools + +## Checking that the speaker/sound card is recognized by the kernel + +`cat /proc/asound/cards` + +Your card should be in the list. Make note of the number in front of the +card, it will be used to tell alsa where to play sound from. + +If your sound device does not show up, your kernel may not support it, or +the module may not be loaded. For usb speakers, you may want to try: + +`modprobe snd-usb-audio` + +(not sure if this list is exhaustive) + +## Telling alsa which sound card/speaker to use + +Run (replace 75 with the number of the sound device to use): + +`asoundconf set-default-card 75` + +This will create .asoundrc.asoundconf in your home directory. +To make alsa use these settings, add the following line to `~/.asoundrc` + +`include ".asoundrc.asoundconf"` + +To set this default to all users, copy this to the system-wide alsa +configuration file: + +`mv ~/.asoundrc.asoundconf /etc/asound.conf` + +## Getting started + +Start the sound play node, and have a look at the scripts in the scripts +directory that exercise the node's functionality. + +## Specify Device via ROS Param + +Besides setting default device as system wide settings, you can also specify audio device via `rosparam`: + +``` xml + + + + + +``` + +or simply run: `rosrun sound_play soundplay_node.py _device:="hw:1,0"` + +In the launch file above, `~device` parameter is set to `hw:1,0`, which tells `soundplay_node` to use audio device No. `0` connected to audio card No.`1`. +To find card/device number which you want to use, execute: + +``` bash +sudo aplay -l +``` + diff --git a/src/lib/sound_play/action/SoundRequest.action b/src/lib/sound_play/action/SoundRequest.action new file mode 100644 index 000000000..49ef24aa7 --- /dev/null +++ b/src/lib/sound_play/action/SoundRequest.action @@ -0,0 +1,7 @@ +SoundRequest sound_request +--- +bool playing +time stamp +--- +bool playing +time stamp \ No newline at end of file diff --git a/src/lib/sound_play/include/sound_play/sound_play.h b/src/lib/sound_play/include/sound_play/sound_play.h new file mode 100644 index 000000000..d5fe4614e --- /dev/null +++ b/src/lib/sound_play/include/sound_play/sound_play.h @@ -0,0 +1,410 @@ +/* + *********************************************************** + * Software License Agreement (BSD License) + * + * Copyright (c) 2009, Willow Garage, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Willow Garage nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************** + */ + +#ifndef __SOUND_PLAY__SOUND_PLAY__H__ +#define __SOUND_PLAY__SOUND_PLAY__H__ + +#include +#include +#include +#include +#include + +namespace sound_play +{ + +/** \brief Class that publishes messages to the sound_play node. + * + * This class is a helper class for communicating with the sound_play node + * via the \ref sound_play::SoundRequest message. It has two ways of being used: + * + * - It can create Sound classes that represent a particular sound which + * can be played, repeated or stopped. + * + * - It provides methods for each way in which the sound_play::SoundRequest + * message can be invoked. + */ + +class SoundClient +{ +public: + class Sound + { + friend class SoundClient; + private: + int snd_; + float vol_; + std::string arg_; + std::string arg2_; + SoundClient *client_; + + Sound(SoundClient *sc, int snd, const std::string &arg, const std::string arg2 = std::string(), const float vol = 1.0f) + { + client_ = sc; + snd_ = snd; + arg_ = arg; + arg2_ = arg2; + vol_ = vol; + } + + public: + /** \brief Play the Sound. + * + * This method causes the Sound to be played once. + */ + void play() + { + client_->sendMsg(snd_, SoundRequest::PLAY_ONCE, arg_, arg2_, vol_); + } + + /** \brief Play the Sound repeatedly. + * + * This method causes the Sound to be played repeatedly until stop() is + * called. + */ + void repeat() + { + client_->sendMsg(snd_, SoundRequest::PLAY_START, arg_, arg2_, vol_); + } + + /** \brief Stop Sound playback. + * + * This method causes the Sound to stop playing. + */ + void stop() + { + client_->sendMsg(snd_, SoundRequest::PLAY_STOP, arg_, arg2_, vol_); + } + }; + + /** \brief Create a SoundClient that publishes on the given topic + * + * Creates a SoundClient that publishes to the given topic relative to the + * given NodeHandle. + * + * \param nh Node handle to use when creating the topic. + * + * \param topic Topic to publish to. + */ + SoundClient(ros::NodeHandle &nh, const std::string &topic) + { + init(nh, topic); + } + + /** \brief Create a SoundClient with the default topic + * + * Creates a SoundClient that publishes to "robotsound". + */ + SoundClient() + { + init(ros::NodeHandle(), "robotsound"); + } + + /** \brief Create a voice Sound. + * + * Creates a Sound corresponding to saying the indicated text. + * + * \param s Text to say + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + Sound voiceSound(const std::string &s, float volume = 1.0f) + { + return Sound(this, SoundRequest::SAY, s, "", volume); + } + + /** \brief Create a wave Sound. + * + * Creates a Sound corresponding to indicated file. + * + * \param s File to play. Should be an absolute path that exists on the + * machine running the sound_play node. + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + Sound waveSound(const std::string &s, float volume = 1.0f) + { + return Sound(this, SoundRequest::PLAY_FILE, s, "", volume); + } + + /** \brief Create a wave Sound from a package. + * + * Creates a Sound corresponding to indicated file. + * + * \param p Package containing the sound file. + * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid + * on the computer on which the sound_play node is running + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + Sound waveSoundFromPkg(const std::string &p, const std::string &s, float volume = 1.0f) + { + return Sound(this, SoundRequest::PLAY_FILE, s, p, volume); + } + + /** \brief Create a builtin Sound. + * + * Creates a Sound corresponding to indicated builtin wave. + * + * \param id Identifier of the sound to play. + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + Sound builtinSound(int id, float volume = 1.0f) + { + return Sound(this, id, "", "", volume); + } + + /** \brief Say a string + * + * Send a string to be said by the sound_node. The vocalization can be + * stopped using stopSaying or stopAll. + * + * \param s String to say + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void say(const std::string &s, const std::string &voice="voice_kal_diphone", float volume = 1.0f) + { + sendMsg(SoundRequest::SAY, SoundRequest::PLAY_ONCE, s, voice, volume); + } + + /** \brief Say a string repeatedly + * + * The string is said repeatedly until stopSaying or stopAll is used. + * + * \param s String to say repeatedly + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void repeat(const std::string &s, float volume = 1.0f) + { + sendMsg(SoundRequest::SAY, SoundRequest::PLAY_START, s, "", volume); + } + + /** \brief Stop saying a string + * + * Stops saying a string that was previously started by say or repeat. The + * argument indicates which string to stop saying. + * + * \param s Same string as in the say or repeat command + */ + void stopSaying(const std::string &s) + { + sendMsg(SoundRequest::SAY, SoundRequest::PLAY_STOP, s, ""); + } + + /** \brief Plays a WAV or OGG file + * + * Plays a WAV or OGG file once. The playback can be stopped by stopWave or + * stopAll. + * + * \param s Filename of the WAV or OGG file. Must be an absolute path valid + * on the computer on which the sound_play node is running + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void playWave(const std::string &s, float volume = 1.0f) + { + sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_ONCE, s, "", volume); + } + + /** \brief Plays a WAV or OGG file repeatedly + * + * Plays a WAV or OGG file repeatedly until stopWave or stopAll is used. + * + * \param s Filename of the WAV or OGG file. Must be an absolute path valid + * on the computer on which the sound_play node is running. + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void startWave(const std::string &s, float volume = 1.0f) + { + sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_START, s, "", volume); + } + + /** \brief Stop playing a WAV or OGG file + * + * Stops playing a file that was previously started by playWave or + * startWave. + * + * \param s Same string as in the playWave or startWave command + */ + void stopWave(const std::string &s) + { + sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_STOP, s); + } + + /** \brief Plays a WAV or OGG file from a package + * + * Plays a WAV or OGG file once. The playback can be stopped by stopWaveFromPkg or + * stopAll. + * + * \param p Package name containing the sound file. + * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid + * on the computer on which the sound_play node is running + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void playWaveFromPkg(const std::string &p, const std::string &s, float volume = 1.0f) + { + sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_ONCE, s, p, volume); + } + + /** \brief Plays a WAV or OGG file repeatedly + * + * Plays a WAV or OGG file repeatedly until stopWaveFromPkg or stopAll is used. + * + * \param p Package name containing the sound file. + * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid + * on the computer on which the sound_play node is running + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void startWaveFromPkg(const std::string &p, const std::string &s, float volume = 1.0f) + { + sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_START, s, p, volume); + } + + /** \brief Stop playing a WAV or OGG file + * + * Stops playing a file that was previously started by playWaveFromPkg or + * startWaveFromPkg. + * + * \param p Package name containing the sound file. + * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid + * on the computer on which the sound_play node is running + */ + void stopWaveFromPkg(const std::string &p, const std::string &s) + { + sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_STOP, s, p); + } + + /** \brief Play a buildin sound + * + * Starts playing one of the built-in sounds. built-ing sounds are documented + * in \ref SoundRequest.msg. Playback can be stopped by stopAll. + * + * \param sound Identifier of the sound to play. + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void play(int sound, float volume = 1.0f) + { + sendMsg(sound, SoundRequest::PLAY_ONCE, "", "", volume); + } + + /** \brief Play a buildin sound repeatedly + * + * Starts playing one of the built-in sounds repeatedly until stop or stopAll + * is used. Built-in sounds are documented in \ref SoundRequest.msg. + * + * \param sound Identifier of the sound to play. + * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. + */ + void start(int sound, float volume = 1.0f) + { + sendMsg(sound, SoundRequest::PLAY_START, "", "", volume); + } + + /** \brief Stop playing a built-in sound + * + * Stops playing a built-in sound started with play or start. + * + * \param sound Same sound that was used to start playback. + */ + void stop(int sound) + { + sendMsg(sound, SoundRequest::PLAY_STOP); + } + + /** \brief Stop all currently playing sounds + * + * This method stops all speech, wave file, and built-in sound playback. + */ + void stopAll() + { + stop(SoundRequest::ALL); + } + + /** \brief Turns warning messages on or off. + * + * If a message is sent when no node is subscribed to the topic, a + * warning message is printed. This method can be used to enable or + * disable warnings. + * + * \param state True to turn off messages, false to turn them on. + */ + void setQuiet(bool state) + { + quiet_ = state; + } + +private: + void init(ros::NodeHandle nh, const std::string &topic) + { + nh_ = nh; + pub_ = nh.advertise(topic, 5); + quiet_ = false; + } + + void sendMsg(int snd, int cmd, const std::string &s = "", const std::string &arg2 = "", const float &vol = 1.0f) + { + boost::mutex::scoped_lock lock(mutex_); + + if (!nh_.ok()) + return; + + SoundRequest msg; + msg.sound = snd; + msg.command = cmd; + msg.arg = s; + msg.arg2 = arg2; + + // ensure volume is in the correct range + if (vol < 0) + msg.volume = 0; + else if (vol > 1.0) + msg.volume = 1.0f; + else + msg.volume = vol; + + pub_.publish(msg); + + if (pub_.getNumSubscribers() == 0 && !quiet_) + ROS_WARN("Sound command issued, but no node is subscribed to the topic. Perhaps you forgot to run soundplay_node.py"); + } + + bool quiet_; + ros::NodeHandle nh_; + ros::Publisher pub_; + boost::mutex mutex_; +}; + +typedef SoundClient::Sound Sound; + +}; + +#endif diff --git a/src/lib/sound_play/mainpage.dox b/src/lib/sound_play/mainpage.dox new file mode 100644 index 000000000..61ca855e9 --- /dev/null +++ b/src/lib/sound_play/mainpage.dox @@ -0,0 +1,23 @@ +/** + +\mainpage +\htmlinclude manifest.html + +The \b sound_play package provides a way to say strings, +play WAV or OGG files and to play builtin sounds. Documentation for the +package can be found here at http://www.ros.org/wiki/sound_play + +Multiple sounds can be played concurrently (up to 4 currently because of +limitations in pygame). + +Python and C++ client classes are provide for ease of use: + +- sound_play::SoundClient and sound_play::SoundClient::Sound for C++ +- libsoundplay::SoundClient and libsoundplay::SoundClient::Sound for Python + +Example uses are in: + +- test.cpp +- test.py + +*/ diff --git a/src/lib/sound_play/msg/SoundRequest.msg b/src/lib/sound_play/msg/SoundRequest.msg new file mode 100644 index 000000000..241628c76 --- /dev/null +++ b/src/lib/sound_play/msg/SoundRequest.msg @@ -0,0 +1,30 @@ +# IMPORTANT: You should never have to generate this message yourself. +# Use the sound_play::SoundClient C++ helper or the +# sound_play.libsoundplay.SoundClient Python helper. + +# Sounds +int8 BACKINGUP = 1 +int8 NEEDS_UNPLUGGING = 2 +int8 NEEDS_PLUGGING = 3 +int8 NEEDS_UNPLUGGING_BADLY = 4 +int8 NEEDS_PLUGGING_BADLY = 5 + +# Sound identifiers that have special meaning +int8 ALL = -1 # Only legal with PLAY_STOP +int8 PLAY_FILE = -2 +int8 SAY = -3 + +int8 sound # Selects which sound to play (see above) + +# Commands +int8 PLAY_STOP = 0 # Stop this sound from playing +int8 PLAY_ONCE = 1 # Play the sound once +int8 PLAY_START = 2 # Play the sound in a loop until a stop request occurs + +int8 command # Indicates what to do with the sound + +# Volume at which to play the sound, with 0 as mute and 1.0 as 100%. +float32 volume + +string arg # file name or text to say +string arg2 # other arguments diff --git a/src/lib/sound_play/package.xml b/src/lib/sound_play/package.xml new file mode 100644 index 000000000..130bf0e1a --- /dev/null +++ b/src/lib/sound_play/package.xml @@ -0,0 +1,55 @@ + + + + sound_play + 0.3.18 + + sound_play provides a ROS node that translates commands on a ROS topic (robotsound) into sounds. The node supports built-in sounds, playing OGG/WAV files, and doing speech synthesis via festival. C++ and Python bindings allow this node to be used without understanding the details of the message format, allowing faster development and resilience to message format changes. + + Austin Hendrix + Shingo Kitagawa + Blaise Gassend + BSD + http://ros.org/wiki/sound_play + https://github.com/ros-drivers/audio_common + https://github.com/ros-drivers/audio_common/issues + + catkin + python-setuptools + python3-setuptools + + roscpp + roslib + actionlib_msgs + actionlib + audio_common_msgs + diagnostic_msgs + message_generation + + roscpp + roslib + actionlib_msgs + audio_common_msgs + diagnostic_msgs + + python-gi + python3-gi + gstreamer1.0 + gstreamer1.0-alsa + gstreamer1.0-plugins-base + gstreamer1.0-plugins-ugly + gstreamer1.0-plugins-good + + rospy + festival + flite + message_runtime + resource_retriever + + + + + + diff --git a/src/lib/sound_play/resources/flitevox/.gitignore b/src/lib/sound_play/resources/flitevox/.gitignore new file mode 100644 index 000000000..91af1ee0c --- /dev/null +++ b/src/lib/sound_play/resources/flitevox/.gitignore @@ -0,0 +1 @@ +*.flitevox diff --git a/src/lib/sound_play/scripts/is_speaking.py b/src/lib/sound_play/scripts/is_speaking.py new file mode 100755 index 000000000..0794d28ea --- /dev/null +++ b/src/lib/sound_play/scripts/is_speaking.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import rospy + +from actionlib_msgs.msg import GoalStatus +from actionlib_msgs.msg import GoalStatusArray +import std_msgs.msg + + +class IsSpeaking(object): + + def __init__(self): + super(IsSpeaking, self).__init__() + + self.sub = rospy.Subscriber( + '~robotsound', + GoalStatusArray, + callback=self.callback, + queue_size=1) + + self.is_speaking = False + self.pub_speech_flag = rospy.Publisher( + '~output/is_speaking', + std_msgs.msg.Bool, queue_size=1) + + self.timer = rospy.Timer(rospy.Duration(0.01), self.speech_timer_cb) + + def check_speak_status(self, status_msg): + """Returns True when speaking. + + """ + # If it is not included in the terminal state, + # it is determined as a speaking state. + if status_msg.status in [GoalStatus.ACTIVE, + GoalStatus.PREEMPTING, + GoalStatus.RECALLING]: + return True + return False + + def callback(self, msg): + for status in msg.status_list: + if self.check_speak_status(status): + self.is_speaking = True + return + self.is_speaking = False + + def speech_timer_cb(self, timer): + self.pub_speech_flag.publish( + std_msgs.msg.Bool(self.is_speaking)) + + +if __name__ == '__main__': + rospy.init_node('is_speaking') + app = IsSpeaking() + rospy.spin() diff --git a/src/lib/sound_play/scripts/play.py b/src/lib/sound_play/scripts/play.py new file mode 100755 index 000000000..237f2bba0 --- /dev/null +++ b/src/lib/sound_play/scripts/play.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +#*********************************************************** +#* Software License Agreement (BSD License) +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + + +if __name__ == '__main__': + import rospy + rospy.init_node('play', anonymous=True) + argv = rospy.myargv() + if len(argv) < 2 or len(argv) > 3 or argv[1] == '--help': + print('Usage: %s sound_to_play.(ogg|wav) [volume]' % argv[0]) + print() + print('Plays an .OGG or .WAV file. The path to the file should be absolute, and be valid on the computer on which sound_play is running.\n The (optional) second parameter sets the volume for the sound as a value between 0 and 1.0, where 0 is mute.') + exit(1) + + # Import after printing usage for speed. + from sound_play.msg import SoundRequest + from sound_play.libsoundplay import SoundClient + + soundhandle = SoundClient() + + rospy.sleep(1) + rospy.loginfo('Playing "%s".' % argv[1]) + + volume = float(argv[2]) if len(argv) == 3 else 1.0 + + soundhandle.playWave(argv[1], volume) + rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/playbuiltin.py b/src/lib/sound_play/scripts/playbuiltin.py new file mode 100755 index 000000000..2258fd4e8 --- /dev/null +++ b/src/lib/sound_play/scripts/playbuiltin.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +#*********************************************************** +#* Software License Agreement (BSD License) +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + +import sys + +if __name__ == '__main__': + import rospy + argv = rospy.myargv() + if len(argv) < 2 or len(argv) > 3 or argv[1] == '--help': + print('Usage: %s [volume]' % argv[0]) + print() + print('Plays one of the built-in sounds based on its integer ID. Look at the sound_play/SoundRequest message definition for IDs.\n The (optional) volume parameter sets the volume for the sound as a value between 0 and 1.0, where 0 is mute.') + exit(1) + + # Import here so that usage is fast. + from sound_play.msg import SoundRequest + from sound_play.libsoundplay import SoundClient + + rospy.init_node('play', anonymous=True) + + soundhandle = SoundClient() + rospy.sleep(1) + + num = int(argv[1]) + volume = float(argv[2]) if len(argv) == 3 else 1.0 + + rospy.loginfo('Playing sound %i.' % num) + + soundhandle.play(num, volume) + + rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/playpackage.py b/src/lib/sound_play/scripts/playpackage.py new file mode 100755 index 000000000..d3fc5f9e3 --- /dev/null +++ b/src/lib/sound_play/scripts/playpackage.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +#*********************************************************** +#* Software License Agreement (BSD License) +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Matthias Nieuwenhuisen, Blaise Gassend + + +import sys + +if __name__ == '__main__': + import rospy + argv = rospy.myargv() + if len(argv) < 3 or len(argv) > 4 or argv[1] == '--help': + print('Usage: %s package sound_to_play.(ogg|wav) [volume]' % argv[0]) + print() + print('Plays an .OGG or .WAV file. The path to the file should be relative to the package, and be valid on the computer on which sound_play is running. \n The (optional) volume parameter sets the volume for the sound as a value between 0 and 1.0, where 0 is mute.') + exit(1) + + # Import after printing usage for speed. + from sound_play.msg import SoundRequest + from sound_play.libsoundplay import SoundClient + + rospy.init_node('play', anonymous=True) + soundhandle = SoundClient() + + volume = float(argv[3]) if len(argv) == 4 else 1.0 + + rospy.sleep(1) + rospy.loginfo('Playing "%s" from pkg "%s".' % (argv[2], argv[1])) + soundhandle.playWaveFromPkg(argv[1], argv[2], volume) + rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/say.py b/src/lib/sound_play/scripts/say.py new file mode 100755 index 000000000..de0efb6c9 --- /dev/null +++ b/src/lib/sound_play/scripts/say.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +#*********************************************************** +#* Software License Agreement (BSD License) +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + + +import sys + +if __name__ == '__main__': + import rospy + argv = rospy.myargv() + if len(argv) > 1 and argv[1] == '--help': + print('Usage: %s \'String to say.\'' % argv[0]) + print(' %s < file_to_say.txt' % argv[0]) + print() + print('Says a string. For a string on the command line, you must use quotes as') + print('appropriate. For a string on standard input, the command will wait for') + print('EOF before saying anything.') + exit(-1) + + # Import after printing usage for speed. + from sound_play.msg import SoundRequest + from sound_play.libsoundplay import SoundClient + + if len(argv) == 1: + print('Awaiting something to say on standard input.') + + # Ordered this way to minimize wait time. + rospy.init_node('say', anonymous=True) + soundhandle = SoundClient() + rospy.sleep(1) + + voice = 'voice_kal_diphone' + volume = 1.0 + + if len(argv) == 1: + s = sys.stdin.read() + else: + s = argv[1] + + if len(argv) > 2: + voice = argv[2] + if len(argv) > 3: + volume = float(argv[3]) + + rospy.loginfo('Saying: %s' % s) + rospy.loginfo('Voice: %s' % voice) + rospy.loginfo('Volume: %s' % volume) + + soundhandle.say(s, voice, volume) + rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/shutup.py b/src/lib/sound_play/scripts/shutup.py new file mode 100755 index 000000000..e4f6878c3 --- /dev/null +++ b/src/lib/sound_play/scripts/shutup.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +#*********************************************************** +#* Software License Agreement (BSD License) +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + +import rospy +from sound_play.msg import SoundRequest +from sound_play.libsoundplay import SoundClient + +if __name__ == '__main__': + rospy.init_node('shutup', anonymous=True) + + soundhandle = SoundClient() + rospy.sleep(0.5) # let ROS get started... + + rospy.loginfo("Sending stopAll commande every 100 ms.") + rospy.loginfo("Note: This will not prevent a node that is continuing to issue commands") + rospy.loginfo("from producing sound.") + rospy.loginfo("Press Ctrl+C to exit.") + + while not rospy.is_shutdown(): + soundhandle.stopAll() + try: + rospy.sleep(.1) + except: + pass diff --git a/src/lib/sound_play/scripts/soundclient_example.py b/src/lib/sound_play/scripts/soundclient_example.py new file mode 100755 index 000000000..0f4a7b497 --- /dev/null +++ b/src/lib/sound_play/scripts/soundclient_example.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +""" +Simple example showing how to use the SoundClient provided by libsoundplay, +in blocking, non-blocking, and explicit usage. +""" + +import rospy +from sound_play.libsoundplay import SoundClient +from sound_play.msg import SoundRequest + + +def play_explicit(): + rospy.loginfo('Example: SoundClient play methods can take in an explicit' + ' blocking parameter') + soundhandle = SoundClient() # blocking = False by default + rospy.sleep(0.5) # Ensure publisher connection is successful. + + sound_beep = soundhandle.waveSound("say-beep.wav", volume=0.5) + # Play the same sound twice, once blocking and once not. The first call is + # blocking (explicitly specified). + sound_beep.play(blocking=True) + # This call is not blocking (uses the SoundClient's setting). + sound_beep.play() + rospy.sleep(0.5) # Let sound complete. + + # Play a blocking sound. + soundhandle.play(SoundRequest.NEEDS_UNPLUGGING, blocking=True) + + # Create a new SoundClient where the default behavior *is* to block. + soundhandle = SoundClient(blocking=True) + soundhandle.say('Say-ing stuff while block-ing') + soundhandle.say('Say-ing stuff without block-ing', blocking=False) + rospy.sleep(1) + + +def play_blocking(): + """ + Play various sounds, blocking until each is completed before going to the + next. + """ + rospy.loginfo('Example: Playing sounds in *blocking* mode.') + soundhandle = SoundClient(blocking=True) + + rospy.loginfo('Playing say-beep at full volume.') + soundhandle.playWave('say-beep.wav') + + rospy.loginfo('Playing say-beep at volume 0.3.') + soundhandle.playWave('say-beep.wav', volume=0.3) + + rospy.loginfo('Playing sound for NEEDS_PLUGGING.') + soundhandle.play(SoundRequest.NEEDS_PLUGGING) + + rospy.loginfo('Speaking some long string.') + soundhandle.say('It was the best of times, it was the worst of times.') + + +def play_nonblocking(): + """ + Play the same sounds with manual pauses between them. + """ + rospy.loginfo('Example: Playing sounds in *non-blocking* mode.') + # NOTE: you must sleep at the beginning to let the SoundClient publisher + # establish a connection to the soundplay_node. + soundhandle = SoundClient(blocking=False) + rospy.sleep(1) + + # In the non-blocking version you need to sleep between calls. + rospy.loginfo('Playing say-beep at full volume.') + soundhandle.playWave('say-beep.wav') + rospy.sleep(1) + + rospy.loginfo('Playing say-beep at volume 0.3.') + soundhandle.playWave('say-beep.wav', volume=0.3) + rospy.sleep(1) + + rospy.loginfo('Playing sound for NEEDS_PLUGGING.') + soundhandle.play(SoundRequest.NEEDS_PLUGGING) + rospy.sleep(1) + + rospy.loginfo('Speaking some long string.') + soundhandle.say('It was the best of times, it was the worst of times.') + # Note we will return before the string has finished playing. + + +if __name__ == '__main__': + rospy.init_node('soundclient_example', anonymous=False) + play_explicit() + play_blocking() + play_nonblocking() + rospy.loginfo('Finished') diff --git a/src/lib/sound_play/scripts/soundplay_node.py b/src/lib/sound_play/scripts/soundplay_node.py new file mode 100755 index 000000000..4e7eaf50c --- /dev/null +++ b/src/lib/sound_play/scripts/soundplay_node.py @@ -0,0 +1,462 @@ +#!/usr/bin/env python + +# *********************************************************** +# * Software License Agreement (BSD License) +# * +# * Copyright (c) 2009, Willow Garage, Inc. +# * All rights reserved. +# * +# * Redistribution and use in source and binary forms, with or without +# * modification, are permitted provided that the following conditions +# * are met: +# * +# * * Redistributions of source code must retain the above copyright +# * notice, this list of conditions and the following disclaimer. +# * * Redistributions in binary form must reproduce the above +# * copyright notice, this list of conditions and the following +# * disclaimer in the documentation and/or other materials provided +# * with the distribution. +# * * Neither the name of the Willow Garage nor the names of its +# * contributors may be used to endorse or promote products derived +# * from this software without specific prior written permission. +# * +# * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# * POSSIBILITY OF SUCH DAMAGE. +# *********************************************************** + +import os +import sys +import threading +import traceback +import yaml + +import actionlib +import roslib +import rospkg +import rospy + +from diagnostic_msgs.msg import DiagnosticArray +from diagnostic_msgs.msg import DiagnosticStatus +from diagnostic_msgs.msg import KeyValue +from sound_play.msg import SoundRequest +from sound_play.msg import SoundRequestAction +from sound_play.msg import SoundRequestFeedback +from sound_play.msg import SoundRequestResult +from sound_play.sound_type import SoundType + +try: + import gi + gi.require_version('Gst', '1.0') + from gi.repository import GObject as GObject + from gi.repository import Gst as Gst +except Exception: + str = """ +************************************************************** +Error opening pygst. Is gstreamer installed? +************************************************************** +""" + rospy.logfatal(str) + # print str + exit(1) + + +class SoundPlayNode(object): + _feedback = SoundRequestFeedback() + _result = SoundRequestResult() + + def stopdict(self, dict): + for sound in dict.values(): + sound.stop() + + def stopall(self): + self.stopdict(self.builtinsounds) + self.stopdict(self.filesounds) + self.stopdict(self.voicesounds) + + def select_sound(self, data): + if data.sound == SoundRequest.PLAY_FILE: + if not data.arg2: + if data.arg not in self.filesounds.keys(): + rospy.logdebug( + 'command for uncached wave: "%s"' % data.arg) + try: + self.filesounds[data.arg] = SoundType( + data.arg, self.device, data.volume) + except Exception: + rospy.logerr( + 'Error setting up to play "%s".' + 'Does this file exist on the machine' + 'on which sound_play is running?' % data.arg) + return + else: + rospy.logdebug('command for cached wave: "%s"' % data.arg) + filesound = self.filesounds[data.arg] + if filesound.sound.get_property('volume') != data.volume: + rospy.logdebug( + 'volume for cached wave has changed,' + 'resetting volume') + filesound.sound.set_property('volume', data.volume) + sound = self.filesounds[data.arg] + else: + absfilename = os.path.join( + roslib.packages.get_pkg_dir(data.arg2), data.arg) + if absfilename not in self.filesounds.keys(): + rospy.logdebug( + 'command for uncached wave: "%s"' % absfilename) + try: + self.filesounds[absfilename] = SoundType( + absfilename, self.device, data.volume) + except Exception: + rospy.logerr( + 'Error setting up to play "%s" from package "%s".' + 'Does this file exist on the machine ' + 'on which sound_play is running?' + % (data.arg, data.arg2)) + return + else: + rospy.logdebug( + 'command for cached wave: "%s"' % absfilename) + filesound = self.filesounds[absfilename] + if filesound.sound.get_property('volume') != data.volume: + rospy.logdebug( + 'volume for cached wave has changed,' + 'resetting volume') + filesound.sound.set_property('volume', data.volume) + sound = self.filesounds[absfilename] + elif data.sound == SoundRequest.SAY: + voice_key = data.arg + '---' + data.arg2 + if voice_key not in self.voicesounds.keys(): + rospy.logdebug('command for uncached text: "%s"' % voice_key) + if self.plugin is None: + rospy.logerr( + 'Plugin is not found {}.'.format(self.plugin_name)) + else: + if data.arg2 == '': + voice = self.default_voice + else: + voice = data.arg2 + wavfilename = self.plugin.sound_play_say_plugin( + data.arg, voice) + if wavfilename is None: + rospy.logerr('Failed to generate wavfile.') + else: + self.voicesounds[voice_key] = SoundType( + wavfilename, self.device, data.volume) + else: + rospy.logdebug('command for cached text: "%s"' % voice_key) + voicesound = self.voicesounds[voice_key] + if voicesound.sound.get_property('volume') != data.volume: + rospy.logdebug( + 'volume for cached text has changed, resetting volume') + voicesound.sound.set_property('volume', data.volume) + sound = self.voicesounds[voice_key] + else: + rospy.logdebug('command for builtin wave: %i' % data.sound) + if ((data.sound in self.builtinsounds and + data.volume != self.builtinsounds[data.sound].volume) + or data.sound not in self.builtinsounds): + params = self.builtinsoundparams[data.sound] + volume = data.volume + # use the second param as a scaling for the input volume + if params[1] != 1: + volume = (volume + params[1])/2 + self.builtinsounds[data.sound] = SoundType( + params[0], self.device, volume) + sound = self.builtinsounds[data.sound] + if sound.staleness != 0 and data.command != SoundRequest.PLAY_STOP: + # This sound isn't counted in active_sounds + rospy.logdebug("activating %i %s" % (data.sound, data.arg)) + self.active_sounds = self.active_sounds + 1 + sound.staleness = 0 + return sound + + def callback(self, data): + if not self.initialized: + return + self.mutex.acquire() + try: + if (data.sound == SoundRequest.ALL + and data.command == SoundRequest.PLAY_STOP): + self.stopall() + else: + sound = self.select_sound(data) + sound.command(data.command) + except Exception as e: + rospy.logerr('Exception in callback: %s' % str(e)) + rospy.loginfo(traceback.format_exc()) + finally: + self.mutex.release() + rospy.logdebug("done callback") + + # Purge sounds that haven't been played in a while. + def cleanupdict(self, dict): + purgelist = [] + for key, sound in iter(dict.items()): + try: + staleness = sound.get_staleness() + except Exception as e: + rospy.logerr( + 'Exception in cleanupdict for sound (%s): %s' + % (str(key), str(e))) + # Something is wrong. Let's purge and try again. + staleness = 100 + # print "%s %i"%(key, staleness) + if staleness >= 10: + purgelist.append(key) + # Sound is playing + if staleness == 0: + self.active_sounds = self.active_sounds + 1 + for key in purgelist: + rospy.logdebug('Purging %s from cache' % key) + # clean up resources + dict[key].dispose() + del dict[key] + + def cleanup(self): + self.mutex.acquire() + try: + self.active_sounds = 0 + self.cleanupdict(self.filesounds) + self.cleanupdict(self.voicesounds) + self.cleanupdict(self.builtinsounds) + except Exception: + rospy.loginfo( + 'Exception in cleanup: %s' % sys.exc_info()[0]) + finally: + self.mutex.release() + + def diagnostics(self, state): + try: + da = DiagnosticArray() + ds = DiagnosticStatus() + ds.name = rospy.get_caller_id().lstrip('/') + ": Node State" + if state == 0: + ds.level = DiagnosticStatus.OK + ds.message = "%i sounds playing" % self.active_sounds + ds.values.append( + KeyValue("Active sounds", str(self.active_sounds))) + ds.values.append( + KeyValue( + "Allocated sound channels", + str(self.num_channels))) + ds.values.append( + KeyValue( + "Buffered builtin sounds", + str(len(self.builtinsounds)))) + ds.values.append( + KeyValue( + "Buffered wave sounds", + str(len(self.filesounds)))) + ds.values.append( + KeyValue( + "Buffered voice sounds", + str(len(self.voicesounds)))) + elif state == 1: + ds.level = DiagnosticStatus.WARN + ds.message = "Sound device not open yet." + else: + ds.level = DiagnosticStatus.ERROR + ds.message = "Can't open sound device." +\ + "See http://wiki.ros.org/sound_play/Troubleshooting" + da.status.append(ds) + da.header.stamp = rospy.get_rostime() + self.diagnostic_pub.publish(da) + except Exception as e: + rospy.loginfo('Exception in diagnostics: %s' % str(e)) + + def execute_cb(self, data): + data = data.sound_request + if not self.initialized: + rospy.logerr('soundplay_node is not initialized yet.') + self._as.set_aborted() + return + self.mutex.acquire() + # Force only one sound at a time + self.stopall() + try: + if (data.sound == SoundRequest.ALL + and data.command == SoundRequest.PLAY_STOP): + self.stopall() + else: + sound = self.select_sound(data) + sound.command(data.command) + + r = rospy.Rate(self.loop_rate) + start_time = rospy.get_rostime() + success = True + while sound.get_playing(): + sound.update() + if self._as.is_preempt_requested(): + rospy.loginfo('sound_play action: Preempted') + sound.stop() + self._as.set_preempted() + success = False + break + + self._feedback.playing = sound.get_playing() + self._feedback.stamp = rospy.get_rostime() - start_time + self._as.publish_feedback(self._feedback) + r.sleep() + + if success: + self._result.playing = self._feedback.playing + self._result.stamp = self._feedback.stamp + rospy.loginfo('sound_play action: Succeeded') + self._as.set_succeeded(self._result) + + except Exception as e: + self._as.set_aborted() + rospy.logerr( + 'Exception in actionlib callback: %s' % str(e)) + rospy.loginfo(traceback.format_exc()) + finally: + self.mutex.release() + rospy.logdebug("done actionlib callback") + + def __init__(self): + Gst.init(None) + + # Start gobject thread to receive gstreamer messages + GObject.threads_init() + self.g_loop = threading.Thread(target=GObject.MainLoop().run) + self.g_loop.daemon = True + self.g_loop.start() + + rospy.init_node('sound_play') + self.loop_rate = rospy.get_param('~loop_rate', 100) + self.device = rospy.get_param("~device", "default") + self.default_voice = rospy.get_param('~default_voice', None) + self.plugin_name = rospy.get_param( + '~plugin', 'sound_play/festival_plugin') + self.diagnostic_pub = rospy.Publisher( + "/diagnostics", DiagnosticArray, queue_size=1) + rootdir = os.path.join( + roslib.packages.get_pkg_dir('sound_play'), 'sounds') + + # load plugin + rospack = rospkg.RosPack() + depend_pkgs = rospack.get_depends_on('sound_play', implicit=False) + depend_pkgs = ['sound_play'] + depend_pkgs + rospy.loginfo("Loading from plugin definitions") + plugin_yamls = [] + for depend_pkg in depend_pkgs: + manifest = rospack.get_manifest(depend_pkg) + plugin_yaml = manifest.get_export('sound_play', 'plugin') + if len(plugin_yaml) != 0: + plugin_yamls += plugin_yaml + for plugin_y in plugin_yaml: + rospy.logdebug('Loading plugin in {}'.format(plugin_y)) + plugin_dict = {} + for plugin_yaml in plugin_yamls: + if not os.path.exists(plugin_yaml): + rospy.logerr( + 'Failed to load plugin yaml: {}'.format(plugin_yaml)) + rospy.logerr( + 'Missing plugin yaml: {}'.format(plugin_yaml)) + continue + with open(plugin_yaml) as f: + plugin_descs = yaml.safe_load(f) + for plugin_desc in plugin_descs: + plugin_dict[plugin_desc['name']] = plugin_desc['module'] + + self.plugin = None + if self.plugin_name in plugin_dict.keys(): + plugin_module = plugin_dict[self.plugin_name] + mod = __import__(plugin_module.split('.')[0]) + for sub_mod in plugin_module.split('.')[1:]: + mod = getattr(mod, sub_mod) + self.plugin = mod() + + self.builtinsoundparams = { + SoundRequest.BACKINGUP: ( + os.path.join(rootdir, 'BACKINGUP.ogg'), 0.1), + SoundRequest.NEEDS_UNPLUGGING: ( + os.path.join(rootdir, 'NEEDS_UNPLUGGING.ogg'), 1), + SoundRequest.NEEDS_PLUGGING: ( + os.path.join(rootdir, 'NEEDS_PLUGGING.ogg'), 1), + SoundRequest.NEEDS_UNPLUGGING_BADLY: ( + os.path.join(rootdir, 'NEEDS_UNPLUGGING_BADLY.ogg'), 1), + SoundRequest.NEEDS_PLUGGING_BADLY: ( + os.path.join(rootdir, 'NEEDS_PLUGGING_BADLY.ogg'), 1), + } + + self.no_error = True + self.initialized = False + self.active_sounds = 0 + + self.mutex = threading.Lock() + self.sub = rospy.Subscriber("robotsound", SoundRequest, self.callback) + self._as = actionlib.SimpleActionServer( + 'sound_play', SoundRequestAction, + execute_cb=self.execute_cb, auto_start=False) + + self.mutex.acquire() + # For ros startup race condition + self.sleep(0.5) + self.diagnostics(1) + + while not rospy.is_shutdown(): + while not rospy.is_shutdown(): + self.init_vars() + self.no_error = True + self.initialized = True + self.mutex.release() + if not self._as.action_server.started: + self._as.start() + try: + self.idle_loop() + # Returns after inactive period to test device availability + # print "Exiting idle" + except Exception: + rospy.loginfo( + 'Exception in idle_loop: %s' % sys.exc_info()[0]) + finally: + self.mutex.acquire() + + self.diagnostics(2) + self.mutex.release() + + def init_vars(self): + self.num_channels = 10 + self.builtinsounds = {} + self.filesounds = {} + self.voicesounds = {} + self.hotlist = [] + if not self.initialized: + rospy.loginfo('sound_play node is ready to play sound') + + def sleep(self, duration): + try: + rospy.sleep(duration) + except rospy.exceptions.ROSInterruptException: + pass + + def get_sound_length(self): + sound_length = len(self.builtinsounds) +\ + len(self.voicesounds) + len(self.filesounds) + return sound_length + + def idle_loop(self): + self.last_activity_time = rospy.get_time() + while (not rospy.is_shutdown() + and (rospy.get_time() - self.last_activity_time < 10 + or self.get_sound_length() > 0)): + # print("idle_loop") + self.diagnostics(0) + self.sleep(1) + self.cleanup() + # print("idle_exiting") + + +if __name__ == '__main__': + SoundPlayNode() diff --git a/src/lib/sound_play/scripts/test.py b/src/lib/sound_play/scripts/test.py new file mode 100755 index 000000000..2bf9d0fbe --- /dev/null +++ b/src/lib/sound_play/scripts/test.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +#*********************************************************** +#* Software License Agreement (BSD License) +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + +import rospy, os, sys +from sound_play.msg import SoundRequest + +from sound_play.libsoundplay import SoundClient + +def sleep(t): + try: + rospy.sleep(t) + except: + pass + +if __name__ == '__main__': + rospy.init_node('soundplay_test', anonymous = True) + soundhandle = SoundClient() + + rospy.sleep(1) + + soundhandle.stopAll() + + rospy.loginfo("This script will run continuously until you hit CTRL+C, testing various sound_node sound types.") + + #print 'Try to play wave files that do not exist.' + #soundhandle.playWave('17') + #soundhandle.playWave('dummy') + + # print 'say' + # soundhandle.say('Hello world!') + # sleep(3) + + rospy.loginfo('wave') + soundhandle.playWave('say-beep.wav') + sleep(2) + + rospy.loginfo('quiet wave') + soundhandle.playWave('say-beep.wav', 0.3) + sleep(2) + + rospy.loginfo('plugging') + soundhandle.play(SoundRequest.NEEDS_PLUGGING) + sleep(2) + + rospy.loginfo('quiet plugging') + soundhandle.play(SoundRequest.NEEDS_PLUGGING, 0.3) + sleep(2) + + rospy.loginfo('unplugging') + soundhandle.play(SoundRequest.NEEDS_UNPLUGGING) + sleep(2) + + rospy.loginfo('plugging badly') + soundhandle.play(SoundRequest.NEEDS_PLUGGING_BADLY) + sleep(2) + + rospy.loginfo('unplugging badly') + soundhandle.play(SoundRequest.NEEDS_UNPLUGGING_BADLY) + sleep(2) + + s1 = soundhandle.builtinSound(SoundRequest.NEEDS_UNPLUGGING_BADLY) + s2 = soundhandle.waveSound("say-beep.wav") + s3 = soundhandle.voiceSound("Testing the new A P I") + s4 = soundhandle.builtinSound(SoundRequest.NEEDS_UNPLUGGING_BADLY, 0.3) + s5 = soundhandle.waveSound("say-beep.wav", 0.3) + s6 = soundhandle.voiceSound("Testing the new A P I", 0.3) + + rospy.loginfo("New API start voice") + s3.repeat() + sleep(3) + + rospy.loginfo("New API start voice quiet") + s6.play() + sleep(3) + + rospy.loginfo("New API wave") + s2.repeat() + sleep(2) + + rospy.loginfo("New API wave quiet") + s5.play() + sleep(2) + + rospy.loginfo("New API builtin") + s1.play() + sleep(2) + + rospy.loginfo("New API builtin quiet") + s4.play() + sleep(2) + + rospy.loginfo("New API stop") + s3.stop() diff --git a/src/lib/sound_play/scripts/test/test_sound_client.py b/src/lib/sound_play/scripts/test/test_sound_client.py new file mode 100644 index 000000000..89c567802 --- /dev/null +++ b/src/lib/sound_play/scripts/test/test_sound_client.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +import unittest + +import rospy +import rostest +from sound_play.libsoundplay import SoundClient + +class TestCase(unittest.TestCase): + def test_soundclient_constructor(self): + s = SoundClient() + self.assertIsNotNone(s) + +if __name__ == '__main__': + rostest.rosrun('sound_play', 'test_sound_client', TestCase) + +__author__ = 'Felix Duvallet' diff --git a/src/lib/sound_play/scripts/test_actionlib_client.py b/src/lib/sound_play/scripts/test_actionlib_client.py new file mode 100755 index 000000000..01840b621 --- /dev/null +++ b/src/lib/sound_play/scripts/test_actionlib_client.py @@ -0,0 +1,60 @@ +#! /usr/bin/env python + +import roslib; roslib.load_manifest('sound_play') +import rospy +import actionlib +from sound_play.msg import SoundRequest, SoundRequestAction, SoundRequestGoal + +import os + +def sound_play_client(volume=1.0): + client = actionlib.SimpleActionClient('sound_play', SoundRequestAction) + + client.wait_for_server() + + rospy.loginfo("Need Unplugging") + goal = SoundRequestGoal() + goal.sound_request.sound = SoundRequest.NEEDS_UNPLUGGING + goal.sound_request.command = SoundRequest.PLAY_ONCE + goal.sound_request.volume = volume + + client.send_goal(goal) + client.wait_for_result() + # print client.get_result() + rospy.loginfo("End Need Unplugging") + + rospy.loginfo("Need Plugging") + goal = SoundRequestGoal() + goal.sound_request.sound = SoundRequest.NEEDS_PLUGGING + goal.sound_request.command = SoundRequest.PLAY_ONCE + goal.sound_request.volume = volume + client.send_goal(goal) + client.wait_for_result() + # print client.get_result() + rospy.loginfo("End Need Plugging") + + rospy.loginfo("Say") + goal = SoundRequestGoal() + goal.sound_request.sound = SoundRequest.SAY + goal.sound_request.command = SoundRequest.PLAY_ONCE + goal.sound_request.arg = "Testing the actionlib interface A P I" + goal.sound_request.volume = volume + client.send_goal(goal) + client.wait_for_result() + # print client.get_result() + rospy.loginfo("End Say") + + rospy.loginfo("Wav") + goal = SoundRequestGoal() + goal.sound_request.sound = SoundRequest.PLAY_FILE + goal.sound_request.command = SoundRequest.PLAY_ONCE + goal.sound_request.arg = os.path.join(roslib.packages.get_pkg_dir('sound_play'),'sounds') + "/say-beep.wav" + goal.sound_request.volume = volume + client.send_goal(goal) + client.wait_for_result() + # print client.get_result() + rospy.loginfo("End wav") + +if __name__ == '__main__': + rospy.init_node('soundplay_client_test') + sound_play_client() diff --git a/src/lib/sound_play/setup.py b/src/lib/sound_play/setup.py new file mode 100644 index 000000000..df3c32f97 --- /dev/null +++ b/src/lib/sound_play/setup.py @@ -0,0 +1,9 @@ +from catkin_pkg.python_setup import generate_distutils_setup +from setuptools import setup + +d = generate_distutils_setup( + packages=['sound_play'], + package_dir={'': 'src'} + ) + +setup(**d) diff --git a/src/lib/sound_play/sound_play_plugin.yaml b/src/lib/sound_play/sound_play_plugin.yaml new file mode 100644 index 000000000..a5b262ee4 --- /dev/null +++ b/src/lib/sound_play/sound_play_plugin.yaml @@ -0,0 +1,4 @@ +- name: sound_play/festival_plugin + module: sound_play.festival_plugin.FestivalPlugin +- name: sound_play/flite_plugin + module: sound_play.flite_plugin.FlitePlugin diff --git a/src/lib/sound_play/soundplay_node.launch b/src/lib/sound_play/soundplay_node.launch new file mode 100644 index 000000000..f5110d35e --- /dev/null +++ b/src/lib/sound_play/soundplay_node.launch @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/sound_play/sounds/BACKINGUP.ogg b/src/lib/sound_play/sounds/BACKINGUP.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4bc6db541a87dcc6be24ee464531ab7bd6cb5d1a GIT binary patch literal 12861 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 literal 0 HcmV?d00001 diff --git a/src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg b/src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0a15885c383ce1a0d03dafbc95aa011a87811655 GIT binary patch literal 11050 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

Ytq*el{dTuufD`+@73+wG-GzCyZOhdN8 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 literal 0 HcmV?d00001 diff --git a/src/lib/sound_play/sounds/NEEDS_PLUGGING_BADLY.ogg b/src/lib/sound_play/sounds/NEEDS_PLUGGING_BADLY.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d336822e814007b8cbb3af0509317f145ebb2e3e GIT binary patch literal 35782 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 literal 0 HcmV?d00001 diff --git a/src/lib/sound_play/sounds/NEEDS_UNPLUGGING.ogg b/src/lib/sound_play/sounds/NEEDS_UNPLUGGING.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1596c734f4937bba42674f2f0cadddd12212c2ab GIT binary patch literal 35535 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 z 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 literal 0 HcmV?d00001 diff --git a/src/lib/sound_play/sounds/NEEDS_UNPLUGGING_BADLY.ogg b/src/lib/sound_play/sounds/NEEDS_UNPLUGGING_BADLY.ogg new file mode 100644 index 0000000000000000000000000000000000000000..028196f3a69db238065500ed74b2018ab27ce799 GIT binary patch literal 78198 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�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 F`+qM$N96zj literal 0 HcmV?d00001 diff --git a/src/lib/sound_play/sounds/say-beep.wav b/src/lib/sound_play/sounds/say-beep.wav new file mode 100644 index 0000000000000000000000000000000000000000..161c43c312bc0442869a0289f958d977a5aec578 GIT binary patch literal 4058 zcmZuzzl-BW6yAlvrps|$b2iWuA&k@yNh1Ol}hNuyREP@zVJ z!}{}ViX zzPY)%#lK(gZ}{)_=4V*GJAVZ~;r%a=e>;Ig?sXbP2Z>ofESj4%j% z-w%RNM2VDXmSt%wlLTr)2>9ce=)jXY3>eDH2s$y}zFKFE4p41De0-o?&n>>$^o9BmNhy)Xf$y1qV7$-%(67kr!hog~YTYi*OyS6>Q zwoS7wGD-7tL5#3eX(lCwMgGV(E#xW{L&qA9NA|=PLA-ux+Vi<>+jUVSn4`PGG>M2J zAzxmq2&En2S`i6eEsdooNY}+k}C?%EvYrxRw_Zi*tts?ef@u>=n*Ljkchq9iMYQ&}VTaWov+!-ZI-b-h2oACKo< zRb?TqCiaI&C^2jeUQQ9mvI=Ll^$^_;C*Nj+X|j;JP4kL^9`lOLZtv*jyx1-Tu zI`(3>YPN^B)9Ki}lxd31;vo=@g3Pe-QOhie@s1XS{nfw!^89V`Jd1p}+wR^^?Rj5s zGAVrQ7VHk39Zae~9MmH%16`>Unrdyz!NilQtK zER|(!rK?-_>25L}TT?9iOS3({?+?d%U8E5*bG*P4(8h5rb2?gC<?dw}}IBcpMiTNmZ=o1Ci#wjLZI!nS&^Xc8l8cyb37?(}Gdu?A1O;r`K5IzoX zKzkJh01Ho9sys+GC>izy@yW2uF4wJ|Wa6n=lt^|7)djYqG^n!S4 zFITqZtQ<@f$n|zpt=C9{&mkW~Y(O+D6`e`GA^7s5>j;gEd@J!ag@bh6)Jev-0NSg`r@k85(z#nYvuf zp7SGxEeg{`Vyd!Vv`7xks40(r8f(`v-pn@womZ)$4;!w}qFxS(;@@*7`P+@29#{LXT@SS*LhQ%Hsgz3l+}8( z*=)CX(22vx8{6J@oyB}=TefY_=8NSDr#2yIwXP~WE1XP->ZZQge72AWJ`=9H!j~AA zgP?pQ{wpDIIq-hRg!GScMFw=y;tJrrX?xN)n|^}75;RMSg1Hcy%RyfcI+(!HXH!YQ zi4DXjijOT9gja*MJvXk6s){;dC>O`08uKw%OQ1#cav=d?^U_?OSC|!o0qmxSUKSM* zqFRLodJiSaiBRSgg%nu>Pjc&Pgpa(=fN{!A5JH=D-Jk<& zhz1$766<1LG?ax!lpMO`RkB3aO0afp3V-n^h*mH}m7+#<5=vUR(C42XDWnRn6t5I? zHn8Ym3TK2UIR9OkT2D<|#mAZvNHy}an%1PDRyTki)>w@OQ;b=6`kF9yTb2Scl{-d6 z(Ts|6YUIUtG3#DO(C=R6Y$F^^2m_ioH{;OJFV>5@Uj!wfgLJi2;EyvPyC$d}CqP{j zSoL&XG$0NEdO2#_4=lE_77^5lxSc-BF~_JHkV)YR%?oou=$;a|meJgPVHj<&CZF!c zQedNEfTnXD_bMltHRKx5+2HE@ycP;d$WB+W^fuQLoln03R(N)^k$RjtjnLOfGh;?- yE4jI=j0Q_X#nTQNUjq%Yuii8FsAfPZQ8UC|NBPLf_rD&hm;OBbKa rospy.Duration(0): + if server_timeout is None: + server_timeout = rospy.Duration() + if not self.actionclient.wait_for_server(timeout=server_timeout): + return + + goal = SoundRequestGoal() + goal.sound_request = msg + while not replace and self._playing: + rospy.sleep(0.1) + self.actionclient.send_goal(goal) + if result_timeout is None or result_timeout > rospy.Duration(0): + if result_timeout is None: + result_timeout = rospy.Duration() + if self.actionclient.wait_for_result(timeout=result_timeout): + rospy.logdebug('sound request response received') + return + + def _action_status_cb(self, msg): + if 1 in [s.status for s in msg.status_list]: + self._playing = True + else: + self._playing = False diff --git a/src/lib/sound_play/src/sound_play/sound_play_plugin.py b/src/lib/sound_play/src/sound_play/sound_play_plugin.py new file mode 100644 index 000000000..f8ef500c2 --- /dev/null +++ b/src/lib/sound_play/src/sound_play/sound_play_plugin.py @@ -0,0 +1,30 @@ +class SoundPlayPlugin(object): + + """Base class for sound_play plugin + + This is a base class for sound_play plugin. + sound_play plugin has one method; sound_play_say_plugin. + sound_play_start_plugin run when command is SAY. + + sound_play plugin is defined in yaml format as below; + - name: sound_play/festival_plugin # plugin name + module: sound_play.festival_plugin.FestivalPlugin + # plugin module name + + Also, sound_play plugin yaml file is exported in package.xml as below; + + + + """ + + def __init__(self): + pass + + def sound_play_say_plugin(self, text, voice): + """Start plugin for sound_play + + Args: + text (string): speech text + voice (string): speech voice + """ + return None diff --git a/src/lib/sound_play/src/sound_play/sound_type.py b/src/lib/sound_play/src/sound_play/sound_type.py new file mode 100644 index 000000000..e5f089bf4 --- /dev/null +++ b/src/lib/sound_play/src/sound_play/sound_type.py @@ -0,0 +1,154 @@ +import os +import threading + +import rospy + +from sound_play.msg import SoundRequest + +try: + import gi + gi.require_version('Gst', '1.0') + from gi.repository import Gst as Gst +except Exception: + str = """ +************************************************************** +Error opening pygst. Is gstreamer installed? +************************************************************** +""" + rospy.logfatal(str) + # print str + exit(1) + + +class SoundType(object): + STOPPED = 0 + LOOPING = 1 + COUNTING = 2 + + def __init__(self, file, device, volume=1.0): + self.lock = threading.RLock() + self.state = self.STOPPED + self.sound = Gst.ElementFactory.make("playbin", None) + if self.sound is None: + raise Exception("Could not create sound player") + + if device: + self.sink = Gst.ElementFactory.make("alsasink", "sink") + self.sink.set_property("device", device) + self.sound.set_property("audio-sink", self.sink) + + if (":" in file): + uri = file + elif os.path.isfile(file): + uri = "file://" + os.path.abspath(file) + else: + rospy.logerr('Error: URI is invalid: %s' % file) + + self.uri = uri + self.volume = volume + self.sound.set_property('uri', uri) + self.sound.set_property("volume", volume) + self.staleness = 1 + self.file = file + + self.bus = self.sound.get_bus() + self.bus.add_signal_watch() + self.bus_conn_id = self.bus.connect("message", self.on_stream_end) + + def on_stream_end(self, bus, message): + if message.type == Gst.MessageType.EOS: + if (self.state == self.LOOPING): + self.sound.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0) + else: + self.stop() + + def __del__(self): + # stop our GST object so that it gets garbage-collected + self.dispose() + + def update(self): + if self.bus is not None: + self.bus.poll(Gst.MessageType.ERROR, 10) + + def loop(self): + self.lock.acquire() + try: + self.staleness = 0 + if self.state == self.COUNTING: + self.stop() + + if self.state == self.STOPPED: + self.sound.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0) + self.sound.set_state(Gst.State.PLAYING) + self.state = self.LOOPING + finally: + self.lock.release() + + def dispose(self): + self.lock.acquire() + try: + if self.bus is not None: + self.sound.set_state(Gst.State.NULL) + self.bus.disconnect(self.bus_conn_id) + self.bus.remove_signal_watch() + self.bus = None + self.sound = None + self.sink = None + self.state = self.STOPPED + except Exception as e: + rospy.logerr('Exception in dispose: %s' % str(e)) + finally: + self.lock.release() + + def stop(self): + if self.state != self.STOPPED: + self.lock.acquire() + try: + self.sound.set_state(Gst.State.NULL) + self.state = self.STOPPED + finally: + self.lock.release() + + def single(self): + self.lock.acquire() + try: + rospy.logdebug("Playing %s" % self.uri) + self.staleness = 0 + if self.state == self.LOOPING: + self.stop() + + self.sound.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0) + self.sound.set_state(Gst.State.PLAYING) + self.state = self.COUNTING + finally: + self.lock.release() + + def command(self, cmd): + if cmd == SoundRequest.PLAY_STOP: + self.stop() + elif cmd == SoundRequest.PLAY_ONCE: + self.single() + elif cmd == SoundRequest.PLAY_START: + self.loop() + + def get_staleness(self): + self.lock.acquire() + position = 0 + duration = 0 + try: + position = self.sound.query_position(Gst.Format.TIME)[1] + duration = self.sound.query_duration(Gst.Format.TIME)[1] + except Exception: + position = 0 + duration = 0 + finally: + self.lock.release() + + if position != duration: + self.staleness = 0 + else: + self.staleness = self.staleness + 1 + return self.staleness + + def get_playing(self): + return self.state == self.COUNTING diff --git a/src/lib/sound_play/test.launch b/src/lib/sound_play/test.launch new file mode 100644 index 000000000..743d8272a --- /dev/null +++ b/src/lib/sound_play/test.launch @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/lib/sound_play/test/CMakeLists.txt b/src/lib/sound_play/test/CMakeLists.txt new file mode 100644 index 000000000..8a6f8e810 --- /dev/null +++ b/src/lib/sound_play/test/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(test_sound_play test.cpp) +target_link_libraries(test_sound_play ${catkin_LIBRARIES}) +add_dependencies(test_sound_play sound_play_gencpp) +set_target_properties(test_sound_play PROPERTIES OUTPUT_NAME test) diff --git a/src/lib/sound_play/test/test.cpp b/src/lib/sound_play/test/test.cpp new file mode 100644 index 000000000..a272d7faa --- /dev/null +++ b/src/lib/sound_play/test/test.cpp @@ -0,0 +1,147 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2009, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +#include +#include + +void sleepok(int t, ros::NodeHandle &nh) +{ + if (nh.ok()) + sleep(t); +} + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "sound_play_test"); + + ros::NodeHandle nh; + sound_play::SoundClient sc; + sound_play::SoundClient quiet_sc; + + sleepok(1, nh); + + while(nh.ok()) + { + sc.say("Hello world!"); + sleepok(2, nh); + quiet_sc.say("Hello world!"); + sleepok(2, nh); + + const char *str1 = "I am annoying."; + sc.repeat(str1); + sleepok(4, nh); + sc.stopSaying(str1); + quiet_sc.repeat(str1); + sleepok(4, nh); + quiet_sc.stopSaying(str1); + + sc.playWave("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); + sleepok(2, nh); + quiet_sc.playWave("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); + sleepok(2, nh); + + const char *str2 = "/usr/share/xemacs21/xemacs-packages/etc/sounds/piano-beep.wav"; + sc.startWave(str2); + sleepok(4, nh); + sc.stopWave(str2); + quiet_sc.startWave(str2); + sleepok(4, nh); + quiet_sc.stopWave(str2); + + sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); + sleepok(2, nh); + quiet_sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); + sleepok(2, nh); + + sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); + sleepok(2, nh); + quiet_sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); + sleepok(2, nh); + + sc.start(sound_play::SoundRequest::BACKINGUP); + sleepok(4, nh); + sc.stop(sound_play::SoundRequest::BACKINGUP); + quiet_sc.start(sound_play::SoundRequest::BACKINGUP); + sleepok(4, nh); + quiet_sc.stop(sound_play::SoundRequest::BACKINGUP); + + sleepok(2, nh); + sound_play::Sound s1 = sc.waveSound("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); + s1.repeat(); + sleepok(1, nh); + s1.stop(); + + sleepok(2, nh); + sound_play::Sound s2 = quiet_sc.waveSound("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); + s2.repeat(); + sleepok(1, nh); + s2.stop(); + + sleepok(2, nh); + sound_play::Sound s3 = sc.voiceSound("This is a really long sentence that will get cut off."); + s3.play(); + sleepok(1, nh); + s3.stop(); + + sleepok(2, nh); + sound_play::Sound s4 = quiet_sc.voiceSound("This is a really long sentence that will get cut off."); + s4.play(); + sleepok(1, nh); + s4.stop(); + + sleepok(2, nh); + sound_play::Sound s5 = sc.builtinSound(sound_play::SoundRequest::NEEDS_UNPLUGGING_BADLY); + s5.play(); + sleepok(1, nh); + s5.stop(); + + sleepok(2, nh); + sound_play::Sound s6 = quiet_sc.builtinSound(sound_play::SoundRequest::NEEDS_UNPLUGGING_BADLY); + s6.play(); + sleepok(1, nh); + s6.stop(); + + sleepok(2, nh); + sound_play::Sound s7 = sc.waveSoundFromPkg("sound_play", "sounds/BACKINGUP.ogg"); + s7.play(); + sleepok(1, nh); + s7.stop(); + + sleepok(2, nh); + sound_play::Sound s8 = quiet_sc.waveSoundFromPkg("sound_play", "sounds/BACKINGUP.ogg"); + s8.play(); + sleepok(1, nh); + s8.stop(); + } +} From e4cd28e2323d479ba9fb7db62c237157109d9509 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 19:13:49 +0100 Subject: [PATCH 31/74] remove lib --- src/lib/.github/labeler.yml | 14 - src/lib/.github/workflows/labeler.yml | 17 - src/lib/.github/workflows/main.yml | 28 -- src/lib/.gitignore | 1 - src/lib/.gitrepo | 12 - src/lib/LICENSE | 29 -- src/lib/README.md | 37 -- src/lib/audio_capture/.gitignore | 1 - src/lib/audio_capture/CHANGELOG.rst | 220 --------- src/lib/audio_capture/CMakeLists.txt | 24 - src/lib/audio_capture/launch/capture.launch | 30 -- .../launch/capture_to_file.launch | 26 - .../audio_capture/launch/capture_wave.launch | 26 - src/lib/audio_capture/mainpage.dox | 21 - src/lib/audio_capture/package.xml | 31 -- src/lib/audio_capture/src/audio_capture.cpp | 263 ---------- src/lib/audio_common/CHANGELOG.rst | 120 ----- src/lib/audio_common/CMakeLists.txt | 4 - src/lib/audio_common/package.xml | 25 - src/lib/audio_common_msgs/.gitignore | 1 - src/lib/audio_common_msgs/CHANGELOG.rst | 127 ----- src/lib/audio_common_msgs/CMakeLists.txt | 22 - src/lib/audio_common_msgs/mainpage.dox | 11 - src/lib/audio_common_msgs/msg/AudioData.msg | 1 - .../msg/AudioDataStamped.msg | 2 - src/lib/audio_common_msgs/msg/AudioInfo.msg | 12 - src/lib/audio_common_msgs/package.xml | 22 - src/lib/audio_play/.gitignore | 1 - src/lib/audio_play/CHANGELOG.rst | 217 -------- src/lib/audio_play/CMakeLists.txt | 24 - src/lib/audio_play/launch/play.launch | 29 -- .../audio_play/launch/record_to_file.launch | 25 - src/lib/audio_play/mainpage.dox | 22 - src/lib/audio_play/package.xml | 32 -- src/lib/audio_play/src/audio_play.cpp | 196 -------- src/lib/sound_play/CHANGELOG.rst | 418 ---------------- src/lib/sound_play/CMakeLists.txt | 45 -- src/lib/sound_play/README.md | 67 --- src/lib/sound_play/action/SoundRequest.action | 7 - .../include/sound_play/sound_play.h | 410 ---------------- src/lib/sound_play/mainpage.dox | 23 - src/lib/sound_play/msg/SoundRequest.msg | 30 -- src/lib/sound_play/package.xml | 55 --- .../sound_play/resources/flitevox/.gitignore | 1 - src/lib/sound_play/scripts/is_speaking.py | 55 --- src/lib/sound_play/scripts/play.py | 62 --- src/lib/sound_play/scripts/playbuiltin.py | 66 --- src/lib/sound_play/scripts/playpackage.py | 63 --- src/lib/sound_play/scripts/say.py | 84 ---- src/lib/sound_play/scripts/shutup.py | 59 --- .../sound_play/scripts/soundclient_example.py | 91 ---- src/lib/sound_play/scripts/soundplay_node.py | 462 ------------------ src/lib/sound_play/scripts/test.py | 128 ----- .../scripts/test/test_sound_client.py | 17 - .../scripts/test_actionlib_client.py | 60 --- src/lib/sound_play/setup.py | 9 - src/lib/sound_play/sound_play_plugin.yaml | 4 - src/lib/sound_play/soundplay_node.launch | 27 - src/lib/sound_play/sounds/BACKINGUP.ogg | Bin 12861 -> 0 bytes src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg | Bin 11050 -> 0 bytes .../sounds/NEEDS_PLUGGING_BADLY.ogg | Bin 35782 -> 0 bytes .../sound_play/sounds/NEEDS_UNPLUGGING.ogg | Bin 35535 -> 0 bytes .../sounds/NEEDS_UNPLUGGING_BADLY.ogg | Bin 78198 -> 0 bytes src/lib/sound_play/sounds/say-beep.wav | Bin 4058 -> 0 bytes src/lib/sound_play/src/sound_play/__init__.py | 36 -- .../src/sound_play/festival_plugin.py | 61 --- .../sound_play/src/sound_play/flite_plugin.py | 57 --- .../sound_play/src/sound_play/libsoundplay.py | 374 -------------- .../src/sound_play/sound_play_plugin.py | 30 -- .../sound_play/src/sound_play/sound_type.py | 154 ------ src/lib/sound_play/test.launch | 9 - src/lib/sound_play/test/CMakeLists.txt | 4 - src/lib/sound_play/test/test.cpp | 147 ------ 73 files changed, 4788 deletions(-) delete mode 100644 src/lib/.github/labeler.yml delete mode 100644 src/lib/.github/workflows/labeler.yml delete mode 100644 src/lib/.github/workflows/main.yml delete mode 100644 src/lib/.gitignore delete mode 100644 src/lib/.gitrepo delete mode 100644 src/lib/LICENSE delete mode 100644 src/lib/README.md delete mode 100644 src/lib/audio_capture/.gitignore delete mode 100644 src/lib/audio_capture/CHANGELOG.rst delete mode 100644 src/lib/audio_capture/CMakeLists.txt delete mode 100644 src/lib/audio_capture/launch/capture.launch delete mode 100644 src/lib/audio_capture/launch/capture_to_file.launch delete mode 100644 src/lib/audio_capture/launch/capture_wave.launch delete mode 100644 src/lib/audio_capture/mainpage.dox delete mode 100644 src/lib/audio_capture/package.xml delete mode 100644 src/lib/audio_capture/src/audio_capture.cpp delete mode 100644 src/lib/audio_common/CHANGELOG.rst delete mode 100644 src/lib/audio_common/CMakeLists.txt delete mode 100644 src/lib/audio_common/package.xml delete mode 100644 src/lib/audio_common_msgs/.gitignore delete mode 100644 src/lib/audio_common_msgs/CHANGELOG.rst delete mode 100644 src/lib/audio_common_msgs/CMakeLists.txt delete mode 100644 src/lib/audio_common_msgs/mainpage.dox delete mode 100644 src/lib/audio_common_msgs/msg/AudioData.msg delete mode 100644 src/lib/audio_common_msgs/msg/AudioDataStamped.msg delete mode 100644 src/lib/audio_common_msgs/msg/AudioInfo.msg delete mode 100644 src/lib/audio_common_msgs/package.xml delete mode 100644 src/lib/audio_play/.gitignore delete mode 100644 src/lib/audio_play/CHANGELOG.rst delete mode 100644 src/lib/audio_play/CMakeLists.txt delete mode 100644 src/lib/audio_play/launch/play.launch delete mode 100644 src/lib/audio_play/launch/record_to_file.launch delete mode 100644 src/lib/audio_play/mainpage.dox delete mode 100644 src/lib/audio_play/package.xml delete mode 100644 src/lib/audio_play/src/audio_play.cpp delete mode 100644 src/lib/sound_play/CHANGELOG.rst delete mode 100644 src/lib/sound_play/CMakeLists.txt delete mode 100644 src/lib/sound_play/README.md delete mode 100644 src/lib/sound_play/action/SoundRequest.action delete mode 100644 src/lib/sound_play/include/sound_play/sound_play.h delete mode 100644 src/lib/sound_play/mainpage.dox delete mode 100644 src/lib/sound_play/msg/SoundRequest.msg delete mode 100644 src/lib/sound_play/package.xml delete mode 100644 src/lib/sound_play/resources/flitevox/.gitignore delete mode 100755 src/lib/sound_play/scripts/is_speaking.py delete mode 100755 src/lib/sound_play/scripts/play.py delete mode 100755 src/lib/sound_play/scripts/playbuiltin.py delete mode 100755 src/lib/sound_play/scripts/playpackage.py delete mode 100755 src/lib/sound_play/scripts/say.py delete mode 100755 src/lib/sound_play/scripts/shutup.py delete mode 100755 src/lib/sound_play/scripts/soundclient_example.py delete mode 100755 src/lib/sound_play/scripts/soundplay_node.py delete mode 100755 src/lib/sound_play/scripts/test.py delete mode 100644 src/lib/sound_play/scripts/test/test_sound_client.py delete mode 100755 src/lib/sound_play/scripts/test_actionlib_client.py delete mode 100644 src/lib/sound_play/setup.py delete mode 100644 src/lib/sound_play/sound_play_plugin.yaml delete mode 100644 src/lib/sound_play/soundplay_node.launch delete mode 100644 src/lib/sound_play/sounds/BACKINGUP.ogg delete mode 100644 src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg delete mode 100644 src/lib/sound_play/sounds/NEEDS_PLUGGING_BADLY.ogg delete mode 100644 src/lib/sound_play/sounds/NEEDS_UNPLUGGING.ogg delete mode 100644 src/lib/sound_play/sounds/NEEDS_UNPLUGGING_BADLY.ogg delete mode 100644 src/lib/sound_play/sounds/say-beep.wav delete mode 100644 src/lib/sound_play/src/sound_play/__init__.py delete mode 100644 src/lib/sound_play/src/sound_play/festival_plugin.py delete mode 100644 src/lib/sound_play/src/sound_play/flite_plugin.py delete mode 100644 src/lib/sound_play/src/sound_play/libsoundplay.py delete mode 100644 src/lib/sound_play/src/sound_play/sound_play_plugin.py delete mode 100644 src/lib/sound_play/src/sound_play/sound_type.py delete mode 100644 src/lib/sound_play/test.launch delete mode 100644 src/lib/sound_play/test/CMakeLists.txt delete mode 100644 src/lib/sound_play/test/test.cpp diff --git a/src/lib/.github/labeler.yml b/src/lib/.github/labeler.yml deleted file mode 100644 index 941f46ff3..000000000 --- a/src/lib/.github/labeler.yml +++ /dev/null @@ -1,14 +0,0 @@ -github-action: - - .github/**/* -audio_capture: - - audio_capture/**/* -audio_common: - - audio_common/**/* -audio_common_msgs: - - audio_common_msgs/**/* -audio_play: - - audio_play/**/* -sound_play: - - sound_play/**/* -readme: - - REAEME.md diff --git a/src/lib/.github/workflows/labeler.yml b/src/lib/.github/workflows/labeler.yml deleted file mode 100644 index 72e4b415f..000000000 --- a/src/lib/.github/workflows/labeler.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: "Pull Request Labeler" -on: -- pull_request_target - -permissions: - contents: read - -jobs: - triage: - permissions: - contents: read - pull-requests: write - runs-on: ubuntu-latest - steps: - - uses: actions/labeler@v3 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/src/lib/.github/workflows/main.yml b/src/lib/.github/workflows/main.yml deleted file mode 100644 index 784d44e64..000000000 --- a/src/lib/.github/workflows/main.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: ROS1 CI -on: - push: - pull_request: - schedule: - - cron: "0 0 * * *" -jobs: - industrial_ci: - strategy: - matrix: - env: - - ROS_DISTRO: melodic - ROS_REPO: testing - CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Debug' - - ROS_DISTRO: melodic - ROS_REPO: testing - CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Release' - - ROS_DISTRO: noetic - ROS_REPO: testing - CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Debug' - - ROS_DISTRO: noetic - ROS_REPO: testing - CMAKE_ARGS: '-DCMAKE_BUILD_TYPE=Release' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: 'ros-industrial/industrial_ci@master' - env: ${{matrix.env}} diff --git a/src/lib/.gitignore b/src/lib/.gitignore deleted file mode 100644 index 0d20b6487..000000000 --- a/src/lib/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.pyc diff --git a/src/lib/.gitrepo b/src/lib/.gitrepo deleted file mode 100644 index 4a1cd7989..000000000 --- a/src/lib/.gitrepo +++ /dev/null @@ -1,12 +0,0 @@ -; DO NOT EDIT (unless you know what you are doing) -; -; This subdirectory is a git "subrepo", and this file is maintained by the -; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme -; -[subrepo] - remote = git@github.com:ros-drivers/audio_common.git - branch = master - commit = 6a84996653eada328f6ea7b14e1804e9876aa3af - parent = 47da9a5c909072613a4b43ac0ff2f2368e4d2048 - method = merge - cmdver = 0.4.9 diff --git a/src/lib/LICENSE b/src/lib/LICENSE deleted file mode 100644 index c319170e5..000000000 --- a/src/lib/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2009, Willow Garage, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/lib/README.md b/src/lib/README.md deleted file mode 100644 index 29b0ea27b..000000000 --- a/src/lib/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# ROS audio\_common Package - -[![ROS1 CI](https://github.com/ros-drivers/audio_common/actions/workflows/main.yml/badge.svg)](https://github.com/ros-drivers/audio_common/actions/workflows/main.yml) -[![ROS2 CI](https://github.com/ros-drivers/audio_common/actions/workflows/ros2.yml/badge.svg)](https://github.com/ros-drivers/audio_common/actions/workflows/ros2.yml) - -This repository contains the ROS audio\_common package. - -For user documentation, please refer to the [ROS Wiki page for audio\_common](http://wiki.ros.org/audio_common) - -## Deb Build Status - -| Package | Melodic (Bionic) | Noetic (Focal) | Noetic (Buster) | -|:---------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| audio_common (arm64) | [![Build Status](http://build.ros.org/job/Mbin_ubv8_uBv8__audio_common__ubuntu_bionic_arm64__binary/badge/icon)](http://build.ros.org/job/Mbin_ubv8_uBv8__audio_common__ubuntu_bionic_arm64__binary) | [![Build Status](http://build.ros.org/job/Nbin_ufv8_uFv8__audio_common__ubuntu_focal_arm64__binary/badge/icon)](http://build.ros.org/job/Nbin_ufv8_uFv8__audio_common__ubuntu_focal_arm64__binary) | [![Build Status](http://build.ros.org/job/Nbin_dbv8_dBv8__audio_common__debian_buster_arm64__binary/badge/icon)](http://build.ros.org/job/Nbin_dbv8_dBv8__audio_common__debian_buster_arm64__binary) | -| audio_common (armhf) | [![Build Status](http://build.ros.org/job/Mbin_ubhf_uBhf__audio_common__ubuntu_bionic_armhf__binary/badge/icon)](http://build.ros.org/job/Mbin_ubhf_uBhf__audio_common__ubuntu_bionic_armhf__binary) | [![Build Status](http://build.ros.org/job/Nbin_ufhf_uFhf__audio_common__ubuntu_focal_armhf__binary/badge/icon)](http://build.ros.org/job/Nbin_ufhf_uFhf__audio_common__ubuntu_focal_armhf__binary) | --- | -| audio_common (i386) | --- | --- | --- | -| audio_common (amd64) | [![Build Status](http://build.ros.org/job/Mbin_uB64__audio_common__ubuntu_bionic_amd64__binary/badge/icon)](http://build.ros.org/job/Mbin_uB64__audio_common__ubuntu_bionic_amd64__binary) | [![Build Status](http://build.ros.org/job/Nbin_uF64__audio_common__ubuntu_focal_amd64__binary/badge/icon)](http://build.ros.org/job/Nbin_uF64__audio_common__ubuntu_focal_amd64__binary) | [![Build Status](http://build.ros.org/job/Nbin_db_dB64__audio_common__debian_buster_amd64__binary/badge/icon)](http://build.ros.org/job/Nbin_db_dB64__audio_common__debian_buster_amd64__binary) | - -## ROS1 source build - -On ROS Kinetic, Melodic and Noetic, the [master](https://github.com/ros-drivers/audio_common/tree/master) branch is recommended. - -## ROS2 source build - -On ROS2, the [ros2](https://github.com/ros-drivers/audio_common/tree/ros2) branch is recommended - -## Development, Branch and Release Policy - -The `master` branch is currently considered the development branch, and is released into ROS Kinetic, Melodic and Noetic with version numbers in the 0.3.x range. -`master` is accepting new, non-breaking features and bug fixes. - -Large, breaking changes such as changes to dependencies or the package API will be considered, -but they will probably be staged into a development branch for release into the next major release of ROS (ROS L) - -## Support - -Please ask support questions on [ROS Answers](http://answers.ros.org/questions/). diff --git a/src/lib/audio_capture/.gitignore b/src/lib/audio_capture/.gitignore deleted file mode 100644 index 378eac25d..000000000 --- a/src/lib/audio_capture/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/src/lib/audio_capture/CHANGELOG.rst b/src/lib/audio_capture/CHANGELOG.rst deleted file mode 100644 index 799d52b16..000000000 --- a/src/lib/audio_capture/CHANGELOG.rst +++ /dev/null @@ -1,220 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package audio_capture -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.3.18 (2024-08-13) -------------------- - -0.3.17 (2023-06-08) -------------------- -* Merge pull request `#220 `_ from v4hn/master -* on real systems publish system clock time in capture node -* The capture node is hard-coded to alsasrc -* Contributors: Shingo Kitagawa, v4hn - -0.3.16 (2022-12-23) -------------------- -* Merge pull request `#204 `_ from knorth55/audio-capture-stamped -* add todo comment -* publish audio stamped in audio_capture.cpp -* Merge pull request `#216 `_ from knorth55/launch-update -* update audio_capture launch -* Contributors: Shingo Kitagawa - -0.3.15 (2022-08-29) -------------------- - -0.3.14 (2022-08-18) -------------------- - -0.3.13 (2022-04-07) -------------------- - -0.3.12 (2021-09-01) -------------------- -* Merge branch 'master' into master -* Contributors: Shingo Kitagawa - -0.3.11 (2021-04-08) -------------------- - -0.3.10 (2021-01-07) -------------------- -* add bitrate in capture launch -* [audio_capture] Publish audio info once before publishing /audio -* Contributors: Naoya Yamaguchi, Shingo Kitagawa - -0.3.9 (2020-10-22) ------------------- -* Merge pull request `#160 `_ from knorth55/add-device-play -* use ROS_INFO instead of printf -* Contributors: Shingo Kitagawa - -0.3.8 (2020-09-13) ------------------- - -0.3.7 (2020-08-08) ------------------- -* Merge pull request `#150 `_ from sktometometo/fix_mp3_options - Fix property of lamemp3enc element in audio_capture so that the bitrate parameter work properly. -* fix property of lamemp3enc element so that it will use the specified bitrate -* Merge pull request `#146 `_ from knorth55/mp3-support -* use space instead of tab -* use same caps -* support channls for mp3 -* Merge pull request `#145 `_ from knorth55/mp3-channel-rate - [audio_capture] add sample_format in audio_capture -* Merge pull request `#147 `_ from knorth55/fix-filesink - [audio_capture] fix filesink for wave format -* add sample_format arg in capture_to_file.launch -* fix filesink for wave format -* add sample_format in audio_capture -* Contributors: Koki Shinjo, Shingo Kitagawa - -0.3.6 (2020-05-29) ------------------- -* Merge pull request `#141 `_ from knorth55/add-maintainer - add maintainer -* add maintainer -* Contributors: Shingo Kitagawa - -0.3.5 (2020-04-28) ------------------- - -0.3.4 (2020-04-02) ------------------- -* Merge branch 'master' of github.com:ros-drivers/audio_common -* Contributors: Gerard Canal - -0.3.3 (2018-05-22) ------------------- - -0.3.2 (2018-05-02) ------------------- -* [sound_play] add option to select audio device to play / record (`#87 `_) - * [sound_play] add option to select audio device to play - * [sound_play] reformat README to markdown; add usage to set device via rosparam - * audio_capture: add option for selecting device to use - * audio_play: add option to select device for playing audio - * add device argument to launch files - Conflicts: - audio_capture/launch/capture.launch - audio_capture/launch/capture_to_file.launch - audio_capture/src/audio_capture.cpp - audio_play/launch/play.launch - sound_play/scripts/soundplay_node.py -* Merge pull request `#102 `_ from EndPointCorp/fix_capture_leak - Fix audio_capture leak -* Fix audio_capture sample/buffer leak -* Merge pull request `#90 `_ from prarobo/master - Error checking code and improvements to launch files -* Bug fix -* fix(audio_capture): capturing wave using gst1.0 - 0.10-style raw audio caps were being created, according to GStreamer warning. Should be audio/x-raw,format=(string).. now. -* Merge pull request `#1 `_ from prarobo/fixes - Error checking code and improvements to launch files -* Removed default device -* Added error checking code -* Added parameters to launch files -* Contributors: Austin, Matt Vollrath, Prasanna Kannappan, Rokus, Yuki Furuta, prarobo - -0.3.1 (2016-08-28) ------------------- -* Update to new gstreamer rosdeps -* #70 can launch these in different namespaces with different microphones, and both are operating. -* #70 can switch between different microphones, but the first microphone doesn't like the hw:1, it only works with device:="" - so must be doing something wrong still. -* Add changelogs -* [audio_capture] add error handler -* [audio_capture] add option to publish captured audio data as wav format - Conflicts: - audio_capture/src/audio_capture.cpp -* Fixed memory leak (see #18). -* Removed trailing whitespace. -* Fixed problem that CMake uses gstreamer-0.1 instead of gstreamer-1.0 -* Added gstreamer 1.0 dependecies -* Ported to gstreamer 1.0 - package.xml dependencies still missing -* Update maintainer email -* Contributors: Benny, Felix Duvallet, Furushchev, Lucas Walter, trainman419 - -0.2.11 (2016-02-16) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.10 (2016-01-21) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.9 (2015-12-02) ------------------- -* Add changelogs -* [audio_capture] add error handler -* [audio_capture] add option to publish captured audio data as wav format -* Fixed memory leak (see `#18 `_). -* Removed trailing whitespace. -* Contributors: Felix Duvallet, Furushchev, trainman419 - -0.2.8 (2015-10-02) ------------------- -* Update maintainer email -* Contributors: trainman419 - -0.2.7 (2014-07-25) ------------------- -* audio_capture.cpp has to wait for generated AudioData headers -* Contributors: v4hn - -0.2.6 (2014-02-26) ------------------- -* audio_capture and play _require\_ gstreamer, it's not optional -* Contributors: v4hn - -0.2.5 (2014-01-23) ------------------- -* "0.2.5" -* Contributors: trainman419 - -0.2.4 (2013-09-10) ------------------- -* Update CMakeLists.txt -* audio_capture: install launchfiles -* Contributors: David Gossow - -0.2.3 (2013-07-15) ------------------- -* Fix install rule for audio_capture. -* Contributors: Austin Hendrix - -0.2.2 (2013-04-10) ------------------- - -0.2.1 (2013-04-08 13:59) ------------------------- - -0.2.0 (2013-04-08 13:49) ------------------------- -* Finish catkinizing audio_common. -* Catkinize audio_play. -* Catkinize audio_capture. -* Fix typo in package.xml -* Versions and more URLs. -* Convert manifests to package.xml -* Convert audio_capture manifest to package.xml -* Ditch old makefiles. -* Updates manifest -* Updated manifests for rodep2 -* oneiric build fixes, bump version to 0.1.6 -* Removed redundant thread::thread -* Added a rosdep.yaml file -* Fixed to use audio_common_msgs -* Added ability to use different festival voices -* Updated documentation -* Added ability to capture to file -* Fixed ignore files -* Added hgignore files -* Audio_capture and audio_play working -* Making separate audio_capture and audio_play packages -* Moved audio_transport to audio_capture -* Contributors: Austin Hendrix, Brian Gerkey, Nate Koenig, nkoenig diff --git a/src/lib/audio_capture/CMakeLists.txt b/src/lib/audio_capture/CMakeLists.txt deleted file mode 100644 index 0bc0b116c..000000000 --- a/src/lib/audio_capture/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(audio_capture) - -find_package(catkin REQUIRED COMPONENTS roscpp audio_common_msgs) - -find_package(PkgConfig) -pkg_check_modules(GST1.0 gstreamer-1.0 REQUIRED) - -find_package(Boost REQUIRED COMPONENTS thread) - -include_directories(${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GST1.0_INCLUDE_DIRS}) - -catkin_package() - -add_executable(audio_capture src/audio_capture.cpp) -target_link_libraries(audio_capture ${catkin_LIBRARIES} ${GST1.0_LIBRARIES} ${Boost_LIBRARIES}) -add_dependencies(audio_capture ${catkin_EXPORTED_TARGETS}) - -install(TARGETS audio_capture - DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) - -install(DIRECTORY launch - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) diff --git a/src/lib/audio_capture/launch/capture.launch b/src/lib/audio_capture/launch/capture.launch deleted file mode 100644 index 6495bb214..000000000 --- a/src/lib/audio_capture/launch/capture.launch +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/audio_capture/launch/capture_to_file.launch b/src/lib/audio_capture/launch/capture_to_file.launch deleted file mode 100644 index d81ef6534..000000000 --- a/src/lib/audio_capture/launch/capture_to_file.launch +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/audio_capture/launch/capture_wave.launch b/src/lib/audio_capture/launch/capture_wave.launch deleted file mode 100644 index 5daf779c9..000000000 --- a/src/lib/audio_capture/launch/capture_wave.launch +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/audio_capture/mainpage.dox b/src/lib/audio_capture/mainpage.dox deleted file mode 100644 index 4733f766e..000000000 --- a/src/lib/audio_capture/mainpage.dox +++ /dev/null @@ -1,21 +0,0 @@ -/** -\mainpage -\htmlinclude manifest.html - -\b audio_capture is a package that records audio from a microphone and makes it available to other ROS nodes. - -\section codeapi Code API - - - - -*/ diff --git a/src/lib/audio_capture/package.xml b/src/lib/audio_capture/package.xml deleted file mode 100644 index d517ef4b5..000000000 --- a/src/lib/audio_capture/package.xml +++ /dev/null @@ -1,31 +0,0 @@ - - audio_capture - 0.3.18 - - Transports audio from a source to a destination. Audio sources can come - from a microphone or file. The destination can play the audio or save it - to an mp3 file. - - Austin Hendrix - Shingo Kitagawa - Nate Koenig - BSD - http://ros.org/wiki/audio_capture - https://github.com/ros-drivers/audio_common - https://github.com/ros-drivers/audio_common/issues - - catkin - - roscpp - audio_common_msgs - libgstreamer1.0-dev - libgstreamer-plugins-base1.0-dev - - roscpp - audio_common_msgs - gstreamer1.0 - gstreamer1.0-alsa - gstreamer1.0-plugins-base - gstreamer1.0-plugins-good - gstreamer1.0-plugins-ugly - diff --git a/src/lib/audio_capture/src/audio_capture.cpp b/src/lib/audio_capture/src/audio_capture.cpp deleted file mode 100644 index 0ef67a878..000000000 --- a/src/lib/audio_capture/src/audio_capture.cpp +++ /dev/null @@ -1,263 +0,0 @@ -#include -#include -#include -#include - -#include - -#include "audio_common_msgs/AudioData.h" -#include "audio_common_msgs/AudioDataStamped.h" -#include "audio_common_msgs/AudioInfo.h" - -namespace audio_transport -{ - class RosGstCapture - { - public: - RosGstCapture() - { - _bitrate = 192; - - std::string dst_type; - - // Need to encoding or publish raw wave data - ros::param::param("~format", _format, "mp3"); - ros::param::param("~sample_format", _sample_format, "S16LE"); - - // The bitrate at which to encode the audio - ros::param::param("~bitrate", _bitrate, 192); - - // only available for raw data - ros::param::param("~channels", _channels, 1); - ros::param::param("~depth", _depth, 16); - ros::param::param("~sample_rate", _sample_rate, 16000); - - // The destination of the audio - ros::param::param("~dst", dst_type, "appsink"); - - // The source of the audio - //ros::param::param("~src", source_type, "alsasrc"); - std::string device; - ros::param::param("~device", device, ""); - - _pub = _nh.advertise("audio", 10, true); - _pub_stamped = _nh.advertise("audio_stamped", 10, true); - _pub_info = _nh.advertise("audio_info", 1, true); - - _loop = g_main_loop_new(NULL, false); - _pipeline = gst_pipeline_new("ros_pipeline"); - GstClock *clock = gst_system_clock_obtain(); - g_object_set(clock, "clock-type", GST_CLOCK_TYPE_REALTIME, NULL); - gst_pipeline_use_clock(GST_PIPELINE_CAST(_pipeline), clock); - gst_object_unref(clock); - - _bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline)); - gst_bus_add_signal_watch(_bus); - g_signal_connect(_bus, "message::error", - G_CALLBACK(onMessage), this); - g_object_unref(_bus); - - // We create the sink first, just for convenience - if (dst_type == "appsink") - { - _sink = gst_element_factory_make("appsink", "sink"); - g_object_set(G_OBJECT(_sink), "emit-signals", true, NULL); - g_object_set(G_OBJECT(_sink), "max-buffers", 100, NULL); - g_signal_connect( G_OBJECT(_sink), "new-sample", - G_CALLBACK(onNewBuffer), this); - } - else - { - ROS_INFO("file sink to %s", dst_type.c_str()); - _sink = gst_element_factory_make("filesink", "sink"); - g_object_set( G_OBJECT(_sink), "location", dst_type.c_str(), NULL); - } - - _source = gst_element_factory_make("alsasrc", "source"); - // if device isn't specified, it will use the default which is - // the alsa default source. - // A valid device will be of the foram hw:0,0 with other numbers - // than 0 and 0 as are available. - if (device != "") - { - // ghcar *gst_device = device.c_str(); - g_object_set(G_OBJECT(_source), "device", device.c_str(), NULL); - } - - GstCaps *caps; - caps = gst_caps_new_simple("audio/x-raw", - "format", G_TYPE_STRING, _sample_format.c_str(), - "channels", G_TYPE_INT, _channels, - "width", G_TYPE_INT, _depth, - "depth", G_TYPE_INT, _depth, - "rate", G_TYPE_INT, _sample_rate, - "signed", G_TYPE_BOOLEAN, TRUE, - NULL); - - gboolean link_ok; - if (_format == "mp3"){ - _filter = gst_element_factory_make("capsfilter", "filter"); - g_object_set( G_OBJECT(_filter), "caps", caps, NULL); - gst_caps_unref(caps); - - _convert = gst_element_factory_make("audioconvert", "convert"); - if (!_convert) { - ROS_ERROR_STREAM("Failed to create audioconvert element"); - exitOnMainThread(1); - } - - _encode = gst_element_factory_make("lamemp3enc", "encoder"); - if (!_encode) { - ROS_ERROR_STREAM("Failed to create encoder element"); - exitOnMainThread(1); - } - g_object_set( G_OBJECT(_encode), "target", 1, NULL); - g_object_set( G_OBJECT(_encode), "bitrate", _bitrate, NULL); - - gst_bin_add_many( GST_BIN(_pipeline), _source, _filter, _convert, _encode, _sink, NULL); - link_ok = gst_element_link_many(_source, _filter, _convert, _encode, _sink, NULL); - } else if (_format == "wave") { - if (dst_type == "appsink") { - g_object_set( G_OBJECT(_sink), "caps", caps, NULL); - gst_caps_unref(caps); - gst_bin_add_many( GST_BIN(_pipeline), _source, _sink, NULL); - link_ok = gst_element_link_many( _source, _sink, NULL); - } else { - _filter = gst_element_factory_make("wavenc", "filter"); - gst_bin_add_many( GST_BIN(_pipeline), _source, _filter, _sink, NULL); - link_ok = gst_element_link_many( _source, _filter, _sink, NULL); - } - } else { - ROS_ERROR_STREAM("format must be \"wave\" or \"mp3\""); - exitOnMainThread(1); - } - /*} - else - { - _sleep_time = 10000; - _source = gst_element_factory_make("filesrc", "source"); - g_object_set(G_OBJECT(_source), "location", source_type.c_str(), NULL); - - gst_bin_add_many( GST_BIN(_pipeline), _source, _sink, NULL); - gst_element_link_many(_source, _sink, NULL); - } - */ - - if (!link_ok) { - ROS_ERROR_STREAM("Unsupported media type."); - exitOnMainThread(1); - } - - gst_element_set_state(GST_ELEMENT(_pipeline), GST_STATE_PLAYING); - - _gst_thread = boost::thread( boost::bind(g_main_loop_run, _loop) ); - - audio_common_msgs::AudioInfo info_msg; - info_msg.channels = _channels; - info_msg.sample_rate = _sample_rate; - info_msg.sample_format = _sample_format; - info_msg.bitrate = _bitrate; - info_msg.coding_format = _format; - _pub_info.publish(info_msg); - } - - ~RosGstCapture() - { - g_main_loop_quit(_loop); - gst_element_set_state(_pipeline, GST_STATE_NULL); - gst_object_unref(_pipeline); - g_main_loop_unref(_loop); - } - - void exitOnMainThread(int code) - { - exit(code); - } - - void publish( const audio_common_msgs::AudioData &msg ) - { - _pub.publish(msg); - } - - void publishStamped( const audio_common_msgs::AudioDataStamped &msg ) - { - _pub_stamped.publish(msg); - } - - static GstFlowReturn onNewBuffer (GstAppSink *appsink, gpointer userData) - { - audio_common_msgs::AudioData msg; - audio_common_msgs::AudioDataStamped stamped_msg; - - RosGstCapture *server = reinterpret_cast(userData); - GstMapInfo map; - - GstSample *sample; - g_signal_emit_by_name(appsink, "pull-sample", &sample); - - GstBuffer *buffer = gst_sample_get_buffer(sample); - - if( ros::Time::isSimTime() ) - { - stamped_msg.header.stamp = ros::Time::now(); - } - else - { - GstClockTime buffer_time = gst_element_get_base_time(server->_source)+GST_BUFFER_PTS(buffer); - stamped_msg.header.stamp.fromNSec(buffer_time); - } - - gst_buffer_map(buffer, &map, GST_MAP_READ); - msg.data.resize( map.size ); - - memcpy( &msg.data[0], map.data, map.size ); - stamped_msg.audio = msg; - - gst_buffer_unmap(buffer, &map); - gst_sample_unref(sample); - - server->publish(msg); - server->publishStamped(stamped_msg); - - return GST_FLOW_OK; - } - - static gboolean onMessage (GstBus *bus, GstMessage *message, gpointer userData) - { - RosGstCapture *server = reinterpret_cast(userData); - GError *err; - gchar *debug; - - gst_message_parse_error(message, &err, &debug); - ROS_ERROR_STREAM("gstreamer: " << err->message); - g_error_free(err); - g_free(debug); - g_main_loop_quit(server->_loop); - server->exitOnMainThread(1); - return FALSE; - } - - private: - ros::NodeHandle _nh; - ros::Publisher _pub; - ros::Publisher _pub_stamped; - ros::Publisher _pub_info; - - boost::thread _gst_thread; - - GstElement *_pipeline, *_source, *_filter, *_sink, *_convert, *_encode; - GstBus *_bus; - int _bitrate, _channels, _depth, _sample_rate; - GMainLoop *_loop; - std::string _format, _sample_format; - }; -} - -int main (int argc, char **argv) -{ - ros::init(argc, argv, "audio_capture"); - gst_init(&argc, &argv); - - audio_transport::RosGstCapture server; - ros::spin(); -} diff --git a/src/lib/audio_common/CHANGELOG.rst b/src/lib/audio_common/CHANGELOG.rst deleted file mode 100644 index 638153081..000000000 --- a/src/lib/audio_common/CHANGELOG.rst +++ /dev/null @@ -1,120 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package audio_common -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.3.18 (2024-08-13) -------------------- - -0.3.17 (2023-06-08) -------------------- - -0.3.16 (2022-12-23) -------------------- - -0.3.15 (2022-08-29) -------------------- - -0.3.14 (2022-08-18) -------------------- - -0.3.13 (2022-04-07) -------------------- - -0.3.12 (2021-09-01) -------------------- -* Merge branch 'master' into master -* Contributors: Shingo Kitagawa - -0.3.11 (2021-04-08) -------------------- - -0.3.10 (2021-01-07) -------------------- - -0.3.9 (2020-10-22) ------------------- - -0.3.8 (2020-09-13) ------------------- - -0.3.7 (2020-08-08) ------------------- - -0.3.6 (2020-05-29) ------------------- -* Merge pull request `#141 `_ from knorth55/add-maintainer - add maintainer -* add maintainer -* Contributors: Shingo Kitagawa - -0.3.5 (2020-04-28) ------------------- - -0.3.4 (2020-04-02) ------------------- -* Merge branch 'master' of github.com:ros-drivers/audio_common -* Contributors: Gerard Canal - -0.3.3 (2018-05-22) ------------------- - -0.3.2 (2018-05-02) ------------------- - -0.3.1 (2016-08-28) ------------------- -* Add changelogs -* Update maintainer email -* Contributors: trainman419 - -0.2.11 (2016-02-16) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.10 (2016-01-21) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.9 (2015-12-02) ------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.8 (2015-10-02) ------------------- -* Update maintainer email -* Contributors: trainman419 - -0.2.7 (2014-07-25) ------------------- - -0.2.6 (2014-02-26) ------------------- - -0.2.5 (2014-01-23) ------------------- -* "0.2.5" -* Contributors: trainman419 - -0.2.4 (2013-09-10) ------------------- - -0.2.3 (2013-07-15) ------------------- - -0.2.2 (2013-04-10) ------------------- - -0.2.1 (2013-04-08 13:59) ------------------------- -* Fix metapackage for REP 127. -* Contributors: Austin Hendrix - -0.2.0 (2013-04-08 13:49) ------------------------- -* Versions and more URLs. -* Convert stack.xml to metapackage package.xml -* Start catkinizing. -* Contributors: Austin Hendrix diff --git a/src/lib/audio_common/CMakeLists.txt b/src/lib/audio_common/CMakeLists.txt deleted file mode 100644 index d0f5151e0..000000000 --- a/src/lib/audio_common/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(audio_common) -find_package(catkin REQUIRED) -catkin_metapackage() diff --git a/src/lib/audio_common/package.xml b/src/lib/audio_common/package.xml deleted file mode 100644 index f82716434..000000000 --- a/src/lib/audio_common/package.xml +++ /dev/null @@ -1,25 +0,0 @@ - - audio_common - 0.3.18 - - Common code for working with audio in ROS - - Austin Hendrix - Shingo Kitagawa - Blaise Gassend - BSD - http://ros.org/wiki/audio_common - https://github.com/ros-drivers/audio_common - https://github.com/ros-drivers/audio_common/issues - - catkin - - audio_capture - audio_common_msgs - audio_play - sound_play - - - - - diff --git a/src/lib/audio_common_msgs/.gitignore b/src/lib/audio_common_msgs/.gitignore deleted file mode 100644 index 378eac25d..000000000 --- a/src/lib/audio_common_msgs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/src/lib/audio_common_msgs/CHANGELOG.rst b/src/lib/audio_common_msgs/CHANGELOG.rst deleted file mode 100644 index 27f3a76bd..000000000 --- a/src/lib/audio_common_msgs/CHANGELOG.rst +++ /dev/null @@ -1,127 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package audio_common_msgs -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.3.18 (2024-08-13) -------------------- - -0.3.17 (2023-06-08) -------------------- - -0.3.16 (2022-12-23) -------------------- -* Merge pull request `#202 `_ from knorth55/audio-stamped-msg -* add AudioDataStamped.msg -* Contributors: Shingo Kitagawa - -0.3.15 (2022-08-29) -------------------- - -0.3.14 (2022-08-18) -------------------- - -0.3.13 (2022-04-07) -------------------- - -0.3.12 (2021-09-01) -------------------- -* Merge branch 'master' into master -* Contributors: Shingo Kitagawa - -0.3.11 (2021-04-08) -------------------- - -0.3.10 (2021-01-07) -------------------- -* Change comment style in AudioInfo.msg -* [audio_common_msgs] AudioInfo.msg to add audio meta data -* Contributors: Naoya Yamaguchi - -0.3.9 (2020-10-22) ------------------- - -0.3.8 (2020-09-13) ------------------- - -0.3.7 (2020-08-08) ------------------- - -0.3.6 (2020-05-29) ------------------- -* Merge pull request `#141 `_ from knorth55/add-maintainer - add maintainer -* add maintainer -* Contributors: Shingo Kitagawa - -0.3.5 (2020-04-28) ------------------- - -0.3.4 (2020-04-02) ------------------- -* Merge branch 'master' of github.com:ros-drivers/audio_common -* Contributors: Gerard Canal - -0.3.3 (2018-05-22) ------------------- - -0.3.2 (2018-05-02) ------------------- - -0.3.1 (2016-08-28) ------------------- -* Add changelogs -* Update maintainer email -* Contributors: trainman419 - -0.2.11 (2016-02-16) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.10 (2016-01-21) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.9 (2015-12-02) ------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.8 (2015-10-02) ------------------- -* Update maintainer email -* Contributors: trainman419 - -0.2.7 (2014-07-25) ------------------- - -0.2.6 (2014-02-26) ------------------- - -0.2.5 (2014-01-23) ------------------- -* "0.2.5" -* Contributors: trainman419 - -0.2.4 (2013-09-10) ------------------- - -0.2.3 (2013-07-15) ------------------- - -0.2.2 (2013-04-10) ------------------- - -0.2.1 (2013-04-08 13:59) ------------------------- - -0.2.0 (2013-04-08 13:49) ------------------------- -* Catkinize audio_common_msgs. -* Versions and more URLs. -* Convert manifests to package.xml -* Ditch old makefiles. -* Fixed audio_msgs names to audio_common_msgs -* Renamed audio_msgs to audio_common_msgs -* Contributors: Austin Hendrix, Nate Koenig diff --git a/src/lib/audio_common_msgs/CMakeLists.txt b/src/lib/audio_common_msgs/CMakeLists.txt deleted file mode 100644 index 3b06fdb6d..000000000 --- a/src/lib/audio_common_msgs/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(audio_common_msgs) - -find_package(catkin REQUIRED - COMPONENTS - message_generation - std_msgs -) - -add_message_files(DIRECTORY msg FILES - AudioData.msg - AudioDataStamped.msg - AudioInfo.msg - ) - -generate_messages( - DEPENDENCIES - std_msgs -) - -catkin_package(CATKIN_DEPENDS message_runtime) diff --git a/src/lib/audio_common_msgs/mainpage.dox b/src/lib/audio_common_msgs/mainpage.dox deleted file mode 100644 index 24249e466..000000000 --- a/src/lib/audio_common_msgs/mainpage.dox +++ /dev/null @@ -1,11 +0,0 @@ -/** -\mainpage -\htmlinclude manifest.html - -\b audio_common_msgs contain messages for transimitting audio via ROS. - - -\section codeapi Code API - - -*/ diff --git a/src/lib/audio_common_msgs/msg/AudioData.msg b/src/lib/audio_common_msgs/msg/AudioData.msg deleted file mode 100644 index dd2331bbe..000000000 --- a/src/lib/audio_common_msgs/msg/AudioData.msg +++ /dev/null @@ -1 +0,0 @@ -uint8[] data diff --git a/src/lib/audio_common_msgs/msg/AudioDataStamped.msg b/src/lib/audio_common_msgs/msg/AudioDataStamped.msg deleted file mode 100644 index 30e7e2b16..000000000 --- a/src/lib/audio_common_msgs/msg/AudioDataStamped.msg +++ /dev/null @@ -1,2 +0,0 @@ -std_msgs/Header header -audio_common_msgs/AudioData audio diff --git a/src/lib/audio_common_msgs/msg/AudioInfo.msg b/src/lib/audio_common_msgs/msg/AudioInfo.msg deleted file mode 100644 index ca4b55e34..000000000 --- a/src/lib/audio_common_msgs/msg/AudioInfo.msg +++ /dev/null @@ -1,12 +0,0 @@ -# This message contains the audio meta data - -# Number of channels -uint8 channels -# Sampling rate [Hz] -uint32 sample_rate -# Audio format (e.g. S16LE) -string sample_format -# Amount of audio data per second [bits/s] -uint32 bitrate -# Audio coding format (e.g. WAVE, MP3) -string coding_format diff --git a/src/lib/audio_common_msgs/package.xml b/src/lib/audio_common_msgs/package.xml deleted file mode 100644 index 75c129679..000000000 --- a/src/lib/audio_common_msgs/package.xml +++ /dev/null @@ -1,22 +0,0 @@ - - audio_common_msgs - 0.3.18 - - Messages for transmitting audio via ROS - - Austin Hendrix - Shingo Kitagawa - Nate Koenig - BSD - http://ros.org/wiki/audio_common_msgs - https://github.com/ros-drivers/audio_common - https://github.com/ros-drivers/audio_common/issues - - catkin - - message_generation - std_msgs - - message_runtime - std_msgs - diff --git a/src/lib/audio_play/.gitignore b/src/lib/audio_play/.gitignore deleted file mode 100644 index 378eac25d..000000000 --- a/src/lib/audio_play/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/src/lib/audio_play/CHANGELOG.rst b/src/lib/audio_play/CHANGELOG.rst deleted file mode 100644 index 2f1e56a42..000000000 --- a/src/lib/audio_play/CHANGELOG.rst +++ /dev/null @@ -1,217 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package audio_play -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.3.18 (2024-08-13) -------------------- -* Merge pull request `#238 `_ from Kanazawanaoaki/add-record-to-file-launch -* Add record to file launch -* Contributors: Kanazawanaoaki, Shingo Kitagawa - -0.3.17 (2023-06-08) -------------------- - -0.3.16 (2022-12-23) -------------------- -* Merge pull request `#216 `_ from knorth55/launch-update -* update play.launch -* Merge pull request `#206 `_ from knorth55/fix-205 -* unref buffer in audio_play to avoid memory leak -* Contributors: Shingo Kitagawa - -0.3.15 (2022-08-29) -------------------- - -0.3.14 (2022-08-18) -------------------- - -0.3.13 (2022-04-07) -------------------- -* Merge pull request `#179 `_ from tkmtnt7000/PR-remap-audio-topic -* audio_play: add audio_topic option -* Contributors: Naoto Tsukamoto, Shingo Kitagawa - -0.3.12 (2021-09-01) -------------------- -* Merge branch 'master' into master -* Contributors: Shingo Kitagawa - -0.3.11 (2021-04-08) -------------------- - -0.3.10 (2021-01-07) -------------------- - -0.3.9 (2020-10-22) ------------------- -* Merge pull request `#160 `_ from knorth55/add-device-play -* refactor audio_play to use same code -* add audioresample in audio_play -* apply caps for both formats -* add device for wave format -* add sync false for alsasink -* use alsasink -* add depth rosparam -* add device arg in play.launch -* fix audio_play to save file -* Contributors: Shingo Kitagawa - -0.3.8 (2020-09-13) ------------------- -* Merge pull request `#151 `_ from knorth55/do-timestamp-false - [audio_play] set do_timestamp false -* set do_timestamp false -* Contributors: Shingo Kitagawa - -0.3.7 (2020-08-08) ------------------- -* Merge pull request `#146 `_ from knorth55/mp3-support -* support format, rate, channels in mp3 -* Merge pull request `#127 `_ from knorth55/audio-play-wave - [audio_play] support wave format -* add sample_format param in audio_play -* add channels and sample_rate in audio_play/play.launch -* add channels and sample_rate in audio_play.cpp -* add format arg in play.launch -* support wave in audio_play -* Merge pull request `#144 `_ from ros-drivers/knorth55-patch-1 -* add gstreamer1.0-alsa for run_depend in audio_play -* Contributors: Shingo Kitagawa - -0.3.6 (2020-05-29) ------------------- -* Merge pull request `#141 `_ from knorth55/add-maintainer - add maintainer -* add maintainer -* Contributors: Shingo Kitagawa - -0.3.5 (2020-04-28) ------------------- - -0.3.4 (2020-04-02) ------------------- -* audio_play fix for reproducing livestream sound (`#122 `_) - * Added capability to read from a udpsrc. To generalize it, possibly similarly to gscam. - * Added parameter to control do-timestamp, as this fixes the problem with audio_play not being able to play livestream sound. - * Aligning with the base master, removing the changes from the branch that included the udpsrc. - Co-authored-by: Alberto Quattrini Li -* Merge branch 'master' of github.com:ros-drivers/audio_common -* Contributors: Alberto Quattrini Li, Gerard Canal - -0.3.3 (2018-05-22) ------------------- - -0.3.2 (2018-05-02) ------------------- -* [sound_play] add option to select audio device to play / record (`#87 `_) - * [sound_play] add option to select audio device to play - * [sound_play] reformat README to markdown; add usage to set device via rosparam - * audio_capture: add option for selecting device to use - * audio_play: add option to select device for playing audio - * add device argument to launch files - Conflicts: - audio_capture/launch/capture.launch - audio_capture/launch/capture_to_file.launch - audio_capture/src/audio_capture.cpp - audio_play/launch/play.launch - sound_play/scripts/soundplay_node.py -* Merge pull request `#101 `_ from EndPointCorp/audio_play_dont_pause_pipeline - audio_play: Fix mp3 clip overlap by never pausing the pipeline -* audio_play: Don't pause the pipeline - This prevents glitches when playing short mp3 clips. -* Merge pull request `#90 `_ from prarobo/master - Error checking code and improvements to launch files -* Merge pull request `#1 `_ from prarobo/fixes - Error checking code and improvements to launch files -* Added parameters to launch files -* Contributors: Austin, Matt Vollrath, Prasanna Kannappan, Yuki Furuta, prarobo - -0.3.1 (2016-08-28) ------------------- -* Update to new gstreamer rosdeps -* #70 can launch these in different namespaces with different microphones, and both are operating. -* Add changelogs -* Changed message level to warning -* Fixed problem that CMake uses gstreamer-0.1 instead of gstreamer-1.0 -* Fixed underflow. - Before the sink buffer underflows the pipeline is paused. When data is received again the pipeline is set to playing again. -* Added gstreamer 1.0 dependecies -* Ported to gstreamer 1.0 - package.xml dependencies still missing -* Change audio sink to autoaudiosink -* Update maintainer email -* Contributors: Benny, Hans Gaiser, Lucas Walter, trainman419 - -0.2.11 (2016-02-16) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.10 (2016-01-21) -------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.9 (2015-12-02) ------------------- -* Add changelogs -* Contributors: trainman419 - -0.2.8 (2015-10-02) ------------------- -* Changed message level to warning -* Fixed underflow. - Before the sink buffer underflows the pipeline is paused. When data is received again the pipeline is set to playing again. -* Change audio sink to autoaudiosink -* Update maintainer email -* Contributors: Benny, Hans Gaiser, trainman419 - -0.2.7 (2014-07-25) ------------------- - -0.2.6 (2014-02-26) ------------------- -* audio_capture and play _require\_ gstreamer, it's not optional -* Contributors: v4hn - -0.2.5 (2014-01-23) ------------------- -* "0.2.5" -* Contributors: trainman419 - -0.2.4 (2013-09-10) ------------------- - -0.2.3 (2013-07-15) ------------------- -* Fix dependencies and install rules. -* Contributors: Austin Hendrix - -0.2.2 (2013-04-10) ------------------- - -0.2.1 (2013-04-08 13:59) ------------------------- - -0.2.0 (2013-04-08 13:49) ------------------------- -* Finish catkinizing audio_common. -* Catkinize audio_play. -* Fix typo in package.xml -* Versions and more URLs. -* Convert manifests to package.xml -* Ditch old makefiles. -* Updates manifest -* Updated manifests for rodep2 -* oneiric build fixes, bump version to 0.1.6 -* Removed another duplicate thread::thread -* Added a rosdep.yaml file -* Fixed to use audio_common_msgs -* Added ability to use different festival voices -* Updated documentation -* Update to audio_play -* Fixed ignore files -* Added hgignore files -* Audio_capture and audio_play working -* Making separate audio_capture and audio_play packages -* Contributors: Austin Hendrix, Brian Gerkey, Nate Koenig, nkoenig diff --git a/src/lib/audio_play/CMakeLists.txt b/src/lib/audio_play/CMakeLists.txt deleted file mode 100644 index 50f48e7a4..000000000 --- a/src/lib/audio_play/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(audio_play) - -find_package(catkin REQUIRED COMPONENTS roscpp audio_common_msgs) - -find_package(PkgConfig) -pkg_check_modules(GST1.0 gstreamer-1.0 REQUIRED) - -find_package(Boost REQUIRED COMPONENTS thread) - -include_directories(${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GST1.0_INCLUDE_DIRS}) - -catkin_package() - -add_executable(audio_play src/audio_play.cpp) -target_link_libraries(audio_play ${catkin_LIBRARIES} ${GST1.0_LIBRARIES} ${Boost_LIBRARIES}) -add_dependencies(audio_play ${catkin_EXPORTED_TARGETS}) - -install(TARGETS audio_play - DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) - -install(DIRECTORY launch - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) diff --git a/src/lib/audio_play/launch/play.launch b/src/lib/audio_play/launch/play.launch deleted file mode 100644 index 2a11ead4b..000000000 --- a/src/lib/audio_play/launch/play.launch +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/audio_play/launch/record_to_file.launch b/src/lib/audio_play/launch/record_to_file.launch deleted file mode 100644 index d1ccc69ab..000000000 --- a/src/lib/audio_play/launch/record_to_file.launch +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/audio_play/mainpage.dox b/src/lib/audio_play/mainpage.dox deleted file mode 100644 index 5c05407c2..000000000 --- a/src/lib/audio_play/mainpage.dox +++ /dev/null @@ -1,22 +0,0 @@ -/** -\mainpage -\htmlinclude manifest.html - -\b audio_play is a package that listens to a node that produces audio_msgs, and plays them through a connected speaker. - - -\section codeapi Code API - - - - -*/ diff --git a/src/lib/audio_play/package.xml b/src/lib/audio_play/package.xml deleted file mode 100644 index 4ef6a95e9..000000000 --- a/src/lib/audio_play/package.xml +++ /dev/null @@ -1,32 +0,0 @@ - - audio_play - 0.3.18 - - Outputs audio to a speaker from a source node. - - Austin Hendrix - Shingo Kitagawa - Nate Koenig - BSD - http://ros.org/wiki/audio_play - https://github.com/ros-drivers/audio_common - https://github.com/ros-drivers/audio_common/issues - - catkin - - roscpp - audio_common_msgs - libgstreamer1.0-dev - libgstreamer-plugins-base1.0-dev - - roscpp - audio_common_msgs - gstreamer1.0 - gstreamer1.0-alsa - gstreamer1.0-plugins-base - gstreamer1.0-plugins-ugly - gstreamer1.0-plugins-good - - - - diff --git a/src/lib/audio_play/src/audio_play.cpp b/src/lib/audio_play/src/audio_play.cpp deleted file mode 100644 index fe127c2ab..000000000 --- a/src/lib/audio_play/src/audio_play.cpp +++ /dev/null @@ -1,196 +0,0 @@ -#include -#include -#include -#include - -#include "audio_common_msgs/AudioData.h" - -namespace audio_transport -{ - class RosGstPlay - { - public: - RosGstPlay() - { - GstPad *audiopad; - GstCaps *caps; - - std::string dst_type; - std::string device; - bool do_timestamp; - std::string format; - int channels; - int depth; - int sample_rate; - std::string sample_format; - - // The destination of the audio - ros::param::param("~dst", dst_type, "alsasink"); - ros::param::param("~device", device, std::string()); - ros::param::param("~do_timestamp", do_timestamp, true); - ros::param::param("~format", format, "mp3"); - ros::param::param("~channels", channels, 1); - ros::param::param("~depth", depth, 16); - ros::param::param("~sample_rate", sample_rate, 16000); - ros::param::param("~sample_format", sample_format, "S16LE"); - - _sub = _nh.subscribe("audio", 10, &RosGstPlay::onAudio, this); - - _loop = g_main_loop_new(NULL, false); - - _pipeline = gst_pipeline_new("app_pipeline"); - _source = gst_element_factory_make("appsrc", "app_source"); - g_object_set(G_OBJECT(_source), "do-timestamp", (do_timestamp) ? TRUE : FALSE, NULL); - - //_playbin = gst_element_factory_make("playbin2", "uri_play"); - //g_object_set( G_OBJECT(_playbin), "uri", "file:///home/test/test.mp3", NULL); - caps = gst_caps_new_simple( - "audio/x-raw", - "format", G_TYPE_STRING, sample_format.c_str(), - "rate", G_TYPE_INT, sample_rate, - "channels", G_TYPE_INT, channels, - "width", G_TYPE_INT, depth, - "depth", G_TYPE_INT, depth, - "signed", G_TYPE_BOOLEAN, TRUE, - "layout", G_TYPE_STRING, "interleaved", - NULL); - - if (dst_type == "alsasink") - { - _audio = gst_bin_new("audiobin"); - _convert = gst_element_factory_make("audioconvert", "convert"); - audiopad = gst_element_get_static_pad(_convert, "sink"); - _resample = gst_element_factory_make("audioresample", "resample"); - - _sink = gst_element_factory_make("alsasink", "sink"); - g_object_set(G_OBJECT(_sink), "sync", FALSE, NULL); - if (!device.empty()) { - g_object_set(G_OBJECT(_sink), "device", device.c_str(), NULL); - } - gst_bin_add_many( GST_BIN(_audio), _convert, _resample, _sink, NULL); - gst_element_link_many(_convert, _resample, _sink, NULL); - gst_element_add_pad(_audio, gst_ghost_pad_new("sink", audiopad)); - } - else - { - ROS_INFO("file sink to %s", dst_type.c_str()); - _sink = gst_element_factory_make("filesink", "sink"); - g_object_set(G_OBJECT(_sink), "location", dst_type.c_str(), NULL); - } - - if (format == "mp3") - { - if (dst_type == "alsasink") - { - _decoder = gst_element_factory_make("decodebin", "decoder"); - g_signal_connect(_decoder, "pad-added", G_CALLBACK(cb_newpad),this); - - _filter = gst_element_factory_make("capsfilter", "filter"); - g_object_set( G_OBJECT(_filter), "caps", caps, NULL); - - gst_bin_add_many(GST_BIN(_pipeline), _source, _decoder, _filter, _audio, NULL); - gst_element_link_many(_source, _decoder, _filter, _audio, NULL); - gst_object_unref(audiopad); - gst_caps_unref(caps); - } - else - { - gst_bin_add_many(GST_BIN(_pipeline), _source, _sink, NULL); - gst_element_link(_source, _sink); - } - } - else if (format == "wave") - { - g_object_set( G_OBJECT(_source), "caps", caps, NULL); - g_object_set (G_OBJECT (_source), "format", GST_FORMAT_TIME, NULL); - if (dst_type == "alsasink") - { - gst_bin_add_many( GST_BIN(_pipeline), _source, _audio, NULL); - gst_element_link_many( _source, _audio, NULL); - gst_object_unref(audiopad); - } - else - { - _filter = gst_element_factory_make("wavenc", "filter"); - gst_bin_add_many(GST_BIN(_pipeline), _source, _filter, _sink, NULL); - gst_element_link_many( _source, _filter, _sink, NULL); - } - gst_caps_unref(caps); - } - else - { - ROS_ERROR("Unsupported format: %s", format.c_str()); - } - - gst_element_set_state(GST_ELEMENT(_pipeline), GST_STATE_PLAYING); - //gst_element_set_state(GST_ELEMENT(_playbin), GST_STATE_PLAYING); - - _gst_thread = boost::thread( boost::bind(g_main_loop_run, _loop) ); - } - - private: - - void onAudio(const audio_common_msgs::AudioDataConstPtr &msg) - { - GstBuffer *buffer = gst_buffer_new_and_alloc(msg->data.size()); - gst_buffer_fill(buffer, 0, &msg->data[0], msg->data.size()); - GstFlowReturn ret; - - g_signal_emit_by_name(_source, "push-buffer", buffer, &ret); - gst_buffer_unref(buffer); - } - - static void cb_newpad (GstElement *decodebin, GstPad *pad, - gpointer data) - { - RosGstPlay *client = reinterpret_cast(data); - - GstCaps *caps; - GstStructure *str; - GstPad *audiopad; - - /* only link once */ - audiopad = gst_element_get_static_pad (client->_audio, "sink"); - if (GST_PAD_IS_LINKED (audiopad)) - { - g_object_unref (audiopad); - return; - } - - /* check media type */ - caps = gst_pad_query_caps (pad, NULL); - str = gst_caps_get_structure (caps, 0); - if (!g_strrstr (gst_structure_get_name (str), "audio")) { - gst_caps_unref (caps); - gst_object_unref (audiopad); - return; - } - - gst_caps_unref (caps); - - /* link'n'play */ - gst_pad_link (pad, audiopad); - - g_object_unref (audiopad); - } - - ros::NodeHandle _nh; - ros::Subscriber _sub; - boost::thread _gst_thread; - - GstElement *_pipeline, *_source, *_sink, *_decoder, *_convert, *_audio, *_resample, *_filter; - GstElement *_playbin; - GMainLoop *_loop; - }; -} - - -int main (int argc, char **argv) -{ - ros::init(argc, argv, "audio_play"); - gst_init(&argc, &argv); - - audio_transport::RosGstPlay client; - - ros::spin(); -} diff --git a/src/lib/sound_play/CHANGELOG.rst b/src/lib/sound_play/CHANGELOG.rst deleted file mode 100644 index 54d23f048..000000000 --- a/src/lib/sound_play/CHANGELOG.rst +++ /dev/null @@ -1,418 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package sound_play -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.3.18 (2024-08-13) -------------------- -* Merge pull request `#249 `_ from peci1/patch-1 - festival_plugin: add support for different encodings -* festival_plugin: add support for different encodings -* Contributors: Martin Pecka, Shingo Kitagawa - -0.3.17 (2023-06-08) -------------------- -* Merge pull request `#231 `_ from knorth55/no-wait-mode -* dont wait when rospy.Duration(0) is set for timeout -* Merge pull request `#229 `_ from furushchev/flite-plugin-lazy-load - FlitePlugin: Lazy loading default voice path -* FlitePlugin: Lazy loading default voice path -* Contributors: Shingo Kitagawa, Yuki Furuta - -0.3.16 (2022-12-23) -------------------- -* Merge pull request `#203 `_ from nakane11/timeout -* refactor libsoundplay.py -* Add timeout to wait_for_server and wait_for_result -* Contributors: Aoi Nakane, Shingo Kitagawa - -0.3.15 (2022-08-29) -------------------- -* Merge pull request `#200 `_ from knorth55/yaml-missing -* show error and skip loading when plugin yaml is missing -* Merge pull request `#199 `_ from knorth55/install-plugin-yaml -* fix missing install in CMakeLists.txt -* Contributors: Shingo Kitagawa - -0.3.14 (2022-08-18) -------------------- -* Merge pull request `#193 `_ from knorth55/refactor-soundplay-node -* refactor soundplay_node.py -* Merge pull request `#192 `_ from knorth55/fix-file-open-issue -* fix typo causing file open issue -* Merge pull request `#191 `_ from knorth55/flite-default-voice-dir -* add default voice dir for flite_plugin -* Merge pull request `#190 `_ from ros-drivers/knorth55-patch-1 -* Update soundplay_node.py -* Merge pull request `#187 `_ from knorth55/fix-typo -* fix typo in soundplay_node.py -* Merge pull request `#185 `_ from knorth55/sound-play-flite-plugin - add flite plugin for sound_play -* Merge pull request `#183 `_ from knorth55/sound-play-plugin - add soundplay plugin feature -* add flite in sound_play dependency -* refactor FestivalPlugin -* add flite plugin -* change default_voice to None -* add plugin arg in soundplay_node.launch -* refactor codes -* add output screen in soundplay_node.launch -* add soundplay plugin attribute -* Merge pull request `#184 `_ from knorth55/default-voice -* add default_voice in soundplay_node.launch -* Merge pull request `#182 `_ from iory/is-speaking -* Improve is_speaking by checking goal status -* Merge pull request `#181 `_ from knorth55/refactor-is-speaking -* refactor is_speaking.py -* Contributors: JSK fetch user, Shingo Kitagawa, iory - -0.3.13 (2022-04-07) -------------------- -* Merge pull request `#176 `_ from iory/is-speeching -* Add is_speaking.py to catkin_install_python -* Fixed name speeching to speaking -* Add is_speeching node for checking robot is speaking -* Contributors: Shingo Kitagawa, iory - -0.3.12 (2021-09-01) -------------------- -* Merge pull request `#175 `_ from iory/rate - Modified loop rate for action execution -* Modified loop rate for action execution -* Merge pull request `#131 `_ from yann-bourrigault/master - Handle playing sound in loop -* import GObject in try section -* Merge pull request `#174 `_ from iory/cache - Add arg2 information for cache -* Add arg2 information for cache -* Merge pull request `#173 `_ from knorth55/replace-sound-client -* Merge pull request `#172 `_ from knorth55/start-action-after-init - [sound_play] start ActionServer after initialize in soundplay_node.py -* Merge pull request `#171 `_ from knorth55/set-aborted - [sound_play] add proper set_aborted in soundplay_node.py -* add replace in sendMsg -* start actionserver after initialize in soundplay_node.py -* add proper set_aborted in soundplay_node.py -* Merge branch 'master' into master -* Handle playing sound repeatedly -* Contributors: Shingo Kitagawa, Yann BOURRIGAULT, iory - -0.3.11 (2021-04-08) -------------------- -* Merge pull request `#167 `_ from k-okada/fix_155 -* Use rospy.myargv() instead of sys.argv to support remapping -* Contributors: Kei Okada, Shingo Kitagawa - -0.3.10 (2021-01-07) -------------------- - -0.3.9 (2020-10-22) ------------------- - -0.3.8 (2020-09-13) ------------------- -* Merge pull request `#155 `_ from garaemon/use-myargv - Use rospy.myargv() instead of sys.argv to support remapping -* Use rospy.myargv() instead of sys.argv to support remapping -* Merge pull request `#154 `_ from mikaelarguedas/fix_say_python3 -* update to support no iso-8859-15 language (`#1 `_) - * support non iso-8859-15 language - * encode only for python2 -* convert items to an iterator -* make cleanup compatible with Python 3 -* catch AttributeError to handle python3 strings -* Contributors: Mikael Arguedas, Ryohei Ueda, Shingo Kitagawa - -0.3.7 (2020-08-08) ------------------- -* Merge pull request `#149 `_ from garaemon/specify-topic-to-play-sound - Support use different topic and actionlib to play sound -* Support use different topic and actionlib to play sound - * Add two keywords to the constructor of SoundClient class in order to - specify actionlib namespace and topic name to play sound. - * See `#119 `_. -* Merge pull request `#144 `_ from ros-drivers/knorth55-patch-1 -* add gstreamer1.0-alsa exec_depend in sound_play -* Contributors: Ryohei Ueda, Shingo Kitagawa - -0.3.6 (2020-05-29) ------------------- -* Merge pull request `#140 `_ from knorth55/support-python3 - fix syntax for python3 -* Merge pull request `#141 `_ from knorth55/add-maintainer - add maintainer -* add maintainer -* fix syntax for python3 -* Contributors: Shingo Kitagawa - -0.3.5 (2020-04-28) ------------------- -* Merge pull request `#133 `_ from knorth55/noetic-build -* remove unnecessary shebang -* use setuptools instead of distutils.core -* use package format=3 for python3 -* refactor CMakeLists.txt -* use catkin_install_python for python shebang -* Merge pull request `#135 `_ from knorth55/add-travis -* disable sound_play test -* Contributors: Shingo Kitagawa - -0.3.4 (2020-04-02) ------------------- -* Merge pull request `#126 `_ from itohdak/fix-Gstreamer-memory-leak - [sound_play/scripts/soundplay_node.py] fix Gstreamer memory leak -* Merge pull request `#123 `_ from 708yamaguchi/fix-encode - Do not encode text when using langages which ISO-8859-15 does not support -* [sound_play/scripts/soundplay_node.py] fix Gstreamer memory leak -* do not encode text when using langages which ISO-8859-15 does not support -* Merge pull request `#118 `_ from v4hn/patch-1 - use default audio output by default -* use default audio output by default - Not specifying a sound device defaults to *the first* sound device starting from Ubuntu 16.04., not to the one configured as default. - The change is backward compatible and tested on ROS indigo and kinetic on a PR2 robot. -* Merge pull request `#110 `_ from gerardcanal/master - Encoded text to be said in ISO-8859-15 -* Merge branch 'master' of github.com:ros-drivers/audio_common -* Sound play: Encoded file to be said in ISO-8859-15 so that accents in languages such as Spanish, Catalan or French are correctly pronounced (based on http://festcat.talp.cat/en/usage.php which says festival expects ISO-8859-15 encoding) -* Contributors: Austin, Gerard Canal, Michael Görner, Naoya Yamaguchi, Shingo Kitagawa, itohdak - -0.3.3 (2018-05-22) ------------------- -* Fix gstreamer errors. Fixes `#108 `_ -* Contributors: trainman419 - -0.3.2 (2018-05-02) ------------------- -* [sound_play] add option to select audio device to play / record (`#87 `_) - * [sound_play] add option to select audio device to play - * [sound_play] reformat README to markdown; add usage to set device via rosparam - * audio_capture: add option for selecting device to use - * audio_play: add option to select device for playing audio - * add device argument to launch files - Conflicts: - audio_capture/launch/capture.launch - audio_capture/launch/capture_to_file.launch - audio_capture/src/audio_capture.cpp - audio_play/launch/play.launch - sound_play/scripts/soundplay_node.py -* Merge pull request `#95 `_ from yujinrobot/volume_check - [sound_play] volume check for cached sounds -* [sound_play] checks if sound's Gst instance's volume has changed and resets it -* Contributors: Austin, Naveed Usmani, Yuki Furuta - -0.3.1 (2016-08-28) ------------------- -* Update to new gstreamer rosdeps -* Update sound_play to gstreamer 1.0 -* remove chance of uninitialised variable being called in a subscriber callback. -* Add changelogs -* Issue: The error checks for missing publisher/action client in sendMsg were inverted. - The non-blocking brach tested the action client while the blocking branch - tested the publisher. - Fix: Inverted the blocking boolean for both branchs. -* sound_play: Fix build with -DCATKIN_ENABLE_TESTING=OFF. - https://bugs.gentoo.org/show_bug.cgi?id=567466 -* [soundplay_node] fix resources not being released on dict cleanup - This was resulting in the number of sink inputs reaching the maximum threshold, - (32 on ubuntu 14.04 with pulseaudio 4.0) after which no more sounds could be - played by the node. It would only happen if the rate of sounds being played was - slower than the dictionary cleanup. -* depend on actionlib. -* Introduce unit test to ensure soundclient is started correctly. -* Example of using the explicit blocking parameter to override the class setting. -* SoundClient can also explicitly specify whether or not to block while playing the sound. - Each play/repeat/say/... method can take an option blocking=True|False argument (using **kwargs), which over-rides the class-wide setting. -* Merge pull request #62 from felixduvallet/set_queue_size - Set queue_size in soundplay_node Publisher -* do both in same script. -* Added script showing the various blocking/non-blocking ways of using SoundClient. -* removed trailing whitespace only -* loginfo -> logdebug. -* Slightly more condensed version of thresholding. -* Enable blocking calls inside libsoundplay's SoundClient. - This makes use of the actionlib interface provided by soundplay_node, by ensuring SoundClient receives a response before returning. - Turn this on by: SoundClient(blocking=true). -* Use new-style python classes (inherits from object). -* removed trailing whitespace. -* Set the volume in each of the sound_play actionlib tests. - This makes the script actually play the sounds it requests. -* Specify queue size explicitly. - Removed warning message printed each time soundplay_node was started. -* remove trailing whitespace only. -* Change wiki urls -* Fix test target name collision. Fixes #49 -* sound_play: cpp header conforms to the style guide -* sound_play: update scripts to allow volume to be set -* sound_play: updated tests to include volume changes -* sound_play: add ability to specify volume at which to play sounds - Also changed error to warning as per todo -* sound_play: fix indentation and comment inconsistencies -* sound_play: remove some raw prints cluttering output -* sound_play: added queue_size to SoundClient init - Should prevent warning being displayed whenever the client is created. - Fixes issue #43 -* add simple-actionlib functionality to sound_play -* sound_play: Added functions to play files relative to a package path -* Update maintainer email -* Contributors: Alexis Ballier, Austin, Daniel Stonier, David V. Lu, Felix Duvallet, Matthias Nieuwenhuisen, Michal Staniaszek, Neowizard, aginika, trainman419 - -0.2.11 (2016-02-16) -------------------- -* Add changelogs -* Fix bug in say.py. Fixes `#72 `_ -* Contributors: trainman419 - -0.2.10 (2016-01-21) -------------------- -* Add changelogs -* Issue: The error checks for missing publisher/action client in sendMsg were inverted. - The non-blocking brach tested the action client while the blocking branch - tested the publisher. - Fix: Inverted the blocking boolean for both branchs. -* sound_play: Fix build with -DCATKIN_ENABLE_TESTING=OFF. - https://bugs.gentoo.org/show_bug.cgi?id=567466 -* Contributors: Alexis Ballier, Neowizard, trainman419 - -0.2.9 (2015-12-02) ------------------- -* Add changelogs -* [soundplay_node] fix resources not being released on dict cleanup - This was resulting in the number of sink inputs reaching the maximum threshold, - (32 on ubuntu 14.04 with pulseaudio 4.0) after which no more sounds could be - played by the node. It would only happen if the rate of sounds being played was - slower than the dictionary cleanup. -* depend on actionlib. -* Introduce unit test to ensure soundclient is started correctly. -* Example of using the explicit blocking parameter to override the class setting. -* SoundClient can also explicitly specify whether or not to block while playing the sound. - Each play/repeat/say/... method can take an option blocking=True|False argument (using **kwargs), which over-rides the class-wide setting. - Conflicts: - sound_play/src/sound_play/libsoundplay.py -* do both in same script. -* Added script showing the various blocking/non-blocking ways of using SoundClient. -* removed trailing whitespace only - Conflicts: - sound_play/scripts/say.py -* loginfo -> logdebug. -* Enable blocking calls inside libsoundplay's SoundClient. - This makes use of the actionlib interface provided by soundplay_node, by ensuring SoundClient receives a response before returning. - Turn this on by: SoundClient(blocking=true). - Conflicts: - sound_play/src/sound_play/libsoundplay.py -* Use new-style python classes (inherits from object). - Conflicts: - sound_play/src/sound_play/libsoundplay.py -* removed trailing whitespace. - Conflicts: - sound_play/src/sound_play/libsoundplay.py -* Revert "Set the volume in each of the sound_play actionlib tests." - This reverts commit 55ab08c882809fc6d21affb849a7dac9f1901867. - Indigo-devel does not have the volume API -* Set the volume in each of the sound_play actionlib tests. - This makes the script actually play the sounds it requests. -* Specify queue size explicitly. - Removed warning message printed each time soundplay_node was started. -* remove trailing whitespace only. -* Fix wiki links -* Contributors: David V. Lu, Felix Duvallet, Michal Staniaszek, trainman419 - -0.2.8 (2015-10-02) ------------------- -* Fix test target name collision. Fixes `#49 `_ -* sound_play: remove some raw prints cluttering output -* sound_play: added queue_size to SoundClient init - Should prevent warning being displayed whenever the client is created. - Fixes issue `#43 `_ -* add simple-actionlib functionality to sound_play -* sound_play: Added functions to play files relative to a package path -* Update maintainer email -* Contributors: Matthias Nieuwenhuisen, Michal Staniaszek, aginika, trainman419 - -0.2.7 (2014-07-25) ------------------- - -0.2.6 (2014-02-26) ------------------- -* Fix path resolution in python soundplay lib. -* now importing roslib. closes `#33 `_ -* Contributors: Piyush Khandelwal, trainman419 - -0.2.5 (2014-01-23) ------------------- -* "0.2.5" -* Install sounds. Fixes `#29 `_. -* install sound_play.h and export include folder -* Contributors: ahendrix, trainman419, v4hn - -0.2.4 (2013-09-10) ------------------- -* Fix cmake ordering. -* Contributors: Austin Hendrix - -0.2.3 (2013-07-15) ------------------- -* Fix python. -* Contributors: Austin Hendrix - -0.2.2 (2013-04-10) ------------------- -* Actually add proper dependency on message generation. -* Reorder CMakeLists.txt. -* Contributors: Austin Hendrix - -0.2.1 (2013-04-08 13:59) ------------------------- - -0.2.0 (2013-04-08 13:49) ------------------------- -* Finish catkinizing audio_common. -* Start catkinizing sound_play. -* Fix typo in package.xml -* Versions and more URLs. -* Convert manifests to package.xml -* Ditch old makefiles. -* Use festival default voice from libsoundplay. -* Set myself as the maintainer. -* Fix filehandle leak and add debug statements. -* Updates manifest -* Updated manifests for rodep2 -* Fixed sound_play -* Added test wave -* Cleaned up the test script -* Added default voice to say command -* Updated the gstreamer rosdeps -* Removed comment -* Added diagnostic_msgs to sound_play -* Added a rosdep.yaml file -* Added ability to use different festival voices -* Added exit(1) when import of pygame fails. This makes the error message easier to notice. -* Added Ubuntu platform tags to manifest -* Added a link to the troubleshooting wiki page in the diagnostic message as requested by `#4070 `_. -* Took out the deprecated API. -* Sound play now publishes header timestamp in message. `#3822 `_ -* Cleaned up temp file generation when doing text to speach. Now uses the tempfile module. -* Adding missing export of headers for sound_play C++ API -* Changing node name for sound play diagnostics, `#3599 `_ -* Added test.launch to run sound server and a test client. -* Remove use of deprecated rosbuild macros -* Replaced review tag with standardized message -* Updated review status -* Added a launch file to start soundplay_node.py -* Made the sound_play client libraries be more explicit about what to do when the node is not running. -* Updated manifest description -* Updated copyright year -* fixed XML typo -* updated package description -* Added a copyright message. -* Removed debugging message from sound_play node. -* Added tests for new sound_play python API and fixed a few bugs. -* Fixed missing self arguments in sound_play libsoundplay.py -* Upgraded the python sound_play API -* Converted non-camelCase methods to camelCase in sound_play C++ API -* Changed Lock to RLock to fix `#2801 `_ -* Made the deprecation of SoundHandle into a warning. -* Added debug messages -* Updated soundplay_node to publish diagnostics and increased the number of active channels. -* Added diagnostic_msgs dependency to sound_play -* sound_play: Renamed SoundHandle to SoundClient. Added Sound-centric C++ API. Changed byte to int8 in msg file. Updated documentation. -* migration part 1 -* Contributors: Austin Hendrix, Nate Koenig, blaise, blaisegassend, eitan, gerkey, kwc, nkoenig, watts, wheeler diff --git a/src/lib/sound_play/CMakeLists.txt b/src/lib/sound_play/CMakeLists.txt deleted file mode 100644 index 98f3fe18a..000000000 --- a/src/lib/sound_play/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(sound_play) - -find_package(catkin REQUIRED COMPONENTS message_generation roscpp actionlib_msgs) - -add_action_files(DIRECTORY action FILES SoundRequest.action) -add_message_files(DIRECTORY msg FILES SoundRequest.msg) - -include_directories(include ${catkin_INCLUDE_DIRS}) - -catkin_python_setup() - -generate_messages(DEPENDENCIES actionlib_msgs) - -catkin_package(CATKIN_DEPENDS message_runtime actionlib_msgs - INCLUDE_DIRS include) - -catkin_install_python(PROGRAMS - scripts/is_speaking.py - scripts/playbuiltin.py - scripts/play.py - scripts/say.py - scripts/shutup.py - scripts/soundplay_node.py - scripts/test.py - scripts/test_actionlib_client.py - DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) - -install(FILES - soundplay_node.launch - sound_play_plugin.yaml - test.launch - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}) - -install(DIRECTORY sounds - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) - -# if(CATKIN_ENABLE_TESTING) -# catkin_add_nosetests(scripts/test) -# add_subdirectory(test) -# endif() diff --git a/src/lib/sound_play/README.md b/src/lib/sound_play/README.md deleted file mode 100644 index 44694e736..000000000 --- a/src/lib/sound_play/README.md +++ /dev/null @@ -1,67 +0,0 @@ -sound_play -========= - -## Dependencies - -- python-pygame -- festival -- festvox-don -- alsa-base -- alsa-tools - -## Checking that the speaker/sound card is recognized by the kernel - -`cat /proc/asound/cards` - -Your card should be in the list. Make note of the number in front of the -card, it will be used to tell alsa where to play sound from. - -If your sound device does not show up, your kernel may not support it, or -the module may not be loaded. For usb speakers, you may want to try: - -`modprobe snd-usb-audio` - -(not sure if this list is exhaustive) - -## Telling alsa which sound card/speaker to use - -Run (replace 75 with the number of the sound device to use): - -`asoundconf set-default-card 75` - -This will create .asoundrc.asoundconf in your home directory. -To make alsa use these settings, add the following line to `~/.asoundrc` - -`include ".asoundrc.asoundconf"` - -To set this default to all users, copy this to the system-wide alsa -configuration file: - -`mv ~/.asoundrc.asoundconf /etc/asound.conf` - -## Getting started - -Start the sound play node, and have a look at the scripts in the scripts -directory that exercise the node's functionality. - -## Specify Device via ROS Param - -Besides setting default device as system wide settings, you can also specify audio device via `rosparam`: - -``` xml - - - - - -``` - -or simply run: `rosrun sound_play soundplay_node.py _device:="hw:1,0"` - -In the launch file above, `~device` parameter is set to `hw:1,0`, which tells `soundplay_node` to use audio device No. `0` connected to audio card No.`1`. -To find card/device number which you want to use, execute: - -``` bash -sudo aplay -l -``` - diff --git a/src/lib/sound_play/action/SoundRequest.action b/src/lib/sound_play/action/SoundRequest.action deleted file mode 100644 index 49ef24aa7..000000000 --- a/src/lib/sound_play/action/SoundRequest.action +++ /dev/null @@ -1,7 +0,0 @@ -SoundRequest sound_request ---- -bool playing -time stamp ---- -bool playing -time stamp \ No newline at end of file diff --git a/src/lib/sound_play/include/sound_play/sound_play.h b/src/lib/sound_play/include/sound_play/sound_play.h deleted file mode 100644 index d5fe4614e..000000000 --- a/src/lib/sound_play/include/sound_play/sound_play.h +++ /dev/null @@ -1,410 +0,0 @@ -/* - *********************************************************** - * Software License Agreement (BSD License) - * - * Copyright (c) 2009, Willow Garage, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of the Willow Garage nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *********************************************************** - */ - -#ifndef __SOUND_PLAY__SOUND_PLAY__H__ -#define __SOUND_PLAY__SOUND_PLAY__H__ - -#include -#include -#include -#include -#include - -namespace sound_play -{ - -/** \brief Class that publishes messages to the sound_play node. - * - * This class is a helper class for communicating with the sound_play node - * via the \ref sound_play::SoundRequest message. It has two ways of being used: - * - * - It can create Sound classes that represent a particular sound which - * can be played, repeated or stopped. - * - * - It provides methods for each way in which the sound_play::SoundRequest - * message can be invoked. - */ - -class SoundClient -{ -public: - class Sound - { - friend class SoundClient; - private: - int snd_; - float vol_; - std::string arg_; - std::string arg2_; - SoundClient *client_; - - Sound(SoundClient *sc, int snd, const std::string &arg, const std::string arg2 = std::string(), const float vol = 1.0f) - { - client_ = sc; - snd_ = snd; - arg_ = arg; - arg2_ = arg2; - vol_ = vol; - } - - public: - /** \brief Play the Sound. - * - * This method causes the Sound to be played once. - */ - void play() - { - client_->sendMsg(snd_, SoundRequest::PLAY_ONCE, arg_, arg2_, vol_); - } - - /** \brief Play the Sound repeatedly. - * - * This method causes the Sound to be played repeatedly until stop() is - * called. - */ - void repeat() - { - client_->sendMsg(snd_, SoundRequest::PLAY_START, arg_, arg2_, vol_); - } - - /** \brief Stop Sound playback. - * - * This method causes the Sound to stop playing. - */ - void stop() - { - client_->sendMsg(snd_, SoundRequest::PLAY_STOP, arg_, arg2_, vol_); - } - }; - - /** \brief Create a SoundClient that publishes on the given topic - * - * Creates a SoundClient that publishes to the given topic relative to the - * given NodeHandle. - * - * \param nh Node handle to use when creating the topic. - * - * \param topic Topic to publish to. - */ - SoundClient(ros::NodeHandle &nh, const std::string &topic) - { - init(nh, topic); - } - - /** \brief Create a SoundClient with the default topic - * - * Creates a SoundClient that publishes to "robotsound". - */ - SoundClient() - { - init(ros::NodeHandle(), "robotsound"); - } - - /** \brief Create a voice Sound. - * - * Creates a Sound corresponding to saying the indicated text. - * - * \param s Text to say - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - Sound voiceSound(const std::string &s, float volume = 1.0f) - { - return Sound(this, SoundRequest::SAY, s, "", volume); - } - - /** \brief Create a wave Sound. - * - * Creates a Sound corresponding to indicated file. - * - * \param s File to play. Should be an absolute path that exists on the - * machine running the sound_play node. - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - Sound waveSound(const std::string &s, float volume = 1.0f) - { - return Sound(this, SoundRequest::PLAY_FILE, s, "", volume); - } - - /** \brief Create a wave Sound from a package. - * - * Creates a Sound corresponding to indicated file. - * - * \param p Package containing the sound file. - * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid - * on the computer on which the sound_play node is running - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - Sound waveSoundFromPkg(const std::string &p, const std::string &s, float volume = 1.0f) - { - return Sound(this, SoundRequest::PLAY_FILE, s, p, volume); - } - - /** \brief Create a builtin Sound. - * - * Creates a Sound corresponding to indicated builtin wave. - * - * \param id Identifier of the sound to play. - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - Sound builtinSound(int id, float volume = 1.0f) - { - return Sound(this, id, "", "", volume); - } - - /** \brief Say a string - * - * Send a string to be said by the sound_node. The vocalization can be - * stopped using stopSaying or stopAll. - * - * \param s String to say - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void say(const std::string &s, const std::string &voice="voice_kal_diphone", float volume = 1.0f) - { - sendMsg(SoundRequest::SAY, SoundRequest::PLAY_ONCE, s, voice, volume); - } - - /** \brief Say a string repeatedly - * - * The string is said repeatedly until stopSaying or stopAll is used. - * - * \param s String to say repeatedly - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void repeat(const std::string &s, float volume = 1.0f) - { - sendMsg(SoundRequest::SAY, SoundRequest::PLAY_START, s, "", volume); - } - - /** \brief Stop saying a string - * - * Stops saying a string that was previously started by say or repeat. The - * argument indicates which string to stop saying. - * - * \param s Same string as in the say or repeat command - */ - void stopSaying(const std::string &s) - { - sendMsg(SoundRequest::SAY, SoundRequest::PLAY_STOP, s, ""); - } - - /** \brief Plays a WAV or OGG file - * - * Plays a WAV or OGG file once. The playback can be stopped by stopWave or - * stopAll. - * - * \param s Filename of the WAV or OGG file. Must be an absolute path valid - * on the computer on which the sound_play node is running - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void playWave(const std::string &s, float volume = 1.0f) - { - sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_ONCE, s, "", volume); - } - - /** \brief Plays a WAV or OGG file repeatedly - * - * Plays a WAV or OGG file repeatedly until stopWave or stopAll is used. - * - * \param s Filename of the WAV or OGG file. Must be an absolute path valid - * on the computer on which the sound_play node is running. - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void startWave(const std::string &s, float volume = 1.0f) - { - sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_START, s, "", volume); - } - - /** \brief Stop playing a WAV or OGG file - * - * Stops playing a file that was previously started by playWave or - * startWave. - * - * \param s Same string as in the playWave or startWave command - */ - void stopWave(const std::string &s) - { - sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_STOP, s); - } - - /** \brief Plays a WAV or OGG file from a package - * - * Plays a WAV or OGG file once. The playback can be stopped by stopWaveFromPkg or - * stopAll. - * - * \param p Package name containing the sound file. - * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid - * on the computer on which the sound_play node is running - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void playWaveFromPkg(const std::string &p, const std::string &s, float volume = 1.0f) - { - sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_ONCE, s, p, volume); - } - - /** \brief Plays a WAV or OGG file repeatedly - * - * Plays a WAV or OGG file repeatedly until stopWaveFromPkg or stopAll is used. - * - * \param p Package name containing the sound file. - * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid - * on the computer on which the sound_play node is running - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void startWaveFromPkg(const std::string &p, const std::string &s, float volume = 1.0f) - { - sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_START, s, p, volume); - } - - /** \brief Stop playing a WAV or OGG file - * - * Stops playing a file that was previously started by playWaveFromPkg or - * startWaveFromPkg. - * - * \param p Package name containing the sound file. - * \param s Filename of the WAV or OGG file. Must be an path relative to the package valid - * on the computer on which the sound_play node is running - */ - void stopWaveFromPkg(const std::string &p, const std::string &s) - { - sendMsg(SoundRequest::PLAY_FILE, SoundRequest::PLAY_STOP, s, p); - } - - /** \brief Play a buildin sound - * - * Starts playing one of the built-in sounds. built-ing sounds are documented - * in \ref SoundRequest.msg. Playback can be stopped by stopAll. - * - * \param sound Identifier of the sound to play. - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void play(int sound, float volume = 1.0f) - { - sendMsg(sound, SoundRequest::PLAY_ONCE, "", "", volume); - } - - /** \brief Play a buildin sound repeatedly - * - * Starts playing one of the built-in sounds repeatedly until stop or stopAll - * is used. Built-in sounds are documented in \ref SoundRequest.msg. - * - * \param sound Identifier of the sound to play. - * \param volume Volume at which to play the sound. 0 is mute, 1.0 is 100%. - */ - void start(int sound, float volume = 1.0f) - { - sendMsg(sound, SoundRequest::PLAY_START, "", "", volume); - } - - /** \brief Stop playing a built-in sound - * - * Stops playing a built-in sound started with play or start. - * - * \param sound Same sound that was used to start playback. - */ - void stop(int sound) - { - sendMsg(sound, SoundRequest::PLAY_STOP); - } - - /** \brief Stop all currently playing sounds - * - * This method stops all speech, wave file, and built-in sound playback. - */ - void stopAll() - { - stop(SoundRequest::ALL); - } - - /** \brief Turns warning messages on or off. - * - * If a message is sent when no node is subscribed to the topic, a - * warning message is printed. This method can be used to enable or - * disable warnings. - * - * \param state True to turn off messages, false to turn them on. - */ - void setQuiet(bool state) - { - quiet_ = state; - } - -private: - void init(ros::NodeHandle nh, const std::string &topic) - { - nh_ = nh; - pub_ = nh.advertise(topic, 5); - quiet_ = false; - } - - void sendMsg(int snd, int cmd, const std::string &s = "", const std::string &arg2 = "", const float &vol = 1.0f) - { - boost::mutex::scoped_lock lock(mutex_); - - if (!nh_.ok()) - return; - - SoundRequest msg; - msg.sound = snd; - msg.command = cmd; - msg.arg = s; - msg.arg2 = arg2; - - // ensure volume is in the correct range - if (vol < 0) - msg.volume = 0; - else if (vol > 1.0) - msg.volume = 1.0f; - else - msg.volume = vol; - - pub_.publish(msg); - - if (pub_.getNumSubscribers() == 0 && !quiet_) - ROS_WARN("Sound command issued, but no node is subscribed to the topic. Perhaps you forgot to run soundplay_node.py"); - } - - bool quiet_; - ros::NodeHandle nh_; - ros::Publisher pub_; - boost::mutex mutex_; -}; - -typedef SoundClient::Sound Sound; - -}; - -#endif diff --git a/src/lib/sound_play/mainpage.dox b/src/lib/sound_play/mainpage.dox deleted file mode 100644 index 61ca855e9..000000000 --- a/src/lib/sound_play/mainpage.dox +++ /dev/null @@ -1,23 +0,0 @@ -/** - -\mainpage -\htmlinclude manifest.html - -The \b sound_play package provides a way to say strings, -play WAV or OGG files and to play builtin sounds. Documentation for the -package can be found here at http://www.ros.org/wiki/sound_play - -Multiple sounds can be played concurrently (up to 4 currently because of -limitations in pygame). - -Python and C++ client classes are provide for ease of use: - -- sound_play::SoundClient and sound_play::SoundClient::Sound for C++ -- libsoundplay::SoundClient and libsoundplay::SoundClient::Sound for Python - -Example uses are in: - -- test.cpp -- test.py - -*/ diff --git a/src/lib/sound_play/msg/SoundRequest.msg b/src/lib/sound_play/msg/SoundRequest.msg deleted file mode 100644 index 241628c76..000000000 --- a/src/lib/sound_play/msg/SoundRequest.msg +++ /dev/null @@ -1,30 +0,0 @@ -# IMPORTANT: You should never have to generate this message yourself. -# Use the sound_play::SoundClient C++ helper or the -# sound_play.libsoundplay.SoundClient Python helper. - -# Sounds -int8 BACKINGUP = 1 -int8 NEEDS_UNPLUGGING = 2 -int8 NEEDS_PLUGGING = 3 -int8 NEEDS_UNPLUGGING_BADLY = 4 -int8 NEEDS_PLUGGING_BADLY = 5 - -# Sound identifiers that have special meaning -int8 ALL = -1 # Only legal with PLAY_STOP -int8 PLAY_FILE = -2 -int8 SAY = -3 - -int8 sound # Selects which sound to play (see above) - -# Commands -int8 PLAY_STOP = 0 # Stop this sound from playing -int8 PLAY_ONCE = 1 # Play the sound once -int8 PLAY_START = 2 # Play the sound in a loop until a stop request occurs - -int8 command # Indicates what to do with the sound - -# Volume at which to play the sound, with 0 as mute and 1.0 as 100%. -float32 volume - -string arg # file name or text to say -string arg2 # other arguments diff --git a/src/lib/sound_play/package.xml b/src/lib/sound_play/package.xml deleted file mode 100644 index 130bf0e1a..000000000 --- a/src/lib/sound_play/package.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - sound_play - 0.3.18 - - sound_play provides a ROS node that translates commands on a ROS topic (robotsound) into sounds. The node supports built-in sounds, playing OGG/WAV files, and doing speech synthesis via festival. C++ and Python bindings allow this node to be used without understanding the details of the message format, allowing faster development and resilience to message format changes. - - Austin Hendrix - Shingo Kitagawa - Blaise Gassend - BSD - http://ros.org/wiki/sound_play - https://github.com/ros-drivers/audio_common - https://github.com/ros-drivers/audio_common/issues - - catkin - python-setuptools - python3-setuptools - - roscpp - roslib - actionlib_msgs - actionlib - audio_common_msgs - diagnostic_msgs - message_generation - - roscpp - roslib - actionlib_msgs - audio_common_msgs - diagnostic_msgs - - python-gi - python3-gi - gstreamer1.0 - gstreamer1.0-alsa - gstreamer1.0-plugins-base - gstreamer1.0-plugins-ugly - gstreamer1.0-plugins-good - - rospy - festival - flite - message_runtime - resource_retriever - - - - - - diff --git a/src/lib/sound_play/resources/flitevox/.gitignore b/src/lib/sound_play/resources/flitevox/.gitignore deleted file mode 100644 index 91af1ee0c..000000000 --- a/src/lib/sound_play/resources/flitevox/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.flitevox diff --git a/src/lib/sound_play/scripts/is_speaking.py b/src/lib/sound_play/scripts/is_speaking.py deleted file mode 100755 index 0794d28ea..000000000 --- a/src/lib/sound_play/scripts/is_speaking.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python - -import rospy - -from actionlib_msgs.msg import GoalStatus -from actionlib_msgs.msg import GoalStatusArray -import std_msgs.msg - - -class IsSpeaking(object): - - def __init__(self): - super(IsSpeaking, self).__init__() - - self.sub = rospy.Subscriber( - '~robotsound', - GoalStatusArray, - callback=self.callback, - queue_size=1) - - self.is_speaking = False - self.pub_speech_flag = rospy.Publisher( - '~output/is_speaking', - std_msgs.msg.Bool, queue_size=1) - - self.timer = rospy.Timer(rospy.Duration(0.01), self.speech_timer_cb) - - def check_speak_status(self, status_msg): - """Returns True when speaking. - - """ - # If it is not included in the terminal state, - # it is determined as a speaking state. - if status_msg.status in [GoalStatus.ACTIVE, - GoalStatus.PREEMPTING, - GoalStatus.RECALLING]: - return True - return False - - def callback(self, msg): - for status in msg.status_list: - if self.check_speak_status(status): - self.is_speaking = True - return - self.is_speaking = False - - def speech_timer_cb(self, timer): - self.pub_speech_flag.publish( - std_msgs.msg.Bool(self.is_speaking)) - - -if __name__ == '__main__': - rospy.init_node('is_speaking') - app = IsSpeaking() - rospy.spin() diff --git a/src/lib/sound_play/scripts/play.py b/src/lib/sound_play/scripts/play.py deleted file mode 100755 index 237f2bba0..000000000 --- a/src/lib/sound_play/scripts/play.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python - -#*********************************************************** -#* Software License Agreement (BSD License) -#* -#* Copyright (c) 2009, Willow Garage, Inc. -#* All rights reserved. -#* -#* Redistribution and use in source and binary forms, with or without -#* modification, are permitted provided that the following conditions -#* are met: -#* -#* * Redistributions of source code must retain the above copyright -#* notice, this list of conditions and the following disclaimer. -#* * Redistributions in binary form must reproduce the above -#* copyright notice, this list of conditions and the following -#* disclaimer in the documentation and/or other materials provided -#* with the distribution. -#* * Neither the name of the Willow Garage nor the names of its -#* contributors may be used to endorse or promote products derived -#* from this software without specific prior written permission. -#* -#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -#* POSSIBILITY OF SUCH DAMAGE. -#*********************************************************** - -# Author: Blaise Gassend - - -if __name__ == '__main__': - import rospy - rospy.init_node('play', anonymous=True) - argv = rospy.myargv() - if len(argv) < 2 or len(argv) > 3 or argv[1] == '--help': - print('Usage: %s sound_to_play.(ogg|wav) [volume]' % argv[0]) - print() - print('Plays an .OGG or .WAV file. The path to the file should be absolute, and be valid on the computer on which sound_play is running.\n The (optional) second parameter sets the volume for the sound as a value between 0 and 1.0, where 0 is mute.') - exit(1) - - # Import after printing usage for speed. - from sound_play.msg import SoundRequest - from sound_play.libsoundplay import SoundClient - - soundhandle = SoundClient() - - rospy.sleep(1) - rospy.loginfo('Playing "%s".' % argv[1]) - - volume = float(argv[2]) if len(argv) == 3 else 1.0 - - soundhandle.playWave(argv[1], volume) - rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/playbuiltin.py b/src/lib/sound_play/scripts/playbuiltin.py deleted file mode 100755 index 2258fd4e8..000000000 --- a/src/lib/sound_play/scripts/playbuiltin.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -#*********************************************************** -#* Software License Agreement (BSD License) -#* -#* Copyright (c) 2009, Willow Garage, Inc. -#* All rights reserved. -#* -#* Redistribution and use in source and binary forms, with or without -#* modification, are permitted provided that the following conditions -#* are met: -#* -#* * Redistributions of source code must retain the above copyright -#* notice, this list of conditions and the following disclaimer. -#* * Redistributions in binary form must reproduce the above -#* copyright notice, this list of conditions and the following -#* disclaimer in the documentation and/or other materials provided -#* with the distribution. -#* * Neither the name of the Willow Garage nor the names of its -#* contributors may be used to endorse or promote products derived -#* from this software without specific prior written permission. -#* -#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -#* POSSIBILITY OF SUCH DAMAGE. -#*********************************************************** - -# Author: Blaise Gassend - -import sys - -if __name__ == '__main__': - import rospy - argv = rospy.myargv() - if len(argv) < 2 or len(argv) > 3 or argv[1] == '--help': - print('Usage: %s [volume]' % argv[0]) - print() - print('Plays one of the built-in sounds based on its integer ID. Look at the sound_play/SoundRequest message definition for IDs.\n The (optional) volume parameter sets the volume for the sound as a value between 0 and 1.0, where 0 is mute.') - exit(1) - - # Import here so that usage is fast. - from sound_play.msg import SoundRequest - from sound_play.libsoundplay import SoundClient - - rospy.init_node('play', anonymous=True) - - soundhandle = SoundClient() - rospy.sleep(1) - - num = int(argv[1]) - volume = float(argv[2]) if len(argv) == 3 else 1.0 - - rospy.loginfo('Playing sound %i.' % num) - - soundhandle.play(num, volume) - - rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/playpackage.py b/src/lib/sound_play/scripts/playpackage.py deleted file mode 100755 index d3fc5f9e3..000000000 --- a/src/lib/sound_play/scripts/playpackage.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python - -#*********************************************************** -#* Software License Agreement (BSD License) -#* -#* Copyright (c) 2009, Willow Garage, Inc. -#* All rights reserved. -#* -#* Redistribution and use in source and binary forms, with or without -#* modification, are permitted provided that the following conditions -#* are met: -#* -#* * Redistributions of source code must retain the above copyright -#* notice, this list of conditions and the following disclaimer. -#* * Redistributions in binary form must reproduce the above -#* copyright notice, this list of conditions and the following -#* disclaimer in the documentation and/or other materials provided -#* with the distribution. -#* * Neither the name of the Willow Garage nor the names of its -#* contributors may be used to endorse or promote products derived -#* from this software without specific prior written permission. -#* -#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -#* POSSIBILITY OF SUCH DAMAGE. -#*********************************************************** - -# Author: Matthias Nieuwenhuisen, Blaise Gassend - - -import sys - -if __name__ == '__main__': - import rospy - argv = rospy.myargv() - if len(argv) < 3 or len(argv) > 4 or argv[1] == '--help': - print('Usage: %s package sound_to_play.(ogg|wav) [volume]' % argv[0]) - print() - print('Plays an .OGG or .WAV file. The path to the file should be relative to the package, and be valid on the computer on which sound_play is running. \n The (optional) volume parameter sets the volume for the sound as a value between 0 and 1.0, where 0 is mute.') - exit(1) - - # Import after printing usage for speed. - from sound_play.msg import SoundRequest - from sound_play.libsoundplay import SoundClient - - rospy.init_node('play', anonymous=True) - soundhandle = SoundClient() - - volume = float(argv[3]) if len(argv) == 4 else 1.0 - - rospy.sleep(1) - rospy.loginfo('Playing "%s" from pkg "%s".' % (argv[2], argv[1])) - soundhandle.playWaveFromPkg(argv[1], argv[2], volume) - rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/say.py b/src/lib/sound_play/scripts/say.py deleted file mode 100755 index de0efb6c9..000000000 --- a/src/lib/sound_play/scripts/say.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python - -#*********************************************************** -#* Software License Agreement (BSD License) -#* -#* Copyright (c) 2009, Willow Garage, Inc. -#* All rights reserved. -#* -#* Redistribution and use in source and binary forms, with or without -#* modification, are permitted provided that the following conditions -#* are met: -#* -#* * Redistributions of source code must retain the above copyright -#* notice, this list of conditions and the following disclaimer. -#* * Redistributions in binary form must reproduce the above -#* copyright notice, this list of conditions and the following -#* disclaimer in the documentation and/or other materials provided -#* with the distribution. -#* * Neither the name of the Willow Garage nor the names of its -#* contributors may be used to endorse or promote products derived -#* from this software without specific prior written permission. -#* -#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -#* POSSIBILITY OF SUCH DAMAGE. -#*********************************************************** - -# Author: Blaise Gassend - - -import sys - -if __name__ == '__main__': - import rospy - argv = rospy.myargv() - if len(argv) > 1 and argv[1] == '--help': - print('Usage: %s \'String to say.\'' % argv[0]) - print(' %s < file_to_say.txt' % argv[0]) - print() - print('Says a string. For a string on the command line, you must use quotes as') - print('appropriate. For a string on standard input, the command will wait for') - print('EOF before saying anything.') - exit(-1) - - # Import after printing usage for speed. - from sound_play.msg import SoundRequest - from sound_play.libsoundplay import SoundClient - - if len(argv) == 1: - print('Awaiting something to say on standard input.') - - # Ordered this way to minimize wait time. - rospy.init_node('say', anonymous=True) - soundhandle = SoundClient() - rospy.sleep(1) - - voice = 'voice_kal_diphone' - volume = 1.0 - - if len(argv) == 1: - s = sys.stdin.read() - else: - s = argv[1] - - if len(argv) > 2: - voice = argv[2] - if len(argv) > 3: - volume = float(argv[3]) - - rospy.loginfo('Saying: %s' % s) - rospy.loginfo('Voice: %s' % voice) - rospy.loginfo('Volume: %s' % volume) - - soundhandle.say(s, voice, volume) - rospy.sleep(1) diff --git a/src/lib/sound_play/scripts/shutup.py b/src/lib/sound_play/scripts/shutup.py deleted file mode 100755 index e4f6878c3..000000000 --- a/src/lib/sound_play/scripts/shutup.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python - -#*********************************************************** -#* Software License Agreement (BSD License) -#* -#* Copyright (c) 2009, Willow Garage, Inc. -#* All rights reserved. -#* -#* Redistribution and use in source and binary forms, with or without -#* modification, are permitted provided that the following conditions -#* are met: -#* -#* * Redistributions of source code must retain the above copyright -#* notice, this list of conditions and the following disclaimer. -#* * Redistributions in binary form must reproduce the above -#* copyright notice, this list of conditions and the following -#* disclaimer in the documentation and/or other materials provided -#* with the distribution. -#* * Neither the name of the Willow Garage nor the names of its -#* contributors may be used to endorse or promote products derived -#* from this software without specific prior written permission. -#* -#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -#* POSSIBILITY OF SUCH DAMAGE. -#*********************************************************** - -# Author: Blaise Gassend - -import rospy -from sound_play.msg import SoundRequest -from sound_play.libsoundplay import SoundClient - -if __name__ == '__main__': - rospy.init_node('shutup', anonymous=True) - - soundhandle = SoundClient() - rospy.sleep(0.5) # let ROS get started... - - rospy.loginfo("Sending stopAll commande every 100 ms.") - rospy.loginfo("Note: This will not prevent a node that is continuing to issue commands") - rospy.loginfo("from producing sound.") - rospy.loginfo("Press Ctrl+C to exit.") - - while not rospy.is_shutdown(): - soundhandle.stopAll() - try: - rospy.sleep(.1) - except: - pass diff --git a/src/lib/sound_play/scripts/soundclient_example.py b/src/lib/sound_play/scripts/soundclient_example.py deleted file mode 100755 index 0f4a7b497..000000000 --- a/src/lib/sound_play/scripts/soundclient_example.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python - -""" -Simple example showing how to use the SoundClient provided by libsoundplay, -in blocking, non-blocking, and explicit usage. -""" - -import rospy -from sound_play.libsoundplay import SoundClient -from sound_play.msg import SoundRequest - - -def play_explicit(): - rospy.loginfo('Example: SoundClient play methods can take in an explicit' - ' blocking parameter') - soundhandle = SoundClient() # blocking = False by default - rospy.sleep(0.5) # Ensure publisher connection is successful. - - sound_beep = soundhandle.waveSound("say-beep.wav", volume=0.5) - # Play the same sound twice, once blocking and once not. The first call is - # blocking (explicitly specified). - sound_beep.play(blocking=True) - # This call is not blocking (uses the SoundClient's setting). - sound_beep.play() - rospy.sleep(0.5) # Let sound complete. - - # Play a blocking sound. - soundhandle.play(SoundRequest.NEEDS_UNPLUGGING, blocking=True) - - # Create a new SoundClient where the default behavior *is* to block. - soundhandle = SoundClient(blocking=True) - soundhandle.say('Say-ing stuff while block-ing') - soundhandle.say('Say-ing stuff without block-ing', blocking=False) - rospy.sleep(1) - - -def play_blocking(): - """ - Play various sounds, blocking until each is completed before going to the - next. - """ - rospy.loginfo('Example: Playing sounds in *blocking* mode.') - soundhandle = SoundClient(blocking=True) - - rospy.loginfo('Playing say-beep at full volume.') - soundhandle.playWave('say-beep.wav') - - rospy.loginfo('Playing say-beep at volume 0.3.') - soundhandle.playWave('say-beep.wav', volume=0.3) - - rospy.loginfo('Playing sound for NEEDS_PLUGGING.') - soundhandle.play(SoundRequest.NEEDS_PLUGGING) - - rospy.loginfo('Speaking some long string.') - soundhandle.say('It was the best of times, it was the worst of times.') - - -def play_nonblocking(): - """ - Play the same sounds with manual pauses between them. - """ - rospy.loginfo('Example: Playing sounds in *non-blocking* mode.') - # NOTE: you must sleep at the beginning to let the SoundClient publisher - # establish a connection to the soundplay_node. - soundhandle = SoundClient(blocking=False) - rospy.sleep(1) - - # In the non-blocking version you need to sleep between calls. - rospy.loginfo('Playing say-beep at full volume.') - soundhandle.playWave('say-beep.wav') - rospy.sleep(1) - - rospy.loginfo('Playing say-beep at volume 0.3.') - soundhandle.playWave('say-beep.wav', volume=0.3) - rospy.sleep(1) - - rospy.loginfo('Playing sound for NEEDS_PLUGGING.') - soundhandle.play(SoundRequest.NEEDS_PLUGGING) - rospy.sleep(1) - - rospy.loginfo('Speaking some long string.') - soundhandle.say('It was the best of times, it was the worst of times.') - # Note we will return before the string has finished playing. - - -if __name__ == '__main__': - rospy.init_node('soundclient_example', anonymous=False) - play_explicit() - play_blocking() - play_nonblocking() - rospy.loginfo('Finished') diff --git a/src/lib/sound_play/scripts/soundplay_node.py b/src/lib/sound_play/scripts/soundplay_node.py deleted file mode 100755 index 4e7eaf50c..000000000 --- a/src/lib/sound_play/scripts/soundplay_node.py +++ /dev/null @@ -1,462 +0,0 @@ -#!/usr/bin/env python - -# *********************************************************** -# * Software License Agreement (BSD License) -# * -# * Copyright (c) 2009, Willow Garage, Inc. -# * All rights reserved. -# * -# * Redistribution and use in source and binary forms, with or without -# * modification, are permitted provided that the following conditions -# * are met: -# * -# * * Redistributions of source code must retain the above copyright -# * notice, this list of conditions and the following disclaimer. -# * * Redistributions in binary form must reproduce the above -# * copyright notice, this list of conditions and the following -# * disclaimer in the documentation and/or other materials provided -# * with the distribution. -# * * Neither the name of the Willow Garage nor the names of its -# * contributors may be used to endorse or promote products derived -# * from this software without specific prior written permission. -# * -# * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# * POSSIBILITY OF SUCH DAMAGE. -# *********************************************************** - -import os -import sys -import threading -import traceback -import yaml - -import actionlib -import roslib -import rospkg -import rospy - -from diagnostic_msgs.msg import DiagnosticArray -from diagnostic_msgs.msg import DiagnosticStatus -from diagnostic_msgs.msg import KeyValue -from sound_play.msg import SoundRequest -from sound_play.msg import SoundRequestAction -from sound_play.msg import SoundRequestFeedback -from sound_play.msg import SoundRequestResult -from sound_play.sound_type import SoundType - -try: - import gi - gi.require_version('Gst', '1.0') - from gi.repository import GObject as GObject - from gi.repository import Gst as Gst -except Exception: - str = """ -************************************************************** -Error opening pygst. Is gstreamer installed? -************************************************************** -""" - rospy.logfatal(str) - # print str - exit(1) - - -class SoundPlayNode(object): - _feedback = SoundRequestFeedback() - _result = SoundRequestResult() - - def stopdict(self, dict): - for sound in dict.values(): - sound.stop() - - def stopall(self): - self.stopdict(self.builtinsounds) - self.stopdict(self.filesounds) - self.stopdict(self.voicesounds) - - def select_sound(self, data): - if data.sound == SoundRequest.PLAY_FILE: - if not data.arg2: - if data.arg not in self.filesounds.keys(): - rospy.logdebug( - 'command for uncached wave: "%s"' % data.arg) - try: - self.filesounds[data.arg] = SoundType( - data.arg, self.device, data.volume) - except Exception: - rospy.logerr( - 'Error setting up to play "%s".' - 'Does this file exist on the machine' - 'on which sound_play is running?' % data.arg) - return - else: - rospy.logdebug('command for cached wave: "%s"' % data.arg) - filesound = self.filesounds[data.arg] - if filesound.sound.get_property('volume') != data.volume: - rospy.logdebug( - 'volume for cached wave has changed,' - 'resetting volume') - filesound.sound.set_property('volume', data.volume) - sound = self.filesounds[data.arg] - else: - absfilename = os.path.join( - roslib.packages.get_pkg_dir(data.arg2), data.arg) - if absfilename not in self.filesounds.keys(): - rospy.logdebug( - 'command for uncached wave: "%s"' % absfilename) - try: - self.filesounds[absfilename] = SoundType( - absfilename, self.device, data.volume) - except Exception: - rospy.logerr( - 'Error setting up to play "%s" from package "%s".' - 'Does this file exist on the machine ' - 'on which sound_play is running?' - % (data.arg, data.arg2)) - return - else: - rospy.logdebug( - 'command for cached wave: "%s"' % absfilename) - filesound = self.filesounds[absfilename] - if filesound.sound.get_property('volume') != data.volume: - rospy.logdebug( - 'volume for cached wave has changed,' - 'resetting volume') - filesound.sound.set_property('volume', data.volume) - sound = self.filesounds[absfilename] - elif data.sound == SoundRequest.SAY: - voice_key = data.arg + '---' + data.arg2 - if voice_key not in self.voicesounds.keys(): - rospy.logdebug('command for uncached text: "%s"' % voice_key) - if self.plugin is None: - rospy.logerr( - 'Plugin is not found {}.'.format(self.plugin_name)) - else: - if data.arg2 == '': - voice = self.default_voice - else: - voice = data.arg2 - wavfilename = self.plugin.sound_play_say_plugin( - data.arg, voice) - if wavfilename is None: - rospy.logerr('Failed to generate wavfile.') - else: - self.voicesounds[voice_key] = SoundType( - wavfilename, self.device, data.volume) - else: - rospy.logdebug('command for cached text: "%s"' % voice_key) - voicesound = self.voicesounds[voice_key] - if voicesound.sound.get_property('volume') != data.volume: - rospy.logdebug( - 'volume for cached text has changed, resetting volume') - voicesound.sound.set_property('volume', data.volume) - sound = self.voicesounds[voice_key] - else: - rospy.logdebug('command for builtin wave: %i' % data.sound) - if ((data.sound in self.builtinsounds and - data.volume != self.builtinsounds[data.sound].volume) - or data.sound not in self.builtinsounds): - params = self.builtinsoundparams[data.sound] - volume = data.volume - # use the second param as a scaling for the input volume - if params[1] != 1: - volume = (volume + params[1])/2 - self.builtinsounds[data.sound] = SoundType( - params[0], self.device, volume) - sound = self.builtinsounds[data.sound] - if sound.staleness != 0 and data.command != SoundRequest.PLAY_STOP: - # This sound isn't counted in active_sounds - rospy.logdebug("activating %i %s" % (data.sound, data.arg)) - self.active_sounds = self.active_sounds + 1 - sound.staleness = 0 - return sound - - def callback(self, data): - if not self.initialized: - return - self.mutex.acquire() - try: - if (data.sound == SoundRequest.ALL - and data.command == SoundRequest.PLAY_STOP): - self.stopall() - else: - sound = self.select_sound(data) - sound.command(data.command) - except Exception as e: - rospy.logerr('Exception in callback: %s' % str(e)) - rospy.loginfo(traceback.format_exc()) - finally: - self.mutex.release() - rospy.logdebug("done callback") - - # Purge sounds that haven't been played in a while. - def cleanupdict(self, dict): - purgelist = [] - for key, sound in iter(dict.items()): - try: - staleness = sound.get_staleness() - except Exception as e: - rospy.logerr( - 'Exception in cleanupdict for sound (%s): %s' - % (str(key), str(e))) - # Something is wrong. Let's purge and try again. - staleness = 100 - # print "%s %i"%(key, staleness) - if staleness >= 10: - purgelist.append(key) - # Sound is playing - if staleness == 0: - self.active_sounds = self.active_sounds + 1 - for key in purgelist: - rospy.logdebug('Purging %s from cache' % key) - # clean up resources - dict[key].dispose() - del dict[key] - - def cleanup(self): - self.mutex.acquire() - try: - self.active_sounds = 0 - self.cleanupdict(self.filesounds) - self.cleanupdict(self.voicesounds) - self.cleanupdict(self.builtinsounds) - except Exception: - rospy.loginfo( - 'Exception in cleanup: %s' % sys.exc_info()[0]) - finally: - self.mutex.release() - - def diagnostics(self, state): - try: - da = DiagnosticArray() - ds = DiagnosticStatus() - ds.name = rospy.get_caller_id().lstrip('/') + ": Node State" - if state == 0: - ds.level = DiagnosticStatus.OK - ds.message = "%i sounds playing" % self.active_sounds - ds.values.append( - KeyValue("Active sounds", str(self.active_sounds))) - ds.values.append( - KeyValue( - "Allocated sound channels", - str(self.num_channels))) - ds.values.append( - KeyValue( - "Buffered builtin sounds", - str(len(self.builtinsounds)))) - ds.values.append( - KeyValue( - "Buffered wave sounds", - str(len(self.filesounds)))) - ds.values.append( - KeyValue( - "Buffered voice sounds", - str(len(self.voicesounds)))) - elif state == 1: - ds.level = DiagnosticStatus.WARN - ds.message = "Sound device not open yet." - else: - ds.level = DiagnosticStatus.ERROR - ds.message = "Can't open sound device." +\ - "See http://wiki.ros.org/sound_play/Troubleshooting" - da.status.append(ds) - da.header.stamp = rospy.get_rostime() - self.diagnostic_pub.publish(da) - except Exception as e: - rospy.loginfo('Exception in diagnostics: %s' % str(e)) - - def execute_cb(self, data): - data = data.sound_request - if not self.initialized: - rospy.logerr('soundplay_node is not initialized yet.') - self._as.set_aborted() - return - self.mutex.acquire() - # Force only one sound at a time - self.stopall() - try: - if (data.sound == SoundRequest.ALL - and data.command == SoundRequest.PLAY_STOP): - self.stopall() - else: - sound = self.select_sound(data) - sound.command(data.command) - - r = rospy.Rate(self.loop_rate) - start_time = rospy.get_rostime() - success = True - while sound.get_playing(): - sound.update() - if self._as.is_preempt_requested(): - rospy.loginfo('sound_play action: Preempted') - sound.stop() - self._as.set_preempted() - success = False - break - - self._feedback.playing = sound.get_playing() - self._feedback.stamp = rospy.get_rostime() - start_time - self._as.publish_feedback(self._feedback) - r.sleep() - - if success: - self._result.playing = self._feedback.playing - self._result.stamp = self._feedback.stamp - rospy.loginfo('sound_play action: Succeeded') - self._as.set_succeeded(self._result) - - except Exception as e: - self._as.set_aborted() - rospy.logerr( - 'Exception in actionlib callback: %s' % str(e)) - rospy.loginfo(traceback.format_exc()) - finally: - self.mutex.release() - rospy.logdebug("done actionlib callback") - - def __init__(self): - Gst.init(None) - - # Start gobject thread to receive gstreamer messages - GObject.threads_init() - self.g_loop = threading.Thread(target=GObject.MainLoop().run) - self.g_loop.daemon = True - self.g_loop.start() - - rospy.init_node('sound_play') - self.loop_rate = rospy.get_param('~loop_rate', 100) - self.device = rospy.get_param("~device", "default") - self.default_voice = rospy.get_param('~default_voice', None) - self.plugin_name = rospy.get_param( - '~plugin', 'sound_play/festival_plugin') - self.diagnostic_pub = rospy.Publisher( - "/diagnostics", DiagnosticArray, queue_size=1) - rootdir = os.path.join( - roslib.packages.get_pkg_dir('sound_play'), 'sounds') - - # load plugin - rospack = rospkg.RosPack() - depend_pkgs = rospack.get_depends_on('sound_play', implicit=False) - depend_pkgs = ['sound_play'] + depend_pkgs - rospy.loginfo("Loading from plugin definitions") - plugin_yamls = [] - for depend_pkg in depend_pkgs: - manifest = rospack.get_manifest(depend_pkg) - plugin_yaml = manifest.get_export('sound_play', 'plugin') - if len(plugin_yaml) != 0: - plugin_yamls += plugin_yaml - for plugin_y in plugin_yaml: - rospy.logdebug('Loading plugin in {}'.format(plugin_y)) - plugin_dict = {} - for plugin_yaml in plugin_yamls: - if not os.path.exists(plugin_yaml): - rospy.logerr( - 'Failed to load plugin yaml: {}'.format(plugin_yaml)) - rospy.logerr( - 'Missing plugin yaml: {}'.format(plugin_yaml)) - continue - with open(plugin_yaml) as f: - plugin_descs = yaml.safe_load(f) - for plugin_desc in plugin_descs: - plugin_dict[plugin_desc['name']] = plugin_desc['module'] - - self.plugin = None - if self.plugin_name in plugin_dict.keys(): - plugin_module = plugin_dict[self.plugin_name] - mod = __import__(plugin_module.split('.')[0]) - for sub_mod in plugin_module.split('.')[1:]: - mod = getattr(mod, sub_mod) - self.plugin = mod() - - self.builtinsoundparams = { - SoundRequest.BACKINGUP: ( - os.path.join(rootdir, 'BACKINGUP.ogg'), 0.1), - SoundRequest.NEEDS_UNPLUGGING: ( - os.path.join(rootdir, 'NEEDS_UNPLUGGING.ogg'), 1), - SoundRequest.NEEDS_PLUGGING: ( - os.path.join(rootdir, 'NEEDS_PLUGGING.ogg'), 1), - SoundRequest.NEEDS_UNPLUGGING_BADLY: ( - os.path.join(rootdir, 'NEEDS_UNPLUGGING_BADLY.ogg'), 1), - SoundRequest.NEEDS_PLUGGING_BADLY: ( - os.path.join(rootdir, 'NEEDS_PLUGGING_BADLY.ogg'), 1), - } - - self.no_error = True - self.initialized = False - self.active_sounds = 0 - - self.mutex = threading.Lock() - self.sub = rospy.Subscriber("robotsound", SoundRequest, self.callback) - self._as = actionlib.SimpleActionServer( - 'sound_play', SoundRequestAction, - execute_cb=self.execute_cb, auto_start=False) - - self.mutex.acquire() - # For ros startup race condition - self.sleep(0.5) - self.diagnostics(1) - - while not rospy.is_shutdown(): - while not rospy.is_shutdown(): - self.init_vars() - self.no_error = True - self.initialized = True - self.mutex.release() - if not self._as.action_server.started: - self._as.start() - try: - self.idle_loop() - # Returns after inactive period to test device availability - # print "Exiting idle" - except Exception: - rospy.loginfo( - 'Exception in idle_loop: %s' % sys.exc_info()[0]) - finally: - self.mutex.acquire() - - self.diagnostics(2) - self.mutex.release() - - def init_vars(self): - self.num_channels = 10 - self.builtinsounds = {} - self.filesounds = {} - self.voicesounds = {} - self.hotlist = [] - if not self.initialized: - rospy.loginfo('sound_play node is ready to play sound') - - def sleep(self, duration): - try: - rospy.sleep(duration) - except rospy.exceptions.ROSInterruptException: - pass - - def get_sound_length(self): - sound_length = len(self.builtinsounds) +\ - len(self.voicesounds) + len(self.filesounds) - return sound_length - - def idle_loop(self): - self.last_activity_time = rospy.get_time() - while (not rospy.is_shutdown() - and (rospy.get_time() - self.last_activity_time < 10 - or self.get_sound_length() > 0)): - # print("idle_loop") - self.diagnostics(0) - self.sleep(1) - self.cleanup() - # print("idle_exiting") - - -if __name__ == '__main__': - SoundPlayNode() diff --git a/src/lib/sound_play/scripts/test.py b/src/lib/sound_play/scripts/test.py deleted file mode 100755 index 2bf9d0fbe..000000000 --- a/src/lib/sound_play/scripts/test.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -#*********************************************************** -#* Software License Agreement (BSD License) -#* -#* Copyright (c) 2009, Willow Garage, Inc. -#* All rights reserved. -#* -#* Redistribution and use in source and binary forms, with or without -#* modification, are permitted provided that the following conditions -#* are met: -#* -#* * Redistributions of source code must retain the above copyright -#* notice, this list of conditions and the following disclaimer. -#* * Redistributions in binary form must reproduce the above -#* copyright notice, this list of conditions and the following -#* disclaimer in the documentation and/or other materials provided -#* with the distribution. -#* * Neither the name of the Willow Garage nor the names of its -#* contributors may be used to endorse or promote products derived -#* from this software without specific prior written permission. -#* -#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -#* POSSIBILITY OF SUCH DAMAGE. -#*********************************************************** - -# Author: Blaise Gassend - -import rospy, os, sys -from sound_play.msg import SoundRequest - -from sound_play.libsoundplay import SoundClient - -def sleep(t): - try: - rospy.sleep(t) - except: - pass - -if __name__ == '__main__': - rospy.init_node('soundplay_test', anonymous = True) - soundhandle = SoundClient() - - rospy.sleep(1) - - soundhandle.stopAll() - - rospy.loginfo("This script will run continuously until you hit CTRL+C, testing various sound_node sound types.") - - #print 'Try to play wave files that do not exist.' - #soundhandle.playWave('17') - #soundhandle.playWave('dummy') - - # print 'say' - # soundhandle.say('Hello world!') - # sleep(3) - - rospy.loginfo('wave') - soundhandle.playWave('say-beep.wav') - sleep(2) - - rospy.loginfo('quiet wave') - soundhandle.playWave('say-beep.wav', 0.3) - sleep(2) - - rospy.loginfo('plugging') - soundhandle.play(SoundRequest.NEEDS_PLUGGING) - sleep(2) - - rospy.loginfo('quiet plugging') - soundhandle.play(SoundRequest.NEEDS_PLUGGING, 0.3) - sleep(2) - - rospy.loginfo('unplugging') - soundhandle.play(SoundRequest.NEEDS_UNPLUGGING) - sleep(2) - - rospy.loginfo('plugging badly') - soundhandle.play(SoundRequest.NEEDS_PLUGGING_BADLY) - sleep(2) - - rospy.loginfo('unplugging badly') - soundhandle.play(SoundRequest.NEEDS_UNPLUGGING_BADLY) - sleep(2) - - s1 = soundhandle.builtinSound(SoundRequest.NEEDS_UNPLUGGING_BADLY) - s2 = soundhandle.waveSound("say-beep.wav") - s3 = soundhandle.voiceSound("Testing the new A P I") - s4 = soundhandle.builtinSound(SoundRequest.NEEDS_UNPLUGGING_BADLY, 0.3) - s5 = soundhandle.waveSound("say-beep.wav", 0.3) - s6 = soundhandle.voiceSound("Testing the new A P I", 0.3) - - rospy.loginfo("New API start voice") - s3.repeat() - sleep(3) - - rospy.loginfo("New API start voice quiet") - s6.play() - sleep(3) - - rospy.loginfo("New API wave") - s2.repeat() - sleep(2) - - rospy.loginfo("New API wave quiet") - s5.play() - sleep(2) - - rospy.loginfo("New API builtin") - s1.play() - sleep(2) - - rospy.loginfo("New API builtin quiet") - s4.play() - sleep(2) - - rospy.loginfo("New API stop") - s3.stop() diff --git a/src/lib/sound_play/scripts/test/test_sound_client.py b/src/lib/sound_play/scripts/test/test_sound_client.py deleted file mode 100644 index 89c567802..000000000 --- a/src/lib/sound_play/scripts/test/test_sound_client.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - -import unittest - -import rospy -import rostest -from sound_play.libsoundplay import SoundClient - -class TestCase(unittest.TestCase): - def test_soundclient_constructor(self): - s = SoundClient() - self.assertIsNotNone(s) - -if __name__ == '__main__': - rostest.rosrun('sound_play', 'test_sound_client', TestCase) - -__author__ = 'Felix Duvallet' diff --git a/src/lib/sound_play/scripts/test_actionlib_client.py b/src/lib/sound_play/scripts/test_actionlib_client.py deleted file mode 100755 index 01840b621..000000000 --- a/src/lib/sound_play/scripts/test_actionlib_client.py +++ /dev/null @@ -1,60 +0,0 @@ -#! /usr/bin/env python - -import roslib; roslib.load_manifest('sound_play') -import rospy -import actionlib -from sound_play.msg import SoundRequest, SoundRequestAction, SoundRequestGoal - -import os - -def sound_play_client(volume=1.0): - client = actionlib.SimpleActionClient('sound_play', SoundRequestAction) - - client.wait_for_server() - - rospy.loginfo("Need Unplugging") - goal = SoundRequestGoal() - goal.sound_request.sound = SoundRequest.NEEDS_UNPLUGGING - goal.sound_request.command = SoundRequest.PLAY_ONCE - goal.sound_request.volume = volume - - client.send_goal(goal) - client.wait_for_result() - # print client.get_result() - rospy.loginfo("End Need Unplugging") - - rospy.loginfo("Need Plugging") - goal = SoundRequestGoal() - goal.sound_request.sound = SoundRequest.NEEDS_PLUGGING - goal.sound_request.command = SoundRequest.PLAY_ONCE - goal.sound_request.volume = volume - client.send_goal(goal) - client.wait_for_result() - # print client.get_result() - rospy.loginfo("End Need Plugging") - - rospy.loginfo("Say") - goal = SoundRequestGoal() - goal.sound_request.sound = SoundRequest.SAY - goal.sound_request.command = SoundRequest.PLAY_ONCE - goal.sound_request.arg = "Testing the actionlib interface A P I" - goal.sound_request.volume = volume - client.send_goal(goal) - client.wait_for_result() - # print client.get_result() - rospy.loginfo("End Say") - - rospy.loginfo("Wav") - goal = SoundRequestGoal() - goal.sound_request.sound = SoundRequest.PLAY_FILE - goal.sound_request.command = SoundRequest.PLAY_ONCE - goal.sound_request.arg = os.path.join(roslib.packages.get_pkg_dir('sound_play'),'sounds') + "/say-beep.wav" - goal.sound_request.volume = volume - client.send_goal(goal) - client.wait_for_result() - # print client.get_result() - rospy.loginfo("End wav") - -if __name__ == '__main__': - rospy.init_node('soundplay_client_test') - sound_play_client() diff --git a/src/lib/sound_play/setup.py b/src/lib/sound_play/setup.py deleted file mode 100644 index df3c32f97..000000000 --- a/src/lib/sound_play/setup.py +++ /dev/null @@ -1,9 +0,0 @@ -from catkin_pkg.python_setup import generate_distutils_setup -from setuptools import setup - -d = generate_distutils_setup( - packages=['sound_play'], - package_dir={'': 'src'} - ) - -setup(**d) diff --git a/src/lib/sound_play/sound_play_plugin.yaml b/src/lib/sound_play/sound_play_plugin.yaml deleted file mode 100644 index a5b262ee4..000000000 --- a/src/lib/sound_play/sound_play_plugin.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- name: sound_play/festival_plugin - module: sound_play.festival_plugin.FestivalPlugin -- name: sound_play/flite_plugin - module: sound_play.flite_plugin.FlitePlugin diff --git a/src/lib/sound_play/soundplay_node.launch b/src/lib/sound_play/soundplay_node.launch deleted file mode 100644 index f5110d35e..000000000 --- a/src/lib/sound_play/soundplay_node.launch +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/sound_play/sounds/BACKINGUP.ogg b/src/lib/sound_play/sounds/BACKINGUP.ogg deleted file mode 100644 index 4bc6db541a87dcc6be24ee464531ab7bd6cb5d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12861 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 diff --git a/src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg b/src/lib/sound_play/sounds/NEEDS_PLUGGING.ogg deleted file mode 100644 index 0a15885c383ce1a0d03dafbc95aa011a87811655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11050 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

Ytq*el{dTuufD`+@73+wG-GzCyZOhdN8 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 diff --git a/src/lib/sound_play/sounds/NEEDS_PLUGGING_BADLY.ogg b/src/lib/sound_play/sounds/NEEDS_PLUGGING_BADLY.ogg deleted file mode 100644 index d336822e814007b8cbb3af0509317f145ebb2e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35782 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 diff --git a/src/lib/sound_play/sounds/NEEDS_UNPLUGGING.ogg b/src/lib/sound_play/sounds/NEEDS_UNPLUGGING.ogg deleted file mode 100644 index 1596c734f4937bba42674f2f0cadddd12212c2ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35535 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 z 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 diff --git a/src/lib/sound_play/sounds/NEEDS_UNPLUGGING_BADLY.ogg b/src/lib/sound_play/sounds/NEEDS_UNPLUGGING_BADLY.ogg deleted file mode 100644 index 028196f3a69db238065500ed74b2018ab27ce799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78198 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�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 F`+qM$N96zj diff --git a/src/lib/sound_play/sounds/say-beep.wav b/src/lib/sound_play/sounds/say-beep.wav deleted file mode 100644 index 161c43c312bc0442869a0289f958d977a5aec578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4058 zcmZuzzl-BW6yAlvrps|$b2iWuA&k@yNh1Ol}hNuyREP@zVJ z!}{}ViX zzPY)%#lK(gZ}{)_=4V*GJAVZ~;r%a=e>;Ig?sXbP2Z>ofESj4%j% z-w%RNM2VDXmSt%wlLTr)2>9ce=)jXY3>eDH2s$y}zFKFE4p41De0-o?&n>>$^o9BmNhy)Xf$y1qV7$-%(67kr!hog~YTYi*OyS6>Q zwoS7wGD-7tL5#3eX(lCwMgGV(E#xW{L&qA9NA|=PLA-ux+Vi<>+jUVSn4`PGG>M2J zAzxmq2&En2S`i6eEsdooNY}+k}C?%EvYrxRw_Zi*tts?ef@u>=n*Ljkchq9iMYQ&}VTaWov+!-ZI-b-h2oACKo< zRb?TqCiaI&C^2jeUQQ9mvI=Ll^$^_;C*Nj+X|j;JP4kL^9`lOLZtv*jyx1-Tu zI`(3>YPN^B)9Ki}lxd31;vo=@g3Pe-QOhie@s1XS{nfw!^89V`Jd1p}+wR^^?Rj5s zGAVrQ7VHk39Zae~9MmH%16`>Unrdyz!NilQtK zER|(!rK?-_>25L}TT?9iOS3({?+?d%U8E5*bG*P4(8h5rb2?gC<?dw}}IBcpMiTNmZ=o1Ci#wjLZI!nS&^Xc8l8cyb37?(}Gdu?A1O;r`K5IzoX zKzkJh01Ho9sys+GC>izy@yW2uF4wJ|Wa6n=lt^|7)djYqG^n!S4 zFITqZtQ<@f$n|zpt=C9{&mkW~Y(O+D6`e`GA^7s5>j;gEd@J!ag@bh6)Jev-0NSg`r@k85(z#nYvuf zp7SGxEeg{`Vyd!Vv`7xks40(r8f(`v-pn@womZ)$4;!w}qFxS(;@@*7`P+@29#{LXT@SS*LhQ%Hsgz3l+}8( z*=)CX(22vx8{6J@oyB}=TefY_=8NSDr#2yIwXP~WE1XP->ZZQge72AWJ`=9H!j~AA zgP?pQ{wpDIIq-hRg!GScMFw=y;tJrrX?xN)n|^}75;RMSg1Hcy%RyfcI+(!HXH!YQ zi4DXjijOT9gja*MJvXk6s){;dC>O`08uKw%OQ1#cav=d?^U_?OSC|!o0qmxSUKSM* zqFRLodJiSaiBRSgg%nu>Pjc&Pgpa(=fN{!A5JH=D-Jk<& zhz1$766<1LG?ax!lpMO`RkB3aO0afp3V-n^h*mH}m7+#<5=vUR(C42XDWnRn6t5I? zHn8Ym3TK2UIR9OkT2D<|#mAZvNHy}an%1PDRyTki)>w@OQ;b=6`kF9yTb2Scl{-d6 z(Ts|6YUIUtG3#DO(C=R6Y$F^^2m_ioH{;OJFV>5@Uj!wfgLJi2;EyvPyC$d}CqP{j zSoL&XG$0NEdO2#_4=lE_77^5lxSc-BF~_JHkV)YR%?oou=$;a|meJgPVHj<&CZF!c zQedNEfTnXD_bMltHRKx5+2HE@ycP;d$WB+W^fuQLoln03R(N)^k$RjtjnLOfGh;?- yE4jI=j0Q_X#nTQNUjq%Yuii8FsAfPZQ8UC|NBPLf_rD&hm;OBbKa rospy.Duration(0): - if server_timeout is None: - server_timeout = rospy.Duration() - if not self.actionclient.wait_for_server(timeout=server_timeout): - return - - goal = SoundRequestGoal() - goal.sound_request = msg - while not replace and self._playing: - rospy.sleep(0.1) - self.actionclient.send_goal(goal) - if result_timeout is None or result_timeout > rospy.Duration(0): - if result_timeout is None: - result_timeout = rospy.Duration() - if self.actionclient.wait_for_result(timeout=result_timeout): - rospy.logdebug('sound request response received') - return - - def _action_status_cb(self, msg): - if 1 in [s.status for s in msg.status_list]: - self._playing = True - else: - self._playing = False diff --git a/src/lib/sound_play/src/sound_play/sound_play_plugin.py b/src/lib/sound_play/src/sound_play/sound_play_plugin.py deleted file mode 100644 index f8ef500c2..000000000 --- a/src/lib/sound_play/src/sound_play/sound_play_plugin.py +++ /dev/null @@ -1,30 +0,0 @@ -class SoundPlayPlugin(object): - - """Base class for sound_play plugin - - This is a base class for sound_play plugin. - sound_play plugin has one method; sound_play_say_plugin. - sound_play_start_plugin run when command is SAY. - - sound_play plugin is defined in yaml format as below; - - name: sound_play/festival_plugin # plugin name - module: sound_play.festival_plugin.FestivalPlugin - # plugin module name - - Also, sound_play plugin yaml file is exported in package.xml as below; - - - - """ - - def __init__(self): - pass - - def sound_play_say_plugin(self, text, voice): - """Start plugin for sound_play - - Args: - text (string): speech text - voice (string): speech voice - """ - return None diff --git a/src/lib/sound_play/src/sound_play/sound_type.py b/src/lib/sound_play/src/sound_play/sound_type.py deleted file mode 100644 index e5f089bf4..000000000 --- a/src/lib/sound_play/src/sound_play/sound_type.py +++ /dev/null @@ -1,154 +0,0 @@ -import os -import threading - -import rospy - -from sound_play.msg import SoundRequest - -try: - import gi - gi.require_version('Gst', '1.0') - from gi.repository import Gst as Gst -except Exception: - str = """ -************************************************************** -Error opening pygst. Is gstreamer installed? -************************************************************** -""" - rospy.logfatal(str) - # print str - exit(1) - - -class SoundType(object): - STOPPED = 0 - LOOPING = 1 - COUNTING = 2 - - def __init__(self, file, device, volume=1.0): - self.lock = threading.RLock() - self.state = self.STOPPED - self.sound = Gst.ElementFactory.make("playbin", None) - if self.sound is None: - raise Exception("Could not create sound player") - - if device: - self.sink = Gst.ElementFactory.make("alsasink", "sink") - self.sink.set_property("device", device) - self.sound.set_property("audio-sink", self.sink) - - if (":" in file): - uri = file - elif os.path.isfile(file): - uri = "file://" + os.path.abspath(file) - else: - rospy.logerr('Error: URI is invalid: %s' % file) - - self.uri = uri - self.volume = volume - self.sound.set_property('uri', uri) - self.sound.set_property("volume", volume) - self.staleness = 1 - self.file = file - - self.bus = self.sound.get_bus() - self.bus.add_signal_watch() - self.bus_conn_id = self.bus.connect("message", self.on_stream_end) - - def on_stream_end(self, bus, message): - if message.type == Gst.MessageType.EOS: - if (self.state == self.LOOPING): - self.sound.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0) - else: - self.stop() - - def __del__(self): - # stop our GST object so that it gets garbage-collected - self.dispose() - - def update(self): - if self.bus is not None: - self.bus.poll(Gst.MessageType.ERROR, 10) - - def loop(self): - self.lock.acquire() - try: - self.staleness = 0 - if self.state == self.COUNTING: - self.stop() - - if self.state == self.STOPPED: - self.sound.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0) - self.sound.set_state(Gst.State.PLAYING) - self.state = self.LOOPING - finally: - self.lock.release() - - def dispose(self): - self.lock.acquire() - try: - if self.bus is not None: - self.sound.set_state(Gst.State.NULL) - self.bus.disconnect(self.bus_conn_id) - self.bus.remove_signal_watch() - self.bus = None - self.sound = None - self.sink = None - self.state = self.STOPPED - except Exception as e: - rospy.logerr('Exception in dispose: %s' % str(e)) - finally: - self.lock.release() - - def stop(self): - if self.state != self.STOPPED: - self.lock.acquire() - try: - self.sound.set_state(Gst.State.NULL) - self.state = self.STOPPED - finally: - self.lock.release() - - def single(self): - self.lock.acquire() - try: - rospy.logdebug("Playing %s" % self.uri) - self.staleness = 0 - if self.state == self.LOOPING: - self.stop() - - self.sound.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0) - self.sound.set_state(Gst.State.PLAYING) - self.state = self.COUNTING - finally: - self.lock.release() - - def command(self, cmd): - if cmd == SoundRequest.PLAY_STOP: - self.stop() - elif cmd == SoundRequest.PLAY_ONCE: - self.single() - elif cmd == SoundRequest.PLAY_START: - self.loop() - - def get_staleness(self): - self.lock.acquire() - position = 0 - duration = 0 - try: - position = self.sound.query_position(Gst.Format.TIME)[1] - duration = self.sound.query_duration(Gst.Format.TIME)[1] - except Exception: - position = 0 - duration = 0 - finally: - self.lock.release() - - if position != duration: - self.staleness = 0 - else: - self.staleness = self.staleness + 1 - return self.staleness - - def get_playing(self): - return self.state == self.COUNTING diff --git a/src/lib/sound_play/test.launch b/src/lib/sound_play/test.launch deleted file mode 100644 index 743d8272a..000000000 --- a/src/lib/sound_play/test.launch +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/src/lib/sound_play/test/CMakeLists.txt b/src/lib/sound_play/test/CMakeLists.txt deleted file mode 100644 index 8a6f8e810..000000000 --- a/src/lib/sound_play/test/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -add_executable(test_sound_play test.cpp) -target_link_libraries(test_sound_play ${catkin_LIBRARIES}) -add_dependencies(test_sound_play sound_play_gencpp) -set_target_properties(test_sound_play PROPERTIES OUTPUT_NAME test) diff --git a/src/lib/sound_play/test/test.cpp b/src/lib/sound_play/test/test.cpp deleted file mode 100644 index a272d7faa..000000000 --- a/src/lib/sound_play/test/test.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/********************************************************************* -* Software License Agreement (BSD License) -* -* Copyright (c) 2009, Willow Garage, Inc. -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials provided -* with the distribution. -* * Neither the name of the Willow Garage nor the names of its -* contributors may be used to endorse or promote products derived -* from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*********************************************************************/ - -#include -#include - -void sleepok(int t, ros::NodeHandle &nh) -{ - if (nh.ok()) - sleep(t); -} - -int main(int argc, char **argv) -{ - ros::init(argc, argv, "sound_play_test"); - - ros::NodeHandle nh; - sound_play::SoundClient sc; - sound_play::SoundClient quiet_sc; - - sleepok(1, nh); - - while(nh.ok()) - { - sc.say("Hello world!"); - sleepok(2, nh); - quiet_sc.say("Hello world!"); - sleepok(2, nh); - - const char *str1 = "I am annoying."; - sc.repeat(str1); - sleepok(4, nh); - sc.stopSaying(str1); - quiet_sc.repeat(str1); - sleepok(4, nh); - quiet_sc.stopSaying(str1); - - sc.playWave("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); - sleepok(2, nh); - quiet_sc.playWave("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); - sleepok(2, nh); - - const char *str2 = "/usr/share/xemacs21/xemacs-packages/etc/sounds/piano-beep.wav"; - sc.startWave(str2); - sleepok(4, nh); - sc.stopWave(str2); - quiet_sc.startWave(str2); - sleepok(4, nh); - quiet_sc.stopWave(str2); - - sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); - sleepok(2, nh); - quiet_sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); - sleepok(2, nh); - - sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); - sleepok(2, nh); - quiet_sc.play(sound_play::SoundRequest::NEEDS_UNPLUGGING); - sleepok(2, nh); - - sc.start(sound_play::SoundRequest::BACKINGUP); - sleepok(4, nh); - sc.stop(sound_play::SoundRequest::BACKINGUP); - quiet_sc.start(sound_play::SoundRequest::BACKINGUP); - sleepok(4, nh); - quiet_sc.stop(sound_play::SoundRequest::BACKINGUP); - - sleepok(2, nh); - sound_play::Sound s1 = sc.waveSound("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); - s1.repeat(); - sleepok(1, nh); - s1.stop(); - - sleepok(2, nh); - sound_play::Sound s2 = quiet_sc.waveSound("/usr/share/xemacs21/xemacs-packages/etc/sounds/boing.wav"); - s2.repeat(); - sleepok(1, nh); - s2.stop(); - - sleepok(2, nh); - sound_play::Sound s3 = sc.voiceSound("This is a really long sentence that will get cut off."); - s3.play(); - sleepok(1, nh); - s3.stop(); - - sleepok(2, nh); - sound_play::Sound s4 = quiet_sc.voiceSound("This is a really long sentence that will get cut off."); - s4.play(); - sleepok(1, nh); - s4.stop(); - - sleepok(2, nh); - sound_play::Sound s5 = sc.builtinSound(sound_play::SoundRequest::NEEDS_UNPLUGGING_BADLY); - s5.play(); - sleepok(1, nh); - s5.stop(); - - sleepok(2, nh); - sound_play::Sound s6 = quiet_sc.builtinSound(sound_play::SoundRequest::NEEDS_UNPLUGGING_BADLY); - s6.play(); - sleepok(1, nh); - s6.stop(); - - sleepok(2, nh); - sound_play::Sound s7 = sc.waveSoundFromPkg("sound_play", "sounds/BACKINGUP.ogg"); - s7.play(); - sleepok(1, nh); - s7.stop(); - - sleepok(2, nh); - sound_play::Sound s8 = quiet_sc.waveSoundFromPkg("sound_play", "sounds/BACKINGUP.ogg"); - s8.play(); - sleepok(1, nh); - s8.stop(); - } -} From a7021ab9ccccbe0987fc5d5603ae32d848a08013 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 19:14:25 +0100 Subject: [PATCH 32/74] git subrepo clone git@github.com:mgonzs13/audio_common.git src/lib subrepo: subdir: "src/lib" merged: "61bfa8348" upstream: origin: "git@github.com:mgonzs13/audio_common.git" branch: "main" commit: "61bfa8348" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "ea10886" --- src/lib/.github/Doxyfile | 2812 +++++++++++++++++ .../workflows/close-inactive-issues.yml | 24 + src/lib/.github/workflows/cpp-formatter.yml | 16 + src/lib/.github/workflows/create-release.yml | 50 + .../.github/workflows/doxygen-deployment.yml | 45 + src/lib/.github/workflows/foxy-build-test.yml | 28 + .../.github/workflows/foxy-docker-push.yml | 35 + .../.github/workflows/galactic-build-test.yml | 28 + .../workflows/galactic-docker-push.yml | 35 + .../.github/workflows/humble-build-test.yml | 28 + .../.github/workflows/humble-docker-push.yml | 30 + src/lib/.github/workflows/iron-build-test.yml | 28 + .../.github/workflows/iron-docker-push.yml | 35 + .../.github/workflows/jazzy-build-test.yml | 28 + .../.github/workflows/jazzy-docker-push.yml | 35 + .../.github/workflows/kilted-build-test.yml | 28 + .../.github/workflows/kilted-docker-push.yml | 35 + .../.github/workflows/rolling-build-test.yml | 28 + .../.github/workflows/rolling-docker-push.yml | 35 + src/lib/.gitignore | 1 + src/lib/.gitrepo | 12 + src/lib/CITATION.cff | 8 + src/lib/Dockerfile | 24 + src/lib/LICENSE | 21 + src/lib/README.md | 240 ++ src/lib/audio_common/.clang-format | 192 ++ src/lib/audio_common/CMakeLists.txt | 117 + .../audio_common/audio_capturer_node.hpp | 57 + .../audio_common/audio_player_node.hpp | 61 + .../include/audio_common/music_node.hpp | 86 + .../include/audio_common/tts_node.hpp | 75 + .../include/audio_common/wave_file.hpp | 57 + src/lib/audio_common/package.xml | 20 + src/lib/audio_common/samples/elevator.wav | Bin 0 -> 1028438 bytes .../audio_common/src/audio_capturer_main.cpp | 33 + .../src/audio_common/audio_capturer_node.cpp | 142 + .../src/audio_common/audio_player_node.cpp | 201 ++ .../src/audio_common/music_node.cpp | 210 ++ .../src/audio_common/tts_node.cpp | 164 + .../src/audio_common/wave_file.cpp | 87 + .../audio_common/src/audio_player_main.cpp | 33 + src/lib/audio_common/src/music_main.cpp | 33 + src/lib/audio_common/src/tts_main.cpp | 33 + src/lib/audio_common_msgs/CMakeLists.txt | 28 + src/lib/audio_common_msgs/action/TTS.action | 8 + src/lib/audio_common_msgs/msg/Audio.msg | 2 + src/lib/audio_common_msgs/msg/AudioData.msg | 5 + src/lib/audio_common_msgs/msg/AudioInfo.msg | 4 + .../audio_common_msgs/msg/AudioStamped.msg | 2 + src/lib/audio_common_msgs/package.xml | 17 + src/lib/audio_common_msgs/srv/MusicPlay.srv | 5 + 51 files changed, 5361 insertions(+) create mode 100644 src/lib/.github/Doxyfile create mode 100644 src/lib/.github/workflows/close-inactive-issues.yml create mode 100644 src/lib/.github/workflows/cpp-formatter.yml create mode 100644 src/lib/.github/workflows/create-release.yml create mode 100644 src/lib/.github/workflows/doxygen-deployment.yml create mode 100644 src/lib/.github/workflows/foxy-build-test.yml create mode 100644 src/lib/.github/workflows/foxy-docker-push.yml create mode 100644 src/lib/.github/workflows/galactic-build-test.yml create mode 100644 src/lib/.github/workflows/galactic-docker-push.yml create mode 100644 src/lib/.github/workflows/humble-build-test.yml create mode 100644 src/lib/.github/workflows/humble-docker-push.yml create mode 100644 src/lib/.github/workflows/iron-build-test.yml create mode 100644 src/lib/.github/workflows/iron-docker-push.yml create mode 100644 src/lib/.github/workflows/jazzy-build-test.yml create mode 100644 src/lib/.github/workflows/jazzy-docker-push.yml create mode 100644 src/lib/.github/workflows/kilted-build-test.yml create mode 100644 src/lib/.github/workflows/kilted-docker-push.yml create mode 100644 src/lib/.github/workflows/rolling-build-test.yml create mode 100644 src/lib/.github/workflows/rolling-docker-push.yml create mode 100644 src/lib/.gitignore create mode 100644 src/lib/.gitrepo create mode 100644 src/lib/CITATION.cff create mode 100644 src/lib/Dockerfile create mode 100644 src/lib/LICENSE create mode 100644 src/lib/README.md create mode 100644 src/lib/audio_common/.clang-format create mode 100644 src/lib/audio_common/CMakeLists.txt create mode 100644 src/lib/audio_common/include/audio_common/audio_capturer_node.hpp create mode 100644 src/lib/audio_common/include/audio_common/audio_player_node.hpp create mode 100644 src/lib/audio_common/include/audio_common/music_node.hpp create mode 100644 src/lib/audio_common/include/audio_common/tts_node.hpp create mode 100644 src/lib/audio_common/include/audio_common/wave_file.hpp create mode 100644 src/lib/audio_common/package.xml create mode 100644 src/lib/audio_common/samples/elevator.wav create mode 100644 src/lib/audio_common/src/audio_capturer_main.cpp create mode 100644 src/lib/audio_common/src/audio_common/audio_capturer_node.cpp create mode 100644 src/lib/audio_common/src/audio_common/audio_player_node.cpp create mode 100644 src/lib/audio_common/src/audio_common/music_node.cpp create mode 100644 src/lib/audio_common/src/audio_common/tts_node.cpp create mode 100644 src/lib/audio_common/src/audio_common/wave_file.cpp create mode 100644 src/lib/audio_common/src/audio_player_main.cpp create mode 100644 src/lib/audio_common/src/music_main.cpp create mode 100644 src/lib/audio_common/src/tts_main.cpp create mode 100644 src/lib/audio_common_msgs/CMakeLists.txt create mode 100644 src/lib/audio_common_msgs/action/TTS.action create mode 100644 src/lib/audio_common_msgs/msg/Audio.msg create mode 100644 src/lib/audio_common_msgs/msg/AudioData.msg create mode 100644 src/lib/audio_common_msgs/msg/AudioInfo.msg create mode 100644 src/lib/audio_common_msgs/msg/AudioStamped.msg create mode 100644 src/lib/audio_common_msgs/package.xml create mode 100644 src/lib/audio_common_msgs/srv/MusicPlay.srv diff --git a/src/lib/.github/Doxyfile b/src/lib/.github/Doxyfile new file mode 100644 index 000000000..bfc51c2e9 --- /dev/null +++ b/src/lib/.github/Doxyfile @@ -0,0 +1,2812 @@ +# Doxyfile 1.10.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "audio_common for ROS 2" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs/ + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = SYSTEM + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = README.md \ + audio_common \ + audio_common_msgs + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, +# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to +# be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.md \ + *.c \ + *.cpp \ + *.hpp \ + *.py + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = */build/* +EXCLUDE_PATTERNS += */node_modules/* +EXCLUDE_PATTERNS += */tests/* + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# multi-line macros, enums or list initialized variables directly into the +# documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = . + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" + +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. Explicit enabling an inheritance +# graph or choosing a different representation for an inheritance graph of a +# specific class, can be accomplished by means of the command \inheritancegraph. +# Disabling an inheritance graph can be accomplished by means of the command +# \hideinheritancegraph. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. +# The default value is: YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag UML_LOOK is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will be wrapped across multiple lines. Some heuristics are +# applied to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# https://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. +# The default value is: YES. + +DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/src/lib/.github/workflows/close-inactive-issues.yml b/src/lib/.github/workflows/close-inactive-issues.yml new file mode 100644 index 000000000..6b5e00549 --- /dev/null +++ b/src/lib/.github/workflows/close-inactive-issues.yml @@ -0,0 +1,24 @@ +name: Close Inactive Issues +on: + schedule: + - cron: "30 1 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 30 + days-before-issue-close: 14 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/src/lib/.github/workflows/cpp-formatter.yml b/src/lib/.github/workflows/cpp-formatter.yml new file mode 100644 index 000000000..89a8287cb --- /dev/null +++ b/src/lib/.github/workflows/cpp-formatter.yml @@ -0,0 +1,16 @@ +name: C++ Formatting Check + +on: [push, pull_request] + +jobs: + cpp_formatter: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Clang Formatter + uses: DoozyX/clang-format-lint-action@v0.18.1 + with: + clangFormatVersion: 14 + source: "." diff --git a/src/lib/.github/workflows/create-release.yml b/src/lib/.github/workflows/create-release.yml new file mode 100644 index 000000000..dd2359e28 --- /dev/null +++ b/src/lib/.github/workflows/create-release.yml @@ -0,0 +1,50 @@ +name: Create Release + +on: + push: + branches: [main] + +jobs: + create_release: + if: startsWith(github.event.head_commit.message, 'new version') + + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Extract version from commit message + run: | + if [[ "${{ github.event.head_commit.message }}" =~ new\ version\ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then + echo "version=${BASH_REMATCH[1]}" >> $GITHUB_ENV + else + echo "Commit message does not match 'new version *.*.*' format." + exit 1 + fi + + - name: Get previous tag + run: | + previous_tag=$(git describe --tags --abbrev=0 HEAD^) + echo "previous_tag=$previous_tag" >> $GITHUB_ENV + + - name: Generate release notes with commit messages + run: | + commits=$(git log "${{ env.previous_tag }}..HEAD" --oneline) + echo "release_body<> $GITHUB_ENV + echo "### Changelog from version ${{ env.previous_tag }} to ${{ env.version }}:" >> $GITHUB_ENV + echo "$commits" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Create GitHub release + uses: actions/create-release@latest + env: + GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} + with: + tag_name: "${{ env.version }}" + release_name: "${{ env.version }}" + body: "${{ env.release_body }}" + draft: false + prerelease: false diff --git a/src/lib/.github/workflows/doxygen-deployment.yml b/src/lib/.github/workflows/doxygen-deployment.yml new file mode 100644 index 000000000..fe991d15d --- /dev/null +++ b/src/lib/.github/workflows/doxygen-deployment.yml @@ -0,0 +1,45 @@ +name: Doxygen Deployment + +on: + release: + types: [published] + +jobs: + doxygen_generation: + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Generate Doxygen + uses: mattnotmitt/doxygen-action@edge + with: + doxyfile-path: ".github/Doxyfile" + + - name: Create redirect for root + run: | + mkdir -p redirect + echo '' > redirect/index.html + + - name: Deploy Doxygen page + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: gh-pages + publish_dir: docs + destination_dir: ${{ github.event.release.tag_name }} + keep_files: true + + - name: Deploy redirect to root + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: gh-pages + publish_dir: redirect + keep_files: true diff --git a/src/lib/.github/workflows/foxy-build-test.yml b/src/lib/.github/workflows/foxy-build-test.yml new file mode 100644 index 000000000..08797924c --- /dev/null +++ b/src/lib/.github/workflows/foxy-build-test.yml @@ -0,0 +1,28 @@ +name: Foxy Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + foxy_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:foxy + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: foxy + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/foxy-docker-push.yml b/src/lib/.github/workflows/foxy-docker-push.yml new file mode 100644 index 000000000..3ce04e208 --- /dev/null +++ b/src/lib/.github/workflows/foxy-docker-push.yml @@ -0,0 +1,35 @@ +name: Foxy Docker Push + +on: + release: + types: [published] + +jobs: + foxy_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + run: | + tag_name=$(git describe --tags --abbrev=0 HEAD^) + echo "tag_name=$tag_name" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=foxy + push: true + tags: mgons/audio_common:foxy-${{ github.event.release.tag_name }} diff --git a/src/lib/.github/workflows/galactic-build-test.yml b/src/lib/.github/workflows/galactic-build-test.yml new file mode 100644 index 000000000..23b8a4c22 --- /dev/null +++ b/src/lib/.github/workflows/galactic-build-test.yml @@ -0,0 +1,28 @@ +name: Galactic Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + galactic_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:galactic + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: galactic + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/galactic-docker-push.yml b/src/lib/.github/workflows/galactic-docker-push.yml new file mode 100644 index 000000000..738cd33dc --- /dev/null +++ b/src/lib/.github/workflows/galactic-docker-push.yml @@ -0,0 +1,35 @@ +name: Galactic Docker Push + +on: + release: + types: [published] + +jobs: + galactic_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + run: | + tag_name=$(git describe --tags --abbrev=0 HEAD^) + echo "tag_name=$tag_name" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=galactic + push: true + tags: mgons/audio_common:galactic-${{ github.event.release.tag_name }} diff --git a/src/lib/.github/workflows/humble-build-test.yml b/src/lib/.github/workflows/humble-build-test.yml new file mode 100644 index 000000000..3c42460b7 --- /dev/null +++ b/src/lib/.github/workflows/humble-build-test.yml @@ -0,0 +1,28 @@ +name: Humble Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + humble_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:humble + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: humble + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/humble-docker-push.yml b/src/lib/.github/workflows/humble-docker-push.yml new file mode 100644 index 000000000..2e63ffb3d --- /dev/null +++ b/src/lib/.github/workflows/humble-docker-push.yml @@ -0,0 +1,30 @@ +name: Humble Docker Push + +on: + release: + types: [published] + +jobs: + humble_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=humble + push: true + tags: mgons/audio_common:humble-${{ github.event.release.tag_name }} diff --git a/src/lib/.github/workflows/iron-build-test.yml b/src/lib/.github/workflows/iron-build-test.yml new file mode 100644 index 000000000..b08113691 --- /dev/null +++ b/src/lib/.github/workflows/iron-build-test.yml @@ -0,0 +1,28 @@ +name: Iron Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + iron_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:iron + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: iron + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/iron-docker-push.yml b/src/lib/.github/workflows/iron-docker-push.yml new file mode 100644 index 000000000..41c030417 --- /dev/null +++ b/src/lib/.github/workflows/iron-docker-push.yml @@ -0,0 +1,35 @@ +name: Iron Docker Push + +on: + release: + types: [published] + +jobs: + iron_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + run: | + tag_name=$(git describe --tags --abbrev=0 HEAD^) + echo "tag_name=$tag_name" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=iron + push: true + tags: mgons/audio_common:iron-${{ github.event.release.tag_name }} diff --git a/src/lib/.github/workflows/jazzy-build-test.yml b/src/lib/.github/workflows/jazzy-build-test.yml new file mode 100644 index 000000000..262a9e4e6 --- /dev/null +++ b/src/lib/.github/workflows/jazzy-build-test.yml @@ -0,0 +1,28 @@ +name: Jazzy Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + jazzy_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:jazzy + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: jazzy + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/jazzy-docker-push.yml b/src/lib/.github/workflows/jazzy-docker-push.yml new file mode 100644 index 000000000..3631b3808 --- /dev/null +++ b/src/lib/.github/workflows/jazzy-docker-push.yml @@ -0,0 +1,35 @@ +name: Jazzy Docker Push + +on: + release: + types: [published] + +jobs: + jazzy_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + run: | + tag_name=$(git describe --tags --abbrev=0 HEAD^) + echo "tag_name=$tag_name" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=jazzy + push: true + tags: mgons/audio_common:jazzy-${{ github.event.release.tag_name }} diff --git a/src/lib/.github/workflows/kilted-build-test.yml b/src/lib/.github/workflows/kilted-build-test.yml new file mode 100644 index 000000000..b26699840 --- /dev/null +++ b/src/lib/.github/workflows/kilted-build-test.yml @@ -0,0 +1,28 @@ +name: Kilted Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + kilted_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:kilted + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: kilted + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/kilted-docker-push.yml b/src/lib/.github/workflows/kilted-docker-push.yml new file mode 100644 index 000000000..13472c270 --- /dev/null +++ b/src/lib/.github/workflows/kilted-docker-push.yml @@ -0,0 +1,35 @@ +name: Kilted Docker Push + +on: + release: + types: [published] + +jobs: + kilted_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + run: | + tag_name=$(git describe --tags --abbrev=0 HEAD^) + echo "tag_name=$tag_name" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=kilted + push: true + tags: mgons/audio_common:kilted-${{ github.event.release.tag_name }} diff --git a/src/lib/.github/workflows/rolling-build-test.yml b/src/lib/.github/workflows/rolling-build-test.yml new file mode 100644 index 000000000..30204168d --- /dev/null +++ b/src/lib/.github/workflows/rolling-build-test.yml @@ -0,0 +1,28 @@ +name: Rolling Build and Test + +on: + push: + pull_request: + schedule: + - cron: "0 5 * * 1" + +jobs: + rolling_build_and_test: + runs-on: ubuntu-latest + container: + image: ros:rolling + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Build and Test + uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: rolling + coverage-result: false + skip-tests: true + colcon-defaults: | + { + "test": { + "parallel-workers" : 1 + } + } diff --git a/src/lib/.github/workflows/rolling-docker-push.yml b/src/lib/.github/workflows/rolling-docker-push.yml new file mode 100644 index 000000000..ec205621e --- /dev/null +++ b/src/lib/.github/workflows/rolling-docker-push.yml @@ -0,0 +1,35 @@ +name: Rolling Docker Push + +on: + release: + types: [published] + +jobs: + rolling_docker_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get tag name + run: | + tag_name=$(git describe --tags --abbrev=0 HEAD^) + echo "tag_name=$tag_name" >> $GITHUB_ENV + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push docker + uses: docker/build-push-action@v6 + with: + build-args: ROS_DISTRO=rolling + push: true + tags: mgons/audio_common:rolling-${{ github.event.release.tag_name }} diff --git a/src/lib/.gitignore b/src/lib/.gitignore new file mode 100644 index 000000000..600d2d33b --- /dev/null +++ b/src/lib/.gitignore @@ -0,0 +1 @@ +.vscode \ No newline at end of file diff --git a/src/lib/.gitrepo b/src/lib/.gitrepo new file mode 100644 index 000000000..500bb22ca --- /dev/null +++ b/src/lib/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = git@github.com:mgonzs13/audio_common.git + branch = main + commit = 61bfa834859dff8e63a62936074f14d6e4b69933 + parent = e4cd28e2323d479ba9fb7db62c237157109d9509 + method = merge + cmdver = 0.4.9 diff --git a/src/lib/CITATION.cff b/src/lib/CITATION.cff new file mode 100644 index 000000000..5f3fa9e07 --- /dev/null +++ b/src/lib/CITATION.cff @@ -0,0 +1,8 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: + - family-names: "González-Santamarta" + given-names: "Miguel Á." +title: "audio_common" +date-released: 2023-05-06 +url: "https://github.com/mgonzs13/audio_common" \ No newline at end of file diff --git a/src/lib/Dockerfile b/src/lib/Dockerfile new file mode 100644 index 000000000..63d5ed1af --- /dev/null +++ b/src/lib/Dockerfile @@ -0,0 +1,24 @@ +# Use the official ROS 2 humble base image +ARG ROS_DISTRO=humble +FROM ros:${ROS_DISTRO} AS deps + +# Set the working directory and copy files +WORKDIR /root/ros2_ws +SHELL ["/bin/bash", "-c"] +COPY . /root/ros2_ws/src + +# Install dependencies +RUN source /opt/ros/${ROS_DISTRO}/setup.bash +RUN apt-get update +RUN rosdep install --from-paths src --ignore-src -r -y + +# Colcon the ws +FROM deps AS builder +ARG CMAKE_BUILD_TYPE=Release +RUN source /opt/ros/${ROS_DISTRO}/setup.bash && colcon build + +# Source the ROS2 setup file +RUN echo "source /root/ros2_ws/install/setup.bash" >> ~/.bashrc + +# Run a default command, e.g., starting a bash shell +CMD ["bash"] diff --git a/src/lib/LICENSE b/src/lib/LICENSE new file mode 100644 index 000000000..a32dfc40d --- /dev/null +++ b/src/lib/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Miguel Ángel González Santamarta + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/lib/README.md b/src/lib/README.md new file mode 100644 index 000000000..8feefc311 --- /dev/null +++ b/src/lib/README.md @@ -0,0 +1,240 @@ +# audio_capture + +This repositiory provides a set of ROS 2 packages for audio. It provides a C++ version to capture and play audio data using PortAudio. + +

+ +[![License: MIT](https://img.shields.io/badge/GitHub-MIT-informational)](https://opensource.org/license/mit) [![GitHub release](https://img.shields.io/github/release/mgonzs13/audio_common.svg)](https://github.com/mgonzs13/audio_common/releases) [![Code Size](https://img.shields.io/github/languages/code-size/mgonzs13/audio_common.svg?branch=main)](https://github.com/mgonzs13/audio_common?branch=main) [![Last Commit](https://img.shields.io/github/last-commit/mgonzs13/audio_common.svg)](https://github.com/mgonzs13/audio_common/commits/main) [![GitHub issues](https://img.shields.io/github/issues/mgonzs13/audio_common)](https://github.com/mgonzs13/audio_common/issues) [![GitHub pull requests](https://img.shields.io/github/issues-pr/mgonzs13/audio_common)](https://github.com/mgonzs13/audio_common/pulls) [![Contributors](https://img.shields.io/github/contributors/mgonzs13/audio_common.svg)](https://github.com/mgonzs13/audio_common/graphs/contributors) [![C++ Formatter Check](https://github.com/mgonzs13/audio_common/actions/workflows/cpp-formatter.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/cpp-formatter.yml?branch=main) [![Doxygen Deployment](https://github.com/mgonzs13/audio_common/actions/workflows/doxygen-deployment.yml/badge.svg)](https://mgonzs13.github.io/audio_common/latest) + +| ROS 2 Distro | Branch | Build status | Docker Image | +| :----------: | :----------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | +| **Foxy** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Foxy Build](https://github.com/mgonzs13/audio_common/actions/workflows/foxy-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/foxy-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-foxy-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=foxy) | +| **Galactic** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Galactic Build](https://github.com/mgonzs13/audio_common/actions/workflows/galactic-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/galactic-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-galactic-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=galactic) | +| **Humble** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Humble Build](https://github.com/mgonzs13/audio_common/actions/workflows/humble-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/humble-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-humble-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=humble) | +| **Iron** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Iron Build](https://github.com/mgonzs13/audio_common/actions/workflows/iron-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/iron-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-iron-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=iron) | +| **Jazzy** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Jazzy Build](https://github.com/mgonzs13/audio_common/actions/workflows/jazzy-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/jazzy-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-jazzy-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=jazzy) | +| **Kilted** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Kilted Build](https://github.com/mgonzs13/audio_common/actions/workflows/kilted-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/kilted-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-kilted-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=kilted) | +| **Rolling** | [`main`](https://github.com/mgonzs13/audio_common/tree/main) | [![Rolling Build](https://github.com/mgonzs13/audio_common/actions/workflows/rolling-build-test.yml/badge.svg?branch=main)](https://github.com/mgonzs13/audio_common/actions/workflows/rolling-build-test.yml?branch=main) | [![Docker Image](https://img.shields.io/badge/Docker%20Image%20-rolling-blue)](https://hub.docker.com/r/mgons/audio_common/tags?name=rolling) | + +
+ +## Table of Contents + +1. [Installation](#installation) +2. [Docker](#docker) +3. [Nodes](#nodes) +4. [Demos](#demos) + +## Installation + +```shell +cd ~/ros2_ws/src +git clone https://github.com/mgonzs13/audio_common.git +cd ~/ros2_ws +rosdep install --from-paths src --ignore-src -r -y +colcon build +``` + +## Docker + +You can create a docker image to test audio_common. Use the following command inside the directory of audio_common. + +```shell +docker build -t audio_common . +``` + +After the image is created, run a docker container with the following command. + +```shell +docker run -it --rm --device /dev/snd audio_common +``` + +## Nodes + +### audio_capturer_node + +Node to obtain audio data from a microphone and publish it into the `audio` topic. + +
+Click to expand + +#### Parameters + +- **format**: Specifies the audio format to be used for capturing. Possible values are: + + - `1` (paFloat32 - 32-bit floating point) + - `2` (paInt32 - 32-bit integer) + - `8` (paInt16 - 16-bit integer) + - `16` (paInt8 - 8-bit integer) + - `32` (paUInt8 - 8-bit unsigned integer) + + Default: `8` (paInt16) + + The integer values correspond to PortAudio sample format flags. + +- **channels**: The number of audio channels to capture. Typically, `1` for mono and `2` for stereo. Default: `1` + +- **rate**: The sample rate that is how many samples per second should be captured. Default: `16000` + +- **chunk**: The size of each audio frame. Default: `512` + +- **device**: The ID of the audio input device. A value of `-1` indicates that the default audio input device should be used. Default: `-1` + +- **frame_id**: An identifier for the audio frame. This can be useful for synchronizing audio data with other data streams. Default: `""` + +#### ROS 2 Interfaces + +- **audio**: Topic to publish the audio data captured from the microphone. Type: `audio_common_msgs/msg/AudioStamped` + +
+ +### audio_player_node + +Node to play the audio data obtained from the `audio` topic. + +
+Click to expand + +#### Parameters + +- **channels**: The number of audio channels to play. Typically, `1` for mono and `2` for stereo. Default: `2` + + - The node automatically handles conversion between mono and stereo formats if needed. + +- **device**: The ID of the audio output device. A value of `-1` indicates that the default audio output device should be used. Default: `-1` + +#### ROS 2 Interfaces + +- **audio**: Topic subscriber to get the audio data to be played. Type: `audio_common_msgs/msg/AudioStamped` + +
+ +### music_node + +Node to play music from audio files in `wav` format. + +
+Click to expand + +#### Parameters + +- **chunk**: The size of each audio frame. Default: `2048` + +- **frame_id**: An identifier for the audio frame. This can be useful for synchronizing audio data with other data streams. Default: `""` + +#### ROS 2 Interfaces + +- **audio**: Topic to publish the audio data from the files. Type: `audio_common_msgs/msg/AudioStamped` + +- **music_play**: Service to play audio files. Type: `audio_common_msgs/srv/MusicPlay` + + - Parameters: + - `audio`: Name of a built-in audio sample (e.g., "elevator") + - `file_path`: Path to a custom WAV file (ignored if audio is specified) + - `loop`: Boolean to indicate if the audio should loop. Default: `false` + +- **music_stop**: Service to stop the currently playing music. Type: `std_srvs/srv/Trigger` + +- **music_pause**: Service to pause the currently playing music. Type: `std_srvs/srv/Trigger` + +- **music_resume**: Service to resume paused music. Type: `std_srvs/srv/Trigger` + +
+ +### tts_node + +Node to generate audio from text (TTS) using espeak. + +
+Click to expand + +#### Parameters + +- **chunk**: The size of each audio frame. Default: `4096` + +- **frame_id**: An identifier for the audio frame. This can be useful for synchronizing audio data with other data streams. Default: `""` + +#### ROS 2 Interfaces + +- **audio**: Topic publisher to send the audio data generated by the TTS. Type: `audio_common_msgs/msg/AudioStamped` + +- **say**: Action to generate audio data from a text. Type: `audio_common_msgs/action/TTS` + - Goal: + - `text`: The text to convert to speech + - `language`: The language to use for speech synthesis. Default: `"en"` + - `volume`: The volume of the generated speech (0.0-1.0). Default: `1.0` + - `rate`: The speech rate (1.0 is normal speed). Default: `1.0` + - Feedback: + - `audio`: The audio being currently played + - Result: + - `text`: The text that was converted to speech + +
+ +## Demos + +### Audio Capturer/Player + +```shell +ros2 run audio_common audio_capturer_node +``` + +```shell +ros2 run audio_common audio_player_node +``` + +### TTS + +```shell +ros2 run audio_common tts_node +``` + +```shell +ros2 run audio_common audio_player_node +``` + +```shell +ros2 action send_goal /say audio_common_msgs/action/TTS "{'text': 'Hello World'}" +``` + +Advanced TTS example with additional parameters: + +```shell +ros2 action send_goal /say audio_common_msgs/action/TTS "{'text': 'Hello World', 'language': 'en-us', 'volume': 0.8, 'rate': 1.2}" +``` + +### Music Player + +```shell +ros2 run audio_common music_node +``` + +```shell +ros2 run audio_common audio_player_node +``` + +Play a built-in sample: + +```shell +ros2 service call /music_play audio_common_msgs/srv/MusicPlay "{audio: 'elevator'}" +``` + +Play a custom WAV file: + +```shell +ros2 service call /music_play audio_common_msgs/srv/MusicPlay "{file_path: '/path/to/your/file.wav'}" +``` + +Play with looping enabled: + +```shell +ros2 service call /music_play audio_common_msgs/srv/MusicPlay "{audio: 'elevator', loop: true}" +``` + +Control playback: + +```shell +ros2 service call /music_pause std_srvs/srv/Trigger "{}" +ros2 service call /music_resume std_srvs/srv/Trigger "{}" +ros2 service call /music_stop std_srvs/srv/Trigger "{}" +``` diff --git a/src/lib/audio_common/.clang-format b/src/lib/audio_common/.clang-format new file mode 100644 index 000000000..48b2c6783 --- /dev/null +++ b/src/lib/audio_common/.clang-format @@ -0,0 +1,192 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveMacros: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +QualifierAlignment: Leave +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +PackConstructorInitializers: BinPack +BasedOnStyle: '' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +AllowAllConstructorInitializersOnNextLine: true +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseLabels: false +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: AfterExternBlock +IndentRequires: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +LambdaBodyIndentation: Signature +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Right +PPIndentWidth: -1 +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + BeforeNonEmptyParentheses: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +BitFieldColonSpacing: Both +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME +... + diff --git a/src/lib/audio_common/CMakeLists.txt b/src/lib/audio_common/CMakeLists.txt new file mode 100644 index 000000000..b6fd54fbe --- /dev/null +++ b/src/lib/audio_common/CMakeLists.txt @@ -0,0 +1,117 @@ +cmake_minimum_required(VERSION 3.10) +project(audio_common) + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(ament_index_cpp REQUIRED) +find_package(rclcpp REQUIRED) +find_package(rclcpp_action REQUIRED) +find_package(std_srvs REQUIRED) +find_package(audio_common_msgs REQUIRED) +find_library(PORTAUDIO_LIB portaudio REQUIRED) + +include_directories( + include + ${PORTAUDIO_INCLUDE_DIR} +) + +# audio_capturer__node +add_executable(audio_capturer_node + src/audio_common/audio_capturer_node.cpp + src/audio_capturer_main.cpp +) +target_link_libraries(audio_capturer_node + ${audio_common_msgs_TARGETS} + ${PORTAUDIO_LIB} + rclcpp::rclcpp +) +install(TARGETS + audio_capturer_node + DESTINATION lib/${PROJECT_NAME} +) + +# audio_player_node +add_executable(audio_player_node + src/audio_common/audio_player_node.cpp + src/audio_player_main.cpp +) +target_link_libraries(audio_player_node + ${audio_common_msgs_TARGETS} + ${PORTAUDIO_LIB} + rclcpp::rclcpp +) +install(TARGETS + audio_player_node + DESTINATION lib/${PROJECT_NAME} +) + +# music_node +add_executable(music_node + src/audio_common/wave_file.cpp + src/audio_common/music_node.cpp + src/music_main.cpp +) +target_link_libraries(music_node + ament_index_cpp::ament_index_cpp + ${audio_common_msgs_TARGETS} + ${PORTAUDIO_LIB} + rclcpp::rclcpp + ${std_srvs_TARGETS} +) + +install(TARGETS + music_node + DESTINATION lib/${PROJECT_NAME} +) + +install(DIRECTORY + samples + DESTINATION share/${PROJECT_NAME} +) + +# tts node +add_executable(tts_node + src/audio_common/wave_file.cpp + src/audio_common/tts_node.cpp + src/tts_main.cpp +) +target_link_libraries(tts_node + ${audio_common_msgs_TARGETS} + rclcpp::rclcpp + rclcpp_action::rclcpp_action + ${PORTAUDIO_LIB} +) +install(TARGETS + tts_node + DESTINATION lib/${PROJECT_NAME} +) + +# Create lib +set(LIB ${CMAKE_PROJECT_NAME}_lib) +set(SOURCES + src/audio_common/wave_file.cpp +) + +add_library(${LIB} STATIC ${SOURCES}) +target_link_libraries(${LIB} ${DEPENDENCIES}) + +install(TARGETS ${LIB} + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin +) + +install(DIRECTORY include/ + DESTINATION include/ +) + +if(BUILD_TESTING) + find_package(ament_cmake_clang_format REQUIRED) + ament_clang_format(CONFIG_FILE .clang-format) +endif() + +ament_export_dependencies(${DEPENDENCIES}) +ament_export_include_directories(include) +ament_export_libraries(${LIB}) + +ament_package() diff --git a/src/lib/audio_common/include/audio_common/audio_capturer_node.hpp b/src/lib/audio_common/include/audio_common/audio_capturer_node.hpp new file mode 100644 index 000000000..0d65467a3 --- /dev/null +++ b/src/lib/audio_common/include/audio_common/audio_capturer_node.hpp @@ -0,0 +1,57 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef AUDIO_COMMON__AUDIO_CAPTURER_NODE +#define AUDIO_COMMON__AUDIO_CAPTURER_NODE + +#include +#include +#include + +#include "audio_common_msgs/msg/audio_stamped.hpp" + +namespace audio_common { + +class AudioCapturerNode : public rclcpp::Node { +public: + AudioCapturerNode(); + ~AudioCapturerNode() override; + + void work(); + +private: + PaStream *stream_; + int format_; + int channels_; + int rate_; + int chunk_; + std::string frame_id_; + + rclcpp::Publisher::SharedPtr audio_pub_; + + // Methods + template std::vector read_data(); +}; + +} // namespace audio_common + +#endif \ No newline at end of file diff --git a/src/lib/audio_common/include/audio_common/audio_player_node.hpp b/src/lib/audio_common/include/audio_common/audio_player_node.hpp new file mode 100644 index 000000000..b35bc820a --- /dev/null +++ b/src/lib/audio_common/include/audio_common/audio_player_node.hpp @@ -0,0 +1,61 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef AUDIO_COMMON__AUDIO_PLAYER_NODE +#define AUDIO_COMMON__AUDIO_PLAYER_NODE + +#include +#include +#include + +#include "audio_common_msgs/msg/audio_stamped.hpp" + +namespace audio_common { + +class AudioPlayerNode : public rclcpp::Node { +public: + AudioPlayerNode(); + ~AudioPlayerNode() override; + +private: + // ROS 2 subscription for audio messages + rclcpp::Subscription::SharedPtr + audio_sub_; + + // PortAudio stream dictionary + std::unordered_map stream_dict_; + + // Parameters + int channels_; + int device_; + + // Methods + void + audio_callback(const audio_common_msgs::msg::AudioStamped::SharedPtr msg); + template + void write_data(const std::vector &data, int channels, int chunk, + const std::string &stream_key); +}; + +} // namespace audio_common + +#endif \ No newline at end of file diff --git a/src/lib/audio_common/include/audio_common/music_node.hpp b/src/lib/audio_common/include/audio_common/music_node.hpp new file mode 100644 index 000000000..49e65d5c6 --- /dev/null +++ b/src/lib/audio_common/include/audio_common/music_node.hpp @@ -0,0 +1,86 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef AUDIO_COMMON__MUSIC_NODE +#define AUDIO_COMMON__MUSIC_NODE + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace audio_common { + +class MusicNode : public rclcpp::Node { +public: + MusicNode(); + ~MusicNode() override; + +private: + // ROS 2 parameters + int chunk_; + std::string frame_id_; + + // Audio control flags + std::atomic pause_music_; + std::atomic stop_music_; + bool audio_loop_; + std::atomic is_thread_alive_; + + // Threads and synchronization + std::thread publish_thread_; + std::mutex pause_mutex_; + std::condition_variable pause_cv_; + + // ROS 2 publisher and services + rclcpp::Publisher::SharedPtr + player_pub_; + rclcpp::Service::SharedPtr play_service_; + rclcpp::Service::SharedPtr stop_service_; + rclcpp::Service::SharedPtr pause_service_; + rclcpp::Service::SharedPtr resume_service_; + + // Methods + void publish_audio(const std::string &file_path); + void play_callback( + const std::shared_ptr request, + std::shared_ptr response); + void + pause_callback(const std::shared_ptr request, + std::shared_ptr response); + void resume_callback( + const std::shared_ptr request, + std::shared_ptr response); + void + stop_callback(const std::shared_ptr request, + std::shared_ptr response); +}; + +} // namespace audio_common + +#endif \ No newline at end of file diff --git a/src/lib/audio_common/include/audio_common/tts_node.hpp b/src/lib/audio_common/include/audio_common/tts_node.hpp new file mode 100644 index 000000000..cf28a81a3 --- /dev/null +++ b/src/lib/audio_common/include/audio_common/tts_node.hpp @@ -0,0 +1,75 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef AUDIO_COMMON__TTS_NODE +#define AUDIO_COMMON__TTS_NODE + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "audio_common/wave_file.hpp" +#include "audio_common_msgs/action/tts.hpp" +#include "audio_common_msgs/msg/audio_stamped.hpp" + +namespace audio_common { + +class TtsNode : public rclcpp::Node { +public: + using TTS = audio_common_msgs::action::TTS; + using GoalHandleTTS = rclcpp_action::ServerGoalHandle; + + TtsNode(); + +private: + int chunk_; + std::string frame_id_; + rclcpp::Publisher::SharedPtr + player_pub_; + rclcpp_action::Server::SharedPtr action_server_; + std::mutex goal_lock_; + std::shared_ptr goal_handle_; + + // Methods + rclcpp_action::GoalResponse + handle_goal(const rclcpp_action::GoalUUID &uuid, + std::shared_ptr goal); + rclcpp_action::CancelResponse + handle_cancel(const std::shared_ptr goal_handle); + void handle_accepted(const std::shared_ptr goal_handle); + void execute_callback(const std::shared_ptr goal_handle); +}; + +} // namespace audio_common + +#endif \ No newline at end of file diff --git a/src/lib/audio_common/include/audio_common/wave_file.hpp b/src/lib/audio_common/include/audio_common/wave_file.hpp new file mode 100644 index 000000000..f92d764e2 --- /dev/null +++ b/src/lib/audio_common/include/audio_common/wave_file.hpp @@ -0,0 +1,57 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef AUDIO_COMMON__WAVE_FILE_HPP +#define AUDIO_COMMON__WAVE_FILE_HPP + +#include +#include +#include + +namespace audio_common { + +class WaveFile { +public: + explicit WaveFile(const std::string &filepath); + ~WaveFile(); + + bool open(); + void rewind(); + bool read(std::vector &buffer, size_t size); + int get_sample_rate() const { return this->sample_rate_; } + int get_num_channels() const { return this->channels_; } + int get_bits_per_sample() const { return this->bits_per_sample_; } + +private: + std::string filepath_; + std::ifstream file_; + int sample_rate_; + int channels_; + int bits_per_sample_; + + // Convert int16_t sample to float [-1.0, 1.0] + float int16ToFloat(int16_t sample) { return sample / 32768.0f; } +}; + +} // namespace audio_common + +#endif // WAVE_FILE_HPP diff --git a/src/lib/audio_common/package.xml b/src/lib/audio_common/package.xml new file mode 100644 index 000000000..43b5dd8da --- /dev/null +++ b/src/lib/audio_common/package.xml @@ -0,0 +1,20 @@ + + + + audio_common + 4.0.8 + audio_common + Miguel Ángel González Santamarta + MIT + ament_cmake + ament_lint_auto + ament_clang_format + ament_cmake_clang_format + ament_index_cpp + audio_common_msgs + portaudio19-dev + espeak + + ament_cmake + + \ No newline at end of file diff --git a/src/lib/audio_common/samples/elevator.wav b/src/lib/audio_common/samples/elevator.wav new file mode 100644 index 0000000000000000000000000000000000000000..964dddd28f1aa67f827a6dccbea04791bfe0e9ff GIT binary patch literal 1028438 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
hLAPdD0;jQi<8Dy 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%0AH1nL_ zwHus)+Fs;54Nk;pp4*S8hZ0J4Z~F|5+`d=4iSXMBi3fTe`N*)@dC}C%-Ociax^H^y zAx*P=Uc+Y3eZv{5jrkJ=o9DYFR-0#qEyfGkXL^hdqi+$Q6;sdQn)WY>6W3Hi`GkL+Wra-Fd(DN79;n~TKb`57=C4*U49b1`)>~opRiF)P(VheMJBbAj)o@e3YIpz)LWLAWG z6iZFbV3zym?h|}VnMz*_b2PAqJ`@V0uS7K1CFB6Ui1s)AInJSXq?;H4%<;@&Y?4#N zspE~~7VwVvYqzU{O71s-ggcw}h4&BpD1RTTM6ii@L3Dy43*1JZEGfktLDz7-^ftC$ z_8C*l^t69Njw5j)W8uxR8Bm?{EXWK(eYN6LPhG$dYGvShZ>p$|XNa)Q6ChaUyU#u0 zYi9QZUo%tSNsK&1=7&Y9&^yQ+cmTQ%=!BZQ{~<5E$>;yiXR)aw_82<}X({9q*qc8D|=p6b<#7caUGtZ-Um~Cm_Sp~Gd^bY6->;TF^|3ItY6xafs1Ah3r0c$)%f%{ZH-yQb_ zAKQHk0NrQ6P;xnV&@mj!b)1J#dpz{T5(nj&i=Yw4_s}B42k?RZD$qmM)|X}o0>f2Z0iMJiaFkQ+>qjZZD^)Sj6bMhCJuGU@{haKDy1&k zk9vAJs=Zm{HeZHQ3=DTVe50KlV2rZ~=t$cAlyE2D93ce8+Bv=w+Z>u5A4bR|l=t`CN0F{HUJpuqm~~G4*UBL-WO6 zq`5&9YU>HLZnWc*VKDjLl;rGXMcgB8yQrmhqgQKh_S)=UePir{fEePb?*mcq>r4FW za}!s*405#BLJlRq%;6S$GwpgptVT01y0BcoCW{qQebB7?cTi`7ZL_ zd5bxz9yjZidmksz{gAD6-QnzTA>7W?K9-W|&pG7X%i8Z7!cqcu`aH0iwi-5~S%@3H zh*bE`R88)#keBq4h>sqPFd1IB5buWE z!96g8=7Q=lE3yWG;Q_z~z~yTM=Taot+2w-HyHwBycPq>yUGQ)s9);{NXqdStsxw8> z3aw1+lerE_H=1CnX)pZ7$`pudK_h27Ivv~*bbt@4z;&3n=ma29`KZP|d_tSDrnEthZ&`QDUiGPQ0@9b_}pBBGy@rj&9Zj*DPxR zwbG8btL$HVOmYO=-n|J;qFmTADv8mk^Rdy$-42r1*^De5-y7fn#fTHlrUmMo9G9GCG@GhFW3*x zR_q&lB~r)=hl80Oa3RADY{5-{hxQC;Lhg9IsGsczVw?b2=ZpgZH{yLoMggbYLhuze z4LsxN1>l~spwJfutp|qsvVj;M9qtIokv$NP77ZOjGvRS)8+<*UMY}a^L{7%r6YFVuE8j0g zyMy;4oOrk+hmJd%7!%1n)&h)Hi0^m266xqVs1odSo zK_MMMUSrAFK)gM?58ekgfJyL75Jxo7GoZ+~#@E(21pMlSy%VY1?vAb)_i*Pi&o^qF z^NB0LHQ${}u|0HGZ_g95f-17TbaROTKDGt&_Ax|LON|Wg4Z|pJj*jKw=t6yOb!Ojd z<8kPNaU$H#{0{zYX-4mwf1~N}==nPfW73^~~_^qnP2IJJmeYJ<%BLnrwLCa@o)Tw1xXDk#*Sjas+IerH-8~a%W4#o% z#=8@H?5$z`1HNSJ^4({S0xxr7;9YDJ*qOZrN@T`Evl%ym0$d1wLyr3D5Yqb@il+7f z7u{-uCu#pQE;s+1}3XRPS6@ch5Ld?)~9R^r=Z4+E3nv zdO06KUC8^uM8bpYC)r@Ey`08!?ZKuv*3m{eM$_h#C+L@4w^&C#@z@t9%(D2O{!m{# z4i5ETzXB)m$D_G|acBj1D?|w9qNDjONC!@Dc$h!o@GvLbe@E0C{lvi;dF=j-ulQ0l zis^4<mZ(ImhYXrz2}4LxNCq_ZdKSe+gxUcWwx==ILxxnoNt8n z?e&W^D-8}+m}!n?r~bX-nysg9fqkC_BJXJDQhiMufENFke;zRu`rDq5Uv=x4GN6ok z8yL$yf$ZXTz!icl22Xg9T__sM9W0*dH{oOoo=A5F6b1zbES0niToQCayg8sL@Ud7L z#1gj;G6nn*Hw)Sd`w4an2l93b)^mpO^0{3ECpl5PEN%_=9IHFKlJ}CIz#_O1YZrF} z>mQz-8N+9AqlKp#MVv&|Y+f~6%flH@xFs|i>oxrx7sNZVo3I6}bUcg`NEdSTj1Gb& z_$a;upT%os>=WK+Ocss8t$Zy#LiClfQ1BNvled~Nj&Eeg2}dyd^WHLN^BVk9EJau? zI~=cPvyry!6m$hM11g|j0H)y^!DkGyyBKZnna-H#UO_uV_CvGXXV9r6h*Xoq;B2xZ zxS5QD${m9NqvMEgJu%sv<5=ziEJ@B?#0SrC+e+6Ob8lyy{i`#`x|!4y(bNcHnCFG# zymzj%575?m7idcsLOZDvcslV6ct)zgL&SaG8$0X~*ePl}af>P-l&YF(yHYg(fcG=?gtH0H~< z)N5M`YU`TDRzS7G%e&Xq{>iI;_4`>FP&~18UooR3qG)7s^v}Yd&wr%;{Q0BLkAkAd z-`5mYewkVH`D@;_xYo+^&3%arT2 z`!)HxPTEC=a2?Mw#%Qs?MzQ^iX*jvc;v;R=B3HWooX_W=K)U;1K;%9GhPt{Vm#Gk> z4Mm}QsbYrH_mp)Ee87DR1&Uy_qu7h5N{bl|8O*sCR>DsTpCmjN`6y5l+cWrM?9kv3 ziNC`llXgU;rTmE=)j=2cZ`#E8DOrCKA7piI)0!=7w<$ZhojgaIGA-|Jnl#thz9DyC zdhfi5%o90z83S^N%wahnvSwtSOTUwKKI=rrovdk@hcjoT_sZSH6DY;2g({3f(Q#L2oB}cc3O!eE|)BbAf?x1b^Abm@lQ`z=*8?*PdTa&vw`D#wP zl=Gc~JFL!Knd-|MmNBWbIr~h;`P2ou;W_6r2WOV2zw!Szm{->!K5IqR{G4gId-63| z6}d~YTzUJmSb16Lud*k#zm#D}^JczJUX&(GdY*Eu&4T21(c=>y#@Q0@MPBn~wEl^9 zMh=L29MV6eUC6l*NP0%Ao@BgzCEL5>)}}cCB)`t}(0GT<2+6QS+yvZN+~zkISajNdM@n z4;OFx<0w8-jus`C6n*Pi-1SRAQQ9Y3(Vusr-}7Jp^=ZP(1s`ude)eY1lejnS?+tx6 z>8||gqdOg*?7#8-zUS6~$6+_*_t6_K@8#WEeou6RcIWl2Hg}iYE4cUg&fD9V5dnqPIT^7kq+>U;g)RG2?S`dDW*qC62=XD(FRlRgPcvm4>pYI1MjcYM5?1Vc%{A zZA)!B+dbk4@te3$1QCbHh0dRj=VY{>2#a(2$oo{YD+&0^eF9kK>4UEK2H`&NAuST@ z#CnFv*u(r^pK$tW{zO)xU@~X9D3Dhn^zf!i%z=TDo|1p1FQf-UFNE9 zrD;3AO7GJtvxB-|QiqH#@6rx+8$CI&-LGas-A$QGI-l;au2X!6z}%eFJ6Ts# zZ>R5VPo+<9|FOe`{mhYmuI`DUcfs0z-Ww-*IZ1dna+k z8ED;aFVp4PcB;BsVq5!}Z4HYpPwH#TTWV5`;wsc~q&nU5tn#)gy84T4Q{7@4Ru^k| zQZt-*(wJdG{5Ls8%?s_bRGTb`Dyx}NMcP1ZgzbjDr*WDg(z3~N(^zgfZtO$cG^`<3 z7^XP3=?6L!G%tvrYB8}{)rR0HM%q*@307YVW~Rw8)ArUHgQsz-DqRyp)hawT>acbw@jJCNUXckOe@x zdkVC{xfh7?<{^K)ozN?k5!w!>Ag90_L;~J{b|6f65xfcBj^M~x8j0lLbZjQ0mEq3> zWj$nn;tJVQ_$k~sq8@%G_z>GI{>AAXyq8rTe1qeaJ!j7d$>G3Zw|KuJ`m*SuPx)IS zZ*f0Ga(Q6n-@+Nu81GHQW8UX*hefp)kBj9~l&hcXW!(ey{~3wkipiP@fZ9#=x=a0HI0tKdr7 zF(3e=0f|^W(CY7%G-AK0K8#h~wXCP!Yn%t(0FKeq$i3!$$$#UC=Kk%zA>8SGC3-}G zqA_lXq#e~Z2z7HLcU)JkKcUP*gIKMJmiSt4tV>l8F7 zwkddW{AlUIxP?KtW7311QKO}hAMzF&lhi8Q2;SDlS7805uEeTyK9Vr_oxf>EDSsXGps8!lsazHvY@VoS+curt* zfJtyo7|mTEd_cGGcHClL*v*ZyyF;Cz2lgadmdvGDW(4=CgX2y6Y!s= zaoBnzhlU$c(0sKPn4!$}70KOHVN*Eyp`jHCt6HpmQ~6T$&2M5k zRl!qqs@&Z2y|T3F@*j8O=_+sIj%rTRwMwjEW8IOaZ*@N!tLmONK4^T~a+{txi1-WT_NVFWP$lKIn#_09Q#6t!uFep zA!3QU?&4^oJdQ!`7>CgnLhNL<1>>I>G- zDvY?TzHW=u?6Y|^y@>_78seCK2Juig!*$v;+sQLY+<%+HyjJsb{|fW*EW?3XlM;Mt zUIb6D4gfcrM$nGihG60LPPB8@sSE{?%3Mp_X3Zd;JVPV1SYvD5XhVbv)(8x~QhY>gVpCjG~pGOu4s3Y8qT-QwW#Gh zbB`O0gpn5Mr4kHAE~>YJMxSC9nyq5S@eQVlnbrvJ&P5Wg}yPkD=eBW1#9<~* zMJ?e21M0))icW0m0z+Q_NFc~PX)5zUuQ zjj0hEV<537c4WYlSc&jY+!20s+!NmO_{+SXaeE8i!~q zoA0Rxwq|H*G&$-ax_64ZhE&xq+u>HRf5vf|^O8J^LRxdZt@3@qo7Mnmlw1Q3kblQ; zWiLEYz6AeE^M=XQ3}6SS?=#-(3OF0}DmJKJ!1`@qaGsi8vujLS*>TnYw%6K;ecD#S z{z6>hI*5y$=j1sqMOj7PJqv~1J@f#(FF`UG%ndRF8IoooTyhwG5cCh|mE7==0ms0Y zz`bC5G3t9F`sq;%l$234*lQP{o=1Y7uFJwYH%BOR1qru1G~CDTUi@XQUc5SDC+nhX zDCaSGmL2T)i?Pu;gK2WQna5l-W+`==d6)XkO7k|djsut3a^F*S68M%Sg%5GsL+LCb zg0Y0OMs^}*VMpN%RxP83J&B{>?q-aA5Wv?mtXAFOKz`i!dwMYv`4n zI4qq#4R>gT}{@ox)n{^Ia zqZ-Gx>OQmr)nl|-xg7mhF$jm1a;#PngdLNwz-A~4uzB)vC|$l3J>C2oUfI;im(ehW z3a?{PyQ&wEODYbKEr0G4Z_3|Uf0YchC6~&rbS^Mp;s=PA!{jxc%pa9;_N|)>d~h*ViAi-*22nylIVbq$|d_25H3Z zb9$5ey@BuRYem6VRuO0>P-Ka72QtgOi+0TO6YBupU~EGmW-j`Pok!2&u4KGr_h%mB zul08t2XL10Z*UU?2Chypg;yln%Fht#1+zpqg%Z(S;WyD`KLzkhG+$^HvxJ|55MFff z24149H}9vcmGd^_6z6y7C)U%DqpVY*rSusgd+6OmcGLTXUPJk^X6%Y=8a`fj9lsmg zh|LOV&-fKOnXxx?HB%GTlg$h}&YBQg80THcSzd?GRvsJ*37&@B608g3 z2^FDyL3UV?pjSAPzcK74FD!f=cY5eMmN{f9=V-_R*5!~y1{zFf!XdvIQkfcGBfUny zCG*l7gYRRXWgBTvWd145P$^s}qrrVb4uT71+q@A{u`gd5N14ROsUDIjs*70f8YRhb zi2`*ljrgS7A%5nn6|Z$uViz@7GKN|cc+E34aHHpusKK*MVDTIg?4U+*uXrzWq~1Cf z0FGvk112#nz%cqa=mX{jowWXt4gKgF2)zLwf*rjlJnemitHgWX$#qMKT6bGJk9=hr z;plC8K{T1VTU3VGrZ2j~h8wyq+6IkJ-Af&>T%ssy`O`AHslI7&eb4%(HUCx5uenft zzS8&S-}3TO%^z3Ep~~sMr&KQaHL~(oQOBxzMf@t`kNB$I-`~~VEBsyaJHGoa>RM?yg9S6^ByX-5nlU+}-_s59gr| zcbDSsUZACgDs}g!(W~eD_n%Ih$z(c7ZcnzXz1G^|aci}5jNhwv;PEJr*AVWqK*Y&k z$i4DR_Av_K+Jb@F5E!7_4u|VVqK#t?wN$^13^Vx9MyH8vXQy7wHRl0rj_MI`#`P+j z=K6x0;r5PQ>7J_r9+>;(-j|Dad(QD5!!?)O+q1meF?O>@JUhp23-iSFA9lNIFzf1i zoU=Li)zmoFbGMzAXgV7d$8oD;z2h0D z8pkHiVJ@Fsf?eI*yxr2=`nyXWzubm+QXXr(>fGGDlH5Oe9ds}ECOy1-I(q*0t@7yY zM|-{U=e+U)@;na(IeWzi&+teNy5Sida>nyc@GFlmL2o>^1SNVHg0b5_0q@;1{Da;0 z_`h{I=X=e`$)}Ig8J~33H!eV5@7Ydw*z>SvyvJ>>y?Z^o!sRD(*~N#NE^3 z4&RhH+S%x!_Obj{vqDVa{*@YOBE*fHqj;8kA>QSl3U+R-eL3S|4`fQL!>AeN>#)*X z4#%2?0I_bBl4W`=cdZWjWM@C?Cs<&Gv7-LNy#`|^AwNGjSYs0JO*8Zrx zTeGjcYt5!Irq;WBV9lPgyLEdiM%Fg3Xiz(|a!SpoDr@zdnxL8Wn?6XJE#sAA)(GX8 zZLqSDpNcZXuIQ)af&FAROoMPxh7aRiD&xJ9JP!|0abywoinP&>RK(*6HJrIc{madw zcy0nYO+`UEaS!1OO#mTrhv9$Bcd(M}2(HubPfeb1afWhpq=d!d}a40Mf*>6f(ck}(U~179^(EJM{Bo> zoprsXd)j+aAAPK{MZXeB`p@Ww!*Lw%SOP+w9)f;O7vU0Lez3lp?6D!c8KdpF#u(t6+-#9ggCkqXOOmzZ4GPslp9BKxzqoN`0^o zY7ed{foLagiC^RMXee%lioq^)1};KP;d!(Xcp?de;uts%pTVub7CZy2N84~)B?5F1 z#F8d46WW$9b4P2=62nTT6_I4 z6E=4>y|$*B|FbQzzTt=2_KCmjz2!E-DO4qTfJ8Zh@WHL9`6!1vr6M-t;BIacNY`#4 z0(6Ior~2)LRUb|*&~tQ>{uKRASHNu7OY9NdBd&+8LQ}50t?8+otl6TQqlweKXE*8Y zFeTb=>>{;FFzXI5|7f2v-L+}#DQy(9P4k7ZY6j88ToJW|>qnQef2hCMOY|7_GqZ{< zWTvb9%eyN3GJ$QT@5Y@m%;L5gKC*M1_GzxUywJ>You+x|)=|61eZ5xefiw?1eRT&s zyXrDLkv74rRyWtPwJyc;p*F_Tpy}!HmL1}8mTls;jalP5i5cK(p$EEP+S_>m-OKqC z{lf7S?cyj>z_EsY;E+uxInZpSE{w70rZdO1k7%=I1|6r#r)h2}9n7WB!`K~k5)(~L zU~E(p{gyt*I5B_IZpw-hV;i#_IEvk`(X*GiTKW># zkm0#xx-0ik^ez{b~)(pRb7& z)>kL+-Zcxvt<~Mc^VMx6zDg2TR_~EBs;??+ZH`h}yAAcOorp?mA1b5jL$F8vNnC0A zjnA8>;38`bu-Ua>6yHPTw|0Uf7Hr#Y8Pl(ormt1HcERzTgYA225>GqfA+T4o1Uv% zP50BqQH+jLx$J4=1Pu@SX*lAD<`!f%rQk7F4AyfDSfY7?UuuRTN9`TdQB#CQYi8o1 zoD)vsexV*(4KCNV!NK~+INae9c6W@28y(e{=<0Lb;~4Y7tpn@i+LoK(e1vm$YNWYmNan_=^)>6zg&U$X zvS#gVcB+ox_G;U4x46Ab7}t{C!Y-uR(k|p-sxy&6t_Q`$cl;3cN6+CGIh;5mcUO^h z0=yTe;XcBBT*RC31^X$y$`+58*a9$PyNB-CTHYe zJ_vWC+wcoM0FUB&@C)AuYk?Ba=hh?$ zi)vnr&uSXV=IVbWO>KvbP|rTrJjYGvGBw-y&@PobTf*GSPs z;$+PO+*b1mHPd9G1g;r=!ug|~oUEj?^OaTX2k9X5O-!NvBo{hMEGL_b{fQysV%SzB zpd@$zPjL;NDD}eOausSL*C^MOX(%2|#pCe>+#1{gfCwapP-E2m(uN$zoTNUp0gRbj zz<6nIuxqpfxxP9ZyG6G`jfz36qplqbb=}!_D&BWQ8^iomy(FBqy{Oe1Co)u1PMqRi zfMr}$Fo=5$#{^aKsTBwCBMq6R2X-9va2T~(H<&rAa|m60$(-U8FaZRB*Rl9(dyCqu-8)KhUE z6)kpVGK5yl1|fs#BIvkW!HexFo@Kj`iSTD#$4E4Ecu~KuYSP)wF@Q#0-UV*ggQT4qzVB4R>Mu za3uR1yPy zjmk^92bxVULf-UtG=^G?CsTU7no37)s14vJ)fuj!nh;;8PULTDFx`zd(WB{u%w&40 zhGQmZH!|IIquDe1ww%`CZ;muf)huz)Xa_nR*M4>=(k;}#(A`uWeSWF@Y(cw9YtaO0 zsx@w!i<+j~B5n}t$R^P?rka{UH>VQGk7OM2o0thbhzK|gz6W8z0qntZz*mg$dfW=v zpw0L-dWSEgP%sO7;uzcuUqRpS7Q7i%;9z_XpTZ5mPc#G^K###Gq>9#1F5HP`5OeTy z!XMNV_wfvJ3P>kU;_U4)Hf0M(#(yiFYW7xU8&&CCY5@NTG4Q{6F+vsaL|4 zd2*7RBQ8@~i~Z#0!g~3HnhJLC72-(yOO@L@NSJT?C>*tI6-L@S@$+m;?U}YgcFAV3 zRohzFmf4!wui773L+mZB3+!&z3w)xbF~8orL(p0u3oC5H#5K0J;tYG4xQ{;|ofmq` z-^FTqnYd9NFE3YK%MF$P$us3;$`IwLlBgV3CZo}EQ&cIhMPYIq6d=u3c1yjKtx|;Y zTZ)uVNwRcTmZh0Wg!;@|sa*a?vden8o2=Gk(n@)O%I9=ax}ed@U#PJXk0iM-tdYZD zGIX`gdVbvrfZbtg4Hw34P;o6XJ9aoRe~b8fG059g{q z#SYX)GL3Zsbf$JJHBft+e4{m!mo)9jQQRtG6nBW|#?BxTnQss<2&|<0z-81&FoOz& zJE&#wAhid+r=npTbsN`GJHQs&0A1;L;6(>RN9G<(qnp7e%yalR>qlJYh7+9TC9z7A zOuW`w$t=wy!dZ8LjMb%+m$h}|XDy^}YYtKExg_cZGlx>>F4P?Af8=8bNoZ9q5Z@;1SpbN5QU&7G9I{VQhU8}Lxx8QrqCQuf$cd9H1pc+PrXXlZRK9I!0rNy}LKI&%~IRPzhlPxA%aNXtCC zWX`iYS^C?7bs0}sSMtTyPQnxG1~JWAD2Cg3v7_ybG}XRNp35Ip?EGysP;>-?Bo_L~ zPhg2$MAR!U$Z+(L+>XwYEkPwY0~S#cFqn3M@93s5n$g1tbOCIlo~MH}N#3Ae6T!3} znMS3k{(b3G4%LzFLCvNotNN+4)L^P!ot3wy3{)oBoXRJkkWa~FWG7YW6+tQ?z5~qn)L=o|bxJdLNRuCz~O~S4|nn~spzsWfA3DueIuPRl_X$`Z6oxwEW zUNL95_v}Q?Y|cfKsVU_)YcshfIzP=0Z8g_Ht-0oNkGUGIp3`s(xl!zPmS(3gFBxB& zWv5ab>G?z_mL&{KHaJ1=01s#uw58VIfut9XBD$kMqF8wfW+_D=ODV?r%20e2x!@rv z6y>9nr~uzYr`4LH03<1kphf8oXUk3Cba@<%lWXA=c|CMiTETP5Bd{1f2hWfJEXLFE z5#~p z`Nx8Rzb=g9Hwu&ZKfJpTB-HaQg#|*ex`$ zUqyeEU&vjJ&1Lut?g|`XI@ZEQ_%K+8P2dL_2ou6VQ14_*^iXOji*m) zzSH}($C*mqEOw-B02iuTrJe_wJEk44y{&zsP1LN=`KuNARZh}2;8ccC?0N!9E@CTFCd^ZS0f^xhQ*uZ&E1PQ69ki>@NvRXzPZqppCz>7Z}1cBmxN39xk9OWYsnuGQtg4_6T6c*)!s^s zu{RL6s0@*V_F@6>(ZUt`MBz5SK=>>?7ShFs!UTD_5UTVQ7Ao&}UU3uGq2W?H{7IUG zqvgGLwY(FD$i=v!tWH=}cY-_8fB2*L8Fd$9kdydH!NM!Kt9V6<5Z8!L#Bkx8xR-w} zwB=KTsl4jXW6!Xc*c7|fcEWzcHpL!b|Ifb0{@f1vw|0{~QvC#D_`%{>Azlm?jG|Gn zN=LQ|@hajg9#3>u&tQAd2*!cgpg*wV$sit2 z0~7H^&>AIxJY^i*tRR>p>xjYf0HRv1g#W40?3+9W>J(=pU5+EN&5ZX$HzP-3Le z3g!xJz(S!GuN98qXM7my&W}}o@#B@nJgp4jyDDS&a@n8Hk^1nvB|RT6{^CbUh4ymM zhmVj3@q?tE{1vIKAj^bsL|H8iMz@8((K+D_8Z0)(%cQ~hfYc28%hT`;c{)BR$K!?a zYy4X64Kt+{;GJ{^G?SXaxuOL6iLbz1;TB#aMBpXDTXbCrN1j4ArKiwAo+hl9!h{x5 zfS{LJ3lpTn{0~th+!L1w^TZM2A2C=OB=wN)N>x(1R3O>QP1Qr^gGl-=?m zv|e_`Gv$A9j(iQgksaVQWhV4PG4K>BfoD}eqn$t``aqIOho`7S!j)b~&ZJjS4QWVE zp&zKfljuX#8fHA@&UU35vGL?h<^&nTM34vQIm8%BfHb)gzJ*613Hm}ed=tc=&0wvf z0jct6jHRadgcON4NX>C~ISZx9cC=4PKo^u7>a7zVgW6#Moxbrah zr-Ny*AMk<;K{9v@G;l5a8;WovOjJ9M_Qb!$AR>%>0WXpl;S16XL&^1U7V#4HR$T%j zU%;~ynHUB>LLF!c_u;?5SPWFObR_ztb`952sd8Lth?*!pm9ffoxt;P} zKBaaNmy{|cN7;&yqFU48YK2l!h&5md`l8;i2Vay8AXW*4WpZ=aN$Cj(DT%PTG7o-` zPr`nRfmo{aCiW>Uh_T9V7^Zwxt3Q_5B|n4b<+l*2_nvA+@sBbZ&Oi&{ZxjYuTn2-DCkAqb5ZCZLZzh5GWlm0|ocWfp%b88wu= z@Kk9WJ|qEfR_&sFWfDx0dxA3AQSI;p)trv-B&7_GkV8S5bOQ93BH&$d8~jJig3pCS zxKwZ@SfLyq<0}Cn902S20pI|C6yN2`5Gy=FQ-rxFRY+0hh~)|;bwb6`3+0PELD{Sr z6s%tJOyrG%ajlYwdZ7qB9qq=0&>_4XN%#PAP%C%>+*Y(;EXo26@jK8N>;`r<-(H8m zKp$cd{78I+v&eNs59%V(j&dR0>F;DF-JV*=9HoY+j-@ZzeCl5|jT+3Vof6xan#Z0X zdv;;kHEKujI;H28YzCbK&h5ca^ z4u<>C8_*v2hfVQMP>IjNMBEGJ0TVn7f5N}u8+eU~CTP-&xKAV#9O*;)P+Q59WSIKS z!YP7TqT;tVNk^_7`JHV^Oy;J*O0Et{>{{59I|(&hCMaWffZJSO*p+(@nsZKY6PFGy zaz|91*g5bYHwAceja1d-Lwu0!jC-*6(FQgd(QGf|z)n_fu~U@J>}G{$VicJft@L8H ztB8Rhx1onCA1S*sf_x>jxpE02I)aj=?I=LLfTqhn*d#B&hn1e# z4K=~7(QLd1-NLFzIJk()z(W;3OhSS1Fs@VcNM0+{)Co# z3RNdn*q!VS87B49m-JHmfjDOC=wo~>cRi0p`aZ(AF$*wkf+A4rNlYVUd<}spbj2XQI{y- z50mk5*aI(xR)oP2^b+<#PvB&f34PI5ViC$9B2ibeR#~pj#~}GtSxKx^!iXnID)dmg zKqtik{*>c@m+S@9&JZ7ymS9rNsAJ_~)J*P)Q{+jwr~DtjCHDo5l;xnEvJ+fZ=0Z<2 z3L2H&Fhl+H9n`C`0F=Paa3#C}N5gw6w=WNdtDX@$ND@21K$wKbgKqdbzJUl_rc6gk z$_X{PK9fI7qSQcQq;q1P*g*Y2g{*{3TD_(~;M_y=7UzN1gVD|BB>N3*0NRkgMZU6RJ2 zVA&sakqM+%Rc(s&NA527RMx1Oyg(kT7*LgR0liaJqG)9>W|gsEliJZ7Q#OGtnSia7 z=O9qUIUg(Yz%-=<8WBxq;Y3x3c$tXBi^<*KqMGZ?a5PAOv%xd)2#dI{+ArL}ufb{% zf@Y(5tO32$8mb=k0}}28?|@t=!O_G{m=1SR9aVj@jr>ZjBY!d9DOYAIc|wg==NMmV zv+6ovVV+T?OmljYT2D4&{-HgXm2|9%!4b?_Y9!N|YD29j;u$?PgxUoA(Fv0{@UbF-Zl2Uh3wLBh*^hgK{O#P${q#?M?Kc4-wnw!Nel^0s)wCVm_S- zN7DU?jf_s6bo@(xrt~DwETjb5mAt^D5w6@{)F$?@s@}H3DDEkG(qj-PvMsGNFd8U@Ca!UY9?L4 zgT%IIHy?rH!~ys(yP|OXXEZ|Ch{o72BdZH zDq__hUIr#G6g%VRFan+<>xtgfbvT8%3TD$Ih@td&=t!Mbr`QjGmc+_g#ssD^!yrdC zKmc$2-(- z+Ec2Any>gO@vJXbq$Hv3)OKnNeT7aUCGtDzPK_W-U@Fs%9z}TL+jJ~3g{cLr=`3KN z)tNp04UQ*npkrJdnT8L_17M64z${V`f!;zo_*dMA#);l!g8W|DXEWfo;ummS9pJW? zSQMfRR781~{6w9^Pn84EO%NvU02|b^;s}ltQ~9%UoIO@LfUgqY#D9=g?YWOhEm1!u z5*dZFpcSrEbt;FYTe2Q^LZk6dAzE@Gu7SBqwd{>fsVCvEJVr{EHmc{~B)E;&DShM- zU_0xJepL?1f$Azm*m!nU8~!@GbTvkK!TlrE*$D4@YuuKp?q; zxJAbkn@JiDMQ!L5wNF?L098qDR*{;s#2O`u9zxtkTa}aeHM~I>h_9l*914%hmq|Y* z$L4Ai^l9`R-p@8%|BM3EHS`kS5XU+a+GcRFbdc>zXqoF`i0W**m~E_LmmRD;Fw{4V@*UX`7dyxKM9kF3L=y4 zVk=d;D({F!Ob=?H>7;cIX@?QgS>9jW6M7%?l@}`ha-Kciz7~!IUi@GD1MnI&v|H@+ z;cMy&l_q_+X=-MW^Q;s+YJY5-YFZ7JsizSi69m;vKxbehks3`UAPVI)^E%>tgMYry+cdBED1VQ{OYw$#mbqc3NsIsX(jE|Ie8zA1iDcZf&2TGuu~%pCszHcuMXHXtnQtiaR;4!+vaafTu&52SxtysQ{B*DMOXZYws9`Q0Ij{-mV|m z?@TW)3ir`%r*CNs*g;NHMk_-OaE)!b@4?Vqq<=?=@vkd&O9;7yFz{(a#iG z8j8>=EobQfO2u~^FHtTN@K^6`v|aN@h@q-f47{Y?*EFcS1uQe`ZTo<)a+k=qjMW1s zM)$Y=NO++PUGp7-TDUl03e0obt&MXZ?K#KkzKZ^z^(l96;n&JB&Uv!SJOigY?K#5W z65=hN2v`Y_|4FjQ+g+*FwzQ_}y4u!q@pVnCjAZ5KfWtMdtCeyObfM;%CBk?_JXElV zep$UAudX{-J|Qb3C-wLDD#wiDc{je#NzG2t7o`>@7C7eY%U@nFw`y2TSb>lAYEiu0 z-gw#arF3`c4(r>}nbpn(OA|j8*3{(}Ue2HJ$GdX-y{&nKE&kvHC)q${=!!2cN?`K9y_1X%<-R0AN1@Fy!C^z!Rfp` zgJ6u2n)~Dk`luKOpTdrOrW~ue!jP<8pQQcjz23>#XkJKs_?iaS8a53A{cR4xv2G+cC%Y$h9-5o-soiPWS^+MOw$jsI+yls$MWYJM!K#Jnu`a995KXd zZ|gRDT}Qm_446z;yI-JhJ4cf#uIpWzhOcmAxK#Ea*N4Ba8zIl*{;qywQp(0tzlvzX z`ick?QKI)l%E%&`lXc<3m0Vt zW*yBtl5@ZMK}Kdx(yyADhtCqz@ST*ru@4shrte4zYi|wtboTW0_^HQU+G8Q@kIQP_}90`pT3>A=KlBR!>{ar zbMokL2sf9KkBdA*VjrO!-pE=d3Su;5d?OVYE~U9;CbJN%>UlIf}6&2wKm+~Xe~e|-B*@H5M! zSqX8Uqd)ylob<~(YguM;c79ri;&k2hr^_SX8NuPsZ}o2iy|^WQiyeL3KM*$}QOI;BSKZl$ zDBz%vUr322*Mnuhhdfo*8#cmL?%}{gpUCfJUs)Jgrrx1v_`Rit>ssoqYjfQ?j~utx zp&k5s`kl}$@O;A6S*}hG?$Hi85Z`LiNf6Q>YM~g0}dxL?c{R|@~w+!li zy!FB1Jsb7t^t<7eZYX4JhtGbIEvo$W%~yN9^sW!D3vAzfe^^e#;s$?5AC4N?{z#KQ zZDPXyYPGY`@rdxSM-9#eqDI3#CO2#BcBqPEf>Df7VQ``Mnl6ExbeCFUDd3l();r61)saHbMVPix;It@UJG zZ{d%4oA}SN%{kt(%X|$*=g<_6UGF4dT@L@i^Z06+f^omwpr< ztE#IKOm~GL(tfMK-d>uH?$>V>FV;@h_OCmD-&c(#Hq{O#`WH13zvX_AKNOVMe6sK4 zelNXR`m|tKrmi-)`mprKJcoL1nnb;=@v>*ASF(Vfr#ZSbZ4(vdMFyKa8#b!(f7ob^b8rLSz`+fpoR0+j3_aac zYA~f)OOK4`P407I99=^qhq&c5zpUk&jVGfU^;D?nH0v*at+d*qh`*(=SgiC+?MJU$ zhTD$Qv}X3L*II{Y=ZoBS&1}OJ_KjwUb2%nmnpmD0GU~K$PRK_;8SL{Q*jYaBH8Y}o z3`G(1T~ge}8#)AB_wDce&i%041Lt$ZdG-j{LS`85FugU9Zmd^y&)8&ry2(xJ#4jce ziaI*7Uc+4|p8%$&Mawg?Y<1PYrQFrOjA?ArjpX>B<1!NpujZxXuTOO-T=_GmxO4X7 zUsEz%)1IZpWp_%xp4&3PEkEG%iR{%Mm!|q9x3mo^+gH0YbD0oXdLMnQcy8ZVYrzF7 zs@zwd*et>CY>i}RTey{$ZFa(?6SrFBh!9|wqc15tOu?tw>0}p|H}!wBFKvz7e-&>s zWR~v4?TTbuc5V~nsgiAVd3m5-YZ+-7q5P@Ypd{ARD9z2UYzcM6JZa8X;;TpSdooWb zFgw%kUr=iARmL!Ob3FUlxZ5LFJmGke|Ln1VY34)emN<6MHg|dBcuBiU+gl%``_IW& z6YIW*%`ohC8s_%Z_q#5}Z4p=DwB0bkC7T`XwMV|;(Gy+w-d^cO>T6=ecC}AU%%8-n zSg{6a&HffiQk9fsi#h>cF%@!G@Ls;c8c$8Czs8zMYhkziQ{=wNbk4>0Ko`PaahYiM z^lJ)+g&x!g`!3bJ3rX=w3h(2yHuzTX$n~A}Q7H{OG+Pk3x8PrH zvp(DXoA{Lm`$oL*8y)t zx%?jmVR>t_XO}!mam&OycmAmlQ z5?CFbb)5@mj1XUbN zRq}U~w<_#g`r`LF)2yrr`<^^iub91ye^_(QY)bbt-O6kz4A0(B7N4@(5|nE&^O-%( zIe$ErqM|Y@EbXqlSo0sV&r+a+QYWWWO*(bokjHK&^9?V!&AKDp1y`NtK4;!jG$gp! z_#Sop;!TQHkAN(x&!^d3vFTac1#rlSeseuCIxz|6QIdPOSPW zOe;BGo16E-c&#YOh;xqf<4ea$!KDk0V@qnNyXFdULT#>ggE-x@nZq&|;bhmRcr?_D zo`W+Y$#`$6Oj?~kmPf24DXS7XQP0qcVAdx*ZLyw~`E!1I1{ykB~#O;cD8 zHyqSC;6(88pzy#oE*6ggeqF;3IMzi>a33Ev&)utmw{C*(9pZ&YvgN)rAvig-;~&Xy zl=h}8l-<-H-8G&74K2|WXZ@ocS2v1CEd3W+E4RTng)@+6-YWV^-d(gSZ$6%0V5O}^ zAL##z?imi02OBn9T61yOrv1X4H>3lNo+R^B2A9Ur%g|V}%LVHF^&bt*=mGjJnrpPL zx{tx+v4qQUcOVbzt8s!hw*E7Hs%$GLEPW;QDPLAM+LT^Ag1=a?K-H4_8LLa)qOPSO zwwu{U#Oe8Ojnn>A)yAYes&`9a>hAn#VH}XWzi97oAM?H6g7vSIb5>p27HMCpV$)au z5_G0oTV_Q=KCSYTFvgNt?QDv+G!{17Tbm9Tm5OgR@A~sKq-9Teptz!DFnU!p*6LbH znQBs})?NATS~lm?g#3Br5S6-jf-W78Luwkd8|U1T{{H&=DY{GjgL zd7vcMXX9(8ce>Ta4-W3qMCWxxfy*?$(r|^(^#36@XmDA47WEyCifV+HHQ8pq5tUm! zu%V`SXV{jSz~GXqht645KMe!xJGp~u#-b({-BoQ6vT^B8xhzk(;! zBpGmRl}XGf70Df=oxz@STjIFKt+BdSpi#(J|0@l9`LQ8;0!$4n{bC}<`@U^*Ccv%j z@&Hp*b@->q5n-JoH~Kp?Px9~Irhibg4ke9J)Gbx3qCLE{Ej%4>wJe~8@TS~x&)FK) z(V3#z%j9hCwe}+Y(0MAm#Z@3FhuegYVI_)pNfgozjQxxACUczro*8Sl@t2$rn1P3> z8Uzx`$&d@g>d;Jwp%F`63!<923~a`E+--W<$G?F+$k=RFgKjN%`+sRZ)wg@gM}Aux zV*eHmXEq3Jk{^1!S>sS!R8`ne-!1+pJOTpSc?|d6z(tcsoPLvEw6B#cPPT=+X{Ckk z$Hg&juWbVyOYIXKcGu5!zgFww)V%D1YF=s7?5$WsCFK91fBk81Sdw#ISCBQ-vtLEF zKBXeit-!q6i?5@dd)4lCsIyEnRLJWb&r9?46V2;%(e~T-u<cQc*DPJP3cPWeqENmnfnPPz^gCO(EpHZ_iHY$3^Lb^ z3G+2(1O$}xF5#umT+)g!X?m5$X|ifEncK#l%>J52TtCxJZ8OVC)%;5V&i3_qr6mn5 zFdhR9Yws!UW-r@8+gIB|=@oJzTT>3yU8nclA&;jH1_o`_TnJspg+**~ z4Q{y5us3MGh7SDB5Df~Mo{@q+F7kpQF^YHehz_G1TAYRlqdSO08f~)Wg{(IE_`r(S zPIKybmnc)U!(>x0jHc+M45OT#Jij@N^6udp8yM<+-Z$I*w)0Jwf!>1+QGNq- zIo``%Hv46`C;N4BE)R)uI2ZnqUL5p}_~Ua1t#|okW;M+$AsjZ(RW=KK?XATCVYIz3 zf0Zc5H*vT%m6%_ZL8ny*0J+SJd`cn}$HLX9D7_dC`4$h$Zk^dI|55Uf%+H_C<#qV(kn`)u=Dfv8*9(^<;3BV2Lh*=q zvkSMp1NpYMLjKp66ACKtcP}cu*P^1uv&yQsujbdx``nu!`lApG`*i~!%sd5Gmn_A) znoM?jeX72fNp{rQcWX_2Jl#t9qJ!$zkL{$+;fl6_V?Srou*BPevv|wIzwVRJN;hxY zW#^3AS(+Ed!Q>0$cj8-JDKXC8gPm)$>pt7Rv8t~NMJOg1B17;;89?|+QE0FnXio#r zOf03dt)$1HAKE~o(siBomAkjYR_}VpGM|?|M$g?LfBRky&IoH3J}DT5Pyx9i1AN;x z&i5J>Q5oV8`A@*?s189Lqi+U7@Q_p@*H2KKq`Jlv*rp-(sv=o<3?^#;iV5c9y_;&JGRQ`zfGkVA=9 z>uhFcdYp7?VsP}%a=#bS$4d!a=szknDPT{8zw72Oe-Ed|$312?mfb-35#K&d{5*fP z$oCr4W~k3!9RGjkgjux zqX;cW-P3$fop|TTd9a&e6g=dnHM5lNwGZS3qZ$HCE13w(Jg#$H2sc5PPM(v-kw(;* zT|{QGtE4zu&9|r}Y^QWr)ddrfQR*qpQYYb^@FGrB7*>x?P(3W=)SQ|XL~H@gf6olA zTl0Hu!G@H(ng9L1_ox2n`acQ3|76|G*!62Esd++C$=$vGe0(N5RaAglV<0HnxJDn4MA-- z1sBIYaF2^^a6OP9NB-xY{y7(hmHfMv}H8yc$4etI8}GoW2$qq zYlN$Z%N+N6PDM@|9eoY1j?4AM4o#eg8|Jw$ab4{7&Z)g`Lx%-HVeIa(a{jA-PvbT> z&x+F;W6?vnE_zWIP>aU8^ zYu`!(YPX6h#s<=3D^fhghSUR9pEie^N&7ngN0xa{lr(;Ct^M5ow&)zE*OYOdRd(7| zIh_fsIz^tS|Bi)v!uC}-D-V$3$T#-pDz|Tm%4ol5YbuA-E*Cs&8VTRaLtvwlAV>*%Q>PBpFwvo0q6RrzCkv(g3#xCfsPz8tEb7@zb zAN4=sGrTYK)|6O2=v$qiMc!WJ9B{NiWio7}fr=WKU}^4z8Rb4B4!8D;LSTkFa^ zrrPp+YvgX;?NyhTb*!h~YOT(vpXQZYd-j-9kT$`MG_-YjVMzCI@>%Y+KIpjP!LW7? zaZO&5*BahMHGw=D=eynV#2p!TyREN3>0D;%u6-mY&^6)&@9l9bgJr2R;mNfyIMQ;W36clwl={IWD+I8Jl3E)(k&~ zuIhSfTG||Lz%+O&8=4Y@kJ~WpvKGh5;HEW`XFC?KlR6KKfV;-~1g++1a#K^6b7N97 z{@<#ajLxlfTl@O!ul5c$EFW@dSv=X(#^vqnMTjQHPsvmGLUpM`r@kuhQZG|gs3n?6 z^$+b^)eBvQ{(vzO5(i%Z_QZ~ZA6Yn=wpfPhzB64lO%`iqDP%t1NSrqnPgu!5ggwm* zgeQyBKnEmqfi03ANRPq+%+Y36iC32D`N~w{5&=w2AO+Wcy$R^=-Sc-s( z-YVLLJtFC#epClC0LEj?Z;&n4{YbG*E;hnC0k_`rH*N>(KH&i?86Ri6mUP!C-fV`o zwb|~p%Vn9vMNgT{(rNyz0+%4_b^Aih2D``588#^R24)|MMhrr~M1P0Jz`2-M@me2IX@A;o*!_w1jOjA#&C};G zb38VYIUXG3R#zCP#(4+mkv$DUqptu(lKG$p;zHmod^_|mR*0q}b%;RdMp!BY447xE zF{cW0fjp@kC>Oeb;{-RspZWJ8J9#GPTYe#8y~K<@mVHC@Y9cXS#_MPkzy)0cDuYOY zBY+slXYe*qH!#`U2q=b3nNPX^&;w$sZZ~C_HizBOXxW$g4HuWRrwX6>=07#PR!7)94|>uMr7CG_(~~KQ<5EJa!QR zVN1byaWx=9c^)((nr12$|7X}HMyb$}cF9x4J<(~!T7Ipjj7K(RaBi4pazh|Yo*&v> z`Vqrb#gZt7eDX@*5t1J4LK;QvMPEUGG@g-0$!5{jbJQE`z*^-*b-3%Q$lev%F zMrRT-tSX>4nO95|^k!`iNve;*=BbY(QdOZ)Z;cXAW-0&#L0%e#a1vk#{JiNkxJsu2 zy;RNw1LPX$LHPz)l+Yc%oDV{CxN7_$_ZV3&jJL3sL0EINo9yg?Rt_<+IQu=QNV^c#-X$in&+LEz8mKC_8%tdsaRfiSDX4ER)veT;0qS%IjJ7n_^NwQf5L$J1k zn<;sw2tt0KE?}7f~ zMnD+s5Xk#6Da3B#ADlZ?ft)3vVxwd)NMDt|h+lMV7^vwL(%g?*XnO_$v(rJJC|?IM0ZfnnZ&{BZ<1e0jY9rf2gQ?kk3mV zUCBE-wvaP1j5bs2){UL+OBy!x-0ySj+us?{7ur$PH?O64;8J7O$Y^8N*omfJlUqBk z@Ur{POD2YsRm`arU9{*w%}xbG4b_clLFQJpm;M!?&A1o1*PN0oz5oT(;PLd(o_S6!}Kjlk-mF0D|qnT9KiJvu}a36HX~V}4MQ82Lc>%VSeHBswo&Yh zjO0aOEZDcP2c{yi9_(mhF2BIyujrpuwc@qyLH$4LClHyHAG*=f4Zhvx6x7-35_}W= znR$cpl<q()4Y?@@9`F=Q2>b%}2M-whL49g_&>_VoaHw<~bd4Vg-OP@I7LU1un}#|-5hDZ8 zsxcKpFq(?pH@O>E$HQW9(x1p1@;Rs%vTnpokt?)OP!6C%0+$<;UPZ*gUHu|0<;2i z%fvy`WZq@f8mWpb(_MuX*eEYW+p8XsGPNhD0`NV`dE`nuoUqI6JYLUwht8&9a2^&~ z{FnuRu#};p60O_lIaZgfGiW*XREuOsK1uBiC3v|Epc7qkK$Q+)qtI%j_76QpL#5o- zLrD`x5a}nNf#?mI!tH}>#JmL!!TW$YkSf4Opa=A%5sCPtw1O>>o`U|9c)~VIo}wN| zu;gvhyEK+^Bh%gVmze^8Z<&oT*oklo+nZP`D;jVQm}xGVv}o65RIs}PQSNpcsd5HE<~S6a+$>)kTImTU6QvidB+mjvDQ=L<_!p1| z$R(gyXb5N!NHC`>%RoKKSCIMQ@1S<>RY1#Bvmt(b47hRp39N6_fcQGL7qx@eig1=CNAb#zQwJOY-djTXu-jeZiJ9_8{@564cm4zx^2`v!)04-fU8 z9?5BaJnYeQY6#v?KIBjrJ(^U#o8we@Srk&2F22x0m%i<8Qmq*R8V-$y8bc>TbiBzb zZ6AB7e#&e{p-P^B4l6m(JR=6a2ZD#xBgn82!c|Bl*#vN>C+fQydGa*c63IJCyOd7) zC%%Dekk2G;R<0nN)O^Nb^kwLF&1~d|hK0=4yn?7T(pKAbaVF6rJ%Je$2QF zz0=@XJk3mQD&E}>`ziCo+-pqko4LT}rMu>&}=ydS|%v(hs!B#Jz z90qpK+aMZx3j6@|9Q+o!5ne^EL;6vEperexaf$R(xJ^I7Efhl%0tN(${#6$RHk&nM=Gk(8|7`NYf=hgjdU*rsQhhw zsZpy-&F$_%nMU;3Ow=JMQ>Wf*+eUwCy~l1F{!M@Y9JZMjDfB{o5rrddr0bzFu?UP6 z3xTi1-QY3lh?xRb0nw=~pfY1R;E2&1cnC}|t%Mmg-{FzcBZz~%9$4_?IG|xDUF*~T zNmbV~ra<@R$wvBjiIV$Q34e9%;oa#R=5FnJ!oJ(bA35Ed)_0|k(|fzGsC#DLiuMbG ztDB-mcl^s8U;Ga^<<-2K@6dTgX4}6<9XGl~TQu=R`(=u*rE>apW4tkgMwkF}S4=>6 z7~0@5U=ySk)`?h-8$_p3k3etJXF@`4`~g&(Z@NL2URg$G$>bK3DsSd1b*cqXQ%&?W zuBCVx){)~h%LxPnjZg}3L^y-qfHnY`Km&M>sT^W3b3v??IVh!M4z^Ch!QYWtk%yH9 z^w+w>R$azg>kS~P)iTg7mK{jKd*<{LRU|VDc4!V=T2M<#6b%EX}uiMX_b#`w*C*{%fP@pEUv;o)7g-{^t0e<5)fgF zO+gkRI^j_0Z5R#U1K+KCf|#RNhT0(>M0E-`V8(@)@rjZL^i7(5mTY|jYp$u+mIc4h z8U}x2{f1q!2BF=o9-$$&v&a?9I&y;bawgl#%G%Dd-|ie!?h;JJdXA7bdX1njxS8j8 zXJ=r&!+E2(U4l8U<^Wv7@CMDIi;ZV2P8&{B2K3eh81OPG8$8XNh_*FdHQv{(Fi~VC z!wmAG0gb?>Wh^5DpXG%Xt7j!I=w<;oXB4@z%nO zl3makWf7=F6#?bxw?b!u;Ksu+oEC;MDSx6~2tPrOPT@fCk+~+P{!$%iV3F$gAXPf8 z?}6w=_dd~Z`v$&O=T=T!_uVmi4||B#Q`KM4d9vHNOVXz3+1~{0(bwko{Hd<)o2a@n zEUq<S zKo|Wb^b3^*FlI}2Pu2j z)@I6xwXQK-XMHx1EouN~Ne-qag1m<~ElRsSw4x;-*XR!ouz1e||W_A$9 znPkc;OD-+Z8p2XoSK7u}E^>WjdBW=^OY8O7VzKvH{3;)NgoD>y=naoa$a<$4@ZI)H zpy9Sk;5Dlb(^A$^Ko>0n_6ZkT!K0b|6Pd2P2=50&EjT5zp@8Rlqt1gXcS^d8;;cU4r%0hBPS%A zM#TKZBc8nbLz^e6hYk(D9JL$Z4F75`82Zqt9UQ1j9wyann+mR7&6n0Ei$mH5#PwbG zq@11zC82+p%6VXurg+RwZN;w9Ht||bj^YSFw6qIgsfz}cnmHE3C?@2Fnb}-Vo~AiQ z+aX)eOcT#%R7j7|Qsm1iPh?zjgLE1Rgr)at^lviscPCfy@8`mKt+21fQ{xM9AxEl9E`WY`0rxNmIdOSsS2>(pC zi{Nd#NNzVKn{#OwD6^3>sXOsd+CA!T3plNh{E|5j9b}1vlv@r0+^s4B3mITwA@wU@ zgi>QrlLicU(s|QcY#HDz3IW`LNHx`iuL72X(}1@Diy)`*5!4{P4l)W8A+G!z zs6Tu!!ebGe^hx1DJ)+-EN0??ZRVEUv0u;n}169)`C`ZN)^ht&lx`1JYmokv#0Qv#i z9VX0jnkC9MnRdi}gplO?2yX9sAEI^khRk>T3NE(W3AVERWisI>6yI4lS6n zAF3Y>>Cf-K(D$HI-aoxHZwS~3nJjDpOdaj8;vMZ-E;`)zPjYDRvQ%TXZcD}kWCz&) zH%&cOxAJY&7*UYMU$H{(S3Z*2NTQW@c|6UX z$w32w<8Lyb){rPs4PsQ3gf17=p&m(3AP*=Wpbo13VYaJdu%oJvm>6v<_K^7(e+u48 zW+CocOkkFhFOcf6$7s_K+nC|tHYOOnix~jG)1`(k+Csx4n%-=mE;MeToH6kThfD`> zYxEn?Dt#?-$`lCK0t>)Rz&Jp<>7MSm$w4s+*dd$%mU3XQgS>Uf*CIUnj--INQXWKU zmIqKVn&}pM4NEP!CMshEXaP$Ey2`MG7Bcprs#%M1WSc^=hut#zciRZ-&5Y0X6iTp5 zAi>kE44dj!fcfV78)50Z8D8ML1wnUiKuntRn7eIHASPIEU_J~O?6*Y~Y(J?EoL2XcLf#IQ}D3^A(s$Y+WKT&wg2{(-oFKo!m*cJQ-F>-cX-TSZLrdJ%#6MVNtG zE40M{MMp8tvM3Z-@d0r_;R6qpr-S#)7a6uIcFOA&t>P3j6_KJT73?yU2>L-p;U35% z0TgmuNQ3Q>euZ9?R3gsFe!?Kq*HDt|8WgU~fjv+yLBG(h!6{6Wmbg+C#+B>6E@42VX|d7w6p3X>YC~_tVk0MYuDhQ z)haOnr!hB(ltO8n5-$o@`3MHpmVBXcLI8)Lgim0O;vNK3M#Xd}9Py_#{)D&MW5f_6 z4FA*EggXQ{iSGt~BCm)4qp?xTXhy;)`5g^T+-RAH-DdX(72_Czh;!Ts#5vfS=#C=O zq@xW0=eXPCWw*uf%=(`GAxmobN}mM~S`fesEd)RX`3ew2#6Z5Fi-CWEBH%Pb2&h19 z0=Fm}kiXPQIVS4;`F*-gk_h-TjDH+hr^A?(&iz=**Sr zyALV~df%vS^bP8SL%VgWMh~eC<0+b5?4{Zp-2Y4^q6#opmIZyN83Z2%7J>2*1n?m4 zDlmkcrRPz5)vxIJsz7Fd+Qo97TEOBeS224PCzx*)Qj0UHeDV#=4Z>q>11?$DYG%Cm zqazHJ&@1{7qrav^8KF^0DLS2S&TqDs)InB8z|90_!caL@FNbkBH? z1TZF(J9Kemd##*UufBvY(E_k&eG=-JehQgn1fsQu^$4DE9=O3^)Nj=Blr!{1`3Aj8 zR0$CCBVlI*7hucz`w&kBD=_=TEAh$FKw^pf1WBfB!FQ;Najx1s_$1wa63eiWejWJA z;y-X2)drnMnMR5tU$=0=zho4n={751es=RAj~rHjMjVUgk^3_kr|*>*i|4uq}(U~lFf_{^DbY5hWRO;!dJ;2!RATb zkU(h;W~Fo|K2iD<50wegU!=Rxi{xtLN2xEqRt6$3QLZH-)yMH2I#&W1bPBr=3PLo) zpMo7xw{@OqSLFz%RgS>?5<}6C`E$|#u^%GuPo%;?lWCyj@vFw^l16a`+bTm|jXXF^jzOU+hvb9)|BqJ2epss2lzt4gPA zRrpa)%MkQ#;b-b1(Ih2GL?yizpTnP&{3K9ilSGm79w9;1j#{C;k2s?K2Mku-G|<(z z)KmH{d9lG(v>W(DG!uATz=h-sst|KTPf^Q+8a!N@j65nyL3qnjFy4wc*j0)ULZo5_ zxm>-SoNh2t2Eg;lOJNdX6nYJ|6K{eaAdN#?$-dCN)H$H1)aNEwTDX3{MWb#T#XK(K z`!#QIVht82*ImFD>tVb1G6yn5!M!LX&MEi4qB3loWm}M~FSrn7TGRAa><_sR9 z_5hs-D^0#Ah?!D-*YMNK!F;9JZ(1&I1|F4s11AWRz?=C{#4-L;>=HpY+DDLqej%cx z&WmRu#)NS68&NcFjzomLE$JtOD=Wzdv{X{4elF1#Jc)#Zi{NkJUZ8yBh;A9&q&tqj zs91{z${%9J1b^W7g$E!V+)E($37BcAKnJenoHlLacIXg%mD-j4S<0Nc!QVHzb;@xv zYNUNiH*k-AtS5#2s>4rkv3s}lNLQSk&;?el=u1>N4bqhE!<8D?C|+}V_^5v6m>(dH z{lrA%pMe6+iI_1>H6+V00FH+~0im!rjg~mR!HX27wY6BGI!oWF3Sd4}PSQK2Cnz{s zKl!38k=i8IlfNqtQE1u|l=Z4E9A2YF9nqYH`Kjy7eDG9liZNOt(+kC2h94pxAe4uO zAor^GcQ)Wt_LR+As>d^9yx>E56lU{0z*r|{pD&-4tTxBwmV$@>?O)|VU zpq)$thmr4rHJcDtkTnTZcx)qG6*FJ%v)I2wK(igv(8UuupIxAC3FGS~|y#>XmqoQ8D$cHJQHyZ-OexkHx5S(7r*Dh?5PpWm+k z%cfxeN`|O%c?Q^?XhZWOhc`VY00 z7zIqX_yukwH3G`X%K^RAR{#a(gmxARtviVg(mA1}vJ;5Cl2q)Z>=3S2RfxK)UxzBt zzeJ21qd_N3$BplSP8u8pYPPLpN$3y`FA?ZExzK=|^wbrNrl~g#_osR`S z59?1UhCsLEX!r%GEApv~g2J~#(Us2tP6}26;R1WeICnYfvS2PMLE?i{NoJv?A~*ad z*;_0^JWBCXMo@&B1EfpZjii&nFyb1R4?Nz?Q|2Joz*Gbl|-ptXD7w58($O2ly1!Dd7&dvw6q1PJSABLVg{?P_H1LGuBe3fFAS<@cm3D z%uHqqk;LkzuA*;X?k440e@SKM=|#N;SW2cEQY@l$(l(#GsJyQ&ZtP-<~-Q0Ov z2>ZK2J3$fb8aXxobNt5e^|9@}{^QJ^?>t=31$KDHIJdIv6qnE$$La2};#Ku*9B;k?M5slo_gA z^<%l4fh3CqJrrj^6U3t^wDc(|Ptk`MQu&|}>YvD!%DtF+v(GP2lZq#59#Jz*6SPYp zg4Jw@CvzzrOh1X`S}Y_#pv5zg7Q30PBzNo0B$0h1X50pZ3AHQ3(Hx>t0K5ID?GCq5 zM;z9{Qf%x{nbzOY-j;0S7y4f;i{XvjNdAHFLo4w=kS}pi_%Gse$SL|?$Z^^;pf{rn zkid!rN$C3knHCwQCsyWmKAmVFS*$WHwFt&B#DFLM`M!fXRyWIY4vnKw-_^t<|KdXP4j{#uzgAx+4oefp&R6vaiqt8JNKq;&ZQnj%+ln+> zcviQDb!}>V)KgJI>pxfhbvUJN`M}qjlz~(A+lFs7Q3t_w8G|$H$fM7j97iXb)=#c! zuje^*hl%t9LE^`wvEq*tbg?IYt@wg?qja8fKv1q37aRkv-~~exxv`K-><7>lQ{6Dt z_#t@G*elfau|0@j4jlQAV}Y2%sRTdg<$!LnPit{PKg|F;-|R?8mAo}OTO4GU*-~{N zd#9#u0&2A2!i<-Bt|k)y0O+^y4``ULhs@|rbRg6Y&)_Dz z1mtqND)=kQbBGAqO?V8c6gG-A!H=L?QELz~>_?CXA=WhALIn6r^)(1+RMl zPw-nyGU%!GbZC+-50>fh9SL+*W4^nc$9{K1lg2&gG8TL6wXFC2>+sh-!EMCB%d^9= z&oA5Rq@UI@bH+T@R{w)^uD`2An{NiS){j9u?)Qo^-)9kx?zffp#>Z$;>PcYWT|0^9 zT@B@qbq?t~Z3#Y!2&67EXWm%I7#b5cPHzOQXXS&hFvO;(tYp(A<^tmwbBUg9?P2t^ z(;Ehy_n89RP621T8^Lh*ctp923Pp2kBBio-j}T$+{kkq>6_X$rW?&1eKkm(h#p9oTHF74 z{6x=&33PYdcyIfIq5ZA>!_V5-)i3-#dx29uOipS{IzR>m0PzRt6;aiF8|)m`&-)e zr5x9>q4ZT}N7?)SKNT)Rf=d74|EhHp?0?PUHqDk($J_ll-rWZ{HwI-Bed9J0as1fP z3GwP7gY@(8awThUSiOAkvv%X)cCE)yx?#2aZnRjjXA)I`QOU z&386hy^Vcb*23=*&lC>`)=FKtyOb`xg_`}`ctZhquTjD6HE!pC0WDk{cq6YCo*{UK zb`WnR%#kz^X^LU$XKgL*j3JJ`0+2^nLdGf6F-?^FBq!2YiXDDBJq5FuVTU@zOolU< z@em^80XTwL2yA422fA9$fULKf39hgz0PnJ_2dA+###z)3<1O+ELlCyv_yc*zOm*7_ zwlh=l3yhvnioOq>WN3wZs8uL$T_*CQW+(c%`TgUeF_3I;D5l>5$QZkzc&kV7*ET)K zZ2MifgAPj4YP&jmhuw%xitQW+gVk|osZFV z&lm@Tep!{yth4kFer9<*;GI>k{|d_ozLl0|d>~d2+zvUIoSrzWv|r^!wej)zWPQs^ zV%^|fWvTTEw(Rl)+0bYFXOrlkW5W+UV80~nyIoy4#(B@2_0G-nMqEEeJ@xz^CG(Dn zO7gdz%LraE=Va($IB8CHSVZLJ(AiO$!RQ6v0h0NF{sjwIeyr#Mues3|eD*Ian^rMD z(PP8BIUaK(Qe0G_#~jmx$o57*p53U|3EO$jgSG{>^X=DLzi{YhH9EbcFLi35UUTZD zupA`BQF{*(%Bc-M<&=x9a1J-$bUtANT?a6YZYQy+t_v~8oPXgSIRc1VZMTz?nC~s_ zQrl?dBtPaQ^g@;|>L5+1UCCq>p1@GdLygOW5qTmM zC{uXcDB!(S{^R}-t!KBfdEB+*Rosjb1)JS>SuoHujbqn&Vlt=AW0KK|oXBWQn(F?y zg01}*!`}YyG52<37xzemfWxgn%hfg>och{wYxG9@&S8tru|E6m`<*{}0Il`C^$mCW z?$r49O;pr$FD!?4wG<|Hdgt499{O$H5%;U3<#6ue#y?s6>%FqJ)r@77mtRO17Z#?U z%1ueXoxT1`Nv8gbI{j+ajSnr^ZSS13F1?=)0=e>{Ha^vm|mj6Xl$ z5{oW;xLq>w;Z=n$y|BvuTWR%&->}MW1-Vr%Wm(nXbxSG={y9~0Tl>rZbT*X1d#R=V zJ&%fh_RtH@^mP`T8(3Dbcwo5b_kdf8cyMp=j6qV#_<*QvaNt(Cy!-awlWj@W?Ja+5 z8ydYDg$=tq;{Sc`{#kdT-}ax&(Do+IaMi!J6E4kBobc8mo^JFGUur2)jSJJ)(zi0T*(laZU$N#Ww9H#jWF!GBrk4_`$1n`z8&TTlBrJ3PH2 zBHYBYdCs--quhQkm~xw(&vdU{)Zv*BC-qP!x_Q|oo%6nu1o6vB`V^>4q|MYOoDBaP z_d6mb=6e(*YI=0UT?gNzHcem7!}z5@&Ic*CNryh!sy-P5C@Ts)#+ zPRqmZ*|!GYwFdgGW4O5M7$MGD8qqq7@s8fb_>cUHuEht^La~P^P-Fr1J;ad)fjOl=Zk7#CxPWn3JSpq=Z}z z<&zyuD#BtNmGYmmoN`olmGn;9Y`$YJ#NXrJA#C9cVHHza#HY!Vkm}L<2H9|~YW9%7 zL^R0fM2;}W&X4RI)DJrLv4#S>@&=BzdJe2;*7egGyZd7s-}i$WUk(h{*A8~qTMmO8 zJ`SI&pFXnd-=m>B|L{Ybn(_z!YaQwS*?yp_vuCIc+&8nua_~dr>_LY*=)l{`rNc4h zn?`n)V2Ab=s|S(_Z3ZLq@AkL;dEWQ!&%d50zd5Z#zlBZM+`78!KLwSyetVUj%6nQ6 zT|mlzTKM>PW+C#|?Bb2znWdiD*s_S6f91fO!M~WC*_9DFqcyX?o9d}Qlm4CimERcn z=U~gd!aZ$=%fnjitDdyPG}uBUAL+ zhwP@hXl_cwZ(e)7FMnr~lt0u+<~(ZrIyKSwbt1WmIl^vs>p$Bb(6hT|L(g!xrej^- z<967 zxf$vwc%W)F75SC(9=n5ALh2P#ECAAz%reCd>r>i#n+$-9Z9F{HPKw`Yzm68;@R&8z zVXNI^JC(E2daDQ1mg0lA+wc3%HfqLs`$GXQ?W=?6j{nU}aK07n>YNg^$z|rub1pA} z$gU1E9=YB2p6Ml>HsnK{_HcTIhnxRv_ho^*-126Qy5@vhxH^WHxowI3;;}wT=aCh& z&g)M6D<6j?U#An6o%dh0@?G%i)T9vb>g3r0t4Z^3t@4ZQNgYl&um6e(HiRxfuKl!NVcN%e6{)<4y(_kV^0+vs+p9l(uHWm>alfDt`HTwz6#v!Uivuotqz9aF z-ZaBx_rmYA4b?Z*(#7`ygEd`B(@uLpt#VsO4sh9RexF={PPPew7t;4ab4X>-5Ud}# z3pN|H2>jhtrf)UVBi)TlWpnl0gu%KD-VW_)j#L{yHKy4$QLpVEeW&di&epmO@78}B zbk!#f^l5?zl2lKJQWdkte5IGhFv3k^(VUy(d84Yym3=vrt2^Km2bz)NxpnZ-A65HC z63adf%`fWgD=nDO);R1_PJTF8=cZ;R-gT-Ew=fPlIQU5*7vd3!(UIl4EmVx zvh_{y%a_l$KZ}3FeY*64%ah)Fcb;y)oAT_??OV^-w@Y5;-%WetbqjE~>b4}46|^m>0P$LsCXFU!}j@{hbcT~zb(OUdIG&-RafI* zTGWKUwyjNgo78aiUHU(t4@;UpzT4iI^lrG$=fk;b!sm!eb$U(t)eL6ozU;i>n?DqV z>Az|U#CdoByf2Xau`Rw_aHe!`!H&wX!n7K@;tTbEOU2C_{yyorUoodwQbio#*2N6P zw5}X0=n+qR8;G5{F_y)t=0Lb<;@WFP#UY%io;@ew#jIc&7kc$*u?)_PCC7cB(R%q4!O+Wch8h z@A6&ZX7G*ox;vda-PX6lf4XmIaPRazv)1{35BoFY(d=sh?GY=20-_3oT<6aX42XIi z;2BjP^e93c>=C|Yrdz1ptY5+J!}bMUos;BeiX8G0M*j68M!ofFk6JtJd~~;`e@wq; za9oJj{CK_hu_X(A9hQ$z_e&Y^vs`^Ks514?EUPr@h~Bl6^IoLYMgNz^U37FcCy}x; zH>qO}1cRn<>!=|56vmWu`jEGE!&6_N+>ck*0>uuUM5dkF;`Q1b>-6+%9oi zc-kUHXl9fm1RUuS@+<6p2rifwlH^w#oaj9}Fv)Y&zuh%GAklGgz!zIlK$^{yfSFb; zK}gG$GlLk)komOE(EaqL5Em9N#Mi1RWUg)T%u4&-z#EQt{m!|Rc%fa-xyQLyIsbLJ z<{)rgYGdzqf;rzgl~L}T&iL!Rl;-2yM;>vCBW-hfgeTb_!CMW+5?;~RfdU?id7@0%WC_d6>sVqEIikmSXlCJtT3+{P;jE`YTl1R zySy{`n|?jbz5S~_=l(C-Y}oH#-(LUT{>|b~Ojb=HJF~HPPgY>bwCq)-lXKn6 z((;t03kr-S)KXy4gTEztiz@(mKGn~14Ydt9?;5Uui*9tx{MneF`KU$wHM{jmrdx;V zt9Mu6S5i;S*TnA4UsF5we0|rtFT<`W)r>D|&8n_DpA%U9_4}s3|9*ZdTlcG{he@~aEN3UI~S3q+;g3YS+J3Rl;t3*#DuWsQyVD_=LKS08H+ZfNb=-4x;^`hYz-Loa)bV@JCE*vGoUcs?Dw1qV8c#BbZ3q*d+da&hOR>TWwmbE)HyuC`;R zuA=>h=3VDsRZqK4#_Vj8%DeZAKJ~_ND+kW7kB#I`2}d;Jr^hNroH++Z=5i{ACA^W5 zGs4W#2B~1oNv#-tr{6FE1ASqa!NzzrBti5Gw?jTgKA}5Du?Ie~IE=`m?Znp6oylzG zBIYz^icJRNpTih)vr7$Yt4EDx+qC62Mbqcm*89Wl-UeN>uLyqV@Hgm_!@e1~hn-=a}=-usk%U9&lH>20hGjOTPw%~nEs9CWt_F+U<{JS+I3YdhEtE4-@vM7A;wu zQoAf7IX)Sj?6vaGiUTR{m!C`RUG{j*x21(?iX}N~N)u0}TE*{L8NA4A`OQVyNuL*$ zFP6rRMXy^FXr`XABbUV1hZn`no=IBtAV3uJc!p&R!}n4Q$IBQy;US27?V1(;&?Pfr z)Y+Ke>fDv6a$K9la^@#}bel~4=zcZ+g6HzMm}vpApv!mfW@Zn5%$Olf( zzW2u7{qGok3*TMpoqTt@d(-?sN3?nyLu{JP<}pRWoiD`8zt{E zdy21RwHFrWEHAvDt1Mcar!0aLCKV5r%qX5+VJd!I!zsJi;8vO1tgaO|Cp3I$lQxgH zTX!sIU(l1&3L1=Q9T|;niJ5e3$zun$Y~nVyyceEr+aSwpk5pQAR;$ap$hw7{cwKzw zCtXhWD~+<(OJVF6%TPnsQrYmRaP?Rke|V~v9mCr{<-)%|c~V$7UN5Q~bCPwA1*^GZ zSUq?G3SdsiAn(Qxqe>>%;sd#19n_ z9?5QT9>LCNuTBS>>4$B(GbXL`{rjwb`nRycf{d(hGoM=ip0&oxaZa1{@_9^K#e9uT zd2F^_P~vV!;?hAEx8+oix|J8bpRC&8=apI$n6|1RMShHZ67gyN z%E;!3z(|jMV`D>s%4@(8X~9*v)PpWt#IGPaka9%js#sw$s=7=leeQT{5G> zXH7t|cT6C7npfZ{_d~%?TvWj>j$49W+a>txY(}OBS)#nS%xfMyXc|We^^)~nvqwFR zI*oFJBE^3scA&}#i{V_nH4KS62!i9x+g$8+(+cbioe_IOGaG+iy$QcY^#%7^y$U~~ z7U6`dZz$vyx~g4?FmoYR2NDVAx0IqPt8SZr$Q z_cVR)Qt2W((3;WKZF0Y+3b9+mB|&nHxq@7MVpvnf>pfSwrDN0IGtFB{=hhFFe5$@( zaHtPxVAK@$g6m7NlW40Qujhl`Lm*-@|(q{D;AYJsyqXniH8P{+49vOD=r7TriZ)%pc1M&3pd?_Ip>Z zb>8FL{9j%96~8iyg}GLLU4C~|uE;ai=?n2q-Nj#8f0WvGy!)HpL8v*>!TN{pENVI5 zLF&kBTitcN^>|-()9QhS=5xb`TkOV4T7o9|Esor=ri1+8#!UXI#smD8#&|(d1DnsT z|HZr80N_0RH$3^IDQRqetL^Z;R(QWt=b0XI*MiPPy)QfF^*6TN9{{x3jFz|cPwZ^< zIi!~`jjvWvrf^Bou{3S(Hm1RMUVh= zEBrKOAr_A9z<1&XDJggqYaK4#3WVp{3=`(qYl$fial{74Rm63U*GRSYV9Hv%wKON2 zWelw4I@T$MgN-BojIEq%>F|x}>AcY5g6k>TBM&FWE$@2z3I8bOq96%#GBnqU9g$}L za{d`7%h;>VVT(_=(GpocRZG(RFC=BptV|MyadhKnpLETQdtlULylv5~p*&b4$e28F@ zm*Gw;h?qwzBI3FFAxN%i)ZNpZPBn`Ck2U(Gudr*?W49ep9j!Y%&yfH(iT*?U&FdGTy1u7VU>IF{J*dg zbm@cQIYoa;#03eZw+fKuy8N=ro%uhj*m=&?_&>ol=>;pRBa0|CktP4C(dDBRqRO7q z!s_8-YMp0cS>36E_J)80RLl3@%+}1`>UOW+(5}E=p54@6&wDC=RP3#_gVS#+z+MxzoJVw{k~r!`;%Nel)tVpvZ%3; zT{5e9^WUVBOVt}nHr3me5}Sa3Up2K+ewJ&_nh?Rw#FP@TB1Jz?Zp&=&)4U ze}7atU^(eJ1kw%;-JMQhtBekCD@+Om>&zR(2(VN>3H6$|4=dBOK#Qm2Al}jN=W#sPGN*4akkds(tkYtvXveci9oF3X zFs9jd=iK{~Y74^Vp!B$QWV=%bQtzU*TIpVDN%g9?+~|AC>UQ9AR8nXkN)^Gdj);@l zN)uP2$teNY>*)kX!n{DYoZPqG6*>5T2iaRfp!1k`Rc2-sH1lsPG@~^!HcgvyCuJ<{ zLW*_PnUodTr<3uy;YoM$QWISAHpZXITO9A72Z%e6voMx6uQT>*=H9r5RA}77gs`|h zF^^(35u#W>r&540K4T3bILh9zuy-6!t92Dq>Ig(nurxK-9O;w&?L7 zY^;4iVB90$z&NJ2UF=WK`%zon|Ant~O$(dn+z@onX{GN@$JHKW%zh_{0~(u$-ip@Q z6dCh%4iP_9B((gi%x!9^G-)cU1T`F~64r(NgU^Zk-0PrC zLv<@!Zqywm>g)U{qxCqtzOlNioN%W{OB(AQY{U0%>^Rx8mOj%xziUZXNN+VA+uuv` z8cL!4VIQEWxi6?f{;rNK;+-AurIXY;*~7J}qn;nk8~w|elmU}I&R|8)TQ&IDm|M$TUE-z&uG>1PmTC16EH!=C%n8i*x#O7AA&+K)DGMm~9>a8U`hS zGZ2~JbI5!M+~xyhmn{H#-R?ci$RQNr=&->m$6kywvR!3+&f3J@1GU+q&FU0(C1TVG zKZo-Di@4>w2!7CGKfKn*0dYRC)3PgM7ZMu28D$$qLAA!Mwt11V(7rH3jyan(=5%}> z%MF)v-TO&Sygwj!N02o8YZ!Ol?WnPNo^d7f0uyuQeMuo^hGZmU{>&z4j?Z780bUT4 zzJ9^q)Ute^)MW*cDTVppQ_|;ONcGEZPdSodmg1XYlwz5vNb!sdNsWviNrpw*Csl>D zCQ?I6lO}>zr&I*mr#1u_rS9^3meS(wknZQ*oH^umFzbVtF00AMEX&U?JM)46&-AAO z4^s~WE=p<$dLJhW35e+l`x&_(uf~7G$A>M82nYd0Uk~h#-st~dbcBz8^kFYZjH&yc zXt>M1NL%O0uo&F&phkyNzANmvdOWaYJIB~gVD#1x?ZtEH{v~*>B^}}qWkPhIXV5_4 zX2>728qg+_wct|2ckqT80JK?u3zn=;frjaqL7S(0LHOx)K-F}s+3T6B#{IKHGYgFP zy2C~{)ccLEOn{9QV{1)r$Wlz7ixW&+g&_bUchcl0XOro&!5@GMW}@-6zKU7Lo_G3> zol12)ovE;+rOJmoMn^oTHT;Zr`S2+5)DXTE&m3x9)f+>Sb|(@&JISrabT#of71_3~ zeFe3N>`gN#m(%jvZqUu!BN!VfJ@l{CJ+wm|CDba0M|)~_H~DoBfONF?Mr&i=`c}mt zg0O)#6Kb$bP?>sh@1dcm-?PR}CNAqI{%5PI)4X}S)! zq;_6vcBeHoY1>aWmyzoUwImQ}Iq4FK*ZP%ACLk$xgglx_%gV0P&1-w3Th{hpYb_bt zN4mqtw9D9MDKhr|Xlj;ZZttt>Z69o4_6#f^j2PI#ava#g{V;G(*w_C=v~OU(Bxk5pP{}sthH_tVs<|+hk_#WO<9}nu ziVic?Vi>bhie>JS1DKWyYi6;^j`>CRv=1`-tDkJl9|D=Z<7@*ec#FUfg_j{GB_fDw zG!c?MIR@%i?FM`48bHfuqCi`X-+=4Pwt`D7G?2ZJ>yQudGKe*j0wGz0peeQi@ICgI z;Op#5;S;v^5r3^+kXERCn>}-FM>EUMb^v&heH%oIhC=$V2O!s+$Phc1SZJEt9Vo#w z8urHbIP6H^8(3kO1OblBLsDb6$1wKtg zhT;+x5#8}0qD>QC#s$VZCYi<6r7VtFnqC;SHq#+$CMzSdZr8z(=e>0wk&Pxpm zd!CeocSv}ESI1O@c}Et7?g%pul?6|R<^@KCx%j7t%6un6-Fz5f$35f2m2UKiY!^&4 z#Q8<+HRsdu$6Ztjn_LKq`|lp1G}f$eNv5M-!G-2H+a0D=ajUllP$bNQx1<%Jy|Tu!~Qev zcYDLzes_D3KX$$%>1h|p+o<5Sn`9uRm$abcE4iKKLoQ;hByH`&k`HxXZ8z^0QwO@% z(vEgoF>2|-U1l^*_XW!GzQpzy{d?L!3{JP*ViU=cTz?Xqw}HqJL=ihgXIkHiIW6DB zf1Cb_<~I@q=q4ln!)DZQK=Y*`aC1ZdmgWn+{mt*Y{xoao#FpE%%9gQ?c`a%xi%?H7 zBF47OC$A>mr52K17;SBjyVtknGGDc=pUWY4vVPJov3GPH;%w_V$hp`T$B7zP%kCTc z%DTf@%If7lWn~I(u)m4JS+TN!q59Fb!6Ljc zGM}(!%^!1O|B^XzDn`x@!-ZJhN!~Sn-ta=5WN z>7ABx))}X9v(0Ysp+Jj~e$ZcOH00N4IFzec4n3pNgLAcKz`OK6ApF^G=qeLmc(eIj z>I`h5Jh_@o5q zWL*4`)Z4Lu^zrCZ>E_X>^!n(3sjFfNlI>#139M+3xYp?2DBoxTo*b1CG84HrkQ-qY zpvO=6dg8Bn?ZP*@+u&cha`2%p)QB@qmeCU2vRHpyVSFjhI^n*fZ^9j?n+fw=bn)hH z*>Q*5^P{mI7b4<4@8bKtzRuk)z79_D8wyDC@AokcNc0*A^7d#9$#Q)X3UxAsnP6PP z#P)%qZg$qe=WVY0Ke7Jja~1i(qsOwntf3oG4oQzm@!ourVBNjjVm+Vm1}i5L2~F~{lE(u(O%BbeD2!mow{Ja6L@>~drLK%J2tbCXeK@A}!#T~7KR zodr53Jxz6=);WHzLnn2j7Kj2UMgln*&%H=G#ePDx9UN-a_C09z?j33ccBha|Fm!G6 zXrPMf6?08FZKaTeQW4pE`cB3>3p$ z;{JhK)^`bZS5pGC<;9xswKF*hP# zF~}rs?Y~Is?DHf&>bXQ}?205OFhp}-(tmA#Itr<~sXF>8%24+~iYM~{C1$XMx{(c_ zZR18W90a&-N8v=Tj=!0Ck^gmInonYV5Ud|QCiow39{;@HHBTwJ!Yh~L@}=_UJnFa+ zw_sAh@l$zm9;**=&Z|LOv1&7S!CYD?ne5`1j+Y4SAj=foUV;?a>jg^XY9oN&vY->9*7k0wY8pP>e1q-6+Fg{ro4w|i>^N6$x6(Mn{i zg925K@w55ru)y}V{U^J0+m^Xg;jZ8!oBir!+mBF+J|Ju%vDe zmbcC`#uw)v;xBbR9Jm&T4=Qsw7?f!r5ENwlHt>M;sep3iSKn<`)t*Z&m%3hnm*L`| zztH*MQkyCu!E&cX3M|F!7--C7*6fnev`Lf^*Kps6J$=P!zizYfcJ(Qvn#n+u%agYO z`zDbxKLIJlG+%< zZsZuYrd2r*LjW@!2?4$HTOW5xiC^gpNj+2+`4Ht5jQ<~Ay)zm9TkklvomqP4B&9BpIpvdO1Kr-`4%=vH@WFu_fZZb=@c zHs2mIZN4_TsySaa*gPqYX}Kl3-dw(45};sJXOz7h#~Y zjJS)jt*wn_N%=t8NmI7-x=JXUnRQgrpgYZyy_5cd)7ELiRd#psPW5fzTMaDZuN)%q z53t$%i^HS*Sl%T;sbHhvsrVoNfc!PjFb3kCoQUH!DQCFj>IB}H_B3x&0}@Eo1;Pwf zwJ2k67#_*SGl-xL74aax}I(*qg zJG|YZfVUiSNT7u|i0mxqNsN)X@&=T6%-!baZc86Cd>AJ29W($zy|x< z7GLZ$pr!Vmh)(;pa~-A*+je`r!$tISEYbmlyN~&ddx|4sGn^bSYNzYyOD@aoWNy!G z)_N?qrhD8%!aYrpH$8t@W&2nlA^s7_a{(&Lx*!sQ82TPz7s;`_8@mJ6 zNYEwxjbkMXWByCM9xY5wj{cmQ5}lJW5JgCYM9JgsM%G1-L|%!IMplKL2}cF52@46J zggW_YLrZ)t!mPYvL+`nr4cX-UDb&o-H@pMe6>$c0H!2)65kv-d!setjFI@CB%Lmms#q>gv02FKq|Y7_-P)hy^o>NzYX%@#RtU6U85u@T4eY5X(5Xt=;UTOZUTtUK8$s6R@#ZlY3c z2tO!J#4nUC(sxQ|TODOV`vPh%{%O0yE(=rXWsYLR>98}wkWtcRdTdxw{%gny=-Ii8!5F(Ew*f~6a^7l1R!EA?+Nh> zCx%!&6irMX0Flo1pCYUJ2HURo2DP8**0mq%OzBY5KQS_Bte)c?t^J-fAnO~gg>!jVD9>MqKihnRSi9H5Zi*1H-B+J<~lBnTbk{`S`l83@^$x-ooX{Ib#IyJgM z{6>*F5~zGSVo>qLq1w&jDowRGT|Ff^tg@Al&jF<16Y~_kV^xZCvfC3KlF`Y9l368r zBtat?S+8*vZP3*Tc1%z3*BFlSW&u^ayTBg49#Sgc!x_RNBxNMnCQT}_dq27qO;J>% zk144RPMYNy%PAks^z;FY*02y$Z=%OA%y(gbf*Ua+*nWpcR(a@J>(A&3J1AxoCct3| za}eE$vBcD3EO5gP#~dG^&pLmx6FB?XJaRFhF1fu#eR6+`BzSB@vOO_Kl~=M=l=}mJ@tV{Yf6h( zY%&BLzY|AqR6`iG)}nuGuPe+oM5iw&fC?Fmr2+Xn7%`4e>2$tPsU z@mA;nZYdsz`xqXG<3<=chD4rqnjg{Ztiunx(8IpCx`t-BJqqHx{q*l~f8?w7IN)>K zi{>@xa1{Dx$f!+6FcIk<W zgTO(wt%ZZ_TC)fw65xeMG*m-=PfINPrd|L<+Wm$Tx{&F7-Ai4APN;sVyR1a&36q!f zmXmX??TK35)yZ~E%j61mq4J$lqcn_QgYf1Ttj$gHhEdIOesSYZA-VpK=waQ7 zk?G~!ZnSr_*ThJpyY2d=hcGk>%wdIim|yA{pX7{&xe z#}m@>jz4W%sW7Ub{Z^-e@~UTq0_xvGy)+a;D_|GXHx4i8O6I-qndUv}`_6mUAJ4O& z^9j9XMTvF~r;7@B9->siec{rPyP`^|NJJTxiqa-(gb|Y{;R@wq(E-(kk?+bn30A3+ z#Z3l{9#AO8H_z>Vf=9n9`LY&Ok-S4yB|W9uCW%rTi?g*?MW3gPM8PvSp~0v{*lJoJ zoB=k7cEUzRh7l5pg|*43(6(Cf-F}BM%Ym$}bNHwG?C?;(7<1C#?|8{1#<9gT#nID3 z?I;C@IMu+XoVFkZ&IsG{PSN%!9itumoX=o~oxN~BTw1Y5+#t9g?p2s#&yx<{ye-js z-w68>zZAPVzpu7dKq6-O(YetzTjH7&#KiS+) zF}0gc_rzSwB;tN$R69;*Ryco4w|85TxzQswtH)<3V}+k2eayc!y*GGiIxlQqs&ynY zIXosd0Ui4^Zh0I$&Mx7<7+Ktr7>9Vz7;WsP=-tt|(U&6L$1KM`j&2Cu6$KB;h};o4 zfN${a4n5}eBIJdKO9;^QaWK_sU+6pB*)R}xKHeQO6pnE4i|9okjEr&+M}=S|QF3g2 z1PoUlmW_KJ+UNK-_=J;daGf*TpW)2*dFdMLP4md~AbGuTE%L2)H1V@`sP(I}{pCM{ zl=va7j`-EU$9&#HgT3}Zmbf1Py>KqIxQ$(JmXB@+1lSRcT9M0VV&H?*pTNVqZ1ZgO z8e?abm!VntdD>1@Jf%?yG-&lIRkAurc~S#c($$1Xw%Ts8bCNURGWX>DMs*WqGKWc; z*mAN#STlKzzjPAMIiSpCxu_luR;o|+w`ps-^*U#UNKc|InMtK~%qZG9GXo@<-ic_f zB@k9C%Uj=%nG-k29a}a@W|~kV3mR?-_tpK6TTwg7UR2XIwN+Jq+(1c|@D_Z+{pAvw~^UbmSipKPTsOA{9 zs=0^@ZjR+qo1vmFO(+qq4j|srAeNl0Zq8QZb8^El%G?PJ$B+Vx&CZIU^_ zh+*qGv8=OQksLwSeQqkVioa#RUHE0tTeN-7Ud12EmsAc9N=^AuQlV(A?205?CX}(I z?W07oRIx;wqU;iHP(P43svpSnRTPzx&Sv_7jy*l5q0SnsZ|HF2t0#k{kjZfI2i1eQ zmAXo3swIe^`lykT=^-Ijvt+neb%S+Lo6fyGgXgBrh&U^Z3fXr7Cd1KYWUkC&T<`?8 zYqT9UD*uGMrD5O_j1Jit^!FTGXE(VAgT?+3_;6q}sv)!p?GfYeyeoXxu|7hMd*yS) zp~^MgrVck{?P}8v-eTJgOMyKwdujH<7zY;vOX0)7LD;y(C(BImdu#);-&bO{FT@>Z zoqEFcKuVg+x~vJunZjuIUn?HF!b-~B4y--q_IUM}Giepj6|ySY?a1QI?(?&za0$tw zZvTt<>YN*T*`*|0=hfx5*EI@P;9lgo!q>?Dug^)$ix4%I8b0a%HZnfcC>ao6lD>Z4 z+If2y7tN;?uU+tK)#iCo%U30ZEm;(KFt^_~D_Mnp9e=~-ZLEWhRg~KPbcV0nxujPv z+hWVyM&l5ko_J%|@Ccd*CUm=NDE^nr|Dx}BkHswuSQ=-8e;ifjHym9M@Lw3w_fnv# zXGoZ*|KC8h_dZV#&l}D_w-3%yzB%q2gIsLxdA>%ac-KOfxrUlwaSSmLI=HHLp+2f> zZPuxu+y2$QMkQ+`mJC%O^nd#87T5GG0FiN=F$_>Va~H5rx7uX6%FGCy3~d#nTJO zYW2IuaQRMxdhBQmb|kT(pJh{hx_kb=ct&TL}>a8BP{#7r?t37(7wAdx9362*1_yHN5Nz2Ht`R#x$HE#RyNpAuYV^G9Qf7WBmB6e zo%i_{aq%Z365|8A{=~OE&1vNq8rlD5n#9DD?I^NKyM51^ZvTNdeZw5*p+Vse!A_yI zuyMjdu98EfXVmNEnd2Aa{}VruVkI&1)BGcnNBk67qyQt6^QqGJ++9**L6qW=uzj31 z@@xVj=O|O)FrLC6oyGh~I1Wv7^hIOzfH?htc$PzFTfx87`r zpFJoyI2Ib~waVPXdymCUwvh}II!E|1Y6J2l;wV$446Nw@QI&x z)lAsf>ZAn2hPc#AYyU<7*Z=W7u-e%3)KZZvqA1hbdC?M&OZga=h55}6Wog@B*P`43 zXZ$}{Jn)(@U+?k?KyiCxYVM$(K4WXpH`^APY7l3PXHXH4e-58)-O%6NT5#`uxvns; z1MW1e(67uz9Qq{acuZx2*Su}>I60#!?-y%QYgQ#K1{NFTqBkB)XKaQiPOe^+aBjPC zcEW~DxraBD&F@&#l0{il6T>e71g~F}5^y5F$A_M{!NW2-+85?~!TBMs-Z3Bb&h-RD z?q&czb|e{2B8#;ZV8VoxHF)f}9acVSeNR_neMskm`mWD&S^)enpcHTo>k0YK<`wuE zJQC<()d{x-O@XgZy*J-0>6xzO0suoix#9BQUp+;%d73ijuJ@Y2O<5^DS?juLF@$#)8SwjN{G?oHtI|#VXr>2)>YwBJ1vf@yCJ&Q?8J2@ zxpM&&*S=cPl8(ic#S9&xq+_P_GTn>hKyzzsYJO1lpxNv1&GzcAhuczqrM52o;@DhJ zMs4-`proJrypH+rclTgP`Ofa;gk6FajcpUFDK`2o%?m}J8p^q8%|){1#OJCnz5N)O7p}=8f7SE*t+mJ5Yb6iZKHQf*tj;}coxK+*XK8hFr`YlK zuv%QlmDYQ$Iqkm0OXP1Y%7&ool3!JI!aonHF4p(gA{s8V)zsW-U-ze=uBlm7e~|T? zG%9xJpou1HXuBnJ~A9#C^XL@z$#q7w4*rHpx1>Q8e2eC=rWbdRsZDRmu z!3n5*qkil@O%ldWdCm$bgdqBuAtr3%saXyqbDGE@D^P>M|w9I-`) z^@C@=Y=T2F!VLvCS>pTx&UIJd&iY0>Jq=1n{SEH2i@{&;TpXJivnX=z?mqclLUpzv zt#}zW>-XB1ng1(Ej`1zo6~ zI}Db55}KdI1e;`j*E`0|%J)Wi8Vp{sW`Eqep-Th1fvUiz#&Y+4@aw)0eNOls3B2H% z>P+zX=4IlQ9~th0OL7hqe^ z5Lz7gNo#QB>xiCjWh|_-?6sYy*W1E}xz&Q(<7=AGiIl(Mm5-Y+If4)gOu43iz4)7; zTX1aHcA#*upz}q~1wOXr(}a1&s$qxECu#Spi-(fGoE235(Tx>XBLw@uU+#CVzs*-S zD->h&y)&u({&P)+!)APOCs54!4>l#6Z{IGkn){mv+W=KQAdtRD&(=mO_Dyb4Q)Q8g zCZ3JBcBDaAI8?;CIan@sZOh>W)xTw_egj(0zk^o6-;|Lh4?Jl%-&WC=Jvl_^co<1M zd@sGd@bQ(7fCpLaQ;+TuLI1O9Gkt!)JFjfM2>Z@kG+nttzozmnOhmb0_o1W32F9|r zJ;M0_Yh?e{e-P)&t0minw}kl|HaDer!NkvA*_e!aP|?}BhHur$?uzZfb`R3xx~^0_ z?tEM&qFt$9O0jAP=(tcxYgK>XG%WfpY9%zdkl!=xTjmq4wH_onwt4r>Z{Ix}+1?=E zJE&DW=Ba0dqi~bI#w}K4gNxHO=6ZTAuSXvfApj$HEJ{2DkxTucg~B2H>Gt z&~Wp0h>#fxtlhW_>H&(gf1}H@P!G?uAq>x$-W#3;6bOrq&UJRHZ?)gn_7XI*)0BPc zw_V@m;el`vV6Mye z5Ocf5A-x_k(Unfm6W@4?Q-*!kMH~oWMs7&}$K3PxPS_erPb5Y4`{f1hMU@1V*=`8l z<9fum6j9`BFg@XsW_mr~Gt|u`*P7!+ftkDY%|gA8Df#$}X*;~BAv5a5q%ykNd}q-# zq-|ZT?d1)toDUqLMg(lAPYd51mF2MESMIm%^aUr^24?Rr3R|>mt!u%T?Dt9kE#XEq z=XxjHE07d2b2q0)B^BUtF@rdezoVz8#|5`n&KGS`ER|-)*7r2QW(_k3%=uGm!N)Xr zjeRGUXi9}<@^HCE4dYv?_UV$0-kGR@IO{@Kru{N^C--9kJqa^0d(wGvPYdF5cP@=z zdMSV2s_cBfMJMLXTlg_&OaAL{%XQkIspW5jgIAV>^<+K?z!iM=MkZg!*(YvweC8{H z`J=PVDJb!z4A?!Eq^9tKf` z@@-b@Pg%AKAkujLCLX1KPv7PtGMCHpc08w3z#OLOqiX@v<`rqF(qAq207S2EWQIkWM60(%Qj$1Gx1{1^Xz-yOD$=SxJTMk1^b&*c?X-gyjJ2ev78DNZ=la`C%T^urFCWr%KCUC zp1tRU+ePaX9h|N)Zy9$gOi^Lpp#Egd(PlYf07Uc}P>J<1;12klpVPJkD!?2t@N_9g z-(@hfFohf(t2PEDYe}$b%?^v#(oU0K;s$fT=noTy_|Qx=zi2j2aM{F+chP7s_ovBr zPRG@3{cbU|ctsGYhUATz@M5#h{QJ6A%a@207bb>W2m}UY3kcV-9F&O`ekOxtV z@S(9Ml0W72#s69ooCwaEnTL)a$*+m%&%2Mmvgl5t*`nAa(n_DioC5PO$C9bUhYJIu z&a8SLdVf)ie`X#Wdn8|r7NyTXb=g4BXwvW5XKAJSwD{!7GjYc>Cn8ShA>KQ52mJ=1 zUA`%hz|bx;Q20q0A)wCTYuHCGddlCBn<>^IoAUtK#tYk*yDT=}uzbmeV(fy_ytO$u z7cR^PulQILu{3Q}UDkso1&I#}@QKgT*F+hoU5gBlDDy53d1@!YRf6grKHIn0vrW6>L$!w)pE0qoN4@GA9hg;Zys&T2Ov%9W>Ek^)8oSQ9G>~y#bBHV% zac^EV@V;@jE3I__U0W%ry;qad1gkw+V_7xz?sVPs8<$_nufu-PzaK9f|Lpyf@F}+Z zb=jc`qkos{usuoSIBp5;LH{$>YyJw}8BM!{3K$)|2q+tGG|f@ph1#iS5&LJ29ahf% zbRZh<#7XBY6#vXZtklNkh%zH*V5v!t@%))a{T2Ihh)XV?tq^}eFWVE zKG0(I7gbKOA#IGnQ(GqZ--NX+OZ-XRGyF=~F0r0;kmb&>6x$4cWN@R;6K^0=@OK2n z_J_*^t~JojWjyv!s3H4J7Ii6bsrPF7vY=J=g;pDu6|P+Cw;*hT-=c$?6Y>vlQl@xs zp~W_De;9dV>$Lar&95C#tphn?SD4$n6#!s2(_cb%#9G0e!*9Z`hh~E+-C|Xa*pA7! z$Q|kuke_PSvUAb~wO?M0I;YoLJ+}OUI*fI99e2%jb-*0Qe+gAYdndTh^&#U^C1PPMjK)pi9)prYDy~{)(E7^o=>}%k)k2Lpee{pQC(S zUZA|(*WsuxYcToV3CK~etp=%o=j?!&6QJAsmzmmEtDf|T8sYe}wH98REtYy&Tf2FG zL%j1ch1U6=LODm=b}fl84Y?bbi68NA@xSjGH|GtX^8N`#d9!9Pu79W3Il~Oz_IvdM zaARc+d_sbTY#38p{uBXBY3#idd%A8)!wFM@OzK1FG0HCXBWf(|ApIWoOWQ?i1qDD# z>UrCEytAstojg^WL3vMqRi|k4B_vQJtp#LxyC35qr$AyR-==Sxpc=iIxL`CPr2;<- zl~#UZVYoF?e=KSOge{p|Z}(jB#%|dJ$F^krqkWNljpcX6LNm^=wc z8f8Pf)TZhZ>)zLpzRjO(dUM}Y6Yji9_^fyn_wvr`>Nn=EOuj@s$NubljsL0t)bs;i zS@6%NzL~b{uYTZN%O%n0=B?5o%5wek?r`IfzDD4Qflr7dLaueORAVWb`ZnhjIBq^* zrUiX9>o)BG5VhxwPmQ83@<~`tQM(H;ymwzK;Kr_=@}0GBuN%9_=Eew}Vg1wR)MA~Av-(Nx)@w0CWh zhJUVorXIe%puAv(Wm<3#nissrZdItU6EFItlYfNHzR>lT(|eoSh-`>2U;y@cs>TSf zJ}aqLUKo5l?$T2-cA1(jXVevnkNr&J7k&OMc=EGL@UOOHU}ZzcP+`+;c432wEVu8x z_L?vWM4h+*%bM-C+iZdGxQ|NmPH;ZzVdv(CyWx&QSNNdp4!9Ap)?OFwf_=`R)jc#$Xo7x$EHR0NbeN1aN9A5vEI2n z!(=xl``CVJn(6k(kycxBqqeNA!Vj#93i4jr?(S0%fGtngxO~7zJ4J_+EAAtYO#+Zqc^K^Sguk^!y&ri} zHv+z+*8+#8vJt`=H$}610sZ;< zCe8(u?IVlKPD-kP(2)rkMpO+vE(tdE790b{v6fqbc`s~_3d7;wg%T5YE?WP-@07Bb zPLO^juV&d0O}dnXXN=d)69en3z&%;NBxIk@=vw!8Yk!`3|L`~Mh2VGL)5#xKA7z&% zJ~I9G{n3BFPQUV~z4rA`+mCE3M76#?W6?FBGgJv*5tL> zSxL9q16c}Wo9w>P96rMkEDzH$rRy}mhL?{u_d>a==ui6^iIu(g8|s)(tAt%AE37EB zKW&=U{eDs(_FMngxP z4!Oyv`?2*C`|X2uLaQpneN&85IeS*LNOiuuTz-oh8pYPKrSB`Er8VUr1)TEv z!@sHv2D+Pyd-pOxLlSrS>Vr!f8tgW=Vxn{ zgoV-K@0+iQD46C39aG-(Nga>#fXlbL#EiIj%!l>3Oto)YW7RK6-v`)bSaa)nD8ayW%s(>CV3O4cT{ zBzT1`imMM`ME&RAA7`Nb^Q z>Wvu(R%((ni)hJBOB0jUEHuZrXRdH8YlY; z0V_{{R_a5+52k8iKQ%Pl50kBkySmE||CzlOVv`-_3rzN#tTXzoPM*Fi{W>Y(rB7B1 zZ;U;V#7M7=2t-1G9ZSZZ$9%}rQJLNUYj5gWPPseKLtNK+tXfeR_y`)glQEKFPRiC|a_+U1?vVSccG+++qbQw%%JN}p{I&94RdXCMW8In))nJ9fV zYuGTzT%&_^&y4==+%in3cMrz4-DU4={J~yXRXgzEcYc54w~ak@Kf2mW{}vI1)vp_T zYkoGyHuTrpH5XRpH}zHew7S%FQaTBiUFf#_u3}OSgGRIOD&=UI?__;LYvgKSl?=)U zN$+s{mGgQxYO|{b-00D!H(wZ`5T4*L>64J_!OKAtwr`xCE6By*Zb4y+d!a)S!3Rj9afjEklJu zkJ&sn0i!2$skln559WzVZ1+%Y19MWTEH;kMH}#XCjDLx9^p^5-n)C7ts(Ah}kz>zq zb`jmQ7fhSiSKPFQn^zM?y>q$i`HqqxRwm~zUb_6A_+I}u}_4Y4OXEuQG>(^U_Y+v=v zExYiAUCKNY1S`P=R38yGyEpuT@^FxN-t8F~rt=%;ZVcbi*8JN*EfIvp^6jXR<_hEa|6 zA+1N<5RaqFKjf{>AnC#Qc44V+u%{4eUX>#G0?=8z*7_88S}(g>wb{WURBuGad9 zr$=e5%i`bNPlYa&rePoA+pgD5uZWwf;v3y6Ry04T3~GE-y|XT`cB0X{DSaHqM;3 zSU*cJ?3_M6T{P*hdOUVov5D&{c+l6^FQAO~;E7LqSGRaDo;56?=>Gg}dGHy~gnT*G z{Q2SYy4Hugs?iTtS4=!|uUY*pv1R_-TB`QT$Bv)16@3I^rYO3NIkvLHUrnMd(8N() zwN7;I?Dx*)hC|)uvq62&rn-h|6o&Sxo zUHdw(F>X^DI!Huv%jXuG`kVhQ*D`+N{}q3&sr>Q2=$r1X^*8++YE@EcXY13lB~cAq0S>nXKIV(pI1YwklxNN3`!oe5J7DERB zA3)Bg)sQ}m`A{*i66gY$p1mTd~Q07c*S8o(mPOcs98hywrlPv5%EXrV5 zNC54Gk#fQn*?Yz%`2p65V$K4gY8DHoDwU^<(Iz0XpXMt-u4dbyA56bk3e8vBVW1hf z%SZ#(*b2qrLS3ogTRGdtOJQBmAEx?)EiLclJG!Z5_i2(SB72&7zInjlO_W zW^N+>Os%pysa}8#(G1#Ln7V+TndUk^1MG7%28?5Gm|U@w8UgL>4B?m*Llio~Bp!9a ztN;;gxB#8eTmx-X8UqxgE7j~#ouGe|&VD$O!h#N;>aOVjL)y@_q2X`4ab14P?OIyH zmD<_Hvvp3b@RmCicZzHG>Hhv+5Ami!*#vO-*%V4}+3;Ef1&~FLz&2v0^+xF;%$4y= zb`2V&ZL@ZP?G~-0?boS78*AMrMA(GKT-|n|$vf_=nU4NS<+jd?yxkqUddtc2bXLvE z_6NW3G-UoL{*_mD{Y&|~ypQLe`hEQVX#DHF`_A9%A3OXOzVEHI_!`)%EZ@}eq3S~K zXuWu-g7lvMi}7BX&T5)`BK-)6RE}8m8p^;%M#n)iBO2&D01n0j&H^@=wNGs_E*|yL zutX7~0?ceopu~n7NBmNXUajQl>1N=Mq z;&{#1x3vw;zs|S4ZSd?765}|f^lo_(>$PsBMTZt{AByV?uJc~%W_nWrwCl@dCY|8nq;uTOidrK_MB8&r}MvBJsaEz`aUpV{BmHU zD!3OhI^5AIoF%%k)dc+jjWEr4+fdDjZG`mE2C0qSS!K#8Y28$vuE78@`C-Pg z5CPg@GC&~u3eeXz%+kT@k*%F)4z9#C$z{Mf#PyC_kmp+WS-*bQtpP=D8~vMocKdY( z6?rf4P4j-`@zZz2?TYtXml*F7=M+ztZGcx5{@1VI5x!zkBqkrJR3<4SQ6+Nbldk>Fw*z#VTO2zFqE%(4t&1AKxS1ftOY!SgYfkZq2|4q(r0r?b8suX%w_ylVn>_`V78 z53!C4kGz^3m+&W*oHh}^FRLo1ZQkOTo%4s|4&^hW^o52n+ar7<3gX1_<(y!Mq8t!C4iv@0Io$(+qHbuo1p&C>0gKS6G*cZX;7<`)$U?SSXNo z2DQe{-vD)=vGoOBnupg+5w)XJA=<*KklBog=B^ipuL7Rk_Up zX0GH!#2dz4tJA%yNSlEv>nDBvR-2h?;XB!hpeR9v#S+mgvkbmqb~`svt>oMr9U5FC zc4r=(YeIp#R#Mtp1g(~T#~V+6`&zT+{jzfJSL2@xpC2k+^rE|T@w0!QhMzfnt9|?N z&-AYy^$VLFi3~~+bxHRaeUf#g%TM~a=Z?mW={W^p9i6%He+->vR8(sp#izTwhnb-} z1OY|t!ocp1t6t;U-7R)^2m0Dwh^R<+!@xAm4Ab57^5J|v>zwDTb)NsT*WSO~H4{Xa zU4dUv-9@@IEC|Q?6+*P^f-cib5i`5r!|P;p!2HfD4sqLD1FyZPC#>bNq&wOo zwLe>Q<#8?5zvtG83*S`5{b;V}_j6Zy`EOIj`4U&%$XasSq^@kqeeHOaR@Y?0SuKvf zzf8ahj)6_YmtvQZF48$P6c@=T5*_3oj?Cw*jr+kon3zK+#y_B}i3C&UiNyF5?5VIP z^i@F|`GF%7Ycc%~aY35}>QX-UKamXZ3~Te*CN~Yy>FXvbfsGNJ1&z~NE1GaE9jyn& z71CzKbKP+5c{{?&^DOpW@r?%6!k@zaqY_CvQ5we{D~za5D~-(>3{G^8o{@ZibWuj( zFy*lCg8?}s2Z?jH4XVkVm9cy}AbsGBW&LVrj!dkY6B?U0V_k${(gjiD_#0f~*elH0 zL$8uc)2nb{iMgo4@O_}CyytEVeX!*heT>t={vUuSFu)!}E<<-jPsf#oPhw<+hJ^z~ z_(YblK5c`DG7uj+dGOiDF~f7>5yQ5mO0#RSf`eK{iicXpJ{)#C=j;$>&f-C{N48~* z9!l=d94JW{kvc88EN*5TCUQ)eIpPRAM>K-KW6==zNaGYq{X$qdZRoF|EqHg>TDmP%!g~?DS9CIQMEIe!wXtI}#K})Hl^GibT<^PoTE8V( zu_>&qsKnmPpNWp-%35D&iaO64jf(yjukMml z-lq@19Y>)TTv+rw*8v1Na0qrE!~vg#d;@vFTY-7O+kwHJYVQcwVF%9f&C*{#+fdYP z(r=cZ*By~O?0M07Q+Bs4yECI9M?9?JafjyT?&eJ&b(Q`%vn!6ihS$z|Kd5=bm(6XN zKUcNy{e$az`X^7ds@S6I{QJQ?uFPVcTj6(gmi-E>Ezbj|R5n5)YQn&inlXUQNOCYtwHWCi|&f~M4eJyVG9thL;CHTH)trH}E zXx`Ey?#*eRqbctq>P)Jird4{WGuJ`$&j297-{2vbW?YcyrcUO36ts$XF>NtPsdLh+ zvJj&W4c|GFJ7&w$#2n|UqzRAL0&-8Ti=UXY9zX8r+PopdSFIWFY_TIPdd|RP(Dchu z({tzW$L6eMJBI(Jy&sT9(8oOkE#V)vrQ-W2+khNXn{%J_k|Wf9#I10`eaC|r{Q0mX z@F1)NJ&SUMGKNzi&__t(^rn5C^ za3i;99zvJ4ZiW~?2jNQaE7Oj$Ub8;>1~5U~b*p-qwR;rN0?47tb_AdOt&g~>%U>x}hIFj}nQO|6^213SCAQ8(rYeR2^_UGS?&1FCB z7sYB%f6mKJKP#&3cR92p;Zf+dxXB?8`;1jv1jWoLta6Hkegx;EFNCfp5A)ta*IF2m z$@)CN6!p2_0!4{?w4_0QxV>6xtsBu&RH~}&S6Wb&UKw3IseV_((e@4P!(@kL;mU5+ zrJh}Chc2?W$&_jwZK|@p(dnJ>`gMM|?i3(fF97W@)j;-}*@$Dd73cvrK3r!J13v0c zc^Ta?-a08isBfnP+^s@)UK`3*)pEf0vtD9a&8?~F zu5AQ#CwEY^>$*sW zDa^%>=Sg4|>KX5J!ei@gY^H%v0-G){H`(X%&93F)S%B`CZ}1=eit(a>Z)k}_*&&vZ zX;H0XF)0JbUQ4HrU7Xo6_Hb5RPWjO96XuR&O}RU4*xaT;w-zqVT)Oc6z*lqH2cf6Z z1~iO2lk#i0D^4`r2LF|nT8?QAw^@) zk7~_^nUj|Qjf4c)j0JX`t>@rrKI<$wOBvGcHMxn#T!>R{iaKS zfaN?q#X-mKcmJY9`nq`0zF;KN>yJC@8yANJ@}dBc&*9fV$HOSVCn1Y~9{K_R6#qQ< z2vHJ@g-il224sR)d%uD3uJ`^0)+P&5liPi_bF}zt-P7j8@*lOpVourQpG$u}{Q2PP z%HNW28GmU-=gWtenQL6Nh?cm<427kZqyJgMwlAtZ=@mB~gUZ^<@H`2a`cZ|UZdQNq zL;re7Cwo(QWJVND!}}L^RYa*n4M_TEtd-eu+o=j)ERY|549lunjb z)&x)3E~N zTba_1+k3tyKAjdvv;OiV~znLI0QaH=WtUHbNj zrx{t%>-*n{kLY(Q>2<<_e%Sa0X-DH{W@aY;lZ8)B7!;E_V1O!VM4CN%Ytmd{Ni>-; zJhTH-%>MwXVmkqR#=t-pW1KIaRqSr$p?!_~#h?n_DCA{61vgjFgu{jw601T%%>AL! z!j900sK$u5u^rJL`*PZWL`OnY~H}Dd~zitz7w6@m!KUth*bJz23MAz4@2c4tZ_O`EV!HFj{ z-|2Jkse5DFzM6~MH`&It|KnQRIws(6%Y<@e7m=+72=2FMCviRWHhlwj0xy&FNT{MS z!|3e!!u9N*91eXEWj|p6rUnIu$zUqLL}0i_+|$?ds(iR(G@h2tslrKJtgZXf|}>mNEP#``9+VXbzL z`jNsU&Ft!I>esx!shl3{cjw6$0-}f|qnPpxn|W*nq-|752Qq z+);gpAD5?tZpj+`Gvsf)Z{!5eX89AxPuWT909mbtDRCQmx)!Ntbd8p7>)>?s`B7T0 z)<108QGc`^*iuka-u0yRXm?xFOCz)^#kE)A3^LW5;bV;FupozlVD>=B0l+~D1)4-z z01GDdBnd7?fx^g%ccR|+XT_%sE=jSC(5E)!B&6m}3{6o_ z&P!f2bzmZKiZd3On;ug&#ufc>Xh>8ajX;o-Zl{jv7l9xpSON{<%^oiQvuhl4v)x2_ zX3QXs(PQwDrupbKmj1{dTOFd^)rj2dYeO#wiSP-iHRQ8|6h;MYJjc!H&r1~^7uX|? zN1@|qC4WzO-+y=i=jn;*+xxG`n3wXXe|*y7l!J*MVst6uuzCH@i@v97_}@|=ayFz~ zq5e$#gk2b8hMp7|08~z2R~#kVx*iWTq+uF$Ur}j#5Z0xSCqFe_q(d#AS$`czIhlcS zwhG4P{=vKX6X@EIVs4N>N2uXz!gq&Y;)Ef9q@TRR#B1EF_?hf~qkl0$VFsq3U(C9} zPGn~=2QkkxQz^$;byz0j6ml>T3~|Ex`vQRnW}K^4HQu;WoTS>_Hm~by>&&);9pcs# z($i5#+y$&VHRH|EP{m<%j8a>1PQ$YeB4chD+3@6$Av(_5#9#f&` zfoYv%ooTUNpueOzq1JT36jz$_I(T&->%z<1$})?G{igg1FMt(wd`bHm_3eJqwXakD zxIW8EAAX9ix&HZA^Ou70lE1&=dLI6z8wZw8b6%*G0XkckA!jSL6DJwZGDbRKoHp+d z-ok*0KL-fsgu#nwN!VJVhHND9=)=g@84>tH%y2lLzS*xLR#_Xd675ICBUw9eZOhX@ zcP-GZtC($hUKVW_TlPZxprl;;uB=IouXvx|9K!(5-|oHB2Fn zb~kfHuuqXW1Xt1l#_axYd3y(>hYue7C~o?wqy5SzL}hH9ydtw?k}C7<`2HDLqqF;k z4NpjzFeD`=e9-ksuB7!fhCbg2k^sd(jSB;^oxjSh)0CxMX%)U4j)Lx z3Hi84_Hx)QDm{3H*xz*t`@kwhzAF8k}aV{#G&C999G0arSW${Hgl2z z37kcK23zTKQzQW~W+K1@(+4JlPx~GPnZBhSgKxF{taqEK$oWJ&+luOLG3F|!>qkpF zv^&IyHK*DuHPZG&y)m75eWCQG{;$f^+o|>R9578&j&gYwr-E~OzCq%9hoZjdMibZd zUZKxZ8(0Wc6LYGPNRRHGO&!>~ir&vWja6Wu&${HPVzK=oPPg|HE5qGMZM4PVxCRyE zS@(EfZ)dahO3O1{Nz=vdU(LDF&X%^exvhhnWNo>PlR5@9DZ9Y!X4&5^j&iEvfIO+E zu8W}iuWO3sgzTkbK{wJnNqaE(O?MkKPoDyQXW)XQrZvF(RwMY6qZPj21wl8tKA}&$ z$jFiQGKkNxGx$V3y>FM%o65Qf+Gj0(>4zFyYe&hs#sj~$H&hq?Q-A)){JN(88 zBOB^|7qty4%al24;xx}1v1Vb*1{b6K1Yo4382VRp1bM~o#+?Rir;|}z`J0G2q8D_N z@Dw*UWV1-Ys|)|hi;qO}mPDUtACCD#dlDtayF)j@uk#`T)eN>BN&Kyy0b457xT{-M z>Ce;|l^3f&NG?|V>L@I!XlebkqH$F*tiG%)zy5n|Tr;+%s{LRWu`919AX{Nh?RoAl z(7y1(efl`%+bX8(GTMGMU0JE*Oy>s zh1QGK2yY2J{51jur<6ygFXgxhS{4~KkZ}`4puG1S!x5}I;cPtzq}K5K*L!BT6iU5~ zE*)x(7spvIw_kP66^{j+kjYV*n$P4A%UWi!H=q3&vW~M0)5GJCRHE^Wl~IEP_PElB zw!XRVb5dN)s}xGixRiHMtC9{zz>+S9uS%L8zCKwPwls+*RL5`Ubw%%DUJn;i>v#;D ziF_1N1Xs8V{L3uO_9{cZX>%{mnA`JH7oxbUb<3K24=F=UVSTwljxpQ$#NOuk=wD{7 zff9{C)FD$NmSz7#g!_q%Y>19K3hCmHz`f#U5x#L%gnV{9`6SCl{l)BJer7#q|I1d< zVa)fWA5HeoK&zMusaCbGl3+!!M4GxvpqWWn^Q?e~iUb}m0#9BZwdKR=T zCIwa)vk{_*A%Y39T3~*RDY!c7azGop+?U9E?;|mv`*st{Jcr;)=U)Fi>mKVt13=fN zp4yYH7%r!Fz7R{B|7m$xKcaqLU9kF4!;Z?v=2PXL+NV?#JF}aXb$#g=BCVI*QuNJf z>b0h?y#bfbFdul$EI=S_3E0EdaX5m-fZJ)>h+Av?2lw5Og@2@$a$mRU>6XEgbseV8CvsRPzc;xv z(sEZ8?^>+R^uToId|Qn(!5eK1RJP|Z9s(*Sry>*SmDnrHZ~~YWk6*&PhLzKz(GzHs zP@kxy(E&0VJBftEl@V59=iyZtDb|5>AoD=$!0+4{o>@kY`FGFG-e$#Y^>OLvZfxg9 z<;k`+(wJ7gxL+%x^FT|U>`AM(XSaBbZlOF)e^>okhcwJG;BEJf?d~kgGQd9$8T^Ug zfcHVgZrJ>^dX`U-$hijj4YFAV@P_WRd6o4 zE%aO5k5Ec{YS@Q_#&B=KgovMU`B6*bA<>Muny6DzJENGQc@Y zeebRGSRox?7ycpgEPVjxCA*ox;rhsz*w<)rtZ~da%mK_-jA8UzdJ$<0%|igvw_%eg zi!cZ9=V7zp)q$~qM%!G^H+7TsQCFt^P{ZABefb}G#m^00v@avtpM9O*Zu@z@^Kwan z99_%Q&1n8@yVsWKJ=66Cv_bX*VU{n&H>+RK`R2R)o9;7VV?m|i{g7SZaI8G^FR?{f zOBoqrqu=8sF-!~qwS#IVZKUoY_M;5J72tNF)bKPntt+hlT$5EjpyopLw7PjUInCzkAMIajqokqr=agX$I(2%}8N>bdSXZd5 z8$7VP4gE=rCT=l)BG0rGQdc`um=T_Dta;vgc9W-)mFSkSknR|6r8kHBKR=Q&3ZNnI zArCNLz>}d;@M-@|@EGSw@IFf(;F{rv_lx#FS5nVs$7I=k*Q`#0=eYQ+7u2~SAnYmv zN+mtuQL^d4iwZ}uNc}X(G#vz$y7xkR0Vm);AUBXp5FZeeP+Zt1^ck=R)dmzGLj&ia zul+Lk*gbd*K5@2D?TD3auEcQ$Jsm-Cfr0 zkRDZz?16f2(Vmnk5<^OX~H z%QWu{6~^J#t?oxYHF$RL3}Ov14)YK(h_oMfgSvy7LdS6kwEaQ@O&R$g>s8EO?vJGV zA)#rBf)D96{1a&#IsZ#Yr%Pg9;Q0}&U<(EL!Dr03UJ3S<(*%-R{_%{}J#-J~skEPv zH`^yFCOI)`avwxRXKT>Ewx~^ejQwowrl5O>brP6k??IJ$uae3Erx~wdlX$ZUm%|zv zZIKK4XCto)$3`v?YNEnJ0?`$$r;z~u^jLZbJgSk84fk_vL+Th;8EA?Gi^Z(~W1)GT z7oO%m&eieWbW@e`eD7U}Ts^#VKu`ZJVmCoLR#h#XrPNFB%9l$W5{;};dO&kY@jvsH z9<}?J&J8r1?;^K5W%zZzL9|c7hm55`G`%r6oWTGbV9x~{;Fbfn@Wz3E^8KI){xk3m zz7MjKy9TVFvLM^>_d(gHY*GqCr* zcu;S)BvgA+X3;*-^fR3{-f;Zuxan^ObitWmKE50FlG2TeWk@koXed%DbqG0PvM^Fi8le`GL9W6iQ1+l6;NC(kuzP`p;2UnH_p+rgfU2b{e<>|3M#<0$QLDH3 zW#g@)$@MWsA8VV6A{##!-EJ2DdD}kZud(Ao$v9Bw7*H0uTMIs1)w z3iH182Oh4zfP~2Df&FdymbUsMz5T0ptB#Z`QGP42sPvVV?kjbzijev?>6wNl9q7g= z@%pxhGLqtlVwcvVxobIZt`EF$yy)v+K14bK&Zb77nY2>U5hj~LXMLmKSR?2V?rQcM z{zvv>{!Pw)UMhDMcMNM0eKI2p=VH7@oT2I9e*VDUQ{qb7QQ)bUuYT+##zjbps%4xaiRG2 z$dk~AAf=P->~B??Gqlsyht!qwnYs+s4BhVTc*7g@BEuKW{yrsrsvT$$c;}klgFaev zP%AuE{4LO9>Kk-En@-LbWY8_bPqgb{RL0dX4zpJ@gdG|x<`j$Wa)*SC7ETt#3Yz)b zLZ*cwLs~^+Sa8upIx!@Xno0BE=i>LF_ksEWv;8!0qZ4L3VR~x_=wb}4-oN@d4Om;R z`>Z~y_w*=@2Q(8b9lhnor@e2@lg%d#4;-5fIsQk62f#?f2kBEAlp*_oDw((CE72n(RNC4ueZEwt~{f)x%ptl z>zYr$iDeN5yMOQdvZ}EAeQd#jxBET}dwuSu_a!PH{YLS)|Hr%swvX@cXMa0z7xuII z=8nJe+bK1NALTdwc$qIIe10nD6|U`xE8l7KHDuT$I!nA4l`_!Yo(Zr>-Enl6Whi#H zB?MmM79pPd(qJ(6K%mH94!q&mWS7|5wKTg|S)jWj{-U>azBAamD)g0I3)Euq@a`Rw z-^x9*1)UkCJ$Y*RWCXFw_-4X1k zxWZI)O_Yy)EFqbbnshh>o4P6-)!!V-ObCfci_?V5V+V*VQT6P6(FJNXkB0ril7hjs z!2udM&3}zJ)tifb>?%RyJa6y|y~hbmfSbTUSV>6~Ba_2d3Q3_2k);Xn)Zb~FGwj)= zgHndM2frJ;egr1>^a%De(eQuf-5Oakf9)vX;;W+;ELk$LXh~m!aH(bJ^ab4mw$Fc? zabWt`G)vB(q`JZPV|FDU7p8~|^c-deQGth}ejsw7OTl#z9$+HO8CU|Z2DYLC@YOgq z<{qJhc$(HoNN3AP;LroK?!Nbnj!y`^m2@xmpEPddgOv7YbH5=;s??Bv?~@as!Pro@+9ff;9YV54jvW(9^@1R(*@k>cg}DESiAD8)y)K+)25Sen{dDAl)iNaxqB?}F8Q?O0zM+VZ+=L*=y6*pfGYyZ-$C zNhrGWWx^Ncr_{IS-@=}OUsvBZePG-l`+mdCviJ9|9r{>yeZ#wDS5LmXac$qnZ8t)` z&b#^X`?I^P1!?*C@4%PCiVl97`e(rR<7G$x*eX|6tgUXUeP2s#+12Nzzu1VEgtU4U z(w1fFQyqPyw)mzoyDeKE({~1V)}Czm)e$f(lV_TbD#HyXrL0#h2~{DxEYkBGOT}$% z70tOF`Hj!odK;tL`?YGCPPQEE$QOSSAMFU27KszOhbW>I|Egx|!u4!>wKdGO)^*6= z5WER|2Acz5A?jcexI-v8{yauN(xUfM#}Ec`MiG?UpJXqOPk+k2!?JK1d5?Mja8kHe z>8DtKiP7{8NG7oxP=k6A5W|;ukI%6jmpHHY)M4d(U!{gx`uBZbL!7FH&qR5SXr&D z$*Tg^{HnNF9w<3hR#ft+bazQw)q*NK>xFayV5Yjy$-*mJ=B{oM!?cr<1X21PC+t)lN`Eo7ImuQBfmCG246YsT7`EY_!l zLgwV8I;J3D8g+jHi*zIQAg)%#hIR060cNsq`-hUwxwsgRQ;+yycfoRpVSe6?l10#V^U{GJ8kq-w`cSN{Fq!C3VgBOMQ(W%GWmg%fB~zYrnScZ7A)i zZ#gen&>5mQE*JE)spt0oYk6n_crQ7G{^c$XxWc~+))LG^JHboP(J%#SItmASiOK-H zL(C1DVf?@ZaKFGPASnn76aoGQXZrvFnd6e{w_WSdnQ$hI?vef?zXG;M~k!V&~*Z>en=uqLuzhQ9$`26A;s68;Eba^U!a4<|23W24Na= zHZ;Mt06NSc@ZI;G3XX(~22DjS0p_BQA?DK#VN9HX#6iN*6mG;x+Ps)AoJ)P2kITvU zu<0o?BEnMNhR3Jmgsn^196mnoVC36KZbYK+oA4%ksSv^t37(TxAv&B}_!oPIw+GS4 z55VWLQ=mZF46ufJ1=@nY3i(3%AL=V*9=4Y5Bb4wy(AV+08Abt-hYP7t@#F2axiS&ydp~ zn*ziA+uZNmiRN%?PB&UBmrPZTX(|xUs9W5TSFxkzYRTP(Y2`y3w^yaM7SzoWo0^-X z2ivHs$zAb16BKauR*gtMS=VS7Ye}|_c29Pm@Dw;h0!R8fh~d6!#A&|(_1Bk*ndx_+ zg8pXwk>i=%O&yMhJ3ND$=wNPrFAWC$8>4BE{i#`v*L%!l&<{l5-C-C zKt9T_RPoc4+4Dcgm7cZk=RI4!VVYIJWBMUrnB^pNoLh+;6<}j-0K&1)gO!-offNin zU_rihF9Dx(?*}~e!u(e}VXmMLYOf9`jgNq8-4jTR1`XTV{Rj$BZig1i2SE2JlOYqk zFTxh-U%^tWE?AqLk67f+f|j}eK(c+skPpFuh<1n?H6J+;!A9kyqVNdB27D!QA!$7- zll%srL*&D9ND|O0;t{}mTvG58#^}|>U)NPh7wB75L#-WJu`|qc&Z~8P4mkZSz$@VO5HCs$UxQCUlgWdz zTA~U^Ax1+n;41GIYLT+RIAx~nK5*io|yn?v~*Gd0_wldye zMldy)|5$m1S6nG=2sf@zlc;6TS%+D53?mcGtYpbp+3cB|S8NoU$LVA(;vHrm4yonY zghPdcL+1!TicW=yg#Uzq1XtK>ZUt)u>o~K6CZirBP9xt&O(M#n|KdDB8TOoaJTAdG zoaD4a2`A0#iGTES3B{T!>@n3@{ON84dRsRb!_#JA=JZw~h1#>IM$JaFP?wEeX`YR5 zx6Q)myAyB`{>SJ~!Cd$?K?e7a{+mM97ucTWC494oSs)hvy=Z@WC)% zpK`Sy7z2D0JO%g}fCq*L#`@2AjqVt4yyK2rVy4@Gy+Pv=)pgx^d0y{fIa{BsEH*TC zM;jY@jK*JTuC=-s>cHuzyP^&E{7_4XM`>E)u~~n*#n$6)mvxsf(>5cJZo3zJW;X{% zI=TRfj@IBG`wkD$VaOUa2BoT`y;V0BsVpEkq3c{;`x(PjS>Z&jTsJEL7* zHN{d~Yj<31Q~5OV0^lv}HrVezua(h#5giBG-PcAMjjhJSVn*RD$aw5T*a}oGG#Ppo z$OZla%<;_t%yA75?y=19z0$Ef-I^SiTlw8STsF$SUsmPvNfvk;J7;;#lgW_!ZQ-$yxMk zDGu7{1TFPlawl_g>_JAMNJp&;7152n-{jTwLxjCl1Fo8=LRX?U!HH-p>@=dUQy%sO z{1(w4f=6Y7z{t$t0q83)4Vvd&4&Lsa2C@1Up@g6($fv=b*nfea$)_L-s87Ke>^PW1 zcn^^iK|>!6KZ;6<>AmI{ydqtaU&8NP%l;FPU&FCq;m9XimBanQV8I;pC7Id{M5%9B% z4hWZB4o0dX1G9T-f+MwmgCBeU^^5clPpeU9xuqLt-C&N@*tO*vnQo!7Kz&Ie>vnaI z(VW*-t4~_uwFv8!o>s@~?j_Dbd5WDcIpdt$skh#2nPNTEB(Z#N*kYE}eKqN72N;v9 z+l~0@Uxr`R(fVICoAd|kKWWD`d{O^y`Kr1pmMP!K6QxtSPe`Zho=VZ?L9%Dg7qaR8 z6*3w~BL4-CRkQFwZ6}Fg{ExNTk`OZ8wnRAAcPMI>|7Ii&fQ+~fEeSsX87WGDiUmoq z0=^wGgYyD5mNNkn!3lxYGQL8dQ@p?h_y{luM}-{2Xu$_j2xva~C0K%97kr1(`QtI~ z1NC@e;2hy}a13b~D4p60^ibP@i#2VVwJdJIts2b@WE=SIXKx&1w`efc$}Z1euRm1_%Xz^{E3- zJ$m<2=N)sICBHY<(A=}XH(a$(EmdTz<|zAk+OonPnf!#hNcl_KqRP|F?rG7@)O*dV zjg3~SxzL(v`{7(`3}Qq#2SSsp0pp}UeB;D?+m43SR(I_>b4j_ynEn@M8ua_HzM!x~H|i(V z5LI-+P+v5%cjnJEy}Dw*`cUb6)yDFCnWN&b@>rckNolB3ENHx_T+#fbr=oq4CSP(u zw^e@6zFeblI(uJucN!LXUmD`Qedj7yv{C3hZvxmGP0t-~EmvFs%U@@L>0j?Ui`_HJ zblv~R{0ER=dI`N{z6)P$*#%o@4I;H}G)(4BgN^V%!X|;oVJAY4kWlC<%4XadS|jNW zD}+9nl}CHSbudox5uE+P*&!E1A3|jz$0LxU)R=VwYAl^ki5|r(3E#}k7j0uK;(eoo zd3~N2o{RE~^@du`4kcq*mvBDXH|$Ls45Om%MxiOY5&dbmAy24Vp?_#PNIGpY{3SgC zeVR3$@REIlbcHj7hTyH`yyq8jvHVTr7ZX%9wT_NA{tY&5fh+H5*8UlyD4d){O(Kw_b<}hk|3=^r1Mk8lN+fWVB z0<=8x4DN1JHhz1!iF_}dN!5j4qmCB_=rvpqeLIsxy+_QVti-~|LS!aZ2;!mt_;12_ zZU@9`^Mhs^R|0nFs(mSHx~EPx-*I12Y?I6XwaDcMOkR1kp;k`mWy`TWT?&ZOtU}Ar zbq~Ge}x~@0;5r3~= z-!Z9fS?h`VIW3=?2Da2UooXD?I=<;++pMPij_r;8q*v+(s^InI>Zdj94Wb&F=~2yY zb5z|g3#S2VB{$x-{A&7XDQRo7ycJKg4v?O(E?2y=_V4CdFRO=||Iv7j8tq|Ygm$Y@ zrUe^j=%WpPj5m$sIxgt>8=73(N$N9pjD@7}d=qV0h=?{z2&FX&`l8{2NrXy~0&5Um zNBj*t25S{DA-@GHz=zqBxnPiA;9uuwcy{=+okxS$oU6el zuHDdw9tmPza06xw;4E$hXeem|SV$8<#O(FZAKWj<`GT$J%c24I3F*6uK*Rpr|ua%h!jQxNX7~4u&IUZleFCnJJx=$3!Qg33n75g8PF# zfLVa)K)ca9P%X&g7!>*tCI>SZOTx#Yx03#%UeHFM|1$3&=dq?>R&$fk3Jw8R!kLYW zX0O7(=Q{8|IaJax{%GpkkO#CfUM1xl=NP4&eVxc-=3$IfDJ+T97Hq++cM}lGKHu1F z!_+{92IN|#$*|t*DbUaFS*X^kSEw2_Fh#bGtC*pkD8u$vNGf~b5{Rx#QrmmAYm^Zp zyK2em^HK8^Sf{$1?^1SebMw2k-W5G4A58lofHow0ALw1~rKanSHj~ga!4zdIH$TwZ z`;G`0Q-%Jz$*4=SeAPX%qjdM2!}VKTP9wqtGk1D#8PE8N4bKA#!yVvb{RQB3>m*3D zQv<%|JqTL}+=l7|??x>~6l2a~rC1qhHhwd`6PLwtV=r@_W13jgP&ZijQG;2}&;!^3 zR6DB;(Z+g)_{t=}FTLdw9 zo^b(Ix}RNIwG;2|ELKafgDJ5wC)k zp!dMnzOP`1(*|v@QQ!ki^-zIf6f{|X7k*WnhdifEKwZ`?ML*M5B5RCAh^Ll4$X(_b zSczpO^r9^f^32u_YHTDO=J@yL$u=RmgV1DVzH5%;;jhn1o(_c%c`AOfN@xlbN zb?C3#_vyKgGkS@YVc^;xnBSQPS*Mwz9YizFb5LLFLF?ChrCOA`Nwdz0*G;m+4ga$o zH-0ouHwg{JMwfnzZn?HYr`LYyRjH3^)v5xGTQ#%$oYEp6uQ(uiq}V7flRfF^k(?FJ zmY6zEb-nDgNt!wWl2aXeS+Mno(%%x>Grwh+7S{S(|E(p?$ZZLl`?uve@;k?PGE^47 zTvHG@Wm*K-WV;6x+w;LMJky|ZzXP@m=t7o5($U9Z30N1r5UWPEW4Kr`b}>PUy+xjn z`AMCOUP{kJ&STIKqbSFq6_g;1MexBUVRDgk(I}J-@eT0|QHpHrb5p#7FGI&7PGPL@ zci7V?4c?2|L3oP!k9-;ToN^V9rn<4klry-s)SpBK<2CUnJ&DR<&Y=xwcF`s>LChn} zDV#Zs4}x}jiEttLS@<2|%;@2S`Egi$QA{~{ax@kBCAt%SNmvS4Ed&GVLly<9IRw9y zebaxB_0(U-iVlRaC;4sceE&qw%RmmZUyx3H0lYyO4|_uvApQ8`NHC!Yor+tA-HJJg zXJT#>He$V`0zw)sg;Yd8NnONhVhXr#nJ>BXShM-lI41=UnO1%#qaQzo;o(+L&$IWE zqZmWTpDBNdY!aDl#c!f4z%HSzL}f7js5dkKLPG0+2WbXaAt@h{O0q*P5K17oa0{Ro zYzH(AyASpWbpqOm{2%ldVm{;~!Vmff6#*6?alljX9e{rzt--CqUVo+UtN(}VlJ}O~ z?ToNvoIQqDwr-8x3R6W|Zb%jzH60B7)0RRFs#&T=)M8beD|g8!Rybshr5j{}%E!py zRRiTqD(A^+Ds0j%)t##HTCcjYafj}D+a434v&o#Rcxg}S8SI#-AMU(vRXN+8Z(Qfx z>s+I~D_zt5|GAU=0#~npuIopj#tjItJR|)pJWG65_ew9@_1%?cUv4>PZZ+nc*J^j0 z4yfK6b}RlhJd$iO-0fUvJlc88{I09VvP-(t_DO1TX3FKBSIPx}0@Y=}5DgfVr0;_K z(w~R681e7|^B6>^wHfiqu?&63`2{`My&H@1SK|i;_TVlAuVAM`Qg8*ZbC@PLA9W1b z2rojcf#47e0T{#z{~lzde=dsV+k-^W3OXgGw7Y5-qGt?GLg74RNh4xEi#1!5t800v>M z0>%*nK`6N*c(yOnvxO=EPNG}@Ehp^*A0rh(g@iKLd@K~1hQ5MEBX?mu$U^Kh6buuF z&P49UenL#czK1_Tp>X__^yZmU zeB+EMUZk;k(EBRx4$mIm&!zo+82aSTW2Hsz~eIuME*{?m5(rRL3e?)DeBW zw_y^Up{8q_`Gk~juT-c!EpoRHuG$7-b+^DwJw}vNi@{EJx0J{r3iS8mmztyZ#*d(&O1(;$>3v4$u+2h_-f=j z)L5jckJvH|PDe`Nf8lDF8wQ7o;2)q*;c1|^uuJ}E7$NW+anZXNe%&1ld*dmGsyyMa zE)NL)*jo>``SVeyffq2@kW1KykOkOO_);te8G#E&IQw{iZ3GWuGNBrdAuNP`!d!;1 zG2?*W5Zd4)c%FYDd}QD>;$rX?a!e47i~xtD*MZBC520U?!;u{*2sRllB2rNa)HUc9 z`T}eQ3x)fKvzB0Iw-Dm^eZV%su|BsInfRhFt$0H;9A7Hb;16=z(IeP9(baS*@;cE1 zb7M`Ak4P(cHv|n11%g3`0~U6&|MtVwmSV5K$0CvD?qWz-}>7Q9%SnknZm8?(UxM znQwl;yKB97*L`Q7efQa0dB=k>v|GVAOH^lGCu2BTyA|1V}N|)b0N+hi` zZ?`N)Y`mQdT-lyFw;VWWu=s1tdU5YKYgTP^cGh+rIE$Mwn=6`)!1}@lb0ax^ zykFd-yg9%!-yV1a00v2ceuG3IDWFp5AfOEPAHNte&8rtMn5gJ1Jr;IH z846{gcsM0=5JnkUf%%IpL_I;EQToX5=pMoUvJdqSnTWd%=in^hVIpoYW%1Y0Qo>QV zv@{&fk(NUw$^M6Ql3T%ClPBQ4grQXR}5d7qii;?BFL{7^N z36;ns;3cG&vBxC>(4GVZVMF1LA0vrQ9ws$S{vb-s07;hfF(mHdWzx_Jo%ChxCyBmIqI@K}Q&xyI#Br(| z={3!2H;tmQb&d9AD~>v~ahz7Vxkw{!d}GdUC~_WdMRK59DBkxS2=5yymwS^e$9Y9D zV5`ya%J`W$gvI17dlJ_l#uHle@J3E)tqH25k!9t47{ z@%?}Uyg0rwkHf5GCDDahwTwCzn?A)VWO%>{ns+<>(5ZbRika6~d>5h;&2 zhn__VV-Mq)Sbw1+%q1}oEQ#I; z&$;eg1_#EeVC!&-*u~5sfkL8@`j2*yJWe(dOoHFvgl}!G=WbkH6JBL4Z7uT`naeT@ z_Df2$k;}6)&sK+~?`{mw{MquFV{Iblpj#qyKQ`)S%+?>z6s*V3A=ZHl@vEUr87q`k z{?e~??DCOK^`&OPBqVAlW#!K9_{v|>r`2gn*4iQ3+x5o`kfvpEze#?`~tm4E55D7KyY9otN6#$KgaV)_^oXfrkw`Ir3;k;5^Dr*mYX9{dH!ZBQk+7Mcb!MqC9k z;aYq!qMOZ!+A@lu;nW#OJV_U{uv5X`yRE|mZ8@_QHhA>nHBrXljRE?{tq-)t?J$}P zkx%g>k_9}=r5zLEk)4g*%B>$e%nkIm@uuUp!$#D0*}BB`n>G8*iFM%S>rKZ^+@{w? z{KoS7=mur|(Ynt1&6S?jm1T?7%0=7d*;&m+!|BWO3e#!}p%bd}zzN_yeR6!^!o;7obpu2PmBrzNU0k+)@QixTYi~siBCLd@XxPGF!S_@{Qyf=?H?O zY>YTqCPw6$G#o!7@eeaB7J_mR`+;~TvI#R2`3GGQ`T`LbItH=E&x4k6FMvnzqkIxZ zf%_8ukNW^##U?`r*><3O)-m7?o5s7yp5>reDXbl4BvXO;n9)E_p@q-~sl)X9Br>&c zhe-98Lt)L*RcR59i$ss%-jOe9W{9d|n@@3y6>2HR0Iz|H{u#dbV{ zyY+>!xc!&;cPozhc-xnizs+Sm+CIQ35QKH7?mXch*mdA`5qr5#)I)$l>I|Tto(Hn$ z@F8@rA2fvD1S10GV4w>H?t$@2241kZm#`nZB`GP9Kn?oD&!Dt450J#F#kB|htLS6)$ zq79&~=vHVfItDI?iAG|OM^QK7dT0!E9<>UUL_Y$nqrL$b5jmhwC>4l1`VUMF^9K0_ zOThMHpWsq($M8Ma3XxN|4zX-ph`1JZf`Gvli&vq@V$TudA{f|7k)IGlk%N#V;k%H7 z!eE%X&s;4Q>e zelGkqUl-QFy$+4w>O9S+?|OdOGbbC7k9< zQlviIZ6<%+!I7JmcSw|N0#Rhwk2tlnx;?jhck?r8WBn@;wt9^CYx&pC;u3o! zb#ZdldU1EzWNB>S@#6E@g@x-gT??br84HHfYKv=AYYT1D9~Zw&moGU_%`N|(u~@gA zy}L=6jo*%1cuR_0)TNoNykd!OzJ&f=!vsrUwP3%od(qZH zmv9OADxm^AOE@1dB>EiJDH4w*(U`_(m>C?P4S~%wmErK&Zf5~j7C9}%uY<4Z<410-g%I#!i@tRm2fES!@&{jGAooSSf~tfs0)Gfa0*>Jy@q}?PybR1dmxO#TKsZ{!SZF_(3H}3Rg63ei zKtYHzpu@;$;AvD6fQ;hv|6qFf7MM9641JsT8g0odL_)bN#4@K7d6cV)kQaE^ire+%xoXkg|tXk+I>v4 zBF^oW?)q)d5^-Av#IVg@yNVmWJC$pxn^~*4^{*@J)o-iVmFCsOMccJQOBXiOmrXav zmk(@>u0GvXS*Prbu9p+LHtfmio92`|yBz9o;(lr*Wr|uurBhB*oyd}OM>39qqC8?; zqEs+bXfK$B0^X>fd5uxcZlD>kOK2Ue=k#hOgzm*SOykob)RXjik{G>*q{l#!c9_N_ zF-|@S%soKz;ol?2gB&T+kOMS7cnzZ;$zuFNc(eB)T{${P66Y%75x)>w3A95UgFHq{ z3ubb*5KgEDlsL);vlkhFxd%Ut<-tv`3(z|lUC2C|1-gx10$8ID@{>?^xHYKz+z;>o zjy$xQJqLNp=>j=$l0hu43^0r<;(MCxFpU#ehcR-K%A2UaAN-igtLVJ|2UG| zTFysy3il8DHGhtM78uI42S4JwK>C1lkY(@`^e|)!Hd>c}O$L z8wkVX3jTg8d>%RwB#jdTQ?N=fF`)&Rhj0)4l*kx@BNC5N7d?j)5#PXb#dL)n#qxwb z#BYl>h%1X-5xXgIUED`XLfl5uR8(JbMPyZg%F+m5g^v?fg^~%Of*N-ayG&?BS`c<% zDPoTxbm2>&Ib5*doeTJn;2!)guouS;RK@%TWD9O=Bxq3X7fL7RB1Mw(kqlx>2%Ku* zWFiA6*iAC!9Vw3*yo;yD?+h_iw>6o5+cV7nw&R(=?Q@K?+g9}dcH3w;L8_4q8Bh18 zDAR9Izt9HhCG^*HOS&*4h91T^OgE;#qV>`9X#eO_f?aN*D%0LjcBy(~F#SF88GUKz zFw!E=H7@eLtM{8n%m?+kd2 z_XixvjREzu3jjQhGT;g4Do=#t$T`okWs%sY8Oj`ex;NK~=D;(d1@X_*TKRZ-IS;}( z4D4dMgN`xZK}6YCkhi!ZNIkAAN`wCZN#fjuOZ8zJMa#$A#?_`0*nI@x$gjWoTq?Fwk5!s)z16D66KNDU$`D@ISzq; zoZA3Y76^`5VT z`pGLoDg#)^bD%-gaZoZU3=)V^hh0Ku!rI|h2nED#I0TME_`?q%jr*Ne@k!i?pDvzzTLE?)5P~nAhP)KF{CkYHDa-w)26@BGo17!e zMYcKXF}sEp%-m$PFt*scG!?chZJ70mevJKt?#eD=E_1#zzjJuZHm);!n7_b&0vzE! zg*@eLLK*?#utMN*xFL8Qp$|EX8i4FUzkugrHjziL8yGR%W1%Wsf+!kiECIrPmJY$L z%WPul(r0m|l1*3@f++T@$Z52)kSi(#w+G2V2O*b{Pm#8;B)BYW9dQV1h0uV+!^c5h z2n2uxujbkzO4ul*B6|q+ixq^v#M(d^a)Qw}xvx-AexCrn0gzRoM~GX{0mNB&4?+g{ z0O^H_M~)yB5pgJSxI9`2mV@F#6i~k4mxw>WNcan2Ez}&q5}e4VpxeAff$~cMkjdJ| z*JhD;XPCEnTt*`|j$zBqrQc@1q4~2isp8Cc)O+*=>TTK#Vg519wq?^#FKiR?7iAC3)Ml0U)v2GC=D0)Ap8fpP5n(5IYP zxG(n*au0781>lXLn>aR@=j`X`OY8;IZT3aveRc(Wi2Vnq&G`+v!`lHB04qQ!s1#TU z@d;FeTmpVaHvsY2M?ePl2=FETC~!e22Gl1k1BQu0!GA^BV7|yQcvOS~ek4)`6%}zq z7z>#p)$tEdwgRq!hM7VA#URj%n2V@jbQtmjk_PvOFGACyaELlM5L60i0|fFq`F}Zy z0!@1wFNrD1OJRNC9bp%9nd}-)JU5Q>oX6*g@$-00-d8{d9|3OW_d*H)T$mdu2-yvK zj@|(W;eJ8b_;%Q^a0fC*Yyq_*UX4COn8bXSkj3UpoW~uLpyKrgG}es35+dzHbb9*VM){H zm=iP_YnE!w&Lw-X@=0e{uB061Yf?L-hxCsAf%JvO+MT4Zc9O{AyZYq9-F8wBv4Lbu ztQV**?voA^CCSv?eFAn#igI*Ulk#KtF8LdAmh3>@Aip59NP*NPas*9=(oR22onjc$ zo-(dc&oORN-w5cJZn`n;F{6V1gjvUU%7idQS=~%Di_DB-TC)x@wb@r0X6zg~o`a%> zvpOggb}b5u^(8Dd<3dOdVyI8 zHLwrT6?_Ug4O&8|g23>PfPc^ez6jKfuK@AojX}1#*PxEv4rmMK7;Kv(1HeG(~WzKLSlXRD_C*6B|NgkKCoYa&#?ahyID8^qx%-XV~6rf*&f`- zEJw~s7L*;y%wpv;+F0g{w@foyG&7NUj`^9oLN}n8(+kKhj0oyW8i|rXU8jnWN2wsv zZ`y0(CHnHtE86AlKh)+eDDCcs1l49Oo?@`}k}ACNh98F*LxwoVct$Q`RZy{y5F!PYhM2?7K*ivnpil%E@&Q4D_#KOK=s@J-}4gbck6bp;K9W09q(7Kl5N#{LdF3mL$Svj$-z zKpET)s}PRk_M@Kw&Z6J4-+(*#Ss*jOEq)#AH|Z|ilPb$>B3=fP^ z2og94$N-13f`MUlO-LDc7BImx1;rp}fJFQefRT_JIzmFgcc{$>$th)um~7AW;O6}%Xf$RUmo6_!scl}0WPR3TQq>yEGQ)UL8D8+#e9P0#5T4HE2|jbC>+ zo0r#T`n0D<#v^8zH>WqxP%?JcR)15L7eB1JPCi)!5Ay}iJ$X~=tJYJ4y8t2ug4lv# zYbTRl--^M47VC0zz~a6t3Nfm)W!JYpm53;dri@+p48 zL}%}tg09_<-i=}3N}J5mS1b1C&h_(G&A{X_+|w)* z2QgDs(6v3PZ|=FR`pe_BNt$<_R-8+L>2>o+yL6M^E?Xw8KA-hHowao@IXOt<%{^sY zwCx0%qjIF1wmeM9d~wxWMSJL)#-oNn5tm9kh=1d@P){-`+0pvsO_}z`q|~0POpmz-i=LAn%iBvyG(K}>F`Go8B|^U=6eRWm zuA%me5u}p{;p%wiJ2|lQTbm?tIqg10DgB2AYqAZ}s}edw9SV~Y9qLISU!8PhqN;&7 z-QqIWK(zyrrftG#)>h|7YJ{;8R6&GzD@zSg%XBRhmj>I@du1Ju1UGv*hiQid?fr0| zGvHfby8lqvaGS`V-6Ev-!lhZ?>+ScKwZfftV>aU{(qh<^C<5G*A0>|r!K}CjtZ2{|K z8xu?J{e~!6`oZPSq7-p39|=A}LN8htsry-X(jZa$ovfz$Wo0jGQIl+^kNO}#aqo|z zftKmvm#h+^W^FG89k#t6W~sI1a8Qrn)2P{P@l#Gw?}}u;Mjt9xIeHf&cZQrLk6L|? z?Hpp5Q@_@o^iO9X;^*3!e8#Wtqp7Qn4Y_xlzh{+HYvo)WT5kGpFsxpp z*{kzW!+~y>oXPIlO6c@R+s}2m{`n=rtQU+rJqZq*^I^SOSHYRipfJBD{s8wIS$^=ycv_!l3Y?-7IbG zo8WHq^yZcIq}{@WGZoAGtJ0q;ypl9Ff0Dt!VaYbkT@s#Gweglb^l6>@g= z;Ozif>?xA!_MZ*)3C;Dx-Q~){l>+GGXXee8N6kAQU6<0Ra{G{~n zEx0vyqkLfEb%EcCQyq6WuaQ4d-V-stJ{i>~$O7oB+S2bCT5{R8g?*$V#ZCzVpgv&N ztjv$-b5;weu7&adALzSqu`IP3jcfwLfd9 zDqS~NR^;lW%dASm5e0?-sR^AIqK$SY`f5IwmKUs>w1Z7k^j>Ni8@@6OFa(-MTjgqn zTPipocRy@9=Ein$^44@L+V@>kYyWe*#FNFg!{@A=e?}+TlY+->EW(~x1w~wS$Uf_C zArwQ?eeJWNmF5y?e&1C^E8Q|kilfU>dt}lmJ|N$w_DA!Ptd77zG+1sChC=M{Es>Xq zXIUxRs=Ek=A^GLjz1=T7RYn)DZcE@eOYwz**5`pYcRZo8OEH8O>&p@qD?+Ln^ZtbW zTg|cnK2^jHb<|){{ekH%HJ($C`rD8^qa!}wRVVi!HwtmTqsQ`+FxVIL%k*62sz+n^ zCzmj{7KaM$HOn>Qa=Ur?G1D#W2p5_!lf<&+awOl%sfyaNDIkBK7_XCio$A3Z+8zXe$uj_f3pD!~aSB*VFJ_HXR0Uni zCLO(#$@#K&3kMi;T`mDxom+Es9``a!} zPu5M3KdsrAqf}0B#&tJu{cQ`K`a6^}lG1Un=That9&p>C@#v!F;kV@_z3L^t9iyf9 z%N|wCRjbxtEKevkD_hI6s=AqTrZlNywD4>*uhF~3d$hVTp|`7`ejvPN&k!zOyopw# z)0tNrI7sMbjHL_^$Gm2u#%QBYr>@O?7I-pW9i>d<)qmJ%s+%8gC`Jy3K|NlM4DKxOzK#A*mqX){I}gqMsji)<}0`DV&T`CYXx$prbWN9 zpH>{tb*TTF{jR~apt~=v(`E8a+y1e_t`DQ5^*h5)>bqwL+DDdJI-`ev4r+DKXPJ$s zCZ(%2m)F}_!?C@&!|w+W%P)psFM3XF(y#TbX^*j640aBD__5 zgvZ7m(d&R?m|idg@*Kk!TTyTXr77Ph3>uATjkw*@`{tHmt>h+a|9qdXrD3qZU@a8q zb}hi!=7wvU)1d1~11Z-t+7E0cv?rb3DeN_`k&4kiC56{8R;m-<5|Tn*=YFH#BW17s z-Bp~;rXfa-p{cVetOt{=8?Oc&)|w{X&L#E1<~v4_>*bTj`Pp+_s3U6|u-7wJWdPhq zgcxB5Z4b2{R*C9Eu3vN#V`A+t1WFkB?SJed7Wvut)IM~Oc$iX%LBv!rJjN~j({Y3F zhVbkNs{p(G$KBF`3+w`%sX;FSw0&&%RJrx|OBz_)`sn7E1jz5#W1)hSxKJ^TTCv+Y z?UKdX!jc@d^E%PysY*W_bWOV4p4*@BV0q8ifYVLhucH+11;m!ei`T)?AMvp^f%CjyeGT`@8Z=Fjo4FQcQykP$~lFK<%;3@ zx!2)+3=GGc98Im+xk0+h&LAJ)1@d|UBTOoU%?U$%WJinLVXuk4M@&e*gxwYL#yMj% z(fLBU*q_2&{2w_b`$u&;YFiO+Im^GNN}Ec}s$WVhs#v017Was&5?IGnJ!=C%C*Sf!#_K(^Z#EgXJ z{25bhwOta+8ywCo3tH+gB@%BHx09c@74LkhNtu7rZZlU`p59sBK2KHHW+}YMFYf8j3k9>la#K<}?QTYX$TO8=Qrl|_*Cq-DR!K39F`HII*8h29&1*F0?x{kMPpWQup{ z>GS>z$D0oeoh>}nf1=_P|76agq@#ZhD@6H5i5%h|uQ+_|94;#TKvpp9pj~KuX+Y(FkM^c@GYCOhofxKf&cUr0?PEi*m`PEOsdoj^{bU5hR*>esYymcVLdp1-$;P^q$eHCF6zJyqZu=%6) zq4lvU!EHx>dGNwtn~WYXHT=5|p_?7qsh<qgSbNTeHq%E(m!6`y(biH+VX~ntT3%PQG zPMOQyV_EJ6>p$74M}PgvJ@YRx?PuCpdgUKvy3n5+zeLhzGi z&YfS!l|)kR)X7tSmy460Cv@)quMhv0eGDt~ z`%#0jK^t$dOGu~Ou?OjBfQbTzppu6(}ZYb~t$ zzY3fBrZR=Yz5v@%BtR~j<1j`?J2OX7%VtnVw3-&p}xAmd$#$-LRgo>+*)_f?Bz*~x#rpR zsiF1li3HBwg?}LJ#YPZ%lLZ&t^^4;8ccrWWld_eVK8;(#ld=x#9ddITO-h$_i&g#9 z)0M9%pH>EEg#6BnQ@8Q*bbQ zEH&pKrle*92PVZR z0_S9V4SUYz0B+L+iVQG>qJJoDqsx^ɅHi!>^nk{&f4QNOQ`P>HfoFiCQibLP6R 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

s2@+NFil(y=*3|EBR~v%2w4)3k>6 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�Tg*3$l8dJUU%yMyyhwm(P}KV}B?q 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 TZT&6Lf Date: Wed, 11 Mar 2026 11:29:18 +0100 Subject: [PATCH 55/74] git subrepo clone git@github.com:bit-bots/game_controller_hsl.git src/lib/game_controller_hsl subrepo: subdir: "src/lib/game_controller_hsl" merged: "d55ef420e" upstream: origin: "git@github.com:bit-bots/game_controller_hsl.git" branch: "rolling" commit: "d55ef420e" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "ea10886" --- .../.github/dependabot.yml | 11 + .../workflows/build_and_test_humble.yaml | 34 +++ .../workflows/build_and_test_jazzy.yaml | 34 +++ .../workflows/build_and_test_rolling.yaml | 34 +++ src/lib/game_controller_hsl/.gitignore | 4 + src/lib/game_controller_hsl/.gitrepo | 12 + src/lib/game_controller_hsl/CONTRIBUTING.md | 13 + src/lib/game_controller_hsl/LICENSE | 201 ++++++++++++ src/lib/game_controller_hsl/README.md | 9 + .../config/game_controller_settings.yaml | 8 + .../game_controller_hsl/__init__.py | 0 .../game_controller_hsl/gamestate.py | 117 +++++++ .../game_controller_hsl/receiver.py | 285 ++++++++++++++++++ .../game_controller_hsl/utils.py | 32 ++ .../launch/game_controller.launch | 34 +++ .../game_controller_hsl/package.xml | 31 ++ .../resource/game_controller_hsl | 0 .../scripts/sim_gamestate.py | 165 ++++++++++ .../game_controller_hsl/setup.cfg | 4 + .../game_controller_hsl/setup.py | 34 +++ .../test/test_game_controller.py | 192 ++++++++++++ .../game_controller_hsl_interfaces/.gitignore | 12 + .../CMakeLists.txt | 23 ++ .../msg/GameState.msg | 73 +++++ .../msg/PlayerStatusPose.msg | 22 ++ .../package.xml | 28 ++ 26 files changed, 1412 insertions(+) create mode 100644 src/lib/game_controller_hsl/.github/dependabot.yml create mode 100644 src/lib/game_controller_hsl/.github/workflows/build_and_test_humble.yaml create mode 100644 src/lib/game_controller_hsl/.github/workflows/build_and_test_jazzy.yaml create mode 100644 src/lib/game_controller_hsl/.github/workflows/build_and_test_rolling.yaml create mode 100644 src/lib/game_controller_hsl/.gitignore create mode 100644 src/lib/game_controller_hsl/.gitrepo create mode 100644 src/lib/game_controller_hsl/CONTRIBUTING.md create mode 100644 src/lib/game_controller_hsl/LICENSE create mode 100644 src/lib/game_controller_hsl/README.md create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/config/game_controller_settings.yaml create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/__init__.py create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/gamestate.py create mode 100755 src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/receiver.py create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/utils.py create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/launch/game_controller.launch create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/package.xml create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/resource/game_controller_hsl create mode 100755 src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/setup.cfg create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/setup.py create mode 100644 src/lib/game_controller_hsl/game_controller_hsl/test/test_game_controller.py create mode 100644 src/lib/game_controller_hsl/game_controller_hsl_interfaces/.gitignore create mode 100644 src/lib/game_controller_hsl/game_controller_hsl_interfaces/CMakeLists.txt create mode 100644 src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/GameState.msg create mode 100644 src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/PlayerStatusPose.msg create mode 100644 src/lib/game_controller_hsl/game_controller_hsl_interfaces/package.xml diff --git a/src/lib/game_controller_hsl/.github/dependabot.yml b/src/lib/game_controller_hsl/.github/dependabot.yml new file mode 100644 index 000000000..e644b373e --- /dev/null +++ b/src/lib/game_controller_hsl/.github/dependabot.yml @@ -0,0 +1,11 @@ +# Set update schedule for GitHub Actions +# (https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot) + +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every week + interval: "weekly" diff --git a/src/lib/game_controller_hsl/.github/workflows/build_and_test_humble.yaml b/src/lib/game_controller_hsl/.github/workflows/build_and_test_humble.yaml new file mode 100644 index 000000000..4d6c80043 --- /dev/null +++ b/src/lib/game_controller_hsl/.github/workflows/build_and_test_humble.yaml @@ -0,0 +1,34 @@ +# This is a basic workflow to help you get started with Actions + +name: Build and Test (humble) + +# Controls when the action will run. +on: + # Triggers the workflow on push + push: + branches: [ rolling ] + + # Triggers the workflow on pull requests + pull_request: + branches: [ rolling ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: + image: ubuntu:jammy + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: ros-tooling/setup-ros@v0.7 + with: + use-ros2-testing: true + - uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: humble diff --git a/src/lib/game_controller_hsl/.github/workflows/build_and_test_jazzy.yaml b/src/lib/game_controller_hsl/.github/workflows/build_and_test_jazzy.yaml new file mode 100644 index 000000000..4252ce33c --- /dev/null +++ b/src/lib/game_controller_hsl/.github/workflows/build_and_test_jazzy.yaml @@ -0,0 +1,34 @@ +# This is a basic workflow to help you get started with Actions + +name: Build and Test (jazzy) + +# Controls when the action will run. +on: + # Triggers the workflow on push + push: + branches: [ rolling ] + + # Triggers the workflow on pull requests + pull_request: + branches: [ rolling ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: + image: ubuntu:noble + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: ros-tooling/setup-ros@v0.7 + with: + use-ros2-testing: true + - uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: jazzy diff --git a/src/lib/game_controller_hsl/.github/workflows/build_and_test_rolling.yaml b/src/lib/game_controller_hsl/.github/workflows/build_and_test_rolling.yaml new file mode 100644 index 000000000..630ce076f --- /dev/null +++ b/src/lib/game_controller_hsl/.github/workflows/build_and_test_rolling.yaml @@ -0,0 +1,34 @@ +# This is a basic workflow to help you get started with Actions + +name: Build and Test (rolling) + +# Controls when the action will run. +on: + # Triggers the workflow on push + push: + branches: [ rolling ] + + # Triggers the workflow on pull requests + pull_request: + branches: [ rolling ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: + image: ubuntu:noble + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: ros-tooling/setup-ros@v0.7 + with: + use-ros2-testing: true + - uses: ros-tooling/action-ros-ci@v0.4 + with: + target-ros2-distro: rolling diff --git a/src/lib/game_controller_hsl/.gitignore b/src/lib/game_controller_hsl/.gitignore new file mode 100644 index 000000000..68a82f03c --- /dev/null +++ b/src/lib/game_controller_hsl/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +*.pyc + +.vscode diff --git a/src/lib/game_controller_hsl/.gitrepo b/src/lib/game_controller_hsl/.gitrepo new file mode 100644 index 000000000..30a072adc --- /dev/null +++ b/src/lib/game_controller_hsl/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = git@github.com:bit-bots/game_controller_hsl.git + branch = rolling + commit = d55ef420ed7d4e4dfc0d88d5db2ef573038284c0 + parent = 215848ae8d261ddade8c6555bacd92d37f2862bb + method = merge + cmdver = 0.4.9 diff --git a/src/lib/game_controller_hsl/CONTRIBUTING.md b/src/lib/game_controller_hsl/CONTRIBUTING.md new file mode 100644 index 000000000..6f63de9e5 --- /dev/null +++ b/src/lib/game_controller_hsl/CONTRIBUTING.md @@ -0,0 +1,13 @@ +Any contribution that you make to this repository will +be under the Apache 2 License, as dictated by that +[license](http://www.apache.org/licenses/LICENSE-2.0.html): + +~~~ +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. +~~~ diff --git a/src/lib/game_controller_hsl/LICENSE b/src/lib/game_controller_hsl/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/src/lib/game_controller_hsl/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/lib/game_controller_hsl/README.md b/src/lib/game_controller_hsl/README.md new file mode 100644 index 000000000..cdf18f889 --- /dev/null +++ b/src/lib/game_controller_hsl/README.md @@ -0,0 +1,9 @@ +# Game Controller Client (RoboCup Humanoid League) + +[![Build and Test (humble)](../../actions/workflows/build_and_test_humble.yaml/badge.svg?branch=rolling)](../../actions/workflows/build_and_test_humble.yaml?query=branch:rolling) +[![Build and Test (jazzy)](../../actions/workflows/build_and_test_jazzy.yaml/badge.svg?branch=rolling)](../../actions/workflows/build_and_test_jazzy.yaml?query=branch:rolling) +[![Build and Test (rolling)](../../actions/workflows/build_and_test_rolling.yaml/badge.svg?branch=rolling)](../../actions/workflows/build_and_test_rolling.yaml?query=branch:rolling) + +This is the client for the humanoid league game controller. It communicates with the game controller via UDP and sends a game state message to ROS subscribers. + +## Still work in progress \ No newline at end of file diff --git a/src/lib/game_controller_hsl/game_controller_hsl/config/game_controller_settings.yaml b/src/lib/game_controller_hsl/game_controller_hsl/config/game_controller_settings.yaml new file mode 100644 index 000000000..7f8c2c873 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/config/game_controller_settings.yaml @@ -0,0 +1,8 @@ +--- +# Game controller network settings + +game_controller_hsl: + ros__parameters: + listen_host: '0.0.0.0' + listen_port: 3838 + answer_port: 3939 diff --git a/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/__init__.py b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/gamestate.py b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/gamestate.py new file mode 100644 index 000000000..c21d9ce57 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/gamestate.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# -*- coding:utf-8 -*- + +from construct import Byte, Struct, Enum, Bytes, Const, Array, Int16ul, PaddedString, Flag, Int16sl, Float32l + +Short = Int16ul + +RobotInfoStruct = "robot_info" / Struct( + # define NONE 0 + # define PENALTY_HL_KID_BALL_MANIPULATION 1 + # define PENALTY_HL_KID_PHYSICAL_CONTACT 2 + # define PENALTY_HL_KID_ILLEGAL_ATTACK 3 + # define PENALTY_HL_KID_ILLEGAL_DEFENSE 4 + # define PENALTY_HL_KID_REQUEST_FOR_PICKUP 5 + # define PENALTY_HL_KID_REQUEST_FOR_SERVICE 6 + # define PENALTY_HL_KID_REQUEST_FOR_PICKUP_2_SERVICE 7 + # define MANUAL 15 + "penalty" / Byte, + "secs_till_unpenalized" / Byte, + "warnings" / Byte, + "cautions" / Byte, + #"number_of_red_cards" / Byte, + #"goalkeeper" / Flag +) + +TeamInfoStruct = "team" / Struct( + "team_number" / Byte, + "field_player_color" / Enum(Byte, + BLUE=0, + RED=1, + YELLOW=2, + BLACK=3, + WHITE=4, + GREEN=5, + ORANGE=6, + PURPLE=7, + BROWN=8, + GRAY=9 + ), + "goalkeeper_color" / Enum(Byte, + BLUE=0, + RED=1, + YELLOW=2, + BLACK=3, + WHITE=4, + GREEN=5, + ORANGE=6, + PURPLE=7, + BROWN=8, + GRAY=9 + ), + "goalkeeper" / Byte, + "score" / Byte, + "penalty_shot" / Byte, # penalty shot counter + "single_shots" / Short, # bits represent penalty shot success + "message_budget" / Short, + "players" / Array(20, RobotInfoStruct) #always eleven fine? +) + +GAME_CONTROLLER_RESPONSE_VERSION = 19 + +GameStateStruct = "gamedata" / Struct( + "header" / Const(b'RGme'), + "version" / Const(GAME_CONTROLLER_RESPONSE_VERSION, Byte), + "packet_number" / Byte, + "players_per_team" / Byte, + "competition_type" / Enum(Byte, + COMPETITION_TYPE_SMALL=0, + COMPETITION_TYPE_MIDDLE=2, + COMPETITION_TYPE_LARGE=1 + ), + "stopped" / Flag, + "game_phase" / Enum(Byte, + GAME_PHASE_TIMEOUT=0, + GAME_PHASE_NORMAL=1, + GAME_PHASE_EXTRA_TIME =2, + GAME_PHASE_PENALTY_SHOOT_OUT=3 + ), + "state" / Enum(Byte, + STATE_INITIAL=0, + # auf startposition gehen + STATE_READY=1, + # bereithalten + STATE_SET=2, + # spielen + STATE_PLAYING=3, + # spiel zu ende + STATE_FINISHED=4 + ), + "set_play" / Enum(Byte, + SET_PLAY_NONE=0, + SET_PLAY_DIRECT_FREE_KICK=1, + SET_PLAY_INDIRECT_FREE_KICK=2, + SET_PLAY_PENALTY_KICK=3, + SET_PLAY_THROW_IN=4, + SET_PLAY_GOAL_KICK=5, + SET_PLAY_CORNER_KICK=6 + ), + "first_half" / Flag, + "kicking_team" / Byte, + "secs_remaining" / Int16sl, + "secondary_time" / Int16sl, + "teams" / Array(2, "team" / TeamInfoStruct) +) + +GAME_CONTROLLER_RESPONSE_VERSION = 4 + +ResponseStruct = Struct( + "header" / Const(b"RGrt"), + "version" / Const(GAME_CONTROLLER_RESPONSE_VERSION, Byte), + "player_number" / Byte, + "team_number" / Byte, + "fallen" / Flag, + "pose" / Float32l[3], + "ball_age" / Float32l, + "ball" / Float32l[2] +) diff --git a/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/receiver.py b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/receiver.py new file mode 100755 index 000000000..86a419dab --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/receiver.py @@ -0,0 +1,285 @@ +# Copyright (c) 2023 Hamburg Bit-Bots +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import socket +import rclpy + +from construct import ConstError +from rclpy.node import Node +from rclpy.time import Time +from rclpy.duration import Duration +from std_msgs.msg import Header +from construct import Container +from geometry_msgs.msg import PointStamped +from std_msgs.msg import Float32, Bool +from diagnostic_msgs.msg import DiagnosticArray, DiagnosticStatus +from game_controller_hsl.gamestate import GameStateStruct, ResponseStruct +from game_controller_hsl.utils import get_parameters_from_other_node +from game_controller_hsl_interfaces.msg import GameState, PlayerStatusPose + + +class GameStateReceiver(Node): + """This class puts up a simple UDP Server which receives the + *addr* parameter to listen to the packages from the game_controller. + + If it receives a package it will be interpreted with the construct data + structure and the :func:`on_new_gamestate` will be called with the content. + + After this we send a package back to the GC""" + + def __init__(self, *args, **kwargs): + super().__init__( + "game_controller", + *args, + **kwargs, + allow_undeclared_parameters=True, + automatically_declare_parameters_from_overrides=True, + ) + + # Check if we have the team and bot id parameters or if we should get them from the blackboard + if self.has_parameter("team_id") and self.has_parameter("bot_id"): + self.get_logger().info("Found team_id and bot_id parameter, using them") + # Get the parameters from our node + self.team_number = self.get_parameter("team_id").value + self.player_number = self.get_parameter("bot_id").value + else: + self.get_logger().info( + "No team_id and bot_id parameter set in game_controller, getting them from blackboard" + ) + # Get the parameter names from the parameter server + param_blackboard_name: str = self.get_parameter("parameter_blackboard_name").value + team_id_param_name: str = self.get_parameter("team_id_param_name").value + bot_id_param_name: str = self.get_parameter("bot_id_param_name").value + # Get the parameters from the blackboard + params = get_parameters_from_other_node( + self, param_blackboard_name, [team_id_param_name, bot_id_param_name] + ) + # Set the parameters + self.team_number = params[team_id_param_name] + self.player_number = params[bot_id_param_name] + + self.is_fallen: bool = False + self.ball_age: float = 100 # Start with high value to show low confidence + self.ball_position_msg: PointStamped = PointStamped() + self.pose_msg: PlayerStatusPose = PlayerStatusPose() + + # Create subscribers + self.create_subscription(PointStamped, "hsl_gamecontroller/ball_position", self.ball_position_cb, 1) + self.create_subscription(Float32, "hsl_gamecontroller/ball_age", self.ball_age_cb, 1) + self.create_subscription(Bool, "hsl_gamecontroller/is_fallen", self.is_fallen_cb, 1) + self.create_subscription(PlayerStatusPose, "hsl_gamecontroller/pose", self.pose_cb, 1) + + self.get_logger().info(f"We are playing as player {self.player_number} in team {self.team_number}") + + # The publisher for the game state + self.state_publisher = self.create_publisher(GameState, "gamestate", 1) + + # The publisher for the diagnostics + self.diagnostic_pub = self.create_publisher(DiagnosticArray, "diagnostics", 1) + + # The time in seconds after which we assume the game controller is lost + # and we tell the robot to move + self.game_controller_lost_time = 5 + + # The address listening on and the port for sending back the robots meta data + self.addr = (self.get_parameter("listen_host").value, self.get_parameter("listen_port").value) + self.answer_port = self.get_parameter("answer_port").value + + # The time of the last package + self.last_package_time: Time = self.get_clock().now() + + # Create the socket we want to use for the communications + self.socket = self._open_socket() + + def ball_position_cb(self, msg: PointStamped): + self.ball_position_msg = msg + + def ball_age_cb(self, msg: Float32): + self.ball_age = msg.data + + def is_fallen_cb(self, msg: Bool): + self.is_fallen = msg.data + + def pose_cb(self, msg: PlayerStatusPose): + self.pose_msg = msg + + def _open_socket(self) -> socket.socket: + """Creates the socket""" + new_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + new_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + new_socket.bind(self.addr) + new_socket.settimeout(2) + return new_socket + + def receive_forever(self): + """Waits in a loop for new packages""" + while rclpy.ok(): + # Try to receive a package + self.receive_and_answer_once() + # Check if we didn't receive a package for a long time for publishing diagnostics + received_message_lately = self.get_time_since_last_package() < Duration( + seconds=self.game_controller_lost_time + ) + self.publish_diagnostics(received_message_lately) + + def receive_and_answer_once(self): + """Receives a package, interprets it and sends an answer.""" + try: + # Receive the package + data, peer = self.socket.recvfrom(GameStateStruct.sizeof()) + + # Parse the package based on the GameStateStruct + # This throws a ConstError if it doesn't work + parsed_state = GameStateStruct.parse(data) + + # Assign the new package after it parsed successful to the state + self.last_package_time = self.get_clock().now() + + # Build the game state message and publish it + self.state_publisher.publish(self.build_game_state_msg(parsed_state)) + + # Answer the GameController + self.answer_to_gamecontroller(peer) + + except AssertionError as ae: + self.get_logger().error(str(ae)) + except socket.timeout: + self.get_logger().info("No GameController message received (socket timeout)", throttle_duration_sec=5) + except ConstError: + self.get_logger().warn("Parse Error: Probably using an old protocol!") + except IOError as e: + self.get_logger().warn(f"Error while sending keep-alive: {str(e)}") + + def publish_diagnostics(self, received_message_lately: bool): + """ + This publishes a Diagnostics Array. + """ + # initialize DiagnsticArray message + diag_array = DiagnosticArray() + + # configure DiagnosticStatus message + diag = DiagnosticStatus(name="Game Controller", hardware_id="Game Controller") + if not received_message_lately: + self.get_logger().info("No GameController message received", throttle_duration_sec=5) + diag.message = ( + "Lost connection to game controller for " + + str(int(self.get_time_since_last_package().nanoseconds / 1e9)) + + " sec" + ) + diag.level = DiagnosticStatus.WARN + else: + diag.message = "Connected" + diag.level = DiagnosticStatus.OK + + diag_array.status.append(diag) + + # add timestamp to header and publish DiagnosticArray + diag_array.header.stamp = self.get_clock().now().to_msg() + self.diagnostic_pub.publish(diag_array) + + def answer_to_gamecontroller(self, peer): + """Sends a life sign to the game controller""" + # Build the answer package + data = ResponseStruct.build( + dict( + player_number=self.player_number, + team_number=self.team_number, + fallen=self.is_fallen, + pose=self.pose_msg.pose, + ball_age=self.ball_age, + ball=[self.ball_position_msg.point.x, self.ball_position_msg.point.y], + ) + ) + # Send the package + self.get_logger().debug(f"Sending answer to {peer[0]}:{self.answer_port}") + try: + self.socket.sendto(data, (peer[0], self.answer_port)) + except Exception as e: + self.get_logger().error(f"Network Error: {str(e)}") + + def build_game_state_msg(self, state) -> GameState: + """Builds a GameState message from the game state""" + + # Get the team objects sorted into own and rival team + own_team = GameStateReceiver.select_team_by(lambda team: team.team_number == self.team_number, state.teams) + rival_team = GameStateReceiver.select_team_by(lambda team: team.team_number != self.team_number, state.teams) + + # Add some assertions to make sure everything is fine + assert not (own_team is None or rival_team is None), ( + f"Team {self.team_number} not playing, only {state.teams[0].team_number} and {state.teams[1].team_number}" + ) + + assert self.player_number <= len(own_team.players), f"Robot {self.player_number} not playing" + + this_robot = own_team.players[self.player_number - 1] + + return GameState( + header=Header(stamp=self.get_clock().now().to_msg()), + players_per_team=state.players_per_team, + competition_type=state.competition_type.intvalue, + game_phase=state.game_phase.intvalue, + main_state=state.state.intvalue, + set_play=state.set_play.intvalue, + kicking_team=state.kicking_team, + first_half=state.first_half, + stopped=state.stopped, + own_score=own_team.score, + rival_score=rival_team.score, + secs_remaining=state.secs_remaining, + secondary_time=state.secondary_time, + penalized=this_robot.penalty != 0, + seconds_till_unpenalized=this_robot.secs_till_unpenalized, + warings=this_robot.warnings, + cautions=this_robot.cautions, + own_player_color=own_team.field_player_color.intvalue, + own_goalie_color=own_team.goalkeeper_color.intvalue, + rival_player_color=rival_team.field_player_color.intvalue, + rival_goalie_color=rival_team.goalkeeper_color.intvalue, + # --- Gibt es nicht mehr? --- + # drop_in_team = state.drop_in_team, + # drop_in_time = state.drop_in_time, + penalty_shot=own_team.penalty_shot, + single_shots=own_team.single_shots, + # --- Gibt es nicht mehr? Waren die ähnlich wie Message Budget? --- + # coach_message = own_team.coach_message, + message_budget=own_team.message_budget, + team_mates_with_penalty=[player.penalty != 0 for player in own_team.players], + # --- Gibt es nicht mehr? Selber bemerken ob man rot hat? --- + # team_mates_with_red_card = [player.number_of_red_cards != 0 for player in own_team.players], + ) + + def get_time_since_last_package(self) -> Duration: + """Returns the time in seconds since the last package was received""" + return self.get_clock().now() - self.last_package_time + + @staticmethod + def select_team_by(predicate: callable, teams: list[Container]) -> Container: + """Selects the team based on the predicate""" + selected = [team for team in teams if predicate(team)] + return next(iter(selected), None) + + +def main(args=None): + rclpy.init(args=args) + receiver = GameStateReceiver() + + try: + receiver.receive_forever() + except KeyboardInterrupt: + receiver.destroy_node() + rclpy.shutdown() + + +if __name__ == "__main__": + main() diff --git a/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/utils.py b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/utils.py new file mode 100644 index 000000000..58a24d571 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/game_controller_hsl/utils.py @@ -0,0 +1,32 @@ +from typing import Any + +import rclpy +from rclpy.node import Node +from rcl_interfaces.srv import GetParameters +from rclpy.parameter import parameter_value_to_python + + +def get_parameters_from_other_node(own_node: Node, + other_node_name: str, + parameter_names: list[str], + service_timeout_sec: float = 20.0) -> dict[str, Any]: + """ + Used to receive parameters from other running nodes. + Returns a dict with requested parameter name as dict key and parameter value as dict value. + + From bitbots_utils (https://github.com/bit-bots/bitbots_misc) + """ + client = own_node.create_client(GetParameters, f'{other_node_name}/get_parameters') + ready = client.wait_for_service(timeout_sec=service_timeout_sec) + if not ready: + raise RuntimeError(f'Wait for {other_node_name} parameter service timed out') + request = GetParameters.Request() + request.names = parameter_names + future = client.call_async(request) + rclpy.spin_until_future_complete(own_node, future) + response = future.result() + + results = {} # Received parameter + for i, param in enumerate(parameter_names): + results[param] = parameter_value_to_python(response.values[i]) + return results \ No newline at end of file diff --git a/src/lib/game_controller_hsl/game_controller_hsl/launch/game_controller.launch b/src/lib/game_controller_hsl/game_controller_hsl/launch/game_controller.launch new file mode 100644 index 000000000..1e4cedbc6 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/launch/game_controller.launch @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/game_controller_hsl/game_controller_hsl/package.xml b/src/lib/game_controller_hsl/game_controller_hsl/package.xml new file mode 100644 index 000000000..e86607bf8 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/package.xml @@ -0,0 +1,31 @@ + + + + game_controller_hsl + 1.1.0 + + The game_controller_hsl packages receives packets from the GameController and + republishes them as GameState ROS messages. It sends response packets + back to the GameController. + + + Timon Engelke + Hamburg Bit-Bots + + Apache License 2.0 + + Timon Engelke + + rosidl_default_generators + rosidl_default_runtime + + diagnostic_msgs + game_controller_hsl_interfaces + python3-construct + rclpy + std_msgs + + + ament_python + + diff --git a/src/lib/game_controller_hsl/game_controller_hsl/resource/game_controller_hsl b/src/lib/game_controller_hsl/game_controller_hsl/resource/game_controller_hsl new file mode 100644 index 000000000..e69de29bb diff --git a/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py b/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py new file mode 100755 index 000000000..91f1ea5d2 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 + +# This script was based on the teleop_twist_keyboard package +# original code can be found at https://github.com/ros-teleop/teleop_twist_keyboard +# The script provides a simple mechanism to test robot behavior in different game states, +# when no game controller is running + +import sys +import select +import termios +import tty + +import rclpy +from rclpy.node import Node +from rclpy.qos import QoSProfile, DurabilityPolicy + +from game_controller_hsl_interfaces.msg import GameState +from game_controller_hsl.utils import get_parameters_from_other_node + + +class SimGamestate(Node): + msg = """Setting the GameState by entering a number: + +0: GAMESTATE_INITIAL = 0 +1: GAMESTATE_READY = 1 +2: GAMESTATE_SET = 2 +3: GAMESTATE_PLAYING =3 +4: GAMESTATE_FINISHED = 4 + +5: COMPETITION_TYPE_SMALL = 0 +6: COMPETITION_TYPE_MIDDLE = 1 +7: COMPETITION_TYPE_LARGE = 3 + +Set the game phase by entering: +a: GAME_PHASE_TIMEOUT = 0 +b: GAME_PHASE_NORMAL = 1 +c: GAME_PHASE_EXTRA_TIME = 2 +d: GAME_PHASE_PENALTY_SHOOT_OUT = 3 + +Set play states by entering: +e: SET_PLAY_NONE = 0 +f: SET_PLAY_DIRECT_FREE_KICK = 1 +g: SET_PLAY_INDIRECT_FREE_KICK = 2 +h: SET_PLAY_PENALTY_KICK = 3 +i: SET_PLAY_THROW_IN = 4 +j: SET_PLAY_GOAL_KICK = 5 +k: SET_PLAY_CORNER_KICK = 6 + +p: toggle penalized +t: toggle kicking team +s: toggle stopped state ++: increase own score by 1 + + + + + + + +CTRL-C to quit +""" + + def __init__(self): + super().__init__("sim_gamestate") + self.logger = self.get_logger() + + # Try fetching team id from parameter blackboard or ask user for input + try: + self.team_id = get_parameters_from_other_node(self, "parameter_blackboard", ["team_id"])["team_id"] + except KeyError: + self.logger.error("No team id found in parameter blackboard") + self.team_id = int(input("Please enter team id: ")) + + self.has_kick_off = True + + self.settings = termios.tcgetattr(sys.stdin) + + self.publisher = self.create_publisher( + GameState, + "gamestate", + QoSProfile(durability=DurabilityPolicy.TRANSIENT_LOCAL, depth=1), + ) + + def loop(self): + game_state_msg = GameState() + game_state_msg.header.stamp = self.get_clock().now().to_msg() + + # Init kicking team to our teamID + game_state_msg.kicking_team = self.team_id + + try: + print(self.msg) + while True: + key = self.get_key() + if key == "\x03": + break + elif key in ["0", "1", "2", "3", "4"]: + int_key = int(key) + game_state_msg.main_state = int_key + elif key in ["5", "6", "7"]: + int_key = int(key) + game_state_msg.competition_type = int_key - 5 + elif key == "p": # penalize / unpenalize + game_state_msg.penalized = not game_state_msg.penalized + elif key in [chr(ord("a") + x) for x in range(4)]: + game_state_msg.game_phase = ord(key) - ord("a") + elif key in [chr(ord("e") + x) for x in range(7)]: + game_state_msg.set_play = ord(key) - ord("e") + elif key == "t": + if game_state_msg.kicking_team == self.team_id: + game_state_msg.kicking_team = self.team_id + 1 + else: + game_state_msg.kicking_team = self.team_id + elif key == "s": + self.stopped = not self.stopped + elif key == "+": + game_state_msg.own_score += 1 + game_state_msg.has_kick_off = self.has_kick_off + + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + sys.stdout.write("\x1b[A") + self.publisher.publish(game_state_msg) + print( + f"""Penalized: {game_state_msg.penalized} +Kicking Team: {game_state_msg.kicking_team} +Game Phase: {game_state_msg.game_phase} +Play Phase: {game_state_msg.play_phase} +Main State: {game_state_msg.main_state} +Has Kick Off: {game_state_msg.has_kick_off} +Competition Type: {game_state_msg.competition_type} + +CTRL-C to quit +""" + ) + + except Exception as e: + print(e) + + finally: + print() + + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.settings) + + def get_key(self): + tty.setraw(sys.stdin.fileno()) + select.select([sys.stdin], [], [], 0) + return_key = sys.stdin.read(1) + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.settings) + return return_key + + +if __name__ == "__main__": + rclpy.init(args=None) + node = SimGamestate() + node.loop() + node.destroy_node() + rclpy.shutdown() diff --git a/src/lib/game_controller_hsl/game_controller_hsl/setup.cfg b/src/lib/game_controller_hsl/game_controller_hsl/setup.cfg new file mode 100644 index 000000000..2fbfb2ad1 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/setup.cfg @@ -0,0 +1,4 @@ +[develop] +script_dir=$base/lib/game_controller_hsl +[install] +install_scripts=$base/lib/game_controller_hsl diff --git a/src/lib/game_controller_hsl/game_controller_hsl/setup.py b/src/lib/game_controller_hsl/game_controller_hsl/setup.py new file mode 100644 index 000000000..80ee92fd3 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/setup.py @@ -0,0 +1,34 @@ +import glob + +from setuptools import find_packages, setup + +package_name = 'game_controller_hsl' + +setup( + name=package_name, + packages=find_packages(exclude=['test']), + data_files=[ + ('share/ament_index/resource_index/packages', + ['resource/' + package_name]), + ('share/' + package_name, ['package.xml']), + ('share/' + package_name + "/config", + glob.glob('config/*.yaml')), + ('share/' + package_name + '/launch', + glob.glob('launch/*.launch')), + ], + install_requires=[ + 'launch', + 'setuptools', + 'construct', + ], + scripts=['scripts/sim_gamestate.py'], + zip_safe=True, + keywords=['ROS'], + license='MIT', + tests_require=['pytest'], + entry_points={ + 'console_scripts': [ + 'game_controller = game_controller_hsl.receiver:main', + ], + } +) diff --git a/src/lib/game_controller_hsl/game_controller_hsl/test/test_game_controller.py b/src/lib/game_controller_hsl/game_controller_hsl/test/test_game_controller.py new file mode 100644 index 000000000..c26bf9f5c --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl/test/test_game_controller.py @@ -0,0 +1,192 @@ + +import rclpy + +from construct import Container, ListContainer, EnumIntegerString + +from rclpy.node import Node +from rclpy.parameter import Parameter + +from game_controller_hsl.gamestate import GameStateStruct, TeamInfoStruct +from game_controller_hsl.utils import get_parameters_from_other_node +from game_controller_hsl.receiver import GameStateReceiver + +from game_controller_hsl_interfaces.msg import GameState + + +def test_get_parameters_from_other_node(): + rclpy.init() + class MockNode(Node): + def __init__(self): + super().__init__('mock_node') + self.declare_parameter('team_id', 1) + self.declare_parameter('bot_id', 2) + + node = MockNode() + params = get_parameters_from_other_node(node, 'mock_node', ['team_id', 'bot_id']) + assert params['team_id'] == 1 + assert params['bot_id'] == 2 + node.destroy_node() + rclpy.shutdown() + + +def test_game_state_receiver_select_team_by(): + player = dict( + penalty=0, + secs_till_unpenalized=0, + ) + + # Create a TeamInfoStruct as if it was a parsed game state + team = TeamInfoStruct.build(dict( + number=1, + field_player_color=0, + goalkeeper_color=2, + goalkeeper=0, + score=3, + penalty_shot=0, + single_shots=0, + message_budget=100, + players=[player]*11 + )) + + # Parse the TeamInfoStruct and check if the selector works + teams = [TeamInfoStruct.parse(team)] + + assert GameStateReceiver.select_team_by(lambda team: team.team_number == 1, teams).team_number == 1 + assert GameStateReceiver.select_team_by(lambda team: team.team_number == 2, teams) is None + + +'''def test_parse_gamestate(): + # Create dummy game state + num_players = 11 + dummy_state_dict = dict( + header=b'RGme', + version=12, + packet_number=0, + players_per_team=num_players, + competition_phase=0, + competition_type=0, + game_phase=0, + set_play=0, + first_half=False, + kicking_team=0, + secs_remaining=0, + secondary_time=0, + teams=[dict( + number=team_id, + field_player_color=0, + goalkeeper_color=0, + goalkeeper=0, + score=0, + penalty_shot=0, + single_shots=0, + message_budget=0, + players=[dict( + penalty=0, + secs_till_unpenalized=0, + ) for player_id in range(num_players)] + ) for team_id in range(2)] + ) + + # Create a GameStateStruct as if it was a parsed game state + state = GameStateStruct.build(dummy_state_dict) + + # Binary representation of the GameStateStruct + #nullen zählen? + dummy_package = b'RGme\x0c\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + assert dummy_package == state + + # Parse the GameStateStruct and check if the values are correct + state = GameStateStruct.parse(state) + + # Recursivly convert Container to dict + def dictify(container): + new_dict = dict() + for key, value in container.items(): + if isinstance(value, Container): + new_dict[key] = dictify(value) + elif isinstance(value, ListContainer): + new_dict[key] = [dictify(item) for item in value] + elif isinstance(value, EnumIntegerString): + new_dict[key] = int(value) + elif key != '_io': + new_dict[key] = value + return new_dict + + # Check if the dict and the parsed game state are equal + assert dictify(state) == dummy_state_dict + +''' +def test_on_new_gamestate(): + # Create dummy game state + num_players = 11 + dummy_state_dict = dict( + header=b'RGme', + version=12, + packet_number=0, + players_per_team=num_players, + competition_phase=0, + competition_type=0, + game_phase=0, + set_play=0, + first_half=False, + kicking_team=0, + secs_remaining=0, + secondary_time=0, + teams=[dict( + number=team_id, + field_player_color=0, + goalkeeper_color=0, + goalkeeper=0, + score=0, + penalty_shot=0, + single_shots=0, + message_budget=0, + players=[dict( + penalty=0, + secs_till_unpenalized=0, + ) for player_id in range(num_players)] + ) for team_id in range(2)] + ) + + # Create a GameStateStruct as if it was a parsed game state + state = GameStateStruct.parse(GameStateStruct.build(dummy_state_dict)) + + # Create the game state receiver with the team and player number parameter overwritten + rclpy.init() + receiver = GameStateReceiver( + parameter_overrides=[ + Parameter('team_id', Parameter.Type.INTEGER, 1), + Parameter('bot_id', Parameter.Type.INTEGER, 1), + Parameter('listen_port', Parameter.Type.INTEGER, 3838), + Parameter('answer_port', Parameter.Type.INTEGER, 3939), + Parameter('listen_host', Parameter.Type.STRING, '0.0.0.0') + ] + ) + + # Call the on_new_gamestate method and listen to the published game state message + msg = receiver.build_game_state_msg(state) + + # Check if the message is correct + assert msg.competition_phase == 0 + assert msg.game_phase == 0 + assert msg.main_state == 0 + assert msg.set_play == 0 + assert msg.kicking_team == 0 + assert msg.first_half == False + assert msg.own_score == 0 + assert msg.rival_score == 0 + assert msg.secs_remaining == 0 + assert msg.secondary_time == 0 + assert msg.has_kick_off == False + assert msg.penalized == False + assert msg.seconds_till_unpenalized == 0 + assert msg.own_player_color == 0 + assert msg.own_goalie_color == 0 + assert msg.rival_player_color == 0 + assert msg.rival_goalie_color == 0 + assert msg.penalty_shot == 0 + assert msg.single_shots == 0 + assert msg.message_budget == 0 + assert msg.team_mates_with_penalty == 0 + + diff --git a/src/lib/game_controller_hsl/game_controller_hsl_interfaces/.gitignore b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/.gitignore new file mode 100644 index 000000000..1716c0f2f --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/.gitignore @@ -0,0 +1,12 @@ +# auto-generated documentation +**/docs/_build +**/docs/_out +**/docs/cppapi +**/docs/pyapi + +.idea/* +*.pyc +.pyenv2/* +.pyenv3/* +.vscode/* + diff --git a/src/lib/game_controller_hsl/game_controller_hsl_interfaces/CMakeLists.txt b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/CMakeLists.txt new file mode 100644 index 000000000..0f527ede7 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.5) +project(game_controller_hsl_interfaces) + +find_package(ament_cmake REQUIRED) +find_package(ament_lint_auto REQUIRED) +find_package(rosidl_default_generators REQUIRED) +find_package(std_msgs REQUIRED) +find_package(geometry_msgs REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + ament_lint_auto_find_test_dependencies() +endif() + +rosidl_generate_interfaces(${PROJECT_NAME} + "msg/GameState.msg" + "msg/PlayerStatusPose.msg" + DEPENDENCIES + std_msgs + geometry_msgs +) + +ament_package() diff --git a/src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/GameState.msg b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/GameState.msg new file mode 100644 index 000000000..a98eb004b --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/GameState.msg @@ -0,0 +1,73 @@ +# This message provides all information from the game controller +# for additional information see documentation of the game controller +# https://github.com/bhuman/GameController + + +std_msgs/Header header + +uint8 players_per_team + +uint8 COMPETITION_TYPE_SMALL = 0 +uint8 COMPETITION_TYPE_MIDDLE = 1 +uint8 COMPETITION_TYPE_LARGE = 2 +uint8 competition_type + +uint8 GAME_PHASE_NORMAL = 0 +uint8 GAME_PHASE_PENALTY_SHOOT_OUT = 1 +uint8 GAME_PHASE_EXTRA_TIME = 2 +uint8 GAME_PHASE_TIMEOUT = 3 +uint8 game_phase + +uint8 STATE_INITIAL = 0 +uint8 STATE_READY = 1 +uint8 STATE_SET = 2 +uint8 STATE_PLAYING = 3 +uint8 STATE_FINISHED = 4 +uint8 main_state + +uint8 SET_PLAY_NONE = 0 +uint8 SET_PLAY_DIRECT_FREE_KICK = 1 +uint8 SET_PLAY_INDIRECT_FREE_KICK = 2 +uint8 SET_PLAY_PENALTY_KICK = 3 +uint8 SET_PLAY_THROW_IN = 4 +uint8 SET_PLAY_GOAL_KICK = 5 +uint8 SET_PLAY_CORNER_KICK = 6 +uint8 set_play + +uint8 kicking_team +bool first_half +bool stopped +uint8 own_score +uint8 rival_score + +# Seconds remaining for the game half +int16 secs_remaining +# Seconds remaining for things like kickoff +int16 secondary_time +bool penalized +uint16 seconds_till_unpenalized +uint8 warnings +uint8 cautions + +uint8 TEAM_BLUE = 0 +uint8 TEAM_RED = 1 +uint8 TEAM_YELLOW = 2 +uint8 TEAM_BLACK = 3 +uint8 TEAM_WHITE = 4 +uint8 TEAM_GREEN = 5 +uint8 TEAM_ORANGE = 6 +uint8 TEAM_PURPLE = 7 +uint8 TEAM_BROWN = 8 +uint8 TEAM_GRAY = 9 +uint8 own_player_color +uint8 own_goalie_color +uint8 rival_player_color +uint8 rival_goalie_color + +# The number of the current penalty shot during penalty shootout +uint8 penalty_shot +# a binary pattern indicating the successful penalty shots (1 for successful, 0 for unsuccessful) +uint16 single_shots + +uint8 message_budget +bool[] team_mates_with_penalty diff --git a/src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/PlayerStatusPose.msg b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/PlayerStatusPose.msg new file mode 100644 index 000000000..f2f6f218a --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/msg/PlayerStatusPose.msg @@ -0,0 +1,22 @@ +# This Pose message is based on the following field coordinate system: +# +# y +# ^ ______________________ +# | M | | | O +# | Y |_ -x, y | x, y _| P +# | G | | | | | P +# 0 + O | | ( ) | | G +# | A |_| | |_| O +# | L | -x,-y | x,-y | A +# | |__________|__________| L +# | +# +------------------+--------------> x +# 0 +# +# 0,0 is the center of the filed and we expect (x, y, theta) with theta +# being the euler angle in radians, 0 along the +x axis, +# increasing counter clockwise + +std_msgs/Header header + +float32[3] pose diff --git a/src/lib/game_controller_hsl/game_controller_hsl_interfaces/package.xml b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/package.xml new file mode 100644 index 000000000..07ee19e59 --- /dev/null +++ b/src/lib/game_controller_hsl/game_controller_hsl_interfaces/package.xml @@ -0,0 +1,28 @@ + + + + game_controller_hsl_interfaces + 0.0.1 + RoboCup Humanoid League Game Controller Messages + + Florian Vahl + Hamburg Bit-Bots + + Apache License 2.0 + + Marc Bestmann + + ament_cmake + rosidl_default_generators + + std_msgs + ament_lint_auto + + rosidl_default_generators + rosidl_default_runtime + rosidl_interface_packages + + + ament_cmake + + From dd799f2a4207689f4f79dd2121d9a2af7d3df841 Mon Sep 17 00:00:00 2001 From: Jan Gutsche Date: Wed, 11 Mar 2026 11:31:45 +0100 Subject: [PATCH 56/74] extrinsic calibration amy --- src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml b/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml index 165d51dbf..eac72e113 100644 --- a/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml +++ b/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml @@ -6,6 +6,6 @@ /bitbots_extrinsic_imu_calibration: ros__parameters: - offset_x: 0.28 + offset_x: 0.31 offset_y: 0.06 offset_z: 0.0 From 33092c097be29bfacf5525413f14cf657d14cad0 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 13:17:23 +0100 Subject: [PATCH 57/74] fix(bio_ik): do not use gradient descent solver as it seemed to introduce performance issues --- .../wolfgang_moveit_config/config/kinematics.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml b/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml index 90b1d50cc..c595bf4e4 100644 --- a/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml +++ b/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml @@ -2,36 +2,28 @@ LeftLeg: kinematics_solver: bio_ik/BioIKKinematicsPlugin # kdl_kinematics_plugin/KDLKinematicsPlugin kinematics_solver_search_resolution: 0.00001 kinematics_solver_timeout: 0.01 - mode: gd_c RightLeg: kinematics_solver: bio_ik/BioIKKinematicsPlugin # kdl_kinematics_plugin/KDLKinematicsPlugin kinematics_solver_search_resolution: 0.00001 kinematics_solver_timeout: 0.01 - mode: gd_c Legs: kinematics_solver_search_resolution: 0.0001 kinematics_solver_timeout: 0.005 - mode: gd_c RightArm: kinematics_solver: bio_ik/BioIKKinematicsPlugin kinematics_solver_search_resolution: 0.00001 kinematics_solver_timeout: 0.01 - mode: gd_c LeftArm: kinematics_solver: bio_ik/BioIKKinematicsPlugin kinematics_solver_search_resolution: 0.00001 kinematics_solver_timeout: 0.01 - mode: gd_c Arms: kinematics_solver_search_resolution: 0.00001 kinematics_solver_timeout: 0.01 - mode: gd_c Head: kinematics_solver: bio_ik/BioIKKinematicsPlugin kinematics_solver_search_resolution: 0.001 kinematics_solver_timeout: 0.001 - mode: gd_c All: kinematics_solver_search_resolution: 0.005 kinematics_solver_timeout: 0.005 - mode: gd_c From 7834eaf797e69b13888f8c33a153fdf422f767a6 Mon Sep 17 00:00:00 2001 From: paer Date: Wed, 11 Mar 2026 14:18:10 +0100 Subject: [PATCH 58/74] fix new field map scaling --- .../config/fields/german_open_2026/lines.png | Bin 378259 -> 267090 bytes .../fields/german_open_2026_medium/lines.png | Bin 379036 -> 268131 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/lines.png b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/lines.png index 99230f3b3455af4bb559456587aa7a73a4762553..728a0a89319885ca1eda0608ac8c58257bfd760b 100644 GIT binary patch literal 267090 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 z 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 literal 378259 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�jJQH(@Df(JaYia1 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 HA6@?kSEt`x diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/lines.png b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/lines.png index 6a15d33637b94dfc56ede5bd2dd1ab8e1e15fc92..5ae1eb82f1e3d234df557597362309748e413d8d 100644 GIT binary patch literal 268131 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 literal 379036 zcmeEP30Ra>_kTxJQUpHqZ)ge_PWnX&Aq5i1P@;lMZj2=^nCMs{l9Gb53}z(?3Sx@5 zVYy?InF1=pxPr+jwg@T;2qG3A4x=Ii3^V_8?)$zo17eJ_*3-lLjAO=o&pr2?-&yXt z=dPLf!Dz$ouXLv<%Fx5zZ8Al59!XJpue{U={)@D${|Jg2KzX>m=NZKL-x-7Tb4SMx zc#og2I{m%(pFO({D>OE_apAq}pVsR2I#R?-l)GJU>Miv=HAVJa(Mb53a6lfvHYvx; zSCpjm^9&nR(#uME;MBzB-#%P_$qBxOyk8P9HROk)UYcKuTx$w{3Hf1;i2R-^($i%> z{NDzfOs#A@XB{}T8~!rb)8*p}gRNX9$v(J%|G$mZEYDL1f+oqj6LX*f8ha59eOMQGhu} zs3-aPuIM1VtJI1xD5s`sO7(UaZ7@uA0{Kx-_`=$;?C&N9X?}42*;+&Q1xjZfa6YK{ z0bY+TG23)*?QSyVoxmt(zB7M@)lTv=%QNIVhS5UarU|$-lkw*Sc?tO&{`$uk4luLc zzn1`3lpC#^IUuoCj&x* z0+QpU3bRTe1mN&9Ja>9pYq(JC{R$&h%x~lG9{0qFXivhJnZ$_$^zWMjHzP0M8k$;3 zIYDRu_WXX3+CeidDHDpC9ii=m#LWjd! zYu-ZB<1*<8y`bWCAgMSDQ=ox)5lt4p# zpbh{xmrQbG-u5j`6fX3si6?MkdqI+D*1~j-d-f+(O~S9v{8I;5r5Fc`v60XM46?Rb z&5}jG$WbAe7c%0Bzd6HdJunDfGK_q|RolU;^KcY%5R@67Mw>V_-KQO~#gin*` z*AWU)qLsTD^1{qEsoaSmPCRj-Kg{#nCFGBhCGdA#1N=E19c{cz{Yo<1-9-m*uH+AT zAx5&oX+W*foI{eNDfc(8{bftj^tN3mz&Sy}&GOb6{o2 z_fbeQO14^%5AS=}jc5Z<+5=X5Vqf5>hFn~&k-+RCcrS_@EyK*(06*b{NHn`x0DWq_ zR3%(0*ad=3uhCFgczTF=nngnnZM<{`-aU-bHilw&U)0*&bLbC-_Vu7m1c{TB!(oL{ zG+AQ5Mv8$UI0(ZKLz*|SD z>88h_SCcU^GXXMCXMqpE5weg#IvIjtKdK9&mCS}0rZ|9N!pJehZS@GqdipOoJ5!Ae z&LXP^FK6FNMxy`1ND!^#8w*e%dUDT|@ zX~6#j7!#&a?m&D4WMbvr)@m1F5e!8p5sus<{|SUjv*6%qp!~B_*#!&JT|FBzAW=5d zWmxwfVxj5^tTbXXSzh%tV2m#GjF5Nmm0lbGM@F;)_adayYeA;K+4OBEs}b-O#v@-D zmeLY1u`kYvL4S5A!YTUw@D*l6PmUQ4%>~1~HxSr}jA@V3dm{X8sHZElTre?|K#=Ph zo~L1*^oWsQA%mU+I{*%c%LRk)BJ3n;DLcXHy9&K0T1{X8dQxP#PFBED7?H3NxvR#2 z6Y@ARs0O7$8rY@cFeAZ&!P`Jm=*bei0b9#V6FpOu4~COC3|Tz*?Y>ASa`zHFX@YIY z+B@FqLe(tVsdiCz+lX*S%FgHk}NO9 zpAj2?OO0qUWoGiz3D zKAeIs1g$2_d|4)G{z}*mE6$)Q!*d)T0EadqC_qI28F8Xt(p7t8<~#YnX0YDq4p0sn z5uPIXGm0<^n4%VWvOKiW`?gb9?Gr;{8njj$w2J0_c=t~znhl0DTk(^_Ncv*1;|%lP z0B@YkAD3KDO)fjO5xovTA<7;DBg9K^RAi<27lf~c!RyN#K`PfSZxi+rB3KGIWK}O9 ztJJWC!cI6#2I|l790{RGD5UV0aC{AH!uWt?$`ar|`bk>0q`~aTz%Z&F{5H!DWD3w+ zj{!Y!Vl10*%BMLrGYAb0dB8{ks5&r!c6~sc$y;#}Fh8W0o%t)s3XlVq7V>`}x-l4| zPY{M)Dt({EY6o0bg;| z`-C#YQQ=RZ-;hWr8$e0jO30LGezOA)qx1;}w1kl?jz;x3;;_0)pyR}W!x?J^CM!*N z4U_JAm3+|CUPZ4DBlN)xBSFl7S}t^v!;=T;W$wJAKYMiKE^p%MA3XJ+A~vQlK#bp$;N*?G(g0MVW^K!`We3m1hAdWL-6Fwo_^t1t4UL2Re z81qT+6lYqI6=%cx+6~!DuW6^pogW)r?EQZ5LdN4hp zF{{vIwbalJcBA^?SK6SVy`DsVtX-v4Xs7$#?sp={r6s)yd%^pLwFf4iqFgv(onSba z9Wt0fOfndwHs~9PL#jJ5&MGYM1>hzP1-m+-oN{1dj=K^#EAVglt7@m<4Y0}t4V|e3 zO4zj`05}PwIul@|C5ARih)D7{8}D?Akx-5GClX3#v@=|3Plf@BMJgDdITuY2Dnv*p zMc>n6!-{USMj!;U>&`Bdu=-)iSXLZqam7!9b!H$9y{@XPb_JsDfiuTo`&Rg6AUZ_9 zLfE^o7vU3G6!zV$u!GbcWJ8swgnaNW;eW0Y(;3C)Kf2KN$~;^(09KpmvKIRpN2Ma0 zr@G6yB^v8SaLLSdf~#srbab?Gb+{3F1?-E>;Khgw!u!!YWrbKz-kB^dfHSkMutc;C z5-O_)(}=+Gn;4k4;e7^Ig{8&Cy8~TZTx$A}_xIO8fe{!s^Kjug3!&nUlTaaBtuiZA z9noK%y13uWqoWdTj$i+|s>*8mD?c4te}vO%;Kg2!r6Xc3{15Nd54R3~Wmi}CPQOzg z;au0A1G>eyZS3s+oyT_`ogOQdAB=r}Y$xuwuW@44|J>QV(;m*JuGX&RRJHiXj_ie{ z26@#+FUGV^%*9aqDvfr(?hJvX@=vZ^bfR#5jl9pEfr#(sy@4H=Z`z|lLN?r#uWUUSI^D!rr}c} z9^%KV=@HbiW_v-Wa4u+wr8o*EZF^uVaKs^EYUtxxBzu7QjYLAEvdY9f&OAa%z0|d&lzsn9M)vi9_2Yjw#?g z?z_uim%#v_iA++PuYbf?bbpL4Luk&&6gJjZEkpgqiP0B&8#?(ye9oL??tPBCb z~om_*i9dwae8m+APOOBCmb{f!f*G{e2=+ z>IE@Gc{)K=_qgc&6G{^fyA`PLSU4Ctu%>(l{x>nQ@~TF{UM8aBDxN~~ou*?!lNU`Fko5UM ztGe-^a-ej`e%3Wb5tO%*T;JO-4JVf(~p$RFO{Eo*p zt-p$pb)Zt9UD4oS|OS)$Ns-u6H>xJRhRxzoDEXDTFH7Yin%ai$>f^IWZZm;+ql?OM)dN>;kD8 zbkI8XPs@W__bfpEp_qB__f7@1M6P86=py72QPTi!SatQI`C3>@%NQc9sjJITP(jdr zlzT$a^$&{1_VkXGzXu;I&#KKd*jr$^W?#WU7?nu+Mo&|ZO4rFVxz|P_F@uQo6GnkT z0#;>Hp&Zr>&?^ag82brmB25qr{V4R^VhA2af&LRPLhajl{54>Z1y?5J!keau(TzU73;J54cZ0D26DQG1HjxX`O#@G zgER49U{ z=X-dVLjE2-TLOom!~lNFsk>4HJu+jm_6b`8Y9bx?+XQ?d+;BdQoBSwT19+t#-~I6( zh+X8KnmJLE;%rBS+GZRWj8Xu=0!C^wn&}!RYB;5tIpMDdj?U3`a{xkq4R@vUVs<`5}LqeQY!#p8*GGt=n+Xo6~*N+h_ML|5jZ8#3c8gng&rX! zZ~Je4S3V8C@`rutWA97zSveGsO}OU$ijQYMAJ1!jcHd+l5J&(F@EeG3hEC;!kz~MM zW0bGF=a;>rk;@b?lCTVQR|p-68GZQg zWE@De9mQW~o46oqk{@{rHmHG?Ml!J;8gPw&3Yz&i3wEFgMKsWY?S314MZEz9=&2DC z39GgFyzoD}B%mUhH z91wF+&sk?ssNcZ--3scpfk89cb0GE){an_A0Zh5F{kJFdvoN_dAh}d3A6okOHB;8h zFZgaODA3Zr;PMrp(2Ne^6FM3ehHJX#y(iBn}9?mVA1!30iu zZ;1gA&N4yu} zc>>5~bLe1)22nEXeH06gz+wRP3a!h=jJX{Gc3*L0`)_e-C92->$how{IeWQdb^xfh zJ-`iU+)6I1+q?-qCjy?M;-JU^N!EGE>#~ylik&pF`{&S%1KBhLGL8WRM`(r{I0kic z*+52@kZjbZE*FWIup+z0aX)A@t`IEGd|*)4@|^)!9svup1CoK#?eL!j!32Xgt38(K zzbDeV&EM^pXP z5M`U}*Ux96aYmo%@JF8gO<43ujZS3s+3kX^m^%Cbcu3c~&!Ih32CjfoL)yV$DYY9g z0X-a#h5Jvu2Jl%*0~BCX>4hf?H46@W>;(&dhVT~AbgBDW=MV60c)CBEv z{GOBU=seSbB)BP%JzxSy;vzEis8tx;gSR0nJ8}KWe258I4_*-mw(#hUo!L8>WmFUm zTmQ&8x_DUL;{K)cAFcFLquFGB@tG$#(xub$szURULkm)D*u~t5DzVP?Pn-HKD@6NU zz(_-~MjdAC^3KoCSCa((5~gL8Tfk$c2?D6VsLZjKw z=XX=|cZussfH;$6BGhh8-NPqOz$UW5NV^l6Y6P_4F5VVUGnBU0+sdm8S>4Ds%Ury( zRCZzc&dkMtGeGdd1mN&Ewcr1Ui$ZoNQB+==?w6M?1vO{{EV<0GHZyfG|VL1?D->M8c=AR1Gna#lx;FI|l2W zRTsuH2SUXKD3Lc^)(_OOq{pPe$W*`7+lzoq<3%ZXVZcX!6ogteYh~IP?x=~2A-Yla zs26M27Xm$uFCjCh$L4UrN$1(phRrnZD9EMF{A~d{69_{=CYPIw1H=W<#m5VznTu~p ztAO~;cZaQa9IUqd{e1pcYyBy#{Ov_4p#}aaz}=KQKh+MuJR%YWRpm!*GjcNK0hbdO z%wYVu3GPhrM*}&vOCJLq7Rtkx2L}V8YDXWUt4?>F=!_T83%Qrv-hqI#=r`~?DEcnNiyz*q#m1Mu#bboN62wdjbhwaz+ zEH+#|3F+zVnG|9{t!VIm9GDt5EJS>?h95`>Y8)2OtuttB{;&r@y}?=-pU z1yz1|EH)r^g-iuk5FC2YHa(A}8`QY~Ohy#cw@38^nYEZ9nQB2U=Z3|chdD4H3YZDT zd=@cB-hiT@ayLMd*B2|D$P}v7cHMMVUiq@Ts=6mmwdnn4Z zZR!X!*|4?Tz}!N z=V+(wN5j_F)`cCboo``bQB_;F`?j>ov9z|me-d?&}Qz4+G8mV3KDN&PN~Z(_j}^UdBCgTwlB}(-fEotSl)mE)Ek5 zXXN)|8CbB~&n7Of{K>p=YfL|^zB6=ha2?+s+ip~mF8+NC|0Ppeta3o1`b=sv72_(^hvBtFTpdIt-^Q^9ymJC~e z)XWKZ3ta~mjO-h>q;GUJ0RsNH-7Su(2{U%tZd93x6xiO&}M7(T1 z&k8*ueel$@b`KgsOHNEFdP2|Ej#Hq$$;FYN82vNr9?E2k#RWWT={h#tm7YqD%PLL;q53AspTbSuX9J2->A&{3UQhAW2MJgxKXYraH+&7chSLgzYGM z2sN|NGm>2(C>T~PmxBUZ#8qYVI*hz5ITKvGCKo~R;SK!uWXTBtavPhJEZRoS@df;j zqkVRe$6k!T3GphOsRd^fcTD<&b+iVu7&ob=1U+*mF~#OVcOHe^FLoD#4V6P6cwnNN zCFsQ204o>wuY!{5%(^hu@ly^vgZzLTl*n>WYv8djEIE4XCqR|xf9_zKja>W{P_a6p z>X-a}6F^Rpy`3z|3Gp2bB9T4=;I8VN3uxEiS$SDsfmo>gXc6gf(Bv#5nuMaO@&LF8 z0~Az5Pzu3bb%@o(j%SOI(KKLz^p*%E^(34YVT=V-JJm4E%(a7|hFT<22*>S^fSngV$_lFxC&dzT(%!r5gA9|J5Yx6a{V5PeaJ-Cg;d z16CBj%PxETFrt=nc0HIUm^oL#pT|BW6D%$523pz`XL!9~nd4=0WW8hQ&3mSS2>~^> z4JZn7Hjfs+!^`ONz-4{**ZmHQECe~hDSFYF#j?QC%s%ICXUcATR-9CMPO?I}>{yQE z`_NxRN&8ku97u%c)@*^v#{!c(3I8#%>%~65b+P*mZECm?5^awk5!8Q7sG5?xFg=>` zM9Q;w_)YwHm-@X+_{q5Vr5ob;o74|)O@t&0o_@Zfh>v_no`3h=cHeE@w?eP{@iavh zFazO~fDal@VRzEkFb8?<)~Dy(@m2vSA`(-6ymtF<(Y9ZwMi;APsr(aBd|z`|5b4F+ zrQ5@zY;T43PcU?tHJvBJvTqhsJ7M)5C+cHghdwtH<_@o@N zZm{dsm{4}e1@i5Oi{St9q6aRekA0%>4B85Kstjck}g-?$_i_H1w*5&3H+m)r|{o-YJ^vTGSoUP`T z-zCDcWL5mgFX0is?F^-Rn;2qA}~OtZ-E|&;Gfh) zQ|ixIf}D|pseJXLoQbO{3j{=`Hr?AyHY2U5lfM;-}1~ujRb`I7)`Io;dCmg17NDNBnpXQA z!OFw4{T@X=%K+G%Ov-uu9}|9W6aJ=tk~b~kQS`E$BTzplXA4e37)f2_fd6o{EA2!8 zdWcUI_@n2;qDMb8VEW-FsfkrXk6I5sny7vr4mQ~k56@yBzzuXIGPegbK@pkeg}-n& zXu%_{h19-uMxLVRL1Vs$Ku{jJNc7HdH#h!BH-1T1yU3T|QGFS)C0_klZ;5{Zc@gS! z3jDicjFSgbwUJi!Q#*Ny)bCwks=sq~SyR8KNxqMie4nU(6drDK1@PQLCkb6W+a@XE zUqH|FLoeUUj=9>4*>C};`;I4)suJaR1zbtGZ1XJeNxz@t_1g$HPd+@0-Z~lqPsN0Y zi1;<^^T!wQe_&yft3G0XKiU9*`%(8WOw0inkaa)&&<8Q2{_Ny>J4`blte z6O3{bWUNES1I&O~lN6mRwuk~&o{=28Ba_?wnEXutSM6%Rl8Q(8#ZS`@Pdr;}vGA|F zn~tfV^8J>U3n6xJJFgFZpLw*(LI-geUJ;}a#)9KL8ls1pvkzH0D-YIF@<20FNg8Yc)`3*l%QIoOPds88a4;b4*l(E&`r>@o0Wa;8`&6eZ5dk^o!Q zOQMFPL|n81#IgdWIRAY@Jij1kBQ(22Ois)e&<{!puV-G9*&%JY_z_G<=NE=6T#+Sa6N;ZmE#xd6k%#$1Y+JonY?Nw zI3{V5C|>Mnx4V<{&7%vT60*@uRR@e&dPHZMz6(H_@AhSU$@~103B`udnF+m2b;!Hb zpUn*5#BWO?d48hareM8KjC5PH6#moS#W@D&&%lH;8-ov%JLB!asPH$9;FnC~S9gQN zrg^mR^{|xZ#nej>w=4D}4z&vdIEDx$6SQrpUGgnR&4RZBp09Z{q`#g{TXwY20dm2H zHyLBQc|3+Q^QQ1`5P#o@zp23X=t4d>4FStju)eR07=Qj z$p_pe2}coR)f^O!We_`500~r9MMM~b9d;y~q2nR^{CwkhjQ_GmxdG^y3g_w^in75m z58Rcp{0o~&7@K#Kcsh)J68v5aA>iFf;JiGj?(o|U@eqy0MMOBDvx2t=B6ZIyx?PZfPOJezxaT@{uZ8{$* zxE0z+`nE#_vd-ohR&8Dv59&73&Bo2mpGoh3n+P20kNJ{uZb6FTdCwF3vwGLnu2@Ea z&x<=m7bVx#%4bqG%I*6|mR0fmuQH1VckHY$Y?}1CIoC&U<8kz{oX20&yHbj=z@Afg zWX3N)M--`X{4lQlB9k{AVx)MPjflxQXKW9s+W?+m@=ZYX^Bs3r4A45^oMg$jV%TKN z@tSfiXKR=VQLhqnyR3|U<|_B+3a;z3<*Xz~F{R{XKUmagL>4zK|<%EUlS2 zW9}gHXx{vex;a$<3+D)%tl+*{eh2e{t&7Cu@%+4f4os46A|K(K-jRhgU4?w`b8JJ_ zcZZmb(KE#s`@jL9H!vWEfQ_^M40NBgO-ahRMd#KWb3sy1@(vn^r$Ivg zw+MGP&rR`5eMJWsK!z~Slo1kz#*`PXp4@>As^(d?8{DEx1F1Mel@d~6fcu! z9!R9)QHa3oieUqY0DBsWUDz~CVq$i3-aW8{iQPf;?K2u|%5@Y}2jO#yIFOV9vX>~> zmsoyQa`W3nzu#al-J21=XgYa{pLQm9WPx$h=@i9tBzH9cPtwi)K?*%jK4wnoC&PmE z(Lil)-b>Eex;iyGGHG+_;UsWMOSdE77j(?+{>l|#w;k5F`>u<)xi3+W1DlVyi_H5j zQS=Uqpw!LH0X#2z!DbX42T)`PaiwoWKhLJMc0z>RMt7-@Pd|hbh;BP;ECKhVutgw3 zAyk?`!ssOI+TR9AJe24--wnbZhfo)bj#u*mc{0btxd!18Tc+jx?>j$1jxr)KIp=XC zV>Ov<8is;vUWyj)J{6&R5k{lvcgMh4xsSLRkUBwcUOtckKR6LF!}l@|qQgg#Cr$*r zQSuNMh`<9nTunoCrtoH2Wls~kvTabZAo)H?FdgeHq@GDh`@n>NYvw>F!>i4}x^9c8 z7)1MJX?LYMSKvJ5$I=!^9vGx3C)x{+$n=HreZ|w60PAJg%R>DH38d4N_NAZ0#&2r$ z<=X>`9#w<cKY6WR;(~37 zTjSv|2mG}B;;^uLzFX&?BL?&}*4`-a&*&3yW%1+u%szEN{y`NtZ{B$zdWW|_^kA0% zrK!F{R>yCeEcyPMImVvXB=9`$>a7|O?=jReh<;VSpILACHtafhJ&MM+$>!hN?h{q@ z_2I(>g-J>0Zcq0O``znyTK+e%HD+Y@#$F`Q{6J#-!NmAK2Ghk5Oi9GIi4S{(&!A%T zAZ;CEsNTVZeg)N>n0RVvFIPdQi{q#h9QasHT{NJoqvpS>P6vat)ON>E-yup+ww^I_}J_p+bpoznh35}=z3 zNoO_d43U3&uCu6%^SO_{m@9~7SXb@g78CVStZcS+uq}wPE$u%V>53+6S=`iG>V?$p zkiFN`oAjHSnnhum|9WG~FXqCV^tBUf4n9$irNdT8eWJonIRKN)n|f16WRhJ--Ei47 zx9j@{@Yz~`CRpDj!xHY4`A25|QyHdu$y?~4uo&5F=n{T;Sp2Fo`k%_D!Sb5g!oh%k zmhKs=wD@e?8 z(&lquW?-&I^b;2d;Hg;?alk5Fc@vhRY4fU+y_eTy4UCU(TE#)IJm*0eGdfgfT_UwqU{hM(pkOq#^6+7u ze0(r0Pl|;p47$U+M%kKp)T1 z^ivn8BGCc#6t+tDh%6d_Fw9kSqK@*00l5njysg`mkz|&VDS5Mr3=rEj$7m9&gJk z3l>B@hZm_9ZukQ7-Aygu;P&d`BR$Wmu6-$8IbtXPv+jXEv#qKexzadO;<6EB zXga9X-Nz&cUuOXSEuSlzXJsE!(efJUTbfLyX38BTHL6XJyk>vD=gcB#;Xn8VvP!4t z4n=kK%Na}9+gtoX9vhtuaY|SI@qAkb^(C#<(?D8+1G)VRxxC!%0os{t?d8%bwcgt# zq|O|y@{5Y^Gj>uMvc=>~u0MoL&zF|ho=nozkh*}&j+xK3pVN?vR?gAYTO5awx?Y$4 znzc5Y482tgPPDeh@WD0c+N@E4Ot*mMAw!!)WlX|zctvIQ(CFvO8#nZ~jY8_m?!MRB zTH{zzX|qZHMFP+koNB8l8?_MLAf#@JB(ix+V_i{sIL5RYP@@xWZURyx?{;a%+N7P% zo-@va3X=I1mEt(z*UwoP@9T0mMz$6}^iI7! z&3gV)qXjwb>A?9zN<+LYsks_uURWj^Xc6y%!$-+MClH4!vRNv%(S*0!x^a*ah|4FzMO-)z$kL}f?Uk&W}wzM`u9Sz7(9Oz~g>G;%OhcOHT-!=d>QXP5p{eGa_Cgu=!e0B~Gy z&l3!<*U!pTW}!qUgJMtCt4MMGE1_eUN-`NrnK+u?Sc42CvEmGyCBK&S|)M4ywE(s(3F=)SM?mrSs^Xg zZjtk>buv@REe@qhzF)2G>;PXBgXp?(>s!Mu;ZZa_ojcLcS7b;*PGr0&>3>@Sw%%}d z>1Q35OjpBwBC5>K)9y*}1>LVlT<`e4zF?md^_Y69cUP8FYNPJd06n6ZMp4751I;J< zpp{boVc~-opj;v2O$ltKxNEvuKs`HY&el)ek_5i2fUYFxEL1*A?WX(Quq}Q2=<*Qz z8H$B;CFd_*WoaqeJ;}Pz?N5Xw)P14gi?L)}AoPb2-s1NTZwnoxEYDh~MnmJ62SbmV zt9!)2mxtS!D)G;%BH*d;X?jKaDdna2@|r{;_AEIZx`v8$lRI#TORF!+%J@Hwp!;mY zHh;>8wY3K7?lydi?Tuwj{b_Ai_Nuy127D1S2UH9KqhErDr^AXAMhmBgeV-IE-A0g{ z^OMh&PX&+Q#Dx4t2HE1-os<*ouYIu6fIiTn{94_$2ELd>;~MHJ*aatO&2OZoDu3qYw#tk7u|Zr z^ntkvJS{cWEa>dkBCrgwlc1A+GW{t#4r1cT99br>myTM>9QJ%RZrhlix_%T^tDidu8Y^HgBjL?j^_;5iHd9Tg2vrt?1J#l;)LW?74TrM+)>;ZJNkLH;Tee_~26vCT_ES!|)^%44DiNG@ zdA5h8N8PNj_};!{r6~eD!0qVg>gej~U?18x_+UVF9z+ULQ%Vu%3%7OG4Y|&jLJ?$%m&We8` zw??$1NKhtsyk|fmgyt%P7TH;^7sSajRoh7OyMG8u5TH;Kijn+YZ15G+m=%% zm#b8{di%NaGMqbqF?3$#qAJNTsovqguv0jfij_NU?Cjc;8bWb7SG&Sa(&wAwS6m$D5&!z@cCXFbw}-91F}k0@JdqZbov!3+ZRkwr1DFt2h6H4F&eeTjEQO-@TLpJjcCT+fad+h5EW{r{Q z*#!i`Q~ULv_ziE{#R^9KDv{3?IP0C(r*2U(olke6JSeWrVQ@E~#0yB;We6o4_usUG zl9Je=Qzi?>TpH)W)@k*ZI1Ze1rLPIr+s`|NCl*6frKwe6{$c|om#n0uoFB>-KtGS9 zsos~M>C?8)eXatkK64m@7ZT;$qM=dJ8ms22$a_4hne;d z+3f2pnwfhIPSN^`(!bf8<7E$gJRbb|1!IZi_GQWK@_u9vgqy{y;$=N33+gjHV4o?l zF9!Lj!t>PdC(H}~g8_Uw#<{9T?U=XEoShNymaSM=1>UW{o2MQl2i&uT8779wvV?H^(dWheLizIXPaTua6ZaEd&`^40E#B5}&#)J~hvQ zr6E?3p>J2*mvW&ByTZ8EAQ~_(SNS!=Dn%8vS%DrzU<@|I4 z6cKJT(gv{LTm!Z!BR7kXls59@Kfin>B9u+S(5Nzgg~tKO0j3 zuZ;y6c2o#;+7PTQ^m(Ptt^(VXvW{>oBYW^^i*T;F`1sY8#}=J*-$8j#u_-OsM#DmV{cZ3DluZQW%9Y^3f?+7+bOW=Qc4L zZ5i`B*eNzJ5QcGaA+OVE;g>4ktJ<>GiX__oXv>{F6FNHgleW{xHkfucg3Ua3Z56dw05L%&-kuYu% zCFgyi+Svv>6pR=2CQ6xj74Y>(hJ+W29~J4*-Pl?HxE!M85}qWM{0cGGVZ)ar+feZO zDXQ)ZJA*Z)b7zrU#X*ukZ`CYw+eHJJ3G0BVXg|A#tH2NaS{2(C`(iCCb^j1aisq6#LY*D`$uF@dw>PKPAq6YO6jnruc|M|T3lOgm#EPLGONN!I<)U-jvGS% z8r4XE8Sp8QM#iOU-OXdnDV~c=mi*4!7+>R0!6r30u|Im8wRrQN5tAy+V$PrK0(;ns z42gV>Krvd7VYm(R)@`y)_pjVNt7w7bve%5CF8I@8-o9BwrxZ}IL2U4{hukURAAonN zz9@I^_dKn-V`SvH@aGK!!$-{>lc-b)L$AK}x}7ukr3ELZr|bFl%P9SkDlC{SP<$xJ zIEVEkArpVrl!ctS9z6PdzLVvXBRMzcg>DJ>A?e=Yf~xJ0T*3@yDZVM|<1-`o9nwcc z_{rX?d~B7DH-vdNUUA@rNo+mHS-;5w3n0vQF>WNSd>Ea+kv-RH!HyMf+H;_4=CO67 zH7jjLoH6cbv^8-fjj>GO_YLtiAI2XPbHck*9{-K4nD8If6oJ=tMuB~B zp;Cc+I`m5H!m0@~teTKEUS$xO7U=fBw1IOhptvVzHQrWfUKN_{C@oGYyfER!dfSYp zGwFsctEWPvBD^&RZwS&;c7vrSH9hur#UBftB~h#6WpCM;Q(UdOs9E@8shLUbN517h zxsc29j!T2DEVmGMu?f4hG|KjevR6nKDc-SPgZ=U9A-q%0rtxwjGc0)Fz_ebbtA|Jq zcoI#8>O;uaeQ616tl3iO4F>Q&1zU|P;u5|;d>b+@lC|RAa||WxHiKXqgZ*upl+){@g{P=)eeGNM+d)Zw1P1m>j#~& zevni!GEm*!H#cy)j(Zoa6kUc4t6-rvI79ge7J^QDrCT?nB0+$N719Unkz{VbEv^Wr#lPYX_k` zk`hV?6(Ox${YamIMELK3#n5REDi6~dFGH|Fe6Cs_5&C`7vS}80iR$uORl`e9MHhTw z$}4#{qfhQqy1AW&*B@yqc-tplT&b@ZL0dygnIge$-#J(}ctP@!g#OSE*K!+Q40m5_ z%|C6YHK*%Zv0Cx3d=mbgKQiQEW^fGa5QL9|Ou z{>z<&vFa+Wa=*t}bRYi@TqBKBc>t}4K9(e=Hd;q3L!YAc3>cF3e$TG}#)m<$zmnS@ zNPB++n9kP54=on{wjmy{G8R7QQu8rbO>BnfSt%v9buCvBa2_EF-8UamQdZ4dc(-nG zy40~WRPpjD`Rlp18OML{B^@tSSI0=x@NV4zaNopC#cP9&$3UzQ)d!#HBi42+vJ!a0 z)?O7G`F<1taO$A?9)uI+5enh8%4aUn;wqc?vp=&3{9+!1t`0PMwO(BdEnS zaqd2__<9t2;qGU7KFhf^!SLm%&RBN3qz|!h>v9vnB@skCnFXC;Sa8j;x|E_{M z4RFa=boI%N?xe7e72U}AgLj#l|2D*`?_$miM?nPM9(V<(XV|L3CLq7NhawZap1rkMhV1g)CYw$6u?ku=-J{R=sK~Bv;H-&Oh({Le+z<3SMm~b z+bRY}=kOLw{r@lazd*_P_rP~i`hXK~2ZeYo2rlM*Xi7c7ncJm@hX`jjdeo=6ti%I} zTIZPJV}EkLWchmJo;TU!iX_%DqdbASgx8zSfhKQo_GfDW;6!6x$IOSmqPzoAdj_L? zErfM)zxm#;-95B`c2rN-c8IXLgWSrh(A;)>xrIbP9;SmV+ddhf=c?_$Zun;8Wb@dE zG4O}_6eqa2#*}A;amsV2g*pnx7AHh;yQ|Fbq%)fT-m%MKj_KpaDv;Y_?~`z2?7t#f zKXcdsTH8@XcgK67S^-^HsSw?FsqxvO+qWdPYJH2f%=B9zEF zCvN%5J!bG1<{WGL*n2pBIU4N!e>->r^}pQ3aLf+(9@-&Sv5oadU#6w9TIzmj1QT5W zYU)!Sa^c6%x4qaQ;{NGpRHlmA%+Y@oNkeYAHv%Oc?8iP7_ohz(w_(EcUvvJK+tQ5O z)TOu!NSHJd#IX7>x1?ae>&C2W>QbnRoY~=anW}9b7JhbZ^S1e~_-&e-np;;;_Vu;o zz3-kGaR05};-zyI?y(fqfS`Fd zD`X)hDSb>Y?{YH^C@3K?b|=6ql6aLT~tQ#`1%}>fsedrN=K}`N1S?VWRxj zEUjuPZpb&W`-_=2FB@;y5Ml@LKm#AHO0sch&3^&veWN7(f4 zaF&;^1zjwWg?rVh3iBXYz>ImgSN&gX`J%eIK0o*k9a7x5C5YRjXxK3{0wQ4>8Dl#- z>+eG6`VmRV-Xta`*boYKD)~RD|oEM`m+@MKkSPYJY%po z1n=1Hs{FN0mr#&G5!|pRENGC4dKV+aPED8WESu(A?nCN{1ShbdBd$QtCT#s7QqVy< zZ&=*?B{);~64VNjY(B(7vyP|MsYd^56uYeAqObvQf;!fIM7CL{kxk!{s?(7P#a6iK zJBl=+S-tFW{`AF6?a5yl2dqpYH6rY8k`e6TknJ4IHvN|?3nW|fBpRYX5J`~Ct}hrW z%2S7=v9+%#l-{C#lT^w)3@*Hoy?7H=%IwC@J9Q(RR!Bw1p^&PHx*aTJA$w!2fayc9 zM)D1~VFy`#x@f6CN$EqD4D$|bEdM!*a2Fk7`JY}yZoL1vI07Rel{n&}DJzJO<4~-A zA<3@a;fQR{<1P~^Cc_yu+@3cAL^+_t_Ph>qQz-s|YXn_;AQCTMl{$TKU~S=pCtr}@ z=k244522?TJnAI=y}+_8whjxxWfj09`e`JcBpgiY(b{2Y8#HOc zou&Ga073@Np{utubydtx@tJ{zhN2+S2mj2)DUwA`}B4p#&RCMjrCR*Z)p{ z=;bT-hn-I2sqQy&F*8(Pj?*(2VO|e zonjFQEx04ylp7;1_B2`U=4NiPLFG32<>6G!m#WQaRevM8xj`vNi|Lul zOc@Ct+s6WKdBSm&Lb}FO{YeX@p@$Q7HF+8sJ$t>(OR+1iZep6 zk#9aZbGy9aoaEG&cniV3)$!F#l|BHc*z(iS>C6dtw%)1jLRY8u!l4F@FUk3YrZQ9^ z^x2VifOua}2kM!Ax z0ZbYyCESw87c%6_ZVz&2YXP1&$<;_i`>#>gDcx&>d34N@jAptI#`iU5ACu|{kc9eD z^~2J?i+rw-$`AV-DS9wfk+3CRY-h)#51P@ftEq=0{|$QJ+)Ta1Tw~dSb_;r-jX2v$ z8*+AFwoheAbDSbj&@PV9o$K#IY;BD3SB>f-^^eF9}(o)!mi)e-9We7Q!|MZpuIg z5&>|!?<_BTl+xu7Rdie{v`4sMBX(q z!Fo)N`&m_Z#|Os>-m2A13MlLtISD@6_i{8jZ+_}njzTJ-Bk%xBp3jPrnEtzW)1min zX1QO2CDJ&KLa3bli5yt#A1ob4SE~=i)};e2jm_irT-Rx zE|S)c`!cnzk<0@r!@z4E*!(*5=*7!PjG%QA*@6s78$TkL&6UWpcv}+bSY) zj4}VUgNa=Jrag(Vp5mV+iI?DEG;ZEnit#pPIr@R`=J zt)Bfn76L)A`Ph$aQk~Z)d-Pw9CtKeiZ-g)GW<6d7!nPOrA@T7O^_)BtE#&qiya36-qtYRM8t5IL z1=#gTQy13jpp$mzLhdr{W)Xg6n)VFrzGNetK%`~}ul-`{HRcQ?9jJ!^e3EiDxd%Yd zFfKq4)`MM#FX{p^ygi5QCUMAWxF>;3BA#{arb-rgjABGjds1r$sA;d!I=FEQHvj3< z^@+cZAdpGK^P2zAqlxgad653TqU-e<0tKIoJY25b`{HKK(@lH)-E$&o{Dn{FM5`3s zpQNqfT!AyePkzZ%er$y_paYAgp33D`h@D-*%>rmPV!+h;%D)K`im5{sJ?(yG8UneLlb z1-m?XqzreyApOR@2TvTRKU+jw8{8?U?$Uzy52_1fM}ap+YQjc=t%lQN8{5tBHR(Tr z0dDB=y3l*}?ch}uPzS(szPaR3Vu&gDq0q4Vr}VM6spzC7h*bj!HT6&Ce- zz8QiiLbpHQZ!%~7VgUKDjkL>P!!*(WRY=xu%T~~DR)}Bj*TOeq1vy@Jc7guj$Afp5 z<5l408|rJr#5_DNUntaI3^R!3lV0I9E#Y(5*1w%d(?cP!CXVT;6g?={$>28$ zA&Sg;ZDgA1$SYOGb7x{&5F_-FOwrKZs)z;u!NY7&v%=-N;d(1sH}g}vysk_BcOhFIpN|(Vy8!mZ?JaWbOC{qdkU)8MYSUSyCN;6;oJy7AURhbz?aV&8_5>E;=xZ6G;{-%T zum;#@b{k{GdGYc7$tP0%9xT%TxxGRj8}6OKh>v&}u;a?3te1zvt)~>zknP|A_w!gf z7ek%ti};&(Bk5z$o8wJzD?`-Vq-;N8<04-Xfym|l0aqjnr7}Yp_NYVc;3TNd&>|@& zM_`FO!r?{HI}m?Eh~uwLM*4Bf+9?^NSjSaxyTQHuk|sOiu#8vHVPf(_RkkwK)R`z6lu9fEZ#t(*bu4VecI>KLgezxEJ}i z6C!SFXs(RWQJfChNN8@pjdvTHo2NL=7la9g#XQxj4rZbKn=UU9A8e;g52V8Z14&eE z+yO99m1*Ap2f>fUmpX}J7Y635X6k*KH~IFu_pWZU8Glc@!_IeQBL~v~B3Hr%;Y9_w ztBoCm$n6C>o~`w6(3SbAP96P&WJ{as)KPGk^%>db&QHHao}iNCHq~cAN%t`$Jx`#c z^wYbF-N`A`^=+^O;1ZFdcrnB!6@03f94sSfWiySpB8Rh*K2kGnP!Ni9X!aN zO#dpTK;fAO0flWyDm3G8?P<)F`Qx9eLC<}{GOmeZBs~3DA!beWM{%g$*5qrHrMyQ? z%CDGhQwEJnEhJG-pE{C9OQrsrT-!4bjy63lo#@d;pL9^mCZ|PjZfLdpfxZk5jM!NM zDrz?)e`c>AaZ^?Ajuk~^O?4&`HnJV_RD+eT0OjD6xt@ojA3o3DmZ(KY75`k&^o)6` z_`^-Lz^VI6-Eov${qd;bpI`vubjJDSOW{T^vW$hrJDdDYtQ>=UKtz9q5G^q zM}rsTYfTg}XRkE%ZnCG@c;%obU!$tdZrW1YXmzY-?-Q!mWJy_ETiZ`lf%&YyH9Aep z+gmO!EiKj8L1@}X_KJ4UQ1^c*eAu0Wxp%RBJv+P$5?ZAjV^1L_o)|-*xI>DaDI_;^ zUgkE0yvW0PsyIbU1x+mgC%Ao}-P6&Ad*{8L=7@G|ut>MUe`a^Yv8|5IMD7?v%fOx# zGc9;$la5VLS|s+-G1^EdjQwTk$TH6U`*BhD;1elRSuex z`sS@b*~tpwxzK_Z3!HR_znVmKy5gQ~op;_JMQ<%&AL$Z>uorDS@*-OcK)UHQ$H#46 zl)?5>BQU6s-6maog06H}DO^0$ROx?QTH7Knc?(7wunIFhr(fNKz@l%z^qGD-|{IJt(ccF#VCEm*1>VO#+uBvh=0{+b{`6>Y5$ab z!J9j=c{1s2x{|BJ@`LB;+}CshRtKckC9h1srcnF~H1pQU=W5bfYRM3oj_mJBEz3xX~*`ag7NP2;DYDt&NWeV4!pZLvfMB8`=CPnG$C zX~L&2DAge)$}ZHiJL5ODEx^X`T41TZpn-J8ckTJSJx<#gDdD1njMKtMIBZYuf6xVy z+SqR-moXSARQ~4ly#Tsw?CO{?X!f>ugZ*I&D`qf$X1Bo9fXRH}0E8M-kFD)0W5~5r z=?EUrTgP+NhjF!_u+gOZO93BqUJo$6(TxpYBe43>$F$LzGiWuO8DqF zxe%j6`jvQ}#u-&Mb7zN6B(_g{J%*$f@h)o;ThrHC-HB0JEd4Cma?(!&Iag<{eNCnE zHW>Qy&-=T*ba8CXx90ov#*u5fY0HoDYf25z8W(y|b19{Q$wWF|4<3C!-^ubx5?+om z6faKqjj}E6pIdu+Rqii`u?Br+QcjLn-Q@LNz9(*_eN*&c@BayB(?@u;H=4uVvUAa+ zudyI4_0jAzSIU6>r%x!(z%L_vntFr`=;jJu$#M8Uh>~eeACb#EOsP<6*ZlZ{##&cs zvQD!;b6<5jUXum3BFJ560RPk=jH81FLa46@d*CFpqlYEE7rN&K0nvLn| z`Erdj`Xh5+yf0pJF%M4%6XuFU;Ty8u|; zw5xp8?ltx@+lOp?IvXxs#<}L=bw62H9oYyqGB~;NH029KqNJL={gZN*oCtpX!tJrI zD^Js{nl%vHEH-Mx79?ZmQ*sVv18dmG4KA?Uka-!~(;5~Ve9^ItFRI2^IQmHk>tBul z@3bvsl-`VGWVD`-N>0&&jK&Zdoxzo@B!>v_7;Pg3VAfO(<(fToiiOsN@2t;a%-%pO zg4>VMu^Zl_S9~OnnUyXTg-ahF!o!*$ijtD1ioe;N<7FLav-dcxlLg)1BTwU{wT1|2 z$Bl5MTS(V%3#tNcO{O##A;}&+(&|KnTh^a*uEI@Eo8#f|7kh!NhuQ+_ph_T+??t`or3x+6aKNa^+wA$XE{kAm_s)1_htNj7&w?his zNaG#6SB&uxtnrKGnnZht4AfjuV!y31TTj53Ra~Bl3U)r z@ir$LY#w?lqffw<#c9UQL1uLeM9>q8@9QVJW>az?X>%69$%9#AWcqZ`{S&oS)X|c> zqV#=E&~Ctzr_rXug2&T3z}jLaB&kU31NG?7WfC<`QnR?Koo0hQemhD*g_}Z{)X3#> zu=c9gy2a6Q`zm}qS3&KqLFyT|~!ZVF-1IDx&;wG&q6wfwmWp&ooF*K%vpo4pO zBNyHPYz=5ceCge4rizHPK~vv00$*xkTVH^^)#A%wFGb{-sV-*Fn1FC3pfT7E1YspA zVh4v{ui+KmKd#3kU$cCo97~Vq>zkiiA4ZO{Bqk;2{2908cdx7x@bkejk?YYd@oEi7 z9XTmIlC6rD^`*k7(+2f7;Ip%h>ur#=V!JSKvSUzmIOl*4K6bhP9rs$2$5%;QA5Fo{j1j+FCjTe-Pdas*Zuiz zsex)y+17v`lJ32eu_a)AS!m&zvil$ULYu=MynKB{VXu!CCCvcmWiiBVytnKE9qgdJ zvsSq}Z%f|-&r; z(IR8o5*iXl(CQM*t+bXT7)x6HTWTmRK^W}~LP?_{OK-Fp`_gJn^_HqCLnumBM69um zqOAm##9mvIAY`BUKkxUQb7m4jmPwcU^Xs{hsw;EOd6(yX-sgQkNlxc+J)zkM)NTcX z>0nUPy+6&4#N&M7Vc84r@;{MMFT_(6zxU^}}+20}jOkF_F*if{{HR0P4MzdPdaJCpuzzI5~-VAEFb!h$un ze*k0#{lpjv$*5%>3LFJL=J>2UDnQ>z=gm?voGqX7?yMTh(H}$Xp{Cd;p!~r|i(=Ny z7&bTRuyJAy*#B=%S0LF&olPHIwC>&+|L=uA+zJ<0c~R^P6wPT1R{rq~a8w7P{vy~c zpM58P2lL@jM2gk0W9;_9e`hRumAqjm5Yl*mu7y#*IidOar-kl0gP*n9 z)>M6K$qB?rZlGg3g~1V`rP(*KMc{YX@&TUXSh8bLfN%+!x7>AdO2o5j*E>rMF0 zF@~h!{7WN4Qo5I7!3nSR0oCxU5D@L<@80Cmql(MQrD4UD9Es9u4RJwZd)m9BA}0E! zi~^6K)BAFg=yZiCnJJ;Szou5XDl|Cm`0mu;xQwB}x7`>my(K&^!0IK=)2`X189~d; z7EN3`)^`?(K_EPuHNi98oetxj8!sCwPr&^aW(My~e^;lqc85jKDzCHs<5ltmW+UW-2yf@fnzN^KIwftHn>m}#bjeOz zckOBq;yFF8CJ$a68=o>bH6i(`_bb$?ose_$VH~yek?q3?P^c9Lwe<#!EqjV-k~{zS0_Hr^a-hlLc}}QKKsq0LC@^<{iNUZ#=|^? z4!G|zN=t3=5m;s&ww$1UbHz&XmtYX*=Iv?mDE>G7wa1&#uaC}qq^E2ok1wr5|N1?% znRfp8SJ(_r<~T)IU7DCK*Be%at=qH}uP*Qtrv1sd=wlf0%KAFr)%i}zUQ@dr^p8dO z4IkU#%@zCn^q-{LXs12jTFbt;YR|`b(JJ0{WZrZ$kG!q)QnZI$iR6KfDjr#A3&SKk z-&Y}v^E%P@1c0$(2pGnWW}=&?w|EM!?us@~LJ94Tw1D!AzNd7TUye~;M;ICdFO>dqFl_txUHv!kNFFjfclAjQW<6)jukZ zD;Q7_V|f$A^Tm|kIbdNqp29lN2@ox_?*+nG{Hy!YL`6Qj-}5q^l6%q=cN8ofjYUYZ z8#*EG6A}iO;?x+9$^pPB4Z-ANxyw#i)Q~>9BSg70ZAGA@1^9cy70L|O|5Avkx}<%= z&svzLlyD~jP32J+|IFh0U3q6$`NP$Jqvo=8^M7tNQz7@KxK07F#v+rKD-u3o^bsFF zLQsZbbNXIHb_})<$|cxBCQpy8#%0CPbRlAY#jxpJFkp|baK~qdudrG1p70*NO8+nm z=a}oBR=?Op22WpDWg$AO^y!_4OG_fI-ZxuHlXT?=_<1=-W5pw6I+b34rYLF%%S1f= z&4~_pdhZDiQR2>AzbGqMEmo#bf#q}*cXJ(1NUFqL{3Uq3km5R7JmHrTSVj!)9Iun5 zyPy)SaaouoOd$^Ac~7T=cn=_T*P*P! z;FShXNjz5JML!udN7FB|mDHiC-KSiEVjPFvA_m!a-qe;htj&ND3icTvbICTy?+A{BBY4LMK zGJ1OMK;!>HgufkQTZ|*q%fUn4#ZvqgH2W-0&roQm&I|9pi1ZAhbznaUyb~I3%(&Vj zmEu%1PT!!j(a-O#6gnU(-RdqBxI2Iv&Ow&N)?x7fBwP2(O`MK%>i_X*=C-OZWG_E~ zx2zq7yHH34$=kb}#@$Y~Q=3Nh&6D9SCtP;8$_*OcRbrtr2n8zRW;oBzgF5HhxuH`# zVk}JDofY?<)R#%Dep&Dm4?db%t|m%}TTZnQhzU_%uRaW6omwJ`9cNS6IN#!xejJl$f1g#e@_d*_-~)3+uJ#v96NDM3!VD zsfENVRP;)-eGu4-9yyxc_Vr8z_|5!?jY>cm;B&=^_sNQU@SmOk0xet-}8a0OMk9d2V>6veREuqIyYzk&6VVpX5M5G7LkC02Ufp zZ93MpYKf2^wPxp|3dR zna^fmeFUFgWdcd2ajN)~B`tpKM)hzm*BgmE9oJuJid9u|l9<~Yh9 zYag-LuELIGhwUh;Vx#ma_Y# z*b&qA3H^IXgB+Kd z+;eu{zF&eV#<;pyQj9S{B(3g;y0=y|TQ-7O+Ui14525YrD$^=Ac*Oo*jZF&a$gM{2i>4m4s<8z=w8xEa@)3=iChMTa7p=Q9c2V7DYVKY_n93NK9c(%- zR`IYelF0YPxi}7^p1zKYRigeA)iQE}_LvA96Xvj+D&lF!xn9_GjcD6^(+%5`g0+rp+Jd;^ zMhe`rY0KNHXfUInxQ*x$@yHhYwC}yhmx_GGL~-`mp$XzR3}5C%RoG%^Wqy2m@zLk> z(ng>2Zk4*T%DGN{c8DQqW`#UL47qmZr854J=x}Zp)|uhJypoE3D0ng35F!oMiAr|+ zUKKCM)q6_T%{AaY!W8i7t1Z7SH09TchK?%tw~D;$^xSl<)|zC=br%qRqWDK+qZu@j zAYB2Mi77w3D;|Y&`05fz7i29j#ltJKi!&Ix3K@dn+pv z@RruSIh>Tk4~;0Xr!0%9b!DA@)uFUG)GPld*?7#oLN^{3McL(`9Zaj9ol}v_6$3L* zZ=)S*NJ5E#eL9JcMB}7Pr9cyRuvvK|Nw#8f(2j+51Ervh6Kwzr{-qL(*(ina)dMV7D<}_L!d{ zTt*~MKR{b!8=F=&(}s>*5m~JX!upD}meUoevbE<&84BGjvtms*uqt*@LvQW*sF4Qj zwX;3N`4yQ~xof41JT}dp^&dj3i1pGIsn1ps*jG#3zE!9A_N~UHY~Nbq7xgCvgvAY` z8OIEHNTuMJL+80N$>M>6S7co7GJL-DMWSB*S+E9~ z!&!#n^S8nAlReEJ<#d0^^eNYtK|+JcJ0Ki?h*bl;j>;Se3vTnMs;$TaYc za{QN0^`o%wNIY^6mVzAfSGLyHsT`YA83iYq%HM{lVI_}Av7ZqBKMUmBp^vx`D2Vy~LHlzkOS(yrGdc=T?(;l<_rp47#yRoA=WHRt9<4C47~j8hx|^ga7|i z6#xVwBMtwwB7ip9i&d^;0cj^K?RnrE%dfo|8-I{$fFV=^G{4xCuP7iOv{j((m-uGN zeoF*xBY99gN8{5X_*ZG0y(6XrmJ4=UCNFBpas*t&uZ`CFnN$pe@{#>PMr$Iq$+;hC zttusps;&7_Bb`D_9Iowe=&qxya*W^u8;!Ya420EpluE0#nc*xKcLv!2TJC`@Y2wCZ zB445kWdjq}DoK!Nw&hnOgs4MQ2>=LS68;?Og~AZAMJq6*L_czo_9%6Ta{*MZ*nf(HHtq{_qgq;EJ7EaPT*n%X}!hI8N01&xW*tlX{^#(J*!UlkPbX}; zB%M5D=Q=9$*EnPj>39jx;J6`teL6pC?fj6eGy1hbvnC8ld1*>!&@AgW3)8|o&_~IL zdr>;LsYIs}2REV9NxU;1sZQ^8M^s_4&To}I9B18?T?SRP4~GKpREocJoHTa>7J(Ig zXi?{5LOs5d4@WzNjO3XDRdaK#o=pDg{$2|mj$rAE1VaB!+8xs$eCu>$LeBl|EBW+) z11+=ma!m?0a|N~0E_iR=_q#@LNHzaoT9!=Spd`Ya0|f}V&K`A61lBBIm{nle1c-v`N~sHn>qj zPMhwwpI^yLXq=HYcw$cS=hF6dy8@yze~m+|l@Ib*v+2D-{CF^IO8R}<+_0T71Am;; zCMk5t`O67&+vI;X0BfGcP25Y{(-4yfv}nN)C)H~2b;U64TzbJt+BI?~Dr zLR@>P2(i@>3f+rm4k_c&T_A4=IEfKQmORWH{K&tDnWOA!l`;n%GwPT$WFX&10oR~) z#o0bWz7Mq?;0~fsATI=nhatY=KuFF1#Bcs5OIb2eB{M;M>5hT5kBoR)fL!1r zRuj$M2_(hAvtEBR0a-;g2ZL2ig+P#t4%Pw2;%TEfPa86dmS6gUrva#SBuIMb7~nLd zv!fn5M(GW_yQ2pA!n|o37|@drkyUgHvD$!RWR`FY$HoOu67)M7xJKb@(6+IKeA_IJ zFoK?s)-whlF1?p+niBtpLxUNLLIH83joJuE`u=E_< z^d0-zagPKyKt`87_oF^EI#_0oIe?Nxd8Y%lN5LOav<$^)xlILMdTa=}PoPCoA z$MbV)I%X7nIWcWt{F$Ar-`dyU{MNM-veWi8D0=l-oL{{qJos?xo5AvV&~iVcQh$xT z5hfo3yFU5UD1NrcJy^ZLR}y~MjgJCC;FffjY>9>jJN1;BKb*P)k}6~a!*V@VwGYQx zcO?%eRPn=sC4D0Lg1x?A0KA$%akK4(%Te=6xB|mTrUe^%9_-4U!LR2*NY$;cdET7) zN_~*CN`E8`%RL>THlvj$zcGBhidPIL(od&8Mv$o`p(Yox(w>jfqJ$qP*|8~i(NF}I zI1TkMB|HR66fUFKjCYy2pxr9a0?iO zBMe;yR(i*6x>QOm`@hGd#Z<8SG1SsC83?+wGxd)UuRr`W@PH0H9n|AMi7IIhi_+<2 z6&FS=mZ+tX0lfP5e8oZL$|=$t$N`C6 zf3|{yg$n={6_5Wa%d9{ltCmP5$?sMs!&t?<+<{-JQmXxjhkb~9H)*Q658?dY11X!j z%y$q-@GiB~a)|oGg!99T*95A7yv`)%_+WYAT#W_}V9;G~Y5cxU$MQpq=;vU6qvlU* zd#Gd}dkhuum@Tn6hoM2rtZabK`x{`WDCT0%g3xb&6opdS7cIwfc(J|}kxKLO`^Q#xUyQt`w&VaY+~U8y=EvV@eMNrP!{ zTYf(5=n1h$UDXfAX?NwEBJ05q$7@Cjh6vG=TRzh@&#HjV>l^Ba)9y#dRrS8msT6Dx8LC3wdrqz zY_@got;Rl^?OLttSo6gEFKgXeRGucVA|R~gm5jpak&mkvXu9;PV72Cz`rqa8A3xIM z8I4!BY0D>9OzqKgYlnca-$P`zFtsngA1z#0Vg=cvh63_!ZEPHCtrhs9=l#6|)1yta zijjy@Lfa?&J%pRe=&3E9K`|${jUu1;o7`3J?2nD}o>VV5SFw(NlPei`#EByPPE2Eg z|Ic4yZ$9=Z4>JgB1UwZ(4Q!8F)bJHUHF`4B7ntaw)EA$TVqSH8pQrG*zPjLM48%zA z0?rA&Lh6j77FxZg3*<@7HQ7I~54x=9jGB$#$Cm*0S4bNhR*r1(iVjb<(Sqc`4xlzW zE#O>?Y5t@z0WE|Nv5tRB2X6kbst^4pge}PUX>`U<7-ybMEorV^Vm&vM4gNn{n+tao z(e;D@0_75VzxCK{^by~5Bk2WO9>M3wjVb*jg?UH3F1kp4L2$YuFk4;E85M}ZNy+v4 zOIiTXL(wqdNnuu<-*nt`(`PDJUM$G?zn@bBs?p1?q(9yAp$<4I4 zy}M2OvfDIk{cio94CvecCV!iOa47PDCj->;t2fs+>+-WGgTrUi?jF7uuN|_B3~X`C z-J3dydSq{Go0q*S@y8A`<2P>UkhrCTtvNLZNTVV0rS&LnB+manQSsdp;X5Vsg<`Qz z^y(R=uN-cLd36=N(EguGt;A|afS1T{r1 z{w8;|yYG@8gq)6285qnQgo2+Dl^8SMn! zfnGvRL?RPN4-qVuTA2Gkko?qR0b%I<1OU5vWB6@-Zu%Ri{~POuTy`$wIr;*>xHUe^ zS4#~xu4%2ul^3WpTmlMwD8(_LR2}yJT{Q;wSf+cL<%oyrp%e`8Fg<7&l%5{Wc9r5L ztDu-eAevW07)ADs>c%A6a;wY7fRC6p8zNII_h=uyXAmM_diLFKx&z=Vp1JE>hj=9)>s8&AVWn$1{_ zbg={z#9f+e75Gi)r+1{i+0RhTxWM$Z>Br=Qy=dL|BXe>JX1lCQsTCWalXk;Ldo5ux zDwtac@I5yt3-hvLATdIH5i|j^eNXtt-db>x1UOH9@|0MrECRwtPbii-94w$Sbt624 z?@(csR$hEG0(JLu#bQ7&;eBDhO1NoSE~=$SR%pt9t@420DbN>6k;;1-mI{i6wZZET zWk7fh943b6Q!KGE+Ep&BMW_Hn@DuirCK5%SXu0ZBc|h-+yK)A1k>@VYn9cuQ<@E{d60^@1R zhb%*FEi5=U@B5rjKQZ+sXuoz-+b8znsE({3;3H92ZcjNo6He0CvL*)$Nh}uhoyWw% zIf#!XCB|n17>5W#)2m3y6Nx9oRvf8P)$zNQSKuPVVvd3=f@)(l#}7bO@_owj(vsCw za*?Wxln=S5(uC$tWYqp7?&)dDAIyNo`hqBGAP-chIpiD?(}YGeCV((jy^;KZYHK*h ze8wC$_q}XXQJ`yt#WVB1fAy1&nl3-5z4^S^Xv7qR6nuxz)iKq# z%>#%EWP<1hoLpvkqPFb#4~y-G%?SHoK&xnJ-?o0?{P1BQ$n!0&vaW5$p~a{^n*_S_Xw?N!frkqqh`}_ zjTsmac35j5bq z89<~1GhM8vV9mW5v>KzZs5Ba4v?uMM?utc58kR2>>|)2_b^eQeX0e ziO2;{XXd!uMsFMH{bX2X!s0=hsWaTP%}%comxwg0`z%BPno)4{K^d#}8}jdvz%tYp7l*rX5;v14(}>(ygS+!%BeL zOQ`E0=YVr97c9G;@HI7)CQvEeuTeZo>6d?pABYtKnZJ;h>0?!eCkz!%C*+_3Hzjib zwm-B>YI4Q1=M>B(VBQ_AxSt2#>hg0`m!DM}Qf@_G?v`H=tu zCS3Opj!Ve-cTU8*O&NE5v(ALRHTI|Xhop=Nn)UMUx##vZ*u5Bw(s6a_qu0K!*Zz`j zG@55f*FhKk!qLJ7rSOiRdnCFMeK87k=bNkb(F^9s{Pl{Jtpt7brDow*#Zp%xR9Km) zSZOnkjA$}w_DKEwHLVut_kL~eIiQ~H8_R|HCNC}faNXO!3HjcFlNyct0gG3|9v)t| zjNRL6?)25abSKU9=$WF(^ENf{Os3gw1mpgfP7l$i4$=P+<7xgk7JNoc3=1~@+w*kl z=jOrqy!`rQwv(dW$-_NNQ`75=WmyFy*HpsD7s6O1(l zwW5gzw3E$}H#D!wTA>pv3Cp9oAI9G-bRqhM%o z>K_qjc9wWURq<9{*9+pqtJ*iK7H+bwWYTNxUoX17fG__Rt}3Iabl>1RkKSpw4fIZ< zK4vcz+BCLrcyrF2pr}E?exnZQXm8tZ;rrGnV&Prd>eQTspI~ z;?E@Hp!IN!5<_}6%7aBGznD1dD>FW#`DzACKJtxQUG;}8skq`+nc=C8Gsb!LKmNJ+ z3_mw{7*+&YdLiX;X<*Hw}!hF+PF|USX`trSS`sjskdwAVEy zy9;LjH+=9|wE>r6_&(9M!!uvH^Vz24wD3&@+fxRIg?moUYQMJK@7vY}Z*G(H#l)#M zf@YmP%+F-2gk)Hs5(w=JaF;E zp(!u^)*$Gom$&D(Ny;+tbJJA)k6Y-fCy@VD>hH+*(JV8|*UirQiw%W5!T%|W0xnW0 zh%RIc032R)6~+X!(9`fYh$|0{_Dl8kqKk!l1bLW@C+)n{w}sH6Q%Se6ySWVl5%h9XacQ z;P85pxOn)N-Z1W@l>i5J5pK_-l%Y$1Pld00FFj}Q zwQ-qB)zE#%FMW{`dbnNEqKR|7BWJbQX5yzYDD^LDaTPrpwV<+*%_-5byBrVjjqgfx zM`aUFp{EkL56^}YAoBS4bKX9TwW zxQF59{$3s|V8V39cx~*a+sxypalh)=%_gQE|5^Z0=9QBc9A|li2vOUAQ?6CtVM%JB zX`4j0p7ZjzuzkDE-j z)rJT1{TZ5Nu&3~~O2?HatX`E(9{TG3fL)bLK(mc2&GLmh==~c0crGm1PZQdB@jyg%i-jMq2NmrK7czg1n4S)1b2k}rz5m#5L_ zL4b(8`$pzgvF2A^*XPyYVE1Lh{p^ca{Kg^6S80LgjN(kMn1@sk)2ZSDPuS1SrvjHz zG6GgXm@q#UO*BpAAdC}2P0<6x#2klY@R)yNF(Wiz5IS#7j6{)qZO;A5-1cJ>;vVnM zv&4+_uvffD0_R(v)ZqL)mjlNAy%vOLZW>^yHW^u92_XO5!2CO0)D45yY$D9&s$SKq za4brKx5*QN)}WtASHrncrJ!ZcN!=k42~RV-6tJ zdhf0@!v}1SqY_xI5MiBI(f?-vBd~Bkk5MtB@bA=Ykf#LdPzRunsjSWIT2g7|$Qe~) zqMB$i@mi=dw>l#1cM*Or9t$q8qc&wmpcPShRaF}~CA~SJzOp{BHY!;Xf#d{3=pLOv zx95OnD13?U;Y`WOR@NS-1I-v9D)evbH%}yd$ovO+Ojxst$e)aa)l$8y6zR?J#{CVt z>W=D`n==X`8J}`(S30WVA&d&0ejZe46ws2Q^~RTfZ@^ff-@k}Fadzyi;RfqYPPH&_ zRIt>1r!$x=m6n)LzsDVDP>`V)`{>_+AE@P`*s=PntLC^5H&<0fU$zqpHm5|)2Nr!q z5A*(*0~U56KwQT^Lg;g(XR?cgfDf3@g;bVocM7e$B&%hmfmMjinv=Q2m=9`&n~Lav z(c^IClzFkF2moD&!e+=k)C9x@OVno%{f(BA9}sEY6NKj&-ix3yx*moFZv}S~c^}pa z`vGvL5wZZth@jd8OWr%PJ7OELf+-)U-lrdWDtutQ=!7uCIZ7Jox2GhCg@RZv2i2C= zrXMDHRO({D3tDT7rc;qT#j&A5aLA{$I{Bd!$jrw-(FwdY{q%*ErraKw5|-Q1A%H_; zfjL5iqEBGYWH$;7t{&7JL2cmIUvIeiDua03IkAxaP0oRfqwB5<)a&O;U?^wkIyYA; z28aP|^d9IZeQ4PCB0b)9X3Yiq>P_aNNYGaw26)7Z<^;wbp`k$~b5J9zMM?+1g^0vC zqtCNvnx-2g>xv0Mg(4Y5;P#c~sfs3n^m@YT$971C zbvTs`m%a$94H`ad$;3HrK>p^6OQ2CUAI9!4^S@)ws2dC`z@|odQG!6xOf>@vhJWc7 z;>cSxhp1mH)eNj@%rjusfq`Ez`98;dF1_ra;zq!!4w4q2^lrXW07e-U0sp|hah&<6 zd4^}%A9m>v_`wY{2eWaZX1cOZpzv#Y&*XGgLogQ^qu+~KaW491E(cIOusm@=t;T*M zb_|(=pA@V#0}5>ifAlIUh-e5TbR%aqjcp9u&2Xh|_UEQmS4(tOyS3G>9@Qd1P{S#2 zt_ zm&XaIb(Y2}Ciz5r2wUCp$MTiYkpuKaUzxYY%U9&bCjCNOq8#P?_?!mTQJH^a6krp6 zW`t)ZL>Chp2ghC8nmpVP{CvSO;9y`0)c*@zEYE4^s=d_Qb|YOk#h!el43FK3*Ar4B zJaZy46Ee?t$~yDn+Mu}5At~)GW8y{yPFiFV!{g0pQ@3fj{P1BL;ls|ctTE$~`lPY( z`?9>lL&DOrg)Tg^U@}nr>}ziX4@ueNs(mx~q+4SIT+U2(9A;1tH>l61*Ht5~i`OqM zh83fQ%Sx<5MWgm95EMPal>DiJn`gmfHSLf4i@~liAz@0BLr{TJO~Vnr=7O zu5QII+v^--$zMB;&oSaUfw`Tz@EpcGMG?iS89}E*TAqtBE*hjqeQj*5RZp*}MQ7CT zlcivLPFl_lkI7k2rL0fhy7pC_*&MF`qI)k)Kgyt2prE*#(MW$WBlV9AQLl7kN&=)x zgRgCULEZQGrcb#x!dvRr71AgLJG=rgOWY19~T9eLZv?)B4 z_FHNW7Hg&z_@<%leZGD2;FQp~-InCRce){aihXz0qCq;k8v4`o!F5s8jJ$NZ(??M! z!{ZBlGYZne)Axm+*%|!SK0Kzip^HuqKD7NZJc5^=|Jxp;5>jV>9Y5jM{TA~cdgG=~BaRI>h{fwcrJ=qWm$i<%jaI%Q zh8d>Ra5S0m2p;ehr9T`;fvt2!)%~MZnXRwuZ?80aaD#bqYrM6KA(=i%Uwz&Z@KWcy zvMi$vn_Dw%t}!7@mwO_7^reELBpW7npn;-BUXTH8HUl_QiXgpoFk&4{xmvVwE22(G z>)2#m8Lt>=fP=ymz}*@K)Qcv+$IpB>C*!>wvHd-{j%LGG=HTbKVj`jmNjMPL`|GVw zXb&MkoNcNpbTb-V`0dsqH_2{kSm7;Pu7wc6!spwPh5_-C-EzDlTd@@3X|(>hCwz9b zbY1f?4btP16a%hdbI%6eNz2%d)3A!UdT?XI=Hw0D?Jd2;#^U=sxW6i0n2&_wzA9zk zS|yNc)rL(jXv&_uWQnJoQY5QT`bP;zkC@GQT6=A9tSN5O^_i~PUqr2%2L<1a#;hHe$IZ$}T4EMMd4;1; zt`BTezOp|sU1^BO8SP49ml}d**RfP#3T4|)0)i^yY2a$JFV81rvFyT{vEY%0*^OA9 zotwMBbYn+qvt6mp(8f^vqE(j%`9=y#b^*2t2?`vO$2}x9&EslA3k`lpbFQ;axN}!p zMjU@}YX>b^W-D!cJSAePJv7?Y2UFvJOV!>2<+~2JOwepdF76)r-5}{h7LSQFX4Neb z3E&+urYq~n=ie4s^5F0Sj#$-rVwRs;T|+&*(xJ^zqYrs#rJOXesfHdtzgDO$y^he4 zk&`G&{7Xuw!eviCKR-fPccY6XdVSPNbH-ZvO8*ka!CnxhfYfaykOE7bA@6@0-8r(>nSg!L0plx}xNf zPG;p2E&*vSQ41EV@&5;0n+yHy6WycNK^tG zJxm_=NFH_ja%Y}>EH$@ZmBx_n><4ucSXf1cW{v8v_hiuO>+Y0JQ!ZyrnP+;DC)9T# zMl!Ok>*#?H+6$Yj%J5L*!jxRr`kbGL@JhVJYllM?K1* zn$pL?JE-!}FZARtGIi1q@eH#CVzj7u<|rCwu%j9Ev8KT4HF$BVQlE9v?Lh%#GEP1^ z%z%ohJ-X;POH|1{qYjgY5~i%Wf^?R*ZW{6=4P=CdRT4q8);LX1X=+x()Ss}-^pLSuS$ zWGI}uK=xqhih*!Q@sLf$x&tnP(xZD=O5y>_Q#{YVY;GliJV>Q>_dx1^gOn&j(jgOJ zwR%^M4t!g0tZjWlePh0inVzVdfivTNhyBYzia7uuhO^~SAR z%HqZ_4u9;jO2{9iza2{>Ez*_$+F$PQqPc?2nyn%mUM*W>xyg?QlpWRNaG?Oy@DTEA zMN?hAM65h+uRKQnF$Zy-I|sfx_{V3KS!X>ps6a{-Az?$;eP&#<$ui4?zJ1DI%X6L- z-BCSj&LOTh+;LC#MnH9Z?Q#Z@0QfOI8i6A8-71zJnc&CNgMv@?k%=sjz@V4|Wu}J8 zbMSXW;d$%!xDbow0SXJ5q=xpFB}gKVL~o}u!~tT>s=5kvdQJbZ^Ga5p6UygFpu!Z( z!#boiwst4@Bp2im1=4iIOZ*4t5XN(&JZJ1x3ONU;E2$tmmU{b}c2nfZGo;P*HxAY9um5Dw?KM$GWrNLxtnI!<%~k{qz|WaxusxB zB#XJ`t9?1L_?qmr=tCGNuEN)N$7AY*oCX;l`zY*#+{~F%(^H(es738UWQs8>uMVDx zWD(nln<}i8!uK-Eq?~(_bs&5haudnxzWO%r?!oZX*&wMV-(`0R6IgvT2O!4Nnj{j^nb{qG|&^NDZG~P?jK3JmE;q@zLz6Vsi6*$m4Rm=o&C0u>HR;RJcj;H>|_! zyJ%ZTT7a;>n$XooTc4mtL}~-VRaD@aTP2F!>~aU82LP+9tZ&NL8|tkRuIfWg(<%M+ zaF&dxQipsUPxOB?ZSaN9jQgAMkwK4KBMObPL7ozw>qbawQA0IDJ+2Mg%T+RJWt9dx z7W~0dD-N^^c3P;k;b0bDXLTHbgz*PRupVLY;jCN#Vam1Un&9W%uYLCw&9iv2ev>0_mj$)#*YP(#Ft%p95x|f^ zA|}qimbOvzn2`u*1fts$^)2}V zxT(1gz92Qs(cGJB+^=TSdgo)%z=t(v(6v5iyF}rN;oa0`qY>HTRoa(GwHPJLeB5?%^;$LAz{E)J`O9znN zdZHhR9Vi~PG1iPB9YlBQGgaX$a=W~EzeAK(*uJj)fBn4%z4x5p@%-BTHe1SnYXA7@ zk2M=@I520ekAd@9kmJ~?-bis13Ko@N&v+1eg&EuZbkpK{>;WE2SK4AI2^cni1V@+y ziOAYbAbUw}&wJe+bej?5O8G!8mjPXijbEgv(gSkuJi6^*M9a zCvGW7`wg9;)FM%IV!6Kcg$~Js4V$-LM#1$!(aD{(Hh0`mS1} z;MA>g@beWCo!BZa(>f8p??fP)Sbu=b&xjOdT88(Ae1^}WeKT;ge8Yqw?XwGBaWqYT$(;&n?hEg!Huwi>Lz>F|`H%DB~)mkHR_TGqcylzf2< zMHwJn=%Rf|75Zh;u)TeTHPhvWh>dZ+VmHLrggWU=GO^NJ_;@qz`6YK)p-!)uiWIa$ zws4Ge>Gl+m%W=@hs z(4Z(+Bc$xFT&4S!w-SOT`Jj`|WnWRdEy7I<4UqcgeA)l5d#n7M`pPBU4bVkoWF$4i z81r8~BK&$n&~L*ui{Mth>WmB9tq-G`5Pj^#u<%l|6bP?!B5GJAy z-c-)rLl0s$cdY1BzAq!*gS7-0)r&6SYZCX}7uCq+jQrOP$uLsZ>|>jA-GC7^BJc#^2sIiDZ@1P$vC{0J z8$3wBUUoNViExjGG@OAYg7dYQ)VhW?EQ}OPBw}(Zc7&vnHQ%Y=Dk)6KH*SVu(D$PkjOjX!L(YB%J7uIXe%>x&&XWcuc`Nehqctl z=c8rP6-aCrttDAwCQW=v_Yg}6sQw8lQ4wKY3yCg3_bPFjOyNhYjvxVIOSu>Pl%*Hc zhfz$5ER8n2#59&=>ujJ@3W}P5Tg3!Ie1WJHU34;Z$a`pQj)^$7KKW-+D_TRX*K<9? zb~YoxT_na7-@*1IU)BcFBFTC#BRs?}qu{+9aR{OH#%o)zzY%OYnNPT~_z*%VWL3H0 z)_sA1EEKTbs&H$(>`zEk)0RRklpSuN&j9H(YrR3#0wb=i*##QX)zD%YOs?u21jxZhlx4K587OHn~g7Cf1|5DCH?Xeu_um2v%6S} z5naYyIETN3c7%&_eI$O02;K3l&sny4j{5m;)V9{nk#5EK%CZZ6bkfqUvKUqsE| zds_coQ!3lsf+VZTtFWx9>?!u%vnpi|{mN*mB~94`8uA@(PvP}ye_=Vq>1l-1VVwMD zLmjqNq%sqSI=HM#R4UVK0wf)D%%jBW?k226v~G@ASbQt-P}smrg>c+Ao)==6dX}7| zskYgDokXu*B@Qr9gIsqZHdj1ForJ$m4Ve>4pd28VePE8XC9k7E z$K^}=o6*zg9gcGPw?rw%Uzh3H6*R;*B=}1Deh^C3YKS$qzV!eY-h+=Ik}?+Q(tNO) z)qsizKH@-Ho#bA)d;1!htp%1l!u>B7e3dvFC=YkowYf}P<@B`CR>H+4-W2rn5S9tj zynflkqcgBbxhBp3DJ_h)i++Su{FprC9GLatb_{5<+1F@x+<=oat2EF7Lc7}0KsFyq zr8;xYYfvn9BbKxC$(}?-QIFA#J>?D6;Zo`YK8n z$Q6L3ZbEiTSw^y>9P*K}A_aw{b}y4>5=nsw5~l=~D&E1MT@>d}vP!uPE0zno z>P}v@1kxG_1guOR#-DPA8}q8c8O}rmE3rBAT6QLbl%mofU84 zp))v*$ORg|y_5v7G-}0w(+3PViOw(?VJE5FY50CZLuu>}yba2I+fsABU6zjO1`L(G z(M___+zrq%^w3==O9!SQZEZp-8WCw3R*%VdrX=8lCVv-Hhi^RqLB*D{V0c4^?;p%V z=$kJ?zq<#YC*^p&rc#{$2dFnOu2-ohx0VQV;D`93U^ljSfq9vGW?foN70a(zbvR;3JK zs+CyaiOBiinBNrzJWBC(Rg+mL7d|rt0J=8!9OQeV%A~q#=(YAtI|F0Lp81@9Ax$UH zrC2&pfBQ4jl^}c&-yNSf)J^-)(^yk|#b4JRoDJC3w{Gmku#u?2spYXP89FWS@#sBV zaT{cAB@#G(O_+*kMS2sBx~X)XbXx^c?kUSUUi*)RlUh6f!_mDc$9iI@S5)^mO%ehk;+sDR0L2IF(#zPUE=rVsNM zP2mUiz3E{btf&6*+|2kM)5HdXTgS<9kYIxJ$KtqOyf^gM4`8#oSM{Fari&0fXm)8a zQk7ooOR&0zcG@BDU4C3$ByNe#6E}Zgki!kg^LfLHs4hB97v113#+q*Gvz>LhwS_FD zaHg8@mJnTwC`{a=McC0uXzeKs`!Y0V>g5d675Tz6B>N08T(J+)!9b|>jaj1j;Xf|x zLK`zh5NqKa#0Ov+X!4{@afb~LXt;T$z=F~rPJ&?AC0a)|~r+i+D@I|fTdR%l%ekMI?C zSax)Q-KywOuOfBG178%AQK=hqlPn~?_eqhXMD4cN-b|}e0#viVR!+E0z39VfO zOK+jIAG4A{shw8Gk6w{NFB{5rDYb|$;khS$OZe3Ny}}YdiywHrpy;E~>r!T#4qqP( z5-oqHWkp}NUyaIiX|KBt|v(@t|_Aojkzi1eH_0p7B3@Q^0_Gqi%weB zjxuPL0cP2{Q)?;9O>?dr*MXt8;G$cuRKEkyKdaHag=}K18C6Xvd{oF1$R~{C7S8sG zqEUu?3M1O@@Hn%Sjg38_l=>caDUpX(qZ^NsSAg-Jv$tVf7;AwNKP&^;nv zg-4e7MKKS66Y#6PV5u!w6v8cqaA{E3kyucJ@&(ZlTf9+GKQ#&%Xk{Ca%Ii{{_b}E} zuP^F->xrp5mRw#UG%4?M&98%1IPw+QL^HL9kgFimpyx4-vH~u+0dC&!T87;RknE(2 zGIdCgu#|(A_HgH$-@>Fl5wfRt1BW^-ezZZir67E#U&5z!2F6xw{@)L}l)^z*-Q;5< z41+CSfO(za4S}JkryZJgX46_Gm?TM6;(q8!%x0uP^Fouf)oF&x)bP+;;I*9pL`^{h zT#vX<>!~(d@;ouvkQSt9h=8ab?bNKG5af5V z$iy7}NUuLVUY05ES0~XVzj9&sR>W0@3t*t3ut+IfQVN!h8DFYWJ0Z`BSJ7fF6~ZD7 zCXsvaixfFQCf@`}r10luSXfFqvMmMipI1v!QLnchMl7U{`37zRuU35}gr4~C>IY#B zk%@`)=W#NzGoc3Yq8xri5c~weg9S+AcZM2vY-EdJ$cW=Z;3EkfMNyh&nYu0Qn~J=d zIQ?RV{&r;IS#YEy4BB{d0=lNt9O?@%<8hz~O(uFph<c_=@T?RvBdYX zFbw&%adRuPmL$9`>|a?cmU7fSvjKeFoET-U4{M< zPE?RHY+)dY!h%Au-TM8ACvyXM0>7#gRGKL4m?}iSpPYK@E1&}T!n#$4Z^{d9L}x|E zjk-E?mCLUtA7}rc!5mu^`P_Qqxx(qzkHp|Ny2Zc;M%m)dSyTgiHs#9?W~vkl1!1zl z%w*T+)dhe=q(v8D(dg7pJ;IJ$l_7MHAs=eOuepnUNv&?Px$qfl5-ODx($#y1tuyBo z)H#C9Y}&=97Yddh!ig~YQ2?-0jWt09&4k>r3}E+kkGPDr%^*0zpY5hYh4h@Q?xEDx zSBoNdZ%nzi*J60@c~U78%?sh+9?J%Dw}zaYhG5UHsRpP-gn)<}DybZD6Ke&dQ&I4! zrXx5^(BDqC^!_fZCF`yN8xCc#c=dok7fS!HrUnpto7jGi_5*usu2WaSMzv5eYcv!LpAgRUCTz@s@mtRI1%{X7hU$+8UJ{~B zm^a&Yh$Q%G1`xi#K*Qdk5N3Yd_#FsBzilcfcObkx(>DO(l(prGtn2o7lg zPYf?=;SW(}(hE|pb8Qf!9cx&ttUi!DWmf0O;N&Ls!L!j2YpTj^!m<0)VBN}8(=fV( zoWR$(I~B`vw-zLvPB7!#%8ubwA{4l@?NQX0E}jIQ*De1LEXhpcc(vLJ%%>{O0XPW? z)l);#oUvAg^jzda&O|K3v2-*`Z@6gAsdV2w^GJ-O1prObpJ=19I6mVE#aQ)_Gb+h_ zs*j@=mv{vdvPH`J9+M!{FT{2UBaVxH01sKN+JJdJqfmec^E@ZztfBIN;pSiitSC&Uc6FoD*yh4WVTOVn>wjm&H55hI z8~O`GG;Lg->v$RCL%9&rB~GH1f`1~9_`eB$stGW%Yh6)NuQOkL5zqH+V#8Z#tW7ke z7Ih*$irB@=VVOg3#HmqU1kE*Ffi!&}hr8S+dvNYU8of>gqYeepmbp3qky+9e;BL(L zxah2bCi+aOTR&iA_K)S@iTS?llvt6#A2G_XhMHBA*pD1zLU^1jBJAnM+?yT-~>Ptla}_JFmxvHrpbpZgvwE zEkRR{CyQVMSR`zuWb6u(MN@4s+g_jR9ya$PEfl0cPDvu-DAD|8L~uX^U$N1M4~rcE zHTXikG8E2qx`@D=nw!K94AW9y!05rGoHwjZ!6zl0IY|T9r(A}Re~cjZtMa1R(o7LAbSs6-3lR*2Cl;_^qf|No8$_;GKudg1e+4ZWf zZX0K|CDjVzlvp)w^}A>FAf1EoDmX1#)V!Uq+{_fo)}6)4)+;XPgrobU+2u*ifR(h- zzl=2n;5jQ*Bd7(75vI3T;f~rpwe+7whh!8rLCdq2JT}1|7^jb-Iz8eDWW z!TLK|aSUGbHWa=BXFDyn=u5!-3Pl1fW*x!1=*31q^B8>J131i6tE{EILR((3e2E{u zBYkydx4P~G-lRmo9!3=POX^1EITUc$nXcfBmDK~#VR=ix&<`|ecSx>!%SHDgY&rA2 z+*aG^!V)TsTXKglbLF{wU=c0(v^|O4V>fAbi3)l8JFVTL9_K1D{Jr&ow}%48e2I*~ z33r}1qLf4@iwzd(Eu+)uj7md#4f0#L|NE%#tsZ^}+4nEvobvsW&OFlX-BAI;(#-ie ziNReDro8{iBP;v7b9J#@uTw{Twu7+4U7{zHjt%R?D4W!(=C;s|wJKl^aF!uqM_!Zj zFTSyT!&C53J4?1VhEzEzp+6RcPW735<0LzltOM1Ho!iNBq(Cr6tZO4nQxfdbl$k_2 z`mMe8ZqBvbaard!vcspC5GiI136YfkWARRY)a%pO5j5kdV|YAu)9rTJ@0x1HZd0o% zVjjXunO&B55v%*@e=N^u`Xx|q?BkoPkBnK3g)?=8Gpw0odDYSX z7}DId)^dvjXEW}`8Paxz4#|jYoL*<>)Xi*n7O7z(=DjAVVLI=bLeDPFe6y*CsBtPf z1-@!~y7#u+slJvmhF~ou>SKwqC85*%w0(-La04+$v3$jB)0LK_>yWxMKAK&#jalA8 zw2u(&E}W@BZ7eO*^ni*xE$rBKE#pVK%n7%jh-M<4gfLT9I{h#iMOoJQtuKTn&dIFd z?fYAMI$4f%ZNB@HEV#k|BClDY9~hpn(6N5zU*v~~HVBrX>~Y@9GGEi~t}tarjU*_bq7v}HG5 z#)7J-`Ww4t5#4j9`QTz|D__kx1v+_HSDohEY@CLNCpT`3=sI$LGAgE&K?4s5Z-Wcrg4AzugR&K4u9kxqT92$u)F@ELOt<8si(|O zg#jsKPNdD2!Xk*gVE@P!VsD?*T6|D7Lp~INd|)<`r>zC5=J=iQM>bQWr(loq(1qek zWiScYD}Xc8(8+k7;(g(kwTDvIosZu+6Mvpg-6SeXwShF8z5EoEDn-UDjsAX0&cz(e z2Wepnu~sTk@+qGA0EKpB7hQWf7mjbH+16AuRS?B~r%BZyD%t=R-GxPAshxaeJrBMq z`iwU$r-)mxP#e^z3M=w0N`g01&+HxjCOg}Q1iLOL4J|x1nyA;`3`=R}J`Ua&a?@SE z&<&pnjdfw(1OCt070M-%k)6ejb@oCW=d6iE+Jhb!m%RRmv4ke;e`LKYz5&&rDF`8w zz_|`}?)a7EXR{WufX}%*d_BqVlT)6GGj42*?q6D{eJI3s*Ns!p_dEVt*zWGSsm=UW znSrP9>U}I`1aK`@uIhP%m+t zGuFBx_glpkETQyesn(A&;I!L&ATOLs*fK#a7Z>edJ==~YS+Z@ic#B#YfI=-byOctfLKv?U zVE8_gcE=f*cr$`Nrbpn+nw#Hly)y2E(HL@}rGDXSm^{>9#8HO+doq4{Uh{5wB9o)= zr)=JLmz_lwld!pKc7-uC$OWzp5CRk8%3Ts=vog7(EcL_7=k4n{f+b!`{G!Iy`YO-- z6--1Gxv|ZJIHnwmJ<(RX8RY$Gzy<^+%k>P11qkAeFr4hKZ-<$^RG3-bDsx-y1EOk~ z!-W4HL;{`zqLNc5$}o^L-+lB6dXAYf-^b;s7l}D7BxzIXIvRg z)?AG)bC<8J!9YkvO7NPnm- z713EYCWNwp+T|Ly)FIv?J8d+cK1Yg~x!1OyE^5EseOvArwz<18RYy$#zeFL3Hy8U} z@s@R6_+~PQVOJrmhA3%fIgn(1Oxc&2?kB|s&cf9Z>7^eP(eJ0EPPA(u5d@<|`J-F; zO1*O5n7hXx10^lMrcb4toKaJKJLD!UAoF1AQq8;9==?=E1hS}R0Si6dbe>SsT{IY~ z${#j{=8OSMNI2Xp-O?+BHncI0@c}hKGHbMLhVb>uY-}d$HVsEdBA<{?EWBSb_ zc?#jKa=ijK)@^wpBtjSJziGg^=Mz4r421{;{s0db@q=i9Wj=I({pA*maa=FB+43+D z_rXZx`2YyXnpA8wPE3wzh85{NDG-+;btam^O~(<==S6Eta8yKkR7S<`vv3w>pdQ|& z($~8;*fy-d(xus=o>#pdo0O@bE_^2PJlLk+iXpLfq<5MP+6HcbvsT4k#77(><7*li zH#tONCx%sJmpwU<$(61T3>g{tyr)MTqC;oLwM8&R8?OUem8gt}!6300kXv1KD##$+ zayLpT_sx(}gR4?ZWSPrB07r+JpuaiAI>SiPvc-7bmRT4?BW)=bb|Kjywx@&)_MGO*SR_~@&iA{D6R^Cm|2urSRpv{kCZb-0u0^F{722S2khl0s^om9Kp zU()e0HJT!b`QJ8_i9mapJ4&P8p@xMuMlLeJ?oSl9XcxAwm5>{mxa0^LPA4ssHoB)` z`4Zs5)((;H-jfHffMeu6DqQL&^lA39@la+-e|| zO*(J)0Domi8^1@&*rKLEL1NVzp~UNI^=L+)L+w#n$Xqntm~Suu=m*_ed;+Zy;Y>kM zq^~D<8SO8J$4$~|Bm8w!0O+9Nf9M1Rba0gy8O}D*X`)vF-WkEdXEXyBV_-R_;KRj7 ze&1~|Y$o)8>o@BD;fWiU+@G&3Yi0csQUuy77?ODZGIgR($_n}XMW*em%xPxx52v=q zM~VYsaj5A*pdg#k&!0Mz&KqW(MSJ{a1x3h(>V$7F86FyzI*Bg*?GSUTcK7N=!kTHV zA!-C%d{eIZpc{+8>D0Xpo|t3Kk4&TvCbg;bV<`aB`q)tzGaYU?$r>-{l%omLjy2(G z&^iVZBZ;&V`VAPLZAoof0uW!w>W&(f?8JVH$ORn5p9QwBBYv4Pb87i4ITC9+JZ3DD zGMd>l`M}8T(bwFn49%8@x#I3zQAfD?Ek+gQo@Bxz99WWJO+9m#^Ey;=*7E_=zS%UL z^7egt-epCan>qgs)(M&D>-gWlb!1u|w2)vo1zCOubraNf*hg z3$gE@TN9hHHa)wqKEl!~jCu&A_W1iRM5D~rup$OK3GIz+oYK+|mtS589zr5^ig@Nu&L*NNNONTQ)| z%nmWetf(5Kc>?9)Ja>pSQqC*;%fg+NvvtIT8OLqMYK(qn!ygC#BP0y8M6Gr2l9t@L ziP7ub)Tw@>l1V`;ZAe;&<2%_#m`yksAtFIFIjem#om3D{h+<|Vb1OH_NI(|Glq|&? z)$&>*Z?=|*?PIxT*A9RJdZ!mkUsNNhHpE3WL)G(puvI?6nSW#yO!3S*6S{^D!F`W- zNw=5#>t7Jtk^XnJBgNHE_rEc4fQDqIY6?ZfrLJln0dj=MKN31q8Q+@YN|Cb-g{!rQ_tr*V;n&Glal+H&^{a90E+6phQJ)3D=QVn9vwP zBXIm+r`{4;+xS5CF;Lc6OcZOP`6n7aV}r3RhRp?+WL-xMwmMD1__;Yye>y^Waz%F6hA(LcSg>~u5tR~Oufyj zZ#;ZA?Js~Z+;w)rY0%5?gOG=jR6$(d=7d*X9esu#p0Ha?YN4W6pG~2o&Tjjj*?H}a z&#;;8dOy7^GjC6-tNQBgh&b3rO?jtmw(Z#a61QaB_24W1$|ZffDenY}!ronJ zeoGWSh`X+eH~!^aS1=j%S#g00hO-l|Wc(2d`&#SS9f^-KYLdK7iGD< zzmarqrHrH3)DT8T(wi-)bCXPE@H#4#UMrnSOtIAQ7Alza+<3o((OhY zavy_*gL0IiHskDFXK}?}BY`|jLULxQMn6-3LrP7v?6|}{?;WC26eQ)S{LjCjTRg>Z zo?uKB^O>_cz-DkW42>VLxk2t$)}@5Iy7Fs6cjQGqbDjAu9qvm*r(g$?DF0Z5Y9g3+ z38xiB$=A@j?1*I$F|h_DjXz+Mk!jM!muv!T{)bm_L4q}Ii`W)o_Wv9)6z-Sn-JaGh zp9S(7I&5YSCH?G51~~{FY!v=o z6Q&j$j2$<$(qSyY@r>HfOY*+2&F`{*3Daw0`RXJcw)>#L7w$vC8~_|REk5ZzUJW}e zA}c6DzO}gkN<|5F*IV*Q5a{^cfT`eqMwpHStJ86~Wl>yaKF@qW!OgSCC3aGnXSk)| zbZ$h;^3Ol6Z#gAt0a(B_wVV!}2Ztku&zQpYlAGorDIlVaf1hs$|X@?zs^NbDv z+}2Duz{boUQA#^HJT3hopm*nTav0%Ys1HJN(PeeNCg_WbyM=%Y25E?3G+jQ$Qi{2w{`< zC2{A13VIzZBZDCuwaT$`PRv;&sLC?GP4f+<-cVFVn?Jz_il`+bS8_6pU@f7io#Yen zNT?@FmI*9#9>N%B%`ujK)MYrR<9(8q;^BtHKRQ>=`43_&nH->z9pQJ2&vt=qbgTHK zIdlmm=Qb=zC>i=+x(|i_qH4z}TpsG{D6NT<_A4$e4aaR<2i? z^<`(Tv`>uPnLlvtd@$|IfC!_pxIZij_O{Bwwk;N6@xf;-$vHd2m_Ogg*aBoyxgfZj z;bJZr-7PF>Bu~tHowxw$Rq}=b#Pn5&!L^;&_o7InQm;CF|^hp+(c8iS!(d0j< zK#Wop%rPH`7W0`zRn#SdDrLBtM!tU$K{nE?NN<#ULIm779UJq2!BBw4)DZ=!FpK}-=l;TxmfH-H6g z2soNEDD(g`%z44N_{^Q!33`uROz+`^7KZv8S}Zyp^K{hY7EP(k2;^!b!XIi2t$5*) z^qe>m_0$JVT-q9XeiXFGK7GUXQbVV_3cQ@)Q;ykLGv$=sn*16}yuo*tqO3gvkFr+JOqn^5t_ILUb)k<>oR;(uyZDk;0GdJeHe+qsx z&D(=KE6>YA93+;!JSsVXEj4>-S1U$>K#hNCB2*d|zKyj8WaPZdH2vV<-JyKK=!l}L z(3**Gs`y3SJ-J^wSN~V#kiN_MnHII>$I@P0JZ{_u{h@~4k55Zxk2)wvP?`qA^OPPl zUL}H1^^oH%t9LGsM7&d;X|SZ4uNZokMIm_4mo`-AQ>YO>$=J_K4r_cQmG#B##PWT_ zK-ZMLZc+L3tN2~er%>zu&Ol&YccH8aa;4!$o7ac`xu&5ANYdhXl1{cjJ%=)PPOJk%gr|2qR&Y4MH7^WU`y zs8XK4%s!M#Ag$o` zSa5ZS;))C!sks+Yv4E`1rn8DeYX?mtm|MoCWo=jR^%mCM%!Uwl8TRhqz_7j4!LA}h z<1h)W5Su2|B*-iI+z*JZNYW(qT{}+P*d%lXg?||n&q@k^o5ah3daC9J)3$ySEm30* zO>jl3auiAKXk-?7=)W{onaClE!R8NPU+%*?I3$#*0LYZt>{Tfa6Z?tizOhylf$*|# zSR7N{-f;phWyPndd^uueAEA;aRFywM@7?9T;f@*xVC+2uN1pbsMv;SsS57YCSrsjsLT~w}P8G{n%WUPX z%83goFX|pnl4RMmt(0p*$Q8Gm;H{$NlJ{tnmR%NBaekLU1T8Wn#S!hq?)xk&ZNbC`v&AhCtWeP~GmR!A5JgP~^`OVO6k% zxEvAIU7Ij4B<)h>%HeycuDT2wD~L|)E=I2GLDt^+w)3(yl|d>z%ad}o0qTUYZL~M10>Ne+g~KoSZZ)2j)V^XGY~(H zrQbz<-($$WvfJ$nR{NO^S#$Y1*lA#Y!usyE?ASoEFnRZ0I{jlb(~aa^f=R)dMz42w z|G5I(zeMaW{WYEW!~}Cw+M8Fiz#E(1mru)P>bszay;`ej8g&2HgqYResDvF(BMA3h z%GHD$lpuM?Q$>LaG?SD^dx?YHB)`2c?O_eXx0NtzE@8jX;NOiA3QPqWyVEG`+lI3{ z&lE8=aq0(hWNx&^sI^LB;^vgb+I*A0zv^F7UC)QCB483Gw5GUUR=AyfVlNw3_RJwd z4UgLLBv@v;4Sn@A?^89YXDt=A<#})+-nqeiKIFyasp(|`Q&!Z@6k2)XbqyR>GgLZW zch~;N%Es%e-d#A57b@ycn-@32mh*x@{UsVmuB!Us zb|vX?FV~%c$qU^&Z8cj`B<(6F)9+T`9no+|S*qXe@d8GlMojta(D!^0kJy~jL8`4D zrM7t^xM4=lU&03z^b37ZDM&L)i^_~V=e~&zVQfiC`yOBid+QWb7cdK|3dr@zaM^-C zeLb?cQC4P5APH@9B4_V>@RJY-n|6G0sU$o1gM}ls57cYE`j_0cRS=5kZ{1^>>S+3( zeEywQlT>>C>&8oo;+tzqGnaIfv;cLZrfgwERhlDpqo%c^uCMbPASa1B&jFjAN;R=V zd7$VokraZ3)@x{a(=pQt$Jm2CbTE%4>zG%W(KvXnuiKod!$slJ?k@KR5wr3^PfH#a=Af5`iyc2f@kxDll}t7PpG-Ar*Abinx7EU|b`L&Ig~#(;;o_DMt~*$Uz^tmXCLg|1 zIWS2e?`y(=nuGO)>iB8YykxG#@UE;(vh1c)ShZIy-?;a*W~GEpbw8NR&Vrd*RKXnV zvT5e7s#6n{_?9qj8DBPS?MaqS;;Jv&^R<+_I{lECxzDndj=H$D0+g;p^+Lk#l0I-B z)6$j|a#T{A+iEgVWO58H{ag**>2^bdr?q9w4&|>K1DfMV!*YY$5Q#tE&B1=2iD9@_ z>{2Sg5SKH}YHvXw+_}hz!#EwwPw8?9lH;uCoLOgi=46vv=b2etEzishNB)E^d-8Pcwr9Ln!DBzBlqarTCBHcBBP3NE`KqPSl<`DVg2v$P{EZxvnpVbT;XqNcL)-qBph zD}tTw@TBRvyYO+kBU_O@U~+~f1hjt`OMA=HQ)87UtW6-g62ZvynSVnv(H`oD+~H?* z8iPGy^E9?ASaGc)TQeg#dMs}mfT#$E($2)jN-ucHYJ?pR(?DEzz9PNmE+D31Sn*pO zcWmw?jj&PYcSbgq_H{2+8)JbCVU>csNe97|xc7&SQ8NFgV-rk&;~R9Namo%@TyICd zA?vFjY+JO~n6ANjTHG61(hhp&N+iwX@oJOJMa+j+I5|UM*-MXu7Fa3K@5$}tY(#6b zFKp-o$7Od6!O^t*|uMp7vIG*jp$kw!wr)y5~pnF8b<(y z@i?ybGi)rFt$4|hPoF~Lz;`@IZ?$K}(}oqZBI`xfrd{M;my^0U{PI?uwnAS`QwpAC zCdki8Q;N)D!yV5%sd3Eq>S$vsbBbDxAs~1uFA;`spO`n@<}^;Y2{x?EY+MDzR6;Y} zc=d%XGC8}6=9uiZvfUlho5cQ(?`<0^_!_YAt63~LK>0-bvZS#o$K4uJq4mT%MI(Am zfI!k3FgaTT#_Du&h?^D@*d7C0Pf5;MqVF>H7^~HOSBD#rXaJmsI<8cWK+>rvaIf7lTo#$jN0_SYMiD7Jtp^C08l_iSL-2@PHv@#N`R5WXC!!P?9 z79hQ#&xLp1P`qr*Dkw!T)vZLlVu=f+Cf0Z&0x2H{+xR{4U*-c#$km%XX;?JA4%6HX+^iFOkN7fKJ$X7%We!tLTq**R zg&&afz9$L^pe0;}=>oe9*h?V@F1!p_8Hu?YxL(@z=ta3xp^1nydEM!$K&@j82xc(w zo9Znks;)i#-F6<8?dthoBB9*%y?2AbEIkC%F+)md8T~LSP2I1(K+@2z#6$fe+hThy zzWFz+6L2CcF=sd=qoqdEaU-x=xJo3gpA&MHHdD|r8EyI{$9J$u8tezAZ7o=%iUmOW z-;!r8sUTAnHf4zd$C~;WcnMTgkwgk3$INSSKidyTav}%iheUkg{R6gXnMnnd3gIyYoVE~RvBY3 zz83nLF9qu;!Wvg*n9tUy%{CG(hu5V65~?bV{1mFC>j&1i z_FuBFC?oUzhN_|_jhFuG+u${aPN!YQ40cJxxjmyb8ht_rVLIymb$8Azlw3U3$37-Y zU-ptK&shb=Q9(K-6Yg^xanQl^v>WMX_l!<-*Ceh!NSHT#_+=ztfI>JlektzQ?KLw>qRdtp;0{`flE&>AsV1oLIffvO04;?U7Ys!#(eS z>hkOJYRaKkHVan~FZliPg{>pvFJ-Z1w;P5=n}(*1q7?;xSY*ieVi>($HdN zY)O-e#y-BZKF{WrQnm?*WxR+qz~bYC;b$i0o#thzSd20GRvVFDbIBic6dlm1>>=EwGjhcOD5%wN$)WP405RE7hlaU*f1)hEiBva z&v(g_n2?p^q2#%>4u5$z{&F1EmFBUasiw9~CfaxjZVOgSmiE_QdW4#H5vvkThkIr; z8a90+oCPwsUVjl{VfhKHR@!C3{!Ha>*s`ZDh_i2)OvO=5$5Et8H=#deRjS72xQl0W z9|B^D3s+HfbkQyM;G63CntI!INe@cS^{mbixPw|vjj@ZQixY-LSraO}SH$wedEA>340-FXAn#^QNXho_MGJifQ%nEmim zUX)8;3)xci+;-X<3*sVe(g~6gDAvR6oOR9B#UFsVrd<6*n>a3)#y$^Q6uws+x+Ec1G4_c1%?boNl|7$iR zj)p)Oesx9@mQbI7UHHVN%JhrhL05uJ_Qo7nL<{9;x2O}saM;^f2lE9-v=)&qknBav zMOocJ3-0*#NOlugY2=rnw@%!{TV9Zz-(PQH_h1sQ_?cYy z0;MGDxST98`q4m|Z8JSKMdHxV{v*2Fm2Fsc?H#auq22SDX&tc1#AKZ zUTAs4TheTfT!4>I`Md1`q6SS38b0cUjmEULER-IvZJ{x(c)xy<&QDPwO=A-Q+}`ln z9Gsp|POcSX~TaRuE8hpB4mPVMim;Ck@QP7FpDkwDbvdw{0&;^wXTFaP$zr zS9WFN%{SZ8PL6kHVJFA9tsY&}=RF|qM`%KNo&q+k@w&tbvntIfapnW!nk6637&r_Z z55rR+*r=@D1u9c+e{9V06wactFGJgxHjt~?E(`oDy>iz&3mz$4kt$vC!Q2F}p~%cP zd+RQSzMYwM(y(ieuljs{w$#U1t*}z*Q!zdZHxzt!nQ*JAVCfZhxPRE;RNJAz>fix) zHR?!kaUlgrfz`Zrm;$^^8!W`N^AY~LOIMn)v!yar!5-D^Uo5}&;wbYB(F+tY6Z`Ha z+#n_tqMxOlf;;W7u}<5D^{P4Rx>>0N{`C_CECk^TwvE!t5{SGS36{jHui~5rMMTcE ziqTfH0MRIUWqe{tTqEBzz+kkO=wZAe6!HRW*Q*t(9m%B_k>|cwh^R(DJKKQHJb&dc ziL{n7l*4;7_=#wT@7*O&r7YOKzYq46iI+dq5k3a;C1}9m4aeY{-3Cz`$txRa4u%@q zxvn^3bs|GN5%r>`fLCI{a6@hvO%g_-M2QnZemhObK~SL4R4kKBbrZ={Uqd<%TXG22 z7~>{tG}u<+%PYGsrH#~gUZD?gj|hs&fUO@oX;=}lU}(9 z4qb5kS=)iK$>gTW?QPUJe2imdW$=&Z`e2)fZZg(q*AsHuQ>169o{BqH)pxyi7vl~0 zr?)vNY%I#)wb-Y6qYqcV`dXg!;o7do>#B6)nb@%|>X(NHWlJ~WBAhmN2&EmT9X63} z{P(PrQ{!45ZyeKwzIQBa95sUE&|6Swt~B2>ygEK?=cXK;7?*tB9 zh7UgH=*IpNt$j$gD21RGA_{xC)QaW#lsIF@31Aui1j_L*%car>8!4WNA)L50B}@uK z^48~e@ffrDXbOb^-EKT;v~1g{x6S;Ux=*DQU-e>$x*kDHURPL`C63O_I)Qp-YMkke zVMV0bOp;bw;O)zc&4R|L^T;BMajNICLMG&y3nP+q&fhA4E!WUE?w*fk0GLLA4Gi3P z;DobJ@M}7kh*SwWxBG_Kf7`=F9Ju{)VmC8;d9nc}qejT>g%gtns)(W9j-tyvkWvdq2YGJPgX>G9Uzs^qrh{f~-jU zK+}an95?oT5i0Ul5$jr4@n}fRage>Q=)rlR@*ScZxgv4zWin~aXmlpL3nV6qM-KsZ zvDAhC8XIK+afr}A(?(4UD2G~Tw+s-X6vV@$D&4%Ziz}1MCq`_`q}-Q2bVw-L_+Ye< zx@@BOA9;-el{+R!eA&_vte>o$h$~ZNJ4m6_Tr&w1k!rO!oTWa#x(~A%_(Zc`N5vYq z%Er$et+lj-_2hW?z)u_n4lF!`#bN0^d^xJ%KTD*wx@GAD@95y|k`|!+zSCXY=zV@j z;l=FE8^-Zo*O|*vjT9%*k3vY=u2gQ{4`GDM9uuAvvD2(ghw6mb%ZU=k!qW)1^s^4q zCxMX{^&AULv_zFC#Qxk@wU`JiY?nt5?o7C2fPY5A+KT;42TUgki_Y?T)r^ z-ESQT##RX+Og%w+{-Wjujn9e-DL}AsyiU$v~Wc*h6gjX%5Y_+7LOx z@wH@w=Aup>$n${ok%n{vVXx?u4#_;cz#fk!BnHmdovlxnXFrz3z;yk$>+L&{|+1Q~l}Z&$G5ysP zBUK?*86)eFBEZ!D6};>$0aSCy8!)te=znqeA9>Gr7wx2l!avW&aw<5 zVHznrO@LOQnmM=9R-M{G*C6aDKD>3>#;mV^kf?7y)=>DJ`FB`+(HzAYivNkAZ8zVL z@KHgr_P|+P{dY&6Xma+3zQAe?ntwBA)YCHAiSK{QO}XAyofR<_NBYh#=m9Mtc8Pjz zBi9^cohmvks}kNFqEN0&{p7;-Y~$v6*&kC+_jJkDr?nPK`X4uF4p@Mga%o7_dT5Mb_}C~MNwM}p6%o;KLowAmml>BbB7WhisYYYME3NXv z`|b{(?n`=(b6IJV3f?eejZ+YNA$p;U9EM3IZ7-ENE7krL($E#hlMx*?NpAjH;fM^> z)R6}Gfrp{4=Wo45E6X%)h=i7gAiFzy&<}Z3fs6!A#aErUDRKFeM446To75v`599K) zjv5~9Kq5F&*L&fYDr-Gi?l-pPt68~&g(OhFu{y3%@ zOJ9?DbC>0Gx)<*+uy${KaUu=3ie_>6i=0d4Q4zvYH$)C7UHIc@06OZ{0O9hItzz_4)(Cbyw zlOv3Gp%{)vhdau6^Uc>nE^YKuzZu_bZ+M1syegv+$*?vTO&S`p*pzr`#yA+68ymkA z3c3dXeaJX;Q4&U7#)W8${|i1XE@r|jy6L{f-yMe1=yI0favTn3$&u##FunVI2l3u9 z20NQHPv=qdlHLPLoVBv0k@avdPP+bHY-L2rSiniG1xXgggl92KM)s#zK&y;+^uR>|#j-hzpy!%aN%iiM#3)Ls?x7m7{8H02a(UP9x86yrLcV|U;uN#=&V7^tU{!9 zxSu(qISi)zX~17$SP>>%72_u0ga>LVO9Sy4^exlm*6Q^trU6gSeVTV&B7;EDrUtD` zr`Y+3l4PkjvThX^jftl&M?>hRm`l-1IP;Wpr zvaM*kpZa_jgs+IE21HY9A8Q~*-OW;ht#J`gL{#@wB(-ScYax5aXN2ia?+x2E3zs-6V(20jZt|U_ zai(i+xa))18C=}bpK3EI&!px+b$>;EsHhX+y-&n|Zo+Lh!IQe&W9bKrez&!>atc|} z(12fo4Kmz=3BqC(lQqqA>ioG~N&LS}>n+`vOA zTRI1Hk`*OjJ9X8-M%AwXo{1YWB$8vP!Umc+ZW62Kv`Ddof_!ZXiMPCN{kzpL76$^n zXtv*ydB)8}30o4)Clz6vdXb}LS574O2^ZI;9vF+2+(A#wE!y7pJTeF=UEj&e+*;gG z6Shg74w1BgdMGR{hE?X5*3C7(rUfXx1{V#3AZvozM=@r@*A>9Hbf-aN|01DiwZ&z^CCi1}_B$HUFps8+RszGk+pk%BK zxI61xr4MSaF3H!*_PG)+Hdca-=cpOLP|G?IC>W>{fr6nq5BvBDm@?Khn9Peyf1x!zq3YNw90#)*Y%&E=njfNM z!~P~JDU6oafxp6bMHY_98fO4Pa{xt1yfpNE=|%ksz%S|`vlq0DkjI3gYUdn|b+m9* z04f4D)(OV{xb!QRN0kn^H6Xty5<(!|NW&vB=uFgA2rj4)AmFY}S>sF~iaFzu^+A$Nt zO4=h2uvDP>M%vPAu^V zCq$t@?~fNjAoO9nrr<78X2!_NC(pko25Sky zvuK@FC`q&Bq3b(gB6`BOdsYV%GpUPka_SE%FidzAgtDZA3VHJ;jK5{)&Ekotcx`|E zA2bz*rA5~We&L0-G!lXYkkAq*X0@CW!PPfGss0_z)M7ZUtB!*>T6>fR9?{TH=^$xh zEqUOhDr7@Z$1Wn98k`&H=vgb~M*jD}ks0SF87J1jCbzC2FXZ<`;DJXICP;}SBw?y6 z!O{`X?tqM_McjyEK|C(m(bM{<67}XoCXm^mQAbO$}0l&0J!uN5C54 zMODMe73PiC3Ui7fTj1KbfEwslk>kGV9f`~UX*zKiAdWl5>b`Hga0iSiHN91{#pyoYtjKl zZDTnrM-dHbj6(i4z$pY6Rg4HYff;V}o zZfh;zmmflP5_$Y`7G~yF^nJ3eqy+#`k4v(>shz#EkxSdSAdJR{tW-a+ZUZYKT*@t> zi(qbY)OIrvVH!q&$uHc=)o32d8*WjO__6M0KkI@1JqKBpk6PWegXgwUdJ{6le;nCF9~P_r+^h zPD)Eqij%G@60bOQB+;x!ffie(V}xC@#Ya)z3I5w*(54h@!a$LPA-Q1ja`{4&WU zq)uRIqm4vr9KTAc4VgH7?$XMFF)=JZF!IR>Hz7p?57LuWVJEZ5(z42x=wPDeZwi04uw}LvbYdOc}+J#5cItk$%T8*ce*%HLY8-#2$i4>)=|xAYa3eusr4a^BMar!dhsDhpqc zFjctf<{v3Lf^-r2z1d6u8!@zf!qQ-JDUQbx_h{|_ZL?C@^-b)$8);}YO}E?cba*88 z?IlMij=o$}k`g&JX&9he2vJDC2fd(A3o7jC$C%@WhR=4Y(2l#)9Q#{}#%F9w%-B2a z?9Pzanf1`#po5mw=K5wae6-4Z0KAh<7hzOP%QhaL#-_Es&{4r&Z0ogLY|%9h-DMdx zDZJx`N#FneC_gXmEzKRU@^ZKYvcOqU>Xa*Qw8j=zbCaj$0v2J^OGY;r9Ecw-E8TmPWRZ+f7vCcO7sOdoc}OBT}j;($jk?lDma(rIWCRJW|Vo~@ux!1N7 z?whnK!7?WN=(^Nnv;!9}FPr8``pT>Qln)GGkp-<(7>^56hfnlvpnT&9ic3w?mjJf8 zEW6dT>=s3{60?&^HfNto&%V$j=j=1wFl$8oC`0Bfe05SEIEv55In%kS#ip-hI3JwO z#orO-MVCdkR4ZHsZv#<>*vsITWxh=o&Xzpl5EB?miB1aBUH4J0i&jnBJk78@BeeLt zv`j39-uN+*N~;qFO^W{(oE4Qq?kEx(M7I9Mcs%%Yc=jJqK4nFyvfr1l8PCmU&^tn}s9f=C7EYmC{<>@KM6ak6QZ8ptD z*RyxdbgC?3c!oTM$#|w*lSzPuoD&(5*BE}jcr=wp?)*lQ;ER(9wG;fIh;d%Jb8MVL!QzP z4O!WN-w`k9q8gU2Ow6k!nP5#)U;QOy1WOA#27~p=if;&NAG%f{ps(mIHqsC6l}v1rt8K;tk zn#3C)L3Ahhv*ihof>$UQSl!=sQw(k<8C#_W4Z?kgY{`EY*OZJB-LUG0o&{4$+0v>| z2slSgAegYhj-KQXQEZbYy%-P9av%`@VTB+DaiO-%yR zmI|A{fxjhuhF#y26$<#aVqpa0HZ4Aanq>6`6?=B(7f3b-Kvx0Maax;qSPdQ zELAY(t$vh{-G~)~r-s<{XC@#y188f-jis!+K;OSF0fk3}|Bzl9$mt~{g<81@i?`r< zVapM~hl=S^k5LtpaqWM?&0%s2=B-i6sa2K?;Q~co8^A79CU+{R-oDlbz!pXMSY1c19&4?aUqsS>0gpV8LfnK@qLhv3wst; z(OoqIlFV+}TSv83W3u zE!qk}r=KwZGZby1NyiBwJO;++0LEDrVTUbwMRPK?4f9cU+VITv*LvZ%>eG%`y}9}t z*5eI%f$D_;JKong!hpOL8W_3^IG-FA)K=(|tAFP(qtjN88ODzMKENbbU?Bswd({hf zSA@|if6Zb$qvHhd@)U8FC3Z6Y4eRYdo|OK*HfpSAc}XQ(%2GpnfmWqD)l+lWTF5!P z&SORJMIs>J9y|*9A=@(=^?o{vXV@pBrpVi&oh;H)9W$O! zOjZTecC`7`AQmXW(hvT|z)lfLr61kruE(0vC9V-lBrX8F*|=8eb9(BYrFVacR#D#< zuW^rOgG4H)XF|mVs7x#7PF^Asv&Y*L!<=qQF&t@>ZCUc#b*5XyyLlyT)Tc|NiW~m? zsOjPpz&emKAXq8$yP##H)<+vPsa_fmS5-)Yy7?37G0H%9lR)DS9s0~|0ef=P-&k+W zQb}YEt6WyUVF0qi7Rw(~k13eSz1PR)0~wqa%xO#>oM3LfK-=P?G|>Elz91L|BBdC8 zVI;PtR%%Kg0wv=q-=70yK{col?jI4=)!XIJtg_n!Bv9qoSlK`+V_a#ikageNxd)5~ z30HjtWD?@AQSqZH4Jms&9>-1%PG$R;T2iIaqxkr)bj_`jhzlx$K!Zb+M;`@U^xQ~X z3$Z3fW!&9p?5qFdTty_~qn6i~C5CXn5O8>V_OkpfZIt4Q3?wS>_g*}I;6h;i5y~l<5H3SGwmGoAQ&R(n$wfzldrU212{NXxA6ud|G41h)ZzDo-M4#j=17 zZ0898V-+y)K`&r51>F-{dDH3L-RQQjLrbw;l*82k(*=h11UiK*FNIufqb}^pn@QMl z!Nz(~e_$7w$WDQpLRS?d+(;X2s^117B!b%2WIZ}Z{F{S>`aiYQ`XO z4d}$0v0^`#I&ej$jg<~p!^TZ@-r&`l8VUyisLu7&A!nFyhbn3(Cy40@7mzBP*_Kru z!sZ$ApFsbzUVHKshhBT(aG}Li~ z>-W)@b6Fmw9t+Ta3hQ5xH0A#BYGuuDV(_FuAvVF2g{#OL@Y_Ux5h9;utO*Wd-0e23 zgDb+n@UEx^7+DE0JDGc!c_UpSMIGgKFl^!2Yy@rNP+>a!1Q3Xb{MU z7d?%+<^#&U*dl0$RAo9O)Y%I^BHoaXndsQfR+%Gz1hZK`+{^zkxke+yiY3^dRL?({ zR~@$2R;}F=NT(lIO6`qzz%vq{V?E#dKUlY{F%5j4i@mrtR`^o!_)V)dA*x}_#4P`) zs4*k=t~4bY9*P>Nk6G0rHn%mOJ|o+~?W-`5?3ow7CL!xW(z%@>iF3PNnKblPixHNt zdz)vZv>@k|IGC@vk#{M)i)ekC?KS;H{gej&e!_e=@VxUI*<5r=Z```&q$qJikmZc8 zCbs1Lkzot2kBd$3zdo@b&a57+_s;Cew>6MK@ASc#f_pBjXjn-4-f6pLq`l`k;pfb) zmpi2_o-o&E`!<^HP`e*r3<$q@m@E{*K1I-{Zr?2bpu&C24gB{9n1&P zg7R*h$vK-abnh3pwyvHsyVK<_F3buY(UAO^XlDC;?k+%!4oT?3Ul2iccWbQ@_Q}9w z>}!A@4h^ADVX7Ok-=P6_++Jf+YVL*tWE&u z8_;KW&<|!|8?-6i)}$S@T>fIjguJfbCC=+~I(+uIQ!RF-@4c+J{!ZAmrRI$o52Oh} zh}+?a9!DFA_<}B4oO3{~Uzj1xR|q5BT6@?cs&RPcI3Y;}l9J;?2T03z^C1Lb1PYu6iQIeZd})gsO@1u2 z){B}h@aw?u1X0|fM1s`DmwuzSZY_2lky{Nu^MC*R{3S2N3iI);9z((|gd*l3ddb0X z;>C8djDn#@=H~2a@sm{9jTFO9O|o=dlll4H79)P{x}A;;nXcjGB@SAP^W5-jqJ>*C z%m*~WO<7bc>Xwedk0C_a6Y%n-0NTjk`k=qI^$AtLou2jpipz1>{K*g&MR7UUy`Zbn zSSgA{X{a1tBj(>hWCc%48fNH{(m19QsSmlimL~=9w+-rVBAdiaI-Qr4x^-UO$MQ9Q zJa_qvv`L4SB^F@bsRN~G_gGV4XAMFUEWFGQ?SSSt`OefN%b1_Lb_rWDVQUfPi58{9 zXP;Av=`fP53WvL!<`-Cu;PTm%1+oV8S;!Z1;o<~&;hZyqMN;7)MfG*6_j(mR)V$>pad`2F80MB@MZQGc+c*3x>XXbTE z`C`KK8)IjmBlk$WdXTgUrzV3>2x3T(<^*wCMhh3+gsyZ@=(NlQXW>Du509ubOnkW} z=K740p_DT?tUSaZ)cIFD5Y*R;(>=v6ODgKJ7ela&ncYS`q9Hy4S1jT^fJCEg4kKrb zX$Y(SC<_M030vcaP}az52b=Kz$W4ZJ`%$mQDvzc^HA3j@WM*!?;f4u6uiH}e#V@!a z$RRm$!{uP{lDw!d0;~d{Li%t9j@aP{3OJZy#|D5n4Chemj#sCR?7Bk&kA$HasJdL^ zu(Yy6sW-bL9De>cA^BhRj*wz_ZdS_9cr)FS+N(9*;kAZ%OTcrC8|X>CuW zbl+A$?J_!hO`<^8dGw_@~=7ISpZ>%#4=%WkktJBLS1Gf1Li=!gOhO@M+z_SjA zcOhO#Cu9?fzYLCV*7~-=DclqI4P$j@u&}Q=@HVSHZ6)Y2CeyApz;&pfZ!7f&y>vnj zK3mP|2eVM?5tA2X7gbuVmbKw*@B$cv55lwsybwz>9FF9b_w%8`zsqeWX#pGyBv*Vu z1>SexFt@WW)fC(U21u1F{-7G9|4N3+^&&A{C|}j05XGr-&1iE%zW+?Xoj&UmQK2Wp zhxo<|67E7#l5tU*De}hDBw_K17QJ*SEzEDnfj&ueW66#ZO?@o64$_w; zU<~-{P@S47!+6U^w%ebzdd^7Q#4z2UX4E6Gp3j{s>$ria8k8dw{vD1tkv!(GSQx8saNm>N%HeNnJ=t6XE%FW$dPLp*DUVce#huYk zLawo`IaVWjTC4TF0V|3rO6P=3rQfQ`mRZPILb7qlWyefHgRKdWV76fwsD76y$mP! zbSw?Ku+);6xbckoo5Z%?aAFI;`uHS*N!!5~o!U(} zfYM~W%!apU^uYmi^3GYzb%k?PR>Q&&11}pvVb_#@S=m7#%!b@8>K$mcS^j#srQS`1 zjF{c&N~_@M9wYK;F#%o*lF5miLGeKN>n22%E$NxK+sie&6$N__A9hkM)@JqQf)6#z zIMFv5U65L>-vuSsp0S)E9T=4HvZd%O`gj*TOzi>W4D<*mw~6 z6bt!x+nN}`#Q|2{)TFhh6D`n&n%!yS1~j4ou`X;DDXn)1J~eo8NGQs40pHkKN-tq7 zy&USg7p7LfpE_P_LREv8Ck)d+fa@Dheg?XcS0$&0i3|EOwr&2qCR3EU9wLJkPo;)xP_ua)y|vsgE)L{siY@wP`(e71l1gNgK>1(* zIv-s$9wP+ecuA;#D(Bo8# z@~9!0G1qI2imGNUwtG~OeC%m{WN~q^?c2sPsl^B5iVtP|xaPgbdp{V*F)*>|2MPis zAKJ1kZhT^a4|?Gz15)L&x$lp}uo5|`(;)K?Pi?~S2c|V%%|f83a#(?A9*1IK?aY0s zvfnWVgk|KFu%><5N7_kY06!Z6e#Q{^Q8{%9!+*XOH#TB+CyPbPYv)tvvflgN9Bw0M z3*pQonzHj`kII=aP*b6xDM)G7+GjsV?vDl>nnd&&YcJDZb3vG@gFqGGx=`SaTE~Vc zJa_{G=@3>tZpeuUn31~mzD{ZoEznr8HtVc^-_Jbzy8ox+KOWDtT660yY|`@f3_&*O zr7wTcBo5nkr>kk@Q<}#vwR_w*a7*BUUN1vLBaX8dd(WeVD(xOucOG~wDCB38iDipv zxB>2A*+~~>m~zit`GQ)OaVCAU(v7JH`n94fG8ScX`m}6A>Za63_ixNSGbAM9$7Ok0 zSz{;UrGB2cDYf`N@dZ7PDPp(B+@7;M)I0slxWrqtOgCnj#%naOhCatE0Vn$$>k@lM zRd2Xl=q4N&_okd;`-65NXPF=JA4@+xh2PzxrnXz@7hvuXsDEsw*;~I51|zYZ2fl2R z(#AJCRoMB;>mi4r$>@4T(qyD;ULDdZDX&u>>#>bzrgb}=lyEsK{+USsW9flgyG4Gp zWaNtFmQO#GMnLfpHg30cO$)k(F73}##4hdZPOCE??VBAw`)Kly@p)(5!$RY?Oba=r znm;itHtXL_qUbl6Vr|;Gkoe=Ni@IJ33h~MdKioB2R7-VAnKbmm)uefy3K!u?A$r6= zgWpr&hTm{3y}(1$_AP_=q1nq#F+VE2|7a-`2|L`$54nqNk4Dj6GO_}#XRh~Rtv{JS zfu615d5Pm6Pb<2DFMkmdKjm~@k1N|m#GKM1ZPJ`&d44HZgHNVT3ysEiPES}7u(exY z*p&gd7u5QbS*tJeK*kEc3oojKUqiirYqPRTU_v0Bm~Z3FKk65je#_nt|6u*;(>Y!O zsMwAB`UR4aG_FbS50@KX8=}Yhyr$I4wz?y6L{7*%(=CeH-(%4=&%X(Xl)N7ekF!}L zW}m?a4vnAFDPZfgQ&Y3!pNY*n6Eq?3&d&59A^6j+WeJz%fm(Vj8SL4#zm|pTV2!1l zFwTAx-kbkphOky4To;CW(9RV0gKwBShniepe`y!`;V$IL{Cg}Iq{1~=ZjK$Kk2OD^ zyuV+d>G8*H>gUu?#)g|FtWLO$hUyo$#D;2%5wE8`GxtnUi)E2-4arXOWN$L{b8Tz( zcC<$a)c8wp|DZoT*nWXFGpdAF#$+D+VnX~g@U*$|g(Q({abfG~@wdf&a7Gj$j+mXfHRb3u)ri|ZV>6S$kMJ*Fj<0%o;;r_Dfwlf*jypUMv+!$! zrT8JE^WrPy_I$ad|I41SZ!ciy&P%`#q#|5D(^#GG1~qZ#3FCw_*49MLxPwKSS82hI7PQ)Ht|iijPPE5s^9#H?3+Dw z*FB)`nLU>Y6T-%2{hVxSsnA?7NHK8Ea!>C+LcRZR6N)@2Gss|)E~N)&&@wvc=53JZ*mC^;r)l!IC{GzWe3)q4>*MPQX^aHkY z&8LBH2@cinlW|R6b45UjyvLK7>+nEC$iNPLNhAO8m_fnbzqJD_5-~Im4O+YXO1w3b zMj{OmjK%ln6^mI{?(E|mh)x?h6+VBUE&lhvD`Vjjtxte+EmhO=aP(0h#0}0ye%q89 zuyNO>jWJTd4=hXt0!sZ{75|Jjps*(c+yI4_v$~)DQae6Ob3v|Y`^&Mtb0sZ+4gbzr zKGyq>hXaf1?I>*k5WG>gwh`H$GxJv4YEhsdGlAig^y4|3515RHfP&A^T=0?L!nxKGO>a;o-NKx4GO29 zmt1XMb5M29C$qunI^ZUB5b&cBjTaGSus#@r7ZM`nExpToZ6u9+4EW4^3&(%V@uu-9WX{=c_0VH zuhp2A`OzW3eZjISl%M(1ug7|)g8_)dLGO7?TNd}+(vCKq29_O5R0j~gTVT;5;dll? z`z{FdWnw&H+n-Y1)z!TfF#;}0UVld2>v&Y`*$)T30TsW&YFnTO6LkA)^X=^Y{l>E7 zgEZFN`_cgKOOGf)iuR+zSHwF1yfPb8)wn+isb(|!2=z#VntYt`JxO7LA$8g&!U`iA z#+JUnJalYZ3i}xW06n+nEVq8RT*Zo8pa>MVk@Fl#&n~fGd8|!@_XGrXmcQ*u9E6|6 z#%STL>P0e36Nu^^7nPHrx8rI~t2G7Yt0_Km2@1$qEY?4W2;r^YIxHNQiek0)WL#6dxPVyxxe8Clfen^oy`3N|IYktxJHz@YZ~<;I%+Fh2HoSe1mF{4( z+B~jhbv$92$9>0QS`KHw|I1^x>}j*oEL?2&7Dh-B?02(f@EkGNvx5)7a>5;_oxvM| z%OHMH11z|$@GjwG;_^fkxuq`{Qo!u^O3V&Ie(SfaUCM#4bn-dvUsvarWxML?-0~TK zUAChlq8w+w)1UL5=I2@D9IO9!84LYSY7%(uf|kwvPvbTg$1Mlok6eJ-_sxS;+ z+M8}dPzZVp2>jaJkR@PassM6xBVdj%k^PAJk*%*qUbyVR zd4A$IPoMtsuw}N&GCSI#O8QQ=M;v~aG-a*EwO)&%P}wxDNUKz-Z?%u0Xy_aWmz1}!%N z?3)Ik!s!26YJ#aqJ~SG9Pb*NJdku!9uv6&t^;w_LfVh%>YBEsi;vW3_Sn_=IdLz$X zX5>Egd>NGj5H#A5vdc1=vb~+=pRv4Tkptmry9;kPaBf&TxXfKZL9p^EMWAVATj(R+I`|Z{5I{n} z+ye3hh);8eO?21bA@CFSLiH>D0~6EQ+f$Qr_MiejZdsK#4vkt10iz()0^U$e2jc6b zdqGkI;{H_(F9jCvJVeZoy&G`LWV+E2ZQvAS73lA#N>W12SYX*@=Ch1c$x{WxY-R5OmF<;mhqq z3=LY7pDOu*@5D}pJ7<*Z<|U*)?bHo_dU8&Ov`!8xmFFGW@}h&yl8XaGTk#tGnvD5U zPyO?j+QluG$j-`z?!x>BcGQdV7Gi~f^YcGcKgj=BZ)rXMCPFiz18h!@WC&M%aVs=> z-d+-m2SmFk2|yiIt6zXwzHa19)-qT||NMsi=Ou9BSI_bm&_uq`MkBkPq#4*G>L0N$ zddDYtpTqKQ^*ivC=?(|xXHO^P%}tKEp0wZr|6>mev4+$jw7()KRZIwreT5VyH2U2P zjv9L`+aSLia^p=%?4uKhpp7sg?1`*#hXYRbJoXUpqcIT;ebSUS4c#rXlVv-SWoKnk z^#%N9;Wd0-e6m2n`=x+-tsi&#xSo)gM}0MFg&$8UtQArU+jCl}<%Q2eyJ(7D3;AQc zlS1eN`I>h<9UA}fw;jYicz1Xe1!7{l=D$YcHlG^u^f>29 zrlZQ^TL-<8C|nG+1(`#HO%Dq>Zi1H(P;a=5KN(pLYbCe-a~_VXKGlGm?f;C2bE79a zJu>MS$zGJq<0hdz>uc`|B;Oo_QAi_=l#2hDqyP2|Cl8x51~XtKMhzY`IzRy3y*ldM0ex)0~X^ErP4HWMD~}a*mra> z51iee9kz4Et6Nq-ECl-G+wMhoSm*?NZfaiS5%@%@FK$9KT?+hjPkQ|3#F9hlf558D zejP@1;ySa}s7Sw&A?#2fN36wdKrEz$fh>VI_z+zS{zv?G-%}DH2lu6;O)C`=jSNmU zc_z1rmh+9kbpkkZh*K4SiurNI@@DLd$Guo?TDO>T#T$lVmB29LS^<}$ zY_7na?`_MC^?@Uwqctx*4)zO&s#dxrl4W$w&ZKL;F;~I!d*SMOXIcM31Xl~P@1bJ(@t9PDu!P}*YcUJC;#14)Skp`Eud)Ri z#(h4q0`>6zwclcVu_s*($oLsZ2Wavhzjkw?N!I!;Lza8g^6>FtPk6`A|M5JkisKm~ zR05v5mqPt$}nY`$J zk>PF%4RixoRe^=E(+FU!j5T$jA4J+d5;!H`Kt{lUCdz`|FMnp-m)x5z67GZ3zOPqb zQtI{5;otdwWXy+6C@b_eU<3fFdy!|jniSX44?IAa-2d1^vpl^4iJGA>IC&0sr+XsK zGt*N`I_^Zqe8&{Pt^k0r)eDuP4Ic#x>;~ZAQ`s=yIjPm*Be6tu6+ZfFVxpJ4zqXwl z@edtI4sHXPqJW$nnU|)lIq$41TR6icsmPTE00WAM0@by&2VBIH#tIw^+?|6Kc zcPl77*|3S7UYq^C!aIKLYvM3Zni{=7+CJcyF-d6csCA<~odq zz2Yzn^FBB)yh^+yag%9bb&Y+ymT4Xy2BfxM83eAWkGNDa-o=;hN}KW-hs4!TBtbH-fgQD=dH?cCJ=k!C{d`hb6# zF7dfX`9{5D}RnXEP!UusWZTr?od;EZZaHd9+5CckLi8XyvWJ`k?VXBb$AaCIj zygli=B+7KALaK?`J3m6px2_I0{N9U|D-7me3Uvir?Hc^)s}VTcR>Rv<^096H#*)9& zlHX9!3Lupoo{yEa=Kh?A``PVdaRJPajjSXA!@b3jf6aa+T`J2mMhL2o`bX*M9cp56x;O5bm1%TAR0`6F0o} z#=2cZ05yxflicR5NL&TdpSH$7Xs+rJ4R|0gLyFvx;v?iYMaZ9AL5cejLY(bOuA_pY zYK02=YeF5?I{1gf;lb&b+HB}NmBtbM;{fyrdyk6wv^P!T%*Q`U`@dX@o;1aN=#^rE zy+<7dStPJt6{gX|sTRlnPq#pR0YKh7fnmxgSru|p4lBEuAFWM+cv$pjNa$Y}#s9qJ zERpDmbc<5m&4E&t`wgXnkCs!KcK~a3NkB@HbxDAchUI5S)QFFXVE^y7HWRRm1D|ef zP2IES3GUN$QE!yHoH>jE00P(Yh;?8)S;aemj=#Mr_K}_M+(RlQtD7UyEw#vje|WJAC?ugG%4W67=-sKKJ4KI) z|9y=Gb(5BR|2@z-4N!}T-2+zkmNxLW2A3&%CB-V>keW-)SX0^R5xy^Z<;bJamO(N| z(AvIV9P{5clR~M*@5Q7-T~AQ!0lROx)J$+U~Lf99Mlj)O%BAfY~Q8S+IFVJN9B&XljV7$&JLfLK=NjthGH7Gl2 zXhLdgQ20Ok#wWa9!p79!dv$#~{?fa6Cy9$*F8)X?-pkYt?o>BWv>?F+``SydkdKA!=}e^FVsq*( zhLzu2Y%cZ|x2Faby{4eRw~f{ojSp8%zA@?c4+*egc{M&E;T6?^mqMOegtu}!>C^K* zym&v<5KSV+7pBa@LPC1V!6EVCtD?!RW*BWQ+Pqz{E&sW~--2LY@k8p#pdS>MzEAk< zVEPM><0;>0&UH=pfV53&EheO%+>K*^N9y`?oTScFbC{EI2;l%(TR}AWo|IhJhDU^F#lPYm*5ZO& zauyibVQ|N(xLR*1Bm_^B%7)~&>;c{M6?H!~xu*_15)pNDIYQzS=H+&za2i4;U}<^p zHxKTc92A0%{ck}-LUO-um5}=GmT8ag!R09ZiJRiud-pZDrhk;-*usco^FfTr5gZN> zott;)$=r2-+@hWqwhC86h1>Hw4}6ubg{Rnmo$GL<>`mG3G|WA{JXbT^ss$SQmL4`UrpH8DkjF z7>*bIS$w3K{m!4=EolK};B#)a#mBnrQI|cKx~)pt<5^^n4||EK1pWt>U|IH%iPZ=HpP9C%W-v>%Ikf7r&@bnF=G9k2;1IVu zC?q7lbPk{qddBRA9Aq~HSc}~XToUK|!El*$KRBogX07IWJ02EO2ak*6r5rMzQpcjY z)PbIAUFxtSysD*+Mc%D|uzqSIDSXBH<0^5UPm^w^-qK{*k>q{-hLZ4N(kLkQKus|u z<&aD${YEdR@j2XSZW+mB*~>lIF(+Jw;XcXR3Wkt98HQ4b z*#otEN6j$GFq2I!t@VY{Mo5I+0jZD(sp}+N2lfX!fCKIY{X_a6Y86iZVecB%1T@%n zY_$xhtp)H)vMYQ&@t6<-(Z3m5e*fnGL;YmyQ20na)cAxu>nb~8pDs%cdK#77WJs(c4d0#cAuG6X(9V9d|-&GVkU1XXsiNLo$P(goeBmUy-?k@sDD#vRz2-*jKYEmjYbbD(z z2%d$5WPzK##FQhLOq3mw3sV=_f*JGFj1#pI{|~aBcK;GrP$Okj?%jy|Zw|u2kgqR>muw=Uo8J!149z@-}@(CyW#F}}OIM~<#5=rUCykS)!IY0dgHX1$z zil%cC%AGY@(5PTY30P{m=?2EsnB9ieU`q;sN|Y3&TVPNA68j_%41BgOGf=~-j+(6| zHT!J9^WuGQ1Wc@!U_2(>2UbgfvI7wXFGT>QC)k7>RTNY_h;$UvMLm`p@P{^%FQPkZN_SiG=W)0Dq>`9 zMFhBgYXBYd+)WHJIkNnqWGP<=+&`D)k1bVdUX7wl5UJ6iyk<#)X*7`!hEerEm9v5J zM(I2n-*KuFY-~GaeX$`Sr$0Ee1GUP%+Xb#Qfj4n2qbx9NqgU;6?>V>!#nh(a2Z81+FLI6K`SH&5{?tzV7;(wr&fQQCTl7NTC zi|G*4N|X(~48I?+^(as~qqG*F?gM&?u1+WBBV+`Hp+OWXhR%Gd6GtBeA-WEu*!f?> zn@rAiGQ&o!PA1xjRS2yx%wT)_ws&1yy{EeKUvZE4fAaj7n+GJ8i69a2tWvFzvAN zP#ZG>l^P30k}>}=VeJ0SdG5X2z{v*N0Q>cM@2j(nJ@^g?P+V$ z%Y)>bnPTQB>mxGt)-ZxOYP~$zz-Bo#>{7RQD{PCq9wvstSO4FTjLmg zc4ot}T_s#C08W~EbeE2cNkxh>#@3PzGSEJ2q(~T)SC^;nHk|0!c{Hd1QwFQ*x@L%z)LS=s?pM2fhxL0>yrCAsgfoDk%b~oYY3WD;jDfk?QAxqb z3_F-89nEI{=TO$!xX%lTfa`X-M@yk$EAZR`SFF8b;fw=dB z@IO;+*epd9lnV;-Wi~G5p;UDrtcd_w#}0RlnVG@$aRW(aqZBCAWVOQ|Rl{~H*ek;! z>A~gw@$NLKcV?mz(cyAWMkX_!tY#HQtpZwOS+ZL<`+c3 zDUM4$5tJmgOuQPqzbZSXHrwmf6lreYMk&bnS7qkfNbX3Ez}~h+r_I@)N6XiYW5!5u z0z{{;(yt_RglWjeF_Q+^4NeN_-C%;ZO+?8l(7v<}HF56=?uJP-^%)=;k^!l3ak66! z-IelS$aYf_&X8^3-He1|V_*e+qAdp7ECCCZ zNluENFbQ8p0udU0%Lasd2TC~f(6T@Y2L}_n$c2M%{tmXv(#MgG>j3pMQM37!jAv42 zhV&aRcm1M?f@8o?89OA%{smMSJXxYHt`@Hq-G1`HoQ|O&tCya&b z52S&TV~Z@7Yhh*;BP>QuhG@tnH7m^RStjVt(+dkVUG{B#Z<8mZpUYF9H_*NVD9dNKrOLWK%QG9C4UU1#AUE%! zyR2h;TRqavoix;%?Q4}hXcvW3%aS2& zh3QxufJFDr1d#U_Hl;#7aw5aHp=`r+YzqgpoRrvi!FIRt~_e%q-GvU`ufN zXK~IqU2T_0g5sjD)|5nw;#1dI2No~hU%0FCWA9-v{q+J@3&1ovnH)UG``qEA#IV6> z)pRlTc)^YhL2=FprRO7gLHD4RrnGLUeBKe+m0jC}p9Z`?jOj;mz(3gilXGcFTf!Xs zi+mh!YLksLg^KS>n8c+_k%JzwRGg zv{<-}bV!-?lQ7x7V%peK?i>B?tWEMe=bn}n_O>7)$uE(6F04vQEH$ZxLLdi|E0k}H z!^m!ZJ8wAg;_C6;=+my7L%J5vJ8*fP8T^0W<&NZcvjZl@F>bhf)g77L3xz+LmswPI zlu=Psw292DY>+Lkv~W%A{h8R62HTi8=WZ&FxRn*}T)R*lE~)p3cAXv-QuLdD=B}Um zFdcKIrVD$!SNM&^O$*$f^vOBLv@Kyv&Ud_Jw$*&3`BuxAt|M)>nw{@B$BbF3D=zhX zM;}uMlf+B#f68|r`Tdf^9^dQu3ZoK3a^MwQi(}w-JnRUwd1fAzfRYckllQZm=e^=~ z>@R(+4wO3ur^kK}Jo>~EXFMX<-n%`6@GyQO3Q zEVFyi*vQ9pKW-5mFfCIk@F?LJLvn2381clyt*%*GeK?HU6u}hO4ivbx*nkJmFt2CO z{PJ%R_#xq$RZ}Os93d43cn9Ck*!Ah}r0d8$=sNP}mT`{mvlSx>^^#E0YB6eFdUvbJ zllm%-wXb7;<+Ies@vlBalDciRKqOETn|WcE`1{U&xcMxIj7n_qGb8Eq%t|S;V<_nn zW(;h&`AcUYq<$UKqu{h*j3sF=)>*<*Aiy1Ll`e|H7R zA4;VDsY@L}QTh7-*O(IqMJ+R{HqVjR9pl-t&<5wM*sGVACdus(NdTNKhF*8mM|<)` z;0ZTVz5pYl6Z}rQ{{R^Ams6tOSmjf@!SBK_FwlKqyKDf*jDz(JPVboLVzaf}aNE}a zd`A0?^;JGRzp+cq0Xoe#JcWSCsD3v_UUFPl0V>Wr;7&lDlNScyO+p#8L~uuuM{sv# zL|(odvC||rT%QA1Uok-@#CD7GCUeXfIafz@M(q27E#hnveqP1NI~XKx?VM3+$Flx~ z;0MG~+n~6^>sFQ4_1wm*Sz1#nDW6?_vgp%3>B7p4EANt?Z+rjnKa&8g0kQPqXoPf> zb&=0lM_=ywYt&d@3B=PDfon#f0SuvMwn#)EoyDstNJX=v; z*mhP?O>D7pt7cGT99l?ACH?mLd=d3x^wtm~ItB2?Q)}0Z97ALI!A5of%ubiqJTQxrX&<| zXAI^3w47Y(AtG(bQf%lcVK!~#&$I-&um1up{5b1-K8oDxg2Ku;`gMrhmH^~~?B=!H z%z;`r@IGtTZcj>dW!z45pco=fn57!2B198yjwx_(Vtc+k(T@<7uD(%3DH-Kdnj7;n z%NX(K6`o$K0}99`p9S6y@+v3v{q!LU;uE1Qv-0!gv(JXKFg&5n%c{+*sc}<3IRmP= zpDYv_yEYMmW7;4urJJoD5FA*fHUD1d=DnV^cjR!yk!kLf?aWyq?mEMUFPYjl~TvoLCSGRa#v6zVv7*@&G(Fa=O7q{5lJsN8!)*cK# z^LT7ey4UqQL?@I%W&}bEwNbvqFWp3va+btVVn{4SD>*NFf_VK?k#uli3w!Aj#G}A^0r|-Q1Eig4Uz0FR!a3=^!p7U?7g>_cRUG zM#sQ;13ICH7v6HOQnW_{_s0B>O1wE1#|Ba`I8LJBT;j~2(d7nkglQix+Qp=OG*T1H z1~sB5U44OTsghVm%Y5j6fMXry$Y!6Q0AZQnR15NYwd3V{LwP*fLZhmvTEA0-c{h%m zpnJx-Xlj8rHYR~lLF0rXRLBka*bC-d%A#Q=mSizlf!5$)LOTqgSt>UfZL^_cV~+-X zT9l5KJM}U`y4qM#!QC>ki(-6rhyAs10XeTKiF~_%>&VIXv=}2d}Blj>AXH$ z(tVQt_MsMSoOz0-i$0GVeP^zz>7B&IJBt2tWqSXlsSnf0VTWmaDPjvd&DCe#F!OUs z%l#$1h-&p=HFOu6{+T8fAk55;x}4?e^MdOA)W^`w;FB)6f`(&gJRTiGL(3jM)YR~6 zM5BgZhpv)s*fcyW5yEIjaR&gLja-G zCsz-JGm@63sAkwKEjy|{h9KHeZAOwOJ0nS?9QE|Ia%6jh;VVo#I5KU(8i?xx-(&qd zV^bjb(2oopS->>N!Ztz5PFczi zU46*PIQ5xI+(2YzW+!QY3XMA->E?*d_&PJ)*~kZI>j?h@rchB(#|0nO!WE1|KG*Hw z!(d;WECPce)aMJSddAOgID$#gOmPfUAHihF%};*Fb=&sG+nn#v==|YRrNu>cZBdhVd7)H-EZmg4r!PHJrZ`GjH73pob;lya@a5asQ z>Q(rG6K3THwRYDHq#A~Q;QSA^Z>gUG#*Q0W8F9_zvV^bN2X^jXR;o=w z(gj(?e>R?e-J*T%(y-HFug7#+Bn{gVVB*Cghii!|#sQ4M2M*7a9|*!xsy@%q@cH~k z{nT8SbE2{H1t-MH{_FTp$nY9vvpI8+U6l}v;7veoyQ-E8YM|;i`%R-BTZT};=AYRz z!ScmwV+lQ~%hX5jiPT3>@YoR)fdq`1Ar3I#(a}tkOl)tUYPwg@u<0J% z&5DdPx8$xW;XsV+$FC;%Bv<^^&LNo|2lzzjEYKt?xVpK|2~gtqz@jZQ9P zHVC=+WkhV@10%NN1GEW!6of}V0U%tsMgaXw^kQAIXC9qoSzb}0abDj*y^cwCu$knx z`Rc5ZX*Umotu;U}E5Z!&DoN&wQF9QrQgt*=5x8V|lM)y=BZFOt5KcI<2E0_uHgf(DW(vH|(r16j}a_|%~MLh4ugh2_o zN(wm?dPL~y4(P%YTv(o~30Vomjt0;LijV+2mq%s};M_Zws&g)kszbScXmekq$N8e* zxn>yM=8Aw;&!w8@>8Wu>aLXOkE;RoxGgDa?@)D{XvT8ubU4scxdFtSxLq~lcBc+5E zpzT-E0>o6pZ{Y)ssA&}`W#(!rX)E^2CmIC-5*2?1DK#f!B!G=Gi)6_IvIx~Y3Fx=N z&O#ysbvCjCb#x60Xo7&~=7h_dcl>R^UCkBsc$*1kNw-_K>y2(P4pAH6pf%H0PCnt9 zx-q<#M`L(+a~MKg(0mgou9H|7en3^iSQiuYvSfPOw`&M(-q}C85sfEF3*>USrqLxW zKNkPv0=P3p=0fWdV-}s_26*clN7K!4YMN4oM-Bl`I}`$6xPbd;q>JfK4{)^5BM1NS-GHtAhsWqUSN(LvIv#gg}#)#{wpiN^|5J?Kv(b3+)w@@1A#G7dF@G z=6ognoqNS0;{=oqk>A45xrYx)aj{telIucYB$F^;9x}{tXf0vl~c^X#>pi_piTKt+$=-n(*{S&qW(CFlA_3$vn zsLV~lh*BrUaJB%+5#@o_CI+~;% z+G+SmCV8Pq7lzi#RREUqqIKo%*s%$8xV9WV5vh+D)uC_p_>PE^?`<@czN7jF`{Neyg#~;3fPZ@;SELVP0Z&-_D!iw_kjZz1Vpze4yrFp^huH zgxU%*Au=rT+~##x5*;r6MlYeYRIV+`-x?C7m{kvC~Fmq|?xdK}ChwDJ6u^ z+;@`wgD+prO1fT^_B>ZNqdox#hRwM^Czc!wIDu)@h7)7Db@83&uqOdN*!T{|KZC2? zmsyq1F+2Fc#VQ>re=Lo$h_R(^0jW?A1hH;N?|gUrnRr5Qqi|Lf>F4q(_H!vMHQkx=WlP$h_*IMkB-$|*+nyZw1KXaAn(}e_tT2$5%#D6>wmwXe$Q9%)#{-2On-BMm z;z;qMnDpu?jy!ra`0xR20u%BRHi22S_jms@H{n1*h-GX!(NeWeb}%IK8|>*iAI_)D zl&K*i{%4QG572pC=g=c@=!O;Mz7ZQ%jPGXa@Zpy$Mt5`dy+m?^I0cH_6r`g8BP~9j;mr)?*a~m zUL9jBsY9sW$}vTaD)TS^c7?iS5_66nu-$(asny|vFHM2*{Uz4~1$Fhg+66|(m(&~5 zG3h+eVGmM68~CvB#m<%t-VOHwv_sfqu(1c=${gt4M7@6Itr2R)NzrW1qRFGsca;R~ z<~c}ljR1OPzVb1Cpb;Q+U&6Y3zz1de+~mA|MkyWJcNLTNUEdBA7VbS9>39;XWbOf|hiJzE%6<&0+E62?^H5vX&xO^tl*Bu1iKB5TK@VgC_8i^;=($1Sg+*le zkO0ukk|WThL0Co9aik@+C^==xuLPILdgW|6ZC4~|Kn)H<=5~k&_9R=Hi9N|ebpoo5 za<=xj3B#?pD=`2KYUC2@q5HIan05r#<;8R$iR!HcVffrL6pvbfAx~>I^^51UXTym% z;lO}Gq2R?h$XUE&L2n?7cE%=8+LsELoB%*a&<=hHb=ZS=OxS1p<9YH5@n`zbT825u z^9l+q4Wdl+!|-Ox(P-@P&OVBxMb^qA_>2d4}DgB{ZbrzQCZf3~1q z1W`czILJf5`vr-UD%_$6t2IC7EAO6LG#Al!C2+?DYL*TR@^jqV^zqvN$ za3(w>%OPKRG{6%!O>cPGBkCMnpz=VWjE8)3do+02lx;EABU( z15heStFg6`)Y#AuZ))XaT4Q953bOU^4doSo-(O;~pr+72;L4}~|KR&hXr&*Pu{nxB z=GJh?!tltxDQ%MO089NA7RO-3xs?xFTh5a+)PUVK5I2${P&zXCz&3DD>>PPSG;zA1 z>f4e;((U zCL}p%%()RsM57%YRD&w@cNK`CLmt{Y=FiSS}lP@H>(Y#jDnA;?&< zB`D$5+}KX?f=H3r5SGnw(L(dx9q3}8LVuW;I?gd&=r?xhob*4^ll(Sf9@m_$M4)Ff zjXdC2p3hD0T6@z44q9?8&7fy&;`Ne`=>{lig?fZG2n06*3;NgP+xqx^65tzCwSD^z z=(y5xfI~vInaNY%B|P_1&BOJVhhg0Urnhm16&q~hT4cP8cUjDQqxwQ?bR6-8!};Lv zV9mJdFO$p3Ph;XIQ)88d6emAp)0SE3!ub1SO4W^QiF-vrwB-?*`>r9mhjs-gVRwGP z9B)Zhci?D;BZJR!)3!tjNdToT_T(uSbB#`p`v>zXFGcPiQZdak5`GvA!Wt5m-oG;) zA~K&Y@BMzSplL;~jYYBc+`p}+bPagGSF?mSo!G`3jW($dRG7@boR=jRjdarcq!kWUb;XUQ-yy-?!plmD?8VJW$hEpiH^TSGK@Gjnjf5GISejb03+$ZkZQPh-yN%IV1}WlGNP00G_o^zHplTs@tLLKuydJm+X!jcv{`Wr z1Bzb8*-7+y*oFU8mHLOlf<^3mH>#!y#{e+aGcgyfm~;aa9O8{Dm?erU=J|ZbOwMCw z0JAr2xC6vi7w?!rB7Dh4jX6GUgjnX!aAV#BZ92ucKJ3DF-f?^VPHgNzwu%V4{QR9&j*Whz4;EgD+zkRLEG&%#Y0tkJ z>Ak{1zN)0AKC{?RI z6DZ`3x(^M&!Y-HtZAnU-8rC>)^Sd_+3q6?bLdkX665rG(4yEpJ)e}wsWe`o&&9#gF&MMkdGaWDrgcGP~Rycp`F~J{84Wps* zyi`wt!R*54^Z=K;s~#LIMd3^rmPXcP=xdRSi|5}9!t31HP#Wdq+sYm`Um5`^ znHi&K!!_QOhI!FuRF>v~A-zmcy$$scicI5&4sj{Pso^}UJ)VHKrNQY-;WzR1elF6$ z#f**oDb9IUp)j<2qEDujYiDsjsG&q zwQH+V9{#2nFUiV6xkJ+`7{Y+z^{NMMzW8cLOv+o?@O|N+c(F6i1IOvHnoI3FU^!`k z#yXscJvHlNv4PiK>`3z4A$Vl^#v?q zHHj(JTqntmaUP5!LmHnAtXW#%F1e$NJylqol27&GCPLG5Ssv;HY)X70 zA!XsM96^D>UfiIJk!Zs)fu*m@-Q)Shdfq--Qrv~*#^Zv|TDsg-c{)xGH@Lb|z4l8h z|4`jbfn!|`!+)PoBv$zeVT@lu>X6J@ZVSffaCbCwtrUJu%8v_@^x>uuJK4?jB%^$X zxUA1lT0wuK#?ka;QnGkYfuhlMXFWN5Pcz!t;dV7AmkczThlj30fSi;5(45FD&Lv-y zSuFM$d%DfM8L1oiGVkCOIZP<_2De7(;KDRv@Pb;-o%KBzbh?BD<2o z@tSTtx7h#GW?MtykVK=sl9|R6V5~h@f5wB8%m-HJ!T*{+^v;GA^d|QT1NwD_WsM}7 z&|BuzZ|=#Gv-tp&42?iflY{{Jptt=+%0u)-R%I4vMp-erEWKz>OFZp=Wm7laXD1%* zWebk>!jJe6WXanTubg9DYQ-=a0MpokiPeEaVA!wHx7Alajewgk%L>XqT$Q;w1s)y~ zPWa9L?l$5XJEgxyZ)T*D5zH=$5AB$CqWT3Y8m3L6%;DAqPB_mo;|LfqG3;0alZ_=F6>N6mkxy|6M zTKB=QaUf1tWR`t9=j8i*oswA$o(~3L0YBjpF%cjP0-@gn-Gqk(vYmiiJq+}(Nd zH)}%@+`I_2N?==}0+eJ!6o`4e__+z*UU)g^slJ_Q6T=3T%RCkGhmAUz7{bAmSnifD12x9s0=emv~vtuEz1y9q?&lc}zCvvp_`UYbEb%el|Zc*qw(xfl= zs>302QVywc`asS4Rd9CjXUpz#^X7)(wOKc~2>tMGqc)_52zD)z$VBT;uF0G#6$J4W z=eXnzB4ntK>95vo+X=lAUo8pr3BGJA7eZ@z4kC|3A#VeI*wa8b-o?N^W}4c>J9DCZ zPP4H)4B!2lAF(k-8oJlZt4DWv;K9PL8>R2GxldZ(-O!;)E;VIFhbKIhb6l|w7^UYX z_Te#I|35vHSwF$y>|1`if#bh`*jACD$Tx;SM*{kJbt<_bMM@s41bPfaNM)knKG-I| z{Zq)Gxark`=Y6Sx4~~{#i0H_s6p%*>yRM%c za%$nMWn+8}gw@lc`5(-kx@Kz6r>5ke`+BMSgn%F~tf$bN9p=1($K-G&cQz!^FWW&H zoKP=&gi(kbjV0XjPxJ0nVzra-w4sXtn2<+>5A1D>JL_CfE%=Odmrk~ztX8wgsbhO zlLG048XAabf(MQR!c@PssK2Fcmi00 zp%*LzyfpbUlgTQye%e{|uQNo-ytEl|aE3QR@PqV;65lK4iJxvrN|Ll$y~f-BmJ8`nv6^M?=xFKt z@C`q&KLy>arf?GJnUFLZ3UjZCXGyY}U8$*!yyS?C6C#3=+%oa!4qc(Gj_-dQZZFTA zx-c9n*dBboy*tR_tNY~MZ5AYYsjV_5TC1+xRq@cf(6eonUk_hM#N8Q%RYdZ>j%&B) z|854I)DK=VLg|#T_#@WS<%v3hSI!@EA>Zf98yBWSaEP{_YwkNN;!n>t3`K4_cy5gN z(6F|O|Fxw4SWjP^6yR#U9iYbaHC8^xFZ#0|!XoWtcjt@k!yT~1dms_<~{(+(1~KlJKevz~Fw`Eb+m}3th>8QtDq(jMJ$Uz70i@VpwBA0EY2{0x5rRG zrpPuLyqr?)N|fw<$d8@O$4HM0T4&&mp8e)pI;3v^ktC4GPi~_NIErCyld5aJsa6E* zu+q0IOL}m%04=#XrA>~w&Z_{Bqy0R5PSajMBtL`Tj&I73_AZlPqK)WSi%Qzt)_hOC z+J`>lbG=M3lg|v;2D$8x7W`?DRX|JzHl@F|(ZvY54=~C$xO3I~yNmQ|ZM4!woB@Za z<)hKLLD*zCC17Xm1el~q?``2#U9A-hiW>!~jYk(6^rlL+=X!GrJZ?*XPjv~Mj7|^3 zG8tRn8H-SKs2MW2+anK$yI5^-6-Fy=JW|mlFKVNen)HPh{mea9sA1cXv}*gn#Jw1! zFqqHI*}yKRiEf6=U7UfRKV$#PLsbl8DRx zbuVAvhwM0jR?R$01@>^;9}@c9fX&vqUac)?*C^vC^Zc?6DCp8rekze<1$Gr+=?$c$ z>}Blr`M)Qm44@X3!L^C;q+Z=PSNY2VjZ<}5uYOHkmI@d6EGZCIB}Y|(EMxkK#O5AH zkBa(NVjo{;ZzzeC3w}S^WqpUk2@WG`Iz^Y(OZ-RnKh;Ux(Zuw!Pue&9wBHtOUgush z6mHfAP0N$4v`$Uu;Z^EkqzT_UFoDIL9crSwn*S6TK{8bdw*7Cs=;+4D^LC&ODOZNP z=gt4v3}%)%$YE5C-OTjvR+Z56BE*9?;gKRp2;`gBznPI;JH%eop%R(&Be<8q%u0 zfB2ud#u0ZV-tD_L2DXm=CzZvE4{Ik(0ZJr<&l(L=--uXfyH%BQg_EdP=--QOvtq_ z92G`hR(`xeBY)#)=`xWe!LiOUbZm;HD4sYqjPy~UO`%}|w0IcbaQpx>KfZ)?+#0WDsoA+^ zQiObcK#mbnkVaNS3BCe~g5#yILVX8oB;YMHs&Q!*+b=E){hZ*IX_@CNK5&rvta!Sy zOu#$_1V9;cZ9NdBUu~0v$NVrjn=a)Vts5LXnXyBzatM}@E^urwP|g5efe&!Cem?0w z@}im_&rSh~K+c5Q7H!A-il!Gvz( z7>n7mVb~u4NTF;tKi3lwlAn7P69XWZAM#1Oj%)tjiWE=&LwmRCbQh+*3^#_4vFR}D z$q0T!19sGhkjz=%gTtSk^7@eX1Te4N1qamw4HB43XB(B+R9kv_s>N0J8^t_WqDZbo z11WPN@^~EO5j-Z7k;vv-+c-+a*wdrE@=HMiY*efJYNqECQ1-m}|NHeV5J&;UV2Cd! zS{|XFho$s~^CN=z&_uwEY1M}VdWhpAkUe~;)|L?ItHEhL?Oh#?y`5pyZFS%bzT5?o z5G;1-9B}>&mcqQ*!u1~k}EBt5zf6y*4FV1Ay7DYe!V zL^{DKfIf##1EDpfQDX(I62ZYZt6Yeq%waa{aH?7W_vOn{6IgWcXyk7~AC%58Wu^#Nd^gGMxnNy3?pugtOFR^cILI*LvgF zdIrv{+4*As6htGSmZ$`^LndXZ@LUroEAJy3l_W5RN?_6cQgQNG%xEUgkugfTlpBYU zbzC%F&~YR@7_w!&cSYh57q-jdKfp(2Cuvv+oSBA>@R|@Sp>oXVxyojehJ4NAbdY7& z1tF)_{TVanqr{&x=`4@3?x*q>ET@)r`#838PyfuchZQ(o2Fp37aal(c$2YqPEcKWd zOvV*4<1Qa$mX+b|GO5q@D zEFAzE=l10|rW-)-e0TeqFjg_lCMbW_5gZq?G*gmU6CEn*($(XPP*}LD@?$7q5l#*~ z?H4>~Gh3u!&NO~{(6Aj!WDBya4#EYd6#`I z$dd17dq*B+$D$o{&YhOq+@Gt{k&6C96rDNJX3gb`AX9Zd6^BdeOQWrOM=^NLx&jr4j(d_Q69og?KBTN7rQBJ%!#W| zv(&4(Key2Zp>J?P4HmzY;Q%QVud={~p%9D;yW-5CeHv#&H5?mH=Iz|hmXy|I)ejyj z8(386pSkO&5K^(_I4)f{kFD6^ZNeV9nZ;&`jyMsO3`V8DjAARgm%GpQLIs*16n8kT zxoX*{PPza`(_rdv0ZW2O4p8tut4a9IbBy|m>O~ypF6F&oP!%Z>8_dE6Zu<4mx6~-) zAXqIVyez3j$r=YAb>${y!t}Qx({V;mc1cZ1r0AfygL&$WEB?Vni-lxDsuPYyJxTc z%E^(D&#F=51`XCtzL_m51Mo40ctHqGC7Z2zPF#a&jAY_Z@ltVCO=Mlbg6b)|)TS}| zCHn_oW($-(S$1nKmyY*n6$T;On3}3K0uYHBIH+*(WT3_ofO?U(1J~l|5r;>6@y9@O zW+M}$>*8gtLqfEYg}$o=&nYeGKV^SgRcy-Q>Gjjtu10#PRii76E{)wbc_!-_8P_Oi z0~&fIi+Dz5Ia90i1m1)Haoi>aKqi|6aN+8sQCYH70?8s|62`R!T7}jI>mXnuMitt# z&j{o-v)D#{dRc*X<+`u;R7^0wK~nse5MZNn`ljuW%jgSroL&+lYr1yQ^6d$IZ$I`u1~7r zagaN*8-17r0c@xd)cGkIXIvY{()h}~$u(hv$2J8=dGuK6kczliOkIV_Xc=Qr!yb+H51pN#aR&O<@Ue`RQ-WWXTy5Je$mnP@UsQ+r7PTsO03S>S6Su*b@ zKM(5(;m7x{e`o}7mlqf_Z~Pc#QRG1m!{DgGtInhUBYmaaE4N^exm(7CKVQro$;&Cr zrXx%IY;1<^9yn#^yJ>H~6gcFR{GR{ul00c?b(!$~@%$x{Pj~E0`D=XfL}4Gh3;xd~ z6n@=XRx4Q(q<-@}x1?fAbe!|mrM)EF8wvDx#_3O z_&u!PQLKpFl%jkFZ%X;bWNQ~_oFw_7E4A2U>o>Fb0Uz-v&ElRLFR|^@XBhemLw_{% z7cSdP?;5IJOd5K1>AAo1dN#eC!)NfVKIB_nn-CkDvYLDT`aI>YUQ`A((wwq01zCk( zyr|etRQ(;el)QB(HL-ilPSbZLQ6HPZFaM+7v8MhvgNqxk7qwS{)^o6eHZ@s zv#DFAf!+bsj@cdn>}0bUOx6lR7Z=_6i!^*Qwt-#4JfpS)7nE=_}=v%GRkYSMM96bw$

?thRhL(-}}-gnhmG{?x^-rHDC2*h-FzMW7{co`NC!1`pY{Q~BKalAXQxi&{sd&&sR9-uBGxS>>_5W~KS= zbRNGj^5CdRXWt6F^8L=+IYqobNcTOrDvyeLL2=ir$|FJ}s;|_3$j=HNHt~=Ad*6rb zywVjMx7A=oY+uGyLSe9 zJTfr>M(-@p=9!H&grS}kRsR`wzy1GoSSO28N$1!nNwa`Uxdv};5XRDH@>t?pY>;+=7{h@Mnp{1cjAeLr-^<~DxWR`s51r^;&YZWi5WirZ=@ z+pu}(fl(0pf|S*l=J^Bd;E{K>a&}QZ0k60OlvR3e2R}*=SIVjS{`<~OPfnI+*=|wt zXLQ zD2=RkgkIaFONB$PK#^X2^mtL=e;?}u>0swZn2ofC9&%7XFvpCkB7krmY2UzA5kSNs z1jBU@6gC|>;!Mje@5v(Z@fNfE>}Y{rj)vAmPfn3wbcadWDsnwCiBh*Md=Rk;5NV|6f__r1z@nOUs{|xgr~lQ@Zs!1a+}QN1jWYKNA8K>*7gti2c_RA&Uj^?Fu6~ojjmarC;BSoY{RuPv&-H*SopQA z-FG|T`D8hhE*Gh%%U`q`u5g;Ds;+`ED{f4X+tm?v@W?+1et2MT{=D>Ac`e!qyJO|F zkE-ykIon@4%$AOv9UYX#O^$8!B*g{RF>bt2ai`=O3X&`bWVSp zQ;VHkDn}{H%$l(gIpyMzb94E3BSH^JujKv~$qTwi=5SeO2n+8$Yc;96)ugX%SZB>b z>8Zg7TRPl`a$hbLs4`NJn&P@F+f>FTV}d?3ANPLs#*M{4Xl$c>noEEZ6@XoSG=GUX0G9_ArQP= zx=~e>qKiGsDPNcmvDn;T8*jVm=x&Ht2 z4@G*xBimDWCnR9gW&bnl-G4|q%j~0#ZM^vG?RL7Qam(_`aflIQgBckp`ix%oc9fvEB1?wU~+Q~0~=0=_9d)D-b;n|;w#LZ+bOK0#i z%ws%su92~%{x_XpxJsG0f)84OM=A>=hO+51jga@5Xb{SJtUUBP?Yo~>UeG*_*IssN zd7jwY0C+cCF|dq>Di{uDgV+%IXl`{N0s^fJATsa<<41$t6u8M&JdTQFugVioE?oQMF-)y_%RLO6 z2>IC?>z+(8dhW<{Co5<|oQ@F_QSekrmhk(XP`h9Fb#x<-*t=R*cgB;w)YWpOi!YPL zZxFEc5FD9ZB}~rTeYT{?pMSu$t^~sue7==5S|p8-cVuz;stAt z#5S!wS}l6ivOG@=%y|82#US2Pe(uexh3EvF^gmNlB*B=E;G^_ee2GPTUTRsp3xAbM zMYr!SS?wcPIxnjRy*y#zLHw=$?MYLEA@%~^-lFH2@Qc`a-@GHMJB30Oj@ODj&vA;u zOyLYCD4M*UroBf=wJZ;OsJPgxc6J9Z4RMLCV1kuXy$;nuyb=XZoC0pt0bw$@{`vFf z!|_RKY~u6i1I-GL{$=KJaRhbGMAt%xrPMn$L-u(zxNE8{+zE^Nrl_*RNUtT5kV@Va zkU@bLY~d0%zA3;&arlnjY70OIfvjFu*lsm9A!X0u$llqbSJ3m*Z&U>j z3J(;VfIv2c^@g~F2Tq-oF0?a+<2?`i*u1cOYsj73bcig_o$WqOcitDf<6}v{q~cYj zk;5hmLojmsCKIkvV4*wvJZEJ~FXGzFwpjW~t7XzBBL7Kv&ez*<@Iy4l3!?k^KSLS>ly>Kp!4rkT?`yzr%zAIq!<_uRu(ufT za8f09R!XzPgl1p?Ju}68rCVR!7K- zZf;SfQy%+68>A#!!`4FHD(HB*R1B#QxLV%B3bF}kFobY7#5IeBy;VEcbaFYvW|Yuu zh}heMEoO8_%LBjP$xUoopC1P)HTE1re+HIv6ZBUM88*=Cj7a|E?w}jzuC~v}#+6)% zx`~eG-+4n&k zkU;KHC=ZwRa{>Am-puH9Yi8tz*~W*?`Ep&#tcyV8F4{2Jw>v!0!)i#AegJMk%OvP% zxp>e)a0g`ZY-TRk{|xOjFQwPi5D4NpH#;NJ%1JUQ5uqy0?-^3isYQ zz=l;b)UoOO+?D`)Zn+6$F|qqNV-eXLm%W{Q6o$1w;?INFB4izEP|UQ$*4>y4yQHvp+1&2;34D?fcGpM2#pkY=VO4udK7wsJn!ne| z3i1{wc?-2<&mRdy%dLjnT2JZ@?hr`g*@KvSS9^v6fZy3M0D{i*+W#iOfm>Wb?g>3= zlE-5*1VrdENrQET>JHS$xV-W))0#;BXm*1JLvG*<3KIA|=rSIPoL6PL855p)$qdIp zP?~?Kah=HH;z5eGO5Q^`2S`!}E0Y;`b>8aQc=WR;eKiWb?uRSU)y@+Y3Gk_j;($Xs?B*5Cn#=iL(ci5<~vly=lr4KHsr_?>u@!_F4B5Xq;3<#-c?r6S@N4 zm(*YJ=wf>$nT&s1{GYVn{m*PXlH_+M+3&Rb4@sY#n|pkroJJZ{V0Vlji(2N|J1;f2 zCz+_VtMY$YfyJ|rE-$)3W_!&~OY#qXn7GkzY^mQ^_lhLHbM7Nv*_V`nRjmw#`ptlXo&-;7#_N4rQC7Y&XIPY5&#CKTOoA!=M3Cn=%QzaGHQCG(F49wV7 zS|?oEV|c_MX87FXu`tHT=`+W)KL@2Hg}v=~W6Q4Bsjl>nJR|)88pA=|~#vsAJleuq89#P+Z12URLkU>Bi5U zO+}c+*ud)_qM(Bt&KZ%F*GHQ*9uBj}Y-EAmn{HP99PJ!Nuh2DXc8twYV53Y{Lo@3UxbKagf5``_+ zD64^Y{KlS|I@Ymb3(A{0KiO{x$VD)Tis(f(hjH##HZxRk*H1Ok zA*mfKr;jWCI6YmM@s;1l={LqrAM5zpIFOU~#=6f2y&IMY8v+^}Xot0aCFQ$sO&Gd< z)>R#ULdCrtvIf7s>I0}k^W$K&TE~W?)vELA>N~Ph1G9G6X;>X&z8Sq@KBGFFd_iKO z%b93{rLHeDVQ5#7#KHVA7ZhX1o=PU#oIfyaMY-&y1yH@O9goz`_}D`ExLrH;bF~0r zj4mIF99U&5813hU!{G8v;ymw@nT=Yvw;gOwm-S|4secQS{PuRplNP+%ECB&!`)JRh zNO}CdmwKDOqN_}`gO?t6u2-HIK=sI;b=#L7T__J-sIyuCNLZh=_TBSW#~6p+g3z#Y z(k2XBV+Mk2`~iNqS5fk_?kKkGO&d-_+^_rTTmm`b}I2A zR)Qd-JeLV}^YWX)2NuZJB|MdLHvbTC3yb_&*kf1Q!F5?*E?%A-3&RwezchB11I#{3#2Cdsn26$`4_N%CXo|g~l>TBM--v4JZ#3|t z+y0e4$5(nfsEIQmf1^iJf1`c9(l|#DE1A=fTvBwdQCFD1B5CTcG>mq%`8h4@ohJ?a z0jriY`pYNb-wU=qUe($Yjd~h^Vca^6FouXAD(bl{R3l)tpSN&BIDWtKk+ZNsB){G6 z0s1J2i+E&Us5PX-K-Qpuvyo^kPPb$fk50?CRo8ZSwPAz zM26QCR4nJzSA2g-mfu)m;ep@%$3Y&{Z)^ZbhyJi7%n?(f81N-;fN@{NNBp^a`lo#~ zZtSV~K3B%5boy$3oCwp!Zh(FZOxPH=#)KCPITL%WI1qcjn^oe>gy+|8m%+-}lyM-J z@7?H}yCqEiRcYM^wPzt`Th+Df?nC7kKLn_bK~WfZ|NDWExP2dGK;ECr{suZT3GI2l zj+dx)fCM{6 zl9@&JBz-@!3f%MT=0ZntRut9?vXlHAzxW756n7P+B6yIXf5o)1r`$LC-AVNu`8!C89B@id=9KShC?rOuP z%G7ssTJDgF-cuz@ujac)N8Lyg~W>?cg5{#@HM_(gN=xaMZ5*U~PEtTf!bDqL$4@ zE%X26++Vr*7iO}_`((epUu-YoBw#Q?7*}n zD7k>VvwOwfKewDofXkkopwb|N^Y5fWS{$kiPTMC!c9}8Y1m|V|??6_bD6J{ej$7Fk9f_of? ztFW6dLE#*eQ`?M z;WBP;x=^)ZP061lM+_SSIdRHo<~2qTd-#GP!Gc&pOr>tU!Sb-=4;&imOb@H4GBsEJ#@pai^_*ZqMk>a5EHJmjF`2DqAdkQmlRo=c0Ud5>{cgne1 zfP)JIii(RN(h};lt8$4=(c-MEtblU(YqjV6D_;msugoa)FIt?Qw>Y5Ee({Lkg~=I( zentN4g~`yDNNf^iGL$mkYT9*VhlwLQ$W!TuyfOG`;z+X{F}5Quw+8O3ng4f|O{4^_ zdE9>YwrG*K#OA_fhfRmi? zcZG#**e`K$rAJYWNgEB9p$o_Vim@^^OV-neS_y@1Xz{+d8 zp7)NFOegyd>%X$?O8mzH*zst10o+JjRcW1K7z#=`>~ZuFcn|zndE`uf%5r;$rDeV8 znu#;g({|xn%83x*vh!fYWa||m8u&7c1BiUUncPpvu*FS2v#0PA=r9Bq>+EwRRM#93 zkM8f7;8T6^hY9RQ_!Dk(7FByVD?C0cJV;VI2mJxJW!5`_2Q9XM=3%e~cq*ts+_kNy1DL1mhY6_zw$3D5 z_VgUeVypE?(F{pR5Qt~iPg&tYa^~X0+-7m=R&YB@!n+K*RkO{Uvsjt358^>P%4-uq zBE!^=4iqi8zRzNd#khq;WpF9hR5sN+#_SyvT+OHs@_T>1cao92IaK%aX17f4O<+|8 zw`1EC!C%>u5mj}d$mEPl>!Lxn0%2#Yi73Xu8lzNi(GRBU@7sf#3U^uKuJ~6j0d3D! zo)YYrA~9oS#>yaEQSabEbmtuNGIlAjn&T)-ajXiwV`8z@{Ji%_@#V;xnQ%0bZVyWT zu!a9A#)0ZKKp{AtAjwisz@tl`#`XWT9f@HqeB|QyOn8;UU`Y$t!S=xM1f?&APmEF$ zxdN%#*g(E#rr!vsJWZo0fRo;gLO$cUwDu`h;8`hOVsbD1K`CJ1I_|i3JP6E?MB?F; z5^Pc1GVc5ka_UMwFL-mrNOIk~(wo&Z}MH-{P#qgc&IcI5j?^b2FqPq~FkP+^vbTWJ4BX{O0UNH3rwpSaBj3plsOPM=9I%@Jg!96{KkM?>ADd+ zN9?Tc0x}0nLD7TXvT9(JpqI2Cj{^tMMqavTQ9#iPMBo4+nAIT+bio4!`C6QQ0|4tc z|1)e53&W~_SLth3V_=QBU!=Ufw1+$NT(RZxzbD!YeX%wUjSS`z?ss&GIkH~ z33g49@UiET2D_8}f#u@*Usbz+XrEA-@%w!>?E^!#R+ua>ukKLB=pTWhUSuJx%){zB z;)Ym{q)(J)=HV*b2=;Hg;)&mTj#-A{Z6OcN$2v|;@rD4{`4x={5Fg$ZJOa)Lf3IIb z(C`I3JAy)~6dKCzN{QKO8eMyD^}7TZ2|QYCHF-70!?YG;#)$|wd=2iz#K?(tshO}5 zUP5ogrqU5ArO%p}lZRIA$KV~6FTpp{TTsJ^c?MAh34mgA5CVGyVHE(vS1aU)0S*xZ ziJeB9XL9ch_qBV-7wvek_G8){!~vD8s)N!nh&Dbgn@M2pwcqda-YM$Bpxm_&U>Sp; z=b4~aSr>x(%)5>PJ5`YC`M%nLbAp$>ucqoGyV*(=dG~fa2;k289RNAF12ug(BPuQn zF9a3D_pSVPSK!uN@ho;Ud|{BbJ^*bh^SqJcyrI_b#v%Gzegu%yw{$TCn_S*$2oXa2=xpK=fiWrtg5|e9OW-!;GM@Byfxl zYWRw_XNX+>Fbw2=4LNoTTn1u(pRMr^N|)|eqe)pmkzMEg5k0YPGzgq6D+`k774Irl zaP8@8Z*D)}{J-60{l6vnn~?AYHIC*TJjl~j-nGnZff80vgCbt5C`euQ^p2iNlT0LV zI#vI*(j;@hh3f%W*zo|3lJXw{r<+bGDUP^|0zClJ&k;l*17tmo_Xd;^p4|*_RC1Y- zvv$M?YUK}I-f?EpidgH0J5;p?H;FaUjCc?QK_y`z7KtW6i23;$Y6v={cMKc|d?^u8 z1V~&{gLM(Hf@Ae4^oQG1gu19RE!2})vL8T>%}|U~47Ve(+KlFaL4tEa&ZxdL!h4xD z!`gw?*Z?zD6Q`jR=qVv9AUce6BYjb)4$P*)E1+0CgVYt!l%-X@P^>P(QTFPtwsRog zuLAoPo74iTN|>)zZ4kr6mHP-*6l5G8YRM}~qFv+H%R{-chNp@e$Z7!oj$1Yx?KTVZ zO1}3FtPP+F6-JAts8 zmjRYHI!{LEm}N5Z1;2VeC8G$FAVeQTzB{a_Y@<^kB3~oeN46uFD=7i?Y|B!APSTj) zfuzFYX*v;bj5|H?Xb{?`W%dO20Qrc?0}v#?!_ENs!#d%bnS5Lf&xCML#!W)pT?q>k zMLqO`y6tZ+eRL=ZI?Kx*v-g`AxB5kY6Z9@;7>XrNOb z4J;2(&xtDov!j0OsV2-IFyv?e07jATMp5N<1C9wX>ZyCw0Nd_L_Pb;FL;zZZ7r1*u zP!VK-d1?IOQ87*w4{bhYdWL`!?RW-W+7!261w7yj3;@1qcFTUN2u#8-@~v7>2OU%1{14>IEm*}liU^dl#8*DRxZv%>JcFQ{kt zyR$#i4JWU?(Aiafp*rG$K>*r4f_!BMcrQ;=_}&iZ$rqy5k5+nZ;EI0D2wFYvT7h!6`c7QeX=;e=Q0(zF`OQ ztt6zN?o2R59<4DVd#~ua2kB&Yi8!i^4fm>$lx42cB+ia4SQm+fXJEy zw}Oq1GLeBt$LW>2l(GVZ=u>6ZDTf` zyfbV#5rF|)kK(R7D-~D-D2L+1P&?(9<1$DrL`AF6hh~8q*4rIVJZ_CQd2xohR^iMs{o#>u<-!HeIx0aAy61`kL#iWn+4l5F^>v^C7%KoJ=* z3eFwW?YO5x2Io$`UJXrIMhCB}CjPkZ_z#!|&t9eNVB@^;XR7|aavAWSalsSS0ift3 z!mT_FddCyUO^EC_JO`HTFrdcS5i~~ZDu|j+R~m4E`By~k)wY4z3GVgDDo!iK09MPK z!2nD8ULH?C!8vfEKx_)y;gif85mA8ElT|R*#)MFCJUQ784tW$719+@uf$!mHBhWoI z;!RcnCXAB;7J4kdS_KDD52Ap20Gj|ffUv@vHWj^A+kUlkXbAXj?-B%3KMLjF#WPX9 zKOnsdfIt>M0|!Woq4dx}sbi?1X4^$(MlTX9j3uaZCa!MuAk$XJ zV9R0I!CQA4V}YD{uv(;QU9#tS-{0>`LRo(`u{L?%_xbZa-xqwPul1R~YPH$rdy}E= z^Ur@axagff8@bg(b(;T5g&WS0|Nh{$)wTPF!|{z=yKKKZ)zjaINba==i;85KE;RXcnT z=s+3foxL_S5z~0jW=C4&um<)cfS#7RXx-S?>g0MtT#1%xpzb_6JX~3K+R+)M1d3jn zG@>K~30dWln*_#qZr!=P#>RVBFA3YI$?J^yK%s!Ov4N`VXu59f@9iCzrqLVl0m^mYPHmT6hp28@B*TLX zR*>>G&)x`O9NfBtmu<`NcKqO5mO918a3O@WoT}3ytFaVb&_;SU_5;Ji!(Y!tiU8WK z6-@|JWYDDslR@~I8=tD`PLAh?8c|AZ@CbG=f&?r&5+5GeZlQH*a*}=K6rsR$+u6j? zt^faCb-~o8wh=H*GyZoY+B$T$$n^d--m`zwxMuYlB!wtN{wW%WR^QKeyl{3Z@Z5T093*^btxp|{u z65Wa2(Y?<0RYDw73mP=_e*hoX9xaBP%u%&^!r!5yh}~%OdS$m4*SBlHEbww{JZ4vz z#@4lx@f$dT5|wgcBAI-nv4PxDx%X8Dkt*dzQV5WVt1^g(vRf^31S}<-+&7CqaBl^GenY+v`@9)dIru)kRA=>m&dMevf_td)9e9-_=zSqySAO7eVZ zZ~7mgoolKEgp7$rf*)HMv+`!&N7jUa(P&Ayn9|PF28et$zHrp$?rdai>O&h^?^Q-g zw9&yJO<_u&RH+Db33$Z1M62XklF$k{yWbZoUa7+PF|%~Y54^xdqwRlJUcwO>btcWf zc+uxcE?<^Q!D{WTbb-!Qk_;l{hjqL!O~iJ19J0Y7G=!GHnY&P6`6PStnxq^tHoNkh zxy{_f<>QVmVT*JPunahf8cu@QQb5F204$_rq)NVOq?mJ&7+dZ*a$-BzZBk#2AN&k! z&>$JeD^|v104JOK99KslOwl#4i7(qd1B#m`XnubH@6YBY7GA%-P6T0Wk*=9OMjBZR zrb~ZE4|>HSVNjqaRCzAl@3g&|K}s}1peRe_QET}}`J;>SR9`h21~LUpt0ZCJcB!C$K@7<@cF>?K>;}R+snJjac*g3vs+o+wqYtv3z&RUf9eG zOb79J>y}Bj(lS)Me)^p$teU6r!+uDp-gNYUxO;ZgU<~(&KG8&VnOH!T;iJ>Rn`ds_ TZT&6Lf Date: Wed, 11 Mar 2026 14:19:29 +0100 Subject: [PATCH 59/74] create audio_common folder in lib --- src/lib/{ => audio_common}/CITATION.cff | 0 src/lib/{ => audio_common}/Dockerfile | 0 src/lib/{ => audio_common}/LICENSE | 0 src/lib/{ => audio_common}/README.md | 0 .../audio_common/{ => audio_common}/.clang-format | 0 .../audio_common/{ => audio_common}/CMakeLists.txt | 0 .../include/audio_common/audio_capturer_node.hpp | 0 .../include/audio_common/audio_player_node.hpp | 0 .../include/audio_common/music_node.hpp | 0 .../include/audio_common/tts_node.hpp | 0 .../include/audio_common/wave_file.hpp | 0 src/lib/audio_common/{ => audio_common}/package.xml | 0 .../{ => audio_common}/samples/elevator.wav | Bin .../{ => audio_common}/src/audio_capturer_main.cpp | 0 .../src/audio_common/audio_capturer_node.cpp | 0 .../src/audio_common/audio_player_node.cpp | 0 .../src/audio_common/music_node.cpp | 0 .../src/audio_common/tts_node.cpp | 0 .../src/audio_common/wave_file.cpp | 0 .../{ => audio_common}/src/audio_player_main.cpp | 0 .../{ => audio_common}/src/music_main.cpp | 0 .../{ => audio_common}/src/tts_main.cpp | 0 .../audio_common_msgs/CMakeLists.txt | 0 .../audio_common_msgs/action/TTS.action | 0 .../audio_common_msgs/msg/Audio.msg | 0 .../audio_common_msgs/msg/AudioData.msg | 0 .../audio_common_msgs/msg/AudioInfo.msg | 0 .../audio_common_msgs/msg/AudioStamped.msg | 0 .../audio_common_msgs/package.xml | 0 .../audio_common_msgs/srv/MusicPlay.srv | 0 30 files changed, 0 insertions(+), 0 deletions(-) rename src/lib/{ => audio_common}/CITATION.cff (100%) rename src/lib/{ => audio_common}/Dockerfile (100%) rename src/lib/{ => audio_common}/LICENSE (100%) rename src/lib/{ => audio_common}/README.md (100%) rename src/lib/audio_common/{ => audio_common}/.clang-format (100%) rename src/lib/audio_common/{ => audio_common}/CMakeLists.txt (100%) rename src/lib/audio_common/{ => audio_common}/include/audio_common/audio_capturer_node.hpp (100%) rename src/lib/audio_common/{ => audio_common}/include/audio_common/audio_player_node.hpp (100%) rename src/lib/audio_common/{ => audio_common}/include/audio_common/music_node.hpp (100%) rename src/lib/audio_common/{ => audio_common}/include/audio_common/tts_node.hpp (100%) rename src/lib/audio_common/{ => audio_common}/include/audio_common/wave_file.hpp (100%) rename src/lib/audio_common/{ => audio_common}/package.xml (100%) rename src/lib/audio_common/{ => audio_common}/samples/elevator.wav (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_capturer_main.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_common/audio_capturer_node.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_common/audio_player_node.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_common/music_node.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_common/tts_node.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_common/wave_file.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/audio_player_main.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/music_main.cpp (100%) rename src/lib/audio_common/{ => audio_common}/src/tts_main.cpp (100%) rename src/lib/{ => audio_common}/audio_common_msgs/CMakeLists.txt (100%) rename src/lib/{ => audio_common}/audio_common_msgs/action/TTS.action (100%) rename src/lib/{ => audio_common}/audio_common_msgs/msg/Audio.msg (100%) rename src/lib/{ => audio_common}/audio_common_msgs/msg/AudioData.msg (100%) rename src/lib/{ => audio_common}/audio_common_msgs/msg/AudioInfo.msg (100%) rename src/lib/{ => audio_common}/audio_common_msgs/msg/AudioStamped.msg (100%) rename src/lib/{ => audio_common}/audio_common_msgs/package.xml (100%) rename src/lib/{ => audio_common}/audio_common_msgs/srv/MusicPlay.srv (100%) diff --git a/src/lib/CITATION.cff b/src/lib/audio_common/CITATION.cff similarity index 100% rename from src/lib/CITATION.cff rename to src/lib/audio_common/CITATION.cff diff --git a/src/lib/Dockerfile b/src/lib/audio_common/Dockerfile similarity index 100% rename from src/lib/Dockerfile rename to src/lib/audio_common/Dockerfile diff --git a/src/lib/LICENSE b/src/lib/audio_common/LICENSE similarity index 100% rename from src/lib/LICENSE rename to src/lib/audio_common/LICENSE diff --git a/src/lib/README.md b/src/lib/audio_common/README.md similarity index 100% rename from src/lib/README.md rename to src/lib/audio_common/README.md diff --git a/src/lib/audio_common/.clang-format b/src/lib/audio_common/audio_common/.clang-format similarity index 100% rename from src/lib/audio_common/.clang-format rename to src/lib/audio_common/audio_common/.clang-format diff --git a/src/lib/audio_common/CMakeLists.txt b/src/lib/audio_common/audio_common/CMakeLists.txt similarity index 100% rename from src/lib/audio_common/CMakeLists.txt rename to src/lib/audio_common/audio_common/CMakeLists.txt diff --git a/src/lib/audio_common/include/audio_common/audio_capturer_node.hpp b/src/lib/audio_common/audio_common/include/audio_common/audio_capturer_node.hpp similarity index 100% rename from src/lib/audio_common/include/audio_common/audio_capturer_node.hpp rename to src/lib/audio_common/audio_common/include/audio_common/audio_capturer_node.hpp diff --git a/src/lib/audio_common/include/audio_common/audio_player_node.hpp b/src/lib/audio_common/audio_common/include/audio_common/audio_player_node.hpp similarity index 100% rename from src/lib/audio_common/include/audio_common/audio_player_node.hpp rename to src/lib/audio_common/audio_common/include/audio_common/audio_player_node.hpp diff --git a/src/lib/audio_common/include/audio_common/music_node.hpp b/src/lib/audio_common/audio_common/include/audio_common/music_node.hpp similarity index 100% rename from src/lib/audio_common/include/audio_common/music_node.hpp rename to src/lib/audio_common/audio_common/include/audio_common/music_node.hpp diff --git a/src/lib/audio_common/include/audio_common/tts_node.hpp b/src/lib/audio_common/audio_common/include/audio_common/tts_node.hpp similarity index 100% rename from src/lib/audio_common/include/audio_common/tts_node.hpp rename to src/lib/audio_common/audio_common/include/audio_common/tts_node.hpp diff --git a/src/lib/audio_common/include/audio_common/wave_file.hpp b/src/lib/audio_common/audio_common/include/audio_common/wave_file.hpp similarity index 100% rename from src/lib/audio_common/include/audio_common/wave_file.hpp rename to src/lib/audio_common/audio_common/include/audio_common/wave_file.hpp diff --git a/src/lib/audio_common/package.xml b/src/lib/audio_common/audio_common/package.xml similarity index 100% rename from src/lib/audio_common/package.xml rename to src/lib/audio_common/audio_common/package.xml diff --git a/src/lib/audio_common/samples/elevator.wav b/src/lib/audio_common/audio_common/samples/elevator.wav similarity index 100% rename from src/lib/audio_common/samples/elevator.wav rename to src/lib/audio_common/audio_common/samples/elevator.wav diff --git a/src/lib/audio_common/src/audio_capturer_main.cpp b/src/lib/audio_common/audio_common/src/audio_capturer_main.cpp similarity index 100% rename from src/lib/audio_common/src/audio_capturer_main.cpp rename to src/lib/audio_common/audio_common/src/audio_capturer_main.cpp diff --git a/src/lib/audio_common/src/audio_common/audio_capturer_node.cpp b/src/lib/audio_common/audio_common/src/audio_common/audio_capturer_node.cpp similarity index 100% rename from src/lib/audio_common/src/audio_common/audio_capturer_node.cpp rename to src/lib/audio_common/audio_common/src/audio_common/audio_capturer_node.cpp diff --git a/src/lib/audio_common/src/audio_common/audio_player_node.cpp b/src/lib/audio_common/audio_common/src/audio_common/audio_player_node.cpp similarity index 100% rename from src/lib/audio_common/src/audio_common/audio_player_node.cpp rename to src/lib/audio_common/audio_common/src/audio_common/audio_player_node.cpp diff --git a/src/lib/audio_common/src/audio_common/music_node.cpp b/src/lib/audio_common/audio_common/src/audio_common/music_node.cpp similarity index 100% rename from src/lib/audio_common/src/audio_common/music_node.cpp rename to src/lib/audio_common/audio_common/src/audio_common/music_node.cpp diff --git a/src/lib/audio_common/src/audio_common/tts_node.cpp b/src/lib/audio_common/audio_common/src/audio_common/tts_node.cpp similarity index 100% rename from src/lib/audio_common/src/audio_common/tts_node.cpp rename to src/lib/audio_common/audio_common/src/audio_common/tts_node.cpp diff --git a/src/lib/audio_common/src/audio_common/wave_file.cpp b/src/lib/audio_common/audio_common/src/audio_common/wave_file.cpp similarity index 100% rename from src/lib/audio_common/src/audio_common/wave_file.cpp rename to src/lib/audio_common/audio_common/src/audio_common/wave_file.cpp diff --git a/src/lib/audio_common/src/audio_player_main.cpp b/src/lib/audio_common/audio_common/src/audio_player_main.cpp similarity index 100% rename from src/lib/audio_common/src/audio_player_main.cpp rename to src/lib/audio_common/audio_common/src/audio_player_main.cpp diff --git a/src/lib/audio_common/src/music_main.cpp b/src/lib/audio_common/audio_common/src/music_main.cpp similarity index 100% rename from src/lib/audio_common/src/music_main.cpp rename to src/lib/audio_common/audio_common/src/music_main.cpp diff --git a/src/lib/audio_common/src/tts_main.cpp b/src/lib/audio_common/audio_common/src/tts_main.cpp similarity index 100% rename from src/lib/audio_common/src/tts_main.cpp rename to src/lib/audio_common/audio_common/src/tts_main.cpp diff --git a/src/lib/audio_common_msgs/CMakeLists.txt b/src/lib/audio_common/audio_common_msgs/CMakeLists.txt similarity index 100% rename from src/lib/audio_common_msgs/CMakeLists.txt rename to src/lib/audio_common/audio_common_msgs/CMakeLists.txt diff --git a/src/lib/audio_common_msgs/action/TTS.action b/src/lib/audio_common/audio_common_msgs/action/TTS.action similarity index 100% rename from src/lib/audio_common_msgs/action/TTS.action rename to src/lib/audio_common/audio_common_msgs/action/TTS.action diff --git a/src/lib/audio_common_msgs/msg/Audio.msg b/src/lib/audio_common/audio_common_msgs/msg/Audio.msg similarity index 100% rename from src/lib/audio_common_msgs/msg/Audio.msg rename to src/lib/audio_common/audio_common_msgs/msg/Audio.msg diff --git a/src/lib/audio_common_msgs/msg/AudioData.msg b/src/lib/audio_common/audio_common_msgs/msg/AudioData.msg similarity index 100% rename from src/lib/audio_common_msgs/msg/AudioData.msg rename to src/lib/audio_common/audio_common_msgs/msg/AudioData.msg diff --git a/src/lib/audio_common_msgs/msg/AudioInfo.msg b/src/lib/audio_common/audio_common_msgs/msg/AudioInfo.msg similarity index 100% rename from src/lib/audio_common_msgs/msg/AudioInfo.msg rename to src/lib/audio_common/audio_common_msgs/msg/AudioInfo.msg diff --git a/src/lib/audio_common_msgs/msg/AudioStamped.msg b/src/lib/audio_common/audio_common_msgs/msg/AudioStamped.msg similarity index 100% rename from src/lib/audio_common_msgs/msg/AudioStamped.msg rename to src/lib/audio_common/audio_common_msgs/msg/AudioStamped.msg diff --git a/src/lib/audio_common_msgs/package.xml b/src/lib/audio_common/audio_common_msgs/package.xml similarity index 100% rename from src/lib/audio_common_msgs/package.xml rename to src/lib/audio_common/audio_common_msgs/package.xml diff --git a/src/lib/audio_common_msgs/srv/MusicPlay.srv b/src/lib/audio_common/audio_common_msgs/srv/MusicPlay.srv similarity index 100% rename from src/lib/audio_common_msgs/srv/MusicPlay.srv rename to src/lib/audio_common/audio_common_msgs/srv/MusicPlay.srv From ae5c91bc7fe138c8aa5b09595832f5f381486b99 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 14:20:05 +0100 Subject: [PATCH 60/74] fix for falling after stop state, is now integrated later in hcm and in bodybehaviour too --- .../decisions/game_state_decider.py | 5 +- .../behavior_dsd/main.dsd | 3 +- .../bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd | 68 ++++++++++--------- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py index 7b400bd81..eff710ca7 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py @@ -17,8 +17,11 @@ def perform(self, reevaluate=False): """ game_state_number = self.blackboard.gamestate.get_game_state() + is_stopped = self.blackboard.gamestate.is_stopped() # todo this is a temporary hack to make GUI work - if game_state_number == GameState.STATE_INITIAL: + if is_stopped: + return "STOPPED" + elif game_state_number == GameState.STATE_INITIAL: return "INITIAL" elif game_state_number == GameState.STATE_READY: return "READY" diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 525e09112..efb522694 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -130,7 +130,7 @@ $BallSeen SECOND --> #SupporterRole THIRD --> #DefensePositioning --->BodyBehavior +#BodyBehavior $IsPenalized YES --> #DoNothing JUST_UNPENALIZED --> $GameStateDecider @@ -162,4 +162,5 @@ $IsPenalized NORMAL --> #NormalBehavior OVERTIME --> #NormalBehavior STANDBY --> #StandAndLook + STOPPED --> #DoNothing diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd index 3ed553538..c4e15f47f 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd @@ -21,35 +21,41 @@ $StartHCM TEACH --> @RobotStateRecord, @SetTorque + stiff:false, @Wait HOLD --> @SetTorque + stiff:true, @Wait FINISHED --> @SetTorque + stiff:true + r:false, @RobotStateControllable, @PlayAnimationDynup + direction:walkready + r:false - OFF --> $GameControllerStop + OFF --> $Stop STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait - FREE --> $Stop - STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait - FREE -->$CheckIMU - IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup - PROBLEM --> @RobotStateHardwareProblem, @WaitForIMU - OKAY --> $CheckPressureSensor - PRESSURE_NOT_STARTED --> @RobotStateStartup, @WaitForPressureStartup - PROBLEM --> @RobotStateHardwareProblem, @WaitForPressure - OKAY --> $PickedUp - PICKED_UP --> @RobotStatePickedUp, @PlayAnimationDynup + direction:walkready + r:false, @Wait - ON_GROUND --> $Fallen - FALLEN_FRONT --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationStandupFront, @SetSquat + squat:true - FALLEN_BACK --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @SetFootZero, @PlayAnimationFallingBack, @PlayAnimationStandupBack, @SetSquat + squat:true - FALLEN_RIGHT --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontRight - FALLEN_LEFT --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontLeft - NOT_FALLEN --> $Falling - FALLING_LEFT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingLeft, @Wait - FALLING_RIGHT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingRight, @Wait - FALLING_FRONT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait - FALLING_BACK --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingBack, @Wait - NOT_FALLING --> $InSquat - YES --> @RobotStateGettingUp, @Complain, @PlayAnimationDynup + direction:rise, @SetSquat + squat:false - NO --> $PlayingExternalAnimation - ANIMATION_RUNNING --> @StopWalking, @RobotStateAnimationRunning, @Wait - ANIMATION_SERVER_TIMEOUT --> @CancelAnimation - FREE --> $RecentWalkingGoals - STAY_WALKING --> @RobotStateWalking, @Wait - NOT_WALKING --> $RecentKickGoals - KICKING --> @RobotStateKicking, @Wait - NOT_KICKING --> @RobotStateControllable, @Wait + FREE -->$CheckIMU + IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup + PROBLEM --> @RobotStateHardwareProblem, @WaitForIMU + OKAY --> $CheckPressureSensor + PRESSURE_NOT_STARTED --> @RobotStateStartup, @WaitForPressureStartup + PROBLEM --> @RobotStateHardwareProblem, @WaitForPressure + OKAY --> $PickedUp + PICKED_UP --> @RobotStatePickedUp, @PlayAnimationDynup + direction:walkready + r:false, @Wait + ON_GROUND --> $Fallen + FALLEN_FRONT --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationStandupFront, @SetSquat + squat:true + FALLEN_BACK --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @SetFootZero, @PlayAnimationFallingBack, @PlayAnimationStandupBack, @SetSquat + squat:true + FALLEN_RIGHT --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontRight + FALLEN_LEFT --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontLeft + NOT_FALLEN --> $Falling + FALLING_LEFT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingLeft, @Wait + FALLING_RIGHT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingRight, @Wait + FALLING_FRONT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait + FALLING_BACK --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingBack, @Wait + NOT_FALLING --> $InSquat + YES --> @RobotStateGettingUp, @Complain, @PlayAnimationDynup + direction:rise, @SetSquat + squat:false + NO --> $PlayingExternalAnimation + ANIMATION_RUNNING --> @StopWalking, @RobotStateAnimationRunning, @Wait + ANIMATION_SERVER_TIMEOUT --> @CancelAnimation + FREE --> $RecentWalkingGoals + STAY_WALKING --> @RobotStateWalking, @Wait + NOT_WALKING --> $RecentKickGoals + KICKING --> @RobotStateKicking, @Wait + NOT_KICKING --> @RobotStateControllable, @Wait From ce9beaf34b84227710e578505a629f0d1cf089f0 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 14:57:32 +0100 Subject: [PATCH 61/74] fix(git-subrepo): add `git-subrepo` to pixi and exlude `src/lib` from formatting/linting --- .pre-commit-config.yaml | 3 ++ pixi.lock | 100 ++++++++++++++++++++++++++++++++++++++++ pixi.toml | 1 + 3 files changed, 104 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fae0d6a30..8960ecac0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,10 @@ repos: args: - "--fix" - "--exit-non-zero-on-fix" + - "--exclude=src/lib/**" - id: ruff-format + args: + - "--exclude=src/lib/**" - repo: https://github.com/pocc/pre-commit-hooks rev: v1.3.5 hooks: diff --git a/pixi.lock b/pixi.lock index 2d88dc4e3..dc633d055 100644 --- a/pixi.lock +++ b/pixi.lock @@ -154,6 +154,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda @@ -1196,6 +1197,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda @@ -2100,6 +2102,7 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda @@ -2108,11 +2111,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.18.3-py312h014360a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda @@ -2122,11 +2132,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -2134,6 +2147,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -2158,6 +2173,7 @@ environments: linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py312h1b372e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda @@ -2166,11 +2182,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cppcheck-2.18.3-py312h5677ec4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda @@ -2180,11 +2203,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.2-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.1-h79dcc73_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.1-h825857f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda @@ -2192,6 +2218,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre-8.45-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -2367,6 +2395,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda @@ -3410,6 +3439,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda @@ -7452,6 +7482,16 @@ packages: purls: [] size: 14338508 timestamp: 1770986540132 +- conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda + sha256: 1095cdcb8bb889d50c399e07609b7217a27f8305e4ac70b3f46b9e0d94ed4760 + md5: 3057964958da1fc0ec119951dd6775e2 + depends: + - git >=2.23 + license: MIT + license_family: MIT + purls: [] + size: 37429 + timestamp: 1770108326508 - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda sha256: dbbec21a369872c8ebe23cb9a3b9d63638479ee30face165aa0fccc96e93eec3 md5: 7c14f3706e099f8fcd47af2d494616cc @@ -8964,6 +9004,21 @@ packages: purls: [] size: 1370023 timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1386730 + timestamp: 1769769569681 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 md5: 29c10432a2ca1472b53f299ffb2ffa37 @@ -8979,6 +9034,20 @@ packages: purls: [] size: 1474620 timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba + md5: d9ca108bd680ea86a963104b6b3e95ca + depends: + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1517436 + timestamp: 1769773395215 - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab md5: a8832b479f93521a9e7b5b743803be51 @@ -9735,6 +9804,22 @@ packages: purls: [] size: 462942 timestamp: 1767821743793 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 + md5: d50608c443a30c341c24277d28290f76 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 466704 + timestamp: 1773218522665 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda sha256: bf9d50e78df63b807c5cc98f44dc06a6555ab499edcd2949e9a07a5a785a11ee md5: dc4f2007c6a30a45dfcf1c3a97b6aba6 @@ -9751,6 +9836,21 @@ packages: purls: [] size: 482649 timestamp: 1767821674919 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda + sha256: 75c1b2f9cff7598c593dda96c55963298bebb5bcb5a77af0b4c41cb03d26100b + md5: d5306c7ec07faf48cfb0e552c67339e0 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 485694 + timestamp: 1773218484057 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 diff --git a/pixi.toml b/pixi.toml index 4861c49c6..3f50d4571 100644 --- a/pixi.toml +++ b/pixi.toml @@ -206,6 +206,7 @@ webots = ">=2022b,<2023a" clang-format = ">=21.1.0,<22" cppcheck = ">=2.18.3,<3" pre-commit = ">=4.4.0,<5" +git-subrepo = ">=0.4.9,<0.5" [feature.ros.pypi-dependencies] # These are are pypi dependencies needed for our ROS 2 packages From 3fe2b25067f4433fbab6604d0c6aa888a5556cd7 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 15:00:52 +0100 Subject: [PATCH 62/74] git subrepo pull src/lib/game_controller_hsl --force subrepo: subdir: "src/lib/game_controller_hsl" merged: "2fa5731b6" upstream: origin: "git@github.com:bit-bots/game_controller_hsl.git" branch: "rolling" commit: "2fa5731b6" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "ea10886" --- src/lib/game_controller_hsl/.gitrepo | 4 ++-- .../game_controller_hsl/scripts/sim_gamestate.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib/game_controller_hsl/.gitrepo b/src/lib/game_controller_hsl/.gitrepo index 30a072adc..0558261bd 100644 --- a/src/lib/game_controller_hsl/.gitrepo +++ b/src/lib/game_controller_hsl/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = git@github.com:bit-bots/game_controller_hsl.git branch = rolling - commit = d55ef420ed7d4e4dfc0d88d5db2ef573038284c0 - parent = 215848ae8d261ddade8c6555bacd92d37f2862bb + commit = 2fa5731b60e701e2f3500b94c892c708cc900a88 + parent = ce9beaf34b84227710e578505a629f0d1cf089f0 method = merge cmdver = 0.4.9 diff --git a/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py b/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py index 91f1ea5d2..e9d249bb7 100755 --- a/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py +++ b/src/lib/game_controller_hsl/game_controller_hsl/scripts/sim_gamestate.py @@ -21,11 +21,11 @@ class SimGamestate(Node): msg = """Setting the GameState by entering a number: -0: GAMESTATE_INITIAL = 0 -1: GAMESTATE_READY = 1 -2: GAMESTATE_SET = 2 -3: GAMESTATE_PLAYING =3 -4: GAMESTATE_FINISHED = 4 +0: STATE_INITIAL = 0 +1: STATE_READY = 1 +2: STATE_SET = 2 +3: STATE_PLAYING =3 +4: STATE_FINISHED = 4 5: COMPETITION_TYPE_SMALL = 0 6: COMPETITION_TYPE_MIDDLE = 1 From a00690fe4e9a435095bf07ec050aaf80f4c919c2 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 15:43:11 +0100 Subject: [PATCH 63/74] fix(deploy): use taskset to run build on 10 cpu cores --- scripts/deploy/tasks/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deploy/tasks/build.py b/scripts/deploy/tasks/build.py index 64bfbfa38..4e446107c 100644 --- a/scripts/deploy/tasks/build.py +++ b/scripts/deploy/tasks/build.py @@ -62,7 +62,7 @@ def _build(self, connections: Group) -> GroupResult: :return: The results of the task. """ print_debug("Building packages") - cmd = f"cd {self._remote_workspace} && pixi run build {self._package}" + cmd = f"cd {self._remote_workspace} && chrt -r 1 taskset -c 0-9 pixi run build {self._package}" print_debug(f"Calling '{cmd}'") try: From 3da6740f5dad7cbc6ba7113744acf197dc8ad104 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 15:43:48 +0100 Subject: [PATCH 64/74] fix(behavior): change BodyBehavior back to entrypoint (`-->`) --- .../bitbots_body_behavior/behavior_dsd/main.dsd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index efb522694..1e0107805 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -130,7 +130,7 @@ $BallSeen SECOND --> #SupporterRole THIRD --> #DefensePositioning -#BodyBehavior +-->BodyBehavior $IsPenalized YES --> #DoNothing JUST_UNPENALIZED --> $GameStateDecider @@ -163,4 +163,3 @@ $IsPenalized OVERTIME --> #NormalBehavior STANDBY --> #StandAndLook STOPPED --> #DoNothing - From 328a9df6fc286576e4ca2efed7b56bd0fca3f087 Mon Sep 17 00:00:00 2001 From: Jan Gutsche Date: Wed, 11 Mar 2026 16:54:08 +0100 Subject: [PATCH 65/74] jack camera calibration --- .../bitbots_extrinsic_calibration/config/jack.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bitbots_misc/bitbots_extrinsic_calibration/config/jack.yaml b/src/bitbots_misc/bitbots_extrinsic_calibration/config/jack.yaml index e8073c240..7db5cd145 100644 --- a/src/bitbots_misc/bitbots_extrinsic_calibration/config/jack.yaml +++ b/src/bitbots_misc/bitbots_extrinsic_calibration/config/jack.yaml @@ -1,11 +1,11 @@ /bitbots_extrinsic_camera_calibration: ros__parameters: - offset_x: -0.02 + offset_x: -0.075 offset_y: 0.0 offset_z: 0.0 /bitbots_extrinsic_imu_calibration: ros__parameters: - offset_x: 0.04 + offset_x: 0.035 offset_y: 0.01 offset_z: 0.0 From 903670e567faae0eab811a7632a26a754b79df81 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 19:39:25 +0100 Subject: [PATCH 66/74] be more conservative with whistle threshold --- pixi.lock | 86 +++++++++++++++++++ .../whistle_detector.py | 2 +- 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/pixi.lock b/pixi.lock index eb5a412cb..f713f94b3 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2106,6 +2106,7 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda @@ -2114,11 +2115,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.20.0-py312h014360a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda @@ -2128,11 +2136,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -2140,6 +2151,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre-8.45-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -2165,6 +2178,7 @@ environments: linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py312h1b372e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda @@ -2173,11 +2187,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cppcheck-2.20.0-py312h5677ec4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda @@ -2187,11 +2208,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.2-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.2-h79dcc73_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.2-h825857f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda @@ -2199,6 +2223,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre-8.45-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -8952,6 +8978,21 @@ packages: purls: [] size: 1370023 timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1386730 + timestamp: 1769769569681 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 md5: 29c10432a2ca1472b53f299ffb2ffa37 @@ -8967,6 +9008,20 @@ packages: purls: [] size: 1474620 timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba + md5: d9ca108bd680ea86a963104b6b3e95ca + depends: + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1517436 + timestamp: 1769773395215 - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab md5: a8832b479f93521a9e7b5b743803be51 @@ -9723,6 +9778,22 @@ packages: purls: [] size: 462942 timestamp: 1767821743793 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 + md5: d50608c443a30c341c24277d28290f76 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 466704 + timestamp: 1773218522665 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda sha256: bf9d50e78df63b807c5cc98f44dc06a6555ab499edcd2949e9a07a5a785a11ee md5: dc4f2007c6a30a45dfcf1c3a97b6aba6 @@ -9739,6 +9810,21 @@ packages: purls: [] size: 482649 timestamp: 1767821674919 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda + sha256: 75c1b2f9cff7598c593dda96c55963298bebb5bcb5a77af0b4c41cb03d26100b + md5: d5306c7ec07faf48cfb0e552c67339e0 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 485694 + timestamp: 1773218484057 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 diff --git a/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py b/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py index f9620b119..62ef294db 100755 --- a/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py +++ b/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py @@ -66,7 +66,7 @@ def detect_whistle(self, audio, sample_rate): ratio = whistle_energy / total_energy - return ratio > 0.5 # TODO: Tune, worked well on my Laptop + return ratio > 0.6 # TODO: Tune, worked well on my Laptop From f103e55158ff81138583dcffe2a56546fc193590 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 23:02:32 +0100 Subject: [PATCH 67/74] fix(pre-commit): always exclude `src/lib` --- .pre-commit-config.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8960ecac0..3e9649be2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,7 @@ +exclude: | + ^src/lib/| + ^src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/RobocupProtocol/ + repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.9.6 @@ -17,7 +21,6 @@ repos: args: - "-i" - id: cppcheck - exclude: &exclude_robocup_protocol ^src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/RobocupProtocol/ args: - "--inline-suppr" - "--suppress=missingIncludeSystem" @@ -31,7 +34,6 @@ repos: hooks: - id: cmake-format - id: cmake-lint - exclude: *exclude_robocup_protocol - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: @@ -39,5 +41,4 @@ repos: - id: check-toml - id: check-xml - id: check-yaml - exclude: *exclude_robocup_protocol - id: detect-private-key From 1813faae4cd3944376ee55264b99704503635b13 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 23:26:25 +0100 Subject: [PATCH 68/74] git subrepo clone (merge) git@github.com:bit-bots/bio_ik.git src/lib/bio_ik subrepo: subdir: "src/lib/bio_ik" merged: "ffec29f7a" upstream: origin: "git@github.com:bit-bots/bio_ik.git" branch: "ros2" commit: "ffec29f7a" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "ea10886" --- src/lib/bio_ik/.gitrepo | 12 + src/lib/bio_ik/CMakeLists.txt | 184 ++ src/lib/bio_ik/Doxyfile | 2427 +++++++++++++++++ src/lib/bio_ik/LICENCE.txt | 31 + src/lib/bio_ik/README.md | 545 ++++ .../bio_ik/bio_ik_kinematics_description.xml | 4 + src/lib/bio_ik/doc/goals.pdf | Bin 0 -> 20945 bytes src/lib/bio_ik/doc/pr2_vt_0.png | Bin 0 -> 117770 bytes src/lib/bio_ik/doc/solvers.pdf | Bin 0 -> 19457 bytes src/lib/bio_ik/include/bio_ik/bio_ik.hpp | 48 + src/lib/bio_ik/include/bio_ik/frame.hpp | 260 ++ src/lib/bio_ik/include/bio_ik/goal.hpp | 130 + src/lib/bio_ik/include/bio_ik/goal_types.hpp | 749 +++++ src/lib/bio_ik/include/bio_ik/robot_info.hpp | 126 + src/lib/bio_ik/package.xml | 34 + src/lib/bio_ik/src/forward_kinematics.hpp | 1504 ++++++++++ src/lib/bio_ik/src/goal_types.cpp | 273 ++ src/lib/bio_ik/src/ik_base.hpp | 215 ++ src/lib/bio_ik/src/ik_cppoptlib.cpp | 257 ++ src/lib/bio_ik/src/ik_evolution_1.cpp | 561 ++++ src/lib/bio_ik/src/ik_evolution_2.cpp | 659 +++++ src/lib/bio_ik/src/ik_gradient.cpp | 293 ++ src/lib/bio_ik/src/ik_neural.cpp | 690 +++++ src/lib/bio_ik/src/ik_parallel.hpp | 278 ++ src/lib/bio_ik/src/ik_test.cpp | 137 + src/lib/bio_ik/src/kinematics_plugin.cpp | 616 +++++ src/lib/bio_ik/src/problem.cpp | 342 +++ src/lib/bio_ik/src/problem.hpp | 144 + src/lib/bio_ik/src/utils.hpp | 468 ++++ src/lib/bio_ik/test/utest.cpp | 120 + 30 files changed, 11107 insertions(+) create mode 100644 src/lib/bio_ik/.gitrepo create mode 100644 src/lib/bio_ik/CMakeLists.txt create mode 100644 src/lib/bio_ik/Doxyfile create mode 100644 src/lib/bio_ik/LICENCE.txt create mode 100644 src/lib/bio_ik/README.md create mode 100644 src/lib/bio_ik/bio_ik_kinematics_description.xml create mode 100644 src/lib/bio_ik/doc/goals.pdf create mode 100644 src/lib/bio_ik/doc/pr2_vt_0.png create mode 100644 src/lib/bio_ik/doc/solvers.pdf create mode 100644 src/lib/bio_ik/include/bio_ik/bio_ik.hpp create mode 100644 src/lib/bio_ik/include/bio_ik/frame.hpp create mode 100644 src/lib/bio_ik/include/bio_ik/goal.hpp create mode 100644 src/lib/bio_ik/include/bio_ik/goal_types.hpp create mode 100644 src/lib/bio_ik/include/bio_ik/robot_info.hpp create mode 100644 src/lib/bio_ik/package.xml create mode 100644 src/lib/bio_ik/src/forward_kinematics.hpp create mode 100644 src/lib/bio_ik/src/goal_types.cpp create mode 100644 src/lib/bio_ik/src/ik_base.hpp create mode 100644 src/lib/bio_ik/src/ik_cppoptlib.cpp create mode 100644 src/lib/bio_ik/src/ik_evolution_1.cpp create mode 100644 src/lib/bio_ik/src/ik_evolution_2.cpp create mode 100644 src/lib/bio_ik/src/ik_gradient.cpp create mode 100644 src/lib/bio_ik/src/ik_neural.cpp create mode 100644 src/lib/bio_ik/src/ik_parallel.hpp create mode 100644 src/lib/bio_ik/src/ik_test.cpp create mode 100644 src/lib/bio_ik/src/kinematics_plugin.cpp create mode 100644 src/lib/bio_ik/src/problem.cpp create mode 100644 src/lib/bio_ik/src/problem.hpp create mode 100644 src/lib/bio_ik/src/utils.hpp create mode 100644 src/lib/bio_ik/test/utest.cpp diff --git a/src/lib/bio_ik/.gitrepo b/src/lib/bio_ik/.gitrepo new file mode 100644 index 000000000..ef37371df --- /dev/null +++ b/src/lib/bio_ik/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = git@github.com:bit-bots/bio_ik.git + branch = ros2 + commit = ffec29f7aebb16a9ae67667db4a29d375046c23b + parent = f103e55158ff81138583dcffe2a56546fc193590 + method = merge + cmdver = 0.4.9 diff --git a/src/lib/bio_ik/CMakeLists.txt b/src/lib/bio_ik/CMakeLists.txt new file mode 100644 index 000000000..3e38441ef --- /dev/null +++ b/src/lib/bio_ik/CMakeLists.txt @@ -0,0 +1,184 @@ +cmake_minimum_required(VERSION 3.15) +project(bio_ik) + +if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() + +find_package(ament_cmake REQUIRED) +find_package(ament_cmake_ros REQUIRED) + +set(THIS_PACKAGE_INCLUDE_DEPENDS + Eigen3 + moveit_core + moveit_ros_planning + pluginlib + rclcpp + tf2_eigen + tf2_ros + tf2_kdl + tf2_geometry_msgs +) + +foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS}) + find_package(${Dependency} REQUIRED) +endforeach() + +find_package(OpenMP) +# the specific flag is not yet present in cmake 2.8.12 +if(OpenMP_CXX_FOUND OR OPENMP_FOUND) + message(STATUS "OPENMP FOUND") + add_compile_options(${OpenMP_CXX_FLAGS}) + if(NOT OpenMP_CXX_LIBRARIES) + # cmake 2.8.12 does not yet specify the library - assume we might need libgomp + set(OpenMP_LIBS gomp) + else() + set(OpenMP_LIBS ${OpenMP_CXX_LIBRARIES}) + endif() +else() + message(WARNING "OPENMP NOT FOUND. You will suffer performance loss.") + set(OpenMP_LIBS) +endif() + +option(USE_FANN "build the neural-network-based IK solver (experimental)" OFF) +if(USE_FANN) + find_library(FANN_LIBRARIES NAMES fann) + find_path(FANN_INCLUDE_DIRS NAMES fann.h) + if(NOT FANN_INCLUDE_DIRS OR NOT FANN_LIBRARIES) + message(FATAL_ERROR "Neural network solver requested, but libfann was not found.") + else() + message("Found libfann: ${FANN_LIBRARIES} / ${FANN_INCLUDE_DIRS}") + endif() +else() + set(FANN_LIBRARIES) + set(FANN_INCLUDE_DIRS) +endif() + +option(USE_CPPOPTLIB "Include gradient-based solvers from CppNumericalSolvers (bio_ik also provides its own solver)" OFF) +if(USE_CPPOPTLIB) + find_path(CPPOPTLIB_INCLUDE_DIRS + NAMES cppoptlib/solver/bfgssolver.h + HINTS ../../CppNumericalSolvers/include) + if(NOT CPPOPTLIB_INCLUDE_DIRS) + message(FATAL_ERROR "cppoptlib support requested, but the headers could not be found.") + else() + message("Found cppoptlib: ${CPPOPTLIB_INCLUDE_DIRS}") + endif() + add_definitions(-DENABLE_CPP_OPTLIB) +else() + set(CPPOPTLIB_INCLUDE_DIRS) +endif() + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + add_compile_options(-frecord-gcc-switches) +endif() + +add_compile_options($<$:-O3>) +add_compile_options($<$:-ftree-vectorize>) +add_compile_options($<$:-ffast-math>) + +include_directories( + include + ${FANN_INCLUDE_DIRS} + ${CPPOPTLIB_INCLUDE_DIRS} +) + +set(SOURCES + src/goal_types.cpp + src/problem.cpp + src/ik_test.cpp + src/ik_gradient.cpp + src/ik_evolution_1.cpp + src/ik_evolution_2.cpp +) + +if(USE_FANN) + list(APPEND SOURCES src/ik_neural.cpp) +endif() + +if(USE_CPPOPTLIB) + list(APPEND SOURCES src/ik_cppoptlib.cpp) +endif() + +add_library(${PROJECT_NAME} ${SOURCES}) + +target_include_directories(${PROJECT_NAME} PUBLIC + $ + $ +) + +ament_target_dependencies( + ${PROJECT_NAME} + PUBLIC + ${THIS_PACKAGE_INCLUDE_DEPENDS} +) + +target_link_libraries( + ${PROJECT_NAME} + PUBLIC + ${FANN_LIBRARIES} + ${OpenMP_LIBS} +) + +add_library(${PROJECT_NAME}_plugin SHARED + ${SOURCES} + src/kinematics_plugin.cpp +) + +target_include_directories(${PROJECT_NAME}_plugin PUBLIC + $ + $ +) + +target_link_libraries( + ${PROJECT_NAME}_plugin + PRIVATE + ${PROJECT_NAME} +) + + +install( + DIRECTORY include/ + DESTINATION include +) +install( + TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_plugin + EXPORT export_${PROJECT_NAME} + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + + +pluginlib_export_plugin_description_file( + moveit_core + bio_ik_kinematics_description.xml +) + +ament_export_include_directories( + include +) +ament_export_libraries( + ${PROJECT_NAME}_plugin +) +ament_export_targets( + export_${PROJECT_NAME} +) + +ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS}) + +if(BUILD_TESTING) + find_package(ament_cmake_gtest REQUIRED) + + ament_add_gtest(bio_ik_test test/utest.cpp) + target_link_libraries(bio_ik_test + bio_ik + ) + target_include_directories(bio_ik_test + PUBLIC $ + PUBLIC $) + +endif() + +ament_package() diff --git a/src/lib/bio_ik/Doxyfile b/src/lib/bio_ik/Doxyfile new file mode 100644 index 000000000..82db879ad --- /dev/null +++ b/src/lib/bio_ik/Doxyfile @@ -0,0 +1,2427 @@ +# Doxyfile 1.8.11 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "bio_ik" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "MoveIt kinematics_base plugin based on particle optimization & GA" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = src README.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, +# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = doc + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = "../docs" + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /

!$})d^G+&5a4z> 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 literal 0 HcmV?d00001 diff --git a/src/lib/bio_ik/doc/solvers.pdf b/src/lib/bio_ik/doc/solvers.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80f2c6520198dfcdac57bfe340cf4ddffd73f402 GIT binary patch literal 19457 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 literal 0 HcmV?d00001 diff --git a/src/lib/bio_ik/include/bio_ik/bio_ik.hpp b/src/lib/bio_ik/include/bio_ik/bio_ik.hpp new file mode 100644 index 000000000..eb87d8647 --- /dev/null +++ b/src/lib/bio_ik/include/bio_ik/bio_ik.hpp @@ -0,0 +1,48 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include +#include +#include +#include + +#include +#include + +namespace bio_ik +{ + +} diff --git a/src/lib/bio_ik/include/bio_ik/frame.hpp b/src/lib/bio_ik/include/bio_ik/frame.hpp new file mode 100644 index 000000000..a9b0bd3c2 --- /dev/null +++ b/src/lib/bio_ik/include/bio_ik/frame.hpp @@ -0,0 +1,260 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include + +#include +#include +#include +#include +#include + +namespace bio_ik +{ + +typedef tf2::Quaternion Quaternion; +typedef tf2::Vector3 Vector3; + +struct alignas(32) Frame +{ + Vector3 pos; + double __padding[4 - (sizeof(Vector3) / sizeof(double))]; + Quaternion rot; + inline Frame() {} + inline Frame(const tf2::Vector3& pos, const tf2::Quaternion& rot) + : pos(pos) + , rot(rot) + { + } + explicit inline Frame(const KDL::Frame& kdl) + { + pos = tf2::Vector3(kdl.p.x(), kdl.p.y(), kdl.p.z()); + double qx, qy, qz, qw; + kdl.M.GetQuaternion(qx, qy, qz, qw); + rot = tf2::Quaternion(qx, qy, qz, qw); + } + explicit inline Frame(const geometry_msgs::msg::Pose& msg) + { + tf2::fromMsg(msg.orientation, rot); + pos = tf2::Vector3(msg.position.x, msg.position.y, msg.position.z); + } + explicit inline Frame(const Eigen::Isometry3d& f) + { + pos = tf2::Vector3(f.translation().x(), f.translation().y(), f.translation().z()); + Eigen::Quaterniond q(f.rotation()); + rot = tf2::Quaternion(q.x(), q.y(), q.z(), q.w()); + } + + inline const Vector3& getPosition() const { return pos; } + inline const Quaternion& getOrientation() const { return rot; } + inline void setPosition(const Vector3& p) { pos = p; } + inline void setOrientation(const Quaternion& q) { rot = q; } + +private: + template struct IdentityFrameTemplate + { + static const Frame identity_frame; + }; + +public: + static inline const Frame& identity() { return IdentityFrameTemplate<0>::identity_frame; } +}; + +inline void frameToKDL(const Frame& frame, KDL::Frame& kdl_frame) +{ + kdl_frame.p.x(frame.pos.x()); + kdl_frame.p.y(frame.pos.y()); + kdl_frame.p.z(frame.pos.z()); + kdl_frame.M = KDL::Rotation::Quaternion(frame.rot.x(), frame.rot.y(), frame.rot.z(), frame.rot.w()); +} + +template const Frame Frame::IdentityFrameTemplate::identity_frame(Vector3(0, 0, 0), Quaternion(0, 0, 0, 1)); + +static std::ostream& operator<<(std::ostream& os, const Frame& f) { return os << "(" << f.pos.x() << "," << f.pos.y() << "," << f.pos.z() << ";" << f.rot.x() << "," << f.rot.y() << "," << f.rot.z() << "," << f.rot.w() << ")"; } + +__attribute__((always_inline)) inline void quat_mul_vec(const tf2::Quaternion& q, const tf2::Vector3& v, tf2::Vector3& r) +{ + double v_x = v.x(); + double v_y = v.y(); + double v_z = v.z(); + + // if(__builtin_expect(v_x == 0 && v_y == 0 && v_z == 0, 0)) { r = tf2::Vector3(0, 0, 0); return; } + // if(v_x == 0 && v_y == 0 && v_z == 0) { r = tf2::Vector3(0, 0, 0); return; } + + double q_x = q.x(); + double q_y = q.y(); + double q_z = q.z(); + double q_w = q.w(); + + if((v_x == 0 && v_y == 0 && v_z == 0) || (q_x == 0 && q_y == 0 && q_z == 0 && q_w == 1)) + { + r = v; + return; + } + // if((v_x + v_y + v_z == 0 && v_x == 0 && v_y == 0) || (q_x + q_y + q_z == 0 && q_x == 0 && q_y == 0 && q_w == 1)) { r = v; return; } + // if(q_x == 0 && q_y == 0 && q_z == 0 && q_w == 1) { r = v; return; } + + double t_x = q_y * v_z - q_z * v_y; + double t_y = q_z * v_x - q_x * v_z; + double t_z = q_x * v_y - q_y * v_x; + + double r_x = q_w * t_x + q_y * t_z - q_z * t_y; + double r_y = q_w * t_y + q_z * t_x - q_x * t_z; + double r_z = q_w * t_z + q_x * t_y - q_y * t_x; + + r_x += r_x; + r_y += r_y; + r_z += r_z; + + r_x += v_x; + r_y += v_y; + r_z += v_z; + + r.setX(r_x); + r.setY(r_y); + r.setZ(r_z); +} + +__attribute__((always_inline)) inline void quat_mul_quat(const tf2::Quaternion& p, const tf2::Quaternion& q, tf2::Quaternion& r) +{ + double p_x = p.x(); + double p_y = p.y(); + double p_z = p.z(); + double p_w = p.w(); + + double q_x = q.x(); + double q_y = q.y(); + double q_z = q.z(); + double q_w = q.w(); + + double r_x = (p_w * q_x + p_x * q_w) + (p_y * q_z - p_z * q_y); + double r_y = (p_w * q_y - p_x * q_z) + (p_y * q_w + p_z * q_x); + double r_z = (p_w * q_z + p_x * q_y) - (p_y * q_x - p_z * q_w); + double r_w = (p_w * q_w - p_x * q_x) - (p_y * q_y + p_z * q_z); + + r.setX(r_x); + r.setY(r_y); + r.setZ(r_z); + r.setW(r_w); +} + +__attribute__((always_inline)) inline void concat(const Frame& a, const Frame& b, Frame& r) +{ + tf2::Vector3 d; + quat_mul_vec(a.rot, b.pos, d); + r.pos = a.pos + d; + quat_mul_quat(a.rot, b.rot, r.rot); +} + +__attribute__((always_inline)) inline void concat(const Frame& a, const Frame& b, const Frame& c, Frame& r) +{ + Frame tmp; + concat(a, b, tmp); + concat(tmp, c, r); +} + +__attribute__((always_inline)) inline void quat_inv(const tf2::Quaternion& q, tf2::Quaternion& r) +{ + r.setX(-q.x()); + r.setY(-q.y()); + r.setZ(-q.z()); + r.setW(q.w()); +} + +__attribute__((always_inline)) inline void invert(const Frame& a, Frame& r) +{ + Frame tmp; + quat_inv(a.rot, r.rot); + quat_mul_vec(r.rot, -a.pos, r.pos); +} + +__attribute__((always_inline)) inline void change(const Frame& a, const Frame& b, const Frame& c, Frame& r) +{ + Frame tmp; + invert(b, tmp); + concat(a, tmp, c, r); +} + +__attribute__((always_inline)) inline Frame inverse(const Frame& f) +{ + Frame r; + invert(f, r); + return r; +} + +__attribute__((always_inline)) inline Frame operator*(const Frame& a, const Frame& b) +{ + Frame r; + concat(a, b, r); + return r; +} + +__attribute__((always_inline)) inline Frame& operator*=(Frame& a, const Frame& b) +{ + a = a * b; + return a; +} + +__attribute__((always_inline)) inline void normalizeFast(Quaternion& q) +{ + double f = (3.0 - q.length2()) * 0.5; + q.setX(q.x() * f); + q.setY(q.y() * f); + q.setZ(q.z() * f); + q.setW(q.w() * f); +} + +__attribute__((always_inline)) inline KDL::Twist frameTwist(const Frame& a, const Frame& b) +{ + auto frame = inverse(a) * b; + KDL::Twist t; + t.vel.x(frame.pos.x()); + t.vel.y(frame.pos.y()); + t.vel.z(frame.pos.z()); + + double ra = frame.rot.getAngle(); + // double ra = frame.rot.getAngleShortestPath(); + if(ra > +M_PI) ra -= 2 * M_PI; + // if(ra < -M_PI) ra += 2 * M_PI; + + auto r = frame.rot.getAxis() * ra; + t.rot.x(r.x()); + t.rot.y(r.y()); + t.rot.z(r.z()); + + return t; +} +} diff --git a/src/lib/bio_ik/include/bio_ik/goal.hpp b/src/lib/bio_ik/include/bio_ik/goal.hpp new file mode 100644 index 000000000..e78da3876 --- /dev/null +++ b/src/lib/bio_ik/include/bio_ik/goal.hpp @@ -0,0 +1,130 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include + +#include + +#include +#include + +namespace bio_ik +{ + +class RobotInfo; + +class GoalContext +{ +protected: + const double* active_variable_positions_; + const Frame* tip_link_frames_; + std::vector goal_variable_indices_; + std::vector goal_link_indices_; + bool goal_secondary_; + std::vector goal_link_names_, goal_variable_names_; + double goal_weight_; + const moveit::core::JointModelGroup* joint_model_group_; + std::vector problem_active_variables_; + std::vector problem_tip_link_indices_; + std::vector initial_guess_; + std::vector velocity_weights_; + const RobotInfo* robot_info_; + mutable std::vector temp_vector_; + +public: + GoalContext() {} + inline const Frame& getLinkFrame(size_t i = 0) const { return tip_link_frames_[goal_link_indices_[i]]; } + inline const double getVariablePosition(size_t i = 0) const + { + auto j = goal_variable_indices_[i]; + if(j >= 0) + return active_variable_positions_[j]; + else + return initial_guess_[-1 - j]; + } + inline const Frame& getProblemLinkFrame(size_t i) const { return tip_link_frames_[i]; } + inline size_t getProblemLinkCount() const { return problem_tip_link_indices_.size(); } + inline size_t getProblemLinkIndex(size_t i) const { return problem_tip_link_indices_[i]; } + inline double getProblemVariablePosition(size_t i) const { return active_variable_positions_[i]; } + inline size_t getProblemVariableCount() const { return problem_active_variables_.size(); } + inline size_t getProblemVariableIndex(size_t i) const { return problem_active_variables_[i]; } + inline double getProblemVariableInitialGuess(size_t i) const { return initial_guess_[problem_active_variables_[i]]; } + inline double getProblemVariableWeight(size_t i) const { return velocity_weights_[i]; } + inline const RobotInfo& getRobotInfo() const { return *robot_info_; } + void addLink(const std::string& name) { goal_link_names_.push_back(name); } + void addVariable(const std::string& name) { goal_variable_names_.push_back(name); } + void setSecondary(bool secondary) { goal_secondary_ = secondary; } + void setWeight(double weight) { goal_weight_ = weight; } + const moveit::core::JointModelGroup& getJointModelGroup() const { return *joint_model_group_; } + const moveit::core::RobotModel& getRobotModel() const { return joint_model_group_->getParentModel(); } + std::vector& getTempVector() const { return temp_vector_; } + friend class Problem; +}; + +class Goal +{ +protected: + bool secondary_; + double weight_; + +public: + Goal() + : weight_(1) + , secondary_(false) + { + } + virtual ~Goal() {} + bool isSecondary() const { return secondary_; } + double getWeight() const { return weight_; } + void setWeight(double w) { weight_ = w; } + virtual void describe(GoalContext& context) const + { + context.setSecondary(secondary_); + context.setWeight(weight_); + } + virtual double evaluate(const GoalContext& context) const { return 0; } +}; + +struct BioIKKinematicsQueryOptions : kinematics::KinematicsQueryOptions +{ + std::vector> goals; + std::vector fixed_joints; + bool replace; + mutable double solution_fitness; + BioIKKinematicsQueryOptions(); + ~BioIKKinematicsQueryOptions(); +}; +} diff --git a/src/lib/bio_ik/include/bio_ik/goal_types.hpp b/src/lib/bio_ik/include/bio_ik/goal_types.hpp new file mode 100644 index 000000000..c0df03702 --- /dev/null +++ b/src/lib/bio_ik/include/bio_ik/goal_types.hpp @@ -0,0 +1,749 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include + +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +namespace bio_ik +{ + +class LinkGoalBase : public Goal +{ + std::string link_name_; + +public: + LinkGoalBase() + { + weight_ = 1; + link_name_ = ""; + } + LinkGoalBase(const std::string& link_name, double weight) + { + weight_ = weight; + link_name_ = link_name; + } + virtual void describe(GoalContext& context) const + { + Goal::describe(context); + context.addLink(link_name_); + } + void setLinkName(const std::string& link_name) { link_name_ = link_name; } + const std::string& getLinkName() const { return link_name_; } +}; + +class PositionGoal : public LinkGoalBase +{ + tf2::Vector3 position_; + +public: + PositionGoal() + : position_(0, 0, 0) + { + } + PositionGoal(const std::string& link_name, const tf2::Vector3& position, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position_(position) + { + } + inline const tf2::Vector3& getPosition() const { return position_; } + inline void setPosition(const tf2::Vector3& position) { position_ = position; } + virtual double evaluate(const GoalContext& context) const { return context.getLinkFrame().getPosition().distance2(getPosition()); } +}; + +class OrientationGoal : public LinkGoalBase +{ + tf2::Quaternion orientation_; + +public: + OrientationGoal() + : orientation_(0, 0, 0, 1) + { + } + OrientationGoal(const std::string& link_name, const tf2::Quaternion& orientation, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , orientation_(orientation.normalized()) + { + } + inline const tf2::Quaternion& getOrientation() const { return orientation_; } + inline void setOrientation(const tf2::Quaternion& orientation) { orientation_ = orientation.normalized(); } + virtual double evaluate(const GoalContext& context) const + { + // return getOrientation().distance2(context.getLinkFrame().getOrientation()); + // return (getOrientation() - getOrientation().nearest(context.getLinkFrame().getOrientation())).length2(); + return fmin((getOrientation() - context.getLinkFrame().getOrientation()).length2(), (getOrientation() + context.getLinkFrame().getOrientation()).length2()); + /*return + (getOrientation() - context.getLinkFrame().getOrientation()).length2() * + (getOrientation() + context.getLinkFrame().getOrientation()).length2() * 0.5;*/ + } +}; + +class PoseGoal : public LinkGoalBase +{ + Frame frame_; + double rotation_scale_; + +public: + PoseGoal() + : rotation_scale_(0.5) + , frame_(Frame::identity()) + { + } + PoseGoal(const std::string& link_name, const tf2::Vector3& position, const tf2::Quaternion& orientation, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , frame_(position, orientation.normalized()) + , rotation_scale_(0.5) + { + } + inline const tf2::Vector3& getPosition() const { return frame_.getPosition(); } + inline void setPosition(const tf2::Vector3& position) { frame_.setPosition(position); } + inline const tf2::Quaternion& getOrientation() const { return frame_.getOrientation(); } + inline void setOrientation(const tf2::Quaternion& orientation) { frame_.setOrientation(orientation.normalized()); } + inline double getRotationScale() const { return rotation_scale_; } + inline void setRotationScale(double rotation_scale) { rotation_scale_ = rotation_scale; } + virtual double evaluate(const GoalContext& context) const + { + double e = 0.0; + e += context.getLinkFrame().getPosition().distance2(getPosition()); + + /*e += + (getOrientation() - context.getLinkFrame().getOrientation()).length2() * + (getOrientation() + context.getLinkFrame().getOrientation()).length2() * + (rotation_scale_ * rotation_scale_) * 0.5;*/ + + /*double a = getOrientation().angleShortestPath(context.getLinkFrame().getOrientation()); + e += a * a; + return e;*/ + + /*e += 1 - getOrientation().dot(context.getLinkFrame().getOrientation()); + return e;*/ + + /*double l = getOrientation().length2() * context.getLinkFrame().getOrientation().length2(); + //double x = _mm_rsqrt_ss(_mm_set_ss((float)l))[0]; + double x = 1.0 / l; + e += (1 - getOrientation().dot(context.getLinkFrame().getOrientation()) * x) * (rotation_scale_ * rotation_scale_); + return e;*/ + + e += fmin((getOrientation() - context.getLinkFrame().getOrientation()).length2(), (getOrientation() + context.getLinkFrame().getOrientation()).length2()) * (rotation_scale_ * rotation_scale_); + + // e += (1.0 - getOrientation().dot(context.getLinkFrame().getOrientation())) * (rotation_scale_ * rotation_scale_); + + // e += (getOrientation() - context.getLinkFrame().getOrientation()).length2() * (rotation_scale_ * rotation_scale_); + // ROS_ERROR("r %f", (getOrientation() - context.getLinkFrame().getOrientation()).length2()); + // e += (getOrientation() - getOrientation().nearest(context.getLinkFrame().getOrientation())).length2() * (rotation_scale_ * rotation_scale_); + return e; + } +}; + +class LookAtGoal : public LinkGoalBase +{ + tf2::Vector3 axis_; + tf2::Vector3 target_; + +public: + LookAtGoal() + : axis_(1, 0, 0) + , target_(0, 0, 0) + { + } + LookAtGoal(const std::string& link_name, const tf2::Vector3& axis, const tf2::Vector3& target, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , axis_(axis) + , target_(target) + { + } + const tf2::Vector3& getAxis() const { return axis_; } + const tf2::Vector3& getTarget() const { return target_; } + void setAxis(const tf2::Vector3& axis) { axis_ = axis.normalized(); } + void setTarget(const tf2::Vector3& target) { target_ = target; } + virtual double evaluate(const GoalContext& context) const + { + auto& fb = context.getLinkFrame(); + tf2::Vector3 axis; + quat_mul_vec(fb.getOrientation(), axis_, axis); + return (target_ - fb.getPosition()).normalized().distance2(axis.normalized()); + // return (target_ - axis * axis.dot(target_ - fb.getPosition())).distance2(fb.getPosition()); + } +}; + +class MaxDistanceGoal : public LinkGoalBase +{ + tf2::Vector3 target; + double distance; + +public: + MaxDistanceGoal() + : target(0, 0, 0) + , distance(1) + { + } + MaxDistanceGoal(const std::string& link_name, const tf2::Vector3& target, double distance, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , target(target) + , distance(distance) + { + } + const tf2::Vector3& getTarget() const { return target; } + void setTarget(const tf2::Vector3& t) { target = t; } + double getDistance() const { return distance; } + void setDistance(double d) { distance = d; } + virtual double evaluate(const GoalContext& context) const + { + auto& fb = context.getLinkFrame(); + double d = fmax(0.0, fb.getPosition().distance(target) - distance); + return d * d; + } +}; + +class MinDistanceGoal : public LinkGoalBase +{ + tf2::Vector3 target; + double distance; + +public: + MinDistanceGoal() + : target(0, 0, 0) + , distance(1) + { + } + MinDistanceGoal(const std::string& link_name, const tf2::Vector3& target, double distance, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , target(target) + , distance(distance) + { + } + const tf2::Vector3& getTarget() const { return target; } + void setTarget(const tf2::Vector3& t) { target = t; } + double getDistance() const { return distance; } + void setDistance(double d) { distance = d; } + virtual double evaluate(const GoalContext& context) const + { + auto& fb = context.getLinkFrame(); + double d = fmax(0.0, distance - fb.getPosition().distance(target)); + return d * d; + } +}; + +class LineGoal : public LinkGoalBase +{ + tf2::Vector3 position; + tf2::Vector3 direction; + +public: + LineGoal() + : position(0, 0, 0) + , direction(0, 0, 0) + { + } + LineGoal(const std::string& link_name, const tf2::Vector3& position, const tf2::Vector3& direction, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position(position) + , direction(direction.normalized()) + { + } + const tf2::Vector3& getPosition() const { return position; } + void setPosition(const tf2::Vector3& p) { position = p; } + const tf2::Vector3& getDirection() const { return direction; } + void setDirection(const tf2::Vector3& d) { direction = d.normalized(); } + virtual double evaluate(const GoalContext& context) const + { + auto& fb = context.getLinkFrame(); + return position.distance2(fb.getPosition() - direction * direction.dot(fb.getPosition() - position)); + } +}; + +class PlaneGoal : public LinkGoalBase +{ + tf2::Vector3 position; + tf2::Vector3 normal; + +public: + PlaneGoal() + : position(0, 0, 0) + , normal(0, 0, 1) + { + } + PlaneGoal(const std::string& link_name, const tf2::Vector3& position, const tf2::Vector3& normal, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position(position) + , normal(normal.normalized()) + { + } + const tf2::Vector3& getPosition() const { return position; } + void setPosition(const tf2::Vector3& p) { position = p; } + const tf2::Vector3& getNormal() const { return normal; } + void setNormal(const tf2::Vector3& d) { normal = d.normalized(); } + virtual double evaluate(const GoalContext& context) const + { + auto link_position = context.getLinkFrame().getPosition(); + // Get the signed distance from the link to the plane + double signed_dist = (link_position - position).dot(normal); + return signed_dist * signed_dist; + } +}; + +#if (MOVEIT_FCL_VERSION < FCL_VERSION_CHECK(0, 6, 0)) +class TouchGoal : public LinkGoalBase +{ + tf2::Vector3 position; + tf2::Vector3 normal; + struct CollisionShape + { + std::vector vertices; + std::vector points; + std::vector polygons; + std::vector plane_normals; + std::vector plane_dis; + collision_detection::FCLGeometryConstPtr geometry; + Frame frame; + std::vector> edges; + }; + struct CollisionLink + { + bool initialized; + std::vector> shapes; + CollisionLink() + : initialized(false) + { + } + }; + struct CollisionModel + { + std::vector collision_links; + }; + mutable CollisionModel* collision_model; + mutable const moveit::core::LinkModel* link_model; + +public: + TouchGoal() + : position(0, 0, 0) + , normal(0, 0, 0) + { + } + TouchGoal(const std::string& link_name, const tf2::Vector3& position, const tf2::Vector3& normal, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position(position) + , normal(normal.normalized()) + { + } + virtual void describe(GoalContext& context) const; + virtual double evaluate(const GoalContext& context) const; +}; +#endif + +class AvoidJointLimitsGoal : public Goal +{ +public: + AvoidJointLimitsGoal(double weight = 1.0, bool secondary = true) + { + weight_ = weight; + secondary_ = secondary; + } + virtual double evaluate(const GoalContext& context) const + { + auto& info = context.getRobotInfo(); + double sum = 0.0; + for(size_t i = 0; i < context.getProblemVariableCount(); i++) + { + size_t ivar = context.getProblemVariableIndex(i); + if(info.getClipMax(ivar) == DBL_MAX) continue; + double d = context.getProblemVariablePosition(i) - (info.getMin(ivar) + info.getMax(ivar)) * 0.5; + d = fmax(0.0, fabs(d) * 2.0 - info.getSpan(ivar) * 0.5); + d *= context.getProblemVariableWeight(i); + sum += d * d; + } + return sum; + } +}; + +class CenterJointsGoal : public Goal +{ +public: + CenterJointsGoal(double weight = 1.0, bool secondary = true) + { + weight_ = weight; + secondary_ = secondary; + } + virtual double evaluate(const GoalContext& context) const + { + auto& info = context.getRobotInfo(); + double sum = 0.0; + for(size_t i = 0; i < context.getProblemVariableCount(); i++) + { + size_t ivar = context.getProblemVariableIndex(i); + if(info.getClipMax(ivar) == DBL_MAX) continue; + double d = context.getProblemVariablePosition(i) - (info.getMin(ivar) + info.getMax(ivar)) * 0.5; + d *= context.getProblemVariableWeight(i); + sum += d * d; + } + return sum; + } +}; + +class RegularizationGoal : public Goal +{ +public: + RegularizationGoal(double weight = 1.0) + { + weight_ = weight; + } + virtual double evaluate(const GoalContext &context) const + { + double sum = 0.0; + for (size_t i = 0; i < context.getProblemVariableCount(); i++) + { + double d = context.getProblemVariablePosition(i) - context.getProblemVariableInitialGuess(i); + sum += d * d; + } + return sum; + } +}; + +class MinimalDisplacementGoal : public Goal +{ +public: + MinimalDisplacementGoal(double weight = 1.0, bool secondary = true) + { + weight_ = weight; + secondary_ = secondary; + } + virtual double evaluate(const GoalContext& context) const + { + double sum = 0.0; + for(size_t i = 0; i < context.getProblemVariableCount(); i++) + { + double d = context.getProblemVariablePosition(i) - context.getProblemVariableInitialGuess(i); + d *= context.getProblemVariableWeight(i); + sum += d * d; + } + return sum; + } +}; + +class JointVariableGoal : public Goal +{ + std::string variable_name; + double variable_position; + +public: + JointVariableGoal() + : variable_position(0) + { + } + JointVariableGoal(const std::string& variable_name, double variable_position, double weight = 1.0, bool secondary = false) + : variable_name(variable_name) + , variable_position(variable_position) + { + weight_ = weight; + secondary_ = secondary; + } + double getVariablePosition() const { return variable_position; } + void setVariablePosition(double p) { variable_position = p; } + const std::string& getVariableName() const { return variable_name; } + void setVariableName(const std::string& n) { variable_name = n; } + virtual void describe(GoalContext& context) const + { + Goal::describe(context); + context.addVariable(variable_name); + } + virtual double evaluate(const GoalContext& context) const + { + double d = variable_position - context.getVariablePosition(); + return d * d; + } +}; + +class JointFunctionGoal : public Goal +{ + std::vector variable_names; + std::function&)> function; + +public: + JointFunctionGoal() {} + JointFunctionGoal(const std::vector& variable_names, const std::function&)>& function, double weight = 1.0, bool secondary = false) + : variable_names(variable_names) + , function(function) + { + weight_ = weight; + secondary_ = secondary; + } + void setJointVariableNames(const std::vector& n) { variable_names = n; } + void setJointVariableFunction(const std::function&)>& f) { function = f; } + virtual void describe(GoalContext& context) const + { + Goal::describe(context); + for(auto& variable_name : variable_names) + context.addVariable(variable_name); + } + virtual double evaluate(const GoalContext& context) const + { + auto& temp_vector = context.getTempVector(); + temp_vector.resize(variable_names.size()); + for(size_t i = 0; i < variable_names.size(); i++) + temp_vector[i] = context.getVariablePosition(i); + function(temp_vector); + double sum = 0.0; + for(size_t i = 0; i < variable_names.size(); i++) + { + double d = temp_vector[i] - context.getVariablePosition(i); + sum += d * d; + } + return sum; + } +}; + +class BalanceGoal : public Goal +{ + tf2::Vector3 target_, axis_; + struct BalanceInfo + { + tf2::Vector3 center; + double weight; + }; + mutable std::vector balance_infos; + +public: + BalanceGoal() + : target_(0, 0, 0) + , axis_(0, 0, 1) + { + } + BalanceGoal(const tf2::Vector3& target, double weight = 1.0) + : target_(target) + , axis_(0, 0, 1) + { + weight_ = weight; + } + const tf2::Vector3& getTarget() const { return target_; } + const tf2::Vector3& getAxis() const { return axis_; } + void setTarget(const tf2::Vector3& target) { target_ = target; } + void setAxis(const tf2::Vector3& axis) { axis_ = axis; } + virtual void describe(GoalContext& context) const; + virtual double evaluate(const GoalContext& context) const; +}; + +class LinkFunctionGoal : public LinkGoalBase +{ + std::function function; + +public: + LinkFunctionGoal() {} + LinkFunctionGoal(const std::string& link_name, const std::function& function, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , function(function) + { + } + void setLinkFunction(const std::function& f) { function = f; } + virtual double evaluate(const GoalContext& context) const { return function(context.getLinkFrame().getPosition(), context.getLinkFrame().getOrientation()); } +}; + +class SideGoal : public LinkGoalBase +{ + tf2::Vector3 axis; + tf2::Vector3 direction; + +public: + SideGoal() + : axis(0, 0, 1) + , direction(0, 0, 1) + { + } + SideGoal(const std::string& link_name, const tf2::Vector3& axis, const tf2::Vector3& direction, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , axis(axis) + , direction(direction) + { + } + const tf2::Vector3& getAxis() const { return axis; } + const tf2::Vector3& getDirection() const { return direction; } + void setAxis(const tf2::Vector3& a) { axis = a.normalized(); } + void setDirection(const tf2::Vector3& d) { direction = d.normalized(); } + virtual double evaluate(const GoalContext& context) const + { + auto& fb = context.getLinkFrame(); + Vector3 v; + quat_mul_vec(fb.getOrientation(), axis, v); + double f = fmax(0.0, v.dot(direction)); + return f * f; + } +}; + +class DirectionGoal : public LinkGoalBase +{ + tf2::Vector3 axis; + tf2::Vector3 direction; + +public: + DirectionGoal() + : axis(0, 0, 1) + , direction(0, 0, 1) + { + } + DirectionGoal(const std::string& link_name, const tf2::Vector3& axis, const tf2::Vector3& direction, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , axis(axis) + , direction(direction) + { + } + const tf2::Vector3& getAxis() const { return axis; } + const tf2::Vector3& getDirection() const { return direction; } + void setAxis(const tf2::Vector3& a) { axis = a.normalized(); } + void setDirection(const tf2::Vector3& d) { direction = d.normalized(); } + virtual double evaluate(const GoalContext& context) const + { + auto& fb = context.getLinkFrame(); + Vector3 v; + quat_mul_vec(fb.getOrientation(), axis, v); + return v.distance2(direction); + } +}; + +class ConeGoal : public LinkGoalBase +{ + tf2::Vector3 position; + double position_weight; + tf2::Vector3 axis; + tf2::Vector3 direction; + double angle; + +public: + const tf2::Vector3& getPosition() const { return position; } + double getPositionWeight() const { return position_weight; } + const tf2::Vector3& getAxis() const { return axis; } + const tf2::Vector3& getDirection() const { return direction; } + double getAngle() const { return angle; } + void setPosition(const tf2::Vector3& p) { position = p; } + void setPositionWeight(double w) { position_weight = w; } + void setAxis(const tf2::Vector3& a) { axis = a.normalized(); } + void setDirection(const tf2::Vector3& d) { direction = d.normalized(); } + void setAngle(double a) { angle = a; } + ConeGoal() + : position(0, 0, 0) + , position_weight(0) + , axis(0, 0, 1) + , direction(0, 0, 1) + , angle(0) + { + } + ConeGoal(const std::string& link_name, const tf2::Vector3& axis, const tf2::Vector3& direction, double angle, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position(0, 0, 0) + , position_weight(0) + , axis(axis) + , direction(direction) + , angle(angle) + { + } + ConeGoal(const std::string& link_name, const tf2::Vector3& position, const tf2::Vector3& axis, const tf2::Vector3& direction, double angle, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position(position) + , position_weight(1) + , axis(axis) + , direction(direction) + , angle(angle) + { + } + ConeGoal(const std::string& link_name, const tf2::Vector3& position, double position_weight, const tf2::Vector3& axis, const tf2::Vector3& direction, double angle, double weight = 1.0) + : LinkGoalBase(link_name, weight) + , position(position) + , position_weight(position_weight) + , axis(axis) + , direction(direction) + , angle(angle) + { + } + virtual double evaluate(const GoalContext& context) const + { + double sum = 0.0; + auto& fb = context.getLinkFrame(); + Vector3 v; + quat_mul_vec(fb.getOrientation(), axis, v); + double d = fmax(0.0, v.angle(direction) - angle); + sum += d * d; + double w = position_weight; + sum += w * w * (position - fb.getPosition()).length2(); + return sum; + } +}; + +class IKCostFnGoal : public Goal +{ + const geometry_msgs::msg::Pose pose_; + const kinematics::KinematicsBase::IKCostFn function_; + const moveit::core::RobotModelConstPtr robot_model_; +public: + IKCostFnGoal(const geometry_msgs::msg::Pose& pose, const kinematics::KinematicsBase::IKCostFn& function, + const moveit::core::RobotModelConstPtr& robot_model, double weight = 1.0) + : Goal() + , pose_(pose) + , function_(function) + , robot_model_(robot_model) + { + setWeight(weight); + } + double evaluate(const GoalContext& context) const override + { + auto info = context.getRobotInfo(); + moveit::core::RobotState robot_state(robot_model_); + auto jmg = context.getJointModelGroup(); + + std::vector seed_state(context.getProblemVariableCount()); + std::vector sol_positions(context.getProblemVariableCount()); + for (size_t i = 0; i < context.getProblemVariableCount(); ++i) + { + sol_positions[i] = context.getProblemVariablePosition(i); + // robot_state.setVariablePosition(i, context.getProblemVariablePosition(i)); + seed_state[i] = context.getProblemVariableInitialGuess(i); + } + robot_state.setJointGroupPositions(&jmg, sol_positions); + robot_state.update(); + return function_(pose_, robot_state, &jmg, seed_state); + } +}; +} diff --git a/src/lib/bio_ik/include/bio_ik/robot_info.hpp b/src/lib/bio_ik/include/bio_ik/robot_info.hpp new file mode 100644 index 000000000..473977b45 --- /dev/null +++ b/src/lib/bio_ik/include/bio_ik/robot_info.hpp @@ -0,0 +1,126 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include +#include +#include + +#include + +namespace bio_ik +{ + +class RobotInfo +{ + struct VariableInfo + { + double clip_min, clip_max; + double span; + double min; + double max; + double max_velocity, max_velocity_rcp; + }; + std::vector variables; + std::vector activeVariables; + std::vector variable_joint_types; + moveit::core::RobotModelConstPtr robot_model; + + __attribute__((always_inline)) static inline double clamp2(double v, double lo, double hi) + { + if(__builtin_expect(v < lo, 0)) v = lo; + if(__builtin_expect(v > hi, 0)) v = hi; + return v; + } + +public: + RobotInfo() {} + RobotInfo(moveit::core::RobotModelConstPtr model) + : robot_model(model) + { + for(auto& name : model->getVariableNames()) + { + auto& bounds = model->getVariableBounds(name); + + VariableInfo info; + + bool bounded = bounds.position_bounded_; + + auto* joint_model = model->getJointOfVariable(variables.size()); + if(auto* revolute = dynamic_cast(joint_model)) + + if(bounds.max_position_ - bounds.min_position_ >= 2 * M_PI * 0.9999) bounded = false; + + info.min = bounds.min_position_; + info.max = bounds.max_position_; + + info.clip_min = bounded ? info.min : -DBL_MAX; + info.clip_max = bounded ? info.max : +DBL_MAX; + + info.span = info.max - info.min; + + if(!(info.span >= 0 && info.span < FLT_MAX)) info.span = 1; + + info.max_velocity = bounds.max_velocity_; + info.max_velocity_rcp = info.max_velocity > 0.0 ? 1.0 / info.max_velocity : 0.0; + + variables.push_back(info); + } + + for(size_t ivar = 0; ivar < model->getVariableCount(); ivar++) + { + variable_joint_types.push_back(model->getJointOfVariable(ivar)->getType()); + } + } + +public: + __attribute__((always_inline)) inline double clip(double p, size_t i) const + { + auto& info = variables[i]; + return clamp2(p, info.clip_min, info.clip_max); + } + + inline double getSpan(size_t i) const { return variables[i].span; } + inline double getClipMin(size_t i) const { return variables[i].clip_min; } + inline double getClipMax(size_t i) const { return variables[i].clip_max; } + inline double getMin(size_t i) const { return variables[i].min; } + inline double getMax(size_t i) const { return variables[i].max; } + + inline bool isRevolute(size_t variable_index) const { return variable_joint_types[variable_index] == moveit::core::JointModel::REVOLUTE; } + inline bool isPrismatic(size_t variable_index) const { return variable_joint_types[variable_index] == moveit::core::JointModel::PRISMATIC; } + inline double getMaxVelocity(size_t i) const { return variables[i].max_velocity; } + inline double getMaxVelocityRcp(size_t i) const { return variables[i].max_velocity_rcp; } +}; +} diff --git a/src/lib/bio_ik/package.xml b/src/lib/bio_ik/package.xml new file mode 100644 index 000000000..13457490a --- /dev/null +++ b/src/lib/bio_ik/package.xml @@ -0,0 +1,34 @@ + + + + bio_ik + 2.0.0 + BioIK for ROS 2 + BSD + + Philipp Sebastian Ruppel + + Philipp Sebastian Ruppel + Michael Goerner + + + ament_cmake_ros + + moveit_core + pluginlib + eigen + moveit_ros_planning + rclcpp + tf2 + tf2_eigen + tf2_kdl + tf2_geometry_msgs + + ament_cmake_gtest + + + ament_cmake + + + + diff --git a/src/lib/bio_ik/src/forward_kinematics.hpp b/src/lib/bio_ik/src/forward_kinematics.hpp new file mode 100644 index 000000000..26d742ccb --- /dev/null +++ b/src/lib/bio_ik/src/forward_kinematics.hpp @@ -0,0 +1,1504 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include "utils.hpp" +#include +#include +#include +#include + +#if defined(__x86_64__) || defined(__i386__) + +#include +#include +#include + +#if(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) +#define FUNCTION_MULTIVERSIONING 1 +#else +#define FUNCTION_MULTIVERSIONING 0 +#endif + +#else + +#define FUNCTION_MULTIVERSIONING 0 + +#endif + +namespace bio_ik +{ + +// computes and caches local joint frames +class RobotJointEvaluator +{ +private: + std::vector joint_cache_variables; + std::vector joint_cache_frames; + std::vector link_frames; + +protected: + std::vector joint_axis_list; + moveit::core::RobotModelConstPtr robot_model; + std::vector variables; + +public: + inline void getJointFrame(const moveit::core::JointModel* joint_model, const double* variables, Frame& frame) + { + auto joint_type = joint_model->getType(); + if(joint_type == moveit::core::JointModel::FIXED) + { + frame = Frame::identity(); + return; + } + size_t joint_index = joint_model->getJointIndex(); + switch(joint_type) + { + case moveit::core::JointModel::REVOLUTE: + { + auto axis = joint_axis_list[joint_index]; + + auto v = variables[joint_model->getFirstVariableIndex()]; + + /*v *= 1.0 / (2 * M_PI); + v -= std::floor(v); + v *= (2 * M_PI);*/ + + auto half_angle = v * 0.5; + + // TODO: optimize sin cos + + auto fcos = cos(half_angle); + auto fsin = sin(half_angle); + + // auto fsin = half_angle; + // auto fcos = 1.0 - half_angle * half_angle * 0.5; + + frame = Frame(Vector3(0.0, 0.0, 0.0), Quaternion(axis.x() * fsin, axis.y() * fsin, axis.z() * fsin, fcos)); + + break; + } + case moveit::core::JointModel::PRISMATIC: + { + auto axis = joint_axis_list[joint_index]; + auto v = variables[joint_model->getFirstVariableIndex()]; + frame = Frame(axis * v, Quaternion(0.0, 0.0, 0.0, 1.0)); + break; + } + case moveit::core::JointModel::FLOATING: + { + auto* vv = variables + joint_model->getFirstVariableIndex(); + frame.pos = Vector3(vv[0], vv[1], vv[2]); + frame.rot = Quaternion(vv[3], vv[4], vv[5], vv[6]).normalized(); + // LOG("floating", joint_model->getFirstVariableIndex(), vv[0], vv[1], vv[2], vv[3], vv[4], vv[5], vv[6]); + break; + } + default: + { + auto* joint_variables = variables + joint_model->getFirstVariableIndex(); + Eigen::Isometry3d joint_transform; + joint_model->computeTransform(joint_variables, joint_transform); + frame = Frame(joint_transform); + break; + } + } + + // LOG("local joint frame", joint_model->getType(), joint_model->getName(), frame); + } + inline void getJointFrame(const moveit::core::JointModel* joint_model, const std::vector& variables, Frame& frame) { getJointFrame(joint_model, variables.data(), frame); } + +protected: + inline const Frame& getLinkFrame(const moveit::core::LinkModel* link_model) { return link_frames[link_model->getLinkIndex()]; } + + inline bool checkJointMoved(const moveit::core::JointModel* joint_model) + { + size_t i0 = joint_model->getFirstVariableIndex(); + size_t cnt = joint_model->getVariableCount(); + if(cnt == 0) return true; + if(cnt == 1) return !(variables[i0] == joint_cache_variables[i0]); + for(size_t i = i0; i < i0 + cnt; i++) + if(!(variables[i] == joint_cache_variables[i])) return true; + return false; + } + inline void putJointCache(const moveit::core::JointModel* joint_model, const Frame& frame) + { + joint_cache_frames[joint_model->getJointIndex()] = frame; + size_t i0 = joint_model->getFirstVariableIndex(); + size_t cnt = joint_model->getVariableCount(); + for(size_t i = i0; i < i0 + cnt; i++) + joint_cache_variables[i] = variables[i]; + } + inline const Frame& getJointFrame(const moveit::core::JointModel* joint_model) + { + size_t joint_index = joint_model->getJointIndex(); + + if(!checkJointMoved(joint_model)) return joint_cache_frames[joint_index]; + + getJointFrame(joint_model, variables, joint_cache_frames[joint_index]); + + size_t cnt = joint_model->getVariableCount(); + if(cnt) + { + size_t i0 = joint_model->getFirstVariableIndex(); + if(cnt == 1) + joint_cache_variables[i0] = variables[i0]; + else + for(size_t i = i0; i < i0 + cnt; i++) + joint_cache_variables[i] = variables[i]; + } + + // TODO: optimize copy + + /*size_t cnt = joint_model->getVariableCount(); + size_t i0 = joint_model->getFirstVariableIndex(); + memcpy(joint_cache_variables.data() + i0, variables.data() + i0, cnt * 8);*/ + + return joint_cache_frames[joint_index]; + } + +public: + RobotJointEvaluator(moveit::core::RobotModelConstPtr model) + : robot_model(model) + { + joint_cache_variables.clear(); + joint_cache_variables.resize(model->getVariableCount(), DBL_MAX); + + joint_cache_frames.clear(); + joint_cache_frames.resize(model->getJointModelCount()); + + link_frames.clear(); + for(auto* link_model : model->getLinkModels()) + link_frames.push_back(Frame(link_model->getJointOriginTransform())); + + joint_axis_list.clear(); + joint_axis_list.resize(robot_model->getJointModelCount()); + for(size_t i = 0; i < joint_axis_list.size(); i++) + { + auto* joint_model = robot_model->getJointModel(i); + if(auto* j = dynamic_cast(joint_model)) joint_axis_list[i] = Vector3(j->getAxis().x(), j->getAxis().y(), j->getAxis().z()); + if(auto* j = dynamic_cast(joint_model)) joint_axis_list[i] = Vector3(j->getAxis().x(), j->getAxis().y(), j->getAxis().z()); + } + } +}; + +// fast tree fk +class RobotFK_Fast_Base : protected RobotJointEvaluator +{ +protected: + std::vector tip_names; + std::vector tip_frames; + std::vector tip_links; + std::vector link_schedule; + std::vector global_frames; + std::vector> link_chains; + std::vector active_variables; + std::vector> variable_to_link_map; + std::vector variable_to_link_map_2; + std::vector> variable_to_link_chain_map; + inline void updateMimic(std::vector& values) + { + for(auto* joint : robot_model->getMimicJointModels()) + { + auto src = joint->getMimic()->getFirstVariableIndex(); + auto dest = joint->getFirstVariableIndex(); + + // TODO: more dimensions ??? + values[dest] = values[src] * joint->getMimicFactor() + joint->getMimicOffset(); + + // moveit doesn't seem to support multiple mimic dimensions either... ??? + + // TODO: ok??? + // for(size_t base = 0; base < joint->getVariableCount(); base++) + // values[base + dest] = values[base + src] * joint->getMimicFactor() + joint->getMimicOffset(); + } + } + +public: + RobotFK_Fast_Base(moveit::core::RobotModelConstPtr model) + : RobotJointEvaluator(model) + { + } + void initialize(const std::vector& tip_link_indices) + { + + tip_names.resize(tip_link_indices.size()); + for(size_t i = 0; i < tip_link_indices.size(); i++) + tip_names[i] = robot_model->getLinkModelNames()[tip_link_indices[i]]; + + tip_frames.resize(tip_names.size()); + + tip_links.clear(); + for(const auto& n : tip_names) + tip_links.push_back(robot_model->getLinkModel(n)); + + global_frames.resize(robot_model->getLinkModelCount()); + + link_chains.clear(); + link_schedule.clear(); + for(auto* tip_link : tip_links) + { + std::vector chain; + for(auto* link = tip_link; link; link = link->getParentLinkModel()) + chain.push_back(link); + reverse(chain.begin(), chain.end()); + link_chains.push_back(chain); + for(auto* link : chain) + { + if(find(link_schedule.begin(), link_schedule.end(), link) != link_schedule.end()) continue; + link_schedule.push_back(link); + } + } + + active_variables.clear(); + variable_to_link_map.clear(); + for(auto* link_model : link_schedule) + { + auto link_index = link_model->getLinkIndex(); + auto* joint_model = link_model->getParentJointModel(); + size_t vstart = joint_model->getFirstVariableIndex(); + size_t vcount = joint_model->getVariableCount(); + for(size_t vi = vstart; vi < vstart + vcount; vi++) + { + variable_to_link_map.push_back(std::make_pair(vi, link_index)); + + if(find(active_variables.begin(), active_variables.end(), vi) != active_variables.end()) continue; + active_variables.push_back(vi); + } + } + + variable_to_link_map_2.resize(robot_model->getVariableCount()); + for(auto* link_model : link_schedule) + { + auto link_index = link_model->getLinkIndex(); + auto* joint_model = link_model->getParentJointModel(); + size_t vstart = joint_model->getFirstVariableIndex(); + size_t vcount = joint_model->getVariableCount(); + for(size_t vi = vstart; vi < vstart + vcount; vi++) + { + variable_to_link_map_2[vi] = link_index; + } + } + + variable_to_link_chain_map.resize(robot_model->getVariableCount()); + for(size_t chain_index = 0; chain_index < link_chains.size(); chain_index++) + { + auto& link_chain = link_chains[chain_index]; + for(size_t ipos = 0; ipos < link_chain.size(); ipos++) + { + auto* link_model = link_chain[ipos]; + auto* joint_model = link_model->getParentJointModel(); + size_t vstart = joint_model->getFirstVariableIndex(); + size_t vcount = joint_model->getVariableCount(); + for(size_t vi = vstart; vi < vstart + vcount; vi++) + { + variable_to_link_chain_map[vi] = std::make_pair(chain_index, ipos); + } + } + } + } + void applyConfiguration(const std::vector& jj0) + { + FNPROFILER(); + variables = jj0; + updateMimic(variables); + for(auto* link_model : link_schedule) + { + auto* joint_model = link_model->getParentJointModel(); + auto* parent_link_model = joint_model->getParentLinkModel(); + if(parent_link_model) + { + concat(global_frames[parent_link_model->getLinkIndex()], getLinkFrame(link_model), getJointFrame(joint_model), global_frames[link_model->getLinkIndex()]); + } + else + { + concat(getLinkFrame(link_model), getJointFrame(joint_model), global_frames[link_model->getLinkIndex()]); + } + // if(linkModel->getParentLinkModel() && linkModel->getParentLinkModel()->getLinkIndex() > linkModel->getLinkIndex()) { LOG("wrong link order"); throw runtime_error("wrong link order"); } + } + for(size_t itip = 0; itip < tip_links.size(); itip++) + { + tip_frames[itip] = global_frames[tip_links[itip]->getLinkIndex()]; + } + } + inline const Frame& getTipFrame(size_t fi) const { return tip_frames[fi]; } + inline const std::vector& getTipFrames() const { return tip_frames; } + inline void incrementalBegin(const std::vector& jj) { applyConfiguration(jj); } + inline void incrementalEnd() {} + inline const Frame& getJointVariableFrame(size_t variable_index) { return global_frames[variable_to_link_map_2[variable_index]]; } +}; + +// incremental tip frame updates without full recomputation +class RobotFK_Fast : public RobotFK_Fast_Base +{ +protected: + std::vector> chain_cache; + std::vector vars, variables0; + std::vector test_tips; + std::vector links_changed; + bool use_incremental; + bool last_use_incremental; + void updateIncremental(const std::vector& vars0) + { + FNPROFILER(); + + // PROFILER_COUNTER("incremental update count"); + + // init variable lists + vars = vars0; + updateMimic(vars); + for(auto& vi : active_variables) + { + // vars[vi] = vars0[vi]; + variables0[vi] = variables[vi]; + } + + // find moved links + for(auto* link_model : link_schedule) + links_changed[link_model->getLinkIndex()] = false; + for(auto& x : variable_to_link_map) + { + auto variable_index = x.first; + auto link_index = x.second; + if(vars[variable_index] != variables[variable_index]) links_changed[link_index] = true; + } + + // update + for(size_t ichain = 0; ichain < link_chains.size(); ichain++) + { + auto& link_chain = link_chains[ichain]; + auto& cache_chain = chain_cache[ichain]; + + size_t iposmax = 0; + for(size_t ipos = 0; ipos < link_chain.size(); ipos++) + { + auto* link_model = link_chain[ipos]; + bool changed = links_changed[link_model->getLinkIndex()]; + if(changed) iposmax = ipos; + } + + for(size_t ipos = 0; ipos <= iposmax; ipos++) + { + auto* link_model = link_chain[ipos]; + auto* joint_model = link_model->getParentJointModel(); + + bool changed = links_changed[link_model->getLinkIndex()]; + + if(cache_chain.size() <= ipos || changed) + { + Frame before, after; + + if(ipos < cache_chain.size()) + { + before = cache_chain[ipos]; + } + else + { + if(ipos > 0) + { + concat(cache_chain[ipos - 1], getLinkFrame(link_model), getJointFrame(joint_model), before); + } + else + { + concat(getLinkFrame(link_model), getJointFrame(joint_model), before); + } + } + + chain_cache[ichain].resize(ipos + 1, Frame::identity()); + + if(changed) + { + if(ichain > 0 && ipos < link_chains[ichain - 1].size() && link_chains[ichain][ipos] == link_chains[ichain - 1][ipos]) + { + after = chain_cache[ichain - 1][ipos]; + } + else + { + size_t vstart = joint_model->getFirstVariableIndex(); + size_t vcount = joint_model->getVariableCount(); + + if(vcount == 1) + variables[vstart] = vars[vstart]; + else + for(size_t vi = vstart; vi < vstart + vcount; vi++) + variables[vi] = vars[vi]; + + if(ipos > 0) + { + concat(cache_chain[ipos - 1], getLinkFrame(link_model), getJointFrame(joint_model), after); + } + else + { + concat(getLinkFrame(link_model), getJointFrame(joint_model), after); + } + + if(vcount == 1) + variables[vstart] = variables0[vstart]; + else + for(size_t vi = vstart; vi < vstart + vcount; vi++) + variables[vi] = variables0[vi]; + + // PROFILER_COUNTER("incremental update transforms"); + } + chain_cache[ichain][ipos] = after; + + // tipFrames[ichain] = inverse(before) * tipFrames[ichain]; + // tipFrames[ichain] = after * tipFrames[ichain]; + + /*Frame before_inverse; + invert(before, before_inverse); + + //tipFrames[ichain] = after * before_inverse * tipFrames[ichain]; + { + concat(after, before_inverse, tip_frames[ichain], tip_frames[ichain]); + }*/ + + change(after, before, tip_frames[ichain], tip_frames[ichain]); + } + else + { + after = before; + chain_cache[ichain][ipos] = after; + } + } + } + } + + // set new vars + // variables = vars; + for(auto& vi : active_variables) + variables[vi] = vars[vi]; + + // test + if(0) + { + test_tips = tip_frames; + RobotFK_Fast_Base::applyConfiguration(vars); + for(size_t i = 0; i < tip_frames.size(); i++) + { + auto dist = tip_frames[i].pos.distance(test_tips[i].pos); + LOG_VAR(dist); + if(dist > 0.001) + { + LOG(tip_frames[i].pos.x(), tip_frames[i].pos.y(), tip_frames[i].pos.z()); + LOG(test_tips[i].pos.x(), test_tips[i].pos.y(), test_tips[i].pos.z()); + ERROR("incremental update error"); + } + } + } + } + +public: + RobotFK_Fast(moveit::core::RobotModelConstPtr model) + : RobotFK_Fast_Base(model) + , use_incremental(false) + { + } + inline void incrementalBegin(const std::vector& jj) + { + applyConfiguration(jj); + chain_cache.clear(); + chain_cache.resize(tip_frames.size()); + links_changed.resize(robot_model->getLinkModelCount()); + vars.resize(jj.size()); + variables0.resize(jj.size()); + use_incremental = true; + } + inline void incrementalEnd() + { + use_incremental = false; + // applyConfiguration(variables); + } + inline void applyConfiguration(const std::vector& jj) + { + if(use_incremental) + updateIncremental(jj); + else + RobotFK_Fast_Base::applyConfiguration(jj); + } +}; + +// fast tree fk jacobian +class RobotFK_Jacobian : public RobotFK_Fast +{ + typedef RobotFK_Fast Base; + +protected: + std::vector> joint_dependencies; + std::vector tip_dependencies; + +public: + RobotFK_Jacobian(moveit::core::RobotModelConstPtr model) + : RobotFK_Fast(model) + { + } + void initialize(const std::vector& tip_link_indices) + { + Base::initialize(tip_link_indices); + auto tip_count = tip_names.size(); + joint_dependencies.resize(robot_model->getJointModelCount()); + for(auto& x : joint_dependencies) + x.clear(); + for(auto* link_model : link_schedule) + { + auto* joint_model = link_model->getParentJointModel(); + joint_dependencies[joint_model->getJointIndex()].push_back(joint_model); + } + for(auto* link_model : link_schedule) + { + auto* joint_model = link_model->getParentJointModel(); + if(auto* mimic = joint_model->getMimic()) + { + while(mimic->getMimic() && mimic->getMimic() != joint_model) + mimic = mimic->getMimic(); + joint_dependencies[mimic->getJointIndex()].push_back(joint_model); + } + } + tip_dependencies.resize(robot_model->getJointModelCount() * tip_count); + for(auto& x : tip_dependencies) + x = 0; + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + { + for(auto* link_model = tip_links[tip_index]; link_model; link_model = link_model->getParentLinkModel()) + { + auto* joint_model = link_model->getParentJointModel(); + tip_dependencies[joint_model->getJointIndex() * tip_count + tip_index] = 1; + } + } + } + void computeJacobian(const std::vector& variable_indices, Eigen::MatrixXd& jacobian) + { + double step_size = 0.00001; + double half_step_size = step_size * 0.5; + double inv_step_size = 1.0 / step_size; + auto tip_count = tip_frames.size(); + jacobian.resize(tip_count * 6, variable_indices.size()); + for(size_t icol = 0; icol < variable_indices.size(); icol++) + { + for(size_t itip = 0; itip < tip_count; itip++) + { + jacobian(itip * 6 + 0, icol) = 0; + jacobian(itip * 6 + 1, icol) = 0; + jacobian(itip * 6 + 2, icol) = 0; + jacobian(itip * 6 + 3, icol) = 0; + jacobian(itip * 6 + 4, icol) = 0; + jacobian(itip * 6 + 5, icol) = 0; + } + } + for(size_t icol = 0; icol < variable_indices.size(); icol++) + { + auto ivar = variable_indices[icol]; + auto* var_joint_model = robot_model->getJointOfVariable(ivar); + if(var_joint_model->getMimic()) continue; + for(auto* joint_model : joint_dependencies[var_joint_model->getJointIndex()]) + { + double scale = 1; + for(auto* m = joint_model; m->getMimic() && m->getMimic() != joint_model; m = m->getMimic()) + { + scale *= m->getMimicFactor(); + } + auto* link_model = joint_model->getChildLinkModel(); + switch(joint_model->getType()) + { + case moveit::core::JointModel::FIXED: + { + // fixed joint: zero gradient (do nothing) + continue; + } + case moveit::core::JointModel::REVOLUTE: + { + auto& link_frame = global_frames[link_model->getLinkIndex()]; + for(size_t itip = 0; itip < tip_count; itip++) + { + if(!tip_dependencies[joint_model->getJointIndex() * tip_count + itip]) continue; + + auto& tip_frame = tip_frames[itip]; + + auto q = link_frame.rot.inverse() * tip_frame.rot; + q = q.inverse(); + + auto rot = joint_axis_list[joint_model->getJointIndex()]; + quat_mul_vec(q, rot, rot); + + auto vel = link_frame.pos - tip_frame.pos; + quat_mul_vec(tip_frame.rot.inverse(), vel, vel); + + vel = vel.cross(rot); + + jacobian(itip * 6 + 0, icol) += vel.x() * scale; + jacobian(itip * 6 + 1, icol) += vel.y() * scale; + jacobian(itip * 6 + 2, icol) += vel.z() * scale; + + jacobian(itip * 6 + 3, icol) += rot.x() * scale; + jacobian(itip * 6 + 4, icol) += rot.y() * scale; + jacobian(itip * 6 + 5, icol) += rot.z() * scale; + + // LOG("a", vel.x(), vel.y(), vel.z(), rot.x(), rot.y(), rot.z()); + } + continue; + } + case moveit::core::JointModel::PRISMATIC: + { + auto& link_frame = global_frames[link_model->getLinkIndex()]; + for(size_t itip = 0; itip < tip_count; itip++) + { + if(!tip_dependencies[joint_model->getJointIndex() * tip_count + itip]) continue; + + auto& tip_frame = tip_frames[itip]; + + auto q = link_frame.rot.inverse() * tip_frame.rot; + q = q.inverse(); + + auto axis = joint_axis_list[joint_model->getJointIndex()]; + auto v = axis; + quat_mul_vec(q, axis, v); + + jacobian(itip * 6 + 0, icol) += v.x() * scale; + jacobian(itip * 6 + 1, icol) += v.y() * scale; + jacobian(itip * 6 + 2, icol) += v.z() * scale; + + // LOG("a", v.x(), v.y(), v.z(), 0, 0, 0); + } + continue; + } + default: + { + // numeric differentiation for joint types that are not yet implemented / or joint types that might be added to moveit in the future + auto ivar2 = ivar; + if(joint_model->getMimic()) ivar2 = ivar2 - var_joint_model->getFirstVariableIndex() + joint_model->getFirstVariableIndex(); + auto& link_frame_1 = global_frames[link_model->getLinkIndex()]; + auto v0 = variables[ivar2]; + // auto joint_frame_1 = getJointFrame(joint_model); + variables[ivar2] = v0 + step_size; + auto joint_frame_2 = getJointFrame(joint_model); + variables[ivar2] = v0; + Frame link_frame_2; + if(auto* parent_link_model = joint_model->getParentLinkModel()) + concat(global_frames[parent_link_model->getLinkIndex()], getLinkFrame(link_model), joint_frame_2, link_frame_2); + else + concat(getLinkFrame(link_model), joint_frame_2, link_frame_2); + for(size_t itip = 0; itip < tip_count; itip++) + { + if(!tip_dependencies[joint_model->getJointIndex() * tip_count + itip]) continue; + auto tip_frame_1 = tip_frames[itip]; + Frame tip_frame_2; + change(link_frame_2, link_frame_1, tip_frame_1, tip_frame_2); + auto twist = frameTwist(tip_frame_1, tip_frame_2); + jacobian(itip * 6 + 0, icol) += twist.vel.x() * inv_step_size * scale; + jacobian(itip * 6 + 1, icol) += twist.vel.y() * inv_step_size * scale; + jacobian(itip * 6 + 2, icol) += twist.vel.z() * inv_step_size * scale; + jacobian(itip * 6 + 3, icol) += twist.rot.x() * inv_step_size * scale; + jacobian(itip * 6 + 4, icol) += twist.rot.y() * inv_step_size * scale; + jacobian(itip * 6 + 5, icol) += twist.rot.z() * inv_step_size * scale; + } + continue; + } + } + } + } + } +}; + +#if 0 + +struct RobotFK : public RobotFK_Jacobian +{ + std::vector mutation_variable_indices; + std::vector mutation_initial_variable_positions; + std::vector mutation_temp; + RobotFK(moveit::core::RobotModelConstPtr model) + : RobotFK_Jacobian(model) + { + } + void initializeMutationApproximator(const std::vector& variable_indices) + { + mutation_variable_indices = variable_indices; + mutation_initial_variable_positions = variables; + } + void computeApproximateMutation1(size_t variable_index, double variable_delta, const aligned_vector& input, aligned_vector& output) + { + mutation_temp = mutation_initial_variable_positions; + mutation_temp[variable_index] += variable_delta; + applyConfiguration(mutation_temp); + output.clear(); + for(auto& f : tip_frames) output.push_back(f); + } + void computeApproximateMutations(size_t mutation_count, const double* const* mutation_values, std::vector>& tip_frame_mutations) + { + auto tip_count = tip_names.size(); + tip_frame_mutations.resize(mutation_count); + for(auto& m : tip_frame_mutations) + m.resize(tip_count); + for(size_t mutation_index = 0; mutation_index < mutation_count; mutation_index++) + { + mutation_temp = mutation_initial_variable_positions; + for(size_t i = 0; i < mutation_variable_indices.size(); i++) + { + mutation_temp[mutation_variable_indices[i]] = mutation_values[mutation_index][i]; + } + applyConfiguration(mutation_temp); + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + { + tip_frame_mutations[mutation_index][tip_index] = tip_frames[tip_index]; + } + } + } +}; + +#else + +#define USE_QUADRATIC_EXTRAPOLATION 0 + +class RobotFK_Mutator : public RobotFK_Jacobian +{ + typedef RobotFK_Jacobian Base; + Eigen::MatrixXd mutation_approx_jacobian; + std::vector> mutation_approx_frames; +#if USE_QUADRATIC_EXTRAPOLATION + std::vector> mutation_approx_quadratics; +#endif + std::vector mutation_approx_variable_indices; + std::vector> mutation_approx_mask; + std::vector> mutation_approx_map; + aligned_vector tip_frames_aligned; + +public: + RobotFK_Mutator(moveit::core::RobotModelConstPtr model) + : RobotFK_Jacobian(model) + { + } + + void initializeMutationApproximator(const std::vector& variable_indices) + { + FNPROFILER(); + + mutation_approx_variable_indices = variable_indices; + + auto tip_count = tip_names.size(); + + tip_frames_aligned.resize(tip_frames.size()); + for(size_t i = 0; i < tip_frames.size(); i++) + tip_frames_aligned[i] = tip_frames[i]; + + // init first order approximators + { + if(mutation_approx_frames.size() < tip_count) mutation_approx_frames.resize(tip_count); + + for(size_t itip = 0; itip < tip_count; itip++) + mutation_approx_frames[itip].resize(robot_model->getVariableCount()); + + for(size_t itip = 0; itip < tip_count; itip++) + for(auto ivar : variable_indices) + mutation_approx_frames[itip][ivar] = Frame::identity(); + + computeJacobian(variable_indices, mutation_approx_jacobian); + + for(size_t icol = 0; icol < variable_indices.size(); icol++) + { + size_t ivar = variable_indices[icol]; + for(size_t itip = 0; itip < tip_count; itip++) + { + { + Vector3 t; + t.setX(mutation_approx_jacobian(itip * 6 + 0, icol)); + t.setY(mutation_approx_jacobian(itip * 6 + 1, icol)); + t.setZ(mutation_approx_jacobian(itip * 6 + 2, icol)); + quat_mul_vec(tip_frames[itip].rot, t, t); + mutation_approx_frames[itip][ivar].pos = t; + } + + { + Quaternion q; + q.setX(mutation_approx_jacobian(itip * 6 + 3, icol) * 0.5); + q.setY(mutation_approx_jacobian(itip * 6 + 4, icol) * 0.5); + q.setZ(mutation_approx_jacobian(itip * 6 + 5, icol) * 0.5); + q.setW(1.0); + quat_mul_quat(tip_frames[itip].rot, q, q); + q -= tip_frames[itip].rot; + mutation_approx_frames[itip][ivar].rot = q; + } + } + } + } + +// init second order approximators +#if USE_QUADRATIC_EXTRAPOLATION + { + if(mutation_approx_quadratics.size() < tip_count) mutation_approx_quadratics.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + mutation_approx_quadratics[itip].resize(robot_model->getVariableCount()); + for(size_t itip = 0; itip < tip_count; itip++) + for(auto ivar : variable_indices) + mutation_approx_quadratics[itip][ivar].pos = Vector3(0, 0, 0); + for(auto ivar : variable_indices) + { + auto* var_joint_model = robot_model->getJointOfVariable(ivar); + if(var_joint_model->getMimic()) continue; + for(auto* joint_model : joint_dependencies[var_joint_model->getJointIndex()]) + { + double scale = 1; + for(auto* m = joint_model; m->getMimic() && m->getMimic() != joint_model; m = m->getMimic()) + { + scale *= m->getMimicFactor(); + } + auto* link_model = joint_model->getChildLinkModel(); + switch(joint_model->getType()) + { + case moveit::core::JointModel::REVOLUTE: + { + auto& link_frame = global_frames[link_model->getLinkIndex()]; + for(size_t itip = 0; itip < tip_count; itip++) + { + if(!tip_dependencies[joint_model->getJointIndex() * tip_count + itip]) continue; + + auto& tip_frame = tip_frames[itip]; + + auto axis = joint_axis_list[joint_model->getJointIndex()]; + quat_mul_vec(link_frame.rot, axis, axis); + + auto v = link_frame.pos - tip_frame.pos; + v -= axis * v.dot(axis); + + mutation_approx_quadratics[itip][ivar].pos = v * 0.5 * (scale * scale); + } + continue; + } + default: + { + continue; + } + } + } + } + } +#endif + + // init mask + if(mutation_approx_mask.size() < tip_count) mutation_approx_mask.resize(tip_count); + if(mutation_approx_map.size() < tip_count) mutation_approx_map.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + if(mutation_approx_mask[itip].size() < robot_model->getVariableCount()) mutation_approx_mask[itip].resize(robot_model->getVariableCount()); + mutation_approx_map[itip].clear(); + for(size_t ii = 0; ii < variable_indices.size(); ii++) + // for(size_t ivar : variable_indices) + { + auto ivar = variable_indices[ii]; + auto& frame = mutation_approx_frames[itip][ivar]; + bool b = false; + b |= (frame.pos.x() != 0.0); + b |= (frame.pos.y() != 0.0); + b |= (frame.pos.z() != 0.0); + b |= (frame.rot.x() != 0.0); + b |= (frame.rot.y() != 0.0); + b |= (frame.rot.z() != 0.0); + mutation_approx_mask[itip][ivar] = b; + if(b) mutation_approx_map[itip].push_back(ii); + } + } + } + +#if FUNCTION_MULTIVERSIONING + __attribute__((hot)) __attribute__((noinline)) __attribute__((target("fma", "avx"))) void computeApproximateMutation1(size_t variable_index, double variable_delta, const aligned_vector& input, aligned_vector& output) const + { + // BLOCKPROFILER("computeApproximateMutations C"); + auto tip_count = tip_names.size(); + output.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + if(mutation_approx_mask[itip][variable_index] == 0) continue; + auto& joint_delta = mutation_approx_frames[itip][variable_index]; + const Frame& tip_frame = input[itip]; + const double* tip_frame_ptr = (const double*)&tip_frame; + __m256d p = _mm256_load_pd(tip_frame_ptr + 0); + __m256d r = _mm256_load_pd(tip_frame_ptr + 4); + { + auto joint_delta_ptr = (const double* __restrict__) & (joint_delta); + __m256d ff = _mm256_set1_pd(variable_delta); + p = _mm256_fmadd_pd(ff, _mm256_load_pd(joint_delta_ptr + 0), p); + r = _mm256_fmadd_pd(ff, _mm256_load_pd(joint_delta_ptr + 4), r); + } +#if USE_QUADRATIC_EXTRAPOLATION + { + auto joint_delta_ptr = (const double* __restrict__) & (mutation_approx_quadratics[itip][variable_index]); + __m256d ff = _mm256_set1_pd(variable_delta * variable_delta); + p = _mm256_fmadd_pd(ff, _mm256_load_pd(joint_delta_ptr + 0), p); + } +#endif + auto& tip_mutation = output[itip]; + double* __restrict__ tip_mutation_ptr = (double*)&tip_mutation; + _mm256_store_pd(tip_mutation_ptr + 0, p); + _mm256_store_pd(tip_mutation_ptr + 4, r); + } + } + + __attribute__((hot)) __attribute__((noinline)) __attribute__((target("sse2"))) void computeApproximateMutation1(size_t variable_index, double variable_delta, const aligned_vector& input, aligned_vector& output) const + { + // BLOCKPROFILER("computeApproximateMutations C"); + auto tip_count = tip_names.size(); + output.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + if(mutation_approx_mask[itip][variable_index] == 0) continue; + auto& joint_delta = mutation_approx_frames[itip][variable_index]; + const Frame& tip_frame = input[itip]; + const double* tip_frame_ptr = (const double*)&tip_frame; + __m128d pxy = _mm_load_pd(tip_frame_ptr + 0); + __m128d pzw = _mm_load_sd(tip_frame_ptr + 2); + __m128d rxy = _mm_load_pd(tip_frame_ptr + 4); + __m128d rzw = _mm_load_pd(tip_frame_ptr + 6); + { + auto joint_delta_ptr = (const double* __restrict__) & (joint_delta); + __m128d ff = _mm_set1_pd(variable_delta); + pxy = _mm_add_pd(pxy, _mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 0))); + pzw = _mm_add_sd(pzw, _mm_mul_sd(ff, _mm_load_sd(joint_delta_ptr + 2))); + rxy = _mm_add_pd(rxy, _mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 4))); + rzw = _mm_add_pd(rzw, _mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 6))); + } +#if USE_QUADRATIC_EXTRAPOLATION + { + auto joint_delta_ptr = (const double* __restrict__) & (mutation_approx_quadratics[itip][variable_index]); + __m128d ff = _mm_set1_pd(variable_delta * variable_delta); + pxy = _mm_add_pd(pxy, _mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 0))); + pzw = _mm_add_sd(pzw, _mm_mul_sd(ff, _mm_load_sd(joint_delta_ptr + 2))); + } +#endif + auto& tip_mutation = output[itip]; + double* __restrict__ tip_mutation_ptr = (double*)&tip_mutation; + _mm_store_pd(tip_mutation_ptr + 0, pxy); + _mm_store_sd(tip_mutation_ptr + 2, pzw); + _mm_store_pd(tip_mutation_ptr + 4, rxy); + _mm_store_pd(tip_mutation_ptr + 6, rzw); + } + } + + __attribute__((hot)) __attribute__((noinline)) __attribute__((target("default"))) +#endif + void + computeApproximateMutation1(size_t variable_index, double variable_delta, const aligned_vector& input, aligned_vector& output) const + { + // BLOCKPROFILER("computeApproximateMutations C"); + auto tip_count = tip_names.size(); + output.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + if(mutation_approx_mask[itip][variable_index] == 0) continue; + + auto& joint_delta = mutation_approx_frames[itip][variable_index]; + + const Frame& tip_frame = input[itip]; + + double px = tip_frame.pos.x(); + double py = tip_frame.pos.y(); + double pz = tip_frame.pos.z(); + + double rx = tip_frame.rot.x(); + double ry = tip_frame.rot.y(); + double rz = tip_frame.rot.z(); + double rw = tip_frame.rot.w(); + + px += joint_delta.pos.x() * variable_delta; + py += joint_delta.pos.y() * variable_delta; + pz += joint_delta.pos.z() * variable_delta; + +#if USE_QUADRATIC_EXTRAPOLATION + double variable_delta_sq = variable_delta * variable_delta; + px += mutation_approx_quadratics[itip][variable_index].pos.x() * variable_delta_sq; + py += mutation_approx_quadratics[itip][variable_index].pos.y() * variable_delta_sq; + pz += mutation_approx_quadratics[itip][variable_index].pos.z() * variable_delta_sq; +#endif + + rx += joint_delta.rot.x() * variable_delta; + ry += joint_delta.rot.y() * variable_delta; + rz += joint_delta.rot.z() * variable_delta; + rw += joint_delta.rot.w() * variable_delta; + + auto& tip_mutation = output[itip]; + + tip_mutation.pos.setX(px); + tip_mutation.pos.setY(py); + tip_mutation.pos.setZ(pz); + + tip_mutation.rot.setX(rx); + tip_mutation.rot.setY(ry); + tip_mutation.rot.setZ(rz); + tip_mutation.rot.setW(rw); + } + } + +#if FUNCTION_MULTIVERSIONING + __attribute__((hot)) __attribute__((noinline)) __attribute__((target("fma", "avx"))) void computeApproximateMutations(size_t mutation_count, const double* const* mutation_values, std::vector>& tip_frame_mutations) const + { + const double* p_variables = variables.data(); + auto tip_count = tip_names.size(); + tip_frame_mutations.resize(mutation_count); + for(auto& m : tip_frame_mutations) + m.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + auto& joint_deltas = mutation_approx_frames[itip]; + + const Frame& tip_frame = tip_frames_aligned[itip]; + + const double* tip_frame_ptr = (const double*)&tip_frame; + __m256d p0 = _mm256_load_pd(tip_frame_ptr + 0); + __m256d r0 = _mm256_load_pd(tip_frame_ptr + 4); + + for(size_t imutation = 0; imutation < mutation_count; imutation++) + { + auto p = p0; + auto r = r0; + + for(size_t vii : mutation_approx_map[itip]) + { + size_t variable_index = mutation_approx_variable_indices[vii]; + double variable_delta = mutation_values[imutation][vii] - p_variables[variable_index]; + + { + auto joint_delta_ptr = (const double* __restrict__) & (joint_deltas[variable_index]); + __m256d ff = _mm256_set1_pd(variable_delta); + p = _mm256_fmadd_pd(ff, _mm256_load_pd(joint_delta_ptr + 0), p); + r = _mm256_fmadd_pd(ff, _mm256_load_pd(joint_delta_ptr + 4), r); + } + +#if USE_QUADRATIC_EXTRAPOLATION + { + auto joint_delta_ptr = (const double* __restrict__) & (mutation_approx_quadratics[itip][variable_index]); + __m256d ff = _mm256_set1_pd(variable_delta * variable_delta); + p = _mm256_fmadd_pd(ff, _mm256_load_pd(joint_delta_ptr + 0), p); + } +#endif + } + + auto& tip_mutation = tip_frame_mutations[imutation][itip]; + double* __restrict__ tip_mutation_ptr = (double*)&tip_mutation; + _mm256_store_pd(tip_mutation_ptr + 0, p); + _mm256_store_pd(tip_mutation_ptr + 4, r); + } + } + } + + __attribute__((hot)) __attribute__((noinline)) __attribute__((target("sse2"))) void computeApproximateMutations(size_t mutation_count, const double* const* mutation_values, std::vector>& tip_frame_mutations) const + { + const double* p_variables = variables.data(); + auto tip_count = tip_names.size(); + tip_frame_mutations.resize(mutation_count); + for(auto& m : tip_frame_mutations) + m.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + auto& joint_deltas = mutation_approx_frames[itip]; + + const Frame& tip_frame = tip_frames_aligned[itip]; + + const double* tip_frame_ptr = (const double*)&tip_frame; + __m128d pxy0 = _mm_load_pd(tip_frame_ptr + 0); + __m128d pzw0 = _mm_load_sd(tip_frame_ptr + 2); + __m128d rxy0 = _mm_load_pd(tip_frame_ptr + 4); + __m128d rzw0 = _mm_load_pd(tip_frame_ptr + 6); + + for(size_t imutation = 0; imutation < mutation_count; imutation++) + { + auto pxy = pxy0; + auto pzw = pzw0; + auto rxy = rxy0; + auto rzw = rzw0; + + for(size_t vii : mutation_approx_map[itip]) + { + size_t variable_index = mutation_approx_variable_indices[vii]; + double variable_delta = mutation_values[imutation][vii] - p_variables[variable_index]; + + { + auto joint_delta_ptr = (const double* __restrict__) & (joint_deltas[variable_index]); + __m128d ff = _mm_set1_pd(variable_delta); + pxy = _mm_add_pd(_mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 0)), pxy); + pzw = _mm_add_sd(_mm_mul_sd(ff, _mm_load_sd(joint_delta_ptr + 2)), pzw); + rxy = _mm_add_pd(_mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 4)), rxy); + rzw = _mm_add_pd(_mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 6)), rzw); + } + +#if USE_QUADRATIC_EXTRAPOLATION + { + auto joint_delta_ptr = (const double* __restrict__) & (mutation_approx_quadratics[itip][variable_index]); + __m128d ff = _mm_set1_pd(variable_delta * variable_delta); + pxy = _mm_add_pd(_mm_mul_pd(ff, _mm_load_pd(joint_delta_ptr + 0)), pxy); + pzw = _mm_add_sd(_mm_mul_sd(ff, _mm_load_sd(joint_delta_ptr + 2)), pzw); + } +#endif + } + + auto& tip_mutation = tip_frame_mutations[imutation][itip]; + double* __restrict__ tip_mutation_ptr = (double*)&tip_mutation; + _mm_store_pd(tip_mutation_ptr + 0, pxy); + _mm_store_sd(tip_mutation_ptr + 2, pzw); + _mm_store_pd(tip_mutation_ptr + 4, rxy); + _mm_store_pd(tip_mutation_ptr + 6, rzw); + } + } + } + + __attribute__((hot)) __attribute__((noinline)) __attribute__((target("default"))) +#endif + void + computeApproximateMutations(size_t mutation_count, const double* const* mutation_values, std::vector>& tip_frame_mutations) const + { + const double* p_variables = variables.data(); + auto tip_count = tip_names.size(); + tip_frame_mutations.resize(mutation_count); + for(auto& m : tip_frame_mutations) + m.resize(tip_count); + for(size_t itip = 0; itip < tip_count; itip++) + { + auto& joint_deltas = mutation_approx_frames[itip]; + + const Frame& tip_frame = tip_frames[itip]; + for(size_t imutation = 0; imutation < mutation_count; imutation++) + { + double px = tip_frame.pos.x(); + double py = tip_frame.pos.y(); + double pz = tip_frame.pos.z(); + + double rx = tip_frame.rot.x(); + double ry = tip_frame.rot.y(); + double rz = tip_frame.rot.z(); + double rw = tip_frame.rot.w(); + + for(size_t vii : mutation_approx_map[itip]) + { + size_t variable_index = mutation_approx_variable_indices[vii]; + + double variable_delta = mutation_values[imutation][vii] - p_variables[variable_index]; + + px += joint_deltas[variable_index].pos.x() * variable_delta; + py += joint_deltas[variable_index].pos.y() * variable_delta; + pz += joint_deltas[variable_index].pos.z() * variable_delta; + +#if USE_QUADRATIC_EXTRAPOLATION + double variable_delta_sq = variable_delta * variable_delta; + px += mutation_approx_quadratics[itip][variable_index].pos.x() * variable_delta_sq; + py += mutation_approx_quadratics[itip][variable_index].pos.y() * variable_delta_sq; + pz += mutation_approx_quadratics[itip][variable_index].pos.z() * variable_delta_sq; +#endif + + rx += joint_deltas[variable_index].rot.x() * variable_delta; + ry += joint_deltas[variable_index].rot.y() * variable_delta; + rz += joint_deltas[variable_index].rot.z() * variable_delta; + rw += joint_deltas[variable_index].rot.w() * variable_delta; + } + + auto& tip_mutation = tip_frame_mutations[imutation][itip]; + + tip_mutation.pos.setX(px); + tip_mutation.pos.setY(py); + tip_mutation.pos.setZ(pz); + + tip_mutation.rot.setX(rx); + tip_mutation.rot.setY(ry); + tip_mutation.rot.setZ(rz); + tip_mutation.rot.setW(rw); + } + } + } +}; + +#if 0 +class RobotFK_Mutator_2 : public RobotFK_Mutator +{ + struct JointApprox + { + ssize_t mutation_index; + ssize_t variable_index; + Vector3 delta_position; + Vector3 delta_rotation; + size_t link_index; + size_t parent_link_index; + Vector3 link_position; + }; + std::vector joint_approximators; + + struct LinkApprox + { + Vector3 position; + Vector3 rotation; + }; + std::vector link_approximators; + + std::vector link_approx_mask; + + std::vector> variable_to_approximator_index_map; + +public: + RobotFK_Mutator_2(moveit::core::RobotModelConstPtr model) + : RobotFK_Mutator(model) + { + } + + void initializeMutationApproximator(const std::vector& variable_indices) + { + RobotFK_Mutator::initializeMutationApproximator(variable_indices); + + BLOCKPROFILER("initializeMutationApproximator tree"); + + auto tip_count = tip_names.size(); + + link_approximators.resize(robot_model->getLinkModelCount() + 1); + for(auto& l : link_approximators) + { + l.position = Vector3(0, 0, 0); + l.rotation = Vector3(0, 0, 0); + } + + link_approx_mask.clear(); + link_approx_mask.resize(robot_model->getLinkModelCount(), 0); + + joint_approximators.clear(); + + // build joint approximators + for(size_t imut = 0; imut < variable_indices.size(); imut++) + { + size_t ivar = variable_indices[imut]; + auto* joint_model = robot_model->getJointOfVariable(ivar); + { + auto* link_model = joint_model->getChildLinkModel(); + // if(link_approx_mask[link_model->getLinkIndex()]) continue; + joint_approximators.emplace_back(); + auto& joint = joint_approximators.back(); + joint.mutation_index = imut; + joint.variable_index = ivar; + joint.link_index = link_model->getLinkIndex(); + link_approx_mask[link_model->getLinkIndex()] = 1; + } + for(auto* mimic_joint_model : joint_model->getMimicRequests()) + { + // LOG("mimic", mimic_joint_model); + auto* joint_model = mimic_joint_model; + auto* link_model = joint_model->getChildLinkModel(); + // if(link_approx_mask[link_model->getLinkIndex()]) continue; + joint_approximators.emplace_back(); + auto& joint = joint_approximators.back(); + joint.mutation_index = imut; + joint.variable_index = ivar; + joint.link_index = link_model->getLinkIndex(); + link_approx_mask[link_model->getLinkIndex()] = 1; + } + } + + for(auto& joint : joint_approximators) + { + // size_t imut = joint.mutation_index; + // size_t ivar = joint.variable_index; + auto* link_model = robot_model->getLinkModel(joint.link_index); + auto* joint_model = link_model->getParentJointModel(); + joint.delta_position = Vector3(0, 0, 0); + joint.delta_rotation = Vector3(0, 0, 0); + auto& link_frame = global_frames[link_model->getLinkIndex()]; + switch(joint_model->getType()) + { + case moveit::core::JointModel::REVOLUTE: + quat_mul_vec(link_frame.rot, joint_axis_list[joint_model->getJointIndex()], joint.delta_rotation); + break; + case moveit::core::JointModel::PRISMATIC: + quat_mul_vec(link_frame.rot, joint_axis_list[joint_model->getJointIndex()], joint.delta_position); + break; + } + for(auto* j = joint_model; j->getMimic(); j = j->getMimic()) + { + joint.delta_rotation *= j->getMimicFactor(); + joint.delta_position *= j->getMimicFactor(); + break; + } + } + + // continue extrapolation to tip frames, if not already done + for(auto* link_model : tip_links) + { + if(link_approx_mask[link_model->getLinkIndex()]) continue; + joint_approximators.emplace_back(); + auto& joint = joint_approximators.back(); + joint.mutation_index = 0; + joint.variable_index = 0; + joint.link_index = link_model->getLinkIndex(); + joint.delta_position = Vector3(0, 0, 0); + joint.delta_rotation = Vector3(0, 0, 0); + link_approx_mask[link_model->getLinkIndex()] = 1; + } + + std::sort(joint_approximators.begin(), joint_approximators.end(), [](const JointApprox& a, const JointApprox& b) { return a.link_index < b.link_index; }); + + for(auto& joint : joint_approximators) + { + for(auto* link_model = robot_model->getLinkModel(joint.link_index); link_model;) + { + if(link_approx_mask[link_model->getLinkIndex()] >= 2) + { + joint.parent_link_index = link_model->getLinkIndex(); + joint.link_position = global_frames[joint.link_index].pos - global_frames[joint.parent_link_index].pos; + link_approx_mask[joint.link_index] = 2; + break; + } + link_model = link_model->getParentLinkModel(); + if(link_model == 0) + { + joint.parent_link_index = robot_model->getLinkModelCount(); + joint.link_position = global_frames[joint.link_index].pos; + link_approx_mask[joint.link_index] = 2; + break; + } + } + } + + variable_to_approximator_index_map.resize(robot_model->getVariableCount()); + for(auto& l : variable_to_approximator_index_map) + l.clear(); + for(size_t approximator_index = 0; approximator_index < joint_approximators.size(); approximator_index++) + { + if(joint_approximators[approximator_index].variable_index < 0) continue; + variable_to_approximator_index_map[joint_approximators[approximator_index].variable_index].push_back(approximator_index); + } + } + + void computeApproximateMutations(size_t mutation_count, const double* const* mutation_values, std::vector>& tip_frame_mutations) + { + auto tip_count = tip_names.size(); + tip_frame_mutations.resize(mutation_count); + for(auto& m : tip_frame_mutations) + m.resize(tip_count); + for(size_t imutation = 0; imutation < mutation_count; imutation++) + { + for(auto& joint : joint_approximators) + { + double dvar; + /*if(joint.mutation_index < 0) + dvar = 0; + else*/ + dvar = mutation_values[imutation][joint.mutation_index] - variables[joint.variable_index]; + + Vector3 dpos = joint.delta_position * dvar + joint.link_position; + + auto& parent = link_approximators[joint.parent_link_index]; + + // if(dpos.x() || dpos.y() || dpos.z()) + { + Vector3 dpos1 = Vector3(parent.rotation.y() * dpos.z() - parent.rotation.z() * dpos.y(), parent.rotation.z() * dpos.x() - parent.rotation.x() * dpos.z(), parent.rotation.x() * dpos.y() - parent.rotation.y() * dpos.x()); + + /*double xx = 0.5 * parent.rotation.x() * parent.rotation.x(); + double yy = 0.5 * parent.rotation.y() * parent.rotation.y(); + double zz = 0.5 * parent.rotation.z() * parent.rotation.z(); + + Vector3 dpos2 = Vector3( + dpos.x() * (yy + zz), + dpos.y() * (xx + zz), + dpos.z() * (xx + yy) + );*/ + + dpos += dpos1; + } + + // dpos -= dpos2; + + auto& link = link_approximators[joint.link_index]; + link.position = parent.position + dpos; + link.rotation = parent.rotation + joint.delta_rotation * dvar; + } + + for(size_t itip = 0; itip < tip_count; itip++) + { + const Frame& tip_frame = tip_frames[itip]; + auto& tip_mutation = tip_frame_mutations[imutation][itip]; + auto& link = link_approximators[tip_links[itip]->getLinkIndex()]; + tip_mutation.pos = link.position; + + tip_mutation.rot = tf2::Quaternion(link.rotation.x() * 0.5, link.rotation.y() * 0.5, link.rotation.z() * 0.5, 1.0) * tip_frame.rot; + + /*tip_mutation.rot = tf2::Quaternion( + link.rotation.x() * 0.5, + link.rotation.y() * 0.5, + link.rotation.z() * 0.5, + 1.0 + - link.rotation.length2() * 0.125 + ) * tip_frame.rot;*/ + } + } + } +}; + +typedef RobotFK_Mutator_2 RobotFK; + +#else + +typedef RobotFK_Mutator RobotFK; + +#endif + +#endif + +// for comparison +class RobotFK_MoveIt +{ + moveit::core::RobotModelConstPtr robot_model; + moveit::core::RobotState robot_state; + std::vector tipFrames; + std::vector tipLinks; + std::vector jj; + +public: + RobotFK_MoveIt(moveit::core::RobotModelConstPtr model) + : robot_model(model) + , robot_state(model) + { + } + void initialize(const std::vector& tip_link_indices) + { + tipFrames.resize(tip_link_indices.size()); + tipLinks.resize(tip_link_indices.size()); + for(size_t i = 0; i < tip_link_indices.size(); i++) + tipLinks[i] = robot_model->getLinkModel(tip_link_indices[i]); + } + void applyConfiguration(const std::vector& jj0) + { + BLOCKPROFILER("RobotFK_MoveIt applyConfiguration"); + jj = jj0; + robot_model->interpolate(jj0.data(), jj0.data(), 0.5, jj.data()); // force mimic update + robot_state.setVariablePositions(jj); + robot_state.update(); + for(size_t i = 0; i < tipFrames.size(); i++) + tipFrames[i] = Frame(robot_state.getGlobalLinkTransform(tipLinks[i])); + } + inline void incrementalBegin(const std::vector& jj) {} + inline void incrementalEnd() {} + const Frame& getTipFrame(size_t fi) const { return tipFrames[fi]; } + const std::vector& getTipFrames() const { return tipFrames; } +}; +} diff --git a/src/lib/bio_ik/src/goal_types.cpp b/src/lib/bio_ik/src/goal_types.cpp new file mode 100644 index 000000000..c49885313 --- /dev/null +++ b/src/lib/bio_ik/src/goal_types.cpp @@ -0,0 +1,273 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include + +#include +#include + +#include + +namespace bio_ik +{ + +#if (MOVEIT_FCL_VERSION < FCL_VERSION_CHECK(0, 6, 0)) +void TouchGoal::describe(GoalContext& context) const +{ + LinkGoalBase::describe(context); + auto* robot_model = &context.getRobotModel(); + { + static std::map collision_cache; + if(collision_cache.find(robot_model) == collision_cache.end()) collision_cache[&context.getRobotModel()] = new CollisionModel(); + collision_model = collision_cache[robot_model]; + collision_model->collision_links.resize(robot_model->getLinkModelCount()); + } + link_model = robot_model->getLinkModel(this->getLinkName()); + size_t link_index = link_model->getLinkIndex(); + auto touch_goal_normal = normal.normalized(); + // auto fbrot = fb.rot.normalized(); + auto& collision_link = collision_model->collision_links[link_index]; + if(!collision_link.initialized) + { + collision_link.initialized = true; + collision_link.shapes.resize(link_model->getShapes().size()); + for(size_t shape_index = 0; shape_index < link_model->getShapes().size(); shape_index++) + { + collision_link.shapes[shape_index] = std::make_shared(); + auto& s = *collision_link.shapes[shape_index]; + s.frame = Frame(link_model->getCollisionOriginTransforms()[shape_index]); + auto* shape = link_model->getShapes()[shape_index].get(); + // LOG(link_model->getName(), shape_index, link_model->getShapes().size(), typeid(*shape).name()); + if(auto* mesh = dynamic_cast(shape)) + { + struct : bodies::ConvexMesh + { + std::vector points; + std::vector polygons; + std::vector plane_normals; + std::vector plane_dis; + void init(const shapes::Shape* shape) + { + type_ = shapes::MESH; + scaled_vertices_ = nullptr; + { + static std::mutex mutex; + std::lock_guard lock(mutex); + setDimensions(shape); + } + for(const auto& v : getVertices()) + points.emplace_back(v.x(), v.y(), v.z()); + + const auto& triangles = getTriangles(); + for(size_t triangle_index = 0; triangle_index < triangles.size() / 3; triangle_index++) + { + polygons.push_back(3); + polygons.push_back(triangles[triangle_index * 3 + 0]); + polygons.push_back(triangles[triangle_index * 3 + 1]); + polygons.push_back(triangles[triangle_index * 3 + 2]); + } + // planes are given in the same order as the triangles, though redundant ones will appear only once. + for(const auto& plane : getPlanes()) + { + // planes stored as Eigen::Vector4d(nx, ny, nz, d) + plane_normals.emplace_back(plane.x(), plane.y(), plane.z()); + plane_dis.push_back(plane.w()); + } + } + } convex; + convex.init(mesh); + s.points = convex.points; + s.polygons = convex.polygons; + s.plane_normals = convex.plane_normals; + s.plane_dis = convex.plane_dis; + + // auto* fcl = new fcl::Convex(s.plane_normals.data(), s.plane_dis.data(), s.plane_normals.size(), s.points.data(), s.points.size(), s.polygons.data()); + + // workaround for fcl::Convex initialization bug + auto* fcl = (fcl::Convex*)::operator new(sizeof(fcl::Convex)); + fcl->num_points = s.points.size(); + fcl = new(fcl) fcl::Convex(s.plane_normals.data(), s.plane_dis.data(), s.plane_normals.size(), s.points.data(), s.points.size(), s.polygons.data()); + + s.geometry = decltype(s.geometry)(new collision_detection::FCLGeometry(fcl, link_model, shape_index)); + s.edges.resize(s.points.size()); + std::vector> edge_sets(s.points.size()); + for(size_t edge_index = 0; edge_index < fcl->num_edges; edge_index++) + { + auto edge = fcl->edges[edge_index]; + if(edge_sets[edge.first].find(edge.second) == edge_sets[edge.first].end()) + { + edge_sets[edge.first].insert(edge.second); + s.edges[edge.first].push_back(edge.second); + } + if(edge_sets[edge.second].find(edge.first) == edge_sets[edge.second].end()) + { + edge_sets[edge.second].insert(edge.first); + s.edges[edge.second].push_back(edge.first); + } + } + for(auto& p : s.points) + s.vertices.emplace_back(p[0], p[1], p[2]); + } + else + { + s.geometry = collision_detection::createCollisionGeometry(link_model->getShapes()[shape_index], link_model, shape_index); + } + // LOG("b"); + } + // getchar(); + } +} + +double TouchGoal::evaluate(const GoalContext& context) const +{ + double dmin = DBL_MAX; + context.getTempVector().resize(1); + auto& last_collision_vertex = context.getTempVector()[0]; + auto& fb = context.getLinkFrame(); + size_t link_index = link_model->getLinkIndex(); + auto& collision_link = collision_model->collision_links[link_index]; + for(size_t shape_index = 0; shape_index < link_model->getShapes().size(); shape_index++) + { + if(!collision_link.shapes[shape_index]->geometry) continue; + auto* shape = link_model->getShapes()[shape_index].get(); + // LOG(shape_index, typeid(*shape).name()); + if(auto* mesh = dynamic_cast(shape)) + { + auto& s = collision_link.shapes[shape_index]; + double d = DBL_MAX; + auto goal_normal = normal; + quat_mul_vec(fb.rot.inverse(), goal_normal, goal_normal); + quat_mul_vec(s->frame.rot.inverse(), goal_normal, goal_normal); + /*{ + size_t array_index = 0; + for(size_t vertex_index = 0; vertex_index < mesh->vertex_count; vertex_index++) + { + double dot_x = mesh->vertices[array_index++] * goal_normal.x(); + double dot_y = mesh->vertices[array_index++] * goal_normal.y(); + double dot_z = mesh->vertices[array_index++] * goal_normal.z(); + double e = dot_x + dot_y + dot_z; + if(e < d) d = e; + } + }*/ + if(mesh->vertex_count > 0) + { + size_t vertex_index = last_collision_vertex; + double vertex_dot_normal = goal_normal.dot(s->vertices[vertex_index]); + // size_t loops = 0; + while(true) + { + bool repeat = false; + for(auto vertex_index_2 : s->edges[vertex_index]) + { + auto vertex_dot_normal_2 = goal_normal.dot(s->vertices[vertex_index_2]); + if(vertex_dot_normal_2 < vertex_dot_normal) + { + vertex_index = vertex_index_2; + vertex_dot_normal = vertex_dot_normal_2; + repeat = true; + break; + } + } + if(!repeat) break; + // loops++; + } + // LOG_VAR(loops); + d = vertex_dot_normal; + last_collision_vertex = vertex_index; + } + d -= normal.dot(position - fb.pos); + // ROS_INFO("touch goal"); + if(d < dmin) dmin = d; + } + else + { + double offset = 10000; + static fcl::Sphere shape1(offset); + fcl::DistanceRequest request; + fcl::DistanceResult result; + auto pos1 = position - normal * offset * 2; + auto* shape2 = collision_link.shapes[shape_index]->geometry->collision_geometry_.get(); + auto frame2 = Frame(fb.pos, fb.rot.normalized()) * collision_link.shapes[shape_index]->frame; + double d = fcl::distance(&shape1, fcl::Transform3f(fcl::Vec3f(pos1.x(), pos1.y(), pos1.z())), shape2, fcl::Transform3f(fcl::Quaternion3f(frame2.rot.w(), frame2.rot.x(), frame2.rot.y(), frame2.rot.z()), fcl::Vec3f(frame2.pos.x(), frame2.pos.y(), frame2.pos.z())), request, result); + d -= offset; + if(d < dmin) dmin = d; + } + } + return dmin * dmin; +} +#endif + +void BalanceGoal::describe(GoalContext& context) const +{ + Goal::describe(context); + balance_infos.clear(); + double total = 0.0; + for(auto& link_name : context.getRobotModel().getLinkModelNames()) + { + auto link_urdf = context.getRobotModel().getURDF()->getLink(link_name); + if(!link_urdf) continue; + if(!link_urdf->inertial) continue; + const auto& center_urdf = link_urdf->inertial->origin.position; + tf2::Vector3 center(center_urdf.x, center_urdf.y, center_urdf.z); + double mass = link_urdf->inertial->mass; + if(!(mass > 0)) continue; + balance_infos.emplace_back(); + balance_infos.back().center = center; + balance_infos.back().weight = mass; + total += mass; + context.addLink(link_name); + } + for(auto& b : balance_infos) + { + b.weight /= total; + } +} + +double BalanceGoal::evaluate(const GoalContext& context) const +{ + tf2::Vector3 center(0, 0, 0); + for(size_t i = 0; i < balance_infos.size(); i++) + { + auto& info = balance_infos[i]; + auto& frame = context.getLinkFrame(i); + auto c = info.center; + quat_mul_vec(frame.rot, c, c); + c += frame.pos; + center += c * info.weight; + } + center -= target_; + center -= axis_ * axis_.dot(center); + return center.length2(); +} +} diff --git a/src/lib/bio_ik/src/ik_base.hpp b/src/lib/bio_ik/src/ik_base.hpp new file mode 100644 index 000000000..b9e9df51a --- /dev/null +++ b/src/lib/bio_ik/src/ik_base.hpp @@ -0,0 +1,215 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include + +#include "forward_kinematics.hpp" +#include "problem.hpp" +#include "utils.hpp" +#include + +#include + +namespace bio_ik +{ + +struct Random +{ + // std::mt19937 rng; + std::minstd_rand rng; + // std::ranlux24 rng; + // std::knuth_b rng; + // std::default_random_engine rng; + + inline double random() { return std::uniform_real_distribution(0, 1)(rng); } + + inline std::size_t random_index(std::size_t s) { return std::uniform_int_distribution(0, s - 1)(rng); } + + std::normal_distribution normal_distribution; + inline double random_gauss() { return normal_distribution(rng); } + + inline double random(double min, double max) { return random() * (max - min) + min; } + + template inline e& random_element(std::vector& l) { return l[random_index(l.size())]; } + + template inline const e& random_element(const std::vector& l) { return l[random_index(l.size())]; } + + XORShift64 _xorshift; + inline size_t fast_random_index(size_t mod) { return _xorshift() % mod; } + template inline const T& fast_random_element(const std::vector& v) { return v[fast_random_index(v.size())]; } + + static const size_t random_buffer_size = 1024 * 1024 * 8; + + const double* make_random_buffer() + { + static std::vector buf; + buf.resize(random_buffer_size); + for(auto& r : buf) + r = random(); + return buf.data(); + } + const double* random_buffer; + size_t random_buffer_index; + inline double fast_random() + { + double r = random_buffer[random_buffer_index & (random_buffer_size - 1)]; + random_buffer_index++; + return r; + } + + const double* make_random_gauss_buffer() + { + // LOG("make_random_gauss_buffer"); + static std::vector buf; + buf.resize(random_buffer_size); + for(auto& r : buf) + r = random_gauss(); + return buf.data(); + } + const double* random_gauss_buffer; + size_t random_gauss_index; + inline double fast_random_gauss() + { + double r = random_gauss_buffer[random_gauss_index & (random_buffer_size - 1)]; + random_gauss_index++; + return r; + } + inline const double* fast_random_gauss_n(size_t n) + { + size_t i = random_gauss_index; + random_gauss_index += n; + if(random_gauss_index >= random_buffer_size) i = 0, random_gauss_index = n; + return random_gauss_buffer + i; + } + + Random(std::minstd_rand::result_type seed) + : rng(seed) + { + random_buffer = make_random_buffer(); + random_buffer_index = _xorshift(); + random_gauss_buffer = make_random_gauss_buffer(); + random_gauss_index = _xorshift(); + } +}; + +struct IKBase : Random +{ + IKParams params; + RobotFK model; + RobotInfo modelInfo; + int thread_index; + Problem problem; + std::vector null_tip_frames; + volatile int canceled; + + virtual void step() = 0; + + virtual const std::vector& getSolution() const = 0; + + virtual void setParams(const IKParams& p) {} + + IKBase(const IKParams& p) + : Random(p.random_seed) + , model(p.robot_model) + , modelInfo(p.robot_model) + , params(p) + { + setParams(p); + } + virtual ~IKBase() {} + + virtual void initialize(const Problem& problem) + { + this->problem = problem; + this->problem.initialize2(); + model.initialize(problem.tip_link_indices); + // active_variables = problem.active_variables; + null_tip_frames.resize(problem.tip_link_indices.size()); + } + + double computeSecondaryFitnessActiveVariables(const double* active_variable_positions) { return problem.computeGoalFitness(problem.secondary_goals, null_tip_frames.data(), active_variable_positions); } + + double computeSecondaryFitnessAllVariables(const std::vector& variable_positions) { return computeSecondaryFitnessActiveVariables(extractActiveVariables(variable_positions)); } + + double computeFitnessActiveVariables(const std::vector& tip_frames, const double* active_variable_positions) { return problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions); } + + double computeFitnessActiveVariables(const aligned_vector& tip_frames, const double* active_variable_positions) { return problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions); } + + double computeCombinedFitnessActiveVariables(const std::vector& tip_frames, const double* active_variable_positions) + { + double ret = 0.0; + ret += problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions); + ret += problem.computeGoalFitness(problem.secondary_goals, null_tip_frames.data(), active_variable_positions); + return ret; + } + + double computeCombinedFitnessActiveVariables(const aligned_vector& tip_frames, const double* active_variable_positions) + { + double ret = 0.0; + ret += problem.computeGoalFitness(problem.goals, tip_frames.data(), active_variable_positions); + ret += problem.computeGoalFitness(problem.secondary_goals, null_tip_frames.data(), active_variable_positions); + return ret; + } + + bool checkSolutionActiveVariables(const std::vector& tip_frames, const double* active_variable_positions) { return problem.checkSolutionActiveVariables(tip_frames, active_variable_positions); } + + bool checkSolution(const std::vector& variable_positions, const std::vector& tips) { return checkSolutionActiveVariables(tips, extractActiveVariables(variable_positions)); } + + std::vector temp_active_variable_positions; + + double* extractActiveVariables(const std::vector& variable_positions) + { + temp_active_variable_positions.resize(problem.active_variables.size()); + for(size_t i = 0; i < temp_active_variable_positions.size(); i++) + temp_active_variable_positions[i] = variable_positions[problem.active_variables[i]]; + return temp_active_variable_positions.data(); + } + + double computeFitness(const std::vector& variable_positions, const std::vector& tip_frames) { return computeFitnessActiveVariables(tip_frames, extractActiveVariables(variable_positions)); } + + double computeFitness(const std::vector& variable_positions) + { + model.applyConfiguration(variable_positions); + return computeFitness(variable_positions, model.getTipFrames()); + } + + virtual size_t concurrency() const { return 1; } +}; + +typedef IKBase IKSolver; + +typedef Factory IKFactory; +} diff --git a/src/lib/bio_ik/src/ik_cppoptlib.cpp b/src/lib/bio_ik/src/ik_cppoptlib.cpp new file mode 100644 index 000000000..45f3fa634 --- /dev/null +++ b/src/lib/bio_ik/src/ik_cppoptlib.cpp @@ -0,0 +1,257 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +#include "cppoptlib/boundedproblem.h" +#include "cppoptlib/meta.h" +#include "cppoptlib/problem.h" + +namespace bio_ik +{ + +/* +struct IKOptLibProblem : cppoptlib::Problem +{ + IKBase* ik; + std::vector fk_values; + IKOptLibProblem(IKBase* ik) : ik(ik) + { + } + void initialize() + { + // set all variables to initial guess, including inactive ones + fk_values = ik->problem.initial_guess; + } + double value(const TVector& x) + { + // fill in active variables and compute fitness + for(size_t i = 0; i < ik->problem.active_variables.size(); i++) fk_values[ik->problem.active_variables[i]] = x[i]; + return ik->computeFitness(fk_values); + } + bool callback(const cppoptlib::Criteria& state, const TVector& x) + { + // check ik timeout + return ros::WallTime::now().toSec() < ik->problem.timeout; + } +}; +*/ + +// problem description for cppoptlib +struct IKOptLibProblem : cppoptlib::BoundedProblem +{ + IKBase* ik; + std::vector fk_values; + IKOptLibProblem(IKBase* ik) + : cppoptlib::BoundedProblem(TVector(ik->problem.active_variables.size()), TVector(ik->problem.active_variables.size())) + , ik(ik) + { + // init bounds + for(size_t i = 0; i < ik->problem.active_variables.size(); i++) + { + m_lowerBound[i] = ik->modelInfo.getMin(ik->problem.active_variables[i]); + m_upperBound[i] = ik->modelInfo.getMax(ik->problem.active_variables[i]); + // m_lowerBound[i] = fmax(m_lowerBound[i], -100); + // m_upperBound[i] = fmin(m_upperBound[i], 100); + } + } + void initialize() + { + // set all variables to initial guess, including inactive ones + fk_values = ik->problem.initial_guess; + } + double value(const TVector& x) + { + // fill in active variables and compute fitness + for(size_t i = 0; i < ik->problem.active_variables.size(); i++) + fk_values[ik->problem.active_variables[i]] = x[i]; + // for(size_t i = 0; i < ik->active_variables.size(); i++) LOG(i, x[i]); LOG(""); + // for(size_t i = 0; i < ik->active_variables.size(); i++) std::cerr << ((void*)*(uint64_t*)&x[i]) << " "; std::cerr << std::endl; + // size_t h = 0; for(size_t i = 0; i < ik->active_variables.size(); i++) h ^= (std::hash()(x[i]) << i); LOG((void*)h); + return ik->computeFitness(fk_values); + } + bool callback(const cppoptlib::Criteria& state, const TVector& x) + { + // check ik timeout + return ros::WallTime::now().toSec() < ik->problem.timeout; + } +}; + +// ik solver using cppoptlib +template struct IKOptLib : IKBase +{ + // current solution + std::vector solution, best_solution, temp; + + // cppoptlib solver + std::shared_ptr solver; + + // cppoptlib problem description + IKOptLibProblem f; + + // reset flag + bool reset; + + // stop criteria + cppoptlib::Criteria crit; + + IKOptLib(const IKParams& p) + : IKBase(p) + , f(this) + { + } + + void initialize(const Problem& problem) + { + IKBase::initialize(problem); + + // set initial guess + solution = problem.initial_guess; + + // randomize if more than 1 thread + reset = false; + if(thread_index > 0) reset = true; + + // init best solution + best_solution = solution; + + // initialize cppoptlib problem description + f = IKOptLibProblem(this); + f.initialize(); + + // init stop criteria (timeout will be handled explicitly) + crit = cppoptlib::Criteria::defaults(); + // crit.iterations = SIZE_MAX; + crit.gradNorm = 1e-10; + // p.node_handle.param("optlib_stop", crit.gradNorm, crit.gradNorm); + + if(!solver) solver = std::make_shared(); + } + + const std::vector& getSolution() const { return best_solution; } + + void step() + { + // set stop criteria + solver->setStopCriteria(crit); + + // random reset if stuck (and if random resets are enabled) + if(reset) + { + // LOG("RESET"); + reset = false; + for(auto& vi : problem.active_variables) + solution[vi] = random(modelInfo.getMin(vi), modelInfo.getMax(vi)); + } + + // set to current positions + temp = solution; + typename SOLVER::TVector x(problem.active_variables.size()); + for(size_t i = 0; i < problem.active_variables.size(); i++) + x[i] = temp[problem.active_variables[i]]; + + // solve + solver->minimize(f, x); + + // get results + for(size_t i = 0; i < problem.active_variables.size(); i++) + temp[problem.active_variables[i]] = x[i]; + + // update solution + if(computeFitness(temp) < computeFitness(solution)) + { + solution = temp; + } + else + { + if(reset_if_stuck) reset = true; + } + + // update best solution + if(computeFitness(solution) < computeFitness(best_solution)) + { + best_solution = solution; + } + } + + size_t concurrency() const { return threads; } +}; +} + +static std::string mkoptname(std::string name, int reset, int threads) +{ + name = "optlib_" + name; + if(reset) name += "_r"; + if(threads > 1) name += "_" + std::to_string(threads); + return name; +} + +#define IKCPPOPTX(n, t, reset, threads) static bio_ik::IKFactory::Class, reset, threads>> ik_optlib_##t##reset##threads(mkoptname(n, reset, threads)); + +//#define IKCPPOPT(n, t) static bio_ik::IKFactory::Class>> ik_optlib_##t(n) + +#define IKCPPOPT(n, t) \ + IKCPPOPTX(n, t, 0, 1) \ + IKCPPOPTX(n, t, 0, 2) \ + IKCPPOPTX(n, t, 0, 4) \ + IKCPPOPTX(n, t, 1, 1) \ + IKCPPOPTX(n, t, 1, 2) \ + IKCPPOPTX(n, t, 1, 4) + +#include "cppoptlib/solver/bfgssolver.h" +IKCPPOPT("bfgs", BfgsSolver); + +//#include "cppoptlib/solver/cmaesbsolver.h" +// IKCPPOPT("cmaesb", CMAesBSolver); + +//#include "cppoptlib/solver/cmaessolver.h" +// IKCPPOPT("cmaes", CMAesSolver); + +#include "cppoptlib/solver/conjugatedgradientdescentsolver.h" +IKCPPOPT("cgd", ConjugatedGradientDescentSolver); + +#include "cppoptlib/solver/gradientdescentsolver.h" +IKCPPOPT("gd", GradientDescentSolver); + +#include "cppoptlib/solver/lbfgsbsolver.h" +IKCPPOPT("lbfgsb", LbfgsbSolver); + +#include "cppoptlib/solver/lbfgssolver.h" +IKCPPOPT("lbfgs", LbfgsSolver); + +#include "cppoptlib/solver/neldermeadsolver.h" +IKCPPOPT("nm", NelderMeadSolver); + +#include "cppoptlib/solver/newtondescentsolver.h" +IKCPPOPT("nd", NewtonDescentSolver); diff --git a/src/lib/bio_ik/src/ik_evolution_1.cpp b/src/lib/bio_ik/src/ik_evolution_1.cpp new file mode 100644 index 000000000..4d2e3ce22 --- /dev/null +++ b/src/lib/bio_ik/src/ik_evolution_1.cpp @@ -0,0 +1,561 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +namespace bio_ik +{ + +struct IKEvolution1 : IKBase +{ + struct Individual + { + std::vector genes; + std::vector gradients; + double extinction; + double fitness; + }; + + class HeuristicErrorTree + { + size_t variable_count, tip_count; + std::vector table; + std::vector chain_lengths; + std::vector> chain_lengths_2; + + public: + HeuristicErrorTree() {} + HeuristicErrorTree(moveit::core::RobotModelConstPtr robot_model, const std::vector& tip_names) + { + tip_count = tip_names.size(); + variable_count = robot_model->getVariableCount(); + table.resize(tip_count * variable_count); + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + { + auto& tip_name = tip_names[tip_index]; + for(auto* link_model = robot_model->getLinkModel(tip_name); link_model; link_model = link_model->getParentLinkModel()) + { + auto* joint_model = link_model->getParentJointModel(); + size_t v1 = joint_model->getFirstVariableIndex(); + size_t vn = joint_model->getVariableCount(); + for(size_t variable_index = v1; variable_index < v1 + vn; variable_index++) + table[variable_index * tip_count + tip_index] = 1; + } + } + for(size_t variable_index = 0; variable_index < variable_count; variable_index++) + { + double sum = 0; + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + sum += table[variable_index * tip_count + tip_index]; + if(sum > 0) + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + table[variable_index * tip_count + tip_index] /= sum; + } + + chain_lengths.resize(tip_count); + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + { + auto& tip_name = tip_names[tip_index]; + double chain_length = 0; + for(auto* link_model = robot_model->getLinkModel(tip_name); link_model; link_model = link_model->getParentLinkModel()) + { + chain_length += Frame(link_model->getJointOriginTransform()).pos.length(); + } + chain_lengths[tip_index] = chain_length; + } + + chain_lengths_2.resize(tip_count); + for(size_t tip_index = 0; tip_index < tip_count; tip_index++) + { + auto& tip_name = tip_names[tip_index]; + double chain_length = 0; + chain_lengths_2[tip_index].resize(variable_count, 0.0); + for(auto* link_model = robot_model->getLinkModel(tip_name); link_model; link_model = link_model->getParentLinkModel()) + { + + auto* joint_model = link_model->getParentJointModel(); + int vmin = joint_model->getFirstVariableIndex(); + int vmax = vmin + joint_model->getVariableCount(); + for(int vi = vmin; vi < vmax; vi++) + chain_lengths_2[tip_index][vi] = chain_length; + chain_length += Frame(link_model->getJointOriginTransform()).pos.length(); + } + } + } + inline double getInfluence(size_t variable_index, size_t tip_index) const { return table[variable_index * tip_count + tip_index]; } + inline double getChainLength(size_t tip_index) const { return chain_lengths[tip_index]; } + inline double getJointVariableChainLength(size_t tip_index, size_t variable_index) const { return chain_lengths_2[tip_index][variable_index]; } + }; + + HeuristicErrorTree heuristicErrorTree; + std::vector solution; + std::vector population; + int populationSize, eliteCount; + std::vector tempPool; + std::vector tempOffspring; + std::vector initialGuess; + + bool opt_no_wipeout; + + bool linear_fitness; + + void setParams(const IKParams& p) + { + opt_no_wipeout = p.opt_no_wipeout; + populationSize = p.population_size; + eliteCount = p.elite_count; + linear_fitness = p.linear_fitness; + } + + bool in_final_adjustment_loop; + + template inline t select(const std::vector& v) + { + // FNPROFILER(); + linear_int_distribution d(v.size()); + size_t index = d(rng); + return v[index]; + } + + inline double clip(double v, size_t i) { return modelInfo.clip(v, i); } + + inline double getMutationStrength(size_t i, const Individual& parentA, const Individual& parentB) + { + double extinction = 0.5 * (parentA.extinction + parentB.extinction); + double span = modelInfo.getSpan(i); + return span * extinction; + } + + double computeAngularScale(size_t tip_index, const Frame& tip_frame) + { + double angular_scale = sqrt(heuristicErrorTree.getChainLength(tip_index) * tip_frame.pos.length()) / M_PI; + return angular_scale; + // return 1; + /*double angular_scale = sqrt(heuristicErrorTree.getChainLength(tip_index) * tip_frame.pos.length()) / M_PI; + //double angular_scale = heuristicErrorTree.getChainLength(tip_index) * (1.0 / M_PI); + if(opt_angular_scale_full_circle) angular_scale *= 0.5; + return angular_scale;*/ + } + + double getHeuristicError(size_t variable_index, bool balanced) + { + // return 1; + + double heuristic_error = 0; + // for(int tip_index = 0; tip_index < tipObjectives.size(); tip_index++) + for(int tip_index = 0; tip_index < problem.goals.size(); tip_index++) + { + double influence = heuristicErrorTree.getInfluence(variable_index, tip_index); + if(influence == 0) continue; + + // const auto& ta = tipObjectives[tip_index]; + const auto& ta = problem.goals[tip_index].frame; + const auto& tb = model.getTipFrame(tip_index); + + double length = heuristicErrorTree.getJointVariableChainLength(tip_index, variable_index); + + // LOG_ALWAYS("a", heuristicErrorTree.getJointVariableChainLength(tip_index, variable_index)); + + // double length = model.getJointVariableFrame(variable_index).pos.distance(model.getTipFrame(tip_index).pos); if(length <= 0.000000001) length = 0; + + // LOG_ALWAYS("b", length); + + if(modelInfo.isPrismatic(variable_index)) + { + // heuristic_error += ta.pos.distance(tb.pos) * influence; + // if(length) heuristic_error += ta.rot.angle(tb.rot) * length * influence; + + if(length) + { + heuristic_error += ta.pos.distance(tb.pos) * influence * 0.5; + heuristic_error += ta.rot.angle(tb.rot) * length * influence * 0.5; + } + else + { + heuristic_error += ta.pos.distance(tb.pos) * influence; + } + } + + if(modelInfo.isRevolute(variable_index)) + { + // if(length) heuristic_error += ta.pos.distance(tb.pos) / length * influence; + // heuristic_error += ta.rot.angle(tb.rot) * influence; + + if(length) + { + heuristic_error += ta.pos.distance(tb.pos) / length * influence * 0.5; + heuristic_error += ta.rot.angle(tb.rot) * influence * 0.5; + } + else + { + heuristic_error += ta.rot.angle(tb.rot) * influence; + } + + // double d = 0.0; + // if(length) d = std::max(d, ta.pos.distance(tb.pos) / length); + // d = std::max(d, ta.rot.angle(tb.rot)); + // heuristic_error += d * influence; + } + } + // heuristic_error *= 0.5; + // LOG_ALWAYS(heuristic_error); + return heuristic_error; + } + + bool in_adjustment_2, in_get_solution_fitness; + + void reroll(Individual& offspring) + { + FNPROFILER(); + // for(size_t i = 0; i < offspring.genes.size(); i++) + for(auto i : problem.active_variables) + { + offspring.genes[i] = random(modelInfo.getMin(i), modelInfo.getMax(i)); + + offspring.genes[i] = mix(offspring.genes[i], (modelInfo.getMin(i) + modelInfo.getMax(i)) * 0.5, random(0.0, 0.1)); + + offspring.gradients[i] = 0; + } + offspring.fitness = computeFitness(offspring.genes, false); + } + + double computeFitness(const std::vector& genes, bool balanced) + { + if(linear_fitness) + { + model.applyConfiguration(genes); + double fitness_sum = 0.0; + for(size_t goal_index = 0; goal_index < problem.goals.size(); goal_index++) + { + const auto& ta = problem.goals[goal_index].frame; + const auto& tb = model.getTipFrame(problem.goals[goal_index].tip_index); + + double tdist = ta.pos.distance(tb.pos) / computeAngularScale(problem.goals[goal_index].tip_index, ta); + double rdist = ta.rot.angle(tb.rot); + + fitness_sum += mix(tdist, rdist, (balanced || in_final_adjustment_loop) ? 0.5 : random()); + } + return fitness_sum; + } + else + { + return IKBase::computeFitness(genes); + } + } + + bool checkWipeout() + { + FNPROFILER(); + auto& genes = population[0].genes; + // for(size_t i = 0; i < genes.size(); i++) + for(auto i : problem.active_variables) + { + double v0 = genes[i]; + double fitness = computeFitness(genes, true); + double heuristicError = getHeuristicError(i, true); + // double heuristicError = 0.001; + genes[i] = modelInfo.clip(v0 + random(0, heuristicError), i); + double incFitness = computeFitness(genes, true); + genes[i] = modelInfo.clip(v0 - random(0, heuristicError), i); + double decFitness = computeFitness(genes, true); + genes[i] = v0; + if(incFitness < fitness || decFitness < fitness) + { + // LOG("no wipeout"); + return false; + } + } + // LOG("wipeout 1"); + return true; + } + + void computeExtinctions() + { + double min = population.front().fitness; + double max = population.back().fitness; + for(size_t i = 0; i < populationSize; i++) + { + double grading = (double)i / (double)(populationSize - 1); + population[i].extinction = (population[i].fitness + min * (grading - 1)) / max; + } + } + + bool tryUpdateSolution() + { + FNPROFILER(); + double solutionFitness = computeFitness(solution, true); + double candidateFitness = computeFitness(population[0].genes, true); + // LOG_VAR(solutionFitness); + // LOG_VAR(candidateFitness); + if(candidateFitness < solutionFitness) + { + solution = population[0].genes; + // solution = initialGuess; + // for(auto i : problem.active_variables) + // solution[i] = population[0].genes[i]; + return true; + } + return false; + } + + double getMutationProbability(const Individual& parentA, const Individual& parentB) + { + double extinction = 0.5 * (parentA.extinction + parentB.extinction); + double inverse = 1.0 / parentA.genes.size(); + return extinction * (1.0 - inverse) + inverse; + } + + void sortByFitness() + { + FNPROFILER(); + sort(population.begin(), population.end(), [](const Individual& a, const Individual& b) { return a.fitness < b.fitness; }); + } + + double bounce(double v, int i) + { + double c = clip(v, i); + v = c - (v - c) * 2; + // v = c + c - v; + v = clip(v, i); + return v; + } + + void reproduce(Individual& offspring, const Individual& parentA, const Individual& parentB, const Individual& prototype) + { + FNPROFILER(); + for(size_t i = 0; i < offspring.genes.size(); i++) + // for(auto i : problem.active_variables) + { + offspring.genes[i] = mix(parentA.genes[i], parentB.genes[i], random()); + offspring.genes[i] += parentA.gradients[i] * random(); + offspring.genes[i] += parentB.gradients[i] * random(); + + double storage = offspring.genes[i]; + + if(random() < getMutationProbability(parentA, parentB)) offspring.genes[i] += random(-1, 1) * getMutationStrength(i, parentA, parentB); + // offspring.genes[i] += normal_random() * getMutationStrength(i, parentA, parentB); + + offspring.genes[i] += mix(random() * (0.5 * (parentA.genes[i] + parentB.genes[i]) - offspring.genes[i]), random() * (prototype.genes[i] - offspring.genes[i]), random()); + + // offspring.genes[i] = clip(offspring.genes[i], i); + + // offspring.genes[i] += fabs(offspring.genes[i] - storage) * offspring.genes[i] - (modelInfo.getMin(i) + modelInfo.getMax(i)) * 0.5; + + // offspring.genes[i] = mix(offspring.genes[i], (modelInfo.getMin(i) + modelInfo.getMax(i)) * 0.5, random() * 0.1 * fabs(offspring.genes[i] - storage) / modelInfo.getSpan(i)); + + offspring.genes[i] = clip(offspring.genes[i], i); + + // offspring.genes[i] = bounce(offspring.genes[i], i); + + offspring.gradients[i] = random() * offspring.gradients[i] + offspring.genes[i] - storage; + } + + offspring.fitness = computeFitness(offspring.genes, false); + } + + void exploit(Individual& individual) + { + FNPROFILER(); + + double fitness_sum = 0; + + // model.incrementalBegin(individual.genes); + + for(auto i : problem.active_variables) + { + double fitness = computeFitness(individual.genes, true); + + double heuristicError = getHeuristicError(i, true); + double v_0 = individual.genes[i]; + + double v_inc = clip(v_0 + random(0, heuristicError), i); + double v_dec = clip(v_0 - random(0, heuristicError), i); + + individual.genes[i] = v_inc; + double inc_fitness = computeFitness(individual.genes, true); + individual.genes[i] = v_dec; + double dec_fitness = computeFitness(individual.genes, true); + + if(inc_fitness < fitness && inc_fitness <= dec_fitness) + { + individual.genes[i] = v_inc; + individual.gradients[i] = v_0 * random() + v_inc - v_0; + fitness_sum += inc_fitness; + } + else if(dec_fitness < fitness && dec_fitness <= inc_fitness) + { + individual.genes[i] = v_dec; + individual.gradients[i] = v_0 * random() + v_dec - v_0; + fitness_sum += dec_fitness; + } + else + { + individual.genes[i] = v_0; + fitness_sum += fitness; + } + } + + // model.incrementalEnd(); + + individual.fitness = fitness_sum / individual.genes.size(); + } + + IKEvolution1(const IKParams& p) + : IKBase(p) + , populationSize(12) + , eliteCount(4) + , in_final_adjustment_loop(false) + , in_adjustment_2(false) + , in_get_solution_fitness(false) + { + setParams(p); + } + + void init() + { + initialGuess = problem.initial_guess; + solution = initialGuess; + + population.resize(populationSize); + + { + auto& p = population[0]; + p.genes = solution; + p.gradients.clear(); + p.gradients.resize(p.genes.size(), 0); + p.fitness = computeFitness(p.genes, false); + } + + for(int i = 1; i < populationSize; i++) + { + auto& p = population[i]; + p.genes = solution; + p.gradients.clear(); + p.gradients.resize(p.genes.size(), 0); + reroll(p); + } + + sortByFitness(); + computeExtinctions(); + } + + void initialize(const Problem& problem) + { + IKBase::initialize(problem); + + std::vector tips; + for(auto tip_link_index : problem.tip_link_indices) + tips.push_back(params.robot_model->getLinkModelNames()[tip_link_index]); + heuristicErrorTree = HeuristicErrorTree(params.robot_model, tips); + + init(); + } + + const std::vector& getSolution() const { return solution; } + + double getSolutionFitness() + { + in_get_solution_fitness = true; + double f = computeFitness(solution, true); + in_get_solution_fitness = false; + return f; + } + + const std::vector& getSolutionTipFrames() + { + model.applyConfiguration(solution); + return model.getTipFrames(); + } + + bool evolve() + { + FNPROFILER(); + + auto& offspring = tempOffspring; + offspring = population; + + for(size_t i = 0; i < eliteCount; i++) + { + offspring[i] = population[i]; + exploit(offspring[i]); + } + + auto& pool = tempPool; + pool.resize(populationSize); + iota(pool.begin(), pool.end(), &population[0]); + + for(size_t i = eliteCount; i < populationSize; i++) + { + if(pool.size() > 0) + { + auto& parentA = *select(pool); + auto& parentB = *select(pool); + auto& prototype = *select(pool); + reproduce(offspring[i], parentA, parentB, prototype); + if(offspring[i].fitness < parentA.fitness) pool.erase(remove(pool.begin(), pool.end(), &parentA), pool.end()); + if(offspring[i].fitness < parentB.fitness) pool.erase(remove(pool.begin(), pool.end(), &parentB), pool.end()); + } + else + { + reroll(offspring[i]); + } + } + + population = offspring; + + sortByFitness(); + + computeExtinctions(); + + if(tryUpdateSolution()) return true; + if(opt_no_wipeout) return false; + if(!checkWipeout()) return false; + + init(); + + return tryUpdateSolution(); + } + + void step() + { + in_adjustment_2 = false; + evolve(); + } + + virtual size_t concurrency() const { return 4; } +}; + +static IKFactory::Class cIKEvolution1("bio1"); + +} diff --git a/src/lib/bio_ik/src/ik_evolution_2.cpp b/src/lib/bio_ik/src/ik_evolution_2.cpp new file mode 100644 index 000000000..1663a66f2 --- /dev/null +++ b/src/lib/bio_ik/src/ik_evolution_2.cpp @@ -0,0 +1,659 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +#ifdef ENABLE_CPP_OPTLIB +#include "cppoptlib/solver/lbfgssolver.h" +#endif + +namespace bio_ik +{ + +// fast evolutionary inverse kinematics +template struct IKEvolution2 : IKBase +{ + struct Individual + { + aligned_vector genes; + aligned_vector gradients; + double fitness; + }; + + struct Species + { + std::vector individuals; + double fitness; + bool improved; + }; + + std::vector initial_guess; + std::vector solution; + std::vector temp_joint_variables; + double solution_fitness; + std::vector species; + std::vector children; + std::vector> phenotypes, phenotypes2, phenotypes3; + std::vector child_indices; + std::vector genotypes; + std::vector phenotype; + std::vector quaternion_genes; + aligned_vector genes_min, genes_max, genes_span; + aligned_vector gradient, temp; + + IKEvolution2(const IKParams& p) + : IKBase(p) + { + } + +#ifdef ENABLE_CPP_OPTLIB + struct OptlibProblem : cppoptlib::Problem + { + IKEvolution2* ik; + OptlibProblem(IKEvolution2* ik) + : ik(ik) + { + } + double value(const TVector& x) + { + const double* genes = x.data(); + ik->model.computeApproximateMutations(1, &genes, ik->phenotypes); + return ik->computeCombinedFitnessActiveVariables(ik->phenotypes[0], genes); + } + }; + typedef cppoptlib::LbfgsSolver OptlibSolver; + std::shared_ptr optlib_solver; + std::shared_ptr optlib_problem; + typename OptlibSolver::TVector optlib_vector; +#endif + + void genesToJointVariables(const Individual& individual, std::vector& variables) + { + auto& genes = individual.genes; + variables.resize(params.robot_model->getVariableCount()); + for(size_t i = 0; i < problem.active_variables.size(); i++) + variables[problem.active_variables[i]] = genes[i]; + } + + const std::vector& getSolution() const { return solution; } + + void initialize(const Problem& problem) + { + BLOCKPROFILER("initialization"); + + IKBase::initialize(problem); + + // init list of quaternion joint genes to be normalized during each mutation + quaternion_genes.clear(); + for(size_t igene = 0; igene < problem.active_variables.size(); igene++) + { + size_t ivar = problem.active_variables[igene]; + auto* joint_model = params.robot_model->getJointOfVariable(ivar); + if(joint_model->getFirstVariableIndex() + 3 != ivar) continue; + if(joint_model->getType() != moveit::core::JointModel::FLOATING) continue; + quaternion_genes.push_back(igene); + } + + // set solution to initial guess + initial_guess = problem.initial_guess; + solution = initial_guess; + solution_fitness = computeFitness(solution); + + // init temporary buffer with positions of inactive joints + temp_joint_variables = initial_guess; + + // params + size_t population_size = 2; + size_t child_count = 16; + + // initialize population on current island + species.resize(2); + for(auto& s : species) + { + // create individuals + s.individuals.resize(population_size); + + // initialize first individual + { + auto& v = s.individuals[0]; + + // init genes + v.genes.resize(problem.active_variables.size()); + // if(thread_index == 0) // on first island? + // if(thread_index % 2 == 0) // on every second island... + if(1) + { + // set to initial_guess + for(size_t i = 0; i < v.genes.size(); i++) + v.genes[i] = initial_guess[problem.active_variables[i]]; + } + else + { + // initialize populations on other islands randomly + for(size_t i = 0; i < v.genes.size(); i++) + v.genes[i] = random(modelInfo.getMin(problem.active_variables[i]), modelInfo.getMax(problem.active_variables[i])); + } + + // set gradients to zero + v.gradients.clear(); + v.gradients.resize(problem.active_variables.size(), 0); + } + + // clone first individual + for(size_t i = 1; i < s.individuals.size(); i++) + { + s.individuals[i].genes = s.individuals[0].genes; + s.individuals[i].gradients = s.individuals[0].gradients; + } + } + + // space for child population + children.resize(population_size + child_count); + for(auto& child : children) + { + child.genes.resize(problem.active_variables.size()); + child.gradients.resize(problem.active_variables.size()); + } + + // init gene infos + // if(genes_min.empty()) + { + genes_min.resize(problem.active_variables.size()); + genes_max.resize(problem.active_variables.size()); + genes_span.resize(problem.active_variables.size()); + for(size_t i = 0; i < problem.active_variables.size(); i++) + { + genes_min[i] = modelInfo.getClipMin(problem.active_variables[i]); + genes_max[i] = modelInfo.getClipMax(problem.active_variables[i]); + genes_span[i] = modelInfo.getSpan(problem.active_variables[i]); + } + } + + /* + // init chain mutation masks + chain_mutation_masks.resize(chain_mutation_mask_count); + for(auto& chain_mutation_mask : chain_mutation_masks) + { + temp_mutation_chain.clear(); + if(problem.tip_link_indices.size() > 1) + { + for(auto* chain_link = params.robot_model->getLinkModel(random_element(problem.tip_link_indices)); chain_link; chain_link = chain_link->getParentLinkModel()) + temp_mutation_chain.push_back(chain_link); + temp_mutation_chain.resize(random_index(temp_mutation_chain.size()) + 1); + } + + temp_chain_mutation_var_mask.resize(params.robot_model->getVariableCount()); + for(auto& m : temp_chain_mutation_var_mask) m = 0; + for(auto* chain_link : temp_mutation_chain) + { + auto* chain_joint = chain_link->getParentJointModel(); + for(size_t ivar = chain_joint->getFirstVariableIndex(); ivar < chain_joint->getFirstVariableIndex() + chain_joint->getVariableCount(); ivar++) + temp_chain_mutation_var_mask[ivar] = 1; + } + + chain_mutation_mask.resize(problem.active_variables.size()); + for(size_t igene = 0; igene < problem.active_variables.size(); igene++) + chain_mutation_mask[igene] = temp_chain_mutation_var_mask[problem.active_variables[igene]]; + } + */ + } + + /* + const size_t chain_mutation_mask_count = 256; + std::vector> chain_mutation_masks; + std::vector temp_mutation_chain; + std::vector temp_chain_mutation_var_mask; + */ + + // aligned_vector rmask; + + // create offspring and mutate + __attribute__((hot)) __attribute__((noinline)) + //__attribute__((target_clones("avx2", "avx", "sse2", "default"))) + //__attribute__((target("avx"))) + void + reproduce(const std::vector& population) + { + const auto __attribute__((aligned(32)))* __restrict__ genes_span = this->genes_span.data(); + const auto __attribute__((aligned(32)))* __restrict__ genes_min = this->genes_min.data(); + const auto __attribute__((aligned(32)))* __restrict__ genes_max = this->genes_max.data(); + + auto gene_count = children[0].genes.size(); + + size_t s = (children.size() - population.size()) * gene_count + children.size() * 4 + 4; + + auto* __restrict__ rr = fast_random_gauss_n(s); + rr = (const double*)(((size_t)rr + 3) / 4 * 4); + + /*rmask.resize(s); + for(auto& m : rmask) m = fast_random() < 0.1 ? 1.0 : 0.0; + double* dm = rmask.data();*/ + + for(size_t child_index = population.size(); child_index < children.size(); child_index++) + { + double mutation_rate = (1 << fast_random_index(16)) * (1.0 / (1 << 23)); + auto& parent = population[0]; + auto& parent2 = population[1]; + double fmix = (child_index % 2 == 0) * 0.2; + double gradient_factor = child_index % 3; + + auto __attribute__((aligned(32)))* __restrict__ parent_genes = parent.genes.data(); + auto __attribute__((aligned(32)))* __restrict__ parent_gradients = parent.gradients.data(); + + auto __attribute__((aligned(32)))* __restrict__ parent2_genes = parent2.genes.data(); + auto __attribute__((aligned(32)))* __restrict__ parent2_gradients = parent2.gradients.data(); + + auto& child = children[child_index]; + + auto __attribute__((aligned(32)))* __restrict__ child_genes = child.genes.data(); + auto __attribute__((aligned(32)))* __restrict__ child_gradients = child.gradients.data(); + +#pragma omp simd aligned(genes_span : 32), aligned(genes_min : 32), aligned(genes_max : 32), aligned(parent_genes : 32), aligned(parent_gradients : 32), aligned(parent2_genes : 32), aligned(parent2_gradients : 32), aligned(child_genes : 32), aligned(child_gradients : 32) aligned(rr : 32) +#pragma unroll + for(size_t gene_index = 0; gene_index < gene_count; gene_index++) + { + // double mutation_rate = (1 << fast_random_index(16)) * (1.0 / (1 << 23)); + + double r = rr[gene_index]; + // r *= dm[gene_index]; + double f = mutation_rate * genes_span[gene_index]; + double gene = parent_genes[gene_index]; + double parent_gene = gene; + gene += r * f; + double parent_gradient = mix(parent_gradients[gene_index], parent2_gradients[gene_index], fmix); + double gradient = parent_gradient * gradient_factor; + gene += gradient; + gene = clamp(gene, genes_min[gene_index], genes_max[gene_index]); + child_genes[gene_index] = gene; + child_gradients[gene_index] = mix(parent_gradient, gene - parent_gene, 0.3); + } + rr += (gene_count + 3) / 4 * 4; + // dm += (gene_count + 3) / 4 * 4; + + /*if(problem.tip_link_indices.size() > 1) + { + if(fast_random() < 0.5) + { + auto& mask = chain_mutation_masks[fast_random_index(chain_mutation_mask_count)]; + for(size_t gene_index = 0; gene_index < gene_count; gene_index++) + { + if(!mask[gene_index]) + { + child_genes[gene_index] = parent_genes[gene_index]; + child_gradients[gene_index] = parent_gradients[gene_index]; + } + } + } + }*/ + + for(auto quaternion_gene_index : quaternion_genes) + { + auto& qpos = (*(Quaternion*)&(children[child_index].genes[quaternion_gene_index])); + normalizeFast(qpos); + } + } + } + + void step() + { + FNPROFILER(); + + for(size_t ispecies = 0; ispecies < species.size(); ispecies++) + { + auto& species = this->species[ispecies]; + auto& population = species.individuals; + + { + BLOCKPROFILER("evolution"); + + // initialize forward kinematics approximator + genesToJointVariables(species.individuals[0], temp_joint_variables); + { + BLOCKPROFILER("fk"); + model.applyConfiguration(temp_joint_variables); + model.initializeMutationApproximator(problem.active_variables); + } + + // run evolution for a few generations + size_t generation_count = 16; + if(memetic) generation_count = 8; + for(size_t generation = 0; generation < generation_count; generation++) + { + // BLOCKPROFILER("evolution"); + + if(canceled) break; + + // reproduction + { + BLOCKPROFILER("reproduction"); + reproduce(population); + } + + size_t child_count = children.size(); + + // pre-selection by secondary objectives + if(problem.secondary_goals.size()) + { + BLOCKPROFILER("pre-selection"); + child_count = random_index(children.size() - population.size() - 1) + 1 + population.size(); + for(size_t child_index = population.size(); child_index < children.size(); child_index++) + { + children[child_index].fitness = computeSecondaryFitnessActiveVariables(children[child_index].genes.data()); + } + { + BLOCKPROFILER("pre-selection sort"); + std::sort(children.begin() + population.size(), children.end(), [](const Individual& a, const Individual& b) { return a.fitness < b.fitness; }); + } + } + + // keep parents + { + BLOCKPROFILER("keep alive"); + for(size_t i = 0; i < population.size(); i++) + { + children[i].genes = population[i].genes; + children[i].gradients = population[i].gradients; + } + } + + // genotype-phenotype mapping + { + BLOCKPROFILER("phenotype"); + size_t gene_count = children[0].genes.size(); + genotypes.resize(child_count); + for(size_t i = 0; i < child_count; i++) + genotypes[i] = children[i].genes.data(); + model.computeApproximateMutations(child_count, genotypes.data(), phenotypes); + } + + // fitness + { + BLOCKPROFILER("fitness"); + for(size_t child_index = 0; child_index < child_count; child_index++) + { + children[child_index].fitness = computeFitnessActiveVariables(phenotypes[child_index], genotypes[child_index]); + } + } + + // selection + { + BLOCKPROFILER("selection"); + child_indices.resize(child_count); + for(size_t i = 0; i < child_count; i++) + child_indices[i] = i; + for(size_t i = 0; i < population.size(); i++) + { + size_t jmin = i; + double fmin = children[child_indices[i]].fitness; + for(size_t j = i + 1; j < child_count; j++) + { + double f = children[child_indices[j]].fitness; + if(f < fmin) jmin = j, fmin = f; + } + std::swap(child_indices[i], child_indices[jmin]); + } + for(size_t i = 0; i < population.size(); i++) + { + std::swap(population[i].genes, children[child_indices[i]].genes); + std::swap(population[i].gradients, children[child_indices[i]].gradients); + } + } + } + } + + // memetic optimization + { + BLOCKPROFILER("memetics"); + + if(memetic == 'q' || memetic == 'l') + { + + // init + auto& individual = population[0]; + gradient.resize(problem.active_variables.size()); + if(genotypes.empty()) genotypes.emplace_back(); + phenotypes2.resize(1); + phenotypes3.resize(1); + + // differentiation step size + double dp = 0.0000001; + if(fast_random() < 0.5) dp = -dp; + + for(size_t generation = 0; generation < 8; generation++) + // for(size_t generation = 0; generation < 32; generation++) + { + + if(canceled) break; + + // compute gradient + temp = individual.genes; + genotypes[0] = temp.data(); + model.computeApproximateMutations(1, genotypes.data(), phenotypes2); + double f2p = computeFitnessActiveVariables(phenotypes2[0], genotypes[0]); + double fa = f2p + computeSecondaryFitnessActiveVariables(genotypes[0]); + for(size_t i = 0; i < problem.active_variables.size(); i++) + { + double* pp = &(genotypes[0][i]); + genotypes[0][i] = individual.genes[i] + dp; + model.computeApproximateMutation1(problem.active_variables[i], +dp, phenotypes2[0], phenotypes3[0]); + double fb = computeCombinedFitnessActiveVariables(phenotypes3[0], genotypes[0]); + genotypes[0][i] = individual.genes[i]; + double d = fb - fa; + gradient[i] = d; + } + + // normalize gradient + double sum = dp * dp; + for(size_t i = 0; i < problem.active_variables.size(); i++) + sum += fabs(gradient[i]); + double f = 1.0 / sum * dp; + for(size_t i = 0; i < problem.active_variables.size(); i++) + gradient[i] *= f; + + // sample support points for line search + for(size_t i = 0; i < problem.active_variables.size(); i++) + genotypes[0][i] = individual.genes[i] - gradient[i]; + model.computeApproximateMutations(1, genotypes.data(), phenotypes3); + double f1 = computeCombinedFitnessActiveVariables(phenotypes3[0], genotypes[0]); + + double f2 = fa; + + for(size_t i = 0; i < problem.active_variables.size(); i++) + genotypes[0][i] = individual.genes[i] + gradient[i]; + model.computeApproximateMutations(1, genotypes.data(), phenotypes3); + double f3 = computeCombinedFitnessActiveVariables(phenotypes3[0], genotypes[0]); + + // quadratic step size + if(memetic == 'q') + { + + // compute step size + double v1 = (f2 - f1); // f / j + double v2 = (f3 - f2); // f / j + double v = (v1 + v2) * 0.5; // f / j + double a = (v1 - v2); // f / j^2 + double step_size = v / a; // (f / j) / (f / j^2) = f / j / f * j * j = j + + // double v1 = (f2 - f1) / dp; + // double v2 = (f3 - f2) / dp; + // double v = (v1 + v2) * 0.5; + // double a = (v2 - v1) / dp; + // // v * x + a * x * x = 0; + // // v = - a * x + // // - v / a = x + // // x = -v / a; + // double step_size = -v / a / dp; + + // for(double f : { 1.0, 0.5, 0.25 }) + { + + double f = 1.0; + + // move by step size along gradient and compute fitness + for(size_t i = 0; i < problem.active_variables.size(); i++) + genotypes[0][i] = modelInfo.clip(individual.genes[i] + gradient[i] * step_size * f, problem.active_variables[i]); + model.computeApproximateMutations(1, genotypes.data(), phenotypes2); + double f4p = computeFitnessActiveVariables(phenotypes2[0], genotypes[0]); + + // accept new position if better + if(f4p < f2p) + { + individual.genes = temp; + continue; + } + else + { + break; + } + } + + // break; + } + + // linear step size + if(memetic == 'l') + { + + // compute step size + double cost_diff = (f3 - f1) * 0.5; // f / j + double step_size = f2 / cost_diff; // f / (f / j) = j + + // move by step size along gradient and compute fitness + for(size_t i = 0; i < problem.active_variables.size(); i++) + temp[i] = modelInfo.clip(individual.genes[i] - gradient[i] * step_size, problem.active_variables[i]); + model.computeApproximateMutations(1, genotypes.data(), phenotypes2); + double f4p = computeFitnessActiveVariables(phenotypes2[0], genotypes[0]); + + // accept new position if better + if(f4p < f2p) + { + individual.genes = temp; + continue; + } + else + { + break; + } + } + } + } + +#ifdef ENABLE_CPP_OPTLIB + // cppoptlib::LbfgsSolver memetic test + if(memetic == 'o') + { + auto& individual = population[0]; + + // create cppoptlib solver and cppoptlib problem, if not yet existing + if(!optlib_solver) + { + optlib_solver = std::make_shared(); + cppoptlib::Criteria crit; + crit.iterations = 4; + optlib_solver->setStopCriteria(crit); + optlib_problem = std::make_shared(this); + } + + // init starting point + optlib_vector.resize(problem.active_variables.size()); + for(size_t i = 0; i < problem.active_variables.size(); i++) + optlib_vector[i] = individual.genes[i]; + + // solve + optlib_solver->minimize(*optlib_problem, optlib_vector); + + // get result + for(size_t i = 0; i < problem.active_variables.size(); i++) + individual.genes[i] = modelInfo.clip(optlib_vector[i], problem.active_variables[i]); + } +#endif + } + } + + { + BLOCKPROFILER("species"); + + // compute species fitness + for(auto& species : this->species) + { + genesToJointVariables(species.individuals[0], temp_joint_variables); + double fitness = computeFitness(temp_joint_variables); + species.improved = (fitness != species.fitness); + species.fitness = fitness; + } + + // sort species by fitness + std::sort(species.begin(), species.end(), [](const Species& a, const Species& b) { return a.fitness < b.fitness; }); + + // wipeouts + for(size_t species_index = 1; species_index < species.size(); species_index++) + { + if(fast_random() < 0.1 || !species[species_index].improved) + // if(fast_random() < 0.05 || !species[species_index].improved) + { + { + auto& individual = species[species_index].individuals[0]; + + for(size_t i = 0; i < individual.genes.size(); i++) + individual.genes[i] = random(modelInfo.getMin(problem.active_variables[i]), modelInfo.getMax(problem.active_variables[i])); + + for(auto& v : individual.gradients) + v = 0; + } + for(size_t i = 0; i < species[species_index].individuals.size(); i++) + species[species_index].individuals[i] = species[species_index].individuals[0]; + } + } + + // update solution + if(species[0].fitness < solution_fitness) + { + genesToJointVariables(species[0].individuals[0], solution); + solution_fitness = species[0].fitness; + } + } + } + + // number of islands + virtual size_t concurrency() const { return 4; } +}; + +static IKFactory::Class> bio2("bio2"); +static IKFactory::Class> bio2_memetic("bio2_memetic"); +static IKFactory::Class> bio2_memetic_l("bio2_memetic_l"); + +#ifdef ENABLE_CPP_OPTLIB +static IKFactory::Class> bio2_memetic_0("bio2_memetic_lbfgs"); +#endif +} diff --git a/src/lib/bio_ik/src/ik_gradient.cpp b/src/lib/bio_ik/src/ik_gradient.cpp new file mode 100644 index 000000000..feb53c972 --- /dev/null +++ b/src/lib/bio_ik/src/ik_gradient.cpp @@ -0,0 +1,293 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +namespace bio_ik +{ + +// pseudoinverse jacobian solver +// (mainly for testing RobotFK_Jacobian::computeJacobian) +template struct IKJacobianBase : BASE +{ + using BASE::modelInfo; + using BASE::model; + using BASE::params; + using BASE::computeFitness; + using BASE::problem; + + std::vector tipObjectives; + + Eigen::VectorXd tip_diffs; + Eigen::VectorXd joint_diffs; + Eigen::MatrixXd jacobian; + std::vector tip_frames_temp; + + IKJacobianBase(const IKParams& p) + : BASE(p) + { + } + + void initialize(const Problem& problem) + { + BASE::initialize(problem); + tipObjectives.resize(problem.tip_link_indices.size()); + for(auto& goal : problem.goals) + tipObjectives[goal.tip_index] = goal.frame; + } + + void optimizeJacobian(std::vector& solution) + { + FNPROFILER(); + + int tip_count = problem.tip_link_indices.size(); + tip_diffs.resize(tip_count * 6); + joint_diffs.resize(problem.active_variables.size()); + + // compute fk + model.applyConfiguration(solution); + + double translational_scale = 1; + double rotational_scale = 1; + + // compute goal diffs + tip_frames_temp = model.getTipFrames(); + for(int itip = 0; itip < tip_count; itip++) + { + auto twist = frameTwist(tip_frames_temp[itip], tipObjectives[itip]); + tip_diffs(itip * 6 + 0) = twist.vel.x() * translational_scale; + tip_diffs(itip * 6 + 1) = twist.vel.y() * translational_scale; + tip_diffs(itip * 6 + 2) = twist.vel.z() * translational_scale; + tip_diffs(itip * 6 + 3) = twist.rot.x() * rotational_scale; + tip_diffs(itip * 6 + 4) = twist.rot.y() * rotational_scale; + tip_diffs(itip * 6 + 5) = twist.rot.z() * rotational_scale; + } + + // compute jacobian + { + model.computeJacobian(problem.active_variables, jacobian); + int icol = 0; + for(auto ivar : problem.active_variables) + { + for(size_t itip = 0; itip < tip_count; itip++) + { + jacobian(itip * 6 + 0, icol) *= translational_scale; + jacobian(itip * 6 + 1, icol) *= translational_scale; + jacobian(itip * 6 + 2, icol) *= translational_scale; + jacobian(itip * 6 + 3, icol) *= rotational_scale; + jacobian(itip * 6 + 4, icol) *= rotational_scale; + jacobian(itip * 6 + 5, icol) *= rotational_scale; + } + icol++; + } + } + + // get pseudoinverse and multiply + joint_diffs = jacobian.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(tip_diffs); + // joint_diffs = (jacobian.transpose() * jacobian).ldlt().solve(jacobian.transpose() * tip_diffs); + + // apply joint deltas and clip + { + int icol = 0; + for(auto ivar : problem.active_variables) + { + auto v = solution[ivar] + joint_diffs(icol); + if(!std::isfinite(v)) continue; + v = modelInfo.clip(v, ivar); + solution[ivar] = v; + icol++; + } + } + } +}; + +// simple gradient descent +template struct IKGradientDescent : IKBase +{ + std::vector solution, best_solution, gradient, temp; + bool reset; + + IKGradientDescent(const IKParams& p) + : IKBase(p) + { + } + + void initialize(const Problem& problem) + { + IKBase::initialize(problem); + solution = problem.initial_guess; + if(thread_index > 0) + for(auto& vi : problem.active_variables) + solution[vi] = random(modelInfo.getMin(vi), modelInfo.getMax(vi)); + best_solution = solution; + reset = false; + } + + const std::vector& getSolution() const { return best_solution; } + + void step() + { + // random reset if stuck + if(reset) + { + reset = false; + for(auto& vi : problem.active_variables) + solution[vi] = random(modelInfo.getMin(vi), modelInfo.getMax(vi)); + } + + // compute gradient direction + temp = solution; + double jd = 0.0001; + gradient.resize(solution.size(), 0); + for(auto ivar : problem.active_variables) + { + temp[ivar] = solution[ivar] - jd; + double p1 = computeFitness(temp); + + temp[ivar] = solution[ivar] + jd; + double p3 = computeFitness(temp); + + temp[ivar] = solution[ivar]; + + gradient[ivar] = p3 - p1; + } + + // normalize gradient direction + double sum = 0.0001; + for(auto ivar : problem.active_variables) + sum += fabs(gradient[ivar]); + double f = 1.0 / sum * jd; + for(auto ivar : problem.active_variables) + gradient[ivar] *= f; + + // initialize line search + temp = solution; + + for(auto ivar : problem.active_variables) + temp[ivar] = solution[ivar] - gradient[ivar]; + double p1 = computeFitness(temp); + + // for(auto ivar : problem.active_variables) temp[ivar] = solution[ivar]; + // double p2 = computeFitness(temp); + + for(auto ivar : problem.active_variables) + temp[ivar] = solution[ivar] + gradient[ivar]; + double p3 = computeFitness(temp); + + double p2 = (p1 + p3) * 0.5; + + // linear step size estimation + double cost_diff = (p3 - p1) * 0.5; + double joint_diff = p2 / cost_diff; + + // in case cost_diff is 0 + if(!std::isfinite(joint_diff)) + joint_diff = 0.0; + + // apply optimization step + // (move along gradient direction by estimated step size) + for(auto ivar : problem.active_variables) + temp[ivar] = modelInfo.clip(solution[ivar] - gradient[ivar] * joint_diff, ivar); + + if(if_stuck == 'c') + { + // always accept solution and continue + solution = temp; + } + else + { + // has solution improved? + if(computeFitness(temp) < computeFitness(solution)) + { + // solution improved -> accept solution + solution = temp; + } + else + { + if(if_stuck == 'r') + { + // reset if stuck + reset = true; + } + } + } + + // update best solution + if(computeFitness(solution) < computeFitness(best_solution)) best_solution = solution; + } + + size_t concurrency() const { return threads; } +}; + +static IKFactory::Class> gd("gd"); +static IKFactory::Class> gd_2("gd_2"); +static IKFactory::Class> gd_4("gd_4"); +static IKFactory::Class> gd_8("gd_8"); + +static IKFactory::Class> gd_r("gd_r"); +static IKFactory::Class> gd_2_r("gd_r_2"); +static IKFactory::Class> gd_4_r("gd_r_4"); +static IKFactory::Class> gd_8_r("gd_r_8"); + +static IKFactory::Class> gd_c("gd_c"); +static IKFactory::Class> gd_2_c("gd_c_2"); +static IKFactory::Class> gd_4_c("gd_c_4"); +static IKFactory::Class> gd_8_c("gd_c_8"); + +// pseudoinverse jacobian only +template struct IKJacobian : IKJacobianBase +{ + using IKBase::initialize; + std::vector solution; + IKJacobian(const IKParams& p) + : IKJacobianBase(p) + { + } + void initialize(const Problem& problem) + { + IKJacobianBase::initialize(problem); + solution = problem.initial_guess; + if(thread_index > 0) + for(auto& vi : problem.active_variables) + solution[vi] = random(modelInfo.getMin(vi), modelInfo.getMax(vi)); + } + const std::vector& getSolution() const { return solution; } + void step() { optimizeJacobian(solution); } + size_t concurrency() const { return threads; } +}; +static IKFactory::Class> jac("jac"); +static IKFactory::Class> jac_2("jac_2"); +static IKFactory::Class> jac_4("jac_4"); +static IKFactory::Class> jac_8("jac_8"); +} diff --git a/src/lib/bio_ik/src/ik_neural.cpp b/src/lib/bio_ik/src/ik_neural.cpp new file mode 100644 index 000000000..2f16c1da1 --- /dev/null +++ b/src/lib/bio_ik/src/ik_neural.cpp @@ -0,0 +1,690 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +#include +#include + +#include + +#define LOG_LIST(l) \ + { \ + LOG(#l "[]"); \ + for(std::size_t i = 0; i < l.size(); i++) \ + { \ + LOG(#l "[" + std::to_string(i) + "]", l[i]); \ + } \ + } + +namespace bio_ik +{ + +/* +static inline KDL::Twist toTwist(const Frame& frame) +{ + KDL::Twist t; + t.vel.x(frame.pos.x()); + t.vel.y(frame.pos.y()); + t.vel.z(frame.pos.z()); + auto r = frame.rot.getAxis() * frame.rot.getAngle(); + t.rot.x(r.x()); + t.rot.y(r.y()); + t.rot.z(r.z()); + return t; +} + +static inline KDL::Twist frameTwist(const Frame& a, const Frame& b) +{ + auto frame = inverse(a) * b; + KDL::Twist t; + t.vel.x(frame.pos.x()); + t.vel.y(frame.pos.y()); + t.vel.z(frame.pos.z()); + auto r = frame.rot.getAxis() * frame.rot.getAngle(); + t.rot.x(r.x()); + t.rot.y(r.y()); + t.rot.z(r.z()); + return t; +} +*/ + +struct IKNeural : IKBase +{ + std::vector solution; + FANN::neural_net net; + + std::vector> input_minmax, output_minmax; + + static void find_minmax(const std::vector& values, std::vector>& minmax) + { + for(size_t i = 0; i < minmax.size(); i++) + { + minmax[i] = std::make_pair(values[i], values[i]); + } + for(size_t i = 0; i < values.size(); i++) + { + auto& v = values[i]; + auto& p = minmax[i % minmax.size()]; + p.first = std::min(p.first, v); + p.second = std::max(p.second, v); + } + } + + static void normalize(std::vector& values, const std::vector>& minmax) + { + for(size_t i = 0; i < values.size(); i++) + { + auto& v = values[i]; + auto& p = minmax[i % minmax.size()]; + v = (v - p.first) / (p.second - p.first); + } + } + + static void denormalize(std::vector& values, const std::vector>& minmax) + { + for(size_t i = 0; i < values.size(); i++) + { + auto& v = values[i]; + auto& p = minmax[i % minmax.size()]; + v = v * (p.second - p.first) + p.first; + } + } + + unsigned int input_count, output_count; + + IKNeural(const IKParams& p) + : IKBase(p) + { + trained = false; + } + + bool trained; + + void train() + { + trained = true; + + input_count = problem.active_variables.size() + problem.tip_link_indices.size() * 6; + output_count = problem.active_variables.size(); + + LOG_VAR(input_count); + LOG_VAR(output_count); + + // std::vector levels = {input_count, input_count, input_count, output_count}; + + // std::vector levels = {input_count, input_count + output_count, output_count}; + + // std::vector levels = {input_count, input_count + output_count, input_count + output_count, output_count}; + + // std::vector levels = {input_count, 100, output_count}; + + std::vector levels = {input_count, 50, output_count}; + + net.create_standard_array(levels.size(), levels.data()); + + size_t var_count = params.robot_model->getVariableCount(); + std::vector state1(var_count), state2(var_count); + std::vector frames1, frames2; + + std::vector inputs, outputs; + std::vector input_pp, output_pp; + + LOG("neuro ik generating training data"); + + unsigned int samples = 10000; + + for(size_t iter = 0; iter < samples; iter++) + { + for(size_t ivar = 0; ivar < var_count; ivar++) + { + state1[ivar] = random(modelInfo.getMin(ivar), modelInfo.getMax(ivar)); + state1[ivar] = modelInfo.clip(state1[ivar], ivar); + // state2[ivar] = modelInfo.clip(state1[ivar] + random_gauss() * modelInfo.getSpan(ivar), ivar); + state2[ivar] = modelInfo.clip(state1[ivar] + random_gauss() * 0.1, ivar); + } + + model.applyConfiguration(state1); + frames1 = model.getTipFrames(); + model.applyConfiguration(state2); + frames2 = model.getTipFrames(); + + for(auto ivar : problem.active_variables) + { + inputs.push_back(state1[ivar]); + outputs.push_back(state2[ivar] - state1[ivar]); + } + + for(size_t itip = 0; itip < problem.tip_link_indices.size(); itip++) + { + double translational_scale = 1.0; + double rotational_scale = 1.0; + + // Frame diff = inverse(frames1[itip]) * frames2[itip]; + // auto twist = toTwist(diff); + auto twist = frameTwist(frames1[itip], frames2[itip]); + + inputs.push_back(frames2[itip].pos.x() - frames1[itip].pos.x()); + inputs.push_back(frames2[itip].pos.y() - frames1[itip].pos.y()); + inputs.push_back(frames2[itip].pos.z() - frames1[itip].pos.z()); + + inputs.push_back(twist.rot.x() * rotational_scale); + inputs.push_back(twist.rot.y() * rotational_scale); + inputs.push_back(twist.rot.z() * rotational_scale); + } + } + + for(auto& v : inputs) + if(!std::isfinite(v)) throw std::runtime_error("NAN"); + for(auto& v : outputs) + if(!std::isfinite(v)) throw std::runtime_error("NAN"); + + input_minmax.resize(input_count); + output_minmax.resize(output_count); + + find_minmax(inputs, input_minmax); + find_minmax(outputs, output_minmax); + + normalize(inputs, input_minmax); + normalize(outputs, output_minmax); + + for(size_t iter = 0; iter < samples; iter++) + { + input_pp.push_back(inputs.data() + iter * input_count); + output_pp.push_back(outputs.data() + iter * output_count); + } + + LOG("neuro ik training"); + + FANN::training_data train; + train.set_train_data(samples, input_count, input_pp.data(), output_count, output_pp.data()); + net.set_callback( + [](FANN::neural_net& net, FANN::training_data& train, unsigned int max_epochs, unsigned int epochs_between_reports, float desired_error, unsigned int epochs, void* user_data) { + if(epochs % epochs_between_reports != 0) return 0; + // LOG("training", epochs, "/", max_epochs, epochs * 100 / max_epochs, "%"); + LOG("training", epochs, net.get_MSE(), desired_error); + return 0; + }, + 0); + + net.set_activation_function_hidden(FANN::SIGMOID); + net.set_activation_function_output(FANN::SIGMOID); + + net.init_weights(train); + + net.train_on_data(train, 1000, 1, 0.0001); + + fann_type err = net.test_data(train); + LOG("neuro ik training error:", err); + + /*std::vector iiv, oov, ttv; + for(size_t iter = 0; iter < 10; iter++) + { + auto* ii = input_pp[iter]; + auto* oo = net.run(ii); + auto* tt = output_pp[iter]; + iiv.assign(ii, ii + input_count); + ttv.assign(tt, tt + output_count); + oov.assign(oo, oo + output_count); + LOG_LIST(iiv); + LOG_LIST(ttv); + LOG_LIST(oov); + }*/ + + LOG("training done"); + } + + size_t iterations = 0; + + void initialize(const Problem& problem) + { + static std::mutex mutex; + std::lock_guard lock(mutex); + IKBase::initialize(problem); + solution = problem.initial_guess; + if(!trained) train(); + iterations = 0; + if(thread_index > 0) + for(auto& vi : problem.active_variables) + solution[vi] = random(modelInfo.getMin(vi), modelInfo.getMax(vi)); + } + + const std::vector& getSolution() const { return solution; } + + std::vector inputs, outputs; + + std::vector tip_objectives; + + /*void step() + { + //if(iterations > 1) return; + iterations++; + + inputs.clear(); + for(auto ivar : problem.active_variables) + { + inputs.push_back(solution[ivar]); + } + + tip_objectives.resize(model.getTipFrames().size()); + for(auto& g : problem.goals) + { + tip_objectives[g.tip_index] = g.frame; + } + + model.applyConfiguration(solution); + auto& frames1 = model.getTipFrames(); + auto& frames2 = tip_objectives; + + double scale = 1.0; + + for(size_t itip = 0; itip < tip_objectives.size(); itip++) + { + double translational_scale = 1.0; + double rotational_scale = 1.0; + + //Frame diff = inverse(frames1[itip]) * frames2[itip]; + //auto twist = toTwist(diff); + auto twist = frameTwist(frames1[itip], frames2[itip]); + + auto dpos = frames2[itip].pos - frames1[itip].pos; + auto drot = Vector3( + twist.rot.x() * rotational_scale, + twist.rot.y() * rotational_scale, + twist.rot.z() * rotational_scale + ); + + scale = 1.0 / (0.0000001 + dpos.length() + drot.length()); + + dpos = dpos * scale; + drot = drot * scale; + + inputs.push_back(dpos.x()); + inputs.push_back(dpos.y()); + inputs.push_back(dpos.z()); + + inputs.push_back(drot.x()); + inputs.push_back(drot.y()); + inputs.push_back(drot.z()); + } + + normalize(inputs, input_minmax); + + auto* oo = net.run(inputs.data()); + + outputs.assign(oo, oo + output_count); + + denormalize(outputs, output_minmax); + + auto& vv = problem.active_variables; + for(size_t iout = 0; iout < vv.size(); iout++) + { + size_t ivar = vv[iout]; + solution[ivar] = modelInfo.clip(solution[ivar] + outputs[iout] * 0.1 / scale, ivar); + } + }*/ + + void step() + { + // if(iterations > 1) return; + iterations++; + + inputs.clear(); + for(auto ivar : problem.active_variables) + { + inputs.push_back(solution[ivar]); + } + + tip_objectives.resize(model.getTipFrames().size()); + for(auto& g : problem.goals) + { + tip_objectives[g.tip_index] = g.frame; + } + + model.applyConfiguration(solution); + auto& frames1 = model.getTipFrames(); + auto& frames2 = tip_objectives; + + double scale = 1.0; + for(size_t itip = 0; itip < tip_objectives.size(); itip++) + { + double translational_scale = 1.0; + double rotational_scale = 1.0; + auto twist = frameTwist(frames1[itip], frames2[itip]); + auto dpos = frames2[itip].pos - frames1[itip].pos; + auto drot = Vector3(twist.rot.x() * rotational_scale, twist.rot.y() * rotational_scale, twist.rot.z() * rotational_scale); + + /*if(iterations % 2) + { + scale = 1.0 / (0.0000001 + dpos.length()); + inputs.push_back(dpos.x() * scale); + inputs.push_back(dpos.y() * scale); + inputs.push_back(dpos.z() * scale); + inputs.push_back(0); + inputs.push_back(0); + inputs.push_back(0); + } else { + scale = 1.0 / (0.0000001 + drot.length()); + inputs.push_back(0); + inputs.push_back(0); + inputs.push_back(0); + inputs.push_back(drot.x() * scale); + inputs.push_back(drot.y() * scale); + inputs.push_back(drot.z() * scale); + }*/ + + { + scale = 1.0 / (0.0000001 + dpos.length() + drot.length()); + inputs.push_back(dpos.x() * scale); + inputs.push_back(dpos.y() * scale); + inputs.push_back(dpos.z() * scale); + inputs.push_back(drot.x() * scale); + inputs.push_back(drot.y() * scale); + inputs.push_back(drot.z() * scale); + } + } + normalize(inputs, input_minmax); + auto* oo = net.run(inputs.data()); + outputs.assign(oo, oo + output_count); + denormalize(outputs, output_minmax); + auto& vv = problem.active_variables; + for(size_t iout = 0; iout < vv.size(); iout++) + { + size_t ivar = vv[iout]; + solution[ivar] = modelInfo.clip(solution[ivar] + outputs[iout] * 1 / scale, ivar); + } + } +}; + +static IKFactory::Class neural("neural"); + +struct IKNeural2 : IKBase +{ + std::vector solution; + FANN::neural_net net; + + std::vector> input_minmax, output_minmax; + + /*static void find_minmax(const std::vector& values, std::vector>& minmax) + { + for(size_t i = 0; i < minmax.size(); i++) + { + minmax[i] = std::make_pair(values[i], values[i]); + } + for(size_t i = 0; i < values.size(); i++) + { + auto& v = values[i]; + auto& p = minmax[i % minmax.size()]; + p.first = std::min(p.first, v); + p.second = std::max(p.second, v); + } + }*/ + + static void find_minmax(const std::vector& values, std::vector>& minmax) + { + std::vector centers(minmax.size(), 0.0); + for(size_t i = 0; i < values.size(); i++) + centers[i % minmax.size()] += values[i] * (1.0 * minmax.size() / values.size()); + + std::vector ranges2(minmax.size(), 0.0001); + for(size_t i = 0; i < values.size(); i++) + { + double d = values[i] - centers[i % minmax.size()]; + d = d * d; + ranges2[i % minmax.size()] += d * (1.0 * minmax.size() / values.size()); + } + + for(size_t i = 0; i < minmax.size(); i++) + { + auto& p = minmax[i]; + p.first = centers[i] - sqrt(ranges2[i]); + p.second = centers[i] + sqrt(ranges2[i]); + } + } + + static void normalize(std::vector& values, const std::vector>& minmax) + { + for(size_t i = 0; i < values.size(); i++) + { + auto& v = values[i]; + auto& p = minmax[i % minmax.size()]; + v = (v - p.first) / (p.second - p.first); + } + } + + static void denormalize(std::vector& values, const std::vector>& minmax) + { + for(size_t i = 0; i < values.size(); i++) + { + auto& v = values[i]; + auto& p = minmax[i % minmax.size()]; + v = v * (p.second - p.first) + p.first; + } + } + + unsigned int input_count, output_count; + + IKNeural2(const IKParams& p) + : IKBase(p) + { + trained = false; + } + + bool trained; + + void train() + { + trained = true; + + input_count = problem.tip_link_indices.size() * 7; + output_count = problem.active_variables.size(); + + LOG_VAR(input_count); + LOG_VAR(output_count); + + // std::vector levels = {input_count, 100, 100, output_count}; + + // std::vector levels = {input_count, input_count, input_count, output_count}; + + std::vector levels = {input_count, input_count + output_count, output_count}; + + // std::vector levels = {input_count, input_count + output_count, input_count + output_count, output_count}; + + // std::vector levels = {input_count, output_count}; + + net.create_standard_array(levels.size(), levels.data()); + + size_t var_count = params.robot_model->getVariableCount(); + std::vector state = problem.initial_guess; + std::vector frames; + + std::vector inputs, outputs; + std::vector input_pp, output_pp; + + LOG("neuro ik generating training data"); + + unsigned int samples = 10000; + + for(size_t iter = 0; iter < samples; iter++) + { + for(size_t ivar : problem.active_variables) + state[ivar] = random(modelInfo.getMin(ivar), modelInfo.getMax(ivar)); + + model.applyConfiguration(state); + frames = model.getTipFrames(); + + for(auto ivar : problem.active_variables) + outputs.push_back(state[ivar]); + + for(size_t itip = 0; itip < problem.tip_link_indices.size(); itip++) + { + inputs.push_back(frames[itip].pos.x()); + inputs.push_back(frames[itip].pos.y()); + inputs.push_back(frames[itip].pos.z()); + + auto rot = frames[itip].rot; + rot = rot * rot; + // rot = tf2::Quaternion(0, 0, 0, 1); + inputs.push_back(rot.x()); + inputs.push_back(rot.y()); + inputs.push_back(rot.z()); + inputs.push_back(rot.w()); + } + } + + for(auto& v : inputs) + if(!std::isfinite(v)) throw std::runtime_error("NAN"); + for(auto& v : outputs) + if(!std::isfinite(v)) throw std::runtime_error("NAN"); + + input_minmax.resize(input_count); + output_minmax.resize(output_count); + + find_minmax(inputs, input_minmax); + find_minmax(outputs, output_minmax); + + normalize(inputs, input_minmax); + normalize(outputs, output_minmax); + + for(size_t iter = 0; iter < samples; iter++) + { + input_pp.push_back(inputs.data() + iter * input_count); + output_pp.push_back(outputs.data() + iter * output_count); + } + + LOG("neuro ik training"); + + FANN::training_data train; + train.set_train_data(samples, input_count, input_pp.data(), output_count, output_pp.data()); + net.set_callback( + [](FANN::neural_net& net, FANN::training_data& train, unsigned int max_epochs, unsigned int epochs_between_reports, float desired_error, unsigned int epochs, void* user_data) { + if(epochs % epochs_between_reports != 0) return 0; + // LOG("training", epochs, "/", max_epochs, epochs * 100 / max_epochs, "%"); + LOG("training", epochs, net.get_MSE(), desired_error); + return 0; + }, + 0); + + net.set_activation_function_hidden(FANN::SIGMOID); + net.set_activation_function_output(FANN::SIGMOID); + + net.init_weights(train); + + net.train_on_data(train, 100, 1, 0.0001); + + fann_type err = net.test_data(train); + LOG("neuro ik training error:", err); + + /*std::vector iiv, oov, ttv; + for(size_t iter = 0; iter < 10; iter++) + { + auto* ii = input_pp[iter]; + auto* oo = net.run(ii); + auto* tt = output_pp[iter]; + iiv.assign(ii, ii + input_count); + ttv.assign(tt, tt + output_count); + oov.assign(oo, oo + output_count); + LOG_LIST(iiv); + LOG_LIST(ttv); + LOG_LIST(oov); + }*/ + + LOG("training done"); + } + + size_t iterations = 0; + + void initialize(const Problem& problem) + { + IKBase::initialize(problem); + solution = problem.initial_guess; + if(!trained) train(); + iterations = 0; + } + + const std::vector& getSolution() const { return solution; } + + std::vector inputs, outputs; + + std::vector tip_objectives; + + void step() + { + if(iterations > 1) return; + iterations++; + + inputs.clear(); + + tip_objectives.resize(model.getTipFrames().size()); + for(auto& g : problem.goals) + { + tip_objectives[g.tip_index] = g.frame; + } + + auto& frames = tip_objectives; + + for(size_t itip = 0; itip < tip_objectives.size(); itip++) + { + inputs.push_back(frames[itip].pos.x()); + inputs.push_back(frames[itip].pos.y()); + inputs.push_back(frames[itip].pos.z()); + + auto rot = frames[itip].rot; + rot = rot * rot; + // rot = tf2::Quaternion(0, 0, 0, 1); + inputs.push_back(rot.x()); + inputs.push_back(rot.y()); + inputs.push_back(rot.z()); + inputs.push_back(rot.w()); + } + + normalize(inputs, input_minmax); + + auto* oo = net.run(inputs.data()); + + outputs.assign(oo, oo + output_count); + + denormalize(outputs, output_minmax); + + auto& vv = problem.active_variables; + for(size_t iout = 0; iout < vv.size(); iout++) + { + size_t ivar = vv[iout]; + solution[ivar] = modelInfo.clip(outputs[iout], ivar); + } + } +}; + +static IKFactory::Class neural2("neural2"); +} diff --git a/src/lib/bio_ik/src/ik_parallel.hpp b/src/lib/bio_ik/src/ik_parallel.hpp new file mode 100644 index 000000000..e5640ed40 --- /dev/null +++ b/src/lib/bio_ik/src/ik_parallel.hpp @@ -0,0 +1,278 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +#include + +namespace bio_ik +{ + +// executes a function in parallel on pre-allocated threads +class ParallelExecutor +{ + std::function fun; + std::vector threads; + boost::barrier barrier; + volatile bool exit; + double best_fitness; + +public: + template + ParallelExecutor(size_t thread_count, const FUN& f) + : exit(false) + , threads(thread_count) + , fun(f) + , barrier(thread_count) + { + for(size_t i = 1; i < thread_count; i++) + { + std::thread t([this, i]() { + while(true) + { + barrier.wait(); + if(exit) break; + fun(i); + barrier.wait(); + if(exit) break; + } + }); + std::swap(t, threads[i]); + } + } + ~ParallelExecutor() + { + exit = true; + barrier.wait(); + for(auto& t : threads) + if(t.joinable()) t.join(); + } + void run() + { + barrier.wait(); + fun(0); + barrier.wait(); + } +}; + +// runs ik on multiple threads until a stop criterion is met +struct IKParallel +{ + IKParams params; + std::vector> solvers; + std::vector> solver_solutions; + std::vector> solver_temps; + std::vector solver_success; + std::vector solver_fitness; + int thread_count; + // std::vector fk; // TODO: remove + std::chrono::time_point> timeout; + bool success; + std::atomic finished; + std::atomic iteration_count; + std::vector result; + std::unique_ptr par; + Problem problem; + bool enable_counter; + double best_fitness; + + IKParallel(const IKParams& params) + : params(params) + { + // solver class name + std::string name = params.solver_class_name; + + enable_counter = params.enable_counter; + + // create solvers + solvers.emplace_back(IKFactory::create(name, params)); + thread_count = solvers.front()->concurrency(); + if(params.thread_count) { + thread_count = params.thread_count; + } + while(solvers.size() < thread_count) + solvers.emplace_back(IKFactory::clone(solvers.front().get())); + for(size_t i = 0; i < thread_count; i++) + solvers[i]->thread_index = i; + + // while(fk.size() < thread_count) fk.emplace_back(params.robot_model); + + // init buffers + solver_solutions.resize(thread_count); + solver_temps.resize(thread_count); + solver_success.resize(thread_count); + solver_fitness.resize(thread_count); + + // create parallel executor + par.reset(new ParallelExecutor(thread_count, [this](size_t i) { solverthread(i); })); + } + + void initialize(const Problem& problem) + { + this->problem = problem; + // for(auto& f : fk) f.initialize(problem.tip_link_indices); + } + +private: + void solverthread(size_t i) + { + THREADPROFILER("thread", i); + COUNTERPROFILER("solver threads"); + + // initialize ik solvers + { + BLOCKPROFILER("ik solver init"); + solvers[i]->initialize(problem); + } + + // run solver iterations until solution found or timeout + for(size_t iteration = 0; (std::chrono::system_clock::now() < timeout && finished == 0) || (iteration == 0 && i == 0); iteration++) + { + if(finished) break; + + // run solver for a few steps + solvers[i]->step(); + iteration_count++; + for(int it2 = 1; it2 < 4; it2++) + if(std::chrono::system_clock::now() < timeout && finished == 0) solvers[i]->step(); + + if(finished) break; + + // get solution and check stop criterion + auto& result = solver_temps[i]; + result = solvers[i]->getSolution(); + auto& fk = solvers[i]->model; + fk.applyConfiguration(result); + bool success = solvers[i]->checkSolution(result, fk.getTipFrames()); + if(success) finished = 1; + solver_success[i] = success; + solver_solutions[i] = result; + solver_fitness[i] = solvers[i]->computeFitness(result, fk.getTipFrames()); + + if(success) break; + } + + finished = 1; + + for(auto& s : solvers) + s->canceled = true; + } + +public: + void solve() + { + BLOCKPROFILER("solve mt"); + + // prepare + iteration_count = 0; + result = problem.initial_guess; + timeout = problem.timeout; + success = false; + finished = 0; + for(auto& s : solver_solutions) + s = problem.initial_guess; + for(auto& s : solver_temps) + s = problem.initial_guess; + for(auto& s : solver_success) + s = 0; + for(auto& f : solver_fitness) + f = DBL_MAX; + for(auto& s : solvers) + s->canceled = false; + + // run solvers + { + BLOCKPROFILER("solve mt 2"); + par->run(); + } + + size_t best_index = 0; + best_fitness = DBL_MAX; + + // if exact primary goal matches have been found ... + for(size_t i = 0; i < thread_count; i++) + { + if(solver_success[i]) + { + double fitness; + if(solvers[0]->problem.secondary_goals.empty()) + { + // ... and if no secondary goals have been specified, + // select the best result according to primary goals + fitness = solver_fitness[i]; + } + else + { + // ... and if secondary goals have been specified, + // select the result that best satisfies primary and secondary goals + fitness = solver_fitness[i] + solvers[0]->computeSecondaryFitnessAllVariables(solver_solutions[i]); + } + if(fitness < best_fitness) + { + best_fitness = fitness; + best_index = i; + } + } + } + + // if no exact primary goal matches have been found, + // select best primary goal approximation + if(best_fitness == DBL_MAX) + { + for(size_t i = 0; i < thread_count; i++) + { + if(solver_fitness[i] < best_fitness) + { + best_fitness = solver_fitness[i]; + best_index = i; + } + } + } + + if(enable_counter) + { + LOG("iterations", iteration_count); + } + + result = solver_solutions[best_index]; + success = solver_success[best_index]; + } + + double getSolutionFitness() const { return best_fitness; } + + bool getSuccess() const { return success; } + + const std::vector& getSolution() const { return result; } +}; +} diff --git a/src/lib/bio_ik/src/ik_test.cpp b/src/lib/bio_ik/src/ik_test.cpp new file mode 100644 index 000000000..9a8228d76 --- /dev/null +++ b/src/lib/bio_ik/src/ik_test.cpp @@ -0,0 +1,137 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +namespace bio_ik +{ + +struct IKTest : IKBase +{ + + RobotFK_MoveIt fkref; + + std::vector temp; + + double d_rot_sum, d_pos_sum, d_div; + + IKTest(const IKParams& params) + : IKBase(params) + , fkref(params.robot_model) + { + d_rot_sum = d_pos_sum = d_div = 0; + } + + /*double tipdiff(const std::vector& fa, const std::vector& fb) + { + double diff = 0.0; + for(size_t i = 0; i < problem.tip_link_indices.size(); i++) + { + //LOG_VAR(fa[i]); + //LOG_VAR(fb[i]); + diff += fa[i].rot.angleShortestPath(fb[i].rot); + diff += fa[i].pos.distance(fb[i].pos); + } + return diff; + }*/ + + void initialize(const Problem& problem) + { + IKBase::initialize(problem); + + fkref.initialize(problem.tip_link_indices); + model.initialize(problem.tip_link_indices); + + fkref.applyConfiguration(problem.initial_guess); + model.applyConfiguration(problem.initial_guess); + + // double diff = tipdiff(fkref.getTipFrames(), model.getTipFrames()); + // LOG_VAR(diff); + + /*{ + auto& fa = fkref.getTipFrames(); + auto& fb = model.getTipFrames(); + for(size_t i = 0; i < problem.tip_link_indices.size(); i++) + { + LOG("d rot", i, fa[i].rot.angleShortestPath(fb[i].rot)); + LOG("d pos", i, fa[i].pos.distance(fb[i].pos)); + } + }*/ + + { + temp = problem.initial_guess; + for(size_t ivar : problem.active_variables) + if(modelInfo.isRevolute(ivar) || modelInfo.isPrismatic(ivar)) temp[ivar] = modelInfo.clip(temp[ivar] + random(-0.1, 0.1), ivar); + + fkref.applyConfiguration(temp); + auto& fa = fkref.getTipFrames(); + + model.applyConfiguration(problem.initial_guess); + model.initializeMutationApproximator(problem.active_variables); + + std::vector> fbm; + + std::vector mutation_values; + for(size_t ivar : problem.active_variables) + mutation_values.push_back(temp[ivar]); + const double* mutation_ptr = mutation_values.data(); + + model.computeApproximateMutations(1, &mutation_ptr, fbm); + + auto& fb = fbm[0]; + + // auto& fb = model.getTipFrames(); + + for(size_t i = 0; i < problem.tip_link_indices.size(); i++) + { + // LOG("d rot", i, fa[i].rot.angleShortestPath(fb[i].rot)); + // LOG("d pos", i, fa[i].pos.distance(fb[i].pos)); + + d_rot_sum += fa[i].rot.angleShortestPath(fb[i].rot); + d_pos_sum += fa[i].pos.distance(fb[i].pos); + d_div += 1; + } + } + + LOG("d rot avg", d_rot_sum / d_div); + LOG("d pos avg", d_pos_sum / d_div); + } + + void step() {} + + const std::vector& getSolution() const { return problem.initial_guess; } +}; + +static IKFactory::Class test("test"); +} diff --git a/src/lib/bio_ik/src/kinematics_plugin.cpp b/src/lib/bio_ik/src/kinematics_plugin.cpp new file mode 100644 index 000000000..16ff12cdb --- /dev/null +++ b/src/lib/bio_ik/src/kinematics_plugin.cpp @@ -0,0 +1,616 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include + +#include "forward_kinematics.hpp" +#include "ik_base.hpp" +#include "ik_parallel.hpp" +#include "problem.hpp" +#include "utils.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +//#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +using namespace bio_ik; + +// implement BioIKKinematicsQueryOptions + +namespace bio_ik { + +std::mutex bioIKKinematicsQueryOptionsMutex; +std::unordered_set bioIKKinematicsQueryOptionsList; + +BioIKKinematicsQueryOptions::BioIKKinematicsQueryOptions() + : replace(false), solution_fitness(0) { + std::lock_guard lock(bioIKKinematicsQueryOptionsMutex); + bioIKKinematicsQueryOptionsList.insert(this); +} + +BioIKKinematicsQueryOptions::~BioIKKinematicsQueryOptions() { + std::lock_guard lock(bioIKKinematicsQueryOptionsMutex); + bioIKKinematicsQueryOptionsList.erase(this); +} + +bool isBioIKKinematicsQueryOptions(const void *ptr) { + std::lock_guard lock(bioIKKinematicsQueryOptionsMutex); + return bioIKKinematicsQueryOptionsList.find(ptr) != + bioIKKinematicsQueryOptionsList.end(); +} + +const BioIKKinematicsQueryOptions * +toBioIKKinematicsQueryOptions(const void *ptr) { + if (isBioIKKinematicsQueryOptions(ptr)) + return (const BioIKKinematicsQueryOptions *)ptr; + else + return 0; +} + +} // namespace bio_ik + +// BioIK Kinematics Plugin + +namespace bio_ik_kinematics_plugin { + +struct BioIKKinematicsPlugin : kinematics::KinematicsBase { + std::vector joint_names, link_names; + const moveit::core::JointModelGroup *joint_model_group; + mutable std::unique_ptr ik; + mutable std::vector state, temp; + mutable std::unique_ptr temp_state; + mutable std::vector tipFrames; + RobotInfo robot_info; + bool enable_profiler; + + BioIKKinematicsPlugin() { enable_profiler = false; } + + virtual const std::vector &getJointNames() const { + LOG_FNC(); + return joint_names; + } + + virtual const std::vector &getLinkNames() const { + LOG_FNC(); + return link_names; + } + + virtual bool getPositionFK(const std::vector &link_names, + const std::vector &joint_angles, + std::vector &poses) const { + LOG_FNC(); + return false; + } + + virtual bool getPositionIK(const geometry_msgs::msg::Pose &ik_pose, + const std::vector &ik_seed_state, + std::vector &solution, + moveit_msgs::msg::MoveItErrorCodes &error_code, + const kinematics::KinematicsQueryOptions &options = + kinematics::KinematicsQueryOptions()) const { + LOG_FNC(); + return false; + } + + EigenSTL::vector_Isometry3d tip_reference_frames; + + mutable std::vector> default_goals; + mutable std::vector> moveit_cost_fn_goals; + + mutable std::vector all_goals; + + IKParams ikparams; + + mutable Problem problem; + + template + void getRosParam(const std::string ¶m, T &val, const T &default_val) + { + const std::string prefix = "robot_description_kinematics." + group_name_ + "."; + if (!node_->has_parameter(prefix + param)) + { + val = node_->declare_parameter(prefix + param, rclcpp::ParameterValue{default_val}).get(); + return; + } + val = node_->get_parameter(prefix + param).get_value(); + } + + bool load(std::string group_name) { + LOG_FNC(); + + LOG("bio ik init", node_->getName()); + + joint_model_group = robot_model_->getJointModelGroup(group_name); + if (!joint_model_group) { + LOG("failed to get joint model group"); + return false; + } + + joint_names.clear(); + + for (auto *joint_model : joint_model_group->getJointModels()) + if (joint_model->getName() != base_frame_ && + joint_model->getType() != moveit::core::JointModel::UNKNOWN && + joint_model->getType() != moveit::core::JointModel::FIXED) + joint_names.push_back(joint_model->getName()); + + auto tips2 = tip_frames_; + joint_model_group->getEndEffectorTips(tips2); + if (!tips2.empty()) + tip_frames_ = tips2; + + link_names = tip_frames_; + + // bool enable_profiler; + getRosParam("profiler", enable_profiler, false); + // if(enable_profiler) Profiler::start(); + + robot_info = RobotInfo(robot_model_); + + ikparams.robot_model = robot_model_; + ikparams.joint_model_group = joint_model_group; + + // initialize parameters for IKParallel + getRosParam("mode", ikparams.solver_class_name, + std::string("bio2_memetic")); + getRosParam("counter", ikparams.enable_counter, false); + getRosParam("threads", ikparams.thread_count, 0); + getRosParam("random_seed", ikparams.random_seed, static_cast(std::random_device()())); + + // initialize parameters for Problem + getRosParam("dpos", ikparams.dpos, DBL_MAX); + getRosParam("drot", ikparams.drot, DBL_MAX); + getRosParam("dtwist", ikparams.dtwist, 1e-5); + + // initialize parameters for ik_evolution_1 + getRosParam("no_wipeout", ikparams.opt_no_wipeout, false); + getRosParam("population_size", ikparams.population_size, 8); + getRosParam("elite_count", ikparams.elite_count, 4); + getRosParam("linear_fitness", ikparams.linear_fitness, false); + + temp_state.reset(new moveit::core::RobotState(robot_model_)); + + ik.reset(new IKParallel(ikparams)); + + { + + BLOCKPROFILER("default ik goals"); + + default_goals.clear(); + + for (size_t i = 0; i < tip_frames_.size(); i++) { + PoseGoal *goal = new PoseGoal(); + + goal->setLinkName(tip_frames_[i]); + + // LOG_VAR(goal->link_name); + + double rotation_scale = 0.5; + + getRosParam("rotation_scale", rotation_scale, rotation_scale); + + bool position_only_ik = false; + getRosParam("position_only_ik", position_only_ik, position_only_ik); + if (position_only_ik) + rotation_scale = 0; + + goal->setRotationScale(rotation_scale); + + default_goals.emplace_back(goal); + } + + { + double weight = 0; + getRosParam("center_joints_weight", weight, weight); + if (weight > 0.0) { + auto *center_joints_goal = new bio_ik::CenterJointsGoal(); + center_joints_goal->setWeight(weight); + default_goals.emplace_back(center_joints_goal); + } + } + + { + double weight = 0; + getRosParam("avoid_joint_limits_weight", weight, weight); + if (weight > 0.0) { + auto *avoid_joint_limits_goal = new bio_ik::AvoidJointLimitsGoal(); + avoid_joint_limits_goal->setWeight(weight); + default_goals.emplace_back(avoid_joint_limits_goal); + } + } + + { + double weight = 0; + getRosParam("minimal_displacement_weight", weight, weight); + if (weight > 0.0) { + auto *minimal_displacement_goal = + new bio_ik::MinimalDisplacementGoal(); + minimal_displacement_goal->setWeight(weight); + default_goals.emplace_back(minimal_displacement_goal); + } + } + } + + // LOG("init ready"); + + return true; + } + + virtual bool initialize(const rclcpp::Node::SharedPtr &node, + const moveit::core::RobotModel &robot_model, + const std::string &group_name, + const std::string &base_frame, + const std::vector &tip_frames, + double search_discretization) { + LOG_FNC(); + node_ = node; + storeValues(robot_model, group_name, base_frame, tip_frames, + search_discretization); + return load(group_name); + } + + virtual bool + searchPositionIK(const geometry_msgs::msg::Pose &ik_pose, + const std::vector &ik_seed_state, double timeout, + std::vector &solution, + moveit_msgs::msg::MoveItErrorCodes &error_code, + const kinematics::KinematicsQueryOptions &options = + kinematics::KinematicsQueryOptions()) const { + LOG_FNC(); + return searchPositionIK(std::vector{ik_pose}, + ik_seed_state, timeout, std::vector(), + solution, IKCallbackFn(), error_code, options); + } + + virtual bool + searchPositionIK(const geometry_msgs::msg::Pose &ik_pose, + const std::vector &ik_seed_state, double timeout, + const std::vector &consistency_limits, + std::vector &solution, + moveit_msgs::msg::MoveItErrorCodes &error_code, + const kinematics::KinematicsQueryOptions &options = + kinematics::KinematicsQueryOptions()) const { + LOG_FNC(); + return searchPositionIK(std::vector{ik_pose}, + ik_seed_state, timeout, consistency_limits, + solution, IKCallbackFn(), error_code, options); + } + + virtual bool + searchPositionIK(const geometry_msgs::msg::Pose &ik_pose, + const std::vector &ik_seed_state, double timeout, + std::vector &solution, + const IKCallbackFn &solution_callback, + moveit_msgs::msg::MoveItErrorCodes &error_code, + const kinematics::KinematicsQueryOptions &options = + kinematics::KinematicsQueryOptions()) const { + LOG_FNC(); + return searchPositionIK(std::vector{ik_pose}, + ik_seed_state, timeout, std::vector(), + solution, solution_callback, error_code, options); + } + + virtual bool + searchPositionIK(const geometry_msgs::msg::Pose &ik_pose, + const std::vector &ik_seed_state, double timeout, + const std::vector &consistency_limits, + std::vector &solution, + const IKCallbackFn &solution_callback, + moveit_msgs::msg::MoveItErrorCodes &error_code, + const kinematics::KinematicsQueryOptions &options = + kinematics::KinematicsQueryOptions()) const { + LOG_FNC(); + return searchPositionIK(std::vector{ik_pose}, + ik_seed_state, timeout, consistency_limits, + solution, solution_callback, error_code, options); + } + + /*struct OptMod : kinematics::KinematicsQueryOptions + { + int test; + };*/ + + bool + searchPositionIK(const std::vector& ik_poses, const std::vector& ik_seed_state, + double timeout, const std::vector& consistency_limits, std::vector& solution, + const IKCallbackFn& solution_callback, const IKCostFn& cost_function, moveit_msgs::msg::MoveItErrorCodes& error_code, + const kinematics::KinematicsQueryOptions& options = kinematics::KinematicsQueryOptions(), + const moveit::core::RobotState* context_state = nullptr) const override + { + moveit_cost_fn_goals.clear(); + // make sure we aren't trying to call an empty function later + if (cost_function) + { + for (const auto& p : ik_poses) + { + moveit_cost_fn_goals.emplace_back(std::make_unique(p, cost_function, robot_model_)); + } + } + return searchPositionIK(ik_poses, ik_seed_state, timeout, consistency_limits, solution, solution_callback, + error_code, options, context_state); + } + + virtual bool + searchPositionIK(const std::vector &ik_poses, + const std::vector &ik_seed_state, double timeout, + const std::vector &consistency_limits, + std::vector &solution, + const IKCallbackFn &solution_callback, + moveit_msgs::msg::MoveItErrorCodes &error_code, + const kinematics::KinematicsQueryOptions &options = + kinematics::KinematicsQueryOptions(), + const moveit::core::RobotState *context_state = NULL) const { + std::chrono::time_point> t0 = std::chrono::system_clock::now(); + + if (enable_profiler) + Profiler::start(); + + auto *bio_ik_options = toBioIKKinematicsQueryOptions(&options); + + LOG_FNC(); + + FNPROFILER(); + + // get variable default positions / context state + state.resize(robot_model_->getVariableCount()); + if (context_state) + for (size_t i = 0; i < robot_model_->getVariableCount(); i++) + state[i] = context_state->getVariablePositions()[i]; + else + robot_model_->getVariableDefaultPositions(state); + + // overwrite used variables with seed state + solution = ik_seed_state; + { + int i = 0; + for (auto &joint_name : getJointNames()) { + auto *joint_model = robot_model_->getJointModel(joint_name); + if (!joint_model) + continue; + for (size_t vi = 0; vi < joint_model->getVariableCount(); vi++) + state.at(joint_model->getFirstVariableIndex() + vi) = + solution.at(i++); + } + } + + if (!bio_ik_options || !bio_ik_options->replace) { + // transform tips to baseframe + tipFrames.clear(); + for (size_t i = 0; i < ik_poses.size(); i++) { + Eigen::Isometry3d p, r; + tf2::fromMsg(ik_poses[i], p); + if (context_state) { + r = context_state->getGlobalLinkTransform(getBaseFrame()); + } else { + if (i == 0) + temp_state->setToDefaultValues(); + r = temp_state->getGlobalLinkTransform(getBaseFrame()); + } + tipFrames.emplace_back(r * p); + } + } + + // init ik + + problem.timeout = t0 + std::chrono::duration(timeout); + problem.initial_guess = state; + + // for(auto& v : state) LOG("var", &v - &state.front(), v); + + // problem.tip_objectives = tipFrames; + + /*for(size_t i = 0; i < problem.goals.size(); i++) + { + problem.goals[i].frame = tipFrames[i]; + }*/ + + // LOG("---"); + + /*{ + BLOCKPROFILER("ik goals"); + std::vector> goals; + for(size_t i = 0; i < tip_frames_.size(); i++) + { + //if(rand() % 2) break; + PoseGoal* goal = new PoseGoal(); + goal->link_name = tip_frames_[i]; + goal->position = tipFrames[i].pos; + goal->orientation = tipFrames[i].rot; + goals.emplace_back(goal); + //if(rand() % 20) break; + } + //std::random_shuffle(goals.begin(), goals.end()); + //LOG_VAR(goals.size()); + setRequestGoals(problem, goals, ikparams); + }*/ + + { + + if (!bio_ik_options || !bio_ik_options->replace) { + for (size_t i = 0; i < tip_frames_.size(); i++) { + auto *goal = (PoseGoal *)default_goals[i].get(); + goal->setPosition(tipFrames[i].pos); + goal->setOrientation(tipFrames[i].rot); + } + } + + all_goals.clear(); + + if (!bio_ik_options || !bio_ik_options->replace) + for (auto &goal : default_goals) + all_goals.push_back(goal.get()); + + if (bio_ik_options) + for (auto &goal : bio_ik_options->goals) + all_goals.push_back(goal.get()); + + for (const auto& goal : moveit_cost_fn_goals) + all_goals.push_back(goal.get()); + + { + BLOCKPROFILER("problem init"); + problem.initialize(ikparams.robot_model, ikparams.joint_model_group, + ikparams, all_goals, bio_ik_options); + // problem.setGoals(default_goals, ikparams); + } + } + + { + BLOCKPROFILER("ik init"); + ik->initialize(problem); + } + + // run ik solver + { + BLOCKPROFILER("ik_solve"); + ik->solve(); + } + + // get solution + state = ik->getSolution(); + + // wrap angles + for (auto ivar : problem.active_variables) { + auto v = state[ivar]; + if (robot_info.isRevolute(ivar) && + robot_model_->getMimicJointModels().empty()) { + auto r = problem.initial_guess[ivar]; + auto lo = robot_info.getMin(ivar); + auto hi = robot_info.getMax(ivar); + + // move close to initial guess + if (r < v - M_PI || r > v + M_PI) { + v -= r; + v /= (2 * M_PI); + v += 0.5; + v -= std::floor(v); + v -= 0.5; + v *= (2 * M_PI); + v += r; + } + + // wrap at joint limits + if (v > hi) + v -= std::ceil(std::max(0.0, v - hi) / (2 * M_PI)) * (2 * M_PI); + if (v < lo) + v += std::ceil(std::max(0.0, lo - v) / (2 * M_PI)) * (2 * M_PI); + + // clamp at edges + if (v < lo) + v = lo; + if (v > hi) + v = hi; + } + state[ivar] = v; + } + + // wrap angles + robot_model_->enforcePositionBounds(state.data()); + + // map result to jointgroup variables + { + solution.clear(); + for (auto &joint_name : getJointNames()) { + auto *joint_model = robot_model_->getJointModel(joint_name); + if (!joint_model) + continue; + for (size_t vi = 0; vi < joint_model->getVariableCount(); vi++) + solution.push_back( + state.at(joint_model->getFirstVariableIndex() + vi)); + } + } + + // set solution fitness + if (bio_ik_options) { + bio_ik_options->solution_fitness = ik->getSolutionFitness(); + } + + // return an error if an accurate solution was requested, but no accurate + // solution was found + if (!ik->getSuccess() && !options.return_approximate_solution) { + error_code.val = error_code.NO_IK_SOLUTION; + return false; + } + + // callback? + if (solution_callback) { + // run callback + solution_callback(ik_poses.front(), solution, error_code); + + // return success if callback has accepted the solution + return error_code.val == error_code.SUCCESS; + } else { + // return success + error_code.val = error_code.SUCCESS; + return true; + } + } + + virtual bool supportsGroup(const moveit::core::JointModelGroup *jmg, + std::string *error_text_out = 0) const { + LOG_FNC(); + // LOG_VAR(jmg->getName()); + return true; + } +}; +} // namespace bio_ik_kinematics_plugin + +// register plugin + +#undef LOG +#undef ERROR +PLUGINLIB_EXPORT_CLASS(bio_ik_kinematics_plugin::BioIKKinematicsPlugin, + kinematics::KinematicsBase); diff --git a/src/lib/bio_ik/src/problem.cpp b/src/lib/bio_ik/src/problem.cpp new file mode 100644 index 000000000..b4dfb322c --- /dev/null +++ b/src/lib/bio_ik/src/problem.cpp @@ -0,0 +1,342 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#include "ik_base.hpp" + +#include +#include + +#include + +#include + +#include + +namespace bio_ik +{ + +enum class Problem::GoalType +{ + Unknown, + Position, + Orientation, + Pose, +}; + +size_t Problem::addTipLink(const moveit::core::LinkModel* link_model) +{ + if(link_tip_indices[link_model->getLinkIndex()] < 0) + { + link_tip_indices[link_model->getLinkIndex()] = tip_link_indices.size(); + tip_link_indices.push_back(link_model->getLinkIndex()); + } + return link_tip_indices[link_model->getLinkIndex()]; +} + +Problem::Problem() + : ros_params_initrd(false) +{ +} + +void Problem::initialize(moveit::core::RobotModelConstPtr robot_model, const moveit::core::JointModelGroup* joint_model_group, const IKParams& params, const std::vector& goals2, const BioIKKinematicsQueryOptions* options) +{ + if(robot_model != this->robot_model) + { + modelInfo = RobotInfo(robot_model); +#if (MOVEIT_FCL_VERSION < FCL_VERSION_CHECK(0, 6, 0)) + collision_links.clear(); + collision_links.resize(robot_model->getLinkModelCount()); +#endif + } + + this->robot_model = robot_model; + this->joint_model_group = joint_model_group; + this->params = params; + + if(!ros_params_initrd) + { + ros_params_initrd = true; + dpos = params.dpos; + drot = params.drot; + dtwist = params.dtwist; + if(dpos < 0.0 || dpos >= FLT_MAX || !std::isfinite(dpos)) dpos = DBL_MAX; + if(drot < 0.0 || drot >= FLT_MAX || !std::isfinite(drot)) drot = DBL_MAX; + if(dtwist < 0.0 || dtwist >= FLT_MAX || !std::isfinite(dtwist)) dtwist = DBL_MAX; + } + + link_tip_indices.clear(); + link_tip_indices.resize(robot_model->getLinkModelCount(), -1); + tip_link_indices.clear(); + + active_variables.clear(); + auto addActiveVariable = [this, robot_model, joint_model_group, options](const std::string& name) -> ssize_t { + if(options) + { + auto& joint_name = robot_model->getJointOfVariable(name)->getName(); + for(auto& fixed_joint_name : options->fixed_joints) + { + if(fixed_joint_name == joint_name) + { + return (ssize_t)-1 - (ssize_t)robot_model->getVariableIndex(name); + } + } + } + for(size_t i = 0; i < active_variables.size(); i++) + if(name == robot_model->getVariableNames()[active_variables[i]]) return i; + for(auto& n : joint_model_group->getVariableNames()) + { + if(n == name) + { + active_variables.push_back(robot_model->getVariableIndex(name)); + return active_variables.size() - 1; + } + } + ERROR("joint variable not found", name); + }; + + goals.clear(); + secondary_goals.clear(); + for(auto& goal : goals2) + { + GoalInfo goal_info; + + goal_info.goal = goal; + + goal->describe(goal_info.goal_context); + + for(auto& link_name : goal_info.goal_context.goal_link_names_) + { + auto* link_model = robot_model->getLinkModel(link_name); + if(!link_model) ERROR("link not found", link_name); + goal_info.goal_context.goal_link_indices_.push_back(addTipLink(link_model)); + } + + for(auto& variable_name : goal_info.goal_context.goal_variable_names_) + { + goal_info.goal_context.goal_variable_indices_.push_back(addActiveVariable(variable_name)); + } + + goal_info.weight = goal_info.goal_context.goal_weight_; + goal_info.weight_sq = goal_info.weight * goal_info.weight; + + goal_info.goal_type = GoalType::Unknown; + + goal_info.frame = Frame::identity(); + goal_info.tip_index = 0; + if(goal_info.goal_context.goal_link_indices_.size()) goal_info.tip_index = goal_info.goal_context.goal_link_indices_[0]; + + if(auto* g = dynamic_cast(goal_info.goal)) + { + goal_info.goal_type = GoalType::Position; + goal_info.frame.pos = g->getPosition(); + } + + if(auto* g = dynamic_cast(goal_info.goal)) + { + goal_info.goal_type = GoalType::Orientation; + goal_info.frame.rot = g->getOrientation(); + } + + if(auto* g = dynamic_cast(goal_info.goal)) + { + goal_info.goal_type = GoalType::Pose; + goal_info.frame.pos = g->getPosition(); + goal_info.frame.rot = g->getOrientation(); + } + + goal_info.goal_context.joint_model_group_ = joint_model_group; + goal_info.goal_context.initial_guess_ = initial_guess; + + if(goal_info.goal_context.goal_secondary_) + secondary_goals.push_back(goal_info); + else + goals.push_back(goal_info); + + // if(goal_info.variable_indices.size() > temp_variables.size()) temp_variables.resize(goal_info.variable_indices.size()); + + // if(goal_info.link_indices.size() > temp_frames.size()) temp_frames.resize(goal_info.link_indices.size()); + } + + // update active variables from active subtree + joint_usage.resize(robot_model->getJointModelCount()); + for(auto& u : joint_usage) + u = 0; + for(auto tip_index : tip_link_indices) + for(auto* link_model = robot_model->getLinkModels()[tip_index]; link_model; link_model = link_model->getParentLinkModel()) + joint_usage[link_model->getParentJointModel()->getJointIndex()] = 1; + if(options) + for(auto& fixed_joint_name : options->fixed_joints) + joint_usage[robot_model->getJointModel(fixed_joint_name)->getJointIndex()] = 0; + for(auto* joint_model : joint_model_group->getActiveJointModels()) + if(joint_usage[joint_model->getJointIndex()] && !joint_model->getMimic()) + for(auto& n : joint_model->getVariableNames()) + addActiveVariable(n); + + // init weights for minimal displacement goals + { + minimal_displacement_factors.resize(active_variables.size()); + double s = 0; + for(auto ivar : active_variables) + s += modelInfo.getMaxVelocityRcp(ivar); + if(s > 0) + { + for(size_t i = 0; i < active_variables.size(); i++) + { + auto ivar = active_variables[i]; + minimal_displacement_factors[i] = modelInfo.getMaxVelocityRcp(ivar) / s; + } + } + else + { + for(size_t i = 0; i < active_variables.size(); i++) + minimal_displacement_factors[i] = 1.0 / active_variables.size(); + } + } + + initialize2(); +} + +void Problem::initialize2() +{ + for(auto* gg : {&goals, &secondary_goals}) + { + for(auto& g : *gg) + { + g.goal_context.problem_active_variables_ = active_variables; + g.goal_context.problem_tip_link_indices_ = tip_link_indices; + g.goal_context.velocity_weights_ = minimal_displacement_factors; + g.goal_context.robot_info_ = &modelInfo; + } + } +} + +double Problem::computeGoalFitness(GoalInfo& goal_info, const Frame* tip_frames, const double* active_variable_positions) +{ + goal_info.goal_context.tip_link_frames_ = tip_frames; + goal_info.goal_context.active_variable_positions_ = active_variable_positions; + return goal_info.goal->evaluate(goal_info.goal_context) * goal_info.weight_sq; +} + +double Problem::computeGoalFitness(std::vector& goals, const Frame* tip_frames, const double* active_variable_positions) +{ + double sum = 0.0; + for(auto& goal : goals) + sum += computeGoalFitness(goal, tip_frames, active_variable_positions); + return sum; +} + +bool Problem::checkSolutionActiveVariables(const std::vector& tip_frames, const double* active_variable_positions) +{ + for(auto& goal : goals) + { + const auto& fa = goal.frame; + const auto& fb = tip_frames[goal.tip_index]; + + switch(goal.goal_type) + { + + case GoalType::Position: + { + if(dpos != DBL_MAX) + { + double p_dist = (fb.pos - fa.pos).length(); + if(!(p_dist <= dpos)) return false; + } + if(dtwist != DBL_MAX) + { + KDL::Frame fk_kdl, ik_kdl; + frameToKDL(fa, fk_kdl); + frameToKDL(fb, ik_kdl); + KDL::Twist kdl_diff(fk_kdl.M.Inverse() * KDL::diff(fk_kdl.p, ik_kdl.p), fk_kdl.M.Inverse() * KDL::diff(fk_kdl.M, ik_kdl.M)); + if(!KDL::Equal(kdl_diff.vel, KDL::Twist::Zero().vel, dtwist)) return false; + } + continue; + } + + case GoalType::Orientation: + { + if(drot != DBL_MAX) + { + double r_dist = fb.rot.angleShortestPath(fa.rot); + r_dist = r_dist * 180 / M_PI; + if(!(r_dist <= drot)) return false; + } + if(dtwist != DBL_MAX) + { + KDL::Frame fk_kdl, ik_kdl; + frameToKDL(fa, fk_kdl); + frameToKDL(fb, ik_kdl); + KDL::Twist kdl_diff(fk_kdl.M.Inverse() * KDL::diff(fk_kdl.p, ik_kdl.p), fk_kdl.M.Inverse() * KDL::diff(fk_kdl.M, ik_kdl.M)); + if(!KDL::Equal(kdl_diff.rot, KDL::Twist::Zero().rot, dtwist)) return false; + } + continue; + } + + case GoalType::Pose: + { + if(dpos != DBL_MAX || drot != DBL_MAX) + { + double p_dist = (fb.pos - fa.pos).length(); + double r_dist = fb.rot.angleShortestPath(fa.rot); + r_dist = r_dist * 180 / M_PI; + if(!(p_dist <= dpos)) return false; + if(!(r_dist <= drot)) return false; + } + if(dtwist != DBL_MAX) + { + KDL::Frame fk_kdl, ik_kdl; + frameToKDL(fa, fk_kdl); + frameToKDL(fb, ik_kdl); + KDL::Twist kdl_diff(fk_kdl.M.Inverse() * KDL::diff(fk_kdl.p, ik_kdl.p), fk_kdl.M.Inverse() * KDL::diff(fk_kdl.M, ik_kdl.M)); + if(!KDL::Equal(kdl_diff, KDL::Twist::Zero(), dtwist)) return false; + } + continue; + } + + default: + { + double dmax = DBL_MAX; + dmax = std::fmin(dmax, dpos); + dmax = std::fmin(dmax, dtwist); + double d = computeGoalFitness(goal, tip_frames.data(), active_variable_positions); + if(!(d < dmax * dmax)) return false; + } + } + } + + // LOG("checkSolutionActiveVariables true"); + + return true; +} +} diff --git a/src/lib/bio_ik/src/problem.hpp b/src/lib/bio_ik/src/problem.hpp new file mode 100644 index 000000000..99bdb3d91 --- /dev/null +++ b/src/lib/bio_ik/src/problem.hpp @@ -0,0 +1,144 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include "utils.hpp" +#include + +#include + +#include + +#include +#include + +#include + +namespace bio_ik +{ + +class Problem +{ +private: + bool ros_params_initrd; + std::vector joint_usage; + std::vector link_tip_indices; + std::vector minimal_displacement_factors; + std::vector joint_transmission_goal_temp, joint_transmission_goal_temp2; + moveit::core::RobotModelConstPtr robot_model; + const moveit::core::JointModelGroup* joint_model_group; + IKParams params; + RobotInfo modelInfo; + double dpos, drot, dtwist; +#if (MOVEIT_FCL_VERSION < FCL_VERSION_CHECK(0, 6, 0)) + struct CollisionShape + { + std::vector vertices; + std::vector points; + std::vector polygons; + std::vector plane_normals; + std::vector plane_dis; + collision_detection::FCLGeometryConstPtr geometry; + Frame frame; + std::vector> edges; + }; + struct CollisionLink + { + bool initialized; + std::vector> shapes; + CollisionLink() + : initialized(false) + { + } + }; + std::vector collision_links; +#endif + size_t addTipLink(const moveit::core::LinkModel* link_model); + +public: + /*enum class GoalType; + struct BalanceGoalInfo + { + ssize_t tip_index; + double mass; + Vector3 center; + }; + struct GoalInfo + { + const Goal* goal; + GoalType goal_type; + size_t tip_index; + double weight; + double weight_sq; + double rotation_scale; + double rotation_scale_sq; + Frame frame; + tf2::Vector3 target; + tf2::Vector3 direction; + tf2::Vector3 axis; + double distance; + ssize_t active_variable_index; + double variable_position; + std::vector variable_indices; + mutable size_t last_collision_vertex; + std::vector balance_goal_infos; + };*/ + enum class GoalType; + // std::vector temp_frames; + // std::vector temp_variables; + struct GoalInfo + { + const Goal* goal; + double weight_sq; + double weight; + GoalType goal_type; + size_t tip_index; + Frame frame; + GoalContext goal_context; + }; + std::chrono::time_point> timeout; + std::vector initial_guess; + std::vector active_variables; + std::vector tip_link_indices; + std::vector goals; + std::vector secondary_goals; + Problem(); + void initialize(moveit::core::RobotModelConstPtr robot_model, const moveit::core::JointModelGroup* joint_model_group, const IKParams& params, const std::vector& goals2, const BioIKKinematicsQueryOptions* options); + void initialize2(); + double computeGoalFitness(GoalInfo& goal, const Frame* tip_frames, const double* active_variable_positions); + double computeGoalFitness(std::vector& goals, const Frame* tip_frames, const double* active_variable_positions); + bool checkSolutionActiveVariables(const std::vector& tip_frames, const double* active_variable_positions); +}; +} diff --git a/src/lib/bio_ik/src/utils.hpp b/src/lib/bio_ik/src/utils.hpp new file mode 100644 index 000000000..e21615c79 --- /dev/null +++ b/src/lib/bio_ik/src/utils.hpp @@ -0,0 +1,468 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +//#include + +//#include +//#include +#include + +namespace bio_ik +{ + +struct IKParams +{ + moveit::core::RobotModelConstPtr robot_model; + const moveit::core::JointModelGroup* joint_model_group; + + // IKParallel parameters + std::string solver_class_name; + bool enable_counter; + int thread_count; + int random_seed; + + //Problem parameters + double dpos; + double drot; + double dtwist; + + // ik_evolution_1 parameters + bool opt_no_wipeout; + int population_size; + int elite_count; + bool linear_fitness; +}; + +// Uncomment to enable logging +//#define ENABLE_LOG + +// Uncomment to enable profiling +//#define ENABLE_PROFILER + +// logging + +//#define LOG_STREAM (std::cerr << std::fixed) +//#define LOG_STREAM (std::cerr << std::scientific) +#define LOG_STREAM (std::cerr) + +template inline void vprint(std::ostream& s, const T& a) { s << a << std::endl; } +template inline void vprint(std::ostream& s, const T& a, const AA&... aa) +{ + s << a << " "; + vprint(s, aa...); +}; + +#define LOG2(...) vprint(LOG_STREAM, "ikbio ", __VA_ARGS__) + +#ifdef ENABLE_LOG +#define LOG(...) LOG2(__VA_ARGS__) +#else +#define LOG(...) +#endif + +#define LOG_VAR(v) LOG2(#v, (v)); + +//#define LOG_FNC() LOG("fun", __func__, __LINE__) +#define LOG_FNC() + +// show error and abort +// #define ERROR(...) { LOG("ERROR", __VA_ARGS__); exit(-1); } +// #define ERROR(a, ...) { LOG(a, __VA_ARGS__); LOG_STREAM.flush(); throw std::runtime_error(a); } +#define ERROR(...) \ + { \ + LOG2(__VA_ARGS__); \ + LOG_STREAM.flush(); \ + std::stringstream ss; \ + vprint(ss, __VA_ARGS__); \ + throw std::runtime_error(ss.str()); \ + } +// #define ERROR(...) { LOG_ALWAYS(__VA_ARGS__); std::raise(SIGINT); } + +// profiler + +#ifdef ENABLE_PROFILER + +// embeddable sampling profiler + +// profiled block or function +struct ProfilerBin +{ + const char* volatile name; // name of scope or function, also used as indicator if it is currently being executed + std::atomic counter; // only used by CounterScope / COUNTERPROFILER + ProfilerBin() + : name(0) + { + } +}; + +// allocate globally unique profiler buffer via template +template ProfilerBin* getProfilerBuffer() +{ + static std::vector buffer(10000); + return buffer.data(); +} + +// reserve profiler buffer segment for current compilation unit +template ProfilerBin* getProfilerSegment() +{ + static size_t index = 0; + return getProfilerBuffer() + (index++) * 20; +} +static ProfilerBin* profiler_segment = getProfilerSegment(); + +// identifies currently profiled thread +// null if profiler is disabled +struct ProfilerInfo +{ + void* stack_begin; + void* stack_end; +}; + +// declare globally unique profiler info via template +template ProfilerInfo& getProfilerInfo() +{ + static ProfilerInfo info; + return info; +} +static ProfilerInfo& profiler_info = getProfilerInfo(); + +// profiles a scope or function +template struct ProfilerScope +{ + __attribute__((always_inline)) inline ProfilerScope(const char* name) + { + if(profiler_info.stack_begin == 0) return; + if(this < profiler_info.stack_begin || this > profiler_info.stack_end) return; + profiler_segment[ID].name = name; + } + __attribute__((always_inline)) inline ~ProfilerScope() + { + if(profiler_info.stack_begin == 0) return; + if(this < profiler_info.stack_begin || this > profiler_info.stack_end) return; + profiler_segment[ID].name = 0; + } +}; +#define FNPROFILER() volatile ProfilerScope<__COUNTER__> _profilerscope(__func__); +#define BLOCKPROFILER(name) volatile ProfilerScope<__COUNTER__> _profilerscope(name); + +// per-thread profiling +struct ThreadScope +{ + size_t id; + __attribute__((always_inline)) inline ThreadScope(const char* name, size_t id) + : id(id) + { + if(profiler_info.stack_begin == 0) return; + profiler_segment[id].name = name; + } + __attribute__((always_inline)) inline ~ThreadScope() + { + if(profiler_info.stack_begin == 0) return; + profiler_segment[id].name = 0; + } +}; +#define THREADPROFILER(name, id) \ + static const char* _threadscope_names[] = {name "0", name "1", name "2", name "3"}; \ + volatile ThreadScope _threadscope(_threadscope_names[id], __COUNTER__ + id); \ + (__COUNTER__, __COUNTER__, __COUNTER__, __COUNTER__, __COUNTER__); + +// profiling across multiple threads +struct CounterScope +{ + size_t id; + __attribute__((always_inline)) inline CounterScope(const char* name, size_t id) + : id(id) + { + if(profiler_info.stack_begin == 0) return; + if((profiler_segment[id].counter++) == 0) profiler_segment[id].name = name; + } + __attribute__((always_inline)) inline ~CounterScope() + { + if(profiler_info.stack_begin == 0) return; + if((--profiler_segment[id].counter) == 0) profiler_segment[id].name = 0; + } +}; +#define COUNTERPROFILER(name) volatile CounterScope _counterscope(name, __COUNTER__); + +// starts profiler and periodically writes results to log +struct Profiler +{ + std::thread thread; + volatile int exit_flag; + Profiler() + { + pthread_attr_t attr; + pthread_getattr_np(pthread_self(), &attr); + void* stack_addr; + size_t stack_size; + pthread_attr_getstack(&attr, &stack_addr, &stack_size); + profiler_info.stack_begin = stack_addr; + profiler_info.stack_end = (char*)stack_addr + stack_size; + const size_t maxbin = 1000; + static std::mutex mutex; + static std::unordered_map samples; + exit_flag = 0; + std::thread t([this]() { + auto* profiler_bins = getProfilerBuffer(); + while(true) + { + for(int iter = 0; iter < 100; iter++) + { + for(int iter = 0; iter < 100; iter++) + { + int i = rand() % maxbin; + const char* p = profiler_bins[i].name; + if(p) samples[p]++; + } + if(exit_flag) break; + std::this_thread::sleep_for(std::chrono::duration(rand() % 1000)); + } + { + double thistime = ros::WallTime::now().toSec(); + static double lasttime = 0.0; + if(thistime < lasttime + 1) continue; + lasttime = thistime; + static std::vector> data; + data.clear(); + for(auto& p : samples) + data.push_back(p); + std::sort(data.begin(), data.end(), [](const std::pair& a, const std::pair& b) { return a.second > b.second; }); + LOG(""); + LOG("profiler"); + for(auto& d : data) + { + double v = d.second * 100.0 / data[0].second; + char s[32]; + sprintf(s, "%6.2f%%", v); + LOG("p", s, d.first); + } + LOG(""); + } + if(exit_flag) break; + } + }); + std::swap(thread, t); + } + ~Profiler() + { + exit_flag = true; + thread.join(); + } + static void start() { static Profiler profiler; } +}; + +#else + +#define FNPROFILER() +#define BLOCKPROFILER(name) +#define THREADPROFILER(name, id) +#define COUNTERPROFILER(name) + +struct Profiler +{ + static void start() {} +}; + +#endif + +__attribute__((always_inline)) inline double mix(double a, double b, double f) { return a * (1.0 - f) + b * f; } + +__attribute__((always_inline)) inline double clamp(double v, double lo, double hi) +{ + if(v < lo) v = lo; + if(v > hi) v = hi; + return v; +} + +__attribute__((always_inline)) inline double clamp2(double v, double lo, double hi) +{ + if(__builtin_expect(v < lo, 0)) v = lo; + if(__builtin_expect(v > hi, 0)) v = hi; + return v; +} + +__attribute__((always_inline)) inline double smoothstep(float a, float b, float v) +{ + v = clamp((v - a) / (b - a), 0.0, 1.0); + return v * v * (3.0 - 2.0 * v); +} + +__attribute__((always_inline)) inline double sign(double f) +{ + if(f < 0.0) f = -1.0; + if(f > 0.0) f = +1.0; + return f; +} + +template class linear_int_distribution +{ + std::uniform_int_distribution base; + t n; + +public: + inline linear_int_distribution(t vrange) + : n(vrange) + , base(0, vrange) + { + } + template inline t operator()(generator& g) + { + while(true) + { + t v = base(g) + base(g); + if(v < n) return n - v - 1; + } + } +}; + +struct XORShift64 +{ + uint64_t v; + +public: + XORShift64() + : v(88172645463325252ull) + { + } + __attribute__((always_inline)) inline uint64_t operator()() + { + v ^= v << 13; + v ^= v >> 7; + v ^= v << 17; + return v; + } +}; + +// class factory +// +// registering a class: +// static Factory::Class reg("Derived"); +// +// instantiation: +// Base* obj = Factory::create("Derived"); +// +// cloning and object: +// p = Factory::clone(o); +// +template class Factory +{ + typedef BASE* (*Constructor)(ARGS...); + struct ClassBase + { + std::string name; + std::type_index type; + virtual BASE* create(ARGS... args) const = 0; + virtual BASE* clone(const BASE*) const = 0; + ClassBase() + : type(typeid(void)) + { + } + }; + typedef std::set MapType; + static MapType& classes() + { + static MapType ff; + return ff; + } + +public: + template struct Class : ClassBase + { + BASE* create(ARGS... args) const { return new DERIVED(args...); } + BASE* clone(const BASE* o) const { return new DERIVED(*(const DERIVED*)o); } + Class(const std::string& name) + { + this->name = name; + this->type = typeid(DERIVED); + classes().insert(this); + } + ~Class() { classes().erase(this); } + }; + static BASE* create(const std::string& name, ARGS... args) + { + for(auto* f : classes()) + if(f->name == name) return f->create(args...); + ERROR("class not found", name); + } + template static DERIVED* clone(const DERIVED* o) + { + for(auto* f : classes()) + if(f->type == typeid(*o)) return (DERIVED*)f->clone(o); + ERROR("class not found", typeid(*o).name()); + } +}; + +// Alloctes memory properly aligned for SIMD operations +template struct aligned_allocator : public std::allocator +{ + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef T value_type; + T* allocate(size_t s, const void* hint = 0) + { + void* p; + if(posix_memalign(&p, A, sizeof(T) * s + 64)) throw std::bad_alloc(); + return (T*)p; + } + void deallocate(T* ptr, size_t s) { free(ptr); } + template struct rebind + { + typedef aligned_allocator other; + }; +}; + +// std::vector typedef with proper memory alignment for SIMD operations +template struct aligned_vector : std::vector> +{ +}; +} diff --git a/src/lib/bio_ik/test/utest.cpp b/src/lib/bio_ik/test/utest.cpp new file mode 100644 index 000000000..1335aaf16 --- /dev/null +++ b/src/lib/bio_ik/test/utest.cpp @@ -0,0 +1,120 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2016-2017, Philipp Sebastian Ruppel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +// BioIK unit tests + +#include +#include + +#include "../src/utils.hpp" +#include + +using namespace bio_ik; + +#define FRAME_EXPECT_NEAR(r, s) \ + EXPECT_NEAR(r.rot.getX(), s.rot.getX(), 0.001); \ + EXPECT_NEAR(r.rot.getY(), s.rot.getY(), 0.001); \ + EXPECT_NEAR(r.rot.getZ(), s.rot.getZ(), 0.001); \ + EXPECT_NEAR(r.rot.getW(), s.rot.getW(), 0.001); \ + EXPECT_NEAR(r.pos.getX(), s.pos.getX(), 0.001); \ + EXPECT_NEAR(r.pos.getY(), s.pos.getY(), 0.001); \ + EXPECT_NEAR(r.pos.getZ(), s.pos.getZ(), 0.001); + +template +Frame random_frame(RNG& rng) +{ + std::uniform_real_distribution dist(-1, 1); + tf2::Quaternion q(dist(rng), dist(rng), dist(rng), dist(rng)); + q.normalize(); + tf2::Vector3 v(dist(rng), dist(rng), dist(rng)); + return Frame(v, q); +} + +TEST(BioIK, change) +{ + std::mt19937 rng(0); + + for(int i = 0; i < 10000; i++) + { + Frame fa = random_frame(rng); + Frame fb = random_frame(rng); + Frame fc = random_frame(rng); + Frame fx, fy, fz; + + concat(fb, fa, fx); + concat(fc, fa, fy); + + change(fc, fb, fx, fz); + + FRAME_EXPECT_NEAR(fy, fz); + } +} + +TEST(BioIK, linear_int_distribution) +{ + std::mt19937 rng(0); + + int n = 8; + std::vector v(n); + + linear_int_distribution d(n); + int iter = 1000000; + for(int i = 0; i < iter; i++) + v[d(rng)]++; + + std::vector r(n); + for(int i = 0; i < n; i++) r[i] = n - i; + + for(auto* vp : { &v, &r }) + { + auto& v = *vp; + double s = 0; + for(int i = 0; i < n; i++) s += v[i]; + for(int i = 0; i < n; i++) v[i] /= s; + } + + for(int i = 0; i < n; i++) + { + //LOG_ALWAYS(i, v[i], r[i]); + EXPECT_NEAR(v[i], r[i], 0.001); + } +} + +int main(int argc, char **argv){ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + + + From 32cb288b5fd4473f0e76d3a252f16183697fa6b3 Mon Sep 17 00:00:00 2001 From: paer Date: Thu, 12 Mar 2026 08:41:17 +0100 Subject: [PATCH 69/74] calibrate amy --- .../bitbots_extrinsic_calibration/config/amy.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml b/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml index eac72e113..955e68f54 100644 --- a/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml +++ b/src/bitbots_misc/bitbots_extrinsic_calibration/config/amy.yaml @@ -1,11 +1,11 @@ /bitbots_extrinsic_camera_calibration: ros__parameters: - offset_x: -0.04 + offset_x: -0.06 offset_y: 0.0 offset_z: 0.0 /bitbots_extrinsic_imu_calibration: ros__parameters: - offset_x: 0.31 + offset_x: 0.295 offset_y: 0.06 offset_z: 0.0 From e91d550aa285ce2311f2efed9b2022866233c1f1 Mon Sep 17 00:00:00 2001 From: paer Date: Thu, 12 Mar 2026 08:51:32 +0100 Subject: [PATCH 70/74] calibrate donna --- .../bitbots_extrinsic_calibration/config/donna.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bitbots_misc/bitbots_extrinsic_calibration/config/donna.yaml b/src/bitbots_misc/bitbots_extrinsic_calibration/config/donna.yaml index a3df520f9..bcec24130 100644 --- a/src/bitbots_misc/bitbots_extrinsic_calibration/config/donna.yaml +++ b/src/bitbots_misc/bitbots_extrinsic_calibration/config/donna.yaml @@ -1,11 +1,11 @@ /bitbots_extrinsic_camera_calibration: ros__parameters: - offset_x: -0.08 + offset_x: -0.06 offset_y: 0.08 - offset_z: 0.05 + offset_z: 0.03 /bitbots_extrinsic_imu_calibration: ros__parameters: offset_x: 0.05 - offset_y: 0.13 + offset_y: 0.12 offset_z: 0.0 From 054d65f398dc31d00b9d8b5d45821ef95e20d7e4 Mon Sep 17 00:00:00 2001 From: Jan Gutsche Date: Thu, 12 Mar 2026 10:17:02 +0100 Subject: [PATCH 71/74] remove bioik pixi dep --- pixi.lock | 54 ------------------------------------------------------ pixi.toml | 2 +- 2 files changed, 1 insertion(+), 55 deletions(-) diff --git a/pixi.lock b/pixi.lock index f713f94b3..7c81aa9b7 100644 --- a/pixi.lock +++ b/pixi.lock @@ -532,7 +532,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-2.0.0-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-biped-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h2ed9cc7_14.conda @@ -1570,7 +1569,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-backward-ros-1.0.8-np2py312h61f2ce4_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-2.0.0-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-biped-interfaces-0.0.0-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h3575a3a_14.conda @@ -2779,7 +2777,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-2.0.0-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-biped-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h2ed9cc7_14.conda @@ -3818,7 +3815,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-backward-ros-1.0.8-np2py312h61f2ce4_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-2.0.0-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-biped-interfaces-0.0.0-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h3575a3a_14.conda @@ -17992,56 +17988,6 @@ packages: license: MIT size: 272425 timestamp: 1769782730367 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-2.0.0-np2py312h2ed9cc7_14.conda - sha256: 2f0120a219e1e66b4af5d69b0578e5b207727de71ca75d551f047acf42567d07 - md5: 36aabe0e1293f6e83e83a2fb8360c34d - depends: - - eigen - - python - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-kdl - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 391107 - timestamp: 1769782373236 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-2.0.0-np2py312h3575a3a_14.conda - sha256: e21c2799218df840d171e874f8d12108cfe18a557a9a23922be6b600aee7b573 - md5: 61b8cb075d36cc82167c47c0e4639555 - depends: - - eigen - - python - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-kdl - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 360300 - timestamp: 1769782730555 - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h2ed9cc7_14.conda sha256: e00965c8fd6f32f09d5917ec48f749c90a6b2ba1a032e1b0c461839cf42763f4 md5: 47c76e9de0decb9cad64b18b6761c5d5 diff --git a/pixi.toml b/pixi.toml index 0a20ec704..8429f02f1 100644 --- a/pixi.toml +++ b/pixi.toml @@ -160,7 +160,7 @@ ros-jazzy-soccer-vision-3d-rviz-markers = ">=1.0.0,<2" ros-jazzy-soccer-vision-3d-msgs = ">=1.0.0,<2" ros-jazzy-soccer-vision-attribute-msgs = ">=1.0.0,<2" ros-jazzy-rot-conv = ">=1.1.0,<2" -ros-jazzy-bio-ik = ">=2.0.0,<3" +#ros-jazzy-bio-ik = ">=2.0.0,<3" ros-jazzy-bio-ik-msgs = ">=0.0.0,<0.0.1" ros-jazzy-biped-interfaces = ">=0.0.0,<0.0.1" ros-jazzy-bitbots-tf-buffer = ">=1.0.0,<2" From ee9784390e99acff78ad63d30f794f3ec4f34fe1 Mon Sep 17 00:00:00 2001 From: Jan Gutsche Date: Thu, 12 Mar 2026 10:17:22 +0100 Subject: [PATCH 72/74] set default field to german_open_2026 --- src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch index 0865ba101..9015cb0d6 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch @@ -16,7 +16,7 @@ - + From 9a2135b539f415a49c87ee73dfbb4efb3c76e78a Mon Sep 17 00:00:00 2001 From: Jan Gutsche Date: Thu, 12 Mar 2026 10:17:45 +0100 Subject: [PATCH 73/74] jack trunk offset because he could not walk backwards --- src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml index cda67ccde..139a4431c 100644 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml +++ b/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml @@ -3,4 +3,4 @@ walking: ros__parameters: engine: - trunk_x_offset: 0.0 + trunk_x_offset: 0.01 From a07091071ec13f5700b9fa80d02a53097259b547 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Thu, 12 Mar 2026 18:11:57 +0100 Subject: [PATCH 74/74] fix (whistle detection disabled localization through movement) --- .../capsules/game_status_capsule.py | 7 +++-- .../decisions/whistle_detected.py | 10 +++---- .../behavior_dsd/main.dsd | 4 +-- .../bitbots_body_behavior/body_behavior.py | 4 +-- .../whistle_detector.py | 6 ++-- .../decisions/whistle_detected.py | 30 +++++++++++++++++++ .../localization_dsd/localization.dsd | 4 ++- .../localization_blackboard.py | 7 +++++ .../localization_handler.py | 8 +++++ 9 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/whistle_detected.py diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index 406c3a68d..4e2c00295 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -3,6 +3,7 @@ from bitbots_utils.utils import get_parameters_from_other_node from game_controller_hsl_interfaces.msg import GameState from std_msgs.msg import Bool +from rclpy.time import Time from bitbots_blackboard.capsules import AbstractBlackboardCapsule @@ -21,7 +22,7 @@ def __init__(self, node, blackboard=None): self.last_goal_from_us_time = -86400.0 self.last_goal_time = -86400.0 self.free_kick_kickoff_team: Optional[bool] = None - self.whistle_detected: bool = False + self.last_timestep_whistle_detected: Time = self._node.get_clock().now() self.game_controller_stop: bool = False # publish stopped msg for hcm self.stop_pub = node.create_publisher(Bool, "game_controller/stop_msg", 1) @@ -137,5 +138,5 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg - def whistle_detection_callback(self, msg) -> None: # MSG type is assumed to be bool for now, prototyping - self.whistle_detected = msg.data # This stays true after the first whistle detection which is incorrect + def whistle_detection_callback(self, _) -> None: # MSG type is assumed to be bool for now, prototyping + self.last_timestep_whistle_detected = self._node.get_clock().now() # This stays true after the first whistle detection which is incorrect diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py index 981d2356f..3cff8e39c 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/whistle_detected.py @@ -7,13 +7,13 @@ class WhistleDetected(AbstractDecisionElement): def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) - self.bb = blackboard - self.bb.gamestate.whistle_detected = False + self.blackboard = blackboard + self.last_timestep_whistle_detected = self.blackboard.last_timestep_whistle_detected def perform(self, reevaluate=False): - if self.bb.gamestate.whistle_detected: - return "YES" - return "NO" + if self.last_timestep_whistle_detected == self.blackboard.last_timestep_whistle_detected: + return "NOT_DETECTED" + return "DETECTED" def get_reevaluate(self): return True diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 2f021f5bf..60f838420 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -154,8 +154,8 @@ $IsPenalized NOT_DONE --> @ChangeAction + action:waiting + r:false, @LookAtFieldFeatures + r:false, @Stand + duration:2 DONE --> #PositioningReady SET --> $WhistleDetected - YES --> #PlayingBehavior - NO --> $SecondaryStateDecider + DETECTED --> #PlayingBehavior + NOT_DETECTED --> $SecondaryStateDecider PENALTYSHOOT --> $SecondaryStateTeamDecider OUR --> @Stand + duration:0.1 + r:false, @DeactivateHCM + r:false, @LookForward + r:false, @PlayAnimationInitInSim + r:false, @GetWalkready + r:false, @Stand // we need to also see the goalie OTHER --> $BallSeen diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py index 8af33638a..d1646e1d9 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py @@ -11,7 +11,7 @@ from rclpy.experimental.events_executor import EventsExecutor from rclpy.node import Node from soccer_vision_3d_msgs.msg import RobotArray -from std_msgs.msg import Bool +from std_msgs.msg import Empty from bitbots_body_behavior import behavior_dsd from bitbots_msgs.msg import RobotControlState, TeamData @@ -77,7 +77,7 @@ def __init__(self, node: Node): callback_group=MutuallyExclusiveCallbackGroup(), ) node.create_subscription( - Bool, + Empty, "whistle_detected", blackboard.gamestate.whistle_detection_callback, qos_profile=1, diff --git a/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py b/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py index 62ef294db..9301565bb 100755 --- a/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py +++ b/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py @@ -7,7 +7,7 @@ from rclpy.node import Node from rclpy.experimental.events_executor import EventsExecutor -from std_msgs.msg import Bool +from std_msgs.msg import Empty from audio_common_msgs.msg import AudioStamped from rclpy.qos import qos_profile_sensor_data @@ -19,7 +19,7 @@ def __init__(self) -> None: super().__init__("whistle_detector") self.logger = self.get_logger() - self.whistle_publisher = self.create_publisher(Bool, "whistle_detected", 1) + self.whistle_publisher = self.create_publisher(Empty, "whistle_detected", 1) self.audio_buffer = np.array([], dtype=np.float32) self.sample_rate = 16000 @@ -49,7 +49,7 @@ def process_audio(self) -> None: whistle_detected = self.detect_whistle(audio, self.sample_rate) if whistle_detected: - msg = Bool(data=True) + msg = Empty() self.whistle_publisher.publish(msg) def detect_whistle(self, audio, sample_rate): diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/whistle_detected.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/whistle_detected.py new file mode 100644 index 000000000..8526b9cd7 --- /dev/null +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/whistle_detected.py @@ -0,0 +1,30 @@ +from game_controller_hsl_interfaces.msg import GameState + +from bitbots_localization_handler.localization_dsd.decisions import AbstractLocalizationDecisionElement +from bitbots_localization_handler.localization_dsd.localization_blackboard import LocalizationBlackboard + + +class WhistleDetected(AbstractLocalizationDecisionElement): + + def __init__(self, blackboard, dsd, parameters): + super().__init__(blackboard, dsd, parameters) + self.blackboard: LocalizationBlackboard + self.last_timestep_whistle_detected = self.blackboard.last_timestep_whistle_detected + + + def perform(self, reevaluate=False): + """ + Checks if a whistle was detected + """ + + if self.last_timestep_whistle_detected == self.blackboard.last_timestep_whistle_detected: + return "NOT_DETECTED" + else: + return "DETECTED" + + + def get_reevaluate(self): + """ + Game state can change during the game + """ + return True diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization.dsd b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization.dsd index 3bca21850..bc6584f7a 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization.dsd +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization.dsd @@ -22,5 +22,7 @@ $GettingUpState NO --> $InitialToReady YES --> @InitSide, @DoNothing NO --> $GameStateDecider - SET --> #InitSet + SET --> $WhistleDetected + NOT_DETECTED --> #InitSet + DETECTED --> @DoNothing ELSE --> @DoNothing diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization_blackboard.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization_blackboard.py index 4e85eba1b..670f957bd 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization_blackboard.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/localization_blackboard.py @@ -13,6 +13,7 @@ from ros2_numpy import numpify from sensor_msgs.msg import Imu from tf2_geometry_msgs import TransformStamped +from rclpy.time import Time from bitbots_msgs.msg import RobotControlState @@ -68,6 +69,9 @@ def __init__(self, node: Node): # Last init action self.last_init_action_type: Optional[type] = None self.last_init_odom_transform: TransformStamped | None = None + + # Last time we have detected a whistle + self.last_timestep_whistle_detected: Time = self.node.get_clock().now() def _callback_pose(self, msg: PoseWithCovarianceStamped): self.robot_pose = msg @@ -122,3 +126,6 @@ def get_localization_yaw(self) -> float: if self.robot_pose is None: return 0.0 return quat2euler(xyzw2wxyz(numpify(self.robot_pose.pose.pose.orientation)), axes="szxy")[0] + + def whistle_detection_callback(self, _): + self.last_timestep_whistle_detected = self.node.get_clock().now() diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py index f47971829..6a9b962d8 100755 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py @@ -9,6 +9,7 @@ from rclpy.experimental.events_executor import EventsExecutor from rclpy.node import Node from sensor_msgs.msg import Imu +from std_msgs.msg import Empty from bitbots_localization_handler import localization_dsd from bitbots_localization_handler.localization_dsd.localization_blackboard import LocalizationBlackboard @@ -48,6 +49,13 @@ def init(node: Node): node.create_subscription( Imu, "/imu/data", blackboard._callback_imu, 1, callback_group=MutuallyExclusiveCallbackGroup() ) + node.create_subscription( + Empty, + "whistle_detected", + blackboard.gamestate.whistle_detection_callback, + qos_profile=1, + callback_group=MutuallyExclusiveCallbackGroup(), + ) return dsd

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≦M}YD1}~wnjRpK9eLZReGwnlv-$s@^}4` zlBl<}aj*i_#&wi<^R|7$ETR6kaWm3Y~)_K9~c7^@GqQ8m~s2L@UMQ0)#V!;CW5nXf=YkPFI!o@Tybg1dTikfLwY z|1s9-mR?m`ZzGfgjT`DBBh<$1TPW3x6822oJY}?zrXZlcR-m6yt{Vq!PNJO#0ZZ8j z-l-447j>WUL7iZPXj2S_dQhvQz5o;S`}$P1ozYhv2HL8Fjc~P+9+YGCyUJhMQu(}A zMtT=3hX`kDh2zlM_(HT4J`R0=O2|Nb33kP< z-<5G4yG*9zAIVL4E$XM;eb=P3$RTudn^Gt5#tz|E&gKHr{)>cK2<^kI%T{dB5p z8q+Z30&~)}n<;R%XKREo3~()`ue(?l4T)pUx|Y$DYdt-~`JCG3xI>58^G&a~Bs{rBc`-I;6lNxLO~ogL$-X7>P9 z**dNPba7kRcG`70qiBw5ii6KW3TZfbQ!)2DM8FZALAWt zhHWaEf=@zDVKK-%d12j`g(6)=`^sS;x zKVtU)mBbfXiakiVRgBYzikKcPE!F0TU)0~iculjB`Sro4+Pwg(w+q(Qp9IfoY_OS; zBEUv#VUJN+m;sIosUTbovz|*8&C&8Vv$gu%%2PL*el^^hr$08U=$*{1x@Be=qS+iA zGXG}`gXV%g)_MK8wNTpyiCQ9*q7~U{xO>(RZH75h>j+w?lfZVx4|dB>%`&pzydd>7 zJ4=k|6$x{J_{TuRX6A2kg?T}&X08_pK#)4j9HwyAe_Cf-6&h|f*PB?w&CZ}RaDqJJ z09b2scFNE!;~#T6m~7TE+nUYICt#QP2_%6=Kmim81E-Bu#zUj4vDVmXSKF%g{_4^( zZMc3-Ew5Ks8)`rqt~`{AsWs#_|Hsf-2SxRFVSKwg>F#cjZbT3f1Q7*6vAgSMyf${C zVi%|g2qJ=%3J6F^cf-Q6!S2F#y*oSi&z-qg;%8B8yg6zw-VLQu*CLM+4k0`6dr;|wNc1p&sCL(bsYI=p`%^ za{#v!?Tqt9wQIc8_pv^R7EB2OjXkL8!H3{1R5>CR(+M9(zkny8)8RZ61@RKS9&rk_ zfS5y7A_IHC}E7YYZ>X|`Jn&~d;S$bV`i z1g|21Mas*dP*oyOqul~*S7Ovg>Nd57szH57by9s&<*t6NB&n~d0#!RzPAYxXfNDbF zr81LGXlAUtlsDw9N{Q^LLa3Q4eNh~df0ct}bj4Gd#tJHFk`N>bk|c?h*g||toGf{* z@jvboy%rr4Wr`R}Ekeaors%0~yRcgX5k`vEXy(~>mc~T^OBv$bi}n)4(s@bVQjYYK zhOcx_*euNvmdT!Ia(?s0F4B!+16iGzCwr}#({)JBDrnMb#S^JQF(|cBT#w{#ExAm*TB@z_5bqLqOEt1~=@(JC{DJ7C zTp&Cz#|S~nVBuAzlc+`cP9#=}MD3dC5m(tNX;Ge%x+z>G#VW9jtlBPRs~EDQfCqAt zx>dFwut$DJeM%OgPL<-A(tzrG@G;E8l6kG z?0<5KrVsugxunSoYLY#YypdtWJCxRvIz_%%E#D)$qP{D=DSItisj0)xDuql-;VS`Y zG+O}*iBzId#{UT&zF_Tv=AnoeM=lBH-;=_;8jTV4%n`y>bUfY- z6NX=j4Z&TbQG8=(g(mq9soOWzWRT{Fog*} zQ(7u$)OhR~BnEsP$rb*v7$BfYb}d$k1sZRBgwRl<@>Pnqh`dDQ5g#rE#E+3DnH={Rc8pDfJAa6@C(ToJVpHlO`;4#4Jk}GpJISwkiF3E zWNQ?U@BqO@zk(k?K7mFRNHET1)g1d{(jzPLx(5s>L_3=8_IvrlgEeExkg}^t5<^_${GUB*58< z(=f?m4z@xfMoC2fL-|WuU|Q0hkRRegaH8ag8YQWc>k5mc+eOF4k3?BZZzyAowbwaN2}sY>*_Cy-kK-MoDZ~ObLKpAmuVQiO;dO zOUu{;QZmO>TDp)a{;c_(F!^!PS&^Q6x8#j{waiss3G~urj%CU>K=sxCU@}z^atBZg zT?p8V)K^j+3D~EwSHXeSs#h>e z$unr0_$Z`FdJ$AEHdMV7R{{$cS3vf2P@p!xpZcpP30x}XperOf!~nS)$v{z#A_6K< zrl4;8C};(_0$fbVf+lGChF1_vsJ~p3w<5{~?O*x_+_QuRGkAKSSSA2kz*GP|7#o!z zr|`1-Q(Hy%C))(C$M4Uc9As+%7V(oO#^R?UXMJW1ML%XS&}`->R5tGsrb?WGF4lM& zuK}K8pMa0R|G*!sh-fuNslLh1O_&Od5#=J**vxilZ7r zKSMxDQ(2P8Lg2^oVx3#CWmEa-42OmAu?|7%uynyQx#bX-t8=%I;0zq;^!T0Z%1 zIB&{mv~1dO+GDzzhn=+pYO#y(b-d-cOVTXt0eB{<1qmnaLVQ5AqtJkpxIIf$LaYdY z9hDt}ZUwS15(q*Ip&TU@@m?d7mL7sKRBiHf$Tto5bBt@wG@WCOej1$X3GMyRKhgsn zJU=+roig6qb875EU)->BFK_zzXa?srGmsHA>o)^uTl9yH>vvZVgbuEo)Npf|Z|Coc zJ7%?2oB3eSA?c(>(OeIwKmgcG$WIa$vjcMo9|;J=@?YXq;9H6ipTbO0Xx@bYdG|jCw(pLHz(QB4VJ1NGHf= zqBky*_KILZ`9a)*ctLnAnpa!${wIp!7z(!t4oM}8^^iLYKTt>cxyWe^*S=GkM_Z+E z(e;OXFpSXn-REhO$gAWc_!Z1EtT%R1w}aMURA*d7-D&=WA}|d#*r~nWJdK*?u!FwZ zHjDO4_cHZ1^#vY|4MwS9_Xswcnh>noN-0*s(LiMbe5>?7Vi@ovB^bDdj)OU)EWl#< zdag0j1YhP0#h#Tb!bf?B6 zT=wtDqNViVD>Cr7t+IzBU!rh5X7pwqCcGy0Gf@4<<^snLvFHr*@$=L6 zWBsG^6E?l-*+1>a_}TyNGga-TV;;@v1DQXQ+ZdIv8hq=We($e4SW5q8SQ1-_(L_I( z6`ZIgm&CVT{65-#zwB;9YsKl`zF%QAYjgKh`Mo<@*_hK^7EyRhW6K_DP5*&tKUkaJ z1?o=h4jV5Twr8!LgEE@t@grHYt0zasDRbDd0p1G6Uco``57ukmUakReY0-jZtN^h_ z;olbiLFL>&^$1g}Iy3c6rZYJr3}J6riWRUHmh(0(AOwd6JH*EqAHr(nU#YHOv`#Vp z18pM>qV)p*S1%fQ$>0fe-p~%IS;G>aJMpwG`7-p3Lz~U~BT_uemcNKJNIa4lx^esJ zQ|TEiX(^v#4<$ZMxUmMdv3Q+4eKF;Aa&78j(z*5YjocVkhS{pRy-U&c+h2q$Hl_PC zZMf&WJ)Uj1ZAFlCc387Z*Rr$r+AjBP*Skeqm)bSCy>wpmed0dtf78#__i>=3U!7-; zf1Xo}ces_FSCUP%dz9T^*dOQAh!GoyXs)wc>_F(%@FP**leVwZ+UOJOlu{C2k=nWP zM(p(!=;(W^{Z_Wbo>=7@62HnKh_V72wjo#<+2BoE8R&zGj&$Ng6d3>m`zU=L&ya&Q zB21}?0^vz91wO!ER-QuDOHA7t9N4N(Uw#UWwY*f)S}K6uobNw6pQi&o&artH3NkzFl0)Q z0Wud%$b$KMmV$(M{t1ci!mXu?(;yzF8##Zg)?j2!b#PC>&zQg0O1sLZ3OL{Fb1XiR zKY`xz3l6`*7w>=fuJ~epOMYhI@h|$H&VM$3>7L{Mc-7OadrpsV_Yc2bckAn?tgGoC z({Gu4(8+#Xp#1ptYs;5im3{fWzoq$Ks>=$Gl|~dJO0Yj3mo|PKuF)=>ukkO6t7!Ua zR+(PyTIEqo_}$TzV%xYoz+8E*KiUuGo{jp@aV=E?Hef7HLb zyZQ%5#}CXsn`1EU@%86#2#t9N?y99B&R_Xuey4DgOeIK^vH6Yi$D$*uF7*g#2Yf%O z2Ad1fqbx|us2SpWl%J9VB#Qht7BBWj$(FP*IbwgvwBnc?h|>nm(g>&}g9Yt&D>n@V zcF6Rp`wt_b<2#c-*5A#G9Zp!qc$JxF_|Z+ALWGVNBf zJxAy{C51=7*guxm8dkuD$)8k@uK*@ zYbh&luJ4a_Px!Wy6XO%!8ExZ#V#TsRomC6LzN#io}5F2n? zk?o)tfH3JD=^5dS=#M4?GeTG?*vB{{&>xKC=5^)FY;7x^KsH_MH>l!vo+?~yt;r9r zdS4J+%ZSah^xwBS~; zNAcI9fl7n&ebwJ950yp#()p@g%l=YVwNPYR-CNLBbtZSd+Uv!W%5Bf&1*UJU-%{Um zUg*8gePdZ5EI3;BuV|r0l^5|7{`p;5UA|YbQIYPKYeoLW*WUz|rDPYB)xO;HeJpo* zrLgpE!_Hs0?#f??k=!Q#@#~$G@neH)CU-Lq&H!c?W@qQ1)7MxPj4tL5ekBhfzbluk zb^_lhH(}^XBE>^FM=${Ir#k_HbiyTX4amZFlZB;R(s4y4N=vo}zF$>=Hbx)U2Gck? zFw<=MHH&pxG~;5OD*bG8fbOu_xPgdPW6Z&CG`~pYnYQSrS~u97^E7k26LQi$HoC#L zG-iJoFeWk9VwF!~Wqe-}Xr=$!T`L^dE-k+l_ig1+!jHA7>$Q>=QXa%#&3LkU_vS5Y z-lU&Nw8^lH-JdZUTEDF<=;yZF07k-=fD0>3{O!Wu18MwrIm31_T{Gn?V^6Huv)9Vx*?6YioV4?-h4|yQqq>w zsoOV4ZvL8HuqivGCGAZ-Z+%@%z?v&-uE*U@@{aoyH?w-*3Tnc9Sb3~|$kyeDgXSal zc#MVRT3?8$F&YiJPM@;W8PI)KX`GV9{pxTZHp$vdCljuRsA2me-U5bul0Yj zyXO7FuT}2PuK!HUacru}`_*Mp5I*qpo714GvTP)!-gwfhec$Bk4%gwRZvXCq?)px6 zdw-w2EpLeN4?eK3C!u@mP(km-q2ivYUS((45VYmmcw>Vz^W?A1vy+uu`j}Pw+a1cN ze-HnV|Gi(2?`-XI_;+|h*wVtJc4x3p4mGgePaonun`16so_Hxijx-5JhMI)46MCw} zg-^&yQ6g=#{FK2)1jBfNXk^o-pW%GK7UkyQ^w{Zw2gth8Yqh<|quKSZM~Iu#GJ(rv zaFdfmM0UteKyD8NWSsCS-XqWVN&Bt}lE9+8+!gSMqhdU-^MSVz&j8Y_>U4AEZWn_NF{EEiZ zfhd0R%!=}jn+Y}bzp`3uYHV7~ zYohD^mbX+SejEHAm4E%)RH5DXmlZXINB)REeQU|cKhs=P^rRVAq0Q<#3{{D&Kc3m2|H;KRfiKJ!j9QTDEAixYwHDz+dhb;P=4;?f=|s zM{t}+`-*kT{=LbiJpN&#_EvF9m zo}4l2Iy(5fWvM5*W~_ZraY*B#{EA=h-?n`(EwlY}vHWwcWku)*Q1y!sPW8kO=Nfe1 z+^gOF>UnkcvoBTB`_F1N-$wnS-#J}z=5|+Q)P2hDrh8FMbN6Q25Kl7OD&Jpf+fn?d z{a;C1`-&puKWg#Q*30Ey4RbZM8dwOeiCX=%A*bA@wxs-7jdp!_WnlZhn&f}y>h`uj zsbRG2`lfEe=B;h={lxzBx~Q(wti0>Hq}=@blS*_&PrZI^NVCzeSSh2CPqjMLbNjj(nd`7Rg9tM?@s*N4#2Py5jJP+=$eWv5={NV}7dx(|w@+WdWx> z90Ofl`U8i&VuSkv!ND)X6M~+F`vegJvVy+&J@efXSm?boWWDd-fO`Sq9!~=P=g{N* z#^ILJ2B&d{EceYWN8RjQ(;Tnc+Spp_*IDEe)*7?WVvYGe9?AwO6z!@i;X~CCjt6KJ zD;V}?E(w@0J*)UJbxz?u{7Z`LN)*cePH>OZF3fJLZJ!#i_%@SUlsWshFpOpU^$V+^ zOl$sN%{Y6w#(g2BGL?<0oSGZ?iJLw7XES3(tx(>j zPvO^uK1IpWplglQU~z+>*QwohG^zLZlv|h1?51wW44@w~{$^})VxK0n5X9E!ZsUcs zzllFEwkugfJu>&90BKbJq=4Gd$5wYp*lpc^*tP>Z7Tyi(^Ls}ug?3|gQoy922r-S} zPfR!ReP?PGmrdRg9GJxOx6FUw)i1R2hZi?#v|3zv7RIk)~R!bVPTbCAf(_}8%#oQt8uG!o5aJ`rmZF16v0P=(N zdFUH)iJ;?ARuFmQ2l(3vHF8;~8aEk6BP~U5BKfWirrAe`wRQ#h=(YrCYnS*z$PM0I zWH(O*J;0?!+sUcZV2j%o^I88;o1ySc4qD+eZjCDzJ<{TQogLROoQ3Q2JSS5-dmgX!55IW&+Aggti!EMP#eFrccwM#-fAUA^GWU@=9(x| zD(<}#m>6YcOuBCFPc76iiT@hip={RrO}m2Eqv@b*v1%Y2iBx647njz8tr*{+A11!T z*H7iaG=_AsP=1Gfcd3;f#bwVo%@QY4#`g7)1}oafyS~@n>#nKr>r;OJ-#|ra*1-Mm zF+M|3)Ese2~TmZ#b!D-lX$iqD%-(;YVP`;lI(tm z%y1&oq_%3EZkrOFO1nZGockw}sDQ&ZZNZTaxnU)aCt?R}H?O;97q;<MYcLA#Ip&e|s&aJKf{Z)D`VFM&R?I}h8pWg7n9 z`cu&ASSDO2h6_uMPKWod;-f)vb%cFU&nV5yKhX{?Urrxi9!-*mGl>TS+sPRo>6B}Z zBcvmCGo+7B-das=qx#DnlgzE0*O^qf+Zd>p5saSrE;DoU*0xUe;+O+Hs||L$!Stq` z9d!-ut#l~X_qDg#tYIJ9R`t8P8e- zPlPO~CIT1SH0k8ZnX421v&+WrP97i17-;J49mI8b_Gi}w^cj9N>Q5?a?2Rcl7$z6d zX0Z7qENOln``FhR#@*8D*|Hzk77Qz%FB+GpaVyI_SgGYIrb+27MnS<-=BdK!`4=S< zZ0jFUY|M{C^I=tI=E%R}hox0>oq0b}S`U0V-}K`huKvyQb@jF{_;qhzE!EaNi)vhY z^!u;&1Hab8_s=v%+`C#=buYNi;?}u3)c>mL0q4>*m*XG6xh-vgbAbc%=iiMVyYg;= zdrLIFGW+|?XCBm5bD$$eqtfgj7 zr~oc_%$s7pSz=CQFTNkM<)x103H&C<qpsoY`^D^YhMNxBYuxx#=7>@N_*E>kj%a%1M1T&02l-hmrd16|L06-qdG1 z_7X!jIio)$C!vYS9mq3lF5`Nl@<_>{>EwMOB_#JSI-xhPnvmpCjYrtrMy@l$K^nA| zgXSrVu$`I-eK&FgRuAzA(}PVz0&x?_C%8dO34wy2A{t^_Dc*?7Boh1}&J?s7c|*A# zI;A)ZJ*cpR_9nmFJ$a9}YNSPzUj26BWB<@7tAA79 z$`NGC+6i3UrHP5(s!@Dx^7!&!PsZcEyG)rDrVI<;@9w$&dP`r$%iiI{Y`v+LhpQN8 zA6YT{pEDRwU)9XnzI(;W%XQ}ZeRgM$eEB?A@MYhecVYd^M4ry%j*pV5xz8_WDEYEE zUjAG5TnU-=tMWg_?cX}%Gj*K7=QXxN8@~(s?i3#B7Uy?#Sr&fk5q#_)hQCdn@_cn` z8vn*{=0T3>+(Pas$07&Bt9z}X0>4}_i+LS4f9p*-|K>|g*3+wl%Cor!>hMAoVB5D0 zNO1KcqPD&t^Stdpj85+}?3tlK%7Xo|A@y(PeD-J zPZSeAMH~e6;J>KMQCiZ6F!&N3j^mRN1p*`#DRBfiC@s`0)Dn?ERwXJRN zPusjumDTd)##WWlR#w)lwpz8WM%WD}#5=y+;O?-v<&eeju5ZTn2eS2=_tsEeZRx`g zrXN6>rW=FeQ>mcXq@A$au^$omXc{6UdOw`Gau!94xrTL(C_||NVAg8P{a4g$fxG9GmQiFRmZO-RDwb$nv<+Qhu80&3;i(Y1e zT5?~HI_Fl3F?37CgFMdQ>byM=2>}71%Af%GN*_m|h08vUt1V!9i^a&$fRWo!j85L@ zOZ?LjW4Oc61hj8(2pl!)ttL;b6&H{0;{WZt$#Lzx!T9&@>PSYnYtQ6>@xOb+zuIn( z-D>Ndyw&`3HoMt}Lv7~^{Ch5oTnBDQ(*`iI!v1Ed^FWUHYws=L-|j-uaOVw0L1#74 zw3h+O9)EIf#v>4|8{n_fFT0Z63Kdnl^H2U~2r*zfzr=+qj*&sx_Xz^4}eLdKaDgv)hIY?1xhJ42)={4`>-yj5Cco*#8W&Burg9 zpk^-tex;oT`i?IF=0i4tpQv_$15|I6uYt!!D?n{ay1)yf2cRtB2ZZgCAO3%WV|YKl zJ-UkD45uyxBKNXZU=%a%guLlZLsbr(y6iz)5~($W4_fs%<+VEo%eCeGa=y?t3s(}DWO~)W@tZg z{9wvQ|6IrcUR)15Ll$HA6?s6GS;D|sB!!TA;J%gFZ!OdfULH6CF% zF|y6lec+Js{efZK`Vk4ucLGRUF>Z_9HJFUF>?Hy(b!Lim|6Sm^c5Imo`uB5^@Goqubgdrv*L{0%U9ZdN;{nF>^5Kx#2V>9X>qaQtH3LaJ`yNNWs_PPm(SM1#INZtH zJ)+{S8)*{X8hxhp9ru*WMz>0H`i{t&+w-L4=8Zyi6NHOwuAeP#ESijKXc+PP%k5v; z@v7UsKlb0%!R|KZ0J*iNujWry-~WDj56o5c3|}Z48O4<1Ca1riooOik!3_Hv%0-qw z=N6r;eT5oDyQTG%{LsLT^49b?jb~A%<7shUcbRF5Hpn9Hp%M+loU?~Ld_Xe5ZQ;d-;dyb`fyP$(SC*YYbo1qg9yMWg$Lx6is9XZ&lVh zYGn~MLv@3+S2ay|Ax|aImCe)#pm+2y(5pHpA*1?vYM6<;?4;=pNv7VExQ^l=>>)2M z{Glx4)@gm?`RKaxsoIw~9PQmRF}h152)ze=C$#r>=93#*x^cVf0LZ>-7>HT5N5TJ< zBFm^}irO1b2{}!ni+3Bfxt|)MnXU~Rr@l3+M&}yS2Eole-R*7s_P3pPS`)f?e>-~i zwag6u{?|C=+qp2mulpkB{9qP~HwK%3J`v2`GV0H{IPjE3ABbg*j*!_}liK{s8H(`O zT*u-qcK8BFKw=gwt!6wB4o^H3=#HG>+4MnKe>#h&j&%)>Ztq(?1RS|NU^-FRcX4W< zXK_l}F*qI47RT^x4w{YnQ#&7C*T%kI^OC=|;*4;AIZ$-xd$4q*+(8{*)d62s6OK=; z*Cl$k#S^o8{v*)_$H^o8sZ?&qMe${{|QnHzC#WyzJlcO*x*wfQ^@A|=aBAM z2y83E12H~XgmxO+j>{T8h21?gjf)=JPo19lp%0q^nL+0j=7CFmi!hbc3JQs_?S{O! z{Ro9x(~&Dn(n$I0isbMcRTyU}<3r{Tu~^wf1e?4=CPa1O?$Xx7xGm|<)7Xx7N6 zeD;g}+)S)?(u@)1zv&t5x(SVjX&3~s9t@Eu3^2>->5CeC zGL+V@$$cG)7|og(8Ht+BA3rv)HMNGhd(wA~Hp-vdHcXvAIrf?rHr>1Mkg1{Tux2%f zE2aAS93KpvTMIXsokF@!VUasWWYF*Zg8)oVy3C-@NbEZ3xM(zDBXA#k#UoDYa)8rM z<~B~-O>dgIHF0G+W-M-2-KWnC`sd7qwW=6y%|nche{5|NwKX-}7F;s&2=HP|rpg(c2Y5}afc?jSqKjB%=x4lQjG8sdy~qi1VawONZo_1^TMTiyk0?&=}gk7y->*NP}8%l^|EHJLrF`GU!gm zUbyANXIRsy4S3D)Jj8LBkKzq}!J7#)m~Q#@8h4^qZxt zbhBh=gGb78V|Nh7+#LSHycoU4;xBQfc`h|l^Pa0Q$u_VtXf-s@(lP2JuG0U8-Kf15 zvxIi9>p47 zrp<#C8|p)(#xTTI(;Y;TVEo!!Zg9$PR4d)zmT2R@6;bak0?fHj%Zr>AB@^~rMNjR%iY;wd zN{uZg5{%g~QJ@J`U~KqPa9sD1D48-R8bvoQ6~W)}uR&WEZUPqsdlWn&S>qUaCAAP) zDJR9YfL)4FFhY~^`A&8VyhHc}c!9@J{oy`Trf@BlPZwUO4|20Wd8|n2*SQPuo*7e= zaKZy~cxVOoWTy+J@NYVztac0VY0XFZ?@D`#c4fb)ySidA<2PWzq^^b?QES8c{F^bi zrk*qX>2Lbzsn)nY*Vf*y$1RULQ0?LtQFlv2)qt#yIehO=%J_=E|7Om&U1#$;j|g7( zUSHJja}%WWP4Z*=h5Xn3dBO|BLy{Ncqq1d;CHYU5x7=t!q&O|A)A+ZA($DI-rCyML z>kAl~7s*(&tHqjdRN)oI8KK*})gp`=z`MQhk-LNYgX729&N1LMGF^lxCJ%`_M;b-& z;gzD&fdcWNZmc4qty9hX+Xu{OE`t=dd7yY*zQpta5dF_clJ?{A+gh6@k@VWB5c>KV zh<5FqT35*x>Ms-CHwctpGjsyl8y|s98Xv>t7;s2|I-y!#w0e33aTmE1GerPt{ENm& zI^hvI64#2SW6o%(sH50zn0=VFSUc<_qL#P-gpuwj_T!((PT{P?cK8W?45^%LNX5;) zr=jP%=>MB<*XvyPWvVAiu->4l@tNv4>v-^MOAOT4vJU>rdJcWu?h(P>ev!ts_cxe! zoHTpreA%YMS?ol1IOK)1KJ9Cduya-HXUT8x_|Ezi}M zRPSbq|L2;HU*XV9SYr`R$T#|qP1Jvc3Z!pF6NwX;C#VD17-%@A64Z>Y0iVWgfPWw^ zL(R~(;0@>sVlG9C+)B(N72{_~w+I;;rJWOXl=w^Akw7*O6MvZeA+pRT2)Astun?CS z=r^}uV1p}9X61NYAhF42xmYF6)|z?FQVrebOtkhf5Y!`+S1D`9{u2I-DUs(UzJs*J zlNEo5?}>c}9`Z{1bLO%KE{&fbxIXY-e{8SyKtONlFtzXcMAg7=M)D|}`FDK#T-4+f z#`ekAv)oA&=EBq{GnheT5m=kqfxeS$P~?m* zD11HxoU(8Pn#11+|08?|hbrK(&l+D|HQWw#3I0xH16?hC0&?ZkfbKjkwI(i9RwRlM zZ51_$jFv1V^rf3(Z_x%}uLR8BCky2Kkp!{0l1I#GS><%Na>tll1s=kv7yC3y^FAe{ zWKbI;8qXuDX17!7IWv?!i_6KDq92sIVk)gr!larih%`%JH*FT|uMLIK^;V+x>TM+8 zb??xvbWZ4h(eg3eM5#2`hUqkDfOr`;0!#IrA^lo2&>8AANHPrts-y1&G|`@bQ)!*h zH>AICB*7A)gSUsT#PlF7koD-(kV?#b00;|FzQw+ieuGH2r(bdzvuoXG(#ALD7=XU0nXU1nblk6K7f63kCqpEEUa_B46#?qC?}LDAOL z)c749JeY-t7C6+!A6#J9405tI1wOa*Rf#R|ieu*K%1YyhDr5ay%01dg6+3AV`6*I> zycWAsaS@&^4+FlE0Tl&K zVQ`wd6+End3RzHTa%eQ9#Ua=lU?`5MUPVk%))O+t*NFEy4a9>pYC`1X9<2S89^&*A z8+>eX7if6=An?~%oBH@fmLhbDDZVjPutc9az&|$ik<&7LhIxpQJXOT_Hbk27?`fYl z@0gxF*H*_})h1dp|JNnn*Zn|pzVDW-s*k38(aTVx`sx*D25l67M_(!rj{5xcp)0-#lEUO%@NBRxEaz-oGOVO+d^`hEf@Xa z6fD~F9%w!&Zt}vJ`SOK*vswI&(?N@|qi+{K^yTu~I(G6ew&H|8{~9S)G$TP}Z5@z} z-R`g_14)R$;bIhFU>yLliY zTsUyK<9k?|qcQZPLo9@43x;)A_rlg&n83)U?oe~%7^vFdFAS;o9HFFh;aGA89&ci|0iNk-uC8_pmpM8#i#@Hc3NM*o6lfyC7fu->xfDI) z1xGCb_YA3;O~7?ByHRLn6nv1m1AJ;8p<2bHNy?^o@TMkj&pFQ6PdYIRMwx88F~UN} z1Y&Xj%vVv>^rTce?IRmvxJs*-<T=N;aH4Dg!)>$E{nYa2q+wCW&x=*Ea>+H#Z+H5Yl3Ooi(Z&~PtQ1VWRHf_e&=M~?yR zaM=(X*&hbdx&V8jvlnqm_YYdF`vrGc--?iCD8lC(o+Ho=rb!6~Gt_wF9xb~0PQB-r zZ;cDgdM(x(B-fv{ScevIFM9P~c^_B{&lqu1TDrp>_gQSeW7r@juB4 z@-1OAv5$WhpUNTQ3|KuFYnDD{H+vDao81I^G#?KRW}<em4p4>10HPf$p#>A`oxOZiqLb)(Rrn`7ZrOi95Mskj*x6N6rc{4fc zRE7f}Yj#>SI%}oSpUIb+On(x8n0c{;X1)=;m?!XOnPUqM%o^4)rp45^dG8^kc}C9| zv!Lq-+phbBz`k2c!s@y%JJHLLy9|~oUytkud>Kmu!6yC(Oqvp?R5LZodvn(T4_T+6 zBMaY=MM5oWm@k4gSNeH5{f&^$PX*+Q-c< z(OK5j)Vp>i1RMK{=&cT=h*ysBh;5D-WP(F6{Ie|vI%*Av%v(glZkX;wfJ|N?&l`V3 z95uQNzpi%&{*G!7yNNjt#=;<=4WPH+y#PAARaJ}ntCV3*s{C==0XGS2Kz#BG$W7Ws z*dm1l-=|4i6%evfoup0ZgLE9WLiZRkM^{ND=@{rm(9tGE)Ch~sWQLnHE6T%u4V}h6?uI+(FbICISW3Y*;|-tFUYAU5E?p zF)W`$B(36cNfnC~!~|(PAwh-3w*Wt49)fi>WbGlqXDCE<09vE)g|3rzgMnfUm?-!J z;4g3$garfX7jC@BlB*Uz=7@w4ZlXZW`NsOg?wWR=?;A~=Gaqzie&`jm5#3vOKRfpd z6rER=61wfg!k$%fdGAhDeE%`k-hn>(wn4Tmd#G12F?1B@KdgrQH+lkga3&F~V&%tVMYrG0ut}g78b@gfb}R0GC??4fI!x;W%;?-v z5%d|#0ewA%rD1_I)yPR)Y$Oo17!W1;dbcG^on+~V-i+*@!B^#7y~pb7S`Ss`WMgGK z_O7A{k*VASxdzD8(AE9bhR{>04e(_ujn_@BBy<7Tlzh-S>KBL;`4|j9oJXuBO`(dZ zRp>8TU6|F{+liIhsq|*;hx)6v|CkVIA1(F~nr)7uAKRZm_&Scjot%C_L{9gCHO^Y< z8K*nS$M#0b6zeq#p~Y(D8_Pfy%F+>V$_xMsGBO6Dbxx}A7Ohq6T3TAVzF5MsUwX~>BD_29CpkF0Ly8^TA-~xlp=$1P1kLs( zLRSq8K`?{=KxxC1>MtVe0fm;;R@bB%y~C~bZ)c~&aRfJ=3Qk&?B~)(PN(PzH+C_HgW{&K z66Y3}H>ZY~D@R)9Xs z0>mLQMe8=`J0dr9rvQjboTt#$7D{vZ8c387fgTY4 z#psKJ<@ta{91{K?ZkLP-eh70xu?uH|N)6p)no{OxJNQZaT1UuYX@xK@~V44N+e~0<{(E2GWfW7 zC-mxun@pt`kB;9ok{jPjPwIlD(F@>USrcfWED(AQBa2YLY)6%Y z0axQo!>9N{yJVZ5^w|M1|3Jdffd5fNr50K zG60GDG9lsza@U04WLx;-sLYiNX&Q?NpI%IY-B=8T-DTZ|LRoJ?Tl!R>`clby)Uv=co`q1#v^}EBh>s=#x;=^N#8!t!xZhjrs z-%J~>+vJRP12@JGfupASz>0HNNFM7n;Oa{8=Ij=U{LMx_pDnSQdsK3I@ig=pGZyYl z?}J^MYl8fmZUSALPz5JVU?nrAa=;z*VMyQ1Incf-s@Q0@XRT_sn#Z4g$XcQs%#Y7? z&5SaxPIWR`M{ykQQ5n&RF)@!bG$CB2LDq97EG6hu#e#EVF2J3$NuVk^Uwn7w4(tU} z0Xe@qDtT`8uryfm7f2lx4gLdX0xuvxi2lkv-OyD`5H%@XP{Pgf%;if(Ecp)ZZ|SqbRQM0k4Dbk#BI;iIAdp<+El-J0v!4R&7T4f_ z#a~joEGuavc85$I=ML)HN-mnQqA2rqwF=D=&7t>*)-j&z35pm=ra~=jpP~UOLO~u| ziCvICg`Od(Ay23-OGRp$z(m^rK^nBRK*`$S8|j)^5;K~!4s9h8UBLqq)|=^KAE67hl#hdwm%UNC!oyX+V1bX5$B- zPUs+(UbbGp&n%ZXvbamQNxLg)IBf;-o2Sk0gPtV-nkzu1Vb8GP9$ZsMSv_BBy^QmHun)$DAkKcS<;y zIL2ccjMyy9jM{OnX;hZ?aQMolMFdt}b(@`+1?W-ryYe6A^J~8t_v9 zf#AeTfWPZ%fbC#q;dSu+HDhUA;Tsf2bV3fdnuX5byp*cp($Ki2SeX&_cf`|`Q1s8G zmxw_o4-v(J~2JsSUgk^xw z;sF3HoFSrF6}D-i;v-Q+`X}^IliiqB_TM-|S{E=$QtKWn1%kP)4{~><#0?=nRn&nr z71&50Ui*Z&Ep!KLTk%;l19K%LdEp#C$wWabv_N!!eT?lUlfnB0L5XmZU3{`sum}Pj z6&yktZ@9sx`F~Z}(wAXaF#%UC!zNbCCLw+x&R{Y4ONe*^9O+8VlTJ{Tg>cj_fNyB` zf-2SB*Lp~uph@jdfH-2-dZg0N&4;RaARzH79}0JdTPX&K?!z-TPD2i@S#QAB#lou1 zhdjz!BU4TCU!x6l;JAq=ajA*Eu5Wi80p?PJ+)^6MtOlS zpHUK8_pbAB{hE?;wBO?WBg5lmdt|9t4-0mxBe<$54NkeL)-S3&25M zAkc5kY>UlXA(+~_H~WxxSpR{G7rG$re1xnm`<~RJrE#g3EM3&})B}iUCJ0DfNkN{O zDHUIz;|nV}J2qp73hDMs-`H)7ujbdsoQB`A#ba74%@b4XYyFjicZ2YaLlYlYQU|xK zqz?*!3DZvnQ6pz0Ahg`|GTIAZ`Rr{_?hF?}Vv7U`vq#~;wVaJN!d@P7trVOfokh3a zqO0_wY3$z!{h1cY5n-6T&*TVbVZjkuy|9QXrRzxrvdAd2`RAZ`(GS#*Nym*fehAd=GO&3>u= zwI%Hzs64e-h>ye$X`!CGQjhAq;sWt4aYYNIcUiez$3US%FCFJ&zD{^)E`qu01C>A6 zR!ht2c1tIkxS~Fop2D6qK88>?Xd$IpGLTEEFzHJgch!y>HX$C#W}%I6dsXhKWXr`v z0b9^#gyC;oq~egoIlLH&#%+~CTlxe)(jKZ7+%HfYnIct7r<-$*Z z9q|tY>ayE6%Vgule8ebcyTmn7E})uKxMjh3Dr}p(Hebo|SV-g(n6Iby4q=2lX9qbp z)8thY-Fa!-SS0^6eQ@>Uyang}#1-KJgCWl6^z&!v=Oz3&{-8fX4ExC3VT6O^w-sr@ z{Q3hRh-(5!7Zgh;GPWG2oHVE}3n;lUCe5E^--K+Re7P1rp}gTatFz`eAt&k{B(Xat z^jE4!ofqZ14ooBuHcm4KPEEMBMfSuEKJ5VvzVD)s_V@etIyCWz7CW+NGDGkBt~4GW z3G4dMhiH2^(bv&1p-s6wCef)qW7^fpNugCy|7$hlu1%aBJ3Vk_{Olx{c5njG$s5@} zlg~4*&!B7@s$M8+zA^r|4%-Lq@}z$#9Pg6t8KWyzL{qz}>U*Q=9I1MZIn>EYNGq|t zspd;Psl~YMZ!@X*UY0|@T$2Oke3fZqXu+8=#g;=|)aobwziS^+FIRpVnP`4Jf@<6| z{k^qiRe$)|oC`%P)Ejl>CXV`Tfaza1PA|NJS8V*<^6MIao&pe%ALyrB83-^?PpTf| zBUg=%ApHXhu&;>+bb%7e*z3ev-AF=@?qQOuEK`1YMjwe!xm++@+U(H-Os8I z6!saUDW5a%RAC!?5pA`w7^F2+eZ?e{^xj}Ye!m?=<%PAOijzm34&0+t`>vm_AvYx6 zk{f)%DrnD$Yi+<|N9X7~@19WWz^t9RyT68rqK*bQ?tB;id;gT*p=e07PSU+lyZ98h z!X3UlM~@~%JxzKMWuMd^0^DB{SihSW;k>6NdVHsHuxAK0J^_yFx5Fj zYpJdE{<-HGk7Tu$V@fnCrZO<;CI8O+(kyF8zm)R%RZ+)6q54|NG1$rR4o(^{KjL(SMS1Wm7L^k7rfoFP9Dc>nuK$R#{H} z8Cl<$=HGPgeSPtsKMtL$Dc-fTHn(^%E*)SUTt0_Lq*=g zLa)HkRb|%Zi2h595N%KUL=9bUbyGdtv)ZSkPPo>)wHjy#xmw$XSleFQb=*C0x3;Tt zjIoEx-ZC$rJ&|6*Sf@~Ktlo~W9rq(QBe6T`V-pYMhsf<*+GCa^863MuH%jqfz>fb8 zUXOYkml)A-&@C)9?)Q$n@$L~?vF`%=cP|9y@2c_42qgua2!9Y9?Qi1s$nBPwr>m7; zs>5afrENAoH|#Y$LTvVjbh_v`UNTz^>~gjC=Gr{*x^EE_8tg3NJ8DgdlybL<)Ns79 zBp7mscKMfZkfhXOq(dv1j_Q@8YT zyn7~$#v9)|DMzJIQ~Jqc*L%_?N*hDE$qgFRp)y$a%?dASc7;Lrv7(u_u0Ky|u4QP| z2#fpLGt(qWkv}k5$h4sB(?79k4}J=hU*|D0D!%2u&-+vQ`ACM#r}&?K?^aVkyl(y- z@v1Uy;w9*>+sl!H*Y71W8{R(2J@k6A$l+sKrsO+jdHL@hWlw%jT-0(kFE=yjZnIpn*Vc*OP79*+C9omQR>5wnibezDFvo&|m&j~wr2 z`#XVHr(&-xOMmCn2Kz(*bG+d~*DCVP(6{j%GeY{f>R<7h)$jJ0*4`g9VSLILs&mgf z!c5Ym$1p3z%;B`hL0i)G-S8{s+`{caWF2hU~!JICh+DZ>EaN+6VK%d9z&C!hM;SRsK zp5{6xrM12PbjjC=hD!WUb7ALDX7SFUCxs`eCYeVDu=$gHpqw*31NjESf6Cgr50vOr zuw{?CB$_6g?$#OBCe-^k&o`Z^y4QTVxV>tin$}JKcf0(2-rc&#rA}>aKQEQ$m19~z zq@(JZvK_0_GuMhEQ_p813-Bcs|K$JdDQ-yTX1_@}Qw;p3S?2n)zO?+OdI>4{Pubj8 zLiL@rnEG2k@#WTOoO-ptf14=jzgjFZzIWfN2ptV7KTA1UBQpYRmLK)(kQ&kMksH(+ zo1z_|g^d21TO9M6y*2h@;nhgNJY(P=yLG&aePSwZHFvIb9Wc|o7P;_mvygFa1GxBI zbcHj$k-HqdR=9eAZ?`(gj)(RM&p-j9>wtx2XW0&M2KWT8UH$_wnP>~sl?wq*lKc=Y zO3e^+?KMo6{(0G-M&3AYqhrLkmRMD1yCNN9o4rOi?ZeG)S(aIkSpgs5T&nU$rm@w>EAMH#U(D&NA!?NHL!A zZnrG*WLT2jTg_G-G#$&`My&IkjBT47UOFeZy|$0CUvms{dg>x}c5#%k-{Apv#0DZ= zi+xTxzu3Zu9}n*HIvsG`)hgUHpgXuJc*6V7_V~bC5hXr3JBz$lcjVY|L;74wcXpWu zM|xR~hViVsc7k-mg3g;xM~&*JhIMM6-Cn9=@5fP%@OVqU=PHAbvn(Nr&0N&VwS5)6 z)pAv?s5;?;2&3}%(d&d-*&3`JGy#(U+gc$7_M_n9UHIiSNz9NSULj%iyW$IBr2O(S z94)b&gSxn^g6LV91;z0W12qMmyvmhc_94#SrNhgnqt(oav71Yf-iNaj9Z}P99am=F zR*sI z$S`@oKb`z`B~|*lbN0RGwLhLc{+x5@2{}*mNoJnXV`%=brNJX(-NjU+v8olR}&*$UL{=eAROJ}+I{?wr~ENJFS!%J&My<+y9^~|xZa3`xlQiH zdGzeM<)IcSGE0d)c)k0PS_&U&9AZ6;g^ru`0i`eF8- z`p+FKHE!C{w3e-vRd1TBD>F<8s)=TaN>Vy^aeuT;(1rweOqQZ7s$Av-dM7+dYL}!K zKDmAgDI@w0e8UchPBC>QJLil6kLDC5Mkf1LDg8|%{UM+bGrLK&L>~@(6qwY7oL2dtfG&_HEcy>Ll8*O=8H`#K#O0$_#mfGx6cDdE5P?B}W=mD^5046gM@v=dM<$mqe8f=EtG0NA*D}zNX z8AH38z{BTTmB+5P1P(5=Bo5IisG(ck&3!JE;J(yR-;sM`^&@At`o*q^e}e|IrXw&q zb);!gc~)idA&oBp%{^I;ru(kRGDVVsY)i=#oLz`Z{4X$1Q8tPQrYm+LZ%9Q;-IQy_ zt|^3&fGB&_C+KeS9@+hR>&VjveyFF0Sec`y=j4yu-;&d{0mv2GB`P*J-$hN@1!L_T zYvf0qcgpwLZX>4J9acoyq6oKaV$@FAT~xQQ{-GIQ6;7_V+M%OvJ8$~IURlq<(%C}A z0b^}x53$+laM~f-`J1ba<0+5*E>Hbm`uBPr4Co4K2wmK+vcoIr=B^z9DKVv9pZA;j zx5QyRt@a;tqaBL!NJva@xqZmd>BgZzx1S02ZXrkJoxdGE?W~{J=Qw<*&LuDYwxd~0 z#kS07rqk2NDd)FgZ(Q2_kGg1k4mni05M4RjemlLf`p@y8g_F}hLvu%0odEkyt!H*u z$xe<(NKBVvWkXvIZo#QqneRYQzF^D5BW&*}r}_ouCs!s-J*i+#gG!$bwWoQ_Ipi7-?Ee)x#`uMtwE6XEu;6PYjrhfVf}Ctk zqkZcgk@!j&dXsXEwwZQ$I4*q`b^ITxcVF&6dqeKluqG$2C9wonJy?=a?pl~$g{tr` zIbBv+Qe1YZq_XODes+0NiDS)R_TQpY1zrV&0>!-XEZ+=xiAe^r^!V>Lg=XK%${8v7 z<(Xd{YTS~W>zBUHHhOx1=#FN?Km_q10(v3E2kuUfCGDhGHhU3;#;Hh$LlVMEGpwt9IVafVATN zh&1K9h31V=R{9=tj9?wjQcB$EOBme4Ae@Sk!d;8WBTU5!lv59VR&0o&s7l7iD9m0`Q8360w|iMoLb%HMr=C>waDk*>IGl5)2Bl5X4FRVlMgR@Surpd4qDOwPBx zt!8fFuj9H6r!#Kvp(n6InyR^;G%R*DG4Jq7G)wb&V%p?aZ2C3us&P?Jv0+!xYkk;u zE3LFZKdtTl5oDfsAF0CqylSmS4H4(kNK$g4D}CBVkUwDY02gXzC)=&phs;+Gk_8hf zh_`Zw5VMF#!~%#Vd3rqw6tx-(9A2_qFQJEvI~be%I};r|h0z!MrJ-zL_n;X+v}gMo zpnvDOLC@<=sb02NuD4|a)-$w$?{62*QR_F3_R&^Tdr~>py&P^^&)J1N9kvTnU6D-n z&fZz?*1a=#+lr^DEz(mbo8)LR4QQHL9e?Oz`M1F%WpRV8`Pu!X%z8@q-=BR0zk_>X zldpG7q75Nap*|*;w&j0vs&p@ReWdCvkFYl`u8QZ>3qR=}l&D zT%D=k;7<8V%+A~fJ)DO@mFT~a8O$H3T$TvMS^T1OV%40GCHPBvx=tb+!A4X);SdcG zdP%KJ;jpSL9;doX;}+qHZY$x2;ZwyNqvN>umjAHdtz#6OT)+yK-Sn^yo{{ow-;=V5 zzK`Ta0>|WX17^_?z8BXf!;-eSXOa9}-z&#D zIcj}!tI*VPCF^a;+>Oq-A2a{z*=k|yf5`NK?`iAM?fKRpBAhMuM*z*wMAz#Z@4Tw} zV~>Tdcbv1jO{^WsWPcs;P^>SmCvHtaKS3Vfla!($k#qs`{D_f!&tbNlOQMA=G~Ngu zxi<%8zng$T@7#qd4UIuY`s>T`T`$O9b2*0E%nX#>wXrtT0XZ2voN6IK&D65nO@K*|5X43FH;e za-3w%*?(mV7jL5v&}*ej7++-WO+sOxCig?)CL+Zb#xz9jgFp^@^xuNg@c1-x@au3{ z|15>tSI{;v{Ja4$;9ODE_qycuplkuS?@Ok^FeS5cI6Ez7fcmXu!ZsC0%ScX`79{_i z8~R>3^Z47nx#^Va^!DEur+@wWJBd#n9eM2S zX!pUwfp(2-=T2gtYG-8La+~G9W9>`nyV@?M!P-IJuXP!wG`0qPl<5BNoeyQ~<-P9F zXa9x}ubO(VJ+bQl^Q3L`+KZggkmuJXgI=DPwR}UKOMmUing4WQdEiR|5B1$}qy5hX zv2ymfL`gxG#OZQf0I*&x8P`52(bQKf0UI6KG#GRQEWxWqLD^`@W-`op)CfW`}Zs-6b)^7p*goB%zJnKyj&TFXi${^s?)`oQVasWt) zdku7X#Tv3tAO(HPe=0>?mqQ)}79%GBa779%1fPm}O-zwLp!Qj{OqoT_*ZijEsWW0; zr|#_VT0_CpRolq#mD+^gCGv@or|Q^9do_pMuQg2f3d!+%QJTy{G8*5L$m%nRe^rwc za@E2UBGh#gWK>Sag_B%_v&=cPj4m?N|KaYo++X zS3?Q!%Oia7L#iAOe5PjaFVIpCW^02(tMvI{V+Q$=`wd%n3>gIO>eaW{FQwDFKT+p* z99%;^_L|D4*jSbMxSzzN*hr#uJQT;-x5akbw?kfQ|7AJR9+1q-2m zv*pJNhnFMP0@<@`7OZxOYwXm`ze~VP>BXmFDVD|>m;F*W#j4^fvnE!$mx!F`1;^!> zMgC$vqnb@!_>a}Ru*h(jGg{a~|1b?6Z=Gox^PT-OYBlzq@_7{96+GhHQa>oD@f}XD ziWp2N1ovIfIonhGucbHn&vO5ZwAsGzKW6%NewQC%ezT_~elDAI{v|XR1<}@9PiGcQ*twA2r@t@NR6IQ)mdE*K4R+VAZ!XAJtAXS>JtyUBKr79KCQeTUnYTK{ywp~T(bH@(s@$LYE z=;VWChq4<0=^?uLW_& zZ-SSJKoCpC2=qkbzN9s|2;`t%58I`&23=8igz zN&4GU`0lGG5fStKOV%(4d6zB^8 zvATgEIUOg+VQmfwuEBP-?6WP}J$e!F^stid!;KEza4 z?Pnw@8_wKNzB{d{sxy9)m@zg>L`@hHVrZvv-9rx)S_TbJiGz2fUJc7Z9}O>xJ%?R{ z#bXb+M@Pl;Oxm{TXA?KZK2F#Vy_h`MN1M!}1kd?)U7E9R3ukbeelD0db+NLVS=`U{ z(W~-xb$p3>kl<9qDDP3@S3aw$T+q_~-)dFI2liB_8b?f#Wxb*JvhMYKW{>tuGEE2A zOJ9fPmRg3hmt=+~SmG^V)yd%s=49U^*7Y6_P9r6nJ>G%mhPH%rkJUM?;%iRuKa??q zh9&l*-XgiRrzIcPt&09hNEH47I27{08bw=)nc`D2m&#kw&&qFM3M(TC+v|Lkq#Hr_ zu2vuQV#-dn6aBhs!y`1(<;h}_(QG$KihiGTc4yODGf7As)CqNqzhkfCYX^LPp+8+^;mgk)#+dLMZ&^-&OQl9hcW!HNhhJB1|36 zPX7E#F{Xa?Am%IIO|e5jB)k!461&76YO#RV8r={Rof@frU32tfePx9^M&`tK#${xp zUY{0OcTv|=ciyC2d%*mawx^Xy6X^6;gX1zuHuX?Y1Nm^&s{EoF)$-@!c8l5tH*<@HLd&r!qO+OTim^8HoW`ww|$i&Ag%4jZR~q>M-MF)w?G?SDc#uQZ`C|P!_m|E4$0SSag~Hv7};cTPbbhO)(wN zS9%H_Q}q`{tjdMS)}MkIH&sJT+6*9fJC1?JJ0-zvDg%6Ca34r@xECZr%ZBt#ltGV8 zt3pmOP!RbAYnUH%i;l6#hY1$K5N6C7X?dm?MPitu?@tpjRTE?^egdtiH2G2K2W<@3 zF??T{I((b-d^AAKhX&MoF$&N-O|vkVrF}4ZKCxzMFfC!hnk}?+WprClEJa(carap~ z;xo-&tjn1!ik}&8NJ{Bfz^1hyNcn0#K$~ldurV5SxC`W3by}#@96E&Gu?h4KM3t>xbyJ>JRF!>K)gU(LbXv(y7yL)qZ7Aty^bsOs~!` zNDpDWTlb(@zX8E4)aa7g4P&l_w&^`fA2ZOFjw9bD)KaIyNj>W;65-@~;Q5PtVO*v=6g%Gy-94KGjhfPcAZS&PqG5eVMLz%{N!Ng*)diJVe~^guYaojbB|M}Y)@(T$?m>hTo-Pjty5(%p~Gw#(|Ug#-uh>1 zvkf!5r`?M_-jPc0=w4yaD2mLHO{w})I2#by!m1Ag+^)TEfq8OJahv#?C zs4eKsPApuTE117I)63X7O_{Hno?G}i;mEWaJ2qd?Kg*=|SS_x0?PfW5bg*+;!OMkB zu;r`<&*lB~*SK1>Jl<%nktn*>a{X}K*hX{RFTkO?+mPQ4D5=GUXw>7@c)8WCYw|_Z zukyPFCKbC!UMOK{=1OYQAxdxNniMDJuPHSz32=$a@9`g2PvLF}-s4g?-s1elTm=bn zs=_H?CDs-=iTMjaVZApiF!Ads%w^GvtPfuu){aPgL#2WG;F(%eBDds(L-^`^HJ1zH#d8vc)TEa24Z~olh(2Z2KZlv<{PJSv{BAW}YU~ZuYqIAZoMe{p)NcI)#@yLzKIBl zYTCcauG1FWsQt}VuPI*oQeHC~P;qqnO~vTALG{@&UgeeHnChSD)dB@0R>9C2yGR!n{wbImEaMw6<>`o|SG5jeIGQ*`yiPCimZqUvqt<&(h_;%+TXLqMj`mJ7tj?6>742}V zBAr`SzxA$KUDUs5@!mkv{Gv&TxxdL#lTbqqBU_VZqXbj1VV$X|@n!16k{9h5*|WhC-V(BMCc%=^ncl(++EnX^z#1*(s95ky$A4u&-IpDPS6vKH5Yr1#T65WmxG4^FaEt^{8@s&WIC78QIaIM6GPsQe z8``(1IiSO2^kmO{=^LA?qxj54wBMM`Za>CQX*e)_r!Hv5r8;t^q%2^TUDi0)SuB_# zmYiq2EbOJ5=G!u4^Pvkd+5hOxIeLtjxqs$XGOH$FS>d#c*&D+*b2)t_xo*_sdG(zi zb4yy#d9{sy3nCl33a4s?h1xaQCC6&#%Ni=rRdUN+YPYz)&9BO;S}Em`l!l7;y>^v< z2fM4-qe}ITV~?A(Co)>jOayiWPfB$^m`tKlreg=!XCsC!=R!wu^L-PwjHD?khTZHX z#tAxY;qZLG!mfq<`6CMi=1ImS=1Dr9`EDA;37fvN>^<>$Ib-Dh^4_6CE0+hHR*(0c zUiIsJCh+WK3iGLI8x2%viOW=XNz?8Ggk4Vy>Q{e`+~rc(^% zxpToo=QanU0a<>pnZkdiP2Tvdb$#=JmYpP9^DJyot5W)hrax*ybvHUnu+Y9<*$WrnBxu!comb$V;AH+4N7?`!?B-_U-yjihzcI!9gAG*ah- z*)z>pBTwy4gCM=3gj9FN|<&2rTx`K<>8gC z)%NAz>dsdDY%s1csn4o--WXY})FP-+YLu$|UH`83W5e@CquSpM1$AFq#I-%`lhq0x znN=6Nf~sge%*sc7m#VymVk`7UCMyIZITh0*S=HgAX0>X=`E^Z$PZ~e;hcxkf_O%GQ zsqO2XR-Jd+jk*onEGZgoSE*i2=lYWy)&@fB&y4)7eK#rCLL?{Fz~{-eZ>}j z>L)+~$pa*zb_S8EqKd3nd5$Sj%}^97OA;s5=G9-S_iB5PUl{AF7nq&X@UdCez}v@Y zr)~??EpRxdC*^qF(A&|`Xx6^Pglac$`ranq3~6)9+}!q~InVmJyZp79aVfTZ;MQqf?>1rk)8oyyBF}E8pKcGF%Un8L`<#p1!yLOj z{TG8&t+&-b2%%|0J;IQRAKznxl`lH2H zD|c9+l_93&lIMcNg4cXMLydu;`_W&|J)T;cai)Ep?i=o#?i>6$gYQSqR8ci%Zg=-i zcXb%fmbLcHd~K^XiVxX4OQ@wN=f`Vk?>_uU7n;@GZYR_NT05@Nz|2@1ydv zPUnibmWB#i({h<~-M)%~s`T=xa_h<+Wv!KGO3JD%3!Ce!3muv+`UwL50toHK^p#JHcL$fwRw(T$@s?%%!E9DTwrzc__HITQ!8j4sj z9(z51dO~vk)3nNb%k200hxBen;~Z|DGDliC!3bC=p1ritI_boWqiqRCMlLTp4;M27 z20|9w`%GD!9{SQhsyrLj6TjR@S?11lJ{L+-!q!K-D zDU(Z=@sK|*^+LWx+FS9C)Q0?`lqDuz+EX@FN{F#_RNH1Rr+ME2r}x?^-B`}m z!=l}F!6w=Dn&XU%lKqloQXqy7M2Lqk6^gI(TGeHD+>y0LB)o!`#JI*HpX zb$e_BbPKG$>bx>Nr1#EvN$;ZJGlMyUQ9T3w6rC%&mo;B#W7R)u1*^1c8{yt)=qM;@ zxS;yfzr*d-en~!7z9n8HO$*(WpKv>gnv3c9!Z|1|cf1CR9dpEB2QkQ}J#z5It^~=W z?X7E^mZp{DCVLj5fluFFQ%ozbwjF&|al3!0%(Ppz)TO<$B%;}%G`DWHRIzHQbh31) zys+54I=8T+R=Lo$-lx#7LBG(m@otfQ!{=f`Be686Ub<{gy>#V^de5rN+EX=@TGzVx zI^%}LTGJNgx}~;1b$~8j%~;p&2&kT*dP3F!v*5Ib^*E|tbuTNsqh%y7kJX@ zDQMra5@MSB9Fe+QB2D0`Y%vA9P}^8Om}pLvk{fp$VUydZ9L^6{r3g-`fj6ww8zlTS zMnGKhAoP^RH))*4oNOrBMLt&35dT|qMtNTAjb?$)xPGZlqe+Xdi%KM2;jHj~wlxMbmh$qS6KabdLN$$_Lm3q8%ob_~a z{_4Ku^wKTVWyuxgZs5}E8Q>c3d)T$iU(+=uz}C$s@U1&A=#iIvV5jH0zq@aQ-vR%0 zpM-#~UXO!gJZ=Q9xvgz)bny)9a=IL`VvmS4v6GFOv`C8DZ6XnsX;d0Hp!+!NhF0(P z1dYM~x=M@ZIw8V&Qz^}^AN$@s8J%H}3Rl+n1bV4Fw)sm*W6fDkLy#qnUGW4nSk@bO zmViIGWVYqT`^t1-$};-r*)tdEZ>PS`x=##G{T|C0CyWJ*u8i6aOOI;z{~5ycTpkST zb|3WUh#q>-W;1lVd2aA|{pO%j?Z+Y8%EI9{3!kr!5XM$KpoEhsJ2|;a}qk zgO#*9y)h$>3%t1(pAm=NqMAo`{<;W%!Wv z3or|H9#n@F1HUN-OFqYi0r%qR01&=5R**9GFf!=ug3!RNiZVxXRzZwSsE5S8u9jy~f|iXl1S4@7P=j5}lhIR2wu z^PwD@C-F|!#JCl!gR$<`@Ae(DX6 zsc@b*-R4+gT4<|p2C|B=h&A`LJZWlY5p4{%_-0UU&es29azW3?$V*pJe}@iC%U#P% z^&I&MQC2-op-{zM4y^2r^dnt_8RFM~eM(;IIf_j@0hYe}4)b-f4lShDNZU{0A##%o zfX_7jb?8VXw|{7K5!b&yv%P1FQ%^lM{I=^{FRin-TcmD3W`C~Emzv)UqAPHLYj zdD3~e$g%5r{xynxeqZ;`++RJ=eAC`b`HfUkfkN+%qPJ8;(GKcXREH8$qS@_JTHKXh zwzvCpWq#M0YC%_0-C)OwhI1YL&4;@lv_J2pcSv@9=$!9T=xp!)(hK4{mS$fQ_6al z!pfQ4(MkdDK+SXhO5Lv{r5#4qYI+piE~1^ znM;E63^hUTqJz+%Yb4md8ZB_={}3pNcJuRvb8Fda^Xr~#p=%(4Q2beNYh#F4Ab!Bx zCDF^fC8n%8Z9ZNd-|$Hakysz& zEcs9_8`OnygLh)XWgcMT(1{rJEsF08r6q-Y<#5H9>Pd>N+UFE34E|F}H+_XOvbl+O z-tz72cD#*Kbaf$8J@S+dJ@>2Tdbz8qd;L+5^8BW`&GWg|QO`xq9*;?_5f53dN)NWy z2~WIctlKx8b~i1(7S|-b-7Y_juedRc{ar7bSGs0cq`O&Ihj?~c2YSZanE6cD9Q4t* zed}vxea=tEGSQD>nIG`XYG>ex#rN$JChI|A#x>h@4G3ZK`WE54v^GLh)U!e}RV}t3 zC4>dsB0TVeDE)CS#zLH5qU~*Opj<3k5E%x)AqZ`A$woEY<~PDe;YszwO)-UREoE8-qx6^+!i|3pd_|wVrCQ}H;qX~nllu?ffvr#1) zYsiyUFtRk9H{3K3HdNdfJba%*8MdS1N5eZ`4U^lbBYT_v4f!+|40Scp`z;$vsQa4F zQ;AJ(ZODeKrqrhT`jl3atuE$OMRQ|TnQQB}k`E33d3DVdx%=A9a>$*itcEUyOk%%T z_SYe=O#AUW*|C$qbMDTb&EI4c7Y;6D6u)1JFW$reUP>^oN#vpGfe3Z(O z&y>D^9YnpxuA!DN`!MP94{;TWAOcoVgIqzV(6LZ{qJ2Om&d@|N%>0lZ$Kr}%m{ptc zb}Nbn-BQtJ#HMIlw>7~9Z~5KL(OSW$-_p)s)*KbI)AB`lu}OGjtNzZYLq@i{NA#=q z80uE;I&SC@^GrW*&w1U_oxQs5I|lVf!t?dEhlc8u2fxr=40xdB=DSF~;TfV4;6m2; z?O3nYVC$+*w4!RrSbo=t~WL>qTmi_1>x#YbTR_Xc-ZJnj8g=YAhyA zbsxGwC0eGMI0GKTk-;GZ81Ny^SoB=sIxkv2o(qz9TUeAUn**RNrqhvM$K~NSCpN&x zhO0LB52gvIL*Xk22lgzb^cK#QQDUe3DVXuVR@;Gr7R8>P*7?rK#;TS#jprLst^IWe z+8e6vI7tdL=^d>|ro1dm>4lW5^;|E@={`|r`aeTw!PVy0MB%u*I}+Tr zrO;BL?yk3AOWobwy|;er?n+&#QlUkPg#bxNAPI4IPd@&^yUsgn&Y3+k&u)qN_Ct8@ z^V-&X6+?v0-@gcdet*#Rva+(pUbVKlqI$V7xh}S4cGJVg^^NCR*n(kgvzs5aEo|;9 z<_I>lKWpmh5H$2u#x~xR@A})M%&)to#Qa^Pg#X#n^|q=@x#d@)M)K>na_`T6rj@@> zSQtMM=JyqYT(ZiZ?oB@${h`X&AxkwSl3H6G{$BS4Ft)KAz-b;1EEKUpQzepcnp6p5 z%QrxlcR9hcbSr_64I@DJ?FRr^4lE$g*9>%o55g}4CD5_p5s-W!4Dk+B0s90hLd*qk zN0b5oU_jmI>{Add>KZ5$#tIcjCi-##&A!CY0rv}UiG6;6<0y&vU7pBW#|2Bxk*G+XyQT6tm z(j+^$>OQVpUH4s79nK!sO*LN8!L%p4Uz?*1u^nx?Sm{a4!#2BWhH!)?t1X~@E6C|o zv@KJ-YCo-rZ(AlQ6|I-#wm*_AZk^TiR7?`QYJOQw6f>)WvYXYm)(zkPlkmR}ml3|~ z>wNUFwc~Pmnp*X#)1dyM*N*wpW#04cj8*(aX+HPuq`l|QE))0LDAT9!r>zGnRYv_! ziXl`9vaG2U>4*MZX~Z|}uwdJk8x-Qf+MZIkc2ehW^=L&e&0FPnO+Y?cN0FDP|491j zkGH=x7s;Mj=E>$7FcOd6(%fjABJ6G2A#5^6H4Ly%6;89Rs6TDHRx{N*TJYM>7sQ3m zHT?rx*{T7I7sUa#wSIvMBpvWuvJS*PnGHQnc?mg0dl&uHunzOUdJ|XVBNAzmu^2mO z19A>@CX$Xh3v9+oz$1xi5Eg|B08?gxAJD!=o-!^)bPPG@IkN}YNUwlRpoM@#DQ?g^ zYAIYprl2~>dvOXzBlb4!Bkmk-}dwriw3`Fo<6|c@OW)q?yrU zr~i*zIQ=6xbNVjs>1pqxT~qDR2PW6?SQDN^-5L9iy=t_Dk~ZufEqaiF%;|rXoZp8} zzSb)Tb35lX#+^})S)O?U+nm0X6iI^+E7F!zHY7KZ0SP@wjR_5ObG({-G`5oPF{+KC zi7vt%yZ)>4 zUA3)i-{0*jNp+*LXZ6*NUx+5FCd5#~8o ziC4QKa-i*(w7-)sdv6~jZnAA`Sz@`{7TbN-4z*uvOS5cfxnNt~eBPW~HN|}B_ejf( z>Sd~fziueL|MV(1{v0Ff`++PSS{^6zza_OA-s>cxZ}GC;f8?DdHEWCq1&1uzEp?7* zE&qjcM6HnBZC!{vVkTPIF%X^AISFx6bdQqVag3X2(x_J30B(zI9TVhkr4>dt z(VOAhsSz}qI0@Yky8uc<@&QQr>)=~xxAq8$_ilpzaKT`7$0AV3IurQEwkuL*oe$h> zPYa)Sn!KC+5%=f7TFZOOSF>O5vtf-lZ3090ey5cdn&SI6oD^CQ7J_xiGR#EmH7tiZ znYf?pB=n8>fL|5eLcPuV%E)6yQ+q{Epgv9i$o`#nH|lu$@I*z*>oh?$DD5zRah^5? z+Ghwazj#4>&p~Usu>;_|{63@k8~Z(ECH6kagB320-_suzb)e7hxc$Zd#BJ@ffNjdJ zr;p4*uxa@f)ctuN5+bLX_9%T7^<7*uA({=Q--xQk)WH`F43A^sk!oLar0=5AHH zQ1rV-GOBV&$H7Xgtfqn5mC|@Z`)~ap^N_~tmL1gx)QbA$%B!L|N{wW@vb}x1yq7da zY;7-VIx77m{4621o^9{ZTqJI6t&F+-yHr-rr>Zj5VD7jx$WF z+Nj00QdDo1hg7``Ec>sYR7_C(hW&n^48&|;SYwA9rv zeBGc2%`)5p-q#KS%+?z|Ix&N?dxMhQpa7pheu!bIfNYBiHun8Gc zkU!JsBfrK$F%{99Fd3{G>{bQ`vzL7oMPwk!OPD=~LF!Gsf;^>LMZE!;gXF;W!Q4=k@1^c3ne@B;=MZh#T|6CuFJBR?_n)KMCGYv1JCYI*KlWlC}NlHJkEghv#8 zn%7EBH%)D;sLK!ysJbN?{R7)t@cn*6xN?7^q`IInvHDiSg^k)b_EP4FIU zi1!Zcp|=*kBv^=j0QrI`1J{vugVr+jfKFCTn8j=X4x!b6+>9;Iqs;fnrL=MARU|%I zjkyio3AG0HLy+FZh{`}F2p1j}eg_nW%OF34XCYiL4OJBz)>G;_CDi#`SzLQ(Y9zS<`tc zr?&T8ZfWoI=p}vCv0M8=QtSF&&O#Saa?kbJnw!*XOlEA)iRsBbH)ncv*m=itbcIwY!SXC|1{xB!E#*BLL|1N$2TM* z%ZdDwnFE7nUxNB`cSAR4Uxe+=A|ZR_B!LfS7ew$m8vs!`QGoSXA0gLsr-EN(SA+It zE(#O)Sb&myBOqX)ymQD{?*(GCyC1wMya9MAg77DY|2p;tdYU1DOIlpSp;1Q4b@ib} z1K3lhD|DtRcGwoQT{7JfaLxa<^iw|)N;@YCkIR6Y4IPq&b@*HM=qLH)JMTv~C-ed6Iz-5u?^=}B^k{S^1Z@D;x|G}KoL zyz0pS18p^sf%-MjAG(jAFS=f^PdX|-TRV^LQo-4!Dg}3$YC=@0@&uoxu_YchPfRZJ zz!DAt%)CXQ*_^|G0#*@V1M@0GN;!!bkNyXZLG;H1pvy?ZK>uTI2KS6r0>k{F;PUt` zFeTm!X-E`B4kzh=vr=+kuoM%lcLD-4Epa{aX1oJ(CHevEBX0>36phEI_$B!3Nnc5K zk_XXWCM;*akK4(59>1A>Fi}Pso4A36O4`5hx1?m` zj?SfJ7xlT3tmq3$WEMkW`xjP5Z7p)K_ZEL9YKlkW;)(&tA4Lv`w(mmlxspG?T_v4B zd%y8ONS_%IYe7nILXVKEKC7SSR;t}UCQ%UB99J3K6I(~0zXZLP^z(4 zXpto^@WjRSKm%pg37(^7nr)nEzJ;&X8R1tZ z`q4;k9o_J~X+-@gK~{BiLszxn@A7(5?MPupown8ScUG&gdXvaqc~vC%mMnewD_Oq% zZ?2-H>3-LkrcK5>jmgHZ^)qx&8X#S}n#79e=5h^FxLL0dgw3y8V=S?)^Xx562fh88 zHist)JHV3mYrvI?B5+8R1RAXv2|U(u4g5%XH!!iY(OWM)=E!R6WBJkgK%XUv(hQLy z)N^D~4M{rGR3r-;`gfkw#VN>!>+%ccHS(EGt)k1FtLFOl=yH8Wy2gcgN`H8=vLCQc z{|tE3S_e&YuI^^}Ex`A8>_%(4yQm92O28PO0Ii^mdAyd zvr{c>Osop$|T>dmJkD zcs4I*8*(i{eNWRsxI= zo7hCu#9t#_N?K2Pmo^zMNRLMDOv#03C2mA+OniVCm0Sj!oUt49DRnlmEI|jr#a|1& zk9+L(CXaE~r*(Px8T*4ZX*U7`Q^@X)xEQO4LovOj4m4Hb85RHzY}|%;qc4fv(uZxU zOd#DbD^C@+niaR~45iHezGJuJz2v6zgm|F6wvA``*gVT@`I~LJTouvEsMgbJs`d74>>KM})d_W{&^noh*~x?e~@V}In>x*3SlzcXQx`WK-- zjXk}(=26bKLa+UCtKXU1dDA*s(_~CE01a>TtF=oEy$vTFM*Tc*Z^Nk|*IW`@Y~SMr zI1ak+*?)Wewqbsbv( z`zl+=5V)n2fxr=$0hysN#7a$$w@GR_vv zObQfM@wWB4M?K$T6REA|S3*tURqVfgV^L%Kt%Y4Jst1RA@_{FE|BJ-sj|!;r&-st# zeh5g?-v#0mQUmj1A3J^QkloM7@QkKE3d(7nfGnm7IG9?o~Ium5K+Z!a8MKtlMmY(8^O}h3g^+Vcm_1Ue2zfT28HB=$AYEw&7bypj! z?o>;l>5iaA@VVheyy2fNl6Hd1p~iPnG#eD>)IAkPR7bkfR6o=` z^g;Dydy|^y&R3PV3|%`MJ-S{xZzwFjovI38g3$@p*fzq4JA0w_+RISKtzl$`eG8K2 z{|>zpaYOLH7w{IqzmQ8IEbK*OB%&pPL7$BLBz^_1re;HQ)C%NJ>Pt*FkrMNa{Qy0h zE623cH=)ajV&n*n4t5ze6LJh04gCxaAeTVKVi!Ts=!MXAs1wjJXg*{rt_lnwPlLf| z3ov~c14$oPSmFluHvA%v7n9Gb!BaW$^v(RSjO3K%?6h1e2a{LBljMHoHRb=qLG|{q z>PsFnQil+jKZdB77X}Ss69?{O7x%vrwXyf<#EHGosa3tErs|8{CoM0sCnpz)(n96A!QP##Cq1=f*M}86A1Aikn8&w{6 z0@2;qLtc#wV6Vmf#+-|P52eIjh(z-;Lu)u4;c>iGp&hZCgSApA%RAe8& zb6M!1)EzR4clk%OJ#wuVl-tkO@@>PazZ+*(yET-*ex>5??d}?(P4RE-{EnKsf#UUz z^cJ!}EA$DiB7JL0`%rQ3w(pYJ!c&r&!i{ZaAzQSiWqIdh(Mo zM#x{O1B%(|Nh-ezsNAT-$g{PRWC-mDi9^q7{a_u|INSa2-x&Xdx(k7|b??Gg>*qn= zHW1L88r_6b!U@DJZR@bTM5Wm8E#J^Z!l|&ct%tyDDJas~IXZAmjtx{QB%Y^TbQ@3e z){v$jYE+rmnLO4rmeH;u=DXgX`e@Gq-T$0dbV&Pa;{n%0bDaO1eNJSAyC8DJpXToh zD!q}wbN{^{G{A{?{nr76K(}n>{{*<_eGT~Rng`WetFgwymw8Q`YWZVqz#eT*$-EpcPY z7E)0foV+?+Lo3eovkaL{?BO~4nED(uYj^fD-kgjr{F3Bj$#E%jQlu$^Q#(@f(>*Ej z>`y6!dR|OF-D6nR)x7gL4Y{1`wrpkEo-}&e!Gy95eiS=f$vTjGm3b$ZL|dBMgsaSH zhknU=1;Ax42EwxX0!3M4A_KA+fk?(7w=eOEb87TO$0&}%-pr-g*ilm){kT+LDNE!B z(xL(~Vq72_FA93FF_DMpRiRnP2mbd6lji|+tov|ir9Z_rGgN1Z1Y(Q_{j0T^fnzFi z_=>V2vPhW$^s7fjinQL~U=26$MA_VQz?N5DYkbqv<`) z#r4Y@nRqnsT;hlP;uKoX0cp?j|7PUp*t@t8_~ALg{+zl?>UXSDIb>2!@hj_Gp}Xv3Y4$o*WSaj)HCgx`4$G}t~YIMZJ5 zNO#^cEb>g#m3w&F(Z1)Jet|_@kjUju8<5j}H==4g;hQGB?bbD3bxm&A?;O#v(LS~* z*Eq9jrTTKiPX)NHT0W%yT?e}PKk0+EzEXsEl1$vTPrAD0cH2ndloq6jCOjsd+3IM| z6)o;?h~F!|i-HP`4<#sROICLYl!1= z4rs0NpU@L}kw zU0iU7;b}O^a4r&MISCl#7#wzc%ENX)6jbAvKp%S@(E0v&=!4J*XnJTrI4v9k{S14; zTHs#)YUnc0Wkk>e#kl=H@d?3JdN=i$=K$V_Re)bau^`jAC6LG5I`Ac~3(~^bgZRdL ziE&Y=I2}QWUWkKYU!ihIYakGM6G+af1lxE$A-khCfEGtjjkHAvgNtGs!s^&#z=?5o zpg3_Us3GMxba5&UiA+6&?U%ZnbTs2DaYgoE(vjRN)KR$_h9q}0D=S~fT$VeB{Ue*t z`I8ok@+6C5yh$;!vy&0=;*`V`QtFKCQK>KTKcpJ-UZ?KMCMJ6_yW&eS`SIQHnP5)* zk~}8*RyoLJ^g5Xi1Aofk@F$x^vB23};P(pYecxj+K{BK~F z*B&ghB0}5s-II8lUVeSo&yZj734BS(gg;Y8!?Tr_!9Tk5&ESr%uuw84FulFS?Ui|K z(>g|)Qlu7rShPw_YdhDGBU&xaku-_7$wo?qQiep|KB#TFQ@(_MQ)aKMS8YyUv zJ|95RRYZDg{tfz-Mc#bXV%t^iW%GCaM(bnaS?fwuvANQ)z%XCGT+h;uGe)WMO)%9< z6Gyk(c-r7IO*c+)yf6a15>sZ7Z!ZY;aJ>z2d?$gxfFDE(a=`VG3!vY?d!Rd@Uf^Wl zWay1Z0!S0O8Tk>J2KWd#4ncy(V|9pQL?!ko={_MqsU=8h`>@*?hcFVF6q7?egx^Sh zNa#b#z)1+h(Ni$_s5P)c^mxc&+(O7<0u+`_ZU)aFe+Q~aQ$aIHDd23vN~ni$0NP2J z09G@gkQr=0JcA3x42fERKNd?P4ofT~&q%vUyPuiI$jv>(I9zamt}C)oWBaV3clLh7 zOevhe_|~(P(wsk>Qj;6UNb2VHR_El#e92$MpVi}^_+Z}Jgrcn1Nr~w<6BnoE@tcz0 z#r~5rHD*XcT=cWpF!MUMl+vFw7njFzVzL(T&AC~^gOQK%&8!4LthbTV+muXY|o9H-yDjgH3rl}_!C9UJ&lu0THyJv*`%|^X|2a+=+Z^BZ#qM|7bl*qCxxktB(SCmGD4(W< z<|%0@cPj)pJy#pm_S>~L&9`eyGzGO`)y(=CnuUU3*Vh)AVy<{6lqaoRlNY+af$$CzPUX!>ei zZ_Kns>Hpdq)Dml-F1>MG#|q;vG1#VSt#B8LVtt8{-N8TYKEOFi0<@zIi&)$`9e$v# zAH2Q&5JDnLLVf8tjU;!{pd&hbk;YD3FkLY<=v6%npbX{S4$CN4v^~ZFwEfSq*IHvU zTdrEx+WQ#It}A-4`?dk)nP5ux8ZG_&*R3xCryb`*wchjL=YAdl7@$LX1U|#DfuV?` z@JaX=KtI@Nz(~m1(CNtg05RYRR=OtvPq}4Kt)GhO75;^f0vw@y4R2>I2|Z$+4-1&r zKrdKTkbPVo9Mh{Irogg2;un5Tq+NF#MIYy?dNh0(UbKr}k^ z0lgKthczj3mFg=a7KsrxA>+VzLI&uM0qI@6fXoG`k`+m|{ixQbLBP9Q!G&m*4c)*au6 zcVcgVg6M}}4dNEC0P8O+Ewd&W@`5R)i3h7bf5hwUH2)f9|FAc#UQurN5m*) z2Or8xf>9m!0uWjEi(I=nTGgkbRln)YMOUk#{geIy1^Uhfcl`ybwQBoXC&Bl9DGqV56n?l zg0AXNkVgg^oM|dREH+_ad8TF%-oOFG>Ea^$bT@)n!(VT+<*Q?$V}*T%^Q^tt-t0JS z`)HeNg;}3k$>y7uEc0Kp*gVY=G6*f*{*d<3X0JWN5ph609q!HEJ^r7bm%+)t?UBbJ zDQG-s0E`L&BOigvk^cjB!21Fofy={jz}jFN=v`0)%Zofh#6Xv$W+DA3GTM#$ivElC z;EdS))wi-vo8z%ORzN zJkWhYEr3YmgDwygL2=}rk(*R@_x!|50E?x7jAEZb?&m#3pNXA{J{W%ob1Yebf0ZsJ zH|GqZ?kLEm&g%C5v=^))zsd)b>A4RHtyu^0tFi;ci`iG{i0qSWQ${;CH$8!ymRikg zNf{MONjVp{Gg%n-H|asl{Wvv`ABBoK$J)v%rX6N1q3t0bV@$_gV~8+|=_}FasL@C> zbtg2DIuCT4ybW-Lm=_s?mj-9!7kfc-gb`PO)y)@pBxai@E|w%ry`O|-pI%?d?ZfZ z27V3XZgiW;=JVgfpHW&s2v_^hpjOBG8 z!+y%ka^Cj5b6#}|oD#LRu$iJDm)|GY5sgvA8}4JKo3UH2UXoqJxLIkT5hRFBBDPjC_t~g20L6VMkJ) zBUfgrF`M!a5wSh{P;cj-qdBv0QnJ&}6Yr>Y_`xbFBs z3@ZM0{E)cGN$U8Ui7OKF5)a44C4G(Vl`xKjj{U>3vgfhZ&_A+;WEqD+aBwrw7oyOx zSJ4{K$|xl01$QlADtB3c$H{fuSO;wohSi3r^>OSWZ*uG=4RksvX-1ENf= zS@KE6krLJWq<>Xy(pH60Rv`;?WJ!j0+!Mc&Dx`L4dB+vm=+2@JY3B}Ev*L<$tolFM zaBaBrrlCpw&>CYr?>=cR4KOSx0tnMn-x&P`Pl=|~H(GrrxKi~dL{}w;PN?pMZm2K- znhFoOsH%Yt(?SrXCM@!Rm5M31Ud2Z&EAT4wU~HP@De9$VGos777KU>0z!*0rjPPyr z_xGRm>b)bpyS=MCw|oWmY~LGGwwGd>6oY#RM3riS_-217|g4<&s-Z6rLvoWtzGmBZCI z27DlHFG7S#Mc}Xlpr^3s0B~$fxEAv|bQPTzMq@99_ykF?nfN9&h7|6O^sAsn)E(eH ztZh(OOa-b>(iFnq)X~)285^hrvI4|qnd^ywOgw3I`Uvv+^pWJ;jCc|&{WW<`YBBv~ zl8yB@aXH7E)Wvy3zbH#^I%Y`d54xY=Tye^LcTgVimCHtjk|htqh_;KNf14);qZ*CD@pVgrrGFLP#=7xNLSwP5 zt*O6lxZsO@pdijZOE}96YyE1N(HhnnTU;7U%XH1$R&&>#wt}wd;=x@};zO#F;v!W_ zdyaBlXMfdL4Mcyy&}xaXE_F0G>YRF4mBa1Ka$4>Au5{Z0m&rQP3AA-McvgxBVIJwX z=%zeqTWDnqjw?yW1^6&m<6cUl+BoP_=DJ$SPix> zW)rRg)rud2Xd=yp+@O>JiPVXaQPfev;nXw!U38OYHglu*IIGHkly%2XWuNx0=j`_I zqn>#o{G4!~q&{GIngcc|$BUSfcL#MOrv%5y?%w~(=!+{&XX7Yoo%qYiJBi?gB619W z31w>R56ah=MtW1UlruFN6fKELi1G90#;Dly`7w;B_++X!wv;@cry%!cydj54mq;xrv;sJ}j%;1pja#-)KbtXBn_K}Vurj4%a8msGr;*K+~ zW0jL7HM{KM2H#ZC&*0UzNYL174<@xd4^I|c01_KVfi5;2i2Q0S4AeEXdtwAO*J%O9 zwM`AHv3;2Os^pmVh~$adD{512ZgVNI zZF!n)qG84X(pn2mF~a^r6XW`=6M3_BxS&tBEjU<@2&(m4f=Yc{Bw6NR0#r|v82fiV-CW?PS~bG*UNaK53`ImR-^JLWJhxYkg|dzHjnz8Ux^|NpRC z{oUZ2U{A!Ha4~E~eH zQXm(<6taLILTn`+#w1XwI1@dJz+n_qcF~41*whB*eexCtnxdr2C<5|F@;4%lq`{9N zjlzB-GtnO@G2Q>V40Vw-5OIaL0(^%Ej}XbK@E*!6z!geE1WCOVv{8`$1C%Bolv*9Q zOGiXx947$Ep90QEo((^fhD6^iC`z`80ZUTBo?nEpuX97-MXOk^)IBrkzVYOk0;So*77d!iDpXM6HZk!2|QMIej?GnEx`nXr(kS`7ZeZ zAwYVHRgvzY=MrzCrsJ#N+ps{89DOP{0e!`H3H8L+3pv`i3$AeugUW1EK}*a@;X$U6 zf#s$_fm_CBA%SrmaE|#i=#MoE^vHf4*kD5gW30OYRhARsQY$3T&r0(2HLtW!Ft*bJuK{E&v*DhZxraY_fUlHFAPfpm|$+m<-vv~JJ$yG+SmD# zY-Had>%^eLG8VAU)(^7TWruI_y+9QN(y;#qRuJ9>-VrZ^qDTuP&qzHYMWngmuY}Fv z-`JtR%4X*>k(X_Tv59r0oQagl)LVpSl>S5w@iXZ*W-a**Y%e(uGMaiFw1_?(c#M@3*~b|gWN;D#K30l< zK69k^8Y|gT9JR!|h0hBuO56i1Pnim7Nq-Ja&CAs_52zy8uuz92_h<(JH?f%f|uSn{inCX3TpF7xCM4 z1vJlaCgRa-4QFUt!Yb|bNXT$LQef#9DX~~W%PqY^71n2dyhG}B+TXj&tVbLJ%u_At zrb_KLvrG|dIp49w65GMEES4Ry9BfzFcZqY{w_Bfi$F~UmXN99f4+S$Kpr(5vPs29< zxhAIPn_#$mLGxPATVcFM-%{wj(^_kJ+4|b(YDF0qw}JErL}RtnB^l~{?ekSRk}0b3 zZ9XNVrBf~!Zk2mlUCJHef!fdQNF%L7XSy!OSiW{WwfWRpZngGsrh$74hM?yb>_xu|J z8qZeuZkN|ibSK-#d63Q?zMt+*fe)S?;UnG?pda0u_s>usVgyix8U%WPZ3bWn^8vdF zzW_IJCxK@$e&7pC5>SqN2+Sr9gJ8){*fa7J)I7>f>{4nK@dWiO?F{8A^B1{*`IB^x zRz;Fi-jPR8%1QmGL~<&HO_mbWqy}s@c_Vryk&GHm91ORRoK)FeY_Eo^4KJxEq)N>L()LFJH>#Aq>~Vbv#-Ijav<>D zS^px~85a=;QV$?jr`|^}(gMhgR2Bx3(u_?@=Hss>&LYJo^q@EKXRtD(|FAQ8tC&Le z2kLTWIpqkwl7gXnDP@!@qKPycH;LGRBI7T@n=vCGlQI7S$}o_y4pSNUgu3frjack% zh9udx0JWyP$UEbK&~nrL;1Lrt^v7TcIrQF8wlO7CX{LrAS!aYBEWIN=ET6;A%pQNI zxx{_myv+8%w8*^7_`$$3;dQUg*&3f2qpGodQ9|r*3kHMgW;uXC{An_bY{Y5yfWY=0rlvfgT@ z8gB`PYl;QFuC;>Ws(sDh)fZX^Ye?;QZBpm|3=@@OEw5Bx?Iit2C)9G=_09gpUF_WC zWjKI-gYAZYrEPY=Y5f_xW4j*tX!`+tWRHRHoNM7fou$}HXFrPFah$1j{A9g${9vte z++r=W^VoCj%h}Hz9@Zw;3>L#fW9r>;^iQt-6uSEp{+ox4$@lL<^$l{7C%X3q?gUB! zF@dkX|M~B_iu{M1GyHi@TVRl5VC1c>2WXNV3e9wxV8!0`$aQ`$jvVxp28YB{eb_?% z1;9`z0tZv-fX_(R!Iz14Xcb{0VhkY*Ih0620Z1!wD~J~>-JurRd>I)EMvx=rsB zn#)+_)zY_melU7@!pwGe1Lv~a6rJID#=q{%ik}^dN-B#iOsxRE&)fqR{7cLi$) zE1d;o6f>_=U(=6Kz|;mxn7E39CrC&LtcY+8J_LUev=0AIWGNvw{E09jG=<54U@A9hO_%ja=79R3sjO>?VT0ly15SR~)F%7KUfwQrJH=zXX`+MPg4Q2i zPczEbDmc=Ow_$tN3Kw}swzxcbEtfnyg=d`ug;Z-&%R$q$wy7qe=&?CpQeuX+uQE(; zS7^#5r&RYuD^;`GlwGD)N>_bbr*gU&s2U_G)d(a@^pB((Lc6bvIHvdQXtw0)LO6W2qB_sfB z4f4VV{Hnl358D6CZF9eKE1i=)Q=KNyN|(aB$g|Bq#&;yNH2?%H53^we&{^aYa2Dn! z_yaZ*av56yJ>NZnvjy`O-hzR_)?vRxthfM#jUS1ahG*db#P!6(#O;(Q(gFG`qK?hnD`BU7eAC>#iNNx!XVN>9G3DDb(pda zo2Ux(iw>F|rGupNFTqzPco2({BM4dQ zBE+_IA7Wv85qdz{H?$~4f|{7>LC{kBBJe4Lkk+J0n0-mt@TZe_BwJz}wJBajyAflg z=STfV8^oPVE#+vbN7!WgD#k&&kopg0CfS5vLtKMdhbN$?Vtb;NV%EX`#Yn;Bn2CTR zsQl1jn9J7-RO!}7uG)>^ftE|5=cbzhiD7|nlfKJ)M)%q0(5d{l44(pvjb*_SLsKY9 z&ko1xmj;&_s=TX>|8re4oN~}~?`=qp)Lf*Y8&_!8>wf8>+HIyenj6+rsu#{0`FGC` z=~i#5WQ_N)c%1LBs3owk^<(Iu@L`bJywq1N=;baJym5|dy6waYE;x1ywGP3meGtYw7z)fA zj9^Etafb7-wZ%ExInU{Le{ybfUvd3(t#MEBfIZp19`1@@g69N4?R^WC`PQNLdRGyu z-B8ji=WpUK$4Sx**IMfT+ta@U_6lNW^>8zuSA&UFg5#xbIK3AND`Dmiebx>Vg)_K7iQ%6MW8H1^eooj2`EY z$L|VMkoJVDDRIF4WIALnSq>RUR)YtS*F!Q$-Nvj$G5lzEZoEWzj@?h1LEKJkrq07x zFz;e*3>{iQw_&nag;+cH6Q(4po9DsJ#SCIzMGv4ZLyaQSP$<$A^kdv_EDUWSOh=@X z6!2KmBIs(uZ_rtSEi5210+l3qU@m2Ze-<^~tETSqPGSUn&sm6YAuk8`IOYrJcsvQb zJ}Cg5nbKX&r`*LrlFP845;54}3DYodtqLC|zQ@{e&(Ytohftf)Gz=SI$BLo-ar?oG zuy+C1P~1>D{EU|ht#n3#8TP@zixy89WEvg%q#qFIp$GVs#^b&(W}UBx^>d)NwKZ_V zTI0{LZ})z4F+7#drH+eEmW^WHZl+qV8NOJ-x?ScB^;*kcHO%&3SC@08g6;j>`PEx5 z8|+24Kl5ft{_!uDM1p$pyzt}p!oYXQB!84-i7!RG!K)VibkiiAu5;b{e8vu%{cPuP zdvxbz>!yw!CXsBk;hVHj7jAc}{q2ucBq>29ZvWNgY9FDQA^WL&-Z|E=sB5@smTr*w zgz=(ntoe?UVP$%%?8m)(oQr%N&a{BvIXIwo6a-c~iNOc%H=!-w7~lb)73}q$hd~1O z5gxw)Io$sp)9imjco~>Rst^4o^20B?yYpmXLtq+yao`%REXc+_j$B2325v!8LAwzT zfg`$io_j;r04qS^NI7tNm>516ToRZc{OtV{*yqLs`nu=%t?noOTJQ33PPYs234b*F zTCf6nEpi&24LpSXA9x-<6Z)920OrNVz|wH7;CNgS_yT?zs2AZqbR{tXb(J^_`uK3#nC8# zFkbQ%+rJz$pmbqg9r?BNK=5N^k1NS&M~l* z=Y+nG-h^PqjztmT=OfR>*J8v80nE2}G2(RWOE@+T47Kq0!m9X6R9S2*jvxC8_a_>G ze-Wi8$ap(R``M|K*~~nufGMCBFk!T}bOB98DWqueYWyW^7`qia8M_|$19KT$jX8rs zp|+t3(A9_qU_UGocoW%`k?-CQfyyW1A+ zrP-f(R@%JYH?|8tpTq67JLs;__JDnf^_2a+eY-2yy~)k@{C58JKDMuLmm5>9lQjLU zXBA90sAIG@S~fd0r~?HY)p-Umy;JEeZ3{U+Ht(?4G*7a23O^Zg1s`6Naxv(DymgH@dA~h4PYKE9qIhjG0dCO1rP7jUxwy5;GkEo z^`Hx$^ctY;f;X_uH#Qh@rPfFa)@{-1HUY^hb(!Lp#WN1bCm2Lez? zJZK-H3Ur8_iyp~43?Ik;1=nYYkyCTQi0gSQ$hRCiU{l8L@c6`x;EjX~;A9>ixE%jJ z&=X?xt_!634p`G%hb<3%=rao-%s{iJk);7{NR5KKO$oT>n z3wTf6i1TueF%Kn38BG2-&i@%Y2R}EqHjXEgnapG+_U>lA-FC}c+iq|1*0*-Iwr$(C zZQI?tUE4`E&RBW#Kb+4w&-26g*kaUCHtQY3IgK0bCL5}V42@PClhTRP=V+ZF&h|vN!kn*NsT+^= zG7Z!%RwWu&$hNCHNL0%4vbLJZa3|AYdV*>om8IO^Ekh4f^}{+j#~_`HmV%dyl}e^E z$FS0wVE*YDYW+zZwMoR&(F`~}=8rNycCO}Fbei52^FK9YRO(&$>*5Gz#EM6we!n0-nF=fh`+%{dA;4}V9f7L!C$0&CMC(8!} z&Pq$DX0m?*%LUe3lMQ%wlIi|>L}}o=Z<&vDr;ys1p_Px=;IOY_R?Bx>QkC2ewziBVc=}D4$dDOKvMEKz0<}mK*a`U}8=Ma5*mx zY*FF}y(k+dZR30(t>dU2DypP~O->aJI*s(As;8bBWsORA=KRP%mHGWgli!75dRU9! zO@E<3-+kMYUh>PFaUgSS_LrQ(^2_C@{aVF$@<^~J5l1#=bLba9ROl?^ku29)vA1x% ze24NWwik;=$H}#j4C*dj8al#QpzlmSL_#fAO(Rm&2ZOhD7pWGy_Ed%D6SG|RiUajV zVTwj6PEa@C25Ank8JZX-pzcfG#CEb{VV3{{`$DlC#z~>5MX_VTBGV}UPjk4FO7Ane^`g<&Rb^~u35~;ByA!( zTyqsZs;Dckgo@A=a)Z1SJgID?nT?*)oKOzay)ZO24%J!p5xQ~4dHOQ_E7L9Ac>QzD zIK#+rf3v>zjb@Z>gSL6(3ngph6dSdE)pTudxTSKs;+`rUd7;i1I>03Wsy-;>X+8lr zB430$MW3UCmSiA5Iv-HSf#A>@t(0{dS3~wR@<~$bMoIhCh?H)QZ@|xt5Tw=PG?I?d zP6=XVvDT3@k>0wF*j?QpWqSA(K8oy7CQ9b1dy8K1KO#)U2gp<7>(G$e>q@__E;3&?1Zjfm z6}y0Us+VFX%|PzGJei)s^uZT&EYn&s=uii^nnoQf5Bzl+CaXXhQs{8%pL zW|sEKZdH6C!&zDGOoDq2j+{e6ioF1@6}+Xs?+EIM1zj=pxa zQwA$3ea-S|>K%DQbvcaIQc;gGp3OkyhyMgEvhLp-6KzcBGObcY%o&eiHY}B|{uKpju%gSuf{0 z#ifc<-~?w2_^cxV`|YE()yY5drONIKg=%f+x1lTg$FjyU&HTptr_RGfPu*8hW9rq3 zFHJg@l9c$naUa{>#+>D4o#7Gb)pdp~HiO}G#5tr=BkKEUX-$&yf5;rT3c#VJvRZOZ z!KnTX{Xnh)|I^e8=E9DE57N1=3I0I7teoAX?n|7~=ZF3aOIPz^K1gDczd&mn)D-&u zBS-TatWdHwbL45!+2Nm&5NSoi@fQt@sUFHT!bN#jG znx3OX9na|UyJardRgbKEhi9bwQShzjIrXxtJAcpnSaJqm0?i~haSa7~pqF^h(Sh7j zno8i#j7qBDX#gv($8;#X=;@Rd!JI8)yiXk;+;VqW@PJF_on2;iFU(oso|Z0mpZI0) z-~2kj^X7e*V83sA|LnByp6qWk8F@Ah@&z7oOwK=IwH!DA{z&)y{9NJQ^x=fBecIY^ zy`QF!{LbSBXWGfCyj66$qXF^Q*O=Vte<8C5vxL^}o%F-1ztjuj1oxg@&!!PE>gJ(G z${~PFk*ws=%MlZVRpwZ@OH{GYK?8EvkQg=<7|+k=(qu1*I_M9NTK1u`Tz=6xMG@oi zsEqh0%TU3f?!_l-MupBRRLnzRzI&FO!2zf~@gAwmsI-(AXN{Dvj2fWMw!F63Bbvmn zvTn7pNgv~;>%VHQTA^@`xnrb3ZK$3B(AMs{EE}MD9eFX-BYLmgT5ls+l-vNGS6@d| z#Pwrp#s3bdEF*liFasF@onaEeMdXK2oieX)u%MH-rVfe!$c|%0z$f(|z5_y{uvQ`) zD~k$s5-VgCP%OL|%hcXbDU=i7!bqLPVpwgPV$@V4q9UuWjox9?#;mZ&jFT;;rVX*X zJ%OIFd;tIGF35k&Zz#_}L**%oHUfT5`+ru3YP~=JqRkRdTLm>hJqmt^Z#5t;_27t6f&gH>HcqYgIYC`Y-&m%KUgPFM(hiwhx*fBRO9$3vY}p9nAc}#LcU?G*)NmC)W_l?hRExgS3+p?4r4{+b<+lu*MiGWn|6VVP4^|E4e{Pi zvcp6SpmD}ax>PPE#uxmmYEcCf#ZJBFq(7IRB%PzVM~U+DfT+l1Z_7^dF6n(4fPUwW zh33dk^BM4H@hYMRx@(dQ2jTA~)EbI4S^GqHvt5cgXn7nRW`fujX+Fk*>PeQn>T~)O zb${a|U4J8MIuj$+MMbx67xb=4KO({M$B_v z!c&-2^a1h}Kaf&_FPxvq>f#DGtS8fT{hXwUBQf-{Xf%<={gz#mr2~Tixx7HJ%ko{m z+G>m3P~&C7uew_k|J0bPzaHBy?svVaC`AK0Vsvelc6;1C&F6&2suR)Y%#MVeru{Yg z>TXwi%uNkPf;Pm-`E#ZTzH#U&A`c@99{iw?U5X+n5OzKunlv4HE%N@A0xsGhGVHq&SG)Hp6Bybb4c>XJ! z%clhYm0ZG6P)Z>v!e_yylvj6~NkC219hrqX4?4O2VhRx%I^eWRCswTmMBhvCLLdU< zLOtOUX%KxOW^1NGl)6Oq5m<&si;!};e5OH=?$k-drMl1ZAEqb5Ud?CqUfVV0iliy1 zFL8WmMB;h5JvjmzmAp>uSo1S3OR)ma17Q+~#RlbLos|QQlD*H2=H9_z_wo189`5>$`##q|M&y1=by*+w~`9<^z zRkzq@y2PZXKu1d-#1cyd2VisAMe6I4e=Jv}_l$3WdogVUee@UB5Oq!b88b^f6ume2 zDgM0I5I@F4Sz)_M+1XJ7K5#6T4s;lyp@A#dMSip*LA-}Fkx#^~^Ka09C6ATu#NJ>J znP0*|>zEpnALKcyQ#^s>$Z_3dIM4h^(al^0IgBw%ouRwBn(2-+rZ>d4cP5$cajSIa@`mAd)srNO1lFr+)+Hgd|t^r z`}T?*Wj!l)yBieuruvm`aHZwR%j|hY&dDX~9l!E+x(59IUcT*JkpBC7b=ADL zHn>Zsz;{TK{k@5mzP3yeGtd5z$SwZrnG$YyJ zD_xDt%5DdSyCLGFpCeJ?b2(ry=&3@ZXop@@bThO!O;rAC!fgi=)|)pbh%q0NUzi&uKQf95 zrI9(Y538MxyOQ)U@l4F@YG-UE)mud7RC^ooE+N-&xaMJ9R)hIKdc)xoRh@{B_cbcJVdR)72UY{(JH=-?QT(a^&d?5>)fpAt+ce}+GE zykJ0QE3uzvJw){Lhm6Y?rT!t`^Sd&sJnI&J(YB%#H1|gRNW!7jC684vf%V#0$Z5pk2ayj{-D4-3 z%ECUK-S{)=h~}K3xACF%rs|8~w)~SdT~5ZPf-|GP1K;C=fIIGiWJV1s-=O|weoLd# z{O3mV*m<>!1L+BqT?=gI?GGd3ToWwAgA>&Yf*1nR8IYE~fHdVZ)&GSyArj#{be9@H ztBDlciof?Y=R%%O)S#+roW%1?Xz6YZWVzNsPXgW0&vbty%#zrT$9n#O`-p!r>TSV6Dm^R%a0Ie3X;6P^9!Bc^3Uar^Fx`4wK=>F!jk z)JG;-4Vz*s6~oRtp#O5vb>AX6R0j$Ld}4sXuHrI%}iO0@gAztA2Zf8=p*l#Uq!4pp0tLH zQ=@*G{)sgu^6OQ_RIy?qiz{rQkLVpH0iMjk%7MWiV6)(5SqslwUK)(%&UoVa zeU-boWx+IH5cx!`!;O<1my}@>fqSO5V6(`cz|V-rP^#qtJk^>ceHyVDj!YPa3DNU0 z#_YzrTH2tKtS1x`<2d9%On*)Pm@LH)%Px>N|Dk^Bt?sW#g{xa=fj5qB?V9gDzn2A`wFVo<8oIdUg`YDJGC;=nN}F-lI6Fp_+Qqdk{(&XvPQXEia-B3;GFvRgr`Gh zFd#3=BK?lP%xK>py1lzKztrX9j=FbH*}h}cWPb)X%Kw4ujPK24lvMdP3%Tq#B?-Z3rkQ8EHLfJY%8_h@pqR z)VR@V)TY>~j3X0Io593e5w}uMO}84wFrK25R#bDbBV+r~uOgH29D|LxthnJfQebuBy}~bs>H3;l#571#7!gv}HJ9n88X9Q&>ys2)OuJ>xA}i#H@jH+!@tqJ= zc!uqk(jYXp_BlGE);;`s;z76DrgNOI>~g&|E_ZJ-*@80jbo_wfY2ck9HfYgg5U0>7 z_%N9TKgCZE_GdcyJ@`T2YS$oQi(@S_(O$}(bQbbY{hehpvNre+epL?B+mMM|U70_0 z1d@bVm1)v-NP<8pDY2ETk@%i}E8&1DC{yYN=SvpKzwxBv7&TFK+nWFnb1FmA%V7FP zA>dnE6m-2S)Y+?-zAe|6uW@uJxl}2ZoiEERZ&KW+T$+2Xk=ibSj^1PsG`nTd~p84E<7s`*Z_mSi~rAUw945&7_QsWTK zCRh}#>m&yw66Lg|hH_U#YfVPfISh$Ci#3Z%QLeJKQx7p`>yj;rrZ*9v%xxn8TVqR3 ztjnN`uS9;^V&u+#IQsfPYh)66Bd#t~;@pIg=?q2|OIO-y}iUROre2*JmyAC}4!)^YbE z6S-_%O}a~%M!!gLm#c@Zp_d_D!ikT?!eZGW{-bDST;c+%pJXE0onJ*(3)AmQ0u-I& zU(bJ|<_H6X3}6)WFG|5Xl?keP=oV8C<>shEnkCV7^{$vYIU0A6C#Ie21WZ7dRtTZril8&Q{y*chPJkEKm5o&Q~2plW}CVP&`N)OwvneT zGZ?SQyu)crsvg^~dXh>Tcsk@CuwTf`b@$89c6BXU;a^eQn|o6F zA2+b_5_h?(5x>-bo!cDPF542^FUj)U50Rc>!aE<&?(hZqgg^mv4DTfwB1{jh6{94t zfp7;IxJlgrxbQz6y&e0hzxFcU21k+OcSXy}RC|l6Lf2i-d~b<;7k;_2DW$jHB!XpL z+*Bd;4=QellX?I8TKu}{YxvXWeg3O5aQJUa!jxXbYqQ%+XB5;HSC-ci)Sf))B)lmM zP_Tld?kJiFS?~qP0LUV>z#;GlszC25bF~N6^(_yz9@{n=NQ0ORWxFH zRNys#yoKhg4xs1s z1)3Y$8v4=txJX*RCw8VLCP{{kO70I%s}|2^$G2g|N6aSw8hR1w`lckVOCc{A9xWbA7!!g>_Q6)3H#qMbyVsXlD*be1v^*OZIa8!9bYKFQhcCe~R_2=Qd z#FWsn+LxJN%^`TbgiZbw+hE^=h!^fO>v@kR@@{a6SwsESQOsZUIQEvRk~ytQr6g!) zrk!*ab%(A?y8QnJ7ki4y*RGqA3l0sqtP(=*x=zDWeDkp$bh?VAs_7T7@AOHMQyR6T zP<2TxM%M|ukO_Pn=pl>#lBlp%ozdHI$(ee-U(h?(H zyYQ_4OuC*42Qbl8Q+!e&=&K#{cw?xYo;-f4y9#i+4u^R8O8&B!X)gk#`p4h#wN%iJr6a~`@r+M^~gKj1?-&RrmBhgxN)f|F)BkZ#ywIF zON3Z1@=gm<8wfiz5pKP+AHFuo3KSt3*B|>t%=rZO_Z^L$z;}; z3ymvH4Gf))Df-2x=B8$5*7PNEwJk5=S3 zN;Z&wWzR~Ng((;~&;-eVP<4f(T=zd+J$0(VuT3-^RWCIZtG?(rs`9jB&<)x%nnp&A z{;653+h?6^=oj}(F)^VUm=pU{B8h6kJU0#uBx(-0ys8ApIK?n`5Rm!K@KOF0_DtXt zdp}UfHYPh$1@uSn2!g3P;`v(H$Eht@=2s7PZnl@znHVK zKJ+}vf}o5mbuOlO`)g`TMMSW5Wm|WI=YP&D?_v9N-w`K99IkRQGaRSbI~9GIKV`4+ z>LpM79STo)k7f2C{+D@|NdG&M1~SX&(^+$wT{(Tk83oH^v&&F$i6a$>_cv8A!Ql!s z*&E%;Iic2E4aL0BO~so~H*GWdNxfB7Q`gi~uKa8>V29%FB70*pfm1fASQ?d1t%>YU zEHZm(tJcCULLnBFx8iQdt8=B`DXAb^4P;BVg;K@Np?$(rZVr2t-HP9oJoJA8B7E&+ zKl~>7Mt?K3Nw6b!ikPnYMt#@Pp)cAyvUY|s@FvYBSws(-0eor?A9g8WM3 z4WPs_Ti)N&5@}+7jGopFLc6Nxsb4ErDznfCRi*NUX1uzS@tLwt^g2a(wPA468kJC1 z@(c-HtuMX3TI(Q^T-Rfctrqwjndqx~NY3jbT(px_QoALboKGdd)S<>XfCs5AwS zVbh7KKyR|UJC45N*v3?=sLt&zTQ7bsJs!#_H%NEb7t4EiKFNm%TOqHAKj=i}G8|%8 z$p`XlWE@_HGGo%GKVX5bgaduktvM?w-ro z4E(%e8@n2P2FyWkLTllU5H39+N9a5`>i-V+bWa8$_c4jrk<8nwV)&EJ157)wz#0e# zJBoQ7b_LH12bnos5p{;@Ob;Q=%!uG(PVn#J(|ij<&3r-GApdvy!azstCOJ^Onl@2R$u}ZGOkr=4)tMZ67tPZb$rwI~x*)jl z)3T0CHE56kE1bYd%}nIAb`&;UJ6N+>8PeL&INeC)8SJk54dPWcL$|5MYo1{;!!PAt zV|&#RV}v3#oM}%sk7bXVXOOslP0+4t;)_*Wblc=3s&+_=-5-Ux;6WauA8_qx1v`!y zO0K|lfrP-(s;hoi#SZ_SQiK0nA>(V3BL;?NSn=Gy>+x%U+Y_vOwqrOyQP-YnjW^ zzj%LM5nRq?y0=psoudOj*D_xh|2&_P=okP9ZD0hU_O~WacvK`|-PHAFyW&5`>E4ufXW?KB(wCtg7<8HPSti`{><_HEO22iK0UAdqI5#E?C@js1G{9{e8 zkV1J(=qf)i_@x^}cW9RQm7OkqNvfn9g8|9u;D6w0Vv!<&I;Yyf?A8tp?}F{YnrfNC zpaB$9HGSc&s(J8RBtf63uG#|Nbn?wmTJkJr zUqX4HGkwTSMhh+`Il@0gX6KJ;`xhq^{JV&(<* zGG(sr^w-K#vb_8S)2}>6+)?&gnpxfggq)|KUB3SCB)mS_fT)R4!P|;;fj4lSV0XwL zOi&!AuAz&W0jNT}gK!chG+SC7Xeg@_dI5fAr-8+|6sYNWBV2LhGwuqW7+(1?P}e@m zciY+6M?3boQ=HkZX;oVsE1YOK?Hpbf{(ZdoxOYIlF<{MJ=D(ZH`myxq#E0}l?5Ffw z(q)+hcroWElvy-aF}Tu+hAKO&lI(9#y7GYhlH)!y!aYvGd0#3I<6+a68G`K#aj;Ex zN`3-vAcN52&~hw%lVP2SYlz_M4-uZhK)HV*a4pzPvV!D+yHv8w!LF3IDCX&P^{xQM}uT4nx?Fm)$-GWZ}8lztS18hCPVR!fo>ibf?{yHG)T1X|j z7g9pC6&R`{fXUh+aC7}3MLpvW)gWWKu8yI)X}^9>#AnTz$Q8;twyW~>wu>P;;uAg5 zY$xox;uIX_N)8| z`$M6+v%RF;bsp#x7$+M;o|Sdr>dQ`xN~peU0T3%s5%_El9{7D#Hm#(E>|g~ zQ?SGII#j`uP&GO!lXc&^r}Y-es_O_7JBX@s{_4N!^jJ|L2N_) z7j}uR9tW$G++A!C`wVk(m%~~bp*|wJuC^-bXf~=xYWo^9wH+eTRL7$|iqVM|Wl7bx ziG_&+xV+fL^pWU=q!48%cSKBQFIYMX1;*C=8bce-sUO2#)i&dG*e~%O7%P4W={Z;^ zW{xuhxaeTB&_YiK$t7oRU_#Y@&}pw7J{f4C+DO$_U8QfR4so-vr~E#ofDa(WLT~J) zWHr_iY=~teca@FQF6CF|0`?tK)SgO zt}{+0_Gk~`K@A%CM>8~V4%-ocq2~C5P~V`yHu3MLe4^ri)Ejw3pr@>sdyF*IJ}WfF(LqpDQS|+)ujDKzPIRz)i651{@p;a= z-hr;Xsw?hyjv*dZg~2T;`QWt_#0TDH13@Tr6EQU77L$-mW1}{2LOz2gy7UJ zpbls>c%J$?K16kt?2YM|hUg)t4XU7nXfJw{;y9ZH9p@X!UUR&JVdsd`xUJm(_$kx^ zaa{0KsL*#uiu#VpYWZ)&<#>{+HRIO&<$r63hrVheq(OBLX;;m9>0ONxY^tdR8?-mD z+PdEA#fDD0tHyZKRKxB_jm{hUR1GDpz^=qyf!;-vVu7uanHX6>e+u&)n(6DZoi%Cn zO!XOZw^AVgqU-6sa1oORPGe>OwVB6~`}8ECBg-;f*$c!E_HD3|>lG$DfbN$oUsQn!d2 zrR*I&U-8y98XRgHCcKE;$aIbROLdHBL*Fzlp#8?V$CK%CFg>WlDAH5Rd^*-z4%vXaq&$_-4a%MwseJLLgjmjwdy6X%RLJ+ z`%2{h26xIetX*(ixEF{ICWT4@Pldn!>%uPI0AYhq z#=8S!nM=X%gen*nd=`8V-~+U`5dY#{gFkot!26UBz~`4#Cr*~UVq27Iq-)C|`Ci96 z#2;SD3>781JOVRZelzO$Kw!RsduRDu9)4kVi)~6dcYb2J- z=&8t`03O8&4WpI98QUoyibxXvSSmP!bv=8_ypO$P{LDq^JMdO@9{&)l&+kU&@t2@M z;zTJawBj}hI608t?B5|=^PZ8cbbo+K-7gd)0|(G-yrGgNQPp}JxxVph^&p=shH;Z*D- zAwRkw7Z;t#xuU|Y9P3u@x6veo-&y`Q);_#>Heti5FSb(L$=+qO%y9fFbeCbr*=J~oy^2m2$Dm4}JJuQ$lntS7>XGv9n(kPKaAReb z7BZ&jGA#GhPHQUKI%*bh-B!d!*tE>(h;P(>b2ajWQA3P0+zD>coeUPLHAFfF67fhf z9tDvBKM;urBpt}<8bD)mrm)~yRh;OcFM>nci$ER23gfy;&($B7k&_>r< z_?l}JT*p%;FY)b#uKTOx`~2_VHi7eU43CFPNfxdZPAIS7&cNG*Nk9+DYpyrYih3m* zhtCI|1kKWfz*I>i@2${gSIf{vSF!la72>+PLAI9rG9`Br_#n?AywuykzuI@eJ=QzX z@!gG;E%KBXWcx?wZXs+r{pgb16YQ))iXT|qO46?+S(;WdNBXAxn53N`i6W^tLBbqUeOL!G)<^dC|=c_ zR;qe4kyu~mFfxpJ2hXOO!>_0@P%Tab|FZuBb}-sd24!HI(-Vk>Y^Ojo@uRT)~KVy+5XC``e;p~2`;=_>3Z@KouQRVjahpRoYcQOzUgb^l>qj2G1pj3e|* zwKj84Y`C#fDSO!SAWnKX%DL(8AqeBmNNMx%VJq8>q_ZCbBE9t zQ+qzrG@09B`iI+XH1d!kn!B$B*(9|GmHn80kL|l=MjXyfn z&+p@J_=8MIU@X-(=*Q)LiT|O;=iK97T^e-f=HKzm%Q5?}e(%eDR&k5R0qpPyP-AZz{KelGQ3scxkBIu= z=EG7|H#$|B&YV}YVb?2)xl33t(XMVP?XIgK&(dtco+&428=x`f-tu?WA3%DvGqE)Ro|q>qVV>??d( zaCLBzXJ9bjIf+CZX^gt^svxWMibE@oNzy76pu#a%e$p`3<*WRC={f$J0ln{;>$|&4)HG_Qe4 zDhJ$L*;e@t@u?Po+q6w2we)qwo`zMz9z%QHXn4pP4Bu#{)BB@Ll>;}6Y&|^`su6ZcW^<=h_xXt$Rv4`QAQmY95yvZ4qFlXOe5LCdV)P#* zO${DU(Ct@T)b>{;YT9a@Sed>;{>P}0wY6-OT(PzgVYsa2e9)MCzu|xp_ExXO*~@GkESD9r+7OH?S1{F zSA8(J$o~x57f6R527AcvYWODsX zQ16TIH1@7`)bKmXs)FZ>?h<$NFHjfr4$|%O)O^Rh`=R@JQ-N3c1wc$;l(c8j2T7<{ zD_d6jTTYcFDN^h$(RuDI*x+EI(n}4(l)^=Lwse|oE4Wp11b!``ioQIAI+z`pi?k^_ z6RXfNd=>l>?*ttn4uW>FF=VGsLjN+yWG41^D1)xc0rVVl7xl>3mpY9Dh(*d05NZy%%LXW9O;(GkPgLzV_yBa1?? zm??3oVPR;C=7QK6?aVy`yM%SMRAwD#U@uT2i{r7}L;qS~uYaRtvj3*+rf-*A5ojcr z28TgXVl=dpOh%fM_t1@GJeI)RQ&M~j^&+5?CIK!{_rQ)SGqhijqsBP7(Mrh1MLw5K zwoMLQi|Hpck6+9+iyOnD&Wq^bvftE=BKqb5@xC=f_e3q-oPRK?ws8CTEXe;`2 zxOH+)(?>EwyIfXBdllBJW+}^&8rrU5UP?6`ZOU+UKCfXoH_+42Mo+L(-0P~Be6O15JywAu@t{?P3CoHHP zgmjyIH#pc1LED_W!8xupFvE2Py5)K-k8%~k-CQFSPdqv_=$nRB$7^BtsXFLH{v_N< zav1z5?E>5bzKa9Fb=+aOpFV&P#5Z_<@Ff)C?$KI;R@WbSjZ0 zP8&)(C78t(quSyH3+H;a0s!A|`_CWT)E6_vWRaIkPwRW)Nrydg> zVZFnqdrzO!OeEWAt`LVcABYO|6Y7YjFa1>2nhK(kWH;m&xd?nuT?h?hK5+jr)#yG< zH?o}Fi8l=G2sR3*`~Jvdg6)xC#Ao;dm5vOhFC%Zs^XN>fnbJyI)bAKjH&uKE2pTQtJ|U@wKL`S^wHo!Q*LOnxrq=mA7fV;Q|Ot72V^gOF40B@Q*(7% z=B{=p?NcYvg~};psv?g37ow>w$s776--SL%ms0P^X-qr3rFbMbUp5r~D({MOaG0Kg zl+zm&wU}L~Kr`41W-;bx2CLR_wbTc>{@MwmpuHtc(l(W6s9q>&>=xD?U8?>Aoz`vz zei{Z#wU$%jCUZGg-6Uf#7*R4`zZbu&-%FYdBk0EZSFI!U6{{iS7I3(*9oF%Ia{t0gs)1lqO zTx17X7wb>&R{FVQY@s9*oe%9oR>3-`jUrAqL75<}u9+#m*3J~Z>YDNsb$#g~^?gFF znnDavr4V+kh)l*yZr8LUx+;$}_ z2`Nf}5~!}604fxxLKLPD~yIir_OH7sP3f4U#ENt@N8S1!z>YUpCP-9>867 zWNuFa1hoN{TRw|`S`L)zg z8sWO*0q&ExM=0OdSF*`>Uozcm1Lk;_1AV<~Wc_>@vK(J2l_vwS(`Jn`nz> zfH+Tc3K*|0fT}PVdRtMf4nb`V4WPc(Na(SxLRLRUB0+7vxN8w@xvr5WHrF~=$hRKh zcU!|>WLXEYJ17=P4~W#WqNx+ zqrIJ=Up_U21&d|X15t1U-c9j8Vmmg1(5o&|CJo6i)m#rvRyPOQtM)=Pszv`mFI8Ib zKmBRhOY`2)BlB18ws{0y!{Wq!rkaGw{Fvx!`j2R7j3PkerQo{oKLm3$r|DOIzyh zZl^tUcX#ip{B`#hDemr;0D%xglHd}9@aJ;Y+|0$SHQ&7Z-Or%!VTk*C1KOB+xa(9Lq-cawFOB zX=2jweE5t0s#Z5u(0{~i=xd!`+_xN*+&2g8+NTHIPy@k3>Lrl3>Ll>Ly;8Vb(}!3( zum&X@CSj7tlxUici(Fxt51ldD0002)n^!`9O`d{fO=ciFbK z#1COTY>fyWsDk6QelU7J2Kw*7dhpZ!Ytx%GRVJMVYPhJe8iQ(c2V4htYt2Jf`{?7h zEZosweZi*Q-X>GC`q|{u{!3Gw!I#q+gZ~5m8axEC9J`?xEbr2nvC9~fp%$YvxuZaq zPH4Y{Pw^P`FMJ5yj$BBZ19hZuLC(~#)0=76&70_Jrc3EpfC-F8((G9Pt3G0RI){gw{go@N?+n@D`jE>>;reGC|FS=;>j%KtkphKnvyN)EA49 zrWj#m$^;G?mYKI2VvQWbnK8-aKckB$PYypd`3&)DR+Q7=*ABlTqN1=~SRSI1{kba&-dMXNX3;8$ASX9h5=e4g`Ro z_s<8N>H9t1qjmy1sZRn7JqIQi_O%(cy<7B8yQ4;rsxk+<6bpOqDzoLAI-e2)La!kAM)<7op>*wIXtx(0Q0_;1)b+=mR2YuoTtY--K2S!Euel*0{~1zBt2ZF?RPj z7e^cKLoTo+!OwJN$ocU{(+6~B6W6%QK%4^U?V(EJD0qwB6$LWK;X;5@cn3f|ISgb& z{{=4LG7&1PE>x{uBL0*InsLpojLCG*;+A;|Y)*LYbh7dAa3{H5_a?YJ3ru%>6H;Mc z9{SNXEo8mJc=$fsXW=N@_K5E`-4RD^Z%3xvEDDp@9uNC&b0nB0SnNZ!3h>yFLm+9Yre`9vvf@wc36HFZV4_vH?gWl7OptcX~B36x_CZ~)!(4Oej^eE#tMw5Ap zxdd!xk>Fb9b1a;3kgTJI(uS$;n13iS>OW${>fNcOUUf1|C?3SXrFbxH7e)dHbCz2 zj-!PeWN~G!T_4JXs;hNNR94~_iqHNN>LSh+c+{Hxj1%JA|Ku*xiGj=(%T>3?yl(-XRF-We#nwK?spcpcZz&uQ{ooc z2C;(@(OT3CXrETmfXw9R{1t!K0%DMkG;yz?iJ-3CkQ06Sq07 zC;xG3pq_RrV$F8>kHvJH$M|b=lDoxvzKw@4-)a`~y+agR?lQm@x$I*;@)EPK-r-D% zPX%XzM=@h|Acrpu{*PZA*u&W$Y58hIU$u9L>b5->m+v&580lq*v-PcuGY5yn6-FdP zor^vf9vs^c{!c<{U_yLl03bo(YmOW8otaSU(;pA?t&Zn-x6E+$ej1nU^EK{~+n(?` zPsfP2&h>%&9aY}et{onD$6-5)v!}JmxlzD!S;IBEBG}fh6U=2!I_gdbe+tTJfWmNo zLJoCM;tx2lq}+BKC2w|EM9Q#_reN&!gky<~bu@{wl)OdXPUxA)L(MjrE&T2} zP{8E<>3^s8O))^lW-&a|8~~FWrXXVdToh$81AWYZ!U*(fWRFQY^_Iz>^426_ai(** ztAL+40`MJfH>{9<9v{#BOO9fRsE$k_>jm=<|2IX#zeC(+wUBs9@B*(BZb2@z;-hV> zZ7@2!F$l`)Hu8tC09I!80vyZHfrnT@U_I?Q zuFjIyRND;>mv8FcU6~}0DQ*`9l~YBi^6-YJ>f}1xYFg#Vnvn92#>|T3+R9>1T~XnT z7EbZ%#%uY}&Gq?9TQ29@h<)?Vh}Y#{+8lGu?eFvb+J6@=6;OD|fG(SDacirBS)}>avtl_Sw`5B7q#j!Hil9wuc%?V{m15c)DVkxTHj9oW7dpqi7iJkA1t*v+E z+uCBgyV_>=Zfj&H-?w1Y+gd!-zZy1o1DY?Z-Rj4B?Hf?NtcK@Gk9vUg-^RC+AC0os zYb{&EFWMG~tflTEeb+ouzA~w8t`gST)ptx{-5()o8k{FxI<8PWFeIun%zJt(!I6Fc zVz`6$1nL-u9AtPyj|QAzmBE#)5Nt7L2lW%j#Dep#@^SSx@;pPDLGTG&@B2MLI9?Pjg!0yW7>x_qn6mBiDJR#}D^?ZvS`$I!nEuJ1z-q zb$;XD;Y0{n<@_cT<(d@!#bswyi08T3v)-xksXi-a0{lKF-SzKJRt7Cxa5wb&Vo-GW zB3A6d#Xbq!mwud6w2-wRcs^>;v*Z;^SIqsnqIp*Fimb$-)t#}-)hA;c*F2BCusSFD z*NVN7i&mC|^)7!Ip1$-#aLD{`LG$L+`EQH&@}@=R`78~UdrtdidEND%vbd*jyWVp7 z?cVNev?p5wTzEFST|e5abx;dnju-irjwt>kr-M9|Q$2T|6Oy;cg)CU&Xl)&8rxd=m zt8ge2I=P(XRXe}uAly!}qudTNHn@Eu(p&~fyWB?ccU(od2A30rc$aW=nB#oRxN{h4 zshumL$7(l%&2s~fQ`*7*Bb)^{Ab}7h*aJBWGyn^pd<~B<_9NCBpCEJ-XOSS?6jHAL zigP#RW9I4?6Tg{)=|xj3X=Kw|)&}4K zGaMzSzl3~aLY~tj>UiEGZJXCy(27&Cntv*PH#aJGG+t6!HM+^$ zYduxj^>y-D^{2aR8=|}5O@G^po2Vj%xTq;avc8Vm5mfCiWtG}@co);9bMlN`l#WqvFfyPoQtW4|d<*ygl>%>r3-b-0SY&mtWG;3SR_d&U*#R9)FRZU-r7Gkp6zW zaQDZlLfn_G;t#(fiZ`X*E+AzN6vFd&7Je`2%V{k{=T=tC%(1CPWQW)6%U)c!E7zsI zH@CB4YmTrfIFHaYCvRr`rQCqJk(?#fQTdXJ-Faa}n+n`=}__-P_{qFStE(gTG#bCYrW#X9N*sXJUh*ff^=;`QSi{s(%r-Ll^aLk zb=!yaO;?6n+bP5ErRxTs%H9vA_c&;;X!P3SLrq%hh-*J@oHcUXxMDbHYVQ~w>^eb* zbm=YA8xsg&ZybT4O|PMM%x}TnQ+?AvKx}{#ZVL=RbWI;dkC=;zv4CvqM&KEG8BoBz z4!tkjjmWd~c16Kwsf$Ymkf^wh9Kc38Nt)w_s#+wD;z7hVk5>v}Zb zM-#Ova7FZy2wAv33Kv-s_cL;T0w%I>mN@G7+}y~E^G-xN&Bw=#B=3oZE&36SSpbiI zJa1tXJ1HQxVCMaVvP8!?``E_`b~E10l*e==21f=Z^+w;FofY9fXCfRs&oScI{Dkl) zi%&!ZFU|-{UE&hHc*Xsw7t3*x$5;Lv{d(Ej*qcj^Bz#`HVzy|0`m9~^Mw60fHOv`` zzc=qr%;w}pQG#Sdgkavn;A?Zw22ql${1Ed>yiO$j@Zuz`cKb2Q==3;&WmgroLa-<# zLAXBPAwSdWU#^Y&ZBB-hnSIS}A1BB9CkH2(&FWxZ;YRbQ?AaC`;t->Ue~FpK52P&? zh^ZCAW@?}91m%ydH^pEROuu1GWCvMiapMFA9*hSP6tg!AKhUH$r-&Z5SVD{S8_Y+W zm8gd{58%s$yJ3%oWv~xc3dkO*?2;OzTK9O+=i?Faz0Q{2%Oy;T>?d z=`G-`$zghqF~WFo^0eW%$y;AM88*>AeQ$gQ;Mmv`fO3olE}k%eZ%v56(Gww%f$?Wx zi$w|8K4}k_W&UX{oGvyw05EzVQ0JI86g|8LI-~(ZeAIg(o|b7>tnv~#RxSkQOB>Bz zU1?^Vq;+zJ$jM-AJU_Oq_E*25dRq^#a+!Rzv`q4~WThy(#N1S0e7LT+P*btKm{-w} zUr`)Tc&a3zu&r=Wz9BELsHM=l7+Vli!pT2Wwm$z-`Kf$y`B1S#*{8DeWmQ#}vIVub zNNVfYMdcpCxONw&d2}*-Lyf3%?Lato!Gp&-BGEgl~2UXw8T3Xqb zS6^9IL@2*fx~$Z{{AUTjf?6J1n^87eJ6I~JO{ut5Us~JP99tdUY+H4=>3yBEXkqp3 zdU)-N+Pr$d>IZd)%N-k;6-|xk5@kzT(RK0K!tC~{!sHIWLW)#duvSr2bVE6(xT$Bd zjID{N1P>mn8XLP;i_)hxpiI|AZ>Q%=j{;m2NN7Rd9$1=%*#p*{LiU^fB0K;dC@u6G zG8HL6nXqVqO>ZNt}q+$Yp*elMkn8^}1rQ?fR4Z!yam(N-2IA%8AC zg-@eo+y9~7bgUpL>`BDS7Sq%n4>qa6>jrT_;9lzE;H|XrFmHx!%xTul1R}R3v66?F z9c6=>^V;F++)3wK^Nx6e7SR0NlL0tCUlbVcn;e~}oA)$f>uje4r$pa`4YB5ULX>-Ab$IE_-yy=8 zX@T=*OGvlJ;+xVY0J+U`zR>jB#ZehE4TLUS)SH48vCQlLD+u4=Nu@~^itZUha_~|Sh z2h4R~-Dk_`aQ13i0Ouj?5F0}I$mu5S<-R9mT1Al(Ij;x{c`#BhcOmH)ZwJ-D`-gsr zxsXvzk74=K2DxrTTdUi+wE_;>(Z&eLw)Tb{wwn#{vzq{N>?Ob|ha~fB`y?~p;ngJ4 zmaeB+!E|LT!NhU~b8NY#?>mZ38ZJWY8-4_f8cqY#2Nz8{40=ue80k-uZfReaeY9n3_R5BTv&nTs*=3byGyO}_vcDGhW-c$hmxU_anLCni%4^NNR*1^> zErsN$N@KG(mwn9~EMJhFQ?AWcmc7dHE~DiyEb7W@%WKb_$^lswM{Zi#S{YfocoWd;L`0GKj>{ov={Tmd5ZIPqZ z2Q~XPJ#H=)%@Hqee=Rn)W7;lDCfcsI*GU{CN7^WD3p!4>1xu$|zITb6?PRZ-s#QOm zFZaA`_@DZ3LzcFyF=fcVg)??U>^~kO-aa)dc?L8~8sHygZKzUt9-gS$McLK&hS@W4 zlMNb6;?*0*tj?ILt&rd-o5iR>;U4T2>yzY0!9D63o82sX+Xybr_80GxliD`RZol16 z$N5hCT~@j(>=T_HyF75c?%eHM=8AUq_bPPC_0-vK^||SQ^8KHEa=?1~-$9kObAy3) zM?z0IJP4;b`bAuHaESiwIG#XvB_zyuo;4fjwq^buPw(Vo9%+kVev!+c1&1zm2z|9| zP2`JZopEy(FHGPsUXgTo{@!^z=hi15o-=pBt=YguzhuWfKYFm3tH3toBR5 zu9*|7T+tc(VP#Cz^QD&~{w~@Vj+j3gdOWEo+nKfV6ctv|AG+# z&wRJ}k9Z#r-szqie8lN)Fw>znv{$$(s94|}G|j6H_TZKU_pvF#2G*${KSr28nM(6( zBG!0Hi6QPTcx$IU*l^p8n9G87$PJt_SSwA12qC>jJiz~j6ro~ZuMpnQ$FNp-6J#6m z7`P3d4RAv}oz6hvr{7}%)4}*l(+lw{fo%LFXa#N`)D?FCo{zeY=tNw{j6x6Kqd}*L zL4XtzXz~GJgYg2;{X6m8X9%b(fjly{@YKW9vC%En9gWlu`JXEcfyWo9@2n|Y-sA&XT3 z%9>Gf^lwN3Cu2)qetJ>nue8VMQ5l!gW$EL;h3WtNJfB(c)0CP1bucIP`?b7-KdKAb ze|{`F``b`-rL^U?9=68S?4RJvtCp^ z%8IF}${eln%k-_=ml<4lIpcKI%&dUQ@vNls*v!)<#LT+|#GLp%LatYKb8hb6PkE=( zP5GbF78C(fKb1J77FF&`zhAQ?eYjr!mo7S!u|_hL9lc*i~*mXADZiZxta;>*@1%LtNj_HssY9L*kG}te6Ywk zGT3Q&G16$fZP{2B=}@K|ot?qfv_gMx8l_tR**$RxdVlN#{O1@Pb!$8b{dClkn5jEQ ziqeJ9_vzhO0fy835Mz;z($wj&VVdsx8O-r;hAX^N&_cg1+=T!PdCw} z7={fR3u+Bw25bo%_MaOO=+6!3c0Q2*x(?gp(%CWXD6w>R=_QcU#F%pWoP z;|;MXG5cnC#GFkSji`wK6zMxFI1E1PNKnAc>0tX=h=3#U{{$S5-yEQi4e?nYS?IMP zbcWBKpex>gecyN-a`$#GaQ?^jqJ6!yz}DUAsbITfA|K`u$;+@8u~s^rW2HMm7!VgU zeWptaJ<#8U~X&XhEVMq;kRA8ez;9`pu>a?~+9C&W3M0a%={6uh371p3Z;0(P>Do$r$gKp_6{ z^heCfX>64I0=3JnsxgX#-eQ_EC08X6%k|!5K!Y0>Qm9F zT~Q2?db^4U8>LI|?7*qADv_2oRasK$*tR{Q@2%k?4{>tauhvVgLQ!uUTvX7uN9@~5ZhPNq>_}|B z*7>%nvg<(uMtQ&TjFMAn(_LTQ-4jvP-nY5zqUK|9gjQKJqu-{GqWxTOKx@t&>kH5M zr&pJeso3>*M(3=*zHJxN%9}o%Rd0MeHMOrfO=WbmUC)VR!dX=nb9q<>8L zoq6H+w`}?^XkPn|l?AhYt}cH1lUR1*$Eu2lKgd<*eh*Z3r4(1YWh7LJG9#-Bb3ayI zDP)#b7M&^aFC~}kE$=JZS=Csms$Eieso`Zlsi`UNLDP={XiH+jQqkjlYtiNW1udfm z1x?5j$EN4SzV)5u6SX51Z>vhHo>n}qYb`U@;Yv)6r%M+!!AtgtUKi`yZx)qw?kcR7 zpDZ5g{!nbI5tZ-;Cre$%DCOF*nU#xmb+tyLqH)C7&?25Bbi__($u=6(l~iM7pPT7j z|NqP>qg%~ybsx&%A-u7-P^&OI&=B+o+=PWX z{swV_Tnhh(mJ9@Q;h4;DqMT$Ma=-+-Z7E{ldZmf>@!Y zA-J%t@QIM+QIe3C(epysF~b3;qyC1lVxI>2L|zU;gf9ufhV=wa23Ut&^6w7j`P>bj z>GdQy+%qO5(i0j|;cgCn;{GP|kgFh~&eb=%-|bfPBG-*^-&`x=`R+SsNL|O`Q{C~2 z-#q){k9yT45d99v)%v}P)&`_U$^sQ(WkKgdt-}Dpim(lVvm&qfBuCuyE{)9bB1Dti zu0<9*bw)JVuL`%e%@2`Vj|behuJ`+673FopD%5?H&v7wvd+oUVI@`6JS;E)sO;%sn zc%Bb?FT09GWHLDMjA(8gBbI-UHYSu)du%pP4R$N2db^!eltTbL-eHn)z-|}&y5KKs zn(xL9;S_LhFr2uL=qvf}DXXoxw-;X?&1+zeqmcD8UY>b9T_P7}Dm9`K#PFm4nG z&5{A~>6K;;<$_sHu$y{_n^npe{{+SZCCI z*Zms5YkWAi(zJbyXPO)>FmcBaQy<4)nzME3lN`e{^ z>qo`u4W+H44M*Ctnh@>dqGPRR+7>n+Zky8t=$NWs*->15S`u0nD@`mlbmEGkU7>~c zU6Z-Z(x}`Mvh!IFyVx0IX>!KijwgS`Z7b5q;+1Kanop$J)n}$YtYW4jOC>2Y3yc1M z@~@{rbM~g3&A6PBoc=I%Uz#|@CRLffB(*;CdUTN z-OF51F_M#7Zpi;w_NeH7S!Ri>3|RT9w7fdIq_9p{*53jy%Mvdvf6~6V{7omca-aNL z1xfX+{D!KrvZ?!N=1?aI!;I$GP~#+cS~jW1d-Ey(7NqD>8r zt$*r&NDkBkJI~fl%iq#3-JtqE=f4ee_>Id-pQo8DgBJ;iFD1~+wKU>KDvqEOw4 zj2W~+ZyD=BUDH3p#+l*R1)wF^h44=NX3Tv2|8M~$4@wnj4gCV;B72HP=S|VVcuSd$ zRz9p#Rt{{G;5Qq<|HSL#+~CDBUt6tZ@T_C#T$>Y=rFKc=SjQ65xN{sy;Q}Oz-Kz;} zd=3-O`yV3h4kVNIhGmm~NBC13qpB!Q@i3+$VFtG$9%B`oFvEIv;ywGd2^XBy@haD~ zafdwUv7J6YV>kgBQT)I+(Q8AoQK<0Gkv}6Jhp&#B8{QthCv-4M95NKG2(FIu3Mq~d z1>X%F46+G)8hpZkYhb;1aR9?(Yv5+r*8$6&oBiPq%>l)>34sf3<_8A}tHNdr4~HMM zqDGzKw?tFEm(uq@t~05i zZOjdT2o`Co$U;KA&MeWdXEf`K)R>9Aq^U6{9B!-`g&bZ5cN-c3=MA_67x(X)9@bo$ zd}X1N&R6H@_iEB~9-5Z%P|dM1A5HRTwK{X?bAS5Kroj_K7Y08LwGD=i6!b3|xjOJ^ z?37kJI;2h=x9J_2IM&^urz%JEM`ROve%D9i>kh;uqy6*LcCpP=MoZZgu<_L7MBRhQ zx|*e?gqjQbit6vbm6(kuy(sr-b-uTs-@ufnhUWW`A(t)fBxvUGoEPT9Q9qOzKH zSS7lBPi0Z7W95?;PR;e^@Y=r(xO!xRx<001yzWuMqB^HWP(8b8d(GR%8P#8#z*SK# zTgwYts>-x2R%P!*_9Zc5aq)*XU@=$ntKeXJLcvT)MP9k2C?~Ijo-^6O&ZbIovN`Qr zvSY;iv%WPoWdCi*%=u93pBq#CE*Dc(l@nQ>oKsTLpF3SVm5(hhDx?(6Defu+m;SGC zO@&{9u$EaE(Qv!aThvs%y6xX`fJ9mm-UX}WNF(bQU8p9fE=O^G=d#wlQcZh^RNH~- z0(8Nb@L#UehC}JxI5_OL&ieAn4j?EK9$5vX; zjVZTV6m4|GMf$kVB96Fcho*Y03%%yEIYjNhK8O^!F|a)7bbxQ@O5e%QdashOm!6U^ zs>iLct8RZneBHP~w_IBM{<`E@!mDQ<1FjKnpWM=%OI(fiT-WC|WVasS4Ywexvu-k8 zi>p1?!!?w3*7X?UmTL!fpSvyfpr;Gj2Fy4PvieQz{?6Jpq9hnW z1;lFLcXB4^I;9OvqppL9X~WPPv@RHcnv0kwNi5CuKFn?0W$Y)k85@8~Cf37Ji7LoA z$qg)`d;)Bt-kZYEijCLkr**68YjqsPmhnV7Yh;i-GIWkuJ1~Yt4+v22`e(zvG%r9) z`XuI#o)spOs(E5w_ph6$G#U0$(^P&HJca1u=cXl62bF?o^Th_Nh`>}UW zi|m8;f9-p!zHGS{u3g_#t4&bGYU5;BZL!p4K-k$c_^bW?(5^Pmk+9Z*(dK5|sB@Fm z#D>N%y36(X6L;&E%8z5d_4FEtMN(CVWF1LZA+|CW6!K3O(g+EzNRVo&K{<+IX{Rkfwm>dobl z>XVh4N^#|ZN@lfN#rK-(vK93urHCd%Xml-Sl)yhf5-{HN1Yi0S%Um?_IB zsFvmA+sMcA(xgB0YddBYh}&lr`nOIO3dH?|gy#5?rpDZo*$sQjQ1yuw%!Y)@ISub? zMj8OMzV%)8@cO>y;D-OiE{&TcZyOt=*^NF5YO|{DbDxpQZ3Z>s2epw+EMk10avZx$o2u?_{PC5UEa{3(Q|m*6hFFZ>fBh; zRQ&k-Nxi`^g)z;VBu^eT-kG*HUIF3_DWFICaEMBegO3=<$RR^4`h|gI*{nNHI%~X4 zg_!uvYo;gM=&4D2ohpj4UMxqj96}W5>2x&#|GK&Bp~ePk$H|=Xx)zg zV_Hlp9IfL$zOz%Bu*I>)to#VL3Wx4Y==f}<@=QGYUhkn=Z z_H$iN+KAmg3ii3LwtDYA%=_aB;GJ>@vQK%WGmm)NGu^!((gS?TXdVF`bWLDC%@nws zx;u1;o*bISTpAM0!i7lKD}%LMQQ&rdtM6g{RliFDgkQL|%tvqA?DO4T>b1i`>cw}7 z_td!LdHA@Oc`Wf1xwU#+cR_g6xtw*+vt)jDmhA6`W4gly$A4@_?K}l%?FzY<90EBX zY^Ip2tV0-QY);W-f^PC$>l6~eCW9DkgTU);Nx1KJlb90@B+PpCrKhVgK$#Xff| z!Yk}+2)}K=6U(jdlh+HLkTF66y^Z^hv7B4N@?oplYw7;nar!a7fZAhqguKz(hLmmH ziicRo;O+|1c#bdxtL2TLt2k2Z5B6+KCVeK_o%$E^lB_{(Ats|H@as`D+z!+YOf+f% zDhTC9x&^Q%UniWEb)#B=~%{ zHeuco5jt;m)8G8MhW zi_f*GTbw0cEvq|zH2>~mG_P0YH==r48=k9^8{>vnHCGH>Yw{dti+Bd-HaEkz_LW9- z=YNxlvYS&zd9#_{(=pA`{0AuOFSK;rH-M%rTg@_E11QcU1jkHAg9AWJNCU(Xf`Z|p zpW%tnM~Fv=ou~_lTtqKY4NJpf;M3TA=xJOH#D=Jb+#~TIVWfrN6O?t3?KCK)gW(N6 z%&7n$f$_ZsXM_rG|m#~3l!ol4QWtEt%@E0`&6 zTGk&oEZ5PUW~Fmw3X@&iY><{bYQkm2vBdd;Q-!mwGtBv*^Bd=AmtH4^Gu4sk@WpAF zeV3!Bt;s$>80io$$Z&Ayd)RZh{`Ma^R0km^)9wh%-R?YNuf3H1(UHbj?YMwC<>E&x zbp3~V%>5m$)#D1|e;z{SCC~k=b`L&#mIsiN?J=AeaeQ$N91OrIcn;~Us{Lm9l&!gG(*nbE>=Cic;&3+}@304{cD9e&>68~h8+VeBkT zJzAoMBA@pTLgw}K1NL`+no_8qn*vk}y;y-8Ln;bJSaSCv57~_V-LewR0R=@vm%Z%% zpFCK#PPtDhQ|yt)sodl-$^_Yb#T{9R?1fAr&6JrsxN^S4S^;TGRs3qXsVHq`srEFE zD4`8D-N5>UUPkSzKI`hDzQdKS>UEX<>f!PTHNV`uZ$bHop3mi#s)Dis`KdCq^hPV5$F z*_#bc)3`#K2PPnMhO43Yv3O|J_zLJcJraJ`lmu6s^{`f;3GM`)i5Nm`K+H#@5FfEW z5j*j7Pzb_23w1<+UPZ9Oy(1jJSL4$Nr*WT1*Rc;NTd;pA9cU%B7PXNf#9U+sVn$dX zOc*B=eS%L!0|hftbvA>j9Q$$fE{8bGYbPCc%=st&pz~*Zm5Y&h$0d#2@0?Eg?VL)@ zb-GWR=j6vIcjT~Y9N-+9{Xy<-J0t&s&27P6>vHRS!ByLZf`@i!0mPnTwZ#5~RkfX! z)eoB)Rwu3Hf~CT>f)T!#P|5=cYdI$buIw1=X;z!{7;}g1GUhJZC3LkNnda@tr&63> zQ3x(lvWMGk%0{W!5-C|UCS^D60{J2>f&`+!BAlaR2_dW>_;2i1oD=sgUdercXYf1; zAv|y5B5pHrihG4T#JNlEVrwXOSi2}g3=;*%NTjc)_t8@*K;}yF33fcmj?2Y0aDHJV zyb4q+?RLt1Cy5k;RgBi)I_P2IRfBELiW}_< zy2d3prBM=LXK{x|2d6Vra#K>${<H?sHLqm&nh)|@)%WBJt3Jy&RIZe@S7b}|<$F4BRUYX$Q0d>c zx*}2Zwj#H=qT+nxv5MGwdZn^%qT);KwF+U4y0W@@UGh2mB~MYGl0Vc)6w9>&Wwr*}&DA>fNi`q(OlqU1Uwv>OP8~TA*@qmV zt5=Oq^vxTcr6x{%R5NrfecKIub?aoXng&2=DnKtaW6(p|Y($-QE;@bS7&c~Dj*A-I zfuoKK@HpL8!b`(J{BctdK{a)fum*66KmuPNZiUSu-a{r6FJV-~BK#mxOLQlHp^zw7 z>7%4g^nH{XMmhBb^DQli8O)$F=P~^lP0V_lk~K>G%DzVZ!BJ3q*#wH2lVAaz8cC^K z52B~lN8)QMKf-_39|_xSF5_p}9VGm)7Z7JU2uUUOzT|iIT5^lM2lb2HHd?uDG#zUD zj4>{J$NVbfu#<#GxxQ9gc@V1sK85cr%;I)ir*nhs4syQRBiJ_fhuGtGd`_d?XU@2- zfP2(tCpW?RKh7;HZ*C=T1ILe>%D%x4VD~YF%**s+7DoI(jP(=%b2nMev?i%p<%FFa z13ra=$4Bzy_^aH9I3xEG-o)v{zvqC7=h$qbl<7r$#7rjbp>HJ0>0{)X^flBb+9++9 zVx+$%_cDvgByI+26R(=+&hI9C=JNah4_@^MZU|@60_;Y zNWSy~q#HB?VI9Rt6q8R7*AhKR8hkuC5tm7^#=6q3VYKv{7zi^K)5zS0X=kc15zK2? zE#oB4jWHkpfcg`MrhLJ9k+ist1QKB-em>C?bCQ5Ww-GHnY@`!#Z%QYulzJc1NZkg; z(SHFyQO^K}sM~7D&H(H2?}0OM4}e9ODqt0ACy<4b04RuwX#~`9x*9xd z`YupqhEMmHf##NJpGhEqXLJErWY5#ZmO0DPi4rqZ7e8f~Xqf!1W1FTYD)hT1{^&mG z_D|UB;p2n4Iin}^^M^C^Rzr5iNBy3r8QPnZH~Mx?4tLj@%2YDbSB1zptgtdJm%rEH zWydG3b!{7?N)f|W(j|k9otyg69buY-?d$stt!sN?TZyVUZCd%_ws~DO?JVi4j%i72 zr*C_7*P=H2E_mzau5q!XD^CoNHHe#}`C?^fyja-bA-0h$ZS8Ge)(ULzZ=Dw7+JNHA zZN?T=`>y8Sk~2+PIxjT1OReimrPg(SyNYXRvNv@;vhlixuJrn-uCj&|Qv0Sio!pjy z&Xc0Uo#EovPK3C$V@YdaM`fE$$Fp{rWK#!R@~JbZ-9y&jHmE3V^H9~ap6Rh^v+w=f zI#-?6c2ASpzF4zCqSl=4IHVcu7}e%VOSIgsDeX_$_5Lf06zy)M)4=zh8w0P@2L{&n z-x%m0TsE+5Q;Nvtq|;Ob@f!UW(ZskygtJ7% z6gHN)n*D?bWuGS9XC;t%%y*QNj9Jvv^m)|Nv}=?gY7C{GypJLz^C>CBN%Cv_O==U) zgWia3Wh7(CtV&E6yB*Eq+GAdDtud9neb{y$7q8}a;-|Pb2?4wX#9Z!P5|8_x9L#+~ z`Ofj7PI6Y#7qg=njjWxl4#pj}BMrw1r7hzgpv>cv$$z*{NM2kR=_uzBk<12@cCivj zF3d~h^NeI-j>VQ8M*Tu8Ao~zNBwvCX@d6%U!oA+F7~} z{Ru6bA)>Z15!CPOx8yTpl1;Wkzqs@!itmzN077O4@tk^dr05me~D3W9bqjz zg5Zh};dUVI;*KDh*g)iJ%md{A&|LH}R6m-EY{v-U9hQyW3pfDe2|fVy1rG;a#_tDw z!7I#raf{7LY_>TX+c#xIMNGvYD<=0?xU(e?h|wM_*L?&0GeNZ&0Pjo&jinny#*>Zc z37+A<@gUuriKK~P-JWrZ-g?|oA3BcK2aj`g*<&%|>d}*92gmSZm&e`>A053lba6C) zaCkI!;O^+c{^z69ny#@G>V~m%y;kGTx_ibQRKSTP3WtfM^1um@EN>hjJ2yVub#c@| z)-+ry>m72HH4J3Rj`T;#JhU&m=;{gS>mHJ{O|?@Rt2`n7F7N6Zke!s-b&biMb(Sm8 zode2?9i^&=9cijB9YZMwwd_aF0hwK2r);kVBFoW+$sz`h$oPYI%Ic4eljqc|9BYL%Qz`uIa8CTBaHwd8e8)_OKf=QPZZ1`e zO)<>}zBh~lVaD5_JCizyoyEfX$E%x7(4`7i*6DE?##ylq-LVY7I zL4v4y@E`Ir6&ahmRdY_~MHf@occv(yu45m|?jlMf+Zk+hg6gkbD- zf(m;Y{}=0sK(Dk=kypU2F&AM^u~Lgyaup<%5C$cZ_CVi}${`=fT&R+~ z8$Lo#fGY6efFRm?!~mIse1o|J-cI+ztivl|hsdLtd`u%c%EF_)k3WDt4u6Ri;4YC0 zkgtiufd3G9>>siOvrEats5!h!_c4jsuvv#D|b5t`h{$e2h&d zx{yLi0cbjL7VZ?o7Ta%io>U}M(brnHutx3d?H>kd1P^AWx-Oa7<$A~ElIvdkz(8um zfZH#3h1*#dFz+|{6|GqJi~2whHgzeH{WHX2n&ZmZa)qd~yDi_Z?r%D%>OlJawAas1 zd~bRF?03?S+h4lB&3&JfL;G~5s_1J{Zpr(LX-9rPNsr1B6!u*wc9W?ES2;r9%$i7kfDjCUiIf;tRdL#$W>e3#|!V z9b6XsD5@+#5|S5iH>fV^aQHs=M7JU5*^V$rj_qE~c5W;48zYy#oQJ~PvH2Kv#5-fa}yKp3|bFtWMeCFme@&|Os|2ZTg|% zVzQ>0U0=Qqoy}@(^?DK02)wtddjIq4?9f*~J`3I!|GN0mGc)MJ!w+jd8h>DC|H-OZqT3V?CEZkT2wc`AJgYGvW)xR#23brzB;D<#Lz-5phB};4$!HCe*nIK-;jGF zGWBoSFMuj29P9JZ=RB4~A)+$_|HOXtL&XJ##`+HhOZ_{edi-cU>zwX6t8L7Ds<5zt za-^NV5U|`rDqeK_i1uqA7NSs>_-nBhl18AIk5#mbwu3^a6gt=RH&UnNSM|07j-fkI zTv8-hfqh^I#;cHSSX2B)j2-mQA`3+WH3p->iGXY{1{MaS;$xHq^z@{S0e@&aHg1SG zzqF1D*!N2_)B7Q5M)O@U?VOv{9{yvdeDy2ulD+;s1$a0y{6+1EcoBKgrg2z*RuGdw>N*AfF zht(2dgX2D3k>6{pEwQCG8GcA}YLJ_~!I~v*Z?=eokL>LWiQM`n6uV(A%6TJj+0CWv zBUVJ4FD>%bkKE|6A^IfkN^FM3PhV^7uLv8$S0660!*c`6*2$K+)aD3-PHbw+HMQuz zk2zcgN7fZGkn@#9MP$o5jqcDVt@_S#@$$BF(l?CDvP7vbZ-5`G&Yv~{oL9PY3p8IA z?Wd=;)>z0inWks;ENz0+Hz+7{i({a1kw+) zmd|{RoT=1U8-$~S|Ge9NZy(bbhuzk9osyliEWTM>w&^8XdaiW39gwDfWfo#4T=)xrkdb)(53+o7LxsjLK1-$b3v1-ReV{`R4rZrW~ zy`;*yHbB$6PI&dL`nk_r|1Ba5ODq1~C@%i~vZNsEXW`+OS1T>DmNgyAWHDWGl zm=@ycU#5Zd3DCCb?Mm3pO#{UOg2;lT-~;Ca?83AQP2K?<&8aXjdA+u1(E$Gkdu#r% z$qC(^@SU(LpyR0b3R_sy{6}f6c!|u0Ujm!qoeHPkqWPJNg4wmQc9)``RDkrlqyG&zz4|1@?I_%2pIJ^DY*jXhhaZ>v>ha ztx@%%9jiK&lm1hglesg)($!j90528mWk+YGpvM;79$#f(@E7iJG*vRDdw?;6Cr?5# zO`jSa4)Y)K7i};+usj4n`8Hod zR~iBWCdh^{7tIpGkC@PWu9?Z)192aGY@nYUE70-yF||~FL~>kYAxxb{F>8jZ$L!mk zdp4G*w`En1FE$O{wt3bBmjvZRmF>#1FSq(y@-zBLYlZY}K|41W*2&2UoO)aOm2X~| zJ+IT*2;4YofzamcK~J&gK+^-p7{RAC{&G z68V*nv&$uqnp zNwB<0VkZliUsAWjs*z@>y=H?*U$+Z>;)HJ|DaQ7kQ5F6@=rJS-oD17O`$~9)v2Nth(3v)T$I{w!|9s1g>u5Fa z3%`_o%UxfR^8MA{ZTT?;#2*8{`*LTB$wkC+LH$G>zRkMf&ZtZK3Q^ry^Nc_=HvfJB z3uUNRfneZpd64!i^+!XMoY+0If9z&|*}$sNU+m4pX`B@kI@8h2oBYF*dnH=@Qvj1`e^{yP zJ?`g1zu|XvAn6?PlJ~q8$gSPL%SX?2*1eF><~m^<5^=#WB)A@5=yk<3%;t{aFDsC~ ztL<`(y`7_8sU;55q`Ors2s{L-&>2cU_*`_Wy> z3){;|z-8?0gB441{0olf(0>wgL51n1=L(d$;PPMPxh;vKYdY>Q7r%cxVszWgCuWgs zk`bV-%_}x=;cQ#LDXcXp$-?}7P%PplXfLt^J`6U~j#e7$bpgJkSsfC9KAz#hY z9lSqj*J3;QwoKmF@pswao}5B@;O7f1VQ>HTsy~D`*1S7aS^OorLH1{$F1s+a$+qBD z>-u`HmfW!e-JzoAhY5%`{O)(j zEXU2ju+WaKqahcg+(}{co8TE@wbGVzV=AKWbl>Ktjy8Tdt^QVNMLD}zUGS(NJoiF2 z>21Kb=C?NAhO!a4NB>L|EYFA6=N10$aIbc0Ml@{_wy=}sHyJ~K(aCbWKx1NDfe5mF zhyUuBtUu}G1_^Y6AXihdI!hfk>p(280e+L$O42d*Gv3+>>`MreR5p{s{xO!_OJpt| z38$OUZ+1NIaBQUZ4V0#Ify;*m?-%Fwo-eZ-WYpSCRa9P^&>4O@6Dy3BpI2PbPJ|xB zekQMR_~Qnp)rY=u%Zdd@E=hD-9g;B!4u$ybv$I&BVV{WW4Txz|le?{Wv#5I9i z;}a(~4lKX9WnsDQ#_elvZ>U;hzBD>YYqdpudPspUJjOpTB(mIx>1*T$2_@3(Twddz zxH%dVoOhdR+Z9^M?9VQ?R*w*ZEfOd!%OdAsixHQ4j~G{u;}JVuADh5^!STyiyO6?O z`GLaM(GGjAu}N}8xW#)ESX`k}E!W#92@Cj1;$w0w(bnv_?g0!1+JqX0^+NB9;)U%p zxagB)$0U{WA6;9>YyWRHqN0I&?dNJvW?m6{Nm(=B@84FAVe#gfntw)u$o|f8=Lv)W z%deIUay{kCMQq>{GF)X~xE1O~E`v;(2SA_M8tHa;jG-U;yCc1VF5+<^ckruy-H8xC zkx8@nDMLM%4&xA;P=j8h_c}Q`>$FnUe$d0fr}I*kBcxcfMb$J>DsJk3%v;x}*uPZO%{6Yu*lXS!IlpNnap3 z7p@?$$Xh{KnhGdOTccsZ{pJ#2Q396AX@;V_DOe#0XAg{23|9>$^yL<>E8kv5ZM^og zvN11{R6dkx_vcn-OpgA$)ZfQGy(?_{xFi3}w}W|gKkn8lvhEMODYuZks97UyA7Q9g zaM_6MDns*8{dlh%#+?DbO-lnW*??mb9kk=OxFeUvduAnMdC4L#y1w-Sxqo+kAKdMn z>D_3V>QhB>aLK~$BBw0$8Vt?#;ZCWR$__ETWM-rOlg!%3-OKU;O|In@f3%Co3;vb- z_a*1+;~(0^7GE6e_x{54A%C}bQH$bxOj=C%=KX%MwM=b2!)XQP{TzW9Jm+NaRAi1y zlzQVX@on`8S{%b$!qX7B%1GN>9j9p#R?7Qk(&iG!ikURl+Tmlp|2j9c?&(hGH0u-9 zU2LdaYz5qII{$q`Iq1vI=HPE3o!c`K+l(GW4OV?rwZHsvYUpiw181-q#tmxm;+GF@ zhHU1Kt5%2?AP8L|xL13lHXPRlEF;W9ZbIrd?&k!CfAf%^)G-Eu= z691BMTj%BYKLw!v9(!~7ttpp^RIW$)y@BSY{)W(2S_Qs!S8YtqWL{oZK+eAQ!tD6Q z!{4>Lu;tHM+y7l^F31Bj1FOa3$+Z?@Qcn&1DX&L&uW%rx9a^LHe2y-o_(7MZhTn@PN7gU77~{73b0jsf zB&mF5SyIt*r=;2yXP5h~(v7FYqY^rTjoc*Wg-$EYhD}AJ55Qlr2Axce#oPs!-c;+b zVwBPSuF?DV%PzwlV&&WS8Ko1iChDV#a&y*XTbK3!Mip`XcvhR0`1DmYS&SFbedQyp za>-SGn&z8ArkwX%%?tFp0apw^E!u(Ggp&qe=9Zgtl^cxja#ujkE}nih zy&uGEERla~#i)oaLv#CUYUbY69aQKQ2XVPIw7HP#{j9j!p1#`V-m&ubPM)~aXxh2Y zk$Yh{UvPqXeKtk>dC{)wt}a3C*SoKKTl=PQDy+oF2};E003$7q>UEksL*AJGn7?cl zw@AQnka!!WYNFuRXET&%20B%%7(9Ah=jEaKiRz|>-k2tro^^#y1CMj?efGtIaf7U; z4pyF~(mv<@U*aE0Nmo9udPBkCYGvWxa>@6DWt#lt=1owfcGV8 zU4KOo_Qt#`feh@k@&r#)K4W&;wV;|8_fWl_ljLW9GxjWRwA&76mdADnu4{tp4tEUg zr&EmWW`{WHb6S8EiDG5-jrzts8Wn`eM$~BC1RWD2`H%UQb2T&Cqq$>Gm!D5AIiTtmLqN$)1AM^exZe9UscH%_R!f;9()DkmsalNUKNwOah^N97tkwS z26F}YsJ8+c{19*{-(Sm@`w^hcJ1kqvFy+p6g$^Y*E*aR_AgQ@oysi3tc6{lnC$m+R zcYEtnZkLt?TshwS^L9r?+THjD%O{)bFTM`yc=eq(^7Ws~#G#hGqNBrOTD3d|EMHQN zRDs(JlQFA_8Tcr3eX^;^O>44cOK2RS(@#W>^|GQyxWCu;Bf<4cj1qMHaPDHvqMt@Q z^GWcTe{bx{bkFD}4y^lnZ)(rOrpA`Kf0Jbo^A6RnE=aHX^LMal{hv35vR~Pygum6* z@TyOJAbJiniYZo9i0&YkF0k+;AZv0YD%GLU%-#E{afth8-Ce%bM&%yo&3pVWQ~2Hl z!Yj`Y=oc>Ch`aWCq5Dmmfo}Ti=f>fp>4CYu%s^Q@56V0{@onHxpNyH?f3vTx`O{!p z%feJ--?346+Z8sqrJJW{vz?LB`{wVDpVYfCmv7h#qtSjD_WQY#%HuXUr?1M1^jft! z{^Zuk~A< zY)Ej(XfQR3{)37NAqfNIhz9(Q@yVqTC{*>hDI=4D1=>1-eyWXZP!6w_B z!!y_Rdhbj`L~LFE(&J3TeU~eq*X-4f!=|m)8;vef{n7na)jF#PW@;;~>x$db35g@m zj0YdQz)kD?KDfT_M1ORp*&@{e-Tk2$IT+AvKbqLNpPATwc+P7?qPWE^6<7+omCNPf z3mDloFJyh$=0yQjUJ*!?hK9~Qz?^%I+N9rF#x^JGzU}H_p zM0>sW*k?wa=;-JY)!w-vj0f;8F%DLY^D!S<$Fu!lvhF&!*0!O)J}WRfrpu z6@;>}{LaGJ-{L)J~m%t5NBzO{zFQ@95i;oY%#oy zJ%wiKy6a8AZ>o7Js^XlaPk;Eo86P2@8VjQktfKM=rtL_Z?<%m6EkxGu28 zH4(B|ao#d@!O@Kjb#)hO`8f<~K2UF}+ia61EXzF$5=*Y69Iu|gYLEgsKyp(5(sKb` zTTJk+6G6q33|*dLFn(Oz=`({AOiF{`KOZ%+Dn$Z#R}2zJ6Ka^YmHS+qR^m{Cpm&hFuaaG$Y)M5PlE{7(Y`oQ}THvFm;D)6DS`?BtP8v#*DbD9%k!%J)hi z>%IrZV6K95@iE#}I2x?hWGz0%sFRRsLMNcip(HS6H95g@mvyqmAeCnGl9XziuK&q; zgI=I@J9rt{3SwHqrjWp>^w^?= zmn%otjqE7g-?)44LCOJ>-M%Rowp~bR-CS|#W3qfNHG#5sQ{wmJFX2W>(_Z3eqT`x? zgA^^l0xF)SXHw(IHJmj^0KN6Alx7Ir!YBEd^t{Si#+4BzKH?$ZZoo#9eUJn860F)C zU)-g?Pa1OXjBIiZ z^#5%A+Kq4K3O`=L|}YWgzzzTi17OdWuof}F!PfbQzIYr7yl zFk(YE*#IFkVe4~Du&5pQ&w4B*A9_#gxf-aBmOhp{@H!-RBf3*N2B3`H?XHt^wXUp@ z%Av{B;_MN{-z`13-*eqXKc)2Bxs^Tt6=-#yD0$ggUC}W*Q~z%!tYt=iZa@IqHI0EE z5|It+WEfK9f~lz*lt50@`DAqvlVTTZ@yl(8Ws-Y}waj~;otFpHmhT|7wR4=J>NwHO zjyvqZ!>I3({lraL(};_UCZbQGE6_QKw=Q_DRkeQ_BmOahl38}@@>e#NvP;TD-O6%B z`;EfLZc3@3�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 hq&$G! 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�T7C4eoQMmZWyem;+ZY6I%R~m6X62=)H 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 literal 0 HcmV?d00001 diff --git a/src/lib/audio_common/src/audio_capturer_main.cpp b/src/lib/audio_common/src/audio_capturer_main.cpp new file mode 100644 index 000000000..838816c55 --- /dev/null +++ b/src/lib/audio_common/src/audio_capturer_main.cpp @@ -0,0 +1,33 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +#include "audio_common/audio_capturer_node.hpp" + +int main(int argc, char *argv[]) { + rclcpp::init(argc, argv); + auto node = std::make_shared(); + node->work(); + rclcpp::shutdown(); + return 0; +} diff --git a/src/lib/audio_common/src/audio_common/audio_capturer_node.cpp b/src/lib/audio_common/src/audio_common/audio_capturer_node.cpp new file mode 100644 index 000000000..cfe8b1ad3 --- /dev/null +++ b/src/lib/audio_common/src/audio_common/audio_capturer_node.cpp @@ -0,0 +1,142 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include +#include + +#include "audio_common/audio_capturer_node.hpp" +#include "audio_common_msgs/msg/audio_stamped.hpp" + +using namespace audio_common; + +AudioCapturerNode::AudioCapturerNode() : Node("audio_capturer_node") { + + // Declare parameters with default values + this->declare_parameter("format", paInt16); + this->declare_parameter("channels", 1); + this->declare_parameter("rate", 16000); + this->declare_parameter("chunk", 512); + this->declare_parameter("device", -1); + this->declare_parameter("frame_id", ""); + + // Get parameters + this->format_ = this->get_parameter("format").as_int(); + this->channels_ = this->get_parameter("channels").as_int(); + this->rate_ = this->get_parameter("rate").as_int(); + this->chunk_ = this->get_parameter("chunk").as_int(); + int device = this->get_parameter("device").as_int(); + this->frame_id_ = this->get_parameter("frame_id").as_string(); + + // Initialize PortAudio + PaError err = Pa_Initialize(); + if (err != paNoError) { + RCLCPP_ERROR(this->get_logger(), "PortAudio error: %s", + Pa_GetErrorText(err)); + throw std::runtime_error("Failed to initialize PortAudio"); + } + + PaStreamParameters inputParameters; + inputParameters.device = (device >= 0) ? device : Pa_GetDefaultInputDevice(); + inputParameters.channelCount = this->channels_; + inputParameters.sampleFormat = this->format_; + inputParameters.suggestedLatency = + Pa_GetDeviceInfo(inputParameters.device)->defaultLowInputLatency; + inputParameters.hostApiSpecificStreamInfo = nullptr; + + err = Pa_OpenStream(&this->stream_, &inputParameters, + nullptr, // output parameters (not used) + this->rate_, this->chunk_, paClipOff, nullptr, nullptr); + + if (err != paNoError) { + RCLCPP_ERROR(this->get_logger(), "Failed to open audio stream: %s", + Pa_GetErrorText(err)); + throw std::runtime_error("Failed to open PortAudio stream"); + } + + err = Pa_StartStream(this->stream_); + if (err != paNoError) { + RCLCPP_ERROR(this->get_logger(), "Failed to start audio stream: %s", + Pa_GetErrorText(err)); + throw std::runtime_error("Failed to start PortAudio stream"); + } + + this->audio_pub_ = + this->create_publisher( + "audio", rclcpp::SensorDataQoS()); + + RCLCPP_INFO(this->get_logger(), "AudioCapturer node started"); +} + +AudioCapturerNode::~AudioCapturerNode() { + Pa_StopStream(this->stream_); + Pa_CloseStream(this->stream_); + Pa_Terminate(); +} + +void AudioCapturerNode::work() { + while (rclcpp::ok()) { + + auto msg = audio_common_msgs::msg::AudioStamped(); + msg.header.frame_id = this->frame_id_; + msg.header.stamp = this->get_clock()->now(); + + switch (this->format_) { + case paFloat32: { + msg.audio.audio_data.float32_data = this->read_data(); + break; + } + case paInt32: { + msg.audio.audio_data.int32_data = this->read_data(); + break; + } + case paInt16: { + msg.audio.audio_data.int16_data = this->read_data(); + break; + } + case paInt8: { + msg.audio.audio_data.int8_data = this->read_data(); + break; + } + case paUInt8: { + msg.audio.audio_data.uint8_data = this->read_data(); + break; + } + default: + RCLCPP_ERROR(this->get_logger(), "Unsupported format"); + continue; + } + + msg.audio.info.format = this->format_; + msg.audio.info.channels = this->channels_; + msg.audio.info.chunk = this->chunk_; + msg.audio.info.rate = this->rate_; + + this->audio_pub_->publish(msg); + } +} + +template std::vector AudioCapturerNode::read_data() { + std::vector data(this->chunk_ * this->channels_); + Pa_ReadStream(this->stream_, data.data(), this->chunk_); + return data; +} diff --git a/src/lib/audio_common/src/audio_common/audio_player_node.cpp b/src/lib/audio_common/src/audio_common/audio_player_node.cpp new file mode 100644 index 000000000..17cdd1d60 --- /dev/null +++ b/src/lib/audio_common/src/audio_common/audio_player_node.cpp @@ -0,0 +1,201 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include +#include +#include + +#include +#include + +#include "audio_common/audio_player_node.hpp" +#include "audio_common_msgs/msg/audio.hpp" +#include "audio_common_msgs/msg/audio_stamped.hpp" + +using namespace audio_common; +using std::placeholders::_1; + +AudioPlayerNode::AudioPlayerNode() : Node("audio_player_node") { + // Declare parameters + this->declare_parameter("channels", 2); + this->declare_parameter("device", -1); + + // Get parameters + this->channels_ = this->get_parameter("channels").as_int(); + this->device_ = this->get_parameter("device").as_int(); + + // Initialize PortAudio + PaError err = Pa_Initialize(); + if (err != paNoError) { + RCLCPP_ERROR(this->get_logger(), "PortAudio error: %s", + Pa_GetErrorText(err)); + throw std::runtime_error("Failed to initialize PortAudio"); + } + + // Subscription to audio topic + auto qos_profile = rclcpp::SensorDataQoS(); + this->audio_sub_ = + this->create_subscription( + "audio", qos_profile, + std::bind(&AudioPlayerNode::audio_callback, this, _1)); + + RCLCPP_INFO(this->get_logger(), "AudioPlayer node started"); +} + +AudioPlayerNode::~AudioPlayerNode() { + // Close all open streams and terminate PortAudio + for (auto &stream_pair : this->stream_dict_) { + Pa_StopStream(stream_pair.second); + Pa_CloseStream(stream_pair.second); + } + Pa_Terminate(); +} + +void AudioPlayerNode::audio_callback( + const audio_common_msgs::msg::AudioStamped::SharedPtr msg) { + + // Create a unique stream key based on format, rate, and channels + std::string stream_key = std::to_string(msg->audio.info.format) + "_" + + std::to_string(msg->audio.info.rate) + "_" + + std::to_string(this->channels_); + + // Check if stream already exists, if not, create one + if (this->stream_dict_.find(stream_key) == this->stream_dict_.end()) { + PaStreamParameters outputParameters; + outputParameters.device = + (this->device_ >= 0) ? this->device_ : Pa_GetDefaultOutputDevice(); + outputParameters.channelCount = this->channels_; + outputParameters.sampleFormat = msg->audio.info.format; + outputParameters.suggestedLatency = + Pa_GetDeviceInfo(outputParameters.device)->defaultHighOutputLatency; + outputParameters.hostApiSpecificStreamInfo = nullptr; + + PaError err = Pa_OpenStream(&this->stream_dict_[stream_key], nullptr, + &outputParameters, msg->audio.info.rate, 1024, + paClipOff, nullptr, nullptr); + + if (err != paNoError) { + RCLCPP_ERROR(this->get_logger(), "Failed to open audio stream: %s", + Pa_GetErrorText(err)); + return; + } + Pa_StartStream(this->stream_dict_[stream_key]); + } + + // Write audio from ROS 2 msg + switch (msg->audio.info.format) { + case paFloat32: + this->write_data(msg->audio.audio_data.float32_data, + msg->audio.info.channels, msg->audio.info.chunk, + stream_key); + break; + + case paInt32: + this->write_data(msg->audio.audio_data.int32_data, msg->audio.info.channels, + msg->audio.info.chunk, stream_key); + break; + + case paInt16: + this->write_data(msg->audio.audio_data.int16_data, msg->audio.info.channels, + msg->audio.info.chunk, stream_key); + break; + + case paInt8: + this->write_data(msg->audio.audio_data.int8_data, msg->audio.info.channels, + msg->audio.info.chunk, stream_key); + break; + + case paUInt8: + this->write_data(msg->audio.audio_data.uint8_data, msg->audio.info.channels, + msg->audio.info.chunk, stream_key); + break; + default: + RCLCPP_ERROR(this->get_logger(), "Unsupported format"); + return; + } +} + +template +void AudioPlayerNode::write_data(const std::vector &input_data, int channels, + int chunk, const std::string &stream_key) { + + std::vector data; // Buffer for the actual data to write + + // Handle mono-to-stereo or stereo-to-mono conversions if necessary + if (channels != this->channels_) { + if (channels == 1 && this->channels_ == 2) { + // Mono to stereo conversion + data.resize(input_data.size() * 2); + for (size_t i = 0; i < input_data.size(); ++i) { + data[2 * i] = input_data[i]; + data[2 * i + 1] = input_data[i]; + } + + } else if (channels == 2 && this->channels_ == 1) { + // Stereo to mono conversion + data.resize(input_data.size() / 2); + for (size_t i = 0; i < data.size(); ++i) { + data[i] = + static_cast((input_data[2 * i] + input_data[2 * i + 1]) / 2); + } + } + + } else { + // No conversion needed + data = input_data; + } + + // Make sure chunk size is correct for frames (not samples) + if (data.size() < chunk * this->channels_) { + RCLCPP_WARN(this->get_logger(), + "Insufficient data (%ld) for requested chunk size (%d).", + data.size(), chunk * this->channels_); + return; + } + + // Write in smaller blocks to reduce underrun risk + size_t frames_written = 0; + size_t total_frames = chunk; + const size_t max_block = 1024; + + while (frames_written < total_frames) { + size_t frames_to_write = std::min(max_block, total_frames - frames_written); + PaError err = Pa_WriteStream(this->stream_dict_[stream_key], + data.data() + frames_written * this->channels_, + frames_to_write); + + if (err == paOutputUnderflowed) { + RCLCPP_WARN(this->get_logger(), + "PortAudio underrun detected, retrying..."); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + continue; // Try again this block + + } else if (err != paNoError) { + RCLCPP_ERROR(this->get_logger(), "PortAudio write error: %s", + Pa_GetErrorText(err)); + break; + } + + frames_written += frames_to_write; + } +} diff --git a/src/lib/audio_common/src/audio_common/music_node.cpp b/src/lib/audio_common/src/audio_common/music_node.cpp new file mode 100644 index 000000000..7587dd7df --- /dev/null +++ b/src/lib/audio_common/src/audio_common/music_node.cpp @@ -0,0 +1,210 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "audio_common/music_node.hpp" +#include "audio_common/wave_file.hpp" + +using namespace audio_common; +using std::placeholders::_1; +using std::placeholders::_2; + +MusicNode::MusicNode() + : Node("music_node"), pause_music_(false), stop_music_(false), + audio_loop_(false), is_thread_alive_(false) { + + // Parameters + this->declare_parameter("chunk", 2048); + this->declare_parameter("frame_id", ""); + + this->chunk_ = this->get_parameter("chunk").as_int(); + this->frame_id_ = this->get_parameter("frame_id").as_string(); + + // Publisher + this->player_pub_ = + this->create_publisher( + "audio", rclcpp::SensorDataQoS()); + + // Services + this->play_service_ = this->create_service( + "music_play", std::bind(&MusicNode::play_callback, this, _1, _2)); + this->stop_service_ = this->create_service( + "music_stop", std::bind(&MusicNode::stop_callback, this, _1, _2)); + this->pause_service_ = this->create_service( + "music_pause", std::bind(&MusicNode::pause_callback, this, _1, _2)); + this->resume_service_ = this->create_service( + "music_resume", std::bind(&MusicNode::resume_callback, this, _1, _2)); + + RCLCPP_INFO(this->get_logger(), "Music node started"); +} + +MusicNode::~MusicNode() { + this->stop_music_ = true; + if (this->publish_thread_.joinable()) { + this->publish_thread_.join(); + } +} + +void MusicNode::publish_audio(const std::string &file_path) { + + this->is_thread_alive_ = true; + + audio_common::WaveFile wf(file_path); + if (!wf.open()) { + RCLCPP_ERROR(this->get_logger(), "Error opening audio file: %s", + file_path.c_str()); + return; + } + + // Create rate + std::chrono::nanoseconds period( + (int)(1e9 * this->chunk_ / wf.get_sample_rate())); + rclcpp::Rate pub_rate(period); + std::vector data(this->chunk_); + + while (!this->stop_music_) { + while (wf.read(data, this->chunk_)) { + + auto msg = audio_common_msgs::msg::AudioStamped(); + msg.header.frame_id = this->frame_id_; + msg.header.stamp = this->get_clock()->now(); + msg.audio.audio_data.float32_data = data; + msg.audio.info.channels = wf.get_num_channels(); + msg.audio.info.chunk = this->chunk_; + msg.audio.info.format = 1; + msg.audio.info.rate = wf.get_sample_rate(); + + this->player_pub_->publish(msg); + pub_rate.sleep(); + + if (this->pause_music_) { + std::unique_lock lock(this->pause_mutex_); + this->pause_cv_.wait(lock, [&]() { return !this->pause_music_; }); + } + + if (this->stop_music_) { + break; + } + } + + wf.rewind(); + if (!this->audio_loop_ || this->stop_music_) { + break; + } + } + + this->is_thread_alive_ = false; +} + +void MusicNode::play_callback( + const std::shared_ptr request, + std::shared_ptr response) { + + if (this->is_thread_alive_) { + RCLCPP_WARN(this->get_logger(), "There is other music playing"); + response->success = false; + return; + } + + if (this->publish_thread_.joinable()) { + this->publish_thread_.join(); + } + + std::string path = request->file_path; + if (path.empty()) { + path = ament_index_cpp::get_package_share_directory("audio_common") + + "/samples/" + request->audio + ".wav"; + } + + if (!std::ifstream(path).good()) { + RCLCPP_ERROR(this->get_logger(), "File %s not found", path.c_str()); + response->success = false; + return; + } + + RCLCPP_INFO(this->get_logger(), "Playing %s", path.c_str()); + this->audio_loop_ = request->loop; + this->pause_music_ = false; + this->stop_music_ = false; + response->success = true; + + this->publish_thread_ = std::thread(&MusicNode::publish_audio, this, path); +} + +void MusicNode::pause_callback( + const std::shared_ptr request, + std::shared_ptr response) { + + if (this->is_thread_alive_) { + this->pause_music_ = true; + RCLCPP_INFO(this->get_logger(), "Music paused"); + response->success = true; + + } else { + RCLCPP_WARN(this->get_logger(), "No music to pause"); + response->success = false; + } +} + +void MusicNode::resume_callback( + const std::shared_ptr request, + std::shared_ptr response) { + + if (this->is_thread_alive_) { + this->pause_music_ = false; + this->pause_cv_.notify_all(); + RCLCPP_INFO(this->get_logger(), "Music resumed"); + response->success = true; + + } else { + RCLCPP_WARN(this->get_logger(), "No music to resume"); + response->success = false; + } +} + +void MusicNode::stop_callback( + const std::shared_ptr request, + std::shared_ptr response) { + + if (this->is_thread_alive_) { + this->stop_music_ = true; + this->publish_thread_.join(); + RCLCPP_INFO(this->get_logger(), "Music stopped"); + response->success = true; + + } else { + RCLCPP_WARN(this->get_logger(), "No music to stop"); + response->success = false; + } +} diff --git a/src/lib/audio_common/src/audio_common/tts_node.cpp b/src/lib/audio_common/src/audio_common/tts_node.cpp new file mode 100644 index 000000000..c402996e8 --- /dev/null +++ b/src/lib/audio_common/src/audio_common/tts_node.cpp @@ -0,0 +1,164 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "audio_common/tts_node.hpp" +#include "audio_common/wave_file.hpp" +#include "audio_common_msgs/action/tts.hpp" +#include "audio_common_msgs/msg/audio_stamped.hpp" + +using namespace audio_common; +using namespace std::chrono_literals; +using std::placeholders::_1; +using std::placeholders::_2; + +TtsNode::TtsNode() : Node("tts_node") { + + this->declare_parameter("chunk", 4096); + this->declare_parameter("frame_id", ""); + + this->chunk_ = this->get_parameter("chunk").as_int(); + this->frame_id_ = this->get_parameter("frame_id").as_string(); + + this->player_pub_ = + this->create_publisher( + "audio", rclcpp::SensorDataQoS()); + + // Action server + this->action_server_ = rclcpp_action::create_server( + this, "say", std::bind(&TtsNode::handle_goal, this, _1, _2), + std::bind(&TtsNode::handle_cancel, this, _1), + std::bind(&TtsNode::handle_accepted, this, _1)); + + RCLCPP_INFO(this->get_logger(), "TTS node started"); +} + +rclcpp_action::GoalResponse +TtsNode::handle_goal(const rclcpp_action::GoalUUID &uuid, + std::shared_ptr goal) { + (void)uuid; + return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE; +} + +rclcpp_action::CancelResponse +TtsNode::handle_cancel(const std::shared_ptr goal_handle) { + RCLCPP_INFO(this->get_logger(), "Canceling TTS..."); + (void)goal_handle; + return rclcpp_action::CancelResponse::ACCEPT; +} + +void TtsNode::handle_accepted( + const std::shared_ptr goal_handle) { + std::unique_lock lock(this->goal_lock_); + if (this->goal_handle_ != nullptr && this->goal_handle_->is_active()) { + auto result = std::make_shared(); + this->goal_handle_->abort(result); + this->goal_handle_ = goal_handle; + } + + std::thread{std::bind(&TtsNode::execute_callback, this, _1), goal_handle} + .detach(); +} + +void TtsNode::execute_callback( + const std::shared_ptr goal_handle) { + auto result = std::make_shared(); + const auto goal = goal_handle->get_goal(); + std::string text = goal->text; + std::string language = goal->language; + int rate = static_cast(goal->rate * 175); + int volume = static_cast(goal->volume * 100); + + // Create audio file using espeak + char temp_file[] = "/tmp/tts_audio.wav"; + std::stringstream cmd; + cmd << "espeak -v" << language << " -s" << rate << " -a" << volume << " -w " + << temp_file << " '" << text << "'"; + + int ret = std::system(cmd.str().c_str()); + if (ret != 0) { + RCLCPP_ERROR(this->get_logger(), + "espeak command failed with return code: %d", ret); + goal_handle->abort(result); + return; + } + + // Read audio file + audio_common::WaveFile wf(temp_file); + if (!wf.open()) { + RCLCPP_ERROR(this->get_logger(), "Error opening audio file: %s", temp_file); + goal_handle->abort(result); + return; + } + + // Create rate + std::chrono::nanoseconds period( + (int)(1e9 * this->chunk_ / wf.get_sample_rate())); + rclcpp::Rate pub_rate(period); + std::vector data(this->chunk_); + + // Initialize the audio message + audio_common_msgs::msg::AudioStamped msg; + msg.header.frame_id = this->frame_id_; + + // Publish the audio data in chunks + while (wf.read(data, this->chunk_)) { + if (!goal_handle->is_active()) { + return; + } + + if (goal_handle->is_canceling()) { + goal_handle->canceled(result); + return; + } + + auto msg = audio_common_msgs::msg::AudioStamped(); + msg.header.stamp = this->get_clock()->now(); + msg.audio.audio_data.float32_data = data; + msg.audio.info.channels = wf.get_num_channels(); + msg.audio.info.chunk = this->chunk_; + msg.audio.info.format = 1; + msg.audio.info.rate = wf.get_sample_rate(); + + auto feedback = std::make_shared(); + feedback->audio = msg; + + this->player_pub_->publish(msg); + goal_handle->publish_feedback(feedback); + pub_rate.sleep(); + } + + // Cleanup and set result + std::remove(temp_file); + + result->text = text; + goal_handle->succeed(result); +} diff --git a/src/lib/audio_common/src/audio_common/wave_file.cpp b/src/lib/audio_common/src/audio_common/wave_file.cpp new file mode 100644 index 000000000..17ebdd434 --- /dev/null +++ b/src/lib/audio_common/src/audio_common/wave_file.cpp @@ -0,0 +1,87 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include + +#include "audio_common/wave_file.hpp" + +using namespace audio_common; + +WaveFile::WaveFile(const std::string &filepath) + : filepath_(filepath), sample_rate_(0), channels_(0), bits_per_sample_(0) {} + +WaveFile::~WaveFile() { this->file_.close(); } + +bool WaveFile::open() { + this->file_.open(this->filepath_, std::ios::binary); + if (!this->file_.is_open()) { + std::cerr << "Failed to open file: " << this->filepath_ << std::endl; + return false; + } + // Read the WAV header + char riff_header[4]; + this->file_.read(riff_header, 4); + if (std::strncmp(riff_header, "RIFF", 4) != 0) { + std::cerr << "Invalid WAV file" << std::endl; + return false; + } + this->file_.seekg(24); + this->file_.read(reinterpret_cast(&this->sample_rate_), 4); + this->file_.seekg(22); + this->file_.read(reinterpret_cast(&this->channels_), 2); + this->file_.seekg(34); + this->file_.read(reinterpret_cast(&this->bits_per_sample_), 2); + this->file_.seekg(44); // Move to the data section start + return true; +} + +void WaveFile::rewind() { + this->file_.close(); + this->open(); +} + +bool WaveFile::read(std::vector &buffer, size_t size) { + if (this->bits_per_sample_ != 16) { + std::cerr << "Only 16-bit PCM WAV files are supported" << std::endl; + return false; + } + + // Allocate temporary buffer to read int16 data + std::vector temp_buffer(size * this->channels_); + + // Read raw int16 samples from the file + this->file_.read(reinterpret_cast(temp_buffer.data()), + size * this->channels_ * sizeof(int16_t)); + if (this->file_.gcount() != + static_cast(size * this->channels_ * sizeof(int16_t))) { + return false; // End of file or read error + } + + // Convert int16 samples to float and store in buffer + buffer.resize(size * this->channels_); + for (size_t i = 0; i < size * this->channels_; ++i) { + buffer[i] = int16ToFloat(temp_buffer[i]); + } + + return true; +} \ No newline at end of file diff --git a/src/lib/audio_common/src/audio_player_main.cpp b/src/lib/audio_common/src/audio_player_main.cpp new file mode 100644 index 000000000..fb0b13f89 --- /dev/null +++ b/src/lib/audio_common/src/audio_player_main.cpp @@ -0,0 +1,33 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +#include "audio_common/audio_player_node.hpp" + +int main(int argc, char *argv[]) { + rclcpp::init(argc, argv); + auto node = std::make_shared(); + rclcpp::spin(node); + rclcpp::shutdown(); + return 0; +} diff --git a/src/lib/audio_common/src/music_main.cpp b/src/lib/audio_common/src/music_main.cpp new file mode 100644 index 000000000..e93c441c3 --- /dev/null +++ b/src/lib/audio_common/src/music_main.cpp @@ -0,0 +1,33 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +#include "audio_common/music_node.hpp" + +int main(int argc, char **argv) { + rclcpp::init(argc, argv); + auto node = std::make_shared(); + rclcpp::spin(node); + rclcpp::shutdown(); + return 0; +} diff --git a/src/lib/audio_common/src/tts_main.cpp b/src/lib/audio_common/src/tts_main.cpp new file mode 100644 index 000000000..07f23d775 --- /dev/null +++ b/src/lib/audio_common/src/tts_main.cpp @@ -0,0 +1,33 @@ +// MIT License +// +// Copyright (c) 2024 Miguel Ángel González Santamarta +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +#include "audio_common/tts_node.hpp" + +int main(int argc, char *argv[]) { + rclcpp::init(argc, argv); + auto node = std::make_shared(); + rclcpp::spin(node); + rclcpp::shutdown(); + return 0; +} diff --git a/src/lib/audio_common_msgs/CMakeLists.txt b/src/lib/audio_common_msgs/CMakeLists.txt new file mode 100644 index 000000000..a30191cd1 --- /dev/null +++ b/src/lib/audio_common_msgs/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.10) +project(audio_common_msgs) + +if(POLICY CMP0148) + cmake_policy(SET CMP0148 OLD) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(std_msgs REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +rosidl_generate_interfaces(${PROJECT_NAME} + "msg/AudioData.msg" + "msg/AudioInfo.msg" + "msg/Audio.msg" + "msg/AudioStamped.msg" + "action/TTS.action" + "srv/MusicPlay.srv" + DEPENDENCIES std_msgs +) + +ament_export_dependencies( + std_msgs + rosidl_default_runtime +) + +ament_package() diff --git a/src/lib/audio_common_msgs/action/TTS.action b/src/lib/audio_common_msgs/action/TTS.action new file mode 100644 index 000000000..1f02060fe --- /dev/null +++ b/src/lib/audio_common_msgs/action/TTS.action @@ -0,0 +1,8 @@ +string text +string language "en" +float32 volume 1.0 +float32 rate 1.0 +--- +string text +--- +audio_common_msgs/AudioStamped audio \ No newline at end of file diff --git a/src/lib/audio_common_msgs/msg/Audio.msg b/src/lib/audio_common_msgs/msg/Audio.msg new file mode 100644 index 000000000..1f237c0b7 --- /dev/null +++ b/src/lib/audio_common_msgs/msg/Audio.msg @@ -0,0 +1,2 @@ +audio_common_msgs/AudioData audio_data +audio_common_msgs/AudioInfo info \ No newline at end of file diff --git a/src/lib/audio_common_msgs/msg/AudioData.msg b/src/lib/audio_common_msgs/msg/AudioData.msg new file mode 100644 index 000000000..712da1afa --- /dev/null +++ b/src/lib/audio_common_msgs/msg/AudioData.msg @@ -0,0 +1,5 @@ +float32[] float32_data +int32[] int32_data +int16[] int16_data +int8[] int8_data +uint8[] uint8_data diff --git a/src/lib/audio_common_msgs/msg/AudioInfo.msg b/src/lib/audio_common_msgs/msg/AudioInfo.msg new file mode 100644 index 000000000..a7498f5dd --- /dev/null +++ b/src/lib/audio_common_msgs/msg/AudioInfo.msg @@ -0,0 +1,4 @@ +int32 format +int32 channels +int32 rate +int32 chunk \ No newline at end of file diff --git a/src/lib/audio_common_msgs/msg/AudioStamped.msg b/src/lib/audio_common_msgs/msg/AudioStamped.msg new file mode 100644 index 000000000..ac6ea5b8f --- /dev/null +++ b/src/lib/audio_common_msgs/msg/AudioStamped.msg @@ -0,0 +1,2 @@ +std_msgs/Header header +audio_common_msgs/Audio audio \ No newline at end of file diff --git a/src/lib/audio_common_msgs/package.xml b/src/lib/audio_common_msgs/package.xml new file mode 100644 index 000000000..dc3cff815 --- /dev/null +++ b/src/lib/audio_common_msgs/package.xml @@ -0,0 +1,17 @@ + + + + audio_common_msgs + 4.0.8 + audio_common_msgs + Miguel Ángel González Santamarta + MIT + ament_cmake + rosidl_interface_packages + std_msgs + + ament_cmake + rosidl_default_generators + rosidl_default_runtime + + \ No newline at end of file diff --git a/src/lib/audio_common_msgs/srv/MusicPlay.srv b/src/lib/audio_common_msgs/srv/MusicPlay.srv new file mode 100644 index 000000000..5699d6bc8 --- /dev/null +++ b/src/lib/audio_common_msgs/srv/MusicPlay.srv @@ -0,0 +1,5 @@ +string audio +string file_path "" +bool loop false +--- +bool success \ No newline at end of file From 247fead0e129ca7c7d9a13c523f285186da87742 Mon Sep 17 00:00:00 2001 From: Valerie Date: Tue, 10 Mar 2026 20:20:31 +0100 Subject: [PATCH 33/74] update the audio launch --- .../bitbots_bringup/launch/audio.launch | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/bitbots_misc/bitbots_bringup/launch/audio.launch b/src/bitbots_misc/bitbots_bringup/launch/audio.launch index 4f1cc3cf8..83023a571 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/audio.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/audio.launch @@ -13,17 +13,21 @@ - - - - - - - - - - - - + + + + + + + + + + + From 8e6da697a4692a14283e6a9ec77115719a82c33e Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Tue, 10 Mar 2026 21:49:29 +0100 Subject: [PATCH 34/74] feat(game_controller_hsl): finalize implementation of base states --- .../capsules/game_status_capsule.py | 71 +++++++++---------- .../bitbots_blackboard/package.xml | 2 +- .../decisions/game_state_decider.py | 7 +- .../decisions/secondary_state_decider.py | 9 ++- .../bitbots_body_behavior/body_behavior.py | 2 +- .../bitbots_body_behavior/package.xml | 2 +- .../bitbots_buttons/CMakeLists.txt | 4 +- .../bitbots_buttons/package.xml | 4 +- .../bitbots_buttons/src/button_node.cpp | 8 +-- .../bitbots_bringup/launch/highlevel.launch | 2 +- src/bitbots_misc/bitbots_bringup/package.xml | 2 +- .../docs/manual/testing/sim_test.rst | 2 +- .../tutorials/cl_simulation_testing_setup.rst | 2 +- .../bitbots_hcm/hcm_dsd/decisions/fallen.py | 11 +-- .../bitbots_hcm/hcm_dsd/decisions/stop.py | 3 +- .../bitbots_hcm/hcm_dsd/hcm_blackboard.py | 2 + .../localization_dsd/decisions/game_state.py | 55 ++++++++------ .../localization_handler.py | 2 +- .../bitbots_localization_handler/package.xml | 2 +- .../bitbots_team_communication.py | 27 +++++-- .../converter/state_to_message_converter.py | 2 +- .../bitbots_team_communication/package.xml | 2 +- .../scripts/test_team_comm.py | 2 +- .../test_state_to_message_converter.py | 2 +- src/bitbots_vision/package.xml | 2 +- .../bitbots_ball_filter/ball_filter.py | 9 +-- src/game_controller_hsl | 1 + 27 files changed, 135 insertions(+), 104 deletions(-) create mode 160000 src/game_controller_hsl diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py index adaad32e8..dfaf435eb 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/game_status_capsule.py @@ -1,7 +1,7 @@ from typing import Optional from bitbots_utils.utils import get_parameters_from_other_node -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from std_msgs.msg import Bool from bitbots_blackboard.capsules import AbstractBlackboardCapsule @@ -21,42 +21,37 @@ def __init__(self, node, blackboard=None): self.last_goal_from_us_time = -86400.0 self.last_goal_time = -86400.0 self.free_kick_kickoff_team: Optional[bool] = None - self.game_controller_stop: Bool = False - #publish stopped msg for hcm - self.stop_pub = self.node.create_publisher(Bool, "game_controller/stop_msg", 1) + self.game_controller_stop: bool = False + # publish stopped msg for hcm + self.stop_pub = node.create_publisher(Bool, "game_controller/stop_msg", 1) def get_game_state(self) -> int: - #Init, ready, set, playing, finished + # Init, ready, set, playing, finished return self.gamestate.main_state def get_game_phase(self) -> int: - #Timeout, Normal, Extratime, Penaltyshoot - return self.gamestate.gamePhase + # Timeout, Normal, Extratime, Penaltyshoot + return self.gamestate.game_phase def get_set_play(self) -> int: - #None, Direct Freekick, Indirect Freekick, Penalty, Throw in, Goalkick, Cornerkick, - return self.gamestate.setPlay + # None, Direct Freekick, Indirect Freekick, Penalty, Throw in, Goalkick, Cornerkick, + return self.gamestate.set_play def get_secondary_team(self) -> int: - #Team ID, wer in set Play den Baall hat - return self.gamestate.kickingTeam - #Team ID, wer in set Play den Baall hat - return self.gamestate.kickingTeam + # Team ID, wer in set Play den Ball hat + return self.gamestate.kicking_team def has_kickoff(self) -> bool: - #vegelcih mit eigener Teamnummer - return self.gamestate.kickingTeam == self.team_id - + # vegelcih mit eigener Teamnummer + return self.gamestate.kicking_team == self.team_id + def is_stopped(self) -> bool: return self.gamestate.stopped def has_penalty_kick(self) -> bool: - return( - self.gamestate.set_play == GameState.SET_PLAY_PENALTY_KICK - and self.gamestate.kickingTeam == self.team_id) - return( - self.gamestate.set_play == GameState.SET_PLAY_PENALTY_KICK - and self.gamestate.kickingTeam == self.team_id) + return ( + self.gamestate.set_play == GameState.SET_PLAY_PENALTY_KICK and self.gamestate.kicking_team == self.team_id + ) def get_our_goals(self) -> int: return self.gamestate.own_score @@ -80,14 +75,12 @@ def get_secondary_seconds_remaining(self) -> float: """Seconds remaining for things like kickoff""" # Time from the message minus time passed since receiving it return max( - self.gamestate.secondary_time - - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), + self.gamestate.secondary_time - (self._node.get_clock().now().nanoseconds / 1e9 - self.last_update), 0.0, ) def get_seconds_since_unpenalized(self) -> float: - return self._node.get_clock().now().nanoseconds / 1e9 - self.seconds_till_unpenalized - return self._node.get_clock().now().nanoseconds / 1e9 - self.seconds_till_unpenalized + return self._node.get_clock().now().nanoseconds / 1e9 - self.unpenalized_time def get_is_penalized(self) -> bool: return self.gamestate.penalized @@ -111,9 +104,9 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: self.game_controller_stop = gamestate_msg.stopped - self.stop_pub.publish(self.game_controller_stop) + self.stop_pub.publish(Bool(data=self.game_controller_stop)) - '''Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt + """Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt if ( gamestate_msg.main_state == GameState.STATE_SET and self.gamestate.setPlay != 2 @@ -125,20 +118,20 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: # secondary action is now executed but we will not see this in the new messages. # it will look like a normal kick off, but we need to remember that this is some sort of free kick # we set the kickoff value accordingly, then we will not be allowed to move if it is a kick for the others - self.free_kick_kickoff_team = gamestate_msg.kickingTeam - - - if gamestate_msg.setPlay != 2 and gamestate_msg.secondaryTime == 0: - self.free_kick_kickoff_team = gamestate_msg.kickingTeam - - - if gamestate_msg.setPlay != 2 and gamestate_msg.secondaryTime == 0: + self.free_kick_kickoff_team = gamestate_msg.kicking_team + + + if gamestate_msg.set_play != 2 and gamestate_msg.secondary_time == 0: + self.free_kick_kickoff_team = gamestate_msg.kicking_team + + + if gamestate_msg.set_play != 2 and gamestate_msg.secondary_time == 0: self.free_kick_kickoff_team = None - - + + if self.free_kick_kickoff_team is not None: gamestate_msg.has_kick_off = self.free_kick_kickoff_team == self.team_id - ''' + """ self.last_update = self._node.get_clock().now().nanoseconds / 1e9 self.gamestate = gamestate_msg diff --git a/src/bitbots_behavior/bitbots_blackboard/package.xml b/src/bitbots_behavior/bitbots_blackboard/package.xml index 4bbed0ca3..b0258395f 100644 --- a/src/bitbots_behavior/bitbots_blackboard/package.xml +++ b/src/bitbots_behavior/bitbots_blackboard/package.xml @@ -23,7 +23,7 @@ bitbots_docs bitbots_tf_buffer bitbots_utils - game_controller_hl_interfaces + game_controller_hsl_interfaces python3-numpy rclpy ros2_numpy diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py index 55586848e..7b400bd81 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/game_state_decider.py @@ -1,6 +1,6 @@ from bitbots_blackboard.body_blackboard import BodyBlackboard from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState class GameStateDecider(AbstractDecisionElement): @@ -30,6 +30,11 @@ def perform(self, reevaluate=False): return "FINISHED" elif game_state_number == GameState.STATE_STANDBY: return "STANDBY" + else: + # This should never happen, but all cases required string response + # as we do not get any stack trace otherwise + self.blackboard.node.get_logger().error(f"Received unknown game state number: {game_state_number}") + return "UNKNOWN" def get_reevaluate(self): """ diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py index a9f49e636..4100e8b9b 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/secondary_state_decider.py @@ -1,6 +1,6 @@ from bitbots_blackboard.body_blackboard import BodyBlackboard from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState class SecondaryStateDecider(AbstractDecisionElement): @@ -16,7 +16,7 @@ def __init__(self, blackboard, dsd, parameters): def perform(self, reevaluate=False): set_play_number = self.blackboard.gamestate.get_set_play() - game_phase_number = self.blackboard.gamestate.get_game_phase + game_phase_number = self.blackboard.gamestate.get_game_phase() # todo this is a temporary hack to make GUI work if game_phase_number == GameState.GAME_PHASE_NORMAL and set_play_number == GameState.SET_PLAY_NONE: return "NORMAL" @@ -38,6 +38,11 @@ def perform(self, reevaluate=False): return "GOAL_KICK" elif set_play_number == GameState.SET_PLAY_THROW_IN: return "THROW_IN" + else: + self.blackboard.node.get_logger().error( + f"Unknown secondary state with game phase {game_phase_number} and set play {set_play_number}" + ) + return "UNKNOWN" def get_reevaluate(self): """ diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py index c529e74a6..61eace438 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/body_behavior.py @@ -4,7 +4,7 @@ from bitbots_blackboard.body_blackboard import BodyBlackboard from bitbots_tf_buffer import Buffer from dynamic_stack_decider.dsd import DSD -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from geometry_msgs.msg import PoseWithCovarianceStamped, Twist from rclpy.callback_groups import MutuallyExclusiveCallbackGroup from rclpy.duration import Duration diff --git a/src/bitbots_behavior/bitbots_body_behavior/package.xml b/src/bitbots_behavior/bitbots_body_behavior/package.xml index c0256d7dc..0a0594b84 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/package.xml +++ b/src/bitbots_behavior/bitbots_body_behavior/package.xml @@ -22,7 +22,7 @@ bitbots_tts bitbots_utils dynamic_stack_decider - game_controller_hl_interfaces + game_controller_hsl_interfaces geometry_msgs python3-numpy rclpy diff --git a/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt b/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt index 771c19b29..27ef961c7 100644 --- a/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt +++ b/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt @@ -15,7 +15,7 @@ find_package(ament_cmake REQUIRED) find_package(backward_ros REQUIRED) find_package(bitbots_docs REQUIRED) find_package(bitbots_msgs REQUIRED) -find_package(game_controller_hl_interfaces REQUIRED) +find_package(game_controller_hsl_interfaces REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) find_package(std_srvs REQUIRED) @@ -27,7 +27,7 @@ ament_target_dependencies( ament_cmake backward_ros bitbots_msgs - game_controller_hl_interfaces + game_controller_hsl_interfaces rclcpp std_msgs std_srvs diff --git a/src/bitbots_lowlevel/bitbots_buttons/package.xml b/src/bitbots_lowlevel/bitbots_buttons/package.xml index 0deeed624..ce87ddfb1 100644 --- a/src/bitbots_lowlevel/bitbots_buttons/package.xml +++ b/src/bitbots_lowlevel/bitbots_buttons/package.xml @@ -20,14 +20,14 @@ backward_ros bitbots_docs bitbots_msgs - game_controller_hl_interfaces + game_controller_hsl_interfaces rclcpp std_msgs std_srvs test_msgs - + python3 tested_robot diff --git a/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp b/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp index 6e2e2e18b..28f83ca0a 100644 --- a/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp +++ b/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -53,12 +53,12 @@ class ButtonNode : public rclcpp::Node { teaching_mode_client_ = this->create_client("teaching_mode"); buttons_sub_ = this->create_subscription( "/buttons", 1, std::bind(&bitbots_buttons::ButtonNode::buttonCb, this, _1)); - gamestate_sub_ = this->create_subscription( + gamestate_sub_ = this->create_subscription( "gamestate", 1, std::bind(&bitbots_buttons::ButtonNode::gamestateCb, this, _1)); } // Sets the in_game_ variable to true, if a Gamestate message from the Gamecontroller arrives. - void gamestateCb(const game_controller_hl_interfaces::msg::GameState::SharedPtr msg) { in_game_ = true; } + void gamestateCb(const game_controller_hsl_interfaces::msg::GameState::SharedPtr msg) { in_game_ = true; } void buttonCb(const bitbots_msgs::msg::Buttons::SharedPtr msg) { // button1 - red @@ -197,7 +197,7 @@ class ButtonNode : public rclcpp::Node { rclcpp::Client::SharedPtr foot_zero_client_; rclcpp::Client::SharedPtr power_client_; rclcpp::Subscription::SharedPtr buttons_sub_; - rclcpp::Subscription::SharedPtr gamestate_sub_; + rclcpp::Subscription::SharedPtr gamestate_sub_; }; } // namespace bitbots_buttons diff --git a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch index fc277868b..6543a3607 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch @@ -16,7 +16,7 @@ - + diff --git a/src/bitbots_misc/bitbots_bringup/package.xml b/src/bitbots_misc/bitbots_bringup/package.xml index 30fbedae9..f3aec43bb 100644 --- a/src/bitbots_misc/bitbots_bringup/package.xml +++ b/src/bitbots_misc/bitbots_bringup/package.xml @@ -33,7 +33,7 @@ bitbots_utils bitbots_vision foxglove_bridge - game_controller_hl + game_controller_hsl humanoid_base_footprint soccer_ipm system_monitor diff --git a/src/bitbots_misc/bitbots_docs/docs/manual/testing/sim_test.rst b/src/bitbots_misc/bitbots_docs/docs/manual/testing/sim_test.rst index 9d3b21b10..38410e360 100644 --- a/src/bitbots_misc/bitbots_docs/docs/manual/testing/sim_test.rst +++ b/src/bitbots_misc/bitbots_docs/docs/manual/testing/sim_test.rst @@ -37,4 +37,4 @@ Test the complete software stack in simulation .. code-block:: bash ros2 launch bitbots_bringup simulator_teamplayer.launch - ros2 run game_controller_hl sim_gamestate.py + ros2 run game_controller_hsl sim_gamestate.py diff --git a/src/bitbots_misc/bitbots_docs/docs/manual/tutorials/cl_simulation_testing_setup.rst b/src/bitbots_misc/bitbots_docs/docs/manual/tutorials/cl_simulation_testing_setup.rst index 7b25661ce..dc617b760 100644 --- a/src/bitbots_misc/bitbots_docs/docs/manual/tutorials/cl_simulation_testing_setup.rst +++ b/src/bitbots_misc/bitbots_docs/docs/manual/tutorials/cl_simulation_testing_setup.rst @@ -36,7 +36,7 @@ Instead of doing `pixi run ...` you can also activate the pixi environment for t With ``game_controller:=false`` we ensure, that the game_controller_listener is not started as well, but instead we will simulate the current gamestate by our own script (in another terminal): -``pixi run ros2 run game_controller_hl sim_gamestate.py`` +``pixi run ros2 run game_controller_hsl sim_gamestate.py`` Which allows us to simulate the current gamestate and different phases of the game. Now everything is ready for some simulation testing. diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py index 5faf6438e..79652a3e5 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/fallen.py @@ -2,6 +2,7 @@ import numpy as np from bitbots_utils.transforms import quat2fused +from std_msgs.msg import Bool from bitbots_hcm.hcm_dsd.decisions import AbstractHCMDecisionElement @@ -20,12 +21,6 @@ def __init__(self, blackboard, dsd, parameters): ) self.fallen_angular_velocity_thresh = self.blackboard.node.get_parameter("fallen_angular_velocity_thresh").value - # publishes if robot is fallen - self.is_fallen_publisher = self.create_publisher( - bool, "hsl_gamecontroller/is_fallen", 1 - ) - - def perform(self, reevaluate=False): # Check of the fallen detection is active if not self.blackboard.is_stand_up_active: @@ -62,10 +57,10 @@ def perform(self, reevaluate=False): self.publish_if_fallen(False) return "NOT_FALLEN" - + def publish_if_fallen(self, is_fallen): # publishes if robot is fallen - self.is_fallen_publisher.publish(is_fallen) + self.blackboard.is_fallen_publisher.publish(Bool(data=is_fallen)) def get_reevaluate(self): return True diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py index e33750d78..b28ad4efd 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/stop.py @@ -15,7 +15,8 @@ def perform(self, reevaluate=False): def get_reevaluate(self): return True - + + class GameControllerStop(AbstractHCMDecisionElement): """ Handles manual stops diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py index 2437bda85..6db308509 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py @@ -8,6 +8,7 @@ from rclpy.task import Future from rclpy.time import Time from sensor_msgs.msg import Imu, JointState +from std_msgs.msg import Bool from std_msgs.msg import Empty as EmptyMsg from std_srvs.srv import Empty as EmptySrv from std_srvs.srv import SetBool @@ -56,6 +57,7 @@ def __init__(self, node: Node): self.cancel_path_planning_pub = self.node.create_publisher(EmptyMsg, "pathfinding/cancel", 1) self.speak_publisher = self.node.create_publisher(Audio, "speak", 1) self.torque_publisher = self.node.create_publisher(JointTorque, "set_torque_individual", 10) + self.is_fallen_publisher = self.node.create_publisher(Bool, "hsl_gamecontroller/is_fallen", 1) # Latest imu data self.accel = numpy.array([0, 0, 0]) diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py index 67759ad04..33569fd86 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_dsd/decisions/game_state.py @@ -1,4 +1,4 @@ -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from bitbots_localization_handler.localization_dsd.decisions import AbstractLocalizationDecisionElement @@ -32,20 +32,26 @@ def perform(self, reevaluate=False): :param reevaluate: :return: """ - game_state_number = self.blackboard.gamestate.get_game_state() - if game_state_number == GameState.GAMESTATE_INITIAL: + game_state_number = self.blackboard.gamestate.get_game_state() + # todo this is a temporary hack to make GUI work + if game_state_number == GameState.STATE_INITIAL: return "INITIAL" - elif game_state_number == GameState.GAMESTATE_READY: + elif game_state_number == GameState.STATE_READY: return "READY" - elif game_state_number == GameState.GAMESTATE_SET: + elif game_state_number == GameState.STATE_SET: return "SET" - elif game_state_number == GameState.GAMESTATE_PLAYING: + elif game_state_number == GameState.STATE_PLAYING: return "PLAYING" - elif game_state_number == GameState.GAMESTATE_FINISHED: + elif game_state_number == GameState.STATE_FINISHED: return "FINISHED" elif game_state_number == GameState.STATE_STANDBY: return "STANDBY" + else: + # This should never happen, but all cases required string response + # as we do not get any stack trace otherwise + self.blackboard.node.get_logger().error(f"Received unknown game state number: {game_state_number}") + return "UNKNOWN" def get_reevaluate(self): """ @@ -61,29 +67,34 @@ class SecondaryStateDecider(AbstractLocalizationDecisionElement): """ def perform(self, reevaluate=False): - state_number = self.blackboard.gamestate.get_secondary_state() - + set_play_number = self.blackboard.gamestate.get_set_play() + game_phase_number = self.blackboard.gamestate.get_game_phase() # todo this is a temporary hack to make GUI work - if state_number == GameState.STATE_NORMAL: + if game_phase_number == GameState.GAME_PHASE_NORMAL and set_play_number == GameState.SET_PLAY_NONE: return "NORMAL" - elif state_number == GameState.STATE_PENALTYSHOOT: + elif game_phase_number == GameState.GAME_PHASE_PENALTY_SHOOT_OUT and set_play_number == GameState.SET_PLAY_NONE: return "PENALTYSHOOT" - elif state_number == GameState.STATE_OVERTIME: + elif game_phase_number == GameState.GAME_PHASE_EXTRA_TIME and set_play_number == GameState.SET_PLAY_NONE: return "OVERTIME" - elif state_number == GameState.STATE_TIMEOUT: + elif game_phase_number == GameState.GAME_PHASE_TIMEOUT and set_play_number == GameState.SET_PLAY_NONE: return "TIMEOUT" - elif state_number == GameState.STATE_DIRECT_FREEKICK: + elif set_play_number == GameState.SET_PLAY_DIRECT_FREE_KICK: return "DIRECT_FREEKICK" - elif state_number == GameState.STATE_INDIRECT_FREEKICK: + elif set_play_number == GameState.SET_PLAY_INDIRECT_FREE_KICK: return "INDIRECT_FREEKICK" - elif state_number == GameState.STATE_PENALTYKICK: + elif set_play_number == GameState.SET_PLAY_PENALTY_KICK: return "PENALTYKICK" - elif state_number == GameState.STATE_CORNER_KICK: + elif set_play_number == GameState.SET_PLAY_CORNER_KICK: return "CORNER_KICK" - elif state_number == GameState.STATE_GOAL_KICK: + elif set_play_number == GameState.SET_PLAY_GOAL_KICK: return "GOAL_KICK" - elif state_number == GameState.STATE_THROW_IN: + elif set_play_number == GameState.SET_PLAY_THROW_IN: return "THROW_IN" + else: + self.blackboard.node.get_logger().error( + f"Unknown secondary state with game phase {game_phase_number} and set play {set_play_number}" + ) + return "UNKNOWN" def get_reevaluate(self): """ @@ -102,9 +113,9 @@ def __init__(self, blackboard, dsd, parameters): self.team_id = self.blackboard.gamestate.get_team_id() def perform(self, reevaluate=False): - state_number = self.blackboard.gamestate.get_secondary_state() + game_phase_number = self.blackboard.gamestate.get_game_phase() # we have to handle penalty shoot differently because the message is strange - if state_number == GameState.STATE_PENALTYSHOOT: + if game_phase_number == GameState.GAME_PHASE_PENALTY_SHOOT_OUT: if self.blackboard.gamestate.has_kickoff(): return "OUR" return "OTHER" @@ -155,7 +166,7 @@ def perform(self, reevaluate=False): self.publish_debug_data("Previous game state", previous_game_state_number) self.publish_debug_data("Current game state", game_state_number) - if previous_game_state_number == GameState.GAMESTATE_INITIAL and game_state_number == GameState.GAMESTATE_READY: + if previous_game_state_number == GameState.STATE_INITIAL and game_state_number == GameState.STATE_READY: return "YES" else: return "NO" diff --git a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py index 3239dbde2..f47971829 100755 --- a/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py +++ b/src/bitbots_navigation/bitbots_localization_handler/bitbots_localization_handler/localization_handler.py @@ -3,7 +3,7 @@ import rclpy from dynamic_stack_decider.dsd import DSD -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from geometry_msgs.msg import PoseWithCovarianceStamped from rclpy.callback_groups import MutuallyExclusiveCallbackGroup, ReentrantCallbackGroup from rclpy.experimental.events_executor import EventsExecutor diff --git a/src/bitbots_navigation/bitbots_localization_handler/package.xml b/src/bitbots_navigation/bitbots_localization_handler/package.xml index ce1b07b2f..32e098f39 100644 --- a/src/bitbots_navigation/bitbots_localization_handler/package.xml +++ b/src/bitbots_navigation/bitbots_localization_handler/package.xml @@ -19,7 +19,7 @@ bitbots_msgs bitbots_utils dynamic_stack_decider - game_controller_hl_interfaces + game_controller_hsl_interfaces geometry_msgs python3-numpy rclpy diff --git a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py index 18abf9c97..f18c38041 100755 --- a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py +++ b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py @@ -6,12 +6,13 @@ from typing import Optional import rclpy +import transforms3d from ament_index_python.packages import get_package_share_directory from bitbots_tf_buffer import Buffer from bitbots_utils.utils import get_parameter_dict, get_parameters_from_other_node from builtin_interfaces.msg import Time as TimeMsg -from game_controller_hl_interfaces.msg import GameState -from geometry_msgs.msg import PoseWithCovarianceStamped, Twist, TwistWithCovarianceStamped +from game_controller_hsl_interfaces.msg import GameState, PlayerStatusPose +from geometry_msgs.msg import PoseWithCovarianceStamped, Quaternion, Twist, TwistWithCovarianceStamped from numpy import double from rclpy.callback_groups import MutuallyExclusiveCallbackGroup from rclpy.duration import Duration @@ -104,8 +105,8 @@ def try_to_establish_connection(self): def create_publishers(self): self.team_data_publisher = self.node.create_publisher(TeamData, self.topics["team_data_topic"], qos_profile=1) - self.pose_stamped_publisher = self.node.create_publisher( - PoseWithCovarianceStamped, "hsl_gamecontroller/pose_stamped", 1 + self.game_controller_player_pose_publisher = self.node.create_publisher( + PlayerStatusPose, "hsl_gamecontroller/pose_stamped", 1 ) def create_subscribers(self): @@ -177,9 +178,17 @@ def gamestate_cb(self, msg: GameState): self.gamestate = msg def pose_cb(self, msg: PoseWithCovarianceStamped): - self.pose_stamped_publisher.publish(msg) self.pose = msg + player_pose_msg = PlayerStatusPose() + player_pose_msg.header = msg.header + player_pose_msg.pose = [ + msg.pose.pose.position.x, + msg.pose.pose.position.y, + self.extract_orientation_yaw_angle(msg.pose.pose.orientation), + ] + self.game_controller_player_pose_publisher.publish(player_pose_msg) + def cmd_vel_cb(self, msg: Twist): self.cmd_vel = msg self.cmd_vel_time = self.get_current_time().to_msg() @@ -295,6 +304,14 @@ def is_robot_allowed_to_send_message(self) -> bool: def get_current_time(self) -> Time: return self.node.get_clock().now() + def extract_orientation_yaw_angle(self, quaternion: Quaternion): + angles = self.convert_to_euler(quaternion) + theta = angles[2] + return theta + + def convert_to_euler(self, quaternion: Quaternion): + return transforms3d.euler.quat2euler([quaternion.w, quaternion.x, quaternion.y, quaternion.z]) + def main(): rclpy.init(args=None) diff --git a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/converter/state_to_message_converter.py b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/converter/state_to_message_converter.py index 41ea6a62e..1d821e48a 100644 --- a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/converter/state_to_message_converter.py +++ b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/converter/state_to_message_converter.py @@ -4,7 +4,7 @@ import numpy as np import transforms3d from builtin_interfaces.msg import Time -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from geometry_msgs.msg import PointStamped, PoseStamped, PoseWithCovarianceStamped, Quaternion, Twist from jaxtyping import Float64 from soccer_vision_3d_msgs.msg import Robot, RobotArray diff --git a/src/bitbots_team_communication/bitbots_team_communication/package.xml b/src/bitbots_team_communication/bitbots_team_communication/package.xml index 12a0701b1..8881b8266 100644 --- a/src/bitbots_team_communication/bitbots_team_communication/package.xml +++ b/src/bitbots_team_communication/bitbots_team_communication/package.xml @@ -23,7 +23,7 @@ bitbots_tf_buffer bitbots_utils builtin_interfaces - game_controller_hl_interfaces + game_controller_hsl_interfaces geometry_msgs python3-protobuf python3-transforms3d diff --git a/src/bitbots_team_communication/bitbots_team_communication/scripts/test_team_comm.py b/src/bitbots_team_communication/bitbots_team_communication/scripts/test_team_comm.py index d392b3309..fc82a8261 100755 --- a/src/bitbots_team_communication/bitbots_team_communication/scripts/test_team_comm.py +++ b/src/bitbots_team_communication/bitbots_team_communication/scripts/test_team_comm.py @@ -5,7 +5,7 @@ import numpy import rclpy -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from geometry_msgs.msg import Point, Pose, PoseWithCovariance, PoseWithCovarianceStamped, Quaternion, TransformStamped from rclpy.qos import QoSDurabilityPolicy, QoSProfile from soccer_vision_3d_msgs.msg import Robot, RobotArray diff --git a/src/bitbots_team_communication/bitbots_team_communication/test/converter/test_state_to_message_converter.py b/src/bitbots_team_communication/bitbots_team_communication/test/converter/test_state_to_message_converter.py index 16d8511f7..2e995483e 100644 --- a/src/bitbots_team_communication/bitbots_team_communication/test/converter/test_state_to_message_converter.py +++ b/src/bitbots_team_communication/bitbots_team_communication/test/converter/test_state_to_message_converter.py @@ -4,7 +4,7 @@ import numpy import pytest from builtin_interfaces.msg import Time -from game_controller_hl_interfaces.msg import GameState +from game_controller_hsl_interfaces.msg import GameState from geometry_msgs.msg import ( Point, PointStamped, diff --git a/src/bitbots_vision/package.xml b/src/bitbots_vision/package.xml index 6f5b75f5e..ef99db023 100644 --- a/src/bitbots_vision/package.xml +++ b/src/bitbots_vision/package.xml @@ -28,7 +28,7 @@ rosidl_default_generators rosidl_default_runtime bitbots_utils - game_controller_hl_interfaces + game_controller_hsl_interfaces geometry_msgs image_transport python3-numpy diff --git a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py index 0ab0c0ecc..b9d3cabc6 100755 --- a/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py +++ b/src/bitbots_world_model/bitbots_ball_filter/bitbots_ball_filter/ball_filter.py @@ -39,7 +39,7 @@ def __init__(self) -> None: # Initialize parameters self.update_params() self.logger.info(f"Using frame '{self.config.filter.frame}' for ball filtering") - self.last_ball_time = self.get_clock().now() + self.last_ball_time: Time = self.get_clock().now() self.camera_info: Optional[CameraInfo] = None @@ -146,7 +146,8 @@ def ball_callback(self, msg: BallArray) -> None: # Store the ball measurement self.ball_state_position = numpify(ball_measurement_map.point) self.ball_state_covariance = covariance - self.last_ball_time = Time.from_msg(ball_msg.header.stamp) + # @TODO: actually give last ball time + self.last_ball_time = self.get_clock().now() ball_measurement_updated = True # Get our estimate in the base footprint frame for easier distance calculation @@ -275,8 +276,8 @@ def filter_step(self) -> None: # Build message for Ball age ball_age_msg = Float32() - nanoseconds_since_last_ball = np.float32((self.get_clock().now() - self.last_ball_time).nanoseconds) - ball_age_msg.data = nanoseconds_since_last_ball / 1e9 + seconds_since_last_ball = (self.get_clock().now() - self.last_ball_time).nanoseconds / 1e9 + ball_age_msg.data = seconds_since_last_ball self.ball_age_publisher.publish(ball_age_msg) diff --git a/src/game_controller_hsl b/src/game_controller_hsl new file mode 160000 index 000000000..3d4f4042c --- /dev/null +++ b/src/game_controller_hsl @@ -0,0 +1 @@ +Subproject commit 3d4f4042cc1b13018ae330fb972d236f7f4097d9 From bce597e3e05cc09d9a0cd9bb37904cd51683d753 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 08:50:39 +0100 Subject: [PATCH 35/74] fix against falling when in "stopped" state --- src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd index 0693424ee..c98c8750e 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd @@ -22,7 +22,7 @@ $StartHCM HOLD --> @SetTorque + stiff:true, @Wait FINISHED --> @SetTorque + stiff:true + r:false, @RobotStateControllable, @PlayAnimationDynup + direction:walkready + r:false OFF --> $GameControllerStop - STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @Wait + STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait FREE -> $Stop STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait FREE -->$CheckIMU From 5e668ed2f8296b815be206228091118b89561974 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 09:01:39 +0100 Subject: [PATCH 36/74] OUR in dsd Tree for all secondaryStateDeciders --- .../bitbots_body_behavior/behavior_dsd/main.dsd | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 2e8907f1a..862863d63 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -109,8 +109,7 @@ $DoOnce FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - ELSE --> $SecondaryStateTeamDecider - OUR --> $RankToBallNoGoalie + ELSE --> $RankToBallNoGoalie FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition @@ -164,7 +163,7 @@ $IsPenalized PENALTYSHOOT --> #PenaltyShootoutBehavior TIMEOUT --> #StandAndLook ELSE --> $SecondaryStateTeamDecider - OWN --> #NormalBehavior //Nutzt immer normalBehaviour wenn wir die aktion ausführen, könnte man spezifischeres Verhalten definieren + OUR --> #NormalBehavior //Nutzt immer normalBehaviour wenn wir die aktion ausführen, könnte man spezifischeres Verhalten definieren OTHER --> #Placing NORMAL --> #NormalBehavior OVERTIME --> #NormalBehavior From d747566b234ec8db69033b2b993b6d7d48079d98 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 09:08:04 +0100 Subject: [PATCH 37/74] fix audio launch script --- src/bitbots_misc/bitbots_bringup/launch/audio.launch | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/bitbots_misc/bitbots_bringup/launch/audio.launch b/src/bitbots_misc/bitbots_bringup/launch/audio.launch index 83023a571..ad49833a0 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/audio.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/audio.launch @@ -17,17 +17,7 @@ pkg="audio_common" exec="audio_capturer_node" name="audio_capturer_node" - ns="$(var ns)" output="screen"> - - - - - - - - - From b5a984acde763ed070e642e2fa6c724f617a6e42 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 09:35:03 +0100 Subject: [PATCH 38/74] simplify audio.launch --- .../bitbots_bringup/launch/audio.launch | 25 +++++-------------- .../bitbots_bringup/launch/highlevel.launch | 1 - 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/bitbots_misc/bitbots_bringup/launch/audio.launch b/src/bitbots_misc/bitbots_bringup/launch/audio.launch index ad49833a0..ea3bb79e4 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/audio.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/audio.launch @@ -1,23 +1,10 @@ - - - - - - - - - - - - - - - + + diff --git a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch index cf512d35f..794cca5b7 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch @@ -89,7 +89,6 @@ - From ca26560209b82ac8576d3520c6df628aa0e47c94 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 09:57:00 +0100 Subject: [PATCH 39/74] add dependencies --- pixi.lock | 571 +++++++++++++++++++++--------------------------------- pixi.toml | 8 +- 2 files changed, 228 insertions(+), 351 deletions(-) diff --git a/pixi.lock b/pixi.lock index 6fee74e9b..7144328a1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -19,6 +19,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-plugins-1.2.12-h989ed37_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/assimp-5.4.3-hecf2907_1.conda @@ -154,6 +155,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda @@ -167,8 +169,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-good-1.18.5-h0661c57_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-ugly-1.24.11-ha85cff8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda @@ -254,7 +254,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda @@ -323,7 +323,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.2-h61e6d4b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsdformat14-14.8.0-py312h1f51ce1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-h0c1763c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda @@ -418,6 +418,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/portaudio-19.7.0-hf4617a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -477,8 +478,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-action-tutorials-interfaces-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-action-tutorials-py-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-actionlib-msgs-5.3.6-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-clang-format-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-2.5.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-auto-2.5.4-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-clang-format-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-copyright-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-core-2.5.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np2py312h2ed9cc7_14.conda @@ -524,10 +527,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-xmllint-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-angles-1.16.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-capture-0.3.15-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-common-0.3.15-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-common-msgs-0.3.15-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-play-0.3.15-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-2.0.0-np2py312h2ed9cc7_14.conda @@ -1061,6 +1060,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-plugins-1.2.12-haf9f4a6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/assimp-5.4.3-he8c3857_1.conda @@ -1195,6 +1195,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda @@ -1208,8 +1209,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-14.1.2-h45e821f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-base-1.24.11-h83ffb7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-good-1.18.5-hafdbc27_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-ugly-1.24.11-h7e18b86_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-1.24.11-h17c303d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.43-h4cd1324_6.conda @@ -1243,6 +1242,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.10.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h9d01bbc_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.8-h27a9ab5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -1292,7 +1292,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda @@ -1360,7 +1360,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.60.2-h8171147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsdformat14-14.8.0-py312h39f64fe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h022381a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda @@ -1452,6 +1452,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portaudio-19.7.0-h9d01bbc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/proj-9.7.1-hd211770_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -1511,8 +1512,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-action-tutorials-interfaces-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-action-tutorials-py-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-actionlib-msgs-5.3.6-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-clang-format-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-2.5.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-auto-2.5.4-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-clang-format-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-copyright-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-core-2.5.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np2py312h61f2ce4_14.conda @@ -1558,10 +1561,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-xmllint-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-angles-1.16.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-capture-0.3.15-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-common-0.3.15-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-common-msgs-0.3.15-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-play-0.3.15-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-backward-ros-1.0.8-np2py312h61f2ce4_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-2.0.0-np2py312h3575a3a_14.conda @@ -2230,6 +2229,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-plugins-1.2.12-h989ed37_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/assimp-5.4.3-hecf2907_1.conda @@ -2365,6 +2365,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda @@ -2378,8 +2379,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.11-h651a532_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-good-1.18.5-h0661c57_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-ugly-1.24.11-ha85cff8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h993cebd_6.conda @@ -2465,7 +2464,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda @@ -2534,7 +2533,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.2-h61e6d4b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsdformat14-14.8.0-py312h1f51ce1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-h0c1763c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda @@ -2629,6 +2628,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/portaudio-19.7.0-hf4617a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -2688,8 +2688,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-action-tutorials-interfaces-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-action-tutorials-py-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-actionlib-msgs-5.3.6-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-clang-format-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-2.5.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-auto-2.5.4-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-clang-format-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-copyright-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-core-2.5.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np2py312h2ed9cc7_14.conda @@ -2735,10 +2737,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-xmllint-0.17.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-angles-1.16.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-capture-0.3.15-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-common-0.3.15-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-common-msgs-0.3.15-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-play-0.3.15-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-2.0.0-np2py312h2ed9cc7_14.conda @@ -3273,6 +3271,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-plugins-1.2.12-haf9f4a6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/assimp-5.4.3-he8c3857_1.conda @@ -3407,6 +3406,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda @@ -3420,8 +3420,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-14.1.2-h45e821f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-base-1.24.11-h83ffb7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-good-1.18.5-hafdbc27_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-ugly-1.24.11-h7e18b86_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-1.24.11-h17c303d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.43-h4cd1324_6.conda @@ -3455,6 +3453,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.10.0-pyh53cf698_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h9d01bbc_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.8-h27a9ab5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda @@ -3504,7 +3503,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.1-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.1-hdae7a39_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda @@ -3572,7 +3571,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.60.2-h8171147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsdformat14-14.8.0-py312h39f64fe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h022381a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda @@ -3664,6 +3663,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portaudio-19.7.0-h9d01bbc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/proj-9.7.1-hd211770_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda @@ -3723,8 +3723,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-action-tutorials-interfaces-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-action-tutorials-py-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-actionlib-msgs-5.3.6-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-clang-format-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-2.5.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-auto-2.5.4-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-clang-format-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-copyright-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-core-2.5.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-cppcheck-0.17.3-np2py312h61f2ce4_14.conda @@ -3770,10 +3772,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-xmllint-0.17.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-angles-1.16.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-capture-0.3.15-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-common-0.3.15-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-common-msgs-0.3.15-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-play-0.3.15-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-backward-ros-1.0.8-np2py312h61f2ce4_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-2.0.0-np2py312h3575a3a_14.conda @@ -4442,6 +4440,35 @@ packages: purls: [] size: 615729 timestamp: 1768327548407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-plugins-1.2.12-h989ed37_2.conda + sha256: 2b0912f8891f367ea8bdf8a8c65f27a09e275df335bfc876b3b973dfa138ff29 + md5: 657d4333ff8d0b9f713c94c0e23ee1a8 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.14,<1.3.0a0 + - ffmpeg >=8.0.0,<9.0a0 + - jack >=1.9.22,<1.10.0a0 + - libgcc >=14 + - pulseaudio-client >=17.0,<17.1.0a0 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + license_family: LGPL + purls: [] + size: 254302 + timestamp: 1756137041656 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-plugins-1.2.12-haf9f4a6_2.conda + sha256: e03e48f4fd5bbd7523b03cdcc803a5654f132fc561e422e2cc2903c883ee0ce1 + md5: bf0fa9c73d93fc6b499a4059e82c5aa5 + depends: + - alsa-lib >=1.2.14,<1.3.0a0 + - ffmpeg >=8.0.0,<9.0a0 + - jack >=1.9.22,<1.10.0a0 + - libgcc >=14 + - pulseaudio-client >=17.0,<17.1.0a0 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + license_family: LGPL + purls: [] + size: 264427 + timestamp: 1756137068124 - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda sha256: b08ef033817b5f9f76ce62dfcac7694e7b6b4006420372de22494503decac855 md5: 346722a0be40f6edc53f12640d301338 @@ -7436,6 +7463,16 @@ packages: purls: [] size: 14338508 timestamp: 1770986540132 +- conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda + sha256: 1095cdcb8bb889d50c399e07609b7217a27f8305e4ac70b3f46b9e0d94ed4760 + md5: 3057964958da1fc0ec119951dd6775e2 + depends: + - git >=2.23 + license: MIT + license_family: MIT + purls: [] + size: 37429 + timestamp: 1770108326508 - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda sha256: dbbec21a369872c8ebe23cb9a3b9d63638479ee30face165aa0fccc96e93eec3 md5: 7c14f3706e099f8fcd47af2d494616cc @@ -7869,92 +7906,6 @@ packages: purls: [] size: 2806661 timestamp: 1745097877029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-good-1.18.5-h0661c57_2.tar.bz2 - sha256: 6cab4b0414881ee70c25475bc5287379b98b88edf0fcbf4040387f215f6b1d0b - md5: 46e5a087d76aa0a087504c3a6cbed54b - depends: - - gst-plugins-base >=1.18.5,<2.0a0 - - gstreamer >=1.18.5,<2.0a0 - - jack >=1.9.18,<1.10.0a0 - - lame >=3.100,<3.101.0a0 - - libgcc-ng >=9.4.0 - - libglib >=2.70.0,<3.0a0 - - libstdcxx-ng >=9.4.0 - - libzlib >=1.2.11,<2.0.0a0 - purls: [] - size: 2012281 - timestamp: 1636497081169 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-good-1.18.5-hafdbc27_2.tar.bz2 - sha256: a6ed25b2ed73977bafb6ac56418d0bb9b7cea7c86cecdc505aa6c2d47f9ef8c9 - md5: 645993364a85a68d5c3eb61a64059151 - depends: - - gst-plugins-base >=1.18.5,<2.0a0 - - gstreamer >=1.18.5,<2.0a0 - - lame >=3.100,<3.101.0a0 - - libgcc-ng >=9.4.0 - - libglib >=2.70.0,<3.0a0 - - libstdcxx-ng >=9.4.0 - - libzlib >=1.2.11,<2.0.0a0 - purls: [] - size: 1981986 - timestamp: 1636500863113 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-ugly-1.24.11-ha85cff8_0.conda - sha256: 5981b80de7e18d6e260680f1049433421eb46179a7ccde4e2fa0b920b59f7dec - md5: 19e192c0453a81338ceb1e13632f7bc7 - depends: - - __glibc >=2.17,<3.0.a0 - - gst-plugins-base >=1.24.11,<1.25.0a0 - - gstreamer 1.24.11.* - - gstreamer >=1.24.11,<1.25.0a0 - - libdrm >=2.4.124,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libexpat >=2.7.0,<3.0a0 - - libgcc >=13 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.84.1,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - x264 >=1!164.3095,<1!165 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxau >=1.0.12,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - - xorg-libxxf86vm >=1.1.6,<2.0a0 - license: LGPL-2.1-or-later - purls: [] - size: 174095 - timestamp: 1745176114594 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-ugly-1.24.11-h7e18b86_0.conda - sha256: b6936275ba12b68af73e2f5f4a229de6612c14f9f2d311dcb3762aca6a471200 - md5: 0c7f5947d3ecca89dda3e38d115e40be - depends: - - gst-plugins-base >=1.24.11,<1.25.0a0 - - gstreamer 1.24.11.* - - gstreamer >=1.24.11,<1.25.0a0 - - libdrm >=2.4.124,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libexpat >=2.7.0,<3.0a0 - - libgcc >=13 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.84.1,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - x264 >=1!164.3095,<1!165 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxau >=1.0.12,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - - xorg-libxxf86vm >=1.1.6,<2.0a0 - license: LGPL-2.1-or-later - purls: [] - size: 171622 - timestamp: 1745176146058 - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.11-hc37bda9_0.conda sha256: 6e93b99d77ac7f7b3eb29c1911a0a463072a40748b96dbe37c18b2c0a90b34de md5: 056d86cacf2b48c79c6a562a2486eb8c @@ -8755,6 +8706,19 @@ packages: purls: [] size: 461260 timestamp: 1747574434594 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h9d01bbc_3.conda + sha256: 4254ec5f005a8f5b78b9c893467bb0c58d2bfbd3c78a8a194802a494dd5f3e67 + md5: 6716b2d771e2568d14949bd376fe62fa + depends: + - alsa-lib >=1.2.14,<1.3.0a0 + - libgcc >=13 + - libopus >=1.5.2,<2.0a0 + - libstdcxx >=13 + license: LGPL-2.0-only + license_family: LGPL + purls: [] + size: 488216 + timestamp: 1747576147517 - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda sha256: 0e919ec86d980901d8cbb665e91f5e9bddb5ff662178f25aed6d63f999fd9afc md5: a04073db11c2c86c555fb088acc8f8c1 @@ -9934,33 +9898,34 @@ packages: purls: [] size: 55952 timestamp: 1769456078358 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.5.0-he200343_1.conda - sha256: e755e234236bdda3d265ae82e5b0581d259a9279e3e5b31d745dc43251ad64fb - md5: 47595b9d53054907a00d95e4d47af1d6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libogg >=1.3.5,<1.4.0a0 - - libstdcxx >=14 + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 license: BSD-3-Clause license_family: BSD purls: [] - size: 424563 - timestamp: 1764526740626 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.5.0-he9c94f4_1.conda - sha256: 175cdc1865c3d6becc87e96bf44010a8e14f3021600ddad59417ed36e677b1ea - md5: cbe37f1d15f60b5e5272955b55b65325 + size: 394383 + timestamp: 1687765514062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda + sha256: b54935360349d3418b0663d787f20b3cba0b7ce3fcdf3ba5e7ef02b884759049 + md5: 520b12eab32a92e19b1f239ac545ec03 depends: - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - libogg >=1.3.5,<1.4.0a0 - - libstdcxx >=14 + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 license: BSD-3-Clause license_family: BSD purls: [] - size: 397272 - timestamp: 1764526699497 + size: 371550 + timestamp: 1687765491794 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec md5: f4084e4e6577797150f9b04a4560ceb0 @@ -11728,41 +11693,40 @@ packages: purls: [] size: 1173519 timestamp: 1759339827373 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc7d488a_2.conda - sha256: 57cb5f92110324c04498b96563211a1bca6a74b2918b1e8df578bfed03cc32e4 - md5: 067590f061c9f6ea7e61e3b2112ed6b3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e depends: - - __glibc >=2.17,<3.0.a0 - lame >=3.100,<3.101.0a0 - - libflac >=1.5.0,<1.6.0a0 - - libgcc >=14 - - libogg >=1.3.5,<1.4.0a0 - - libopus >=1.5.2,<2.0a0 - - libstdcxx >=14 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 - libvorbis >=1.3.7,<1.4.0a0 - - mpg123 >=1.32.9,<1.33.0a0 + - mpg123 >=1.32.1,<1.33.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 355619 - timestamp: 1765181778282 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h30591a0_2.conda - sha256: f0b6844c09cdec608ca504bd97c5d64a5596a25f66ad806381f9d63dfc89e432 - md5: 362bc94148039b77c6a42b1f7e7ef537 + size: 354372 + timestamp: 1695747735668 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda + sha256: 8fcd5e45d6fb071e8baf492ebb8710203fd5eedf0cb791e007265db373c89942 + md5: ad8e62c0faec46b1442f960489c80b49 depends: - lame >=3.100,<3.101.0a0 - - libflac >=1.5.0,<1.6.0a0 - - libgcc >=14 - - libogg >=1.3.5,<1.4.0a0 - - libopus >=1.5.2,<2.0a0 - - libstdcxx >=14 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 - libvorbis >=1.3.7,<1.4.0a0 - - mpg123 >=1.32.9,<1.33.0a0 + - mpg123 >=1.32.1,<1.33.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 406978 - timestamp: 1765181892661 + size: 396501 + timestamp: 1695747749825 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 md5: a587892d3c13b6621a6091be690dbca2 @@ -14376,6 +14340,31 @@ packages: - pkg:pypi/ply?source=hash-mapping size: 49052 timestamp: 1733239818090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/portaudio-19.7.0-hf4617a5_0.conda + sha256: 3259d2bf63d0c889c516511c8fa73214791ca30baeeee0962eee8b97d17cd1c6 + md5: 053455c094c711e9aa77cf5023cf2bc3 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.12,<1.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + purls: [] + size: 77342 + timestamp: 1730364040048 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/portaudio-19.7.0-h9d01bbc_0.conda + sha256: 42024951f9778a7b9ca96c164c060b73638e3f5d8d44322d70a6b19f63638390 + md5: 5718e20e38353be7e1821085a7c425f4 + depends: + - alsa-lib >=1.2.12,<1.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + purls: [] + size: 82419 + timestamp: 1730364154715 - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda sha256: 5b81b7516d4baf43d0c185896b245fa7384b25dc5615e7baa504b7fa4e07b706 md5: 7f3ac694319c7eaf81a0325d6405e974 @@ -16017,6 +16006,42 @@ packages: license: Apache-2.0 size: 115258 timestamp: 1768945649833 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-clang-format-0.17.3-np2py312h2ed9cc7_14.conda + sha256: 51fa52aaba4f1d9073fece63674d9fa1043fe8226a5a63ddb00f8a692384bcaa + md5: 3e0f5f7d3eaf325c98e90f79bbed9a1b + depends: + - clang-format + - python + - pyyaml + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.13.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + license: Apache-2.0 + size: 30647 + timestamp: 1768974332385 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-clang-format-0.17.3-np2py312h61f2ce4_14.conda + sha256: c50bcbeb9413a1aac84fd4e313dcf372b2e6b58c04192f94b3803e7788781eda + md5: f5f5a023d631a1c11f692e79ad129814 + depends: + - clang-format + - python + - pyyaml + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + size: 30657 + timestamp: 1768943267939 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-2.5.4-np2py312h2ed9cc7_14.conda sha256: 0483bf4dbda7d507bf3684f7cf3c82ffe0b62a2d2beb3fa35b8ee60946411b69 md5: 61722fcf171b18e7747e078f4aabfd23 @@ -16117,6 +16142,42 @@ packages: license: Apache-2.0 size: 27397 timestamp: 1768943333700 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-clang-format-0.17.3-np2py312h2ed9cc7_14.conda + sha256: 391dbc82ecec71500a2c53f72dd012e031e51fa78f0ad3b4f3a1833a0139d65a + md5: 108c26e8de597df7ae5b4e41bffcc0f5 + depends: + - python + - ros-jazzy-ament-clang-format + - ros-jazzy-ament-cmake-test + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.13.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.23,<3 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + size: 24011 + timestamp: 1768974684049 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ament-cmake-clang-format-0.17.3-np2py312h61f2ce4_14.conda + sha256: e171047c67dda19c8a10ba31b417abb89dc5fbe03243688110febe239201f660 + md5: 5bedcd38a320d6e16e967a11b2c66b79 + depends: + - python + - ros-jazzy-ament-clang-format + - ros-jazzy-ament-cmake-test + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + size: 23954 + timestamp: 1768943661461 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ament-cmake-copyright-0.17.3-np2py312h2ed9cc7_14.conda sha256: e5e04b78e1d12eeb55b66824cd752c66094c9e5716a68642f9c09c18b112da1f md5: 6fca677b0d5e63f107b33ad284bba68b @@ -17745,196 +17806,6 @@ packages: license: BSD-3-Clause size: 272384 timestamp: 1768944216433 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-capture-0.3.15-np2py312h2ed9cc7_14.conda - sha256: 84b2630d7168b6ce8815f2e66b2f1525d45908fe6dc5f60a80a26876a97747ad - md5: 8fa638c8f04ef8987ea18b8d713ac7f1 - depends: - - gst-plugins-base - - gst-plugins-good - - gst-plugins-ugly - - gstreamer - - gstreamer 1.24.* - - python - - ros-jazzy-audio-common-msgs - - ros-jazzy-launch-xml - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - numpy >=1.23,<3 - - gst-plugins-base >=1.24.11,<1.25.0a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - gstreamer >=1.24.11,<1.25.0a0 - - libboost >=1.88.0,<1.89.0a0 - - libboost-python >=1.88.0,<1.89.0a0 - license: BSD-3-Clause - size: 169437 - timestamp: 1769782373180 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-capture-0.3.15-np2py312h3575a3a_14.conda - sha256: 17e967861db9a6c8e0350541450f52cb8864862995926a7b5ebaa542347cccc9 - md5: a6473ec3780fcf5d41b2be0adf6591a4 - depends: - - gst-plugins-base - - gst-plugins-good - - gst-plugins-ugly - - gstreamer - - gstreamer 1.24.* - - python - - ros-jazzy-audio-common-msgs - - ros-jazzy-launch-xml - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - gst-plugins-base >=1.24.11,<1.25.0a0 - - gstreamer >=1.24.11,<1.25.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - libboost-python >=1.88.0,<1.89.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libboost >=1.88.0,<1.89.0a0 - license: BSD-3-Clause - size: 177232 - timestamp: 1769782730634 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-common-0.3.15-np2py312h2ed9cc7_14.conda - sha256: c3351a6a71e9871e63e93df284693d9aa3b791c80ed0658813609fbe9096ad57 - md5: c871a9fe62c96b5fb7291343ac118732 - depends: - - python - - ros-jazzy-audio-capture - - ros-jazzy-audio-common-msgs - - ros-jazzy-audio-play - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 22469 - timestamp: 1769782373380 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-common-0.3.15-np2py312h3575a3a_14.conda - sha256: 1e4bbf8d6813b003cd643c7e95086ae51177d90adbb61c2bc6f91a74bbc2e3ae - md5: b3981695bc1174edde94f7e49cd98962 - depends: - - python - - ros-jazzy-audio-capture - - ros-jazzy-audio-common-msgs - - ros-jazzy-audio-play - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - python 3.12.* *_cpython - - libstdcxx >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 27825 - timestamp: 1769782730576 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-common-msgs-0.3.15-np2py312h2ed9cc7_14.conda - sha256: 0ae681f3c63fca0cb1e07255e03dda18e83cfc19a21c75a20ee705900d36a74c - md5: e14dd91720a469603eb0441a7e1be8aa - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 107775 - timestamp: 1769777111762 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-common-msgs-0.3.15-np2py312h3575a3a_14.conda - sha256: c3fef988acf4bcd2c2de19aaf91b94629ca4a9505fb0a56d0a78e9bb158a3f20 - md5: f79a74169ef043e99356d7938e21649c - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - python 3.12.* *_cpython - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 117634 - timestamp: 1769782730599 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-audio-play-0.3.15-np2py312h2ed9cc7_14.conda - sha256: a1fb77db97c0ed5c2a32a3c12ca00f1c22565e4eb193b19356d78f094c7f596b - md5: fd546291958c3314f331bf17ca5751bb - depends: - - gst-plugins-base - - gst-plugins-good - - gst-plugins-ugly - - gstreamer - - gstreamer 1.24.* - - python - - ros-jazzy-audio-common-msgs - - ros-jazzy-launch-xml - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - libboost-python >=1.88.0,<1.89.0a0 - - libboost >=1.88.0,<1.89.0a0 - - gstreamer >=1.24.11,<1.25.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - gst-plugins-base >=1.24.11,<1.25.0a0 - license: BSD-3-Clause - size: 206513 - timestamp: 1769782373185 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-audio-play-0.3.15-np2py312h3575a3a_14.conda - sha256: c1dbf77e62044a078e77f6c23c36d7bb9a3a4e0ac92c4486915201b077125a0e - md5: 922afc6458388a2e3d829001ebf7a176 - depends: - - gst-plugins-base - - gst-plugins-good - - gst-plugins-ugly - - gstreamer - - gstreamer 1.24.* - - python - - ros-jazzy-audio-common-msgs - - ros-jazzy-launch-xml - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - gstreamer >=1.24.11,<1.25.0a0 - - gst-plugins-base >=1.24.11,<1.25.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libboost >=1.88.0,<1.89.0a0 - - libboost-python >=1.88.0,<1.89.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 213007 - timestamp: 1769782730628 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda sha256: 4590ddafd1abd29acfe182d5b1dd7a44d82d26e3732ca8578de884d5bb7001d9 md5: aae5689fc10cebfb5adbf74d8e332679 diff --git a/pixi.toml b/pixi.toml index 86f81c835..5f2d9b603 100644 --- a/pixi.toml +++ b/pixi.toml @@ -165,7 +165,6 @@ ros-jazzy-bio-ik-msgs = ">=0.0.0,<0.0.1" ros-jazzy-biped-interfaces = ">=0.0.0,<0.0.1" ros-jazzy-bitbots-tf-buffer = ">=1.0.0,<2" ros-jazzy-ros2-python-extension = ">=1.0.0,<2" -ros-jazzy-audio-common = ">=0.3.15,<0.4" ros-jazzy-dynamic-stack-decider = ">=0.5.3,<0.6" ros-jazzy-dynamic-stack-decider-visualization = ">=0.2.1,<0.3" ros-jazzy-game-controller-hl = ">=1.1.0,<2" @@ -197,6 +196,12 @@ setuptools = "==68.1.2" # Pinning setuptools to avoid issues with colcon build git = ">=2.52.0,<3" # Otherwise the system git might be used causing ABI issues curl = ">=8.17.0,<9" make = ">=4.4.1,<5" # To avoid issues in the CI +libflac = "==1.4.3" +portaudio = ">=19.7.0,<20" +ros-jazzy-ament-cmake-clang-format = ">=0.17.3,<0.18" +ros-jazzy-rosidl-runtime-c = ">=4.6.7,<5" +alsa-plugins = ">=1.2.12,<2" +git-subrepo = ">=0.4.9,<0.5" [feature.ros.target.linux-64.dependencies] # For now Webots is only packaged for x86-64 Linux @@ -245,3 +250,4 @@ scripts = [ default = ["ros", "format"] # Full development environment (excluding robot-only deps) format = ["format"] # Format only environment robot = ["ros", "format", "robot"] # Robot environment with additional robot-only dependencies + From f28f62b6e50541e02b43cb96d5801c1a7d8ebe23 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 10:00:18 +0100 Subject: [PATCH 40/74] fix: dont include `/src/game_controller_hsl` --- src/game_controller_hsl | 1 - 1 file changed, 1 deletion(-) delete mode 160000 src/game_controller_hsl diff --git a/src/game_controller_hsl b/src/game_controller_hsl deleted file mode 160000 index 3d4f4042c..000000000 --- a/src/game_controller_hsl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3d4f4042cc1b13018ae330fb972d236f7f4097d9 From ca679c03207deefa584d03163acc03c8f55de081 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 10:10:27 +0100 Subject: [PATCH 41/74] fix idea for working rival freekicks --- .../bitbots_body_behavior/behavior_dsd/main.dsd | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 862863d63..ad1015b47 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -109,6 +109,22 @@ $DoOnce FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + DIRECT_FREEKICK --> $RankToBallNoGoalie + FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + INDIRECT_FREEKICK --> $RankToBallNoGoalie + FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + GOAL_KICK --> $RankToBallNoGoalie + FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + PENALTYKICK --> $RankToBallNoGoalie + FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition ELSE --> $RankToBallNoGoalie FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second From b5aa1805e8f54251318da0522220b50dc0f9aa3f Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 10:31:00 +0100 Subject: [PATCH 42/74] update ports and target ip for game --- .../config/team_communication_config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bitbots_team_communication/bitbots_team_communication/config/team_communication_config.yaml b/src/bitbots_team_communication/bitbots_team_communication/config/team_communication_config.yaml index 8521e1d75..b4554bc6a 100644 --- a/src/bitbots_team_communication/bitbots_team_communication/config/team_communication_config.yaml +++ b/src/bitbots_team_communication/bitbots_team_communication/config/team_communication_config.yaml @@ -2,11 +2,11 @@ team_comm: ros__parameters: # UDP broadcast address is the highest IP in the subnet e.g. 172.20.255.255 # Sets local mode if set to loopback (127.0.0.1) - target_ip: 10.142.255.255 + target_ip: 10.109.255.255 # Only used in non local mode with specific target_ip - target_port: 3737 - receive_port: 3737 + target_port: 10006 + receive_port: 10006 # Only used in local mode on loopback # the team communication will bind to one of these ports and send to the other ports, depending on its bot_id @@ -17,7 +17,7 @@ team_comm: - 4004 # Rate of published messages in Hz - rate: 10 + rate: 2 # average walking speed in [m/s] avg_walking_speed: 0.2 From 7671685899d4108b76c428cd9c8b8b8cb9745949 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 10:31:46 +0100 Subject: [PATCH 43/74] fixing freekick problem --- .../behavior_dsd/main.dsd | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index ad1015b47..eb10ba650 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -103,32 +103,35 @@ $DoOnce NO --> $SecondaryStateTeamDecider OUR --> #SearchBall OTHER --> @AvoidBallActive, @LookAtFieldFeatures, @WalkInPlace + duration:2, @GoToRelativePosition + x:1 + y:0 + t:0, @Stand - YES --> $SecondaryStateDecider - CORNER_KICK --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:others - THROW_IN --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - DIRECT_FREEKICK --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - INDIRECT_FREEKICK --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - GOAL_KICK --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - PENALTYKICK --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - ELSE --> $RankToBallNoGoalie + YES --> $RankToBallNoGoalie FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + //CORNER_KICK --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:others + //THROW_IN --> $RankToBallNoGoalie + //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + //DIRECT_FREEKICK --> $RankToBallNoGoalie + //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + //INDIRECT_FREEKICK --> $RankToBallNoGoalie + //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + //GOAL_KICK --> $RankToBallNoGoalie + //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + //PENALTYKICK --> $RankToBallNoGoalie + //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + //ELSE --> $RankToBallNoGoalie + //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition #Init @Stand + duration:0.1 + r:false, @ChangeAction + action:waiting, @LookForward, @Stand From 63d6e0d54ad5988d16b92ac6da8b19df5a8dfc9a Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 10:34:48 +0100 Subject: [PATCH 44/74] dsd version ohne Kommentare --- .../behavior_dsd/main.dsd | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index eb10ba650..15a459103 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -107,31 +107,6 @@ $DoOnce FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - //CORNER_KICK --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToCornerKickPosition + mode:others - //THROW_IN --> $RankToBallNoGoalie - //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - //DIRECT_FREEKICK --> $RankToBallNoGoalie - //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - //INDIRECT_FREEKICK --> $RankToBallNoGoalie - //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - //GOAL_KICK --> $RankToBallNoGoalie - //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - //PENALTYKICK --> $RankToBallNoGoalie - //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition - //ELSE --> $RankToBallNoGoalie - //FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - //SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - //THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition #Init @Stand + duration:0.1 + r:false, @ChangeAction + action:waiting, @LookForward, @Stand @@ -182,7 +157,7 @@ $IsPenalized PENALTYSHOOT --> #PenaltyShootoutBehavior TIMEOUT --> #StandAndLook ELSE --> $SecondaryStateTeamDecider - OUR --> #NormalBehavior //Nutzt immer normalBehaviour wenn wir die aktion ausführen, könnte man spezifischeres Verhalten definieren + OUR --> #NormalBehavior OTHER --> #Placing NORMAL --> #NormalBehavior OVERTIME --> #NormalBehavior From e6e26f5192e260051bf651d9c18af848c57e18bc Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 10:36:11 +0100 Subject: [PATCH 45/74] seg correction --- .../bitbots_body_behavior/behavior_dsd/main.dsd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd index 15a459103..525e09112 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/main.dsd @@ -104,9 +104,9 @@ $DoOnce OUR --> #SearchBall OTHER --> @AvoidBallActive, @LookAtFieldFeatures, @WalkInPlace + duration:2, @GoToRelativePosition + x:1 + y:0 + t:0, @Stand YES --> $RankToBallNoGoalie - FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first - SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second - THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + FIRST --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_first + SECOND --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition + mode:freekick_second + THIRD --> @ChangeAction + action:positioning, @LookAtFieldFeatures, @AvoidBallActive, @GoToDefensePosition #Init @Stand + duration:0.1 + r:false, @ChangeAction + action:waiting, @LookForward, @Stand From 984004f31a57332bd026493b0769dd88223af1e4 Mon Sep 17 00:00:00 2001 From: paer Date: Wed, 11 Mar 2026 10:38:18 +0100 Subject: [PATCH 46/74] add new field config and adjust default field in launch files --- .../bitbots_bringup/launch/teamplayer.launch | 2 +- .../fields/german_open_2026/config.yaml | 19 ++++++++++++++++++ .../config/fields/german_open_2026/lines.png | Bin 0 -> 378259 bytes .../launch/parameter_blackboard.launch | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/config.yaml create mode 100644 src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/lines.png diff --git a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch index 6792032de..9e5d6d85b 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch @@ -15,7 +15,7 @@ - + diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/config.yaml b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/config.yaml new file mode 100644 index 000000000..522488409 --- /dev/null +++ b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/config.yaml @@ -0,0 +1,19 @@ +############################ +# RoboCup German Open 2024 # +############################ + +# Settings for the RoboCup German Open 2024 field + +parameter_blackboard: + ros__parameters: + field: + size: + x: 8.93 + y: 5.93 + padding: 1.0 # Padding (area outside of the lines) of the field in all directions + markings: + penalty_area: + size: + x: 1.93 # The distance from the goal line to the boundary of the penalty area + goal: + width: 1.8 # The width of the goal (center of one goal post to the other goal post) diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/lines.png b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026/lines.png new file mode 100644 index 0000000000000000000000000000000000000000..99230f3b3455af4bb559456587aa7a73a4762553 GIT binary patch literal 378259 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�jJQH(@Df(JaYia1 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 HA6@?kSEt`x literal 0 HcmV?d00001 diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/launch/parameter_blackboard.launch b/src/bitbots_misc/bitbots_parameter_blackboard/launch/parameter_blackboard.launch index 3631f568d..78d4728d4 100644 --- a/src/bitbots_misc/bitbots_parameter_blackboard/launch/parameter_blackboard.launch +++ b/src/bitbots_misc/bitbots_parameter_blackboard/launch/parameter_blackboard.launch @@ -1,7 +1,7 @@ - + From f09b5f6ebf68b275cb00dbf43e6baab7ac448db1 Mon Sep 17 00:00:00 2001 From: Clemens Wulff Date: Wed, 11 Mar 2026 10:40:36 +0100 Subject: [PATCH 47/74] hcm fix --- src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd index c98c8750e..3ed553538 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd @@ -23,7 +23,7 @@ $StartHCM FINISHED --> @SetTorque + stiff:true + r:false, @RobotStateControllable, @PlayAnimationDynup + direction:walkready + r:false OFF --> $GameControllerStop STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait - FREE -> $Stop + FREE --> $Stop STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait FREE -->$CheckIMU IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup From 6d8768c1afa319f565c2d3c50613a016c9dc3528 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 10:51:21 +0100 Subject: [PATCH 48/74] remove unnecessary launch of whistle detection in head mover test --- src/bitbots_motion/bitbots_head_mover/launch/test.launch | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/bitbots_motion/bitbots_head_mover/launch/test.launch b/src/bitbots_motion/bitbots_head_mover/launch/test.launch index 144152dd3..e45e4106f 100644 --- a/src/bitbots_motion/bitbots_head_mover/launch/test.launch +++ b/src/bitbots_motion/bitbots_head_mover/launch/test.launch @@ -32,9 +32,6 @@ - - - From 5b9fe7c9b64d22295942cff9255655a32a4bbe70 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 10:51:25 +0100 Subject: [PATCH 49/74] fix: temporarily add `python3-construct` for `game_controller_hsl` --- pixi.lock | 16 ++++++++++++++++ pixi.toml | 1 + 2 files changed, 17 insertions(+) diff --git a/pixi.lock b/pixi.lock index 6fee74e9b..2d88dc4e3 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1012,6 +1012,7 @@ environments: build: hb0f4dca_0 - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz @@ -2046,6 +2047,7 @@ environments: build: he8cfe8b_0 - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz @@ -3223,6 +3225,7 @@ environments: build: hb0f4dca_0 - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz @@ -4258,6 +4261,7 @@ environments: build: he8cfe8b_0 - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz @@ -5841,6 +5845,18 @@ packages: purls: [] size: 18484 timestamp: 1648912662150 +- pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl + name: construct + version: 2.10.70 + sha256: c80be81ef595a1a821ec69dc16099550ed22197615f4320b57cc9ce2a672cb30 + requires_dist: + - arrow ; extra == 'extras' + - cloudpickle ; extra == 'extras' + - cryptography ; extra == 'extras' + - lz4 ; extra == 'extras' + - numpy ; extra == 'extras' + - ruamel-yaml ; extra == 'extras' + requires_python: '>=3.6' - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda sha256: 62447faf7e8eb691e407688c0b4b7c230de40d5ecf95bf301111b4d05c5be473 md5: 43c2bc96af3ae5ed9e8a10ded942aa50 diff --git a/pixi.toml b/pixi.toml index 1318ba792..4861c49c6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -209,6 +209,7 @@ pre-commit = ">=4.4.0,<5" [feature.ros.pypi-dependencies] # These are are pypi dependencies needed for our ROS 2 packages +construct = ">=2.10.56, <3" syrupy = ">=5.0.0, <6" exhale = ">=0.3.7, <0.4" mycroft-mimic3-tts = ">=0.2.4, <0.3" From a603495e01a100eca6b0615e1fb6c71cb374b14b Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 10:52:08 +0100 Subject: [PATCH 50/74] fix(teamplayer): disable tts as it crashes --- src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch index 9e5d6d85b..093cea17d 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch @@ -14,7 +14,7 @@ - + From 5cfacac21464bc9c06066e00620a4ffdaeac7a39 Mon Sep 17 00:00:00 2001 From: texhnolyze Date: Wed, 11 Mar 2026 10:53:11 +0100 Subject: [PATCH 51/74] feat(teamcom): add debug message about proto sizes --- .../bitbots_team_communication/bitbots_team_communication.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py index f18c38041..d52c6e7a1 100755 --- a/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py +++ b/src/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication/bitbots_team_communication.py @@ -274,7 +274,9 @@ def is_still_valid(time: Optional[TimeMsg]) -> bool: return (time is not None) and (now - Time.from_msg(time) < Duration(seconds=self.lifetime)) message = self.protocol_converter.convert_to_message(self, msg, is_still_valid) - self.socket_communication.send_message(message.SerializeToString()) + proto_msg = message.SerializeToString() + self.logger.debug(f"Sending msg with size {len(proto_msg)} bytes") + self.socket_communication.send_message(proto_msg) def create_empty_message(self, now: Time) -> Proto.Message: message = Proto.Message() From 6246dfb4159c7a83ac7689d16e91f9c426792210 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 10:56:25 +0100 Subject: [PATCH 52/74] remove command in setup.py --- src/bitbots_world_model/bitbots_whistle_detector/setup.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.py b/src/bitbots_world_model/bitbots_whistle_detector/setup.py index bcf344f6b..92720fe89 100644 --- a/src/bitbots_world_model/bitbots_whistle_detector/setup.py +++ b/src/bitbots_world_model/bitbots_whistle_detector/setup.py @@ -29,5 +29,3 @@ ], }, ) - -# https://roboticsbackend.com/ros2-rclpy-parameter-callback/ From 4100edf31356e2ae36fcb1c2335b272decf59cd6 Mon Sep 17 00:00:00 2001 From: Valerie Date: Wed, 11 Mar 2026 11:06:15 +0100 Subject: [PATCH 53/74] move whislte detector to misc and add extra launch param --- src/bitbots_misc/bitbots_bringup/launch/highlevel.launch | 7 ++++--- src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch | 2 ++ .../bitbots_whistle_detector/__init__.py | 0 .../bitbots_whistle_detector/whistle_detector.py | 0 .../launch/whistle_detector.launch | 0 .../bitbots_whistle_detector/package.xml | 0 .../bitbots_whistle_detector/setup.cfg | 0 .../bitbots_whistle_detector/setup.py | 0 8 files changed, 6 insertions(+), 3 deletions(-) rename src/{bitbots_world_model => bitbots_misc}/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py (100%) rename src/{bitbots_world_model => bitbots_misc}/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py (100%) rename src/{bitbots_world_model => bitbots_misc}/bitbots_whistle_detector/launch/whistle_detector.launch (100%) rename src/{bitbots_world_model => bitbots_misc}/bitbots_whistle_detector/package.xml (100%) rename src/{bitbots_world_model => bitbots_misc}/bitbots_whistle_detector/setup.cfg (100%) rename src/{bitbots_world_model => bitbots_misc}/bitbots_whistle_detector/setup.py (100%) diff --git a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch index 794cca5b7..a9abd25e8 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/highlevel.launch @@ -12,6 +12,7 @@ + @@ -54,10 +55,10 @@ - - - + + + diff --git a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch index 6792032de..0865ba101 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch @@ -15,6 +15,7 @@ + @@ -54,6 +55,7 @@ + diff --git a/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py b/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py rename to src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/__init__.py diff --git a/src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py b/src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py rename to src/bitbots_misc/bitbots_whistle_detector/bitbots_whistle_detector/whistle_detector.py diff --git a/src/bitbots_world_model/bitbots_whistle_detector/launch/whistle_detector.launch b/src/bitbots_misc/bitbots_whistle_detector/launch/whistle_detector.launch similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/launch/whistle_detector.launch rename to src/bitbots_misc/bitbots_whistle_detector/launch/whistle_detector.launch diff --git a/src/bitbots_world_model/bitbots_whistle_detector/package.xml b/src/bitbots_misc/bitbots_whistle_detector/package.xml similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/package.xml rename to src/bitbots_misc/bitbots_whistle_detector/package.xml diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.cfg b/src/bitbots_misc/bitbots_whistle_detector/setup.cfg similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/setup.cfg rename to src/bitbots_misc/bitbots_whistle_detector/setup.cfg diff --git a/src/bitbots_world_model/bitbots_whistle_detector/setup.py b/src/bitbots_misc/bitbots_whistle_detector/setup.py similarity index 100% rename from src/bitbots_world_model/bitbots_whistle_detector/setup.py rename to src/bitbots_misc/bitbots_whistle_detector/setup.py From 215848ae8d261ddade8c6555bacd92d37f2862bb Mon Sep 17 00:00:00 2001 From: paer Date: Wed, 11 Mar 2026 11:22:53 +0100 Subject: [PATCH 54/74] add medium field config --- .../german_open_2026_medium/config.yaml | 19 ++++++++++++++++++ .../fields/german_open_2026_medium/lines.png | Bin 0 -> 379036 bytes 2 files changed, 19 insertions(+) create mode 100644 src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/config.yaml create mode 100644 src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/lines.png diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/config.yaml b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/config.yaml new file mode 100644 index 000000000..e2af6fa77 --- /dev/null +++ b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/config.yaml @@ -0,0 +1,19 @@ +############################ +# RoboCup German Open 2024 # +############################ + +# Settings for the RoboCup German Open 2024 field + +parameter_blackboard: + ros__parameters: + field: + size: + x: 8.93 + y: 5.94 + padding: 1.0 # Padding (area outside of the lines) of the field in all directions + markings: + penalty_area: + size: + x: 1.93 # The distance from the goal line to the boundary of the penalty area + goal: + width: 2.5 # The width of the goal (center of one goal post to the other goal post) diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/lines.png b/src/bitbots_misc/bitbots_parameter_blackboard/config/fields/german_open_2026_medium/lines.png new file mode 100644 index 0000000000000000000000000000000000000000..6a15d33637b94dfc56ede5bd2dd1ab8e1e15fc92 GIT binary patch literal 379036 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