ROS2从入门到精通2-1:launch多节点启动与脚本配置

目录

  • 0 专栏介绍
  • 1 ROS2的启动脚本优化
  • 2 ROS2多节点启动案例
    • 2.1 C++架构
    • 2.2 Python架构
  • 3 其他格式的启动文件
    • 3.1 `.yaml`启动
    • 3.2 `.xml`启动

0 专栏介绍

本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。

🚀详情:《ROS2从入门到精通》


1 ROS2的启动脚本优化

在ROS从入门到精通1-3:ROS运行管理与常用配置文件中我们介绍到ROS1的.launch文件是待启动节点的管理容器,优化了多个节点的启动流程,其本质上是一个.xml文件。

在ROS2中,launch文件依然用于启动多个ROS节点以及它们之间的通信,不同在于:

  • 组织架构:在ROS1中,.launch文件使用.xml格式编写,定义了节点、参数、命名空间等信息,具有较为静态的结构;在ROS2中,launch文件使用Python编写,通过Python脚本的方式来启动节点和设置参数,因此可以编写复杂的逻辑,支持条件语句、循环等,提供了更高的扩展性和可定制性;
    组织结构:

  • 启动速度:ROS1的.launch文件在启动时可能会有一定的延迟,特别是在启动大型系统时;ROS2的launch文件相对更快速,启动时间更短,这得益于ROS2架构的一些优化。

总的来说,经过ROS2的启动脚本优化,使得系统的启动和管理更加便捷和高效,也更适合复杂系统的部署和管理。

2 ROS2多节点启动案例

实验目标:一次性启动以下节点:

  • turtlesim仿真器
  • turtlesim生成节点

2.1 C++架构

文件结构如下所示

<pkg>
├── build
├── install
├── log
└── src
    └── pkg_name
        ├── CMakeLists.txt
        ├── launch
        ├── package.xml
        └── src

按以下步骤设置启动脚本

  • 添加package依赖关系:在package.xml清单文件中,添加对依赖项的声明

    <exec_depend>ros2launch</exec_depend>
    
  • 添加CMakeLists编译信息:在CMakeLists.txt文件的ament_package()之前添加

    # Install launch files.
    install(DIRECTORY
      launch
      DESTINATION share/${PROJECT_NAME}/
    )
    

    目的是把launch目录添加到运行时的share文件夹

  • launch目录编写launch.py文件,本例为

    from launch import LaunchDescription
    from launch_ros.actions import Node
    
    def generate_launch_description():        
        return LaunchDescription([              
            Node(                                 
                package='launch_lab',         
                executable='launch_lab_client', 
            ),
            Node(
                package='turtlesim',
                executable='turtlesim_node',
                name='turtle_sim',
            ),
        ])
    

    其中最关键的Node对象用于在启动文件中定义一个节点。它的参数包括:

    • package<str>,表示节点所在的ROS2功能包的名称;
    • executable<str>,表示在给定包中的可执行文件的名称,在CMakeLists.txt中由install定义,在setup.py中由entry_points定义,详情请复习ROS2从入门到精通0-5:CMakeLists与setup.py编写(附常用配置文件语法);
    • name[str],用于指定节点的名称。如果未指定将使用可执行文件的名称;
    • namespace[str],用于指定节点的命名空间。命名空间是一种组织节点的方式,可以帮助避免节点名称的冲突;
    • output[str],用于指定节点的输出应该如何处理。例如,可以将其设置为screen,以便将节点的输出打印到屏幕上;
    • parameters[list],用于指定节点的ROS2参数。每个参数都是一个字典,其中包含参数的名称和值;
    • remappings[list],用于指定话题的重映射。每个重映射都是一个元组,其中包含原始主题的名称和新主题的名称;
    • arguments[list],用于指定传递给可执行文件的命令行参数。
  • 运行launch.py文件

    ros2 launch <pkg_name> <launch.py>
    

在这里插入图片描述

2.2 Python架构

文件结构如下所示

<pkg>
├── build
├── install
├── log
└── src
    └── launch_lab_py
        ├── launch
        ├── launch_lab_py
        ├── package.xml
        ├── resource
        ├── setup.cfg
        └── setup.py

