• 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助欢迎关注点赞收藏(一键三连)订阅专栏

前言


一、初识ROS2

1.ROS简介

在这里插入图片描述
ROS(Robot Operating System)是一个开源的机器人操作系统框架,最初由Willow Garage公司于2007年发起。ROS提供了一套工具和库,用于构建和开发机器人应用程序。其特点包括基于消息传递的中间件、通信模型、工具集以及开源的性质。ROS的通信机制采用发布-订阅模型和服务调用,使得不同组件(节点)能够实现信息交流。ROS在学术界和工业界都得到广泛应用,但在大规模系统中可能存在通信效率和实时性方面的挑战。

ROS 2是ROS的下一代版本,旨在解决ROS的一些限制和缺点。ROS 2保留了ROS的核心思想,但进行了一些重大改进。ROS 2的特点包括更灵活的通信机制、更好的实时性能、支持多种中间件、更好的安全性和可扩展性等。ROS 2的发展旨在满足更广泛的应用需求,包括工业自动化、军事应用等。它是一个更为先进、适用范围更广泛的机器人操作系统框架。 ROS 2被设计为兼容ROS,并提供了平滑的过渡路径,使得用户可以逐步迁移到ROS 2,同时保留现有的ROS代码。

2.ROS系统框架

ROS2的框架如下图所示,从下至上可以看到依此为操作系统层、DSS实现层、抽象DDS层-RMW、ROS2客户端-RCL以及应用层。
在这里插入图片描述

1.操作系统层

ROS2本身就是基于Linux、Windows或者macOS系统建立的,驱动计算机硬件、底层网络通信等实现都是交由操作系统来实现的。

2.DSS实现层

DDS(Data Distribution Service,数据分发服务)。是由对象管理组 (OMG) 于 2003 年发布并于 2007 年修订的开分布式系统标准。通过类似于ROS中的话题发布和订阅形式来进行通信,同时提供了丰富的服务质量管理来保证可靠性、持久性、传输设置等。

简单来说,DDS实现层就是对不同常见的DDS接口进行再次的封装,让其保持统一性,为DDS抽象层提供统一的API。

3.抽象DDS层-RMW

这一层将DDS实现层进一步的封装,使得DDS更容易使用,其原因在于DDS需要大量的设置和配置(分区,主题名称,发现模式,消息创建,…),这些设置都是在ROS2的抽象层中完成的。

ROS2客户端-RCL

RCL(ROS Client Library)ROS客户端库,其实是ROS的一种API,提供了对ROS话题、服务、参数、Action等接口。不同的语言对应着不同的rcl,但基本功能都是相同的。
在这里插入图片描述
上面这张图是ROS2的API的实现层级,最新下面的是第三方的DDS,rmw(中间件接口)层是对各家DDS的抽象层,基于rmw实现了rclc,然后就可以实现各个语言的库,C语言是各个语言的鼻祖(汇编除外)所以基于rclcROS2官方实现了rclpy和rclcpp。

应用层

应用层是编写程序应用以及ROS2开发的各种常用的机器人相关开发工具所在的层。

二、ROS2创建节点(CPP)

1.创建工作空间

节点需要存在于功能包当中,功能包需要存在于工作空间当中,因此,想要想创建一个节点,就必须先创建一个工作空间,然后再创建功能包。本质上工作空间就是我们所熟知的文件夹。

mkdir -p node_test/src

2.创建功能包

进入src目录下,创建example_cpp功能包,使用ament-cmake作为编译类型,并为其添加rclcpp依赖。

ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp

在这里插入图片描述
使用tree查看目录结构:
在这里插入图片描述

ros2 pkg create 是用于在ROS 2中创建新包的命令。下面是该命令的主要参数以及它们的作用:

ros2 pkg create <package_name> --build-type <build_type> --dependencies <dependencies>
  • <package_name>: 指定功能包名称。替换<package_name>为你想要的包名称。
  • –build-type <build_type>: 这个选项指定了包的构建系统类型。ROS 2支持不同的构建系统,其中常见的选项包括:

ament_cmake: 使用CMake作为构建系统。
ament_python: 使用Python作为构建系统。
ament_cmake_python: 使用CMake和Python混合作为构建系统。

  • –dependencies : 这个选项指定了新包的依赖项。你可以列出包需要依赖的其他ROS 2包,以确保你的包能够使用它们的功能。在前面提到的例子中,–dependencies rclcpp 表示新包依赖于 ROS 2 的 C++ 客户端库 rclcpp。

这些参数一起允许你根据你的项目需求创建具有适当构建系统和依赖项的ROS 2包。创建包后,你可以在其中添加节点、服务、话题等ROS 2的组件,从而构建你的机器人应用程序。

3.创建节点

