【硬核】 ROS Navigation 局部路径规划常见算法

2023-11-13

简介

​ 最近,作者参加了关于RMUS 高校 SimReal挑战赛,首次接触到了机器人导航领域,这里记录一下这段时间的收货。sim2real的全称是simulation to reality,是强化学习的一个分支,同时也属于transfer learning的一种。主要解决的问题是机器人领域中,直接让机器人或者机械臂在仿真中对于物理环境存在误差,如何将仿真上取得的成果应用到实际中的问题。

​ 机器人导航的路径规划问题主要分为全局路径规划和局部路径规划,这两者是根据对环境信息获取程度划分的。

  • 全局规划通常需要在已知环境中进行,属于一种事前规划,可以找到最优解,一旦环境发生变化,未及时更新地图时,该方法就不能达到预期效果。
  • 局部路径规划通常用在未知或部分已知的环境中,系统根据传感器实时获取到环境障碍物的信息,并做出相应规划,这对系统的实时计算处理能力有着较高的要求。由于缺乏全局环境信息,结果很可能不是最优的。

​ 全局路径规划和局部路径规划并没有本质的区别,很多适用于全局路径规划的方法经过改进也可以用于局部路径规划,而适用于局部路径规划的方法同样经过改进后也可适用于全局路径规划。两者协同工作,机器人可更好的规划从起始点到终点的行走路径。

​ 本文主要针对局部路径规划作介绍。

局部路径规划

​ 机器人在获得目的地信息后,首先经过全局路径规划规划出一条大致可行的路线,然后调用局部路径规划器根据这条路线及costmap的信息规划出机器人在局部时做出具体行动策略。常用的局部路径规划算法有动态窗口法(DWA)、时间弹性带(TEB)和模型预测控制(MPC)。

动态窗口法(DWA)

​ 动态窗口法在一定程度上采用了粒子滤波的思想,在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价,选取最优轨迹对应的速度驱动机器人运动。

基本思想
  1. 在机器人的控制空间中离散采样 (dx,dy,dtheta)
  2. 对于每个采样速度,从机器人的当前状态执行前向模拟,以预测如果采样速度应用于某个(短)时间段会发生什么。
  3. 使用包含以下特征的度量来评估前向模拟产生的每个轨迹:与障碍物的距离、与目标的距离、与全局路径的距离和速度,排除非法轨迹(与障碍物相撞的轨迹)。
  4. 选择得分最高的轨迹并将相关的速度发送到移动基地。
  5. 重复执行上述步骤。
优点
  • 计算简单
  • 适用于差分和全向车模
缺点
  • 前瞻性不足
  • 动态效果差
  • 不适用于阿克曼模型车模

时间弹性带(TEB)

​ 时间弹性带(TEB)简而言之,就是连接起始、目标点,并让这个路径可以变形,变形的条件就是将所有约束当做橡皮筋的外力。起始点、目标点状态由用户/全局规划器指定,中间插入N个控制橡皮筋形状的控制点(机器人姿态),当然,为了显示轨迹的运动学信息,我们在点与点之间定义运动时间Time。

t i m e + e l a s t i c b a n d = t i m e d e l a t i c s b a n d time + elastic band = timed elatics band time+elasticband=timedelaticsband

其目标函数的定义:

​ 虽然待优化的橡皮筋有不少状态点与时间段,目标函数也好像很多。但是,每个目标函数只与橡皮筋中的某几个状态有关,而非整条橡皮筋。将它描述成图,然后用图优化。

优点
  • 前瞻性好
  • 适用于各种车模
缺点
  • 计算复杂
  • 速度和角速度波动大,控制不稳定

模型预测控制(MPC)

​ MPC其实是一种基于对受控对象进行预测的控制方法。MPC最大的特点在于,相对于LQR控制而言,MPC可以考虑空间状态变量的各种约束,而LQR,PID等控制只能够考虑输入输出变量的各种约束。

