ROS中MPC局部路径规划器使用方法及源码流程解读

news2024/11/24 0:45:55

   本文主要介绍ROS中Navigation导航框架中MPC局部路径规划器mpc_local_planner的使用方法,并对源码进行解读,梳理其规划流程等,具体包含MPC模型预测控制算法简介、mpc_local_planner使用方法、mpc_local_planner源码解读与规划流程梳理三部分内容。


   注:本文首发于古月居,原文链接如下:

   https://www.guyuehome.com/45097

   本篇文章我首发在古月居,因版权原因,在CSDN不能放全文,只能放一小部分,欢迎大家前往古月居查看完整文章!!!,链接如上↑↑↑

在这里插入图片描述


   一、MPC模型预测控制算法简介


   MPC(Model Predictive Control)是一种先进的控制策略,其核心思想是使用系统数学模型来预测系统在某一未来时间段内的表现来进行优化控制,并通过求解优化问题来计算最优的控制输入,多用于数位控制,所以分析时常采用离散型的状态空间表达形式 X k + 1 = A X k + B U k X_{k+1}=AX_{k}+BU_{k} Xk+1=AXk+BUk

   MPC的设计和实施包含三个步骤,在k时刻第一步要做的是,估计/测量出系统当前状态。

   第二步是基于 u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2 u k + 3 u_{k+3} uk+3 u k + n u_{k+n} uk+n来做最优化控制,即在k时刻施加一个输入 u k u_{k} uk,根据我们的模型来预测系统k ~ k+1时间段内的表现,然后基于预测的k+1时刻的表现,再施加一个输入 u k + 1 u_{k+1} uk+1、再根据我们的模型来预测系统k+1 ~ k+2时间段内的表现,以此类推,直至预测完我们设定的预测区间,比如k~k+3时间段。则输入 u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2称为控制区间,在这个控制区间, u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2的选择就是一个最优化的问题。来使得设定的目标函数最小。

   第三步是非常重要的一步,也是MPC当中非常有技巧性的一步,通过上面的计算。我们其实得到了 u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2这三个输入,但是在实施的时候,并不是把这三个数值输入都实施下去,而是在K时刻只实施 u k u_{k} uk这一个在k时刻计算出来的最优化结果。

   在实施的时候只取 u k u_{k} uk这一个输入非常重要,这是因为我们预测的模型很难完美的描述现实的系统,而且,在现实的系统当中可能会有扰动,就是说我们预测出来的实施 u k u_{k} uk后,它的输出 Y k Y_{k} Yk与现实当中真正执行完 u k u_{k} uk后的 Y k Y_{k} Yk是有偏差的,这就要求当我们实施 u k u_{k} uk之后,在k+1时刻要把上面的三步重新执行一遍,即把整个的预测区间(control horizon)和控制区间(predictive horizon)向右移动一个时刻。这个过程就称为滚动优化控制(receiving horizon control)。

   MPC的优点包括处理多变量、多约束系统,适应动态环境和提供优化性能。然而,它的计算复杂度较高,适用于需要高精度控制的应用。

   MPC模型预测控制算法的详细介绍可见 :《MPC模型预测控制器学习笔记》


   二、mpc_local_planner使用方法


   ROS现有开源MPC模型预测控制算法的局部路径规划器插件中,最受欢迎的是mpc_local_planner功能包,它与我们比较熟悉的teb_local_planner出自同一研究所(多特蒙德大学-控制理论与系统工程研究所),所以在流程及上有很多相似之处,mpc_local_planner使用步骤如下:

   1、下载并将mpc_local_planner功能包放到ROS工作空间的src文件夹下

   2、环境配置,在终端执行以下指令安装所需依赖和环境

rosdep install mpc_local_planner

   若rosdep不能正常使用,可以参考我之前写的博客,链接如下:

   《ROS Noetic版本 rosdep找不到命令 不能使用的解决方法》

   3、使用catkin_make对mpc_local_planner功能包进行编译

   4、可根据需要执行以下语句中的一个或多个(同一时间执行一个即可),来使用功能包自带的示例,对功能包是否能够正常工作,并可对其性能进行测试

   可以执行以下语句进行阿克曼模型小车的demo的测试

roslaunch mpc_local_planner_examples carlike_minimum_time.launch

   效果演示如下:

在这里插入图片描述
在这里插入图片描述

   可以执行以下三条语句中任意一条进行差速模型小车的demo的测试

roslaunch mpc_local_planner_examples diff_drive_minimum_time.launch
roslaunch mpc_local_planner_examples diff_drive_quadratic_form.launch
roslaunch mpc_local_planner_examples diff_drive_minimum_time_costmap_conversion.launch

   效果演示如下:

在这里插入图片描述

   执行任意上述launch文件对功能包是否能够正常工作进行测试后,若能正常进行局部路径规划,则可以进一步将该功能包运用在我们自己的机器人上,继续进行以下操作

   5、在启动move_base的launch文件中,配置局部路径规划器插件为mpc_local_planner/MpcLocalPlannerROS,并根据机器人的实际情况,设定参数clearing_rotation_allowed的值来设定在规划时是否允许机器人旋转,比如对于阿克曼结构的类车型机器人,不具备原地旋转能力,该参数设为flase,如下所示

 <param name="base_local_planner" value="mpc_local_planner/MpcLocalPlannerROS" />
 <param name="controller_frequency" value="5" />
 <param name="controller_patiente" value="15.0"/>
 <param name="clearing_rotation_allowed" value="false" /> <!-- carlike robot is not able to rotate in place -->

   6、在上述move_base节点配置中调用mpc_local_planner的参数配置文件mpc_local_planner_params.yaml,如下图所示,需要注意的是文件路径可能要根据实际情况进行修改。

在这里插入图片描述

   7、进行效果测试,并根据测试效果对参数进行调节

在这里插入图片描述


   三、mpc_local_planner源码解读与规划流程梳理

   本文的第三部分是本文核心部分,详细的对mpc_local_planner源码进行了解读,并对mpc_local_planner规划流程进行了梳理,本部分约1.5w字,预览图如下:

在这里插入图片描述

   欢迎对以上内容感兴趣的小伙伴前往古月居,查看全文,链接如下:

   https://www.guyuehome.com/45097

   本篇文章我首发在古月居,因版权原因,在CSDN不能放全文,只能放一小部分,欢迎大家前往古月居查看完整文章!!!,链接如上↑↑↑


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小游戏软件开发手机微信休闲游戏

当今&#xff0c;微信已经成为了中国最受欢迎的社交媒体平台之一&#xff0c;拥有数亿活跃用户。随着微信的不断发展&#xff0c;微信小游戏成为了一个热门的应用领域&#xff0c;吸引了许多开发者和玩家。微信小游戏是一种小型游戏&#xff0c;可以直接在微信内嵌入和玩&#…

【JavaEE初阶】 TCP服务器与客户端的搭建

文章目录 &#x1f332;前言&#x1f334;ServerSocket API&#x1f384;Socket API&#x1f340;TCP中的长短连接&#x1f38d;建立TCP回显客户端与服务器&#x1f6a9;TCP搭建服务器&#x1f6a9;TCP搭建客户端&#x1f6a9;通信过程展示&#xff1a; &#x1f333;多个客户端…

offsetof宏的使用、模拟实现及 (size_t)(((struct_type*)0)->mem_name)的解释

宏原型&#xff1a;offsetof(type,member) 作用&#xff1a;返回数据结构或联合体类型中成员的偏移量&#xff0c;以字节为单位 返回值&#xff1a;size_t类型的无符号整数 使用案例&#xff1a; #include <stdio.h> #include <stddef.h> struct foo {ch…

爬取东方财富股票信息

爬取股票信息 爬虫爬取信息&#xff0c;一般有两种大的思路&#xff0c;分别是&#xff1a; 模拟header信息&#xff0c;发送请求&#xff0c;得到相应的数据&#xff08;html文件 或者 json数据&#xff09;使用selenium模拟打开浏览器&#xff0c;然后利用selenium提供的函…

高防CDN:企业网络安全的坚强后盾

随着互联网的快速发展&#xff0c;企业的网络面临着越来越多的安全威胁。在这种背景下&#xff0c;高防CDN&#xff08;Content Delivery Network&#xff09;已经成为了企业网络安全的坚强后盾。本文将理性分析高防CDN对于企业发展的影响&#xff0c;强调其在维护网络稳定性、…

内核态内存映射

内核态的内存映射机制&#xff0c;主要包含以下几个部分&#xff1a; 内核态内存映射函数 vmalloc、kmap_atomic 是如何工作的&#xff1b;内核态页表是放在哪里的&#xff0c;如何工作的&#xff1f;swapper_pg_dir 是怎么回事&#xff1b;出现了内核态缺页异常应该怎么办&am…

MySQL(10):创建和管理表

基础知识 在 MySQL 中&#xff0c;一个完整的数据存储过程总共有 4 步&#xff0c;分别是&#xff1a;创建数据库、确认字段、创建数据表、插入数据。 要先创建一个数据库&#xff0c;而不是直接创建数据表&#xff1a;从系统架构的层次上看&#xff0c;MySQL 数据库系统从大到…

