MissionPlanner架构梳理之(十七)插件系统

MissionPlanner插件系统解析

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 管理的几个关键阶段组成:

  1. 编译:插件源文件在运行时动态编译
  2. 初始化Init()调用该方法设置插件
  3. Loading:如果初始化成功,Loaded()则调用该方法
  4. 执行:该Loop()方法在插件线程中定期调用
  5. 清理:当 Mission Planner 关闭时,该Exit()方法被调用

创建插件

要为 Mission Planner 创建插件:

  1. plugins在目录中创建一个新的.cs文件
  2. 定义一个继承自MissionPlanner.Plugin.Plugin
  3. 实现所需的方法:Init()、、和Loaded()Loop()Exit()
  4. 使用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 开发插件时,请遵循以下最佳实践:

  1. 错误处理:使用 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 的集成。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值