【ROS2】中级:Launch -将启动文件集成到 ROS 2 包中

目标:向 ROS 2 包添加一个启动文件

教程级别:中级

 时间:10 分钟

 目录

  •  先决条件

  •  背景

  •  任务

    • 1. 创建一个包

    • 2. 创建用于存放启动文件的结构

    • 3. 编写启动文件

    • 4. 建立和运行启动文件

  •  文档

 先决条件

您应该已经学习了如何创建 ROS 2 包的教程。

始终不要忘记在您打开的每个新终端中获取 ROS 2 的源。

 背景

在上一教程中,我们看到了如何编写一个独立的启动文件。本教程将展示如何将一个启动文件添加到现有的包中,以及通常使用的约定。

 任务

1. 创建一个包

创建一个包可以存放的工作空间:

mkdir -p launch_ws/src
cd launch_ws/src

Python 包

ros2 pkg create --build-type ament_python --license Apache-2.0 py_launch_example
cxy@ubuntu2404-cxy:~$ mkdir -p launch_ws/src
cxy@ubuntu2404-cxy:~$ cd launch_ws/src
cxy@ubuntu2404-cxy:~/launch_ws/src$ ros2 pkg create --build-type ament_python --license Apache-2.0 py_launch_example
going to create a new package
package name: py_launch_example
destination directory: /home/cxy/launch_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['cxy <cxy@todo.todo>']
licenses: ['Apache-2.0']
build type: ament_python
dependencies: []
creating folder ./py_launch_example
creating ./py_launch_example/package.xml
creating source folder
creating folder ./py_launch_example/py_launch_example
creating ./py_launch_example/setup.py
creating ./py_launch_example/setup.cfg
creating folder ./py_launch_example/resource
creating ./py_launch_example/resource/py_launch_example
creating ./py_launch_example/py_launch_example/__init__.py
creating folder ./py_launch_example/test
creating ./py_launch_example/test/test_copyright.py
creating ./py_launch_example/test/test_flake8.py
creating ./py_launch_example/test/test_pep257.py

 C++包

ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_launch_example
cxy@ubuntu2404-cxy:~/launch_ws/src$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_launch_example
going to create a new package
package name: cpp_launch_example
destination directory: /home/cxy/launch_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['cxy <cxy@todo.todo>']
licenses: ['Apache-2.0']
build type: ament_cmake
dependencies: []
creating folder ./cpp_launch_example
creating ./cpp_launch_example/package.xml
creating source and include folder
creating folder ./cpp_launch_example/src
creating folder ./cpp_launch_example/include/cpp_launch_example
creating ./cpp_launch_example/CMakeLists.txt

2. 创建用于保存启动文件的结构

按照惯例,包的所有启动文件都存储在包内的 launch 目录中。确保在您上面创建的包的顶层创建一个 launch 目录。

Python包:

cxy@ubuntu2404-cxy:~/launch_ws/src$ cd py_launch_example
cxy@ubuntu2404-cxy:~/launch_ws/src/py_launch_example$ mkdir launch

d9b53ce11e882ce57c46ad7b86bc032a.png

对于 Python 包,包含您包的目录应该如下所示:

src/py_launch_example/launch/package.xmlpy_launch_example/resource/setup.cfgsetup.pytest/

为了使 colcon 能够定位和使用我们的启动文件,我们需要通知 Python 的设置工具它们的存在。为此,打开 setup.py 文件,在顶部添加必要的 import 语句,并将启动文件包含到 setup 的 data_files 参数中:

import os
from glob import glob
# Other imports ...package_name = 'py_launch_example'setup(# Other parameters ...data_files=[# ... Other data files# Include all launch files.(os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*launch.[pxy][yma]*')))]
)
# 导入os模块,该模块提供了一种方便的使用操作系统依赖功能的方式
import os
# 导入glob模块,该模块提供了一个在目录中使用通配符搜索创建文件列表的函数
from glob import glob
# 导入setuptools模块的find_packages和setup函数
from setuptools import find_packages, setup# 定义包名
package_name = 'py_launch_example'# 调用setup函数来配置包
setup(# 包名name=package_name,# 版本号version='0.0.0',# 使用find_packages函数查找包,排除名为'test'的包packages=find_packages(exclude=['test']),# 数据文件,将会被安装到指定的位置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.[pxy][yma]*')))],# 安装依赖,这个包需要setuptoolsinstall_requires=['setuptools'],# zip_safe参数,如果为True,表示此包可以作为.zip文件进行安全的分发和运行zip_safe=True,# 维护者的名字maintainer='cxy',# 维护者的邮箱maintainer_email='cxy@126.com',# 包的描述description='py_launch_example',# 许可证license='Apache-2.0',# 测试需要的包tests_require=['pytest'],# 入口点,定义了哪些包可以生成可执行文件entry_points={'console_scripts': [],},
)

