Skip to main content

Burr

CI

Taking the grind out of calibration.

Autonomous calibration and observation scheduling for rapid-deploy SDA telescopes.

Burr converts an observatory into a space domain awareness asset within days of deployment. It autonomously collects twilight flats, photometric standards, calibration satellite passes, sky coverage maps, and lunar background measurements -- all scheduled by lighting condition and time-share priority.

Burr is built off of the descriptions in Gazak et al. 2025, "Rapid Deployment, Calibration, and Training of Optical Observatories for Space Domain Awareness", AMOS Conference -- see Citation below if you use this software.

Requirements

  • Python 3.13+
  • uv package manager (for development installs)

Install

Install from PyPI (package name astro-burr, imports as burr):

pip install astro-burr

Optional extras:

pip install "astro-burr[sk]"      # SensorKit (NATS-based) control
pip install "astro-burr[direct]"  # direct ASCOM hardware control
pip install "astro-burr[senpai]"  # SENPAI image-processing integration
pip install "astro-burr[notify]"  # Slack notifications

Development install

This repo uses uv. First install uv, then:

make sync
source .venv/bin/activate

Configuration

Burr separates where you observe from how you observe:

  • A site file (deploy/<site>/site.yaml) describes the observatory: coordinates, ASCOM/PWI4 hardware addresses, SensorKit entity names, notifications.
  • A mode preset (deploy/presets/*.yaml) describes the observing strategy: which task sources run, exposure ranges, and scheduling balance.

You compose them at run time with --site + --preset. See deploy/example/ for a worked example and deploy/presets/ for the bundled modes (sda, science, survey).

Site section Purpose
site Coordinates and name (timezone auto-detected)
hardware ASCOM device addresses, ports, active flags
sk SensorKit entity names (for burr-sk)
weather Rain/humidity thresholds and recovery timers
notifications Slack channel for status updates
runtime Output directory

Scheduling strategies

Each task source has a scheduling strategy:

  • time_share -- target percentage of observing time (e.g. photometry 50%, coverage 30%)
  • interval -- minimum minutes between runs (e.g. calsats every 10 min)
  • one_shot -- run once per lighting condition (e.g. twilight flats)

Task sources

Source What it collects Typical window
twilight_flats Flat field frames with auto-exposure adjustment Nautical twilight
calsats Calibration satellite TLE tracking passes Twilight + night
photometric_standards Landolt standard star observations with streaks Night
coverage Sparse sky maps (Fibonacci sphere sampling) Night
lunar_background Background measurements at angular separations from moon Night

Quick Start

Direct mode (ASCOM hardware control)

burr-direct --site deploy/example/site.yaml --preset deploy/presets/sda.yaml

Connects to mount, camera, dome, and weather sensor via ASCOM Alpaca / PWI4. Runs all night autonomously -- opens dome at twilight, schedules observations by priority, closes dome at dawn or if weather deteriorates.

Simulation mode

Set hardware devices to active: false in your site file (or point them at the bundled ASCOM/PWI4 simulators under deploy/):

burr-direct --site deploy/example/site.yaml --preset deploy/presets/survey.yaml

SensorKit mode (NATS-based control)

burr-sk --site deploy/example/site.yaml --preset deploy/presets/sda.yaml

Runs as a SensorKit program/controller pair, integrating with the SensorKit agent framework for multi-system orchestration. Requires the sk extra. burr-sk --bootstrap --host <agent> discovers SK entities + site position from a running agent and emits a site.yaml fragment.

Safe shutdown

burr-shutdown --site deploy/example/site.yaml --preset deploy/presets/sda.yaml

Closes dome, slews to a bright star for verification, parks mount, disconnects.

Project Structure

src/burr/
    bootstrap.py              # Explicit engine init (no import-time side effects)
    cli/                      # CLI entrypoints (direct, shutdown, sk)
    core/                     # Config, constants, logging, notifications
    models/                   # Pydantic models (tracking, observation, site, run, hardware)
    task_source/              # Observation generators implementing the TaskSource protocol
    scheduler/                # Shared scheduler (strategies, slots, factory)
    hardware/
        factory.py            # Device creation from config
        direct/               # ASCOM control (runner, executor, weather monitor)
        sk/                   # SensorKit integration (program, controller, tasks)
    run/                      # Run state management and persistence
    utils/                    # Astronomy, ephemeris, SpaceTrack utilities

Credentials

Burr reads credentials from the environment (or a .env file), never from config:

  • SPACETRACK_USERNAME / SPACETRACK_PASSWORD -- for SpaceTrack TLE downloads (calsats)
  • SLACK_BOT_TOKEN -- for the optional Slack notifications (notify extra)

Output

Each night produces a run directory at {output_dir}/{site}_{YYYYMMDD}/:

example_20251201/
    data/           # FITS files (flats, science frames, darks)
    plots/          # Coverage maps, lighting schedules
    metadata/       # run_state.json (resumable)
    logs/           # Application logs
    catalogs/       # TLE catalogs

Runs auto-resume if interrupted. Starting again on the same night picks up where it left off.

Citation

Burr implements the system described in:

Gazak, J. Z., Swindle, R., Morales, S., Phelps, M., Iott, K., Blackhurst, E., & Fletcher, J. 2025, "Rapid Deployment, Calibration, and Training of Optical Observatories for Space Domain Awareness", Proceedings of the Advanced Maui Optical and Space Surveillance Technologies (AMOS) Conference. doi:10.64861/XGPY2184

If you use Burr in your research, please cite this paper:

@inproceedings{Gazak2025Burr,
  title     = {Rapid Deployment, Calibration, and Training of Optical Observatories for Space Domain Awareness},
  author    = {Gazak, J. Zachary and Swindle, Ryan and Morales, Sierra and Phelps, Matthew and Iott, Kevin and Blackhurst, Eric and Fletcher, Justin},
  booktitle = {Proceedings of the Advanced Maui Optical and Space Surveillance Technologies (AMOS) Conference},
  year      = {2025},
  doi       = {10.64861/XGPY2184}
}

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

astro_burr-0.3.2.tar.gz (176.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

astro_burr-0.3.2-py3-none-any.whl (205.7 kB view details)

Uploaded Python 3

File details

Details for the file astro_burr-0.3.2.tar.gz.

File metadata

  • Download URL: astro_burr-0.3.2.tar.gz
  • Upload date:
  • Size: 176.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for astro_burr-0.3.2.tar.gz
Algorithm Hash digest
SHA256 5be2e27791b483f40311b730d80c3643d209b3ef4661e48b0240360b8c985d0d
MD5 f2df67961b434ae02f765bd9ed1b622c
BLAKE2b-256 57d5a78d4ec0c07990da41486a953cdb9d677101ab59a1b1d462f05ca09fbf51

See more details on using hashes here.

File details

Details for the file astro_burr-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: astro_burr-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 205.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for astro_burr-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 702df15f6c5e61fb583ae28dbac904c3aeb8d5f33a494af5cad9186c142146ab
MD5 fced4eb8e2624ea161d1c29592b34830
BLAKE2b-256 d01c741eddf5a40112c1455323fcdb1fcd8568ef2a68acbc30c3d39f5b4ad607

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.3

2 files

This release

0.3.2 This release

2 files

0.3.1

2 files

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