From 1eddec159511326b9b4a7ac1ac7f25b831537298 Mon Sep 17 00:00:00 2001 From: Yiyi Xu Date: Thu, 11 Jun 2026 11:34:49 +0200 Subject: [PATCH 1/6] commit from icra demo --- swarm_gpt/core/backend.py | 12 ++++++++---- swarm_gpt/core/drone_swarm.py | 8 +++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/swarm_gpt/core/backend.py b/swarm_gpt/core/backend.py index 755c183..19674e3 100644 --- a/swarm_gpt/core/backend.py +++ b/swarm_gpt/core/backend.py @@ -341,7 +341,7 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: landing_pos = obs["pos"] if self.settings["land_on_docks"] else d["pos"] # TODO fix hard coded yaw init_pos_dict[uri] = np.array([*init_pos, 0.0]) - final_pos_dict[uri] = np.array([*landing_pos + np.array([0.0, 0.0, 0.8]), 0.0]) + final_pos_dict[uri] = np.array([*landing_pos + np.array([0.0, 0.0, 0.5]), 0.0]) landing_pos_dict[uri] = np.array([*landing_pos - np.array([0.0, 0.0, 0.2]), 0.0]) choreography_dict[uri] = self.splines[i] color_top[uri] = { @@ -366,7 +366,9 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: taken_off = False continue try: + logger.info(f"Trying to get obs for {uri}") obs = swarm.get_obs(uri) + logger.info(f"got obs for {uri}") z = obs["pos"][2] qw = np.abs(obs["quat"][-1]) # Demo fix: If the drone is disconnected, we cannot get its position. We assume it has not taken off. @@ -384,6 +386,7 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: "VLC could not start playback; skipping choreography (drones will land)." ) else: + logger.info("Starting choreography execution") swarm.execute_choreography( choreography_dict, self.waypoints["time"][0, -1], @@ -391,9 +394,10 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: color_bot=color_bot, ) swarm.goto(final_pos_dict, duration=2.0) # Transition from ideal point to hover pos - # if self.settings["land_on_docks"]: # Commented out for demo - # swarm.goto(final_pos_dict, duration=5.0) # Hovering - swarm.goto(landing_pos_dict, duration=1.5) # Landing + if self.settings["land_on_docks"]: # Commented out for demo + swarm.goto(final_pos_dict, duration=3.0) # Hovering + # swarm.goto(landing_pos_dict, duration=1.5) # Landing + swarm.land(duration=1.5) # Landing finally: swarm.close() self.music_manager.song = original_song diff --git a/swarm_gpt/core/drone_swarm.py b/swarm_gpt/core/drone_swarm.py index 87ac92f..670ddb2 100644 --- a/swarm_gpt/core/drone_swarm.py +++ b/swarm_gpt/core/drone_swarm.py @@ -96,7 +96,10 @@ def __init__( def get_obs(self, uri: str) -> dict[str, Array]: """Generate the observation for a drone using mocap or lighthouse.""" - return self._run(self._read_observation(uri)) + obs = self._run(self._parallel_by_uri("Reading observation", [uri], self._read_observation)) + return obs[0] + # return self._run(self._read_observation(uri)) + # return self._run(self._parallel_by_uri("Reading observation", [uri], self._read_observation)[0]) def missing_uris(self) -> list[str]: """Return configured URIs that are not currently active.""" @@ -420,6 +423,7 @@ async def _parallel_by_uri( logger.error(f"{uri} disconnected or unreachable. {action_name} failed: {result}") else: logger.error(f"{action_name} failed for {uri}: {result}") + return results async def _emergency_stop(self, uri: str) -> None: await self._cf(uri).localization().emergency().send_emergency_stop() @@ -483,6 +487,8 @@ async def _read_lighthouse_observation(self, uri: str) -> dict[str, Array]: "rpy": rpy, "is_outdated": False, } + except Exception as exc: + logger.error(f"Reading observation from {uri} failed: {exc}") finally: await stream.stop() From f118106649fef09516b484d29207317907773b7a Mon Sep 17 00:00:00 2001 From: Rather1337 Date: Fri, 19 Jun 2026 15:54:01 +0200 Subject: [PATCH 2/6] Bump tests version --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index fa78572..d408a50 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -14,7 +14,7 @@ jobs: - name: Setup Pixi (installs pixi + caches envs) # https://github.com/marketplace/actions/setup-pixi uses: prefix-dev/setup-pixi@v0.9.3 # pin the action version with: - pixi-version: v0.69.0 # pin the pixi binary version (optional) + pixi-version: v0.70.2 # pin the pixi binary version (optional) cache: true # enable caching of installed envs # only write new caches on main pushes (TODO: Enable) # cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} From 6c0d742516628236ef8ff66d8af8e73f319fc88e Mon Sep 17 00:00:00 2001 From: Yiyi Xu Date: Fri, 19 Jun 2026 16:06:48 +0200 Subject: [PATCH 3/6] code cleanup --- swarm_gpt/core/backend.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/swarm_gpt/core/backend.py b/swarm_gpt/core/backend.py index 19674e3..ca6e2fd 100644 --- a/swarm_gpt/core/backend.py +++ b/swarm_gpt/core/backend.py @@ -366,9 +366,9 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: taken_off = False continue try: - logger.info(f"Trying to get obs for {uri}") + logger.debug(f"Trying to get obs for {uri}") obs = swarm.get_obs(uri) - logger.info(f"got obs for {uri}") + logger.debug(f"got obs for {uri}") z = obs["pos"][2] qw = np.abs(obs["quat"][-1]) # Demo fix: If the drone is disconnected, we cannot get its position. We assume it has not taken off. @@ -386,7 +386,7 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: "VLC could not start playback; skipping choreography (drones will land)." ) else: - logger.info("Starting choreography execution") + logger.debug("Starting choreography execution") swarm.execute_choreography( choreography_dict, self.waypoints["time"][0, -1], @@ -396,7 +396,6 @@ def deploy(self, drone_ids: list[int] | None = None) -> bool: swarm.goto(final_pos_dict, duration=2.0) # Transition from ideal point to hover pos if self.settings["land_on_docks"]: # Commented out for demo swarm.goto(final_pos_dict, duration=3.0) # Hovering - # swarm.goto(landing_pos_dict, duration=1.5) # Landing swarm.land(duration=1.5) # Landing finally: swarm.close() From 7a34ddee85caa5164f78833abb521bcc31d3a37a Mon Sep 17 00:00:00 2001 From: Yiyi Xu Date: Fri, 19 Jun 2026 16:08:44 +0200 Subject: [PATCH 4/6] update pixi lock file --- pixi.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pixi.lock b/pixi.lock index 04c2f0e..4d1763b 100644 --- a/pixi.lock +++ b/pixi.lock @@ -56,7 +56,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda - pypi: . - - pypi: git+https://github.com/learnsyslab/axswarm#2ce7540d07983d152c3df7a0d77166de18dbd2d6 + - pypi: git+https://github.com/learnsyslab/axswarm.git#2ce7540d07983d152c3df7a0d77166de18dbd2d6 - pypi: https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/28/167b291356c2cc315a2d62a95b0ceace72b5b0bf547de30b89313110f032/av-17.0.1-cp311-abi3-manylinux_2_28_x86_64.whl @@ -943,8 +943,8 @@ environments: - conda: https://prefix.dev/robostack-kilted/linux-64/ros-kilted-zstd-vendor-0.32.0-np2py312h31f38b3_14.conda - conda: https://prefix.dev/robostack-kilted/linux-64/ros2-distro-mutex-0.12.0-kilted_14.conda - pypi: . - - pypi: git+https://github.com/bitcraze/crazyflie-lib-python-v2#329bd2cb6b21ccecce0396926887743c148a6bd6 - - pypi: git+https://github.com/learnsyslab/axswarm#2ce7540d07983d152c3df7a0d77166de18dbd2d6 + - pypi: git+https://github.com/bitcraze/crazyflie-lib-python-v2.git#329bd2cb6b21ccecce0396926887743c148a6bd6 + - pypi: git+https://github.com/learnsyslab/axswarm.git#2ce7540d07983d152c3df7a0d77166de18dbd2d6 - pypi: https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/28/167b291356c2cc315a2d62a95b0ceace72b5b0bf547de30b89313110f032/av-17.0.1-cp311-abi3-manylinux_2_28_x86_64.whl @@ -1998,8 +1998,8 @@ environments: - conda: https://prefix.dev/robostack-kilted/linux-64/ros-kilted-zstd-vendor-0.32.0-np2py312h31f38b3_14.conda - conda: https://prefix.dev/robostack-kilted/linux-64/ros2-distro-mutex-0.12.0-kilted_14.conda - pypi: . - - pypi: git+https://github.com/bitcraze/crazyflie-lib-python-v2#329bd2cb6b21ccecce0396926887743c148a6bd6 - - pypi: git+https://github.com/learnsyslab/axswarm#2ce7540d07983d152c3df7a0d77166de18dbd2d6 + - pypi: git+https://github.com/bitcraze/crazyflie-lib-python-v2.git#329bd2cb6b21ccecce0396926887743c148a6bd6 + - pypi: git+https://github.com/learnsyslab/axswarm.git#2ce7540d07983d152c3df7a0d77166de18dbd2d6 - pypi: https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/28/167b291356c2cc315a2d62a95b0ceace72b5b0bf547de30b89313110f032/av-17.0.1-cp311-abi3-manylinux_2_28_x86_64.whl @@ -15794,22 +15794,22 @@ packages: - mutagen - imageio>=2.37.0,<3 - av>=15.1.0,<18 - - axswarm @ git+https://github.com/learnsyslab/axswarm ; extra == 'sim' + - axswarm @ git+https://github.com/learnsyslab/axswarm.git ; extra == 'sim' - crazyflow==0.1.0 ; extra == 'sim' - drone-models==0.1.0 ; extra == 'sim' - drone-controllers==0.1.0 ; extra == 'sim' - jax>=0.7 ; extra == 'sim' - - cflib2 @ git+https://github.com/bitcraze/crazyflie-lib-python-v2 ; extra == 'deploy' + - cflib2 @ git+https://github.com/bitcraze/crazyflie-lib-python-v2.git ; extra == 'deploy' - drone-estimators ; extra == 'deploy' requires_python: '>=3.10' -- pypi: git+https://github.com/bitcraze/crazyflie-lib-python-v2#329bd2cb6b21ccecce0396926887743c148a6bd6 +- pypi: git+https://github.com/bitcraze/crazyflie-lib-python-v2.git#329bd2cb6b21ccecce0396926887743c148a6bd6 name: cflib2 version: 0.1.0 requires_dist: - packaging~=25.0 - tyro>=1.0.8 requires_python: '>=3.11' -- pypi: git+https://github.com/learnsyslab/axswarm#2ce7540d07983d152c3df7a0d77166de18dbd2d6 +- pypi: git+https://github.com/learnsyslab/axswarm.git#2ce7540d07983d152c3df7a0d77166de18dbd2d6 name: axswarm version: 0.1.0 requires_dist: From 0a503c0d001ee92f19830ce98757d9c7b858a963 Mon Sep 17 00:00:00 2001 From: Yiyi Xu Date: Fri, 19 Jun 2026 16:15:34 +0200 Subject: [PATCH 5/6] code cleaner upper --- swarm_gpt/core/drone_swarm.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/swarm_gpt/core/drone_swarm.py b/swarm_gpt/core/drone_swarm.py index 670ddb2..a7d702e 100644 --- a/swarm_gpt/core/drone_swarm.py +++ b/swarm_gpt/core/drone_swarm.py @@ -98,8 +98,6 @@ def get_obs(self, uri: str) -> dict[str, Array]: """Generate the observation for a drone using mocap or lighthouse.""" obs = self._run(self._parallel_by_uri("Reading observation", [uri], self._read_observation)) return obs[0] - # return self._run(self._read_observation(uri)) - # return self._run(self._parallel_by_uri("Reading observation", [uri], self._read_observation)[0]) def missing_uris(self) -> list[str]: """Return configured URIs that are not currently active.""" From ef6ab0f6a7f44f0989e49ec257200bb6582ce89b Mon Sep 17 00:00:00 2001 From: Yiyi Xu Date: Fri, 19 Jun 2026 16:21:41 +0200 Subject: [PATCH 6/6] update pixi version in docs --- .github/workflows/docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 4231448..e5ad485 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -39,7 +39,7 @@ jobs: - name: Setup pixi uses: prefix-dev/setup-pixi@v0.8.1 with: - pixi-version: v0.69.0 + pixi-version: v0.70.2 # enable caching of installed envs cache: true # only write new caches on main pushes (TODO: Enable)