动手学ROS2-入门篇-动手使用ROS
参考学习网址
https://fishros.com/d2lros2/#/humble/chapt2/get_started/2.ROS2功能包与工作空间?id=_1-工作空间
第二章 ROS2 功能包与工作空间
运行一个节点的时候使用的是:
ros2 run 包名字 可执行文件名字
找包去哪里找 工作空间
- 工作空间
工作空间是包含若干个功能包的目录,一开始大家把工作空间理解成一个文件夹就行了。这个文件夹包含下有src。所以一般新建一个工作空间的操作就像下面一样。


build 目录存储的是中间文件。对于每个包,将创建一个子文件夹,在其中调用例如CMake
install 目录是每个软件包将安装到的位置。默认情况下,每个包都将安装到单独的子目录中。
log 目录包含有关每个colcon调用的各种日志信息。
4.运行一个自己编的节点
source install/setup.bash
source install/setup.bash 是 ROS 开发的基础操作,确保每次编译后或打开新终端时执行该命令,以正确配置环境变量。通过合理管理工作空间和环境,可以避免冲突并提高开发效率。
ros2 run 包名字 可执行文件名字
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
【4.使用RCLCPP编写节点】
节点需要存在于功能包当中、功能包需要存在于工作空间当中。所以我们要想创建节点,就要先创建一个工作空间,再创建功能包。
创建example_cpp功能包,使用ament-cmake作为编译类型,并为其添加rclcpp依赖。
ament_python,适用于python程序
cmake,适用于C++
ament_cmake,适用于C++程序,是cmake的增强版
#include "rclcpp/rclcpp.hpp" // 包含ROS 2 C++客户端库头文件
int main(int argc, char **argv)
{
// 初始化ROS 2,解析命令行参数
// 初始化 ROS 2 运行环境,解析命令行参数(如命名空间、参数重映射)。
rclcpp::init(argc, argv);
// 创建一个名为"node_01"的节点,使用智能指针管理生命周期
auto node = std::make_shared<rclcpp::Node>("node_01");
// 使用ROS 2的日志系统输出INFO级别的信息
// 格式:RCLCPP_<LEVEL>(logger, "message")
RCLCPP_INFO(node->get_logger(), "node_01节点已经启动.");
// 进入节点的主循环,处理回调函数、订阅话题等
// 程序会阻塞在此处,直到收到终止信号
rclcpp::spin(node);
// 清理ROS 2资源,关闭节点 清理 ROS 2 资源,关闭节点,释放所有分配的内存。
rclcpp::shutdown();
return 0;
}
auto node = std::make_sharedrclcpp::Node("node_01");
auto node = std::make_sharedrclcpp::Node("node_01"); 是 ROS 2 中创建节点的核心语句,下面从语法、功能和最佳实践三个维度详细解析:
1.语法解析:
auto 关键字 自动推导为 std::shared_ptrrclcpp::Node,即指向 rclcpp::Node 的智能指针。
std::make_shared
功能:安全创建并初始化共享指针(shared_ptr),比直接使用 new 更高效。
优势:内存分配更优化(一次分配同时存储对象和引用计数)。避免内存泄漏(自动管理生命周期)。
rclcpp::Node("node_01")
功能:创建 ROS 2 的节点对象,节点名称为 "node_01"。
rclcpp::Node 封装了ROS2节点的核心功能:
通信接口(发布者、订阅者、服务客户端 / 服务器)。
参数服务器(Parameter Server)访问。
日志系统(Logger)。
计时器(Timer)。
命名空间管理。
节点名称是 ROS 网络中节点的唯一标识符。
代码示例对比
传统指针写法(不推荐)
rclcpp::Node* node = new rclcpp::Node("node_01"); // 手动内存管理
rclcpp::spin(node);
delete node; // 必须手动释放,容易遗漏
智能指针写法(推荐)
auto node = std::make_shared<rclcpp::Node>("node_01"); // 自动内存管理
rclcpp::spin(node); // 执行器持有shared_ptr
// 无需手动释放,函数退出时自动析构
auto node = std::make_sharedrclcpp::Node("node_01"); 是 ROS 2 中创建节点的标准方式,它通过智能指针安全管理节点生命周期,同时为节点提供了完整的 ROS 2 功能接口。
修改CmakeLists
add_executable(node_01 src/node_01.cpp) //声明可执行文件:将src/node_01.cpp编译为名为node_01的可执行文件
//告诉 CMake 生成一个名为node_01的可执行文件,源文件为src/node_01.cpp
//第一个参数:生成的可执行文件名称
//后续参数:源文件路径列表(可包含多个 cpp 文件)
add_executable(可执行文件名 源文件1 源文件2 ...)
ament_target_dependencies(node_01 rclcpp) //链接依赖库:将node_01与 ROS 2 的 C++ 客户端库rclcpp链接
这三行代码的主要功能是:
声明安装目标:将编译生成的node_01可执行文件安装到指定目录
指定安装路径:安装到lib/\({PROJECT_NAME}目录下,其中\){PROJECT_NAME}是项目名称(如node_example)
install(TARGETS
node_01
DESTINATION lib/${PROJECT_NAME}
)
install(TARGETS node_01 ...) 告诉 CMake 在执行colcon build时将哪些目标文件(可执行文件/库)安装到系统中
TARGETS:指定要安装的目标文件名称
node_01:之前通过add_executable定义的可执行文件名称
DESTINATION lib/${PROJECT_NAME}
install/目录下的lib/node_example/node_01
cmake_minimum_required(VERSION 3.8)
project(node_example)
# 默认使用C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
# 查找依赖包
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
# 添加可执行文件
add_executable(node_01 src/node_01.cpp)
ament_target_dependencies(node_01 rclcpp)
# 安装可执行文件
install(TARGETS
node_01
DESTINATION lib/${PROJECT_NAME}
)
# 导出包信息
ament_package()

colcon 是 ROS 2 官方推荐的构建工具,用于编译和管理 ROS 2 工作空间中的多个软件包。
workspace/
├── build/ # 编译中间文件
├── install/ # 安装目录(最终输出)
└── src/ # 源代码目录(存放各个软件包)
每个包包含:
package.xml:包元数据(名称、版本、依赖等)
CMakeLists.txt或setup.py:构建配置文件
【使用RCLPY编写节点】
详见动手学ROS humbleb版本
浙公网安备 33010602011771号