You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何接收Foxglove Server发布的自定义Protobuf消息并保存为MCAP?

自定义Protobuf转MCAP方案可行性及通用方法

方案可行性

完全可行。Foxglove原生支持MCAP格式的录制与回放,且对自定义Protobuf消息有完善的兼容——只要确保Foxglove或MCAP工具能获取到你的Protobuf定义文件,就能正确解析并保存消息到MCAP文件中。

通用转存方法

方法1:Foxglove Desktop 一键录制(最简便)

  • 打开Foxglove Desktop,连接到你的本地Foxglove Server(填入对应的WebSocket地址,比如ws://localhost:8765)
  • 在左侧工具栏点击「Record」按钮,选择MCAP文件保存路径后开始录制
  • 关键前提:在Foxglove的「Settings」→「Protobuf」面板中添加你的自定义.proto文件(包括所有依赖的proto文件),确保消息能被正确识别
  • 录制完成后,直接在Foxglove中打开生成的MCAP文件即可回放

方法2:服务器端嵌入MCAP C++ SDK录制(适合环境受限场景)

如果服务器装MCAP CLI工具遇环境问题,可直接将MCAP写入逻辑嵌入到你的C++服务代码中:

  1. 通过CMake集成MCAP C++ SDK(无需全局安装MCAP工具,直接依赖源码或静态库)
  2. 初始化MCAP Writer,注册自定义Protobuf消息的通道与schema
  3. 处理完消息后,将序列化后的Protobuf数据写入MCAP文件
  4. 程序退出前关闭Writer,保证文件完整性

简化代码示例:

#include <mcap/writer.hpp>
#include "your_custom_msg.pb.h"

int main() {
    // 初始化MCAP Writer
    mcap::Writer writer;
    const auto openStatus = writer.open("server_output.mcap");
    if (!openStatus.ok()) {
        // 处理文件打开错误
        return 1;
    }

    // 注册自定义Protobuf通道
    your_custom_msg::YourMessage sampleMsg;
    const std::string protoSchema = sampleMsg.GetDescriptor()->file()->DebugString();
    const mcap::Channel channel{
        .topic = "/your/topic/path",
        .messageEncoding = "protobuf",
        .schemaName = sampleMsg.GetDescriptor()->full_name(),
        .schemaEncoding = "protobuf",
        .schemaData = protoSchema
    };
    const auto channelId = writer.addChannel(channel);

    // 业务循环:处理并写入消息
    while (true) {
        // 你的消息处理逻辑
        your_custom_msg::YourMessage processedMsg = processIncomingData();
        
        // 序列化Protobuf消息
        std::string serialized;
        processedMsg.SerializeToString(&serialized);
        
        // 写入MCAP
        const mcap::Message mcapMsg{
            .channelId = channelId,
            .data = reinterpret_cast<const uint8_t*>(serialized.data()),
            .dataSize = serialized.size(),
            .logTime = std::chrono::duration_cast<std::chrono::nanoseconds>(
                std::chrono::system_clock::now().time_since_epoch()
            ).count(),
            .publishTime = mcap::TimestampNow()
        };
        writer.writeMessage(mcapMsg);
    }

    // 关闭Writer
    writer.close();
    return 0;
}

方法3:本地MCAP CLI 录制WebSocket流

如果本地环境允许,用MCAP官方命令行工具直接捕获WebSocket消息:

  1. 本地安装MCAP CLI(可通过包管理器或二进制文件安装,环境依赖比服务器端宽松)
  2. 执行录制命令,指定WebSocket端点与输出文件:
# 基础录制
mcap record -i ws://localhost:YOUR_FOXGLOVE_PORT -o local_recording.mcap

# 指定自定义Protobuf定义文件(若消息未携带schema)
mcap record -i ws://localhost:YOUR_FOXGLOVE_PORT --proto ./your_custom.proto -o local_recording.mcap

注意事项

  • 自定义Protobuf需提供完整定义:包括所有嵌套消息、枚举及依赖的proto文件,否则MCAP无法解析
  • 回放时需在Foxglove中加载相同的proto文件,否则会显示原始二进制数据
  • 若服务器环境受限(如无网络、无法安装依赖),优先选择方法1或方法2

内容的提问来源于stack exchange,提问作者iif eve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:48:12