OMPL官方教程学习笔记

OMPL库教程翻译/OMPL学习 #include <ompl/base/SpaceInformation.h> #include <ompl/base/spaces/SE3StateSpace.h> #include <ompl/geometric/planners/rrt/RRT.h> #include <ompl/geometric/SimpleSetup.h> #inc... 阅读详情

Geometric planning for a rigid body in 3D

这是官方教程中的第一个示例:讲述了使用OMPL的一般组织架构,结合官方的API关系图更好理解

在这里插入图片描述

  1. 使用SimplSetup类我们就需要实现:StateValidityChecker与StateSpace
  2. 不适用SimpleSetup类我们就需要实现:StateValidityChecker、SpaceInformation、ProblemDefinition、planner、StateSpace
  3. 我看了后面教程才知道,使用OMPL的过程中还要按照要求去实现一些函数,因此下面的代码看起来可能有些难以理解,不过这是官方第一个教程,重点是理解上面图中的关系。
/*********************************************************************
* Software License Agreement (BSD License)
*
*  Copyright (c) 2010, Rice University
*  All rights reserved.
*
*  Redistribution and use in source and binary forms, with or without
*  modification, are permitted provided that the following conditions
*  are met:
*
*   * Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*   * Redistributions in binary form must reproduce the above
*     copyright notice, this list of conditions and the following
*     disclaimer in the documentation and/or other materials provided
*     with the distribution.
*   * Neither the name of the Rice University nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
*  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
*  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
*  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
*  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
*  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
*  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
*  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
*  POSSIBILITY OF SUCH DAMAGE.
*********************************************************************/

/* Author: Ioan Sucan */

#include <ompl/base/SpaceInformation.h>
#include <ompl/base/spaces/SE3StateSpace.h>
#include <ompl/geometric/planners/rrt/RRTConnect.h>
#include <ompl/geometric/SimpleSetup.h>

#include <ompl/config.h>
#include <iostream>

namespace ob = ompl::base;
namespace og = ompl::geometric;

bool isStateValid(const ob::State *state)
{
    // cast the abstract state type to the type we expect
    // 这里将抽象基类装换成复合状态空间SE(3),这是看了后面教程才知道的
    const auto *se3state = state->as<ob::SE3StateSpace::StateType>();

    // extract the first component of the state and cast it to what we expect
    // 从复合状态空间SE(3)中提取R^3
    const auto *pos = se3state->as<ob::RealVectorStateSpace::StateType>(0);

    // extract the second component of the state and cast it to what we expect
    // 从复合状态空间SE(3)中提取SO(3)
    const auto *rot = se3state->as<ob::SO3StateSpace::StateType>(1);

    // check validity of state defined by pos & rot


    // return a value that is always true but uses the two variables we define, so we avoid compiler warnings
    return (const void*)rot != (const void*)pos;
}

void plan()
{
    // construct the state space we are planning in
    // 创建规划所在的状态空间
    auto space(std::make_shared<ob::SE3StateSpace>());

    // set the bounds for the R^3 part of SE(3)
    // 创建Rn的状态空间的边界
    ob::RealVectorBounds bounds(3);
    bounds.setLow(-1);
    bounds.setHigh(1);
    // 设置状态空间的边界
    space->setBounds(bounds);

    // construct an instance of  space information from this state space
    // 创建一个SpaceInformation类
    auto si(std::make_shared<ob::SpaceInformation>(space));

    // set state validity checking for this space
    // SpaceInformation对象进行状态点有效性检测,这里直接使用isStateValid,感觉是一样啊
    si->setStateValidityChecker(isStateValid);

    // create a random start state
    ob::ScopedState<> start(space);
    start.random();

    // create a random goal state
    ob::ScopedState<> goal(space);
    goal.random();

    // create a problem instance
    // 构建问题定义对象,需要SpaceInformation对象
    auto pdef(std::make_shared<ob::ProblemDefinition>(si));

    // set the start and goal states
    // 为问题定义对象设置起始点与终点
    pdef->setStartAndGoalStates(start, goal);

    // create a planner for the defined space
    // 创建规划器对象,需要SpaceInformation对象
    auto planner(std::make_shared<og::RRTConnect>(si));

    // set the problem we are trying to solve for the planner
    // 设置规划器解决的问题对象,需要ProblemDefinition
    planner->setProblemDefinition(pdef);

    // perform setup steps for the planner
    // 启动设置?
    planner->setup();

    // print the settings for this space
    si->printSettings(std::cout);

    // print the problem settings
    pdef->print(std::cout);

    // attempt to solve the problem within one second of planning time
    ob::PlannerStatus solved = planner->ob::Planner::solve(1.0);

    if (solved)
    {
        // get the goal representation from the problem definition (not the same as the goal state)
        // and inquire about the found path
        // 从问题对象中获取结果
        ob::PathPtr path = pdef->getSolutionPath();
        std::cout << "Found solution:" << std::endl;

        // print the path to screen
        path->print(std::cout);
    }
    else
        std::cout << "No solution found" << std::endl;
}

