ros2学习笔记23--将多个node节点组合到单一进程中(代码片段)

鸿_H 鸿_H     2022-12-15     671

关键词:

概要:这篇内容主要介绍将多个node节点组合到单一进程中

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现

3.5多个node节点组合到单一进程中(原文:https://docs.ros.org/en/foxy/Tutorials/Composition.html

>>教程>>多个node节点组合到单一进程中

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

多个node节点组合到单一进程中

目录

1.背景
2.运行这些demos
2.1发现可使用的部件
2.2运行时使用发布器和订阅器组合的ROS服务(1)
2.3运行时使用服务器和客户端组合的ROS服务(1)
2.4编译时使用ROS服务组合(2)
2.5运行时使用dlopen组合
2.6使用lauunch操作组合
3.高级话题
3.1卸载组件
3.2重映射容器名称和命名空间
3.3重映射组件名称和命名空间
4(将)可组合节点作为共享库

1.背景

参考本文(https://docs.ros.org/en/foxy/Concepts/About-Composition.html)概念.

2.运行这些demos

这些demos使用rclcpp_components, ros2componentcomposition包里面可执行文件,并且可以使用以下指令运行.

2.1发现可使用的部件

查看工作空间有哪些注册的和可使用的组件,终端执行下面指令:

$ ros2 component types
composition
  composition::Talker
  composition::Listener
  composition::Server
  composition::Client

2.2运行时使用发布器和订阅器组合的ROS服务(1)

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

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::Talker
Loaded 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::Listener
Loaded component 2 into '/ComponentManager' container node as '/listener'

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

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

现在,第一个终端应该会重复显示输出每一条接受到的消息.

2.3运行时使用服务器和客户端组合的ROS服务(1)

服务器和客户端例子是非常相似的.

在第一个终端:

ros2 run rclcpp_components component_container

在第二个终端(查看服务器(https://github.com/ros2/demos/blob/foxy/composition/src/server_component.cpp)和客户端(https://github.com/ros2/demos/blob/foxy/composition/src/client_component.cpp)源码):

ros2 component load /ComponentManager composition composition::Server
ros2 component load /ComponentManager composition composition::Client

在案例中,客户端发送一个请求到服务器,服务器处理请求,并且返回响应,客户端打印收到的响应.

2.4编译时使用ROS服务组合(2)

这个案例展示的是,可以重用相同的共享库编译一个可执行文件运行多个组件.这个可执行文件包含上面四个组件:talker与 listenerserverclient

第一个终端运行(查看源码(https://github.com/ros2/demos/blob/foxy/composition/src/manual_composition.cpp)):

ros2 run composition manual_composition

这应该会显示这两组的重复消息,talkerlistenerserverclient

注意

手动组合的组件并不能使用ros2 component list输出命令行显示的.

2.5运行时使用dlopen组合

这里案例通过创建一个泛型容器进程,并且明确通过库加载而不是使用ros接口,给1提出了可替代性(方案).这个过程会打开每一个库并在库源码里面创建每一个rclcpp::Node类实例(https://github.com/ros2/demos/blob/foxy/composition/src/dlopen_composition.cpp).

linux:

ros2 run composition dlopen_composition `ros2 pkg prefix composition`/lib/libtalker_component.so `ros2 pkg prefix composition`/lib/liblistener_component.so

现在,终端应该显示重复输出每一条发送或接收的消息.

注意

dlopen库函数模块并不能用ros2 component list输出指令行显示.

2.6使用lauunch操作组合

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

ros2 launch composition composition_demo.launch.py

3.高级话题

现在,我们已经了解组件的基本操作,我们可开始讨论一些高级话题.

3.1卸载组件

第一个终端,启动组件容器:

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::Talker
Loaded component 1 into '/ComponentManager' container node as '/talker'
$ ros2 component load /ComponentManager composition composition::Listener
Loaded component 2 into '/ComponentManager' container node as '/listener'

用专属的ID来卸载组件容器的节点。

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

在第一个终端,确认来自talkerlistener复述信息已经停止.

3.2重映射容器名称和命名空间

组件管理器名称和命名空间可以通过标准的命令行参数重新映射(给个新名字意思):

ros2 run rclcpp_components component_container --ros-args -r __node:=MyContainer -r __ns:=/ns

在第二个终端,可使用更新的容器名来加载组件:

ros2 component load /ns/MyContainer composition composition::Listener

注意

容器命名空间的重映射并不影响影响已经启动的组件.

3.3重映射组件名称和命名空间

组件名称和名称空间可通过加载命令参数进行调整。

第一个终端,启动组件容器:

ros2 run rclcpp_components component_container

一些重映射名字和命名空间的例子:

# Remap node name
ros2 component load /ComponentManager composition composition::Talker --node-name talker2
# Remap namespace
ros2 component load /ComponentManager composition composition::Talker --node-namespace /ns
# Remap both
ros2 component load /ComponentManager composition composition::Talker --node-name talker3 --node-namespace /ns2

(输入)ros2 component list有相应的条目出现:

$ ros2 component list
/ComponentManager
   1  /talker2
   2  /ns/talker
   3  /ns2/talker3

注意

容器名称空间的重新映射不影响已经加载的组件.

4(将)可组合节点作为共享库

如果你想从一个包内输出一个组合节点作为一个共享库,并且在链接时组成的另一包使用该节点,(则)添加代码到CMake文件里面,该文件会导入下游包的实际目标(含target参数定义).

然后安装生成文件,输出生成文件.

实际案例可以看这里:ros分析-共享库的ament最好练习(https://discourse.ros.org/t/ament-best-practice-for-sharing-libraries/3602

其他

个人认为重点:

组件相关指令,罗列,重映射(名字或命名空间),类型查看,加载,(多个时)launch启动,卸载

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

ros到ros2的多节点组合运行

...何使用多节点组合去完成管理,这也是我们需要去了解和学习的。1.ROS1-Node和Nodelets在ROS1中你可以写一个节点也可以写一个小节点(Nodelet)。ROS1的节点会被编译成一个可执行文件。ROS1的小节点会被编译成一个动态链接库。当程序... 查看详情

组合模式——headfirst设计模式学习笔记

组合模式:允许将对象组合成树形结构来表现“整体/部分”层次结构。组合让客户用一致的方式处理个别对象和组合对象  特点:树形结构表示对象组合忽略对象组合和对象个体之间的差别,即相同的操作既可以作用于... 查看详情

ros2节点简介(代码片段)

背景ROS2graph在接下来的几篇教程中,您将学习构成ROS2graph的一系列核心ROS2概念。ROSgraph是一个由所有的ROS2元素同时在一起处理数据的网络。如果您想要将它们全部映射并可视化的话,则它将包含所有的可执行文件以及它们之间... 查看详情

如何在 ROS2 中启动带参数的节点?

】如何在ROS2中启动带参数的节点?【英文标题】:HowtolaunchanodewithaparameterinROS2?【发布时间】:2018-12-2420:32:43【问题描述】:将ros1包迁移到ros2,但不知道如何使用ros2中的参数启动。对于ros1,我有一个启动文件,它引用了一个配... 查看详情

ros2学习笔记28--ros2环境下,多激光雷达启动的launch文件编写样式参考(代码片段)

背景:一次需要读取多个velodyne的雷达点云数据,但是ros2知识缺少,一番折腾终有成果.1.准备velodyne的ros2版本驱动链接:https://github.com/ros-drivers/velodyne/tree/ros22.launch文件编写2.1官方 查看详情

javascript学习笔记:dom节点概述

0x01:DOM是javascript操作网页的接口,全称为文档对象模型(DocumentObjectModel)。它的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容)。浏览器会根据DOM模型,将HTML文档解析成一系列的节... 查看详情

java/android设计模式学习笔记(12)---组合模式

  这篇我们来介绍一下组合模式(CompositePattern),它也称为部分整体模式(Part-WholePattern),结构型模式之一。组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一... 查看详情

ros2学习笔记12--创建ros2包(代码片段)

概要:这篇主要介绍如何创建ros2包环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.2创建自己第一个ros2包(原文:https://docs.ros.org/en/foxy/Tutor... 查看详情

ros2学习笔记16--详述ros2接口(代码片段)

概要:这篇主要进一步介绍ros2接口.环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.8拓展ros2接口(原文:https://docs.ros.org/en/foxy/Tutorials... 查看详情

ros2中零拷贝实现进程内节点之间的高效通信

...方式:dianyunpcl@163.com背景ROS应用程序通常由单个“节点”组成,这些节点执行单个的任务,并与系统的其他部分分离。这促进了故障隔离、更快的开发、模块化和代码重用,但往往以性能为代价。在最初开发ROS... 查看详情

《分布式技术原理与算法解析》学习笔记day10

这篇文章主要描述分布式系统中的单体调度机制,它是指一个集群中只有一个节点运行调度进程,并介绍GoogleBorg的单体调度设计思路。调度框架:单体调度什么是调度?分布式系统架构的目的是将多个服务器资源管理起来,对... 查看详情

ros2学习笔记18-velodyne16雷达点云在ros2中可视化案例参考(代码片段)

环境:ubuntu20.04,ros-foxy,vscode,velodyne-16背景:练习如何将velodyne-16雷达点云数据在ros2中读取并可视化.折腾了很久,并没有找到类似案例,所以自己总结一下.1.修改电脑ip这里修改自己电脑ip,跟大多数... 查看详情

ros2学习笔记25--ros2话题统计编写教程(c++)(代码片段)

概要:这篇内容主要介绍用c++编写能够统计话题的侦听器环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现4.1ros2话题统计教程(C++)(... 查看详情

ros2学习笔记19--探索ros2doctor工具(代码片段)

概要:这篇主要介绍ros2doctor工具环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.11探索ros2doctor工具(原文:https://docs.ros.org/en/foxy/Tutorials/Get... 查看详情

ftxui按键和ros2cli组合使用笔记(turtlesim+teleop)(代码片段)

...命令与thread并行基础和进阶(含ROS2CLI)2.FTXUI基础笔记(botton按钮组件基础)如何编写一个终端用户接口,实现打开turtlesim仿真和teleop遥控呢?需要参考程序1:#include<memo 查看详情

webots2021b和ros2调试笔记21-07-27(代码片段)

先上结论:凉凉凉透心凉webots2021b刚发布时间不长,其ROS2接口包也不全。2021b(win10)安装包小,很多库需要启动时联网下载。很多节点不支持windows哦!如下:[WARNING][webots_robotic_arm_node.EXE-2]:'SIGINT'... 查看详情

ros2学习笔记15--创建自定义ros2接口文件msg和srv(代码片段)

概要:这篇主要介绍如何创建定制型ros2接口文件msg和srv环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.7创建自定义ros2消息msg和srv文件(原文&#x... 查看详情

ros2学习笔记10--使用ros2bag进行录制和回放数据(代码片段)

概要:这篇主要介绍使用ros2bag进行录制和回放数据环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.1.10录制和回放数据(原文:https://docs.ros.or... 查看详情