接着在example_cpp/src下创建一个node1.cpp文件,创建完成后的目录结构如下:
在这里插入图片描述
编写ROS2节点的一般步骤

1.导入库文件
2. 初始化客户端库
3. 新建节点对象
4. spin循环节点
5. 关闭客户端库

node.cpp文件源程序

#include "rclcpp/rclcpp.hpp"         // 1.导入库文件


/**
 * @brief 创建一个类节点,名字叫做Node1, 继承自Node。
 * 
 */
class Node1 : public rclcpp::Node
{
private:
        /* data */
public:
        Node1(std::string name) : Node(name)
        {
                // 打印一句
                RCLCPP_INFO(this->get_logger(), "大家好,我是%s.",name.c_str());
        }
};


int main (int argc , char **argv)
{
        // 2. 初始化客户端库
        rclcpp::init(argc, argv);
        
        // 3.新建节点对象
        auto node = std::make_shared<Node1>("node5");
        RCLCPP_INFO(node->get_logger(), "node5节点已经启动.");
        
        // 4.spin循环节点:运行节点,并检测退出信号 Ctrl+C
        rclcpp::spin(node);
        
        // 5.关闭客户端库: 停止运行
        rclcpp::shutdown();
        return 0;
}

4.配置CMakeLists

设置添加为可执行文件,并使用install指令将其安装到install目录。

# 生产可执行程序
add_executable(nodes src/node.cpp)
ament_target_dependencies(nodes rclcpp)

# 使用install指令将其安装到install目录
install(TARGETS
  nodes
  DESTINATION lib/${PROJECT_NAME}
)

5.编译运行节点

注意以下都是在node_test的工作空间下执行的。

🍓编译节点

colcon build 是一个用于构建ROS 2工作区中所有包的命令。它是Colcon(CMake-based construction)构建工具的一部分,用于构建ROS 2项目。

colcon build

这个命令会在当前工作区中构建所有的ROS 2包。Colcon会检测工作区中的所有包,解决它们之间的依赖关系,并使用适当的构建系统(比如CMake或者ament_cmake)构建这些包
在这里插入图片描述
在构建过程中,Colcon会生成构建系统所需的构建文件,编译源代码,并生成可执行文件、库和其他构建产物。构建成功后,就可以运行你的ROS 2节点或者其他组件。

🍊source环境

当构建ROS 2软件包时,构建工具(Colcon)会将构建输出(编译生成的可执行文件、库等)安装到一个目录中,通常是 install 目录。然后,通过运行 source install/setup.bash 命令,可以将这些已经安装的软件包的路径添加到当前终端的环境变量中,使得 ROS 2 系统能够找到这些软件包。

source install/setup.bash

🍎 运行节点

在运行 source install/setup.bash 后,可以直接运行ROS 2软件包中的节点、服务等。注意这里的节点是在CMakeLists.txt中添加的可执行程序的名字的,即可执行节点

ros2 run example_cpp nodes
在这里插入图片描述

在程序中设置的节点名称是终端打印输出的。
在这里插入图片描述
ros2 run 是用于在ROS 2中运行可执行节点的命令。下面是该命令的结构和作用:

ros2 run <package_name> <executable_name>

  • <package_name>: 这是包含你要运行的节点的ROS 2功能包的名称。

  • <executable_name>: 这是要运行的节点的可执行文件的名称。

报错解决

  • rclcpp头文件找不到解决办法:
    将鼠标放在报错的#include “-------------------” 处,出现灯泡则点击灯泡图标,或者出现快速修复,则点击快速修复,并保存,然后修改如下文件,添加rclcpp的文件路径:/opt/*(不同的版本第三个名字不同的)
    在这里插入图片描述
  • No module named catkin_pkg.package
    解决文章链接:No module named catkin_pkg.package

三、ROS2常用指令

1.ros2 pkg create

命令功能:创建功能包,指定包名、编译方式、依赖项、节点名等
命令格式:ros2 pkg create <package_name> --build-type <build_type> --dependencies
具体参数作用参照前文。

2.ros2 pkg list

命令功能:查看系统中功能包列表
命令格式:ros2 pkg list

3.ros2 pkg executables

命令功能:查看包内可执行文件列表
命令格式: ros2 pkg executables <package_name>

4.点运行工具 ros2 run

命令功能:运行包内节点功能
命令格式:ros2 run <package_name> <node_name>

5.ros2 node list

命令功能: 查看当前域内(ROS_DOMAIN_ID相同的节点组)活动的节点列表
命令格式: ros2 node list

6.ros2 node info

命令功能: 查看节点详细信息,包括订阅、发布的消息,开启的服务和动作等
命令格式:ros2 node info <node_name>

结束语

感谢阅读吾之文章,今已至此次旅程之终站 🛬。

吾望斯文献能供尔以宝贵之信息与知识也 🎉。

学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。

然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