按以下步骤设置启动脚本:

  • 添加setup.py安装信息:在setup.py文件的data_files入口添加
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
    ],
    
    目的是把launch目录添加到运行时的share文件夹
  • launch目录编写launch.py文件,与2.1节相同
  • 运行launch.py文件
    ros2 launch <pkg_name> <launch.py>
    

在这里插入图片描述

3 其他格式的启动文件

ROS2也支持其他文件格式的启动方式,如下所示,对这些格式语法不熟悉的请看ROS2从入门到精通0-5:CMakeLists与setup.py编写(附常用配置文件语法)

3.1 .yaml启动

编写以下启动文件

launch:
  - node: 
      pkg: launch_lab_py
      exec: node_launch_client
      name: launch_client_py
  - node:
      pkg: turtlesim
      exec: turtlesim_node
      name: turtle_sim

运行启动脚本

ros2 launch launch_lab_py launch_lab.launch.yaml

3.2 .xml启动

编写以下启动文件

<launch>
    <node pkg="launch_lab_py" exec="node_launch_client" name="launch_client_py" />
    <node pkg="turtlesim" exec="turtlesim_node" name="turtle_sim" />
</launch>

运行启动脚本

ros2 launch launch_lab_py launch_lab.launch.xml

在这里插入图片描述

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


🔥 更多精彩专栏

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博客星球大冒险:用Spring Boot和JWT打造你的数字王国

揭秘如何在Spring Boot中无缝集成JWT&#xff0c;为你的应用打造一个高度可扩展且安全的认证系统。从添加依赖到创建JWT过滤器&#xff0c;再到实现令牌的有效性管理和刷新机制&#xff0c;每一步都精心设计&#xff0c;确保你的乐园能够迎接成千上万的游客&#xff01; 文章目…

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动&#xff0c;例如我这边要添加MySQL的数据&#xff0c;则需要首先下载MySQL数据驱动&#xff1a;MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”&#xff0c;如下图添加对应的数据库配置&#xf…

基于深度学习的模糊认知图方法

1 文章信息 文章题目为“Deep Fuzzy Cognitive Maps for Interpretable Multivariate Time Series Prediction”&#xff0c;该文于2019年发表于“IEEE TRANSACTIONS ON FUZZY SYSTEMS”。文章提出了深度模糊认知图&#xff08;FCM&#xff09;用于多变量时间序列预测&#xff…

一个良好的嵌入式系统框架(基于FreeRTOS)

目录 Unix操作系统里的优先级嵌入式系统里的优先级 Unix操作系统里的优先级 在《Unix传奇》中有这样一句话&#xff0c;用户态的进程/线程是三等公民、root线程是二等公民、硬件中断是一等公民。 在操作系统中&#xff0c;"用户态"和"内核态"是两种不同的…

BERT模型学习(1)

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;由谷歌在2018年推出&#xff0c;迅速成为自然语言处理&#xff08;NLP&#xff09;领域的一个突破性成果。 基本概念 在深入了解BERT之前&#xff0c;需要先简单了解一下自然语言处理&a…

五分钟“手撕”链表

为了提高大家的学习效率&#xff0c;我把代码放开头&#xff0c;供查阅。 目录 一、链表的实现代码 二、什么是链表 三、链表的分类 四、链表的常见操作 插入 删除 五、Java自带的LinkedList 两个构造方法 一些常用方法 六、LinkedList的遍历 七、ArrayList和Linke…

达梦数据库写文件的方式探索

0x01 前沿 这篇文章整体算是《达梦数据库手工注入笔记》的续集&#xff0c;达梦作为国内优秀的信创数据库&#xff0c;在关基单位中拥有越来越大的用户使用量。 通过SQL注入来写文件一直以来都是SQL注入漏洞深入利用的一种方式&#xff0c;对于不同的数据库通常写文件的方式也是…

探索无限可能性——微软 Visio 2021 改变您的思维方式

在当今信息化时代&#xff0c;信息流动和数据处理已经成为各行各业的关键。微软 Visio 2021 作为领先的流程图和图表软件&#xff0c;帮助用户以直观、动态的方式呈现信息和数据&#xff0c;从而提高工作效率&#xff0c;优化业务流程。本文将介绍 Visio 2021 的特色功能及其在…

