ROS2从入门到精通4-6:路径平滑插件开发案例(以B样条曲线平滑为例)
目录
- 0 专栏介绍
- 1 ROS2路径平滑器介绍
- 2 平滑器插件编写模板
- 2.1 构造平滑器插件类
- 2.2 注册并导出插件
- 2.3 编译与使用插件
- 3 基于B样条曲线的路径平滑
0 专栏介绍
本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。
🚀详情:《ROS2从入门到精通》
1 ROS2路径平滑器介绍
路径平滑器(smoother)是Nav2中的一个任务服务器,它实现了nav2_behavior_tree::SmoothPath接口,主要负责改善路径的平滑度或质量,Nav2中默认的平滑器包括
| 名称 | 作者 | 介绍 |
|---|---|---|
Simple Smoother | Steve Macenski | 为不可行的2D规划器提供更平滑的简单路径 |
Constrained Smoother | Matej Vargovcik与Steve Macenski | 使用约束问题求解器优化各种标准(如平滑度或与障碍物的距离)的路径平滑器,保持最小转弯半径 |
Savitzky-Golay Smoother | Steve Macenski | 使用Savitzky-Golay滤波器通过数字信号处理平滑路径,以去除路径中的噪声。 |
本文介绍路径平滑器插件的编写范式,并提供一个全新的基于B样条曲线平滑的插件
2 平滑器插件编写模板
2.1 构造平滑器插件类
所有路径平滑插件的基类是nav2_core::Smoother,该基类提供了7个纯虚方法来实现控制器插件,一个合法的平滑器插件必须覆盖这7个基本方法:
configure():在平滑器服务器进入on_configure状态时会调用此方法,此方法执行ROS2参数声明和平滑器成员变量的初始化;activate():在平滑器服务器进入on_activate状态时会调用此方法,此方法实现平滑器进入活动状态前的必要操作;deactivate():在平滑器服务器进入on_deactivate状态时会调用此方法,此方法实现平滑器进入非活动状态前的必要操作;cleanup():在平滑器服务器进入on_cleanup状态时会调用此方法,此方法清理为平滑器创建的各种资源;smooth():接受一个原始路径,并提供具体的平滑实现
按照上述标准,本文案例中B样条平滑器的基本成员函数和变量如下所示
namespace nav2_smoother
{class BSplineSmoother : public nav2_core::Smoother{public:/*** @brief A constructor for nav2_smoother::BSplineSmoother*/BSplineSmoother() = default;/*** @brief A destructor for nav2_smoother::BSplineSmoother*/~BSplineSmoother() override = default;void configure(const rclcpp_lifecycle::LifecycleNode::WeakPtr &,std::string name, std::shared_ptr<tf2_ros::Buffer>,std::shared_ptr<nav2_costmap_2d::CostmapSubscriber>,std::shared_ptr<nav2_costmap_2d::FootprintSubscriber>) override;void cleanup() override { costmap_sub_.reset(); }void activate() override { RCLCPP_WARN(logger_, "Using: B-spline smoother"); }void deactivate() override {}/*** @brief Method to smooth given path** @param path In-out path to be smoothed* @param max_time Maximum duration smoothing should take* @return If smoothing was completed (true) or interrupted by time limit (false)*/bool smooth(nav_msgs::msg::Path &path,const rclcpp::Duration &max_time) override;std::shared_ptr<trajectory_generation::BSpline> bspline_gen_;std::shared_ptr<nav2_costmap_2d::CostmapSubscriber> costmap_sub_;rclcpp::Logger logger_{rclcpp::get_logger("BSplineSmoother")};};
}
2.2 注册并导出插件
在创建了自定义平滑器的前提下,需要导出该平滑器插件以便平滑器服务器可以在运行时正确地加载。在ROS2中,插件的导出和加载由pluginlib处理。
-
源文件配置导出宏
#include "pluginlib/class_list_macros.hpp" PLUGINLIB_EXPORT_CLASS(nav2_smoother::BSplineSmoother, nav2_core::Smoother) -
配置插件描述文件
xxx_smoother.xml,例如本案例为bspline_smoother.xml文件。此XML文件包含以下信息:library path:插件库名称及其位置;class name:平滑算法类的名称;class type:平滑算法类的类型;base class:平滑基类的名称,统一为nav2_core::Smootherdescription:插件的描述。
实例如下
<class_libraries><library path="bspline_smoother"><class type="nav2_smoother::BSplineSmoother" name="bspline_smoother/BSplineSmoother" base_class_type="nav2_core::Smoother"><description>B-Spline smoother</description></class></library> </class_libraries> -
配置
CMakeLists.txt文件
使用cmake函数pluginlib_export_plugin_description_file()来导出插件。这个函数会将插件描述文件安装到install/share目录中,并设置ament索引以使其可被发现,实例如下pluginlib_export_plugin_description_file(nav2_core bspline_smoother.xml) -
配置
package.xml描述文件,实例如下:<export><build_type>ament_cmake</build_type><nav2_core plugin="${prefix}/bspline_smoother.xml" /> </export>
2.3 编译与使用插件
编译该插件软件包,接着通过配置文件使用插件。
参数的传递链如下:首先在simulation.launch.py中引用配置文件navigation.yaml
declare_params_file_cmd = DeclareLaunchArgument('params_file',default_value=os.path.join(simulation_dir, 'config', 'navigation.yaml'),description='Full path to the ROS2 parameters file to use for all launched nodes')
接着在navigation.yaml中修改插件配置,默认如下,用的是SimpleSmoother插件:
smoother_server:ros__parameters:use_sim_time: Truesmoother_plugins: ["simple_smoother"]simple_smoother:plugin: "nav2_smoother::SimpleSmoother"tolerance: 1.0e-10max_its: 1000do_refinement: True
将上述替换为自己的插件,本案例为:
smoother_server:ros__parameters:use_sim_time: Truesmoother_plugins: ["simple_smoother"]simple_smoother:plugin: "bspline_smoother/BSplineSmoother"
接着运行即可看到平滑算法被替换
3 基于B样条曲线的路径平滑
B样条曲线是一种用于表示和描绘曲线的数学工具,它在计算机图形学、计算机辅助设计、计算机动画和数值分析等领域得到广泛应用。其名称中的B代表了基本(basis),而样条则是在各个领域中广泛应用的一种绘制曲线的技术,例如计算机图形学、物理学模拟、金融和经济分析等。在计算机图形学中,样条通常用于创建平滑的曲线和曲面,以便在三维场景中呈现出更真实的效果。在物理学模拟中,样条可用于描述物体的运动轨迹和变形过程。

