Sync inav to Gitea
Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,461 @@
|
||||
# AGENT.md - Guide for AI Agents Working with INAV
|
||||
|
||||
## Project Overview
|
||||
|
||||
**INAV** is a navigation-capable flight controller firmware for multirotor, fixed-wing, and other RC vehicles. It is a community-driven project written primarily in C (C99/C11 standard) with support for STM32 F4, F7, H7, and AT32 microcontrollers.
|
||||
|
||||
### Key Characteristics
|
||||
- **Type**: Embedded firmware for flight controllers
|
||||
- **Language**: C (C99/C11), with some C++ for unit tests
|
||||
- **Build System**: CMake (version 3.13+)
|
||||
- **License**: GNU GPL v3
|
||||
- **Version**: 9.0.1 (as of this writing)
|
||||
- **Codebase History**: Evolved from Cleanflight/Baseflight
|
||||
|
||||
## Architecture and Structure
|
||||
|
||||
### Core Components
|
||||
|
||||
The INAV codebase is organized into the following major subsystems:
|
||||
|
||||
1. **Flight Control (`fc/`)**: Core flight controller logic, initialization, MSP protocol handling
|
||||
2. **Sensors (`sensors/`)**: Gyro, accelerometer, compass, barometer, GPS, rangefinder, pitot tube
|
||||
3. **Flight (`flight/`)**: PID controllers, mixers, altitude hold, position hold, navigation
|
||||
4. **Navigation (`navigation/`)**: Waypoint missions, RTH (Return to Home), position hold
|
||||
5. **Drivers (`drivers/`)**: Hardware abstraction layer for MCU peripherals (SPI, I2C, UART, timers, etc.)
|
||||
6. **IO (`io/`)**: Serial communication, OSD, LED strips, telemetry
|
||||
7. **RX (`rx/`)**: Radio receiver protocols (CRSF, SBUS, IBUS, etc.)
|
||||
8. **Scheduler (`scheduler/`)**: Real-time task scheduling
|
||||
9. **Configuration (`config/`)**: Parameter groups, EEPROM storage, settings management
|
||||
10. **MSP (`msp/`)**: MultiWii Serial Protocol implementation
|
||||
11. **Telemetry (`telemetry/`)**: SmartPort, FPort, MAVLink, LTM, CRSF telemetry
|
||||
12. **Blackbox (`blackbox/`)**: Flight data recorder
|
||||
13. **Programming (`programming/`)**: Logic conditions and global functions for in-flight programming
|
||||
|
||||
### Directory Structure
|
||||
|
||||
```
|
||||
/src/main/ - Main source code
|
||||
├── build/ - Build configuration and macros
|
||||
├── common/ - Common utilities (math, filters, utils)
|
||||
├── config/ - Configuration system (parameter groups)
|
||||
├── drivers/ - Hardware drivers (MCU-specific)
|
||||
├── fc/ - Flight controller core
|
||||
├── flight/ - Flight control algorithms
|
||||
├── io/ - Input/output (serial, OSD, LED)
|
||||
├── msp/ - MSP protocol
|
||||
├── navigation/ - Navigation and autopilot
|
||||
├── rx/ - Radio receiver protocols
|
||||
├── sensors/ - Sensor drivers and processing
|
||||
├── scheduler/ - Task scheduler
|
||||
├── telemetry/ - Telemetry protocols
|
||||
└── target/ - Board-specific configurations
|
||||
|
||||
/docs/ - Documentation
|
||||
└── development/ - Developer documentation
|
||||
|
||||
/cmake/ - CMake build scripts
|
||||
/lib/ - External libraries
|
||||
/tools/ - Build and utility tools
|
||||
```
|
||||
|
||||
## Coding Conventions
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
1. **Types**: Use `_t` suffix for typedef'd types: `gyroConfig_t`, `pidController_t`
|
||||
2. **Enums**: Use `_e` suffix for enum types: `portMode_e`, `cfTaskPriority_e`
|
||||
3. **Functions**: Use camelCase with verb-phrase names: `gyroInit()`, `deleteAllPages()`
|
||||
4. **Variables**: Use camelCase nouns, avoid noise words like "data" or "info"
|
||||
5. **Booleans**: Question format: `isOkToArm()`, `canNavigate()`
|
||||
6. **Constants**: Upper case with underscores: `MAX_GYRO_COUNT`
|
||||
7. **Macros**: Upper case with underscores: `FASTRAM`, `STATIC_UNIT_TESTED`
|
||||
|
||||
### Code Style
|
||||
|
||||
- **Indentation**: 4 spaces (no tabs)
|
||||
- **Braces**: K&R style (opening brace on same line, except for functions)
|
||||
- **Line Length**: Keep reasonable (typically under 120 characters)
|
||||
- **Comments**: Explain WHY, not WHAT. Document variables at declaration, not at extern usage
|
||||
- **Header Guards**: Use `#pragma once` (modern convention used throughout codebase)
|
||||
|
||||
### Memory Attributes
|
||||
|
||||
INAV uses special memory attributes for performance-critical code on resource-constrained MCUs:
|
||||
|
||||
```c
|
||||
FASTRAM // Fast RAM section (aligned)
|
||||
EXTENDED_FASTRAM // Extended fast RAM (STM32F4/F7 only)
|
||||
DMA_RAM // DMA-accessible RAM (STM32H7, AT32F43x)
|
||||
SLOW_RAM // Slower external RAM - deprecated, o not use
|
||||
STATIC_FASTRAM // Static variable in fast RAM
|
||||
STATIC_FASTRAM_UNIT_TESTED // Static fast RAM variable visible in unit tests
|
||||
```
|
||||
|
||||
### Test Visibility Macros
|
||||
|
||||
```c
|
||||
STATIC_UNIT_TESTED // static in production, visible in unit tests
|
||||
STATIC_INLINE_UNIT_TESTED // static inline in production, visible in tests
|
||||
INLINE_UNIT_TESTED // inline in production, visible in tests
|
||||
UNIT_TESTED // Always visible (no storage class)
|
||||
```
|
||||
|
||||
## Build System
|
||||
|
||||
### CMake Build Process
|
||||
|
||||
INAV uses CMake with custom target definition functions:
|
||||
|
||||
1. **Target Definition**: Each board has a `target.h` and optionally `CMakeLists.txt`
|
||||
2. **Hardware Function**: `target_stm32f405xg(NAME optional_params)`
|
||||
3. **Build Directory**: Always use out-of-source builds in `/build` directory
|
||||
|
||||
### Building a Target
|
||||
|
||||
```bash
|
||||
# From workspace root
|
||||
cd build
|
||||
cmake ..
|
||||
make MATEKF722SE # Build specific target
|
||||
make # Build all targets
|
||||
```
|
||||
|
||||
### Target Configuration
|
||||
|
||||
Targets are defined in `/src/main/target/TARGETNAME/`:
|
||||
- `target.h`: Hardware pin definitions, feature enables, MCU configuration
|
||||
- `target.c`: Board-specific initialization code
|
||||
- `CMakeLists.txt`: Build configuration (optional)
|
||||
|
||||
Example target definition:
|
||||
```c
|
||||
#define TARGET_BOARD_IDENTIFIER "MF7S"
|
||||
#define LED0 PA14
|
||||
#define BEEPER PC13
|
||||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_1
|
||||
#define SPI1_SCK_PIN PA5
|
||||
```
|
||||
|
||||
### Conditional Compilation
|
||||
|
||||
Feature flags control code inclusion:
|
||||
```c
|
||||
#ifdef USE_GPS
|
||||
// GPS code
|
||||
#endif
|
||||
|
||||
#if defined(STM32F4)
|
||||
// F4-specific code
|
||||
#elif defined(STM32F7)
|
||||
// F7-specific code
|
||||
#endif
|
||||
```
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### Parameter Groups (PG)
|
||||
|
||||
INAV uses a sophisticated configuration system called "Parameter Groups" for persistent storage:
|
||||
|
||||
```c
|
||||
// Define a configuration structure
|
||||
typedef struct {
|
||||
uint8_t gyro_lpf_hz;
|
||||
uint16_t gyro_kalman_q;
|
||||
// ...
|
||||
} gyroConfig_t;
|
||||
|
||||
// Register with reset template
|
||||
PG_REGISTER_WITH_RESET_TEMPLATE(gyroConfig_t, gyroConfig, PG_GYRO_CONFIG, 12);
|
||||
|
||||
// Define default values
|
||||
PG_RESET_TEMPLATE(gyroConfig_t, gyroConfig,
|
||||
.gyro_lpf_hz = 60,
|
||||
.gyro_kalman_q = 200,
|
||||
// ...
|
||||
);
|
||||
|
||||
// Access in code
|
||||
gyroConfig()->gyro_lpf_hz
|
||||
```
|
||||
|
||||
**Key Functions:**
|
||||
- `PG_REGISTER_WITH_RESET_TEMPLATE()`: Register with static defaults
|
||||
- `PG_REGISTER_WITH_RESET_FN()`: Register with function-based initialization
|
||||
- `PG_REGISTER_ARRAY()`: For arrays of configuration items
|
||||
- Parameter group IDs are in `config/parameter_group_ids.h`
|
||||
|
||||
### Scheduler
|
||||
|
||||
INAV uses a priority-based cooperative task scheduler:
|
||||
|
||||
```c
|
||||
typedef enum {
|
||||
TASK_PRIORITY_IDLE = 0,
|
||||
TASK_PRIORITY_LOW = 1,
|
||||
TASK_PRIORITY_MEDIUM = 3,
|
||||
TASK_PRIORITY_HIGH = 5,
|
||||
TASK_PRIORITY_REALTIME = 18,
|
||||
} cfTaskPriority_e;
|
||||
```
|
||||
|
||||
Tasks are defined in `fc/fc_tasks.c` with priority and desired execution period.
|
||||
|
||||
### Sensors and Calibration
|
||||
|
||||
Sensors use a common pattern:
|
||||
1. **Detection**: Auto-detect hardware at boot (`gyroDetect()`, `baroDetect()`)
|
||||
2. **Initialization**: Configure sensor parameters
|
||||
3. **Calibration**: Zero-offset calibration (gyro, accelerometer)
|
||||
4. **Data Processing**: Apply calibration, alignment, and filtering
|
||||
|
||||
### Flight Control Loop
|
||||
|
||||
The main control loop follows this pattern:
|
||||
1. **Gyro Task** (highest priority): Read gyro, apply filters
|
||||
2. **PID Task**: Calculate PID corrections
|
||||
3. **RX Task**: Process radio input
|
||||
4. **Other Tasks**: Sensors, telemetry, OSD, etc. (lower priority)
|
||||
|
||||
### MSP Protocol
|
||||
|
||||
MultiWii Serial Protocol is used for configuration and telemetry:
|
||||
- Request/response model
|
||||
- Message types defined in `msp/msp_protocol.h`
|
||||
- Handlers in `fc/fc_msp.c`
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Hardware Abstraction
|
||||
|
||||
INAV abstracts hardware through resource allocation:
|
||||
|
||||
```c
|
||||
// IO pins
|
||||
IO_t pin = IOGetByTag(IO_TAG(PA5));
|
||||
IOInit(pin, OWNER_SPI, RESOURCE_SPI_SCK, 1);
|
||||
|
||||
// Timers
|
||||
const timerHardware_t *timer = timerGetByTag(IO_TAG(PA8), TIM_USE_ANY);
|
||||
|
||||
// DMA
|
||||
dmaIdentifier_e dma = dmaGetIdentifier(DMA1_Stream0);
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
|
||||
INAV uses several approaches:
|
||||
1. **Return codes**: Boolean success/failure or error enums
|
||||
2. **Diagnostics**: `sensors/diagnostics.c` for sensor health
|
||||
3. **Status indicators**: Beeper codes, LED patterns for user feedback
|
||||
4. **Logging**: CLI-based logging system
|
||||
|
||||
### Filter Chains
|
||||
|
||||
Sensor data typically goes through multiple filtering stages:
|
||||
|
||||
```c
|
||||
// Low-pass filters
|
||||
gyroLpfApplyFn = lowpassFilterGetApplyFn(filterType);
|
||||
gyroLpfApplyFn(&gyroLpfState[axis], sample);
|
||||
|
||||
// Notch filters (for dynamic filtering)
|
||||
for (int i = 0; i < dynamicNotchCount; i++) {
|
||||
sample = biquadFilterApply(¬chFilter[i], sample);
|
||||
}
|
||||
```
|
||||
|
||||
### Board Alignment
|
||||
|
||||
All sensors go through board alignment transforms to correct for mounting orientation:
|
||||
|
||||
```c
|
||||
// Apply board alignment rotation matrix
|
||||
applySensorAlignment(gyroData, gyroData, gyroAlign);
|
||||
```
|
||||
|
||||
### SITL (Software In The Loop)
|
||||
|
||||
INAV can be compiled for host system simulation:
|
||||
```bash
|
||||
cmake -DSITL=ON ..
|
||||
make
|
||||
```
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### Branching Strategy
|
||||
|
||||
- **`maintenance-X.x`**: Current version development (e.g., `maintenance-9.x`)
|
||||
- **`maintenance-Y.x`**: Next major version (e.g., `maintenance-10.x`)
|
||||
- **`master`**: Tracks current version, receives merges from maintenance branches
|
||||
|
||||
### Pull Request Guidelines
|
||||
|
||||
1. **Target Branch**:
|
||||
- Bug fixes and backward-compatible features → current maintenance branch
|
||||
- Breaking changes → next major version maintenance branch
|
||||
- **Never** target `master` directly
|
||||
|
||||
2. **Keep PRs Focused**: One feature/fix per PR
|
||||
|
||||
3. **Code Quality**:
|
||||
- Follow existing code style
|
||||
- Add unit tests where possible
|
||||
- Update documentation in `/docs`
|
||||
- Test on real hardware when possible
|
||||
|
||||
4. **Commit Messages**: Clear, descriptive messages
|
||||
|
||||
### Important Files to Check
|
||||
|
||||
Before making changes, review:
|
||||
- `docs/development/Development.md` - Development principles
|
||||
- `docs/development/Contributing.md` - Contribution guidelines
|
||||
- Target-specific files in `/src/main/target/`
|
||||
|
||||
## Important Files and Directories
|
||||
|
||||
### Configuration Files
|
||||
|
||||
- `platform.h`: Platform-specific includes and defines
|
||||
- `target.h`: Board-specific hardware configuration
|
||||
- `config/parameter_group.h`: Parameter group system
|
||||
- `config/parameter_group_ids.h`: PG ID definitions
|
||||
- `fc/settings.yaml`: CLI settings definitions
|
||||
|
||||
### Core Flight Control
|
||||
|
||||
- `fc/fc_core.c`: Main flight control loop
|
||||
- `fc/fc_init.c`: System initialization
|
||||
- `fc/fc_tasks.c`: Task scheduler configuration
|
||||
- `flight/pid.c`: PID controller implementation
|
||||
- `flight/mixer.c`: Motor mixing
|
||||
|
||||
### Key Headers
|
||||
|
||||
- `build/build_config.h`: Build-time configuration macros
|
||||
- `common/axis.h`: Axis definitions (X, Y, Z, ROLL, PITCH, YAW)
|
||||
- `common/maths.h`: Math utilities and constants
|
||||
- `common/filter.h`: Digital filter implementations
|
||||
- `drivers/accgyro/accgyro.h`: Gyro/accelerometer interface
|
||||
|
||||
## AI Agent Guidelines
|
||||
|
||||
### When Adding Features
|
||||
|
||||
1. **Understand the Module**: Read related files in the same directory
|
||||
2. **Check for Similar Code**: Search for similar features to maintain consistency
|
||||
3. **Follow Parameter Group Pattern**: New settings should use PG system
|
||||
4. **Add to Scheduler**: New periodic tasks go in `fc/fc_tasks.c`
|
||||
5. **Update Documentation**: Add/update files in `/docs`
|
||||
6. **Consider Target Support**: Use `#ifdef USE_FEATURE` for optional features
|
||||
7. **Generate CLI setting docs**: Remember to inform user to run `python src/utils/update_cli_docs.py`
|
||||
8. **Follow conding standard**: Follow MISRA C rules
|
||||
9. **Increase Paremeterer Group Version**: When changing PG structure, increase version corresponding in `PG_REGISTER`, `PG_REGISTER_WITH_RESET_FN`, `PG_REGISTER_WITH_RESET_TEMPLATE`, `PG_REGISTER_ARRAY` or `PG_REGISTER_ARRAY_WITH_RESET_FN`
|
||||
|
||||
### When Fixing Bugs
|
||||
|
||||
1. **Review Recent Changes**: Check git history for related modifications
|
||||
2. **Test Signal Path**: For sensor issues, trace from hardware through filters to consumer
|
||||
3. **Consider All Platforms**: STM32F4, F7, H7, and AT32 may behave differently
|
||||
4. **Check Memory Usage**: Embedded system has limited RAM/flash
|
||||
|
||||
### When Refactoring
|
||||
|
||||
1. **Maintain API Compatibility**: Unless targeting next major version
|
||||
2. **Preserve Unit Tests**: Update tests to match refactored code
|
||||
3. **Update Documentation**: Keep docs synchronized with code changes
|
||||
4. **Consider Performance**: Profile on target hardware, not just host compilation
|
||||
5. **Check All Callers**: Use grep/search to find all usage sites
|
||||
|
||||
### Common Pitfalls to Avoid
|
||||
|
||||
1. **Don't Ignore Memory Attributes**: FASTRAM placement affects real-time performance
|
||||
2. **Don't Break Parameter Groups**: Changing PG structure requires version bump
|
||||
3. **Don't Assume Hardware**: Always check feature flags (`#ifdef USE_GPS`)
|
||||
4. **Don't Break MSP**: Changes to MSP protocol affect configurator compatibility
|
||||
5. **Don't Commit Wrong Branch**: Target maintenance branch, not master
|
||||
6. **Don't Skip Documentation**: Code without docs increases support burden
|
||||
7. **Don't Hardcode Values**: Use parameter groups for configurable values
|
||||
|
||||
### Searching the Codebase
|
||||
|
||||
**Find definitions:**
|
||||
```bash
|
||||
grep -r "typedef.*_t" src/main/ # Find all type definitions
|
||||
grep -r "PG_REGISTER" src/main/ # Find parameter groups
|
||||
grep -r "TASK_" src/main/ # Find scheduled tasks
|
||||
```
|
||||
|
||||
**Find usage:**
|
||||
```bash
|
||||
grep -r "functionName" src/main/
|
||||
grep -r "USE_GPS" src/main/target/ # Feature support by target
|
||||
```
|
||||
|
||||
**Find similar code:**
|
||||
- Look in the same directory first
|
||||
- Check for similar sensor/peripheral implementations
|
||||
- Review git history: `git log --all --oneline --grep="keyword"`
|
||||
|
||||
### Understanding Control Flow
|
||||
|
||||
1. **Startup**: `main.c` → `fc_init.c:init()` → `fc_tasks.c:tasksInit()`
|
||||
2. **Main Loop**: `scheduler.c:scheduler()` executes tasks by priority
|
||||
3. **Critical Path**: Gyro → PID → Mixer → Motors (highest priority)
|
||||
4. **Configuration**: CLI/MSP → Parameter Groups → EEPROM
|
||||
|
||||
### Cross-Platform Considerations
|
||||
|
||||
Different MCU families have different characteristics:
|
||||
|
||||
- **STM32F4**: Most common, 84-168 MHz, FPU, no cache
|
||||
- **STM32F7**: Faster, 216 MHz, FPU, I/D cache, requires cache management
|
||||
- **STM32H7**: Fastest, 480 MHz, more RAM, complex memory architecture (DTCM, SRAM)
|
||||
- **AT32F43x**: Chinese MCU, STM32F4-compatible, different peripherals
|
||||
|
||||
Always test on target or use `#if defined()` guards for MCU-specific code.
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### File Naming Patterns
|
||||
|
||||
- `*_config.h`: Configuration structures (usually with PG)
|
||||
- `*_impl.h`: Implementation headers (MCU-specific)
|
||||
- `*_hal.h`: Hardware abstraction layer
|
||||
- `accgyro_*.c`: Gyro/accelerometer drivers
|
||||
- `bus_*.c`: Communication bus drivers (SPI, I2C)
|
||||
|
||||
### Common Abbreviations
|
||||
|
||||
- **FC**: Flight Controller
|
||||
- **PG**: Parameter Group
|
||||
- **MSP**: MultiWii Serial Protocol
|
||||
- **CLI**: Command Line Interface
|
||||
- **OSD**: On-Screen Display
|
||||
- **RTH**: Return to Home
|
||||
- **PID**: Proportional-Integral-Derivative (controller)
|
||||
- **IMU**: Inertial Measurement Unit (gyro + accel)
|
||||
- **AHRS**: Attitude and Heading Reference System
|
||||
- **ESC**: Electronic Speed Controller
|
||||
- **SITL**: Software In The Loop
|
||||
- **HITL**: Hardware In The Loop
|
||||
|
||||
## Resources
|
||||
|
||||
- **Main Repository**: https://github.com/iNavFlight/inav
|
||||
- **Configurator**: https://github.com/iNavFlight/inav-configurator
|
||||
- **Discord**: https://discord.gg/peg2hhbYwN
|
||||
- **Documentation**: https://github.com/iNavFlight/inav/wiki
|
||||
- **Release Notes**: https://github.com/iNavFlight/inav/releases
|
||||
|
||||
## Version Information
|
||||
|
||||
This document is accurate for INAV 9.0.1. As the project evolves, some details may change. Always refer to the latest documentation and code for authoritative information.
|
||||
|
||||
---
|
||||
|
||||
**Remember**: INAV flies aircraft that people build and fly. Code quality, safety, and reliability are paramount. When in doubt, ask the community or maintainers for guidance.
|
||||
Reference in New Issue
Block a user