ROS笔记二:launch

目录

launch

node标签

参数

参数服务器 

节点分组


launch

launch文件是一种可以可实现多节点启动参数配置的xml文件,launch文件用于启动和配置ROS节点、参数和其他相关组件。launch文件通常使用XML格式编写,其主要目的是方便地启动ROS节点和设置节点之间的连接关系。

launch常用标签:

  1. <launch>标签:launch文件的根标签,表示这是一个launch文件。

  2. <node>标签:用于启动ROS节点。例如,<node pkg="my_package" type="my_node" name="node_name" output="screen"/>表示启动名为my_node的ROS节点,该节点属于my_package软件包,并且节点的名称为node_nameoutput="screen"表示将节点输出重定向到屏幕。

  3. <arg>标签:用于定义参数,可以在启动launch文件时传递给节点。例如,<arg name="my_arg" default="default_value"/>定义了一个名为my_arg的参数,并设置了默认值为default_value

  4. <param>标签:用于设置ROS参数。例如,<param name="my_param" type="int" value="42"/>表示设置一个名为my_param的整数类型参数,其值为42。

  5. <include>标签用于包含其他launch文件。这使得launch文件可以模块化并重用。例如,<include file="$(find my_package)/launch/other_launch_file.launch"/>表示包含了my_package软件包中的other_launch_file.launch文件。或者

  6. <group>标签:用于将一组节点放入一个组中。例如,可以使用<group ns="my_namespace">...</group>来指定一个命名空间,并且其中的所有节点都将位于这个命名空间下。

node标签

<node>标签是在ROS中用于启动ROS节点的XML标签(等同于rosrun)。通过<node>标签,可以指定要启动的ROS节点的相关信息,如软件包名称、节点类型、节点名称等。

ROS程序运行单位是是node即节点,运行单个node的指令是rosrun

rosrun 是 ROS 中用于直接运行已编译的节点程序的命令。使用 rosrun 命令可以方便地启动指定软件包中的节点,而无需指定软件包的路径。

语法为:rosrun <package_name> <node_name>

  • <package_name>:指定要运行节点所属的软件包名称。
  • <node_name>:指定要运行的节点的名称

要运行一个名为 my_node 的节点,它属于 my_package 软件包:rosrun my_package my_node

rosrun 命令会自动查找指定软件包,并在该软件包的目录下寻找对应的节点可执行文件并运行。

使用 rosrun 命令相对于直接使用可执行文件路径的好处是,它会自动设置 ROS 环境变量和节点名称空间,并提供了更方便的方式来启动节点。此外,rosrun 命令还支持其他选项和参数,可以通过运行 rosrun --help 查看详细信息。

<node>标签的一般结构和常用属性

<node pkg="package_name" type="node_type" name="node_name" [args="arg1 arg2 ..."] [output="output_option"]/>

  • pkg: 指定ROS节点所属的软件包名称。
  • type: 指定要启动的ROS节点类型(即可执行文件名)。
  • name: 指定为ROS节点设置的名称。通常用于在ROS图中唯一标识该节点。
  • args: 可选属性,用于传递参数给要启动的ROS节点。参数以空格分隔。
  • output: 可选属性,用于指定如何处理节点的输出信息。常见的选项包括log(将输出信息记录到日志文件)、screen(将输出信息打印到屏幕)等。

示例:

<node pkg="my_package" type="my_node" name="my_node" output="screen"/>

这个示例中,<node>标签会启动my_node节点,该节点属于my_package软件包,节点的名称为my_node,并且节点的输出信息会打印到屏幕上。

参数

<param>, <rosparam><arg> 是用于在launch文件中设置参数和传递参数的标签(tags)。

<param> 标签:<param> 标签用于在ROS的launch文件中设置节点参数的数值。通过 <param> 标签可以为特定节点设置参数值,这些参数值将会在节点启动时传递给该节点。

例如,可以使用以下方式在launch文件中设置参数值:

<param name="parameter_name" value="parameter_value"/>

<rosparam> 标签:<rosparam> 标签用于从文件或字符串中加载参数,并将这些参数设置到ROS参数服务器上。通过 <rosparam> 标签可以加载包含参数值的YAML文件,这些参数值可以在ROS节点中访问。

例如,可以使用以下方式在launch文件中加载参数文件:

<rosparam file="path/to/params.yaml"/>

<arg> 标签:<arg> 标签用于定义参数并将其传递给其他标签或节点。<arg> 标签通常用于传递参数值,以便在launch文件中重用参数

例如,可以使用以下方式定义一个参数并传递给节点:

<arg name="my_param" default="default_value"/> <node name="my_node" pkg="my_package" type="my_node" output="screen" arg="my_param"/>

参数服务器 

参数服务器是一个用于存储和检索参数值的全局参数数据库。它允许ROS节点在运行时动态地获取参数值,并且这些参数值可以在节点之间共享和调整。参数服务器为ROS系统提供了一种方便的方法来管理配置参数,使得节点之间可以共享和访问这些参数。

