如何对规划管线进行基准测试
如果你还没有完成入门指南中的步骤,请先完成。
基准测试包 (benchmarking package) 提供了对 MoveIt 规划管线进行基准测试以及使用 OMPL Planner Arena 汇总和绘制统计数据的方法。下面的示例演示了如何运行基准测试。
要运行该示例,你需要先安装 git lfs(运行 git lfs install),并将 moveit_benchmark_resources 克隆到你的工作区。
通过运行以下命令启动基准测试:
ros2 launch moveit2_tutorials run_benchmarks.launch.py运行时间取决于 benchmarks.yaml 中的设置,可能需要一段不短的时间。基准测试结果将保存在 /tmp/moveit_benchmarks/ 目录中。要查看基准测试数据,需要先将日志文件转换为数据库。这一步可以使用 moveit_ros_benchmarks 包提供的脚本完成:
ros2 run moveit_ros_benchmarks moveit_benchmark_statistics.py LOG_FILE_1 ... LOG_FILE_N该命令会创建一个数据库,包含所有指定的基准测试日志文件数据。更简便的做法是使用仓库中的全部日志文件来生成数据库——例如传入参数 /tmp/moveit_benchmarks/*,即可将该目录下的所有日志文件汇总到一个数据库中。数据库文件名为 benchmark.db,创建在运行上述命令时所在的工作目录中。
将数据库文件上传到 plannerarena.org,即可交互式地可视化查看结果。
配置基准测试的 ROS 2 参数
Section titled “配置基准测试的 ROS 2 参数”基准测试由一组 ROS 2 参数配置。你可以在 BenchmarkOptions.hpp 文件中了解更多关于这些参数的信息。
BenchmarkExecutor 类
Section titled “BenchmarkExecutor 类”该类根据指定的 BenchmarkOptions 实例中的参数,创建一组 MotionPlanRequests,然后在每个指定的规划器上执行这些请求。在 BenchmarkOptions 中,查询(queries)、goal_constraints 和 trajectory_constraints 被视为相互独立的查询。如果指定了一组 start_states,则每个查询、goal_constraint 和 trajectory_constraint 都会与每个起始状态逐一组合(查询中已有的起始状态将被忽略)。类似地,可选的路径约束集也会与起始查询和 goal_constraint 进行组合(查询中已有的 path_constraint 将被忽略)。如果指定了工作空间参数,则会覆盖任何已有的工作空间设置。
基准测试管线不经过 MoveGroup,而是直接初始化并运行规划管线,包括所有指定的 PlanningRequestAdapters。这种方式特别适合用来评估平滑适配器(smoothing adapter)的效果。
如需自定义基准测试的运行方式,可以从 BenchmarkExecutor 派生子类,并覆盖其中的一个或多个虚函数。例如,覆盖 initializeBenchmarks() 或 loadBenchmarkQueryData(),可以直接指定基准测试查询并提供自定义的规划场景,而无需依赖 ROS warehouse。
此外,BenchmarkExecutor 还提供了一组回调函数,方便在派生类中进行自定义:
preRunEvent:在每次 solve 调用之前立即调用postRunEvent:在每次 solve 调用之后立即调用plannerSwitchEvent:在基准测试期间规划器切换时调用querySwitchEvent:在新的基准测试问题开始执行之前调用
需要说明的是,上述语境中的”基准测试 (benchmark)“指的是 PlanningScene、起始状态、目标约束或 trajectory_constraints 以及可选的 path_constraints 的一个具体实例;而”运行 (run)“指的是某个规划器尝试求解该基准测试的一次执行过程。