ROS2从入门到精通4-6:路径平滑插件开发案例(以B样条曲线平滑为例)

news2025/2/26 5:54:15

目录

  • 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 SmootherSteve Macenski为不可行的2D规划器提供更平滑的简单路径
Constrained SmootherMatej VargovcikSteve Macenski使用约束问题求解器优化各种标准(如平滑度或与障碍物的距离)的路径平滑器,保持最小转弯半径
Savitzky-Golay SmootherSteve 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::Smoother
    • description:插件的描述。

    实例如下

    <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: True
    smoother_plugins: ["simple_smoother"]
    simple_smoother:
      plugin: "nav2_smoother::SimpleSmoother"
      tolerance: 1.0e-10
      max_its: 1000
      do_refinement: True

将上述替换为自己的插件,本案例为:

smoother_server:
  ros__parameters:
    use_sim_time: True
    smoother_plugins: ["simple_smoother"]
    simple_smoother:
      plugin: "bspline_smoother/BSplineSmoother"

接着运行即可看到平滑算法被替换

3 基于B样条曲线的路径平滑

B样条曲线是一种用于表示和描绘曲线的数学工具,它在计算机图形学、计算机辅助设计、计算机动画和数值分析等领域得到广泛应用。其名称中的B代表了基本(basis),而样条则是在各个领域中广泛应用的一种绘制曲线的技术,例如计算机图形学、物理学模拟、金融和经济分析等。在计算机图形学中,样条通常用于创建平滑的曲线和曲面,以便在三维场景中呈现出更真实的效果。在物理学模拟中,样条可用于描述物体的运动轨迹和变形过程。

在这里插入图片描述
具体算法原理请参考:

  • 曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)
  • 曲线生成 | 图解B样条曲线生成原理(附ROS C++/Python/Matlab仿真)

平滑器的效果如下所示,其中红色是原始A*算法的规划路径,绿色是B样条曲线平滑后的路径

在这里插入图片描述

在这里插入图片描述

完整代码通过下方博主名片联系获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

了解一下这个基质:粘弹性可编码,organoids培养的好帮手

Dynamic matrices with DNA-encoded viscoelasticity for cell and organoid culture是发表于《nature nanotechnology》的一篇文章&#xff0c;介绍了一种基于DNA的动态交联基质DyNAtrix&#xff0c;用于细胞和类器官培养。DyNAtrix由DNA库与超高分子量聚合物自组装形成&#…

联手体系结构专业委员会:“用户态GPU池化技术”术语发布 | CCF术语快线

本期发布术语热词&#xff1a;用户态GPU池化技术&#xff08;User-space GPU Pooling&#xff09;。 用户态GPU池化技术 作者&#xff1a;陈飞&#xff08;趋动科技&#xff09;张伟韬&#xff08;趋动科技&#xff09;李诚&#xff08;中国科学技术大学&#xff09; 开篇导语…

python使用boto3访问S3对象存储并列出百万级文件对象的存储信息

本文提供了在python3环境里使用boto3访问S3对象存储&#xff0c;并列出百万级文件对象的存储信息的示例代码。 一、测试环境 操作系统和python版本如下&#xff1a; [rootlocalhost boto3]# cat /etc/os-release NAME"openEuler" VERSION"22.03 LTS" I…

【实战指南】轻松上手:部署与应用清华智谱GLM大模型

部署一个自己的大模型&#xff0c;没事的时候玩两下&#xff0c;这可能是很多技术同学想做但又迟迟没下手的事情&#xff0c;没下手的原因很可能是成本太高&#xff0c;近万元的RTX3090显卡&#xff0c;想想都肉疼&#xff0c;又或者官方的部署说明过于简单&#xff0c;安装的时…

GreatSQL 8.0.32-26 今日发布

GreatSQL 8.0.32-26 今日发布 版本信息 发布时间&#xff1a;2024年08月05日 版本号&#xff1a;8.0.32-26, Revision a68b3034c3d 下载链接&#xff1a;https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.32-26 用户手册&#xff1a;https://greatsql.cn/docs…

【知识专栏丨python数分实战】天猫订单数据分析及可视化|taobao天猫订单接口

今天这篇文章将给大家介绍天猫订单数据分析及可视化案例。 import pandas as pdimport numpy as npfrom pyecharts.charts import Pie,Bar,Line,Map,Map3D,Funnelfrom pyecharts import options as optsimport matplotlib.pyplot as pltimport warningsimport seaborn as snsfr…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-7-元素基础定位方式-下篇 (详细教程)

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的基础定位方式的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下剩下部分的基…

重塑未来体验:边缘计算与云原生的完美邂逅

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、云原生的兴起 2、边缘计算的兴起 二、边缘计算基础 …

LoadRunner12 添加事务并添加检查点