C++包:

对于 C++ 包,我们将仅通过添加调整 CMakeLists.txt 文件:

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

文件结束前(但在 ament_package() 之前)。

3. 编写启动文件(Python / C++)

cxy@ubuntu2404-cxy:~/launch_ws/src/py_launch_example$ mkdir launch
cxy@ubuntu2404-cxy:~/launch_ws/src/py_launch_example$ cd launch
cxy@ubuntu2404-cxy:~/launch_ws/src/py_launch_example/launch$ gedit my_script_launch.py
cxy@ubuntu2404-cxy:~/launch_ws/src/py_launch_example/launch$ gedit my_script_launch.yaml
cxy@ubuntu2404-cxy:~/launch_ws/src/py_launch_example/launch$ gedit my_script_launch.xml

Python 启动文件 :

在您的 launch 目录中,创建一个名为 my_script_launch.py 的新启动文件。虽然 _launch.py 作为 Python 启动文件的文件后缀是推荐的,但不是必须的。然而,启动文件名需要以 launch.py 结尾,才能被 ros2 launch 识别和自动完成。

您的启动文件应定义 generate_launch_description() 函数,该函数返回一个 launch.LaunchDescription() ,供 ros2 launch 动词使用。

# 导入launch模块,该模块提供了ROS2的启动功能
import launch
# 导入launch_ros.actions模块,该模块提供了ROS2的节点启动功能
import launch_ros.actions# 定义一个函数generate_launch_description,该函数用于生成启动描述
def generate_launch_description():# 返回一个启动描述,该描述包含一个ROS2节点的启动信息return launch.LaunchDescription([# 使用launch_ros.actions.Node创建一个节点的启动信息launch_ros.actions.Node(# package参数指定了节点所在的包的名称package='demo_nodes_cpp',# executable参数指定了节点的可执行文件的名称executable='talker',# name参数指定了节点的名称name='talker'),])

XML 启动文件 

在您的 launch 目录中,创建一个名为 my_script_launch.xml 的新启动文件。建议使用 _launch.xml 作为 XML 启动文件的文件后缀,但这不是必需的。

<launch><node pkg="demo_nodes_cpp" exec="talker" name="talker"/>
</launch>

YAML 启动文件

在您的 launch 目录中,创建一个名为 my_script_launch.yaml 的新启动文件。 _launch.yaml 作为 YAML 启动文件的文件后缀是推荐的,但不是必须的。

launch:- node:pkg: "demo_nodes_cpp"exec: "talker"name: "talker"

e37de499f375c35bf51dc4ac2d2c2faf.png

4. 构建和运行启动文件

转到工作区的顶层,并构建它:

cxy@ubuntu2404-cxy:~$ cd ~/launch_ws
cxy@ubuntu2404-cxy:~/launch_ws$ colcon build
Starting >>> cpp_launch_example
Starting >>> py_launch_example
Finished <<< cpp_launch_example [2.19s]                                  
Finished <<< py_launch_example [2.44s]          Summary: 2 packages finished [2.65s]

在 colcon build 成功后,您已经配置了工作空间,您应该能够按照以下方式运行启动文件:

Python包:

Python launch文件: 

ros2 launch py_launch_example my_script_launch.py

XML launch文件:

ros2 launch py_launch_example my_script_launch.xml

YAML launch 文件:

ros2 launch py_launch_example my_script_launch.yaml
cxy@ubuntu2404-cxy:~/launch_ws$ ros2 launch py_launch_example my_script_launch.xml
[INFO] [launch]: All log files can be found below /home/cxy/.ros/log/2024-07-09-21-52-01-201445-ubuntu2404-cxy-22041
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [22044]
[talker-1] [INFO] [1720533122.376809549] [talker]: Publishing: 'Hello World: 1'
[talker-1] [INFO] [1720533123.376706560] [talker]: Publishing: 'Hello World: 2'
[talker-1] [INFO] [1720533124.376704004] [talker]: Publishing: 'Hello World: 3'
[talker-1] [INFO] [1720533125.376706763] [talker]: Publishing: 'Hello World: 4'
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[talker-1] [INFO] [1720533125.700402229] [rclcpp]: signal_handler(signum=2)
[INFO] [talker-1]: process has finished cleanly [pid 22044]

C++ 包:

ros2 launch cpp_launch_example my_script_launch.py
ros2 launch cpp_launch_example my_script_launch.xml
ros2 launch cpp_launch_example my_script_launch.yaml
cxy@ubuntu2404-cxy:~/launch_ws$ . install/setup.bash
cxy@ubuntu2404-cxy:~/launch_ws$ ros2 launch cpp_launch_example my_script_launch.yaml
[INFO] [launch]: All log files can be found below /home/cxy/.ros/log/2024-07-09-21-51-33-440231-ubuntu2404-cxy-21986
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [21989]
[talker-1] [INFO] [1720533095.014554528] [talker]: Publishing: 'Hello World: 1'
[talker-1] [INFO] [1720533096.014375189] [talker]: Publishing: 'Hello World: 2'
[talker-1] [INFO] [1720533097.014263021] [talker]: Publishing: 'Hello World: 3'
[talker-1] [INFO] [1720533098.014382181] [talker]: Publishing: 'Hello World: 4'
[talker-1] [INFO] [1720533099.014358704] [talker]: Publishing: 'Hello World: 5'
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[talker-1] [INFO] [1720533099.908663176] [rclcpp]: signal_handler(signum=2)
[INFO] [talker-1]: process has finished cleanly [pid 21989]

 文档

launch 文档 https://docs.ros.org/en/jazzy/p/launch/architecture.html 提供了更多关于也用于 launch_ros 的概念的详细信息。