​ MPC的作用机理可以表述为:在每一个采样时刻,根据当前的测量信息,在线求解一个有限时间开环优化问题,并将得到的控制序列的第一个元素用于被控对象;在下一个采样时刻,用新的测量值作为此时预测系统未来动态的初试条件,刷新优化问题求解。应用于机器人的典型的模型预测控制方法:

问题模型

m i n C F ( x ( t f ) ) + f t = t 0 t f C R ( x , u ) d t x ˙ = f ( x , u ) g ( x , u ) < 0 h ( x , u ) = 0 minC_F(x(t_f))+f_{t=t_0}^{t_f}C_R(x, u)dt\\ \dot{x}=f(x, u)\\ g(x, u)<0\\ h(x,u)=0\\ minCF(x(tf))+ft=t0tfCR(x,u)dtx˙=f(x,u)g(x,u)<0h(x,u)=0

参数空间

m i n C F ( x ( t f ) ) + f t = t 0 t f C R ( x , u ) d t minC_F(x(t_f))+f_{t=t_0}^{t_f}C_R(x, u)dt\\ minCF(x(tf))+ft=t0tfCR(x,u)dt

控制

传统MPC控制框图为

  1. 设置优化问题
  2. 使用测量模块告诉我们当前的initial state
  3. 求解优化问题得到参数,这些参数构成系统的最优输入 u*
  4. 使用 u*驱动系统,由于系统受到干扰无法保证求解得到的 u*我们想要的,仅此旨在很小一段时间中使用,然后利用观测的状态重新求解问题,转回步骤(2)

局部规划器的应用

​ 这里以mpc_local_planner为例,首先,在本地终端中键入

sudo apt install ros-melodic-mpc-local-planner

​ 由于apt安装有可能导致我们运行失败,上面的指令只是用来安装依赖。同时,克隆远程仓库mpc_local_planner到ros的工作空间中,执行catkin_make编译。对应ros navigation中的move_base.launch,修改其中的局部路径规划器类型

<?xml version="1.0"?>
<launch>

  <!-- 运行move_base节点  -->
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
    
    <!--move_base参数配置http://wiki.ros.org/move_base -->
    <param name="base_global_planner" value="global_planner/GlobalPlanner" /><!-- 选择全局规划器类型 -->
    <rosparam file="$(find mpc_navigation)/config/base_global_planner_params.yaml" command="load" />
    
    <rosparam file="$(find mpc_navigation)/config/mpc_local_planner_params_minimum_time.yaml" command="load" />
    <param name="base_local_planner" value="mpc_local_planner/MpcLocalPlannerROS" />

    <rosparam file="$(find mpc_navigation)/config/move_base_params.yaml" command="load" /><!-- 其它参数 -->

    <param name="controller_frequency" value="1" /><!-- 选择全局规划器类型 -->

    <!-- 全局代价地图和局部代价地图参数配置http://wiki.ros.org/costmap_2d -->
    <rosparam file="$(find mpc_navigation)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find mpc_navigation)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find mpc_navigation)/config/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find mpc_navigation)/config/global_costmap_params.yaml" command="load" />
    
  </node>

</launch>

​ 对应mpc_local_planner的参数文件可以在克隆仓库中的mpc_local_planner_examples中获得,将cfg/diff_drive中的参数yaml文件复制到对应的config文件夹中即可,base_ local_planner参数设置为mpc_local_planner中定义的类型MpcLocalPlannerROS。

​ mpc_local_planner提供了两个参数文件,一个是以最短时间为目的,另一个是二次规划模型,可以根据需求自行选择。

​ 其他的局部规划器同样是修改base_local_planner的类型和提供相应的功能包以及yaml参数文件实现。

参考

ros-dwa_local_planner

ros-teb_local_planner

ros-mpc_local_planner

ROS学习笔记-局部路径规划算法对比

