6.1. Foxglove可视化分析

6.1.1. 概述

Foxglove是一种用于ROS的可视化工具,起源于前Cruise员工基于Webviz创建的一个分支,旨在帮助开发人员更直观的理解和调试他们的ROS系统。它提供了一个更直观的用户界面,用于可视化ROS话题、消息和节点间的交互。用户可以查看实时数据流,调试ROS节点和消息传递,并监视ROS系统的状态。

Foxglove还提供了一系列实用工具,如消息记录和回放功能,以及对ROS图像和其他数据类型的支持。它的用户界面设计简洁直观,便于开发人员快速上手和高效的进行ROS系统的开发和调试工作。 相比较Webviz,它的功能更完善,关于它们之间的对比可参考:Foxglove和Webviz对比

6.1.2. 安装和设置Foxglove

Foxglove提供Web版和桌面app版(支持Linux、Windows、macOS)。

官网:https://foxglove.dev/

github地址:https://github.com/foxglove/studio

Web访问地址:https://studio.foxglove.dev/view?layoutId=30e02236-0d8d-40f0-a447-1975220cda91

app版本下载地址:https://foxglove.dev/download

Foxglove的桌面版功能更完善,部分功能只能在桌面版使用,如:

1.连接到数据

1.开启一个本地ROS1连接

2.连接到Velodyne雷达硬件

3.用package://为前缀的URL来加载本地URDF文件和mesh资源 2.关于扩展方面

1.通过marketplace安装扩展

2.本地安装扩展(参考第四部分) 3.其他

创建以foxgolve://为前缀的可共享链接

6.1.3. 连接到ROS堆栈

6.1.3.1. 连接数据源

打开foxglove,显示如下图:https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/d4c9b788-7d6e-494d-9d24-514d5dbbbacc.png

有三种数据源

数据源类型 功能 支持的格式
本地文件 检索本地的数据 ROS1(.bag)MCAP(.mcap)PX4 ULog(.ugl)
上传和共享数据 检索导入到Foxglove平台的数据 ROS1MCAP
打开连接 检索实时机器人堆栈或者远程的数据 ROS1ROS2(1.可连接实时机器人;2.远程或本地的.db3数据需要通过mcap的 cli工具转成.mcap才能打开)Custom(1.通过Foxglove websocket实时传输自定义数据如:ProtoBuf、JSON、FlatBuffers;2.将本地或远程数据编码成.mcap播放)MCAPVelodyne

MCAP是一种用于多模态日志的开源容器文件格式,它支持多个带时间戳的预序列化数据通道,适用于发布/订阅机器人应用程序。

打开连接有以下几种类型可选:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/b74df239-ca84-43b0-a848-29b2e02b017d.png

连接类型 主要功能
Foxglove WebSocket 在Foxglove和机器人之间只需要打开一个端口即可,运行一个额外的ROS节点foxglove_bridge 默认8765端口
Rosbridge 在Foxglove和机器人之间只需要打开一个端口即可,运行一个额外的ROS节点rosbridge_server 默认9090端口
ROS1 连接 ROS1机器人
Velodyne Lidar 连接雷达硬件设备
Remote file 远程文件
ROS2 不支持,推荐直接使用Foxglove WebSocket.

foxglove_bridge使用Foxglove WebSocket协议,这是一种类似于rosbridge的协议,但能够支持额外的模式格式,如:ROS2 .msg,ROS2.idl,参数,以及非ROS系统,这个桥接器是用C++编写的,旨在实现高性能和低开销,以最小化对机器人堆栈的影响。

安装:

支持ROS1 Melodic和Noetic,以及ROS2的Humble,Rolling,(Galactic以上都支持),早期版本可能由于API设计或者性能限制不支持。

sudo apt install ros-$ROS_DISTRO-foxglove-bridge

运行:

ros2 launch foxglove_bridge foxglove_bridge_launch.xml

