ROS开发专栏---创建软件包 和编写第一个节点---适配Ubuntu 22.04

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

[一、节点 Node 与软件包 Package](#一、节点 Node 与软件包 Package)

1.1、基本概念

1.2、编写一个节点并测试

1.2.1、创建软件

1.2.2、编写节点node

1.2.3、设置编译规则

1.2.4、修改软件包信息

二、编译软件包与运行节点

2.1、编译软件包

2.2、加载环境变量

2.3、运行节点

总结


前言

前两期博客我们完成了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

相关推荐
Jason_zhao_MR15 小时前
RK3576 MIPI Camera ISP调试:主观调优与工程实战(下)
stm32·嵌入式硬件·安全·系统架构·嵌入式
LN花开富贵19 小时前
Ubuntu aarch64 架构安装 NoMachine 远程控制 避坑与实战
linux·运维·笔记·学习·ubuntu·嵌入式
2023自学中20 小时前
imx6ull开发板,Linux-c编程,识别 键盘、鼠标、触摸屏坐标
linux·嵌入式·开发板·应用编程
IAR Systems1 天前
瑞萨RH850与IAR:助力下一代“软件定义汽车”开发
汽车·嵌入式·iar
kyle~1 天前
机器人感知 --- 多相机传感时间误差分析
linux·c++·数码相机·机器人·ros2·传感器
lularible1 天前
从沙子到车辙(2.1):思想实验——在原始森林里造芯片
开源·嵌入式·汽车电子
勤自省1 天前
ROS2 + OpenCV 实战教程:人脸识别、物体跟踪、ArUco 二维码识别初级
人工智能·opencv·ubuntu·计算机视觉·ros2
kyle~1 天前
机器人感知---工业相机硬触发、时间戳同步( PTP)与 ROS2 驱动时间戳设计
linux·c++·机器人·ros2
liu-yonggang1 天前
ROS2 性能优化指南
性能优化·ros2