Initial checkpoint: Crazyflie mission client (DearPyGui)

Two-step ARM -> LAUNCH -> LAND flight flow for a Crazyflie + Flow v2 deck:

- controller.py: cflib link + flight logic on one worker thread with a
  command queue. Supervisor arming, Kalman estimator reset/convergence
  wait, high-level-commander takeoff/land, configurable hover height
  (0.2-2.0 m), emergency stop, graceful land-on-shutdown, thread-safe
  snapshot()/scan(). States: DISCONNECTED/CONNECTING/READY/ARMING/ARMED/
  FLYING/LANDING/EMERGENCY/ERROR.
- mission_client.py: DearPyGui front-end, manual render loop polling
  snapshot() each frame. Context button ARM(green)->LAUNCH(blue)->LAND
  (yellow), secondary Disarm, hover-height slider, console log, and an
  Estimator state panel (x/y/z, yaw, flow counts) for drift inspection.
- uv-managed (pyproject.toml + uv.lock); run `uv run mission_client.py`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 15:44:07 -07:00
commit eed9778e59
7 changed files with 1756 additions and 0 deletions

17
pyproject.toml Normal file
View File

@@ -0,0 +1,17 @@
[project]
name = "crazyflie-mission-client"
version = "0.1.0"
description = "Tkinter mission client that flies a Crazyflie + Flow v2 deck to a 1 m hover"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
# Crazyflie radio link, logging, commander, supervisor arming API.
# 0.1.25 is the first release with cf.supervisor.send_arming_request().
"cflib>=0.1.25",
# Immediate-mode GUI (same binding as the test-stand app).
"dearpygui>=2.0",
]
[tool.uv]
# Flat-module application, not an installable package — don't try to build it.
package = false