rosbridge_server是用于ROS的工具,充当了ROS系统和其他系统之间的桥梁。它允许使用WebSocket协议的方式连接到ROS系统,从而可以通过网络传输ROS系统的消息和服务,使得非ROS系统和ROS系统之间可以实时通信,包括订阅和发布ROS主题,调用ROS服务,获取ROS参数等操作。

安装:

 sudo apt install ros-<ROS_DISTRO>-rosbridge-server

运行:

ros2 launch rosbridge_server rosbridge_websocket.launch

6.1.3.2. 面板类型

面板是模块化可视化界面,可以配置成Foxglove布局,Foxglove提供了很多预定的面板供开发者快速使用,有以下类型。

6.1.3.2.1. 3D面板

在三维场景中显示标记、相机图像、网格、URDF和其他内容。

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/c9a44dac-5e52-44ea-aaaa-7fdb249f5cd8.png

6.1.3.2.1.1. 支持的消息

3D面板可以可视化各种不同的消息,要可视化主题,消息类型必须符合以下消息之一。 1.相机视野

场景相机的标定参数

框架 样式
ROS1 sensor_msgs/CameraInfo
ROS2 sensor_msgs/msg/CameraInfo
Custom foxglove.CameraCalibration

2.网格

框架 样式
ROS1 nav_msgs/OccupancyGrid
ROS2 nav_msgs/msg/OccupancyGrid
Custom foxglove.Grid
  1. 图像

使用相应的相机视野消息在3D场景中显示图像

框架 样式
ROS1 sensor_msgs/Image
ROS1 sensor_msgs/CompressedImage
ROS2 sensor_msgs/msg/Image
ROS2 sensor_msgs/msg/CompressedImage
Custom foxglove.RawImage
Custom foxglove.CompressedImage

4.激光扫描仪

框架 样式
ROS1 sensor_msgs/LaserScan
ROS2 sensor_msgs/msg/LaserScan
Custom foxglove.LaserScan

5.ROS多边形

框架 样式
ROS1 geometry_msgs/PolygonStamped
ROS2 geometry_msgs/msg/PolygonStamped

6.ROS 标记

与场景实体类似,这些标记消息描述原始形状或者网格。

框架 样式
ROS1 visualization_msgs/Marker
ROS1 visualization_msgs/MarkerArray
ROS2 visualization_msgs/msg/Marker
ROS2 visualization_msgs/msg/MarkerArray

7.路径

框架 样式
ROS1 nav_msgs/Path
ROS2 nav_msgs/msg/Path
Custom foxglove.PosesInFrame

8.点云

框架 样式
ROS1 sensor_msgs/PointCloud2
ROS2 sensor_msgs/msg/PointCloud2
Custom foxglove.PointCloud

9.姿势

框架 样式
ROS1 geometry_msgs/PoseArray
ROS1 geometry_msgs/PoseStamped
ROS2 geometry_msgs/msg/PoseArray
ROS2 geometry_msgs/msg/PoseStamped
Custom foxglove.PosesInFrame

10.场景实体

框架 样式
Custom foxglove.SceneEntity
Custom foxglove.SceneUpdate

11.转换

框架 样式
ROS1 tf/tfMessage
ROS1 tf2_msgs/TFMessage
ROS2 tf2_msgs/msg/TFMessage
Custom foxglove.FrameTransform

12.雷达

框架 样式
ROS1 velodyne_msgs/VelodyneScan
ROS2 velodyne_msgs/msg/VelodyneScan

13.视频

框架 样式
ROS1 foxglove.CompressedVideo
6.1.3.2.1.2. 设置项

3D面板的设置选项比较多,如下图:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/9113c805-147a-49de-9d24-cc8dd847713a.png

1.参考系:

选择3D场景的显示参考系和追随模式

属性 描述
展示参考系 配置渲染场景的参考系为了渲染一个场景元素,需要把场景帧到显示帧做一个转换,如果显示帧场景帧就是显示帧,不需要做额外的变换。
追随模式 配置视口的跟随行为姿态--跟随显示帧的位置和方向位置--仅跟随显示帧的位置固定--不更新视口

