如何使用 ros2_tracing 跟踪和分析应用程序

本教程介绍如何使用 ros2_tracing 跟踪和分析 ROS 2 应用程序。

对于本教程,应用程序将是 performance_test

概述

本教程涵盖:

  1. 安装跟踪相关工具并构建启用核心检测的 ROS 2

  2. 运行和跟踪 performance_test 运行

  3. 使用 tracetools_analysis 分析跟踪数据以绘制回调持续时间

先决条件

本教程针对实时 Linux 系统。 请参阅 实时系统设置教程。 但是,如果您使用的是非实时 Linux 系统,本教程将适用。

安装和构建

Note

本教程通常适用于所有受支持的 Linux 发行版。

但是,您可能需要调整一些命令。

按照 源安装说明 在 Linux 上安装 ROS 2 的所有依赖项。 在 在工作区中构建代码 部分之前停止。

安装 LTTngbabeltrace

sudo apt-get update
sudo apt-get install -y lttng-tools liblttng-ust-dev python3-lttng python3-babeltrace babeltrace

然后创建一个工作区,导入 ROS 2 Rolling 代码,并克隆“performance_test”和“tracetools_analysis”。

cd ~/
mkdir -p tracing_ws/src
cd tracing_ws/src/
vcs import src/ --input https://raw.githubusercontent.com/ros2/ros2/rolling/ros2.repos
cd src/
git clone https://gitlab.com/ApexAI/performance_test.git
git clone https://github.com/ros-tracing/tracetools_analysis.git -b rolling
cd ..

使用 rosdep 安装依赖项。

rosdep update
rosdep install --rosdistro rolling --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"

然后构建“performance_test”并将其配置为 ROS 2。 请参阅其“文档 <https://gitlab.com/ApexAI/performance_test/-/tree/master/performance_test#performance_test>”。 我们还需要构建“ros2trace”以使用“ros2 trace”命令设置跟踪,并使用“tracetools_analysis”来分析数据。

colcon build --packages-up-to ros2trace ros2run tracetools_analysis performance_test --cmake-args -DPERFORMANCE_TEST_RCLCPP_ENABLED=ON

查找安装来源并验证跟踪是否已启用:

source install/setup.bash
ros2 run tracetools status

您应该在输出中看到“跟踪已启用”。 这确认 LTTng 已被正确检测到,并且内置于 ROS 2 核心中的检测已启用。 接下来,我们将运行“performance_test”实验并对其进行跟踪。 跟踪 ——- 步骤 1:跟踪 ^^^^^^^^^^^^^ 在一个终端中,获取工作区并设置跟踪。 运行命令时,将打印 ROS 2 用户空间事件列表。 它还将打印包含结果跟踪的目录的路径(在“~/.ros/tracing”下)。

# terminal 1
cd ~/tracing_ws
source install/setup.bash
ros2 trace --session-name perf-test --list

按 Enter 开始跟踪。

第 2 步:运行应用程序

在第二个终端中,获取工作区。

# terminal 2
cd ~/tracing_ws
source install/setup.bash

然后运行“performance_test”实验(或您自己的应用程序)。 我们只需创建一个实验,一个节点使用第二高的实时优先级以最快的速度向另一个节点发布约 1 MB 的消息,持续 60 秒,这样我们就不会干扰关键的内核线程。 我们需要以“root”身份运行“performance_test”才能使用实时优先级。

# terminal 2
sudo ./install/performance_test/lib/performance_test/perf_test -c rclcpp-single-threaded-executor -p 1 -s 1 -r 0 -m Array1m --reliability RELIABLE --max-runtime 60 --use-rt-prio 98

如果最后一个命令对您不起作用(出现类似“加载共享库时出错”的错误),请运行下面略有不同的命令。 这是因为,出于安全原因,我们需要手动传递 *PATH 环境变量才能找到某些共享库(请参阅`此解释 <https://unix.stackexchange.com/a/251374>`_)。

# terminal 2
sudo env PATH="$PATH" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" ./install/performance_test/lib/performance_test/perf_test -c rclcpp-single-threaded-executor -p 1 -s 1 -r 0 -m Array1m --reliability RELIABLE --max-runtime 60 --use-rt-prio 98

Note

如果您没有使用实时内核,只需运行:

# terminal 2
./install/performance_test/lib/performance_test/perf_test -c rclcpp-single-threaded-executor -p 1 -s 1 -r 0 -m Array1m --reliability RELIABLE --max-runtime 60

步骤 3:验证跟踪

实验完成后,在第一个终端中,再次按 Enter 键停止跟踪。 使用“babeltrace”快速查看结果跟踪。

babeltrace ~/.ros/tracing/perf-test | less

上述命令的输出是原始通用跟踪格式 (CTF) 数据的人性化版本,它是跟踪事件的列表。 每个事件都有一个时间戳、一个事件类型、有关生成事件的进程的一些信息以及给定事件类型的字段的值。 使用箭头键滚动,或按 q 退出。 接下来,我们将分析跟踪。 分析 ——– tracetools_analysis 提供了一个 Python API 来轻松分析跟踪。 我们可以在 Jupyter notebook 中使用它和 bokeh 来绘制数据。 tracetools_analysis 存储库包含 ``一些示例笔记本 <https://github.com/ros-tracing/tracetools_analysis/tree/rolling/tracetools_analysis/analysis>`_,其中包括 ``一个用于分析订阅回调持续时间的笔记本 <https://github.com/ros-tracing/tracetools_analysis/blob/rolling/tracetools_analysis/analysis/callback_duration.ipynb>`_。

在本教程中,我们将在订阅者节点中绘制订阅回调的持续时间。

安装 bokeh,然后打开示例笔记本。

pip3 install bokeh
jupyter notebook ~/tracing_ws/src/tracetools_analysis/tracetools_analysis/analysis/callback_duration.ipynb

这将在浏览器中打开笔记本。

将第二个单元格中的“path”变量的值替换为跟踪目录的路径:

path = '~/.ros/tracing/perf-test'

通过单击每个单元格的 运行 按钮来运行笔记本。 第一次运行执行跟踪处理的单元格可能需要几分钟,但后续运行会快得多。

您应该得到一个类似于此的图:

callback durations result plot

我们可以看到,大多数回调所用时间少于 0.01 毫秒,但有些异常值所用时间超过 0.02 或 0.03 毫秒。

结论

本教程展示了如何安装与跟踪相关的工具以及如何使用跟踪工具构建 ROS 2。 然后,它展示了如何使用 ros2_tracing 跟踪 performance_test 实验,并使用 tracetools_analysis 绘制回调持续时间。

如需更多跟踪分析,请查看 其他示例笔记本tracetools_analysis API 文档ros2_tracing 设计文档 也包含大量信息。