3D
在3D场景中显示标记、实体、相机图像、网格、URDF模型等。
支持的消息
3D面板可以可视化各种不同 的消息。
要可视化一个主题,该主题上的消息必须符合以下列出的已知消息模式之一。
相机视场
场景相机的校准参数。
框架 | 模式 |
---|---|
ROS 1 | sensor_msgs/CameraInfo |
ROS 2 | sensor_msgs/msg/CameraInfo |
自定义 | foxglove.CameraCalibration |
Grid
2D 彩色网格。
框架 | 模式 |
---|---|
ROS 1 | nav_msgs/OccupancyGrid |
ROS 2 | nav_msgs/msg/OccupancyGrid |
自定义 | foxglove.Grid |
foxglove.Grid
设置
字段 | 描述 |
---|---|
颜色模式 | 选项之一: 平面:纯色 色彩图:预定义的色彩图 渐变:两个自定义颜色之间的平滑过渡 RGBA(独立字段):使用每个单元格的 red 、green 、blue 和 alpha 字段中的嵌入颜色(见下文) |
平面颜色 | 仅在“颜色模式”设置为“平面”时显示;每个单元格的颜色的十六进制代码 |
按颜色 | 仅在“颜色模式”未设置为“平面”时显示;用于着色逻辑的消息中的数值字段 |
色彩图 | 仅在“颜色模式”设置为“色彩图”时显示;“Turbo”(Google)或“Rainbow”(RViz);用于将“按颜色”字段值映射到颜色 |
不透明度 | 仅在“颜色模式”设置为“色彩图”或“BGR(打包)”时显示;设置所有单元格的不透明度 |
最小值 | 仅在“颜色模式”未设置为“平面”时显示;用于规范化传入网格的“按颜色”字段值的最小值 |
最大值 | 仅在“颜色模式”未设置为“平面”时显示;用于规范化传入网格的“按颜色”字段值的最大值 |
框架锁定 | “开”表示网格锁定到其 frame_id 指定的框架,并且会随着该框架的变换而移动。“关”表示网格相对于固定框架,并且在首次显示后不会移动。 |
RGBA(独立字段)颜色模式
每个单元格可以包含四个独立字段中的颜色信息,分别命名为 red
、green
、blue
和 alpha
,可以是任何数值类型:
- 浮点值 — 0–1 范围
- 无符号整数值 — 最大可能范围(例如
UINT8
字段的 0–255) - 有符号整数值 —
-max
到max
(例如INT8
字段的 −127 到 127;值为 −128 被视为与 −127 相同)
nav_msgs/OccupancyGrid
设置
字段 | 描述 |
---|---|
颜色模式 | 选项之一: Costmap:预定义的 RViz 色彩图。无法进一步自定义设置。 自定义:使用以下设置自定义色彩图 |
最小颜色 | 对应于最小单元格值(0)的颜色 |
最大颜色 | 对应于最大单元格值(100)的颜色。请注意,值恰好为 100 的单元格显示为完全透明。 |
未知颜色 | 对应于未知单元格值(−1)的颜色 |
备用颜色 | 对应于超出 −1 到 100 范围的单元格值的颜色 |
框架锁定 | “开”表示网格锁定到其 frame_id 指定的框架,并且会随着该框架的变换而移动。“关”表示网格相对于固定框架,并且在首次显示后不会移动。 |
图像
在 3D 场景中显示图像,使用相应的相机视场消息。
框架 | 模式 |
---|---|
ROS 1 | sensor_msgs/Image |
ROS 2 | sensor_msgs/msg/Image |
ROS 1 | sensor_msgs/CompressedImage |
ROS 2 | sensor_msgs/msg/CompressedImage |
自定义 | foxglove.RawImage |
自定义 | foxglove.CompressedImage |
激光扫描
来自平面激光测距仪的单次扫描。
框架 | 模式 |
---|---|
ROS 1 | sensor_msgs/LaserScan |
ROS 2 | sensor_msgs/msg/LaserScan |
自定义 | foxglove.LaserScan |
ROS 多边形
由一系列连接点组成的带时间戳的多边形。
框架 | 模式 |
---|---|
ROS 1 | geometry_msgs/PolygonStamped |
ROS 2 | geometry_msgs/msg/PolygonStamped |
ROS 标记
类似于场景实体,这些 Marker
消息描述了原始形状或网格。
框架 | 模式 |
---|---|
ROS 1 | visualization_msgs/Marker |
ROS 2 | visualization_msgs/msg/Marker |
ROS 1 | visualization_msgs/MarkerArray |
ROS 2 | visualization_msgs/msg/MarkerArray |
网格标记
具有 mesh_resource
字段的标记支持以下 URL 方案:
http(s)://
package://
(仅限桌面应用)file://
(仅限桌面应用)
以及文件格式:
glTF (.glb
)
这是首选格式,因为它在所有支持的文件类型中具有最佳性能。
二进制 glTF 文件将所有必需的资产捆绑到一个文件中,支持嵌入网格、压缩和 Foxglove 使用的相同基于物理的材质系统。因此,您的模型在 Foxglove 中的外观应与在其他 3D 程序中的外观相似。
STL (.stl
)
STL 文件在 Foxglove 中得到了很好的支持,但缺乏 glTF 的一些可视化功能。STL 的主要优点是能够在硬件制造过程和机器人可视化工具之间共享相同的文件。
STL 是为 3D 打印和 CAD 应用设计的,不包括材质或网格层次结构。虽然它们可以用二进制编码表示,但 STL 文件通常用 ASCII 字符表示,这会导致文件更大。
COLLADA (.dae
)
作为 glTF 的前身,COLLADA 具有类似的功能集。话虽如此,它确实有更大的基于 XML 的文件,没有压缩,并且有额外的处理开销。
在 RViz 中存在一个错误,其中忽略了 up-axis 元数据,导致许多 .dae
文件在 ROS 环境中的方向不正确。为了解决这个问题,3D 面板有一个 忽略 COLLADA <up_axis>
设置,可以在观察 <up-axis>
标签或像 RViz 一样忽略它之间切换。
Wavefront OBJ (.obj
)
OBJ 是一种简单的 ASCII 格式,早于所有其他支持的格式。它具有较大的文件大小、不支持材质、不支持网格层次结构、没有压缩,并且有额外的处理开销。
材质支持作为单独的 .mtl
文件添加到 OBJ 格式中,但 Foxglove 不读取这些文件。
路径
命名坐标系中一系列带时间戳的姿态,表示物体在空间中的路径。
框架 | 模式 |
---|---|
ROS 1 | nav_msgs/Path |
ROS 2 | nav_msgs/msg/Path |
自定义 | foxglove.PosesInFrame |
点云
N 维点的集合,可能包含法线、强度等信息的附加字段。
框架 | 模式 |
---|---|
ROS 1 | sensor_msgs/PointCloud2 |
ROS 2 | sensor_msgs/msg/PointCloud2 |
自定义 | foxglove.PointCloud |
设置
字段 | 描述 |
---|---|
点大小 | 每个渲染点的大小 |
点形状 | 每个渲染点的形状 |
衰减时间 | 每个点保持渲染的时间(以秒为单位) |
颜色模式 | 选项之一: 平面:纯色 色彩图:预定义的色彩图 渐变:两个自定义颜色之间的平滑过渡 BGR(打包):仅限 sensor_msgs/PointCloud2 ;使用每个点的 rgb 字段中的嵌入颜色(见下文)BGRA(打包):仅限 sensor_msgs/PointCloud2 ;使用每个点的 rgba 字段中的嵌入颜色(见下文)RGBA(独立字段):仅限 foxglove.PointCloud ;使用每个点的 red 、green 、blue 和 alpha 字段中的嵌入颜色(见下文) |
平面颜色 | 仅在“颜色模式”设置为“平面”时显示;每个点的颜色的十六进制代码 |
按颜色 | 仅在“颜色模式”未设置为“平面”时显示;用于着色逻辑的消息中的数值字段;例如 x 、y 、z 、<distance> (坐标的 L2 范数)或自定义字段 |
色彩图 | 仅在“颜色模式”设置为“色彩图”时显示;“Turbo”(Google)或“Rainbow”(RViz);用于将“按颜色”字段值映射到颜色 |
不透明度 | 仅在“颜色模式”设置为“色彩图”或“BGR(打包)”时显示;设置所有点的不透明度 |
最小值 | 仅在“颜色模式”未设置为“平面”时显示;用于规范化传入点云的“按颜色”字段值的最小值 |
最大值 | 仅在“颜色模式”未设置为“平面”时显示;用于规范化传入点云的“按颜色”字段值的最大值 |
Stixel 视图 | 将点可视化为从点的 z 位置延伸到 0 的 stixels |
RGBA 颜色模式
当使用“BGR(打包)”、“BGRA(打包)”和“RGBA(独立字段)”颜色模式时,您的点云消息必须包含某些字段,以显示每个点的颜色信息。
RGBA(独立字段)
对于 foxglove.PointCloud
消息,每个点可以包含四个独立字段中的颜色信息,分别命名为 red
、green
、blue
和 alpha
,可以是任何数值类型:
- 浮点值 — 0–1 范围
- 无符号整数值 — 最大可能范围(例如
UINT8
字段的 0–255) - 有符号整数值 —
-max
到max
(例如INT8
字段的 −127 到 127;值为 −128 被视为与 −127 相同)
BGR(打包)和 BGRA(打包)
对于 sensor_msgs/PointCloud2
消息,每个点可以在一个名为 rgb
或 rgba
的字段中包含颜色信息:
- 必须使用 sensor_msgs/PointField 中的 4 字节类型(推荐使用
UINT32
,值为 6) - 每个红色、绿色、蓝色和 alpha 值由一个字节表示,范围为 0–255
- 字节必须按
[0xBB, 0xGG, 0xRR, 0xAA]
顺序打包(即在小端序中(0xAA << 24) | (0xRR << 16) | (0xGG << 8) | 0xBB
)。此顺序与 RViz 兼容。
如果使用“BGR”模式,alpha 值仍然必须存在,但会被忽略。
姿态
命名坐标系中的姿态。
框架 | 模式 |
---|---|
ROS 1 | geometry_msgs/PoseArray |
ROS 2 | geometry_msgs/msg/PoseArray |
ROS 1 | geometry_msgs/PoseStamped |
ROS 2 | geometry_msgs/msg/PoseStamped |
自定义 | foxglove.PosesInFrame |
场景实体
一组原始形状(立方体、球体、文本、网格、线条等),用于显示从基本边界框到复杂 3D 决策树或道路网络的任何内容。
场景实体必须包装在 SceneUpdate
消息中。
框架 | 模式 |
---|---|
自定义 | foxglove.SceneEntity |
自定义 | foxglove.SceneUpdate |
变换
3D 空间中两个参考框架之间的变换(平移和旋转)。
框架 | 模式 |
---|---|
ROS 1 | tf/tfMessage |
ROS 1 | tf2_msgs/TFMessage |
ROS 2 | tf2_msgs/msg/TFMessage |
自定义 | foxglove.FrameTransform |
Velodyne 扫描
来自 Velodyne ROS 驱动程序或 Foxglove 桌面应用程序的 Velodyne Lidar 扫描数据包的 Velodyne 连接。
框架 | 模式 |
---|---|
ROS 1 | velodyne_msgs/VelodyneScan |
ROS 2 | velodyne_msgs/msg/VelodyneScan |
视频
在 3D 场景中显示压缩视频,使用相应的相机视场消息。
框架 | 模式 |
---|---|
自定义 | foxglove.CompressedVideo |
设置
框架
选择您的 3D 场景的显示框架和跟随模式。
字段 | 描述 |
---|---|
显示框架 | 配置渲染场景的坐标框架。 要渲染场景元素,您需要从其框架到所选显示框架的变换。如果其框架是显示框架,则不需要额外的变换。 |
跟随模式 | 配置视口的跟随行为。
|
场景
配置通用渲染属性和视口属性。
字段 | 描述 |
---|---|
渲染统计 | 在面板角落显示渲染性能统计信息 |
背景 | 场景的背景颜色 |
标签比例 | 渲染标签的比例 |
忽略 COLLADA <up_axis> | 忽略 COLLADA 文件中的 <up_axis> 标签 |
网格上轴 | 加载没有方向信息的网格(STL、OBJ)时的“上”方向(“Y-up”,“Z-up”) |
同步相机 | 同步多个 3D 面板的相机状态 |
视图
配置相机设置。
字段 | 描述 |
---|---|
距离 | 相机到视口中心的距离(即缩放级别) |
透视 | 在场景的 3D(“开”)和 2D(“关”)视图之间切换。2D 视图将相机朝向 z 轴向下。 |
目标 | 从显示框架原点的平移偏移 |
Theta | 从显示框架原点的方位角偏移(以度为单位) |
Phi | 从显示框架原点的极角偏移(以度为单位) |
Y 轴视场 | 垂直视场(以度为单位) |
近 | 近剪裁平面距离 |
远 | 远剪裁平面距离 |
对数深度 | 启用对数深度缓冲以获得更均匀的深度精度。可能会导致渲染伪影或性能下降。 |
对数深度与近/远平面设置的交互
近、远 和 对数深度 设置是相互关联的。当使用非常小的 近 值或较大的 远 值时,启用 对数深度 可能会减少视觉伪影。例如,在下面的视频中:
- 左侧面板未使用对数深度,并且近剪裁平面为 1.0。网格渲染平滑,但靠近观察者的物体被剪裁。
- 中间面板未使用对数深度,并且近剪裁平面为 0.01。观察者可以更接近物体而不被剪裁,但在多个网格之间出现渲染伪影(z-fighting)。
- 右侧面板启用了新的对数深度设置。这通过为网格提供更多的深度精度来避免 z-fighting,同时仍允许近剪裁平面值为 0.01 以减少剪裁。
变换
机器人系统会生成许多描述其对周围世界观察的消息。这些消息可能存在于一个或多个坐标系中,或在机器人的不同部分上。
变换定义了在给定时间两个坐标系之间的空间关系。要将对象渲染到场景中,必须存在从对象的坐标系到显示框架的变换路径。
可视化变换框架以调试元素为何未按预期渲染的位置。
历史记录
面板在变换历史记录存储中存储坐标系关系。每个坐标系最多存储 10,000 条变换消息,然后在新消息到达时开始删除最旧的消息。
预加载
3D 面板中的变换预加载通过将变换消息加载到内存中来确保场景的准确性。变换预加载可能会在预加载和搜索期间影响 3D 面板性能。您可以在 3D 面板设置中禁用预加载。但是,当禁用时,在涉及不频繁的坐标系的某些情况下,3D 面板可能无法正确渲染您的场景。
故障排除
在时间同步无法实现的实时源工作时,建议服务器根据 Foxglove Websocket 协议 发布其 Time
。否则,如果服务器时间领先于可视化应用程序,3D 面板中的某些消息将立即显示,但坐标系状态可能会滞后,因为应用程序使用其墙上时间而不是服务器时间。
设置
字段 | 描述 |
---|---|
可编辑 | 切换应用内变换框架的编辑。当“开 启”时,您可以更新平移和旋转值以调整变换框架,查看其对场景的影响,并调试如何调整机器人上的框架。当关闭时,将恢复到原始的平移和旋转值。 |
标签 | 切换变换标签的显示。 |
轴比例 | 变换轴的比例(显示为箭头标记) |
线宽 | 变换的线宽(显示为线标记) |
线颜色 | 变换的颜色(显示为线标记) |
启用预加载 | 从数据源预加载变换消息。 |
主题
列出包含支持的消息类型的主题,这些主题可以显示在场景中。切换各个主题。
每个主题提供设置以配置可视化在场景中的显示方式。
任何与支持的模式匹配的消息的主题都将显示在主题列表中。每种支持的格式都有特定的可视化设置。这些设置将显示在主题下。
使用顶级菜单切换所有主题。您可以通过点击主题名称旁边的眼睛图标来切换任何单个主题。
自定义图层
自定义图层允许您添加非数据源的可视化元素。
使用顶级菜单添加自定义图层。
添加网格
网格是具有固定大小和 分割数的二维正方形。您可以创建任意数量的网格。网格可以相对于显示框架或任何其他变换框架进行渲染。
使用网格图层设置更改框架、大小、颜色、分割数和网格的其他属性。
添加 URDF
如果您的数据源支持参数(即原生 ROS 1 或 ROS 2 连接)并且 /robot_description
参数设置为有效的 URDF XML,则会自动加载 URDF 机器人模型。
您可以使用自定义图层添加 URDF 模型。使用每个图层的菜单复制或删除自定义图层。
字段 | 描述 |
---|---|
来源 | URDF 的来源
|
标签 | (可选)自定义图层在侧边栏中显示的标签。 |
框架前缀 | (可选)机器人的变换前缀。也常被称为 TF 前缀。 |
显示模式 | 要显示的机器人链接几何体
|
颜色 | URDF 模型的备用颜色,如果源中不包含颜色 |
使用 package://
URL 解析 URDF 资产
Foxglove 能够通过多种方式获取 package://
引用的网格和其他资产:
- 使用桌面应用程序时,可以通过 ROS_PACKAGE_PATH 设置中指定的目录找到包来解析包路径
- 使用支持资产获取的实时连接(如 Foxglove Bridge)时,可以通过 websocket 连接获取资产
- 当 URDF 以 http(s) 或本地文件路径提供时,可以在 URL 或文件路径包含包名时解析包路径。考虑以下示例,其中包名
leo_description
包含在 URDF URL 中:
- URDF URL:
https://raw.githubusercontent.com/LeoRover/leo_common-ros2/humble/leo_description/urdf/leo.urdf.xacro
- 资产 URL:
package://leo_description/models/Rocker.dae
- 解析后的资产 URL:
https://raw.githubusercontent.com/LeoRover/leo_common-ros2/humble/leo_description/urdf/leo.urdf.xacro
发布
配置 3D 面板的点击发布行为。
字段 | 描述 |
---|---|
类型 | 要发布的消息类型。 |
主题 | 要发布消息的主题 – 仅在具有发布支持的 ROS 数据源 时可能。 |
用户交互
点击场景中的任何对象以在选定对象弹出窗口中显示其相关详细信息。
点击主题旁边的图标以在侧边栏中打开其设置或在新的原始消息面板中显示其消息。
选择一个对象将设置一个 $selected_id
变量为点击对象的 id
值(如果有)。对于ROS 标记和场景实体,您还可以在点击时设置另一个变量。
右侧的面板控件可用于执行以下操作:
- 选择 切换对象选择模式
- 3D 在场景的 3D 和 2D 视图之间切换
- 测量 测量两点之间的距 离
快捷键
移动相机:
w
– 向前移动相机s
– 向后移动相机a
– 向左移动相机d
– 向右移动相机- 滚动 – 放大和缩小
- 拖动 – 平行于地面移动相机
- 右键单击 + 水平拖动 – 围绕世界的 z 轴旋转相机
- 右键单击 + 垂直拖动 – 围绕世界的 x 和 y 轴平移相机
性能故障排除
如果在与 3D 面板交互时遇到性能问题,可能是因为未启用硬件加速。硬件加速将通过在 GPU 而不是 CPU 上渲染显著提高性能。
如果您使用的是 Google Chrome,可以通过访问 chrome://gpu
并查看“WebGL”和/或“WebGL2”是否为“硬件加速”来检查是否启用了硬件图形加速。如果没有,请访问 chrome://settings
,在设置中搜索 acceleration
并确保启用了“可用时使用图形加速”切换。如果在这些步骤之后您仍然看到 WebGL 在 chrome://gpu
中不是“硬件加速”,那么您可能需要调查启用 GPU 的特定平台步骤。
桌面应用程序使用基于 Chromium 的 Electron,应该在可用时自动使用硬件加速。如果您在这里看到问题,我们建议按照上述步骤查看 Chrome 中是否存在相同问题。如果是这样,很可能是由于相同原因影响了我们的应用程序。因此,我们建议首先在 Chrome 中解决问题,如果桌面应用程序在此之后仍然有问题,请告诉我们,我们会进行调查。
硬件加速可能被禁用的一些原因:
- 您的图形驱动程序已过时或未安装,使 Chrome 无法使用它们。
- 您的系统配置可能不支持 Chrome 中的硬件加速。解决此问题的一种方法是在
about://flags
中启用“覆盖软件渲染列表”,这可以允许 Chrome 在不受支持的系统上使用硬件加速。这可能会导致不稳定的 Chrome 体验,除非必要,否则不建议这样做。
如果在使用 foxglove.CompressedVideo
主题时遇到 3D 面板性能不佳的问题,请检查是否启用了视频加速。文档在这里。