我是靠谱客的博主 明亮薯片,最近开发中收集的这篇文章主要介绍OMPL 入门Tutorial 6:基准规划器(Benchmarking planner),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

以下内容为OMPL官方Tutorial Benchmarking planners的翻译

OMPL 包含一个ompl::Benchmark类用于加速解决运动规划的问题。它会重复地使用不同参数、不同规划器、不同采样器、甚至是同一规划算法的不同配置版本来求解问题。接下来会演示你如何使用这个类。

对于可视化交互benchmark databases, 请见 plannerarena.org.

创建一个基准配置文件

OMPL.app包含一个命令行程序 ompl_benchmark,他可以读取一个使用Ini格式键值对的配置文本文件。这与OMPL.app GUI所能够读取和保存的格式是相同的。GUI忽略与benchmarking相关的配置。然而,一般通过创建GUI初始化配置并用文本编辑器添加基准设置的方式更方便。目前ompl_benchmark程序的基本功能仅支持SE(2), SE(3)的集合规划和对一些系统的动力学规划,然而用户可以扩展到其他类型的规划问题。

定义一个问题有一系列必要的参数。这些都存在于"**[problem]**"头标识下:

  • name:要解决问题的名字
  • robot:机器人的几何文件的路径
  • start.[x|y|z|theta],start.axis.[x|y|z]:描述机器人起始状态的值。在2D场景中,方向只需要通过start.theta来确定,在3D场景中则是用的轴角姿态
  • goal.[x|y|z|theta],goal.axis.[x|y|z]:描述机器人目标状态的值。

以下是一些"**[problem]**"头标识下可选的参数

  • world:环境几何信息的文件路径。默认情况下认为机器人在空的工作空间中运动
  • objective:OMPL中的一些规划器可以根据一些优化目标函数来优化路径。objective参数可以设置为length, max_min_clearance或者mechanical_work,分别用于最小化路径长度,最小最大化路径的周围空间,或者路径的机械功。默认值为length
  • objective.threshold:如果确定了一个objective,你也可以选择给定一个objective.threshold,也就是当cost满足这个threshold之后就会停止优化。默认情况下为最优的可能值(例如,对于路径长度而言,默认值为0,那么规划器会试图找到最短的路径)
  • control:OMPL.app有很少的内置动力学系统。control参数可以被设置为kinematic_car, dynamic_car, blimp和quadrotor。默认情况认为是rigid-body planning。注意,动力学轨迹规划比刚体规划更困难。
  • sampler:这个参数确定规划器所用的采样器。可用的采样器有:uniform, gaussian, obstacle_based, max_clearance。默认为uniform。
  • volume.[min|max].[x|y|z]:有的时候需要给定工作空间的边界。如果没有给定的话,OMPL.app会设置为包含环境(如果给定了)和起始、目标点的最小的bounding box,不过依赖于环境并不是一个很好的假设。

benchmarking相关的参数必须在"**[benchmark]**"头标识下给出:

  • time_limit:规划器最大计算时间
  • mem_limit:每个规划器最大的内存空间(MB)。内存测量并不是非常准确,因此推荐设一个比较大的值。
  • run_count:每个规划器在规划的时候的最大重复次数。
  • output:benchmark的日志文件储存路径。这个参数是可选的,默认为与configuration文件路径相同。
  • save_paths:这个参数也是可选的,可以设置为none(默认值), all或shortest来使其不保存路径,保存所有路径(包括近似的解),或者最短的准确解。这些路径可以通过OMPL.app GUI来回放。

最后一个需要明确的元素是基准规划器。在"**[planner]**"头标识下给定。对于几何规划基准而言,下面这些规划器是可以选择使用的:kpiece, bkpiece, lbkpiece, est, sbl, prm, lazyprm, lazyprmstar, rrt, rrtconnect, lazyrrt, rrtstar, lbtrrt, trrt, spars, spars2, stride, pdst, fmt, 和 aps。对于动力学规划而言,下面这些是可以选择使用的:kpiece, rrt, est, pdst, sycloprrt, 和 syclopest。

一个最小的SE(2)配置,对比rrt和est规划的例子如下:

[problem]
name=my_benchmark_problem
robot=my_robot_mesh.dae
start.x=0.0
start.y=0.0
start.theta=0.0
goal.x=1.0
goal.y=1.0
goal.theta=0.0
 
[benchmark]
time_limit=10.0
mem_limit=1000.0
run_count = 3
 
[planner]
est=
rrt=

任何这些规划器定义的参数也可以作为benchmark的参数。例如,geometric::RRT规划器定义了两个参数,“range"和"goal_bias”,都为实值。默认值可以通过下面的方式在"planner"头标识下改变:

  • rrt.range=50.0
  • rrt.goal_bias=0.10

还有很多其他可选的参数可以被改变或者明确。ompl_benchmark利用ompl::base::ParamSet类,可以使用这个方法来设置任何文件中定义的参数。如果一个类给出一个参数的接口,那么就有可能通过config文件来调整它。OMPL.app在benchmark路径中提供两个示例configuration文件 example.cfg和example_complex.cfg来展示这些可选的参数。

可以对同一个规划器创建很多配置不同的实例。下面这段代码演示了创建两个不同参数的rrtconnect的实例:

rrtconnect=
rrtconnect.range=100
rrtconnect=
rrtconnect.range=200

