首页 > 其他分享 >在ROS2 - humble 中做一个节点

在ROS2 - humble 中做一个节点

时间:2024-07-21 15:59:21浏览次数:18  
标签:src node01 humble rclcpp ROS2 节点 ros2

ROS2(Robot Operating System 2)中的节点(Node)是ROS2系统中的一个核心概念,它代表了执行特定任务的进程或程序模块。

节点

定义

       在ROS2中,节点是系统中最小的处理单元,负责执行特定的任务或功能。每个节点都具有独立的处理能力和通信能力,可以与其他节点进行交互。

功能

       节点通过话题(Topics)、服务(Services)、动作(Actions)或参数(Parameters)等机制与其他节点进行通信和数据交换。它们可以发布数据到话题,订阅其他节点发布的话题,提供服务接口供其他节点调用,以及通过参数服务器存储和检索配置参数。

特点:
  • 模块化:每个节点都具有单一的模块化用途,例如控制电机、处理传感器数据等。这种模块化设计使得ROS2系统更加灵活和可扩展。
  • 独立性:节点之间是相互独立的,它们可以独立运行在不同的进程或线程中,互不影响。这种独立性提高了系统的稳定性和可靠性。
  • 通信能力:节点之间通过ROS2提供的通信机制进行交互,包括发布/订阅话题、请求/响应服务等。这些机制使得节点能够高效地共享数据和协作完成任务。
节点的执行器
  • ROS2中引入了节点执行器(Executor)的概念,用于协调和调度节点的运作。节点执行器支持单线程、多线程和静态单线程等多种模式。
  • 单线程执行器:最简单的执行器类型,其管理的回调函数只会占用一个线程资源。
  • 多线程执行器:允许回调函数占用多个线程,以提高处理效率。但过多的线程可能会增加系统调度压力,降低性能。
  • 静态单线程执行器:在编译期静态分配回调函数,优化运行时成本,但无法在运行时动态添加新的节点和回调函数。
创建与运行
  • 在ROS2中,可以使用C++或Python等编程语言创建节点。节点通常作为可执行文件的一部分运行,但单个可执行文件可以包含多个节点。
  • 创建节点时,需要指定节点的名称、类型等信息,并注册所需的回调函数以处理接收到的数据或请求。
  • 运行节点时,可以使用ros2 run命令加上包名和可执行文件名来启动节点。节点启动后,将自动加入ROS2的图(Graph)中,并与其他节点进行通信。
节点的信息获取
  • 可以通过 ros2 node list 命令获取当前系统中所有活动的节点名称。
  • 使用 ros2 node info <node_name> 命令可以获取指定节点的详细信息,包括与该节点交互的订阅者、发布者、服务和动作等。

       综上所述,ROS2中的节点是系统中最小的处理单元,具有模块化、独立性和通信能力等特点。通过节点执行器的协调和调度,节点能够高效地执行特定任务并与其他节点进行交互。

前提:Ubuntu22.04 - ROS2 humble

一键安装ros

wget http://fishros.com/install -O fishros && . fishros

工作空间 

首先,创建一个目录(ros2_ws)来包含我们的工作区:

工作空间就是文件夹,所以很简单。

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

功能包 

功能包可以理解为存放节点的地方,ROS2中功能包根据编译方式的不同分为三种类型。

  • ament_python,适用于python程序
  • cmake,适用于C++
  • ament_cmake,适用于C++程序,是cmake的增强版

colcon

colcon其实是一个功能包构建工具,用来编译工作空间

添加一些资源

git clone https://github.com/ros2/examples src/examples -b humble

此时工作区可以查看(不是该结构,可以sudo apt install tree)

.
└── src
    └── examples
        ├── CONTRIBUTING.md
        ├── LICENSE
        ├── rclcpp
        ├── rclpy
        └── README.md

4 directories, 3 files

然后编译一下

colcon build

 编完之后的目录结构

.
├── build
├── install
├── log
└── src

4 directories, 0 files

进入工作空间 

先source 一下资源

source install/setup.bash

 在工作空间中创建一个CPP功能包

ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp

创建完成后的目录结构如下:

.
└── src
    └── example_cpp
        ├── CMakeLists.txt
        ├── include
        │   └── example_cpp
        ├── package.xml
        └── src

5 directories, 2 files

 编写

 接着我们在 ./src/example_cpp/src 下创建一个 node01.cpp 文件

进入文件中编写代码

#include "rclcpp/rclcpp.hpp"


int main(int argc, char **argv)
{
     
    rclcpp::init(argc, argv);                               // 初始化rclcpp  
    
    auto node = std::make_shared<rclcpp::Node>("node01");  //产生一个node01的节点
   
    RCLCPP_INFO(node->get_logger(), "node01节点已经启动."); // 打印一句介绍
    
    rclcpp::spin(node);                                   // 运行节点,并检测退出信号 Ctrl+C
    
    rclcpp::shutdown();                                     // 停止运行 
    return 0;
}

