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…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