全局性: 参数服务器是全局性的,意味着所有的ROS节点都可以访问参数服务器上的参数值。

动态性: 节点可以在运行时动态地读取和更改参数服务器中的参数值。

命名空间: 参数服务器支持命名空间,因此可以对参数进行组织和分类,使得参数更加清晰和易于管理。

在ROS中,可以使用rosparam命令行工具或者在节点代码中使用ROS参数服务器 API来访问和设置参数服务器中的参数值。例如,可以使用rosparam set命令来设置参数的值,使用rosparam get命令来获取参数的值。

在节点代码中,可以使用ros::param(C++)或rospy.get_param(Python)等函数来访问和修改参数服务器中的参数值。

节点分组

节点分组是一种将相关节点组织在一起的方式,以便更好地管理和控制节点的行为。节点分组可以通过ROS的launch文件或者命令行进行设置和配置

通过launch文件进行节点分组:可以使用ROS的launch文件来将相关节点分组到一个launch文件中。在launch文件中,可以使用<group>标签将多个节点组合在一起,并定义它们的启动顺序、命名空间等信息。

e.g.

<launch>
  <group ns="my_group">
    <node name="node1" pkg="my_package" type="node1" />
    <node name="node2" pkg="my_package" type="node2" />
  </group>
</launch>
上述示例中,<group> 标签将 node1node2 节点组合到一个命名空间为 "my_group" 的分组中。

<group> 标签用于创建一个节点分组,其中 ns 属性定义了这个分组的命名空间。在这个命名空间下启动的节点将会共享这个命名空间,这意味着它们的名称将会被加上这个命名空间前缀。

例如,如果在 <group> 分组内启动了两个节点,一个叫做 node1,另一个叫做 node2,它们的完整名称将会是 my_group/node1my_group/node2

重命名

在ROS中,可以使用<remap>标签来进行节点话题或服务的重命名。这样可以避免不同节点之间的名称冲突,也可以方便地修改节点之间的通信关系。

在ROS的launch文件中,<remap> 标签用于重命名节点的话题或服务。

重命名节点的话题:

<launch><node name="my_node" pkg="my_package" type="my_node_type"><remap from="input_topic" to="new_input_topic" /><remap from="output_topic" to="new_output_topic" /></node>
</launch>

重命名节点的服务:

<launch><node name="my_service" pkg="my_package" type="my_service_type" ><remap from="input_service" to="new_input_service" /><remap from="output_service" to="new_output_service" /></node>
</launch>

<remap> 标签指定了要重命名的来源(from)和目标(to)。这意味着节点内部将使用新的名称来订阅和发布消息,而不是原来的名称

注意:<remap> 标签只是在启动时进行动态的重命名,并不会真正修改节点的代码或定义。

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

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

相关文章

寒假刷题第21天

PTA甲级 1174 Left-View of Binary Tree #include<iostream> #include<vector> #include<algorithm> #include<unordered_map>using namespace std;const int N 1e5 10; int pre[N] , in[N] , idx[N] , l[N] , r[N]; int n , max_dep 0; unordere…

72.是否可以把所有Bean都通过Spring容器来管理?(Spring的applicationContext.xml中配置全局扫 描)

一、是否可以把所有Bean都通过Spring容器来管理&#xff1f;&#xff08;Spring的applicationContext.xml中配置全局扫描) 不可以&#xff0c;这样会导致我们请求接口的时候产生404。 如果所有的Bean都交给父容器&#xff0c;SpringMVC在初始化HandlerMethods的时 候&#xff…

Vue3 中的各种ref

年前搞了一个V3的需求&#xff0c;里面涉及了一些各种ref的使用&#xff0c;今天顺便总结下V3中ref家族。 ref家族 ref()toReftoRefsisRef()unref()shallowReftriggerRefcustomRef总结 ref() 大家对于 ref 这个 API 肯定都不陌生。在 Vue3 中经常会用到它。它的作用是接收一个…

Kuberntes权威指南

一、目录 二、Kubernetes入门 三、Kubernetes核心原理 四、Kubernetes开发指南 五、Kubernetes运维指南 六、Kubernetes高级案例进阶 七、Kubernetes源码导读

20240206三次握手四次挥手

TCP和UDP异同点 相同点&#xff1a;同属于传输层的协议 不同点&#xff1a; TCP ----> 稳定 1> 提供面向连接的&#xff0c;可靠的数据传输服务 2> 传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、数据无重复 1、TCP会给每个数据包编上编号&#xff…

收藏:数据要素、数据资源、数据资产、数字资产的区别

