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

相关推荐
mango_mangojuice7 分钟前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
青春不朽51210 分钟前
Scrapy框架入门指南
python·scrapy
工程师老罗19 分钟前
YOLOv1 核心知识点笔记
笔记·yolo
MZ_ZXD00133 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石1 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
梨落秋霜1 小时前
Python入门篇【模块/包】
python
A星空1232 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
半壶清水2 小时前
[软考网规考点笔记]-软件开发、项目管理与知识产权核心知识与真题解析
网络·笔记·压力测试
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
会叫的恐龙2 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串