【管理咨询宝藏119】翰威特组织架构设计优化方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏119】翰威特组织架构设计优化方案 【格式】PDF版本 【关键词】人力资源、组织设计、组织架构 【核心观点】 - 城镇化建设和居民可支配收入的增长…

Python实现定时任务的方式

大家好&#xff0c;在当今数字化的时代&#xff0c;定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行&#xff0c;还是特定时间点的操作触发&#xff0c;Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世…

代理 模式

一、什么是代理模式 代理模式指代理控制对其他对象的访问&#xff0c;也就是代理对象控制对原对象的引⽤。在某些情况下&#xff0c;⼀个对象不适合或者不能直接被引⽤访问&#xff0c;⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。 二、为什么使用代理模式 模式作…

MySQL各种锁

目录 1. 从粒度上区分锁 1.1 全局锁&#xff08;第一粒度&#xff09; 1.2 表级锁&#xff08;第二粒度&#xff09; 1.3 行锁&#xff08;第三最小粒度&#xff09; 2 从模式上区分锁 2.1 什么是乐观锁 2.2 什么是悲观锁 2.3 意向共享锁和意向排他锁 2.4 临键锁和记录…

【Python】 深入理解Python中的UnicodeDecodeError及其解决方案

基本原理 在Python编程中&#xff0c;我们经常需要处理各种类型的数据&#xff0c;尤其是文本数据。文本数据在计算机中通常以字节的形式存在&#xff0c;而字节需要被解码成我们能够理解的字符。这个过程涉及到编码和解码的概念。 编码是将字符转换为字节的过程&#xff0c;…

23 vue3面试重难点复习:响应式原理、特点、8大生命钩子、data数据定义、组件、全家桶

vue作为用的最为广泛的当前热门框架&#xff0c;总结如下重难点核心知识&#xff1a; 1.vue特点是什么&#xff1f; 1.1优点 渐进式 vue本身只提供数据响应式&#xff0c;需要全局缓存用 vuex&#xff0c;需要路由用 vue-router 组件化 封装组件&#xff0c;利于复用 响应式数…

k8s——Pod进阶(资源限制和探针)

一、资源限制 1.1 资源限制的定义 当定义Pod时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是CPU和内存大小&#xff0c;以及其他类型的资源。 当为Pod中的容器指定了request资源时&#xff0c;调度器就使用该信息来决定将Pod调度到哪个节点上。当还为容器…

汇凯金业:量化交易有风险吗

量化交易是一种通过复杂的数学模型和算法在金融市场中进行高频和自动化交易的方式。尽管量化交易在提高市场效率、减少人为错误等方面具有诸多优点&#xff0c;但它也同样存在着不少风险。以下列举了一些主要的风险因素&#xff1a; 1. 模型风险 模型缺陷&#xff1a;量化交易…

网络协议。

一、流程案例 接下来揭秘我要说的大事情&#xff0c;“双十一”。这和我们要讲的网络协议有什么关系呢&#xff1f; 在经济学领域&#xff0c;有个伦纳德里德&#xff08;Leonard E. Read&#xff09;创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程&#xff0c;来讲述…

数据安全之翼:天空卫士在汽车数据安全领域的卓越领航

近期&#xff0c;中国汽车网络安全与数据安全产业的积极倡导者谈思实验室发布首份《汽车网络与数据安全行业全景图》&#xff0c;天空卫士入选&#xff0c;并且位列榜首。 天空卫士在汽车数据安全领域有丰富的实践经验&#xff0c;曾为多家汽车行业用户提供数据安全产品与服务&…

LeetCode - 贪心(Greedy)算法集合(Python)[分配问题|区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…

不同linux账户切换不同的cuda版本

原因 由于服务器中安装了两个版本的cuda&#xff08;cuda10.1和cuda11.1&#xff09;&#xff0c;不同项目可能需要应用不同的cuda版本&#xff0c;但是自己又没有root权限或者只想在使用指定conda环境时改为用指定的cuda版本。总结起来有三种方法&#xff1a; 1、修改软链接指…