Skip to main content

创建消息转换器

构建一个简单的消息转换器,用于将自定义 GPS 消息转换为符合 foxglove.LocationFix 架构的消息,以便在可视化的地图面板中可视化。

设置

在终端窗口中,cd 到您的源代码所在的目录,然后运行以下命令:

npm init coscene-extension@latest myExtensionName

这将使用 create-coscene-extension 创建一个 myExtensionName 目录,其中包含示例消息转换器的源代码。

注册转换器

项目 src 文件夹中的 index.ts 文件是扩展源代码的入口点。它必须导出一个 activate 函数,该函数接受一个类型为 ExtensionContext 的 extensionContext 参数。

要注册消息转换器,我们在 extensionContext 参数上调用 registerMessageConverter,并传入三个参数:源架构类型、目标架构类型和实际的 converter 函数。

import { MessageEvent } from "@coscene/extension";

export function activate(extensionContext: ExtensionContext) {
extensionContext.registerMessageConverter({
fromSchemaName: "...",
toSchemaName: "...",
converter: (inputMessage: MyInputType, messageEvent: MessageEvent<MyInputType>) => {
// ...
},
});
}

converter 函数接受两个参数 – 输入主题消息和完整的消息事件。消息事件可用于访问其他相关信息 – 如消息的 publishTimereceiveTimetopic 名称。

编写转换器

假设我们的数据包含类型为 sensors.MyGps 的 GPS 消息,其中包含 latlon 字段。

type MyGps = {
lat: number;
lon: number;
};

要可视化 GPS 坐标,地图面板需要符合 foxglove.LocationFix 格式的消息。简而言之,我们的转换器需要将 MyGps 消息转换为符合 foxglove.LocationFix 架构的消息。

首先,指定 from 架构(sensors.MyGps)和 to 架构(foxglove.LocationFix),以告知可视化, 我们注册的转换器将把 sensors.MyGps 消息转换为 foxglove.LocationFix 消息。

然后,编写 converter 函数。在我们的示例中,我们将 latlon 字段重新映射到 foxglove.LocationFix 架构期望的 latitudelongitude 字段:

export function activate(extensionContext: ExtensionContext) {
extensionContext.registerMessageConverter({
fromSchemaName: "sensors.MyGps",
toSchemaName: "foxglove.LocationFix",
converter: (myGps: MyGps, messageEvent: MessageEvent<MyGps>) => {
return {
latitude: myGps.lat,
longitude: myGps.lon,
};
},
});
}

测试

一旦我们打包并安装了扩展,在可视化中加载任何包含 sensors.MyGps 消息的数据源,并通过点击架构下拉菜单并选择您作为 toSchema 返回的输出架构,在地图面板或原始消息面板中可视化它们。

注意

消息转换器仅在面板订阅主题时按需运行。