在 node01.cpp 中输入上面的内容后,还需要修改一下CMakeLists.txt。将其添加为可执行文件,并使用 install 指令将其安装到 install 目录。

在CmakeLists.txt最后一行加入下面两行代码。

add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)

 添加这两行代码的目的是让编译器编译node01这个文件,接着在上面两行代码下面添加下面的代码。

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

最后再来一次

colcon build
source install/setup.bash

运行

ros2 run example_cpp node01

标签:src,node01,humble,rclcpp,ROS2,节点,ros2
From: https://blog.csdn.net/weixin_51738481/article/details/140527780

相关文章

  • 代码随想录算法训练营第十五天 | 110.平衡二叉树、257. 二叉树的所有路径 、404.左叶
    110.平衡二叉树题目:.-力扣(LeetCode)思路:后序遍历计算高度代码:/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*......
  • 代码随想录day4 | 24 两两交换链表节点 19 删除倒数第n个节点 142 环形链表
    24两两交换节点funcswapPairs(head*ListNode)*ListNode{ //思路涉及到链表增删改操作,优先考虑使用虚拟头节点此处为双指针加上虚拟头节点 ifhead==nil||head.Next==nil{ returnhead } vardummyHead=&ListNode{0,head} varprev=dummyHead forp......
  • Docker搭建BT-Tracker服务器贡献BT网络Tracker节点
    为畅享BT下载体验,(BT下载或做种)请添加Tracker:http://tracker.carlzeng.top:6969/announce长期自主自觉维护朗读全文Yourbrowserdoesnotsupporttheaudioelement.有什么用搭建BTTracker服务器,自建公共的BT网络Tracker节点为畅享更快BT下载体验,请给添加本站BTTrac......
  • 【MATLAB源码-第149期】基于MATLAB的2ASK,2FSK,2PSK,2DPSK等相干解调仿真,输出各节点波
    操作环境:MATLAB2022a1、算法描述2ASK(二进制幅移键控)、2FSK(二进制频移键控)、2PSK(二进制相移键控)和2DPSK(二进制差分相移键控)是数字调制技术中的基本调制方式,它们在无线通信、数据传输等领域有着广泛的应用。相干解调是这些调制方式中一个重要的解调技术,它要求接收端的本地振......
  • 如何从节点js使用AWS s3实施AWS Media Convert?
    我正在构建一个应用程序,用户可以在其中上传和观看视频。我将视频以.mp4容器格式存储在S3中,但是,我想将视频转换为m3u8格式以进行自适应流式传输。我发现有一个名为“AmazonMediaConvert”的东西(https://docs.aws.amazon.com/mediaconvert/index.html)可以......
  • 【算法】删除有序链表中的重复元素、保留重复节点的一个
    1.概述存在一个按升序排列的链表,给你这个链表的头节点head,请你删除所有重复的元素,使每个元素只出现一次。返回同样按升序排列的结果链表。本问题和【算法】删除有序链表中的重复元素、不保留重复节点很类似,但是思考起来稍微简单些,建议看完这个,看链接的这个吧。2.......
  • 代码随想录算法训练营第 15 天 |LeetCode110平衡二叉树 LeetCode257二叉树的所有路径
    代码随想录算法训练营Day15代码随想录算法训练营第15天|LeetCode110平衡二叉树LeetCode257二叉树的所有路径LeetCode404左叶子之和LeetCode222完全二叉树节点之和目录代码随想录算法训练营前言LeetCode110平衡二叉树LeetCode257二叉树的所有路径LeetCode404左......
  • 链表(3) ----快慢指针,求中间节点
    目录快慢指针算法步骤:为什么有效?使用场景:力扣876题目 方法代码 力扣142题目方法1代码 方法2 思路代码 官网地址:https://www.dhcode.cn/p/t_pc/goods_pc_detail/goods_detail/term_624bd804b3d39_Ac0g7V?fromH5=true&type=3&channel_id=&pro_id=term_62......
  • (nice!!!)LeetCode 3112. 访问消失节点的最少时间(图论、边的dijkstra、堆优化)
    3112.访问消失节点的最少时间思路:节点n的个数非常大,用普通的dijkstra算法对节点进行枚举是会超时的,时间复杂度为0(n^2)。这里边的数量最大为10^5,可以对边使用dijkstra算法+堆优化操作,时间复杂度为0(mlogm)。节点消失问题,只需要加一个判断条件,判断到每个节点的最小时......
  • Nodify学习 二:添加节点
    Nodify学习一:介绍与使用-可乐_加冰-博客园(cnblogs.com)Nodify学习二:添加节点-可乐_加冰-博客园(cnblogs.com)添加节点(nodes)通过上一篇我们已经创建好了编辑器实例现在我们为编辑器添加一个节点添加model和viewmodel并将它们绑定到视图publicclassNodeViewMod......