我是靠谱客的博主 壮观高跟鞋,最近开发中收集的这篇文章主要介绍MoveIt » Tutorials » OMPL Planner 中文翻译OMPL 规划器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题:

OMPL的中文教程较少,很多中文教程基本时机器翻译,然后复制粘贴,并不符合国人的阅读习惯以及表述不准确导致晦涩难懂。

目标:

以自己的理解,翻译下方连接的Moveit OMPL教程(欢迎点评给予建议)

https://ros-planning.github.io/moveit_tutorials/doc/ompl_interface/ompl_interface_tutorial.html


OMPL 规划器

开源运动规划库(OMPL)是一个集成了众多先进的基于采样算法的库,也是MoveIt的默认规划器。更多的信息请看OMPL官方网站

OMPL设置

接下来,我们来看一下OMPL的重要配置的设置。这些设置一般可在机器人moveit_config软件包中的ompl_planning.yaml文件中找到。

最长有效段参数(Longest Valid Segment Fraction)

Longest Valid Segment Fraction可定义机器人运动规划时用于碰撞检测的离散化程度,这极大地影响了基于OMPL的解决方案的性能和可靠性。在context中的motion可以理解为时图结构中两个节点的边(其中节点为轨迹上的航点)。OMPL的默认运动碰撞检查器将边离散化成多个子状态,从而进行碰撞检查。当前OMPL/MoveIt中没有可用的连续碰撞检测的实现,这也是该领域所关注讨论的。

 

准确来说,Longest Valid Segment Fraction是机器人状态空间的分段阈值(省略部分语句,因为阻碍理解)。例如,如果Longest Valid Segment Fraction = 0.01,那么我们就假设:若两点之间的边的长度小于状态空间的1%,则无需显示地检测该边的任何子状态,只需要检测两点。

 

ompl-planning.yaml文件中除了有Longest Valid Segment Fraction参数外,还有MaximumWaypointDistance,你可以在动态配置文件夹中找到该文件。MaximumWaypointDistance也是可定义机器人运动规划时用于碰撞检测的离散化程度,但是在绝对空间中而不是在状态空间中。例如,如果MaximumWaypointDistance =0.1,那么若两点之间的边的长度小于的0.1,则无需显示地检测该边的任何子状态,只需要检测两点。

 

如果Longest Valid Segment FractionMaximumWaypointDistance都设置了,则选择最保守离散化的变量(即在给定边上对最多子状态进行碰撞检查的变量)。

 

Longest Valid Segment Fraction(或MaximumWaypointDistance)设置得太低,碰撞检查/运动计划将非常慢;设置得太高,在小的或狭窄的物体周围将丢失碰撞。此外,较高的碰撞检查分辨率将导致路径平滑器输出难以理解的运动,因为它们能够“捕获”无效路径,然后就会尝试通过对其进行采样点来尽可能修复它们。
 

此处记录了参数对两个MoveIt教程示例的影响的分析。

 

投影评估器(Projection Valid Segment)

投影评估器可以根据关节或连杆的列表大致估计配置空间的覆盖范围。规划器(例如KPIECE,BKPIECE,LBKPIECE和PDST)都使用了此设置。有关更多信息,请阅读相应的出版物。

 

关节空间的加强规划(Enforce Planning in Joint Space)

根据规划问题的不同,MoveIt会在关节空间和笛卡尔空间之间进行选择,以表征规划问题。设置规划组参数ForceJointModelStateSpace,可让规划器强制使用关节空间去求解规划问题。

 

默认情况下,对具有方向路径约束的规划请求在笛卡尔空间中进行采样,以便调用IK作为采样生成器。

 

执行关节空间的规划程序将使用拒绝采样来找到有效的请求。请慎重使用,因为这可能会大大增加计划时间。

 

其他设置

根据您使用的计划器,其他调参/参数的设置都会扫描出来。这些设置的默认值是在MoveIt Setup Assistant中自动生成的,并列在ompl_planning.yaml文件中,建议您自行调参。

 

