【多喝热水系列】从零开始的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++功能包,掌握功能包的配置逻辑,让节点开发的"全流程"闭环。

相关推荐
Dust-Chasing1 小时前
Claude Code源码剖析 - Claude Code 上下文压缩机制
人工智能·python·ai
小欣加油1 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 33 - 35)
开发语言·人工智能·笔记·python·学习方法
做cv的小昊2 小时前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
星恒随风2 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
浪客灿心3 小时前
项目篇:模块设计与实现
数据库·c++
abcy0712133 小时前
python pandas csv异步后台清洗前端优先返回成功信息
前端·python·pandas
牛油果子哥q3 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
颜酱3 小时前
LangChain使用RAG 入门:让大模型读懂你的私有文档
python·langchain
天天进步20153 小时前
Python全栈项目--校园智能宿舍管理系统
开发语言·python