01 什么是数据要素&#xff1f; 《中共中央关于坚持和完善中国特色社会主义制度推进国家治理体系和治理能力现代化若干重大的决议》&#xff08;2019&#xff09;首次将数据列为生产要素。 《关于构建更加完善的要素市场化配置体制机制的意见》&#xff08;2020.3&#xff09…

【Android-Gradle】多模块开发中,定义额外属性(全局变量),穿梭在不同的Gradle文件中(kotlin脚本版)

其他信息可以参考官网&#xff1a;https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html#org.gradle.api.plugins.ExtraPropertiesExtension 但是本文讲一些简单应用&#xff1a; 需求1&#xff1a;根目录gradle文件定义一个全局变量 …

分享71个节日PPT,总有一款适合您

分享71个节日PPT&#xff0c;总有一款适合您 71个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1v4_fHplsf_hOJQbNPVUudg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

区块链金融科技:技术融合与挑战应对【文末送书-16】

文章目录 前言一.区块链与金融科技的融合&#xff1a;革新金融格局的技术之光1.1区块链技术简介1.2 区块链在金融科技中的应用 二.智能合约2.1 去中心化金融&#xff08;DeFi&#xff09;2.2区块链对金融科技的影响2.3数据安全性 三.区块链与金融科技【文末送书-16】3.1 粉丝福…

leetcode 算法 67.二进制求和(python版)

需求 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 代码 class Solution…

如何区分流量控制和拥塞控制?

流量控制属于通信双方协商&#xff1b;拥塞控制涉及通信链路全局。 流量控制需要通信双方各维护一个发送窗、一个接收窗&#xff0c;对任意一方&#xff0c;接收窗大小由自身决定&#xff0c;发送窗大小由接收方响应的TCP报文段中窗口值确定&#xff1b;拥塞控制的拥塞窗口大小…

安全SCDN有什么作用

当前网络安全形势日益严峻&#xff0c;网络攻击事件频发&#xff0c;攻击手段不断升级&#xff0c;给企业和个人带来了严重的安全威胁。在这种背景下&#xff0c;安全SCDN作为一种网络安全解决方案&#xff0c;受到了广泛的关注。那么&#xff0c;安全SCDN真的可以应对网络攻击…

【leetcode题解C++】77.组合 and 216.组合总和III and 17.电话号码的字母组合

77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a…

在 CentOS 7上使用 Apache 和 mod_wsgi 部署 Django 应用的方法

简介 Django 是一个强大的 Web 框架&#xff0c;可以帮助您快速启动 Python 应用程序或网站。Django 包括一个简化的开发服务器&#xff0c;用于在本地测试代码&#xff0c;但对于任何与生产相关的事情&#xff0c;都需要一个更安全和功能强大的 Web 服务器。 在本指南中&…

【Vitis】基于C++函数开发组件的步骤

目录 基本步骤 关键领域 • 硬件接口&#xff1a; 任务级并行度&#xff1a; 存储器架构&#xff1a; 微观级别的最优化&#xff1a; 基本步骤 1. 基于 设计原则 建立算法架构。 2. &#xff08;C 语言仿真&#xff09; 利用 C/C 语言测试激励文件验证 C/C 代码的逻辑。…

Vue 3D轮播插件vue-carousel-3d(禁止滑动方法)

video 1.安装 npm install -S vue-carousel-3d2.在main.js全局引入&#xff1a; import Carousel3d from vue-carousel-3d; Vue.use(Carousel3d);3.或者直接在使用页面引入省略了上一步 import { Carousel3d, Slide } from vue-carousel-3d components: {Carousel3d,Slide },…

两个线程实现同步代码示例

#include<myhead.h>//1、定义无名信号量 sem_t sem;//定义生产者线程 void *task1(void *arg) {int num 5;while(num--){sleep(1);printf("我生产了一辆汽车\n");//4、释放资源sem_post(&sem);}//退出线程pthread_exit(NULL); }//定义消费者线程 void *ta…

win10没有调节亮度选项怎么办?

最近新装了win10&#xff0c;装机后”设置“-”显示“里面没有可以调节亮度的地方&#xff0c;这里记录一下解决方案。 解决方案 按WinX键&#xff0c;选择设备管理器&#xff0c;点击”显示适配器“&#xff0c;我这里默认是只有”Microsoft 基本显示适配器“&#xff0c;没有…

c++入门学习④——对象的初始化和清理

目录 对象的初始化和清理&#xff1a; why? 如何进行初始化和清理呢&#xff1f; 使用构造函数和析构函数​编辑 构造函数语法: 析构函数语法: 构造函数的分类&#xff1a; 两种分类方式&#xff1a; 三种调用方法&#xff1a; 括号法&#xff08;默认构造函数调用&…

UE中对象创建方法示例和类的理解

对象创建方法示例集 创建Actor示例 //创建一个护甲道具 AProp* armor GetWorld()->SpawnActor<AProp>(pos, rotator); 创建Component示例 UCapsuleComponent* CapsuleComponent CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComponent&qu…