ROS2中的节点了解
在 ROS 2(Robot Operating System 2)中,节点(Node) 是一个独立运行的进程,它可以执行特定的功能,如接收传感器数据、控制机器人执行任务或进行数据处理。
ROS 2 是一个分布式系统,多个节点可以在同一台计算机或多个计算机上运行,并通过话题(Topics)、服务(Services)、动作(Actions)等方式进行通信。
模块化设计:一个机器人系统可以由多个节点组成,例如:
- 相机节点:负责捕捉图像数据
- 导航节点:计算路径规划
- 电机控制节点:控制机器人运动
- 激光雷达节点:采集环境数据
ROS2中编写第一个c++节点
ros2_node.cpp
#include "rclcpp/rclcpp.hpp"
int main(int argc, char** argv)
{
rclcpp::init(argc, argv); // 初始化
auto node = std::make_shared<rclcpp::Node>("cpp_node");
RCLCPP_INFO(node->get_logger(), "你好C++节点!");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
代码解释
- 初始化 ROS 2 系统 (
rclcpp::init
):ROS 2 环境初始化,系统为节点分配必要的资源。 - 创建一个节点:创建一个名为
cpp_node
的 ROS 2 节点。该节点作为执行单元,之后你可以向它添加功能(如发布/订阅消息)。 - 记录日志信息 (
RCLCPP_INFO
):输出一条日志信息,表示节点启动。 - 进入事件循环 (
rclcpp::spin
):进入一个阻塞的事件循环,等待处理节点的各种任务(消息处理、服务请求、定时器等)。 - 关闭 ROS 2 系统 (
rclcpp::shutdown
):在节点退出之前,清理所有资源,关闭 ROS 2 系统。
注意:这里我们只需要掌握了解一下这里的流程,详细的代码编写暂时不需要详细看懂。
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(ros2_node)
add_executable(ros2_node ros2_node.cpp)//指定需要的源文件和最后生成的可执行文件名称
find_package(rclcpp REQUIRED) # 直接查找到对应的头文件和库文件
target_include_directories(ros2_node PUBLIC ${rclcpp_INCLUDE_DIRS}) # 头文件包含
target_link_libraries(ros2_node ${rclcpp_LIBRARIES}) # 库文件链接
在上一篇文章中我们已经讲解了CMakeLists.txt的作用和编写规则,在下面这个文章链接中,但是之前的例子中并没有介绍如果调用非标准库我们应该如何去做,比如ros2_node.cpp中调用了rclcpp这个非标准库文件,我们需要进行手动target链接rclcpp,接下来我将详细说明如何进行链接
GCC, Makefile, make, CMake, CMakeLists.txt-CSDN博客
target_include_directories 指定了
ros2_node
目标需要包含的头文件路径。target_link_libraries 告诉编译器在链接阶段要链接
rclcpp
相关的库文件。target_include_directories 作用于编译的预处理阶段(只是为了让预处理时编译器能找到头文件,相当于是预处理代码的时候遇到了文件库引用,让编译器先别慌,告诉它一定能找到这个库,以此来让编译器继续处理其他代码),target_link_libraries 作用于编译阶段和最后的链接阶段(为了在编译阶段解决符号解析问题,提供代码执行需要的库文件)
target_include_directories和target_link_libraries中第一个参数,写的是我们在 add_executable() 中定义的目标,即生成的可执行文件的名称——ros2_node
如果知道待链接库的位置时
完全可以直接使用 target_include_directories和
target_link_libraries
进行链接,可以不用find_package进行查找,并且在 CMake 中非常推荐这种做法。通过显式指定库的路径和名称,CMake 会将它们链接到你的目标(比如可执行文件或库)。
如果不知道待链接库的位置时
CMake 提供了 find_package 功能来自动查找并配置库。查找到对应的库之后,find_package会将找到的路径设置到一系列的变量(通常是 CMake 变量)中,供我们在后续的 CMake 配置中使用。这些变量通常包含库文件的完整路径,我们可以将它们传递给 target_link_libraries
或其他 CMake 命令。
例如,CMake 中的一些查找库的宏(如 find_package
)可能会定义类似以下变量:
LIBRARY_NAME_FOUND
:表示库是否被成功找到。LIBRARY_NAME_INCLUDE_DIRS
:库的头文件目录。LIBRARY_NAME_LIBRARIES
:库文件的路径。
这里面的LIBRARY_NAME这个前缀是我们使用find_package命令时手动设置的,即find_package(rclcpp REQUIRED) 中的rclcpp。使用find_package命令后自动生成的常见宏变量有:
rclcpp_INCLUDE_DIRS
:头文件路径rclcpp_LIBRARIES
:库路径rclcpp_FOUND
:是否成功找到该包rclcpp_VERSION
:库的版本号
查看ROS2中的节点
查看所有 ROS 2 节点
ros2 node list
该命令会返回所有当前运行的 ROS 2 节点的名称,例如:
/my_ros2_node
/teleop_node
/camera_driver
查看某个节点的详细信息
ros2 node info /my_ros2_node
这个命令可以列出该节点的发布的话题、订阅的话题、服务和参数。
查看所有话题
ros2 topic list
查看所有服务
ros2 service list