即将提供更多关于启动功能的文档/示例。同时,请查看源代码(https://github.com/ros2/launch 和 https://github.com/ros2/launch_ros)。

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

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

相关文章

【FreeRTOS】configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY宏解析

1、今天在调试串口时&#xff0c;发现在中断调用xQueueSendFromISR后就会出现系统卡死 经过百度和谷歌后发现原来如此&#xff1a; 2、在FreeRTOSConfig.h中有个宏&#xff0c; #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2 这个宏是用来规定FreeRTOS能干预的…

一篇教会你 位置式PID 在写码中的应用。

前言&#xff1a;编写不易&#xff0c;仅供学习&#xff0c;参考&#xff0c;谢谢理解&#xff0c;请勿转载。 #位置式|增量式PID区别 本系列的前两篇讲的是位置式PID 没有增量式 PID &#xff0c;PID的变种有很多&#xff0c;常见的有 位置式PID 增量式PID PI PD 抗…

PHP7.4安装使用rabbitMQ教程(windows)

&#xff08;1&#xff09;&#xff0c;安装rabbitMQ客户端erlang语言 一&#xff0c;erlang语言安装 下载地址1—— 下载地址2——https://www.erlang.org/patches/otp-27.0 二&#xff0c;rabbitMQ客户端安装 https://www.rabbitmq.com/docs/install-windows &#xff08…

PTC可复位保险丝 vs 传统型保险丝:全面对比分析

PTC可复位保险丝&#xff0c;又称为自恢复保险丝、自恢复熔断器或PPTC保险丝&#xff0c;是一种电子保护器件。它利用材料的正温度系数效应&#xff0c;即电阻值随温度升高而显著增加的特性&#xff0c;来实现电路保护。 当电路正常工作时&#xff0c;PTC保险丝呈现低阻态&…

昇思25天学习打卡营第1天|小试牛刀

这里写自昇思25天学习打卡营第1天|小试牛刀定义目录标题 昇思25天学习打卡营第1天学习了初学入门之基本介绍。了解了昇思MindSpore和华为昇腾AI全栈。训练营中的教程丰富&#xff0c;有初学入门、应用实践和量子计算等。学习打卡营是很好的提升自己的机会。 昇腾计算&#xff…

Python和MATLAB微机电健康推导算法和系统模拟优化设计

&#x1f3af;要点 &#x1f3af;惯性测量身体活动特征推导健康状态算法 | &#x1f3af;卷积网络算法学习惯性测量数据估计六自由度姿态 | &#x1f3af;全球导航卫星系统模拟&#xff0c;及惯性测量动态测斜仪算法、动态倾斜算法、融合算法 | &#x1f3af;微机电系统加速度…

上传图片,base64改为文件流,并转给后端

需求&#xff1a; html代码&#xff1a; <el-dialog v-model"dialogPicVisible" title"新增图片" width"500"><el-form :model"picForm"><el-form-item label"图片名称&#xff1a;" :label-width"10…

Windows 部署ollama

一、简介 Ollama是在Github上的一个开源项目&#xff0c;其项目定位是&#xff1a;一个本地运行大模型的集成框架&#xff0c;目前主要针对主流的LLaMA架构的开源大模型设计&#xff0c;通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中&#xff0c;从而实现大模…

imx6ull/linux应用编程学习(15) 移植MQTT客户端库/测试

1. 准备开发环境 确保你的Ubuntu系统已经安装了必要的工具和依赖项。打开终端并运行以下命令&#xff1a; sudo apt update sudo apt install build-essential cmake git2. 获取MQTT库 git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c3. 编译MQTT库 mk…

【SVN的使用- SVN的基本命令-SVN命令简写-注意事项-解决冲突 Objective-C语言】

一、SVN的更新命令:update 1.服务器如果新建了一个文件夹,yuanxing,版本变成6了, 我现在本地还只有三个文件夹,版本5, 终端里边,我们敲一个svn update, 我这儿就多了一个yuanxing文件夹, 这个就是更新,就是把服务器最新的代码下载下来, 假设服务器上大家提交了这…

KNIME 5.2.5 版本界面切换

1、安装完KNIME后&#xff0c;点击“Create workflow in your local space.” 2、发现是这个样子 4、进行切换。点击“menu”&#xff0c;最后点击“Switch to classic user interfaceto” 5、最终显示结果&#xff1a;

补光灯LED照明 2.7V4.2V5V升60V80V100V升压恒流芯片IC-H6902B

H6902B升压恒流芯片IC确实是一款为LED照明应用设计的稳定且可靠的解决方案。这款芯片具有以下几个显著特点&#xff1a; 高效率&#xff1a;效率高达95%以上&#xff0c;这意味着在驱动LED灯时&#xff0c;电源到LED的能量转换效率非常高&#xff0c;减少了能量损失&#xff0…

centos磁盘空间满了-问题解决

报错问题解释&#xff1a; CentOS系统在运行过程中可能会出现磁盘空间不足的错误。这通常发生在以下几种情况&#xff1a; 系统日志文件或临时文件过大导致磁盘空间不足。 安装了大量软件或文件而没有清理无用文件。 有可能是某个进程占用了大量磁盘空间。 问题解决方法&a…

必看!微信小程序必备证书!

微信小程序必备SSL证书。在日益增长的数字经济中&#xff0c;微信小程序已成为商家与消费者之间重要的交互平台。由于其便捷性和广泛的用户基础&#xff0c;越来越多的企业选择通过小程序来提供服务。然而&#xff0c;在开发和部署微信小程序时&#xff0c;确保数据安全是一个不…

Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】

安装过程 1.wget命令行下载 下载Anaconda并保存文件至本地指定目录 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh -P ~/Downloads/anaconda3 查看是否下载好了 2.安装Anaconda 2.1 bash命令安装 bash后面是anaconda3下载好的路径 bash …

学生选课管理系统(Java+MySQL)

技术栈 Java: 用于实现系统的核心业务逻辑。MySQL: 作为关系型数据库&#xff0c;用于存储系统中的数据。JDBC: 用于Java程序与MySQL数据库之间的连接和交互。Swing GUI: 用于创建图形用户界面&#xff0c;提升用户体验。 系统功能 我们的学生选课管理系统主要针对学生和管理…

vue3源码(六)渲染原理-runtime-core

1.依赖关系 runtime-dom 依赖于runtime-core,runtime-core 依赖于reactivity和sharedruntime-core提供跨平台的渲染方法createRenderer&#xff0c;用户可以自己传递节点渲染的渲染方法renderOptions&#xff0c;本身不关心用户使用什么APIruntime-dom提供了为浏览器而生的渲染…

MSI打包后门成安装包

目录 浏览器下载地址 启动>next 选择后门所在路径&#xff0c;和生成安装包后存放路径 next>Hidden 配置变量 Look up随便找个伪装&#xff0c;然后点击一下Creat New ​注册表Registry导入 ​点击否&#xff0c;不购买专业版 ​安装包生成成功​编辑 浏览器下…

(自用)共享单车服务器(一):服务器项目配置

项目目录结构 conf:用来存放配置文件 git:用来存放从git上克隆的项目 src:用来存放项目源文件 test:用来存放测试文件 third:用来存放第三方头文件、第三方库 安装iniparser(关于iniparser的使用需进一步学习) 1.项目目录中创建git文件夹&#xff0c;用于存放GitHub上克隆…

计算机网络-IGMPv1工作原理简介

一、IGMPv1的原理简介 前面我们大致了解了IGMP用于在连接组播组成员的组播路由器总通过交互IGMP报文生成IGMP组表项和IGMP路由表项。IGMP报文封装在IP报文中。到目前为止&#xff0c;IGMP有三个版本&#xff1a;IGMPv1、IGMPv2、IGMPv3。 今天主要学习IGMPv1的作用和工作原理。…