2.场景:

配置一般的渲染属性和视口属性

属性 描述
场景统计 在面板角落显示渲染性能统计数据
背景 场景背景颜色
标签缩放 渲染标签的比例
忽略 COLLADA 忽略COLLADA文件中的标签
网格上轴 加载没有方向信息的网格(STL、OBJ)时的“向上”方向(“Y-向上”、“Z-向上”)

3.视图:

配置相机设置

属性 描述
同步相机 是否同步多个3D面板的相机状态
距离 相机距视口中心的距离
透视 2D(关)和3D(开)视图之间进行切换,2D视图将相机定位为Z轴朝下
目标X 视口中心的X坐标
Y 视口中心的Y坐标
Z 视口中心的Z坐标
极角 相机的极角
方向角 相机的方向角
Y轴视野 相机在Y轴上的视角
近面 相机近平面的距离
远面 相机远平面的距离

4.变换:

机器人系统会产生许多描述其对周围世界的观察的消息。这些消息可能存在于一个或多个坐标系中,或者存在于机器人的不同部分上。

变换定义给定时间两个坐标系之间的空间关系。要将对象渲染到场景中,必须存在从对象的坐标系到显示帧的变换路径。

5.话题:

列出包含在场景中显示的受支持消息类型的主题。

每个主题都有单独的设置来配置可视化在场景中的显示方式。

6.自定义图层:

自定义图层允许添加不来自数据源的视图元素。

  • 添加网格

  • 添加URDF

    如果数据源支持参数(本机ROS1或者ROS2连接),且/robot_description设置为有效的URDF XML。

添加自定义图层的URDF模型设置如下:

属性 描述
URDF文件的来源
URL 以下方案之一中的URDF源文件:http(s):// --通过HTTP(S)连接package:// --加载包路径(仅桌面版支持)file:// --加载文件路径(仅桌面版支持)
文件路径 URDF文件路径
参数 URDF文件中包含的参数
话题 URDF文件包含的话题
标签 (可选)自定义图层将在侧边栏中显示的标签
帧前缀 (可选)TF前缀
显示模式 要显示的机器人链接几何形状Auto --默认为视觉几何图形,如果没有效果,切换到碰撞几何图形Visual -- 视觉几何图形Collision -- 碰撞几何图形
颜色 如果数据源没有颜色,则可以为URDF模型选择颜色

7.发布:

配置3D面板的点击发布行为

属性 描述
类型 发布的消息类型:点姿态姿态估计
话题 发布消息的话题

6.1.3.2.2. 主题图

展示当前节点和主题拓扑图形的可视化效果

要使用这个面板,必须通过本机或者Rosbridge连接到实时的ROS系统,使用本机连接效果最好。它可以显示节点、主题和服务。

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/9188b554-0a68-4586-a6a4-78ec911b4ccc.png

  • 蓝框里是节点

  • 紫色是话题

  • 红框里是服务

6.1.3.2.3. 仪表

基于连续值显示彩色仪表

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/de7ab20d-75f3-46a4-b4a3-e2c1c1ccc22d.png

6.1.3.2.4. 原始消息

检查数据源中的特定路径的消息

6.1.3.2.5. 参数

读取和设置连接的数据源的参数

支持的数据源连接如下:

Foxglove Websocket 推荐ROS1、ROS2(用foxglove_bridge)和自定义数据源
ROS1 本地连接
Rosbridge 查看ROS1和ROS2的ROS参数

6.1.3.2.6. 发布

将某个话题的消息发布回机器人栈

6.1.3.2.7. 变量滑块

用于快速更新数值变量值

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/7efbd1f4-2675-449b-9a0b-75a153b3f4dc.png

6.1.3.2.8. 图像

显示带有文本标签、圆圈和点等2D注释的原始图像、压缩图像以及压缩视频。

