ROS到ROS2的多节点组合运行

0. 简介
ros1中我们会经常使用Nodelets来完成多个Node节点的管理。但是在ROS2中如何使用多节点组合去完成管理,这也是我们需要去了解和学习的。

1 . ROS 1 - Node 和 Nodelets
在ROS1中你可以写一个节点也可以写一个小节点(Nodelet)。 ROS 1 的节点会被编译成一个可执行文件。 ROS 1的小节点会被编译成一个动态链接库。当程序运行的时候会被动态的加载到容器进程里面。Nodelet包就是为改善这一状况设计的,它提供一种方法,可以让多个算法程序在一个进程中用 shared_ptr 实现零拷贝通信(zero copy transport),以降低因为传输大数据而损耗的时间。简单讲就是可以将多个node捆绑在一起管理,使得同一个manager里面的topic的数据传输更快。

1.1 pkg组织框架:

  • nodelet头文件(include/)
  • nodelet源文件(src/)
  • nodelet_plugins.xml
  • package.xml
  • CMakeLists.txt
  • launch文件

1.2 需要的操作步骤:

  • 在.cpp和.h中添加相应的头文件;
  • 去掉main函数;
  • .h中声明子类,.cpp中定义子类;
  • .cpp中将原node中类构造函数代码移动到onInit()中,用于初始化;
  • .cpp中添加PLUGINLIB_EXPORT_CLASS宏,讲子类声明为插件类,并编译为动态库;
  • package中添加 依赖,添加export;
  • 编写plugin.xml使nodelet称为一个插件;
  • CMakeLists做相应修改:添加nodelet依赖;没有main因此无executable,而是lib。

1.3 NodeLets子类
MyNodeletClass.h

#include <nodelet/nodelet.h>namespace example_pkg{    class MyNodeletClass : public nodelet::Nodelet    {        public:            virtual void onInit();    };}

注意:在nodelet::Nodelet基类当中,onInit()被声明为纯虚函数,因此在子类中必须对其进行重写(override)。所有的初始化工作都应该在这个函数中完成。

MyNodeletClass.cpp

#include <pluginlib/class_list_macros.h>// watch the capitalization carefullyPLUGINLIB_EXPORT_CLASS(example_pkg::MyNodeletClass, nodelet::Nodelet)namespace example_pkg{    void MyNodeletClass::onInit()    {        NODELET_DEBUG("Initializing nodelet...");    }}

注意:为了允许类被动态加载,它必须被标记为导出类。这通过特殊宏PLUGINLIB_EXPORT_CLASS / PLUGINLIB_DECLARE_CLASS来完成,通常放在导出类的.cpp文件的末尾。宏的参数分类为:pkg,class_name,class_type ,base_class_type。

1.4 nodelet_plugins.xml
该文件应与package.xml放置在同一路径下。插件描述文件是一个XML文件,用于存储有关插件的所有重要信息。它包含有关插件所在的库的信息,插件的名称,插件的类型等。

<library path="lib/libMyNodeletClass">  <class name="example_pkg/MyNodeletClass" type="example_pkg::MyNodeletClass" base_class_type="nodelet::Nodelet">  <description>  This is my nodelet.  </description>  </class></library>

1.5 package.xml
package.xml文件中,为了让pluginlib查询ROS系统上的所有可用插件,每个包必须显式指定它导出的插件。应添加如下:

...<build_depend>nodelet</build_depend><run_depend>nodelet</run_depend><export>  <nodelet plugin="${prefix}/nodelet_plugins.xml" /></export>...

1.6 mynodelet.launch
launch file中做了两件事情:启动一个nodelet manager,加载nodelet到manager中。

<launch>  <node pkg="nodelet" type="nodelet" name="standalone_nodelet"  args="manager" output="screen"/>  <node pkg="nodelet" type="nodelet" name="MyNodeletClass"         args="load example_pkg/MyNodeletClass standalone_nodelet" output="screen">  </node></launch>

2. ROS 2 - 统一API
在ROS2里面,推荐编写小节点——我们称之为组件Component。 这样我们就更容易为已经存在的代码添加一些通用的概念,比如生命周期. 使用不同的API所带来的麻烦完全被ROS2给避免了。节点进和小节点在ROS2中完全使用相同的API。

