以下内容为OMPL官方Tutorial Optimal planning 的翻译

定义一个基于优化的运动规划问题几乎与常规的问题定义一样,除了以下两点区别:

  • 需要给ompl::base::ProblemDefinition定义优化目标
  • 需要一个优化规划器来做真正的运动规划

找寻最短路径

我们将通过一个例子演示OMPL的最优路径规划框架。这个例子中,机器人被表示为一个方形区域上的(x,y)坐标点,其中(0,0)是方形的左下角,(1,1)是方向的右上角。方形区域中有一个中心为(0.5, 0.5),半径为0.25的障碍物。为了表示这个环境,我们用到了二维ompl::base::RealVectorStateSpace并按照如下方式定义了我们的可行状态检测:

// 碰撞检测。在这个例子中,机器人的状态空间位于[0,1]x[0,1],其中有一个半径为0.25,中心位于(0.5,0.5)的圆。 任何位于这个圆中的状态都认为是碰撞的。
class ValidityChecker : public ob::StateValidityChecker
{public:ValidityChecker(const ob::SpaceInformationPtr& si) :ob::StateValidityChecker(si) {}// 返回给定的状态位置是否与圆形障碍重合bool isValid(const ob::State* state) const{return this->clearance(state) > 0.0;}// 返回给定的状态与原型障碍物的举例double clearance(const ob::State* state) const{// 我们在这个例子中用到的是RealVectorStateSpace,因此我们将state装换为对应的类型const ob::RealVectorStateSpace::StateType* state2D =state->as<ob::RealVectorStateSpace::StateType>();// 从状态中提取(x,y)位置坐标double x = state2D->values[0];double y = state2D->values[1];// 两点之间距离公式,增加了一个圆圈半径的偏移return sqrt((x-0.5)*(x-0.5) + (y-0.5)*(y-0.5)) - 0.25;}
};

在我们的路径规划代码中,我们定义了状态空间及其边界,和我们的起始及目标状态。在这个例子中,起始状态为(0,0),目标状态为(1,1)。如果你已经使用过OMPL一般的运动规划代码,那么下面的代码应该对你来说很熟悉。

// 创建机器人状态空间[0,1]x[0,1], R^2的子集.
ob::StateSpacePtr space(new ob::RealVectorStateSpace(2));// 设定空间边界 [0,1].
space->as<ob::RealVectorStateSpace>()->setBounds(0.0, 1.0);// 为这个状态空间创建空间信息
ob::SpaceInformationPtr si(new ob::SpaceInformation(space));// 设定有效状态检测函数
si->setStateValidityChecker(ob::StateValidityCheckerPtr(new ValidityChecker(si)));si->setup();// 设置机器人初始位置为(0,0)
ob::ScopedState<> start(space);
start->as<ob::RealVectorStateSpace::StateType>()->values[0] = 0.0;
start->as<ob::RealVectorStateSpace::StateType>()->values[1] = 0.0;// 设置机器人目标位置为(1,1)
ob::ScopedState<> goal(space);
goal->as<ob::RealVectorStateSpace::StateType>()->values[0] = 1.0;
goal->as<ob::RealVectorStateSpace::StateType>()->values[1] = 1.0;// 创建问题实例
ob::ProblemDefinitionPtr pdef(new ob::ProblemDefinition(si));// 设定起点终点
pdef->setStartAndGoalStates(start, goal);

接下来,我们需要给优化规划定义一个ompl::base::OptimizationObjective。现在,我们希望定义一个目标函数为起点与终点之间的最短距离。我们将定义另一个函数返回这个目标值

// 返回表示最优运动规划的优化目标。这个方法返回一个试图最小化路径的objective。
ob::OptimizationObjectivePtr getPathLengthObjective(const ob::SpaceInformationPtr& si)
{return ob::OptimizationObjectivePtr(new ob::PathLengthOptimizationObjective(si));
}

然后就可以设置目标函数了

pdef->setOptimizationObjective(getPathLengthObjective(si));

注意:我们所用的优化规划器,ompl::geometric::RRTstar,默认为路径长度优化。也就意味着对于这个例子而言,其实上面的声明是不必要的。但如果你想定义一个其他的优化指标,则需要手动的给ompl::base::ProblemDefinition设定

接下来,我们定义优化规划器并尝试求解问题:

// 用RRTstar算法建立优化规划器
ob::PlannerPtr optimizingPlanner(new og::RRTstar(si));// 为我们的规划器设置问题定义
optimizingPlanner->setProblemDefinition(pdef);
optimizingPlanner->setup();// 尝试在1s时间内求解问题
ob::PlannerStatus solved = optimizingPlanner->solve(1.0);

这里有一个动图演示RRTstar规划器求解上述定义问题结果(见原文链接)

注意,当试图求解优化问题的时候,我们设定时间限制为1秒。在常规运动规划中,规划器会在找到解后停止,这会用远小于1秒的时间。然而,如果你运行这个例子就会发现他总是使用了完整的1秒时间。这是因为优化求解器有一个更严格的终止条件。常规规划器在找到解之后停止;然而优化规划器需要在找到满足优化目标的解才会停止。

定义优化阈值

如何定义满足优化目标?这个行为可以个人定制,但默认是寻找最短的满足一些质量阈值的路径。对于最短路径规划而言,这意味着寻找一条比给定长度更短的路径。你可能会发现我们之前从未定义这个阈值,因为如果没有设置的话,ompl::base::PathLengthOptimizationObjective会默认将threshold设置为0.0。这就意味着只有长度小于0.0的路径才满足目标,那永远不可能满足。这么做的原因是我们假设如果你希望在给定时间内返回找到的最短的路径。因此,threshold设为0.0永远不能被满足,并保证规划器一直运行到时间上限,并返回他能找到的最优路径。