后续

 喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【硬核】 ROS Navigation 局部路径规划常见算法 的相关文章

  • ASP.NET MVC 导航和用户界面设计

    简洁版本 您是否知道有什么方法可以使用 CSS 而无需使用 Javascript 来获取输入按钮 提交 和锚标记来以视觉方式呈现相同的内容 长版 我正在开发一个 ASP NET MVC 应用程序 该站点包含用于查看详细信息或创建或更新我的模
  • 如何更改颤动中的抽屉图标?

    抽屉具有默认的三个水平栏作为默认图标 但我想将其更改为其他内容 我已经检查了下可能的选项Drawer 但似乎没有任何财产与之相关 这应该有效 Widget build BuildContext context return Scaffold
  • solr 中的距离分面 - 如何生成在给定距离范围内搜索的链接

    在 Solr 中生成距离范围或 桶 的分面相当简单 http wiki apache org solr SpatialSearch How to facet by distance http wiki apache org solr Spa
  • iPhone 开发 - 限制用户与应用程序的交互并显示进度指示器

    我有一个案例 我从服务器获取信息 我的应用程序有一个选项卡栏和导航按钮 我希望应用程序显示进度指示器并禁用所有其他控件 以便用户在从服务器提取数据时无法跳转 我怎样才能做到这一点 我想到的一种方法是显示带有进度窗口的透明视图 很像消息警报窗
  • 如何隐藏 iPhone 导航栏上的“后退”按钮?

    我添加了一个导航控件来在应用程序中的视图之间切换 但某些视图不应该有 后退 前一个标题 按钮 关于如何隐藏后退按钮有什么想法吗 Objective C self navigationItem hidesBackButton YES Swif
  • 如何将滑动选项卡视图放入导航抽屉选项之一

    更新的代码 Override public View onCreateView LayoutInflater inflater ViewGroup container Bundle savedInstanceState View rootV
  • 类型错误:在导航状态中找不到“路线”

    我在用createMaterialTopTabNavigator来自反应导航 其中我有两个单独的屏幕UpdatesStack and ShopsStack我想从这些屏幕导航到其他屏幕 所以我写的是
  • 导航到目的地时仅创建一个片段实例(android)

    我正在使用导航组件 导航时 如果片段已经存在于后台堆栈中 我不想创建新的片段实例 并弹出前面已经存在的片段 findNavController navigate RequestTransferFragmentDirections actio
  • 找不到基于导航控制器的应用程序的 Xcode 4 新项目模板。还有其他选择吗?

    我正在使用 iOS 5 我无法找到以前在 Xcode 中找到的基于导航的应用程序模板 那么我可以用什么来代替呢 如果您想从头开始 请从基于单一视图项目 然后转到故事板并选择 viewController 转到编辑器 gt 嵌入 gt 导航控
  • Bootstrap 3 导航栏 - 无法正确折叠

    导航栏曾经正常工作 但我做了一些更改 它不再工作 当我将窗口缩小时 会显示切换方块 但是当我单击它时 什么也没有发生 Note 导航栏在全屏下工作正常 它只是在小窗口中 当我单击切换按钮时 下拉菜单不会出现 想知道是否有人知道如何解决它 这
  • 关闭呈现的视图控制器后推送视图控制器

    我有这个导航堆栈 RootVC gt VC1 gt 呈现 gt ModalVC 我有VC2 不在导航堆栈中 演示时ModalVC 我想单击 ModalVC 中的按钮来关闭 ModalVC 然后推送VC2之后进入导航堆栈VC1一键点击 它应该
  • 什么是符合 WAI-ARIA 标准的导航栏/菜单实现

    我们正在为门户网站的主导航菜单实施 即添加 WAI ARIA 支持 菜单如下所示 菜单采用经典的方式实现 ul li a DOM 树 使用 CSS 设计 看起来像水平选项卡 这种小部件的 WAI ARIA 兼容实现是什么 我已经阅读了 w3
  • Android Studio:导航 xml 编辑和设计视图出现问题

    我们一直在项目中使用导航组件 但偶然发现了一个似乎是我们的项目和 JetBrains Android 插件特有的问题 我无法确定它开始发生的确切时间点 但我在 AS 3 2 发布后注意到了它 该项目构建得很好 但是在编辑导航 XML 时 自
  • 在 Kinect 示例中用 Google Earth 地球仪替换可平移的世界地图图像

    我需要有关如何使用 Kinect 手势而不是使用鼠标 键盘导航来控制 Google 地球的基本指导 我已经运行了 Kinect Developer 工具包示例 并且有一个名为 C 的交互式画廊 允许平移世界地图 它是静态图像 这是其文档的链
  • 如何从里程计/tf数据获取投影矩阵?

    我想将视觉里程计的结果与 KITTI 数据集提供的事实进行比较 对于地面中的每一帧 我都有一个投影矩阵 例如 1 000000e 00 9 043683e 12 2 326809e 11 1 110223e 16 9 043683e 12
  • 导航到页面会增加内存使用量 Windows Universal 8.1

    我正在创建一个 Windows Universal 8 1 应用程序 每次我导航到一个页面 然后导航回来 然后再次导航到该页面 该页面的新实例就会保存在内存中 显然 垃圾收集器会在一段时间后释放内存 但是如果不需要 我宁愿不使用内存 有没有
  • 为什么 HTML5 中的导航栏采用列表形式?

    自从我开始使用 HTML CSS 等以来 我一直注意到的一件事是 导航栏几乎总是以列表的形式呈现 有以下几种变体 HTML ul li a href link1 html link 1 a li li a href link2 html l
  • Android 中的导航抽屉和 Activity

    我正在尝试中给出的导航抽屉 幻灯片菜单 本教程 http www androidhive info 2013 11 android sliding menu using navigation drawer 上面的链接和我的链接的区别在于 我
  • 如何对很多很多页面进行页面导航?对数页面导航

    显示许多页面的页面导航的最佳方式是什么 最初这是作为操作提示发布的 我的答案包含在问题中 我现 在将我的答案分成下面的 答案 部分 更具体 假设您要向用户显示一组记录 这些记录分为固定大小的页面 例如 Google 搜索的结果 如果只有几个
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新

