在ROS2 - humble 中做一个节点

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

bash 复制代码
wget http://fishros.com/install -O fishros && . fishros

工作空间

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

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

bash 复制代码
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

功能包

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

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

colcon

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

添加一些资源

bash 复制代码
git clone https://github.com/ros2/examples src/examples -b humble

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

bash 复制代码
.
└── src
    └── examples
        ├── CONTRIBUTING.md
        ├── LICENSE
        ├── rclcpp
        ├── rclpy
        └── README.md

4 directories, 3 files

然后编译一下

bash 复制代码
colcon build

编完之后的目录结构

bash 复制代码
.
├── build
├── install
├── log
└── src

4 directories, 0 files

进入工作空间

先source 一下资源

bash 复制代码
source install/setup.bash

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

bash 复制代码
ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp

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

bash 复制代码
.
└── src
    └── example_cpp
        ├── CMakeLists.txt
        ├── include
        │   └── example_cpp
        ├── package.xml
        └── src

5 directories, 2 files

编写

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

进入文件中编写代码

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最后一行加入下面两行代码。

cpp 复制代码
add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)

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

bash 复制代码
install(TARGETS
  node01
  DESTINATION lib/${PROJECT_NAME}
)

最后再来一次

bash 复制代码
colcon build
source install/setup.bash

运行

bash 复制代码
ros2 run example_cpp node01
相关推荐
汇能感知25 分钟前
FPGA在光谱相机中的核心作用
经验分享·笔记·科技
xiao--xin1 小时前
计算机网络笔记(二十三)——4.5IPv6
网络·笔记·计算机网络·ipv6
水煮蛋不加蛋2 小时前
RAG 赋能客服机器人:多轮对话与精准回复
人工智能·ai·机器人·大模型·llm·rag
Mr.Winter`4 小时前
深度强化学习 | 图文详细推导软性演员-评论家SAC算法原理
人工智能·深度学习·神经网络·机器学习·数据挖掘·机器人·强化学习
UpUpUp……7 小时前
HTML简单语法标签(后续实操:云备份项目)
笔记·html
小彭律师7 小时前
门禁人脸识别系统详细技术文档
笔记·python
是孑然呀8 小时前
【小记】word批量生成准考证
笔记·学习·excel
毫秒AI获客12 小时前
小红书多账号运营效率优化:技术方案与自动化实践
笔记
菜一头包13 小时前
c++ std库中的文件操作学习笔记
c++·笔记·学习
moxiaoran575315 小时前
uni-app学习笔记五-vue3响应式基础
笔记·学习·uni-app