支持的数据源的编码格式:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/4720cb55-2cbe-4a16-8847-b104b8a3251d.png

支持的消息:

必须使用3D标记消息或者以下样式类型之一

  • 原始图像

框架 样式
ROS1 sensor_msgs/Image
ROS2 sensor_msgs/msg/Image
Custom foxglove.RawImage
  • 压缩图像

框架 样式
ROS1 sensor_msgs/CompressedImage
ROS2 sensor_msgs/msg/CompressedImage
Custom foxglove.CompressedImage
  • 压缩视频

框架 样式
Custom foxglove.CompressedVideo
  • 标定参数

框架 样式
ROS1 sensor_msgs/CameraInfo
ROS2 sensor_msgs/msg/CameraInfo
Custom foxglove.CameraCalibration
  • 单个图像标注

框架 样式
ROS1 visualization_msgs/ImageMarker
ROS2 visualization_msgs/msg/ImageMarker
  • 多个图像标注

框架 样式
ROS1 foxglove_msgs/ImageMarkerArray
Custom foxglove.ImageAnnotations

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/503972b2-bbd1-4274-958f-ff8836d82f2d.png

6.1.3.2.9. 图表

绘制主题消息路径中的任意数值。

当播放本地或者远程数据文件时,该面板会在整个播放时间轴上预加载属于指定主题消息路径的数据。

6.1.3.2.10. 地图

LocationFix 主题消息展示为世界地图上的点。

支持的消息类型

  • LocationFix

框架 样式
ROS1 sensor_msgs/NavSatFix
ROS2 sensor_msgs/msg/NavSatFix
Custom foxglove.LocationFix
  • GeoJSON

框架 样式
Custom foxglove.Log

6.1.3.2.11. 指示器

基于阈值值显示彩色或者文本指示器

6.1.3.2.12. 数据源信息

查看已连接数据源的时间和主题信息

6.1.3.2.13. 日志

显示和过滤主题中的日志消息

支持的消息类型:

框架 样式
ROS1 rosgraph_msgs/Log
ROS2 rcl_interfaces/msg/Log
Custom foxglove.Log

6.1.3.2.14. 状态转换

跟踪值随时间变化的情况

当播放预先录制的数据源时,将会为整个播放时间线预加载属于指定主题消息路径的数据。

6.1.3.2.15. 用户脚本

使用自定义脚本在Foxglove内部发布伪主题。操作、减少和过滤现有消息并将其输出以进行有用的可视化。

用户脚本可以转换播放数据和预加载数据。

  • 播放数据—消息逐帧流式传输到Foxglove中,如:原始消息或3D面板数据

    • 预加载数据—正在播放的整个数据范围的消息,如绘制或者状态转换面板的数据 在抓换预加载数据时,Foxglove创建两个正在运行的用户脚本示例,一个处理完整的数据范围,另一个仅处理当前播放的消息帧,用户脚本的每个实例都按照接收时间顺序接收消息。

6.1.3.2.16. 表格

以表格格式展示主题数据

6.1.3.2.17. 诊断-概要

显示所有ROS DiagnosticArray主题消息的摘要

6.1.3.2.18. 诊断-详细信息

显示特定硬件ID的 ROS DiagnosticArray消息

6.1.3.2.19. 调用服务

调用服务并查看其响应,支持实时ROS1和ROS2连接,以及提供服务的自定义Foxglove Websocket连接。

6.1.3.2.20. 远程操纵

通过实时连接远程操控机器人。将给定主题上的geometry_msgs/Twistgeometry_msgs/msg/Twist消息发布回实时ROS堆栈来远程操作机器人。 必须通过本机或者Rosbridge来连接到机器人。 支持的消息: | 框架 | 样式 | | —— | ————————————————————————————————————– | | ROS1 | geometry_msgs/Twist | | ROS2 | geometry_msgs/msg/Twist |

6.1.3.2.21. 选项卡

将面板分组在选项卡界面中