你也可以继续使用节点的风格的主函数,但是一般是并不推荐的

通过把进程的结构变成一个部署是的选项,用户可以自由的在下面的模式进行选择

  • 在不同的进程中运行多个节点。这样可以使不同的进程独立开。一个崩溃其他可以正常运行。也更方便调试各个节点。
  • 在同一个进程中运行多个节点。这样可以使得通信更加高效。

在未来的roslaunch版本中,会支持配置进程的结构,官网说明。

这些demos使用rclcpp_components, ros2component和composition包里面可执行文件,并且可以使用以下指令运行。

第一个终端,运行组件容器:

ros2 run rclcpp_components component_container

使用ros2命令行确认正在运行中的容器

$ ros2 component list/ComponentManager

在第二个终端(查看talker源码(https://github.com/ros2/demos/blob/foxy/composition/src/talker_component.cpp)).这个指令会返回已启动的模块id,其跟节点名字一样独一无二。

$ ros2 component load /ComponentManager composition composition::TalkerLoaded component 1 into '/ComponentManager' container node as '/talker'

第二个终端的另一条指令(查看listener代码(https://github.com/ros2/demos/blob/foxy/composition/src/listener_component.cpp)):

$ ros2 component load /ComponentManager composition composition::ListenerLoaded component 2 into '/ComponentManager' container node as '/listener'

ros2命令行实用程序现在是可以用来检查容器的状态:

$ ros2 component list/ComponentManager   1  /talker   2  /listener

使用launch操作组合,命令行工具用来调试和诊断组件配置,它通常是在同一时间启动一组组件(的方式)更方便。为了使得该操作自动化(完成),我们可以使用ros2 launch功能指令。

ros2 launch composition composition_demo.launch.py

最后可以使用专属的ID来卸载组件容器的节点。

$ ros2 component unload /ComponentManager 1 2Unloaded component 1 from '/ComponentManager' containerUnloaded component 2 from '/ComponentManager' container

下面我们来看一下函数结构

2.1 CMakeList.txt
为了使component_container能够找到所需的组件,必须在索引中注册该组件rclcpp_components_register_nodes,以便工具可以发现它:

点击ROS到ROS2的多节点组合运行 - 古月居可以查看全文

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

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

相关文章

C++类和对象:构造函数,析构函数,拷贝构造

文章目录 1.类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4.拷贝构造 1.类的6个默认成员函数 一个类中什么都不写,就是空类。而空类实际上有成员,当一个类中什么都不写时,编译器会生成六个对应默认成员函数。…

解读我国最新网络安全运维与数据处理安全规范:强化数字化时代安全基石

近日,全国网络安全标准化技术委员会秘书处公布了一系列重要的网络安全与数据安全相关技术规范草案,包括《网络安全技术 网络安全运维实施指南》、《网络安全技术 信息系统灾难恢复规范》以及《数据安全技术 政务数据处理安全要求》。这些规范旨在应对当前…

JavaScript权威指南(第7版) 笔记 - 第 7 章 数组

能用代码说清楚的,绝不多废话!!!!!! Linux创始人Linus的名言:Talk is cheap,show me the code ! ,博主技术博文会精心给出能说明问题的范例代码!…

安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd

安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd 1、背景2、容器运行时从 Docker 改为 Containerd2.1、安装 Containerd:2.2、生成 Containerd 的配置文件2.3 、创建 /etc/crictl.yaml 文件2.4 、配置 Containerd 服务开机自启 &#x1f49…

算法与数据结构要点速学——排序算法

排序算法 所有主要的编程语言都有一个内置的排序方法。假设并说排序成本为 O(n*log n),通常是正确的,其中 n 是要排序的元素数。为了完整起见,这里有一个图表,列出了许多常见的排序算法及其完整性。编程语言实现的算法各不相同&a…

【GDB调试技巧】提高gdb的调试效率

目录 🌞gdb的启动 🌞gdb技巧 🌼1. gdb小技巧汇总 🌼2. 打印输出指定地址的值 🌼3. 查看当前执行到哪行代码代码内容 3.1 方式一:info line 结合 list 。 3.2 方式二:f 3.3 方式三&#…

WebGIS面试题(第五期)

WebGIS面试题(第五期) 以下题目仅为部分题目,全部题目在公众号{GISer世界},答案仅供参考 1、Cesium的核心组件有哪些? Cesium的核心组件包括Viewer、Scene、Model、Geometry、Material和Camera等。其中,…

Latex(从入门到入土)1

第一章:初识Latex 1、安装Latex,当然可以安装官方的开放版本,也可以去找找别人发的资源。我这里只介绍我的学习经过。如果想下载最新的软件资源,我这里推荐微信公众号:软件智库,通过号主提供的网址是可以下…

基于大数据的全国热门景点数据可视化分析系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文将介绍如何使用Python中的Pandas库进行数据挖掘,并结合Flask Web框架实现一个旅游景点数据分析系统。该系统将包括以下功能模块:热门景点概况、景点星级与评分分析、景…

Docker 学习笔记(十):Centos7 中 Docker 部署 Redis 集群,打包 SpringBoot 微服务

一、前言 记录时间 [2024-4-17] 系列文章简摘: Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备 Docker 学习笔记(七)&#x…

基于Copula函数的风光功率联合场景生成_任意修改生成的场景数目(附带Matlab代码)

基于Copula函数的风光功率联合场景生成 削减为6个场景 部分展示削减为5个场景 部分展示 风光等可再生能源出力的不确定性和相关性给系统的设计带来了极大的复杂性,若忽略这些因素,势必会在系统规划阶段引入次优决策风险。因此,在确定系统最佳…

Linux sort/uniq/wc

文章目录 1. sort 排序将线程ID从大到小排序 2.uniq 临近去重3.wc word cnt 统计 1. sort 排序 将线程ID从大到小排序 grep -v是反向筛选,利用USER,排除掉首行 awk是打印第1 2列 sort -n是代码以数值大小做排序,不加的话会以字符排序。 -k是…

Go 单元测试之HTTP请求与API测试

文章目录 一、httptest1.1 前置代码准备1.2 介绍1.3 基本用法 二、gock2.1介绍2.2 安装2.3 基本使用2.4 举个例子2.4.1 前置代码2.4.2 测试用例 一、httptest 1.1 前置代码准备 假设我们的业务逻辑是搭建一个http server端,对外提供HTTP服务。用来处理用户登录请求…

腾讯实验室推出类似 Sora 的长视频生成Mira;阿里巴巴推出强大的代码生成模型CodeQwen1.5

✨ 1: Mira 腾讯PCG ARC实验室推出Mira:类似 Sora 的长视频生成 Mira(Mini-Sora),是一个尝试生成高质量、长时视频的初步探索项目,以Sora风格进行长视频生成。与现有的文本到视频(Text-to-Video, T2V&a…

2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题,包含高处安装、维护、拆除试题及解析答案和解析及高处安装、维护、拆除模拟试题练习。安全生产模拟考试一点通结合国家高处安装…

基于SSM+Jsp+Mysql的贝儿米幼儿教育管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

如何简单下载指定版本的jdk

Oracle 官方提供的 Java Development Kit (JDK) 的归档站点。它主要用于存放历史版本的 JDK,供开发者下载和使用。 附上站点地址:Archived OpenJDK GA Releases 在这个站点可以找到各版本的jdk,简单实用~ 找到版本,点击tar.gz进…

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息,Thales Imperva Bad Bot近期做了一份报告,显示在2023年有49.6%的互联网流量竟来自机器人,比上一年增长 2%,达到自2013年以来观察到的最高水平。 报告称,这一趋势正对企业组织产生负面影响&#xff0c…

Qwen1.5大语言模型微调实践

在人工智能领域,大语言模型(Large Language Model,LLM)的兴起和广泛应用,为自然语言处理(NLP)带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者,不仅拥有强大的语言生成和理…

Seata

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 1.1 Seata的三大角色 在 Seata 的架构中,一共有三个角色&#xff1…
最新文章