首页 > 其他分享 >ROS2:节点

ROS2:节点

时间:2024-11-01 19:41:31浏览次数:4  
标签:执行器 node rclcpp 线程 spin 节点 ROS2

节点

ROS2中,节点是一个抽象的实体,可以代表某类特定功能的抽象集合体,可以存在于进程或线程中
是ROS2的基础功能的载体,所有通信都需要通过节点来实现

节点和节点执行器

节点执行器executor是协调和调度节点运作的实体,并响应各类通信的回调结果
每个进程有一个或多个节点执行器,每个节点执行器有一个或多个节点

节点执行器有以下几种

  • 单线程节点执行器
    将所有已添加到维护队列的节点限制在一个线程内处理,占用一个线程资源,并根据其指定的规则对回调顺序和优先级进行设定
  • 多线程节点执行器
    负责管理的回调函数可以占用多个线程,根据设备性能,动态分配线程数,为队列中的节点处理回调,默认为CPU核心数
    std::thread::hardware_concurrency()获取线程最大数量
    线程回调的内容均来自于通信和等待任务,通信包含着订阅、服务、客户端和等待任务
  • 静态单线程节点执行器
    仅存在于rclcpp中,相对于普通单线程节点执行器可以有更低的CPU和内存占用率

ROS discourse社区的工程师每年在ROS论坛都会讨论新的节点执行器,为了提高其实效率和确定性等指标

建立节点

C++项目中,需要继承rclcpp::Node基类,Python项目中,需要继承rclcpp.Node基类

rclcpp默认方式是单线程节点执行器

节点命名规则

  • 不能为空
  • 第一个字符必须是字母、下划线、波浪号或斜杠
  • 后面的字符可以是字母、数字、下划线或斜杠
  • 使用下划线开头的节点是隐藏节点

节点执行器不会直接运行,需要通过节点执行器的spin()函数完成节点的所有回调工作
在rclcpp中提供了多种节点执行器的回调操作模式,常用的spinspin_allspin_some

  • spin()
    该函数会阻塞其他操作,节点执行器会完全并持续地执行回调工作直到被中断
    通常在其后面的内容都是结束进程的回收工作
  • spin_all()
    该函数不会阻塞其他操作,节点执行器会持续执行所有回调工作,直到超时或无其他工作可做
  • spin_some()
    该函数不会阻塞其他操作,节点执行器会完成执行所有在调用spin_some()时已准备就绪的回调,直到超时或无其他工作可做
    spin_all()的区别是spin_some()不会执行在执行过程中产生的回调
  • spin_once()
    该函数不会阻塞其他操作,只会执行已准备就绪的第一个回调,直到超时或无其他工作可做
  • spin_node_once()
    该函数会令节点执行器临时添加节点,执行一次spin_once()后,移除节点
  • spin_node_some()
    该函数会令节点执行器临时添加节点,执行一次spin_once()后,移除节点
  • spin_until_future_complete()
    该函数会令节点执行器执行回调直到future的内容完成,或超时,或被中断

调试节点

ros2 node list
ros2 node info

进程、线程与节点的关系

按线程数量分为:单线程节点执行器和多线程节点执行器

使用命令行参数,指定节点数量和使用的执行器
s表示单线程执行器
m表示多线程执行器

ros2 run multi_node_cpp multinode 5 s
ros2 run multi_node_cpp multinode 2 m

若不增加节点数量,只增加回调函数和定时器数量,在多线程执行器的维护下,会不会产生更多线程?

创建节点文件

ros2 pkg create test --build-type ament_cmake
--node-name lifecycle --dependencies std_msgs rclcpp

ros2 pkg create node_cpp --node-name node2go
在命令中ros2 pkg create可选--node-name参数创建节点文件
或在功能包的src下手动新建节点文件

发布者节点

修改package.xml

若想发布功能包,需修改package.xml文件中的description,license标签
ament_cmake下边添加

<buildtool_depend>rclcpp</buildtool_depend>
<buildtool_depend>std_msgs</buildtool_depend>

添加依赖
<depend>rclcpp</depend>

修改CMakeLists.txt

find_package(rclcpp)
获取依赖软件包,用于查找当前环境已有的软件包,后期构建使用
会引入一系列变量,如头文件路径和库文件路径等

新增依赖项,用于动态链接和关系导出

ament_target_dependenciesament构建体系中快速动态链接的方法
是ament构建体系中用于快速动态链接的方法,所有通过ament_cmake构建的软件包都可以通过其进行链接

导出依赖关系
为了其他依赖当前功能包的项目
导出ament依赖项可以使基于ament_cmake构建的功能包具备递归依赖的能力

