Skip to main content

axonio-ros2

ROS2 package and Python SDK that give robots a shared, durable spatial memory in Axonio. One robot reports an obstacle; every robot in the fleet can plan around it, and it is still there after a restart.

It is built on the axonio Python SDK. Spatial events are stored as ordinary Axonio memories, so they also appear in the dashboard, in search, and to any AI agent connected through the Axonio MCP server.

Formerly clawdb-ros2.

Install

pip install axonio-ros2          # Python 3.10 or newer (ROS 2 Humble and later)

Or inside a colcon workspace:

cd ~/ros2_ws/src
git clone https://github.com/hackcat29/axonio-sdk.git
ln -s axonio-sdk/sdks/ros2 axonio_ros2
pip install axonio
cd ~/ros2_ws && colcon build --packages-select axonio_ros2 && source install/setup.bash

Create an API key in the Axonio dashboard (Robots → Register Robot Node) and export it. The key is never put on the command line or in a ROS parameter, where any node on the DDS domain could read it.

export AXONIO_API_KEY="ck_live_..."      # or use api_key_file:=/run/secrets/axonio

Run the bridge node

ros2 launch axonio_ros2 memory_bridge.launch.py robot_id:=amr_01
# or
ros2 run axonio_ros2 memory_node --ros-args -p robot_id:=amr_01

The node writes every obstacle it sees to Axonio, pulls what other robots recorded into a local index at sync_rate_hz, and publishes those new records on ~/fleet_updates.

Topic Type
~/detected_obstacle (sub) geometry_msgs/Point A point detection to remember
~/fleet_updates (pub) std_msgs/String JSON list of records new from other robots
Parameter Default
endpoint "" Empty for the Axonio cloud, or a self-hosted server URL (https://, or http://localhost)
api_key_file "" File holding the key, used when AXONIO_API_KEY is unset
robot_id amr-01 This machine's id; its own records are not pulled back
store_name robot-fleet-memory Robots sharing a store share memory
frame_id map Coordinate frame of the records
sync_rate_hz 1.0 Fleet sync frequency (0 turns it off)
local_ttl_seconds 7200.0 How long a record stays in the local index

Use it from Python

from axonio_ros2 import AxonioClient, SpatialMemoryIndex, SpatialMemoryRecord

client = AxonioClient(store_name="warehouse", robot_id="amr_01")   # key from AXONIO_API_KEY

client.record_spatial_event(
    SpatialMemoryRecord(x=14.5, y=8.2, obstacle_type="pallet_spill", confidence=0.98, tags=["aisle_4"])
)

# Plan against a local index: no network call per query.
index = SpatialMemoryIndex(memory_ttl_seconds=3600)
for record in client.pull_fleet_deltas(since_timestamp=0.0):
    index.insert(record)

for record, distance in index.query_radius(x=14.0, y=7.5, radius=5.0):
    print(record.obstacle_type, f"{distance:.2f} m")

record_spatial_event never raises. If Axonio is unreachable the record is queued (up to 1000) and sent before the next call, and {"status": "offline_cached"} is returned.

What is stored

Each record is one Axonio memory:

content   pallet spill at (14.50, 8.20, 0.00) in frame map, confidence 0.98, reported by amr_01
tags      axonio-ros2, store:warehouse, obstacle:pallet_spill, robot:amr_01, aisle_4
metadata  x, y, z, frame_id, confidence, recorded_at, robot_id, ...

Because the content is a sentence, an agent can answer "which aisles were blocked today?" from the same data.

pull_fleet_deltas and load_recent read memories back with Axonio's list call, which returns content and tags but not metadata. They rebuild position, frame, class, confidence, robot id, tags and notes from those. Other metadata keys you attach are stored and returned by search (search_nearby), but not by the list-based sync.

Searching the cloud

client.search_nearby(x, y, radius_meters) asks Axonio for the memories that best match the place and keeps those inside the radius. Search ranks by meaning, not geometry, so treat it as a lookup for cold starts and dashboards. For a planner loop, fill a SpatialMemoryIndex from pull_fleet_deltas and query that: about 0.07 ms per radius query with 100,000 records (grid-hashed, measured on a laptop).

Examples

examples/ has a warehouse AMR, a multi-robot fleet and a Nav2 costmap sketch.

Test

pip install -e ".[dev]" && pytest

License

MIT

Metadata

Release files for axonio-ros2 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for axonio-ros2 0.5.0
File Size Uploaded Provenance Actions
axonio_ros2-0.5.0.tar.gz 20.8 kB Without provenance Details for axonio_ros2-0.5.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for axonio-ros2 0.5.0
File Interpreter ABI Platform Actions
axonio_ros2-0.5.0-py3-none-any.whl Python 3 none any Details for axonio_ros2-0.5.0-py3-none-any.whl

Total release size: 39.3 kB

Release files / axonio_ros2-0.5.0.tar.gz

Download URL axonio_ros2-0.5.0.tar.gz
Size 20.8 kB
Tags Source
SHA-256 checksum
How to use checksums
88cc11a021d7c863668bc593652d705b5da8b423e2425453ec2f2d5d76f5431e
BLAKE2b-256 checksum
How to use checksums
5f8a3bc6e0fc022a3b4fda592ef1b0f52be8b27043479445223548dbd251d276
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.18

Release files / axonio_ros2-0.5.0-py3-none-any.whl

Download URL axonio_ros2-0.5.0-py3-none-any.whl
Size 18.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d89b0baf99153c1669d3c39170c4c45b889e9efda801cef702d681ac335205fb
BLAKE2b-256 checksum
How to use checksums
36796709b43505f6127e938e58fd630d596fc43c95c01cf6b0affe872e02d61b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.18

Security for axonio-ros2 0.5.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page