速度和最优性的权衡

在OMPL中的规划器都喜欢快速得找到可行路径而不在乎路径的质量。在后处理阶段中,平滑和缩短可行路径,以获得更接近最佳路径。然而,OMPL中的算法是概率性的,无法保证每次都能找到全局最优值或找到相同的解决方案。在基于相同的环境,起点和目标下,其他搜索库(例如基于搜索的计划库(SBPL))可以提供确定的结果,您将始终获得相同的路径。SBPL是基于A *的,因此您将获得所设置的搜索分辨率下的最理想的结果。但是,SBPL也有缺点,例如很难以适当的分辨率定义状态空间网格(例如,如何定义关节角度或末端执行器姿势的合适的离散度?)以及修改特定的启发式算法。

OMPL中有几个规划器可以提供理论上的渐近最优性保证:他们能收敛到最优解,但是收敛可能很慢。这些规划器使用的优化目标通常是路径长度的最小化,但也可以使用其他优化目标。

 

OMPL优化目标

OMPL中的部分规划器能针对指定的优化目标进行优化。本教程描述了配置这些优化目标所需的步骤。当前发布于MoveIt的渐近最优规划器是:

  • RRT*
  • PRM*
  • LazyPRM*
  • BFMT
  • FMT
  • Lower Bound Tree RRT (LBTRRT)
  • SPARS
  • SPARS2
  • Transition-based RRT (T-RRT)

 

OMPL还提供了一种名为AnytimePathShortening的元优化算法,该算法以并行方式反复运行多个规划程序,并对path shortcuttingpath hybridization进行交叉操作。path shortcuttingpath hybridization是两种技术局部优化路径的解决方案。尽管没有被证明是最优的,但在实践中它通常是获得接近最优解路径的有效解。

 

OMPL中的其他最佳计划者,但尚未在MoveIt中发布:

  • RRT#
  • RRTX
  • Informed RRT*
  • Batch Informed Trees (BIT*)
  • Sparse Stable RRT
  • CForest

 

并且都使用以下优化目标:

  • PathLengthOptimizationObjective (Default) (路径长度)
  • MechanicalWorkOptimizationObjective          
  • MaximizeMinClearanceObjective                  (最大化最小间隙)
  • StateCostIntegralObjective                            (状态代价积分)
  • MinimaxObjective                                            

 

这些优化目标的配置可以在ompl_planning.yaml中完成,添加名称为optimization_objective的参数作为配置参数,参数的值设置为所选优化目标的名称。例如,要将RRTstar配置为使用MaximizeMinClearanceObjective,ompl_planning.yaml中的规划器条目将如下所示:

RRTstarkConfigDefault:
    type: geometric::RRTstar
    optimization_objective: MaximizeMinClearanceObjective
    range: 0.0
    goal_bias: 0.05
    delay_collision_checking: 1

 

其他优化目标可以通过编程定义。有关OMPL最优规划器的更多信息,请阅读OMPL-Optimal Planning文档。

 

OMPL优化器停止条件

当超过给定的时间限制时,OMPL中的规划期会终止求解。但是,可以通过在ompl_planning.yaml中的termination_condition参数为每个规划程序配置指定额外的规划程序终止条件。可能的值为:

  • Iteration [num]:在num次迭代后终止(num应为正整数)。
  • CostConvergence [solutionsWindow,epsilon]:在代价(由优化目标指定)收敛之后终止。参数solutionsWindow指定的最小解决方案数,用于确认规划器是否收敛。参数ε是要考虑收敛的阈值。这应该是接近0的正数。如果在找到新的更好的解决方案后累积移动平均值没有以ε的相对分数变化,则已经达到收敛。此终止条件仅在OMPL 1.5.0及更高版本中可用。
  • ExactSolution:找到确切的解决方案或发生超时后立即终止。这修改了anytime/optimizing规划器的逻辑,在发现第一个可行解决方案时终止。

 

在所有情况下,规划程序都将在满足用户指定的终止条件或达到超时指定的时限时终止(先触发先中止)。

 