此外,不同的规划器实例之间问题的设定也可以不同。下例中,第二个kpiece的问题设定就被改变了

kpiece=
kpiece=
# 在每一个维度上都增加projection的尺寸为factor倍。
problem.projection.cellsize_factor = 4.0
# 定义一个不同的采样器
problem.sampler=obstacle_based

当使用多个planner实例的时候,一个很有用的参数是"name",因为它可以被用于重命名一个规划器。比如,两个geometric::PRM的实例可以被同时创建但命为不同的名字。有不同的名字在用benchmark script处理日志数据的时候十分有用。

prm=
problem.sampler=uniform
prm.name=uniprm
prm=
problem.sampler=obstacle_based
prm.name=obprm

最后,如果要执行一个benchmark配置文件,只需要运行OMPL.app bin目录中的ompl_benchmark可执行文件,并提供config文件的路径作为参数即可。

写benchmarking代码

在OMPL中,对于一个具体的问题而言,在你的代码中用Benchmark类来Benchmarking一些规划器是十分简单的。需要的步骤如下:

  • 用ompl::geometric::SimpleSetup或者ompl::control::SimpleSetup确定benchmark问题
  • 创建一个以问题作为输入的ompl::Benchmark object
  • (可选)用ompl::Benchmark::addExperimentParameter确定一些benchmark object的参数。当在参数化基准上统计一些基准结果的时候会非常有用。
  • 添加一个或多个规划器
  • (可选)添加在规划器运行前或后将会被调用的事件
  • 在给定时间和内存限制的前提下,运行benchmark问题一定的次数

下面这段代码演示如何实现上述内容,我们会从一些你可能已经用过的代码开始。

#include "ompl/tools/benchmark/Benchmark.h"
 
// 一个匹配ompl::base::PlannerAllocator类型的函数,他被分配一个EST的实例
ompl::base::PlannerPtr myConfiguredPlanner(const ompl::base::SpaceInformationPtr &si)
{
    geometric::EST *est = new ompl::geometric::EST(si);
    est->setRange(100.0);
    return ompl::base::PlannerPtr(est);
}
 
// 为我们规划的空间创建一个状态空间
ompl::geometric::SimpleSetup ss(space);
 
// 配置要解决的问题:设置起始状态和目标状态的表示。
// 所有都必须要在 ss.solve() 调用之前设置完成。不需要设置planner

Benchmarking代码从这里开始

// 首先创建一个benchmark类
ompl::tools::Benchmark b(ss, "my experiment");
 
// 可选内容,确定一些benchmark参数(不会影响benchmark的运行)
b.addExperimentParameter("num_dofs", "INTEGER", "6")
b.addExperimentParameter("num_obstacles", "INTEGER", "10")
 
// 添加需要评估的规划器
b.addPlanner(base::PlannerPtr(new geometric::KPIECE1(ss.getSpaceInformation())));
b.addPlanner(base::PlannerPtr(new geometric::RRT(ss.getSpaceInformation())));
b.addPlanner(base::PlannerPtr(new geometric::SBL(ss.getSpaceInformation())));
b.addPlanner(base::PlannerPtr(new geometric::LBKPIECE1(ss.getSpaceInformation())));
// etc
 
// 对于我们想用特定方式来配置的规划器,需要用到ompl::base::PlannerAllocator
b.addPlannerAllocator(std::bind(&myConfiguredPlanner, std::placeholders::_1));
// etc.
 
// 现在我们可以benchmark了:每个规划计算有5s时间限制,100MB内存限制,50次迭代次数。下面的true代表
// 在计算的时候会显示一个文本模式的进度条
ompl::tools::Benchmark::Request req;
req.maxTime = 5.0;
req.maxMem = 100.0;
req.runCount = 50;
req.displayProgress = true;
b.benchmark(req);
 
// 这会生成一个 ompl_host_time.log 形式的文件
b.saveResultsToFile();

也可以为之前或之后的执行内容添加回调函数

// 假设下列函数已经被定义了
void optionalPreRunEvent(const base::PlannerPtr &planner)
{
    // 在这里对规划器做如何我们期望的配置,包括通过planner->getProblemDefinition()改变问题定义
}
 
void optionalPostRunEvent(const base::PlannerPtr &planner, tools::Benchmark::RunProperties &run)
{
    // 做一些清理工作,或者为之后的运行设置一些值之类的
 
    // 也可以为收集的运行性质添加元素,添加的数据会记录在日志文件中
 
    run["some extra property name INTEGER"] = "some value";
    // 添加数据的格式是字符串键值对,其中键的最后一个单词是REAL,INTEGRE,BOOLEAN,STRING之一。(这回影响之后日志文件被处理和储存为数据库的类型)。
}
 
// Benchmark类被定义之后,下面这些前面提到的,“之前或之后”发生的事件可以被注册到类中(可选)
b.setPreRunEvent(std::bind(&optionalPreRunEvent, std::placeholders::_1));
b.setPostRunEvent(std::bind(&optionalPostRunEvent, std::placeholders::_1, std::placeholders::_2));

Processing the benchmarking log file

考虑到暂时用不到,这一篇又比较长,后面有需要的时候再翻译

最后

以上就是明亮薯片为你收集整理的OMPL 入门Tutorial 6:基准规划器(Benchmarking planner)的全部内容,希望文章能够帮你解决OMPL 入门Tutorial 6:基准规划器(Benchmarking planner)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部