【多喝热水系列】从零开始的ROS2之旅——Day4

【多喝热水系列】从零开始的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 的标准参数,用于接收命令行启动参数:

  1. argc(argument count):整数类型,表示命令行参数的总个数(包含程序自身路径 / 名称)。

  2. 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++功能包,掌握功能包的配置逻辑,让节点开发的"全流程"闭环。

相关推荐
charlie1145141912 小时前
FreeRTOS:软件定时器(Software Timers)与时间管理
开发语言·笔记·学习·freertos·实时操作系统·工程
2401_841495642 小时前
【LeetCode刷题】寻找重复数
数据结构·python·算法·leetcode·链表·数组·重复数
laplace01232 小时前
LangChain 1.0 入门实战(Part 1)详细笔记
笔记·python·langchain·numpy·pandas
only-lucky2 小时前
Python版本OpenCV
开发语言·python·opencv
三万棵雪松2 小时前
【python-基础】
开发语言·python
先做个垃圾出来………2 小时前
2610.转换二维数组
开发语言·python
java1234_小锋2 小时前
[免费]基于Python的Django+Vue3在线商城系统(简易版)【论文+源码+SQL脚本】
python·django·商城系统·python毕业设计·在线商城
ray9632 小时前
Python——for循环和range()函数
python
jdlxx_dongfangxing2 小时前
每日课堂笔记(2026年1月1日)
笔记