例如,要指定RRTstar在收敛时终止,可以使用以下设置:

RRTstarkConfigDefault:
    type: geometric::RRTstar
    termination_condition: CostConvergence[10,.1]
    range: 0.0
    goal_bias: 0.05
    delay_collision_checking: 1

请注意,未指定优化目标,将使用默认优化目标PathLengthOptimizationObjective。

 

平滑后处理

请注意,有平滑处理能减少的迂回路线是有限的。还要注意,这里我们讨论仅基于几何(运动学)的平滑。速度/加速度/加速度率的平滑在其他地方处理,请参见时间参数化。

 

您可以通过增加规划时间来调整MoveIt在平滑上花费的时间。找到初始解后且allowed_planning_time用尽前,所有剩余时间将用于平滑处理。MoveIt还进行path hybridization,将N个不同计划结果的最佳部分拼接在一起。因此,num_planning_attempts也影响质量。

 

尽管当前尚未在MoveIt(TODO)的最高级发布,但可以通过在model_based_planning_context.cpp中将simplification duration 设置为0(无限制)来实现更平滑的处理。这将启用OMPL的simpleMax()函数。

 

除了内部OMPL平滑器之外,最近还进行了使用STOMP / CHOMP进行后处理的工作。请参阅此博客文章。

Persistent Roadmaps

默认情况下,对于每个运动规划请求,规划算法均从头开始。但是,对于构建环境路线图的某些规划器,如果规划场景或多或少是静态的,则可以从先前的运动计划请求中重用路线图。请考虑以下计划配置:

PersistentLazyPRMstar: # use this with a representative environment to create a roadmap
    type: geometric::LazyPRMstar
    multi_query_planning_enabled: true
    store_planner_data: true
    load_planner_data: false
    planner_data_path: /tmp/roadmap.graph
PersistentLazyPRM: # use this to load a previously created roadmap
    type: geometric::LazyPRM
    multi_query_planning_enabled: true
    store_planner_data: false
    load_planner_data: true
    planner_data_path: /tmp/roadmap.graph
SemiPersistentLazyPRMstar: # reuses roadmap during lifetime of node but doesn't save/load roadmap to/from disk
    type: geometric::LazyPRMstar
    multi_query_planning_enabled: true
    store_planner_data: false
    load_planner_data: false
SemiPersistentLazyPRM: # reuses roadmap during lifetime of node but doesn't save/load roadmap to/from disk
    type: geometric::LazyPRM
    multi_query_planning_enabled: true
    store_planner_data: false
    load_planner_data: false

 

第一个规划程序配置PersistentLazyPRMstar,将使用LazyPRM *来随着每个运动计划请求,在采样的机器人配置之间不断发展渐近最优路径的路线图。销毁规划器实例后,它将把路线图保存到磁盘中。 PersistentLazyPRM配置与之类似,不同之处在于它将从磁盘加载路线图,但销毁后不会将其保存。SemiPersistent规划器配置不会加载/保存路线图,但是会随着每个运动规划请求的进行而不断扩展路线图(而不是在规划之前清除路线图的默认行为)。支持持续性规划功能的四个计划器是:PRM,PRM *,LazyPRM和LazyPRM *。它们之间的关键区别在于,当在路线图中搜索有效路径时,惰性变体将根据需要,重新验证节点和边的有效性。非惰性变体将不会检查路线图对于当前环境是否仍然有效。换句话说,对于静态环境,请使用非惰性变体;对于变化很小的环境,请使用惰性变体;如果环境可能发生重大变化,请使用非持久性计划器。

 

请注意,仅在OMPL 1.5.0及更高版本中才可以使用保存和加载路线图。

最后

以上就是壮观高跟鞋为你收集整理的MoveIt » Tutorials » OMPL Planner 中文翻译OMPL 规划器的全部内容,希望文章能够帮你解决MoveIt » Tutorials » OMPL Planner 中文翻译OMPL 规划器所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部