【多喝热水系列】从零开始的ROS2之旅------Day4
大家好!这里是【多喝热水系列】ROS2入门专栏,今天是咱们从零开始的第四天。在前两天的内容里,我们搞定了ROS2环境配置、熟悉了基础命令行工具,也对"节点"这个核心概念有了初步认知------节点是ROS2系统的最小功能单元,所有业务逻辑都要依托节点实现。今天,我们就直击核心:分别用Python和C++两种语言编写代码,创建属于自己的ROS2节点。
一、我们为什么要去学ROS2节点
节点是 ROS 2 系统中最小的功能执行单元,相当于机器人的 "专属分工模块"------ 每个节点只干一件具体的事(比如读传感器数据、算运动指令、处理图像),通过 "话题 / 服务" 和其他节点通信,最终拼接成完整的机器人功能(类似工厂里的流水线工人协作)。
而功能包的作用就是把实现某一特定功能的相关文件(节点代码、配置文件、启动脚本等)打包整合,即把实现一个大功能的多个节点打包到一块。
【例如,海龟模拟器和键盘控制节点都是在同一功能包的不同节点】

今天我们只专注"节点创建"本身,功能包的创建与配置会放到Day5详细讲解。目前大家只需假设已拥有现成的Python/C++功能包(后续Day4会补全前置步骤),重点掌握节点的代码编写、编译运行逻辑。至于为什么要学两种语言?答案很简单:Python上手快、适合快速验证想法;C++效率高、适合生产级场景,ROS2对两者支持都很完善,掌握基础实现能让后续开发更灵活。话不多说,先从简单的Python开始!
温馨提示:以下操作均基于ROS2 Humble版本,所有终端命令需先初始化ROS2环境,确保环境正常。
二、用Python创建ROS2节点
2.1 编写Python节点代码及各代码解释
python
import rclpy
from rclpy.node import Node
def main():
rclpy.init()#初始化ROS 2客户端库
node=Node('ros2_python_node')# 创建一个节点实例
node.get_logger().info('Hello from ROS 2 Python Node!')# 打印日志信息
node.get_logger().warn('warning')# 打印警告信息
rclpy.spin(node)# 保持节点运行
rclpy.shutdown()# 关闭ROS 2客户端库
if __name__=='__main__':
main()
2.2 编译与运行Python节点
1、具体的运行结果如图左下方终端所示:
在终端里面输入指令:python3 XXXXX.py
2、其右下方终端指令为在新终端下验证当前程序是否在运行:
在新终端里面输入指令:ros2 node list

附加:
1、ctrl+shfit+~:在vscode里面快速的打开终端。
2、ctrl+shfit+5:在原有终端旁边添加一个新终端。
2.3 修改输出信息

在上图不仅输出了我们想要的内容,而且输出了日志的级别、时间和节点信息,我们可以通过修改环境变量来修改日志的输出格式,如下图输出了代码的函数和行号。

二、用C++创建ROS2节点
2.1 编写C++节点代码及各代码解释
cpp
#include "rclcpp/rclcpp.hpp"
int main(int argc, char * argv[])
{
rclcpp::init(argc,argv);//初始化ROS2客户端库
auto node = std::make_shared<rclcpp::Node>("cpp_node");//创建一个名为"cpp_node"的节点
RCLCPP_INFO(node->get_logger(),"Hello, ROS2 from C++!");//打印日志信息
rclcpp::spin(node);//进入节点的事件循环
rclcpp::shutdown();//关闭ROS2客户端库
return 0;
}
附加:
argc/argv 的通用含义(C/C++ 基础)
argc 和 argv 是 C/C++ 程序入口函数 main 的标准参数,用于接收命令行启动参数:
-
argc(argument count):整数类型,表示命令行参数的总个数(包含程序自身路径 / 名称)。
-
argv(argument vector):字符串数组(char* argv[]),存储具体的命令行参数,其中:
argv[0]:程序自身的路径 / 名称(比如 ./cpp_node); argv[1]、argv[2]...:用户在启动程序时传入的自定义参数。
2.2 编译与运行C++节点
在Cmake编译C++程序之前,需要对CMakeLists.txt,需要查找添加依赖,具体代码和解释如下所示。
bash
cmake_minimum_required (VERSION 3.8)
project (ros2_cpp)
add_executable(ros2_cpp_node ros2_cpp_node.cpp)
find_package(rclcpp REQUIRED)
# 查找rclcpp头文件和库文件的路径
target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS})
# 给可执行文件包含rclcpp头文件
target_link_libraries(ros2_cpp_node ${rclcpp_LIBRARIES})
# 给可执行文件链接rclcpp库文件
通过Cmake来编译C++程序,具体过程如图所示:


运行节点如下图所示:

查看节点列表和信息如下图所示:

2.3 在一个项目中编写C++头文件路径
一个新的环境下vscode红波浪线的问题,解决方法如下
若有在新项目,把以下文件复制给新项目:

三、今日小结与后续预告
今天我们聚焦核心目标,完成了Python和C++版本ROS2节点的创建,下一期(Day5),我们就补全知识:笔者去学会创建Python和C++功能包,掌握功能包的配置逻辑,让节点开发的"全流程"闭环。