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 862bdf29c..962b1c31c 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 @@ -22,6 +22,8 @@ def __init__(self, node, blackboard=None): self.free_kick_kickoff_team: bool | None = None self.game_controller_stop: bool = False self.last_timestep_whistle_detected: Time | None = None + self.team_com_limit_has_reached: bool = False + self.unpenalized_after_team_com_stop: bool = False # publish stopped msg for hcm self.stop_pub = node.create_publisher(Bool, "game_controller/stop_msg", 1) @@ -84,16 +86,30 @@ def get_seconds_since_unpenalized(self) -> float: def get_is_penalized(self) -> bool: return self.gamestate.penalized + + def get_unpenalized_after_team_com_stop(self) -> bool: + return self.unpenalized_after_team_com_stop + + def get_penalized_team_mates(self) -> int: + return self.gamestate.team_mates_with_penalty + + def get_penalized_rivals(self) -> int: + return self.gamestate.rivals_with_penalty def received_gamestate(self) -> bool: return self.last_update != 0.0 def get_team_id(self) -> int: return self.team_id + + def get_team_com_limit_has_reached(self) -> bool: + return self.team_com_limit_has_reached 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 + if self.team_com_limit_has_reached: + self.unpenalized_after_team_com_stop = True if gamestate_msg.own_score > self.gamestate.own_score: self.last_goal_from_us_time = self._node.get_clock().now().nanoseconds / 1e9 @@ -106,6 +122,8 @@ def gamestate_callback(self, gamestate_msg: GameState) -> None: self.stop_pub.publish(Bool(data=self.game_controller_stop)) + self.team_com_limit_has_reached = gamestate_msg.message_budget < 40 + """Anstoß im Falle von Overtime jetzt erstmal nicht genauer geregelt if ( gamestate_msg.main_state == GameState.STATE_SET diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/team_data_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/team_data_capsule.py index c44d479f1..bc54bad4f 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/team_data_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/team_data_capsule.py @@ -68,6 +68,16 @@ def __init__(self, node, blackboard): self.data_timeout: float = float(self._node.get_parameter("team_data_timeout").value) self.ball_max_covariance: float = float(self._node.get_parameter("ball_max_covariance").value) + # --- Save informations for handling decisions after team com has switched off --- + # The last rank to ball result before team_com limit was reached + self.last_rank_to_ball_with_team_com: int = -1 + # Was goalie active before team_com limit was reached + self.was_goalie_active: bool = True + # Was goalie handling the ball before team_com limit was reached + self.was_goalie_handling_ball_with_team_com: bool = False + # The last number of active field players before team_com limit was reached + self.last_number_of_active_players: int = -1 + @cached_capsule_function def time(self) -> Time: """Returns the current time of the node, this is its own function so it can be cached during the decision loop.""" @@ -93,7 +103,9 @@ def is_goalie_handling_ball(self) -> bool: and data.strategy.role == Strategy.ROLE_GOALIE and data.strategy.action in [Strategy.ACTION_GOING_TO_BALL, Strategy.ACTION_KICKING] ): + self.was_goalie_handling_ball_with_team_com = True return True + self.was_goalie_handling_ball_with_team_com = False return False @cached_capsule_function @@ -138,7 +150,9 @@ def team_rank_to_ball( ) for rank, distance in enumerate(sorted(distances)): if own_ball_distance < distance: + self.last_rank_to_ball_with_team_com = rank + 1 return rank + 1 + self.last_rank_to_ball_with_team_com = len(distances) + 1 return len(distances) + 1 def set_action(self, action: int) -> None: @@ -151,6 +165,18 @@ def set_action(self, action: int) -> None: def get_action(self) -> tuple[int, float]: return self.strategy.action, self.action_update + + def get_was_goalie_handling_ball(self) -> bool: + return self.was_goalie_handling_ball_with_team_com + + def get_was_goalie_active(self) -> bool: + return self.was_goalie_active + + def get_last_rank_with_team_com(self) -> int: + return self.last_rank_to_ball_with_team_com + + def get_last_number_active_player(self) -> int: + return self.last_number_of_active_players def set_role(self, role: Literal["goalie", "offense", "defense"]) -> None: """Set the role of this robot in the team @@ -195,7 +221,9 @@ def is_not_goalie(team_data: TeamData) -> bool: team_data_infos = filter(is_not_goalie, team_data_infos) # type: ignore[assignment] # Count valid team data infos (aka robots with valid team data) - return sum(map(self.is_valid, team_data_infos)) + active_players = sum(map(self.is_valid, team_data_infos)) + self.last_number_of_active_players = active_players + return active_players @cached_capsule_function def get_is_goalie_active(self) -> bool: @@ -209,7 +237,9 @@ def is_a_goalie(team_data: TeamData) -> bool: team_data_infos = filter(is_a_goalie, team_data_infos) # type: ignore[assignment] # Count valid team data infos (aka robots with valid team data) - return sum(map(self.is_valid, team_data_infos)) == 1 + goalie_count = sum(map(self.is_valid, team_data_infos)) + self.was_goalie_active = goalie_count == 1 + return goalie_count == 1 def get_own_time_to_ball(self) -> float: return self.own_time_to_ball diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/closest_to_ball.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/closest_to_ball.py index c3b7766b6..d418d2468 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/closest_to_ball.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/closest_to_ball.py @@ -28,9 +28,14 @@ def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) def perform(self, reevaluate=False): - my_time_to_ball = self.blackboard.team_data.get_own_time_to_ball() - rank = self.blackboard.team_data.team_rank_to_ball(my_time_to_ball, count_goalies=True, use_time_to_ball=True) - self.publish_debug_data("time to ball", my_time_to_ball) + if self.blackboard.gamestate.get_team_com_limit_has_reached(): + rank = self.blackboard.team_data.get_last_rank_with_team_com() + else: + my_time_to_ball = self.blackboard.team_data.get_own_time_to_ball() + rank = self.blackboard.team_data.team_rank_to_ball( + my_time_to_ball, count_goalies=True, use_time_to_ball=True + ) + self.publish_debug_data("time to ball", my_time_to_ball) self.publish_debug_data("Rank to ball", rank) if rank == 1: return "YES" @@ -47,9 +52,14 @@ def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) def perform(self, reevaluate=False): - my_time_to_ball = self.blackboard.team_data.get_own_time_to_ball() - rank = self.blackboard.team_data.team_rank_to_ball(my_time_to_ball, count_goalies=False, use_time_to_ball=True) - self.publish_debug_data("time to ball", my_time_to_ball) + if self.blackboard.gamestate.get_team_com_limit_has_reached(): + rank = self.blackboard.team_data.get_last_rank_with_team_com() + else: + my_time_to_ball = self.blackboard.team_data.get_own_time_to_ball() + rank = self.blackboard.team_data.team_rank_to_ball( + my_time_to_ball, count_goalies=False, use_time_to_ball=True + ) + self.publish_debug_data("time to ball", my_time_to_ball) self.publish_debug_data("Rank to ball", rank) if rank == 1: return "FIRST" diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/count_active_players_without_goalie.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/count_active_players_without_goalie.py index 1440883e7..5a31fc5fd 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/count_active_players_without_goalie.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/count_active_players_without_goalie.py @@ -13,7 +13,10 @@ def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) def perform(self, reevaluate=False): - number_of_active_teammates = self.blackboard.team_data.get_number_of_active_field_players(False) + if self.blackboard.gamestate.get_team_com_limit_has_reached(): + number_of_active_teammates = self.blackboard.team_data.get_last_number_active_player() + else: + number_of_active_teammates = self.blackboard.team_data.get_number_of_active_field_players(False) self.publish_debug_data("Number of active Teammates", number_of_active_teammates) if number_of_active_teammates == 0: return "ZERO" diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_active.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_active.py index c0783318c..2b29488a4 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_active.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_active.py @@ -13,10 +13,16 @@ def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) def perform(self, reevaluate=False): - if self.blackboard.team_data.get_is_goalie_active(): - return "YES" + if self.blackboard.gamestate.get_team_com_limit_has_reached(): + if self.blackboard.team_data.get_was_goalie_active(): + return "YES" + else: + return "NO" else: - return "NO" + if self.blackboard.team_data.get_is_goalie_active(): + 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/decisions/goalie_handling_ball.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_handling_ball.py index fee37dcd4..0dc512972 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_handling_ball.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/goalie_handling_ball.py @@ -12,10 +12,16 @@ def perform(self, reevaluate=False): """ It is determined if the goalie is currently going towards the ball """ - if self.blackboard.team_data.is_goalie_handling_ball(): - return "YES" + if self.blackboard.gamestate.get_team_com_limit_has_reached(): + if self.blackboard.team_data.get_was_goalie_handling_ball(): + return "YES" + else: + return "NO" else: - return "NO" + if self.blackboard.team_data.is_goalie_handling_ball(): + 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/decisions/is_penalized.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/is_penalized.py index 48842970a..19397cf4b 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/is_penalized.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/is_penalized.py @@ -15,6 +15,9 @@ def perform(self, reevaluate=False): self.publish_debug_data("Seconds since unpenalized", self.blackboard.gamestate.get_seconds_since_unpenalized()) if self.blackboard.gamestate.get_is_penalized(): return "YES" + elif self.blackboard.gamestate.get_unpenalized_after_team_com_stop(): + self.publish_debug_data("Reason", "Unpenalized after team com limit") + return "UNPENALIZED_AFTER_TEAM_COM_LIMIT" elif self.blackboard.gamestate.get_seconds_since_unpenalized() < 1: self.publish_debug_data("Reason", "Just unpenalized") return "JUST_UNPENALIZED" diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/number_penalized_players.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/number_penalized_players.py new file mode 100644 index 000000000..e63f5254e --- /dev/null +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/number_penalized_players.py @@ -0,0 +1,65 @@ +from bitbots_blackboard.body_blackboard import BodyBlackboard +from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement + + +class NumberPenalizedTeamMates(AbstractDecisionElement): + blackboard: BodyBlackboard + + def __init__(self, blackboard, dsd, parameters): + super().__init__(blackboard, dsd, parameters) + + def perform(self, reevaluate=False): + """ + Return number of penalized team mates + :param reevaluate: + :return: + """ + game_state_penalized_team_mates = self.blackboard.gamestate.get_penalized_team_mates() + + if game_state_penalized_team_mates == 4: + return "FOUR" + elif game_state_penalized_team_mates == 3: + return "THREE" + elif game_state_penalized_team_mates == 2: + return "TWO" + elif game_state_penalized_team_mates == 1: + return "ONE" + else: + return "ZERO" + + def get_reevaluate(self): + """ + Game state can change during the game + """ + return True + +class NumberPenalizedRivals(AbstractDecisionElement): + blackboard: BodyBlackboard + + def __init__(self, blackboard, dsd, parameters): + super().__init__(blackboard, dsd, parameters) + + def perform(self, reevaluate=False): + """ + Return number of penalized rivals + :param reevaluate: + :return: + """ + game_state_penalized_rivals = self.blackboard.gamestate.get_penalized_rivals() + + if game_state_penalized_rivals == 4: + return "FOUR" + elif game_state_penalized_rivals == 3: + return "THREE" + elif game_state_penalized_rivals == 2: + return "TWO" + elif game_state_penalized_rivals == 1: + return "ONE" + else: + return "ZERO" + + def get_reevaluate(self): + """ + Game state can change during the game + """ + return True diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/team_com_limit_reached.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/team_com_limit_reached.py new file mode 100644 index 000000000..dfd2a6c34 --- /dev/null +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/decisions/team_com_limit_reached.py @@ -0,0 +1,18 @@ +from bitbots_blackboard.body_blackboard import BodyBlackboard +from dynamic_stack_decider.abstract_decision_element import AbstractDecisionElement + + +class TeamComLimitReached(AbstractDecisionElement): + blackboard: BodyBlackboard + + def __init__(self, blackboard, dsd, parameters): + super().__init__(blackboard, dsd, parameters) + + def perform(self, reevaluate=False): + if self.blackboard.gamestate.get_team_com_limit_has_reached(): + 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 b44d63035..0b073a865 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 @@ -76,11 +76,13 @@ $GoalieActive NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @GoToBlockPosition #SupporterRole -$PassStarted - YES --> $BallSeen - YES --> @TrackBall, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassAcceptPosition - NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassAcceptPosition - NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassPreparePosition +$TeamComLimitReached + YES --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassPreparePosition + NO --> $PassStarted + YES --> $BallSeen + YES --> @TrackBall, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassAcceptPosition + NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassAcceptPosition + NO --> @LookAtFieldFeatures, @ChangeAction + action:positioning, @AvoidBallActive, @GoToPassPreparePosition #PenaltyShootoutBehavior $SecondaryStateTeamDecider @@ -120,14 +122,23 @@ $BallSeen NO_FREEKICK --> #Placing YES --> $ConfigRole GOALIE --> #GoalieBehavior - ELSE --> $CountActiveRobotsWithoutGoalie - ONE --> $RankToBallNoGoalie - FIRST --> #StrikerRole - SECOND --> #DefensePositioning - ELSE --> $RankToBallNoGoalie - FIRST --> #StrikerRole - SECOND --> #SupporterRole - THIRD --> #DefensePositioning + ELSE --> $TeamComLimitReached //this decision is only for better visualization in rqt + NO --> $CountActiveRobotsWithoutGoalie + ONE --> $RankToBallNoGoalie + FIRST --> #StrikerRole + SECOND --> #DefensePositioning + ELSE --> $RankToBallNoGoalie + FIRST --> #StrikerRole + SECOND --> #SupporterRole + THIRD --> #DefensePositioning + YES --> $CountActiveRobotsWithoutGoalie + ONE --> $RankToBallNoGoalie + FIRST --> #StrikerRole + SECOND --> #DefensePositioning + ELSE --> $RankToBallNoGoalie + FIRST --> #StrikerRole + SECOND --> #SupporterRole + THIRD --> #DefensePositioning #PlayingBehavior $SecondaryStateDecider @@ -145,6 +156,7 @@ $IsPenalized JUST_UNPENALIZED --> $GameStateDecider INITIAL --> #Init ELSE --> #GetWalkreadyAndLocalize + UNPENALIZED_AFTER_TEAM_COM_LIMIT --> #DoNothing NO --> $GameStateDecider INITIAL --> #Init READY --> $AnyGoalScoreRecently + time:50 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 d52c6e7a1..1d65dbe39 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 @@ -50,8 +50,11 @@ def __init__(self): self.socket_communication = SocketCommunication(self.node, self.logger, self.team_id, self.player_id) self.rate: int = self.node.get_parameter("rate").value + self.reduced_rate: int = self.node.get_parameter("reduced_rate").value + self.max_message_size: int = self.node.get_parameter("max_message_size").value self.lifetime: int = self.node.get_parameter("lifetime").value self.avg_walking_speed: float = self.node.get_parameter("avg_walking_speed").value + self.rate_is_reduced: bool = False self.topics = get_parameter_dict(self.node, "topics") self.map_frame: str = self.node.get_parameter("map_frame").value @@ -66,7 +69,7 @@ def __init__(self): self.run_spin_in_thread() self.try_to_establish_connection() - self.node.create_timer(1 / self.rate, self.send_message, callback_group=MutuallyExclusiveCallbackGroup()) + self.create_timer(self.rate) self.receive_forever() def spin(self): @@ -263,6 +266,9 @@ def handle_message(self, string_message: bytes): self.team_data_publisher.publish(team_data) def send_message(self): + if not self.rate_is_reduced and self.should_reduce_rate(): + self.reduce_rate() + if not self.is_robot_allowed_to_send_message(): self.logger.debug("Robot is not allowed to send message") return @@ -275,8 +281,15 @@ def is_still_valid(time: Optional[TimeMsg]) -> bool: message = self.protocol_converter.convert_to_message(self, msg, is_still_valid) proto_msg = message.SerializeToString() - self.logger.debug(f"Sending msg with size {len(proto_msg)} bytes") - self.socket_communication.send_message(proto_msg) + message_size = len(proto_msg) + if message_size > self.max_message_size: + self.logger.warning( + f"Team_com msg not sent, because size {message_size} bytes is above the maximum of " + f"{self.max_message_size} bytes" + ) + else: + self.logger.debug(f"Sending msg with size {message_size} bytes") + self.socket_communication.send_message(proto_msg) def create_empty_message(self, now: Time) -> Proto.Message: message = Proto.Message() @@ -301,7 +314,17 @@ def should_message_be_discarded(self, message: Proto.Message) -> bool: return is_own_message or is_message_from_oposite_team def is_robot_allowed_to_send_message(self) -> bool: - return self.gamestate is not None and not self.gamestate.penalized + + if self.gamestate is not None: + #a penalized robot doesn't need to publish + if self.gamestate.penalized: + return False + #if we are close to our message budget, we dont want to continue publishing + #the budget smaller 40 as stop definition makes sure we have 10 msg per robot left in case of some delay in the communication with the game controller + if self.gamestate.message_budget < 40: + return False + + return True def get_current_time(self) -> Time: return self.node.get_clock().now() @@ -313,7 +336,41 @@ def extract_orientation_yaw_angle(self, quaternion: Quaternion): def convert_to_euler(self, quaternion: Quaternion): return transforms3d.euler.quat2euler([quaternion.w, quaternion.x, quaternion.y, quaternion.z]) - + + def reduce_rate(self): + self.timer.cancel() + self.create_timer(self.reduced_rate) + self.rate_is_reduced = True + self.logger.warning("Team communication: message sending rate is reduced now") + + def create_timer(self, rate: int): + self.timer = self.node.create_timer(1 / rate, self.send_message, callback_group=MutuallyExclusiveCallbackGroup()) + + def should_reduce_rate(self): + if self.gamestate is None: + return False + + half_duration_seconds = 600 + team_size = 4 + msgs_per_second_per_robot = 2.5 + + # We are allowed to send 2.5 messages per second on average with each robot (12000 with 4 robots in a 1200 seconds game). + # the msg_left_linear_rate is the amount of messages we would send if we send exactly with this 2.5 msg per sec per robot rate + # once our actual msg budget is below this linear rate we tend to send more msg then allowed and should reduce our sending rate + if self.game_started_recently(): + return False + + msg_left_linear_rate = ( + self.gamestate.first_half * half_duration_seconds + self.gamestate.secs_remaining + ) * team_size * msgs_per_second_per_robot + return msg_left_linear_rate > self.gamestate.message_budget + + def game_started_recently(self): + if self.gamestate is None: + return False + + # True in the first 60 seconds of the game. + return self.gamestate.first_half and self.gamestate.secs_remaining > 540 def main(): rclpy.init(args=None) 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 b1704c562..83c4b3371 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 @@ -18,6 +18,10 @@ team_comm: # Rate of published messages in Hz rate: 2 + # Rate of published messages in Hz, when rate is reduced + reduced_rate: 1 + # Maximum allowed serialized message size in bytes + max_message_size: 512 # average walking speed in [m/s] avg_walking_speed: 0.2