Skip to content

Bridge & Backends

The bridge adapts the OpenLab API to a concrete execution backend. It is the only place that knows about hivebr.engine (or, in the future, ROS 2), keeping the public API backend-agnostic.

bridge

Backend

Bases: ABC

Execution backend contract shared by the simulator and ROS 2 arena.

A backend is the only layer allowed to talk to a concrete engine, so that the public API never imports pygame or ROS 2 directly.

reset abstractmethod

reset()
Source code in src/hivebr/bridge.py
@abstractmethod
def reset(self) -> None: ...

get_states abstractmethod

get_states()
Source code in src/hivebr/bridge.py
@abstractmethod
def get_states(self) -> dict[int, RobotState]: ...

compute abstractmethod

compute(states, dt)

Return one command per robot id from a frozen fleet snapshot.

Source code in src/hivebr/bridge.py
@abstractmethod
def compute(self, states: dict[int, RobotState], dt: float) -> dict[int, Command]:
    """Return one command per robot id from a frozen fleet snapshot."""

step abstractmethod

step(commands, dt)
Source code in src/hivebr/bridge.py
@abstractmethod
def step(self, commands: dict[int, Command], dt: float) -> None: ...

run abstractmethod

run()
Source code in src/hivebr/bridge.py
@abstractmethod
def run(self) -> None: ...

close abstractmethod

close()
Source code in src/hivebr/bridge.py
@abstractmethod
def close(self) -> None: ...

NavSim2DBackend

NavSim2DBackend(experiment)

Bases: Backend

Backend for local simulation using the hivebr.engine renderer/physics.

Source code in src/hivebr/bridge.py
def __init__(self, experiment) -> None:
    self.experiment = experiment
    self._sim = None

experiment instance-attribute

experiment = experiment

reset

reset()
Source code in src/hivebr/bridge.py
def reset(self) -> None:
    if self._sim is not None:
        self._sim.reset()

get_states

get_states()
Source code in src/hivebr/bridge.py
def get_states(self) -> dict[int, RobotState]:
    if self._sim is None:
        return {}
    robots = getattr(self._sim, "robots", [self._sim.robot])
    states = {}
    for i, robot in enumerate(robots):
        goal = self._sim.robot_goal(i) if hasattr(self._sim, "robot_goal") else None
        states[i] = _state_from_robot(i, robot, goal)
    return states

compute

compute(states, dt)
Source code in src/hivebr/bridge.py
def compute(self, states: dict[int, RobotState], dt: float) -> dict[int, Command]:
    return self.experiment._dispatch(states, dt)

step

step(commands, dt)
Source code in src/hivebr/bridge.py
def step(self, commands: dict[int, Command], dt: float) -> None:
    raise NotImplementedError(
        "Headless stepping is not available yet; use run() which drives the "
        "engine's interactive loop through the fleet controller."
    )

run

run()
Source code in src/hivebr/bridge.py
def run(self) -> None:
    from .engine import Simulator

    config = self.experiment.build_engine_config()
    self._sim = Simulator(config=config, fleet_controller=self._fleet_controller)
    self._sim.run()

close

close()
Source code in src/hivebr/bridge.py
def close(self) -> None:
    self._sim = None

Ros2Backend

Ros2Backend(experiment)

Bases: Backend

Placeholder for the physical arena: one ROS 2 node per agent or a single overarching node for a SwarmController.

Source code in src/hivebr/bridge.py
def __init__(self, experiment) -> None:
    self.experiment = experiment

experiment instance-attribute

experiment = experiment

reset

reset()
Source code in src/hivebr/bridge.py
def reset(self) -> None:
    raise NotImplementedError("ROS 2 backend not implemented yet.")

get_states

get_states()
Source code in src/hivebr/bridge.py
def get_states(self) -> dict[int, RobotState]:
    raise NotImplementedError("ROS 2 backend not implemented yet.")

compute

compute(states, dt)
Source code in src/hivebr/bridge.py
def compute(self, states: dict[int, RobotState], dt: float) -> dict[int, Command]:
    return self.experiment._dispatch(states, dt)

step

step(commands, dt)
Source code in src/hivebr/bridge.py
def step(self, commands: dict[int, Command], dt: float) -> None:
    raise NotImplementedError("ROS 2 backend not implemented yet.")

run

run()
Source code in src/hivebr/bridge.py
def run(self) -> None:
    raise NotImplementedError("ROS 2 backend not implemented yet.")

close

close()
Source code in src/hivebr/bridge.py
def close(self) -> None:
    pass

create_backend

create_backend(name, experiment)
Source code in src/hivebr/bridge.py
def create_backend(name: str, experiment) -> Backend:
    key = str(name).lower()
    if key in ("navsim2d", "nav_sim2d", "local", "sim"):
        return NavSim2DBackend(experiment)
    if key in ("ros2", "ros", "arena"):
        return Ros2Backend(experiment)
    raise ValueError(f"Unknown backend: {name!r} (use 'navsim2d' or 'ros2')")