docs: centralize Markdown developer manual
This commit is contained in:
1 parent
7e4afb4f9c
commit
404e466fc2
19 files changed
+414
-50
No files matched your search
@@ -1,7 +0,0 @@
|
|||||||
# GEPRC GEP-F722-HD V2
|
|
||||||
|
|
||||||
Build from the workspace root:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cargo build --release -p kaptan-geprc-f722-v2 --target thumbv7em-none-eabihf
|
|
||||||
```
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# Kakute F7 Mini V3
|
|
||||||
|
|
||||||
Kaptan support for the Holybro Kakute F7 Mini V3.
|
|
||||||
|
|
||||||
The checked-in manufacturer manual is [Holybro_KakuteF7_Mini_V3_Manual_v1.0.pdf](Holybro_KakuteF7_Mini_V3_Manual_v1.0.pdf).
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
Build the firmware from the workspace root:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cargo build --release -p kaptan-kakute-f7-mini-v3 --target thumbv7em-none-eabihf
|
|
||||||
```
|
|
||||||
|
|
||||||
Create its DFU (device firmware update) image:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
./scripts/create-dfu-image.sh target/thumbv7em-none-eabihf/release/kaptan-kakute-f7-mini-v3
|
|
||||||
```
|
|
||||||
|
|
||||||
The converter derives the `.bin` path and matching board `memory.x`, then prints the firmware size report. It uses rustup's `llvm-tools-preview` component which the workspace toolchain installs automatically.
|
|
||||||
|
|
||||||
## Flash over USB DFU
|
|
||||||
|
|
||||||
1. Disconnect the board from USB.
|
|
||||||
2. Hold the `Boot` button.
|
|
||||||
3. Connect USB, then release `Boot`. The board should enumerate as STM32 DFU.
|
|
||||||
4. Flash the generated image:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
dfu-util --alt 0 --dfuse-address 0x08000000:leave --download target/thumbv7em-none-eabihf/release/kaptan-kakute-f7-mini-v3.bin
|
|
||||||
```
|
|
||||||
|
|
||||||
## UART
|
|
||||||
|
|
||||||
| USB-to-UART adapter | FC |
|
|
||||||
| --- | --- |
|
|
||||||
| `RX` | `T1` |
|
|
||||||
| `GND` | `G` |
|
|
||||||
| `TX` | `R1` |
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
MDBOOK ?= mdbook
|
||||||
|
|
||||||
|
.PHONY: build serve test
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(MDBOOK) build
|
||||||
|
|
||||||
|
serve:
|
||||||
|
$(MDBOOK) serve --open
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(MDBOOK) test
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
[book]
|
||||||
|
title = "Kaptan Developer Manual"
|
||||||
|
description = "Architecture, board bring-up, simulation, and contributor guidance for Kaptan."
|
||||||
|
authors = ["Kaptan contributors"]
|
||||||
|
language = "en"
|
||||||
|
src = "src"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
# Keep generated site files out of the Markdown source tree.
|
||||||
|
build-dir = "../target/docs"
|
||||||
|
create-missing = false
|
||||||
|
|
||||||
|
[output.html]
|
||||||
|
default-theme = "light"
|
||||||
|
preferred-dark-theme = "navy"
|
||||||
|
git-repository-url = "https://github.com/Orkavian/kaptan"
|
||||||
|
edit-url-template = "https://github.com/Orkavian/kaptan/edit/main/{path}"
|
||||||
|
additional-css = ["theme/kaptan.css"]
|
||||||
|
additional-js = ["theme/kaptan.js"]
|
||||||
|
fold = { enable = true, level = 1 }
|
||||||
|
smart-punctuation = true
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Summary
|
||||||
|
|
||||||
|
- [Kaptan Developer Manual](index.md)
|
||||||
|
- [Getting started](getting-started.md)
|
||||||
|
- [Architecture](architecture.md)
|
||||||
|
- [Safety boundary](safety-boundary.md)
|
||||||
|
- [MAVLink and telemetry](mavlink.md)
|
||||||
|
- [Boards](boards/index.md)
|
||||||
|
- [Kakute F7 Mini V3](boards/kakute-f7-mini-v3.md)
|
||||||
|
- [GEPRC GEP-F722-HD V2](boards/geprc-f722-v2.md)
|
||||||
|
- [Host SITL](sitl.md)
|
||||||
|
- [Development and verification](development.md)
|
||||||
|
- [Reference](reference.md)
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Architecture
|
||||||
|
|
||||||
|
Kaptan separates immutable board configuration from platform-owned runtime
|
||||||
|
resources and portable flight logic.
|
||||||
|
|
||||||
|
```text
|
||||||
|
board declaration
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
F722 platform / RTIC application ──► data channel ──► MAVLink telemetry
|
||||||
|
│
|
||||||
|
├── physical sensor drivers
|
||||||
|
└── motor-pin inhibit interlock
|
||||||
|
|
||||||
|
portable libraries
|
||||||
|
math ─► navigation ─► control ─► safety
|
||||||
|
```
|
||||||
|
|
||||||
|
The board contract selects one immutable `BoardProfile`. The checked-in
|
||||||
|
profile is `TelemetryOnly`; `ExternalControlOnly` is represented explicitly
|
||||||
|
but rejected at validation time because it has no reviewed runtime.
|
||||||
|
|
||||||
|
The data channel owns rate selection, mailbox consumption, message encoding,
|
||||||
|
and bounded TX classification. Board code supplies physical routes and
|
||||||
|
telemetry configuration; it does not receive generic output authority.
|
||||||
|
|
||||||
|
## Ownership rules
|
||||||
|
|
||||||
|
- A peripheral owner is local to the platform runtime.
|
||||||
|
- Portable crates use typed units and validated values rather than raw wire or
|
||||||
|
timer representations.
|
||||||
|
- A safety permit is epoch-bound and must be revalidated at the only nonzero
|
||||||
|
output boundary.
|
||||||
|
- A failed observation or numerical check does not partially commit estimator,
|
||||||
|
controller, allocator, or safety state.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# GEPRC GEP-F722-HD V2
|
||||||
|
|
||||||
|
The GEPRC GEP-F722-HD V2 board declaration uses the ICM-42688-P on SPI3 and
|
||||||
|
MAVLink telemetry on USART2. It declares no vertical sensor stream.
|
||||||
|
|
||||||
|
Build and package from the workspace root:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo build --release -p kaptan-geprc-f722-v2 --target thumbv7em-none-eabihf
|
||||||
|
./scripts/create-dfu-image.sh target/thumbv7em-none-eabihf/release/kaptan-geprc-f722-v2
|
||||||
|
```
|
||||||
|
|
||||||
|
The resulting image is telemetry-only and has the shared physical motor-pin
|
||||||
|
inhibit boundary.
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Boards
|
||||||
|
|
||||||
|
Board pages describe supported hardware topology, build products, and safe
|
||||||
|
verification. They do not declare a board flight-ready.
|
||||||
|
|
||||||
|
| Board | MCU family | Primary IMU | MAVLink UART |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| [Kakute F7 Mini V3](kakute-f7-mini-v3.md) | STM32F722 | MPU-6000 | USART1 |
|
||||||
|
| [GEPRC GEP-F722-HD V2](geprc-f722-v2.md) | STM32F722 | ICM-42688-P | USART2 |
|
||||||
|
|
||||||
|
All board images share the motor-pin inhibit boundary described in
|
||||||
|
[Safety boundary](../safety-boundary.md).
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Kakute F7 Mini V3
|
||||||
|
|
||||||
|
The Holybro Kakute F7 Mini V3 board declaration uses the MPU-6000 on SPI1,
|
||||||
|
MAVLink telemetry on USART1, and the MTF01 range/optical-flow route on UART4.
|
||||||
|
The checked-in manufacturer datasheet is
|
||||||
|
`boards/kakute-f7-mini-v3/datasheet.pdf`.
|
||||||
|
|
||||||
|
## Build and package
|
||||||
|
|
||||||
|
From the workspace root:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo build --release -p kaptan-kakute-f7-mini-v3 --target thumbv7em-none-eabihf
|
||||||
|
./scripts/create-dfu-image.sh target/thumbv7em-none-eabihf/release/kaptan-kakute-f7-mini-v3
|
||||||
|
```
|
||||||
|
|
||||||
|
The packaging script derives the matching binary and linker layout, then
|
||||||
|
prints the flash and RAM report.
|
||||||
|
|
||||||
|
## Flash over USB DFU
|
||||||
|
|
||||||
|
1. Disconnect USB.
|
||||||
|
2. Hold the board's `Boot` button.
|
||||||
|
3. Connect USB, then release `Boot` once the STM32 DFU device enumerates.
|
||||||
|
4. Flash the generated image:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dfu-util --alt 0 --dfuse-address 0x08000000:leave --download target/thumbv7em-none-eabihf/release/kaptan-kakute-f7-mini-v3.bin
|
||||||
|
```
|
||||||
|
|
||||||
|
## Telemetry wiring
|
||||||
|
|
||||||
|
Use a 3.3 V USB-to-UART adapter with crossed data lines and common ground:
|
||||||
|
|
||||||
|
| Adapter | Flight controller |
|
||||||
|
| --- | --- |
|
||||||
|
| `RX` | `T1` |
|
||||||
|
| `TX` | `R1` |
|
||||||
|
| `GND` | `G` |
|
||||||
|
|
||||||
|
This wiring is telemetry only. It does not enable motor control.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Development and verification
|
||||||
|
|
||||||
|
## Fast host checks
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo test --workspace --offline
|
||||||
|
cargo clippy --workspace --all-targets --offline --exclude kaptan-geprc-f722-v2 --exclude kaptan-kakute-f7-mini-v3 -- -D warnings
|
||||||
|
cargo clippy -p platform-stm32f7 --all-targets --offline -- -D warnings
|
||||||
|
cargo fmt --check
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
|
|
||||||
|
## Target checks
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo check -p kaptan-geprc-f722-v2 --release --target thumbv7em-none-eabihf --offline
|
||||||
|
cargo check -p kaptan-kakute-f7-mini-v3 --release --target thumbv7em-none-eabihf --offline
|
||||||
|
```
|
||||||
|
|
||||||
|
## Strict core coverage
|
||||||
|
|
||||||
|
```sh
|
||||||
|
scripts/report-test-coverage.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The strict gate requires 100% line and branch coverage for `kaptan-math`,
|
||||||
|
`kaptan-navigation`, `kaptan-control`, and `kaptan-safety`. It isolates each
|
||||||
|
core package's coverage artifacts, unions LCOV source-line records, and uses
|
||||||
|
full LLVM source spans to merge generic branch instantiations without lowering
|
||||||
|
the gate.
|
||||||
|
|
||||||
|
## Simulation acceptance
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python3 tools/sitl/world-structure-test.py
|
||||||
|
python3 -m unittest tools/sitl/test_kaptan_sim.py
|
||||||
|
tools/sitl/e2e-smoke.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The Docker smoke is intentionally separate from host unit tests because it
|
||||||
|
builds the pinned base images, Rust binary, Gazebo plugin, and full loopback
|
||||||
|
plant.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Getting started
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Use the repository toolchain, Rust 1.90. The workspace declares the embedded
|
||||||
|
F7 targets and `llvm-tools-preview` in `rust-toolchain.toml`.
|
||||||
|
|
||||||
|
For host development, run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo test --workspace --offline
|
||||||
|
cargo clippy --workspace --all-targets --offline --exclude kaptan-geprc-f722-v2 --exclude kaptan-kakute-f7-mini-v3 -- -D warnings
|
||||||
|
```
|
||||||
|
|
||||||
|
Bare-metal board packages are not host-test targets. Check them with the
|
||||||
|
target-specific commands in [Development and verification](development.md).
|
||||||
|
|
||||||
|
## Repository layout
|
||||||
|
|
||||||
|
| Path | Responsibility |
|
||||||
|
| --- | --- |
|
||||||
|
| `boards/` | Immutable board declarations and linker layouts. |
|
||||||
|
| `platforms/stm32f7/` | Reviewed F722 RTIC platform and peripheral ownership. |
|
||||||
|
| `libs/` | Typed math, estimation, control, safety, protocol, and driver crates. |
|
||||||
|
| `tools/sitl/` | Host-only closed-loop Gazebo simulation. |
|
||||||
|
| `docs/` | This Markdown documentation site. |
|
||||||
|
|
||||||
|
Do not add board-local READMEs. Add a page here instead, then link it from
|
||||||
|
`SUMMARY.md`.
|
||||||
|
|
||||||
|
## Build the documentation website
|
||||||
|
|
||||||
|
The manual is an [mdBook](https://rust-lang.github.io/mdBook/) project. Build
|
||||||
|
it locally with a compatible `mdbook` binary:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make -C docs build
|
||||||
|
```
|
||||||
|
|
||||||
|
The generated static site is written to `target/docs/`. The GitHub Pages
|
||||||
|
workflow builds that same output from `main`; enable **GitHub Actions** as the
|
||||||
|
repository's Pages publishing source once, then deployments are automatic.
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# Kaptan Developer Manual
|
||||||
|
|
||||||
|
Kaptan is an embedded Rust flight-controller project. This manual is the
|
||||||
|
single source of project documentation: board support, safety boundaries,
|
||||||
|
simulation, development workflow, and design references live here as
|
||||||
|
Markdown.
|
||||||
|
|
||||||
|
The checked-in firmware is telemetry-only. It does not expose physical motor
|
||||||
|
authority, and no document in this site should be read as a physical-flight
|
||||||
|
release claim.
|
||||||
|
|
||||||
|
## Start here
|
||||||
|
|
||||||
|
- New contributors should read [Getting started](getting-started.md).
|
||||||
|
- Board work belongs under [Boards](boards/index.md).
|
||||||
|
- The currently supported closed-loop simulation is [Host SITL](sitl.md).
|
||||||
|
- Before submitting changes, follow [Development and verification](development.md).
|
||||||
|
|
||||||
|
## Documentation conventions
|
||||||
|
|
||||||
|
Documentation is centralized in `docs/src/`; source directories do not carry
|
||||||
|
README files. Keep pages in Markdown, add each page to `SUMMARY.md`, and place
|
||||||
|
commands beside the assumptions and safety boundary they depend on.
|
||||||
|
|
||||||
|
`TODO(configuration)` marks a required configuration contract that has not
|
||||||
|
been implemented. It is not permission for an operator to substitute runtime
|
||||||
|
values or bypass an immutable build-time safety decision.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# MAVLink and telemetry
|
||||||
|
|
||||||
|
Kaptan emits telemetry using MAVLink 2 framing. The production receiver does
|
||||||
|
not promote inbound MAVLink frames to authority records:
|
||||||
|
|
||||||
|
- MAVLink 1 is discarded.
|
||||||
|
- CRC-invalid MAVLink 2 frames are discarded.
|
||||||
|
- Signed frames are discarded because no signature verifier or persistent
|
||||||
|
replay state exists.
|
||||||
|
- Unsigned MAVLink 2 frames are also discarded; a V2 CRC detects corruption,
|
||||||
|
not authentication.
|
||||||
|
|
||||||
|
`TODO(signing)`: any future inbound authority requires verified MAVLink 2
|
||||||
|
signing, configured source/target binding, persistent anti-replay state, and a
|
||||||
|
provisioning/key-rotation policy as one reviewed feature.
|
||||||
|
|
||||||
|
Telemetry transmission uses bounded frame classes. A critical frame may
|
||||||
|
replace pending best-effort traffic, but never the DMA-owned active buffer.
|
||||||
|
Completion retries preserve ordering and retain a transiently busy frame for a
|
||||||
|
later service turn.
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# Reference
|
||||||
|
|
||||||
|
## Build-time configuration
|
||||||
|
|
||||||
|
Board configuration is immutable in the compiled image. Runtime parameter
|
||||||
|
updates and ground-station tuning are not exposed by the checked-in firmware.
|
||||||
|
|
||||||
|
`TODO(configuration)`: a future configuration system must validate and stage
|
||||||
|
an entire profile while disarmed, commit it atomically, and prove that outputs
|
||||||
|
remain inhibited throughout staging, activation, and power-loss recovery.
|
||||||
|
|
||||||
|
## Simulation package reproducibility
|
||||||
|
|
||||||
|
The host SITL Docker build uses digest-pinned base images and the locked Rust
|
||||||
|
dependency graph. The signed Gazebo APT feed is not snapshot-pinned.
|
||||||
|
|
||||||
|
`TODO(reproducibility)`: snapshot/version-pin the Gazebo package set and
|
||||||
|
verify the repository signing-key fingerprint before treating the simulator
|
||||||
|
image as byte-for-byte reproducible release input.
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Safety boundary
|
||||||
|
|
||||||
|
Every checked-in F722 image inhibits PB0, PB1, PB4, and PB5 before normal
|
||||||
|
board initialization. The interlock configures each pin as a low, push-pull
|
||||||
|
GPIO output; it runs before clocks, board routing, UART setup, or RTIC tasks.
|
||||||
|
|
||||||
|
There is no checked-in platform actuator route:
|
||||||
|
|
||||||
|
- no DShot or PWM peripheral implementation is linked;
|
||||||
|
- no TIM3/TIM5 motor task or DMA output path exists;
|
||||||
|
- MAVLink input has no production authority path;
|
||||||
|
- a future verified arm command is still acknowledged as unsupported.
|
||||||
|
|
||||||
|
The protocol reference crate remains in the workspace only as a framing and
|
||||||
|
arming-sequence reference. It does not grant hardware access or authority.
|
||||||
|
|
||||||
|
Run the structural guard after any platform or board change:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo test -p platform-stm32f7 --test platform_safety_boundary --offline
|
||||||
|
```
|
||||||
|
|
||||||
|
This boundary is deliberately stronger than an application-level disarm flag:
|
||||||
|
it removes the physical actuator implementation from the platform image.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# Host SITL
|
||||||
|
|
||||||
|
Host SITL is Kaptan's deterministic closed-loop simulation tier. Gazebo sends
|
||||||
|
simulated IMU and declared noisy local position/velocity observations over a
|
||||||
|
private loopback protocol. The Rust process runs the ESKF, safety supervisor,
|
||||||
|
trajectory, controller, and allocator, then returns four virtual motor
|
||||||
|
fractions to Gazebo.
|
||||||
|
|
||||||
|
It is a pre-bench software gate, not a physical-flight validation.
|
||||||
|
|
||||||
|
## Run the closed loop
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose -f tools/sitl/compose.yaml up -d --build
|
||||||
|
tools/sitl/kaptan-sim ready
|
||||||
|
tools/sitl/kaptan-sim move 5 3 1 --wait
|
||||||
|
tools/sitl/kaptan-sim land 0 0 --wait
|
||||||
|
docker compose -f tools/sitl/compose.yaml down
|
||||||
|
```
|
||||||
|
|
||||||
|
For the reproducible command-path gate, use:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tools/sitl/e2e-smoke.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The smoke scenario verifies ascent, translation, descent, landing, flat-plane
|
||||||
|
proximity, and zero applied motor fractions after landing. Its reference world
|
||||||
|
contains only a visual landing pad; the pad has no collision geometry and
|
||||||
|
never contributes a controller or truth observation.
|
||||||
|
|
||||||
|
Open <https://app.gazebosim.org/visualization>, connect to
|
||||||
|
`ws://localhost:9002`, and leave authorization blank to view the world.
|
||||||
|
|
||||||
|
## Limits
|
||||||
|
|
||||||
|
This model does not validate terrain, vision, flow/range sensing, wind,
|
||||||
|
vibration, battery/ESC behavior, sensor latency/jitter, actuator faults, or
|
||||||
|
physical touchdown sensing. Add those only as a reviewed sensor/contact model,
|
||||||
|
not as a display-only shortcut.
|
||||||
Vendored
+47
@@ -0,0 +1,47 @@
|
|||||||
|
:root {
|
||||||
|
--kaptan-ink: #142033;
|
||||||
|
--kaptan-blue: #1769aa;
|
||||||
|
--kaptan-sky: #e8f3fb;
|
||||||
|
--kaptan-border: #d4dfeb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content main {
|
||||||
|
max-width: 58rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content h1,
|
||||||
|
.content h2,
|
||||||
|
.content h3 {
|
||||||
|
color: var(--kaptan-ink);
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content h1 {
|
||||||
|
border-bottom: 3px solid var(--kaptan-blue);
|
||||||
|
padding-bottom: 0.45rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content a {
|
||||||
|
color: var(--kaptan-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.content table {
|
||||||
|
border: 1px solid var(--kaptan-border);
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content blockquote {
|
||||||
|
border-left-color: var(--kaptan-blue);
|
||||||
|
background: var(--kaptan-sky);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar .sidebar-scrollbox {
|
||||||
|
border-right: 1px solid var(--kaptan-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-chapters {
|
||||||
|
border-top: 1px solid var(--kaptan-border);
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Keep a small stable hook for future theme enhancements without replacing
|
||||||
|
// mdBook's built-in navigation, search, or theme picker.
|
||||||
|
document.documentElement.classList.add("kaptan-docs");
|
||||||
Reference in new issue
Block a user