ROS2入门之节点与指令

本文详细介绍了ROS2的概述、系统框架,重点讲解了如何在ROS2中创建节点(CPP),包括工作空间和功能包的创建、编译过程及常见错误处理。此外,还列出了ROS2的常用指令,为初学者提供了一个全面的学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在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>

结束语

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

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

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

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

ROS2编程基础课程文档 ROS 2(机器人操作系统2)是用于机器人应用的开源开发套件。ROS 2之目的是为各行各业的开发人员提供标准的软件平台,从研究和原型设计再到部署和生产。 ROS 2建立在ROS 1的成功基础之上,ROS 1目前已在世界各地的无数机器人应用中得到应用。 特色 缩短上市时间 ROS 2提供了开发应用程序所需的机器人工具,库和功能,可以将时间花在对业务非常重要的工作上。因为它 是开源的,所以可以灵活地决定在何处以及如何使用ROS 2,以及根据实际的需求自由定制,使用ROS 2 可以大幅度提升产品和算法研发速度! 专为生产而设计 凭借在建立ROS 1作为机器人研发的事实上的全球标准方面的十年经验,ROS 2从一开始就被建立在工业级 基础上并可用于生产,包括高可靠性和安全关键系统。 ROS 2的设计选择、开发实践和项目管理基于行业利 益相关者的要求。 多平台支持 ROS 2Linux,Windows和macOS上得到支持和测试,允许无缝开发和部署机器人自动化,后端管理和 用户界面。分层支持模型允许端口到新平台,例如实时和嵌入式操作系统,以便在获得兴趣和投资时引入和推 广。 丰富的应用领域 之前的ROS 1一样,ROS 2可用于各种机器人应用,从室内到室外、从家庭到汽车、水下到太空、从消费 到工业。 没有供应商锁定 ROS 2建立在一个抽象层上,使机器人库和应用程序通信技术隔离开来。抽象底层是通信代码的多种实现, 包括开源和专有解决方案。在抽象顶层,核心库和用户应用程序是可移植的。 建立在开放标准之上 ROS 2中的默认通信方法使用IDL、DDS和DDS-I RTPS等行业标准,这些标准已广泛应用于从工厂到航空 航天的各种工业应用中。 开源许可证 ROS 2代码在Apache 2.0许可下获得许可,在3条款(或“新”)BSD许可下使用移植的ROS 1代码。这两个 许可证允许允许使用软件,而不会影响用户的知识产权。 全球社区 超过10年的ROS项目通过发展一个由数十万开发人员和用户组成的全球社区,为机器人技术创建了一个庞大 的生态系统,他们为这些软件做出贡献并进行了改进。 ROS 2由该社区开发并为该社区开发,他们将成为未 来的管理者。 行业支持 正如ROS 2技术指导委员会成员所证明的那样,对ROS 2的行业支持很强。除了开发顶级产品外,来自世界 各地的大大小小公司都在投入资源为ROS 2做出开源贡献。 ROS1的互操作性 ROS 2包括到ROS 1的桥接器,处理两个系统之间的双向通信。如果有一个现有的ROS 1应用程序, 可 以通过桥接器开始尝试使用ROS 2,并根据要求和可用资源逐步移植应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值