1、先要添加事务开始函数lr_start_transaction("登陆事务");&#xff0c;在接口上方右击点击-插入-开始事务。输入事务名称&#xff1b; 2、在某个接口想法 右击点击-插入-结束事务&#xff0c;输入事务名称&#xff0c;与开始事务名称要保持一致&#xff0c;lr_end_…

springboot自动装配(源码分析)

利用spi机制发现配置类并注册到spring容器中 以下示例使用springboot:3.2.1版本 相关注解 SpringBootApplication EnableAutoConfiguration AutoConfigurationImportSelector 使用Import导入AutoConfigurationImportSelector&#xff0c;随着springboot启动&#xff0c;会…

工业控制常用的EtherNet/IP、OPC UA协议的标签数据转发到另外的PLC寄存器地址

在工业自动化领域&#xff0c;越来越多的碰到标签方式通讯的设备&#xff0c;常用有CIP(基于EtherNet/IP) 的协议、OPCUA协议等&#xff0c;CIP协议主要是罗克韦尔/AB的PLC、欧姆龙NX/NJ系列的PLC等&#xff0c;OPCUA协议常见于工业机器人、智能焊接设备等。在不具备标签协议接…

AI绘画变现也有新思路,国风带你日进斗金!

在中国的文化传承中&#xff0c;古典的风韵总是能引发无尽的遐想和美感。 在现代化的今天&#xff0c;越来越多的人开始重新审视和欣赏那些古老的中国风&#xff0c;发现其中蕴含的深厚文化底蕴与无与伦比的美感。 特别是在影视、音乐、舞蹈等艺术形式中&#xff0c;国风元素…

【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载 本章将分享C增加的几种常见特性&#xff0c;主要内容为引用与内联函数 | auto关键字与for循环 | 指针空值&#xff0c;这些知识看似很多&#xff0c;实际也不少。本章篇幅长&#…

双笼转子三相感应电动机瞬态分析(7):定子绕组短路故障分析

1. 引言 2. 定子绕组短路时端电压约束条件 3. 双笼转子三相感应电动机数学模型 4. 仿真分析 5. 结论 6. 参考文献 1. 引言 定子绕组短路故障是三相感应电动机的典型故障情形之一&#xff0c;但其发生几率比缺相故障要低。根据电力系统的研究报告&#xff0c;单相短路在所有…

在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?

仪器计量校准行业内&#xff0c;无尘车间洁净室检测可以说是较为热门的业务&#xff0c;因为其预算高&#xff0c;且检测流程不是太繁琐&#xff0c;很多仪器计量校准机构也是设立相关实验室&#xff0c;专门处理相关仪器的检测。不过虽然许多机构想要涉足该领域&#xff0c;但…

ArcGIS自带的python安装第三方库

ArcGIS自带的python安装第三方库 文章目录 ArcGIS自带的python安装第三方库pip库安装安装setuptools库安装pip库 第三方库安装 在做项目时&#xff0c;用到了ArcGIS(非pro)中python中的arcpy库&#xff0c;但是又依赖其他外部库&#xff0c;而 Python2并不像Python3那样自带pip…

gitlab项目添加新成员

gitlab项目添加新成员 1、进入项目&#xff0c;找到settings----->点击Members 2、手动输入要添加成员的账号或者搜索&#xff0c;最后点击Add to project就可以了 choose a role permission 是为要添加的成员选择角色权限 补充&#xff1a; ‌Maintainer&#xff1a;拥…

RabbitMQ未授权访问漏洞

RabbitMQ未授权访问漏洞 RabbitMQ是目前非常热门的一款消息中间件&#xff0c;基于AMQP协议的&#xff0c;可以在发布者和使用者之间交换异步消息。消息可以是人类可读的JSON,简单字符串或可以转换为JSON字符串的值列表 1、使用以下Fofa语法对RabbitMQ产品进行搜索 2、在打开…

【机器学习】回归类算法-一元线性回归(入门)

一、概念 一元线性回归&#xff0c;指的是只研究一个自变量与一个因变量之间的关系。简单来说就是看如何设计出一条理想的直线&#xff08;ykxb&#xff09;。 二、如何确定一条理想的直线&#xff1f; &#xff08;1&#xff09;最小二乘法 通过数学模型&#xff0c;拟合一条…

数字化转型的实践指南:揭开TOGAF®架构开发方法ADM的核心价值

实践应用视角&#xff1a;引领数字化转型的必备工具 《TOGAF架构开发方法》 是为企业数字化转型提供系统化指导的权威指南。无论是企业架构师还是信息技术经理&#xff0c;都能从这本《TOGAF架构开发方法》中找到行之有效的方法和策略&#xff0c;帮助他们在数字化时代实现业务…