void planWithSimpleSetup()
{
    // construct the state space we are planning in
    // 创建状态空间对象
    auto space(std::make_shared<ob::SE3StateSpace>());

    // set the bounds for the R^3 part of SE(3)
    // 创建状态空间组件的边界,不理解,每个维度最小值为-1,最大1么
    ob::RealVectorBounds bounds(3);
    bounds.setLow(-1);
    bounds.setHigh(1);
    // 设置状态空间组件的边界
    space->setBounds(bounds);

    // define a simple setup class
    // 创建一个SimpleSetup对象,该对象自动实例化SpaceInformation,ProblemDefinition
    og::SimpleSetup ss(space);

    // set state validity checking for this space
    // 设置状态有效性检查类,本来是要传入一个类,此处传入的是一个函数,StateValidityCheckerFn中有说明
    ss.setStateValidityChecker([](const ob::State *state) { return isStateValid(state); });

    // create a random start state
    // 创建ScopedState(域内状态对象么。。。)
    ob::ScopedState<> start(space);
    // 设置这个状态为随机值
    start.random();

    // create a random goal state
    // 同上
    ob::ScopedState<> goal(space);
    goal.random();
    
    // set the start and goal states
    // 设置起始点与终点
    ss.setStartAndGoalStates(start, goal);

    // this call is optional, but we put it in to get more output information
    ss.setup();
    ss.print();

    // attempt to solve the problem within one second of planning time
    // 设置完毕开始求解
    ob::PlannerStatus solved = ss.solve(1.0);

    if (solved)
    {
        std::cout << "Found solution:" << std::endl;
        // print the path to screen
        // 简化求解的结果?
        ss.simplifySolution();
        // 输出结果
        ss.getSolutionPath().print(std::cout);
    }
    else
        std::cout << "No solution found" << std::endl;
}

int main(int /*argc*/, char ** /*argv*/)
{
    std::cout << "OMPL version: " << OMPL_VERSION << std::endl;

    plan();

    std::cout << std::endl << std::endl;

    planWithSimpleSetup();

    return 0;
}

上述代码流程的简单总结:
一、使用SimpleSetup

  1. 创建SE3StateSpace对象
  2. 创建RealVectorBounds
  3. 设置SE3StateSpace的边界
  4. 创建SimpleSetup对象,需要SE3StateSpace
  5. 调用SimpleSetup的setStateValidityChecker,状态的有效性检测
  6. 创建起始点与终点,ScopedState
  7. 调用SimpleSetup的setStartAndGoalStates,设置起点终点
  8. 调用SimpleSetup的solve,解算
  9. 调用SimpleSetup的simplifySolution,简化结果?
  10. 调用SimpleSetup的getSolutionPath,获取路径PathGeometric

二、不使用SimpleSetup

  1. 创建SE3StateSpace对象
  2. 创建RealVectorBounds,并设置边界
  3. 设置SE3StateSpace的边界
  4. 创建SpaceInformation对象,需要SE3StateSpace
  5. 调用SpaceInformation的setStateValidityChecker,状态的有效性检测
  6. 创建起始点与终点,ScopedState
  7. 创建ProblemDefinition,需要SpaceInformation
  8. 调用ProblemDefinition的setStartAndGoalStates,设置起点终点
  9. 创建planner,需要SpaceInformation
  10. 调用planner的setProblemDefinition,需要ProblemDefinition
  11. 调用planner的solve,求解
  12. 调用planner的getSolutionPath,获得路径
OMPL学习--第三篇之源码安装Moveit!和OMPL(Melodic版本) OMPL Moveit! Source install 自定义运动规划算法 文章目录1. 引言2. 实现方法2.1 Source install Moveit!2.2 Source install OMPL3.0 测试 1. 引言 2. 实现方法 操作系统:Ubuntu 18.04 ROS版本:Melodic 2.1 Source install Moveit! 卸载moveit!: su... 阅读详情

相关推荐

ompl

https://github.com/ompl/omplapp https://zhenshenglee.github.io/2016/09/03/160903-ompl1/ http://www.leiphone.com/news/201612/nxlXgriSLasNgAcX.html

kmxz2016 3243

OMPL官方教程学习Constrained Planning Tutorial

