Foxglove Extensions 概述
简介
Foxglove Extensions(扩展)允许您扩展Foxglove的功能,以更好地支持团队的独特工作流程。通过扩展,您可以构建定制面板、转换自定义消息为Foxglove支持的模式,以及为主题名称创建别名以便于可视化。
扩展类型
1. 自定义面板(Custom Panels)
虽然Foxglove提供了一套用于机器人数据可视化和调试的内置面板,但许多用户有特定领域的需求,这些需求无法通过现成的产品来满足。
特点:
- 允许您构建完整的面板
- 可以订阅各种主题上的消息
- 支持广告和发布功能
- 以最适合您工作流程的形式显示消息信息
适用场景:
当您的可视化或交互需求是定制的,且无法通过内置面板轻松解决时,自定义面板是理想选择。
2. 消息转换器(Message Converters)
消息转换器扩展允许您将消息从一种形式转换为另一种形式。有两种类型的转换器:
Schema转换器
- 功能: 将消息从一个模式转换为另一个模式
- 适用场景: 当某个内部模式与知名Foxglove模式之间存在1:1关系时
- 示例: 将自定义GPS消息转换为foxglove.LocationFix以在地图面板中可视化
- 转换类型: 1:1模式映射
- 输入源: 任何模式
- 状态处理: 无状态
- 输出: 知名模式
Topic转换器
- 功能: 从一个或多个输入主题生成新主题
- 特点: 比schema转换器更灵活,但实现面积更大
- 转换类型: 任意主题生成
- 输入源: 一个或多个特定主题
- 状态处理: 支持有状态
- 输出: 自定义或知名模式
重要提示: 消息转换器仅在面板订阅主题时按需运行。
3. 主题别名(Topic Aliases)
主题别名扩展允许您为数据源中的主题创建别名到新主题。Foxglove面板可以同时订阅别名主题和原始数据源的主题。
编写扩展
技术要求
- 语言支持: JavaScript或TypeScript
- 打包格式: .foxe文件
- 分发方式: 私有分发给您的Foxglove组织或通过注册表公开发布
- Node.js版本: 14+
快速开始
-
创建扩展项目:
npm init foxglove-extension@latest my-extension-name
-
项目结构:
- 入口点:
index.ts
文件 - 必须导出:
ExtensionModule
(包含单个activate函数) - activate函数接受:单个
ExtensionContext
参数
- 入口点:
基本结构示例
import { ExtensionContext } from "@foxglove/extension";
export function activate(extensionContext: ExtensionContext) {
// 注册面板
extensionContext.registerPanel({
name: "my-panel",
initPanel: initMyPanel
});
// 注册消息转换器
extensionContext.registerMessageConverter({
type: "schema",
fromSchemaName: "custom.Message",
toSchemaName: "foxglove.Message",
converter: (inputMessage, messageEvent) => {
// 转换逻辑
return convertedMessage;
}
});
// 注册主题别名
extensionContext.registerTopicAliases((args) => {
// 别名逻辑
return aliases;
});
}
安装和使用
开发环境
- 开发完成后,运行
npm run local-install
安装到本地 - 重启Foxglove桌面应用
- 在应用设置中查看已安装的扩展
生产环境
- 运行
npm run package
生成.foxe文件 - 通过拖拽方式安装到Foxglove
- 或通过组织注册表分发
最佳实践
-
性能优化:
- 最小化对过去消息数据的引用
- 设置数据存储的最大限制
- 及时解除大对象引用以确保垃圾回收
- 避免在全局作用域存储数据
-
内存管理:
- 面板通常处理60fps或更高频率的连续数据流
- 注意内存泄漏问题,可能导致OOM错误
- 合理管理消息数据聚合
-
代码组织:
- 单个扩展可包含多个面板或转换器
- 共享代码和依赖项可减少文件大小
- 考虑禁用源码映射以减少安装时间
相关资源
- API参考: ExtensionContext, @foxglove/extension
- 示例项目: create-foxglove-extension模板
- 社区支持: Discord或官方支持渠道
下一步
- 查看本地开发文档了解开发流程
- 阅读发布扩展文档了解分发方式
- 参考创建自定义面板指南开始实践
- 学习消息转换器创建方法
- 了解性能优化技巧