Mission Planner 插件系统提供了一种强大的方法,无需修改核心代码库即可扩展 Mission Planner 的功能。本文档介绍了如何创建、使用和管理 Mission Planner 的插件。
目的和范围
本文档介绍了插件的架构、开发流程以及可供希望通过自定义功能扩展 Mission Planner 的开发人员使用的功能。它详细介绍了插件的生命周期、与 Mission Planner 的接口,以及使用插件可以实现的功能示例。
插件架构概述
Mission Planner 插件系统采用简单而灵活的架构,允许开发人员使用 C# 编写插件来访问 Mission Planner 的大部分功能。

插件实现细节
插件系统基于一个抽象Plugin类,所有插件都必须继承自该类。插件以单独的 C# 源文件形式编写,并放置在plugins目录中。这些文件在运行时编译,无需重新编译 Mission Planner 即可动态加载。

插件实现细节
插件系统基于一个抽象Plugin类,所有插件都必须继承自该类。插件以单独的 C# 源文件形式编写,并放置在plugins目录中。这些文件在运行时编译,无需重新编译 Mission Planner 即可动态加载。

插件生命周期
插件生命周期由 Mission Planner 管理的几个关键阶段组成:

- 编译:插件源文件在运行时动态编译
- 初始化:
Init()调用该方法设置插件 - Loading:如果初始化成功,
Loaded()则调用该方法 - 执行:该
Loop()方法在插件线程中定期调用 - 清理:当 Mission Planner 关闭时,该
Exit()方法被调用
创建插件
要为 Mission Planner 创建插件:
plugins在目录中创建一个新的.cs文件- 定义一个继承自
MissionPlanner.Plugin.Plugin - 实现所需的方法:
Init()、、和Loaded()Loop()Exit() - 使用
Host属性访问任务规划器功能
这是一个基本的插件模板:
using System;
using MissionPlanner.Plugin;
namespace MyNamespace
{
public class MyPlugin : Plugin
{
public override bool Init()
{
// Initialize your plugin
return true; // Return true to continue loading
}
public override bool Loaded()
{
// Called after successful initialization
// Set up UI elements, event handlers, etc.
return true; // Return true to indicate successful loading
}
public override bool Loop()
{
// Called periodically in the plugin thread
// Perform background processing
return true; // Return true to continue looping
}
public override bool Exit()
{
// Clean up resources
return true; // Return true to indicate successful unloading
}
}
}
插件功能
插件可以通过该属性访问 Mission Planner 的大部分功能Host。以下是一些常见的功能:
UI 定制
插件可以添加和删除菜单项、创建自定义表单以及修改用户界面:
// Add a menu item
Host.MainForm.MenuAdd("Tools", "My Custom Function", MyCustomFunction);
// Remove a menu item
Host.MainForm.MenuRemove("Tools", "My Custom Function");
车辆数据访问
插件可以访问车辆遥测数据和参数:
// Access current altitude
var altitude = Host.comPort.MAV.cs.Alt;
// Access current latitude and longitude
var latitude = Host.comPort.MAV.cs.lat;
var longitude = Host.comPort.MAV.cs.lng;
// Access vehicle parameters
var param = Host.comPort.getParam("FLTMODE1");
地图交互
插件可以向地图添加自定义标记、多边形和覆盖层:
// Add a marker to the map
var marker = new GMapMarker(new PointLatLng(latitude, longitude));
Host.FDMenuMap.Markers.Add(marker);
硬件集成
插件可以与外部硬件和系统接口:
// Example from the HereLink plugin
var process = new Process();
process.StartInfo.FileName = "adb";
process.StartInfo.Arguments = "shell am start -n org.mavlink.qgroundcontrol/org.mavlink.qgroundcontrol.QGCActivity";
process.Start();
持久存储
插件可以持久存储设置:
// Save a setting
Settings.Instance["MyPluginSetting"] = "MyValue";
// Retrieve a setting
var mySetting = Settings.Instance["MyPluginSetting"];
示例插件
Mission Planner 包含许多示例插件,展示了各种功能:
| 插件文件名 | 功能演示 |
|---|---|
| example2-menu.cs | 向 UI 添加自定义菜单项 |
| 示例3-fencedist.cs | 计算到地理围栏边界的距离 |
| example4-herelink.cs | 与 HereLink 相机系统接口 |
| example5-latencytracker.cs | 监控通信延迟 |
| 示例6-mapicondesc.cs | 向地图添加自定义图标 |
| 示例7-canrtcm.cs | 与 CAN 总线设备接口 |
| example8-modechange.cs | 响应车辆模式变化 |
| 示例9-hudonoff.cs | 切换HUD可见性 |
| example12-forwarding.cs | 将遥测数据转发到外部系统 |
| example21-persistentsimple.cs | 演示持久设置存储 |
这些示例插件可作为开发您自己的插件的宝贵模板。
插件开发最佳实践
在为 Mission Planner 开发插件时,请遵循以下最佳实践:
-
错误处理:使用 try-catch 块来防止异常影响 Mission Planner。
try {
// Your code here
} catch (Exception ex) {
Console.WriteLine($"Plugin error: {ex.Message}");
}
2. 线程安全Host.BeginInvoke():从插件线程修改 UI 元素时使用。
Host.BeginInvoke((Action)(() => {
// UI modification code here
}));
3. 资源管理:始终在方法中清理资源Exit()。
public override bool Exit()
{
// Dispose resources, unregister event handlers, etc.
return true;
}
4. 性能:避免在Loop()方法中阻塞操作,因为它们会影响其他插件。
public override bool Loop()
{
// Perform quick operations or start async tasks
return true;
}
5.设置:使用 Mission Planner 的设置系统进行持久存储。
// Use a unique prefix for your plugin settings
Settings.Instance["MyPlugin_Setting1"] = value;
与任务规划器集成
插件系统与 Mission Planner 深度集成,在主应用程序管理的专用线程中运行:

插件可以通过该Host属性访问 Mission Planner 的大部分功能,从而允许它们:
- 访问车辆遥测数据
- 修改用户界面
- 与地图和 3D 视图交互
- 处理和分析数据
- 与外部系统的接口
结论
Mission Planner 插件系统提供了一种强大的方法来扩展和定制 Mission Planner,以满足您的特定需求。通过遵循示例插件中演示的模式并遵循最佳实践,您可以创建强大的插件来增强 Mission Planner 的功能。
插件架构在简单性和强大性之间取得平衡,允许开发人员专注于实现其特定功能,而插件系统则负责处理与 Mission Planner 的集成。
MissionPlanner插件系统解析
889

被折叠的 条评论
为什么被折叠?