Constrained Planning Tutorial 带约束的规划,这个应用场景就很多了 从下面这段话中可以看出,使用带约束的规划: 首先要定义一个约束constraint 其次要在受约束的空间进行规划constrained state space 约束方程满足f(q):Q→Rnf(q):Q \rightarrow R^nf(q):Q→Rn,f(q)=0f(q) = 0f(q)=0. 本次教程使用的约束是:f(q)=∥q∥−1f(q)=\left \| q \right \| - 1f(q)=∥q∥

mapleleaf98的博客 945

OMPL按照教程安装缺少库问题的解决方法

按照官方教程,直接输入命令./install-ompl-ubuntu.sh --python,安装可能很快会完成,并且看不出明显报错,但是其实打开build-Release-lib,会发现少了好几个库,这里为解决该问题所需要对应修改的关键文件。对应安装指南博客页面:https://blog.youkuaiyun.com/qq_38606680/article/details/129028660。

OMPL官方教程学习Optimal Planning Tutorial

Optimal Planning Tutorial Optimal Planning应该是最优规划吧,规划算法在某种程度上是最优,比如RRT*等等。 官方教程中说使用要进行Optimal Planning 与一般的规划方法使用流程基本一样,只不过多了一下两点: 需要为ompl::base::ProblemDefinition 对象设置目标函数optimization objective 需要使用最有规划器optimizing planner,而不是一般的规划器。 尴尬我都不知道一般的规划器使用流程。。。

mapleleaf98的博客 2152

OMPL库学习用

OMPL库官方文档,初学OMPL库使用。OMPL库是主流的运动规划库

omplapp:Open Motion规划库(OMPL),GUI + FCLAssimp集成

开放运动计划库(OMPL) Linux 视窗 这是OMPL.app,它是OMPL的扩展版本,它增加了对网格加载和碰撞检查以及简单GUI的支持。 访问以获取详细的安装说明。 OMPL.app具有以下必需的依赖性: (1.58版或更高版本) (版本3.5或更高版本) (3.3或更高版本) (版本3.0.1270或更高版本) (0.3.1版或更高版本) 以下依赖项是可选的: (用于GUI) (用于GUI) (需要生成Python绑定) (需要使用Open Dynamics Engine编译对计划的支持) (需要在上创建文档的本地副本) 安装依赖项后,您可以在Linux,macOS和MS Windows上构建OMPL.app。 转到OMPL.app的顶级目录,然后键入以下命令: mkdir -p build/Release cd build/Re

OMPL学习--第一篇之简介

OMPL 规划算法 Moveit 安装 文章目录1. OMPL简介2. OMPL能做什么3. OMPL的规划算法分类3.1 Geometric planners3.2 Control-based planners4. Moveit!与OMPL的联系(重点)5. FCL碰撞检测库与OMPL的联系 1. OMPL简介 The Open Motion Planning Library(OMPL)是一个基...

Rot_Tianers 2万+

NAO V6 开发环境的配置(附所有文件)

NAO V6开发环境配置前言环境Robot SettingsChoregraphe 2.8.5.10python2.7+naoqi2.8+opencv4.1.0putty与FileZilla 前言 学校的机器人摸索了一段时间,之前摸爬滚打探索环境,之前没接触这类机器人可能会非常艰辛,希望能给需要的人一些帮助。Nao与pepper通用 环境 win10(x64)+naoqi2.8 1、Robot S...

wbhhello的博客 3219

OMPL Tutorial 0:我在做什么与我为什么要这么做

OMPL教程翻译合集0

Lbaron980810的博客 358

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 460

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 826

ubuntu18.04 OMPL安装教程

ubuntu18.04 OMPL安装教程

weixin_42106556的博客 2372

Cox构建预测模型(5):如何用R语言绘制校准曲线(附全套代码)

这篇文献通过绘制两个模型的DCA曲线来评估模型的临床决策实际需求,一个是列线图模型,包括纳入列线图的全部变量,一个是TNM模型,只纳入TNM分期3个变量。A图是训练集1年、3年、5年患者的总生存期的DCA曲线;B图是训练集1年、3年、5年患者的总生存期的DCA曲线,红色线条代表列线图模型(包括构建模型的10个变量),黄色线条代表TNM模型(仅纳入TNM分期3个变量),两个模型对比,在绘制校准图之前,必须要完成数据的导入、拆分数据集的工作、预测因子的筛选,校准图的绘制是分别在训练集与验证集独立进行的。

qq_37610365的博客 1360

【OMPL】OMPL和Moveit的接口

文章目录版本调用ompl_interface 作为入门者总是不禁去问,ompl作为一个独立于moveit的算法库究竟是如何调用的?本篇博文的目的就是梳理清楚它。 版本 Ubuntu 16.04 kinetic 调用 主要说明一下xml yaml是干嘛的。 首先github看moveit调用ompl的源码: moveit/moveit_planners/ompl/ 很清楚的可以看到 CMakeLists.txt :制定生成规则,应为moveit调用ompl的核心原理也不过与相当于调用插件,因此插件接口就