随机推荐

  • 推荐11款开源自动化安全测试实用工具

    安全测试 渗透测试 可以让企业了解现有网络安全措施的成效或不足 进而帮助其调整安全项目 并主动发现漏洞 但是 安全测试是一项工作量很大的工作 测试团队需要在较短时间内快速完成以下任务 侦察并分析组织网络所使用的网络协议 以收集有关网络设备和
  • RC电路分析计算

    RC电路有一个电容和一个电阻组成 可以是并联或者串联 可用作滤波 移相等 下面以RC串联电路为例计算分析电路的电流电压特性和频率特性 RC串联电路 如上图所示 假设RC电路电源电压为Us 电容大小为C 电容两端电压为Uc 电阻大小为R 电阻
  • 用Python分析2000款避孕套,得出这些有趣的结论

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 一 分析目标
  • 经销商网上下单系统

    什么是订货通 什么是企业订货管理系统 是一款针对中小型企业通过网络实现 厂家和客户 经销商 批发商 代理商一站式订货系统 最终实现厂家的下游客户通过网络实现实时订货功能 一 订货系统解决的问题 开发网上订货系统用于解决企业和下游订货商对接
  • 文件系统cache机制

    复杂度3 5 机密度3 5 最后更新2021 04 27 AIX并未采用传统Unix的cache模式 传统Unix 包括Linux 的cache模式是把cache作为一个单独的旁路应用 嵌入在文件读写的路径中 当应用请求读文件时 kerne
  • stm32单片机引脚_单片机IO口不够用了,怎么办?

    这几天公子比较闲 像看看手上有没有好玩的模块 于是 公子找到了一款OV系列的摄像头 于是翻了一下自己的2年都没有打开的盒子 公子专门来放开发板的 可是找了半天 都没有找到开发板 费了九牛二虎之力 才找到一块STM32F103C8T6的 长这
  • 带硬件FIFO的串口驱动程序设计思路

    串口具有硬件FIFO可以降低中断频率 对于需要高波特率数据传输 MCU本身速度比较慢 或有更高级优先级中断需要及时处理的场合就显得比较重要 通常 即便串口本身带硬件FIFO 在编写串口驱动程序时 仍然需要在上层在加一层软件FIFO 或Rin
  • Centos7.3服务器配置

    安装node 1 下载并安装NVM脚本 curl https raw githubusercontent com creationix nvm v0 13 1 install sh bash source bash profile 2 列出
  • RabbitMQ--基础--7.5--工作模式--主题模式(Topic)

    RabbitMQ 基础 7 5 工作模式 主题模式 Topic 代码位置 https gitee com DanShenGuiZu learnDemo tree master rabbitMq learn rabbitMq 03 1 介绍
  • java代码分析及分析工具

    一个项目从搭建开始 开发的初期往往思路比较清晰 代码也比较清晰 随着时间的推移 业务越来越复杂 代码也就面临着耦合 冗余 甚至杂乱 到最后谁都不敢碰 作为一个互联网电子商务网站的业务支撑系统 业务复杂不言而喻 从09年开始一直沿用到现在 中
  • Flatbuffers使用解析

    Flatbuffers使用解析 在今日头条偶然看到一个技术分享视频 标题很唬人 json之后下一代数据交换格式 大致是这样 不明觉厉 赶紧打开观看 原来Flatbuffers是Google为游戏或者其他对性能要求很高的应用开发的一种数据交换
  • layer关闭弹窗,刷新父页面

    获取index不要写在函数里 可能获取不到index var index parent layer getFrameIndex window name function closeFram window parent refreshPage
  • React 函数组件

    1 React 组件 函数式组件 1 React提供了两种创建组件方式 1 1 函数式组件 1 2 类组件 执行了ReactDOM render
  • ctrl c和 ctrl v 突然失灵不能使用的解决方法大全

    1 你是否正在运行 有道词典 那就把它关了 这也是困扰我许久的问题 2 打开你的输入法 看看快捷键是否有冲突 很大原因可能是这个 3 打开C盘 gt Windows gt System32 看看这个文件夹中是否有clip的文件夹 如果没有就
  • 由于找不到 MSVCR120.dll,无法继续执行代码解决方法

    问题描述 下载某C端软件并启动 提示 由于找不到 MSVCR120 dll 无法继续执行代码解决方法 在其它电脑尝试打开 可以正常打开 定位到确是环境问题 非下载的程序包问题 解决方法 方法一 在网上下载 msvcr120 dll 文件 并
  • 论文阅读之 Diffusion Models Beat GANs on Image Synthesis

    扩散首次打败gan 来源 OpenAI 无条件图像合成 条件图像合成 背景 目标函数和参数化方式的来源 Alex Nichol and Prafulla Dhariwal Improved denoising diffusion proba
  • 哪些字段适合建索引

    转自 https blog csdn net maliao1123 article details 52431144 经常需要进行更新操作的属性 1 表的主键 外键必须有索引 2 数据量超过300的表应该有索引 3 经常与其他表进行连接的表
  • QT+PMAC联合开发

    最近接触到PMAC的IMAC FX控制器 虽然他的主程序是写在下位机 但还是需要上位机和它进行通信和交互 官方提供的上位机DEMO都是基于VC C 和VB等 对于QT的用户 没有很直接的代码供参考 PMAC提供了COM组件 供上位机调用 在
  • Day 7

  • 【硬核】 ROS Navigation 局部路径规划常见算法

    简介 最近 作者参加了关于RMUS 高校 SimReal挑战赛 首次接触到了机器人导航领域 这里记录一下这段时间的收货 sim2real的全称是simulation to reality 是强化学习的一个分支 同时也属于transfer l