我的智驾数据可视化之路

2025年7月6日 · 1435 字 · 3 分钟 · 自动驾驶 可视化

最近在整理以前的资料,发现曾经为数据可视化做过蛮多努力,最终也找到了一套自己体系里的可视化方案。现在回顾一下整个过程,有能帮助到别人的也挺好。

Matplotlib-cpp

Python 下的数据可视化工具繁多,但 C++ 下简易的可视化工具却并没有几个。如果想进行 C++ 框架下的数据可视化,一个常规的思路是将数据写入 log 文件中后用 Python 脚本解析,但想要实现实时数据的可视化便不是那么容易。之前偶然发现了 matplotlib-cpp 库,大呼这就是我想要的,有几个很明显的优势:

  • 纯头文件实现,很容易集成到自己项目中;
  • 可视化实现简单,基本能与 Python 中使用一致;
  • 可视化类型多样,2D曲线、箭头和3D曲面绘制都OK。

于是我在项目 EM Planner 出版中就使用该库做一些简单可视化,已经满足了基本需求:

数据可视化

PyQt + Pyqtgraph

虽然 C++ 下面的可视化解决了,但是我的折腾之心不死,想要追求一套统一的可视化方案,希望能做到无论是什么语言都能实现一套可视化方法,且不依赖 ROS 现有的通信框架。基于这个理念,我的可视化方方案选型就确定了:

  1. protobuf 作为数据存储协议,因为其支持 C++, C#, Go 和 Python 等多种语言,可以直接将基础可视化数据定义为 proto,各种不同语言的项目按照自定义的 proto 格式进行可视化数据的生成。
  2. Grpc 高性能的 RPC(Remote Procedure Call) 框架,原生采用 protobuf 作为通信协议,作为客户端与服务端的通信方式。
  3. PyQt 作为服务端的 GUI 界面, 添加可视化面板以及一系列功能组件的可视化,例如暂停,导出等。
  4. Pyqtgraph 作为服务端的数据可视化实现库,可视化类型多种多样,而且很方便与 PyQt 进行集成,实时性与大规模数据的处理性能都优于 Matplotlib。

基于以上工具,初步实现了一个绘图服务端,简陋但也高效:

  • Python Client Python

  • Cpp Client cpp

戏剧化的是,这个项目开发完成之日,也就是他的寿命终止之时。因为出现了满足我一切需求的完美工具:foxglove。

Foxglove

在 ROS 的入门学习阶段,基本上是 gazebo 作为仿真器,rviz 作为可视化工具。但 rviz 的使用有较多局限,最典型的是数据分析工具少,二次开发难度大,想要开多个 3D panel 都无法实现。而 foxglove 是一个更现代的可视化框架,优点包括:

  • 不依赖 ROS,可作为常规可视化工具,但又支持 ROS 通信,可以无痛从 Rviz 迁移。
  • 功能强大,模块化 Panel。支持 3D、表格、topic message 以及图像等 panel,且 panel 可重复创建放置,自由度极高。
  • 自定义数据支持 Json、Protobuf 和 Flatbuffers,已经定义好对应协议的基础 Schema,按照约定结构写入数据即可。
  • 不仅支持实时数据的可视化,还可对 Ros bag 或 MACP 等格式的本地数据进行交互式播放。

以上的这些功能已经很好的支持了我的需求,可以说这就是我想要的可视化工具。因此放弃了造轮子,投入了 foxglove 社区的怀抱,这里放一张官网宣传图:

foxglove

对于我自己不依赖 ROS 的数据,我尝试过两种 foxglove 的使用方法:

Foxglove WebSocket 实时数据

通过 WebSocket 将自定义的数据实时发送到 foxglove 进行解析可视化,配置也十分简单,社区有大量实现案例,也可参考我的简单 demo 。但我这里不想使用官方配饰的 docker 环境,于是在本地配置了对应的 protobuffer 等依赖库,这一步骤较为麻烦,所以还是直接使用官方镜像来的方便简单。

MCAP 本地数据

平时分析问题其实很少通过实时数据进行,大多数是通过重播 bag 来逐帧分析。因此将数据写入本地文件,再通过可视化软件重播的实用性更强。这里我的项目仍然不依赖 ROS,所以也并没有将数据写入为 ros bag 的形式,而是采用 MCAP 格式保存,参考简易 demo ,实现的效果如图:

emplanner-foxglove

总结

目前 foxglove 已经是我的主力可视化工具,无论是 ROS 相关的开发,还是非 ROS 的实现都高度依赖它。这个工具也在高速迭代中,可以 follow X 上面的官号去发现更多好玩功能。我的可视化折腾之路也就收官于此,写下此文来纪念那些造轮子的日子。