添加软件包

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

设置编译规则

add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp std_msgs)

设置安装规则,这样ros2 run命令才能找到可执行文件

install(TARGETS
  talker
  DESTINATION lib/${PROJECT_NAME})

编译运行

确认功能包依赖项
在工作空间dev_ws下运行rosdep install -i --from-path src --rosdistro eloquent -y

在工作空间目录dev_ws下使用colcon build编译
若只想编译指定的包时,可使用colcon build --packages-select <my_package>

在工作空间目录下,使用. install/setup.bash命令,将工作空间添加到路径

ros2 run my_package my_node

标签:执行器,node,rclcpp,线程,spin,节点,ROS2
From: https://www.cnblogs.com/sgqmax/p/18521142

相关文章

  • 如何实现跨境设备操作?ToDesk远程控制加持全球节点轻松搞定
    随着近年来国际化水平的逐步提高,跨境的学习、交流、工作、旅行等已愈发常见。然而虽然交通出行也算方便,但针对频繁两地往来、海内外人员协助互动等,从省时、省力、省财力精力等成本方面考量,通过来回往返来解决却并非是一个最佳选项。那么,面向例如外资企业远程协助境外同事处理任务......
  • 【ROS2】在QtCreator中打开ROS工作目录
    1、准备1)在QtCreator中安装ROS插件(ros_qtc_plugin)2)在QtCreator中创建ROS2工程2、打开ROS2工作目录1)创建工程文件在ROS2工作目录(和src同级目录)中,创建工程文件,名为xxx.workspace,例如:laoer.workspace.2)添加文件内容<?xmlversion="1.0"?><Workspace>......
  • 《链表篇》---两两交换链表中的节点(中等)
    题目传送门1.定义一个虚拟节点链接链表2.定义一个当前节点指向虚拟节点3.在当前节点的下一个节点和下下一个节点都不为null的情况下。定义node1和node2。保存当前节点后面两个节点的地址。cur.next=node2;node1.next=node2.next;node2.next=node1;cur=node1;4.......
  • 《链表篇》---删除链表的倒数第N个节点(中等)
    题目传送门 方法一:计算链表长度(迭代)1.计算链表长度,并且定义哑节点链接链表。2.从哑节点开始前进length-n次。即为被删除节点的前置节点。3.进行删除操作。4.返回哑节点的后置节点classSolution{publicListNoderemoveNthFromEnd(ListNodehead,intn){......
  • MySQL从节点异常宕机重启后遇到主键冲突
    一台虚机在迁移过程中遇到点问题,然后运维做了重启的操作。重启后,发现该虚机中的mysql从库与主库的同步失败了。登录后查看,发现sqlthread停止运行了:mysql>showslavestatus\G***************************1.row***************************Slave_IO_St......
  • k8s~为pod添加节点的资源限制
    CPU单位CPU资源以CPU核心数为单位进行度量的。在Kubernetes中,一个CPU相当于:1AWSvCPU1GCPCore1AzurevCore一个超线程(在使用超线程的裸金属Intel处理器上)请求0.5CPU的容器所保证的CPU核数是请求节点上的1个CPU的一半。你可以用后缀m表示milli。例如100mCPU、100m......
  • 代码随想录算法训练营第十三天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子
    110.平衡二叉树题目链接:.-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com,这里刷题顺序,详......
  • 集群渲染是一台节点输出吗?它是云渲染农场吗
    集群渲染并非单一节点的输出,而是一种分布式计算技术,它通过多台计算机协同工作来加速3D渲染过程。这种技术常被视作云渲染农场的前身,两者在提高渲染效率方面有着相似之处。接下来,让我们深入了解集群渲染与云渲染农场之间的联系与区别。一、集群渲染有多少台节点输出集群渲染不是......
  • ThingsBoard规则链节点:GPS Geofencing Events节点详解
    引言1.GPSGeofencingEvents节点简介2.节点配置3.使用场景3.1物流跟踪3.2资产管理3.3安全监控3.4农业监测4.实际项目中的应用4.1项目背景4.2项目需求4.3实现步骤5.总结引言GPSGeofencingEvents是ThingsBoard规则链中的一个重要节点,用于处理......
  • ThingsBoard规则链节点:Generator节点详解
    引言1.Generator节点简介2.节点配置3.使用场景3.1模拟数据流3.2定时任务3.3事件触发3.4数据填充4.实际项目中的应用4.1项目背景4.2项目需求4.3实现步骤5.总结引言ThingsBoard是一个开源的物联网平台,提供了设备管理、数据收集、处理和可视化等功......