我们可以通过setCostThreshold方法创建一个质量阈值为1.51的OptimizationObjective:

ob::OptimizationObjectivePtr getThresholdPathLengthObj(const ob::SpaceInformationPtr& si)
{ob::OptimizationObjectivePtr obj(new ob::PathLengthOptimizationObjective(si));obj->setCostThreshold(ob::Cost(1.51));return obj;
}

如果你将这个设置为ompl::base::ProblemDefinition的目标,你会发现规划器会终止得快很多,因为只要他找到一个满足阈值的路径就会返回了。注意当调用ompl::base::OptimizationObjective::setCostThreshold时,我们将阈值放在ompl::base::Cost中。后续会讲解更多关于ompl::base::Cost对象的内容,但现在你可以简单地把他当做一个用double值所表示路径cost的对象。

OMPL 入门Tutorial 7:基于优化的规划(Optimal Planning)相关推荐

  1. OMPL 入门Tutorial 9:商空间的规划(QuotientSpace Planning)

    以下内容为OMPL官方Tutorial QuotientSpace planning 的翻译 本篇教程描述QuatientSpace Planning任务与普通的配置空间规划的区别.最后,我们展示了如 ...

  2. OMPL 入门Tutorial 3:使用状态和状态空间(Working with States and State Spaces)

    以下内容为OMPL官方Tutorial Working with States and State Spaces的翻译 为状态分配内存 简易版本: ompl::base::StateSpacePtr ...

  3. 路径规划之基于优化的规划算法

    关注同名微信公众号"混沌无形",有趣好文! 原文链接:机器人曲线插值拟合算法研究现状简述(包含原文PDF百度云下载链接) 第三类算法是主要是将多目标多变量多约束耦合的规划模型转化为 ...

  4. 路径规划之基于插值的规划算法

    关注同名微信公众号"混沌无形",有趣好文! 原文链接:机器人曲线插值拟合算法研究现状简述(包含原文PDF百度云下载链接) 第一类是采用多项式曲线来描述机器人运动轨迹,这是因为多项式 ...

  5. 配电网可靠性评估(4)—(顶刊复现)基于优化模型的配电网可靠性评估

    之前的博客中介绍了配电网可靠性评估的三种方法.分别是解析法中的最小路法,以及序贯蒙特卡罗模拟法及非序贯蒙特卡洛模拟法,顺带提到了含有分布式电源的配电网可靠性评估方法. 配电网可靠性评估(一)最小路法和 ...

  6. 香港中文大学 (深圳) -博士硕士招生 -智能优化及规划方向

    工作介绍 该博士生与硕士生项目由深圳市大数据研究院(www.sribd.cn)的导师指导在香港中文大学(深圳)(www.cuhk.edu.cn)校内开展,授予香港中文大学(深圳)学位.深圳市大数据研究 ...

  7. 基于优化反馈的组合在线学习

    点击上方蓝字关注我们 基于优化反馈的组合在线学习 孔芳1, 杨悦然1, 陈卫2, 李帅1 1 上海交通大学约翰·霍普克罗夫特计算机科学中心,上海 200240 2 微软亚洲研究院,北京 100080 ...

  8. mybatis 详解(三)------入门实例(基于注解)

    1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如 ...

  9. 4 基于优化的攻击——CW

    CW攻击原论文地址--https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...

最新文章

  1. WordPress Editorial Calendar插件权限安全绕过漏洞
  2. 索引扫描、查找、书签查询、覆盖查询示例介绍
  3. 学习EF4的一些基础参考资料
  4. python 函数部分
  5. js如何实现扫描身份证识别_如何识别身份证上信息?快速录入看这招
  6. windows用户账户类型
  7. Windows98 win98.bif 文件
  8. 如何使用HTML制作个人网站( web期末大作业)
  9. ssm水电费管理系统java
  10. easypanel面板搭建虚拟主机教程
  11. Harmony OS har包生成和使用技巧
  12. U盘出现“请将磁盘插入U盘”的问题怎么解决?
  13. 基于sklearn进行蝴蝶花分类案例(Python机器学习笔记)
  14. php中mysql_assoc,在PHP中使用mysql_fetch_assoc时出现警告
  15. 深入剖析NVMe Over Fabrics
  16. Office Powerpoint演示文档大瘦身
  17. kermit的安装与使用
  18. Azure IoT Hub 十分钟入门系列 (2)- 使用模拟设备发送设备到云(d2c)的消息
  19. 3D游戏建模:胜似美杜莎的超细节刻画—《大海的精灵》| 模型欣赏
  20. D. Very Suspicious

热门文章

  1. [Dream Team邀请赛]----Money Henry拣钱
  2. python将文件转成linux格式,怎么用python在Windows系统下,生成UNIX格式文件
  3. 写在2021新年到来前
  4. 买新不买旧?选购固态硬盘的几点建议
  5. html5独立钻石棋,自制独立钻石棋
  6. 广东第二师范学院计算机科学与技术(软件工程)的专业在哪,广东第二师范学院好就业吗?广东第二师范学院就业如何?...
  7. 安装WIN7系统出现问题——安装程序无法创建新的系统分区,也无法定位现有的系统分区
  8. 扎克伯格上手演示四款VR头显原型机,Meta透露元宇宙「家底」
  9. 群聊太多?三步教你用 Python 自动监听转发群消息!
  10. wing新浪微博AIR客户端获Adobe Flash开发大赛一等奖