The goal ArduPilot methodic Configurator software is to automate some of the tasks involved in configuring and tuning ArduPilot-based vehicles. To develop the software the standard V-Model software development method was first used. It was augmented with DevOps and CI/CD automation practices at a later stage.
Development started by using the classic V-model development methodology.
flowchart TB
subgraph requirements["Requirements & Design"]
direction LR
Z([User Requirements]) --> A
A([System Requirements]) --> B([Software Architecture])
B --> C([Module Design])
end
subgraph testing["Testing"]
direction LR
F --> G([Acceptance Testing])
E --> F([System Testing])
D([Module Testing]) --> E([Integration Testing])
end
%% V-shape connections (crossing levels)
Z --> G
A --> F
B --> E
C --> D
%% Clickable links
click A "SYSTEM_REQUIREMENTS.md"
click B "#the-software-architecture"
click C "#module-design"
click D "#module-testing"
click E "#integration-testing"
click F "#system-testing"
click G "#acceptance-testing"
%% Styling
classDef requirement fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef design fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
classDef testing fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
class A,Z requirement
class B,C design
class D,E,F,G testing
If the diagram above does not display correctly, see here
We decided to use python as programming language, and the following libraries and frameworks:
po files to translate the software to other languagesThe (main) application itself does the command line parsing and starts the sub-applications defined below in sequence
To satisfy the system design requirements the following user interface sub-applications were developed:
Each sub-application has detailed architecture documentation covering requirements, implementation status, data flow, components, testing, and recommendations:
frontend_tkinter_connection_selection.py
frontend_tkinter_flightcontroller_info.pybackend_flightcontroller.py - Main facade class using delegation pattern
backend_flightcontroller_connection.py - Connection managementbackend_flightcontroller_params.py - Parameter operationsbackend_flightcontroller_commands.py - Command executionbackend_flightcontroller_files.py - File operationsdata_model_flightcontroller_info.py - FC informationbackend_flightcontroller_protocols.py - Protocol definitionsbackend_mavftp.pyfrontend_tkinter_parameter_editor.py
Each sub-application can be run in isolation, so it is easier to test and develop them.
Each application separates the business logic (data_model_*.py) from the user interface logic (frontend_tkinter_*.py).
This improves testability and maintainability of the code.
data_model_fc_ids.py <- autogenerated by update_flight_controller_ids.pybattery_cell_voltages.pydata_model_vehicle_components_base.pydata_model_vehicle_components_display.pydata_model_vehicle_components_import.pydata_model_vehicle_components_json_schema.pydata_model_vehicle_components_templates.pydata_model_vehicle_components_validation.pydata_model_vehicle_components.pyThe detailed data models, components, and dependencies for each sub-application are documented in their respective architecture files linked above.
All applications use one or more of the following shared libraries:
__init__.pyinternationalization.pyconfiguration_steps_strings.py <- autogenerated by update_configuration_steps_translation.pyvehicle_components.py <- autogenerated by update_vehicle_components_translation.pybackend_flightcontroller.py -
Main facade class that delegates to specialized managersbackend_flightcontroller_connection.py -
Handles connection establishment, port discovery, and heartbeat detectionbackend_flightcontroller_params.py -
Manages parameter download, upload, and queryingbackend_flightcontroller_commands.py -
Executes MAVLink commands (motor tests, battery status, etc.)backend_flightcontroller_files.py -
Handles file upload/download via MAVFTPdata_model_flightcontroller_info.py -
Stores flight controller metadata and capabilitiesbackend_flightcontroller_protocols.py -
Protocol definitions for dependency injection and testingbackend_mavftp.py - MAVFTP protocol implementationFlight Controller Backend Architecture:
FlightController class acts as a facade, delegating operations to specialized managersmaster, comport, info)Error Handling Standards:
To maintain consistency across the flight controller backend, the following error handling patterns are used:
str (empty string on success, error message on failure):
connect(), disconnect(), register_and_try_connect()tuple[bool, str] (success flag, error message):
test_motor(), test_all_motors(), reset_all_parameters_to_default()Optional[T] or raise exceptions:
fetch_param() - raises TimeoutError on timeoutget_battery_status() - returns tuple[Optional[tuple[float, float]], str]download_params() - returns tuple[dict[str, float], ParDict]Testing Hacks and Violations:
The following methods exist for testing purposes only and violate architectural principles:
FlightController.set_master_for_testing() - Directly mutates connection manager’s internal state,
violating the principle that connection manager should be the sole mutator of connection state.
Never use in production code.
Test parameter loading via device="test" in backend_flightcontroller_params.py - Bypasses normal
parameter download flow to load from local file. Marked with FIXME for future removal.
frontend_tkinter_autoresize_combobox.pyfrontend_tkinter_base_window.pyfrontend_tkinter_entry_dynamic.pyfrontend_tkinter_pair_tuple_combobox.pyfrontend_tkinter_progress_window.pyfrontend_tkinter_rich_text.pyfrontend_tkinter_scroll_frame.pyfrontend_tkinter_show.pyfrontend_tkinter_usage_popup_window.pyWhen all is combined it looks like this:

The parts can be individually tested, and do have unit tests. They can also be exchanged, for instance, tkinter-frontend can be replaced with wxWidgets or pyQt.
In the future, we might port the entire application into a client-based web application. That way the users would not need to install the software and will always use the latest version.
Several files in the project are automatically generated and should not be manually edited:
data_model_fc_ids.py <- autogenerated by update_flight_controller_ids.py
configuration_steps_strings.py <- autogenerated by update_configuration_steps_translation.py
vehicle_components.py <- autogenerated by update_vehicle_components_translation.py
generate_codebase_pie_chart.py <- generated by AI assistant for codebase analysis
download_motor_diagrams.py <- autogenerated by .github/instructions/update_motor_diagrams.md
Note: When calculating code metrics or performing codebase analysis, these generated files should be counted separately from hand-written code to provide accurate development statistics.
To assure code quality we decided to use Microsoft VS code with a lot of extensions to lint the code as you type. We use git pre-commit hooks to check the code before it is committed to the repository.
We tested using automated static tests in both pre-commit hooks and on github CI:
We tested using automated dynamic tests on github CI including automated test coverage reports.
We use unittest to write unit tests for the code.
The tests are easy to run on the command line or in VS code.
When you write new code you must also write tests in the tests/ directory, there is CI test that only passes if test coverage increases monotonically.
To run the tests either use the python tests plugin in visualstudio code, or execute:
pytest
The different sub-applications are first tested independently. Each has detailed testing strategies documented in their respective architecture files:
python .\ardupilot_methodic_configurator\data_model_software_updates.pypython .\ardupilot_methodic_configurator\frontend_tkinter_connection_selection.pypython .\ardupilot_methodic_configurator\frontend_tkinter_directory_selection.pypython .\ardupilot_methodic_configurator\frontend_tkinter_template_overview.pypython .\ardupilot_methodic_configurator\frontend_tkinter_component_editor.pypython .\ardupilot_methodic_configurator\frontend_tkinter_parameter_editor.pypython .\ardupilot_methodic_configurator\frontend_tkinter_motor_test.pyOnly after each one performs 100% as expected, they are integrated and tested together. This speeds up the development process.
Here the integrated application was tested against the system requirements defined above. The tests were conducted on windows and Linux machines using multiple different flight controllers and firmware versions. The software is automatically build and distributed using the github CD pipeline.
The software was tested by multiple users with different skill levels, languages, flight controller and backgrounds. The feedback was used to improve the user interface and user experience. The software is ready for production use since November 2024.
The software is feature complete and stable with a user base of hundreds of users, we switched from the V-Model to DevOps development process on November 2024. This provides faster response to requirements changes and additions.

The release process is automated.
To do a release navigate to the bump_version_and_tag workflow
and select Run Workflow enter the version and the description and press the green Run Workflow button.