具体算法原理请参考:
- 曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)
- 曲线生成 | 图解B样条曲线生成原理(附ROS C++/Python/Matlab仿真)
平滑器的效果如下所示,其中红色是原始A*算法的规划路径,绿色是B样条曲线平滑后的路径


完整代码通过下方博主名片联系获取
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《Pytorch深度学习实战》
- 《机器学习强基计划》
- 《运动规划实战精讲》
- …
相关文章:
ROS2从入门到精通4-6:路径平滑插件开发案例(以B样条曲线平滑为例)
目录 0 专栏介绍1 ROS2路径平滑器介绍2 平滑器插件编写模板2.1 构造平滑器插件类2.2 注册并导出插件2.3 编译与使用插件 3 基于B样条曲线的路径平滑 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2…...
Tensorflow训练视觉模型(CPU)
目录 零、模型下载 一、清理C盘 二、 配置环境 三、运行项目前提操作 (1)根据自己的项目设置路径。每次激活虚拟环境(tensorflow115)都得重设一次 (2)执行setup 这个项目的路径移动了位置也需要重设一…...
从根儿上学习spring 十 之run方法启动第四段(4)
我们接着上一节已经准备开始分析AbstractAutowireCapableBeanFactory#doCreateBean方法,该方法是spring真正开始创建bean实例并初始化bean的入口方法,属于核心逻辑,所以我们新开一节开始分析。 图12 图12-530到536行 这几行的主要就是创建b…...
如果我的发明有修改,需要如何处理?
如果我的发明有修改,需要如何处理?...
java:File与MultipartFile互转
1 概述 当我们在处理文件上传的功能时,通常会使用MultipartFile对象来表示上传的文件数据。然而,有时候我们可能已经有了一个File对象,而不是MultipartFile对象,需要将File对象转换为MultipartFile对象进行进一步处理。 在Java中…...
高级java每日一道面试题-2024年8月04日-web篇-如果客户端禁止cookie能实现session还能用吗?
如果有遗漏,评论区告诉我进行补充 面试官: 如果客户端禁止cookie能实现session还能用吗? 我回答: 当客户端禁用了Cookie时,传统的基于Cookie的Session机制会受到影响,因为Session ID通常是通过Cookie在客户端和服务器之间传递的。然而,尽…...
leetcode 107.二叉树的层序遍||
1.题目要求: 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)2.此题步骤: 1.先创建好队列,出队和入队函数: //创建队列 typedef struct que…...
C++在网络安全领域的应用
前言: 在当今的数字化时代,网络安全已经成为一个至关重要的领域。随着网络威胁和攻击手段的不断演变,开发高效、安全的系统和工具变得尤为重要。C作为一种功能强大且高性能的编程语言,在网络安全领域发挥着不可替代的作用。本文简…...
Chapter 26 Python魔术方法
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、什么是魔术方法?二、常见的魔术方法① __init__构造方法② __str__字符串方法③ __lt__比较方法④ __le__比较方法⑤ __eq__比较方法 前言 本章将详细讲…...
基于Transformer的语音识别与音频分类
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...
leetcode数论(1362. 最接近的因数)
前言 经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。 数论包含最大公约数(>2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。 描述 给…...
sqli-labs-master less1-less6
目录 通关前必看 1、判断是否存在sql注入以及是字符型还是数值型: 2、各种注入方式以及方法 有回显型: 报错注入(只有ok和no的提示以及报错提示): 详细思路,后面的题都可以这样去思考 关卡实操 less…...
力扣287【寻找重复数】
给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常…...
【2024蓝桥杯/C++/B组/传送阵】
题目 问题代码 #include<bits/stdc.h> using namespace std;const int N 1e610; int n; int porter[N]; int ans; int sign[N]; bool used;void dfs(int now, int cnt) {if(sign[now] && used){ans max(ans, cnt);return;}if(!sign[now]){cnt, sign[now] 1; …...
(四十一)大数据实战——spark的yarn模式生产环境部署
前言 Spark 是一个开源的分布式计算系统。它提供了高效的数据处理能力,支持复杂的数据分析和处理任务,是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。Spark Core:实现了Spark的基本功能,包含任务调度、内存管理、错误…...
【深度学习实战(53)】classification_report()
classification_report()是python在机器学习中常用的输出模型评估报告的方法。 classification_report()函数介绍 classification_report()语法如下:classification_report( y_true, y_pred, labelsNone, …...
计算机网络基础之网络套接字socket编程(初步认识UDP、TCP协议)
绪论 “宿命论是那些缺乏意志力的弱者的借口。 ——罗曼.罗兰”,本章是为应用层打基础,因为在写应用层时将直接通过文本和代码的形式来更加可视化的理解网络,本章主要写的是如何使用网络套接字和udp、tcp初步认识。 话不多说安…...
手撕Python!模块、包、库,傻傻分不清?一分钟带你弄明白!
哈喽,各位小伙伴们!今天咱们来聊聊Python中的模块、包和库,很多新手小白经常搞混,别担心,看完这篇,保证你一分钟就能搞定! 打个比方: 模块 (Module): 就好比是一块块乐高积木&#…...
Linux--序列化与反序列化
序列化 序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。在序列化过程中,对象的状态信息被转换为可以保持或传输的格式(如二进制、XML、JSON等)。序列化后的数据可以被写入到文件、数据库、内存缓冲区中,或者通…...
使用C#和 aspose.total 实现替换pdf中的文字(外语:捷克语言的pdf),并生成新的pdf导出到指定路径
程序主入口: Program.cs using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace PdfEditor {public class Progra…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
