Repository navigation
v4.0.0
Overview
- Some C++ API changes
- Stabilized MavlinkDirect and MavlinkDirectServer plugins
- New Python bindings, see how to migrate from MAVSDK-Python.
- New C bindings
- New Kotlin bindings
Thanks to @JonasVautherin for the work on the Python, C, and Kotlin bindings.
What's Changed
- Move to cpp folder by @JonasVautherin in #2763
- Docs: Update broken links and .gitignore for new docs location by @JoC2000 in #2765
- core: add set_callback_executor API for custom callback dispatch by @julianoes in #2769
- Fix: empty mission now return empty by @jazzvaz in #2770
- Shell scripts cleanup by @JoC2000 in #2768
- examples: add speed feedback to logfile_download by @julianoes in #2772
- Fix: setting current mission item by @jazzvaz in #2771
- Add C wrapper to MAVSDK-C++ by @JonasVautherin in #2767
- docs: updates regarding cpp directory by @julianoes in #2774
- Add mavsdk server docker with compose by @jazzvaz in #2773
- Add devcontainer by @jazzvaz in #2775
- ci: remove coverage check by @JonasVautherin in #2780
- build(deps): bump rollup from 4.32.1 to 4.59.0 in /cpp/docs by @dependabot[bot] in #2778
- Fix MAVSDK destructor by @JonasVautherin in #2776
- Run proto check for C wrappers, too by @JonasVautherin in #2779
- c: unsubscribe properly before destroy by @JonasVautherin in #2777
- ci: build cmavsdk with musl by @JonasVautherin in #2781
- ci: add manylinux jobs by @JonasVautherin in #2784
- c: add an option to bundle static runtime (for manylinux builds) by @JonasVautherin in #2786
- ci: remove manylinux2014-aarch64 workaround after fix upstream by @JonasVautherin in #2785
- Add pymavsdk by @JonasVautherin in #2787
- fix: docker compose dockerfile path by @kristiyanpd in #2788
- core: Fix data race in mission transfer WorkItem dtor by @julianoes in #2792
- c: improve cmake install by @JonasVautherin in #2798
- ci: build wheel for windows by @JonasVautherin in #2796
- ci: build a pymavsdk wheel for macOS by @JonasVautherin in #2794
- README: fix logo image path after docs reorganisation by @bansiesta in #2808
- camera: fix InProgress status that is currently translated as Unknown by @JonasVautherin in #2797
- README: add MAVSDK-Go, fix docs source link by @bansiesta in #2809
- system_tests: fix mission cancellation tests to not hang or race by @bansiesta in #2806
- test: add FTP upload throughput timing to FtpUploadBigFile system test by @bansiesta in #2816
- Add timestamp_us to Altitude and GroundTruth telemetry structs by @PavelGuzenfeld in #2801
- ci: cancel in-progress runs on new PR commits by @julianoes in #2819
- docs: fix dependabot vulnerabilities by @julianoes in #2818
- tools: allow build dir to be set by @julianoes in #2817
- mission_raw_server: Fix crash on empty mission upload by @PavelGuzenfeld in #2821
- log_streaming: Guard ardupilotmega-specific messages with #ifdef by @PavelGuzenfeld in #2822
- telemetry: add set_rate_raw_gps by @bansiesta in #2826
- Fixup style in C++, fixup template and white space issue in C by @julianoes in #2829
- Implement download_geofence mirroring download_mission by @PavelGuzenfeld in #2804
- CI: update action versions to prevent warnings by @julianoes in #2805
- Implement set_rate_rc for ArduPilot via SYS_STATUS by @PavelGuzenfeld in #2803
- c/py: add raw connection by @julianoes in #2790
- system_tests: Fix race in mission tests by registering server before connections by @PavelGuzenfeld in #2828
- mocap: Fix MavFrame enum sending wrong values on the wire by @PavelGuzenfeld in #2827
- camera: add xz decompression support for camera definition files by @bansiesta in #2825
- docs: Fix dependabot warnings by @julianoes in #2831
- mocap: wire up reset_counter, estimator_type, quality fields by @alireza787b in #2791
- core: fix MavlinkCommandReceiver calling callbacks while holding mutex by @bansiesta in #2834
- camera: fix stack-smash in CameraDefinitionCompressedXz test by @bansiesta in #2835
- docs: update version references for v4/main after v3 branch-off by @julianoes in #2837
- core: migrate all async I/O and work queues to Asio by @bansiesta in #2810
- cpp: hide symbols by default, export only public API by @julianoes in #2824
- fix: bump mission cancellation test to 10000 items by @bansiesta in #2838
- README: remove coverage badge by @julianoes in #2840
- CI: get jom from qt.io by @julianoes in #2842
- feat: switch to C++20 and adopt fmtlib for logging by @bansiesta in #2815
- test: rename system tests from SystemTest suite to per-plugin suites by @bansiesta in #2843
- refactor: rename all public C++ headers from .h to .hpp by @bansiesta in #2844
- Fix unit test working directory for file-dependent tests by @PavelGuzenfeld in #2847
- fix: close UDP socket from io_context thread to eliminate TSAN data race by @bansiesta in #2846
- fix: reject FTP responses with unexpected seq_number to prevent stale-packet corruption by @bansiesta in #2850
- Update commit for libevents by @JoC2000 in #2854
- Camera FTP download from component id by @jazzvaz in #2851
- fix: hide third-party symbols from libmavsdk.so to prevent clashes by @julianoes in #2856
- Fix data race in MavlinkDirectImpl callback teardown by @PavelGuzenfeld in #2848
- Expose full HOME_POSITION fields in subscribe_home by @PavelGuzenfeld in #2839
- refactor: use asio::post for internal-only deferred work instead of call_user_callback by @bansiesta in #2860
- refactor: rename mavsdk_export.hpp to mavsdk_export.h for C compatibility by @bansiesta in #2861
- fix: bump libmavlike to add MAVLink v1 support in BufferParser by @bansiesta in #2864
- Gimbal manager by @jazzvaz in #2858
- fix: eliminate TSAN races in MavlinkDirectImpl subscribe/deinit by @bansiesta in #2869
- fix: tolerate transient EOF on serial async_read_some by @julianoes in #2874
- example: add statustext_hello to show all StatusTextType severity levels by @bansiesta in #2872
- feat(core): expose math_utils helpers in public headers by @g-ampo in #2873
- Add telemetry fields from api ref to overview by @irowebbn in #2875
- core: fix UAF in unregister_all_blocking when registrations were deferred by @bansiesta in #2876
- fix: only announce gimbal after device info or attitude status received by @bansiesta in #2868
- feat: add start/stop_tlog_recording() to Mavsdk by @bansiesta in #2870
- Add upload_mission_with_progress_async for mission_raw class by @JoC2000 in #2879
- fix(mavlink_passthrough): export operator<< for Result with MAVSDK_PUBLIC by @evanofficial in #2881
- telemetry: add energy_consumed_wh to Battery by @bansiesta in #2882
- Revert "telemetry: add energy_consumed_wh to Battery (#2882)" by @bansiesta in #2883
- Action: add set_home by @bansiesta in #2886
- info: update to remove GetFlightInformation, keep SubscribeFlightInformation by @bansiesta in #2887
- Time sync API in Python wrappers by @TeisybeLT in #2888
- Expose MavLink forwarding options in Python wrappers by @TeisybeLT in #2890
- camera_server: fix deadlock between send_capture_status and send_tracking_status_with_interval by @bansiesta in #2893
- core/ftp: add ls with time by @julianoes in #2891
- ci: update Windows CI to Visual Studio 18 2026 by @bansiesta in #2900
- core: fix deleting of callback on rapid requests of messages by @gisleandre in #2894
- core: fix Android cache directory path null byte handling by @rkganeri in #2899
- build(deps): bump postcss from 8.5.1 to 8.5.15 in /cpp/docs by @dependabot[bot] in #2901
- refactor: move docs from cpp/docs/ to docs/ at repo root by @bansiesta in #2845
- Join sending_tracking_status thread before destruction by @JoC2000 in #2912
- docs: fix takeoff_and_land build dir path in quickstart by @iacker in #2914
- core: notify param value changes on every used protocol by @julianoes in #2915
- param_server: allow updating an already-provided param after lockdown by @julianoes in #2916
- core: change log output from stdout to stderr by @bansiesta in #2910
- Add MavlinkDirectServer plugin by @julianoes in #2911
- core: move hand-rolled thread-safety to the asio executor model by @julianoes in #2903
- gimbal: wait for device info before announcing gimbal by @julianoes in #2920
- mavlink_direct: fix setting target_component by @julianoes in #2919
- core: switch JSON library from jsoncpp to nlohmann/json by @julianoes in #2918
- docs: fix issues from MAVSDK-docs tracker by @bansiesta in #2922
- docs: fix Mission API reference links and messages typo by @Bartok9 in #2924
- docs: align toolchain and code style with C++20 library by @Bartok9 in #2923
- core: deprecate old MAVLink interception API and MavlinkPassthrough for v4 by @bansiesta in #2917
- core: fix buffer overflows, deadlocks, and races in core by @julianoes in #2925
- gimbal: correlate device messages to the right manager by @julianoes in #2926
- examples: add gimbal_manager example by @julianoes in #2921
- docs: note C++20 library dialect in FAQ C++ rationale by @Bartok9 in #2934
- docs: update PX4 default UDP ports link in connections guide by @Bartok9 in #2933
- docs: update C++ quickstart PX4 SITL setup URL to main by @Bartok9 in #2932
- docs: point Python quickstart SITL links at current PX4 main docs by @Bartok9 in #2931
- examples: fix separate/receive typos in autopilot_server comments by @Bartok9 in #2930
- core: fix teardown use-after-free in MavlinkDirect libmav callback by @julianoes in #2935
- examples: add gimbal_device example by @julianoes in #2928
- core, plugins: capitalize log message casing by @julianoes in #2929
- offboard: give watchdog grace period from when setpoints start by @julianoes in #2927
- docs: fix unbalanced parenthesis in cruise speed section by @Bartok9 in #2937
- docs: remove duplicated word in system information guide by @Bartok9 in #2939
- docs: fix misplaced parenthesis in connections ground station note by @Bartok9 in #2938
- examples: fix coming typo in distance_sensor comment by @Bartok9 in #2940
- core: document dedicated-io-thread invariant for CallbackList by @julianoes in #2950
- docs: modernize PX4 tree name and QGC install link in examples index by @Bartok9 in #2941
- test(core): extend Ringbuffer empty, single, and wrap index coverage by @Bartok9 in #2977
- test(core): extend base64 encode/decode edge coverage by @Bartok9 in #2973
- test(core): cover NaN-aware Quaternion and EulerAngle equality by @Bartok9 in #2976
- test(core): assert mavlink channel pool restarts after full release by @Bartok9 in #2981
- test(core): add Crc32 unit coverage for MAVLink polynomial by @Bartok9 in #2974
- test(core): add geometry identity and pure-north projection cases by @Bartok9 in #2975
- test(core): extend ParamValue equality for float/double kinds by @Bartok9 in #2982
- test(core): cover string_utils full-match and longer-prefix edges by @Bartok9 in #2980
- docs(swift): use HTTPS for Swift API documentation link by @Bartok9 in #2979
- test(core): cli_arg max port and tcp trailing garbage edges by @Bartok9 in #2991
- test(core): hostname_to_ip private dotted and whitespace edges by @Bartok9 in #2988
- test(core): ParamValue typestr needs_extended and get_string by @Bartok9 in #2990
- test(core): cover flight_mode PX4 and ArduPilot mappings by @Bartok9 in #2984
- test(core): TimeoutHandler remove-all during callback stress by @Bartok9 in #2992
- test(core): crc32 multi-chunk 256-byte vector matches oneshot by @Bartok9 in #2993
- test(core): quaternion identity multiply and zero euler roundtrip by @Bartok9 in #2989
- test(core): geometry pure-east offset and small SE roundtrip by @Bartok9 in #2986
- examples: migrate MavlinkPassthrough to MavlinkDirect by @bansiesta in #2983
- docs: consolidate small docs fixes (links, HTTPS, paths) by @Bartok9 in #2972
- test(core): cover replace_non_ascii_and_whitespace by @Bartok9 in #2985
- test(core): cover ParamValue XML set and typed getters by @Bartok9 in #3001
- proto: update for docs updates by @julianoes in #3005
- test(core): cover ConnectionResult to_string mapping by @Bartok9 in #2987
- test(core): consolidate unit coverage and param_id clamp by @Bartok9 in #3004
- test(core): cover remaining Ardu flight modes and VTOL dispatch by @Bartok9 in #3000
- camera_server: Add CAMERA_FOV_STATUS request support by @bansiesta in #2994
- examples: add DO_REPOSITION with terrain following by @julianoes in #2878
- fix(core): restore param_value_xml unit test registration by @Bartok9 in #3008
- test(core): cover ParamValue extended types and equality by @Bartok9 in #3015
- test(core): cover MavlinkMessageHandler register and filters by @Bartok9 in #3014
- test(core): cover TimeoutHandler unknown remove and post-fire refresh by @Bartok9 in #3016
- CI: fix GitHub regression by @JonasVautherin in #3024
- py: fix deallocation bugs by @JonasVautherin in #3023
- build(deps): bump postcss from 8.5.15 to 8.5.25 in /docs by @dependabot[bot] in #3025
- camera_server_impl: Send CAMERA_IMAGE_CAPTURED with fail result on busy or fail by @jnomikos in #3022
- Various python fixes by @JonasVautherin in #3026
- Add jni and kotlin implementations by @JonasVautherin in #3021
- kt: improve example Android app by @JonasVautherin in #3027
- kt: publish snapshot to maven when merging to main branch by @JonasVautherin in #3028
- kt: remove ios example by @JonasVautherin in #3029
- mavsdk_server: fix Android CI build by @JonasVautherin in #3030
- feat(core): add heartbeat watchdog (deadman timer) (#2895) by @tpayne-censystech in #2905
- core: add possible "unknown" value for param count by @JoC2000 in #3033
- examples: port log_streaming to subscribe_incoming_messages_json by @bansiesta in #3032
- test(core): cover CompatibilityMode stream labels by @Bartok9 in #3009
- test(core): cover HandleFactory unique ids and convert by @Bartok9 in #3010
- test(core): cover remaining Vehicle MAV_TYPE mappings by @Bartok9 in #3011
- test(core): cover Configuration component type defaults by @Bartok9 in #3012
- test(core): cover cache directory path and tmp dir create by @Bartok9 in #3013
- ci(linux): retry dockcross image pull to handle registry flakiness by @bansiesta in #3035
- fix(system_tests): avoid TSAN data race in Camera.ListCameras by @bansiesta in #3034
- test(core): cover overloaded visitor helper by @Bartok9 in #3017
- examples: make gimbal_manager more verbose by @julianoes in #3036
- examples: fixup frames in gimbal_manager by @julianoes in #3039
- Action: add GotoLocationFixedwing by @bansiesta in #3038
- docs(python): add a migration page for the mavsdk package rename by @julianoes in #3006
- camera_server & camera: SET_CAMERA_FOCUS support by @jnomikos in #3040
- Fix Android build with recent symbol visibility changes by @JonasVautherin in #3043
- core: send asynchronously instead of blocking the io thread by @julianoes in #3047
- core: resolve TCP client hostnames asynchronously by @julianoes in #3048
- core: make timer removal actually stop the callback by @julianoes in #3049
- core: keep every receive path on the io thread by @julianoes in #3050
- core: replace the FTP burst thread with a timer chain by @julianoes in #3051
- core: arm the timer poll for the next deadline instead of ticking by @julianoes in #3052
- core: drive the work queues from events instead of polling by @julianoes in #3054
- core: stop the io thread calling into plugins user code is destroying by @julianoes in #3056
- core: abort with an explanation when something outlives its Mavsdk by @julianoes in #3057
- core: deliver the first heartbeat to the system it just created by @julianoes in #3058
- core: never drop the user callbacks somebody is waiting for by @julianoes in #3059
- system_tests: stop the watchdog race test burying the log by @julianoes in #3060
- core: fix the race on the log callback by @julianoes in #3061
- CI: print a symbolized backtrace for core dumps from failing tests by @julianoes in #3055
- Run the tests on Windows CI by @julianoes in #3065
- Handle unicode filenames in FTP by @julianoes in #3064
- examples: add camera settings with xml definition by @julianoes in #3066
- core: slow down FTP burst by @julianoes in #3067
- Bound the decompressed size of an .xz camera definition by @nicholasaleks in #3074
- build(deps): bump nanoid from 3.3.16 to 3.3.19 in /docs by @dependabot[bot] in #3075
- core: fix CopterMode AvoidAdsb typo by @Bartok9 in #3072
- Add AGENTS.md by @julianoes in #3079
- CI: drop Debian 11 by @julianoes in #3080
- ftp_server: document that symlinks in the root are followed by @julianoes in #3070
- core: fix FTP path traversal via shared-prefix sibling dir by @julianoes in #3069
- examples: show how to implement UDP outside of MAVSDK by @julianoes in #3068
- fix: correct UTF-8 filename handling for FTP server on Windows by @bansiesta in #3081
- Reduce a vehicle-supplied camera definition path to a file name by @nicholasaleks in #3073
- telemetry: map ODOMETRY frame ids by name instead of casting by @julianoes in #3076
- test: fix flaky Connections.TcpConnectionReconnectionFromServerSide by @bansiesta in #3083
- generate: emit proto enum numbers in every binding by @julianoes in #3078
- system_tests: parse raw bytes with our own buffers in RawBytes test by @julianoes in #3086
- system_tests: don't let late callbacks write to destroyed state by @julianoes in #3085
- Reserve sysid API for 32 bits by @julianoes in #3082
- ci: reduce and fix the third_party build caches by @julianoes in #3092
- ci: only save third_party caches on main by @julianoes in #3093
- generate: fix repeated/message param handling in Python binding templates by @bansiesta in #3088
- py: add end-to-end mission upload system tests by @bansiesta in #3089
- fix unsubscribe after destroy in the C bindings by @bansiesta in #3090
- shell: allow selecting SERIAL_CONTROL device by @Bartok9 in #3042
- core/ftp: apply the seq check to burst gap-fill reads by @julianoes in #3094
- examples: switch to Hold before arming by @julianoes in #3099
- examples: wait for a connected autopilot by @julianoes in #3098
- core: unregister mission work items on the io thread by @bansiesta in #3100
- ci: upload Windows archives from their actual directory by @YoussGm3o8 in #3104
- py: ship the asyncio wrapper inside mavsdk and prepare PyPI publishing by @julianoes in #3007
- build: use the pinned MAVLink generator on desktop and iOS by @YoussGm3o8 in #3102
- py: raise a typed error per plugin by @julianoes in #3096
- v4: C++ migration docs, MAVLink C headers opt-in by @julianoes in #3097
- geofence: validate geometry before starting mission transfer by @YoussGm3o8 in #3103
- core: match request message results to the request that sent them by @bansiesta in #3105
- core: make FTP downloads survive a bad link by @julianoes in #3106
- examples: make gimbal_manager refuse setpoints without control by @julianoes in #3107
- docs: get the docs ready for the v4.0.0 release by @julianoes in #3109
- docs: title the v4 branch docs as v4 by @julianoes in #3110
New Contributors
- @jazzvaz made their first contribution in #2770
- @kristiyanpd made their first contribution in #2788
- @PavelGuzenfeld made their first contribution in #2801
- @g-ampo made their first contribution in #2873
- @irowebbn made their first contribution in #2875
- @evanofficial made their first contribution in #2881
- @TeisybeLT made their first contribution in #2888
- @gisleandre made their first contribution in #2894
- @rkganeri made their first contribution in #2899
- @iacker made their first contribution in #2914
- @Bartok9 made their first contribution in #2924
- @tpayne-censystech made their first contribution in #2905
- @nicholasaleks made their first contribution in #3074
- @YoussGm3o8 made their first contribution in #3104
Full Changelog: v3.15.0...v4.0.0