6.1.3.3. 效果展示

6.1.3.3.1. 通过Foxglove WebSocket连接

通过Orbbec SDK打开DCW2,通过Foxglove Websocket连接,能显示RGB、深度、IR和点云。

1.通过Orbbec SDK打开DCW2

2.打开foxglove_bridge

3.打开foxglove-studio,打开连接时选择Foxglove websocket 打开三个终端,按照上述3步运行如下:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/8e6a3afc-9d40-4eb9-8aa5-f442b6497fd4.png

最终显示的点云、RGB、深度和IR效果如下图:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/501f12d5-c7a2-45ee-93a4-16d721f73917.png

6.1.3.3.2. 通过Rosbridge连接

同样接DCW2,不同点是:打开的rosbridge_server,且foxgolve连接的时选择Rosbridge,也能看到效果图。

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/cbe114d2-4dbc-4a61-8bfc-9684bebd2eae.png

6.1.3.4. 自定义扩展开发

当foxglove提供的功能不完全满足我们的需求时,我们可以自定义扩展开发来满足我们的需求。

用JavaScript或者TypeScript写扩展,然后打包成.foxe文件,就可以把这些文件分发到Foxglove组织或者通过marketplace公开(仅桌面app支持通过marketplace安装扩展),一个单一的扩展可以包括多个面板和转换器。

foxgolve提供一系列模板和命令在create-foxglove-extension包内来简化扩展开发。

6.1.3.5. 更新Nodejs版本,搭建开发环境

扩展开发需要:Node.js 14+

ubuntu20.04默认安装nodejs的版本是V10.19.0,该版本太低,无法正常创建一个扩展

通过node -v查看nodejs的版本,如果不满足需求,需更新到V14以上。

通过NPM(节点包管理器)来更新Node.js比较方便,步骤:

1.清除npm缓存

npm cache clean -f 

2.安装n,Node的版本管理器

sudo npm install -g n

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/90b7418e-3a76-4cbb-aab8-d7bf6e720381.png

3.安装n模块后,可以用它来安装最新的稳定版本

sudo n stable

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/aeadc513-0c12-43cc-8941-b75b79c6b99e.png

4.此时虽然安装完,但是node -v查看版本时,版本还没变,需重新打开一个终端,然后输入node -v查询,会发现已经成功更新了Nodejs的版本。

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/755d0dd2-30c0-45df-bfcc-e99357c7c80c.png

6.1.3.6. 自定义扩展的创建

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/2216e921-4925-41b9-a24b-915c4211e6ac.png

结束后,进入到my-extension目录下,结构如图,进入到src目录下,里边的index.ts文件是扩展的入口点

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/d64ab55f-0966-4ac5-b0a3-cdabf958f3ad.png

入口点脚本必须导入一个接收单一参数ExtensionContext的activate函数

index.ts自动帮我填充了一个名为”example-panel”的面板。

import { ExtensionContext } from "@foxglove/studio";
import { initExamplePanel } from "./ExamplePanel";

export function activate(extensionContext: ExtensionContext): void {
  extensionContext.registerPanel({ name: "example-panel", initPanel: initExamplePanel });
}

我们不做任何修改,其实已经创建了一个简单的插件了。

6.1.3.7. 自定义扩展的发布和使用

在扩展目录下,运行如下命令:

npm run local-install

结果如图:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/9f523e3d-83ac-4632-8806-420f1bd6a924.png

此时将会在foxglove-studio的扩展目录下会生成我们编译好扩展

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/329f3a2f-f310-41f9-bb9a-6dabab82316c.png

打开终端运行foxglove-studio

点击添加面板,此时就可以看到我们刚刚创建的面板已经出现了。

https://static.dingtalk.com/media/lADPD4PvYHk9WrvNCrDNDkA_3648_2736.jpg

选择它,界面如下图:

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/4j6OJQWe7LXjq3p8/img/2599f176-164d-46c8-b6a4-9a492ca15ec6.png