Android 10.0 SystemUI启动流程

1、手机开机后&#xff0c;Android系统首先会创建一个Zygote&#xff08;核心进程&#xff09;。 2、由Zygote启动SystemServer。 3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如&#xff1a;SystemUI 启动就是从 SystemServer 里启动的…

浅谈前端自定义VectorGrid矢量瓦片样式

目录 前言 一、VectorGrid相关API介绍 1、VectorGrid 2、 LayerStyles样式详解 二、样式自动配置 1、页面定义 2、地图及PBF瓦片引入 3、矢量瓦片样式定义 4、鼠标事件交互 三、最终效果 1、自定义样式展示 2、鼠标交互 总结 前言 在上一篇博客中&#xff0c;详细讲…

`rest-client`库

rest-client是一个在Ruby编程语言中用于发送HTTP请求的库。它提供了简单且易于使用的接口&#xff0c;用于发送GET、POST、PUT、DELETE等各种类型的HTTP请求&#xff0c;并处理响应。 以下是rest-client库的一些常见用法示例&#xff1a; 发送GET请求&#xff1a; require ‘…

《算法通关村—轻松搞定合并二叉树》

《算法通关村—轻松搞定合并二叉树》 描述 leetcode 617 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵…

【网络知识必知必会】聊聊数据链路层以太网

文章目录 前言1. 认识以太网2. 以太网帧格式已经有了ip地址, 为什么还要有 mac 地址呢?认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 总结 前言 本文继续来聊聊网络传输中数据链路层中的一个代表协议, 以太网. 以太这个词其实最早出现在物理学当中, 在早…

前端工程化(vue2)

一、环境准备 1.依赖环境&#xff1a;NodeJS 官网&#xff1a;Node.js 2.脚手架&#xff1a;Vue-cli 参考网址&#xff1a;安装 | Vue CLI 介绍&#xff1a;Vue-cli用于快速的生成一个Vue的项目模板。主要功能有&#xff1a;统一的目录结构&#xff0c;本地调试&#xff0…

麒麟系统查看磁盘UUID方法

通过查看 /dev/disk/by-uuid/ 目录下的软连接确定磁盘UUID ls -l /dev/disk/by-uuid/ 命令输出入下图所示&#xff0c;红框中即为磁盘UUID号 通过 blkid 命令查看系统中某块磁盘的uuid 号 blkid 命令输出如下图所示&#xff0c;UUID”” 中即为磁盘UUID号 开机自动…

五:ffmpe主要参数的使用

目录 一&#xff1a;回顾一下主要参数 二&#xff1a;使用主要参数操作视频 1、-i 输入流的使用 2、-i 配合 输出流-f使用 三、使用-ss开始时间进行转换 四、使用-t参数&#xff0c;设置转换的时长 一&#xff1a;回顾一下主要参数 -i 设定输入流。 支持本地和网络流 -f …

数学到底在哪里支撑着编程?

如果编程语言是血肉&#xff0c;那么数学的思想和知识就是灵魂。它可以帮助你选择合适的数据结构和算法&#xff0c;提升系统效率&#xff0c;并且赋予机器智慧。在大数据和智能化的时代更是如此。举个例子&#xff0c;我们在小学就学过的余数&#xff0c;其实在编程的世界里也…

3D 线激光相机的激光条纹中心提取方法

论文地址:Excellent-Paper-For-Daily-Reading/application/centerline at main 类别:应用——中心线 时间:2023/11/06 摘要 线激光条纹中心提取是实现线激光相机三维扫描的关键,根据激光三角测量法研制了线激光相机,基于传统 Steger 法对其进行优化并提出一种适用于提…

淘宝店铺所有商品数据接口(taobao.item_search_shop)

淘宝店铺所有商品数据接口可以使用淘宝开放平台提供的API接口获取。要使用这个接口&#xff0c;需要在淘宝开放平台上注册账号并申请App Key和App Secret&#xff0c;获取API访问权限。 使用淘宝店铺所有商品数据接口时&#xff0c;需要传入shop id参数来获取相应的商品信息。…

【Redis】掌握篇--Redis与SSM进行整合

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Redis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Redis与SSM的整合 1.添加Redis依赖 2…

「随笔」浅谈2023年云计算的发展趋势

在2023年&#xff0c;云计算的发展趋势将受到政治、经济、社会和科技四个维度的影响。以下是对这些维度的具体分析&#xff1a; 1.1 政治维度&#xff1a; 全球政策推动&#xff1a; 随着全球各国政策对云计算的重视程度不断提高&#xff0c;云计算服务将获得更广泛的市场准入…