
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》
❄专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》
❄专栏传送门 :《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏》
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连
目录
[一、节点 Node 与软件包 Package](#一、节点 Node 与软件包 Package)
前言
前两期博客我们完成了ROS2的安装以及仿真平台的搭建,本期博客我们来讲解一下ROS2的编程基础,完成创建包 → 编写节点 → 配置编译 → 运行节点 的完整流程,写出第一个 ROS2 程序 ------ Hello World。
一、节点 Node 与软件包 Package
1.1、基本概念
Package(软件包):是节点文件的容器,通常是一个包含了一系列配置文件的目录。
Node(节点):ROS2 的最小执行单元,一个节点就是一个功能程序。如下图所示:

关系:一个包可以包含多个节点,一个系统由多个包、多个节点组成。
就相当于:
Package(包)= 一个 APP。
Node(节点)= APP 里的功能模块。
如下图所示:

1.2、编写一个节点并测试
1.2.1、创建软件包
编写节点时必须得创建一个软件包,输入以下命令:
cpp
ros2 pkg create my_pkg
此时会生成目录结构和一些列配置文件,如下图所示:
1.2.2、编写节点node
在 my_pkg/src 目录下,新建一个名为 my_node.cpp 的文件,作为你的第一个 ROS2 节点源码。
这里我们就实现一个打印Hello world!的功能(经典永不过时!!!),输入以下代码:
cpp
#include "rclcpp/rclcpp.hpp"
int main(int argc, char * argv[])
{
// 1. 初始化 ROS2 客户端库
rclcpp::init(argc, argv);
// 2. 创建一个节点,命名为 "my_node"
auto node = std::make_shared<rclcpp::Node>("my_node");
// 3. 打印日志信息
RCLCPP_INFO(node->get_logger(), "Hello world!");
// 4. 保持节点运行,等待退出信号
while (rclcpp::ok())
{
// 空循环,保持节点存活
}
// 5. 关闭 ROS2 客户端库
rclcpp::shutdown();
return 0;
}
| 代码行 | 作用 |
|---|---|
#include "rclcpp/rclcpp.hpp" |
引入 ROS2 C++ 客户端库头文件 |
rclcpp::init(argc, argv) |
初始化 ROS2 环境,必须在创建节点前调用 |
std::make_shared<rclcpp::Node>("my_node") |
创建一个名为 my_node 的节点对象 |
RCLCPP_INFO(...) |
ROS2 标准日志输出,用于打印信息 |
while (rclcpp::ok()) |
节点主循环,保持节点运行,直到收到退出信号 |
rclcpp::shutdown() |
关闭 ROS2 环境,释放资源 |
1.2.3、设置编译规则
打开 my_pkg/CMakeLists.txt,添加以下编译配置:
cpp
# 1. 查找依赖包 rclcpp
find_package(rclcpp REQUIRED)
# 2. 定义要编译的可执行文件
add_executable(my_node src/my_node.cpp)
# 3. 为可执行文件指定依赖
ament_target_dependencies(my_node "rclcpp")
# 4. 安装可执行文件到指定目录
install(TARGETS
my_node
DESTINATION lib/${PROJECT_NAME}
)
注意,创建软件包,会自带一个CMakeLists.txt文件,修改里边的代码,最终代码如下:
cpp
cmake_minimum_required(VERSION 3.8)
project(my_pkg)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# 1. 基础依赖(必须有)
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
# 2. 编译节点(必须有)
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node "rclcpp")
# 3. 安装节点(必须有!)
install(TARGETS
my_node
DESTINATION lib/${PROJECT_NAME}
)
# 4. 测试相关(可以保留)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
# 5. 收尾指令(必须有!)
ament_package()
1.2.4、修改软件包信息
打开 my_pkg/package.xml,在 <buildtool_depend>ament_cmake</buildtool_depend> 下方,添加 rclcpp 依赖声明:
cpp
<depend>rclcpp</depend>
这一步是告诉 ROS2 构建系统,你的软件包依赖 rclcpp 库,编译时会自动链接。
二、编译软件包与运行节点
注意目录应该是这样:
ros2_zice/src/my_pkg/
├── CMakeLists.txt ← 在这里!
├── package.xml
└── src/
└── my_node.cpp ← 在这里!
2.1、编译软件包
回到工作空间根目录,执行 colcon build 编译:
cpp
cd ~/ros2_zice
colcon build
编译成功如下图所示:

2.2、加载环境变量
代码如下:
cpp
source install/setup.bash
如下图所示:

2.3、运行节点
代码如下所示:
cpp
ros2 run my_pkg my_node
端输出 [INFO] [xxx] [my_node]: Hello world!,就说明完全成功了!,如下图所示:

总结
本期博客我们讲解了ROS2的编程基础,完成创建包 → 编写节点 → 配置编译 → 运行节点 的完整流程,写出第一个 ROS2 程序 ------ Hello World。
