如何接收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++服务代码中:
- 通过CMake集成MCAP C++ SDK(无需全局安装MCAP工具,直接依赖源码或静态库)
- 初始化MCAP Writer,注册自定义Protobuf消息的通道与schema
- 处理完消息后,将序列化后的Protobuf数据写入MCAP文件
- 程序退出前关闭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消息:
- 本地安装MCAP CLI(可通过包管理器或二进制文件安装,环境依赖比服务器端宽松)
- 执行录制命令,指定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
相关产品推荐
相关产品推荐

