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