vrijheid的博客 3874

LabVIEW电压信号采集系统:从零搭建到科研实战

本文详细介绍了如何从零开始搭建一个基于LabVIEW的电压信号采集系统。内容涵盖硬件选型(如NI USB-6002数据采集卡)、软件环境配置、核心程序开发(包括多通道同步采集、数据自动保存)以及高级功能优化。系统支持自定义采样率与时长,并提供了完整的LabVIEW程序框图和配套的Python数据分析脚本,旨在帮助科研人员和工程师快速构建稳定、高效的专属数据采集方案,提升实验自动化水平。

gold8的专栏 461

详述字符集与汉字编码

字符集与字符编码是文本处理的基础概念。字符集定义字符集合(如ASCII、GB2312、Unicode),字符编码则规定字符如何存储为二进制数据。汉字编码经历了从区域化(GB2312、GBK、BIG5)到全球化(Unicode)的演进,Unicode通过UTF-8、UTF-16等编码方案实现跨语言兼容。UTF-8因兼容ASCII、节省空间且无乱码风险,成为中文互联网的主流编码。正确处理编码问题需统一标准、明确声明格式,并注意生僻字的特殊处理。

零零发不爱ai的博客 805

OMPL中的规划算法汇总

OMPL简介 The Open Motion Planning Library(OMPL)是基于采样方法的开源运动规划库,其规划算法可以分为两类: Geometric planners Control-based planners Move it!和OMPL的关系: OMPL is a open source library for sampling based / randomized m...

qq_36013249的博客 3952

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4864

OMPL官方教程学习State Validity Checking

State Validity Checking(状态有效性检测?) State Validity Checking 的功能:描述对于状态空间所给定的某个状态是否有效 OMPL本身不包含State Validity Checking, 因为这个检测过程或者说检测的方法是和实际的问题紧密联系的,从下面的这段话中可以看出,State Validity Checking 这个过程很像是碰撞检测 OMPL itself does not include code for state validity checkin

mapleleaf98的博客 827

【Python】秋招机考 —— 2025/9/17 华为 AI 方向

秋招机考,华为 AI,使用 Python 完成编程。

一杯水果茶!足矣~ 1165

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

开源项目OMPL.app安装与使用教程

开源项目OMPL.app安装与使用教程 项目概述 OMPL.app是Open Motion Planning Library(OMPL)的一个扩展版本,它不仅提供了基础的运动规划功能,还集成了网格加载、碰撞检测特性,并附带了一个简单的图形用户界面(GUI)。本教程将指导您了解OMPL.app的核心组成部分,包括其目录结构、启动与配置相关知识。 1. 项目目录结构及介绍 OMPL.app的目录布局设...

gitblog_00213的博客 1221

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OMPL按照教程安装缺少库问题解决方案

OMPL按照教程安装缺少库问题解决方案 【下载地址】OMPL按照教程安装缺少库问题解决方案 在遵循OMPL(Open Motion Planning Library)官方提供的安装教程时,特别是通过运行`./install-ompl-ubuntu.sh --python`命令进行安装的过程中,初看一切似乎顺利,无显著错误...

gitblog_09801的博客 486

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OMPL 安装与使用

OMPL库的安装与使用

zgh 7897

MoveIt! 学习笔记15 - OMPL planner(OMPL规划器)

此博文主要是用来记录ROS-Kinetic 中,用于机器人轨迹规划的MoveIt功能包的学习记录。 英文原版教程见此链接:http://docs.ros.org/en/kinetic/api/moveit_tutorials/html/doc/time_parameterization/time_parameterization_tutorial.html 中文教程转载至:https://blog.youkuaiyun.com/ssw_1990/article/details/104099989 Open ..

HarwardWu的博客 2151

OMPL完全安装指南

1. OMPL完全安装指南: ompl的官网网址为:https://ompl.kavrakilab.org/index.html,在官网里面下载保存脚本文件 install-ompl-ubuntu.sh,然后运行该脚本文件即可,该方法简单易上手。但是对于无法科学上网的同学来说,此法并不开行,因此下面我要给出一种通用的安装ompl库的方法。 2. 准备工作: OMPL 有以下依赖项:      Boost (version 1.58 or higher)  &

chengchang1234的博客 6526

Ubuntu20.04安装OMPL安装指南

OMPL安装指南 No module name "ompl.base._base"

qq_38606680的博客 8231
上一篇: D*算法理解以及C++实现
下一篇: OMPL官方教程学习State Validity Checking
Mapleaf98
博客等级 码龄7年 10粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值