关键词:
概要:这篇内容主要介绍将多个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, ros2component
和composition
包里面可执行文件,并且可以使用以下指令运行.
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与 listener
和 server
与client
.
第一个终端运行(查看源码(https://github.com/ros2/demos/blob/foxy/composition/src/manual_composition.cpp
)):
ros2 run composition manual_composition
这应该会显示这两组的重复消息,talker
与 listener
和 server
与client
.
注意
手动组合的组件并不能使用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
在第一个终端,确认来自talker
和listener
复述信息已经停止.
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文件(原文... 查看详情
ros2学习笔记10--使用ros2bag进行录制和回放数据(代码片段)
概要:这篇主要介绍使用ros2bag进行录制和回放数据环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.1.10录制和回放数据(原文:https://docs.ros.or... 查看详情